libipw.h 27.8 KB
Newer Older
J
Jeff Garzik 已提交
1 2 3 4 5 6 7 8
/*
 * Merged with mainline ieee80211.h in Aug 2004.  Original ieee802_11
 * remains copyright by the original authors
 *
 * Portions of the merged code are based on Host AP (software wireless
 * LAN access point) driver for Intersil Prism2/2.5/3.
 *
 * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
9 10
 * <j@w1.fi>
 * Copyright (c) 2002-2003, Jouni Malinen <j@w1.fi>
J
Jeff Garzik 已提交
11 12 13
 *
 * Adaption to a generic IEEE 802.11 stack by James Ketrenos
 * <jketreno@linux.intel.com>
14
 * Copyright (c) 2004-2005, Intel Corporation
J
Jeff Garzik 已提交
15 16 17 18 19
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation. See README and COPYING for
 * more details.
20 21 22
 *
 * API Version History
 * 1.0.x -- Initial version
23
 * 1.1.x -- Added radiotap, QoS, TIM, libipw_geo APIs,
24
 *          various structure changes, and crypto API init method
J
Jeff Garzik 已提交
25
 */
26 27
#ifndef LIBIPW_H
#define LIBIPW_H
28 29
#include <linux/if_ether.h>	/* ETH_ALEN */
#include <linux/kernel.h>	/* ARRAY_SIZE */
30
#include <linux/wireless.h>
31
#include <linux/ieee80211.h>
J
Jeff Garzik 已提交
32

33
#include <net/lib80211.h>
34
#include <net/cfg80211.h>
35

36
#define LIBIPW_VERSION "git-1.1.13"
37

38
#define LIBIPW_DATA_LEN		2304
J
Jeff Garzik 已提交
39 40 41 42 43 44 45 46
/* Maximum size for the MA-UNITDATA primitive, 802.11 standard section
   6.2.1.1.2.

   The figure in section 7.1.2 suggests a body size of up to 2312
   bytes is allowed, which is a bit confusing, I suspect this
   represents the 2304 bytes of real data, plus a possible 8 bytes of
   WEP IV and ICV. (this interpretation suggested by Ramiro Barreiro) */

47 48 49 50 51 52 53
#define LIBIPW_1ADDR_LEN 10
#define LIBIPW_2ADDR_LEN 16
#define LIBIPW_3ADDR_LEN 24
#define LIBIPW_4ADDR_LEN 30
#define LIBIPW_FCS_LEN    4
#define LIBIPW_HLEN			(LIBIPW_4ADDR_LEN)
#define LIBIPW_FRAME_LEN		(LIBIPW_DATA_LEN + LIBIPW_HLEN)
J
Jeff Garzik 已提交
54 55 56 57

#define MIN_FRAG_THRESHOLD     256U
#define	MAX_FRAG_THRESHOLD     2346U

58
/* QOS control */
59
#define LIBIPW_QCTL_TID		0x000F
60

J
Jeff Garzik 已提交
61 62
/* debug macros */

