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