summaryrefslogtreecommitdiffstats
path: root/target/linux/realtek/files/drivers/net/wireless/rtl8192cd/wapi_wai.h
blob: 3aa05b90254b101b876af0ea6aba2c2d1f0b6d61 (plain)
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
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
#if	!defined(WAPI_WAI_H)
#define		WAPI_WAI_H	1
#include "8192cd_cfg.h"

#if defined(CONFIG_RTL_WAPI_SUPPORT)

#ifdef __LINUX_2_6__
#ifdef CONFIG_RTL8672
#include "./romeperf.h"
#else
#include <net/rtl/rtl_types.h>
#endif
#else
#include "../rtl865x/rtl_types.h"
#endif
#include <linux/timer.h>


#ifndef ETH_ALEN
#define ETH_ALEN    6
#endif

#ifdef __KERNEL__
#include <linux/spinlock.h>
#if 0
extern int	wapi_lock_cnt;
#define	WAPI_LOCK_INIT(__lock__)		do {spin_lock_init(__lock__);} while(0)
#define	WAPI_LOCK(__lock__)		\
		do { \
			spin_lock(__lock__); \
			if(wapi_lock_cnt>0) \
				printk("[%s][%d]: wapi lock cnt %d\n", __FUNCTION__, __LINE__, wapi_lock_cnt); \
			wapi_lock_cnt++; \
		} while(0)
#define	WAPI_UNLOCK(__lock__)	\
		do { \
			spin_unlock(__lock__); \
			wapi_lock_cnt--; \
			if (wapi_lock_cnt<0) \
				printk("[%s][%d]: wapi lock cnt %d\n", __FUNCTION__, __LINE__, wapi_lock_cnt); \
		} while(0)
#else
#define	WAPI_LOCK_INIT(__lock__)
#define	WAPI_LOCK(__lock__)	
#define	WAPI_UNLOCK(__lock__)
#endif
#endif

#define	ETH_P_WAPI			0x88B4

#if 0
#define	FL_TRACE(__FLG__, __NUM__)	printk("[%s][%d]:-[%s][0x%x]\n", __FUNCTION__, __LINE__, __FLG__, __NUM__)
#define	wapiAssert(__FLAGS__)	do {if(!(__FLAGS__)) printk("Assert Error!! ==>[%s][%d]-[%s]\n", __FUNCTION__, __LINE__, __FILE__);} while(0)
#else
#define	wapiAssert(__FLAGS__)
#define	FL_TRACE(__FLG__, __NUM__)
#endif

#define	WAPI_ALIGNMENT_OFFSET	0
#define	WAPI_CERT_MAX_LEN		2688
#define	SMS4_MIC_LEN		16
#define	WAPI_EXT_LEN		18
#define	WAPI_PN_LEN		16
#define	WAPI_KEY_LEN		16
#define	WAPI_N_LEN			32		/*	wapi challange length	*/
#define	WAPI_KEY_MNG_PKT_LEN		4
#define	WAPI_AKM_OFFSET	4
#define	WAPI_WAI_MAX_SEND_RETRY		7
//#define	WAPI_WAI_HEADER_PADDING		(32+sizeof(wapiWaiHeader))	/*	wlan header 26, LLC header 6, ether type 2	*/
#define	WAPI_WAI_HEADER_PADDING		(34)	/*	wlan header 26, LLC header 6, ether type 2	*/

#define	WAPI_RETRY_COUNT			6	/*	max 64	*/
#define	WAPI_CERT_REQ_TIMEOUT	RTL_SECONDS_TO_JIFFIES(10)
#define	WAPI_AUTH_REQ_TIMEOUT	RTL_SECONDS_TO_JIFFIES(31)
#define	WAPI_GENERAL_TIMEOUT	RTL_SECONDS_TO_JIFFIES(1)
#define	WAPI_KEY_UPDATE_TIMEOUT	RTL_SECONDS_TO_JIFFIES(6)
#define	WAPI_KEY_UPDATE_PERIOD	RTL_SECONDS_TO_JIFFIES(600)
#define	WAPI_KEY_UPDATE_PKTCNT		65536
#define	WAPI_WAI_SEQNUM_STEP		8

#define	WAPI_RETURN_SUCCESS		0
#define	WAPI_RETURN_FAILED		-1
#define	WAPI_RETURN_DEASSOC		-2