H
Helmut Schaa 已提交
63
#ifdef CONFIG_LIBIPW_DEBUG
64 65 66
extern u32 libipw_debug_level;
#define LIBIPW_DEBUG(level, fmt, args...) \
do { if (libipw_debug_level & (level)) \
67
  printk(KERN_DEBUG "libipw: %c %s " fmt, \
68
         in_interrupt() ? 'I' : 'U', __func__ , ## args); } while (0)
J
Jeff Garzik 已提交
69
#else
70
#define LIBIPW_DEBUG(level, fmt, args...) do {} while (0)
H
Helmut Schaa 已提交
71
#endif				/* CONFIG_LIBIPW_DEBUG */
72

J
Jeff Garzik 已提交
73
/*
74
 * To use the debug system:
J
Jeff Garzik 已提交
75 76 77 78
 *
 * If you are defining a new debug classification, simply add it to the #define
 * list here in the form of:
 *
79
 * #define LIBIPW_DL_xxxx VALUE
J
Jeff Garzik 已提交
80 81 82 83
 *
 * shifting value to the left one bit from the previous entry.  xxxx should be
 * the name of the classification (for example, WEP)
 *
84 85
 * You then need to either add a LIBIPW_xxxx_DEBUG() macro definition for your
 * classification, or use LIBIPW_DEBUG(LIBIPW_DL_xxxx, ...) whenever you want
J
Jeff Garzik 已提交
86 87 88 89
 * to send output to that classification.
 *
 * To add your debug level to the list of levels seen when you perform
 *
90
 * % cat /proc/net/ieee80211/debug_level
J
Jeff Garzik 已提交
91
 *
92
 * you simply need to add your entry to the libipw_debug_level array.
J
Jeff Garzik 已提交
93
 *
94
 * If you do not see debug_level in /proc/net/ieee80211 then you do not have
H
Helmut Schaa 已提交
95
 * CONFIG_LIBIPW_DEBUG defined in your kernel configuration
J
Jeff Garzik 已提交
96 97 98
 *
 */

99 100 101 102 103 104 105 106 107 108 109 110
#define LIBIPW_DL_INFO          (1<<0)
#define LIBIPW_DL_WX            (1<<1)
#define LIBIPW_DL_SCAN          (1<<2)
#define LIBIPW_DL_STATE         (1<<3)
#define LIBIPW_DL_MGMT          (1<<4)
#define LIBIPW_DL_FRAG          (1<<5)
#define LIBIPW_DL_DROP          (1<<7)

#define LIBIPW_DL_TX            (1<<8)
#define LIBIPW_DL_RX            (1<<9)
#define LIBIPW_DL_QOS           (1<<31)

111 112
#define LIBIPW_ERROR(f, a...) printk(KERN_ERR "libipw: " f, ## a)
#define LIBIPW_WARNING(f, a...) printk(KERN_WARNING "libipw: " f, ## a)
113 114 115 116 117 118 119 120 121 122 123
#define LIBIPW_DEBUG_INFO(f, a...)   LIBIPW_DEBUG(LIBIPW_DL_INFO, f, ## a)

#define LIBIPW_DEBUG_WX(f, a...)     LIBIPW_DEBUG(LIBIPW_DL_WX, f, ## a)
#define LIBIPW_DEBUG_SCAN(f, a...)   LIBIPW_DEBUG(LIBIPW_DL_SCAN, f, ## a)
#define LIBIPW_DEBUG_STATE(f, a...)  LIBIPW_DEBUG(LIBIPW_DL_STATE, f, ## a)
#define LIBIPW_DEBUG_MGMT(f, a...)  LIBIPW_DEBUG(LIBIPW_DL_MGMT, f, ## a)
#define LIBIPW_DEBUG_FRAG(f, a...)  LIBIPW_DEBUG(LIBIPW_DL_FRAG, f, ## a)
#define LIBIPW_DEBUG_DROP(f, a...)  LIBIPW_DEBUG(LIBIPW_DL_DROP, f, ## a)
#define LIBIPW_DEBUG_TX(f, a...)  LIBIPW_DEBUG(LIBIPW_DL_TX, f, ## a)
#define LIBIPW_DEBUG_RX(f, a...)  LIBIPW_DEBUG(LIBIPW_DL_RX, f, ## a)
#define LIBIPW_DEBUG_QOS(f, a...)  LIBIPW_DEBUG(LIBIPW_DL_QOS, f, ## a)
J
Jeff Garzik 已提交
124
#include <linux/netdevice.h>
125
#include <linux/if_arp.h>	/* ARPHRD_ETHER */
J
Jeff Garzik 已提交
126 127

#ifndef WIRELESS_SPY
J
Jiri Benc 已提交
128
#define WIRELESS_SPY		/* enable iwspy support */
J
Jeff Garzik 已提交
129
#endif
J
Jiri Benc 已提交
130
#include <net/iw_handler.h>	/* new driver API */
J
Jeff Garzik 已提交
131

132
#define ETH_P_PREAUTH 0x88C7	/* IEEE 802.11i pre-authentication */
J
Jeff Garzik 已提交
133 134 135 136 137 138 139 140 141

#ifndef ETH_P_80211_RAW
#define ETH_P_80211_RAW (ETH_P_ECONET + 1)
#endif

/* IEEE 802.11 defines */

#define P80211_OUI_LEN 3

142
struct libipw_snap_hdr {
J
Jeff Garzik 已提交
143

144 145 146 147
	u8 dsap;		/* always 0xAA */
	u8 ssap;		/* always 0xAA */
	u8 ctrl;		/* always 0x03 */
	u8 oui[P80211_OUI_LEN];	/* organizational universal id */
J
Jeff Garzik 已提交
148

149
} __packed;
J
Jeff Garzik 已提交
150

151
#define SNAP_SIZE sizeof(struct libipw_snap_hdr)
J
Jeff Garzik 已提交
152

153
#define WLAN_FC_GET_VERS(fc) ((fc) & IEEE80211_FCTL_VERS)
J
Jeff Garzik 已提交
154 155 156 157
#define WLAN_FC_GET_TYPE(fc) ((fc) & IEEE80211_FCTL_FTYPE)
#define WLAN_FC_GET_STYPE(fc) ((fc) & IEEE80211_FCTL_STYPE)

#define WLAN_GET_SEQ_FRAG(seq) ((seq) & IEEE80211_SCTL_FRAG)
158
#define WLAN_GET_SEQ_SEQ(seq)  (((seq) & IEEE80211_SCTL_SEQ) >> 4)
J
Jeff Garzik 已提交
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
#define LIBIPW_STATMASK_SIGNAL (1<<0)
#define LIBIPW_STATMASK_RSSI (1<<1)
#define LIBIPW_STATMASK_NOISE (1<<2)
#define LIBIPW_STATMASK_RATE (1<<3)
#define LIBIPW_STATMASK_WEMASK 0x7

#define LIBIPW_CCK_MODULATION    (1<<0)
#define LIBIPW_OFDM_MODULATION   (1<<1)

#define LIBIPW_24GHZ_BAND     (1<<0)
#define LIBIPW_52GHZ_BAND     (1<<1)

#define LIBIPW_CCK_RATE_1MB		        0x02
#define LIBIPW_CCK_RATE_2MB		        0x04
#define LIBIPW_CCK_RATE_5MB		        0x0B
#define LIBIPW_CCK_RATE_11MB		        0x16
#define LIBIPW_OFDM_RATE_6MB		        0x0C
#define LIBIPW_OFDM_RATE_9MB		        0x12
#define LIBIPW_OFDM_RATE_12MB		0x18
#define LIBIPW_OFDM_RATE_18MB		0x24
#define LIBIPW_OFDM_RATE_24MB		0x30
#define LIBIPW_OFDM_RATE_36MB		0x48
#define LIBIPW_OFDM_RATE_48MB		0x60
#define LIBIPW_OFDM_RATE_54MB		0x6C
#define LIBIPW_BASIC_RATE_MASK		0x80

#define LIBIPW_CCK_RATE_1MB_MASK		(1<<0)
#define LIBIPW_CCK_RATE_2MB_MASK		(1<<1)
#define LIBIPW_CCK_RATE_5MB_MASK		(1<<2)
#define LIBIPW_CCK_RATE_11MB_MASK		(1<<3)
#define LIBIPW_OFDM_RATE_6MB_MASK		(1<<4)
#define LIBIPW_OFDM_RATE_9MB_MASK		(1<<5)
#define LIBIPW_OFDM_RATE_12MB_MASK		(1<<6)
#define LIBIPW_OFDM_RATE_18MB_MASK		(1<<7)
#define LIBIPW_OFDM_RATE_24MB_MASK		(1<<8)
#define LIBIPW_OFDM_RATE_36MB_MASK		(1<<9)
#define LIBIPW_OFDM_RATE_48MB_MASK		(1<<10)
#define LIBIPW_OFDM_RATE_54MB_MASK		(1<<11)

#define LIBIPW_CCK_RATES_MASK	        0x0000000F
#define LIBIPW_CCK_BASIC_RATES_MASK	(LIBIPW_CCK_RATE_1MB_MASK | \
	LIBIPW_CCK_RATE_2MB_MASK)
#define LIBIPW_CCK_DEFAULT_RATES_MASK	(LIBIPW_CCK_BASIC_RATES_MASK | \
        LIBIPW_CCK_RATE_5MB_MASK | \
        LIBIPW_CCK_RATE_11MB_MASK)

