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