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