#define LIBIPW_OFDM_RATES_MASK		0x00000FF0
#define LIBIPW_OFDM_BASIC_RATES_MASK	(LIBIPW_OFDM_RATE_6MB_MASK | \
	LIBIPW_OFDM_RATE_12MB_MASK | \
	LIBIPW_OFDM_RATE_24MB_MASK)
#define LIBIPW_OFDM_DEFAULT_RATES_MASK	(LIBIPW_OFDM_BASIC_RATES_MASK | \
	LIBIPW_OFDM_RATE_9MB_MASK  | \
	LIBIPW_OFDM_RATE_18MB_MASK | \
	LIBIPW_OFDM_RATE_36MB_MASK | \
	LIBIPW_OFDM_RATE_48MB_MASK | \
	LIBIPW_OFDM_RATE_54MB_MASK)
#define LIBIPW_DEFAULT_RATES_MASK (LIBIPW_OFDM_DEFAULT_RATES_MASK | \
                                LIBIPW_CCK_DEFAULT_RATES_MASK)

#define LIBIPW_NUM_OFDM_RATES	    8
#define LIBIPW_NUM_CCK_RATES	            4
#define LIBIPW_OFDM_SHIFT_MASK_A         4
J
Jeff Garzik 已提交
222 223

/* NOTE: This data is for statistical purposes; not all hardware provides this
224
 *       information for frames received.
225
 *       For libipw_rx_mgt, you need to set at least the 'len' parameter.
226
 */
227
struct libipw_rx_stats {
J
Jeff Garzik 已提交
228 229 230 231
	u32 mac_time;
	s8 rssi;
	u8 signal;
	u8 noise;
232
	u16 rate;		/* in 100 kbps */
J
Jeff Garzik 已提交
233 234 235 236 237
	u8 received_channel;
	u8 control;
	u8 mask;
	u8 freq;
	u16 len;
238 239
	u64 tsf;
	u32 beacon_time;
J
Jeff Garzik 已提交
240 241 242 243 244 245
};

/* IEEE 802.11 requires that STA supports concurrent reception of at least
 * three fragmented frames. This define can be increased to support more
 * concurrent frames, but it should be noted that each entry can consume about
 * 2 kB of RAM and increasing cache size will slow down frame reassembly. */
246
#define LIBIPW_FRAG_CACHE_LEN 4
J
Jeff Garzik 已提交
247

248
struct libipw_frag_entry {
J
Jeff Garzik 已提交
249 250 251 252 253 254 255 256
	unsigned long first_frag_time;
	unsigned int seq;
	unsigned int last_frag;
	struct sk_buff *skb;
	u8 src_addr[ETH_ALEN];
	u8 dst_addr[ETH_ALEN];
};

257
struct libipw_stats {
J
Jeff Garzik 已提交
258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280
	unsigned int tx_unicast_frames;
	unsigned int tx_multicast_frames;
	unsigned int tx_fragments;
	unsigned int tx_unicast_octets;
	unsigned int tx_multicast_octets;
	unsigned int tx_deferred_transmissions;
	unsigned int tx_single_retry_frames;
	unsigned int tx_multiple_retry_frames;
	unsigned int tx_retry_limit_exceeded;
	unsigned int tx_discards;
	unsigned int rx_unicast_frames;
	unsigned int rx_multicast_frames;
	unsigned int rx_fragments;
	unsigned int rx_unicast_octets;
	unsigned int rx_multicast_octets;
	unsigned int rx_fcs_errors;
	unsigned int rx_discards_no_buffer;
	unsigned int tx_discards_wrong_sa;
	unsigned int rx_discards_undecryptable;
	unsigned int rx_message_in_msg_fragments;
	unsigned int rx_message_in_bad_msg_fragments;
};

281
struct libipw_device;
J
Jeff Garzik 已提交
282

283 284 285 286 287 288 289 290 291
#define SEC_KEY_1		(1<<0)
#define SEC_KEY_2		(1<<1)
#define SEC_KEY_3		(1<<2)
#define SEC_KEY_4		(1<<3)
#define SEC_ACTIVE_KEY		(1<<4)
#define SEC_AUTH_MODE		(1<<5)
#define SEC_UNICAST_GROUP	(1<<6)
#define SEC_LEVEL		(1<<7)
#define SEC_ENABLED		(1<<8)
292
#define SEC_ENCRYPT		(1<<9)
293 294 295 296 297 298 299

#define SEC_LEVEL_0		0	/* None */
#define SEC_LEVEL_1		1	/* WEP 40 and 104 bit */
#define SEC_LEVEL_2		2	/* Level 1 + TKIP */
#define SEC_LEVEL_2_CKIP	3	/* Level 1 + CKIP */
#define SEC_LEVEL_3		4	/* Level 2 + CCMP */

300 301 302 303 304
#define SEC_ALG_NONE		0
#define SEC_ALG_WEP		1
#define SEC_ALG_TKIP		2
#define SEC_ALG_CCMP		3

305 306 307 308
#define WEP_KEYS		4
#define WEP_KEY_LEN		13
#define SCM_KEY_LEN		32
#define SCM_TEMPORAL_KEY_LENGTH	16
J
Jeff Garzik 已提交
309

310
struct libipw_security {
311 312
	u16 active_key:2, enabled:1, unicast_uses_group:1, encrypt:1;
	u8 auth_mode;
313
	u8 encode_alg[WEP_KEYS];
J
Jeff Garzik 已提交
314
	u8 key_sizes[WEP_KEYS];
315
	u8 keys[WEP_KEYS][SCM_KEY_LEN];
J
Jeff Garzik 已提交
316 317
	u8 level;
	u16 flags;
318
} __packed;
J
Jeff Garzik 已提交
319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336

