xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8723ds/include/ieee80211_ext.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /******************************************************************************
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright(c) 2007 - 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 __IEEE80211_EXT_H
16*4882a593Smuzhiyun #define __IEEE80211_EXT_H
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #include <drv_conf.h>
19*4882a593Smuzhiyun #include <osdep_service.h>
20*4882a593Smuzhiyun #include <drv_types.h>
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun #define WMM_OUI_TYPE 2
23*4882a593Smuzhiyun #define WMM_OUI_SUBTYPE_INFORMATION_ELEMENT 0
24*4882a593Smuzhiyun #define WMM_OUI_SUBTYPE_PARAMETER_ELEMENT 1
25*4882a593Smuzhiyun #define WMM_OUI_SUBTYPE_TSPEC_ELEMENT 2
26*4882a593Smuzhiyun #define WMM_VERSION 1
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun #define WPA_PROTO_WPA BIT(0)
29*4882a593Smuzhiyun #define WPA_PROTO_RSN BIT(1)
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #define WPA_KEY_MGMT_IEEE8021X BIT(0)
32*4882a593Smuzhiyun #define WPA_KEY_MGMT_PSK BIT(1)
33*4882a593Smuzhiyun #define WPA_KEY_MGMT_NONE BIT(2)
34*4882a593Smuzhiyun #define WPA_KEY_MGMT_IEEE8021X_NO_WPA BIT(3)
35*4882a593Smuzhiyun #define WPA_KEY_MGMT_WPA_NONE BIT(4)
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun #define WPA_CAPABILITY_PREAUTH BIT(0)
39*4882a593Smuzhiyun #define WPA_CAPABILITY_MGMT_FRAME_PROTECTION BIT(6)
40*4882a593Smuzhiyun #define WPA_CAPABILITY_PEERKEY_ENABLED BIT(9)
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun #define PMKID_LEN 16
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun #ifdef PLATFORM_LINUX
47*4882a593Smuzhiyun struct wpa_ie_hdr {
48*4882a593Smuzhiyun 	u8 elem_id;
49*4882a593Smuzhiyun 	u8 len;
50*4882a593Smuzhiyun 	u8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */
51*4882a593Smuzhiyun 	u8 version[2]; /* little endian */
52*4882a593Smuzhiyun } __attribute__((packed));
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun struct rsn_ie_hdr {
55*4882a593Smuzhiyun 	u8 elem_id; /* WLAN_EID_RSN */
56*4882a593Smuzhiyun 	u8 len;
57*4882a593Smuzhiyun 	u8 version[2]; /* little endian */
58*4882a593Smuzhiyun } __attribute__((packed));
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun struct wme_ac_parameter {
61*4882a593Smuzhiyun #if defined(CONFIG_LITTLE_ENDIAN)
62*4882a593Smuzhiyun 	/* byte 1 */
63*4882a593Smuzhiyun 	u8	aifsn:4,
64*4882a593Smuzhiyun 	     acm:1,
65*4882a593Smuzhiyun 	     aci:2,
66*4882a593Smuzhiyun 	     reserved:1;
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun 	/* byte 2 */
69*4882a593Smuzhiyun 	u8	eCWmin:4,
70*4882a593Smuzhiyun 	     eCWmax:4;
71*4882a593Smuzhiyun #elif defined(CONFIG_BIG_ENDIAN)
72*4882a593Smuzhiyun 	/* byte 1 */
73*4882a593Smuzhiyun 	u8	reserved:1,
74*4882a593Smuzhiyun 	     aci:2,
75*4882a593Smuzhiyun 	     acm:1,
76*4882a593Smuzhiyun 	     aifsn:4;
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun 	/* byte 2 */
79*4882a593Smuzhiyun 	u8	eCWmax:4,
80*4882a593Smuzhiyun 	     eCWmin:4;
81*4882a593Smuzhiyun #else
82*4882a593Smuzhiyun #error	"Please fix <endian.h>"
83*4882a593Smuzhiyun #endif
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun 	/* bytes 3 & 4 */
86*4882a593Smuzhiyun 	u16 txopLimit;
87*4882a593Smuzhiyun } __attribute__((packed));
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun struct wme_parameter_element {
90*4882a593Smuzhiyun 	/* required fields for WME version 1 */
91*4882a593Smuzhiyun 	u8 oui[3];
92*4882a593Smuzhiyun 	u8 oui_type;
93*4882a593Smuzhiyun 	u8 oui_subtype;
94*4882a593Smuzhiyun 	u8 version;
95*4882a593Smuzhiyun 	u8 acInfo;
96*4882a593Smuzhiyun 	u8 reserved;
97*4882a593Smuzhiyun 	struct wme_ac_parameter ac[4];
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun } __attribute__((packed));
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun #endif
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun #define WPA_PUT_LE16(a, val)			\
104*4882a593Smuzhiyun 	do {					\
105*4882a593Smuzhiyun 		(a)[1] = ((u16) (val)) >> 8;	\
106*4882a593Smuzhiyun 		(a)[0] = ((u16) (val)) & 0xff;	\
107*4882a593Smuzhiyun 	} while (0)
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun #define WPA_PUT_BE32(a, val)					\
110*4882a593Smuzhiyun 	do {							\
111*4882a593Smuzhiyun 		(a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff);	\
112*4882a593Smuzhiyun 		(a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff);	\
113*4882a593Smuzhiyun 		(a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff);	\
114*4882a593Smuzhiyun 		(a)[3] = (u8) (((u32) (val)) & 0xff);		\
115*4882a593Smuzhiyun 	} while (0)
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun #define WPA_PUT_LE32(a, val)					\
118*4882a593Smuzhiyun 	do {							\
119*4882a593Smuzhiyun 		(a)[3] = (u8) ((((u32) (val)) >> 24) & 0xff);	\
120*4882a593Smuzhiyun 		(a)[2] = (u8) ((((u32) (val)) >> 16) & 0xff);	\
121*4882a593Smuzhiyun 		(a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff);	\
122*4882a593Smuzhiyun 		(a)[0] = (u8) (((u32) (val)) & 0xff);		\
123*4882a593Smuzhiyun 	} while (0)
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun #define RSN_SELECTOR_PUT(a, val) WPA_PUT_BE32((u8 *) (a), (val))
126*4882a593Smuzhiyun /* #define RSN_SELECTOR_PUT(a, val) WPA_PUT_LE32((u8 *) (a), (val)) */
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun /* Action category code */
131*4882a593Smuzhiyun enum ieee80211_category {
132*4882a593Smuzhiyun 	WLAN_CATEGORY_SPECTRUM_MGMT = 0,
133*4882a593Smuzhiyun 	WLAN_CATEGORY_QOS = 1,
134*4882a593Smuzhiyun 	WLAN_CATEGORY_DLS = 2,
135*4882a593Smuzhiyun 	WLAN_CATEGORY_BACK = 3,
136*4882a593Smuzhiyun 	WLAN_CATEGORY_HT = 7,
137*4882a593Smuzhiyun 	WLAN_CATEGORY_WMM = 17,
138*4882a593Smuzhiyun };
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun /* SPECTRUM_MGMT action code */
141*4882a593Smuzhiyun enum ieee80211_spectrum_mgmt_actioncode {
142*4882a593Smuzhiyun 	WLAN_ACTION_SPCT_MSR_REQ = 0,
143*4882a593Smuzhiyun 	WLAN_ACTION_SPCT_MSR_RPRT = 1,
144*4882a593Smuzhiyun 	WLAN_ACTION_SPCT_TPC_REQ = 2,
145*4882a593Smuzhiyun 	WLAN_ACTION_SPCT_TPC_RPRT = 3,
146*4882a593Smuzhiyun 	WLAN_ACTION_SPCT_CHL_SWITCH = 4,
147*4882a593Smuzhiyun 	WLAN_ACTION_SPCT_EXT_CHL_SWITCH = 5,
148*4882a593Smuzhiyun };
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun /* BACK action code */
151*4882a593Smuzhiyun enum ieee80211_back_actioncode {
152*4882a593Smuzhiyun 	WLAN_ACTION_ADDBA_REQ = 0,
153*4882a593Smuzhiyun 	WLAN_ACTION_ADDBA_RESP = 1,
154*4882a593Smuzhiyun 	WLAN_ACTION_DELBA = 2,
155*4882a593Smuzhiyun };
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun /* HT features action code */
158*4882a593Smuzhiyun enum ieee80211_ht_actioncode {
159*4882a593Smuzhiyun 	WLAN_ACTION_NOTIFY_CH_WIDTH = 0,
160*4882a593Smuzhiyun 	WLAN_ACTION_SM_PS = 1,
161*4882a593Smuzhiyun 	WLAN_ACTION_PSPM = 2,
162*4882a593Smuzhiyun 	WLAN_ACTION_PCO_PHASE = 3,
163*4882a593Smuzhiyun 	WLAN_ACTION_MIMO_CSI_MX = 4,
164*4882a593Smuzhiyun 	WLAN_ACTION_MIMO_NONCP_BF = 5,
165*4882a593Smuzhiyun 	WLAN_ACTION_MIMP_CP_BF = 6,
166*4882a593Smuzhiyun 	WLAN_ACTION_ASEL_INDICATES_FB = 7,
167*4882a593Smuzhiyun 	WLAN_ACTION_HI_INFO_EXCHG = 8,
168*4882a593Smuzhiyun };
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun /* BACK (block-ack) parties */
171*4882a593Smuzhiyun enum ieee80211_back_parties {
172*4882a593Smuzhiyun 	WLAN_BACK_RECIPIENT = 0,
173*4882a593Smuzhiyun 	WLAN_BACK_INITIATOR = 1,
174*4882a593Smuzhiyun 	WLAN_BACK_TIMER = 2,
175*4882a593Smuzhiyun };
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun #ifdef PLATFORM_LINUX
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun struct ieee80211_mgmt {
180*4882a593Smuzhiyun 	u16 frame_control;
181*4882a593Smuzhiyun 	u16 duration;
182*4882a593Smuzhiyun 	u8 da[6];
183*4882a593Smuzhiyun 	u8 sa[6];
184*4882a593Smuzhiyun 	u8 bssid[6];
185*4882a593Smuzhiyun 	u16 seq_ctrl;
186*4882a593Smuzhiyun 	union {
187*4882a593Smuzhiyun 		struct {
188*4882a593Smuzhiyun 			u16 auth_alg;
189*4882a593Smuzhiyun 			u16 auth_transaction;
190*4882a593Smuzhiyun 			u16 status_code;
191*4882a593Smuzhiyun 			/* possibly followed by Challenge text */
192*4882a593Smuzhiyun 			u8 variable[0];
193*4882a593Smuzhiyun 		}  __attribute__((packed)) auth;
194*4882a593Smuzhiyun 		struct {
195*4882a593Smuzhiyun 			u16 reason_code;
196*4882a593Smuzhiyun 		}  __attribute__((packed)) deauth;
197*4882a593Smuzhiyun 		struct {
198*4882a593Smuzhiyun 			u16 capab_info;
199*4882a593Smuzhiyun 			u16 listen_interval;
200*4882a593Smuzhiyun 			/* followed by SSID and Supported rates */
201*4882a593Smuzhiyun 			u8 variable[0];
202*4882a593Smuzhiyun 		}  __attribute__((packed)) assoc_req;
203*4882a593Smuzhiyun 		struct {
204*4882a593Smuzhiyun 			u16 capab_info;
205*4882a593Smuzhiyun 			u16 status_code;
206*4882a593Smuzhiyun 			u16 aid;
207*4882a593Smuzhiyun 			/* followed by Supported rates */
208*4882a593Smuzhiyun 			u8 variable[0];
209*4882a593Smuzhiyun 		}  __attribute__((packed)) assoc_resp, reassoc_resp;
210*4882a593Smuzhiyun 		struct {
211*4882a593Smuzhiyun 			u16 capab_info;
212*4882a593Smuzhiyun 			u16 listen_interval;
213*4882a593Smuzhiyun 			u8 current_ap[6];
214*4882a593Smuzhiyun 			/* followed by SSID and Supported rates */
215*4882a593Smuzhiyun 			u8 variable[0];
216*4882a593Smuzhiyun 		}  __attribute__((packed)) reassoc_req;
217*4882a593Smuzhiyun 		struct {
218*4882a593Smuzhiyun 			u16 reason_code;
219*4882a593Smuzhiyun 		}  __attribute__((packed)) disassoc;
220*4882a593Smuzhiyun 		struct {
221*4882a593Smuzhiyun 			__le64 timestamp;
222*4882a593Smuzhiyun 			u16 beacon_int;
223*4882a593Smuzhiyun 			u16 capab_info;
224*4882a593Smuzhiyun 			/* followed by some of SSID, Supported rates,
225*4882a593Smuzhiyun 			 * FH Params, DS Params, CF Params, IBSS Params, TIM */
226*4882a593Smuzhiyun 			u8 variable[0];
227*4882a593Smuzhiyun 		}  __attribute__((packed)) beacon;
228*4882a593Smuzhiyun 		struct {
229*4882a593Smuzhiyun 			/* only variable items: SSID, Supported rates */
230*4882a593Smuzhiyun 			u8 variable[0];
231*4882a593Smuzhiyun 		}  __attribute__((packed)) probe_req;
232*4882a593Smuzhiyun 		struct {
233*4882a593Smuzhiyun 			__le64 timestamp;
234*4882a593Smuzhiyun 			u16 beacon_int;
235*4882a593Smuzhiyun 			u16 capab_info;
236*4882a593Smuzhiyun 			/* followed by some of SSID, Supported rates,
237*4882a593Smuzhiyun 			 * FH Params, DS Params, CF Params, IBSS Params */
238*4882a593Smuzhiyun 			u8 variable[0];
239*4882a593Smuzhiyun 		}  __attribute__((packed)) probe_resp;
240*4882a593Smuzhiyun 		struct {
241*4882a593Smuzhiyun 			u8 category;
242*4882a593Smuzhiyun 			union {
243*4882a593Smuzhiyun 				struct {
244*4882a593Smuzhiyun 					u8 action_code;
245*4882a593Smuzhiyun 					u8 dialog_token;
246*4882a593Smuzhiyun 					u8 status_code;
247*4882a593Smuzhiyun 					u8 variable[0];
248*4882a593Smuzhiyun 				}  __attribute__((packed)) wme_action;
249*4882a593Smuzhiyun #if 0
250*4882a593Smuzhiyun 				struct {
251*4882a593Smuzhiyun 					u8 action_code;
252*4882a593Smuzhiyun 					u8 element_id;
253*4882a593Smuzhiyun 					u8 length;
254*4882a593Smuzhiyun 					struct ieee80211_channel_sw_ie sw_elem;
255*4882a593Smuzhiyun 				}  __attribute__((packed)) chan_switch;
256*4882a593Smuzhiyun 				struct {
257*4882a593Smuzhiyun 					u8 action_code;
258*4882a593Smuzhiyun 					u8 dialog_token;
259*4882a593Smuzhiyun 					u8 element_id;
260*4882a593Smuzhiyun 					u8 length;
261*4882a593Smuzhiyun 					struct ieee80211_msrment_ie msr_elem;
262*4882a593Smuzhiyun 				}  __attribute__((packed)) measurement;
263*4882a593Smuzhiyun #endif
264*4882a593Smuzhiyun 				struct {
265*4882a593Smuzhiyun 					u8 action_code;
266*4882a593Smuzhiyun 					u8 dialog_token;
267*4882a593Smuzhiyun 					u16 capab;
268*4882a593Smuzhiyun 					u16 timeout;
269*4882a593Smuzhiyun 					u16 start_seq_num;
270*4882a593Smuzhiyun 				}  __attribute__((packed)) addba_req;
271*4882a593Smuzhiyun 				struct {
272*4882a593Smuzhiyun 					u8 action_code;
273*4882a593Smuzhiyun 					u8 dialog_token;
274*4882a593Smuzhiyun 					u16 status;
275*4882a593Smuzhiyun 					u16 capab;
276*4882a593Smuzhiyun 					u16 timeout;
277*4882a593Smuzhiyun 				}  __attribute__((packed)) addba_resp;
278*4882a593Smuzhiyun 				struct {
279*4882a593Smuzhiyun 					u8 action_code;
280*4882a593Smuzhiyun 					u16 params;
281*4882a593Smuzhiyun 					u16 reason_code;
282*4882a593Smuzhiyun 				}  __attribute__((packed)) delba;
283*4882a593Smuzhiyun 				struct {
284*4882a593Smuzhiyun 					u8 action_code;
285*4882a593Smuzhiyun 					/* capab_info for open and confirm,
286*4882a593Smuzhiyun 					 * reason for close
287*4882a593Smuzhiyun 					 */
288*4882a593Smuzhiyun 					u16 aux;
289*4882a593Smuzhiyun 					/* Followed in plink_confirm by status
290*4882a593Smuzhiyun 					 * code, AID and supported rates,
291*4882a593Smuzhiyun 					 * and directly by supported rates in
292*4882a593Smuzhiyun 					 * plink_open and plink_close
293*4882a593Smuzhiyun 					 */
294*4882a593Smuzhiyun 					u8 variable[0];
295*4882a593Smuzhiyun 				}  __attribute__((packed)) plink_action;
296*4882a593Smuzhiyun 				struct {
297*4882a593Smuzhiyun 					u8 action_code;
298*4882a593Smuzhiyun 					u8 variable[0];
299*4882a593Smuzhiyun 				}  __attribute__((packed)) mesh_action;
300*4882a593Smuzhiyun 			} __attribute__((packed)) u;
301*4882a593Smuzhiyun 		}  __attribute__((packed)) action;
302*4882a593Smuzhiyun 	} __attribute__((packed)) u;
303*4882a593Smuzhiyun } __attribute__((packed));
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun #endif
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun /* mgmt header + 1 byte category code */
308*4882a593Smuzhiyun #define IEEE80211_MIN_ACTION_SIZE FIELD_OFFSET(struct ieee80211_mgmt, u.action.u)
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun #endif
313