1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Fundamental types and constants relating to FILS AUTHENTICATION 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 2020, Broadcom. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Unless you and Broadcom execute a separate written software license 7*4882a593Smuzhiyun * agreement governing use of this software, this software is licensed to you 8*4882a593Smuzhiyun * under the terms of the GNU General Public License version 2 (the "GPL"), 9*4882a593Smuzhiyun * available at http://www.broadcom.com/licenses/GPLv2.php, with the 10*4882a593Smuzhiyun * following added to such license: 11*4882a593Smuzhiyun * 12*4882a593Smuzhiyun * As a special exception, the copyright holders of this software give you 13*4882a593Smuzhiyun * permission to link this software with independent modules, and to copy and 14*4882a593Smuzhiyun * distribute the resulting executable under terms of your choice, provided that 15*4882a593Smuzhiyun * you also meet, for each linked independent module, the terms and conditions of 16*4882a593Smuzhiyun * the license of that module. An independent module is a module which is not 17*4882a593Smuzhiyun * derived from this software. The special exception does not apply to any 18*4882a593Smuzhiyun * modifications of the software. 19*4882a593Smuzhiyun * 20*4882a593Smuzhiyun * 21*4882a593Smuzhiyun * <<Broadcom-WL-IPTag/Dual:>> 22*4882a593Smuzhiyun */ 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #ifndef _FILSAUTH_H_ 25*4882a593Smuzhiyun #define _FILSAUTH_H_ 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun /* This marks the start of a packed structure section. */ 28*4882a593Smuzhiyun #include <packed_section_start.h> 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* 11ai D6.0 8.6.8.36 FILS Discovery frame format 31*4882a593Smuzhiyun category 32*4882a593Smuzhiyun action 33*4882a593Smuzhiyun fils_discovery_info_field_t 34*4882a593Smuzhiyun fils_rnr_element_t 35*4882a593Smuzhiyun fils_indication_element_t 36*4882a593Smuzhiyun fils_vendor_specific_element_t 37*4882a593Smuzhiyun */ 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun /* 11revmc D4.0 8.4.2.25 Vendor Specific element */ 40*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_vendor_specific_element { 41*4882a593Smuzhiyun uint8 elementid; 42*4882a593Smuzhiyun uint8 length; 43*4882a593Smuzhiyun /* variable len info */ 44*4882a593Smuzhiyun uint8 orgid_vendorspecific_content[]; 45*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_vendor_specific_element_t; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun #define FILS_VS_ELEM_HDR_LEN (sizeof(fils_vendor_specific_element_t)) 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun /* 11ai D6.0 8.4.2.178 FILS Indication element */ 50*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_indication_element { 51*4882a593Smuzhiyun uint8 elementid; 52*4882a593Smuzhiyun uint8 length; 53*4882a593Smuzhiyun uint16 fils_info; 54*4882a593Smuzhiyun /* variable len info */ 55*4882a593Smuzhiyun uint8 cache_domain_publickey_id[]; 56*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_indication_element_t; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun #define FILS_INDICATION_ELEM_HDR_LEN (sizeof(fils_indication_element_t)) 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun #define FILS_INDICATION_IE_TAG_FIXED_LEN 2 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun #define FI_INFO_CACHE_IND_SUBFIELD_SIZE 2 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun /* FILS Indication Information field */ 65*4882a593Smuzhiyun #define FI_INFO_PUB_KEY_IDENTS_MASK (0x0007) 66*4882a593Smuzhiyun #define FI_INFO_REALM_IDENTS_MASK (0x0038) 67*4882a593Smuzhiyun #define FI_INFO_IP_ADDR_CFG_MASK (0x0040) 68*4882a593Smuzhiyun #define FI_INFO_CACHE_IDENT_MASK (0x0080) 69*4882a593Smuzhiyun #define FI_INFO_HESSID_MASK (0x0100) 70*4882a593Smuzhiyun #define FI_INFO_SHRKEY_AUTH_WOPFS_MASK (0x0200) 71*4882a593Smuzhiyun #define FI_INFO_SHRKEY_AUTH_WPFS_MASK (0x0400) 72*4882a593Smuzhiyun #define FI_INFO_PUBKEY_AUTH_MASK (0x0800) 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun #define FI_INFO_CACHE_IDENT(fc) (((fc) & FI_INFO_CACHE_IDENT_MASK) != 0) 75*4882a593Smuzhiyun #define FI_INFO_HESSID(fc) (((fc) & FI_INFO_HESSID_MASK) != 0) 76*4882a593Smuzhiyun #define FI_INFO_SHRKEY_AUTH_WOPFS(fc) (((fc) & FI_INFO_SHRKEY_AUTH_WOPFS_MASK) != 0) 77*4882a593Smuzhiyun #define FI_INFO_SHRKEY_AUTH_WPFS(fc) (((fc) & FI_INFO_SHRKEY_AUTH_WPFS_MASK) != 0) 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun typedef struct ether_addr tbtt_bssid_t; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun /* As per D5.0 in 802.11ax Table 9 281 TBTT Information field contents . */ 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT union rnr_tbtt_info_field { 84*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct len2 { 85*4882a593Smuzhiyun uint8 tbtt_offset; 86*4882a593Smuzhiyun uint8 bss_params; 87*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT len2_t; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct len5 { 90*4882a593Smuzhiyun uint8 tbtt_offset; 91*4882a593Smuzhiyun uint32 short_ssid; 92*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT len5_t; 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct len6 { 95*4882a593Smuzhiyun uint8 tbtt_offset; 96*4882a593Smuzhiyun uint32 short_ssid; 97*4882a593Smuzhiyun uint8 bss_params; 98*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT len6_t; 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct len7 { 101*4882a593Smuzhiyun uint8 tbtt_offset; 102*4882a593Smuzhiyun tbtt_bssid_t bssid; 103*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT len7_t; 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct len8 { 106*4882a593Smuzhiyun uint8 tbtt_offset; 107*4882a593Smuzhiyun tbtt_bssid_t bssid; 108*4882a593Smuzhiyun uint8 bss_params; 109*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT len8_t; 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct len9 { 112*4882a593Smuzhiyun uint8 tbtt_offset; 113*4882a593Smuzhiyun tbtt_bssid_t bssid; 114*4882a593Smuzhiyun uint8 bss_params; 115*4882a593Smuzhiyun uint8 psd_20mhz; 116*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT len9_t; 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct len11 { 119*4882a593Smuzhiyun uint8 tbtt_offset; 120*4882a593Smuzhiyun tbtt_bssid_t bssid; 121*4882a593Smuzhiyun uint32 short_ssid; 122*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT len11_t; 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct len12 { 125*4882a593Smuzhiyun uint8 tbtt_offset; 126*4882a593Smuzhiyun tbtt_bssid_t bssid; 127*4882a593Smuzhiyun uint32 short_ssid; 128*4882a593Smuzhiyun uint8 bss_params; 129*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT len12_t; 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun BWL_PRE_PACKED_STRUCT struct len13 { 132*4882a593Smuzhiyun uint8 tbtt_offset; 133*4882a593Smuzhiyun tbtt_bssid_t bssid; 134*4882a593Smuzhiyun uint32 short_ssid; 135*4882a593Smuzhiyun uint8 bss_params; 136*4882a593Smuzhiyun uint8 psd_20mhz; 137*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT len13_t; 138*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT rnr_tbtt_info_field_t; 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun /* 11ai D11.0 9.4.2.171.1 TBTT Information field */ 141*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct tbtt_info_field { 142*4882a593Smuzhiyun uint8 tbtt_offset; 143*4882a593Smuzhiyun struct ether_addr bssid; 144*4882a593Smuzhiyun uint32 short_ssid; 145*4882a593Smuzhiyun uint8 bss_params; 146*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT tbtt_info_field_t; 147*4882a593Smuzhiyun #define TBTT_INFO_FIELD_HDR_LEN (sizeof(tbtt_info_field_t)) 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun /* 11ai D11.0 9.4.2.171.1 Neighbor AP Information field */ 150*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct neighbor_ap_info_field { 151*4882a593Smuzhiyun uint16 tbtt_info_header; 152*4882a593Smuzhiyun uint8 op_class; 153*4882a593Smuzhiyun uint8 channel; 154*4882a593Smuzhiyun /* variable len info */ 155*4882a593Smuzhiyun uint8 tbtt_info_field[]; 156*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT neighbor_ap_info_field_t; 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun #define NEIGHBOR_AP_INFO_FIELD_HDR_LEN (sizeof(neighbor_ap_info_field_t)) 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun /* 11ai D11.0 9.4.2.171 Reduced Neighbor Report element */ 161*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_rnr_element { 162*4882a593Smuzhiyun uint8 elementid; 163*4882a593Smuzhiyun uint8 length; 164*4882a593Smuzhiyun /* variable len info */ 165*4882a593Smuzhiyun uint8 neighbor_ap_info[]; 166*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_rnr_element_t; 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun #define FILS_RNR_ELEM_HDR_LEN (sizeof(fils_rnr_element_t)) 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun /* TBTT Info Header macros */ 171*4882a593Smuzhiyun #define TBTT_INFO_HDR_FIELD_TYPE_MASK (0x0003u) 172*4882a593Smuzhiyun #define TBTT_INFO_HDR_FN_AP_MASK (0x0004u) 173*4882a593Smuzhiyun #define TBTT_INFO_HDR_COUNT_MASK (0x00f0u) 174*4882a593Smuzhiyun #define TBTT_INFO_HDR_LENGTH_MASK (0xff00u) 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun #define TBTT_INFO_HDR_FIELD_TYPE(hdr)\ 177*4882a593Smuzhiyun ((hdr) & TBTT_INFO_HDR_FIELD_TYPE_MASK) 178*4882a593Smuzhiyun #define TBTT_INFO_HDR_FN_AP(hdr)\ 179*4882a593Smuzhiyun (((hdr) & TBTT_INFO_HDR_FN_AP_MASK) != 0) 180*4882a593Smuzhiyun #define TBTT_INFO_HDR_COUNT(hdr)\ 181*4882a593Smuzhiyun (((hdr) & TBTT_INFO_HDR_COUNT_MASK) >> 4u) 182*4882a593Smuzhiyun #define TBTT_INFO_HDR_LENGTH(hdr)\ 183*4882a593Smuzhiyun (((hdr) & TBTT_INFO_HDR_LENGTH_MASK) >> 8u) 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun /* BSS Params Macros */ 186*4882a593Smuzhiyun #define RNR_BSS_PARAMS_OCT_REC_MASK (0x01u) 187*4882a593Smuzhiyun #define RNR_BSS_PARAMS_SAME_SSID_MASK (0x02u) 188*4882a593Smuzhiyun #define RNR_BSS_PARAMS_MUTIPLE_BSSID_MASK (0x04u) 189*4882a593Smuzhiyun #define RNR_BSS_PARAMS_TRANSMITTED_BSSID_MASK (0x08u) 190*4882a593Smuzhiyun #define RNR_BSS_MEMBER_OF_ESS_MASK (0x10u) 191*4882a593Smuzhiyun #define RNR_BSS_20_TU_PRB_RSP_ACTIVE_MASK (0x20u) 192*4882a593Smuzhiyun #define RNR_BSS_COLOCATED_AP_MASK (0x40u) 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun #define RNR_BSS_PARAMS_OCT_REC(bss)\ 195*4882a593Smuzhiyun (((bss) & RNR_BSS_PARAMS_OCT_REC_MASK) != 0) 196*4882a593Smuzhiyun #define RNR_BSS_PARAMS_SAME_SSID(bss)\ 197*4882a593Smuzhiyun (((bss) & RNR_BSS_PARAMS_SAME_SSID_MASK) != 0) 198*4882a593Smuzhiyun #define RNR_BSS_PARAMS_MUTIPLE_BSSID(bss)\ 199*4882a593Smuzhiyun (((bss) & RNR_BSS_PARAMS_MUTIPLE_BSSID_MASK) != 0) 200*4882a593Smuzhiyun #define RNR_BSS_PARAMS_TRANSMITTED_BSSID(bss)\ 201*4882a593Smuzhiyun (((bss) & RNR_BSS_PARAMS_TRANSMITTED_BSSID_MASK) != 0) 202*4882a593Smuzhiyun #define RNR_BSS_MEMBER_OF_ESS(bss)\ 203*4882a593Smuzhiyun (((bss) & RNR_BSS_MEMBER_OF_ESS_MASK) != 0) 204*4882a593Smuzhiyun #define RNR_BSS_20_TU_PRB_RSP_ACTIVE(bss)\ 205*4882a593Smuzhiyun (((bss) & RNR_BSS_20_TU_PRB_RSP_ACTIVE_MASK) != 0) 206*4882a593Smuzhiyun #define RNR_BSS_COLOCATED_AP(bss)\ 207*4882a593Smuzhiyun (((bss) & RNR_BSS_COLOCATED_AP_MASK) != 0) 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun /* TBTT Information field Contents */ 210*4882a593Smuzhiyun /* NBR_AP TBTT OFFSET field ( 1 Byte) */ 211*4882a593Smuzhiyun #define NBR_AP_TBTT_LEN 1U 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun /* NBR_AP TBTT OFFSETfield(1) + BSSPARAMS(1) 2Bytes */ 214*4882a593Smuzhiyun #define NBR_AP_TBTT_BSS_LEN 2U 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun /* NBR_AP TBTT OFFSETfield(1) + SHORTSSID (4) 5 Bytes */ 217*4882a593Smuzhiyun #define NBR_AP_TBTT_SHORT_SSID_LEN 5U 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun /* NBR_AP TBTT OFFSETfield(1)+SHORTSSID (4)+BSS(1) 6 Bytes */ 220*4882a593Smuzhiyun #define NBR_AP_TBTT_BSS_SHORT_SSID_LEN 6U 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun /* NBR_AP TBTT OFFSETfield(1) + BSSID(6) 7BYTES */ 223*4882a593Smuzhiyun #define NBR_AP_TBTT_BSSID_LEN 7U 224*4882a593Smuzhiyun 225*4882a593Smuzhiyun /* NBR_AP TBTT OFFSETfield(1) + BSSID(6)+BSS(1) 8BYTES */ 226*4882a593Smuzhiyun #define NBR_AP_TBTT_BSSID_BSS_LEN 8U 227*4882a593Smuzhiyun 228*4882a593Smuzhiyun /* NBR_AP TBTT OFFSETfield(1) + BSSID(6)+BSS(1) + 20Mhz PSD(1) = 9BYTES */ 229*4882a593Smuzhiyun #define NBR_AP_TBTT_BSSID_BSS_PSD_LEN 9U 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun /* NBR_AP TBTT OFFSETfield(1) + BSSID(6)+SHORTSSID (4) 11Bytes */ 232*4882a593Smuzhiyun #define NBR_AP_TBTT_BSSID_SHORT_SSID_LEN 11U 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun /* NBR_AP TBTT OFFSETfield(1) + BSSID(6)+SHORTSSID (4)+BSS(1) 12 BYTES */ 235*4882a593Smuzhiyun #define NBR_AP_TBTT_BSSID_SHORT_SSID_BSS_LEN 12U 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun /* NBR_AP TBTT OFFSETfield(1) + BSSID(6) + 238*4882a593Smuzhiyun * SHORTSSID (4)+BSS(1) + 20Mhz PSD(1) = 13 BYTES 239*4882a593Smuzhiyun */ 240*4882a593Smuzhiyun #define NBR_AP_TBTT_BSSID_SHORT_SSID_BSS_PSD_LEN 13U 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun /* FILS Nonce element */ 243*4882a593Smuzhiyun #define FILS_NONCE_LENGTH 16u 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_nonce_element { 246*4882a593Smuzhiyun uint8 elementid; 247*4882a593Smuzhiyun uint8 length; 248*4882a593Smuzhiyun uint8 element_id_ext; 249*4882a593Smuzhiyun uint8 fils_nonce[FILS_NONCE_LENGTH]; 250*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_nonce_element_t; 251*4882a593Smuzhiyun 252*4882a593Smuzhiyun /* 11ai 9.4.2.186 FILS Key Delivery element */ 253*4882a593Smuzhiyun #define FILS_KEY_RSC_LENGTH 8u 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_key_delivery_element { 256*4882a593Smuzhiyun uint8 elementid; 257*4882a593Smuzhiyun uint8 length; 258*4882a593Smuzhiyun uint8 element_id_ext; 259*4882a593Smuzhiyun uint8 key_rsc[FILS_KEY_RSC_LENGTH]; 260*4882a593Smuzhiyun uint8 kde_list[]; /* Key Data Elements */ 261*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_key_delivery_element_t; 262*4882a593Smuzhiyun 263*4882a593Smuzhiyun /* 8.4.2.175 FILS Session element */ 264*4882a593Smuzhiyun #define FILS_SESSION_LENGTH 8u 265*4882a593Smuzhiyun 266*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_session_element { 267*4882a593Smuzhiyun uint8 elementid; 268*4882a593Smuzhiyun uint8 length; 269*4882a593Smuzhiyun uint8 element_id_ext; 270*4882a593Smuzhiyun uint8 fils_session[FILS_SESSION_LENGTH]; 271*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_session_element_t; 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun #define FILS_SESSION_ELEM_LEN (sizeof(fils_session_element_t)) 274*4882a593Smuzhiyun 275*4882a593Smuzhiyun /* 9.4.2.179 FILS key confirmation element */ 276*4882a593Smuzhiyun #define FILS_KEY_CONFIRMATION_HEADER_LEN 3u 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_key_conf_element { 279*4882a593Smuzhiyun uint8 elementid; 280*4882a593Smuzhiyun uint8 length; 281*4882a593Smuzhiyun uint8 element_id_ext; 282*4882a593Smuzhiyun /* variable len info */ 283*4882a593Smuzhiyun uint8 key_auth[]; 284*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_key_conf_element_t; 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun /* 8.4.2.174 FILS Key Confirmation element */ 287*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_key_confirm_element { 288*4882a593Smuzhiyun uint8 elementid; 289*4882a593Smuzhiyun uint8 length; 290*4882a593Smuzhiyun uint8 element_id_ext; 291*4882a593Smuzhiyun /* variable len info */ 292*4882a593Smuzhiyun uint8 keyauth[]; 293*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_key_confirm_element_t; 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun #define FILS_CONFIRM_ELEM_HDR_LEN (sizeof(fils_key_confirm_element_t)) 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun /* 9.4.2.180 FILS Public Key element */ 298*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_public_key_element { 299*4882a593Smuzhiyun uint8 elementid; 300*4882a593Smuzhiyun uint8 length; 301*4882a593Smuzhiyun uint8 element_id_ext; 302*4882a593Smuzhiyun uint8 key_type; 303*4882a593Smuzhiyun /* variable len info */ 304*4882a593Smuzhiyun uint8 pub_key[]; 305*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_public_key_element_t; 306*4882a593Smuzhiyun 307*4882a593Smuzhiyun /* 11ai D6.0 8.6.8.36 FILS Discovery frame format */ 308*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_discovery_info_field { 309*4882a593Smuzhiyun uint16 framecontrol; 310*4882a593Smuzhiyun uint32 timestamp[2]; 311*4882a593Smuzhiyun uint16 bcninterval; 312*4882a593Smuzhiyun /* variable len info */ 313*4882a593Smuzhiyun uint8 disc_info[]; 314*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_discovery_info_field_t; 315*4882a593Smuzhiyun 316*4882a593Smuzhiyun #define FD_INFO_FIELD_HDR_LEN (sizeof(fils_discovery_info_field_t)) 317*4882a593Smuzhiyun 318*4882a593Smuzhiyun #define FD_INFO_LENGTH_FIELD_SIZE 1u 319*4882a593Smuzhiyun #define FD_INFO_CAP_SUBFIELD_SIZE 2u 320*4882a593Smuzhiyun #define FD_INFO_OPCLASS_SUBFIED_SIZE 1u 321*4882a593Smuzhiyun #define FD_INFO_PRIM_CHAN_SUBFIELD_SIZE 1u 322*4882a593Smuzhiyun #define FD_INFO_APCSN_SUBFIELD_SIZE 1u 323*4882a593Smuzhiyun #define FD_INFO_ANO_SUBFIELD_SIZE 1u 324*4882a593Smuzhiyun #define FD_INFO_RSN_INFO_SUBFIELD_SIZE 5u 325*4882a593Smuzhiyun #define FD_INFO_CH_CENTER_FR_SUBFIELD_SIZE 1u 326*4882a593Smuzhiyun #define FD_INFO_MD_SUBFIELD_SIZE 3u 327*4882a593Smuzhiyun 328*4882a593Smuzhiyun /* FILS Discovery Information field */ 329*4882a593Smuzhiyun #define FD_INFO_SSID_LENGTH_MASK (0x001f) 330*4882a593Smuzhiyun #define FD_INFO_CAP_IND_MASK (0x0020) 331*4882a593Smuzhiyun #define FD_INFO_SHORT_SSID_IND_MASK (0x0040) 332*4882a593Smuzhiyun #define FD_INFO_APCSN_IND_MASK (0x0080) 333*4882a593Smuzhiyun #define FD_INFO_ANO_IND_MASK (0x0100) 334*4882a593Smuzhiyun #define FD_INFO_CH_CENTER_FR_IND_MASK (0x0200) 335*4882a593Smuzhiyun #define FD_INFO_PRIMARY_CH_IND_MASK (0x0400) 336*4882a593Smuzhiyun #define FD_INFO_RSN_IND_MASK (0x0800) 337*4882a593Smuzhiyun #define FD_INFO_LENGTH_IND_MASK (0x1000) 338*4882a593Smuzhiyun #define FD_INFO_MD_IND_MASK (0x2000) 339*4882a593Smuzhiyun 340*4882a593Smuzhiyun #define FD_INFO_SET_SSID_LENGTH(fc, len) ((fc) |= ((uint16)(len) & FD_INFO_SSID_LENGTH_MASK)) 341*4882a593Smuzhiyun #define FD_INFO_SET_CAP_PRESENT(fc) ((fc) |= FD_INFO_CAP_IND_MASK) 342*4882a593Smuzhiyun #define FD_INFO_SET_SHORT_SSID_PRESENT(fc) ((fc) |= FD_INFO_SHORT_SSID_IND_MASK) 343*4882a593Smuzhiyun #define FD_INFO_SET_APCSN_PRESENT(fc) ((fc) |= FD_INFO_APCSN_IND_MASK) 344*4882a593Smuzhiyun #define FD_INFO_SET_ANO_PRESENT(fc) ((fc) |= FD_INFO_ANO_IND_MASK) 345*4882a593Smuzhiyun #define FD_INFO_SET_CH_CENTER_FR_PRESENT(fc) ((fc) |= FD_INFO_CH_CENTER_FR_IND_MASK) 346*4882a593Smuzhiyun #define FD_INFO_SET_PRIMARY_CH_PRESENT(fc) ((fc) |= FD_INFO_PRIMARY_CH_IND_MASK) 347*4882a593Smuzhiyun #define FD_INFO_SET_RSN_PRESENT(fc) ((fc) |= FD_INFO_RSN_IND_MASK) 348*4882a593Smuzhiyun #define FD_INFO_SET_LENGTH_PRESENT(fc) ((fc) |= FD_INFO_LENGTH_IND_MASK) 349*4882a593Smuzhiyun #define FD_INFO_SET_MD_PRESENT(fc) ((fc) |= FD_INFO_MD_IND_MASK) 350*4882a593Smuzhiyun 351*4882a593Smuzhiyun #define FD_INFO_SSID_LENGTH(fc) ((fc) & FD_INFO_SSID_LENGTH_MASK) 352*4882a593Smuzhiyun #define FD_INFO_IS_CAP_PRESENT(fc) (((fc) & FD_INFO_CAP_IND_MASK) != 0) 353*4882a593Smuzhiyun #define FD_INFO_IS_SHORT_SSID_PRESENT(fc) (((fc) & FD_INFO_SHORT_SSID_IND_MASK) != 0) 354*4882a593Smuzhiyun #define FD_INFO_IS_APCSN_PRESENT(fc) (((fc) & FD_INFO_APCSN_IND_MASK) != 0) 355*4882a593Smuzhiyun #define FD_INFO_IS_ANO_PRESENT(fc) (((fc) & FD_INFO_ANO_IND_MASK) != 0) 356*4882a593Smuzhiyun #define FD_INFO_IS_CH_CENTER_FR_PRESENT(fc) (((fc) & FD_INFO_CH_CENTER_FR_IND_MASK) != 0) 357*4882a593Smuzhiyun #define FD_INFO_IS_PRIMARY_CH_PRESENT(fc) (((fc) & FD_INFO_PRIMARY_CH_IND_MASK) != 0) 358*4882a593Smuzhiyun #define FD_INFO_IS_RSN_PRESENT(fc) (((fc) & FD_INFO_RSN_IND_MASK) != 0) 359*4882a593Smuzhiyun #define FD_INFO_IS_LENGTH_PRESENT(fc) (((fc) & FD_INFO_LENGTH_IND_MASK) != 0) 360*4882a593Smuzhiyun #define FD_INFO_IS_MD_PRESENT(fc) (((fc) & FD_INFO_MD_IND_MASK) != 0) 361*4882a593Smuzhiyun 362*4882a593Smuzhiyun /* FILS Discovery Capability subfield */ 363*4882a593Smuzhiyun #define FD_CAP_ESS_MASK (0x0001) 364*4882a593Smuzhiyun #define FD_CAP_PRIVACY_MASK (0x0002) 365*4882a593Smuzhiyun #define FD_CAP_BSS_CH_WIDTH_MASK (0x001c) 366*4882a593Smuzhiyun #define FD_CAP_MAX_NSS_MASK (0x00e0) 367*4882a593Smuzhiyun #define FD_CAP_MULTI_BSS_MASK (0x0200) 368*4882a593Smuzhiyun #define FD_CAP_PHY_INDEX_MASK (0x1c00) 369*4882a593Smuzhiyun #define FD_CAP_FILS_MIN_RATE_MASK (0xe000) 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun #define FD_CAP_ESS(cap) (((cap) & FD_CAP_ESS_MASK) != 0) 372*4882a593Smuzhiyun #define FD_CAP_PRIVACY(cap) (((cap) & FD_CAP_PRIVACY_MASK) != 0) 373*4882a593Smuzhiyun #define FD_CAP_BSS_CH_WIDTH(cap) (((cap) & FD_CAP_BSS_CH_WIDTH_MASK) >> 2) 374*4882a593Smuzhiyun #define FD_CAP_MAX_NSS(cap) (((cap) & FD_CAP_MAX_NSS_MASK) >> 5) 375*4882a593Smuzhiyun #define FD_CAP_MULTI_BSS(cap) (((cap) & FD_CAP_MULTI_BSS_MASK) != 0) 376*4882a593Smuzhiyun #define FD_CAP_PHY_INDEX(cap) (((cap) & FD_CAP_PHY_INDEX_MASK) >> 10) 377*4882a593Smuzhiyun #define FD_CAP_FILS_MIN_RATE(cap) (((cap) & FD_CAP_FILS_MIN_RATE_MASK) >> 13) 378*4882a593Smuzhiyun 379*4882a593Smuzhiyun #define FD_CAP_SET_ESS(cap) (((cap) |= FD_CAP_ESS_MASK)) 380*4882a593Smuzhiyun #define FD_CAP_SET_PRIVACY(cap) (((cap) & FD_CAP_PRIVACY_MASK) >> 1) 381*4882a593Smuzhiyun #define FD_CAP_SET_BSS_CH_WIDTH(cap, w) ((cap) |= (((w) << 2) & FD_CAP_BSS_CH_WIDTH_MASK)) 382*4882a593Smuzhiyun #define FD_CAP_SET_MAX_NSS(cap) (((cap) & FD_CAP_MAX_NSS_MASK) >> 5) 383*4882a593Smuzhiyun #define FD_CAP_SET_MULTI_BSS(cap) (((cap) & FD_CAP_MULTI_BSS_MASK) >> 9) 384*4882a593Smuzhiyun #define FD_CAP_SET_PHY_INDEX(cap) (((cap) & FD_CAP_PHY_INDEX_MASK) >> 10) 385*4882a593Smuzhiyun #define FD_CAP_SET_FILS_MIN_RATE(cap) (((cap) & FD_CAP_FILS_MIN_RATE_MASK) >> 13) 386*4882a593Smuzhiyun 387*4882a593Smuzhiyun /* 11ai D6.0 8.4.2.173 FILS Request Parameters element */ 388*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_request_parameters_element { 389*4882a593Smuzhiyun uint8 elementid; 390*4882a593Smuzhiyun uint8 length; 391*4882a593Smuzhiyun uint8 element_id_ext; 392*4882a593Smuzhiyun uint8 params_bitmap; 393*4882a593Smuzhiyun /* variable len info */ 394*4882a593Smuzhiyun uint8 params_fields[]; 395*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_request_parameters_element_t; 396*4882a593Smuzhiyun 397*4882a593Smuzhiyun #define FILS_PARAM_MAX_CHANNEL_TIME (1 << 2) 398*4882a593Smuzhiyun 399*4882a593Smuzhiyun /* 11ai 9.4.2.184 FILS HLP Container element */ 400*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_hlp_container_element { 401*4882a593Smuzhiyun uint8 elementid; 402*4882a593Smuzhiyun uint8 length; 403*4882a593Smuzhiyun uint8 element_id_ext; 404*4882a593Smuzhiyun uint8 dest_addr[ETHER_ADDR_LEN]; 405*4882a593Smuzhiyun uint8 src_addr[ETHER_ADDR_LEN]; 406*4882a593Smuzhiyun /* variable len hlp packet */ 407*4882a593Smuzhiyun uint8 hlp[]; 408*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_hlp_container_element_t; 409*4882a593Smuzhiyun 410*4882a593Smuzhiyun /* 11ai 9.4.2.184 FILS Wrapped Data element */ 411*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_wrapped_data_element { 412*4882a593Smuzhiyun uint8 elementid; 413*4882a593Smuzhiyun uint8 length; 414*4882a593Smuzhiyun uint8 element_id_ext; 415*4882a593Smuzhiyun /* variable len wrapped data packet */ 416*4882a593Smuzhiyun uint8 wrapped_data[]; 417*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_wrapped_data_element_t; 418*4882a593Smuzhiyun 419*4882a593Smuzhiyun #define FILS_HLP_CONTAINER_ELEM_LEN (sizeof(fils_hlp_container_element_t)) 420*4882a593Smuzhiyun 421*4882a593Smuzhiyun /* This marks the end of a packed structure section. */ 422*4882a593Smuzhiyun #include <packed_section_end.h> 423*4882a593Smuzhiyun 424*4882a593Smuzhiyun #endif /* __FILSAUTH_H__ */ 425