/*

 802.11 data frame from AP

      ,-------------------------------------------------------------------.
Bytes |  2   |  2   |    6    |    6    |    6    |  2   | 0..2312 |   4  |
      |------|------|---------|---------|---------|------|---------|------|
Desc. | ctrl | dura |  DA/RA  |   TA    |    SA   | Sequ |  frame  |  fcs |
      |      | tion | (BSSID) |         |         | ence |  data   |      |
      `-------------------------------------------------------------------'

Total: 28-2340 bytes

*/

#define BEACON_PROBE_SSID_ID_POSITION 12

337
struct libipw_hdr_1addr {
338 339
	__le16 frame_ctl;
	__le16 duration_id;
340 341
	u8 addr1[ETH_ALEN];
	u8 payload[0];
342
} __packed;
343

344
struct libipw_hdr_2addr {
345 346
	__le16 frame_ctl;
	__le16 duration_id;
347 348 349
	u8 addr1[ETH_ALEN];
	u8 addr2[ETH_ALEN];
	u8 payload[0];
350
} __packed;
351

352
struct libipw_hdr_3addr {
353 354
	__le16 frame_ctl;
	__le16 duration_id;
355 356 357
	u8 addr1[ETH_ALEN];
	u8 addr2[ETH_ALEN];
	u8 addr3[ETH_ALEN];
358
	__le16 seq_ctl;
359
	u8 payload[0];
360
} __packed;
361

362
struct libipw_hdr_4addr {
363 364
	__le16 frame_ctl;
	__le16 duration_id;
365 366 367
	u8 addr1[ETH_ALEN];
	u8 addr2[ETH_ALEN];
	u8 addr3[ETH_ALEN];
368
	__le16 seq_ctl;
369 370
	u8 addr4[ETH_ALEN];
	u8 payload[0];
371
} __packed;
372

373
struct libipw_hdr_3addrqos {
374 375
	__le16 frame_ctl;
	__le16 duration_id;
376 377 378
	u8 addr1[ETH_ALEN];
	u8 addr2[ETH_ALEN];
	u8 addr3[ETH_ALEN];
379
	__le16 seq_ctl;
380
	u8 payload[0];
381
	__le16 qos_ctl;
382
} __packed;
383

384
struct libipw_info_element {
J
Jeff Garzik 已提交
385 386 387
	u8 id;
	u8 len;
	u8 data[0];
388
} __packed;
J
Jeff Garzik 已提交
389 390 391 392 393 394 395 396 397 398 399 400

/*
 * These are the data types that can make up management packets
 *
	u16 auth_algorithm;
	u16 auth_sequence;
	u16 beacon_interval;
	u16 capability;
	u8 current_ap[ETH_ALEN];
	u16 listen_interval;
	struct {
		u16 association_id:14, reserved:2;
401
	} __packed;
J
Jeff Garzik 已提交
402 403 404 405 406
	u32 time_stamp[2];
	u16 reason;
	u16 status;
*/

407 408
struct libipw_auth {
	struct libipw_hdr_3addr header;
J
Jiri Benc 已提交
409 410 411
	__le16 algorithm;
	__le16 transaction;
	__le16 status;
412
	/* challenge */
413
	struct libipw_info_element info_element[0];
414
} __packed;
J
Jeff Garzik 已提交
415

416
struct libipw_channel_switch {
417 418 419 420 421
	u8 id;
	u8 len;
	u8 mode;
	u8 channel;
	u8 count;
422
} __packed;
423

424 425
struct libipw_action {
	struct libipw_hdr_3addr header;
426 427 428
	u8 category;
	u8 action;
	union {
429
		struct libipw_action_exchange {
430
			u8 token;
431
			struct libipw_info_element info_element[0];
432
		} exchange;
433
		struct libipw_channel_switch channel_switch;
434 435

	} format;
436
} __packed;
437

438 439
struct libipw_disassoc {
	struct libipw_hdr_3addr header;
440
	__le16 reason;
441
} __packed;
442

443
/* Alias deauth for disassoc */
444
#define libipw_deauth libipw_disassoc
445

446 447
struct libipw_probe_request {
	struct libipw_hdr_3addr header;
448
	/* SSID, supported rates */
449
	struct libipw_info_element info_element[0];
450
} __packed;
451

452 453
struct libipw_probe_response {
	struct libipw_hdr_3addr header;
A
Al Viro 已提交
454
	__le32 time_stamp[2];
J
Jiri Benc 已提交
455 456
	__le16 beacon_interval;
	__le16 capability;
457 458
	/* SSID, supported rates, FH params, DS params,
	 * CF params, IBSS params, TIM (if beacon), RSN */
459
	struct libipw_info_element info_element[0];
460
} __packed;
J
Jeff Garzik 已提交
461

462
/* Alias beacon for probe_response */
463
#define libipw_beacon libipw_probe_response
464

465 466
struct libipw_assoc_request {
	struct libipw_hdr_3addr header;
467 468
	__le16 capability;
	__le16 listen_interval;
469
	/* SSID, supported rates, RSN */
470
	struct libipw_info_element info_element[0];
471
} __packed;
472

473 474
struct libipw_reassoc_request {
	struct libipw_hdr_3addr header;
J
Jiri Benc 已提交
475 476
	__le16 capability;
	__le16 listen_interval;
J
Jeff Garzik 已提交
477
	u8 current_ap[ETH_ALEN];
478
	struct libipw_info_element info_element[0];
479
} __packed;
J
Jeff Garzik 已提交
480

481 482
struct libipw_assoc_response {
	struct libipw_hdr_3addr header;
J
Jiri Benc 已提交
483 484 485
	__le16 capability;
	__le16 status;
	__le16 aid;
486
	/* supported rates */
487
	struct libipw_info_element info_element[0];
488
} __packed;
J
Jeff Garzik 已提交
489

