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