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