490
struct libipw_txb {
J
Jeff Garzik 已提交
491 492
	u8 nr_frags;
	u8 encrypted;
493 494
	u8 rts_included;
	u8 reserved;
A
Al Viro 已提交
495 496
	u16 frag_size;
	u16 payload_size;
J
Jeff Garzik 已提交
497 498 499
	struct sk_buff *fragments[0];
};

J
Jiri Benc 已提交
500
/* SWEEP TABLE ENTRIES NUMBER */
J
Jeff Garzik 已提交
501 502 503 504 505 506 507 508 509 510 511 512 513 514
#define MAX_SWEEP_TAB_ENTRIES		  42
#define MAX_SWEEP_TAB_ENTRIES_PER_PACKET  7
/* MAX_RATES_LENGTH needs to be 12.  The spec says 8, and many APs
 * only use 8, and then use extended rates for the remaining supported
 * rates.  Other APs, however, stick all of their supported rates on the
 * main rates information element... */
#define MAX_RATES_LENGTH                  ((u8)12)
#define MAX_RATES_EX_LENGTH               ((u8)16)
#define MAX_NETWORK_COUNT                  128

#define CRC_LENGTH                 4U

#define MAX_WPA_IE_LEN 64

515 516 517 518 519 520
#define NETWORK_HAS_OFDM       (1<<1)
#define NETWORK_HAS_CCK        (1<<2)

/* QoS structure */
#define NETWORK_HAS_QOS_PARAMETERS      (1<<3)
#define NETWORK_HAS_QOS_INFORMATION     (1<<4)
521 522 523 524 525 526 527 528 529
#define NETWORK_HAS_QOS_MASK            (NETWORK_HAS_QOS_PARAMETERS | \
					 NETWORK_HAS_QOS_INFORMATION)

/* 802.11h */
#define NETWORK_HAS_POWER_CONSTRAINT    (1<<5)
#define NETWORK_HAS_CSA                 (1<<6)
#define NETWORK_HAS_QUIET               (1<<7)
#define NETWORK_HAS_IBSS_DFS            (1<<8)
#define NETWORK_HAS_TPC_REPORT          (1<<9)
530

531 532
#define NETWORK_HAS_ERP_VALUE           (1<<10)

533 534 535 536 537 538 539 540 541
#define QOS_QUEUE_NUM                   4
#define QOS_OUI_LEN                     3
#define QOS_OUI_TYPE                    2
#define QOS_ELEMENT_ID                  221
#define QOS_OUI_INFO_SUB_TYPE           0
#define QOS_OUI_PARAM_SUB_TYPE          1
#define QOS_VERSION_1                   1
#define QOS_AIFSN_MIN_VALUE             2

542
struct libipw_qos_information_element {
543 544 545 546 547 548 549
	u8 elementID;
	u8 length;
	u8 qui[QOS_OUI_LEN];
	u8 qui_type;
	u8 qui_subtype;
	u8 version;
	u8 ac_info;
550
} __packed;
551

552
struct libipw_qos_ac_parameter {
553 554
	u8 aci_aifsn;
	u8 ecw_min_max;
555
	__le16 tx_op_limit;
556
} __packed;
557

558 559
struct libipw_qos_parameter_info {
	struct libipw_qos_information_element info_element;
560
	u8 reserved;
561
	struct libipw_qos_ac_parameter ac_params_record[QOS_QUEUE_NUM];
562
} __packed;
563

564
struct libipw_qos_parameters {
565 566
	__le16 cw_min[QOS_QUEUE_NUM];
	__le16 cw_max[QOS_QUEUE_NUM];
567 568
	u8 aifs[QOS_QUEUE_NUM];
	u8 flag[QOS_QUEUE_NUM];
569
	__le16 tx_op_limit[QOS_QUEUE_NUM];
570
} __packed;
571

572 573
struct libipw_qos_data {
	struct libipw_qos_parameters parameters;
574 575 576 577 578 579
	int active;
	int supported;
	u8 param_count;
	u8 old_param_count;
};

580
struct libipw_tim_parameters {
581 582
	u8 tim_count;
	u8 tim_period;
583
} __packed;
584 585

/*******************************************************/
J
Jeff Garzik 已提交
586

587
struct libipw_tpc_report {
588 589
	u8 transmit_power;
	u8 link_margin;
590
} __packed;
591

592
struct libipw_channel_map {
593 594
	u8 channel;
	u8 map;
595
} __packed;
596

597 598
struct libipw_ibss_dfs {
	struct libipw_info_element ie;
599 600
	u8 owner[ETH_ALEN];
	u8 recovery_interval;
601
	struct libipw_channel_map channel_map[0];
602 603
};

604
struct libipw_csa {
605 606 607
	u8 mode;
	u8 channel;
	u8 count;
608
} __packed;
609

610
struct libipw_quiet {
611 612 613 614
	u8 count;
	u8 period;
	u8 duration;
	u8 offset;
615
} __packed;
616

617
struct libipw_network {
J
Jeff Garzik 已提交
618 619 620 621 622 623 624
	/* These entries are used to identify a unique network */
	u8 bssid[ETH_ALEN];
	u8 channel;
	/* Ensure null-terminated for any debug msgs */
	u8 ssid[IW_ESSID_MAX_SIZE + 1];
	u8 ssid_len;

625
	struct libipw_qos_data qos_data;
626

J
Jeff Garzik 已提交
627
	/* These are network statistics */
628
	struct libipw_rx_stats stats;
J
Jeff Garzik 已提交
629 630 631 632 633 634 635
	u16 capability;
	u8 rates[MAX_RATES_LENGTH];
	u8 rates_len;
	u8 rates_ex[MAX_RATES_EX_LENGTH];
	u8 rates_ex_len;
	unsigned long last_scanned;
	u8 mode;
636
	u32 flags;
J
Jeff Garzik 已提交
637 638 639 640 641
	u32 last_associate;
	u32 time_stamp[2];
	u16 beacon_interval;
	u16 listen_interval;
	u16 atim_window;
642
	u8 erp_value;
J
Jeff Garzik 已提交
643 644 645 646
	u8 wpa_ie[MAX_WPA_IE_LEN];
	size_t wpa_ie_len;
	u8 rsn_ie[MAX_WPA_IE_LEN];
	size_t rsn_ie_len;
647
	struct libipw_tim_parameters tim;
648 649 650 651 652 653 654