#define	RX_QUEUE_NUM				4

typedef	enum __wapiMibType	wapiStaType;

typedef	enum __wapiMibEncryptAlgorithm	wapiStaEncryptAlgorithm;

typedef	struct	__wapiKey {
	unsigned char		dataKey[WAPI_KEY_LEN];	/*	used as key for BK		*/
											/*	used as MCastKeyEncrypt Key for WAI */
	unsigned char		micKey[WAPI_KEY_LEN];	/*	used as keyID for BK	*/
											/*	used as UCast MIC Key for WAI */
#if defined(WAPI_SUPPORT_MULTI_ENCRYPT)
	wapiStaEncryptAlgorithm		keyType;
#endif
}	wapiKey;

#define	WAPI_IOCTL_TYPE_ACTIVEAUTH	0
#define	WAPI_IOCTL_TYPE_SETBK			1
#define	WAPI_IOCTL_TYPE_AUTHRSP		2

#define	WAPI_IOCTL_TYPE_REQ_ACTIVE	3
#define	WAPI_IOCTL_TYPE_CA_AUTH		4

typedef	struct	__wapiCAAppPara {
	uint8			eventID;
	uint8			moreData;
	uint16			type;
	void				*ptr;
	char				name[IFNAMSIZ];
	uint8			data[0];
}	wapiCAAppPara;

typedef	struct	__wapiStaPN {
	unsigned char		rxUCast[RX_QUEUE_NUM][WAPI_PN_LEN];
	unsigned char		txUCast[WAPI_PN_LEN];
	unsigned short		rxSeq[RX_QUEUE_NUM];
}	wapiStaPN;

/*	AE STATE during WAI Handshake	*/
typedef enum __WAPI_AE_STATE { 
	ST_WAPI_AE_IDLE=0, 
	ST_WAPI_AE_ACTIVE_AUTHENTICATION_REQ,	/*	1	*/
	ST_WAPI_AE_ACTIVE_AUTHENTICATION_SNT,	/*	2	*/
	ST_WAPI_AE_ACCESS_AUTHENTICATE_REQ_RCVD,	/*	3	*/	
	ST_WAPI_AE_ACCESS_CERTIFICATE_REQ_SNT,	/*	4	*/
	ST_WAPI_AE_BKSA_ESTABLISH,	/*	5	*/
	ST_WAPI_AE_USK_AGGREMENT_REQ_SNT,	/*	6	*/
	ST_WAPI_AE_USK_AGGREMENT_RSP_SNT,	/*	7	*/
	ST_WAPI_AE_USK_AGGREMENT_RSP_RCVD,	/*	8	*/
	ST_WAPI_AE_USKA_ESTABLISH,	/*	9	*/
	ST_WAPI_AE_MSK_NOTIFICATION_SNT,	/*	a	*/
	ST_WAPI_AE_MSK_NOTIFICATION_RCVD,	/*	b	*/
	ST_WAPI_AE_MSK_RSP_RCVD,	/*	c	*/
	ST_WAPI_AE_MSKA_ESTABLISH	/*	d	*/
}	WAPI_AE_STATE;

typedef	struct	__wapiStaInfo {
	uint8			asueWapiIE[256];
	uint8			waiASUEChallange[WAPI_N_LEN];
	uint8			waiAEChallange[WAPI_N_LEN];	
	uint8			waiAEChallangeNext[WAPI_N_LEN];
	uint8			waiAuthFlag[WAPI_N_LEN];
	uint8			asueWapiIELength;
	uint8			wapiRxFragSeq;
	uint8			wapiUCastKeyId:1;
	uint8			wapiUCastRxEnable:1;
	uint8			wapiUCastTxEnable:1;
	uint8			wapiUCastKeyUpdate:1;
	uint8			wapiMCastEnable:1;
	uint8			wapiMCastKeyUpdateDone:1;
	uint8			wapiRetry:6;
	uint16			waiTxSeq;
	uint16			waiRxSeq;
	wapiStaType		wapiType;
	WAPI_AE_STATE	wapiState;
	wapiStaPN		wapiPN;
	wapiKey			wapiBK;
	wapiKey			wapiUCastKey[2];
	wapiKey			wapiWaiKey;
	uint32			wapiRxFragLen;
	uint32			waiCertRspDataLen;
	uint32			waiCertCachedDataLen;
	unsigned long		wapiUCastKeyUpdateCnt;
	struct timer_list	waiResendTimer;
	struct timer_list	waiUCastKeyUpdateTimer;
	struct sk_buff		*wapiRxFragPskb;
	struct rtl8192cd_priv	*priv;
	uint8			*waiCertCachedData;
	uint8			*waiCertRspData;
#ifdef __KERNEL__
	spinlock_t				lock;
#endif
}	wapiStaInfo;

