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