1/*
2 * WPA Supplicant - driver_ralink exported functions
3 * Copyright (c) 2003-2005, Jouni Malinen <j@w1.fi>
4 * Copyright (c) 2007, Snowpin Lee <snowpin_lee@ralinktech.com.tw>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 * Alternatively, this software may be distributed under the terms of BSD
11 * license.
12 *
13 * See README and COPYING for more details.
14 */
15
16// Ralink defined OIDs
17#if WIRELESS_EXT <= 11
18#ifndef SIOCDEVPRIVATE
19#define SIOCDEVPRIVATE                              0x8BE0
20#endif
21#define SIOCIWFIRSTPRIV								SIOCDEVPRIVATE
22#endif
23
24#define RT_PRIV_IOCTL								(SIOCIWFIRSTPRIV + 0x0E)
25#define RTPRIV_IOCTL_SET							(SIOCIWFIRSTPRIV + 0x02)
26
27// IEEE 802.11 OIDs  &  Ralink defined OIDs  ******
28
29// (RaConfig Set/QueryInform) ==>
30#define OID_GET_SET_TOGGLE							0x8000
31
32#define OID_802_11_ADD_WEP                          0x0112
33#define OID_802_11_REMOVE_WEP                       0x0113
34#define OID_802_11_DISASSOCIATE                     0x0114
35#define OID_802_11_PRIVACY_FILTER                   0x0118
36#define OID_802_11_ASSOCIATION_INFORMATION          0x011E
37#define OID_802_11_BSSID_LIST_SCAN                  0x0508
38#define OID_802_11_SSID                             0x0509
39#define OID_802_11_BSSID                            0x050A
40#define OID_802_11_WEP_STATUS                       0x0510
41#define OID_802_11_AUTHENTICATION_MODE              0x0511
42#define OID_802_11_INFRASTRUCTURE_MODE              0x0512
43#define OID_802_11_TX_POWER_LEVEL                   0x0517
44#define OID_802_11_REMOVE_KEY                       0x0519
45#define OID_802_11_ADD_KEY                          0x0520
46#define OID_802_11_DEAUTHENTICATION                 0x0526
47#define OID_802_11_DROP_UNENCRYPTED                 0x0527
48#define OID_802_11_BSSID_LIST                       0x0609
49#define OID_802_3_CURRENT_ADDRESS                   0x060A
50#define OID_SET_COUNTERMEASURES                     0x0616
51#define OID_802_11_SET_IEEE8021X                    0x0617	// For IEEE8021x mode
52#define OID_802_11_SET_IEEE8021X_REQUIRE_KEY        0x0618  // For DynamicWEP in IEEE802.1x mode
53#define OID_802_11_PMKID                            0x0620
54#define RT_OID_WPA_SUPPLICANT_SUPPORT               0x0621  // for trigger driver enable/disable wpa_supplicant support
55#define RT_OID_WE_VERSION_COMPILED                  0x0622
56#define RT_OID_NEW_DRIVER                           0x0623
57
58#define PACKED  __attribute__ ((packed))
59
60//wpa_supplicant event flags
61#define	RT_ASSOC_EVENT_FLAG                         0x0101
62#define	RT_DISASSOC_EVENT_FLAG                      0x0102
63#define	RT_REQIE_EVENT_FLAG                         0x0103
64#define	RT_RESPIE_EVENT_FLAG                        0x0104
65#define	RT_ASSOCINFO_EVENT_FLAG                     0x0105
66#define RT_PMKIDCAND_FLAG                           0x0106
67#define RT_INTERFACE_DOWN                           0x0107
68#define RT_REPORT_AP_INFO                           0x0108
69
70//
71// IEEE 802.11 Structures and definitions
72//
73// new types for Media Specific Indications
74
75#ifndef ULONG
76#define CHAR            char
77#define INT             int
78#define SHORT           int
79#define UINT            u32
80#undef  ULONG
81//#define ULONG           u32
82#define ULONG           unsigned long /* 32-bit in 32-bit CPU or 64-bit in 64-bit CPU */
83#define USHORT          unsigned short
84#define UCHAR           unsigned char
85
86#define uint32		u32
87#define uint8		u8
88
89
90#define BOOLEAN         u8
91//#define LARGE_INTEGER s64
92#define VOID            void
93#define LONG            long
94#define LONGLONG        s64
95#define ULONGLONG       u64
96typedef VOID            *PVOID;
97typedef CHAR            *PCHAR;
98typedef UCHAR           *PUCHAR;
99typedef USHORT          *PUSHORT;
100typedef LONG            *PLONG;
101typedef ULONG           *PULONG;
102
103typedef union _LARGE_INTEGER {
104    struct {
105        ULONG LowPart;
106        LONG HighPart;
107    }vv;
108    struct {
109        ULONG LowPart;
110        LONG HighPart;
111    } u;
112    s64 QuadPart;
113} LARGE_INTEGER;
114
115#endif
116
117#define NDIS_802_11_LENGTH_SSID         32
118#define NDIS_802_11_LENGTH_RATES        8
119#define NDIS_802_11_LENGTH_RATES_EX     16
120#define MAX_LEN_OF_SSID                 32
121#define MAC_ADDR_LEN                    6
122
123typedef UCHAR   NDIS_802_11_MAC_ADDRESS[6];
124
125// mask for authentication/integrity fields
126#define NDIS_802_11_AUTH_REQUEST_AUTH_FIELDS        0x0f
127
128#define NDIS_802_11_AUTH_REQUEST_REAUTH             0x01
129#define NDIS_802_11_AUTH_REQUEST_KEYUPDATE          0x02
130#define NDIS_802_11_AUTH_REQUEST_PAIRWISE_ERROR     0x06
131#define NDIS_802_11_AUTH_REQUEST_GROUP_ERROR        0x0E
132
133// Added new types for OFDM 5G and 2.4G
134typedef enum _NDIS_802_11_NETWORK_TYPE
135{
136    Ndis802_11FH,
137    Ndis802_11DS,
138    Ndis802_11OFDM5,
139    Ndis802_11OFDM24,
140    Ndis802_11Automode,
141    Ndis802_11NetworkTypeMax    // not a real type, defined as an upper bound
142} NDIS_802_11_NETWORK_TYPE, *PNDIS_802_11_NETWORK_TYPE;
143
144//
145// Received Signal Strength Indication
146//
147typedef LONG    NDIS_802_11_RSSI;           // in dBm
148
149typedef struct _NDIS_802_11_CONFIGURATION_FH
150{
151   ULONG           Length;            // Length of structure
152   ULONG           HopPattern;        // As defined by 802.11, MSB set
153   ULONG           HopSet;            // to one if non-802.11
154   ULONG           DwellTime;         // units are Kusec
155} NDIS_802_11_CONFIGURATION_FH, *PNDIS_802_11_CONFIGURATION_FH;
156
157typedef struct _NDIS_802_11_CONFIGURATION
158{
159   ULONG                           Length;             // Length of structure
160   ULONG                           BeaconPeriod;       // units are Kusec
161   ULONG                           ATIMWindow;         // units are Kusec
162   ULONG                           DSConfig;           // Frequency, units are kHz
163   NDIS_802_11_CONFIGURATION_FH    FHConfig;
164} NDIS_802_11_CONFIGURATION, *PNDIS_802_11_CONFIGURATION;
165
166typedef  ULONG  NDIS_802_11_KEY_INDEX;
167typedef ULONGLONG   NDIS_802_11_KEY_RSC;
168
169// Key mapping keys require a BSSID
170typedef struct _NDIS_802_11_KEY
171{
172    UINT           Length;             // Length of this structure
173    UINT           KeyIndex;
174    UINT           KeyLength;          // length of key in bytes
175    NDIS_802_11_MAC_ADDRESS BSSID;
176    NDIS_802_11_KEY_RSC KeyRSC;
177    UCHAR           KeyMaterial[1];     // variable length depending on above field
178} NDIS_802_11_KEY, *PNDIS_802_11_KEY;
179
180typedef struct _NDIS_802_11_REMOVE_KEY
181{
182    UINT                   Length;        // Length of this structure
183    UINT                   KeyIndex;
184    NDIS_802_11_MAC_ADDRESS BSSID;
185} NDIS_802_11_REMOVE_KEY, *PNDIS_802_11_REMOVE_KEY;
186
187typedef struct PACKED _NDIS_802_11_WEP
188{
189   UINT     Length;        // Length of this structure
190   UINT           KeyIndex;           // 0 is the per-client key, 1-N are the
191                                        // global keys
192   UINT     KeyLength;     // length of key in bytes
193   UCHAR     KeyMaterial[1];// variable length depending on above field
194} NDIS_802_11_WEP, *PNDIS_802_11_WEP;
195
196
197typedef enum _NDIS_802_11_NETWORK_INFRASTRUCTURE
198{
199   Ndis802_11IBSS,
200   Ndis802_11Infrastructure,
201   Ndis802_11AutoUnknown,
202   Ndis802_11InfrastructureMax     // Not a real value, defined as upper bound
203} NDIS_802_11_NETWORK_INFRASTRUCTURE, *PNDIS_802_11_NETWORK_INFRASTRUCTURE;
204
205// PMKID Structures
206typedef UCHAR   NDIS_802_11_PMKID_VALUE[16];
207
208typedef struct _BSSID_INFO
209{
210	NDIS_802_11_MAC_ADDRESS BSSID;
211	NDIS_802_11_PMKID_VALUE PMKID;
212} BSSID_INFO, *PBSSID_INFO;
213
214typedef struct _NDIS_802_11_PMKID
215{
216	ULONG Length;
217	ULONG BSSIDInfoCount;
218	BSSID_INFO BSSIDInfo[1];
219} NDIS_802_11_PMKID, *PNDIS_802_11_PMKID;
220
221//Added new types for PMKID Candidate lists.
222typedef struct _PMKID_CANDIDATE {
223	NDIS_802_11_MAC_ADDRESS BSSID;
224	ULONG Flags;
225} PMKID_CANDIDATE, *PPMKID_CANDIDATE;
226
227typedef struct _NDIS_802_11_PMKID_CANDIDATE_LIST
228{
229	ULONG Version;       // Version of the structure
230	ULONG NumCandidates; // No. of pmkid candidates
231	PMKID_CANDIDATE CandidateList[1];
232} NDIS_802_11_PMKID_CANDIDATE_LIST, *PNDIS_802_11_PMKID_CANDIDATE_LIST;
233
234//Flags for PMKID Candidate list structure
235#define NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED	0x01
236
237// Add new authentication modes
238typedef enum _NDIS_802_11_AUTHENTICATION_MODE
239{
240   Ndis802_11AuthModeOpen,
241   Ndis802_11AuthModeShared,
242   Ndis802_11AuthModeAutoSwitch,
243   Ndis802_11AuthModeWPA,
244   Ndis802_11AuthModeWPAPSK,
245   Ndis802_11AuthModeWPANone,
246   Ndis802_11AuthModeWPA2,
247   Ndis802_11AuthModeWPA2PSK,
248   Ndis802_11AuthModeMax           // Not a real mode, defined as upper bound
249} NDIS_802_11_AUTHENTICATION_MODE, *PNDIS_802_11_AUTHENTICATION_MODE;
250
251typedef UCHAR  NDIS_802_11_RATES[NDIS_802_11_LENGTH_RATES];        // Set of 8 data rates
252typedef UCHAR  NDIS_802_11_RATES_EX[NDIS_802_11_LENGTH_RATES_EX];  // Set of 16 data rates
253
254typedef struct PACKED _NDIS_802_11_SSID
255{
256    INT   SsidLength;         // length of SSID field below, in bytes;
257                                // this can be zero.
258    UCHAR   Ssid[NDIS_802_11_LENGTH_SSID];           // SSID information field
259} NDIS_802_11_SSID, *PNDIS_802_11_SSID;
260
261
262typedef struct PACKED _NDIS_WLAN_BSSID
263{
264   ULONG                               Length;     // Length of this structure
265   NDIS_802_11_MAC_ADDRESS             MacAddress; // BSSID
266   UCHAR                               Reserved[2];
267   NDIS_802_11_SSID                    Ssid;       // SSID
268   ULONG                               Privacy;    // WEP encryption requirement
269    NDIS_802_11_RSSI                    Rssi;               // receive signal
270                                                            // strength in dBm
271   NDIS_802_11_NETWORK_TYPE            NetworkTypeInUse;
272   NDIS_802_11_CONFIGURATION           Configuration;
273   NDIS_802_11_NETWORK_INFRASTRUCTURE  InfrastructureMode;
274   NDIS_802_11_RATES                   SupportedRates;
275} NDIS_WLAN_BSSID, *PNDIS_WLAN_BSSID;
276
277typedef struct PACKED _NDIS_802_11_BSSID_LIST
278{
279   UINT             NumberOfItems;      // in list below, at least 1
280   NDIS_WLAN_BSSID Bssid[1];
281} NDIS_802_11_BSSID_LIST, *PNDIS_802_11_BSSID_LIST;
282
283// Added Capabilities, IELength and IEs for each BSSID
284typedef struct PACKED _NDIS_WLAN_BSSID_EX
285{
286    ULONG                               Length;             // Length of this structure
287    NDIS_802_11_MAC_ADDRESS             MacAddress;         // BSSID
288    UCHAR                               Reserved[2];
289    NDIS_802_11_SSID                    Ssid;               // SSID
290    UINT                                Privacy;            // WEP encryption requirement
291    NDIS_802_11_RSSI                    Rssi;               // receive signal
292                                                            // strength in dBm
293    NDIS_802_11_NETWORK_TYPE            NetworkTypeInUse;
294    NDIS_802_11_CONFIGURATION           Configuration;
295    NDIS_802_11_NETWORK_INFRASTRUCTURE  InfrastructureMode;
296    NDIS_802_11_RATES_EX                SupportedRates;
297    ULONG                               IELength;
298    UCHAR                               IEs[1];
299} NDIS_WLAN_BSSID_EX, *PNDIS_WLAN_BSSID_EX;
300
301typedef struct PACKED _NDIS_802_11_BSSID_LIST_EX
302{
303    UINT                   NumberOfItems;      // in list below, at least 1
304    NDIS_WLAN_BSSID_EX      Bssid[1];
305} NDIS_802_11_BSSID_LIST_EX, *PNDIS_802_11_BSSID_LIST_EX;
306
307typedef struct PACKED _NDIS_802_11_FIXED_IEs
308{
309    UCHAR Timestamp[8];
310    USHORT BeaconInterval;
311    USHORT Capabilities;
312} NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs;
313
314// Added new encryption types
315// Also aliased typedef to new name
316typedef enum _NDIS_802_11_WEP_STATUS
317{
318   Ndis802_11WEPEnabled,
319   Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled,
320   Ndis802_11WEPDisabled,
321   Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled,
322   Ndis802_11WEPKeyAbsent,
323   Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent,
324   Ndis802_11WEPNotSupported,
325   Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported,
326   Ndis802_11Encryption2Enabled,
327   Ndis802_11Encryption2KeyAbsent,
328   Ndis802_11Encryption3Enabled,
329   Ndis802_11Encryption3KeyAbsent
330} NDIS_802_11_WEP_STATUS, *PNDIS_802_11_WEP_STATUS,
331  NDIS_802_11_ENCRYPTION_STATUS, *PNDIS_802_11_ENCRYPTION_STATUS;
332
333typedef enum _NDIS_802_11_RELOAD_DEFAULTS
334{
335   Ndis802_11ReloadWEPKeys
336} NDIS_802_11_RELOAD_DEFAULTS, *PNDIS_802_11_RELOAD_DEFAULTS;
337
338#define NDIS_802_11_AI_REQFI_CAPABILITIES      1
339#define NDIS_802_11_AI_REQFI_LISTENINTERVAL    2
340#define NDIS_802_11_AI_REQFI_CURRENTAPADDRESS  4
341
342#define NDIS_802_11_AI_RESFI_CAPABILITIES      1
343#define NDIS_802_11_AI_RESFI_STATUSCODE        2
344#define NDIS_802_11_AI_RESFI_ASSOCIATIONID     4
345
346typedef struct _NDIS_802_11_AI_REQFI
347{
348    USHORT Capabilities;
349    USHORT ListenInterval;
350    NDIS_802_11_MAC_ADDRESS  CurrentAPAddress;
351} NDIS_802_11_AI_REQFI, *PNDIS_802_11_AI_REQFI;
352
353typedef struct _NDIS_802_11_AI_RESFI
354{
355    USHORT Capabilities;
356    USHORT StatusCode;
357    USHORT AssociationId;
358} NDIS_802_11_AI_RESFI, *PNDIS_802_11_AI_RESFI;
359
360typedef struct _NDIS_802_11_ASSOCIATION_INFORMATION
361{
362    ULONG                   Length;
363    USHORT                  AvailableRequestFixedIEs;
364    NDIS_802_11_AI_REQFI    RequestFixedIEs;
365    ULONG                   RequestIELength;
366    ULONG                   OffsetRequestIEs;
367    USHORT                  AvailableResponseFixedIEs;
368    NDIS_802_11_AI_RESFI    ResponseFixedIEs;
369    ULONG                   ResponseIELength;
370    ULONG                   OffsetResponseIEs;
371} NDIS_802_11_ASSOCIATION_INFORMATION, *PNDIS_802_11_ASSOCIATION_INFORMATION;
372
373struct ndis_pmkid_entry {
374	struct ndis_pmkid_entry *next;
375	u8 bssid[ETH_ALEN];
376	u8 pmkid[16];
377};
378
379typedef struct _MLME_DEAUTH_REQ_STRUCT {
380    UCHAR        Addr[MAC_ADDR_LEN];
381    USHORT       Reason;
382} MLME_DEAUTH_REQ_STRUCT, *PMLME_DEAUTH_REQ_STRUCT;
383