typedef enum	__wapiWaiProtocolVersion {
	WAI_V1 = 1
}	wapiWaiProtocolVersion;
typedef enum	__wapiWaiType {
	WAI_TYPE_WAI = 1
}	wapiWaiType;
typedef enum	__wapiWaiSubType {
	WAI_SUBTYPE_PREAUTH = 1,
	WAI_SUBTYPE_STA_KEY_REQ = 2,
	WAI_SUBTYPE_AUTH_ACTIVE = 3,
	WAI_SUBTYPE_AUTH_REQ = 4,
	WAI_SUBTYPE_AUTH_RSP = 5,
	WAI_SUBTYPE_CERT_REQ = 6,
	WAI_SUBTYPE_CERT_RSP =7,
	WAI_SUBTYPE_UCAST_KEY_REQ = 8,
	WAI_SUBTYPE_UCAST_KEY_RSP = 9,
	WAI_SUBTYPE_UCAST_KEY_ACK = 10,
	WAI_SUBTYPE_MCAST_KEY_NOTIFY = 11,
	WAI_SUBTYPE_MCAST_KEY_RSP = 12
}	wapiWaiSubType;

#define	WAI_HEADER_MF		0x1
#define	WAI_HEADER_LEN	12
#define	WAI_MIC_LEN			20

typedef struct __wapiTLV {
	uint16	id;
	uint16	len;
	uint8	data[0];
}	wapiTLV;

typedef struct __wapiTLV1 {
	uint8	id;
	uint16	len;
	uint8	data[0];
}	__attribute__ ((packed))	wapiTLV1;

typedef struct __wapiWaiHeader {
	uint16	protocolVersion;
	uint8	type;
	uint8	subType;
	uint16	reserved;
	uint16	length;
	uint16	sequenceNum;
	uint8	fragmentNum;
	uint8	flags;
}	wapiWaiHeader;

typedef struct	__wapiWaiCertActivPkt {
	/*	8Bit flags	*/
	uint8	reserved:6;
	uint8	preAuth:1;
	uint8	updateBK:1;
	/*	8Bit flags over	*/
	uint8	authFlag[WAPI_N_LEN];
	uint8	data[0];
}	wapiWaiCertActivPkt;

typedef struct	__wapiWaiCertAuthReqPkt {
	/*	8Bit flags	*/
	uint8	reserved:4;
	uint8	options:1;
	uint8	AEAuthReq:1;
	uint8	preAuth:1;
	uint8	updateBK:1;
	/*	8Bit flags over	*/
	uint8	authFlag[WAPI_N_LEN];
	uint8	ASUEChallange[WAPI_N_LEN];
	uint8	data[0];
}	wapiWaiCertAuthReqPkt;

typedef struct	__wapiWaiCertAuthRspPkt {
	/*	8Bit flags	*/
	uint8	reserved1:4;
	uint8	options:1;
	uint8	reserved2:1;
	uint8	preAuth:1;
	uint8	updateBK:1;
	uint8	ASUEChallange[WAPI_N_LEN];
	uint8	AEChallange[WAPI_N_LEN];
	uint8	CAResult;
	uint8	data[0];
}	wapiWaiCertAuthRspPkt;

typedef struct	__wapiWaiUCastReqPkt {
	/*	8Bit flags	*/
	uint8	reserved1:3;
	uint8	uskUpdate:1;
	uint8	reserved2:4;
	/*	8Bit flags over	*/
	uint8	bkId[WAPI_KEY_LEN];
	uint8	uskId;
	uint8	mac1[ETH_ALEN];
	uint8	mac2[ETH_ALEN];
	uint8	AEChallange[WAPI_N_LEN];
}	wapiWaiUCastReqPkt;

