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