1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __INC_WAPI_H
3 #define __INC_WAPI_H
4
5
6 #define CONFIG_WAPI_SW_SMS4
7 #define WAPI_DEBUG
8
9 #define SMS4_MIC_LEN 16
10 #define WAPI_EXT_LEN 18
11 #define MAX_WAPI_IE_LEN 256
12 #define sMacHdrLng 24 /* octets in data header, no WEP */
13
14 #ifdef WAPI_DEBUG
15
16 /* WAPI trace debug */
17 extern u32 wapi_debug_component;
18
dump_buf(u8 * buf,u32 len)19 static inline void dump_buf(u8 *buf, u32 len)
20 {
21 u32 i;
22 printk("-----------------Len %d----------------\n", len);
23 for (i = 0; i < len; i++)
24 printk("%2.2x-", *(buf + i));
25 printk("\n");
26 }
27
28 #define WAPI_TRACE(component, x, args...) \
29 do { if (wapi_debug_component & (component)) \
30 printk(KERN_DEBUG "WAPI" ":" x "" , \
31 ##args);\
32 } while (0);
33
34 #define WAPI_DATA(component, x, buf, len) \
35 do { if (wapi_debug_component & (component)) { \
36 printk("%s:\n", x);\
37 dump_buf((buf), (len)); } \
38 } while (0);
39
40 #define RT_ASSERT_RET(_Exp) \
41 if (!(_Exp)) { \
42 printk("RTWLAN: "); \
43 printk("Assertion failed! %s,%s, line=%d\n", \
44 #_Exp, __FUNCTION__, __LINE__); \
45 return; \
46 }
47 #define RT_ASSERT_RET_VALUE(_Exp, Ret) \
48 if (!(_Exp)) { \
49 printk("RTWLAN: "); \
50 printk("Assertion failed! %s,%s, line=%d\n", \
51 #_Exp, __FUNCTION__, __LINE__); \
52 return Ret; \
53 }
54
55 #else
56 #define RT_ASSERT_RET(_Exp) do {} while (0)
57 #define RT_ASSERT_RET_VALUE(_Exp, Ret) do {} while (0)
58 #define WAPI_TRACE(component, x, args...) do {} while (0)
59 #define WAPI_DATA(component, x, buf, len) do {} while (0)
60 #endif
61
62
63 enum WAPI_DEBUG {
64 WAPI_INIT = 1,
65 WAPI_API = 1 << 1,
66 WAPI_TX = 1 << 2,
67 WAPI_RX = 1 << 3,
68 WAPI_MLME = 1 << 4,
69 WAPI_IOCTL = 1 << 5,
70 WAPI_ERR = 1 << 31
71 };
72
73 #define WAPI_MAX_BKID_NUM 4
74 #define WAPI_MAX_STAINFO_NUM 4
75 #define WAPI_CAM_ENTRY_NUM 14 /* 28/2 = 14 */
76
77 typedef struct _RT_WAPI_BKID {
78 struct list_head list;
79 u8 bkid[16];
80 } RT_WAPI_BKID, *PRT_WAPI_BKID;
81
82 typedef struct _RT_WAPI_KEY {
83 u8 dataKey[16];
84 u8 micKey[16];
85 u8 keyId;
86 bool bSet;
87 bool bTxEnable;
88 } RT_WAPI_KEY, *PRT_WAPI_KEY;
89
90 typedef enum _RT_WAPI_PACKET_TYPE {
91 WAPI_NONE = 0,
92 WAPI_PREAUTHENTICATE = 1,
93 WAPI_STAKEY_REQUEST = 2,
94 WAPI_AUTHENTICATE_ACTIVE = 3,
95 WAPI_ACCESS_AUTHENTICATE_REQUEST = 4,
96 WAPI_ACCESS_AUTHENTICATE_RESPONSE = 5,
97 WAPI_CERTIFICATE_AUTHENTICATE_REQUEST = 6,
98 WAPI_CERTIFICATE_AUTHENTICATE_RESPONSE = 7,
99 WAPI_USK_REQUEST = 8,
100 WAPI_USK_RESPONSE = 9,
101 WAPI_USK_CONFIRM = 10,
102 WAPI_MSK_NOTIFICATION = 11,
103 WAPI_MSK_RESPONSE = 12
104 } RT_WAPI_PACKET_TYPE;
105
106 typedef struct _RT_WAPI_STA_INFO {
107 struct list_head list;
108 u8 PeerMacAddr[6];
109 RT_WAPI_KEY wapiUsk;
110 RT_WAPI_KEY wapiUskUpdate;
111 RT_WAPI_KEY wapiMsk;
112 RT_WAPI_KEY wapiMskUpdate;
113 u8 lastRxUnicastPN[16];
114 u8 lastTxUnicastPN[16];
115 u8 lastRxMulticastPN[16];
116 u8 lastRxUnicastPNBEQueue[16];
117 u8 lastRxUnicastPNBKQueue[16];
118 u8 lastRxUnicastPNVIQueue[16];
119 u8 lastRxUnicastPNVOQueue[16];
120 bool bSetkeyOk;
121 bool bAuthenticateInProgress;
122 bool bAuthenticatorInUpdata;
123 } RT_WAPI_STA_INFO, *PRT_WAPI_STA_INFO;
124
125 /* Added for HW wapi en/decryption */
126 typedef struct _RT_WAPI_CAM_ENTRY {
127 /* RT_LIST_ENTRY list; */
128 u8 IsUsed;
129 u8 entry_idx;/* for cam entry */
130 u8 keyidx; /* 0 or 1,new or old key */
131 u8 PeerMacAddr[6];
132 u8 type; /* should be 110,wapi */
133 } RT_WAPI_CAM_ENTRY, *PRT_WAPI_CAM_ENTRY;
134
135 typedef struct _RT_WAPI_T {
136 /* BKID */
137 RT_WAPI_BKID wapiBKID[WAPI_MAX_BKID_NUM];
138 struct list_head wapiBKIDIdleList;
139 struct list_head wapiBKIDStoreList;
140 /* Key for Tx Multicast/Broadcast */
141 RT_WAPI_KEY wapiTxMsk;
142
143 /* sec related */
144 u8 lastTxMulticastPN[16];
145 /* STA list */
146 RT_WAPI_STA_INFO wapiSta[WAPI_MAX_STAINFO_NUM];
147 struct list_head wapiSTAIdleList;
148 struct list_head wapiSTAUsedList;
149 /* */
150 bool bWapiEnable;
151
152 /* store WAPI IE */
153 u8 wapiIE[256];
154 u8 wapiIELength;
155 bool bWapiPSK;
156 /* last sequece number for wai packet */
157 u16 wapiSeqnumAndFragNum;
158 int extra_prefix_len;
159 int extra_postfix_len;
160
161 RT_WAPI_CAM_ENTRY wapiCamEntry[WAPI_CAM_ENTRY_NUM];
162 } RT_WAPI_T, *PRT_WAPI_T;
163
164 typedef struct _WLAN_HEADER_WAPI_EXTENSION {
165 u8 KeyIdx;
166 u8 Reserved;
167 u8 PN[16];
168 } WLAN_HEADER_WAPI_EXTENSION, *PWLAN_HEADER_WAPI_EXTENSION;
169
170 u32 WapiComparePN(u8 *PN1, u8 *PN2);
171
172
173 void rtw_wapi_init(_adapter *padapter);
174
175 void rtw_wapi_free(_adapter *padapter);
176
177 void rtw_wapi_disable_tx(_adapter *padapter);
178
179 u8 rtw_wapi_is_wai_packet(_adapter *padapter, u8 *pkt_data);
180
181 void rtw_wapi_update_info(_adapter *padapter, union recv_frame *precv_frame);
182
183 u8 rtw_wapi_check_for_drop(_adapter *padapter, union recv_frame *precv_frame);
184
185 void rtw_build_probe_resp_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib);
186
187 void rtw_build_beacon_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib);
188
189 void rtw_build_assoc_req_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib);
190
191 void rtw_wapi_on_assoc_ok(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE);
192
193 void rtw_wapi_return_one_sta_info(_adapter *padapter, u8 *MacAddr);
194
195 void rtw_wapi_return_all_sta_info(_adapter *padapter);
196
197 void rtw_wapi_clear_cam_entry(_adapter *padapter, u8 *pMacAddr);
198
199 void rtw_wapi_clear_all_cam_entry(_adapter *padapter);
200
201 void rtw_wapi_set_key(_adapter *padapter, RT_WAPI_KEY *pWapiKey, RT_WAPI_STA_INFO *pWapiSta, u8 bGroupKey, u8 bUseDefaultKey);
202
203 int rtw_wapi_create_event_send(_adapter *padapter, u8 EventId, u8 *MacAddr, u8 *Buff, u16 BufLen);
204
205 u32 rtw_sms4_encrypt(_adapter *padapter, u8 *pxmitframe);
206
207 u32 rtw_sms4_decrypt(_adapter *padapter, u8 *precvframe);
208
209 void rtw_wapi_get_iv(_adapter *padapter, u8 *pRA, u8 *IV);
210
211 u8 WapiIncreasePN(u8 *PN, u8 AddCount);
212
213 bool rtw_wapi_drop_for_key_absent(_adapter *padapter, u8 *pRA);
214
215 #endif
216