xref: /wlan-dirver/qca-wifi-host-cmn/umac/cmn_services/crypto/src/wlan_crypto_def_i.h (revision dae10a5fbc53d54c53c4ba24fa018ad8b1e7c008)
1 /*
2  * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19  /**
20  * DOC: Private definations for handling crypto params
21  */
22 #ifndef _WLAN_CRYPTO_DEF_I_H_
23 #define _WLAN_CRYPTO_DEF_I_H_
24 
25 #include "wlan_crypto_aes_i.h"
26 
27 /* IEEE 802.11 defines */
28 #define WLAN_FC0_PVER      0x0003
29 #define WLAN_FC1_DIR_MASK  0x03
30 #define WLAN_FC1_TODS      0x01
31 #define WLAN_FC1_FROMDS    0x02
32 #define WLAN_FC1_DSTODS    0x03
33 #define WLAN_FC1_MOREFRAG  0x04
34 #define WLAN_FC1_RETRY     0x08
35 #define WLAN_FC1_PWRMGT    0x10
36 #define WLAN_FC1_MOREDATA  0x20
37 #define WLAN_FC1_ISWEP     0x40
38 #define WLAN_FC1_ORDER     0x80
39 
40 #define WLAN_FC0_GET_TYPE(fc)    (((fc) & 0x0c) >> 2)
41 #define WLAN_FC0_GET_STYPE(fc)   (((fc) & 0xf0) >> 4)
42 
43 #define WLAN_INVALID_MGMT_SEQ   0xffff
44 #define WLAN_SEQ_MASK           0x0fff
45 #define WLAN_QOS_TID_MASK       0x0f
46 #define WLAN_GET_SEQ_FRAG(seq) ((seq) & (BIT(3) | BIT(2) | BIT(1) | BIT(0)))
47 #define WLAN_GET_SEQ_SEQ(seq) \
48 	(((seq) & (~(BIT(3) | BIT(2) | BIT(1) | BIT(0)))) >> 4)
49 
50 #define WLAN_FC0_TYPE_MGMT        0
51 #define WLAN_FC0_TYPE_CTRL        1
52 #define WLAN_FC0_TYPE_DATA        2
53 
54 /* management */
55 #define WLAN_FC0_STYPE_ASSOC_REQ      0
56 #define WLAN_FC0_STYPE_ASSOC_RESP     1
57 #define WLAN_FC0_STYPE_REASSOC_REQ    2
58 #define WLAN_FC0_STYPE_REASSOC_RESP   3
59 #define WLAN_FC0_STYPE_PROBE_REQ      4
60 #define WLAN_FC0_STYPE_PROBE_RESP     5
61 #define WLAN_FC0_STYPE_BEACON         8
62 #define WLAN_FC0_STYPE_ATIM           9
63 #define WLAN_FC0_STYPE_DISASSOC      10
64 #define WLAN_FC0_STYPE_AUTH          11
65 #define WLAN_FC0_STYPE_DEAUTH        12
66 #define WLAN_FC0_STYPE_ACTION        13
67 
68 /* control */
69 #define WLAN_FC0_STYPE_PSPOLL        10
70 #define WLAN_FC0_STYPE_RTS           11
71 #define WLAN_FC0_STYPE_CTS           12
72 #define WLAN_FC0_STYPE_ACK           13
73 #define WLAN_FC0_STYPE_CFEND         14
74 #define WLAN_FC0_STYPE_CFENDACK      15
75 
76 /* data */
77 #define WLAN_FC0_STYPE_DATA                0
78 #define WLAN_FC0_STYPE_DATA_CFACK          1
79 #define WLAN_FC0_STYPE_DATA_CFPOLL         2
80 #define WLAN_FC0_STYPE_DATA_CFACKPOLL      3
81 #define WLAN_FC0_STYPE_NULLFUNC            4
82 #define WLAN_FC0_STYPE_CFACK               5
83 #define WLAN_FC0_STYPE_CFPOLL              6
84 #define WLAN_FC0_STYPE_CFACKPOLL           7
85 #define WLAN_FC0_STYPE_QOS_DATA            8
86 #define WLAN_FC0_STYPE_QOS_DATA_CFACK      9
87 #define WLAN_FC0_STYPE_QOS_DATA_CFPOLL    10
88 #define WLAN_FC0_STYPE_QOS_DATA_CFACKPOLL 11
89 #define WLAN_FC0_STYPE_QOS_NULL           12
90 #define WLAN_FC0_STYPE_QOS_CFPOLL         14
91 #define WLAN_FC0_STYPE_QOS_CFACKPOLL      15
92 
93 #define WLAN_TID_SIZE                    17
94 #define WLAN_NONQOS_SEQ                  16
95 
96 /* Number of bits per byte */
97 #define CRYPTO_NBBY  8
98 
99 /* Macros for handling unaligned memory accesses */
100 
101 static inline uint16_t wlan_crypto_get_be16(const uint8_t *a)
102 {
103 	return (a[0] << 8) | a[1];
104 }
105 
106 static inline void wlan_crypto_put_be16(uint8_t *a, uint16_t val)
107 {
108 	a[0] = val >> 8;
109 	a[1] = val & 0xff;
110 }
111 
112 static inline uint16_t wlan_crypto_get_le16(const uint8_t *a)
113 {
114 	return (a[1] << 8) | a[0];
115 }
116 
117 static inline void wlan_crypto_put_le16(uint8_t *a, uint16_t val)
118 {
119 	a[1] = val >> 8;
120 	a[0] = val & 0xff;
121 }
122 
123 static inline uint32_t wlan_crypto_get_be32(const uint8_t *a)
124 {
125 	return ((u32) a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3];
126 }
127 
128 static inline void wlan_crypto_put_be32(uint8_t *a, uint32_t val)
129 {
130 	a[0] = (val >> 24) & 0xff;
131 	a[1] = (val >> 16) & 0xff;
132 	a[2] = (val >> 8) & 0xff;
133 	a[3] = val & 0xff;
134 }
135 
136 static inline uint32_t wlan_crypto_get_le32(const uint8_t *a)
137 {
138 	return ((u32) a[3] << 24) | (a[2] << 16) | (a[1] << 8) | a[0];
139 }
140 
141 static inline void wlan_crypto_put_le32(uint8_t *a, uint32_t val)
142 {
143 	a[3] = (val >> 24) & 0xff;
144 	a[2] = (val >> 16) & 0xff;
145 	a[1] = (val >> 8) & 0xff;
146 	a[0] = val & 0xff;
147 }
148 
149 static inline void wlan_crypto_put_be64(u8 *a, u64 val)
150 {
151 	a[0] = val >> 56;
152 	a[1] = val >> 48;
153 	a[2] = val >> 40;
154 	a[3] = val >> 32;
155 	a[4] = val >> 24;
156 	a[5] = val >> 16;
157 	a[6] = val >> 8;
158 	a[7] = val & 0xff;
159 }
160 
161 #define WLAN_CRYPTO_TX_OPS_ALLOCKEY(psoc) \
162 		(psoc->soc_cb.tx_ops.crypto_tx_ops.allockey)
163 #define WLAN_CRYPTO_TX_OPS_SETKEY(psoc) \
164 		(psoc->soc_cb.tx_ops.crypto_tx_ops.setkey)
165 #define WLAN_CRYPTO_TX_OPS_DELKEY(psoc) \
166 		(psoc->soc_cb.tx_ops.crypto_tx_ops.delkey)
167 #define WLAN_CRYPTO_TX_OPS_DEFAULTKEY(psoc) \
168 		(psoc->soc_cb.tx_ops.crypto_tx_ops.defaultkey)
169 
170 /* unalligned little endian access */
171 #ifndef LE_READ_2
172 #define LE_READ_2(p) \
173 	((uint16_t)                          \
174 	((((const uint8_t *)(p))[0]) |       \
175 	(((const uint8_t *)(p))[1] <<  8)))
176 #endif
177 
178 #ifndef LE_READ_4
179 #define LE_READ_4(p)                   \
180 	((uint32_t)                          \
181 	((((const uint8_t *)(p))[0]) |       \
182 	(((const uint8_t *)(p))[1] <<  8) |  \
183 	(((const uint8_t *)(p))[2] << 16) |  \
184 	(((const uint8_t *)(p))[3] << 24)))
185 #endif
186 
187 #ifndef BE_READ_4
188 #define BE_READ_4(p)                        \
189 	((uint32_t)                              \
190 	((((const uint8_t *)(p))[0] << 24) |     \
191 	(((const uint8_t *)(p))[1] << 16) |      \
192 	(((const uint8_t *)(p))[2] <<  8) |      \
193 	(((const uint8_t *)(p))[3])))
194 #endif
195 
196 #ifndef READ_6
197 #define READ_6(b0, b1, b2, b3, b4, b5)  ({ \
198 	uint32_t iv32 = (b0 << 0) | (b1 << 8) | (b2 << 16) | (b3 << 24);\
199 	uint16_t iv16 = (b4 << 0) | (b5 << 8);\
200 	(((uint64_t)iv16) << 32) | iv32;\
201 })
202 #endif
203 
204 #define OUI_SIZE   (4)
205 #define WLAN_CRYPTO_ADDSHORT(frm, v)  \
206 	do {frm[0] = (v) & 0xff; frm[1] = (v) >> 8; frm += 2; } while (0)
207 
208 #define	WLAN_CRYPTO_ADDSELECTOR(frm, sel) \
209 	do { \
210 		uint32_t value = sel;\
211 		qdf_mem_copy(frm, (uint8_t *)&value, OUI_SIZE); \
212 	frm += OUI_SIZE; } while (0)
213 
214 #define WLAN_CRYPTO_SELECTOR(a, b, c, d) \
215 	((((uint32_t) (a)) << 24) | \
216 	 (((uint32_t) (b)) << 16) | \
217 	 (((uint32_t) (c)) << 8) | \
218 		(uint32_t) (d))
219 
220 #define WPA_TYPE_OUI                    WLAN_WPA_SEL(WLAN_WPA_OUI_TYPE)
221 
222 #define WLAN_CRYPTO_WAPI_IE_LEN      20
223 #define WLAN_CRYPTO_WAPI_SMS4_CIPHER 0x01
224 
225 #define WPA_AUTH_KEY_MGMT_NONE          WLAN_WPA_SEL(WLAN_ASE_NONE)
226 #define WPA_AUTH_KEY_MGMT_UNSPEC_802_1X WLAN_WPA_SEL(WLAN_ASE_8021X_UNSPEC)
227 #define WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X \
228 					WLAN_WPA_SEL(WLAN_ASE_8021X_PSK)
229 #define WPA_AUTH_KEY_MGMT_CCKM WLAN_WPA_CCKM_AKM
230 
231 #define WPA_CIPHER_SUITE_NONE   WLAN_WPA_SEL(WLAN_CSE_NONE)
232 #define WPA_CIPHER_SUITE_WEP40  WLAN_WPA_SEL(WLAN_CSE_WEP40)
233 #define WPA_CIPHER_SUITE_WEP104 WLAN_WPA_SEL(WLAN_CSE_WEP104)
234 #define WPA_CIPHER_SUITE_TKIP   WLAN_WPA_SEL(WLAN_CSE_TKIP)
235 #define WPA_CIPHER_SUITE_CCMP   WLAN_WPA_SEL(WLAN_CSE_CCMP)
236 
237 #define RSN_AUTH_KEY_MGMT_NONE          WLAN_RSN_SEL(0)
238 #define RSN_AUTH_KEY_MGMT_UNSPEC_802_1X WLAN_RSN_SEL(1)
239 #define RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X\
240 					WLAN_RSN_SEL(2)
241 #define RSN_AUTH_KEY_MGMT_FT_802_1X     WLAN_RSN_SEL(3)
242 #define RSN_AUTH_KEY_MGMT_FT_PSK        WLAN_RSN_SEL(4)
243 #define RSN_AUTH_KEY_MGMT_802_1X_SHA256\
244 					WLAN_RSN_SEL(5)
245 #define RSN_AUTH_KEY_MGMT_PSK_SHA256    WLAN_RSN_SEL(6)
246 #define RSN_AUTH_KEY_MGMT_WPS           WLAN_RSN_SEL(7)
247 #define RSN_AUTH_KEY_MGMT_SAE           WLAN_RSN_SEL(8)
248 #define RSN_AUTH_KEY_MGMT_FT_SAE        WLAN_RSN_SEL(9)
249 #define RSN_AUTH_KEY_MGMT_802_1X_SUITE_B\
250 					WLAN_RSN_SEL(11)
251 #define RSN_AUTH_KEY_MGMT_802_1X_SUITE_B_192\
252 					WLAN_RSN_SEL(12)
253 #define RSN_AUTH_KEY_MGMT_FT_802_1X_SUITE_B_192\
254 					WLAN_RSN_SEL(13)
255 #define RSN_AUTH_KEY_MGMT_FILS_SHA256   WLAN_RSN_SEL(14)
256 #define RSN_AUTH_KEY_MGMT_FILS_SHA384   WLAN_RSN_SEL(15)
257 #define RSN_AUTH_KEY_MGMT_FT_FILS_SHA256\
258 					WLAN_RSN_SEL(16)
259 #define RSN_AUTH_KEY_MGMT_FT_FILS_SHA384\
260 					WLAN_RSN_SEL(17)
261 #define RSN_AUTH_KEY_MGMT_OWE           WLAN_RSN_SEL(18)
262 
263 #define RSN_AUTH_KEY_MGMT_CCKM          (WLAN_RSN_CCKM_AKM)
264 #define RSN_AUTH_KEY_MGMT_OSEN          (0x019a6f50)
265 #define RSN_AUTH_KEY_MGMT_DPP           (WLAN_RSN_DPP_AKM)
266 
267 #define RSN_CIPHER_SUITE_NONE           WLAN_RSN_SEL(WLAN_CSE_NONE)
268 #define RSN_CIPHER_SUITE_WEP40          WLAN_RSN_SEL(WLAN_CSE_WEP40)
269 #define RSN_CIPHER_SUITE_TKIP           WLAN_RSN_SEL(WLAN_CSE_TKIP)
270 #define RSN_CIPHER_SUITE_WEP104         WLAN_RSN_SEL(WLAN_CSE_WEP104)
271 #define RSN_CIPHER_SUITE_CCMP           WLAN_RSN_SEL(WLAN_CSE_CCMP)
272 #define RSN_CIPHER_SUITE_AES_CMAC       WLAN_RSN_SEL(WLAN_CSE_AES_CMAC)
273 #define RSN_CIPHER_SUITE_GCMP           WLAN_RSN_SEL(WLAN_CSE_GCMP_128)
274 #define RSN_CIPHER_SUITE_GCMP_256       WLAN_RSN_SEL(WLAN_CSE_GCMP_256)
275 #define RSN_CIPHER_SUITE_CCMP_256       WLAN_RSN_SEL(WLAN_CSE_CCMP_256)
276 #define RSN_CIPHER_SUITE_BIP_GMAC_128   WLAN_RSN_SEL(WLAN_CSE_BIP_GMAC_128)
277 #define RSN_CIPHER_SUITE_BIP_GMAC_256   WLAN_RSN_SEL(WLAN_CSE_BIP_GMAC_256)
278 #define RSN_CIPHER_SUITE_BIP_CMAC_256   WLAN_RSN_SEL(WLAN_CSE_BIP_CMAC_256)
279 
280 #define RESET_PARAM(__param)         ((__param) = 0)
281 #define SET_PARAM(__param, __val)    ((__param) |= (1 << (__val)))
282 #define HAS_PARAM(__param, __val)    ((__param) &  (1 << (__val)))
283 #define CLEAR_PARAM(__param, __val)  ((__param) &= ((~1) << (__val)))
284 
285 
286 #define RESET_AUTHMODE(_param)       ((_param)->authmodeset = \
287 					(1 << WLAN_CRYPTO_AUTH_OPEN))
288 
289 #define SET_AUTHMODE(_param, _mode)  ((_param)->authmodeset |= (1 << (_mode)))
290 #define HAS_AUTHMODE(_param, _mode)  ((_param)->authmodeset &  (1 << (_mode)))
291 
292 #define AUTH_IS_OPEN(_param)   HAS_AUTHMODE((_param), WLAN_CRYPTO_AUTH_OPEN)
293 #define AUTH_IS_SHARED_KEY(_param)  \
294 				HAS_AUTHMODE((_param), WLAN_CRYPTO_AUTH_SHARED)
295 #define AUTH_IS_8021X(_param)  HAS_AUTHMODE((_param), WLAN_CRYPTO_AUTH_8021X)
296 #define AUTH_IS_WPA(_param)    HAS_AUTHMODE((_param), WLAN_CRYPTO_AUTH_WPA)
297 #define AUTH_IS_RSNA(_param)   HAS_AUTHMODE((_param), WLAN_CRYPTO_AUTH_RSNA)
298 #define AUTH_IS_CCKM(_param)   HAS_AUTHMODE((_param), WLAN_CRYPTO_AUTH_CCKM)
299 #define AUTH_IS_WAI(_param)    HAS_AUTHMODE((_param), WLAN_CRYPTO_AUTH_WAPI)
300 #define AUTH_IS_WPA2(_param)   AUTH_IS_RSNA(_param)
301 
302 #define AUTH_MATCH(_param1, _param2) \
303 		(((_param1)->authmodeset & (_param2)->authmodeset) != 0)
304 
305 
306 #define RESET_UCAST_CIPHERS(_param)   ((_param)->ucastcipherset =\
307 					(1 << WLAN_CRYPTO_CIPHER_NONE))
308 #define SET_UCAST_CIPHER(_param, _c)  ((_param)->ucastcipherset |= (1 << (_c)))
309 #define HAS_UCAST_CIPHER(_param, _c)  ((_param)->ucastcipherset & (1 << (_c)))
310 
311 #define UCIPHER_IS_CLEAR(_param)   \
312 		HAS_UCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_NONE)
313 #define UCIPHER_IS_WEP(_param)     \
314 		HAS_UCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_WEP)
315 #define UCIPHER_IS_TKIP(_param)    \
316 		HAS_UCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_TKIP)
317 #define UCIPHER_IS_CCMP128(_param) \
318 		HAS_UCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_AES_CCM)
319 #define UCIPHER_IS_CCMP256(_param) \
320 		HAS_UCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_AES_CCM_256)
321 #define UCIPHER_IS_GCMP128(_param) \
322 		HAS_UCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_AES_GCM)
323 #define UCIPHER_IS_GCMP256(_param) \
324 		HAS_UCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_AES_GCM_256)
325 #define UCIPHER_IS_SMS4(_param)    \
326 		HAS_UCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_WAPI_SMS4)
327 
328 #define RESET_MCAST_CIPHERS(_param)   ((_param)->mcastcipherset = \
329 					(1 << WLAN_CRYPTO_CIPHER_NONE))
330 #define SET_MCAST_CIPHER(_param, _c)  ((_param)->mcastcipherset |= (1 << (_c)))
331 #define HAS_MCAST_CIPHER(_param, _c)  ((_param)->mcastcipherset & (1 << (_c)))
332 #define HAS_ANY_MCAST_CIPHER(_param)  ((_param)->mcastcipherset)
333 #define CLEAR_MCAST_CIPHER(_param, _c)  \
334 			((_param)->mcastcipherset &= (~(1)<<(_c)))
335 
336 #define MCIPHER_IS_CLEAR(_param)   \
337 		HAS_MCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_NONE)
338 #define MCIPHER_IS_WEP(_param)     \
339 		HAS_MCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_WEP)
340 #define MCIPHER_IS_TKIP(_param)    \
341 		HAS_MCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_TKIP)
342 #define MCIPHER_IS_CCMP128(_param) \
343 		HAS_MCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_AES_CCM)
344 #define MCIPHER_IS_CCMP256(_param) \
345 		HAS_MCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_AES_CCM_256)
346 #define MCIPHER_IS_GCMP128(_param) \
347 		HAS_MCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_AES_GCM)
348 #define MCIPHER_IS_GCMP256(_param) \
349 		HAS_MCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_AES_GCM_256)
350 #define MCIPHER_IS_SMS4(_param)    \
351 		HAS_MCAST_CIPHER((_param), WLAN_CRYPTO_CIPHER_WAPI_SMS4)
352 
353 #define RESET_MGMT_CIPHERS(_param)   ((_param)->mgmtcipherset = \
354 					(1 << WLAN_CRYPTO_CIPHER_NONE))
355 #define SET_MGMT_CIPHER(_param, _c)  ((_param)->mgmtcipherset |= (1 << (_c)))
356 #define HAS_MGMT_CIPHER(_param, _c)  ((_param)->mgmtcipherset & (1 << (_c)))
357 #define IS_MGMT_CIPHER(_c)      ((_c == WLAN_CRYPTO_CIPHER_AES_CMAC) || \
358 				 (_c == WLAN_CRYPTO_CIPHER_AES_CMAC_256) || \
359 				 (_c == WLAN_CRYPTO_CIPHER_AES_GMAC) || \
360 				 (_c == WLAN_CRYPTO_CIPHER_AES_GMAC_256))
361 
362 #define IS_FILS_CIPHER(_c)      ((_c) == WLAN_CRYPTO_CIPHER_FILS_AEAD)
363 
364 #define MGMT_CIPHER_IS_CMAC(_param)    \
365 		HAS_MGMT_CIPHER((_param), WLAN_CRYPTO_CIPHER_AES_CMAC)
366 #define MGMT_CIPHER_IS_CMAC256(_param) \
367 		HAS_MGMT_CIPHER((_param), WLAN_CRYPTO_CIPHER_AES_CMAC_256)
368 #define MGMT_CIPHER_IS_GMAC(_param)    \
369 		HAS_MGMT_CIPHER((_param), WLAN_CRYPTO_CIPHER_AES_GMAC)
370 #define MGMT_CIPHER_IS_GMAC256(_param) \
371 		HAS_MGMT_CIPHER((_param), WLAN_CRYPTO_CIPHER_AES_GMAC_256)
372 
373 #define RESET_KEY_MGMT(_param)   ((_param)->key_mgmt = \
374 					(1 << WLAN_CRYPTO_KEY_MGMT_NONE))
375 #define SET_KEY_MGMT(_param, _c)  ((_param)->key_mgmt |= (1 << (_c)))
376 #define HAS_KEY_MGMT(_param, _c)  ((_param)->key_mgmt & (1 << (_c)))
377 
378 #define UCAST_CIPHER_MATCH(_param1, _param2)    \
379 	(((_param1)->ucastcipherset & (_param2)->ucastcipherset) != 0)
380 
381 #define MCAST_CIPHER_MATCH(_param1, _param2)    \
382 	(((_param1)->mcastcipherset & (_param2)->mcastcipherset) != 0)
383 
384 #define MGMT_CIPHER_MATCH(_param1, _param2)    \
385 	(((_param1)->mgmtcipherset & (_param2)->mgmtcipherset) != 0)
386 
387 #define KEY_MGMTSET_MATCH(_param1, _param2)      \
388 	(((_param1)->key_mgmt & (_param2)->key_mgmt) != 0 ||    \
389 	(!(_param1)->key_mgmt && !(_param2)->key_mgmt))
390 
391 #define RESET_CIPHER_CAP(_param)   ((_param)->cipher_caps = 0)
392 #define SET_CIPHER_CAP(_param, _c)  ((_param)->cipher_caps |= (1 << (_c)))
393 #define HAS_CIPHER_CAP(_param, _c)  ((_param)->cipher_caps & (1 << (_c)))
394 #define HAS_ANY_CIPHER_CAP(_param)  ((_param)->cipher_caps)
395 
396 #define crypto_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_CRYPTO, params)
397 #define crypto_info(params...) QDF_TRACE_INFO(QDF_MODULE_ID_CRYPTO, params)
398 #define crypto_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_CRYPTO, params)
399 
400 /**
401  * struct wlan_crypto_mmie - MMIE IE
402  * @element_id:      element id
403  * @length:          length of the ie
404  * @key_id:          igtk key_id used
405  * @sequence_number: igtk PN number
406  * @mic:             MIC for the frame
407  *
408  * This structure represents Management MIC information element (IEEE 802.11w)
409  */
410 struct wlan_crypto_mmie {
411 	uint8_t  element_id;
412 	uint8_t  length;
413 	uint16_t key_id;
414 	uint8_t  sequence_number[6];
415 	uint8_t  mic[16];
416 } __packed;
417 
418 /**
419  * struct wlan_crypto_comp_priv - crypto component private structure
420  * @crypto_params:    crypto params for the peer
421  * @key:              key buffers for this peer
422  * @igtk_key:         igtk key buffer for this peer
423  * @igtk_key_type:    igtk key type
424  * @def_tx_keyid:     default key used for this peer
425  * @def_igtk_tx_keyid default igtk key used for this peer
426  * @fils_aead_set     fils params for this peer
427  *
428  */
429 struct wlan_crypto_comp_priv {
430 	struct wlan_crypto_params crypto_params;
431 	struct wlan_crypto_key *key[WLAN_CRYPTO_MAXKEYIDX];
432 	struct wlan_crypto_key *igtk_key[WLAN_CRYPTO_MAXIGTKKEYIDX];
433 	uint32_t igtk_key_type;
434 	uint8_t def_tx_keyid;
435 	uint8_t def_igtk_tx_keyid;
436 	uint8_t fils_aead_set;
437 };
438 
439 /**
440  * struct wlan_crypto_cipher - crypto cipher table
441  * @cipher_name: printable name
442  * @cipher:      cipher type WLAN_CRYPTO_CIPHER_*
443  * @header:      size of privacy header (bytes)
444  * @trailer:     size of privacy trailer (bytes)
445  * @miclen:      size of mic trailer (bytes)
446  * @keylen:      max key length
447  * @setkey:      function pointer for setkey
448  * @encap:       function pointer for encap
449  * @decap:       function pointer for decap
450  * @enmic:       function pointer for enmic
451  * @demic:       function pointer for demic
452  *
453  */
454 struct wlan_crypto_cipher {
455 	const char *cipher_name;
456 	wlan_crypto_cipher_type cipher;
457 	const uint8_t   header;
458 	const uint8_t   trailer;
459 	const uint8_t   miclen;
460 	const uint32_t  keylen;
461 	QDF_STATUS(*setkey)(struct wlan_crypto_key *);
462 	QDF_STATUS(*encap)(struct wlan_crypto_key *,
463 				qdf_nbuf_t, uint8_t,  uint8_t);
464 	QDF_STATUS(*decap)(struct wlan_crypto_key *,
465 				qdf_nbuf_t, uint8_t,  uint8_t);
466 	QDF_STATUS(*enmic)(struct wlan_crypto_key *,
467 				qdf_nbuf_t, uint8_t,  uint8_t);
468 	QDF_STATUS(*demic)(struct wlan_crypto_key *,
469 				qdf_nbuf_t, uint8_t,  uint8_t);
470 };
471 
472 
473 /**
474  * wlan_crypto_is_data_protected - check is frame is protected or not
475  * @data: frame
476  *
477  * This function check is frame is protected or not
478  *
479  * Return: TRUE/FALSE
480  */
481 static inline bool wlan_crypto_is_data_protected(const void *data)
482 {
483 	const struct ieee80211_hdr *hdr = (const struct ieee80211_hdr *)data;
484 	if (hdr->frame_control[1] & WLAN_FC1_ISWEP)
485 		return true;
486 	else
487 		return false;
488 }
489 
490 /**
491  * ieee80211_hdrsize - calculate frame header size
492  * @data: frame
493  *
494  * This function calculate frame header size
495  *
496  * Return: header size of the frame
497  */
498 static inline uint8_t ieee80211_hdrsize(const void *data)
499 {
500 	const struct ieee80211_hdr *hdr = (const struct ieee80211_hdr *)data;
501 	uint8_t size = sizeof(struct ieee80211_hdr);
502 
503 	if ((hdr->frame_control[1] & WLAN_FC1_DIR_MASK)
504 				== (WLAN_FC1_DSTODS)) {
505 		size += WLAN_ALEN;
506 	}
507 
508 	if (((WLAN_FC0_GET_STYPE(hdr->frame_control[0])
509 			== WLAN_FC0_STYPE_QOS_DATA))) {
510 		size += sizeof(uint16_t);
511 		/* Qos frame with Order bit set indicates an HTC frame */
512 		if (hdr->frame_control[1] & WLAN_FC1_ORDER)
513 			size += (sizeof(uint8_t)*4);
514 	}
515 	return size;
516 }
517 
518 /**
519  * ieee80211_hdrspace - calculate frame header size with padding
520  * @pdev: pdev
521  * @data: frame header
522  *
523  * This function returns the space occupied by the 802.11 header
524  * and any padding required by the driver. This works for a management
525  * or data frame.
526  *
527  * Return: header size of the frame with padding
528  */
529 static inline uint8_t
530 ieee80211_hdrspace(struct wlan_objmgr_pdev *pdev, const void *data)
531 {
532 	uint8_t size = ieee80211_hdrsize(data);
533 
534 	if (wlan_pdev_nif_feat_cap_get(pdev, WLAN_PDEV_F_DATAPAD))
535 		size = roundup(size, sizeof(u_int32_t));
536 
537 	return size;
538 }
539 
540 /**
541  * wlan_get_tid - get tid of the frame
542  * @data: frame
543  *
544  * This function get tid of the frame
545  *
546  * Return: tid of the frame
547  */
548 static inline int wlan_get_tid(const void *data)
549 {
550 	const struct ieee80211_hdr *hdr = (const struct ieee80211_hdr *)data;
551 
552 	if (((WLAN_FC0_GET_STYPE(hdr->frame_control[0])
553 				== WLAN_FC0_STYPE_QOS_DATA))) {
554 		if ((hdr->frame_control[1] & WLAN_FC1_DIR_MASK)
555 					== (WLAN_FC1_DSTODS)) {
556 			return ((struct ieee80211_hdr_qos_addr4 *)data)->qos[0]
557 							& WLAN_QOS_TID_MASK;
558 		} else {
559 			return ((struct ieee80211_hdr_qos *)data)->qos[0]
560 							& WLAN_QOS_TID_MASK;
561 		}
562 	} else
563 		return WLAN_NONQOS_SEQ;
564 }
565 #endif /* end of _WLAN_CRYPTO_DEF_I_H_ */
566