	/* 802.11h info */

	/* Power Constraint - mandatory if spctrm mgmt required */
	u8 power_constraint;

	/* TPC Report - mandatory if spctrm mgmt required */
655
	struct libipw_tpc_report tpc_report;
656 657 658

	/* IBSS DFS - mandatory if spctrm mgmt required and IBSS
	 * NOTE: This is variable length and so must be allocated dynamically */
659
	struct libipw_ibss_dfs *ibss_dfs;
660 661

	/* Channel Switch Announcement - optional if spctrm mgmt required */
662
	struct libipw_csa csa;
663 664

	/* Quiet - optional if spctrm mgmt required */
665
	struct libipw_quiet quiet;
666

J
Jeff Garzik 已提交
667 668 669
	struct list_head list;
};

670 671 672 673 674 675 676 677
enum libipw_state {
	LIBIPW_UNINITIALIZED = 0,
	LIBIPW_INITIALIZED,
	LIBIPW_ASSOCIATING,
	LIBIPW_ASSOCIATED,
	LIBIPW_AUTHENTICATING,
	LIBIPW_AUTHENTICATED,
	LIBIPW_SHUTDOWN
J
Jeff Garzik 已提交
678 679 680 681 682
};

#define DEFAULT_MAX_SCAN_AGE (15 * HZ)
#define DEFAULT_FTS 2346

683 684 685
#define CFG_LIBIPW_RESERVE_FCS (1<<0)
#define CFG_LIBIPW_COMPUTE_FCS (1<<1)
#define CFG_LIBIPW_RTS (1<<2)
J
Jeff Garzik 已提交
686

687 688 689 690
#define LIBIPW_24GHZ_MIN_CHANNEL 1
#define LIBIPW_24GHZ_MAX_CHANNEL 14
#define LIBIPW_24GHZ_CHANNELS (LIBIPW_24GHZ_MAX_CHANNEL - \
				  LIBIPW_24GHZ_MIN_CHANNEL + 1)
691

692 693 694 695
#define LIBIPW_52GHZ_MIN_CHANNEL 34
#define LIBIPW_52GHZ_MAX_CHANNEL 165
#define LIBIPW_52GHZ_CHANNELS (LIBIPW_52GHZ_MAX_CHANNEL - \
				  LIBIPW_52GHZ_MIN_CHANNEL + 1)
696 697

enum {
698 699 700 701 702 703 704
	LIBIPW_CH_PASSIVE_ONLY = (1 << 0),
	LIBIPW_CH_80211H_RULES = (1 << 1),
	LIBIPW_CH_B_ONLY = (1 << 2),
	LIBIPW_CH_NO_IBSS = (1 << 3),
	LIBIPW_CH_UNIFORM_SPREADING = (1 << 4),
	LIBIPW_CH_RADAR_DETECT = (1 << 5),
	LIBIPW_CH_INVALID = (1 << 6),
705 706
};

707
struct libipw_channel {
708
	u32 freq;	/* in MHz */
709 710
	u8 channel;
	u8 flags;
711
	u8 max_power;	/* in dBm */
712 713
};

714
struct libipw_geo {
715 716 717
	u8 name[4];
	u8 bg_channels;
	u8 a_channels;
718 719
	struct libipw_channel bg[LIBIPW_24GHZ_CHANNELS];
	struct libipw_channel a[LIBIPW_52GHZ_CHANNELS];
720 721
};

722
struct libipw_device {
J
Jeff Garzik 已提交
723
	struct net_device *dev;
724
	struct wireless_dev wdev;
725
	struct libipw_security sec;
J
Jeff Garzik 已提交
726 727

	/* Bookkeeping structures */
728
	struct libipw_stats ieee_stats;
J
Jeff Garzik 已提交
729

730
	struct libipw_geo geo;
731 732
	struct ieee80211_supported_band bg_band;
	struct ieee80211_supported_band a_band;
733

J
Jeff Garzik 已提交
734 735 736
	/* Probe / Beacon management */
	struct list_head network_free_list;
	struct list_head network_list;
737
	struct libipw_network *networks[MAX_NETWORK_COUNT];
J
Jeff Garzik 已提交
738 739 740
	int scans;
	int scan_age;

741 742
	int iw_mode;		/* operating mode (IW_MODE_*) */
	struct iw_spy_data spy_data;	/* iwspy support */
J
Jeff Garzik 已提交
743 744 745

	spinlock_t lock;

746 747
	int tx_headroom;	/* Set to size of any additional room needed at front
				 * of allocated Tx SKBs */
J
Jeff Garzik 已提交
748 749 750
	u32 config;

	/* WEP and other encryption related settings at the device level */
751
	int open_wep;		/* Set to 1 to allow unencrypted frames */
J
Jeff Garzik 已提交
752 753 754

	/* If the host performs {en,de}cryption, then set to 1 */
	int host_encrypt;
755
	int host_encrypt_msdu;
J
Jeff Garzik 已提交
756
	int host_decrypt;
757 758 759
	/* host performs multicast decryption */
	int host_mc_decrypt;

760 761 762 763
	/* host should strip IV and ICV from protected frames */
	/* meaningful only when hardware decryption is being used */
	int host_strip_iv_icv;

764
	int host_open_frag;
765
	int ieee802_1x;		/* is IEEE 802.1X used */
J
Jeff Garzik 已提交
766 767 768 769 770 771 772 773

