1/******************************************************************************
2 *
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 *
19 ******************************************************************************/
20#ifndef __IEEE80211_EXT_H
21#define __IEEE80211_EXT_H
22
23#include <osdep_service.h>
24#include <drv_types.h>
25
26#define WMM_OUI_TYPE 2
27#define WMM_OUI_SUBTYPE_INFORMATION_ELEMENT 0
28#define WMM_OUI_SUBTYPE_PARAMETER_ELEMENT 1
29#define WMM_OUI_SUBTYPE_TSPEC_ELEMENT 2
30#define WMM_VERSION 1
31
32#define WPA_PROTO_WPA BIT(0)
33#define WPA_PROTO_RSN BIT(1)
34
35#define WPA_KEY_MGMT_IEEE8021X BIT(0)
36#define WPA_KEY_MGMT_PSK BIT(1)
37#define WPA_KEY_MGMT_NONE BIT(2)
38#define WPA_KEY_MGMT_IEEE8021X_NO_WPA BIT(3)
39#define WPA_KEY_MGMT_WPA_NONE BIT(4)
40
41
42#define WPA_CAPABILITY_PREAUTH BIT(0)
43#define WPA_CAPABILITY_MGMT_FRAME_PROTECTION BIT(6)
44#define WPA_CAPABILITY_PEERKEY_ENABLED BIT(9)
45
46
47#define PMKID_LEN 16
48
49
50struct wpa_ie_hdr {
51	u8 elem_id;
52	u8 len;
53	u8 oui[4]; /* 24-bit OUI followed by 8-bit OUI type */
54	u8 version[2]; /* little endian */
55} __packed;
56
57struct rsn_ie_hdr {
58	u8 elem_id; /* WLAN_EID_RSN */
59	u8 len;
60	u8 version[2]; /* little endian */
61} __packed;
62
63struct wme_ac_parameter {
64#if defined(__LITTLE_ENDIAN)
65	/* byte 1 */
66	u8	aifsn:4,
67		acm:1,
68		aci:2,
69		reserved:1;
70
71	/* byte 2 */
72	u8	eCWmin:4,
73		eCWmax:4;
74#elif defined(__BIG_ENDIAN)
75	/* byte 1 */
76	u8	reserved:1,
77		aci:2,
78		acm:1,
79		aifsn:4;
80
81	/* byte 2 */
82	u8	eCWmax:4,
83		eCWmin:4;
84#else
85#error	"Please fix <endian.h>"
86#endif
87
88	/* bytes 3 & 4 */
89	u16 txopLimit;
90} __packed;
91
92struct wme_parameter_element {
93	/* required fields for WME version 1 */
94	u8 oui[3];
95	u8 oui_type;
96	u8 oui_subtype;
97	u8 version;
98	u8 acInfo;
99	u8 reserved;
100	struct wme_ac_parameter ac[4];
101
102} __packed;
103
104#define WPA_PUT_LE16(a, val)			\
105	do {					\
106		(a)[1] = ((u16) (val)) >> 8;	\
107		(a)[0] = ((u16) (val)) & 0xff;	\
108	} while (0)
109
110#define WPA_PUT_BE32(a, val)					\
111	do {							\
112		(a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff);	\
113		(a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff);	\
114		(a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff);	\
115		(a)[3] = (u8) (((u32) (val)) & 0xff);		\
116	} while (0)
117
118#define WPA_PUT_LE32(a, val)					\
119	do {							\
120		(a)[3] = (u8) ((((u32) (val)) >> 24) & 0xff);	\
121		(a)[2] = (u8) ((((u32) (val)) >> 16) & 0xff);	\
122		(a)[1] = (u8) ((((u32) (val)) >> 8) & 0xff);	\
123		(a)[0] = (u8) (((u32) (val)) & 0xff);		\
124	} while (0)
125
126#define RSN_SELECTOR_PUT(a, val) WPA_PUT_BE32((u8 *)(a), (val))
127
128/* Action category code */
129enum ieee80211_category {
130	WLAN_CATEGORY_SPECTRUM_MGMT = 0,
131	WLAN_CATEGORY_QOS = 1,
132	WLAN_CATEGORY_DLS = 2,
133	WLAN_CATEGORY_BACK = 3,
134	WLAN_CATEGORY_HT = 7,
135	WLAN_CATEGORY_WMM = 17,
136};
137
138/* SPECTRUM_MGMT action code */
139enum ieee80211_spectrum_mgmt_actioncode {
140	WLAN_ACTION_SPCT_MSR_REQ = 0,
141	WLAN_ACTION_SPCT_MSR_RPRT = 1,
142	WLAN_ACTION_SPCT_TPC_REQ = 2,
143	WLAN_ACTION_SPCT_TPC_RPRT = 3,
144	WLAN_ACTION_SPCT_CHL_SWITCH = 4,
145	WLAN_ACTION_SPCT_EXT_CHL_SWITCH = 5,
146};
147
148/* BACK action code */
149enum ieee80211_back_actioncode {
150	WLAN_ACTION_ADDBA_REQ = 0,
151	WLAN_ACTION_ADDBA_RESP = 1,
152	WLAN_ACTION_DELBA = 2,
153};
154
155/* HT features action code */
156enum ieee80211_ht_actioncode {
157	WLAN_ACTION_NOTIFY_CH_WIDTH = 0,
158	WLAN_ACTION_SM_PS = 1,
159	WLAN_ACTION_PSPM = 2,
160	WLAN_ACTION_PCO_PHASE = 3,
161	WLAN_ACTION_MIMO_CSI_MX = 4,
162	WLAN_ACTION_MIMO_NONCP_BF = 5,
163	WLAN_ACTION_MIMP_CP_BF = 6,
164	WLAN_ACTION_ASEL_INDICATES_FB = 7,
165	WLAN_ACTION_HI_INFO_EXCHG = 8,
166};
167
168/* BACK (block-ack) parties */
169enum ieee80211_back_parties {
170	WLAN_BACK_RECIPIENT = 0,
171	WLAN_BACK_INITIATOR = 1,
172	WLAN_BACK_TIMER = 2,
173};
174
175struct ieee80211_mgmt {
176	u16 frame_control;
177	u16 duration;
178	u8 da[6];
179	u8 sa[6];
180	u8 bssid[6];
181	u16 seq_ctrl;
182	union {
183		struct {
184			u16 auth_alg;
185			u16 auth_transaction;
186			u16 status_code;
187			/* possibly followed by Challenge text */
188			u8 variable[0];
189		}  __packed auth;
190		struct {
191			u16 reason_code;
192		}  __packed deauth;
193		struct {
194			u16 capab_info;
195			u16 listen_interval;
196			/* followed by SSID and Supported rates */
197			u8 variable[0];
198		}  __packed assoc_req;
199		struct {
200			u16 capab_info;
201			u16 status_code;
202			u16 aid;
203			/* followed by Supported rates */
204			u8 variable[0];
205		}  __packed assoc_resp, reassoc_resp;
206		struct {
207			u16 capab_info;
208			u16 listen_interval;
209			u8 current_ap[6];
210			/* followed by SSID and Supported rates */
211			u8 variable[0];
212		}  __packed reassoc_req;
213		struct {
214			u16 reason_code;
215		}  __packed disassoc;
216		struct {
217			__le64 timestamp;
218			u16 beacon_int;
219			u16 capab_info;
220			/* followed by some of SSID, Supported rates,
221			 * FH Params, DS Params, CF Params, IBSS Params, TIM */
222			u8 variable[0];
223		}  __packed beacon;
224		struct {
225			/* only variable items: SSID, Supported rates */
226			u8 variable[0];
227		}  __packed probe_req;
228		struct {
229			__le64 timestamp;
230			u16 beacon_int;
231			u16 capab_info;
232			/* followed by some of SSID, Supported rates,
233			 * FH Params, DS Params, CF Params, IBSS Params */
234			u8 variable[0];
235		}  __packed probe_resp;
236		struct {
237			u8 category;
238			union {
239				struct {
240					u8 action_code;
241					u8 dialog_token;
242					u8 status_code;
243					u8 variable[0];
244				}  __packed wme_action;
245				struct {
246					u8 action_code;
247					u8 dialog_token;
248					u16 capab;
249					u16 timeout;
250					u16 start_seq_num;
251				}  __packed addba_req;
252				struct {
253					u8 action_code;
254					u8 dialog_token;
255					u16 status;
256					u16 capab;
257					u16 timeout;
258				}  __packed addba_resp;
259				struct {
260					u8 action_code;
261					u16 params;
262					u16 reason_code;
263				}  __packed delba;
264				structi {
265					u8 action_code;
266					/* capab_info for open and confirm,
267					 * reason for close
268					 */
269					u16 aux;
270					/* Followed in plink_confirm by status
271					 * code, AID and supported rates,
272					 * and directly by supported rates in
273					 * plink_open and plink_close
274					 */
275					u8 variable[0];
276				}  __packed plink_action;
277				struct{
278					u8 action_code;
279					u8 variable[0];
280				}  __packed mesh_action;
281			} __packed u;
282		}  __packed action;
283	} __packed u;
284} __packed;
285
286/* mgmt header + 1 byte category code */
287#define IEEE80211_MIN_ACTION_SIZE				\
288	 FIELD_OFFSET(struct ieee80211_mgmt, u.action.u)
289
290#endif
291