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