	/* WPA data */
	int wpa_enabled;
	int drop_unencrypted;
	int privacy_invoked;
	size_t wpa_ie_len;
	u8 *wpa_ie;

774
	struct lib80211_crypt_info crypt_info;
J
Jeff Garzik 已提交
775

776 777
	int bcrx_sta_key;	/* use individual keys to override default keys even
				 * with RX of broad/multicast frames */
J
Jeff Garzik 已提交
778 779

	/* Fragmentation structures */
780
	struct libipw_frag_entry frag_cache[LIBIPW_FRAG_CACHE_LEN];
J
Jeff Garzik 已提交
781
	unsigned int frag_next_idx;
782
	u16 fts;		/* Fragmentation Threshold */
783
	u16 rts;		/* RTS threshold */
J
Jeff Garzik 已提交
784 785 786 787

	/* Association info */
	u8 bssid[ETH_ALEN];

788
	enum libipw_state state;
J
Jeff Garzik 已提交
789

790 791 792
	int mode;		/* A, B, G */
	int modulation;		/* CCK, OFDM */
	int freq_band;		/* 2.4Ghz, 5.2Ghz, Mixed */
793
	int abg_true;		/* ABG flag              */
J
Jeff Garzik 已提交
794

795 796 797
	int perfect_rssi;
	int worst_rssi;

798 799
	u16 prev_seq_ctl;	/* used to drop duplicate frames */

J
Jeff Garzik 已提交
800
	/* Callback functions */
801
	void (*set_security) (struct net_device * dev,
802
			      struct libipw_security * sec);
803 804
	netdev_tx_t (*hard_start_xmit) (struct libipw_txb * txb,
					struct net_device * dev, int pri);
805 806
	int (*is_queue_full) (struct net_device * dev, int pri);

807
	int (*handle_management) (struct net_device * dev,
808
				  struct libipw_network * network, u16 type);
809
	int (*is_qos_active) (struct net_device *dev, struct sk_buff *skb);
810

811 812
	/* Typical STA methods */
	int (*handle_auth) (struct net_device * dev,
813
			    struct libipw_auth * auth);
814
	int (*handle_deauth) (struct net_device * dev,
815
			      struct libipw_deauth * auth);
816
	int (*handle_action) (struct net_device * dev,
817 818
			      struct libipw_action * action,
			      struct libipw_rx_stats * stats);
819
	int (*handle_disassoc) (struct net_device * dev,
820
				struct libipw_disassoc * assoc);
821
	int (*handle_beacon) (struct net_device * dev,
822 823
			      struct libipw_beacon * beacon,
			      struct libipw_network * network);
824
	int (*handle_probe_response) (struct net_device * dev,
825 826
				      struct libipw_probe_response * resp,
				      struct libipw_network * network);
827
	int (*handle_probe_request) (struct net_device * dev,
828 829
				     struct libipw_probe_request * req,
				     struct libipw_rx_stats * stats);
830
	int (*handle_assoc_response) (struct net_device * dev,
831 832
				      struct libipw_assoc_response * resp,
				      struct libipw_network * network);
833 834 835 836

	/* Typical AP methods */
	int (*handle_assoc_request) (struct net_device * dev);
	int (*handle_reassoc_request) (struct net_device * dev,
837
				       struct libipw_reassoc_request * req);
J
Jeff Garzik 已提交
838 839

	/* This must be the last item so that it points to the data
840
	 * allocated beyond this structure by alloc_libipw */
J
Jeff Garzik 已提交
841 842 843 844 845 846 847 848
	u8 priv[0];
};

#define IEEE_A            (1<<0)
#define IEEE_B            (1<<1)
#define IEEE_G            (1<<2)
#define IEEE_MODE_MASK    (IEEE_A|IEEE_B|IEEE_G)

849
static inline void *libipw_priv(struct net_device *dev)
J
Jeff Garzik 已提交
850
{
851
	return ((struct libipw_device *)netdev_priv(dev))->priv;
J
Jeff Garzik 已提交
852 853
}

854
static inline int libipw_is_valid_mode(struct libipw_device *ieee,
855
					  int mode)
J
Jeff Garzik 已提交
856 857 858 859 860 861 862 863
{
	/*
	 * It is possible for both access points and our device to support
	 * combinations of modes, so as long as there is one valid combination
	 * of ap/device supported modes, then return success
	 *
	 */
	if ((mode & IEEE_A) &&
864 865
	    (ieee->modulation & LIBIPW_OFDM_MODULATION) &&
	    (ieee->freq_band & LIBIPW_52GHZ_BAND))
J
Jeff Garzik 已提交
866 867 868
		return 1;

	if ((mode & IEEE_G) &&
869 870
	    (ieee->modulation & LIBIPW_OFDM_MODULATION) &&
	    (ieee->freq_band & LIBIPW_24GHZ_BAND))
J
Jeff Garzik 已提交
871 872 873
		return 1;

	if ((mode & IEEE_B) &&
874 875
	    (ieee->modulation & LIBIPW_CCK_MODULATION) &&
	    (ieee->freq_band & LIBIPW_24GHZ_BAND))
J
Jeff Garzik 已提交
876 877 878 879 880
		return 1;

	return 0;
}

881
static inline int libipw_get_hdrlen(u16 fc)
J
Jeff Garzik 已提交
882
{
883
	int hdrlen = LIBIPW_3ADDR_LEN;
884
	u16 stype = WLAN_FC_GET_STYPE(fc);
J
Jeff Garzik 已提交
885 886 887 888

	switch (WLAN_FC_GET_TYPE(fc)) {
	case IEEE80211_FTYPE_DATA:
		if ((fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS))
889
			hdrlen = LIBIPW_4ADDR_LEN;
890 891
		if (stype & IEEE80211_STYPE_QOS_DATA)
			hdrlen += 2;
J
Jeff Garzik 已提交
892 893 894 895 896
		break;
	case IEEE80211_FTYPE_CTL:
		switch (WLAN_FC_GET_STYPE(fc)) {
		case IEEE80211_STYPE_CTS:
		case IEEE80211_STYPE_ACK:
897
			hdrlen = LIBIPW_1ADDR_LEN;
J
Jeff Garzik 已提交
898 899
			break;
		default:
900
			hdrlen = LIBIPW_2ADDR_LEN;
J
Jeff Garzik 已提交
901 902 903 904 905 906 907 908
			break;
		}
		break;
	}

	return hdrlen;
}

