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