• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Fundamental types and constants relating to WFA NAN
3  * (Neighbor Awareness Networking)
4  *
5  * Copyright (C) 1999-2019, Broadcom.
6  *
7  *      Unless you and Broadcom execute a separate written software license
8  * agreement governing use of this software, this software is licensed to you
9  * under the terms of the GNU General Public License version 2 (the "GPL"),
10  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
11  * following added to such license:
12  *
13  *      As a special exception, the copyright holders of this software give you
14  * permission to link this software with independent modules, and to copy and
15  * distribute the resulting executable under terms of your choice, provided that
16  * you also meet, for each linked independent module, the terms and conditions
17  * of the license of that module.  An independent module is a module which is
18  * not derived from this software.  The special exception does not apply to any
19  * modifications of the software.
20  *
21  *      Notwithstanding the above, under no circumstances may you combine this
22  * software in any way with any other Broadcom software provided under a license
23  * other than the GPL, without Broadcom's express prior written consent.
24  *
25  *
26  * <<Broadcom-WL-IPTag/Open:>>
27  *
28  * $Id: nan.h 818571 2019-05-08 04:36:41Z $
29  */
30 #ifndef _NAN_H_
31 #define _NAN_H_
32 
33 #include <typedefs.h>
34 #include <802.11.h>
35 
36 /* This marks the start of a packed structure section. */
37 #include <packed_section_start.h>
38 
39 /* WiFi NAN OUI values */
40 #define NAN_OUI "\x50\x6F\x9A" /* WFA OUI. WiFi-Alliance OUI */
41 /* For oui_type field identifying the type and version of the NAN IE. */
42 #define NAN_OUI_TYPE 0x13    /* Type/Version */
43 #define NAN_AF_OUI_TYPE 0x18 /* Type/Version */
44 /* IEEE 802.11 vendor specific information element. (Same as P2P_IE_ID.) */
45 #define NAN_IE_ID 0xdd
46 
47 /* Same as P2P_PUB_AF_CATEGORY and DOT11_ACTION_CAT_PUBLIC */
48 #define NAN_PUB_AF_CATEGORY DOT11_ACTION_CAT_PUBLIC
49 /* Protected dual public action frame category */
50 #define NAN_PROT_DUAL_PUB_AF_CATEGORY DOT11_ACTION_CAT_PDPA
51 /* IEEE 802.11 Public Action Frame Vendor Specific. (Same as P2P_PUB_AF_ACTION.)
52  */
53 #define NAN_PUB_AF_ACTION DOT11_PUB_ACTION_VENDOR_SPEC
54 /* Number of octents in hash of service name. (Same as P2P_WFDS_HASH_LEN.) */
55 #define NAN_SVC_HASH_LEN 6
56 /* Size of fixed length part of nan_pub_act_frame_t before attributes. */
57 #define NAN_PUB_ACT_FRAME_FIXED_LEN 6
58 /* Number of octents in master rank value. */
59 #define NAN_MASTER_RANK_LEN 8
60 /* NAN public action frame header size */
61 #define NAN_PUB_ACT_FRAME_HDR_SIZE (OFFSETOF(nan_pub_act_frame_t, data))
62 /* NAN network ID */
63 #define NAN_NETWORK_ID "\x51\x6F\x9A\x01\x00\x00"
64 /* Service Control Type length */
65 #define NAN_SVC_CONTROL_TYPE_LEN 2
66 /* Binding Bitmap length */
67 #define NAN_BINDING_BITMAP_LEN 2
68 /* Service Response Filter (SRF) control field masks */
69 #define NAN_SRF_BLOOM_MASK 0x01
70 #define NAN_SRF_INCLUDE_MASK 0x02
71 #define NAN_SRF_INDEX_MASK 0x0C
72 /* SRF Bloom Filter index shift */
73 #define NAN_SRF_BLOOM_SHIFT 2
74 #define NAN_SRF_INCLUDE_SHIFT 1
75 /* Mask for CRC32 output, used in hash function for NAN bloom filter */
76 #define NAN_BLOOM_CRC32_MASK 0xFFFF
77 
78 /* Attribute TLV header size */
79 #define NAN_ATTR_ID_OFF 0
80 #define NAN_ATTR_LEN_OFF 1
81 #define NAN_ATTR_DATA_OFF 3
82 
83 #define NAN_ATTR_ID_LEN 1u  /* ID field length */
84 #define NAN_ATTR_LEN_LEN 2u /* Length field length */
85 #define NAN_ATTR_HDR_LEN (NAN_ATTR_ID_LEN + NAN_ATTR_LEN_LEN)
86 #define NAN_ENTRY_CTRL_LEN 1 /* Entry control field length from FAM attribute  \
87                               */
88 #define NAN_MAP_ID_LEN 1     /* MAP ID length to signify band */
89 #define NAN_OPERATING_CLASS_LEN                                                \
90     1                         /* operating class field length from NAN FAM */
91 #define NAN_CHANNEL_NUM_LEN 1 /* channel number field length 1 byte */
92 
93 /* generic nan attribute total length */
94 #define NAN_ATTR_TOT_LEN(_nan_attr)                                            \
95     (ltoh16_ua(((const uint8 *)(_nan_attr)) + NAN_ATTR_ID_LEN) +               \
96      NAN_ATTR_HDR_LEN)
97 
98 /* NAN slot duration / period */
99 #define NAN_MIN_TU 16
100 #define NAN_TU_PER_DW 512
101 #define NAN_MAX_DW 16
102 #define NAN_MAX_TU (NAN_MAX_DW * NAN_TU_PER_DW)
103 
104 #define NAN_SLOT_DUR_0TU 0
105 #define NAN_SLOT_DUR_16TU 16
106 #define NAN_SLOT_DUR_32TU 32
107 #define NAN_SLOT_DUR_64TU 64
108 #define NAN_SLOT_DUR_128TU 128
109 #define NAN_SLOT_DUR_256TU 256
110 #define NAN_SLOT_DUR_512TU 512
111 #define NAN_SLOT_DUR_1024TU 1024
112 #define NAN_SLOT_DUR_2048TU 2048
113 #define NAN_SLOT_DUR_4096TU 4096
114 #define NAN_SLOT_DUR_8192TU 8192
115 
116 #define NAN_SOC_CHAN_2G 6 /* NAN 2.4G discovery channel */
117 #define NAN_SOC_CHAN_5G_CH149                                                  \
118     149 /* NAN 5G discovery channel if upper band allowed */
119 #define NAN_SOC_CHAN_5G_CH44                                                   \
120     44 /* NAN 5G discovery channel if only lower band allowed */
121 
122 /* size of ndc id */
123 #define NAN_DATA_NDC_ID_SIZE 6
124 
125 #define NAN_AVAIL_ENTRY_LEN_RES0                                               \
126     7 /* Avail entry len in FAM attribute for resolution 16TU */
127 #define NAN_AVAIL_ENTRY_LEN_RES1                                               \
128     5 /* Avail entry len in FAM attribute for resolution 32TU */
129 #define NAN_AVAIL_ENTRY_LEN_RES2                                               \
130     4 /* Avail entry len in FAM attribute for resolution 64TU */
131 
132 /* map id field */
133 #define NAN_MAPID_SPECIFIC_MAP_MASK 0x01 /* apply to specific map */
134 #define NAN_MAPID_MAPID_MASK 0x1E
135 #define NAN_MAPID_MAPID_SHIFT 1
136 #define NAN_MAPID_SPECIFIC_MAP(_mapid) ((_mapid)&NAN_MAPID_SPECIFIC_MAP_MASK)
137 #define NAN_MAPID_ALL_MAPS(_mapid) (!NAN_MAPID_SPECIFIC_MAP(_mapid))
138 #define NAN_MAPID_MAPID(_mapid)                                                \
139     (((_mapid)&NAN_MAPID_MAPID_MASK) >> NAN_MAPID_MAPID_SHIFT)
140 #define NAN_MAPID_SET_SPECIFIC_MAPID(map_id)                                   \
141     ((((map_id) << NAN_MAPID_MAPID_SHIFT) & NAN_MAPID_MAPID_MASK) |            \
142      NAN_MAPID_SPECIFIC_MAP_MASK)
143 
144 /* Vendor-specific public action frame for NAN */
145 typedef BWL_PRE_PACKED_STRUCT struct nan_pub_act_frame_s {
146     /* NAN_PUB_AF_CATEGORY 0x04 */
147     uint8 category_id;
148     /* NAN_PUB_AF_ACTION 0x09 */
149     uint8 action_field;
150     /* NAN_OUI 0x50-6F-9A */
151     uint8 oui[DOT11_OUI_LEN];
152     /* NAN_OUI_TYPE 0x13 */
153     uint8 oui_type;
154     /* One or more NAN Attributes follow */
155     uint8 data[];
156 } BWL_POST_PACKED_STRUCT nan_pub_act_frame_t;
157 
158 /* NAN attributes as defined in the nan spec */
159 enum {
160     NAN_ATTR_MASTER_IND = 0,
161     NAN_ATTR_CLUSTER = 1,
162     NAN_ATTR_SVC_ID_LIST = 2,
163     NAN_ATTR_SVC_DESCRIPTOR = 3,
164     NAN_ATTR_CONN_CAP = 4,
165     NAN_ATTR_INFRA = 5,
166     NAN_ATTR_P2P = 6,
167     NAN_ATTR_IBSS = 7,
168     NAN_ATTR_MESH = 8,
169     NAN_ATTR_FURTHER_NAN_SD = 9,
170     NAN_ATTR_FURTHER_AVAIL = 10,
171     NAN_ATTR_COUNTRY_CODE = 11,
172     NAN_ATTR_RANGING = 12,
173     NAN_ATTR_CLUSTER_DISC = 13,
174     /* nan 2.0 */
175     NAN_ATTR_SVC_DESC_EXTENSION = 14,
176     NAN_ATTR_NAN_DEV_CAP = 15,
177     NAN_ATTR_NAN_NDP = 16,
178     NAN_ATTR_NAN_NMSG = 17,
179     NAN_ATTR_NAN_AVAIL = 18,
180     NAN_ATTR_NAN_NDC = 19,
181     NAN_ATTR_NAN_NDL = 20,
182     NAN_ATTR_NAN_NDL_QOS = 21,
183     NAN_ATTR_MCAST_SCHED = 22,
184     NAN_ATTR_UNALIGN_SCHED = 23,
185     NAN_ATTR_PAGING_UCAST = 24,
186     NAN_ATTR_PAGING_MCAST = 25,
187     NAN_ATTR_RANGING_INFO = 26,
188     NAN_ATTR_RANGING_SETUP = 27,
189     NAN_ATTR_FTM_RANGE_REPORT = 28,
190     NAN_ATTR_ELEMENT_CONTAINER = 29,
191     NAN_ATTR_WLAN_INFRA_EXT = 30,
192     NAN_ATTR_EXT_P2P_OPER = 31,
193     NAN_ATTR_EXT_IBSS = 32,
194     NAN_ATTR_EXT_MESH = 33,
195     NAN_ATTR_CIPHER_SUITE_INFO = 34,
196     NAN_ATTR_SEC_CTX_ID_INFO = 35,
197     NAN_ATTR_SHARED_KEY_DESC = 36,
198     NAN_ATTR_MCAST_SCHED_CHANGE = 37,
199     NAN_ATTR_MCAST_SCHED_OWNER_CHANGE = 38,
200     NAN_ATTR_PUBLIC_AVAILABILITY = 39,
201     NAN_ATTR_SUB_SVC_ID_LIST = 40,
202     NAN_ATTR_NDPE = 41,
203     /* change NAN_ATTR_MAX_ID to max ids + 1, excluding
204      * NAN_ATTR_VENDOR_SPECIFIC. This is used in nan_parse.c
205      */
206     NAN_ATTR_MAX_ID = NAN_ATTR_NDPE + 1,
207 
208     NAN_ATTR_VENDOR_SPECIFIC = 221
209 };
210 
211 enum wifi_nan_avail_resolution {
212     NAN_AVAIL_RES_16_TU = 0,
213     NAN_AVAIL_RES_32_TU = 1,
214     NAN_AVAIL_RES_64_TU = 2,
215     NAN_AVAIL_RES_INVALID = 255
216 };
217 
218 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_ie_s {
219     uint8 id;                 /* IE ID: NAN_IE_ID 0xDD */
220     uint8 len;                /* IE length */
221     uint8 oui[DOT11_OUI_LEN]; /* NAN_OUI 50:6F:9A */
222     uint8 oui_type;           /* NAN_OUI_TYPE 0x13 */
223     uint8 attr[];             /* var len attributes */
224 } BWL_POST_PACKED_STRUCT wifi_nan_ie_t;
225 
226 #define NAN_IE_HDR_SIZE (OFFSETOF(wifi_nan_ie_t, attr))
227 
228 /* master indication record  */
229 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_master_ind_attr_s {
230     uint8 id;
231     uint16 len;
232     uint8 master_preference;
233     uint8 random_factor;
234 } BWL_POST_PACKED_STRUCT wifi_nan_master_ind_attr_t;
235 
236 /* cluster attr record  */
237 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_cluster_attr_s {
238     uint8 id;
239     uint16 len;
240     uint8 amr[NAN_MASTER_RANK_LEN];
241     uint8 hop_count;
242     /* Anchor Master Beacon Transmission Time */
243     uint32 ambtt;
244 } BWL_POST_PACKED_STRUCT wifi_nan_cluster_attr_t;
245 
246 /*  container for service ID records  */
247 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_svc_id_attr_s {
248     uint8 id;
249     uint16 len;
250     uint8 svcid[0]; /* 6*len of srvc IDs */
251 } BWL_POST_PACKED_STRUCT wifi_nan_svc_id_attr_t;
252 
253 /* service_control bitmap for wifi_nan_svc_descriptor_attr_t below */
254 #define NAN_SC_PUBLISH 0x0
255 #define NAN_SC_SUBSCRIBE 0x1
256 #define NAN_SC_FOLLOWUP 0x2
257 /* Set to 1 if a Matching Filter field is included in descriptors. */
258 #define NAN_SC_MATCHING_FILTER_PRESENT 0x4
259 /* Set to 1 if a Service Response Filter field is included in descriptors. */
260 #define NAN_SC_SR_FILTER_PRESENT 0x8
261 /* Set to 1 if a Service Info field is included in descriptors. */
262 #define NAN_SC_SVC_INFO_PRESENT 0x10
263 /* range is close proximity only */
264 #define NAN_SC_RANGE_LIMITED 0x20
265 /* Set to 1 if binding bitamp is present in descriptors */
266 #define NAN_SC_BINDING_BITMAP_PRESENT 0x40
267 
268 /* Service descriptor */
269 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_svc_descriptor_attr_s {
270     /* Attribute ID - 0x03. */
271     uint8 id;
272     /* Length of the following fields in the attribute */
273     uint16 len;
274     /* Hash of the Service Name */
275     uint8 svc_hash[NAN_SVC_HASH_LEN];
276     /* Publish or subscribe instance id */
277     uint8 instance_id;
278     /* Requestor Instance ID */
279     uint8 requestor_id;
280     /* Service Control Bitmask. Also determines what data follows. */
281     uint8 svc_control;
282     /* Optional fields follow */
283 } BWL_POST_PACKED_STRUCT wifi_nan_svc_descriptor_attr_t;
284 
285 /* IBSS attribute */
286 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_ibss_attr_s {
287     /* Attribute ID - 0x07. */
288     uint8 id;
289     /* Length of the following fields in the attribute */
290     uint16 len;
291     /* BSSID of the ibss */
292     struct ether_addr bssid;
293     /*
294      map control:, bits:
295     [0-3]: Id for associated further avail map attribute
296     [4-5]: avail interval duration: 0:16ms; 1:32ms; 2:64ms; 3:reserved
297     [6] : repeat : 0 - applies to next DW, 1: 16 intervals max? wtf?
298     [7] : reserved
299     */
300     uint8 map_ctrl;
301     /* avail. intervals bitmap, var len  */
302     uint8 avail_bmp[1];
303 } BWL_POST_PACKED_STRUCT wifi_nan_ibss_attr_t;
304 
305 /* Country code attribute  */
306 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_country_code_attr_s {
307     /* Attribute ID - 0x0B. */
308     uint8 id;
309     /* Length of the following fields in the attribute */
310     uint16 len;
311     /* Condensed Country String first two octets */
312     uint8 country_str[2];
313 } BWL_POST_PACKED_STRUCT wifi_nan_country_code_attr_t;
314 
315 /* Further Availability MAP attr  */
316 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_favail_attr_s {
317     /* Attribute ID - 0x0A. */
318     uint8 id;
319     /* Length of the following fields in the attribute */
320     uint16 len;
321     /* MAP id: val [0..15], values[16-255] reserved */
322     uint8 map_id;
323     /*  availibility entry, var len */
324     uint8 avil_entry[1];
325 } BWL_POST_PACKED_STRUCT wifi_nan_favail_attr_t;
326 
327 /* Further Availability MAP attr  */
328 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_avail_entry_s {
329     /*
330      entry control
331      [0-1]: avail interval duration: 0:16ms; 1:32ms; 2:64ms;
332      [2:7] reserved
333     */
334     uint8 entry_ctrl;
335     /* operating class: freq band etc IEEE 802.11 */
336     uint8 opclass;
337     /* channel number */
338     uint8 chan;
339     /*  avail bmp, var len */
340     uint8 avail_bmp[1];
341 } BWL_POST_PACKED_STRUCT wifi_nan_avail_entry_t;
342 
343 /* Map control Field */
344 #define NAN_MAPCTRL_IDMASK 0x7
345 #define NAN_MAPCTRL_DURSHIFT 4
346 #define NAN_MAPCTRL_DURMASK 0x30
347 #define NAN_MAPCTRL_REPEAT 0x40
348 #define NAN_MAPCTRL_REPEATSHIFT 6
349 
350 #define NAN_VENDOR_TYPE_RTT 0
351 #define NAN_VENDOR_TYPE_P2P 1
352 
353 /* Vendor Specific Attribute - old definition */
354 /* remove */
355 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_vendor_attr_s {
356     uint8 id;                 /* 0xDD */
357     uint16 len;               /* IE length */
358     uint8 oui[DOT11_OUI_LEN]; /* 00-90-4C */
359     uint8 type;               /* attribute type */
360     uint8 attr[1];            /* var len attributes */
361 } BWL_POST_PACKED_STRUCT wifi_nan_vendor_attr_t;
362 
363 #define NAN_VENDOR_HDR_SIZE (OFFSETOF(wifi_nan_vendor_attr_t, attr))
364 
365 /* vendor specific attribute */
366 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_vndr_attr_s {
367     uint8 id;                 /* 0xDD */
368     uint16 len;               /* length of following fields */
369     uint8 oui[DOT11_OUI_LEN]; /* vendor specific OUI */
370     uint8 body[];
371 } BWL_POST_PACKED_STRUCT wifi_nan_vndr_attr_t;
372 
373 /* p2p operation attribute */
374 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_p2p_op_attr_s {
375     /* Attribute ID - 0x06. */
376     uint8 id;
377     /* Length of the following fields in the attribute */
378     uint16 len;
379     /* P2P device role */
380     uint8 dev_role;
381     /* BSSID of the ibss */
382     struct ether_addr p2p_dev_addr;
383     /*
384     map control:, bits:
385     [0-3]: Id for associated further avail map attribute
386     [4-5]: avail interval duration: 0:16ms; 1:32ms; 2:64ms; 3:reserved
387     [6] : repeat : 0 - applies to next DW, 1: 16 intervals max? wtf?
388     [7] : reserved
389     */
390     uint8 map_ctrl;
391     /* avail. intervals bitmap */
392     uint8 avail_bmp[1];
393 } BWL_POST_PACKED_STRUCT wifi_nan_p2p_op_attr_t;
394 
395 /* ranging attribute */
396 #define NAN_RANGING_MAP_CTRL_ID_SHIFT 0
397 #define NAN_RANGING_MAP_CTRL_ID_MASK 0x0F
398 #define NAN_RANGING_MAP_CTRL_DUR_SHIFT 4
399 #define NAN_RANGING_MAP_CTRL_DUR_MASK 0x30
400 #define NAN_RANGING_MAP_CTRL_REPEAT_SHIFT 6
401 #define NAN_RANGING_MAP_CTRL_REPEAT_MASK 0x40
402 #define NAN_RANGING_MAP_CTRL_REPEAT_DW(_ctrl)                                  \
403     (((_ctrl)&NAN_RANGING_MAP_CTRL_DUR_MASK) ? 16 : 1)
404 #define NAN_RANGING_MAP_CTRL(_id, _dur, _repeat)                               \
405     ((((_id) << NAN_RANGING_MAP_CTRL_ID_SHIFT) &                               \
406       NAN_RANGING_MAP_CTRL_ID_MASK) |                                          \
407      (((_dur) << NAN_RANGING_MAP_CTRL_DUR_SHIFT) &                             \
408       NAN_RANGING_MAP_CTRL_DUR_MASK) |                                         \
409      (((_repeat) << NAN_RANGING_MAP_CTRL_REPEAT_SHIFT) &                       \
410       NAN_RANGING_MAP_CTRL_REPEAT_MASK))
411 
412 enum { NAN_RANGING_PROTO_FTM = 0 };
413 
414 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_ranging_attr_s {
415     uint8 id;                   /* 0x0C */
416     uint16 len;                 /* length that follows */
417     struct ether_addr dev_addr; /* device mac address */
418 
419     /*
420     map control:, bits:
421     [0-3]: Id for associated further avail map attribute
422     [4-5]: avail interval duration: 0:16ms; 1:32ms; 2:64ms; 3:reserved
423     [6] : repeat : 0 - applies to next DW, 1: 16 intervals max? wtf?
424     [7] : reserved
425     */
426     uint8 map_ctrl;
427 
428     uint8 protocol;   /* FTM = 0 */
429     uint32 avail_bmp; /* avail interval bitmap */
430 } BWL_POST_PACKED_STRUCT wifi_nan_ranging_attr_t;
431 
432 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_ranging_info_attr_s {
433     uint8 id;   /* 0x1A */
434     uint16 len; /* length that follows */
435     /*
436     location info availability bit map
437     0: LCI Local Coordinates
438     1: Geospatial LCI WGS84
439     2: Civi Location
440     3: Last Movement Indication
441     [4-7]: reserved
442     */
443     uint8 lc_info_avail;
444     /*
445     Last movement indication
446     present if bit 3 is set in lc_info_avail
447     cluster TSF[29:14] at the last detected platform movement
448     */
449     uint16 last_movement;
450 
451 } BWL_POST_PACKED_STRUCT wifi_nan_ranging_info_attr_t;
452 
453 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_ranging_setup_attr_hdr_s {
454     uint8 id;           /* 0x1B */
455     uint16 len;         /* length that follows */
456     uint8 dialog_token; /* Identify req and resp */
457     uint8 type_status;  /* bits 0-3 type, 4-7 status */
458     /* reason code
459     i. when frm type = response & status = reject
460     ii. frm type = termination
461     */
462     uint8 reason;
463 } BWL_POST_PACKED_STRUCT wifi_nan_ranging_setup_attr_hdr_t;
464 
465 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_ranging_setup_attr_s {
466 
467     wifi_nan_ranging_setup_attr_hdr_t setup_attr_hdr;
468     /* Below fields not required when frm type = termination */
469     uint8 ranging_ctrl; /* Bit 0: ranging report required or not */
470     uint8 ftm_params[3];
471     uint8 data[]; /* schedule entry list */
472 } BWL_POST_PACKED_STRUCT wifi_nan_ranging_setup_attr_t;
473 
474 #define NAN_RANGE_SETUP_ATTR_OFFSET_TBM_INFO                                   \
475     (OFFSETOF(wifi_nan_ranging_setup_attr_t, data))
476 
477 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_ranging_report_attr_s {
478     uint8 id;   /* 0x1C */
479     uint16 len; /* length that follows */
480     /* FTM report format in spec.
481     See definition in 9.4.2.22.18 in 802.11mc D5.0
482     */
483     uint8 entry_count;
484     uint8 data[2]; /* includes pad */
485 } BWL_POST_PACKED_STRUCT wifi_nan_ranging_report_attr_t;
486 
487 /* Ranging control flags */
488 #define NAN_RNG_REPORT_REQUIRED 0x01
489 #define NAN_RNG_FTM_PARAMS_PRESENT 0x02
490 #define NAN_RNG_SCHED_ENTRY_PRESENT 0X04
491 
492 /* Location info flags */
493 #define NAN_RNG_LOCATION_FLAGS_LOCAL_CORD 0x1
494 #define NAN_RNG_LOCATION_FLAGS_GEO_SPATIAL 0x2
495 #define NAN_RNG_LOCATION_FLAGS_CIVIC 0x4
496 #define NAN_RNG_LOCATION_FLAGS_LAST_MVMT 0x8
497 
498 /* Last movement mask and shift value */
499 #define NAN_RNG_LOCATION_MASK_LAST_MVT_TSF 0x3FFFC000
500 #define NAN_RNG_LOCATION_SHIFT_LAST_MVT_TSF 14
501 
502 /* FTM params shift values  */
503 #define NAN_FTM_MAX_BURST_DUR_SHIFT 0
504 #define NAN_FTM_MIN_FTM_DELTA_SHIFT 4
505 #define NAN_FTM_NUM_FTM_SHIFT 10
506 #define NAN_FTM_FORMAT_BW_SHIFT 15
507 
508 /* FTM params mask  */
509 #define NAN_FTM_MAX_BURST_DUR_MASK 0x00000F
510 #define NAN_FTM_MIN_FTM_DELTA_MASK 0x00003F
511 #define NAN_FTM_NUM_FTM_MASK 0x00001F
512 #define NAN_FTM_FORMAT_BW_MASK 0x00003F
513 
514 #define FTM_PARAMS_BURSTTMO_FACTOR 250
515 
516 /* set to value to uint32 */
517 #define NAN_FTM_SET_BURST_DUR(ftm, dur)                                        \
518     (ftm |= (((dur + 2) & NAN_FTM_MAX_BURST_DUR_MASK)                          \
519              << NAN_FTM_MAX_BURST_DUR_SHIFT))
520 #define NAN_FTM_SET_FTM_DELTA(ftm, delta)                                      \
521     (ftm |= (((delta / 100) & NAN_FTM_MIN_FTM_DELTA_MASK)                      \
522              << NAN_FTM_MIN_FTM_DELTA_SHIFT))
523 #define NAN_FTM_SET_NUM_FTM(ftm, delta)                                        \
524     (ftm |= ((delta & NAN_FTM_NUM_FTM_MASK) << NAN_FTM_NUM_FTM_SHIFT))
525 #define NAN_FTM_SET_FORMAT_BW(ftm, delta)                                      \
526     (ftm |= ((delta & NAN_FTM_FORMAT_BW_MASK) << NAN_FTM_FORMAT_BW_SHIFT))
527 /* set uint32 to attribute */
528 #define NAN_FTM_PARAMS_UINT32_TO_ATTR(ftm_u32, ftm_attr)                       \
529     {                                                                          \
530         ftm_attr[0] = ftm_u32 & 0xFF;                                          \
531         ftm_attr[1] = (ftm_u32 >> 8) & 0xFF;                                   \
532         ftm_attr[2] = (ftm_u32 >> 16) & 0xFF;                                  \
533     }
534 
535 /* get atrribute to uint32 */
536 #define NAN_FTM_PARAMS_ATTR_TO_UINT32(ftm_p, ftm_u32)                          \
537     (ftm_u32 = ftm_p[0] | ftm_p[1] << 8 | ftm_p[2] << 16)
538 /* get param values from uint32 */
539 #define NAN_FTM_GET_BURST_DUR(ftm)                                             \
540     (((ftm >> NAN_FTM_MAX_BURST_DUR_SHIFT) & NAN_FTM_MAX_BURST_DUR_MASK))
541 #define NAN_FTM_GET_BURST_DUR_USEC(_val)                                       \
542     ((1 << ((_val)-2)) * FTM_PARAMS_BURSTTMO_FACTOR)
543 #define NAN_FTM_GET_FTM_DELTA(ftm)                                             \
544     (((ftm >> NAN_FTM_MIN_FTM_DELTA_SHIFT) & NAN_FTM_MIN_FTM_DELTA_MASK) * 100)
545 #define NAN_FTM_GET_NUM_FTM(ftm)                                               \
546     ((ftm >> NAN_FTM_NUM_FTM_SHIFT) & NAN_FTM_NUM_FTM_MASK)
547 #define NAN_FTM_GET_FORMAT_BW(ftm)                                             \
548     ((ftm >> NAN_FTM_FORMAT_BW_SHIFT) & NAN_FTM_FORMAT_BW_MASK)
549 
550 #define NAN_CONN_CAPABILITY_WFD 0x0001
551 #define NAN_CONN_CAPABILITY_WFDS 0x0002
552 #define NAN_CONN_CAPABILITY_TDLS 0x0004
553 #define NAN_CONN_CAPABILITY_INFRA 0x0008
554 #define NAN_CONN_CAPABILITY_IBSS 0x0010
555 #define NAN_CONN_CAPABILITY_MESH 0x0020
556 
557 #define NAN_DEFAULT_MAP_ID 0   /* nan default map id */
558 #define NAN_DEFAULT_MAP_CTRL 0 /* nan default map control */
559 
560 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_conn_cap_attr_s {
561     /* Attribute ID - 0x04. */
562     uint8 id;
563     /* Length of the following fields in the attribute */
564     uint16 len;
565     uint16 conn_cap_bmp; /* Connection capability bitmap */
566 } BWL_POST_PACKED_STRUCT wifi_nan_conn_cap_attr_t;
567 
568 /* NAN Element container Attribute */
569 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_container_attr_s {
570     uint8 id;      /* id - 0x20 */
571     uint16 len;    /* Total length of following IEs */
572     uint8 map_id;  /* map id */
573     uint8 data[1]; /* Data pointing to one or more IEs */
574 } BWL_POST_PACKED_STRUCT wifi_nan_container_attr_t;
575 
576 /* NAN 2.0 NAN avail attribute */
577 
578 /* Availability Attribute */
579 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_avail_attr_s {
580     uint8 id;       /* id - 0x12 */
581     uint16 len;     /* total length */
582     uint8 seqid;    /* sequence id */
583     uint16 ctrl;    /* attribute control */
584     uint8 entry[1]; /* availability entry list */
585 } BWL_POST_PACKED_STRUCT wifi_nan_avail_attr_t;
586 
587 /* for processing/building time bitmap info in nan_avail_entry */
588 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_time_bitmap_s {
589     uint16 ctrl;    /* Time bitmap control */
590     uint8 len;      /* Time bitmap length */
591     uint8 bitmap[]; /* Time bitmap */
592 } BWL_POST_PACKED_STRUCT wifi_nan_time_bitmap_t;
593 
594 /* Availability Entry format */
595 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_avail_entry_attr_s {
596     uint16 len;         /* Length */
597     uint16 entry_cntrl; /* Entry Control */
598     uint8 var[];        /* Time bitmap and channel entry list */
599 } BWL_POST_PACKED_STRUCT wifi_nan_avail_entry_attr_t;
600 
601 /* FAC Channel Entry  (section 10.7.19.1.5) */
602 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_chan_entry_s {
603     uint8 oper_class;       /* Operating Class */
604     uint16 chan_bitmap;     /* Channel Bitmap */
605     uint8 primary_chan_bmp; /* Primary Channel Bitmap */
606     uint8 aux_chan[0];      /* Auxiliary Channel bitmap */
607 } BWL_POST_PACKED_STRUCT wifi_nan_chan_entry_t;
608 
609 /* Channel entry */
610 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_channel_entry_s {
611     uint8 opclass;      /* Operating class */
612     uint16 chan_bitmap; /* Channel bitmap */
613     uint8 prim_bitmap;  /* Primary channel bitmap */
614     uint16 aux_bitmap;  /* Time bitmap length */
615 } BWL_POST_PACKED_STRUCT wifi_nan_channel_entry_t;
616 
617 /* Type of  Availability: committed */
618 #define NAN_ENTRY_CNTRL_TYPE_COMM_AVAIL_MASK 0x1
619 /* Type of  Availability: potential */
620 #define NAN_ENTRY_CNTRL_TYPE_POTEN_AVAIL_MASK 0x2
621 /* Type of  Availability: conditional */
622 #define NAN_ENTRY_CNTRL_TYPE_COND_AVAIL_MASK 0x4
623 
624 #define NAN_AVAIL_CTRL_MAP_ID_MASK 0x000F
625 #define NAN_AVAIL_CTRL_MAP_ID(_ctrl) ((_ctrl)&NAN_AVAIL_CTRL_MAP_ID_MASK)
626 #define NAN_AVAIL_CTRL_COMM_CHANGED_MASK 0x0010
627 #define NAN_AVAIL_CTRL_COMM_CHANGED(_ctrl)                                     \
628     ((_ctrl)&NAN_AVAIL_CTRL_COMM_CHANGED_MASK)
629 #define NAN_AVAIL_CTRL_POTEN_CHANGED_MASK 0x0020
630 #define NAN_AVAIL_CTRL_POTEN_CHANGED(_ctrl)                                    \
631     ((_ctrl)&NAN_AVAIL_CTRL_POTEN_CHANGED_MASK)
632 #define NAN_AVAIL_CTRL_PUBLIC_CHANGED_MASK 0x0040
633 #define NAN_AVAIL_CTRL_PUBLIC_CHANGED(_ctrl)                                   \
634     ((_ctrl)&NAN_AVAIL_CTRL_PUBLIC_CHANGED_MASK)
635 #define NAN_AVAIL_CTRL_NDC_CHANGED_MASK 0x0080
636 #define NAN_AVAIL_CTRL_NDC_CHANGED(_ctrl)                                      \
637     ((_ctrl)&NAN_AVAIL_CTRL_NDC_CHANGED_MASK)
638 #define NAN_AVAIL_CTRL_MCAST_CHANGED_MASK 0x0100
639 #define NAN_AVAIL_CTRL_MCAST_CHANGED(_ctrl)                                    \
640     ((_ctrl)&NAN_AVAIL_CTRL_MCAST_CHANGED_MASK)
641 #define NAN_AVAIL_CTRL_MCAST_CHG_CHANGED_MASK 0x0200
642 #define NAN_AVAIL_CTRL_MCAST_CHG_CHANGED(_ctrl)                                \
643     ((_ctrl)&NAN_AVAIL_CTRL_MCAST_CHG_CHANGED_MASK)
644 #define NAN_AVAIL_CTRL_CHANGED_FLAGS_MASK 0x03f0
645 
646 #define NAN_AVAIL_ENTRY_CTRL_AVAIL_TYPE_MASK 0x07
647 #define NAN_AVAIL_ENTRY_CTRL_AVAIL_TYPE(_flags)                                \
648     ((_flags)&NAN_AVAIL_ENTRY_CTRL_AVAIL_TYPE_MASK)
649 #define NAN_AVAIL_ENTRY_CTRL_USAGE_MASK 0x18
650 #define NAN_AVAIL_ENTRY_CTRL_USAGE_SHIFT 3
651 #define NAN_AVAIL_ENTRY_CTRL_USAGE(_flags)                                     \
652     (((_flags)&NAN_AVAIL_ENTRY_CTRL_USAGE_MASK) >>                             \
653      NAN_AVAIL_ENTRY_CTRL_USAGE_SHIFT)
654 #define NAN_AVAIL_ENTRY_CTRL_UTIL_MASK 0xE0
655 #define NAN_AVAIL_ENTRY_CTRL_UTIL_SHIFT 5
656 #define NAN_AVAIL_ENTRY_CTRL_UTIL(_flags)                                      \
657     (((_flags)&NAN_AVAIL_ENTRY_CTRL_UTIL_MASK) >>                              \
658      NAN_AVAIL_ENTRY_CTRL_UTIL_SHIFT)
659 #define NAN_AVAIL_ENTRY_CTRL_RX_NSS_MASK 0xF00
660 #define NAN_AVAIL_ENTRY_CTRL_RX_NSS_SHIFT 8
661 #define NAN_AVAIL_ENTRY_CTRL_RX_NSS(_flags)                                    \
662     (((_flags)&NAN_AVAIL_ENTRY_CTRL_RX_NSS_MASK) >>                            \
663      NAN_AVAIL_ENTRY_CTRL_RX_NSS_SHIFT)
664 #define NAN_AVAIL_ENTRY_CTRL_BITMAP_PRESENT_MASK 0x1000
665 #define NAN_AVAIL_ENTRY_CTRL_BITMAP_PRESENT_SHIFT 12
666 #define NAN_AVAIL_ENTRY_CTRL_BITMAP_PRESENT(_flags)                            \
667     (((_flags)&NAN_AVAIL_ENTRY_CTRL_BITMAP_PRESENT_MASK) >>                    \
668      NAN_AVAIL_ENTRY_CTRL_BITMAP_PRESENT_SHIFT)
669 
670 #define NAN_TIME_BMAP_CTRL_BITDUR_MASK 0x07
671 #define NAN_TIME_BMAP_CTRL_BITDUR(_flags)                                      \
672     ((_flags)&NAN_TIME_BMAP_CTRL_BITDUR_MASK)
673 #define NAN_TIME_BMAP_CTRL_PERIOD_MASK 0x38
674 #define NAN_TIME_BMAP_CTRL_PERIOD_SHIFT 3
675 #define NAN_TIME_BMAP_CTRL_PERIOD(_flags)                                      \
676     (((_flags)&NAN_TIME_BMAP_CTRL_PERIOD_MASK) >>                              \
677      NAN_TIME_BMAP_CTRL_PERIOD_SHIFT)
678 #define NAN_TIME_BMAP_CTRL_OFFSET_MASK 0x7FC0
679 #define NAN_TIME_BMAP_CTRL_OFFSET_SHIFT 6
680 #define NAN_TIME_BMAP_CTRL_OFFSET(_flags)                                      \
681     (((_flags)&NAN_TIME_BMAP_CTRL_OFFSET_MASK) >>                              \
682      NAN_TIME_BMAP_CTRL_OFFSET_SHIFT)
683 #define NAN_TIME_BMAP_LEN(avail_entry)                                         \
684     (*(uint8 *)(((wifi_nan_avail_entry_attr_t *)avail_entry)->var + 2))
685 
686 #define NAN_AVAIL_CHAN_LIST_HDR_LEN 1
687 #define NAN_AVAIL_CHAN_LIST_TYPE_BAND 0x00
688 #define NAN_AVAIL_CHAN_LIST_TYPE_CHANNEL 0x01
689 #define NAN_AVAIL_CHAN_LIST_NON_CONTIG_BW 0x02
690 #define NAN_AVAIL_CHAN_LIST_NUM_ENTRIES_MASK 0xF0
691 #define NAN_AVAIL_CHAN_LIST_NUM_ENTRIES_SHIFT 4
692 #define NAN_AVAIL_CHAN_LIST_NUM_ENTRIES(_ctrl)                                 \
693     (((_ctrl)&NAN_AVAIL_CHAN_LIST_NUM_ENTRIES_MASK) >>                         \
694      NAN_AVAIL_CHAN_LIST_NUM_ENTRIES_SHIFT)
695 
696 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_channel_entry_list_s {
697     uint8 chan_info;
698     uint8 var[0];
699 } BWL_POST_PACKED_STRUCT wifi_nan_channel_entry_list_t;
700 
701 /* define for chan_info */
702 #define NAN_CHAN_OP_CLASS_MASK 0x01
703 #define NAN_CHAN_NON_CONT_BW_MASK 0x02
704 #define NAN_CHAN_RSVD_MASK 0x03
705 #define NAN_CHAN_NUM_ENTRIES_MASK 0xF0
706 
707 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_band_entry_s {
708     uint8 band[1];
709 } BWL_POST_PACKED_STRUCT wifi_nan_band_entry_t;
710 
711 /* Type of  Availability: committed */
712 #define NAN_ENTRY_CNTRL_TYPE_COMM_AVAIL 0x1
713 /* Type of  Availability: potential */
714 #define NAN_ENTRY_CNTRL_TYPE_POTEN_AVAIL 0x2
715 /* Type of  Availability: conditional */
716 #define NAN_ENTRY_CNTRL_TYPE_COND_AVAIL 0x4
717 /* Committed + Potential */
718 #define NAN_ENTRY_CNTRL_TYPE_COMM_POTEN                                        \
719     (NAN_ENTRY_CNTRL_TYPE_COMM_AVAIL | NAN_ENTRY_CNTRL_TYPE_POTEN_AVAIL)
720 /* Conditional + Potential */
721 #define NAN_ENTRY_CNTRL_TYPE_COND_POTEN                                        \
722     (NAN_ENTRY_CNTRL_TYPE_COND_AVAIL | NAN_ENTRY_CNTRL_TYPE_POTEN_AVAIL)
723 
724 /* Type of  Availability */
725 #define NAN_ENTRY_CNTRL_TYPE_OF_AVAIL_MASK 0x07
726 #define NAN_ENTRY_CNTRL_TYPE_OF_AVAIL_SHIFT 0
727 /* Usage Preference */
728 #define NAN_ENTRY_CNTRL_USAGE_PREF_MASK 0x18
729 #define NAN_ENTRY_CNTRL_USAGE_PREF_SHIFT 3
730 /* Utilization */
731 #define NAN_ENTRY_CNTRL_UTIL_MASK 0x1E0
732 #define NAN_ENTRY_CNTRL_UTIL_SHIFT 5
733 
734 /* Time Bitmap Control field (section 5.7.18.2.3) */
735 
736 /* Reserved */
737 #define NAN_TIME_BMP_CNTRL_RSVD_MASK 0x01
738 #define NAN_TIME_BMP_CNTRL_RSVD_SHIFT 0
739 /* Bitmap Len */
740 #define NAN_TIME_BMP_CNTRL_BMP_LEN_MASK 0x7E
741 #define NAN_TIME_BMP_CNTRL_BMP_LEN_SHIFT 1
742 /* Bit Duration */
743 #define NAN_TIME_BMP_CNTRL_BIT_DUR_MASK 0x380
744 #define NAN_TIME_BMP_CNTRL_BIT_DUR_SHIFT 7
745 /* Bitmap Len */
746 #define NAN_TIME_BMP_CNTRL_PERIOD_MASK 0x1C00
747 #define NAN_TIME_BMP_CNTRL_PERIOD_SHIFT 10
748 /* Start Offset */
749 #define NAN_TIME_BMP_CNTRL_START_OFFSET_MASK 0x3FE000
750 #define NAN_TIME_BMP_CNTRL_START_OFFSET_SHIFT 13
751 /* Reserved */
752 #define NAN_TIME_BMP_CNTRL_RESERVED_MASK 0xC00000
753 #define NAN_TIME_BMP_CNTRL_RESERVED_SHIFT 22
754 
755 /* Time Bitmap Control field: Period */
756 typedef enum {
757     NAN_TIME_BMP_CTRL_PERIOD_128TU = 1,
758     NAN_TIME_BMP_CTRL_PERIOD_256TU = 2,
759     NAN_TIME_BMP_CTRL_PERIOD_512TU = 3,
760     NAN_TIME_BMP_CTRL_PERIOD_1024TU = 4,
761     NAN_TIME_BMP_CTRL_PERIOD_2048U = 5,
762     NAN_TIME_BMP_CTRL_PERIOD_4096U = 6,
763     NAN_TIME_BMP_CTRL_PERIOD_8192U = 7
764 } nan_time_bmp_ctrl_repeat_interval_t;
765 
766 enum {
767     NAN_TIME_BMP_BIT_DUR_16TU_IDX = 0,
768     NAN_TIME_BMP_BIT_DUR_32TU_IDX = 1,
769     NAN_TIME_BMP_BIT_DUR_64TU_IDX = 2,
770     NAN_TIME_BMP_BIT_DUR_128TU_IDX = 3
771 };
772 
773 enum {
774     NAN_TIME_BMP_BIT_DUR_IDX_0 = 16,
775     NAN_TIME_BMP_BIT_DUR_IDX_1 = 32,
776     NAN_TIME_BMP_BIT_DUR_IDX_2 = 64,
777     NAN_TIME_BMP_BIT_DUR_IDX_3 = 128
778 };
779 
780 enum {
781     NAN_TIME_BMP_CTRL_PERIOD_IDX_1 = 128,
782     NAN_TIME_BMP_CTRL_PERIOD_IDX_2 = 256,
783     NAN_TIME_BMP_CTRL_PERIOD_IDX_3 = 512,
784     NAN_TIME_BMP_CTRL_PERIOD_IDX_4 = 1024,
785     NAN_TIME_BMP_CTRL_PERIOD_IDX_5 = 2048,
786     NAN_TIME_BMP_CTRL_PERIOD_IDX_6 = 4096,
787     NAN_TIME_BMP_CTRL_PERIOD_IDX_7 = 8192
788 };
789 
790 /* Channel Entries List field */
791 
792 /* Type */
793 #define NAN_CHAN_ENTRY_TYPE_MASK 0x01
794 #define NAN_CHAN_ENTRY_TYPE_SHIFT 0
795 /* Channel Entry Length Indication */
796 #define NAN_CHAN_ENTRY_LEN_IND_MASK 0x02
797 #define NAN_CHAN_ENTRY_LEN_IND_SHIFT 1
798 /* Reserved */
799 #define NAN_CHAN_ENTRY_RESERVED_MASK 0x0C
800 #define NAN_CHAN_ENTRY_RESERVED_SHIFT 2
801 /* Number of FAC Band or Channel Entries  */
802 #define NAN_CHAN_ENTRY_NO_OF_CHAN_ENTRY_MASK 0xF0
803 #define NAN_CHAN_ENTRY_NO_OF_CHAN_ENTRY_SHIFT 4
804 
805 #define NAN_CHAN_ENTRY_TYPE_BANDS 0
806 #define NAN_CHAN_ENTRY_TYPE_OPCLASS_CHANS 1
807 
808 #define NAN_CHAN_ENTRY_BW_LT_80MHZ 0
809 #define NAN_CHAN_ENTRY_BW_EQ_160MHZ 1
810 
811 /*
812  * NDL Attribute WFA Tech. Spec ver 1.0.r12 (section 10.7.19.2)
813  */
814 #define NDL_ATTR_IM_MAP_ID_LEN 1
815 #define NDL_ATTR_IM_TIME_BMP_CTRL_LEN 2
816 #define NDL_ATTR_IM_TIME_BMP_LEN_LEN 1
817 
818 /*
819  * NDL Control field - Table xx
820  */
821 #define NDL_ATTR_CTRL_PEER_ID_PRESENT_MASK 0x01
822 #define NDL_ATTR_CTRL_PEER_ID_PRESENT_SHIFT 0
823 #define NDL_ATTR_CTRL_IM_SCHED_PRESENT_MASK 0x02
824 #define NDL_ATTR_CTRL_IM_SCHED_PRESENT_SHIFT 1
825 #define NDL_ATTR_CTRL_NDC_ATTR_PRESENT_MASK 0x04
826 #define NDL_ATTR_CTRL_NDC_ATTR_PRESENT_SHIFT 2
827 #define NDL_ATTR_CTRL_QOS_ATTR_PRESENT_MASK 0x08
828 #define NDL_ATTR_CTRL_QOS_ATTR_PRESENT_SHIFT 3
829 #define NDL_ATTR_CTRL_MAX_IDLE_PER_PRESENT_MASK 0x10 /* max idle period */
830 #define NDL_ATTR_CTRL_MAX_IDLE_PER_PRESENT_SHIFT 4
831 #define NDL_ATTR_CTRL_NDL_TYPE_MASK 0x20 /* NDL type */
832 #define NDL_ATTR_CTRL_NDL_TYPE_SHIFT 5
833 #define NDL_ATTR_CTRL_NDL_SETUP_REASON_MASK 0xC0 /* NDL Setup Reason */
834 #define NDL_ATTR_CTRL_NDL_SETUP_REASON_SHIFT 6
835 
836 /* NDL setup Reason */
837 #define NDL_ATTR_CTRL_NDL_TYPE_S_NDL 0x0 /* S-NDL */
838 #define NDL_ATTR_CTRL_NDL_TYPE_P_NDL 0x1 /* P-NDL */
839 
840 /* NDL setup Reason */
841 #define NDL_ATTR_CTRL_NDL_SETUP_REASON_NDP_RANG 0x0 /* NDP or Ranging */
842 #define NDL_ATTR_CTRL_NDL_SETUP_REASON_FSD_GAS 0x1  /* FSD using GAS */
843 
844 #define NAN_NDL_TYPE_MASK 0x0F
845 #define NDL_ATTR_TYPE_STATUS_REQUEST 0x00
846 #define NDL_ATTR_TYPE_STATUS_RESPONSE 0x01
847 #define NDL_ATTR_TYPE_STATUS_CONFIRM 0x02
848 #define NDL_ATTR_TYPE_STATUS_CONTINUED 0x00
849 #define NDL_ATTR_TYPE_STATUS_ACCEPTED 0x10
850 #define NDL_ATTR_TYPE_STATUS_REJECTED 0x20
851 
852 #define NAN_NDL_TYPE_CHECK(_ndl, x)                                            \
853     (((_ndl)->type_status & NAN_NDL_TYPE_MASK) == (x))
854 #define NAN_NDL_REQUEST(_ndl)                                                  \
855     (((_ndl)->type_status & NAN_NDL_TYPE_MASK) == NDL_ATTR_TYPE_STATUS_REQUEST)
856 #define NAN_NDL_RESPONSE(_ndl)                                                 \
857     (((_ndl)->type_status & NAN_NDL_TYPE_MASK) == NDL_ATTR_TYPE_STATUS_RESPONSE)
858 #define NAN_NDL_CONFIRM(_ndl)                                                  \
859     (((_ndl)->type_status & NAN_NDL_TYPE_MASK) == NDL_ATTR_TYPE_STATUS_CONFIRM)
860 
861 #define NAN_NDL_STATUS_SHIFT 4
862 #define NAN_NDL_STATUS_MASK 0xF0
863 #define NAN_NDL_CONT(_ndl)                                                     \
864     (((_ndl)->type_status & NAN_NDL_STATUS_MASK) ==                            \
865      NDL_ATTR_TYPE_STATUS_CONTINUED)
866 #define NAN_NDL_ACCEPT(_ndl)                                                   \
867     (((_ndl)->type_status & NAN_NDL_STATUS_MASK) ==                            \
868      NDL_ATTR_TYPE_STATUS_ACCEPTED)
869 #define NAN_NDL_REJECT(_ndl)                                                   \
870     (((_ndl)->type_status & NAN_NDL_STATUS_MASK) ==                            \
871      NDL_ATTR_TYPE_STATUS_REJECTED)
872 #define NAN_NDL_FRM_STATUS(_ndl)                                               \
873     (((_ndl)->type_status & NAN_NDL_STATUS_MASK) >> NAN_NDL_STATUS_SHIFT)
874 
875 #define NDL_ATTR_CTRL_NONE 0
876 #define NDL_ATTR_CTRL_PEER_ID_PRESENT (1 << NDL_ATTR_CTRL_PEER_ID_PRESENT_SHIFT)
877 #define NDL_ATTR_CTRL_IMSCHED_PRESENT                                          \
878     (1 << NDL_ATTR_CTRL_IM_SCHED_PRESENT_SHIFT)
879 #define NDL_ATTR_CTRL_NDC_PRESENT (1 << NDL_ATTR_CTRL_NDC_ATTR_PRESENT_SHIFT)
880 #define NDL_ATTR_CTRL_NDL_QOS_PRESENT                                          \
881     (1 << NDL_ATTR_CTRL_QOS_ATTR_PRESENT_SHIFT)
882 #define NDL_ATTR_CTRL_MAX_IDLE_PER_PRESENT                                     \
883     (1 << NDL_ATTR_CTRL_MAX_IDLE_PER_PRESENT_SHIFT)
884 
885 #define NA_NDL_IS_IMMUT_PRESENT(ndl)                                           \
886     (((ndl)->ndl_ctrl) & NDL_ATTR_CTRL_IMSCHED_PRESENT)
887 #define NA_NDL_IS_PEER_ID_PRESENT(ndl)                                         \
888     (((ndl)->ndl_ctrl) & NDL_ATTR_CTRL_PEER_ID_PRESENT)
889 #define NA_NDL_IS_MAX_IDLE_PER_PRESENT(ndl)                                    \
890     (((ndl)->ndl_ctrl) & NDL_ATTR_CTRL_MAX_IDLE_PER_PRESENT)
891 
892 #define NDL_ATTR_PEERID_LEN 1
893 #define NDL_ATTR_MAX_IDLE_PERIOD_LEN 2
894 
895 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_ndl_attr_s {
896     uint8 id;           /* NAN_ATTR_NAN_NDL = 0x17 */
897     uint16 len;         /* Length of the fields in the attribute */
898     uint8 dialog_token; /* Identify req and resp */
899     uint8 type_status;  /* Bits[3-0] type subfield, Bits[7-4] status subfield */
900     uint8 reason;       /* Identifies reject reason */
901     uint8 ndl_ctrl;     /* NDL control field */
902     uint8 var[];        /* Optional fields follow */
903 } BWL_POST_PACKED_STRUCT wifi_nan_ndl_attr_t;
904 
905 /*
906  * NDL QoS Attribute  WFA Tech. Spec ver r26
907  */
908 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_ndl_qos_attr_s {
909     uint8 id;           /* NAN_ATTR_NAN_NDL_QOS = 24 */
910     uint16 len;         /* Length of the attribute field following */
911     uint8 min_slots;    /* Min. number of FAW slots needed per DW interval */
912     uint16 max_latency; /* Max interval between non-cont FAW */
913 } BWL_POST_PACKED_STRUCT wifi_nan_ndl_qos_attr_t;
914 
915 /* no preference to min time slots */
916 #define NAN_NDL_QOS_MIN_SLOT_NO_PREF 0
917 /* no preference to no. of slots between two non-contiguous slots */
918 #define NAN_NDL_QOS_MAX_LAT_NO_PREF 0xFFFF
919 
920 /* Device Capability Attribute */
921 
922 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_dev_cap_s {
923     uint8 id;                /* 0x0F */
924     uint16 len;              /* Length */
925     uint8 map_id;            /* map id */
926     uint16 commit_dw_info;   /* Committed DW Info */
927     uint8 bands_supported;   /* Supported Bands */
928     uint8 op_mode;           /* Operation Mode */
929     uint8 num_antennas;      /* Bit 0-3 tx, 4-7 rx */
930     uint16 chan_switch_time; /* Max channel switch time in us */
931     uint8 capabilities;      /* DFS Master, Extended key id etc */
932 } BWL_POST_PACKED_STRUCT wifi_nan_dev_cap_t;
933 
934 /* map id related */
935 
936 /* all maps */
937 #define NAN_DEV_CAP_ALL_MAPS_FLAG_MASK 0x1 /* nan default map control */
938 #define NAN_DEV_CAP_ALL_MAPS_FLAG_SHIFT 0
939 /* map id */
940 #define NAN_DEV_CAP_MAPID_MASK 0x1E
941 #define NAN_DEV_CAP_MAPID_SHIFT 1
942 
943 /* Awake DW Info field format */
944 
945 /* 2.4GHz DW */
946 #define NAN_DEV_CAP_AWAKE_DW_2G_MASK 0x07
947 /* 5GHz DW */
948 #define NAN_DEV_CAP_AWAKE_DW_5G_MASK 0x38
949 /* Reserved */
950 #define NAN_DEV_CAP_AWAKE_DW_RSVD_MASK 0xC0
951 
952 /* bit shift for dev cap */
953 #define NAN_DEV_CAP_AWAKE_DW_2G_SHIFT 0
954 #define NAN_DEV_CAP_AWAKE_DW_5G_SHIFT 3
955 
956 /* Device Capability Attribute Format */
957 
958 /* Committed DW Info field format */
959 /* 2.4GHz DW */
960 #define NAN_DEV_CAP_COMMIT_DW_2G_MASK 0x07
961 #define NAN_DEV_CAP_COMMIT_DW_2G_OVERWRITE_MASK 0x3C0
962 /* 5GHz DW */
963 #define NAN_DEV_CAP_COMMIT_DW_5G_MASK 0x38
964 #define NAN_DEV_CAP_COMMIT_DW_5G_OVERWRITE_MASK 0x3C00
965 /* Reserved */
966 #define NAN_DEV_CAP_COMMIT_DW_RSVD_MASK 0xC000
967 /* Committed DW bit shift for dev cap */
968 #define NAN_DEV_CAP_COMMIT_DW_2G_SHIFT 0
969 #define NAN_DEV_CAP_COMMIT_DW_5G_SHIFT 3
970 #define NAN_DEV_CAP_COMMIT_DW_2G_OVERWRITE_SHIFT 6
971 #define NAN_DEV_CAP_COMMIT_DW_5G_OVERWRITE_SHIFT 10
972 /* Operation Mode */
973 #define NAN_DEV_CAP_OP_PHY_MODE_HT_ONLY 0x00
974 #define NAN_DEV_CAP_OP_PHY_MODE_VHT 0x01
975 #define NAN_DEV_CAP_OP_PHY_MODE_VHT_8080 0x02
976 #define NAN_DEV_CAP_OP_PHY_MODE_VHT_160 0x04
977 #define NAN_DEV_CAP_OP_PAGING_NDL 0x08
978 
979 #define NAN_DEV_CAP_OP_MODE_VHT_MASK 0x01
980 #define NAN_DEV_CAP_OP_MODE_VHT_SHIFT 0
981 #define NAN_DEV_CAP_OP_MODE_VHT8080_MASK 0x02
982 #define NAN_DEV_CAP_OP_MODE_VHT8080_SHIFT 1
983 #define NAN_DEV_CAP_OP_MODE_VHT160_MASK 0x04
984 #define NAN_DEV_CAP_OP_MODE_VHT160_SHIFT 2
985 #define NAN_DEV_CAP_OP_MODE_PAGING_NDL_MASK 0x08
986 #define NAN_DEV_CAP_OP_MODE_PAGING_NDL_SHIFT 3
987 
988 #define NAN_DEV_CAP_RX_ANT_SHIFT 4
989 #define NAN_DEV_CAP_TX_ANT_MASK 0x0F
990 #define NAN_DEV_CAP_RX_ANT_MASK 0xF0
991 #define NAN_DEV_CAP_TX_ANT(_ant) ((_ant)&NAN_DEV_CAP_TX_ANT_MASK)
992 #define NAN_DEV_CAP_RX_ANT(_ant)                                               \
993     (((_ant)&NAN_DEV_CAP_RX_ANT_MASK) >> NAN_DEV_CAP_RX_ANT_SHIFT)
994 
995 /* Device capabilities */
996 
997 /* DFS master capability */
998 #define NAN_DEV_CAP_DFS_MASTER_MASK 0x01
999 #define NAN_DEV_CAP_DFS_MASTER_SHIFT 0
1000 /* extended iv cap */
1001 #define NAN_DEV_CAP_EXT_KEYID_MASK 0x02
1002 #define NAN_DEV_CAP_EXT_KEYID_SHIFT 1
1003 /* NDPE attribute support */
1004 #define NAN_DEV_CAP_NDPE_ATTR_SUPPORT_MASK 0x08
1005 #define NAN_DEV_CAP_NDPE_ATTR_SUPPORT(_cap)                                    \
1006     ((_cap)&NAN_DEV_CAP_NDPE_ATTR_SUPPORT_MASK)
1007 
1008 /* Band IDs */
1009 enum {
1010     NAN_BAND_ID_TVWS = 0,
1011     NAN_BAND_ID_SIG = 1, /* Sub 1 GHz */
1012     NAN_BAND_ID_2G = 2,  /* 2.4 GHz */
1013     NAN_BAND_ID_3G = 3,  /* 3.6 GHz */
1014     NAN_BAND_ID_5G = 4,  /* 4.9 & 5 GHz */
1015     NAN_BAND_ID_60G = 5
1016 };
1017 typedef uint8 nan_band_id_t;
1018 
1019 /* NAN supported band in device capability */
1020 #define NAN_DEV_CAP_SUPPORTED_BANDS_2G (1 << NAN_BAND_ID_2G)
1021 #define NAN_DEV_CAP_SUPPORTED_BANDS_5G (1 << NAN_BAND_ID_5G)
1022 
1023 /*
1024  * Unaligned schedule attribute section 10.7.19.6 spec. ver r15
1025  */
1026 #define NAN_ULW_ATTR_CTRL_SCHED_ID_MASK 0x000F
1027 #define NAN_ULW_ATTR_CTRL_SCHED_ID_SHIFT 0
1028 #define NAN_ULW_ATTR_CTRL_SEQ_ID_MASK 0xFF00
1029 #define NAN_ULW_ATTR_CTRL_SEQ_ID_SHIFT 8
1030 
1031 #define NAN_ULW_OVWR_ALL_MASK 0x01
1032 #define NAN_ULW_OVWR_ALL_SHIFT 0
1033 #define NAN_ULW_OVWR_MAP_ID_MASK 0x1E
1034 #define NAN_ULW_OVWR_MAP_ID_SHIFT 1
1035 
1036 #define NAN_ULW_CTRL_TYPE_MASK 0x03
1037 #define NAN_ULW_CTRL_TYPE_SHIFT 0
1038 #define NAN_ULW_CTRL_TYPE(ctrl) (ctrl & NAN_ULW_CTRL_TYPE_MASK)
1039 #define NAN_ULW_CTRL_CHAN_AVAIL_MASK 0x04
1040 #define NAN_ULW_CTRL_CHAN_AVAIL_SHIFT 2
1041 #define NAN_ULW_CTRL_CHAN_AVAIL(ctrl)                                          \
1042     ((ctrl & NAN_ULW_CTRL_CHAN_AVAIL_MASK) >> NAN_ULW_CTRL_CHAN_AVAIL_SHIFT)
1043 #define NAN_ULW_CTRL_RX_NSS_MASK 0x78
1044 #define NAN_ULW_CTRL_RX_NSS_SHIFT 3
1045 
1046 #define NAN_ULW_CTRL_TYPE_BAND 0
1047 #define NAN_ULW_CTRL_TYPE_CHAN_NOAUX 1
1048 #define NAN_ULW_CTRL_TYPE_CHAN_AUX 2
1049 
1050 #define NAN_ULW_CNT_DOWN_NO_EXPIRE                                             \
1051     0xFF /* ULWs doen't end until next sched update */
1052 #define NAN_ULW_CNT_DOWN_CANCEL 0x0 /* cancel remaining ulws */
1053 
1054 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_ulw_attr_s {
1055     uint8 id;
1056     uint16 len;
1057     uint16 ctrl;
1058     uint32 start; /* low 32 bits of tsf */
1059     uint32 dur;
1060     uint32 period;
1061     uint8 count_down;
1062     uint8 overwrite;
1063     /*
1064      * ulw[0] == optional field ULW control when present.
1065      * band ID or channel follows
1066      */
1067     uint8 ulw_entry[];
1068 } BWL_POST_PACKED_STRUCT wifi_nan_ulw_attr_t;
1069 
1070 /* NAN2 Management Frame (section 5.6) */
1071 
1072 /* Public action frame for NAN2 */
1073 typedef BWL_PRE_PACKED_STRUCT struct nan2_pub_act_frame_s {
1074     /* NAN_PUB_AF_CATEGORY 0x04 */
1075     uint8 category_id;
1076     /* NAN_PUB_AF_ACTION 0x09 */
1077     uint8 action_field;
1078     /* NAN_OUI 0x50-6F-9A */
1079     uint8 oui[DOT11_OUI_LEN];
1080     /* NAN_OUI_TYPE */
1081     uint8 oui_type;
1082     /* NAN_OUI_SUB_TYPE */
1083     uint8 oui_sub_type;
1084     /* One or more NAN Attributes follow */
1085     uint8 data[];
1086 } BWL_POST_PACKED_STRUCT nan2_pub_act_frame_t;
1087 
1088 #define NAN2_PUB_ACT_FRM_SIZE (OFFSETOF(nan2_pub_act_frame_t, data))
1089 
1090 /* NAN Action Frame Subtypes */
1091 /* Subtype-0 is Reserved */
1092 #define NAN_MGMT_FRM_SUBTYPE_RESERVED 0
1093 #define NAN_MGMT_FRM_SUBTYPE_INVALID 0
1094 /* NAN Ranging Request */
1095 #define NAN_MGMT_FRM_SUBTYPE_RANGING_REQ 1
1096 /* NAN Ranging Response */
1097 #define NAN_MGMT_FRM_SUBTYPE_RANGING_RESP 2
1098 /* NAN Ranging Termination */
1099 #define NAN_MGMT_FRM_SUBTYPE_RANGING_TERM 3
1100 /* NAN Ranging Report */
1101 #define NAN_MGMT_FRM_SUBTYPE_RANGING_RPT 4
1102 /* NDP Request */
1103 #define NAN_MGMT_FRM_SUBTYPE_NDP_REQ 5
1104 /* NDP Response */
1105 #define NAN_MGMT_FRM_SUBTYPE_NDP_RESP 6
1106 /* NDP Confirm */
1107 #define NAN_MGMT_FRM_SUBTYPE_NDP_CONFIRM 7
1108 /* NDP Key Installment */
1109 #define NAN_MGMT_FRM_SUBTYPE_NDP_KEY_INST 8
1110 /* NDP Termination */
1111 #define NAN_MGMT_FRM_SUBTYPE_NDP_END 9
1112 /* Schedule Request */
1113 #define NAN_MGMT_FRM_SUBTYPE_SCHED_REQ 10
1114 /* Schedule Response */
1115 #define NAN_MGMT_FRM_SUBTYPE_SCHED_RESP 11
1116 /* Schedule Confirm */
1117 #define NAN_MGMT_FRM_SUBTYPE_SCHED_CONF 12
1118 /* Schedule Update */
1119 #define NAN_MGMT_FRM_SUBTYPE_SCHED_UPD 13
1120 
1121 #define NAN_SCHEDULE_AF(_naf_subtype)                                          \
1122     ((_naf_subtype >= NAN_MGMT_FRM_SUBTYPE_SCHED_REQ) &&                       \
1123      (_naf_subtype <= NAN_MGMT_FRM_SUBTYPE_SCHED_UPD))
1124 
1125 /* Reason code defines */
1126 #define NAN_REASON_RESERVED 0x0
1127 #define NAN_REASON_UNSPECIFIED 0x1
1128 #define NAN_REASON_RESOURCE_LIMIT 0x2
1129 #define NAN_REASON_INVALID_PARAMS 0x3
1130 #define NAN_REASON_FTM_PARAM_INCAP 0x4
1131 #define NAN_REASON_NO_MOVEMENT 0x5
1132 #define NAN_REASON_INVALID_AVAIL 0x6
1133 #define NAN_REASON_IMMUT_UNACCEPT 0x7
1134 #define NAN_REASON_SEC_POLICY 0x8
1135 #define NAN_REASON_QOS_UNACCEPT 0x9
1136 #define NAN_REASON_NDP_REJECT 0xa
1137 #define NAN_REASON_NDL_UNACCEPTABLE 0xb
1138 
1139 /* nan 2.0 qos (not attribute) */
1140 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_ndp_qos_s {
1141     uint8 tid;          /* traffic identifier */
1142     uint16 pkt_size;    /* service data pkt size */
1143     uint8 data_rate;    /* mean data rate */
1144     uint8 svc_interval; /* max service interval */
1145 } BWL_POST_PACKED_STRUCT wifi_nan_ndp_qos_t;
1146 
1147 /* NDP control bitmap defines */
1148 #define NAN_NDP_CTRL_CONFIRM_REQUIRED 0x01
1149 #define NAN_NDP_CTRL_SECURTIY_PRESENT 0x04
1150 #define NAN_NDP_CTRL_PUB_ID_PRESENT 0x08
1151 #define NAN_NDP_CTRL_RESP_NDI_PRESENT 0x10
1152 #define NAN_NDP_CTRL_SPEC_INFO_PRESENT 0x20
1153 #define NAN_NDP_CTRL_RESERVED 0xA0
1154 
1155 /* Used for both NDP Attribute and NDPE Attribute, since the structures are
1156  * identical */
1157 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_ndp_attr_s {
1158     uint8 id;                   /* NDP: 0x10, NDPE: 0x29 */
1159     uint16 len;                 /* length */
1160     uint8 dialog_token;         /* dialog token */
1161     uint8 type_status;          /* bits 0-3 type, 4-7 status */
1162     uint8 reason;               /* reason code */
1163     struct ether_addr init_ndi; /* ndp initiator's data interface address */
1164     uint8 ndp_id;               /* ndp identifier (created by initiator */
1165     uint8 control;              /* ndp control field */
1166     uint8 var[];                /* Optional fields follow */
1167 } BWL_POST_PACKED_STRUCT wifi_nan_ndp_attr_t;
1168 /* NDP attribute type and status macros */
1169 #define NAN_NDP_TYPE_MASK 0x0F
1170 #define NAN_NDP_TYPE_REQUEST 0x0
1171 #define NAN_NDP_TYPE_RESPONSE 0x1
1172 #define NAN_NDP_TYPE_CONFIRM 0x2
1173 #define NAN_NDP_TYPE_SECURITY 0x3
1174 #define NAN_NDP_TYPE_TERMINATE 0x4
1175 #define NAN_NDP_REQUEST(_ndp)                                                  \
1176     (((_ndp)->type_status & NAN_NDP_TYPE_MASK) == NAN_NDP_TYPE_REQUEST)
1177 #define NAN_NDP_RESPONSE(_ndp)                                                 \
1178     (((_ndp)->type_status & NAN_NDP_TYPE_MASK) == NAN_NDP_TYPE_RESPONSE)
1179 #define NAN_NDP_CONFIRM(_ndp)                                                  \
1180     (((_ndp)->type_status & NAN_NDP_TYPE_MASK) == NAN_NDP_TYPE_CONFIRM)
1181 #define NAN_NDP_SECURITY_INST(_ndp)                                            \
1182     (((_ndp)->type_status & NAN_NDP_TYPE_MASK) == NAN_NDP_TYPE_SECURITY)
1183 #define NAN_NDP_TERMINATE(_ndp)                                                \
1184     (((_ndp)->type_status & NAN_NDP_TYPE_MASK) == NAN_NDP_TYPE_TERMINATE)
1185 #define NAN_NDP_STATUS_SHIFT 4
1186 #define NAN_NDP_STATUS_MASK 0xF0
1187 #define NAN_NDP_STATUS_CONT (0 << NAN_NDP_STATUS_SHIFT)
1188 #define NAN_NDP_STATUS_ACCEPT (1 << NAN_NDP_STATUS_SHIFT)
1189 #define NAN_NDP_STATUS_REJECT (2 << NAN_NDP_STATUS_SHIFT)
1190 #define NAN_NDP_CONT(_ndp)                                                     \
1191     (((_ndp)->type_status & NAN_NDP_STATUS_MASK) == NAN_NDP_STATUS_CONT)
1192 #define NAN_NDP_ACCEPT(_ndp)                                                   \
1193     (((_ndp)->type_status & NAN_NDP_STATUS_MASK) == NAN_NDP_STATUS_ACCEPT)
1194 #define NAN_NDP_REJECT(_ndp)                                                   \
1195     (((_ndp)->type_status & NAN_NDP_STATUS_MASK) == NAN_NDP_STATUS_REJECT)
1196 
1197 #define NAN_NDP_FRM_STATUS(_ndp)                                               \
1198     (((_ndp)->type_status & NAN_NDP_STATUS_MASK) >> NAN_NDP_STATUS_SHIFT)
1199 
1200 /* NDP Setup Status */
1201 #define NAN_NDP_SETUP_STATUS_OK 1
1202 #define NAN_NDP_SETUP_STATUS_FAIL 0
1203 #define NAN_NDP_SETUP_STATUS_REJECT 2
1204 
1205 /* NDPE TLV list */
1206 #define NDPE_TLV_TYPE_IPV6 0x00
1207 #define NDPE_TLV_TYPE_SVC_INFO 0x01
1208 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_ndpe_tlv_s {
1209     uint8 type;    /* Operating Class */
1210     uint16 length; /* Channel Bitmap */
1211     uint8 data[];
1212 } BWL_POST_PACKED_STRUCT wifi_nan_ndpe_tlv_t;
1213 
1214 /* Rng setup attribute type and status macros */
1215 #define NAN_RNG_TYPE_MASK 0x0F
1216 #define NAN_RNG_TYPE_REQUEST 0x0
1217 #define NAN_RNG_TYPE_RESPONSE 0x1
1218 #define NAN_RNG_TYPE_TERMINATE 0x2
1219 
1220 #define NAN_RNG_STATUS_SHIFT 4
1221 #define NAN_RNG_STATUS_MASK 0xF0
1222 #define NAN_RNG_STATUS_ACCEPT (0 << NAN_RNG_STATUS_SHIFT)
1223 #define NAN_RNG_STATUS_REJECT (1 << NAN_RNG_STATUS_SHIFT)
1224 
1225 #define NAN_RNG_ACCEPT(_rsua)                                                  \
1226     (((_rsua)->type_status & NAN_RNG_STATUS_MASK) == NAN_RNG_STATUS_ACCEPT)
1227 #define NAN_RNG_REJECT(_rsua)                                                  \
1228     (((_rsua)->type_status & NAN_RNG_STATUS_MASK) == NAN_RNG_STATUS_REJECT)
1229 
1230 /* schedule entry */
1231 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_sched_entry_s {
1232     uint8 map_id;     /* map id */
1233     uint16 tbmp_ctrl; /* time bitmap control */
1234     uint8 tbmp_len;   /* time bitmap len */
1235     uint8 tbmp[];     /* time bitmap - Optional */
1236 } BWL_POST_PACKED_STRUCT wifi_nan_sched_entry_t;
1237 
1238 #define NAN_SCHED_ENTRY_MAPID_MASK 0x0F
1239 #define NAN_SCHED_ENTRY_MIN_SIZE OFFSETOF(wifi_nan_sched_entry_t, tbmp)
1240 #define NAN_SCHED_ENTRY_SIZE(_entry)                                           \
1241     (NAN_SCHED_ENTRY_MIN_SIZE + (_entry)->tbmp_len)
1242 
1243 /* for dev cap, element container etc. */
1244 #define NAN_DEV_ELE_MAPID_CTRL_MASK 0x1
1245 #define NAN_DEV_ELE_MAPID_CTRL_SHIFT 0
1246 #define NAN_DEV_ELE_MAPID_MASK 0x1E
1247 #define NAN_DEV_ELE_MAPID_SHIFT 1
1248 
1249 #define NAN_DEV_ELE_MAPID_CTRL_SET(_mapid_field, value)                        \
1250     do {                                                                       \
1251         (_mapid_field) &= ~NAN_DEV_ELE_MAPID_CTRL_MASK;                        \
1252         (_mapid_field) |= ((value << NAN_DEV_ELE_MAPID_CTRL_SHIFT) &           \
1253                            NAN_DEV_ELE_MAPID_CTRL_MASK);                       \
1254     } while (0);
1255 
1256 #define NAN_DEV_ELE_MAPID_CTRL_GET(_mapid_field)                               \
1257     (((_mapid_field)&NAN_DEV_ELE_MAPID_CTRL_MASK) >>                           \
1258      NAN_DEV_ELE_MAPID_CTRL_SHIFT)
1259 
1260 #define NAN_DEV_ELE_MAPID_SET(_mapid_field, value)                             \
1261     do {                                                                       \
1262         (_mapid_field) &= ~NAN_DEV_ELE_MAPID_MASK;                             \
1263         (_mapid_field) |=                                                      \
1264             ((value << NAN_DEV_ELE_MAPID_SHIFT) & NAN_DEV_ELE_MAPID_MASK);     \
1265     } while (0);
1266 
1267 #define NAN_DEV_ELE_MAPID_GET(_mapid_field)                                    \
1268     (((_mapid_field)&NAN_DEV_ELE_MAPID_MASK) >> NAN_DEV_ELE_MAPID_SHIFT)
1269 
1270 /* schedule entry map id handling */
1271 #define NAN_SCHED_ENTRY_MAPID_MASK 0x0F
1272 #define NAN_SCHED_ENTRY_MAPID_SHIFT 0
1273 
1274 #define NAN_SCHED_ENTRY_MAPID_SET(_mapid_field, value)                         \
1275     do {                                                                       \
1276         (_mapid_field) &= ~NAN_SCHED_ENTRY_MAPID_MASK;                         \
1277         (_mapid_field) |= ((value << NAN_SCHED_ENTRY_MAPID_SHIFT) &            \
1278                            NAN_SCHED_ENTRY_MAPID_MASK);                        \
1279     } while (0);
1280 
1281 #define NAN_SCHED_ENTRY_MAPID_GET(_mapid_field)                                \
1282     (((_mapid_field)&NAN_SCHED_ENTRY_MAPID_MASK) >> NAN_SCHED_ENTRY_MAPID_SHIFT)
1283 
1284 /* NDC attribute */
1285 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_ndc_attr_s {
1286     uint8 id;
1287     uint16 len;
1288     uint8 ndc_id[NAN_DATA_NDC_ID_SIZE];
1289     uint8 attr_cntrl;
1290     uint8 var[];
1291 } BWL_POST_PACKED_STRUCT wifi_nan_ndc_attr_t;
1292 
1293 /* Attribute control subfield of NDC attr */
1294 /* Proposed NDC */
1295 #define NAN_NDC_ATTR_PROPOSED_NDC_MASK 0x1
1296 #define NAN_NDC_ATTR_PROPOSED_NDC_SHIFT 0
1297 
1298 /* get & set */
1299 #define NAN_NDC_GET_PROPOSED_FLAG(_attr)                                       \
1300     (((_attr)->attr_cntrl & NAN_NDC_ATTR_PROPOSED_NDC_MASK) >>                 \
1301      NAN_NDC_ATTR_PROPOSED_NDC_SHIFT)
1302 #define NAN_NDC_SET_PROPOSED_FLAG(_attr, value)                                \
1303     do {                                                                       \
1304         ((_attr)->attr_cntrl &= ~NAN_NDC_ATTR_PROPOSED_NDC_MASK);              \
1305         ((_attr)->attr_cntrl |=                                                \
1306          (((value) << NAN_NDC_ATTR_PROPOSED_NDC_SHIFT) &                       \
1307           NAN_NDC_ATTR_PROPOSED_NDC_MASK));                                    \
1308     } while (0)
1309 
1310 /* Service descriptor extension attribute */
1311 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_svc_desc_ext_attr_s {
1312     /* Attribute ID - 0x11 */
1313     uint8 id;
1314     /* Length of the following fields in the attribute */
1315     uint16 len;
1316     /* Instance id of associated service descriptor attribute */
1317     uint8 instance_id;
1318     /* SDE control field */
1319     uint16 control;
1320     /* range limit, svc upd indicator etc. */
1321     uint8 var[];
1322 } BWL_POST_PACKED_STRUCT wifi_nan_svc_desc_ext_attr_t;
1323 
1324 #define NAN_SDE_ATTR_MIN_LEN OFFSETOF(wifi_nan_svc_desc_ext_attr_t, var)
1325 #define NAN_SDE_ATTR_RANGE_LEN 4
1326 #define NAN_SDE_ATTR_SUI_LEN 1
1327 #define NAN_SDE_ATTR_INFO_LEN_PARAM_LEN 2
1328 #define NAN_SDE_ATTR_RANGE_INGRESS_LEN 2
1329 #define NAN_SDE_ATTR_RANGE_EGRESS_LEN 2
1330 #define NAN_SDE_ATTR_CTRL_LEN 2
1331 /* max length of variable length field (matching filter, service response
1332  * filter, or service info) in service descriptor attribute
1333  */
1334 #define NAN_DISC_SDA_FIELD_MAX_LEN 255
1335 
1336 /* SDEA control field bit definitions and access macros */
1337 #define NAN_SDE_CF_FSD_REQUIRED (1 << 0)
1338 #define NAN_SDE_CF_FSD_GAS (1 << 1)
1339 #define NAN_SDE_CF_DP_REQUIRED (1 << 2)
1340 #define NAN_SDE_CF_DP_TYPE (1 << 3)
1341 #define NAN_SDE_CF_MULTICAST_TYPE (1 << 4)
1342 #define NAN_SDE_CF_QOS_REQUIRED (1 << 5)
1343 #define NAN_SDE_CF_SECURITY_REQUIRED (1 << 6)
1344 #define NAN_SDE_CF_RANGING_REQUIRED (1 << 7)
1345 #define NAN_SDE_CF_RANGE_PRESENT (1 << 8)
1346 #define NAN_SDE_CF_SVC_UPD_IND_PRESENT (1 << 9)
1347 /* Using Reserved Bits as per Spec */
1348 #define NAN_SDE_CF_LIFE_CNT_PUB_RX (1 << 15)
1349 #define NAN_SDE_FSD_REQUIRED(_sde) ((_sde)->control & NAN_SDE_CF_FSD_REQUIRED)
1350 #define NAN_SDE_FSD_GAS(_sde) ((_sde)->control & NAN_SDE_CF_FSD_GAS)
1351 #define NAN_SDE_DP_REQUIRED(_sde) ((_sde)->control & NAN_SDE_CF_DP_REQUIRED)
1352 #define NAN_SDE_DP_MULTICAST(_sde) ((_sde)->control & NAN_SDE_CF_DP_TYPE)
1353 #define NAN_SDE_MULTICAST_M_TO_M(_sde)                                         \
1354     ((_sde)->control & NAN_SDE_CF_MULTICAST_TYPE)
1355 #define NAN_SDE_QOS_REQUIRED(_sde) ((_sde)->control & NAN_SDE_CF_QOS_REQUIRED)
1356 #define NAN_SDE_SECURITY_REQUIRED(_sde)                                        \
1357     ((_sde)->control & NAN_SDE_CF_SECURITY_REQUIRED)
1358 #define NAN_SDE_RANGING_REQUIRED(_sde)                                         \
1359     ((_sde)->control & NAN_SDE_CF_RANGING_REQUIRED)
1360 #define NAN_SDE_RANGE_PRESENT(_sde) ((_sde)->control & NAN_SDE_CF_RANGE_PRESENT)
1361 #define NAN_SDE_SVC_UPD_IND_PRESENT(_sde)                                      \
1362     ((_sde)->control & NAN_SDE_CF_SVC_UPD_IND_PRESENT)
1363 #define NAN_SDE_LIFE_COUNT_FOR_PUB_RX(_sde) (_sde & NAN_SDE_CF_LIFE_CNT_PUB_RX)
1364 
1365 /* nan2 security */
1366 
1367 /*
1368  * Cipher suite information Attribute.
1369  * WFA Tech. Spec ver 1.0.r21 (section 10.7.24.2)
1370  */
1371 #define NAN_SEC_CIPHER_SUITE_CAP_REPLAY_4 0
1372 #define NAN_SEC_CIPHER_SUITE_CAP_REPLAY_16 (1 << 0)
1373 
1374 /* enum security algo.
1375  */
1376 enum nan_sec_csid {
1377     NAN_SEC_ALGO_NONE = 0,
1378     NAN_SEC_ALGO_NCS_SK_CCM_128 = 1, /* CCMP 128 */
1379     NAN_SEC_ALGO_NCS_SK_GCM_256 = 2, /* GCMP 256 */
1380     NAN_SEC_ALGO_LAST = 3
1381 };
1382 typedef int8 nan_sec_csid_e;
1383 
1384 /* nan2 cipher suite attribute field */
1385 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_sec_cipher_suite_field_s {
1386     uint8 cipher_suite_id;
1387     uint8 inst_id; /* Instance Id */
1388 } BWL_POST_PACKED_STRUCT wifi_nan_sec_cipher_suite_field_t;
1389 
1390 /* nan2 cipher suite information attribute field */
1391 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_sec_cipher_suite_info_attr_s {
1392     uint8 attr_id; /* 0x22 - NAN_ATTR_CIPHER_SUITE_INFO */
1393     uint16 len;
1394     uint8 capabilities;
1395     uint8 var[]; /* cipher suite list */
1396 } BWL_POST_PACKED_STRUCT wifi_nan_sec_cipher_suite_info_attr_t;
1397 
1398 /*
1399  * Security context identifier attribute
1400  * WFA Tech. Spec ver 1.0.r21 (section 10.7.24.4)
1401  */
1402 
1403 #define NAN_SEC_CTX_ID_TYPE_PMKID (1 << 0)
1404 
1405 /* nan2 security context identifier attribute field */
1406 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_sec_ctx_id_field_s {
1407     uint16 sec_ctx_id_type_len; /* length of security ctx identifier */
1408     uint8 sec_ctx_id_type;
1409     uint8 inst_id; /* Instance Id */
1410     uint8 var[];   /* security ctx identifier */
1411 } BWL_POST_PACKED_STRUCT wifi_nan_sec_ctx_id_field_t;
1412 
1413 /* nan2 security context identifier info attribute field */
1414 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_sec_ctx_id_info_attr_s {
1415     uint8 attr_id; /* 0x23 - NAN_ATTR_SEC_CTX_ID_INFO */
1416     uint16 len;
1417     uint8 var[]; /* security context identifier  list */
1418 } BWL_POST_PACKED_STRUCT wifi_nan_sec_ctx_id_info_attr_t;
1419 
1420 /*
1421  * Nan shared key descriptor attribute
1422  * WFA Tech. Spec ver 23
1423  */
1424 
1425 #define NAN_SEC_NCSSK_DESC_REPLAY_CNT_LEN 8
1426 #define NAN_SEC_NCSSK_DESC_KEY_NONCE_LEN 32
1427 
1428 /* nan shared key descriptor attr field */
1429 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_sec_ncssk_key_desc_attr_s {
1430     uint8 attr_id; /* 0x24 - NAN_ATTR_SHARED_KEY_DESC */
1431     uint16 len;
1432     uint8 inst_id; /* Publish service instance ID */
1433     uint8 desc_type;
1434     uint16 key_info;
1435     uint16 key_len;
1436     uint8 key_replay_cntr[NAN_SEC_NCSSK_DESC_REPLAY_CNT_LEN];
1437     uint8 key_nonce[NAN_SEC_NCSSK_DESC_KEY_NONCE_LEN];
1438     uint8 reserved[32]; /* EAPOL IV + Key RSC + Rsvd fields in EAPOL Key */
1439     uint8 mic[];        /* mic + key data len + key data */
1440 } BWL_POST_PACKED_STRUCT wifi_nan_sec_ncssk_key_desc_attr_t;
1441 
1442 /* Key Info fields */
1443 #define NAN_SEC_NCSSK_DESC_MASK 0x7
1444 #define NAN_SEC_NCSSK_DESC_SHIFT 0
1445 #define NAN_SEC_NCSSK_DESC_KEY_TYPE_MASK 0x8
1446 #define NAN_SEC_NCSSK_DESC_KEY_TYPE_SHIFT 3
1447 #define NAN_SEC_NCSSK_DESC_KEY_INSTALL_MASK 0x40
1448 #define NAN_SEC_NCSSK_DESC_KEY_INSTALL_SHIFT 6
1449 #define NAN_SEC_NCSSK_DESC_KEY_ACK_MASK 0x80
1450 #define NAN_SEC_NCSSK_DESC_KEY_ACK_SHIFT 7
1451 #define NAN_SEC_NCSSK_DESC_KEY_MIC_MASK 0x100
1452 #define NAN_SEC_NCSSK_DESC_KEY_MIC_SHIFT 8
1453 #define NAN_SEC_NCSSK_DESC_KEY_SEC_MASK 0x200
1454 #define NAN_SEC_NCSSK_DESC_KEY_SEC_SHIFT 9
1455 #define NAN_SEC_NCSSK_DESC_KEY_ERR_MASK 0x400
1456 #define NAN_SEC_NCSSK_DESC_KEY_ERR_SHIFT 10
1457 #define NAN_SEC_NCSSK_DESC_KEY_REQ_MASK 0x800
1458 #define NAN_SEC_NCSSK_DESC_KEY_REQ_SHIFT 11
1459 #define NAN_SEC_NCSSK_DESC_KEY_ENC_KEY_MASK 0x1000
1460 #define NAN_SEC_NCSSK_DESC_KEY_ENC_KEY_SHIFT 12
1461 #define NAN_SEC_NCSSK_DESC_KEY_SMK_MSG_MASK 0x2000
1462 #define NAN_SEC_NCSSK_DESC_KEY_SMK_MSG_SHIFT 13
1463 
1464 /* Key Info get & set macros */
1465 #define NAN_SEC_NCSSK_KEY_DESC_VER_GET(_key_info)                              \
1466     (((_key_info)&NAN_SEC_NCSSK_DESC_MASK) >> NAN_SEC_NCSSK_DESC_SHIFT)
1467 #define NAN_SEC_NCSSK_KEY_DESC_VER_SET(_val, _key_info)                        \
1468     do {                                                                       \
1469         (_key_info) &= ~NAN_SEC_NCSSK_DESC_MASK;                               \
1470         (_key_info) |=                                                         \
1471             (((_val) << NAN_SEC_NCSSK_DESC_SHIFT) & NAN_SEC_NCSSK_DESC_MASK);  \
1472     } while (0)
1473 #define NAN_SEC_NCSSK_DESC_KEY_TYPE_GET(_key_info)                             \
1474     (((_key_info)&NAN_SEC_NCSSK_DESC_KEY_TYPE_MASK) >>                         \
1475      NAN_SEC_NCSSK_DESC_KEY_TYPE_SHIFT)
1476 #define NAN_SEC_NCSSK_DESC_KEY_TYPE_SET(_val, _key_info)                       \
1477     do {                                                                       \
1478         (_key_info) &= ~NAN_SEC_NCSSK_DESC_KEY_TYPE_MASK;                      \
1479         (_key_info) |= (((_val) << NAN_SEC_NCSSK_DESC_KEY_TYPE_SHIFT) &        \
1480                         NAN_SEC_NCSSK_DESC_KEY_TYPE_MASK);                     \
1481     } while (0)
1482 #define NAN_SEC_NCSSK_DESC_KEY_INSTALL_GET(_key_info)                          \
1483     (((_key_info)&NAN_SEC_NCSSK_DESC_KEY_INSTALL_MASK) >>                      \
1484      NAN_SEC_NCSSK_DESC_KEY_INSTALL_SHIFT)
1485 #define NAN_SEC_NCSSK_DESC_KEY_INSTALL_SET(_val, _key_info)                    \
1486     do {                                                                       \
1487         (_key_info) &= ~NAN_SEC_NCSSK_DESC_KEY_INSTALL_MASK;                   \
1488         (_key_info) |= (((_val) << NAN_SEC_NCSSK_DESC_KEY_INSTALL_SHIFT) &     \
1489                         NAN_SEC_NCSSK_DESC_KEY_INSTALL_MASK);                  \
1490     } while (0)
1491 #define NAN_SEC_NCSSK_DESC_KEY_ACK_GET(_key_info)                              \
1492     (((_key_info)&NAN_SEC_NCSSK_DESC_KEY_ACK_MASK) >>                          \
1493      NAN_SEC_NCSSK_DESC_KEY_ACK_SHIFT)
1494 #define NAN_SEC_NCSSK_DESC_KEY_ACK_SET(_val, _key_info)                        \
1495     do {                                                                       \
1496         (_key_info) &= ~NAN_SEC_NCSSK_DESC_KEY_ACK_MASK;                       \
1497         (_key_info) |= (((_val) << NAN_SEC_NCSSK_DESC_KEY_ACK_SHIFT) &         \
1498                         NAN_SEC_NCSSK_DESC_KEY_ACK_MASK);                      \
1499     } while (0)
1500 #define NAN_SEC_NCSSK_DESC_KEY_MIC_GET(_key_info)                              \
1501     (((_key_info)&NAN_SEC_NCSSK_DESC_KEY_MIC_MASK) >>                          \
1502      NAN_SEC_NCSSK_DESC_KEY_MIC_SHIFT)
1503 #define NAN_SEC_NCSSK_DESC_KEY_MIC_SET(_val, _key_info)                        \
1504     do {                                                                       \
1505         (_key_info) &= ~NAN_SEC_NCSSK_DESC_KEY_MIC_MASK;                       \
1506         (_key_info) |= (((_val) << NAN_SEC_NCSSK_DESC_KEY_MIC_SHIFT) &         \
1507                         NAN_SEC_NCSSK_DESC_KEY_MIC_MASK);                      \
1508     } while (0)
1509 #define NAN_SEC_NCSSK_DESC_KEY_SEC_GET(_key_info)                              \
1510     (((_key_info)&NAN_SEC_NCSSK_DESC_KEY_SEC_MASK) >>                          \
1511      NAN_SEC_NCSSK_DESC_KEY_SEC_SHIFT)
1512 #define NAN_SEC_NCSSK_DESC_KEY_SEC_SET(_val, _key_info)                        \
1513     do {                                                                       \
1514         (_key_info) &= ~NAN_SEC_NCSSK_DESC_KEY_SEC_MASK;                       \
1515         (_key_info) |= (((_val) << NAN_SEC_NCSSK_DESC_KEY_SEC_SHIFT) &         \
1516                         NAN_SEC_NCSSK_DESC_KEY_SEC_MASK);                      \
1517     } while (0)
1518 #define NAN_SEC_NCSSK_DESC_KEY_ERR_GET(_key_info)                              \
1519     (((_key_info)&NAN_SEC_NCSSK_DESC_KEY_ERR_MASK) >>                          \
1520      NAN_SEC_NCSSK_DESC_KEY_ERR_SHIFT)
1521 #define NAN_SEC_NCSSK_DESC_KEY_ERR_SET(_val, _key_info)                        \
1522     do {                                                                       \
1523         (_key_info) &= ~NAN_SEC_NCSSK_DESC_KEY_ERR_MASK;                       \
1524         (_key_info) |= (((_val) << NAN_SEC_NCSSK_DESC_KEY_ERR_SHIFT) &         \
1525                         NAN_SEC_NCSSK_DESC_KEY_ERR_MASK);                      \
1526     } while (0)
1527 #define NAN_SEC_NCSSK_DESC_KEY_REQ_GET(_key_info)                              \
1528     (((_key_info)&NAN_SEC_NCSSK_DESC_KEY_REQ_MASK) >>                          \
1529      NAN_SEC_NCSSK_DESC_KEY_REQ_SHIFT)
1530 #define NAN_SEC_NCSSK_DESC_KEY_REQ_SET(_val, _key_info)                        \
1531     do {                                                                       \
1532         (_key_info) &= ~NAN_SEC_NCSSK_DESC_KEY_REQ_MASK;                       \
1533         (_key_info) |= (((_val) << NAN_SEC_NCSSK_DESC_KEY_REQ_SHIFT) &         \
1534                         NAN_SEC_NCSSK_DESC_KEY_REQ_MASK);                      \
1535     } while (0)
1536 #define NAN_SEC_NCSSK_DESC_KEY_ENC_KEY_GET(_key_info)                          \
1537     (((_key_info)&NAN_SEC_NCSSK_DESC_KEY_ENC_KEY_MASK) >>                      \
1538      NAN_SEC_NCSSK_DESC_KEY_ENC_KEY_SHIFT)
1539 #define NAN_SEC_NCSSK_DESC_KEY_ENC_KEY_SET(_val, _key_info)                    \
1540     do {                                                                       \
1541         (_key_info) &= ~NAN_SEC_NCSSK_DESC_KEY_ENC_KEY_MASK;                   \
1542         (_key_info) |= (((_val) << NAN_SEC_NCSSK_DESC_KEY_ENC_KEY_SHIFT) &     \
1543                         NAN_SEC_NCSSK_DESC_KEY_ENC_KEY_MASK);                  \
1544     } while (0)
1545 #define NAN_SEC_NCSSK_DESC_KEY_SMK_MSG_GET(_key_info)                          \
1546     (((_key_info)&NAN_SEC_NCSSK_DESC_KEY_SMK_MSG_MASK) >>                      \
1547      NAN_SEC_NCSSK_DESC_KEY_SMK_MSG_SHIFT)
1548 #define NAN_SEC_NCSSK_DESC_KEY_SMK_MSG_SET(_val, _key_info)                    \
1549     do {                                                                       \
1550         (_key_info) &= ~NAN_SEC_NCSSK_DESC_KEY_SMK_MSG_MASK;                   \
1551         (_key_info) |= (((_val) << NAN_SEC_NCSSK_DESC_KEY_SMK_MSG_SHIFT) &     \
1552                         NAN_SEC_NCSSK_DESC_KEY_SMK_MSG_MASK);                  \
1553     } while (0)
1554 
1555 #define NAN_SEC_NCSSK_IEEE80211_KDESC_TYPE                                     \
1556     2                                     /* IEEE 802.11 Key Descriptor Type */
1557 #define NAN_SEC_NCSSK_KEY_DESC_VER 0      /* NCSSK-128/256 */
1558 #define NAN_SEC_NCSSK_KEY_TYPE_PAIRWISE 1 /* Pairwise */
1559 #define NAN_SEC_NCSSK_LIFETIME_KDE 7      /* Lifetime KDE type */
1560 
1561 /* include MTK related attributes */
1562 
1563 /* NAN Multicast service group(NMSG) definitions */
1564 /* Length of NMSG_ID -- (NDI * 2^16 + pub_id * 2^8 + Random_factor) */
1565 #define NAN_NMSG_ID_LEN 8
1566 
1567 #define NAN_NMSG_TYPE_MASK 0x0F
1568 #define NMSG_ATTR_TYPE_STATUS_REQUEST 0x00
1569 #define NMSG_ATTR_TYPE_STATUS_RESPONSE 0x01
1570 #define NMSG_ATTR_TYPE_STATUS_CONFIRM 0x02
1571 #define NMSG_ATTR_TYPE_STATUS_SEC_INSTALL 0x03
1572 #define NMSG_ATTR_TYPE_STATUS_TERMINATE 0x04
1573 #define NMSG_ATTR_TYPE_STATUS_IMPLICIT_ENROL 0x05
1574 
1575 #define NMSG_ATTR_TYPE_STATUS_CONTINUED 0x00
1576 #define NMSG_ATTR_TYPE_STATUS_ACCEPTED 0x10
1577 #define NMSG_ATTR_TYPE_STATUS_REJECTED 0x20
1578 
1579 #define NMSG_CTRL_PUB_ID_PRESENT 0x0001
1580 #define NMSG_CTRL_NMSG_ID_PRESENT 0x0002
1581 #define NMSG_CTRL_SECURITY_PRESENT 0x0004
1582 #define NMSG_CTRL_MANY_TO_MANY_PRESENT 0x0008
1583 #define NMSG_CTRL_SVC_INFO_PRESENT 0x0010
1584 
1585 /* NMSG attribute */
1586 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_nmsg_attr_s {
1587     uint8 id;   /* Attribute ID - 0x11 */
1588     uint16 len; /* Length including pubid, NMSGID and svc info */
1589     uint8 dialog_token;
1590     uint8 type_status; /* Type and Status field byte */
1591     uint8 reason_code;
1592     uint8 mc_id;     /* Multicast id similar to NDPID */
1593     uint8 nmsg_ctrl; /* NMSG control field */
1594     /* Optional publish id, NMSGID and svc info are included in var[] */
1595     uint8 var[0];
1596 } BWL_POST_PACKED_STRUCT wifi_nan_nmsg_attr_t;
1597 
1598 #define NMSG_ATTR_MCAST_SCHED_MAP_ID_MASK 0x1E
1599 #define NMSG_ATTR_MCAST_SCHED_MAP_ID_SHIFT 1
1600 #define NMSG_ATTR_MCAST_SCHED_TIME_MAP_MASK 0x20
1601 #define NMSG_ATTR_MCAST_SCHED_TIME_MAP_SHIFT 5
1602 
1603 /* NAN Multicast Schedule atribute structure */
1604 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_mcast_sched_attr_s {
1605     uint8 id; /* 0x16 */
1606     uint16 len;
1607     uint8 nmsg_id[NAN_NMSG_ID_LEN];
1608     uint8 attr_cntrl;
1609     uint8 sched_own[ETHER_ADDR_LEN];
1610     uint8 var[]; /* multicast sched entry list (schedule_entry_list) */
1611 } BWL_POST_PACKED_STRUCT wifi_nan_mcast_sched_attr_t;
1612 
1613 /* FAC Channel Entry  (section 10.7.19.1.5) */
1614 typedef BWL_PRE_PACKED_STRUCT struct wifi_nan_fac_chan_entry_s {
1615     uint8 oper_class;       /* Operating Class */
1616     uint16 chan_bitmap;     /* Channel Bitmap */
1617     uint8 primary_chan_bmp; /* Primary Channel Bitmap */
1618     uint16 aux_chan;        /* Auxiliary Channel bitmap */
1619 } BWL_POST_PACKED_STRUCT wifi_nan_fac_chan_entry_t;
1620 
1621 /* move this from nan.h */
1622 #define NAN_ALL_NAN_MGMT_FRAMES                                                \
1623     (NAN_FRM_SCHED_AF | NAN_FRM_NDP_AF | NAN_FRM_NDL_AF | NAN_FRM_DISC_BCN |   \
1624      NAN_FRM_SYNC_BCN | NAN_FRM_SVC_DISC | NAN_FRM_RNG_REQ_AF |                \
1625      NAN_FRM_RNG_RESP_AF | NAN_FRM_RNG_REPORT_AF | NAN_FRM_RNG_TERM_AF)
1626 
1627 /* This marks the end of a packed structure section. */
1628 #include <packed_section_end.h>
1629 
1630 #endif /* _NAN_H_ */
1631