909
static inline u8 *libipw_get_payload(struct ieee80211_hdr *hdr)
910
{
911 912 913 914 915 916 917 918 919
	switch (libipw_get_hdrlen(le16_to_cpu(hdr->frame_control))) {
	case LIBIPW_1ADDR_LEN:
		return ((struct libipw_hdr_1addr *)hdr)->payload;
	case LIBIPW_2ADDR_LEN:
		return ((struct libipw_hdr_2addr *)hdr)->payload;
	case LIBIPW_3ADDR_LEN:
		return ((struct libipw_hdr_3addr *)hdr)->payload;
	case LIBIPW_4ADDR_LEN:
		return ((struct libipw_hdr_4addr *)hdr)->payload;
920
	}
921
	return NULL;
922 923
}

924
static inline int libipw_is_ofdm_rate(u8 rate)
925
{
926 927 928 929 930 931 932 933 934
	switch (rate & ~LIBIPW_BASIC_RATE_MASK) {
	case LIBIPW_OFDM_RATE_6MB:
	case LIBIPW_OFDM_RATE_9MB:
	case LIBIPW_OFDM_RATE_12MB:
	case LIBIPW_OFDM_RATE_18MB:
	case LIBIPW_OFDM_RATE_24MB:
	case LIBIPW_OFDM_RATE_36MB:
	case LIBIPW_OFDM_RATE_48MB:
	case LIBIPW_OFDM_RATE_54MB:
935 936 937 938 939
		return 1;
	}
	return 0;
}

940
static inline int libipw_is_cck_rate(u8 rate)
941
{
942 943 944 945 946
	switch (rate & ~LIBIPW_BASIC_RATE_MASK) {
	case LIBIPW_CCK_RATE_1MB:
	case LIBIPW_CCK_RATE_2MB:
	case LIBIPW_CCK_RATE_5MB:
	case LIBIPW_CCK_RATE_11MB:
947 948 949 950 951
		return 1;
	}
	return 0;
}

952 953 954
/* libipw.c */
extern void free_libipw(struct net_device *dev, int monitor);
extern struct net_device *alloc_libipw(int sizeof_priv, int monitor);
955
extern int libipw_change_mtu(struct net_device *dev, int new_mtu);
J
Jeff Garzik 已提交
956

957
extern void libipw_networks_age(struct libipw_device *ieee,
958 959
				   unsigned long age_secs);

960
extern int libipw_set_encryption(struct libipw_device *ieee);
J
Jeff Garzik 已提交
961

962
/* libipw_tx.c */
963 964
extern netdev_tx_t libipw_xmit(struct sk_buff *skb,
			       struct net_device *dev);
965
extern void libipw_txb_free(struct libipw_txb *);
J
Jeff Garzik 已提交
966

967 968 969 970 971
/* libipw_rx.c */
extern void libipw_rx_any(struct libipw_device *ieee,
		     struct sk_buff *skb, struct libipw_rx_stats *stats);
extern int libipw_rx(struct libipw_device *ieee, struct sk_buff *skb,
			struct libipw_rx_stats *rx_stats);
972
/* make sure to set stats->len */
973 974 975 976
extern void libipw_rx_mgt(struct libipw_device *ieee,
			     struct libipw_hdr_4addr *header,
			     struct libipw_rx_stats *stats);
extern void libipw_network_reset(struct libipw_network *network);
J
Jeff Garzik 已提交
977

978 979
/* libipw_geo.c */
extern const struct libipw_geo *libipw_get_geo(struct libipw_device
980
						     *ieee);
981 982
extern int libipw_set_geo(struct libipw_device *ieee,
			     const struct libipw_geo *geo);
983

984
extern int libipw_is_valid_channel(struct libipw_device *ieee,
985
				      u8 channel);
986
extern int libipw_channel_to_index(struct libipw_device *ieee,
987
				      u8 channel);
988 989
extern u8 libipw_freq_to_channel(struct libipw_device *ieee, u32 freq);
extern u8 libipw_get_channel_flags(struct libipw_device *ieee,
990
				      u8 channel);
991 992
extern const struct libipw_channel *libipw_get_channel(struct
							     libipw_device
993
							     *ieee, u8 channel);
994
extern u32 libipw_channel_to_freq(struct libipw_device * ieee,
995
				      u8 channel);
996

997 998
/* libipw_wx.c */
extern int libipw_wx_get_scan(struct libipw_device *ieee,
J
Jeff Garzik 已提交
999 1000
				 struct iw_request_info *info,
				 union iwreq_data *wrqu, char *key);
1001
extern int libipw_wx_set_encode(struct libipw_device *ieee,
J
Jeff Garzik 已提交
1002 1003
				   struct iw_request_info *info,
				   union iwreq_data *wrqu, char *key);
1004
extern int libipw_wx_get_encode(struct libipw_device *ieee,
J
Jeff Garzik 已提交
1005 1006
				   struct iw_request_info *info,
				   union iwreq_data *wrqu, char *key);
1007
extern int libipw_wx_set_encodeext(struct libipw_device *ieee,
1008 1009
				      struct iw_request_info *info,
				      union iwreq_data *wrqu, char *extra);
1010
extern int libipw_wx_get_encodeext(struct libipw_device *ieee,
1011 1012
				      struct iw_request_info *info,
				      union iwreq_data *wrqu, char *extra);
J
Jeff Garzik 已提交
1013

1014
static inline void libipw_increment_scans(struct libipw_device *ieee)
J
Jeff Garzik 已提交
1015 1016 1017 1018
{
	ieee->scans++;
}

1019
static inline int libipw_get_scans(struct libipw_device *ieee)
J
Jeff Garzik 已提交
1020 1021 1022 1023
{
	return ieee->scans;
}

1024
#endif				/* LIBIPW_H */