typedef struct	__wapiWaiUCastRspPkt {
	/*	8Bit flags	*/
	uint8	reserved1:3;
	uint8	uskUpdate:1;
	uint8	reserved2:4;
	/*	8Bit flags over	*/
	uint8	bkId[WAPI_KEY_LEN];
	uint8	uskId;
	uint8	mac1[ETH_ALEN];
	uint8	mac2[ETH_ALEN];
	uint8	ASUEChallange[WAPI_N_LEN];
	uint8	AEChallange[WAPI_N_LEN];
	uint8	WIEasue[0];
}	wapiWaiUCastRspPkt;

typedef struct	__wapiWaiUCastAckPkt {
	/*	8Bit flags	*/
	uint8	reserved1:3;
	uint8	uskUpdate:1;
	uint8	reserved2:4;
	/*	8Bit flags over	*/
	uint8	bkId[WAPI_KEY_LEN];
	uint8	uskId;
	uint8	mac1[ETH_ALEN];
	uint8	mac2[ETH_ALEN];
	uint8	ASUEChallange[WAPI_N_LEN];
	uint8	WIEae[0];
}	wapiWaiUCastAckPkt;

typedef struct	__wapiWaiMCastNotiPkt {
	/*	8Bit flags	*/
	uint8	reserved1:1;
	uint8	delKeyFlag:1;
	uint8	staKeyFlag:1;
	uint8	reserved2:5;
	/*	8Bit flags over	*/
	uint8	mskId;
	uint8	uskId;
	uint8	mac1[ETH_ALEN];
	uint8	mac2[ETH_ALEN];
	uint8	dataPN[WAPI_PN_LEN];
	uint8	keyPN[WAPI_PN_LEN];
	uint8	keyData[0];
}	wapiWaiMCastNofiPkt;

typedef struct	__wapiWaiMCastRspPkt {
	/*	8Bit flags	*/
	uint8	reserved1:1;
	uint8	delKeyFlag:1;
	uint8	staKeyFlag:1;
	uint8	reserved2:5;
	/*	8Bit flags over	*/
	uint8	mskId;
	uint8	uskId;
	uint8	mac1[ETH_ALEN];
	uint8	mac2[ETH_ALEN];
	uint8	keyPN[WAPI_PN_LEN];
	uint8	mic[0];
}	wapiWaiMCastRspPkt;

void wapiInit(struct rtl8192cd_priv *priv);
void wapiExit(struct rtl8192cd_priv *priv);
void wapiStationInit(struct stat_info *pstat);
void wapiSetIE(struct rtl8192cd_priv	*priv);
int	wapiIEInfoInstall(struct rtl8192cd_priv *priv, struct stat_info *pstat);
void wapiReleaseFragementQueue(wapiStaInfo *wapiInfo);
void wapiReqActiveCA(struct stat_info *pstat);
void	wapiSetBK(struct stat_info *pstat);
int32 WapiComparePN(uint8 *PN1, uint8 *PN2);
int32 WapiIncreasePN(uint8 *PN, uint8 AddCount);
int wapiHandleRecvPacket(struct rx_frinfo *pfrinfo, struct stat_info *pstat);
int	wapiSendActiveAuthenticationPacket(struct rtl8192cd_priv *priv, struct stat_info *pstat, int len, uint8 *data);
int	wapiSendUnicastKeyAgrementRequeset(struct rtl8192cd_priv *priv, struct stat_info *pstat);
int	wapiSendUnicastKeyAgrementConfirm(struct rtl8192cd_priv *priv, struct stat_info *pstat);
int	wapiSendMulticastKeyNotification(struct rtl8192cd_priv *priv, struct stat_info *pstat);
int	wapiUpdateUSK(struct rtl8192cd_priv *priv, struct stat_info *pstat);
int	wapiUpdateMSK(struct rtl8192cd_priv *priv, struct stat_info *pstat);

extern struct timer_list	waiMCastKeyUpdateTimer;

int DOT11_Process_WAPI_Info(struct rtl8192cd_priv *priv, uint8 *data, int32 len);
void issue_deauth(struct rtl8192cd_priv *priv,	unsigned char *da, int reason);
#endif	/*	CONFIG_RTL_WAPI_SUPPORT	*/

#endif	/*	WAPI_WAI_H			*/