1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Fundamental types and constants relating to FILS AUTHENTICATION 3*4882a593Smuzhiyun * Portions of this code are copyright (c) 2021 Cypress Semiconductor Corporation 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 1999-2017, Broadcom Corporation 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 * Notwithstanding the above, under no circumstances may you combine this 22*4882a593Smuzhiyun * software in any way with any other Broadcom software provided under a license 23*4882a593Smuzhiyun * other than the GPL, without Broadcom's express prior written consent. 24*4882a593Smuzhiyun * 25*4882a593Smuzhiyun * 26*4882a593Smuzhiyun * <<Broadcom-WL-IPTag/Open:>> 27*4882a593Smuzhiyun * 28*4882a593Smuzhiyun * $Id$ 29*4882a593Smuzhiyun */ 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun #ifndef _FILSAUTH_H_ 32*4882a593Smuzhiyun #define _FILSAUTH_H_ 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun /* This marks the start of a packed structure section. */ 35*4882a593Smuzhiyun #include <packed_section_start.h> 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun /* 11ai D6.0 8.6.8.36 FILS Discovery frame format 38*4882a593Smuzhiyun category 39*4882a593Smuzhiyun action 40*4882a593Smuzhiyun fils_discovery_info_field_t 41*4882a593Smuzhiyun fils_rnr_element_t 42*4882a593Smuzhiyun fils_indication_element_t 43*4882a593Smuzhiyun fils_vendor_specific_element_t 44*4882a593Smuzhiyun */ 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun /* 11revmc D4.0 8.4.2.25 Vendor Specific element */ 47*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_vendor_specific_element { 48*4882a593Smuzhiyun uint8 elementid; 49*4882a593Smuzhiyun uint8 length; 50*4882a593Smuzhiyun /* variable len info */ 51*4882a593Smuzhiyun uint8 orgid_vendorspecific_content[]; 52*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_vendor_specific_element_t; 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun #define FILS_VS_ELEM_HDR_LEN (sizeof(fils_vendor_specific_element_t)) 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun /* 11ai D6.0 8.4.2.178 FILS Indication element */ 57*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_indication_element { 58*4882a593Smuzhiyun uint8 elementid; 59*4882a593Smuzhiyun uint8 length; 60*4882a593Smuzhiyun uint16 fils_info; 61*4882a593Smuzhiyun /* variable len info */ 62*4882a593Smuzhiyun uint8 cache_domain_publickey_id[]; 63*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_indication_element_t; 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun #define FILS_INDICATION_ELEM_HDR_LEN (sizeof(fils_indication_element_t)) 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun #define FILS_INDICATION_IE_TAG_FIXED_LEN 2 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun #define FI_INFO_CACHE_IND_SUBFIELD_SIZE 2 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun /* FILS Indication Information field */ 72*4882a593Smuzhiyun #define FI_INFO_PUB_KEY_IDENTS_MASK (0x0007) 73*4882a593Smuzhiyun #define FI_INFO_REALM_IDENTS_MASK (0x0038) 74*4882a593Smuzhiyun #define FI_INFO_IP_ADDR_CFG_MASK (0x0040) 75*4882a593Smuzhiyun #define FI_INFO_CACHE_IDENT_MASK (0x0080) 76*4882a593Smuzhiyun #define FI_INFO_HESSID_MASK (0x0100) 77*4882a593Smuzhiyun #define FI_INFO_SHRKEY_AUTH_WOPFS_MASK (0x0200) 78*4882a593Smuzhiyun #define FI_INFO_SHRKEY_AUTH_WPFS_MASK (0x0400) 79*4882a593Smuzhiyun #define FI_INFO_PUBKEY_AUTH_MASK (0x0800) 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun #define FI_INFO_CACHE_IDENT(fc) ((fc & FI_INFO_CACHE_IDENT_MASK)) 82*4882a593Smuzhiyun #define FI_INFO_HESSID(fc) ((fc & FI_INFO_HESSID_MASK)) 83*4882a593Smuzhiyun #define FI_INFO_SHRKEY_AUTH_WOPFS(fc) ((fc & FI_INFO_SHRKEY_AUTH_WOPFS_MASK)) 84*4882a593Smuzhiyun #define FI_INFO_SHRKEY_AUTH_WPFS(fc) ((fc & FI_INFO_SHRKEY_AUTH_WPFS_MASK)) 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun /* 11ai D11.0 9.4.2.171.1 TBTT Information field */ 87*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct tbtt_info_field { 88*4882a593Smuzhiyun uint8 tbtt_offset; 89*4882a593Smuzhiyun uint8 bssid[ETHER_ADDR_LEN]; 90*4882a593Smuzhiyun uint32 short_ssid; 91*4882a593Smuzhiyun uint8 bss_params; /* BSS paramters subfield */ 92*4882a593Smuzhiyun uint8 mhz_psd; /* 20 MHz PSD subfield */ 93*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT tbtt_info_field_t; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun /* TBTT Information Length subfield value */ 96*4882a593Smuzhiyun typedef enum { 97*4882a593Smuzhiyun TBTTINFO_LEN_1 = 1, /* Neighbor AP TBTT Offset */ 98*4882a593Smuzhiyun TBTTINFO_LEN_2 = 2, /* Neighbor AP TBTT Offset and BSS Parameters */ 99*4882a593Smuzhiyun TBTTINFO_LEN_3 = 3, /* Reserved */ 100*4882a593Smuzhiyun TBTTINFO_LEN_4 = 4, /* Reserved */ 101*4882a593Smuzhiyun TBTTINFO_LEN_5 = 5, /* Neighbor AP TBTT Offset and the Short-SSID */ 102*4882a593Smuzhiyun TBTTINFO_LEN_6 = 6, /* Neighbor AP TBTT Offset, Short-SSID subfield, BSS Parameters */ 103*4882a593Smuzhiyun TBTTINFO_LEN_7 = 7, /* Neighbor AP TBTT Offset, BSSID subfields */ 104*4882a593Smuzhiyun TBTTINFO_LEN_8 = 8, /* Neighbor AP TBTT Offset, BSSID subfield, BSS Parameters */ 105*4882a593Smuzhiyun TBTTINFO_LEN_9 = 9, /* TBTT Offset, BSSID, BSS Parameters, 20 MHz PSD */ 106*4882a593Smuzhiyun TBTTINFO_LEN_10 = 10, /* Reserved */ 107*4882a593Smuzhiyun TBTTINFO_LEN_11 = 11, /* Neighbor AP TBTT Offset, BSSID subfield, short-SSID subfield */ 108*4882a593Smuzhiyun TBTTINFO_LEN_12 = 12, /* TBTT Offset, BSSID subfield, short-SSID subfield, BSS params */ 109*4882a593Smuzhiyun TBTTINFO_LEN_13 = 13, /* TBTT Offset, BSSID, short-SSID subfield, BSS params, 20MHz */ 110*4882a593Smuzhiyun /* 14 - 255 reserved */ 111*4882a593Smuzhiyun } tbttinfo_len_t; 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun /* TBTT Information field contents */ 114*4882a593Smuzhiyun enum { 115*4882a593Smuzhiyun NEIGHBOR_AP_TBTT_SUBFIELD_SHIFT = 0, /* Neighbor AP TBTT Offset */ 116*4882a593Smuzhiyun BSSID_SUBFIELD_SHIFT = 1, /* BSSID (optional) */ 117*4882a593Smuzhiyun SHORT_SSID_SUBFIELD_SHIFT = 2, /* Short-SSID (optional) */ 118*4882a593Smuzhiyun BSS_PARAMETERS_SUBFIELD_SHIFT = 3, /* BSS parameters */ 119*4882a593Smuzhiyun MHZ_SUBFIELD_SHIFT = 4 /* 20 MHz PSD */ 120*4882a593Smuzhiyun }; 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun /* Length in Octets */ 123*4882a593Smuzhiyun #define NEIGHBOR_AP_TBTT_SUBFIELD_LEN 1 124*4882a593Smuzhiyun #define BSSID_SUBFIELD_LEN 6 125*4882a593Smuzhiyun #define SHORT_SSID_SUBFIELD_LEN 4 126*4882a593Smuzhiyun #define BSS_PARAMETERS_SUBFIELD_LEN 1 127*4882a593Smuzhiyun #define MHZ_SUBFIELD_LEN 1 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun #define NEIGHBOR_AP_TBTT_SUBFIELD (1 << NEIGHBOR_AP_TBTT_SUBFIELD_SHIFT) 130*4882a593Smuzhiyun #define BSSID_SUBFIELD (1 << BSSID_SUBFIELD_SHIFT) 131*4882a593Smuzhiyun #define SHORT_SSID_SUBFIELD (1 << SHORT_SSID_SUBFIELD_SHIFT) 132*4882a593Smuzhiyun #define BSS_PARAMETERS_SUBFIELD (1 << BSS_PARAMETERS_SUBFIELD_SHIFT) 133*4882a593Smuzhiyun #define MHZ_SUBFIELD (1 << MHZ_SUBFIELD_SHIFT) 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun /* BSS paramters subfield 802.11ax D8.0 */ 136*4882a593Smuzhiyun #define TBTT_INFO_BSS_PARAMS_OCT_IDX 0 /* OCT Recommended subfield */ 137*4882a593Smuzhiyun #define TBTT_INFO_BSS_PARAMS_OCT_FSZ 1 138*4882a593Smuzhiyun #define TBTT_INFO_BSS_PARAMS_SSSID_IDX 1 /* Same SSID subfield */ 139*4882a593Smuzhiyun #define TBTT_INFO_BSS_PARAMS_SSSID_FSZ 1 140*4882a593Smuzhiyun #define TBTT_INFO_BSS_PARAMS_MBSSID_IDX 2 /* Multiple BSSID subfield */ 141*4882a593Smuzhiyun #define TBTT_INFO_BSS_PARAMS_MBSSID_FSZ 1 142*4882a593Smuzhiyun #define TBTT_INFO_BSS_PARAMS_TBSSID_IDX 3 /* Transmitted BSSID subfield */ 143*4882a593Smuzhiyun #define TBTT_INFO_BSS_PARAMS_TBSSID_FSZ 1 144*4882a593Smuzhiyun #define TBTT_INFO_BSS_PARAMS_ESS_COLOCATED_IDX 4 /* ESS With 2.4/5 GHz Co-Located AP */ 145*4882a593Smuzhiyun #define TBTT_INFO_BSS_PARAMS_ESS_COLOCATED_FSZ 1 146*4882a593Smuzhiyun #define TBTT_INFO_BSS_PARAMS_UNSOLPB_IDX 5 /* Unsolicited Probe Responses Active */ 147*4882a593Smuzhiyun #define TBTT_INFO_BSS_PARAMS_UNSOLPB_FSZ 1 148*4882a593Smuzhiyun #define TBTT_INFO_BSS_PARAMS_COLOC_AP_IDX 6 /* Co-Located AP subfield */ 149*4882a593Smuzhiyun #define TBTT_INFO_BSS_PARAMS_COLOC_AP_FSZ 1 150*4882a593Smuzhiyun /* Bit 7 is reserved */ 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun #define TBTT_INFO_FIELD_HDR_LEN (sizeof(tbtt_info_field_t)) 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun /* 11ai D11.0 9.4.2.171.1 Neighbor AP Information field */ 155*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct neighbor_ap_info_field { 156*4882a593Smuzhiyun uint16 tbtt_info_header; 157*4882a593Smuzhiyun uint8 op_class; 158*4882a593Smuzhiyun uint8 channel; 159*4882a593Smuzhiyun /* variable len info */ 160*4882a593Smuzhiyun uint8 tbtt_info_field[]; 161*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT neighbor_ap_info_field_t; 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun #define NEIGHBOR_AP_INFO_FIELD_HDR_LEN (sizeof(neighbor_ap_info_field_t)) 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun /* 11ai D11.0 9.4.2.171 Reduced Neighbor Report element */ 166*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_rnr_element { 167*4882a593Smuzhiyun uint8 elementid; 168*4882a593Smuzhiyun uint8 length; 169*4882a593Smuzhiyun /* variable len info */ 170*4882a593Smuzhiyun uint8 neighbor_ap_info[]; 171*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_rnr_element_t; 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun #define FILS_RNR_ELEM_HDR_LEN (sizeof(fils_rnr_element_t)) 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun /* TBTT Info Header macros */ 176*4882a593Smuzhiyun #define TBTT_INFO_HDR_FIELD_TYPE_MASK (0x001f) 177*4882a593Smuzhiyun #define TBTT_INFO_HDR_FN_AP_MASK (0x0004) 178*4882a593Smuzhiyun #define TBTT_INFO_HDR_COUNT_MASK (0x00f0) 179*4882a593Smuzhiyun #define TBTT_INFO_HDR_LENGTH_MASK (0xff00) 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun #define TBTT_INFO_HDR_FIELD_TYPE(hdr)\ 182*4882a593Smuzhiyun ((hdr) & TBTT_INFO_HDR_FIELD_TYPE_MASK) 183*4882a593Smuzhiyun #define TBTT_INFO_HDR_FN_AP(hdr)\ 184*4882a593Smuzhiyun (((hdr) & TBTT_INFO_HDR_FN_AP_MASK) >> 2) 185*4882a593Smuzhiyun #define TBTT_INFO_HDR_COUNT(hdr)\ 186*4882a593Smuzhiyun (((hdr) & TBTT_INFO_HDR_COUNT_MASK) >> 4) 187*4882a593Smuzhiyun #define TBTT_INFO_HDR_LENGTH(hdr)\ 188*4882a593Smuzhiyun (((hdr) & TBTT_INFO_HDR_LENGTH_MASK) >> 8) 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun /* FILS Nonce element */ 191*4882a593Smuzhiyun #define FILS_NONCE_LENGTH 16u 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_nonce_element { 194*4882a593Smuzhiyun uint8 elementid; 195*4882a593Smuzhiyun uint8 length; 196*4882a593Smuzhiyun uint8 element_id_ext; 197*4882a593Smuzhiyun uint8 fils_nonce[FILS_NONCE_LENGTH]; 198*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_nonce_element_t; 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun /* 11ai 9.4.2.186 FILS Key Delivery element */ 201*4882a593Smuzhiyun #define FILS_KEY_RSC_LENGTH 8u 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_key_delivery_element { 204*4882a593Smuzhiyun uint8 elementid; 205*4882a593Smuzhiyun uint8 length; 206*4882a593Smuzhiyun uint8 element_id_ext; 207*4882a593Smuzhiyun uint8 key_rsc[FILS_KEY_RSC_LENGTH]; 208*4882a593Smuzhiyun uint8 kde_list[]; /* Key Data Elements */ 209*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_key_delivery_element_t; 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun /* 8.4.2.175 FILS Session element */ 212*4882a593Smuzhiyun #define FILS_SESSION_LENGTH 8u 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_session_element { 215*4882a593Smuzhiyun uint8 elementid; 216*4882a593Smuzhiyun uint8 length; 217*4882a593Smuzhiyun uint8 element_id_ext; 218*4882a593Smuzhiyun uint8 fils_session[FILS_SESSION_LENGTH]; 219*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_session_element_t; 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun /* 9.4.2.179 FILS key confirmation element */ 222*4882a593Smuzhiyun #define FILS_KEY_CONFIRMATION_HEADER_LEN 3u 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_key_conf_element { 225*4882a593Smuzhiyun uint8 elementid; 226*4882a593Smuzhiyun uint8 length; 227*4882a593Smuzhiyun uint8 element_id_ext; 228*4882a593Smuzhiyun /* variable len info */ 229*4882a593Smuzhiyun uint8 key_auth[]; 230*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_key_conf_element_t; 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun #define FILS_SESSION_ELEM_LEN (sizeof(fils_session_element_t)) 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun /* 8.4.2.174 FILS Key Confirmation element */ 235*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_key_confirm_element { 236*4882a593Smuzhiyun uint8 elementid; 237*4882a593Smuzhiyun uint8 length; 238*4882a593Smuzhiyun uint8 element_id_ext; 239*4882a593Smuzhiyun /* variable len info */ 240*4882a593Smuzhiyun uint8 keyauth[]; 241*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_key_confirm_element_t; 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun #define FILS_CONFIRM_ELEM_HDR_LEN (sizeof(fils_key_confirm_element_t)) 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun /* 11ai D6.0 8.6.8.36 FILS Discovery frame format */ 246*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_discovery_info_field { 247*4882a593Smuzhiyun uint16 framecontrol; 248*4882a593Smuzhiyun uint32 timestamp[2]; 249*4882a593Smuzhiyun uint16 bcninterval; 250*4882a593Smuzhiyun /* variable len info */ 251*4882a593Smuzhiyun uint8 disc_info[]; 252*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_discovery_info_field_t; 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun #define FD_INFO_FIELD_HDR_LEN (sizeof(fils_discovery_info_field_t)) 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun #define FD_INFO_CAP_SUBFIELD_SIZE 2 257*4882a593Smuzhiyun #define FD_INFO_LENGTH_FIELD_SIZE 2 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun /* FILS Discovery Information field */ 260*4882a593Smuzhiyun #define FD_INFO_SSID_LENGTH_MASK (0x001f) 261*4882a593Smuzhiyun #define FD_INFO_CAP_IND_MASK (0x0020) 262*4882a593Smuzhiyun #define FD_INFO_SHORT_SSID_IND_MASK (0x0040) 263*4882a593Smuzhiyun #define FD_INFO_APCSN_IND_MASK (0x0080) 264*4882a593Smuzhiyun #define FD_INFO_ANO_IND_MASK (0x0100) 265*4882a593Smuzhiyun #define FD_INFO_CH_CENTER_FR_IND_MASK (0x0200) 266*4882a593Smuzhiyun #define FD_INFO_PRIMARY_CH_IND_MASK (0x0400) 267*4882a593Smuzhiyun #define FD_INFO_RSN_IND_MASK (0x0800) 268*4882a593Smuzhiyun #define FD_INFO_LENGTH_IND_MASK (0x1000) 269*4882a593Smuzhiyun #define FD_INFO_MD_IND_MASK (0x2000) 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun #define FD_INFO_SET_SSID_LENGTH(fc, len) (fc |= ((uint16)(len) & FD_INFO_SSID_LENGTH_MASK)) 272*4882a593Smuzhiyun #define FD_INFO_SET_CAP_PRESENT(fc) (fc |= FD_INFO_CAP_IND_MASK) 273*4882a593Smuzhiyun #define FD_INFO_SET_SHORT_SSID_PRESENT(fc) (fc |= FD_INFO_SHORT_SSID_IND_MASK) 274*4882a593Smuzhiyun #define FD_INFO_SET_APCSN_PRESENT(fc) ((fc |= FD_INFO_APCSN_IND_MASK) 275*4882a593Smuzhiyun #define FD_INFO_SET_ANO_PRESENT(fc) (fc |= FD_INFO_ANO_IND_MASK) 276*4882a593Smuzhiyun #define FD_INFO_SET_CH_CENTER_FR_PRESENT(fc) (fc |= FD_INFO_CH_CENTER_FR_IND_MASK) 277*4882a593Smuzhiyun #define FD_INFO_SET_PRIMARY_CH_PRESENT(fc) (fc |= FD_INFO_PRIMARY_CH_IND_MASK) 278*4882a593Smuzhiyun #define FD_INFO_SET_RSN_PRESENT(fc) (fc |= FD_INFO_RSN_IND_MASK) 279*4882a593Smuzhiyun #define FD_INFO_SET_LENGTH_PRESENT(fc) (fc |= FD_INFO_LENGTH_IND_MASK) 280*4882a593Smuzhiyun #define FD_INFO_SET_MD_PRESENT(fc) (fc |= FD_INFO_MD_IND_MASK) 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun #define FD_INFO_SSID_LENGTH(fc) ((fc & FD_INFO_SSID_LENGTH_MASK)) 283*4882a593Smuzhiyun #define FD_INFO_IS_CAP_PRESENT(fc) ((fc & FD_INFO_CAP_IND_MASK) >> 5) 284*4882a593Smuzhiyun #define FD_INFO_IS_SHORT_SSID_PRESENT(fc) ((fc & FD_INFO_SHORT_SSID_IND_MASK) >> 6) 285*4882a593Smuzhiyun #define FD_INFO_IS_APCSN_PRESENT(fc) ((fc & FD_INFO_APCSN_IND_MASK) >> 7) 286*4882a593Smuzhiyun #define FD_INFO_IS_ANO_PRESENT(fc) ((fc & FD_INFO_ANO_IND_MASK) >> 8) 287*4882a593Smuzhiyun #define FD_INFO_IS_CH_CENTER_FR_PRESENT(fc) ((fc & FD_INFO_CH_CENTER_FR_IND_MASK) >> 9) 288*4882a593Smuzhiyun #define FD_INFO_IS_PRIMARY_CH_PRESENT(fc) ((fc & FD_INFO_PRIMARY_CH_IND_MASK) >> 10) 289*4882a593Smuzhiyun #define FD_INFO_IS_RSN_PRESENT(fc) ((fc & FD_INFO_RSN_IND_MASK) >> 11) 290*4882a593Smuzhiyun #define FD_INFO_IS_LENGTH_PRESENT(fc) ((fc & FD_INFO_LENGTH_IND_MASK) >> 12) 291*4882a593Smuzhiyun #define FD_INFO_IS_MD_PRESENT(fc) ((fc & FD_INFO_MD_IND_MASK) >> 13) 292*4882a593Smuzhiyun 293*4882a593Smuzhiyun /* FILS Discovery Capability subfield */ 294*4882a593Smuzhiyun #define FD_CAP_ESS_MASK (0x0001) 295*4882a593Smuzhiyun #define FD_CAP_PRIVACY_MASK (0x0002) 296*4882a593Smuzhiyun #define FD_CAP_BSS_CH_WIDTH_MASK (0x001c) 297*4882a593Smuzhiyun #define FD_CAP_MAX_NSS_MASK (0x00e0) 298*4882a593Smuzhiyun #define FD_CAP_MULTI_BSS_MASK (0x0200) 299*4882a593Smuzhiyun #define FD_CAP_PHY_INDEX_MASK (0x1c00) 300*4882a593Smuzhiyun #define FD_CAP_FILS_MIN_RATE_MASK (0xe000) 301*4882a593Smuzhiyun 302*4882a593Smuzhiyun #define FD_CAP_ESS(cap) ((cap & FD_CAP_ESS_MASK)) 303*4882a593Smuzhiyun #define FD_CAP_PRIVACY(cap) ((cap & FD_CAP_PRIVACY_MASK) >> 1) 304*4882a593Smuzhiyun #define FD_CAP_BSS_CH_WIDTH(cap) ((cap & FD_CAP_BSS_CH_WIDTH_MASK) >> 2) 305*4882a593Smuzhiyun #define FD_CAP_MAX_NSS(cap) ((cap & FD_CAP_MAX_NSS_MASK) >> 5) 306*4882a593Smuzhiyun #define FD_CAP_MULTI_BSS(cap) ((cap & FD_CAP_MULTI_BSS_MASK) >> 9) 307*4882a593Smuzhiyun #define FD_CAP_PHY_INDEX(cap) ((cap & FD_CAP_PHY_INDEX_MASK) >> 10) 308*4882a593Smuzhiyun #define FD_CAP_FILS_MIN_RATE(cap) ((cap & FD_CAP_FILS_MIN_RATE_MASK) >> 13) 309*4882a593Smuzhiyun 310*4882a593Smuzhiyun #define FD_CAP_SET_ESS(cap) ((cap |= FD_CAP_ESS_MASK)) 311*4882a593Smuzhiyun #define FD_CAP_SET_PRIVACY(cap) ((cap & FD_CAP_PRIVACY_MASK) >> 1) 312*4882a593Smuzhiyun #define FD_CAP_SET_BSS_CH_WIDTH(cap) ((cap & FD_CAP_BSS_CH_WIDTH_MASK) >> 2) 313*4882a593Smuzhiyun #define FD_CAP_SET_MAX_NSS(cap) ((cap & FD_CAP_MAX_NSS_MASK) >> 5) 314*4882a593Smuzhiyun #define FD_CAP_SET_MULTI_BSS(cap) ((cap & FD_CAP_MULTI_BSS_MASK) >> 9) 315*4882a593Smuzhiyun #define FD_CAP_SET_PHY_INDEX(cap) ((cap & FD_CAP_PHY_INDEX_MASK) >> 10) 316*4882a593Smuzhiyun #define FD_CAP_SET_FILS_MIN_RATE(cap) ((cap & FD_CAP_FILS_MIN_RATE_MASK) >> 13) 317*4882a593Smuzhiyun 318*4882a593Smuzhiyun /* 11ai D6.0 8.4.2.173 FILS Request Parameters element */ 319*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_request_parameters_element { 320*4882a593Smuzhiyun uint8 elementid; 321*4882a593Smuzhiyun uint8 length; 322*4882a593Smuzhiyun uint8 element_id_ext; 323*4882a593Smuzhiyun uint8 params_bitmap; 324*4882a593Smuzhiyun /* variable len info */ 325*4882a593Smuzhiyun uint8 params_fields[]; 326*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_request_parameters_element_t; 327*4882a593Smuzhiyun 328*4882a593Smuzhiyun #define FILS_PARAM_MAX_CHANNEL_TIME (1 << 2) 329*4882a593Smuzhiyun 330*4882a593Smuzhiyun /* 11ai 9.4.2.184 FILS HLP Container element */ 331*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_hlp_container_element { 332*4882a593Smuzhiyun uint8 elementid; 333*4882a593Smuzhiyun uint8 length; 334*4882a593Smuzhiyun uint8 element_id_ext; 335*4882a593Smuzhiyun uint8 dest_addr[ETHER_ADDR_LEN]; 336*4882a593Smuzhiyun uint8 src_addr[ETHER_ADDR_LEN]; 337*4882a593Smuzhiyun /* variable len hlp packet */ 338*4882a593Smuzhiyun uint8 hlp[]; 339*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_hlp_container_element_t; 340*4882a593Smuzhiyun 341*4882a593Smuzhiyun /* 11ai 9.4.2.184 FILS Wrapped Data element */ 342*4882a593Smuzhiyun typedef BWL_PRE_PACKED_STRUCT struct fils_wrapped_data_element { 343*4882a593Smuzhiyun uint8 elementid; 344*4882a593Smuzhiyun uint8 length; 345*4882a593Smuzhiyun uint8 element_id_ext; 346*4882a593Smuzhiyun /* variable len wrapped data packet */ 347*4882a593Smuzhiyun uint8 wrapped_data[]; 348*4882a593Smuzhiyun } BWL_POST_PACKED_STRUCT fils_wrapped_data_element_t; 349*4882a593Smuzhiyun 350*4882a593Smuzhiyun #define FILS_HLP_CONTAINER_ELEM_LEN (sizeof(fils_hlp_container_element_t)) 351*4882a593Smuzhiyun 352*4882a593Smuzhiyun /* This marks the end of a packed structure section. */ 353*4882a593Smuzhiyun #include <packed_section_end.h> 354*4882a593Smuzhiyun 355*4882a593Smuzhiyun #endif /* __FILSAUTH_H__ */ 356