diff options
author | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2007-06-30 13:33:23 +0000 |
---|---|---|
committer | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2007-06-30 13:33:23 +0000 |
commit | 22eab0b03806b8704f2fd3c4dc48c4559765c069 (patch) | |
tree | e72466ade9502bd513b1af41e0c92d6d66bb0197 /package/wlcompat | |
parent | e69556dc02d2bf92bd435a592fd10de19855e772 (diff) |
update wlcompat for new ioctl interface (fixes #1357)
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@7795 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/wlcompat')
-rw-r--r-- | package/wlcompat/Makefile | 2 | ||||
-rw-r--r-- | package/wlcompat/src/include/bcmdefs.h | 106 | ||||
-rw-r--r-- | package/wlcompat/src/include/bcmnvram.h | 148 | ||||
-rw-r--r-- | package/wlcompat/src/include/bcmutils.h | 313 | ||||
-rw-r--r-- | package/wlcompat/src/include/cy_conf.h | 69 | ||||
-rw-r--r-- | package/wlcompat/src/include/epivers.h | 69 | ||||
-rw-r--r-- | package/wlcompat/src/include/proto/802.11.h | 1210 | ||||
-rw-r--r-- | package/wlcompat/src/include/proto/bcmeth.h | 101 | ||||
-rw-r--r-- | package/wlcompat/src/include/proto/bcmevent.h | 152 | ||||
-rw-r--r-- | package/wlcompat/src/include/proto/ethernet.h | 118 | ||||
-rw-r--r-- | package/wlcompat/src/include/proto/wpa.h | 148 | ||||
-rw-r--r-- | package/wlcompat/src/include/shutils.h | 200 | ||||
-rw-r--r-- | package/wlcompat/src/include/typedefs.h | 139 | ||||
-rw-r--r-- | package/wlcompat/src/include/utils.h | 131 | ||||
-rw-r--r-- | package/wlcompat/src/include/wlioctl.h | 1352 | ||||
-rw-r--r-- | package/wlcompat/src/include/wlutils.h | 77 | ||||
-rw-r--r-- | package/wlcompat/src/wlcompat.c | 544 |
17 files changed, 2742 insertions, 2137 deletions
diff --git a/package/wlcompat/Makefile b/package/wlcompat/Makefile index 02ad5469c..1870c99d0 100644 --- a/package/wlcompat/Makefile +++ b/package/wlcompat/Makefile @@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=kmod-wlcompat -PKG_RELEASE:=4 +PKG_RELEASE:=5 PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME) diff --git a/package/wlcompat/src/include/bcmdefs.h b/package/wlcompat/src/include/bcmdefs.h new file mode 100644 index 000000000..8b5abe5d2 --- /dev/null +++ b/package/wlcompat/src/include/bcmdefs.h @@ -0,0 +1,106 @@ +/* + * Misc system wide definitions + * + * Copyright 2006, Broadcom Corporation + * All Rights Reserved. + * + * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY + * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM + * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. + * $Id: bcmdefs.h,v 1.1.1.3 2006/04/08 06:13:39 honor Exp $ + */ + +#ifndef _bcmdefs_h_ +#define _bcmdefs_h_ + +/* + * One doesn't need to include this file explicitly, gets included automatically if + * typedefs.h is included. + */ + +/* Reclaiming text and data : + * The following macros specify special linker sections that can be reclaimed + * after a system is considered 'up'. + */ +#if defined(__GNUC__) && defined(BCMRECLAIM) +extern bool bcmreclaimed; +#define BCMINITDATA(_data) __attribute__ ((__section__ (".dataini." #_data))) _data +#define BCMINITFN(_fn) __attribute__ ((__section__ (".textini." #_fn))) _fn +#else /* #if defined(__GNUC__) && defined(BCMRECLAIM) */ +#define BCMINITDATA(_data) _data +#define BCMINITFN(_fn) _fn +#define bcmreclaimed 0 +#endif /* #if defined(__GNUC__) && defined(BCMRECLAIM) */ + +/* Reclaim uninit functions if BCMNODOWN is defined */ +/* and if they are not already removed by -gc-sections */ +#ifdef BCMNODOWN +#define BCMUNINITFN(_fn) BCMINITFN(_fn) +#else +#define BCMUNINITFN(_fn) _fn +#endif + +#ifdef BCMRECLAIM +#define CONST +#else +#define CONST const +#endif /* BCMRECLAIM */ + +/* Compatibility with old-style BCMRECLAIM */ +#define BCMINIT(_id) _id + + +/* Put some library data/code into ROM to reduce RAM requirements */ +#if defined(__GNUC__) && defined(BCMROMOFFLOAD) +#define BCMROMDATA(_data) __attribute__ ((__section__ (".datarom." #_data))) _data +#define BCMROMFN(_fn) __attribute__ ((__section__ (".textrom." #_fn))) _fn +#else +#define BCMROMDATA(_data) _data +#define BCMROMFN(_fn) _fn +#endif + +/* Bus types */ +#define SB_BUS 0 /* Silicon Backplane */ +#define PCI_BUS 1 /* PCI target */ +#define PCMCIA_BUS 2 /* PCMCIA target */ +#define SDIO_BUS 3 /* SDIO target */ +#define JTAG_BUS 4 /* JTAG */ +#define NO_BUS 0xFF /* Bus that does not support R/W REG */ + +/* Allows optimization for single-bus support */ +#ifdef BCMBUSTYPE +#define BUSTYPE(bus) (BCMBUSTYPE) +#else +#define BUSTYPE(bus) (bus) +#endif + +/* Defines for DMA Address Width - Shared between OSL and HNDDMA */ +#define DMADDR_MASK_32 0x0 /* Address mask for 32-bits */ +#define DMADDR_MASK_30 0xc0000000 /* Address mask for 30-bits */ +#define DMADDR_MASK_0 0xffffffff /* Address mask for 0-bits (hi-part) */ + +#define DMADDRWIDTH_30 30 /* 30-bit addressing capability */ +#define DMADDRWIDTH_32 32 /* 32-bit addressing capability */ +#define DMADDRWIDTH_63 63 /* 64-bit addressing capability */ +#define DMADDRWIDTH_64 64 /* 64-bit addressing capability */ + +/* packet headroom necessary to accomodate the largest header in the system, (i.e TXOFF). + * By doing, we avoid the need to allocate an extra buffer for the header when bridging to WL. + * There is a compile time check in wlc.c which ensure that this value is at least as big + * as TXOFF. This value is used in dma_rxfill (hnddma.c). + */ +#define BCMEXTRAHDROOM 160 + +/* Headroom required for dongle-to-host communication. Packets allocated + * locally in the dongle (e.g. for CDC ioctls or RNDIS messages) should + * leave this much room in front for low-level message headers which may + * be needed to get across the dongle bus to the host. (These messages + * don't go over the network, so room for the full WL header above would + * be a waste.) + */ +#define BCMDONGLEHDRSZ 8 + + + +#endif /* _bcmdefs_h_ */ diff --git a/package/wlcompat/src/include/bcmnvram.h b/package/wlcompat/src/include/bcmnvram.h deleted file mode 100644 index 3c452634e..000000000 --- a/package/wlcompat/src/include/bcmnvram.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - * NVRAM variable manipulation - * - * Copyright 2004, Broadcom Corporation - * All Rights Reserved. - * - * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY - * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM - * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. - * - * $Id$ - */ - -#ifndef _bcmnvram_h_ -#define _bcmnvram_h_ - -#ifndef _LANGUAGE_ASSEMBLY - -#include <typedefs.h> - -struct nvram_header { - uint32 magic; - uint32 len; - uint32 crc_ver_init; /* 0:7 crc, 8:15 ver, 16:27 init, mem. test 28, 29-31 reserved */ - uint32 config_refresh; /* 0:15 config, 16:31 refresh */ - uint32 config_ncdl; /* ncdl values for memc */ -}; - -struct nvram_tuple { - char *name; - char *value; - struct nvram_tuple *next; -}; - -/* - * Initialize NVRAM access. May be unnecessary or undefined on certain - * platforms. - */ -extern int nvram_init(void *sbh); - -/* - * Disable NVRAM access. May be unnecessary or undefined on certain - * platforms. - */ -extern void nvram_exit(void); - -/* - * Get the value of an NVRAM variable. The pointer returned may be - * invalid after a set. - * @param name name of variable to get - * @return value of variable or NULL if undefined - */ -extern char * nvram_get(const char *name); - -/* - * Get the value of an NVRAM variable. - * @param name name of variable to get - * @return value of variable or NUL if undefined - */ -#define nvram_safe_get(name) (nvram_get(name) ? : "") - -#define nvram_safe_unset(name) ({ \ - if(nvram_get(name)) \ - nvram_unset(name); \ -}) - -#define nvram_safe_set(name, value) ({ \ - if(!nvram_get(name) || strcmp(nvram_get(name), value)) \ - nvram_set(name, value); \ -}) - -/* - * Match an NVRAM variable. - * @param name name of variable to match - * @param match value to compare against value of variable - * @return TRUE if variable is defined and its value is string equal - * to match or FALSE otherwise - */ -static INLINE int -nvram_match(char *name, char *match) { - const char *value = nvram_get(name); - return (value && !strcmp(value, match)); -} - -/* - * Inversely match an NVRAM variable. - * @param name name of variable to match - * @param match value to compare against value of variable - * @return TRUE if variable is defined and its value is not string - * equal to invmatch or FALSE otherwise - */ -static INLINE int -nvram_invmatch(char *name, char *invmatch) { - const char *value = nvram_get(name); - return (value && strcmp(value, invmatch)); -} - -/* - * Set the value of an NVRAM variable. The name and value strings are - * copied into private storage. Pointers to previously set values - * may become invalid. The new value may be immediately - * retrieved but will not be permanently stored until a commit. - * @param name name of variable to set - * @param value value of variable - * @return 0 on success and errno on failure - */ -extern int nvram_set(const char *name, const char *value); - -/* - * Unset an NVRAM variable. Pointers to previously set values - * remain valid until a set. - * @param name name of variable to unset - * @return 0 on success and errno on failure - * NOTE: use nvram_commit to commit this change to flash. - */ -extern int nvram_unset(const char *name); - -/* - * Commit NVRAM variables to permanent storage. All pointers to values - * may be invalid after a commit. - * NVRAM values are undefined after a commit. - * @return 0 on success and errno on failure - */ -extern int nvram_commit(void); - -/* - * Get all NVRAM variables (format name=value\0 ... \0\0). - * @param buf buffer to store variables - * @param count size of buffer in bytes - * @return 0 on success and errno on failure - */ -extern int nvram_getall(char *buf, int count); - -extern int file2nvram(char *filename, char *varname); -extern int nvram2file(char *varname, char *filename); - -#endif /* _LANGUAGE_ASSEMBLY */ - -#define NVRAM_MAGIC 0x48534C46 /* 'FLSH' */ -#define NVRAM_VERSION 1 -#define NVRAM_HEADER_SIZE 20 -#define NVRAM_SPACE 0x8000 -#define FLASH_BASE 0xbfc00000 /* Extif core */ -#define FLASH_MIN 0x00100000 /* Minimum flash size */ -#define FLASH_MAX 0x00400000 /* Maximum flash size with extif */ - -#endif /* _bcmnvram_h_ */ diff --git a/package/wlcompat/src/include/bcmutils.h b/package/wlcompat/src/include/bcmutils.h index 05ad41d9d..0286e7c9c 100644 --- a/package/wlcompat/src/include/bcmutils.h +++ b/package/wlcompat/src/include/bcmutils.h @@ -1,7 +1,7 @@ /* * Misc useful os-independent macros and functions. * - * Copyright 2004, Broadcom Corporation + * Copyright 2006, Broadcom Corporation * All Rights Reserved. * * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY @@ -14,83 +14,157 @@ #ifndef _bcmutils_h_ #define _bcmutils_h_ +/* ** driver/apps-shared section ** */ + +#define BCME_STRLEN 64 /* Max string length for BCM errors */ +#define VALID_BCMERROR(e) ((e <= 0) && (e >= BCME_LAST)) + + +/* + * error codes could be added but the defined ones shouldn't be changed/deleted + * these error codes are exposed to the user code + * when ever a new error code is added to this list + * please update errorstring table with the related error string and + * update osl files with os specific errorcode map +*/ + +#define BCME_OK 0 /* Success */ +#define BCME_ERROR -1 /* Error generic */ +#define BCME_BADARG -2 /* Bad Argument */ +#define BCME_BADOPTION -3 /* Bad option */ +#define BCME_NOTUP -4 /* Not up */ +#define BCME_NOTDOWN -5 /* Not down */ +#define BCME_NOTAP -6 /* Not AP */ +#define BCME_NOTSTA -7 /* Not STA */ +#define BCME_BADKEYIDX -8 /* BAD Key Index */ +#define BCME_RADIOOFF -9 /* Radio Off */ +#define BCME_NOTBANDLOCKED -10 /* Not band locked */ +#define BCME_NOCLK -11 /* No Clock */ +#define BCME_BADRATESET -12 /* BAD Rate valueset */ +#define BCME_BADBAND -13 /* BAD Band */ +#define BCME_BUFTOOSHORT -14 /* Buffer too short */ +#define BCME_BUFTOOLONG -15 /* Buffer too long */ +#define BCME_BUSY -16 /* Busy */ +#define BCME_NOTASSOCIATED -17 /* Not Associated */ +#define BCME_BADSSIDLEN -18 /* Bad SSID len */ +#define BCME_OUTOFRANGECHAN -19 /* Out of Range Channel */ +#define BCME_BADCHAN -20 /* Bad Channel */ +#define BCME_BADADDR -21 /* Bad Address */ +#define BCME_NORESOURCE -22 /* Not Enough Resources */ +#define BCME_UNSUPPORTED -23 /* Unsupported */ +#define BCME_BADLEN -24 /* Bad length */ +#define BCME_NOTREADY -25 /* Not Ready */ +#define BCME_EPERM -26 /* Not Permitted */ +#define BCME_NOMEM -27 /* No Memory */ +#define BCME_ASSOCIATED -28 /* Associated */ +#define BCME_RANGE -29 /* Not In Range */ +#define BCME_NOTFOUND -30 /* Not Found */ +#define BCME_WME_NOT_ENABLED -31 /* WME Not Enabled */ +#define BCME_TSPEC_NOTFOUND -32 /* TSPEC Not Found */ +#define BCME_ACM_NOTSUPPORTED -33 /* ACM Not Supported */ +#define BCME_NOT_WME_ASSOCIATION -34 /* Not WME Association */ +#define BCME_SDIO_ERROR -35 /* SDIO Bus Error */ +#define BCME_DONGLE_DOWN -36 /* Dongle Not Accessible */ +#define BCME_LAST BCME_DONGLE_DOWN + +/* These are collection of BCME Error strings */ +#define BCMERRSTRINGTABLE { \ + "OK", \ + "Undefined error", \ + "Bad Argument", \ + "Bad Option", \ + "Not up", \ + "Not down", \ + "Not AP", \ + "Not STA", \ + "Bad Key Index", \ + "Radio Off", \ + "Not band locked", \ + "No clock", \ + "Bad Rate valueset", \ + "Bad Band", \ + "Buffer too short", \ + "Buffer too long", \ + "Busy", \ + "Not Associated", \ + "Bad SSID len", \ + "Out of Range Channel", \ + "Bad Channel", \ + "Bad Address", \ + "Not Enough Resources", \ + "Unsupported", \ + "Bad length", \ + "Not Ready", \ + "Not Permitted", \ + "No Memory", \ + "Associated", \ + "Not In Range", \ + "Not Found", \ + "WME Not Enabled", \ + "TSPEC Not Found", \ + "ACM Not Supported", \ + "Not WME Association", \ + "SDIO Bus Error", \ + "Dongle Not Accessible" \ +} + +#ifndef ABS +#define ABS(a) (((a) < 0)?-(a):(a)) +#endif /* ABS */ + #ifndef MIN -#define MIN(a, b) (((a)<(b))?(a):(b)) -#endif +#define MIN(a, b) (((a) < (b))?(a):(b)) +#endif /* MIN */ #ifndef MAX -#define MAX(a, b) (((a)>(b))?(a):(b)) -#endif +#define MAX(a, b) (((a) > (b))?(a):(b)) +#endif /* MAX */ #define CEIL(x, y) (((x) + ((y)-1)) / (y)) -#define ROUNDUP(x, y) ((((ulong)(x)+((y)-1))/(y))*(y)) -#define ISALIGNED(a, x) (((uint)(a) & ((x)-1)) == 0) -#define ISPOWEROF2(x) ((((x)-1)&(x))==0) -#define OFFSETOF(type, member) ((uint) &((type *)0)->member) +#define ROUNDUP(x, y) ((((x)+((y)-1))/(y))*(y)) +#define ISALIGNED(a, x) (((a) & ((x)-1)) == 0) +#define ISPOWEROF2(x) ((((x)-1)&(x)) == 0) +#define VALID_MASK(mask) !((mask) & ((mask) + 1)) +#define OFFSETOF(type, member) ((uint)(uintptr)&((type *)0)->member) #define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0])) /* bit map related macros */ #ifndef setbit +#ifndef NBBY /* the BSD family defines NBBY */ #define NBBY 8 /* 8 bits per byte */ -#define setbit(a,i) ((a)[(i)/NBBY] |= 1<<((i)%NBBY)) -#define clrbit(a,i) ((a)[(i)/NBBY] &= ~(1<<((i)%NBBY))) -#define isset(a,i) ((a)[(i)/NBBY] & (1<<((i)%NBBY))) -#define isclr(a,i) (((a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0) -#endif - -#define NBITS(type) (sizeof (type) * 8) - -#define _BCM_U 0x01 /* upper */ -#define _BCM_L 0x02 /* lower */ -#define _BCM_D 0x04 /* digit */ -#define _BCM_C 0x08 /* cntrl */ -#define _BCM_P 0x10 /* punct */ -#define _BCM_S 0x20 /* white space (space/lf/tab) */ -#define _BCM_X 0x40 /* hex digit */ -#define _BCM_SP 0x80 /* hard space (0x20) */ - -extern unsigned char bcm_ctype[]; -#define bcm_ismask(x) (bcm_ctype[(int)(unsigned char)(x)]) - -#define bcm_isalnum(c) ((bcm_ismask(c)&(_BCM_U|_BCM_L|_BCM_D)) != 0) -#define bcm_isalpha(c) ((bcm_ismask(c)&(_BCM_U|_BCM_L)) != 0) -#define bcm_iscntrl(c) ((bcm_ismask(c)&(_BCM_C)) != 0) -#define bcm_isdigit(c) ((bcm_ismask(c)&(_BCM_D)) != 0) -#define bcm_isgraph(c) ((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D)) != 0) -#define bcm_islower(c) ((bcm_ismask(c)&(_BCM_L)) != 0) -#define bcm_isprint(c) ((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D|_BCM_SP)) != 0) -#define bcm_ispunct(c) ((bcm_ismask(c)&(_BCM_P)) != 0) -#define bcm_isspace(c) ((bcm_ismask(c)&(_BCM_S)) != 0) -#define bcm_isupper(c) ((bcm_ismask(c)&(_BCM_U)) != 0) -#define bcm_isxdigit(c) ((bcm_ismask(c)&(_BCM_D|_BCM_X)) != 0) +#endif /* #ifndef NBBY */ +#define setbit(a, i) (((uint8 *)a)[(i)/NBBY] |= 1<<((i)%NBBY)) +#define clrbit(a, i) (((uint8 *)a)[(i)/NBBY] &= ~(1<<((i)%NBBY))) +#define isset(a, i) (((uint8 *)a)[(i)/NBBY] & (1<<((i)%NBBY))) +#define isclr(a, i) ((((uint8 *)a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0) +#endif /* setbit */ -/* - * Spin at most 'us' microseconds while 'exp' is true. - * Caller should explicitly test 'exp' when this completes - * and take appropriate error action if 'exp' is still true. - */ -#define SPINWAIT(exp, us) { \ - uint countdown = (us) + 9; \ - while ((exp) && (countdown >= 10)) {\ - OSL_DELAY(10); \ - countdown -= 10; \ - } \ -} +#define NBITS(type) (sizeof(type) * 8) +#define NBITVAL(nbits) (1 << (nbits)) +#define MAXBITVAL(nbits) ((1 << (nbits)) - 1) +#define NBITMASK(nbits) MAXBITVAL(nbits) +#define MAXNBVAL(nbyte) MAXBITVAL((nbyte) * 8) + +/* basic mux operation - can be optimized on several architectures */ +#define MUX(pred, true, false) ((pred) ? (true) : (false)) + +/* modulo inc/dec - assumes x E [0, bound - 1] */ +#define MODDEC(x, bound) MUX((x) == 0, (bound) - 1, (x) - 1) +#define MODINC(x, bound) MUX((x) == (bound) - 1, 0, (x) + 1) -/* generic osl packet queue */ -struct pktq { - void *head; /* first packet to dequeue */ - void *tail; /* last packet to dequeue */ - uint len; /* number of queued packets */ - uint maxlen; /* maximum number of queued packets */ - bool priority; /* enqueue by packet priority */ -}; -#define DEFAULT_QLEN 128 - -#define pktq_len(q) ((q)->len) -#define pktq_avail(q) ((q)->maxlen - (q)->len) -#define pktq_head(q) ((q)->head) -#define pktq_full(q) ((q)->len >= (q)->maxlen) +/* modulo inc/dec, bound = 2^k */ +#define MODDEC_POW2(x, bound) (((x) - 1) & ((bound) - 1)) +#define MODINC_POW2(x, bound) (((x) + 1) & ((bound) - 1)) + +/* modulo add/sub - assumes x, y E [0, bound - 1] */ +#define MODADD(x, y, bound) \ + MUX((x) + (y) >= (bound), (x) + (y) - (bound), (x) + (y)) +#define MODSUB(x, y, bound) \ + MUX(((int)(x)) - ((int)(y)) < 0, (x) - (y) + (bound), (x) - (y)) + +/* module add/sub, bound = 2^k */ +#define MODADD_POW2(x, y, bound) (((x) + (y)) & ((bound) - 1)) +#define MODSUB_POW2(x, y, bound) (((x) - (y)) & ((bound) - 1)) /* crc defines */ #define CRC8_INIT_VALUE 0xff /* Initial CRC8 checksum value */ @@ -100,6 +174,12 @@ struct pktq { #define CRC32_INIT_VALUE 0xffffffff /* Initial CRC32 checksum value */ #define CRC32_GOOD_VALUE 0xdebb20e3 /* Good final CRC32 checksum value */ +/* bcm_format_flags() bit description structure */ +typedef struct bcm_bit_desc { + uint32 bit; + char* name; +} bcm_bit_desc_t; + /* tag_ID/length/value_buffer tuple */ typedef struct bcm_tlv { uint8 id; @@ -108,50 +188,71 @@ typedef struct bcm_tlv { } bcm_tlv_t; /* Check that bcm_tlv_t fits into the given buflen */ -#define bcm_valid_tlv(elt, buflen) ((buflen) >= 2 && (buflen) >= 2 + (elt)->len) +#define bcm_valid_tlv(elt, buflen) ((buflen) >= 2 && (int)(buflen) >= (int)(2 + (elt)->len)) /* buffer length for ethernet address from bcm_ether_ntoa() */ -#define ETHER_ADDR_STR_LEN 18 +#define ETHER_ADDR_STR_LEN 18 /* 18-bytes of Ethernet address buffer length */ -/* -* load 32-bit value from unaligned byte array -*/ +/* unaligned load and store macros */ #ifdef IL_BIGENDIAN -#define load32_ua(a) ((((uint8 *)(a))[0] << 24) + (((uint8 *)(a))[1] << 16) + \ - (((uint8 *)(a))[2] << 8) + ((uint8 *)(a))[3]) +static INLINE uint32 +load32_ua(uint8 *a) +{ + return ((a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3]); +} + +static INLINE void +store32_ua(uint8 *a, uint32 v) +{ + a[0] = (v >> 24) & 0xff; + a[1] = (v >> 16) & 0xff; + a[2] = (v >> 8) & 0xff; + a[3] = v & 0xff; +} + +static INLINE uint16 +load16_ua(uint8 *a) +{ + return ((a[0] << 8) | a[1]); +} + +static INLINE void +store16_ua(uint8 *a, uint16 v) +{ + a[0] = (v >> 8) & 0xff; + a[1] = v & 0xff; +} + #else -#define load32_ua(a) ((((uint8 *)(a))[3] << 24) + (((uint8 *)(a))[2] << 16) + \ - (((uint8 *)(a))[1] << 8) + ((uint8 *)(a))[0]) -#endif - -/* externs */ -extern uint bcm_atoi(char *s); -extern uchar bcm_toupper(uchar c); -extern ulong bcm_strtoul(char *cp, char **endp, uint base); -extern void deadbeef(char *p, uint len); -extern void prhex(char *msg, uchar *buf, uint len); -extern void prpkt(char *msg, void *drv, void *p0); -extern uint pktcopy(void *drv, void *p, uint offset, int len, uchar *buf); -extern uint pkttotlen(void *drv, void *); -extern uchar *bcm_ether_ntoa(char *ea, char *buf); -extern int bcm_ether_atoe(char *p, char *ea); -extern void bcm_mdelay(uint ms); -extern char *getvar(char *vars, char *name); -extern int getintvar(char *vars, char *name); -extern char *bcmstrstr(char *haystack, char *needle); - -extern uint8 crc8(uint8 *p, uint nbytes, uint8 crc); -extern uint16 crc16(uint8 *p, uint nbytes, uint16 crc); -extern uint32 crc32(uint8 *p, uint nbytes, uint32 crc); -extern bcm_tlv_t *bcm_next_tlv(bcm_tlv_t *elt, int *buflen); -extern bcm_tlv_t *bcm_parse_tlvs(void *buf, int buflen, uint key); -extern bcm_tlv_t *bcm_parse_ordered_tlvs(void *buf, int buflen, uint key); -extern void pktq_init(struct pktq *q, uint maxlen, bool priority); -extern bool pktenq(struct pktq *q, void *p, bool lifo); -extern void *pktdeq(struct pktq *q); - -#define bcmlog(fmt, a1, a2) -#define bcmdumplog(buf, size) *buf = '\0' -#define bcmdumplogent(buf, idx) -1 + +static INLINE uint32 +load32_ua(uint8 *a) +{ + return ((a[3] << 24) | (a[2] << 16) | (a[1] << 8) | a[0]); +} + +static INLINE void +store32_ua(uint8 *a, uint32 v) +{ + a[3] = (v >> 24) & 0xff; + a[2] = (v >> 16) & 0xff; + a[1] = (v >> 8) & 0xff; + a[0] = v & 0xff; +} + +static INLINE uint16 +load16_ua(uint8 *a) +{ + return ((a[1] << 8) | a[0]); +} + +static INLINE void +store16_ua(uint8 *a, uint16 v) +{ + a[1] = (v >> 8) & 0xff; + a[0] = v & 0xff; +} + +#endif /* IL_BIGENDIAN */ #endif /* _bcmutils_h_ */ diff --git a/package/wlcompat/src/include/cy_conf.h b/package/wlcompat/src/include/cy_conf.h deleted file mode 100644 index dbe387b83..000000000 --- a/package/wlcompat/src/include/cy_conf.h +++ /dev/null @@ -1,69 +0,0 @@ - -#define DNSMASQ_SUPPORT 1 -#define CONFIG_DNSMASQ y -#define UDHCPD_SUPPORT 1 -#define CONFIG_UDHCPD y -#define UDHCPC_SUPPORT 1 -#define CONFIG_UDHCPC y -#define PPPOE_SUPPORT 1 -#define CONFIG_PPPOE y -#define PPTP_SUPPORT 1 -#define CONFIG_PPTP y -#define L2TP_SUPPORT 1 -#define CONFIG_L2TP y -#define PPPD_SUPPORT 1 -#define CONFIG_PPPD y -#define ZEBRA_SUPPORT 1 -#define CONFIG_ZEBRA y -#define TFTPD_SUPPORT 1 -#define CONFIG_TFTPD y -#define DDNS_SUPPORT 1 -#define CONFIG_DDNS y -#define CRON_SUPPORT 1 -#define CONFIG_CRON y -#define HTTPD_SUPPORT 1 -#define CONFIG_HTTPD y -#define GET_POST_SUPPORT 1 -#define CONFIG_GET_POST y - -#if 1 -#define HEARTBEAT_SUPPORT 1 -#define CONFIG_HEARTBEAT y -#define MULTICAST_SUPPORT 1 -#define CONFIG_MULTICAST y -#define SETUP_WIZARD_SUPPORT 1 -#define CONFIG_SETUP_WIZARD y -#define PARENTAL_CONTROL_SUPPORT 1 -#define CONFIG_PARENTAL_CONTROL y -#define HTTPS_SUPPORT 1 -#define CONFIG_HTTPS y -#define EOU_SUPPORT 1 -#define CONFIG_EOU y -#define EZC_SUPPORT 1 -#define CONFIG_EZC y -#define WRITE_MAC_SUPPORT 1 -#define CONFIG_WRITE_MAC y -#define DIAG_SUPPORT 1 -#define CONFIG_DIAG y -#endif - -#define SPEED_BOOSTER_SUPPORT 1 -#define CONFIG_SPEED_BOOSTER y -#define XBOX_SUPPORT 1 -#define CONFIG_XBOX y - -#if 0 -#define MPPPOE_SUPPORT 1 -#define CONFIG_MPPPOE y -#define UNNUMBERIP_SUPPORT 1 -#define CONFIG_UNNUMBERIP y -#endif - -#define WL_STA_SUPPORT 1 -#define CONFIG_WL_STA y -#define BACKUP_RESTORE_SUPPORT 1 -#define CONFIG_BACKUP_RESTORE y -#define PORT_TRIGGER_SUPPORT 1 -#define CONFIG_PORT_TRIGGER y -#define HW_QOS_SUPPORT 1 -#define CONFIG_HW_QOS y diff --git a/package/wlcompat/src/include/epivers.h b/package/wlcompat/src/include/epivers.h deleted file mode 100644 index e174fb50d..000000000 --- a/package/wlcompat/src/include/epivers.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2004, Broadcom Corporation - * All Rights Reserved. - * - * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY - * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM - * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. - * - * $Id$ - * -*/ - -#ifndef _epivers_h_ -#define _epivers_h_ - -#ifdef linux -#include <linux/config.h> -#endif - -/* Vendor Name, ASCII, 32 chars max */ -#ifdef COMPANYNAME -#define HPNA_VENDOR COMPANYNAME -#else -#define HPNA_VENDOR "Broadcom Corporation" -#endif - -/* Driver Date, ASCII, 32 chars max */ -#define HPNA_DRV_BUILD_DATE __DATE__ - -/* Hardware Manufacture Date, ASCII, 32 chars max */ -#define HPNA_HW_MFG_DATE "Not Specified" - -/* See documentation for Device Type values, 32 values max */ -#ifndef HPNA_DEV_TYPE - -#if defined(CONFIG_BRCM_VJ) -#define HPNA_DEV_TYPE { CDCF_V0_DEVICE_DISPLAY } - -#elif defined(CONFIG_BCRM_93725) -#define HPNA_DEV_TYPE { CDCF_V0_DEVICE_CM_BRIDGE, CDCF_V0_DEVICE_DISPLAY } - -#else -#define HPNA_DEV_TYPE { CDCF_V0_DEVICE_PCINIC } - -#endif - -#endif /* !HPNA_DEV_TYPE */ - - -#define EPI_MAJOR_VERSION 3 - -#define EPI_MINOR_VERSION 60 - -#define EPI_RC_NUMBER 13 - -#define EPI_INCREMENTAL_NUMBER 0 - -#define EPI_BUILD_NUMBER 0 - -#define EPI_VERSION 3,60,13,0 - -#define EPI_VERSION_NUM 0x033c0d00 - -/* Driver Version String, ASCII, 32 chars max */ -#define EPI_VERSION_STR "3.60.13.0" -#define EPI_ROUTER_VERSION_STR "3.61.13.0" - -#endif /* _epivers_h_ */ diff --git a/package/wlcompat/src/include/proto/802.11.h b/package/wlcompat/src/include/proto/802.11.h index ea57850ce..0557722e2 100644 --- a/package/wlcompat/src/include/proto/802.11.h +++ b/package/wlcompat/src/include/proto/802.11.h @@ -1,13 +1,13 @@ /* - * Copyright 2004, Broadcom Corporation - * All Rights Reserved. - * - * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY - * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM - * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. + * Copyright 2006, Broadcom Corporation + * All Rights Reserved. + * + * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY + * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM + * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. * - * Fundamental types and constants relating to 802.11 + * Fundamental types and constants relating to 802.11 * * $Id$ */ @@ -23,79 +23,81 @@ #include <proto/ethernet.h> #endif -/* enable structure packing */ -#if !defined(__GNUC__) -#pragma pack(1) -#endif +#include <proto/wpa.h> -/* some platforms require stronger medicine */ +/* enable structure packing */ #if defined(__GNUC__) #define PACKED __attribute__((packed)) #else +#pragma pack(1) #define PACKED #endif - #define DOT11_TU_TO_US 1024 /* 802.11 Time Unit is 1024 microseconds */ /* Generic 802.11 frame constants */ -#define DOT11_A3_HDR_LEN 24 -#define DOT11_A4_HDR_LEN 30 -#define DOT11_MAC_HDR_LEN DOT11_A3_HDR_LEN -#define DOT11_FCS_LEN 4 -#define DOT11_ICV_LEN 4 -#define DOT11_ICV_AES_LEN 8 -#define DOT11_QOS_LEN 2 - -#define DOT11_KEY_INDEX_SHIFT 6 -#define DOT11_IV_LEN 4 -#define DOT11_IV_TKIP_LEN 8 -#define DOT11_IV_AES_OCB_LEN 4 -#define DOT11_IV_AES_CCM_LEN 8 +#define DOT11_A3_HDR_LEN 24 /* d11 header length with A3 */ +#define DOT11_A4_HDR_LEN 30 /* d11 header length with A4 */ +#define DOT11_MAC_HDR_LEN DOT11_A3_HDR_LEN /* MAC header length */ +#define DOT11_FCS_LEN 4 /* d11 FCS length */ +#define DOT11_ICV_LEN 4 /* d11 ICV length */ +#define DOT11_ICV_AES_LEN 8 /* d11 ICV/AES length */ +#define DOT11_QOS_LEN 2 /* d11 QoS length */ +#define DOT11_HTC_LEN 4 /* d11 HT Control field length */ + +#define DOT11_KEY_INDEX_SHIFT 6 /* d11 key index shift */ +#define DOT11_IV_LEN 4 /* d11 IV length */ +#define DOT11_IV_TKIP_LEN 8 /* d11 IV TKIP length */ +#define DOT11_IV_AES_OCB_LEN 4 /* d11 IV/AES/OCB length */ +#define DOT11_IV_AES_CCM_LEN 8 /* d11 IV/AES/CCM length */ +#define DOT11_IV_MAX_LEN 8 /* maximum iv len for any encryption */ /* Includes MIC */ -#define DOT11_MAX_MPDU_BODY_LEN 2304 +#define DOT11_MAX_MPDU_BODY_LEN 2304 /* max MPDU body length */ /* A4 header + QoS + CCMP + PDU + ICV + FCS = 2352 */ #define DOT11_MAX_MPDU_LEN (DOT11_A4_HDR_LEN + \ DOT11_QOS_LEN + \ DOT11_IV_AES_CCM_LEN + \ DOT11_MAX_MPDU_BODY_LEN + \ DOT11_ICV_LEN + \ - DOT11_FCS_LEN) + DOT11_FCS_LEN) /* d11 max MPDU length */ -#define DOT11_MAX_SSID_LEN 32 +#define DOT11_MAX_SSID_LEN 32 /* d11 max ssid length */ /* dot11RTSThreshold */ -#define DOT11_DEFAULT_RTS_LEN 2347 -#define DOT11_MAX_RTS_LEN 2347 +#define DOT11_DEFAULT_RTS_LEN 2347 /* d11 default RTS length */ +#define DOT11_MAX_RTS_LEN 2347 /* d11 max RTS length */ /* dot11FragmentationThreshold */ -#define DOT11_MIN_FRAG_LEN 256 -#define DOT11_MAX_FRAG_LEN 2346 /* Max frag is also limited by aMPDUMaxLength of the attached PHY */ -#define DOT11_DEFAULT_FRAG_LEN 2346 +#define DOT11_MIN_FRAG_LEN 256 /* d11 min fragmentation length */ +#define DOT11_MAX_FRAG_LEN 2346 /* Max frag is also limited by aMPDUMaxLength + * of the attached PHY + */ +#define DOT11_DEFAULT_FRAG_LEN 2346 /* d11 default fragmentation length */ /* dot11BeaconPeriod */ -#define DOT11_MIN_BEACON_PERIOD 1 -#define DOT11_MAX_BEACON_PERIOD 0xFFFF +#define DOT11_MIN_BEACON_PERIOD 1 /* d11 min beacon period */ +#define DOT11_MAX_BEACON_PERIOD 0xFFFF /* d11 max beacon period */ /* dot11DTIMPeriod */ -#define DOT11_MIN_DTIM_PERIOD 1 -#define DOT11_MAX_DTIM_PERIOD 0xFF +#define DOT11_MIN_DTIM_PERIOD 1 /* d11 min DTIM period */ +#define DOT11_MAX_DTIM_PERIOD 0xFF /* d11 max DTIM period */ /* 802.2 LLC/SNAP header used by 802.11 per 802.1H */ -#define DOT11_LLC_SNAP_HDR_LEN 8 -#define DOT11_OUI_LEN 3 +#define DOT11_LLC_SNAP_HDR_LEN 8 /* d11 LLC/SNAP header length */ +#define DOT11_OUI_LEN 3 /* d11 OUI length */ struct dot11_llc_snap_header { uint8 dsap; /* always 0xAA */ uint8 ssap; /* always 0xAA */ uint8 ctl; /* always 0x03 */ uint8 oui[DOT11_OUI_LEN]; /* RFC1042: 0x00 0x00 0x00 - Bridge-Tunnel: 0x00 0x00 0xF8 */ + * Bridge-Tunnel: 0x00 0x00 0xF8 + */ uint16 type; /* ethertype */ } PACKED; /* RFC1042 header used by 802.11 per 802.1H */ -#define RFC1042_HDR_LEN (ETHER_HDR_LEN + DOT11_LLC_SNAP_HDR_LEN) +#define RFC1042_HDR_LEN (ETHER_HDR_LEN + DOT11_LLC_SNAP_HDR_LEN) /* RCF1042 header length */ /* Generic 802.11 MAC header */ /* @@ -121,21 +123,21 @@ struct dot11_rts_frame { struct ether_addr ra; /* receiver address */ struct ether_addr ta; /* transmitter address */ } PACKED; -#define DOT11_RTS_LEN 16 +#define DOT11_RTS_LEN 16 /* d11 RTS frame length */ struct dot11_cts_frame { uint16 fc; /* frame control */ uint16 durid; /* duration/ID */ struct ether_addr ra; /* receiver address */ } PACKED; -#define DOT11_CTS_LEN 10 +#define DOT11_CTS_LEN 10 /* d11 CTS frame length */ struct dot11_ack_frame { uint16 fc; /* frame control */ uint16 durid; /* duration/ID */ struct ether_addr ra; /* receiver address */ } PACKED; -#define DOT11_ACK_LEN 10 +#define DOT11_ACK_LEN 10 /* d11 ACK frame length */ struct dot11_ps_poll_frame { uint16 fc; /* frame control */ @@ -143,7 +145,7 @@ struct dot11_ps_poll_frame { struct ether_addr bssid; /* receiver address, STA in AP */ struct ether_addr ta; /* transmitter address */ } PACKED; -#define DOT11_PS_POLL_LEN 16 +#define DOT11_PS_POLL_LEN 16 /* d11 PS poll frame length */ struct dot11_cf_end_frame { uint16 fc; /* frame control */ @@ -151,7 +153,44 @@ struct dot11_cf_end_frame { struct ether_addr ra; /* receiver address */ struct ether_addr bssid; /* transmitter address, STA in AP */ } PACKED; -#define DOT11_CS_END_LEN 16 +#define DOT11_CS_END_LEN 16 /* d11 CF-END frame length */ + +/* BA/BAR Control parameters */ +#define DOT11_BA_CTL_POLICY_NORMAL 0x0000 /* normal ack */ +#define DOT11_BA_CTL_POLICY_NOACK 0x0001 /* no ack */ +#define DOT11_BA_CTL_POLICY_MASK 0x0001 /* ack policy mask */ + +#define DOT11_BA_CTL_MTID 0x0002 /* multi tid BA */ +#define DOT11_BA_CTL_COMPRESSED 0x0004 /* compressed bitmap */ + +#define DOT11_BA_CTL_NUMMSDU_MASK 0x0FC0 /* num msdu in bitmap mask */ +#define DOT11_BA_CTL_NUMMSDU_SHIFT 6 /* num msdu in bitmap shift */ + +#define DOT11_BA_CTL_TID_MASK 0xF000 /* tid mask */ +#define DOT11_BA_CTL_TID_SHIFT 12 /* tid shift */ + +struct dot11_ba_req_frame { + uint16 fc; /* frame control */ + uint16 durid; /* duration/ID */ + struct ether_addr ra; /* receiver address */ + struct ether_addr ta; /* transmitter address */ + uint16 bar_control; /* BAR Control */ + uint16 seqnum; /* Starting Sequence control */ +} PACKED; +#define DOT11_BA_REQ_LEN 20 /* BAR frame length */ + +#define DOT11_BA_BITMAP_LEN 128 /* bitmap length */ +#define DOT11_BA_CMP_BITMAP_LEN 8 /* compressed bitmap length */ +struct dot11_ba_frame { + uint16 fc; /* frame control */ + uint16 durid; /* duration/ID */ + struct ether_addr ra; /* receiver address */ + struct ether_addr ta; /* transmitter address */ + uint16 ba_control; /* BA Control */ + uint16 seqnum; /* Starting Sequence control */ + uint8 bitmap[DOT11_BA_BITMAP_LEN]; /* Block Ack Bitmap */ +} PACKED; +#define DOT11_BA_LEN 20 /* BA frame length (without bitmap) */ /* Management frame header */ struct dot11_management_header { @@ -162,7 +201,7 @@ struct dot11_management_header { struct ether_addr bssid; /* BSS ID */ uint16 seq; /* sequence control */ } PACKED; -#define DOT11_MGMT_HDR_LEN 24 +#define DOT11_MGMT_HDR_LEN 24 /* d11 management header length */ /* Management frame payloads */ @@ -171,19 +210,29 @@ struct dot11_bcn_prb { uint16 beacon_interval; uint16 capability; } PACKED; -#define DOT11_BCN_PRB_LEN 12 +#define DOT11_BCN_PRB_LEN 12 /* d11 beacon probe frame length */ struct dot11_auth { uint16 alg; /* algorithm */ uint16 seq; /* sequence control */ uint16 status; /* status code */ } PACKED; -#define DOT11_AUTH_FIXED_LEN 6 /* length of auth frame without challenge info elt */ +#define DOT11_AUTH_FIXED_LEN 6 /* length of auth frame without challenge info + * elt + */ struct dot11_assoc_req { uint16 capability; /* capability information */ uint16 listen; /* listen interval */ } PACKED; +#define DOT11_ASSOC_REQ_FIXED_LEN 4 /* length of assoc frame without info elts */ + +struct dot11_reassoc_req { + uint16 capability; /* capability information */ + uint16 listen; /* listen interval */ + struct ether_addr ap; /* Current AP address */ +} PACKED; +#define DOT11_REASSOC_REQ_FIXED_LEN 10 /* length of assoc frame without info elts */ struct dot11_assoc_resp { uint16 capability; /* capability information */ @@ -197,11 +246,28 @@ struct dot11_action_measure { uint8 token; uint8 data[1]; } PACKED; -#define DOT11_ACTION_MEASURE_LEN 3 +#define DOT11_ACTION_MEASURE_LEN 3 /* d11 action measurement header length */ -/************** - 802.11h related definitions. -**************/ +struct dot11_action_switch_channel { + uint8 category; + uint8 action; + uint8 data[5]; /* for switch IE */ +} PACKED; + +struct dot11_action_ht_ch_width { + uint8 category; + uint8 action; + uint8 ch_width; +} PACKED; + +struct dot11_action_ht_mimops { + uint8 category; + uint8 action; + uint8 enable; + uint8 psmode; +} PACKED; + +/* ************* 802.11h related definitions. ************* */ typedef struct { uint8 id; uint8 len; @@ -219,7 +285,7 @@ typedef struct { uint8 tx_pwr; uint8 margin; } dot11_tpc_rep_t; -#define DOT11_MNG_IE_TPC_REPORT_LEN 2 /* length of IE data, not including 2 byte header */ +#define DOT11_MNG_IE_TPC_REPORT_LEN 2 /* length of IE data, not including 2 byte header */ typedef struct { uint8 id; @@ -228,6 +294,11 @@ typedef struct { uint8 num_channels; } dot11_supp_channels_t; +/* channel switch announcement (CSA) mode type - 802.11h-2003 $7.3.2.20 */ +#define DOT11_CSA_MODE_ADVISORY 0 /* no DOT11_CSA_MODE_NO_TX restriction imposed */ +#define DOT11_CSA_MODE_NO_TX 1 /* no transmission upon receiving CSA frame. */ + +/* CSA IE data structure */ struct dot11_channel_switch { uint8 id; uint8 len; @@ -237,28 +308,30 @@ struct dot11_channel_switch { } PACKED; typedef struct dot11_channel_switch dot11_channel_switch_t; +#define DOT11_SWITCH_IE_LEN 3 /* length of IE data, not including 2 byte header */ + /* 802.11h Measurement Request/Report IEs */ /* Measurement Type field */ -#define DOT11_MEASURE_TYPE_BASIC 0 -#define DOT11_MEASURE_TYPE_CCA 1 -#define DOT11_MEASURE_TYPE_RPI 2 +#define DOT11_MEASURE_TYPE_BASIC 0 /* d11 measurement basic type */ +#define DOT11_MEASURE_TYPE_CCA 1 /* d11 measurement CCA type */ +#define DOT11_MEASURE_TYPE_RPI 2 /* d11 measurement PRI type */ /* Measurement Mode field */ /* Measurement Request Modes */ -#define DOT11_MEASURE_MODE_ENABLE (1<<1) -#define DOT11_MEASURE_MODE_REQUEST (1<<2) -#define DOT11_MEASURE_MODE_REPORT (1<<3) +#define DOT11_MEASURE_MODE_ENABLE (1<<1) /* d11 measurement enable */ +#define DOT11_MEASURE_MODE_REQUEST (1<<2) /* d11 measurement request */ +#define DOT11_MEASURE_MODE_REPORT (1<<3) /* d11 measurement report */ /* Measurement Report Modes */ -#define DOT11_MEASURE_MODE_LATE (1<<0) -#define DOT11_MEASURE_MODE_INCAPABLE (1<<1) -#define DOT11_MEASURE_MODE_REFUSED (1<<2) +#define DOT11_MEASURE_MODE_LATE (1<<0) /* d11 measurement late */ +#define DOT11_MEASURE_MODE_INCAPABLE (1<<1) /* d11 measurement incapable */ +#define DOT11_MEASURE_MODE_REFUSED (1<<2) /* d11 measurement refuse */ /* Basic Measurement Map bits */ -#define DOT11_MEASURE_BASIC_MAP_BSS ((uint8)(1<<0)) -#define DOT11_MEASURE_BASIC_MAP_OFDM ((uint8)(1<<1)) -#define DOT11_MEASURE_BASIC_MAP_UKNOWN ((uint8)(1<<2)) -#define DOT11_MEASURE_BASIC_MAP_RADAR ((uint8)(1<<3)) -#define DOT11_MEASURE_BASIC_MAP_UNMEAS ((uint8)(1<<4)) +#define DOT11_MEASURE_BASIC_MAP_BSS ((uint8)(1<<0)) /* d11 measurement basic map BSS */ +#define DOT11_MEASURE_BASIC_MAP_OFDM ((uint8)(1<<1)) /* d11 measurement map OFDM */ +#define DOT11_MEASURE_BASIC_MAP_UKNOWN ((uint8)(1<<2)) /* d11 measurement map unknown */ +#define DOT11_MEASURE_BASIC_MAP_RADAR ((uint8)(1<<3)) /* d11 measurement map radar */ +#define DOT11_MEASURE_BASIC_MAP_UNMEAS ((uint8)(1<<4)) /* d11 measurement map unmeasuremnt */ typedef struct { uint8 id; @@ -270,9 +343,9 @@ typedef struct { uint8 start_time[8]; uint16 duration; } dot11_meas_req_t; -#define DOT11_MNG_IE_MREQ_LEN 14 +#define DOT11_MNG_IE_MREQ_LEN 14 /* d11 measurement request IE length */ /* length of Measure Request IE data not including variable len */ -#define DOT11_MNG_IE_MREQ_FIXED_LEN 3 +#define DOT11_MNG_IE_MREQ_FIXED_LEN 3 /* d11 measurement request IE fixed length */ struct dot11_meas_rep { uint8 id; @@ -280,7 +353,7 @@ struct dot11_meas_rep { uint8 token; uint8 mode; uint8 type; - union + union { struct { uint8 channel; @@ -294,7 +367,7 @@ struct dot11_meas_rep { typedef struct dot11_meas_rep dot11_meas_rep_t; /* length of Measure Report IE data not including variable len */ -#define DOT11_MNG_IE_MREP_FIXED_LEN 3 +#define DOT11_MNG_IE_MREP_FIXED_LEN 3 /* d11 measurement response IE fixed length */ struct dot11_meas_rep_basic { uint8 channel; @@ -303,14 +376,14 @@ struct dot11_meas_rep_basic { uint8 map; } PACKED; typedef struct dot11_meas_rep_basic dot11_meas_rep_basic_t; -#define DOT11_MEASURE_BASIC_REP_LEN 12 +#define DOT11_MEASURE_BASIC_REP_LEN 12 /* d11 measurement basic report length */ struct dot11_quiet { uint8 id; uint8 len; uint8 count; /* TBTTs until beacon interval in quiet starts */ uint8 period; /* Beacon intervals between periodic quiet periods ? */ - uint16 duration;/* Length of quiet period, in TU's */ + uint16 duration; /* Length of quiet period, in TU's */ uint16 offset; /* TU's offset from TBTT in Count field */ } PACKED; typedef struct dot11_quiet dot11_quiet_t; @@ -329,9 +402,9 @@ typedef struct { } dot11_ibss_dfs_t; /* WME Elements */ -#define WME_OUI "\x00\x50\xf2" -#define WME_VER 1 -#define WME_TYPE 2 +#define WME_OUI "\x00\x50\xf2" /* WME OUI */ +#define WME_VER 1 /* WME version */ +#define WME_TYPE 2 /* WME type */ #define WME_SUBTYPE_IE 0 /* Information Element */ #define WME_SUBTYPE_PARAM_IE 1 /* Parameter Element */ #define WME_SUBTYPE_TSPEC 2 /* Traffic Specification */ @@ -341,7 +414,13 @@ typedef struct { #define AC_BK 1 /* Background */ #define AC_VI 2 /* Video */ #define AC_VO 3 /* Voice */ -#define AC_MAX 4 +#define AC_COUNT 4 /* number of ACs */ + +typedef uint8 ac_bitmap_t; /* AC bitmap of (1 << AC_xx) */ + +#define AC_BITMAP_NONE 0x0 /* No ACs */ +#define AC_BITMAP_ALL 0xf /* All ACs */ +#define AC_BITMAP_TST(ab, ac) (((ab) & (1 << (ac))) != 0) /* WME Information Element (IE) */ struct wme_ie { @@ -349,86 +428,108 @@ struct wme_ie { uint8 type; uint8 subtype; uint8 version; - uint8 acinfo; + uint8 qosinfo; } PACKED; typedef struct wme_ie wme_ie_t; -#define WME_IE_LEN 7 +#define WME_IE_LEN 7 /* WME IE length */ -struct wme_acparam { +struct edcf_acparam { uint8 ACI; uint8 ECW; uint16 TXOP; /* stored in network order (ls octet first) */ } PACKED; -typedef struct wme_acparam wme_acparam_t; +typedef struct edcf_acparam edcf_acparam_t; /* WME Parameter Element (PE) */ -struct wme_params { +struct wme_param_ie { uint8 oui[3]; uint8 type; uint8 subtype; uint8 version; - uint8 acinfo; + uint8 qosinfo; uint8 rsvd; - wme_acparam_t acparam[4]; + edcf_acparam_t acparam[AC_COUNT]; } PACKED; -typedef struct wme_params wme_params_t; -#define WME_PARAMS_IE_LEN 24 +typedef struct wme_param_ie wme_param_ie_t; +#define WME_PARAM_IE_LEN 24 /* WME Parameter IE length */ + +/* QoS Info field for IE as sent from AP */ +#define WME_QI_AP_APSD_MASK 0x80 /* U-APSD Supported mask */ +#define WME_QI_AP_APSD_SHIFT 7 /* U-APSD Supported shift */ +#define WME_QI_AP_COUNT_MASK 0x0f /* Parameter set count mask */ +#define WME_QI_AP_COUNT_SHIFT 0 /* Parameter set count shift */ + +/* QoS Info field for IE as sent from STA */ +#define WME_QI_STA_MAXSPLEN_MASK 0x60 /* Max Service Period Length mask */ +#define WME_QI_STA_MAXSPLEN_SHIFT 5 /* Max Service Period Length shift */ +#define WME_QI_STA_APSD_ALL_MASK 0xf /* APSD all AC bits mask */ +#define WME_QI_STA_APSD_ALL_SHIFT 0 /* APSD all AC bits shift */ +#define WME_QI_STA_APSD_BE_MASK 0x8 /* APSD AC_BE mask */ +#define WME_QI_STA_APSD_BE_SHIFT 3 /* APSD AC_BE shift */ +#define WME_QI_STA_APSD_BK_MASK 0x4 /* APSD AC_BK mask */ +#define WME_QI_STA_APSD_BK_SHIFT 2 /* APSD AC_BK shift */ +#define WME_QI_STA_APSD_VI_MASK 0x2 /* APSD AC_VI mask */ +#define WME_QI_STA_APSD_VI_SHIFT 1 /* APSD AC_VI shift */ +#define WME_QI_STA_APSD_VO_MASK 0x1 /* APSD AC_VO mask */ +#define WME_QI_STA_APSD_VO_SHIFT 0 /* APSD AC_VO shift */ -/* acinfo */ -#define WME_COUNT_MASK 0x0f /* ACI */ -#define WME_AIFS_MASK 0x0f -#define WME_ACM_MASK 0x10 -#define WME_ACI_MASK 0x60 -#define WME_ACI_SHIFT 5 +#define EDCF_AIFSN_MIN 1 /* AIFSN minimum value */ +#define EDCF_AIFSN_MAX 15 /* AIFSN maximum value */ +#define EDCF_AIFSN_MASK 0x0f /* AIFSN mask */ +#define EDCF_ACM_MASK 0x10 /* ACM mask */ +#define EDCF_ACI_MASK 0x60 /* ACI mask */ +#define EDCF_ACI_SHIFT 5 /* ACI shift */ + /* ECW */ -#define WME_CWMIN_MASK 0x0f -#define WME_CWMAX_MASK 0xf0 -#define WME_CWMAX_SHIFT 4 - -#define WME_TXOP_UNITS 32 - -/* WME Traffic Specification (TSPEC) element */ -#define WME_SUBTYPE_TSPEC 2 -#define WME_TSPEC_HDR_LEN 2 -#define WME_TSPEC_BODY_OFF 2 -struct wme_tspec { - uint8 oui[DOT11_OUI_LEN]; /* WME_OUI */ - uint8 type; /* WME_TYPE */ - uint8 subtype; /* WME_SUBTYPE_TSPEC */ - uint8 version; /* WME_VERSION */ - uint16 ts_info; /* TS Info */ - uint16 nom_msdu_size; /* (Nominal or fixed) MSDU Size (bytes) */ - uint16 max_msdu_size; /* Maximum MSDU Size (bytes) */ - uint32 min_service_interval; /* Minimum Service Interval (us) */ - uint32 max_service_interval; /* Maximum Service Interval (us) */ - uint32 inactivity_interval; /* Inactivity Interval (us) */ - uint32 service_start; /* Service Start Time (us) */ - uint32 min_rate; /* Minimum Data Rate (bps) */ - uint32 mean_rate; /* Mean Data Rate (bps) */ - uint32 max_burst_size; /* Maximum Burst Size (bytes) */ - uint32 min_phy_rate; /* Minimum PHY Rate (bps) */ - uint32 peak_rate; /* Peak Data Rate (bps) */ - uint32 delay_bound; /* Delay Bound (us) */ - uint16 surplus_bandwidth; /* Surplus Bandwidth Allowance Factor */ - uint16 medium_time; /* Medium Time (32 us/s periods) */ -} PACKED; -typedef struct wme_tspec wme_tspec_t; -#define WME_TSPEC_LEN 56 /* not including 2-byte header */ - -/* ts_info */ -/* 802.1D priority is duplicated - bits 13-11 AND bits 3-1 */ -#define TS_INFO_PRIO_SHIFT_HI 11 -#define TS_INFO_PRIO_MASK_HI (0x7 << TS_INFO_PRIO_SHIFT_HI) -#define TS_INFO_PRIO_SHIFT_LO 1 -#define TS_INFO_PRIO_MASK_LO (0x7 << TS_INFO_PRIO_SHIFT_LO) -#define TS_INFO_CONTENTION_SHIFT 7 -#define TS_INFO_CONTENTION_MASK (0x1 << TS_INFO_CONTENTION_SHIFT) -#define TS_INFO_DIRECTION_SHIFT 5 -#define TS_INFO_DIRECTION_MASK (0x3 << TS_INFO_DIRECTION_SHIFT) -#define TS_INFO_UPLINK (0 << TS_INFO_DIRECTION_SHIFT) -#define TS_INFO_DOWNLINK (1 << TS_INFO_DIRECTION_SHIFT) -#define TS_INFO_BIDIRECTIONAL (3 << TS_INFO_DIRECTION_SHIFT) +#define EDCF_ECW_MIN 0 /* cwmin/cwmax exponent minimum value */ +#define EDCF_ECW_MAX 15 /* cwmin/cwmax exponent maximum value */ +#define EDCF_ECW2CW(exp) ((1 << (exp)) - 1) +#define EDCF_ECWMIN_MASK 0x0f /* cwmin exponent form mask */ +#define EDCF_ECWMAX_MASK 0xf0 /* cwmax exponent form mask */ +#define EDCF_ECWMAX_SHIFT 4 /* cwmax exponent form shift */ + +/* TXOP */ +#define EDCF_TXOP_MIN 0 /* TXOP minimum value */ +#define EDCF_TXOP_MAX 65535 /* TXOP maximum value */ +#define EDCF_TXOP2USEC(txop) ((txop) << 5) + +/* Default EDCF parameters that AP advertises for STA to use; WMM draft Table 12 */ +#define EDCF_AC_BE_ACI_STA 0x03 /* STA ACI value for best effort AC */ +#define EDCF_AC_BE_ECW_STA 0xA4 /* STA ECW value for best effort AC */ +#define EDCF_AC_BE_TXOP_STA 0x0000 /* STA TXOP value for best effort AC */ +#define EDCF_AC_BK_ACI_STA 0x27 /* STA ACI value for background AC */ +#define EDCF_AC_BK_ECW_STA 0xA4 /* STA ECW value for background AC */ +#define EDCF_AC_BK_TXOP_STA 0x0000 /* STA TXOP value for background AC */ +#define EDCF_AC_VI_ACI_STA 0x42 /* STA ACI value for video AC */ +#define EDCF_AC_VI_ECW_STA 0x43 /* STA ECW value for video AC */ +#define EDCF_AC_VI_TXOP_STA 0x005e /* STA TXOP value for video AC */ +#define EDCF_AC_VO_ACI_STA 0x62 /* STA ACI value for audio AC */ +#define EDCF_AC_VO_ECW_STA 0x32 /* STA ECW value for audio AC */ +#define EDCF_AC_VO_TXOP_STA 0x002f /* STA TXOP value for audio AC */ + +/* Default EDCF parameters that AP uses; WMM draft Table 14 */ +#define EDCF_AC_BE_ACI_AP 0x03 /* AP ACI value for best effort AC */ +#define EDCF_AC_BE_ECW_AP 0x64 /* AP ECW value for best effort AC */ +#define EDCF_AC_BE_TXOP_AP 0x0000 /* AP TXOP value for best effort AC */ +#define EDCF_AC_BK_ACI_AP 0x27 /* AP ACI value for background AC */ +#define EDCF_AC_BK_ECW_AP 0xA4 /* AP ECW value for background AC */ +#define EDCF_AC_BK_TXOP_AP 0x0000 /* AP TXOP value for background AC */ +#define EDCF_AC_VI_ACI_AP 0x41 /* AP ACI value for video AC */ +#define EDCF_AC_VI_ECW_AP 0x43 /* AP ECW value for video AC */ +#define EDCF_AC_VI_TXOP_AP 0x005e /* AP TXOP value for video AC */ +#define EDCF_AC_VO_ACI_AP 0x61 /* AP ACI value for audio AC */ +#define EDCF_AC_VO_ECW_AP 0x32 /* AP ECW value for audio AC */ +#define EDCF_AC_VO_TXOP_AP 0x002f /* AP TXOP value for audio AC */ + +struct dot11_qbss_load_ie { + uint8 id; /* 11, DOT11_MNG_QBSS_LOAD_ID */ + uint8 length; + uint16 station_count; /* total number of STAs associated */ + uint8 channel_utilization; /* % of time, normalized to 255, QAP sensed medium busy */ + uint16 aac; /* available admission capacity */ +} PACKED; +typedef struct dot11_qbss_load_ie dot11_qbss_load_ie_t; /* nom_msdu_size */ #define FIXED_MSDU_SIZE 0x8000 /* MSDU size is fixed */ @@ -436,8 +537,8 @@ typedef struct wme_tspec wme_tspec_t; /* surplus_bandwidth */ /* Represented as 3 bits of integer, binary point, 13 bits fraction */ -#define INTEGER_SHIFT 13 -#define FRACTION_MASK 0x1FFF +#define INTEGER_SHIFT 13 /* integer shift */ +#define FRACTION_MASK 0x1FFF /* fraction mask */ /* Management Notification Frame */ struct dot11_management_notification { @@ -450,14 +551,14 @@ struct dot11_management_notification { #define DOT11_MGMT_NOTIFICATION_LEN 4 /* Fixed length */ /* WME Action Codes */ -#define WME_SETUP_REQUEST 0 -#define WME_SETUP_RESPONSE 1 -#define WME_TEARDOWN 2 +#define WME_ADDTS_REQUEST 0 /* WME ADDTS request */ +#define WME_ADDTS_RESPONSE 1 /* WME ADDTS response */ +#define WME_DELTS_REQUEST 2 /* WME DELTS request */ /* WME Setup Response Status Codes */ -#define WME_ADMISSION_ACCEPTED 0 -#define WME_INVALID_PARAMETERS 1 -#define WME_ADMISSION_REFUSED 3 +#define WME_ADMISSION_ACCEPTED 0 /* WME admission accepted */ +#define WME_INVALID_PARAMETERS 1 /* WME invalide parameters */ +#define WME_ADMISSION_REFUSED 3 /* WME admission refused */ /* Macro to take a pointer to a beacon or probe response * header and return the char* pointer to the SSID info element @@ -465,307 +566,467 @@ struct dot11_management_notification { #define BCN_PRB_SSID(hdr) ((char*)(hdr) + DOT11_MGMT_HDR_LEN + DOT11_BCN_PRB_LEN) /* Authentication frame payload constants */ -#define DOT11_OPEN_SYSTEM 0 -#define DOT11_SHARED_KEY 1 -#define DOT11_CHALLENGE_LEN 128 +#define DOT11_OPEN_SYSTEM 0 /* d11 open authentication */ +#define DOT11_SHARED_KEY 1 /* d11 shared authentication */ +#define DOT11_CHALLENGE_LEN 128 /* d11 chanllenge text length */ /* Frame control macros */ -#define FC_PVER_MASK 0x3 -#define FC_PVER_SHIFT 0 -#define FC_TYPE_MASK 0xC -#define FC_TYPE_SHIFT 2 -#define FC_SUBTYPE_MASK 0xF0 -#define FC_SUBTYPE_SHIFT 4 -#define FC_TODS 0x100 -#define FC_TODS_SHIFT 8 -#define FC_FROMDS 0x200 -#define FC_FROMDS_SHIFT 9 -#define FC_MOREFRAG 0x400 -#define FC_MOREFRAG_SHIFT 10 -#define FC_RETRY 0x800 -#define FC_RETRY_SHIFT 11 -#define FC_PM 0x1000 -#define FC_PM_SHIFT 12 -#define FC_MOREDATA 0x2000 -#define FC_MOREDATA_SHIFT 13 -#define FC_WEP 0x4000 -#define FC_WEP_SHIFT 14 -#define FC_ORDER 0x8000 -#define FC_ORDER_SHIFT 15 +#define FC_PVER_MASK 0x3 /* PVER mask */ +#define FC_PVER_SHIFT 0 /* PVER shift */ +#define FC_TYPE_MASK 0xC /* type mask */ +#define FC_TYPE_SHIFT 2 /* type shift */ +#define FC_SUBTYPE_MASK 0xF0 /* subtype mask */ +#define FC_SUBTYPE_SHIFT 4 /* subtype shift */ +#define FC_TODS 0x100 /* to DS */ +#define FC_TODS_SHIFT 8 /* to DS shift */ +#define FC_FROMDS 0x200 /* from DS */ +#define FC_FROMDS_SHIFT 9 /* from DS shift */ +#define FC_MOREFRAG 0x400 /* more frag. */ +#define FC_MOREFRAG_SHIFT 10 /* more frag. shift */ +#define FC_RETRY 0x800 /* retry */ +#define FC_RETRY_SHIFT 11 /* retry shift */ +#define FC_PM 0x1000 /* PM */ +#define FC_PM_SHIFT 12 /* PM shift */ +#define FC_MOREDATA 0x2000 /* more data */ +#define FC_MOREDATA_SHIFT 13 /* more data shift */ +#define FC_WEP 0x4000 /* WEP */ +#define FC_WEP_SHIFT 14 /* WEP shift */ +#define FC_ORDER 0x8000 /* order */ +#define FC_ORDER_SHIFT 15 /* order shift */ /* sequence control macros */ -#define SEQNUM_SHIFT 4 -#define FRAGNUM_MASK 0xF +#define SEQNUM_SHIFT 4 /* seq. number shift */ +#define SEQNUM_MAX 0x1000 /* max seqnum + 1 */ +#define FRAGNUM_MASK 0xF /* frag. number mask */ /* Frame Control type/subtype defs */ /* FC Types */ -#define FC_TYPE_MNG 0 -#define FC_TYPE_CTL 1 -#define FC_TYPE_DATA 2 +#define FC_TYPE_MNG 0 /* management type */ +#define FC_TYPE_CTL 1 /* control type */ +#define FC_TYPE_DATA 2 /* data type */ /* Management Subtypes */ -#define FC_SUBTYPE_ASSOC_REQ 0 -#define FC_SUBTYPE_ASSOC_RESP 1 -#define FC_SUBTYPE_REASSOC_REQ 2 -#define FC_SUBTYPE_REASSOC_RESP 3 -#define FC_SUBTYPE_PROBE_REQ 4 -#define FC_SUBTYPE_PROBE_RESP 5 -#define FC_SUBTYPE_BEACON 8 -#define FC_SUBTYPE_ATIM 9 -#define FC_SUBTYPE_DISASSOC 10 -#define FC_SUBTYPE_AUTH 11 -#define FC_SUBTYPE_DEAUTH 12 -#define FC_SUBTYPE_ACTION 13 +#define FC_SUBTYPE_ASSOC_REQ 0 /* assoc. request */ +#define FC_SUBTYPE_ASSOC_RESP 1 /* assoc. response */ +#define FC_SUBTYPE_REASSOC_REQ 2 /* reassoc. request */ +#define FC_SUBTYPE_REASSOC_RESP 3 /* reassoc. response */ +#define FC_SUBTYPE_PROBE_REQ 4 /* probe request */ +#define FC_SUBTYPE_PROBE_RESP 5 /* probe response */ +#define FC_SUBTYPE_BEACON 8 /* beacon */ +#define FC_SUBTYPE_ATIM 9 /* ATIM */ +#define FC_SUBTYPE_DISASSOC 10 /* disassoc. */ +#define FC_SUBTYPE_AUTH 11 /* authentication */ +#define FC_SUBTYPE_DEAUTH 12 /* de-authentication */ +#define FC_SUBTYPE_ACTION 13 /* action */ /* Control Subtypes */ -#define FC_SUBTYPE_PS_POLL 10 -#define FC_SUBTYPE_RTS 11 -#define FC_SUBTYPE_CTS 12 -#define FC_SUBTYPE_ACK 13 -#define FC_SUBTYPE_CF_END 14 -#define FC_SUBTYPE_CF_END_ACK 15 +#define FC_SUBTYPE_BLOCKACK_REQ 8 /* Block Ack Req */ +#define FC_SUBTYPE_BLOCKACK 9 /* Block Ack */ +#define FC_SUBTYPE_PS_POLL 10 /* PS poll */ +#define FC_SUBTYPE_RTS 11 /* RTS */ +#define FC_SUBTYPE_CTS 12 /* CTS */ +#define FC_SUBTYPE_ACK 13 /* ACK */ +#define FC_SUBTYPE_CF_END 14 /* CF-END */ +#define FC_SUBTYPE_CF_END_ACK 15 /* CF-END ACK */ /* Data Subtypes */ -#define FC_SUBTYPE_DATA 0 -#define FC_SUBTYPE_DATA_CF_ACK 1 -#define FC_SUBTYPE_DATA_CF_POLL 2 -#define FC_SUBTYPE_DATA_CF_ACK_POLL 3 -#define FC_SUBTYPE_NULL 4 -#define FC_SUBTYPE_CF_ACK 5 -#define FC_SUBTYPE_CF_POLL 6 -#define FC_SUBTYPE_CF_ACK_POLL 7 -#define FC_SUBTYPE_QOS_DATA 8 -#define FC_SUBTYPE_QOS_NULL 12 - -/* type-subtype combos */ -#define FC_KIND_MASK (FC_TYPE_MASK | FC_SUBTYPE_MASK) - -#define FC_KIND(t, s) (((t) << FC_TYPE_SHIFT) | ((s) << FC_SUBTYPE_SHIFT)) - -#define FC_ASSOC_REQ FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ASSOC_REQ) -#define FC_ASSOC_RESP FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ASSOC_RESP) -#define FC_REASSOC_REQ FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_REASSOC_REQ) -#define FC_REASSOC_RESP FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_REASSOC_RESP) -#define FC_PROBE_REQ FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_PROBE_REQ) -#define FC_PROBE_RESP FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_PROBE_RESP) -#define FC_BEACON FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_BEACON) -#define FC_DISASSOC FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_DISASSOC) -#define FC_AUTH FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_AUTH) -#define FC_DEAUTH FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_DEAUTH) -#define FC_ACTION FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ACTION) - -#define FC_PS_POLL FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_PS_POLL) -#define FC_RTS FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_RTS) -#define FC_CTS FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CTS) -#define FC_ACK FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_ACK) -#define FC_CF_END FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CF_END) -#define FC_CF_END_ACK FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CF_END_ACK) - -#define FC_DATA FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_DATA) -#define FC_NULL_DATA FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_NULL) -#define FC_DATA_CF_ACK FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_DATA_CF_ACK) -#define FC_QOS_DATA FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_QOS_DATA) -#define FC_QOS_NULL FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_QOS_NULL) +#define FC_SUBTYPE_DATA 0 /* Data */ +#define FC_SUBTYPE_DATA_CF_ACK 1 /* Data + CF-ACK */ +#define FC_SUBTYPE_DATA_CF_POLL 2 /* Data + CF-Poll */ +#define FC_SUBTYPE_DATA_CF_ACK_POLL 3 /* Data + CF-Ack + CF-Poll */ +#define FC_SUBTYPE_NULL 4 /* Null */ +#define FC_SUBTYPE_CF_ACK 5 /* CF-Ack */ +#define FC_SUBTYPE_CF_POLL 6 /* CF-Poll */ +#define FC_SUBTYPE_CF_ACK_POLL 7 /* CF-Ack + CF-Poll */ +#define FC_SUBTYPE_QOS_DATA 8 /* QoS Data */ +#define FC_SUBTYPE_QOS_DATA_CF_ACK 9 /* QoS Data + CF-Ack */ +#define FC_SUBTYPE_QOS_DATA_CF_POLL 10 /* QoS Data + CF-Poll */ +#define FC_SUBTYPE_QOS_DATA_CF_ACK_POLL 11 /* QoS Data + CF-Ack + CF-Poll */ +#define FC_SUBTYPE_QOS_NULL 12 /* QoS Null */ +#define FC_SUBTYPE_QOS_CF_POLL 14 /* QoS CF-Poll */ +#define FC_SUBTYPE_QOS_CF_ACK_POLL 15 /* QoS CF-Ack + CF-Poll */ + +/* Data Subtype Groups */ +#define FC_SUBTYPE_ANY_QOS(s) (((s) & 8) != 0) +#define FC_SUBTYPE_ANY_NULL(s) (((s) & 4) != 0) +#define FC_SUBTYPE_ANY_CF_POLL(s) (((s) & 2) != 0) +#define FC_SUBTYPE_ANY_CF_ACK(s) (((s) & 1) != 0) + +/* Type/Subtype Combos */ +#define FC_KIND_MASK (FC_TYPE_MASK | FC_SUBTYPE_MASK) /* FC kind mask */ + +#define FC_KIND(t, s) (((t) << FC_TYPE_SHIFT) | ((s) << FC_SUBTYPE_SHIFT)) /* FC kind */ + +#define FC_SUBTYPE(fc) (((fc) & FC_SUBTYPE_MASK) >> FC_SUBTYPE_SHIFT) /* Subtype from FC */ +#define FC_TYPE(fc) (((fc) & FC_TYPE_MASK) >> FC_TYPE_SHIFT) /* Type from FC */ + +#define FC_ASSOC_REQ FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ASSOC_REQ) /* assoc. request */ +#define FC_ASSOC_RESP FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ASSOC_RESP) /* assoc. response */ +#define FC_REASSOC_REQ FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_REASSOC_REQ) /* reassoc. request */ +#define FC_REASSOC_RESP FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_REASSOC_RESP) /* reassoc. response */ +#define FC_PROBE_REQ FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_PROBE_REQ) /* probe request */ +#define FC_PROBE_RESP FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_PROBE_RESP) /* probe response */ +#define FC_BEACON FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_BEACON) /* beacon */ +#define FC_DISASSOC FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_DISASSOC) /* disassoc */ +#define FC_AUTH FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_AUTH) /* authentication */ +#define FC_DEAUTH FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_DEAUTH) /* deauthentication */ +#define FC_ACTION FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ACTION) /* action */ + +#define FC_BLOCKACK_REQ FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_BLOCKACK_REQ) /* Block Ack Req */ +#define FC_BLOCKACK FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_BLOCKACK) /* Block Ack */ +#define FC_PS_POLL FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_PS_POLL) /* PS poll */ +#define FC_RTS FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_RTS) /* RTS */ +#define FC_CTS FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CTS) /* CTS */ +#define FC_ACK FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_ACK) /* ACK */ +#define FC_CF_END FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CF_END) /* CF-END */ +#define FC_CF_END_ACK FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CF_END_ACK) /* CF-END ACK */ + +#define FC_DATA FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_DATA) /* data */ +#define FC_NULL_DATA FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_NULL) /* null data */ +#define FC_DATA_CF_ACK FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_DATA_CF_ACK) /* data CF ACK */ +#define FC_QOS_DATA FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_QOS_DATA) /* QoS data */ +#define FC_QOS_NULL FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_QOS_NULL) /* QoS null */ /* QoS Control Field */ -/* 802.1D Tag */ -#define QOS_PRIO_SHIFT 0 -#define QOS_PRIO_MASK 0x0007 -#define QOS_PRIO(qos) (((qos) & QOS_PRIO_MASK) >> QOS_PRIO_SHIFT) - -/* Ack Policy (0 means Acknowledge) */ -#define QOS_ACK_SHIFT 5 -#define QOS_ACK_MASK 0x0060 -#define QOS_ACK(qos) (((qos) & QOS_ACK_MASK) >> QOS_ACK_SHIFT) +/* 802.1D Priority */ +#define QOS_PRIO_SHIFT 0 /* QoS priority shift */ +#define QOS_PRIO_MASK 0x0007 /* QoS priority mask */ +#define QOS_PRIO(qos) (((qos) & QOS_PRIO_MASK) >> QOS_PRIO_SHIFT) /* QoS priority */ + +/* Traffic Identifier */ +#define QOS_TID_SHIFT 0 /* QoS TID shift */ +#define QOS_TID_MASK 0x000f /* QoS TID mask */ +#define QOS_TID(qos) (((qos) & QOS_TID_MASK) >> QOS_TID_SHIFT) /* QoS TID */ + +/* End of Service Period (U-APSD) */ +#define QOS_EOSP_SHIFT 4 /* QoS End of Service Period shift */ +#define QOS_EOSP_MASK 0x0010 /* QoS End of Service Period mask */ +#define QOS_EOSP(qos) (((qos) & QOS_EOSP_MASK) >> QOS_EOSP_SHIFT) /* Qos EOSP */ + +/* Ack Policy */ +#define QOS_ACK_NORMAL_ACK 0 /* Normal Ack */ +#define QOS_ACK_NO_ACK 1 /* No Ack (eg mcast) */ +#define QOS_ACK_NO_EXP_ACK 2 /* No Explicit Ack */ +#define QOS_ACK_BLOCK_ACK 3 /* Block Ack */ +#define QOS_ACK_SHIFT 5 /* QoS ACK shift */ +#define QOS_ACK_MASK 0x0060 /* QoS ACK mask */ +#define QOS_ACK(qos) (((qos) & QOS_ACK_MASK) >> QOS_ACK_SHIFT) /* QoS ACK */ + +/* A-MSDU flag */ +#define QOS_AMSDU_SHIFT 7 /* AMSDU shift */ +#define QOS_AMSDU_MASK 0x0080 /* AMSDU mask */ /* Management Frames */ /* Management Frame Constants */ /* Fixed fields */ -#define DOT11_MNG_AUTH_ALGO_LEN 2 -#define DOT11_MNG_AUTH_SEQ_LEN 2 -#define DOT11_MNG_BEACON_INT_LEN 2 -#define DOT11_MNG_CAP_LEN 2 -#define DOT11_MNG_AP_ADDR_LEN 6 -#define DOT11_MNG_LISTEN_INT_LEN 2 -#define DOT11_MNG_REASON_LEN 2 -#define DOT11_MNG_AID_LEN 2 -#define DOT11_MNG_STATUS_LEN 2 -#define DOT11_MNG_TIMESTAMP_LEN 8 +#define DOT11_MNG_AUTH_ALGO_LEN 2 /* d11 management auth. algo. length */ +#define DOT11_MNG_AUTH_SEQ_LEN 2 /* d11 management auth. seq. length */ +#define DOT11_MNG_BEACON_INT_LEN 2 /* d11 management beacon interval length */ +#define DOT11_MNG_CAP_LEN 2 /* d11 management cap. length */ +#define DOT11_MNG_AP_ADDR_LEN 6 /* d11 management AP address length */ +#define DOT11_MNG_LISTEN_INT_LEN 2 /* d11 management listen interval length */ +#define DOT11_MNG_REASON_LEN 2 /* d11 management reason length */ +#define DOT11_MNG_AID_LEN 2 /* d11 management AID length */ +#define DOT11_MNG_STATUS_LEN 2 /* d11 management status length */ +#define DOT11_MNG_TIMESTAMP_LEN 8 /* d11 management timestamp length */ /* DUR/ID field in assoc resp is 0xc000 | AID */ -#define DOT11_AID_MASK 0x3fff +#define DOT11_AID_MASK 0x3fff /* d11 AID mask */ /* Reason Codes */ -#define DOT11_RC_RESERVED 0 +#define DOT11_RC_RESERVED 0 /* d11 RC reserved */ #define DOT11_RC_UNSPECIFIED 1 /* Unspecified reason */ -#define DOT11_RC_AUTH_INVAL 2 /* Previous authentication no longer valid */ -#define DOT11_RC_DEAUTH_LEAVING 3 /* Deauthenticated because sending station is - leaving (or has left) IBSS or ESS */ +#define DOT11_RC_AUTH_INVAL 2 /* Previous authentication no longer + * valid + */ +#define DOT11_RC_DEAUTH_LEAVING 3 /* Deauthenticated because sending station + * is leaving (or has left) IBSS or ESS + */ #define DOT11_RC_INACTIVITY 4 /* Disassociated due to inactivity */ -#define DOT11_RC_BUSY 5 /* Disassociated because AP is unable to handle - all currently associated stations */ +#define DOT11_RC_BUSY 5 /* Disassociated because AP is unable + * to handle all currently associated + * stations + */ #define DOT11_RC_INVAL_CLASS_2 6 /* Class 2 frame received from - nonauthenticated station */ + * nonauthenticated station + */ #define DOT11_RC_INVAL_CLASS_3 7 /* Class 3 frame received from - nonassociated station */ + * nonassociated station + */ #define DOT11_RC_DISASSOC_LEAVING 8 /* Disassociated because sending station is - leaving (or has left) BSS */ + * leaving (or has left) BSS + */ #define DOT11_RC_NOT_AUTH 9 /* Station requesting (re)association is - not authenticated with responding station */ + * not authenticated with responding + * station + */ #define DOT11_RC_MAX 23 /* Reason codes > 23 are reserved */ /* Status Codes */ #define DOT11_STATUS_SUCCESS 0 /* Successful */ #define DOT11_STATUS_FAILURE 1 /* Unspecified failure */ -#define DOT11_STATUS_CAP_MISMATCH 10 /* Cannot support all requested capabilities - in the Capability Information field */ -#define DOT11_STATUS_REASSOC_FAIL 11 /* Reassociation denied due to inability to - confirm that association exists */ -#define DOT11_STATUS_ASSOC_FAIL 12 /* Association denied due to reason outside - the scope of this standard */ -#define DOT11_STATUS_AUTH_MISMATCH 13 /* Responding station does not support the - specified authentication algorithm */ -#define DOT11_STATUS_AUTH_SEQ 14 /* Received an Authentication frame with - authentication transaction sequence number - out of expected sequence */ -#define DOT11_STATUS_AUTH_CHALLENGE_FAIL 15 /* Authentication rejected because of challenge failure */ -#define DOT11_STATUS_AUTH_TIMEOUT 16 /* Authentication rejected due to timeout waiting - for next frame in sequence */ -#define DOT11_STATUS_ASSOC_BUSY_FAIL 17 /* Association denied because AP is unable to - handle additional associated stations */ -#define DOT11_STATUS_ASSOC_RATE_MISMATCH 18 /* Association denied due to requesting station - not supporting all of the data rates in the - BSSBasicRateSet parameter */ -#define DOT11_STATUS_ASSOC_SHORT_REQUIRED 19 /* Association denied due to requesting station - not supporting the Short Preamble option */ -#define DOT11_STATUS_ASSOC_PBCC_REQUIRED 20 /* Association denied due to requesting station - not supporting the PBCC Modulation option */ -#define DOT11_STATUS_ASSOC_AGILITY_REQUIRED 21 /* Association denied due to requesting station - not supporting the Channel Agility option */ -#define DOT11_STATUS_ASSOC_SPECTRUM_REQUIRED 22 /* Association denied because Spectrum Management - capability is required. */ -#define DOT11_STATUS_ASSOC_BAD_POWER_CAP 23 /* Association denied because the info in the - Power Cap element is unacceptable. */ -#define DOT11_STATUS_ASSOC_BAD_SUP_CHANNELS 24 /* Association denied because the info in the - Supported Channel element is unacceptable */ -#define DOT11_STATUS_ASSOC_SHORTSLOT_REQUIRED 25 /* Association denied due to requesting station - not supporting the Short Slot Time option */ -#define DOT11_STATUS_ASSOC_ERPBCC_REQUIRED 26 /* Association denied due to requesting station - not supporting the ER-PBCC Modulation option */ -#define DOT11_STATUS_ASSOC_DSSOFDM_REQUIRED 27 /* Association denied due to requesting station - not supporting the DSS-OFDM option */ +#define DOT11_STATUS_CAP_MISMATCH 10 /* Cannot support all requested + * capabilities in the Capability + * Information field + */ +#define DOT11_STATUS_REASSOC_FAIL 11 /* Reassociation denied due to inability + * to confirm that association exists + */ +#define DOT11_STATUS_ASSOC_FAIL 12 /* Association denied due to reason + * outside the scope of this standard + */ +#define DOT11_STATUS_AUTH_MISMATCH 13 /* Responding station does not support + * the specified authentication + * algorithm + */ +#define DOT11_STATUS_AUTH_SEQ 14 /* Received an Authentication frame + * with authentication transaction + * sequence number out of expected + * sequence + */ +#define DOT11_STATUS_AUTH_CHALLENGE_FAIL 15 /* Authentication rejected because of + * challenge failure + */ +#define DOT11_STATUS_AUTH_TIMEOUT 16 /* Authentication rejected due to timeout + * waiting for next frame in sequence + */ +#define DOT11_STATUS_ASSOC_BUSY_FAIL 17 /* Association denied because AP is + * unable to handle additional + * associated stations + */ +#define DOT11_STATUS_ASSOC_RATE_MISMATCH 18 /* Association denied due to requesting + * station not supporting all of the + * data rates in the BSSBasicRateSet + * parameter + */ +#define DOT11_STATUS_ASSOC_SHORT_REQUIRED 19 /* Association denied due to requesting + * station not supporting the Short + * Preamble option + */ +#define DOT11_STATUS_ASSOC_PBCC_REQUIRED 20 /* Association denied due to requesting + * station not supporting the PBCC + * Modulation option + */ +#define DOT11_STATUS_ASSOC_AGILITY_REQUIRED 21 /* Association denied due to requesting + * station not supporting the Channel + * Agility option + */ +#define DOT11_STATUS_ASSOC_SPECTRUM_REQUIRED 22 /* Association denied because Spectrum + * Management capability is required. + */ +#define DOT11_STATUS_ASSOC_BAD_POWER_CAP 23 /* Association denied because the info + * in the Power Cap element is + * unacceptable. + */ +#define DOT11_STATUS_ASSOC_BAD_SUP_CHANNELS 24 /* Association denied because the info + * in the Supported Channel element is + * unacceptable + */ +#define DOT11_STATUS_ASSOC_SHORTSLOT_REQUIRED 25 /* Association denied due to requesting + * station not supporting the Short Slot + * Time option + */ +#define DOT11_STATUS_ASSOC_ERPBCC_REQUIRED 26 /* Association denied due to requesting + * station not supporting the ER-PBCC + * Modulation option + */ +#define DOT11_STATUS_ASSOC_DSSOFDM_REQUIRED 27 /* Association denied due to requesting + * station not supporting the DSS-OFDM + * option + */ /* Info Elts, length of INFORMATION portion of Info Elts */ -#define DOT11_MNG_DS_PARAM_LEN 1 -#define DOT11_MNG_IBSS_PARAM_LEN 2 +#define DOT11_MNG_DS_PARAM_LEN 1 /* d11 management DS parameter length */ +#define DOT11_MNG_IBSS_PARAM_LEN 2 /* d11 management IBSS parameter length */ /* TIM Info element has 3 bytes fixed info in INFORMATION field, - * followed by 1 to 251 bytes of Partial Virtual Bitmap */ -#define DOT11_MNG_TIM_FIXED_LEN 3 -#define DOT11_MNG_TIM_DTIM_COUNT 0 -#define DOT11_MNG_TIM_DTIM_PERIOD 1 -#define DOT11_MNG_TIM_BITMAP_CTL 2 -#define DOT11_MNG_TIM_PVB 3 + * followed by 1 to 251 bytes of Partial Virtual Bitmap + */ +#define DOT11_MNG_TIM_FIXED_LEN 3 /* d11 management TIM fixed length */ +#define DOT11_MNG_TIM_DTIM_COUNT 0 /* d11 management DTIM count */ +#define DOT11_MNG_TIM_DTIM_PERIOD 1 /* d11 management DTIM period */ +#define DOT11_MNG_TIM_BITMAP_CTL 2 /* d11 management TIM BITMAP control */ +#define DOT11_MNG_TIM_PVB 3 /* d11 management TIM PVB */ /* TLV defines */ -#define TLV_TAG_OFF 0 -#define TLV_LEN_OFF 1 -#define TLV_HDR_LEN 2 -#define TLV_BODY_OFF 2 +#define TLV_TAG_OFF 0 /* tag offset */ +#define TLV_LEN_OFF 1 /* length offset */ +#define TLV_HDR_LEN 2 /* header length */ +#define TLV_BODY_OFF 2 /* body offset */ /* Management Frame Information Element IDs */ -#define DOT11_MNG_SSID_ID 0 -#define DOT11_MNG_RATES_ID 1 -#define DOT11_MNG_FH_PARMS_ID 2 -#define DOT11_MNG_DS_PARMS_ID 3 -#define DOT11_MNG_CF_PARMS_ID 4 -#define DOT11_MNG_TIM_ID 5 -#define DOT11_MNG_IBSS_PARMS_ID 6 -#define DOT11_MNG_COUNTRY_ID 7 -#define DOT11_MNG_HOPPING_PARMS_ID 8 -#define DOT11_MNG_HOPPING_TABLE_ID 9 -#define DOT11_MNG_REQUEST_ID 10 -#define DOT11_MNG_CHALLENGE_ID 16 +#define DOT11_MNG_SSID_ID 0 /* d11 management SSID id */ +#define DOT11_MNG_RATES_ID 1 /* d11 management rates id */ +#define DOT11_MNG_FH_PARMS_ID 2 /* d11 management FH parameter id */ +#define DOT11_MNG_DS_PARMS_ID 3 /* d11 management DS parameter id */ +#define DOT11_MNG_CF_PARMS_ID 4 /* d11 management CF parameter id */ +#define DOT11_MNG_TIM_ID 5 /* d11 management TIM id */ +#define DOT11_MNG_IBSS_PARMS_ID 6 /* d11 management IBSS parameter id */ +#define DOT11_MNG_COUNTRY_ID 7 /* d11 management country id */ +#define DOT11_MNG_HOPPING_PARMS_ID 8 /* d11 management hopping parameter id */ +#define DOT11_MNG_HOPPING_TABLE_ID 9 /* d11 management hopping table id */ +#define DOT11_MNG_REQUEST_ID 10 /* d11 management request id */ +#define DOT11_MNG_QBSS_LOAD_ID 11 /* d11 management QBSS Load id */ +#define DOT11_MNG_CHALLENGE_ID 16 /* d11 management chanllenge id */ #define DOT11_MNG_PWR_CONSTRAINT_ID 32 /* 11H PowerConstraint */ #define DOT11_MNG_PWR_CAP_ID 33 /* 11H PowerCapability */ #define DOT11_MNG_TPC_REQUEST_ID 34 /* 11H TPC Request */ #define DOT11_MNG_TPC_REPORT_ID 35 /* 11H TPC Report */ #define DOT11_MNG_SUPP_CHANNELS_ID 36 /* 11H Supported Channels */ -#define DOT11_MNG_CHANNEL_SWITCH_ID 37 /* 11H ChannelSwitch Announcement*/ +#define DOT11_MNG_CHANNEL_SWITCH_ID 37 /* 11H ChannelSwitch Announcement */ #define DOT11_MNG_MEASURE_REQUEST_ID 38 /* 11H MeasurementRequest */ #define DOT11_MNG_MEASURE_REPORT_ID 39 /* 11H MeasurementReport */ #define DOT11_MNG_QUIET_ID 40 /* 11H Quiet */ #define DOT11_MNG_IBSS_DFS_ID 41 /* 11H IBSS_DFS */ -#define DOT11_MNG_ERP_ID 42 -#define DOT11_MNG_NONERP_ID 47 -#define DOT11_MNG_EXT_RATES_ID 50 -#define DOT11_MNG_WPA_ID 221 -#define DOT11_MNG_PROPR_ID 221 +#define DOT11_MNG_ERP_ID 42 /* d11 management ERP id */ +#define DOT11_MNG_TS_DELAY_ID 43 /* d11 management TS Delay id */ +#define DOT11_MNG_NONERP_ID 47 /* d11 management NON-ERP id */ +#define DOT11_MNG_RSN_ID 48 /* d11 management RSN id */ +#define DOT11_MNG_EXT_RATES_ID 50 /* d11 management ext. rates id */ +#define DOT11_MNG_WPA_ID 221 /* d11 management WPA id */ +#define DOT11_MNG_PROPR_ID 221 /* d11 management proprietary id */ + +/* Rate element Basic flag and rate mask */ +#define DOT11_RATE_BASIC 0x80 /* flag for a Basic Rate */ +#define DOT11_RATE_MASK 0x7F /* mask for numeric part of rate */ /* ERP info element bit values */ #define DOT11_MNG_ERP_LEN 1 /* ERP is currently 1 byte long */ -#define DOT11_MNG_NONERP_PRESENT 0x01 /* NonERP (802.11b) STAs are present in the BSS */ -#define DOT11_MNG_USE_PROTECTION 0x02 /* Use protection mechanisms for ERP-OFDM frames */ -#define DOT11_MNG_BARKER_PREAMBLE 0x04 /* Short Preambles: 0 == allowed, 1 == not allowed */ +#define DOT11_MNG_NONERP_PRESENT 0x01 /* NonERP (802.11b) STAs are present + *in the BSS + */ +#define DOT11_MNG_USE_PROTECTION 0x02 /* Use protection mechanisms for + *ERP-OFDM frames + */ +#define DOT11_MNG_BARKER_PREAMBLE 0x04 /* Short Preambles: 0 == allowed, + * 1 == not allowed + */ +/* TS Delay element offset & size */ +#define DOT11_MGN_TS_DELAY_LEN 4 /* length of TS DELAY IE */ +#define TS_DELAY_FIELD_SIZE 4 /* TS DELAY field size */ /* Capability Information Field */ -#define DOT11_CAP_ESS 0x0001 -#define DOT11_CAP_IBSS 0x0002 -#define DOT11_CAP_POLLABLE 0x0004 -#define DOT11_CAP_POLL_RQ 0x0008 -#define DOT11_CAP_PRIVACY 0x0010 -#define DOT11_CAP_SHORT 0x0020 -#define DOT11_CAP_PBCC 0x0040 -#define DOT11_CAP_AGILITY 0x0080 -#define DOT11_CAP_SPECTRUM 0x0100 -#define DOT11_CAP_SHORTSLOT 0x0400 -#define DOT11_CAP_CCK_OFDM 0x2000 +#define DOT11_CAP_ESS 0x0001 /* d11 cap. ESS */ +#define DOT11_CAP_IBSS 0x0002 /* d11 cap. IBSS */ +#define DOT11_CAP_POLLABLE 0x0004 /* d11 cap. pollable */ +#define DOT11_CAP_POLL_RQ 0x0008 /* d11 cap. poll request */ +#define DOT11_CAP_PRIVACY 0x0010 /* d11 cap. privacy */ +#define DOT11_CAP_SHORT 0x0020 /* d11 cap. short */ +#define DOT11_CAP_PBCC 0x0040 /* d11 cap. PBCC */ +#define DOT11_CAP_AGILITY 0x0080 /* d11 cap. agility */ +#define DOT11_CAP_SPECTRUM 0x0100 /* d11 cap. spectrum */ +#define DOT11_CAP_SHORTSLOT 0x0400 /* d11 cap. shortslot */ +#define DOT11_CAP_CCK_OFDM 0x2000 /* d11 cap. CCK/OFDM */ /* Action Frame Constants */ -#define DOT11_ACTION_CAT_ERR_MASK 0x80 -#define DOT11_ACTION_CAT_SPECT_MNG 0x00 +#define DOT11_ACTION_CAT_ERR_MASK 0x80 /* d11 action category error mask */ +#define DOT11_ACTION_CAT_MASK 0x7F /* d11 action category mask */ +#define DOT11_ACTION_CAT_SPECT_MNG 0x00 /* d11 action category spectrum management */ +#define DOT11_ACTION_CAT_BLOCKACK 0x03 /* d11 action category block ack */ #define DOT11_ACTION_NOTIFICATION 0x11 /* 17 */ -#define DOT11_ACTION_ID_M_REQ 0 -#define DOT11_ACTION_ID_M_REP 1 -#define DOT11_ACTION_ID_TPC_REQ 2 -#define DOT11_ACTION_ID_TPC_REP 3 -#define DOT11_ACTION_ID_CHANNEL_SWITCH 4 +#define DOT11_ACTION_ID_M_REQ 0 /* d11 action measurement request */ +#define DOT11_ACTION_ID_M_REP 1 /* d11 action measurement response */ +#define DOT11_ACTION_ID_TPC_REQ 2 /* d11 action TPC request */ +#define DOT11_ACTION_ID_TPC_REP 3 /* d11 action TPC response */ +#define DOT11_ACTION_ID_CHANNEL_SWITCH 4 /* d11 action channel switch */ + +/* HT (EWC) action ids */ +#define DOT11_ACTION_ID_HT_CH_WIDTH 0 /* mimo ps action frame id */ +#define DOT11_ACTION_ID_HT_MIMO_PS 1 /* mimo ps action frame id */ + +/* Block Ack action types */ +#define DOT11_BA_ACTION_ADDBA_REQ 0 /* ADDBA Req action frame type */ +#define DOT11_BA_ACTION_ADDBA_RESP 1 /* ADDBA Resp action frame type */ +#define DOT11_BA_ACTION_DELBA 2 /* DELBA action frame type */ + +/* ADDBA action parameters */ +#define DOT11_ADDBA_PARAM_POLICY_MASK 0x0002 /* policy mask(ack vs delayed) */ +#define DOT11_ADDBA_PARAM_POLICY_SHIFT 1 /* policy shift */ +#define DOT11_ADDBA_PARAM_TID_MASK 0x003c /* tid mask */ +#define DOT11_ADDBA_PARAM_TID_SHIFT 2 /* tid shift */ +#define DOT11_ADDBA_PARAM_BSIZE_MASK 0xffc0 /* buffer size mask */ +#define DOT11_ADDBA_PARAM_BSIZE_SHIFT 6 /* buffer size shift */ + +#define DOT11_ADDBA_POLICY_DELAYED 0 /* delayed BA policy */ +#define DOT11_ADDBA_POLICY_IMMEDIATE 1 /* immediate BA policy */ + +struct dot11_addba_req { + uint8 category; /* category of action frame (3) */ + uint8 action; /* action: addba req */ + uint8 token; /* identifier */ + uint16 addba_param_set; /* parameter set */ + uint16 timeout; /* timeout in seconds */ + uint16 start_seqnum; /* starting sequence number */ +}PACKED; +typedef struct dot11_addba_req dot11_addba_req_t; +#define DOT11_ADDBA_REQ_LEN 9 /* length of addba req frame */ + +struct dot11_addba_resp { + uint8 category; /* category of action frame (3) */ + uint8 action; /* action: addba resp */ + uint8 token; /* identifier */ + uint16 status; /* status of add request */ + uint16 addba_param_set; /* negotiated parameter set */ + uint16 timeout; /* negotiated timeout in seconds */ +}PACKED; +typedef struct dot11_addba_resp dot11_addba_resp_t; +#define DOT11_ADDBA_RESP_LEN 9 /* length of addba resp frame */ + +/* DELBA action parameters */ +#define DOT11_DELBA_PARAM_INIT_MASK 0x0800 /* initiator mask */ +#define DOT11_DELBA_PARAM_INIT_SHIFT 11 /* initiator shift */ +#define DOT11_DELBA_PARAM_TID_MASK 0xf000 /* tid mask */ +#define DOT11_DELBA_PARAM_TID_SHIFT 12 /* tid shift */ + +struct dot11_delba { + uint8 category; /* category of action frame (3) */ + uint8 action; /* action: addba req */ + uint16 delba_param_set; /* paarmeter set */ + uint16 reason; /* reason for dellba */ +}PACKED; +typedef struct dot11_delba dot11_delba_t; +#define DOT11_DELBA_LEN 6 /* length of delba frame */ /* MLME Enumerations */ -#define DOT11_BSSTYPE_INFRASTRUCTURE 0 -#define DOT11_BSSTYPE_INDEPENDENT 1 -#define DOT11_BSSTYPE_ANY 2 -#define DOT11_SCANTYPE_ACTIVE 0 -#define DOT11_SCANTYPE_PASSIVE 1 +#define DOT11_BSSTYPE_INFRASTRUCTURE 0 /* d11 infrastructure */ +#define DOT11_BSSTYPE_INDEPENDENT 1 /* d11 independent */ +#define DOT11_BSSTYPE_ANY 2 /* d11 any BSS type */ +#define DOT11_SCANTYPE_ACTIVE 0 /* d11 scan active */ +#define DOT11_SCANTYPE_PASSIVE 1 /* d11 scan passive */ + +/* 802.11 BRCM "Compromise" Pre N constants */ +#define PREN_PREAMBLE 24 /* green field preamble time */ +#define PREN_MM_EXT 16 /* extra mixed mode preamble time */ +#define PREN_PREAMBLE_EXT 4 /* extra preamble (multiply by unique_streams-1) */ /* 802.11 A PHY constants */ -#define APHY_SLOT_TIME 9 -#define APHY_SIFS_TIME 16 -#define APHY_DIFS_TIME (APHY_SIFS_TIME + (2 * APHY_SLOT_TIME)) -#define APHY_PREAMBLE_TIME 16 -#define APHY_SIGNAL_TIME 4 -#define APHY_SYMBOL_TIME 4 -#define APHY_SERVICE_NBITS 16 -#define APHY_TAIL_NBITS 6 -#define APHY_CWMIN 15 +#define APHY_SLOT_TIME 9 /* APHY slot time */ +#define APHY_SIFS_TIME 16 /* APHY SIFS time */ +#define APHY_DIFS_TIME (APHY_SIFS_TIME + (2 * APHY_SLOT_TIME)) /* APHY DIFS time */ +#define APHY_PREAMBLE_TIME 16 /* APHY preamble time */ +#define APHY_SIGNAL_TIME 4 /* APHY signal time */ +#define APHY_SYMBOL_TIME 4 /* APHY symbol time */ +#define APHY_SERVICE_NBITS 16 /* APHY service nbits */ +#define APHY_TAIL_NBITS 6 /* APHY tail nbits */ +#define APHY_CWMIN 15 /* APHY cwmin */ /* 802.11 B PHY constants */ -#define BPHY_SLOT_TIME 20 -#define BPHY_SIFS_TIME 10 -#define BPHY_DIFS_TIME 50 -#define BPHY_PLCP_TIME 192 -#define BPHY_PLCP_SHORT_TIME 96 -#define BPHY_CWMIN 31 +#define BPHY_SLOT_TIME 20 /* BPHY slot time */ +#define BPHY_SIFS_TIME 10 /* BPHY SIFS time */ +#define BPHY_DIFS_TIME 50 /* BPHY DIFS time */ +#define BPHY_PLCP_TIME 192 /* BPHY PLCP time */ +#define BPHY_PLCP_SHORT_TIME 96 /* BPHY PLCP short time */ +#define BPHY_CWMIN 31 /* BPHY cwmin */ /* 802.11 G constants */ -#define DOT11_OFDM_SIGNAL_EXTENSION 6 +#define DOT11_OFDM_SIGNAL_EXTENSION 6 /* d11 OFDM signal extension */ -#define PHY_CWMAX 1023 +#define PHY_CWMAX 1023 /* PHY cwmax */ #define DOT11_MAXNUMFRAGS 16 /* max # fragments per MSDU */ @@ -788,41 +1049,186 @@ typedef struct d11cnt { } d11cnt_t; /* BRCM OUI */ -#define BRCM_OUI "\x00\x10\x18" +#define BRCM_OUI "\x00\x10\x18" /* Broadcom OUI */ + +/* OUI for BRCM proprietary IE */ +#define BRCM_PROP_OUI "\x00\x90\x4C" /* Broadcom proprietary OUI */ /* BRCM info element */ struct brcm_ie { - uchar id; - uchar len; - uchar oui[3]; - uchar ver; - uchar assoc; /* # of assoc STAs */ - uchar flags; /* misc flags */ -} PACKED; -#define BRCM_IE_LEN 8 + uint8 id; /* IE ID, 221, DOT11_MNG_PROPR_ID */ + uint8 len; /* IE length */ + uint8 oui[3]; /* Proprietary OUI, BRCM_OUI */ + uint8 ver; /* type/ver of this IE */ + uint8 assoc; /* # of assoc STAs */ + uint8 flags; /* misc flags */ + uint8 flags1; /* misc flags */ + uint16 amsdu_mtu_pref; /* preferred A-MSDU MTU */ +} PACKED; typedef struct brcm_ie brcm_ie_t; -#define BRCM_IE_VER 1 +#define BRCM_IE_LEN 11 /* BRCM IE length */ +#define BRCM_IE_VER 2 /* BRCM IE version */ +#define BRCM_IE_LEGACY_AES_VER 1 /* BRCM IE legacy AES version */ /* brcm_ie flags */ #define BRF_ABCAP 0x1 /* afterburner capable */ #define BRF_ABRQRD 0x2 /* afterburner requested */ +#define BRF_LZWDS 0x4 /* lazy wds enabled */ +#define BRF_BLOCKACK 0x8 /* BlockACK capable */ +#define BRF_ABCOUNTER_MASK 0xf0 /* afterburner wds "state" counter */ +#define BRF_ABCOUNTER_SHIFT 4 /* offset of afterburner wds "state" counter */ + +/* brcm_ie flags1 */ +#define BRF1_AMSDU 0x1 /* A-MSDU capable */ + +#define AB_WDS_TIMEOUT_MAX 15 /* afterburner wds Max count indicating not + * locally capable + */ +#define AB_WDS_TIMEOUT_MIN 1 /* afterburner wds, use zero count as indicating + * "downrev" + */ + +/* EWC definitions */ +#define MCSSET_LEN 16 /* 16-bits per 8-bit set to give 128-bits bitmap of MCS Index */ + +struct ewc_cap { + uint16 cap; + uint8 params; + uint8 supp_mcs[MCSSET_LEN]; + uint16 ext_htcap; + uint32 txbf_cap; + uint8 as_cap; +} PACKED; +typedef struct ewc_cap ewc_cap_t; + +/* CAP IE: EWC 1.0 spec. simply stole a 802.11 IE, we use our prop. IE until this is resolved */ +/* the capability IE is primarily used to convey this nodes abilities */ +struct ewc_cap_ie { + uint8 id; /* IE ID, 221, DOT11_MNG_PROPR_ID */ + uint8 len; /* IE length */ + uint8 oui[3]; /* Proprietary OUI, BRCM_PROP_OUI */ + uint8 type; /* type inidicates what follows */ + ewc_cap_t cap; +} PACKED; +typedef struct ewc_cap_ie ewc_cap_ie_t; + +#define EWC_CAP_IE_LEN (26+4) +#define EWC_CAP_IE_TYPE 51 + +#define EWC_CAP_ADC_CODING 0x0001 /* Advance coding support */ +#define EWC_CAP_40MHZ 0x0002 /* FALSE:20Mhz, TRUE: 20 and 40MHZ supported */ +#define EWC_CAP_MIMO_PS_MASK 0x000C /* Mimo PS mask */ +#define EWC_CAP_MIMO_PS_SHIFT 0x0002 /* Mimo PS shift */ +#define EWC_CAP_MIMO_PS_OFF 0x0003 /* Mimo PS, no restriction */ +#define EWC_CAP_MIMO_PS_RTS 0x0001 /* Mimo PS, send RTS/CTS around MIMO frames */ +#define EWC_CAP_MIMO_PS_ON 0x0000 /* Mimo PS, MIMO disallowed */ +#define EWC_CAP_GF 0x0010 /* Greenfield preamble support */ +#define EWC_CAP_SHORT_GI_20 0x0020 /* 20MHZ short guard interval support */ +#define EWC_CAP_SHORT_GI_40 0x0040 /* 40Mhz short guard interval support */ +#define EWC_CAP_TX_STBC 0x0080 /* Tx STBC support */ +#define EWC_CAP_RX_STBC_MASK 0x0300 /* Rx STBC mask */ +#define EWC_CAP_RX_STBC_SHIFT 8 /* Rx STBC shift */ +#define EWC_CAP_DELAYED_BA 0x0400 /* delayed BA support */ +#define EWC_CAP_MAX_AMSDU 0x0800 /* Max AMSDU size in bytes , 0=3839, 1=7935 */ +#define EWC_CAP_DSSS_CCK 0x1000 /* DSSS/CCK supported by the BSS */ +#define EWC_CAP_PSMP 0x2000 /* Power Save Multi Poll support */ +#define EWC_CAP_STBC_CTL 0x4000 /* STBC control frame support */ +#define EWC_CAP_LSIG_TXOP 0x8000 /* L-SIG TXOP protection support */ + +#define EWC_MAX_AMSDU 7935 /* max amsdu size (bytes) per the EWC spec */ +#define EWC_MIN_AMSDU 3835 /* min amsdu size (bytes) per the EWC spec */ + +#define EWC_PARAMS_RX_FACTOR_MASK 0x03 /* ampdu rcv factor mask */ +#define EWC_PARAMS_DENSITY_MASK 0x1C /* ampdu density mask */ +#define EWC_PARAMS_DENSITY_SHIFT 2 /* ampdu density shift */ + +/* EWC/AMPDU specific define */ +#define AMPDU_MAX_MPDU_DENSITY 7 /* max mpdu density; in 1/8 usec units */ +#define AMPDU_MAX_RX_FACTOR 3 /* max rcv ampdu len (64kb) */ +#define AMPDU_RX_FACTOR_BASE 8*1024 /* ampdu factor base for rx len */ +#define AMPDU_DELIMITER_LEN 4 /* length of ampdu delimiter */ + +struct ewc_add { + uint8 ctl_ch; /* control channel number */ + uint8 byte1; /* ext ch,rec. ch. width, RIFS support */ + uint16 opmode; /* operation mode */ + uint16 misc_bits; /* misc bits */ + uint8 basic_mcs[MCSSET_LEN]; /* required MCS set */ +} PACKED; +typedef struct ewc_add ewc_add_t; + +/* ADD IE: EWC 1.0 spec. simply stole a 802.11 IE, we use our prop. IE until this is resolved */ +/* the additional IE is primarily used to convey the current BSS configuration */ +struct ewc_add_ie { + uint8 id; /* IE ID, 221, DOT11_MNG_PROPR_ID */ + uint8 len; /* IE length */ + uint8 oui[3]; /* Proprietary OUI, BRCM_PROP_OUI */ + uint8 type; /* indicates what follows */ + ewc_add_t add; +} PACKED; +typedef struct ewc_add_ie ewc_add_ie_t; + +#define EWC_ADD_IE_LEN (22+4) +#define EWC_ADD_IE_TYPE 52 + +/* byte1 defn's */ +#define EWC_EXT_CH_MASK 0x03 /* extension channel mask */ +#define EWC_EXT_CH_UPPER 0x01 /* ext. ch. on upper sb */ +#define EWC_EXT_CH_LOWER 0x03 /* ext. ch. on lower sb */ +#define EWC_EXT_CH_NONE 0x00 /* extension channel mask */ +#define EWC_BW_ANY 0x04 /* set, STA can use 20 or 40MHz */ +#define EWC_RIFS_PERMITTED 0x08 /* RIFS allowed */ + +/* opmode defn's */ +#define EWC_OPMODE_MASK 0x0003 /* protection mode mask */ +#define EWC_OPMODE_PURE 0x0000 /* protection mode PURE */ +#define EWC_OPMODE_HT20IN40 0x0002 /* protection mode 20MHz HT in 40MHz BSS */ +#define EWC_OPMODE_MIXED 0x0003 /* protection mode Mixed Mode */ +#define EWC_NONGF_PRESENT 0x0004 /* protection mode non-GF */ + +/* misc_bites defn's */ +#define EWC_BASIC_STBC_MCS 0x007f /* basic STBC MCS */ +#define EWC_DUAL_STBC_PROT 0x0080 /* Dual STBC Protection */ +#define EWC_SECOND_BCN 0x0100 /* Secondary beacon support */ +#define EWC_LSIG_TXOP 0x0200 /* L-SIG TXOP Protection full support */ +#define EWC_PCO_ACTIVE 0x0400 /* PCO active */ +#define EWC_PCO_PHASE 0x0800 /* PCO phase */ + +/* Macros for opmode */ +#define EWC_MIXEDMODE_PRESENT(add) ((ltoh16_ua(&add.opmode) & EWC_OPMODE_MASK) \ + == EWC_OPMODE_MIXED) /* mixed mode present */ +#define EWC_HT20_PRESENT(add) ((ltoh16_ua(&add.opmode) & EWC_OPMODE_MASK) \ + == EWC_OPMODE_HT20IN40) /* 20MHz HT present */ +#define EWC_USE_PROTECTION(add) (EWC_HT20_PRESENT((add)) || \ + EWC_MIXEDMODE_PRESENT((add))) /* use protection */ + +/* Vendor IE structure */ +struct vndr_ie { + uchar id; + uchar len; + uchar oui [3]; + uchar data [1]; /* Variable size data */ +}PACKED; +typedef struct vndr_ie vndr_ie_t; + +#define VNDR_IE_HDR_LEN 2 /* id + len field */ +#define VNDR_IE_MIN_LEN 3 /* size of the oui field */ +#define VNDR_IE_MAX_LEN 256 /* verdor IE max length */ /* WPA definitions */ -#define WPA_VERSION 1 -#define WPA_OUI "\x00\x50\xF2" +#define WPA_VERSION 1 /* WPA version */ +#define WPA_OUI "\x00\x50\xF2" /* WPA OUI */ -#define WPA_OUI_LEN 3 +#define WPA2_VERSION 1 /* WPA2 version */ +#define WPA2_VERSION_LEN 2 /* WAP2 version length */ +#define WPA2_OUI "\x00\x0F\xAC" /* WPA2 OUI */ -/* WPA authentication modes */ -#define WPA_AUTH_NONE 0 /* None */ -#define WPA_AUTH_UNSPECIFIED 1 /* Unspecified authentication over 802.1X: default for WPA */ -#define WPA_AUTH_PSK 2 /* Pre-shared Key over 802.1X */ -#define WPA_AUTH_DISABLED 255 /* Legacy (i.e., non-WPA) */ - -#define IS_WPA_AUTH(auth) ((auth) == WPA_AUTH_NONE || \ - (auth) == WPA_AUTH_UNSPECIFIED || \ - (auth) == WPA_AUTH_PSK) +#define WPA_OUI_LEN 3 /* WPA OUI length */ +/* RSN authenticated key managment suite */ +#define RSN_AKM_NONE 0 /* None (IBSS) */ +#define RSN_AKM_UNSPECIFIED 1 /* Over 802.1x */ +#define RSN_AKM_PSK 2 /* Pre-shared Key */ /* Key related defines */ #define DOT11_MAX_DEFAULT_KEYS 4 /* number of default keys */ @@ -840,8 +1246,8 @@ typedef struct brcm_ie brcm_ie_t; #define TKIP_KEY_SIZE 32 /* size of any TKIP key */ #define TKIP_MIC_AUTH_TX 16 /* offset to Authenticator MIC TX key */ #define TKIP_MIC_AUTH_RX 24 /* offset to Authenticator MIC RX key */ -#define TKIP_MIC_SUP_RX 16 /* offset to Supplicant MIC RX key */ -#define TKIP_MIC_SUP_TX 24 /* offset to Supplicant MIC TX key */ +#define TKIP_MIC_SUP_RX TKIP_MIC_AUTH_TX /* offset to Supplicant MIC RX key */ +#define TKIP_MIC_SUP_TX TKIP_MIC_AUTH_RX /* offset to Supplicant MIC TX key */ #define AES_KEY_SIZE 16 /* size of AES key */ #undef PACKED diff --git a/package/wlcompat/src/include/proto/bcmeth.h b/package/wlcompat/src/include/proto/bcmeth.h new file mode 100644 index 000000000..7b3295389 --- /dev/null +++ b/package/wlcompat/src/include/proto/bcmeth.h @@ -0,0 +1,101 @@ +/* + * Broadcom Ethernettype protocol definitions + * + * Copyright 2006, Broadcom Corporation + * All Rights Reserved. + * + * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY + * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM + * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. + * + * $Id: bcmeth.h,v 1.1.1.4 2006/02/27 03:43:16 honor Exp $ + */ + +/* + * Broadcom Ethernet protocol defines + */ + +#ifndef _BCMETH_H_ +#define _BCMETH_H_ + +/* enable structure packing */ +#if defined(__GNUC__) +#define PACKED __attribute__((packed)) +#else +#pragma pack(1) +#define PACKED +#endif + +/* ETHER_TYPE_BRCM is defined in ethernet.h */ + +/* + * Following the 2byte BRCM ether_type is a 16bit BRCM subtype field + * in one of two formats: (only subtypes 32768-65535 are in use now) + * + * subtypes 0-32767: + * 8 bit subtype (0-127) + * 8 bit length in bytes (0-255) + * + * subtypes 32768-65535: + * 16 bit big-endian subtype + * 16 bit big-endian length in bytes (0-65535) + * + * length is the number of additional bytes beyond the 4 or 6 byte header + * + * Reserved values: + * 0 reserved + * 5-15 reserved for iLine protocol assignments + * 17-126 reserved, assignable + * 127 reserved + * 32768 reserved + * 32769-65534 reserved, assignable + * 65535 reserved + */ + +/* + * While adding the subtypes and their specific processing code make sure + * bcmeth_bcm_hdr_t is the first data structure in the user specific data structure definition + */ + +#define BCMILCP_SUBTYPE_RATE 1 +#define BCMILCP_SUBTYPE_LINK 2 +#define BCMILCP_SUBTYPE_CSA 3 +#define BCMILCP_SUBTYPE_LARQ 4 +#define BCMILCP_SUBTYPE_VENDOR 5 +#define BCMILCP_SUBTYPE_FLH 17 + +#define BCMILCP_SUBTYPE_VENDOR_LONG 32769 +#define BCMILCP_SUBTYPE_CERT 32770 +#define BCMILCP_SUBTYPE_SES 32771 + + +#define BCMILCP_BCM_SUBTYPE_RESERVED 0 +#define BCMILCP_BCM_SUBTYPE_EVENT 1 +#define BCMILCP_BCM_SUBTYPE_SES 2 +/* + * The EAPOL type is not used anymore. Instead EAPOL messages are now embedded + * within BCMILCP_BCM_SUBTYPE_EVENT type messages + */ +/* #define BCMILCP_BCM_SUBTYPE_EAPOL 3 */ + +#define BCMILCP_BCM_SUBTYPEHDR_MINLENGTH 8 +#define BCMILCP_BCM_SUBTYPEHDR_VERSION 0 + +/* These fields are stored in network order */ +typedef struct bcmeth_hdr +{ + uint16 subtype; /* Vendor specific..32769 */ + uint16 length; + uint8 version; /* Version is 0 */ + uint8 oui[3]; /* Broadcom OUI */ + /* user specific Data */ + uint16 usr_subtype; +} PACKED bcmeth_hdr_t; + +#undef PACKED +#if !defined(__GNUC__) +#pragma pack() +#endif + +#endif /* _BCMETH_H_ */ diff --git a/package/wlcompat/src/include/proto/bcmevent.h b/package/wlcompat/src/include/proto/bcmevent.h new file mode 100644 index 000000000..d922a5d21 --- /dev/null +++ b/package/wlcompat/src/include/proto/bcmevent.h @@ -0,0 +1,152 @@ +/* + * Broadcom Event protocol definitions + * + * Copyright 2006, Broadcom Corporation + * All Rights Reserved. + * + * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY + * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM + * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. + * + * + * Dependencies: proto/bcmeth.h + * + * $Id: bcmevent.h,v 1.1.1.3 2006/02/27 03:43:16 honor Exp $ + * + */ + +/* + * Broadcom Ethernet Events protocol defines + * + */ + +#ifndef _BCMEVENT_H_ +#define _BCMEVENT_H_ + +/* enable structure packing */ +#if defined(__GNUC__) +#define PACKED __attribute__((packed)) +#else +#pragma pack(1) +#define PACKED +#endif /* defined(__GNUC__) */ + +#define BCM_EVENT_MSG_VERSION 1 /* wl_event_msg_t struct version */ +#define BCM_MSG_IFNAME_MAX 16 /* max length of interface name */ + +/* flags */ +#define WLC_EVENT_MSG_LINK 0x01 /* link is up */ +#define WLC_EVENT_MSG_FLUSHTXQ 0x02 /* flush tx queue on MIC error */ +#define WLC_EVENT_MSG_GROUP 0x04 /* group MIC error */ + +/* theses fields are stored in network order */ +typedef struct +{ + uint16 version; + uint16 flags; /* see flags below */ + uint32 event_type; /* Message (see below) */ + uint32 status; /* Status code (see below) */ + uint32 reason; /* Reason code (if applicable) */ + uint32 auth_type; /* WLC_E_AUTH */ + uint32 datalen; /* data buf */ + struct ether_addr addr; /* Station address (if applicable) */ + char ifname[BCM_MSG_IFNAME_MAX]; /* name of the packet incoming interface */ +} PACKED wl_event_msg_t; + +/* used by driver msgs */ +typedef struct bcm_event { + struct ether_header eth; + bcmeth_hdr_t bcm_hdr; + wl_event_msg_t event; + /* data portion follows */ +} PACKED bcm_event_t; + +#define BCM_MSG_LEN (sizeof(bcm_event_t) - sizeof(bcmeth_hdr_t) - sizeof(struct ether_header)) + +/* Event messages */ +#define WLC_E_SET_SSID 0 /* indicates status of set SSID */ +#define WLC_E_JOIN 1 /* differentiates join IBSS from found (WLC_E_START) IBSS */ +#define WLC_E_START 2 /* STA founded an IBSS or AP started a BSS */ +#define WLC_E_AUTH 3 /* 802.11 AUTH request */ +#define WLC_E_AUTH_IND 4 /* 802.11 AUTH indication */ +#define WLC_E_DEAUTH 5 /* 802.11 DEAUTH request */ +#define WLC_E_DEAUTH_IND 6 /* 802.11 DEAUTH indication */ +#define WLC_E_ASSOC 7 /* 802.11 ASSOC request */ +#define WLC_E_ASSOC_IND 8 /* 802.11 ASSOC indication */ +#define WLC_E_REASSOC 9 /* 802.11 REASSOC request */ +#define WLC_E_REASSOC_IND 10 /* 802.11 REASSOC indication */ +#define WLC_E_DISASSOC 11 /* 802.11 DISASSOC request */ +#define WLC_E_DISASSOC_IND 12 /* 802.11 DISASSOC indication */ +#define WLC_E_QUIET_START 13 /* 802.11h Quiet period started */ +#define WLC_E_QUIET_END 14 /* 802.11h Quiet period ended */ +#define WLC_E_BEACON_RX 15 /* BEACONS received/lost indication */ +#define WLC_E_LINK 16 /* generic link indication */ +#define WLC_E_MIC_ERROR 17 /* TKIP MIC error occurred */ +#define WLC_E_NDIS_LINK 18 /* NDIS style link indication */ +#define WLC_E_ROAM 19 /* roam attempt occurred: indicate status & reason */ +#define WLC_E_TXFAIL 20 /* change in dot11FailedCount (txfail) */ +#define WLC_E_PMKID_CACHE 21 /* WPA2 pmkid cache indication */ +#define WLC_E_RETROGRADE_TSF 22 /* current AP's TSF value went backward */ +#define WLC_E_PRUNE 23 /* AP was pruned from join list for reason */ +#define WLC_E_AUTOAUTH 24 /* report AutoAuth table entry match for join attempt */ +#define WLC_E_EAPOL_MSG 25 /* Event encapsulating an EAPOL message */ +#define WLC_E_SCAN_COMPLETE 26 /* Scan results are ready or scan was aborted */ +#define WLC_E_ADDTS_IND 27 /* indicate to host addts fail/success */ +#define WLC_E_DELTS_IND 28 /* indicate to host delts fail/success */ +#define WLC_E_BCNSENT_IND 29 /* indicate to host of beacon transmit */ +#define WLC_E_BCNRX_MSG 30 /* Send the received beacon up to the host */ +#define WLC_E_LAST 31 /* highest val + 1 for range checking */ + +/* Event status codes */ +#define WLC_E_STATUS_SUCCESS 0 /* operation was successful */ +#define WLC_E_STATUS_FAIL 1 /* operation failed */ +#define WLC_E_STATUS_TIMEOUT 2 /* operation timed out */ +#define WLC_E_STATUS_NO_NETWORKS 3 /* failed due to no matching network found */ +#define WLC_E_STATUS_ABORT 4 /* operation was aborted */ +#define WLC_E_STATUS_NO_ACK 5 /* protocol failure: packet not ack'd */ +#define WLC_E_STATUS_UNSOLICITED 6 /* AUTH or ASSOC packet was unsolicited */ +#define WLC_E_STATUS_ATTEMPT 7 /* attempt to assoc to an auto auth configuration */ + +/* roam reason codes */ +#define WLC_E_REASON_INITIAL_ASSOC 0 /* initial assoc */ +#define WLC_E_REASON_LOW_RSSI 1 /* roamed due to low RSSI */ +#define WLC_E_REASON_DEAUTH 2 /* roamed due to DEAUTH indication */ +#define WLC_E_REASON_DISASSOC 3 /* roamed due to DISASSOC indication */ +#define WLC_E_REASON_BCNS_LOST 4 /* roamed due to lost beacons */ +#define WLC_E_REASON_FAST_ROAM_FAILED 5 /* roamed due to fast roam failure */ +#define WLC_E_REASON_DIRECTED_ROAM 6 /* roamed due to request by AP */ +#define WLC_E_REASON_TSPEC_REJECTED 7 /* roamed due to TSPEC rejection */ +#define WLC_E_REASON_BETTER_AP 8 /* roamed due to finding better AP */ + +/* prune reason codes */ +#define WLC_E_PRUNE_ENCR_MISMATCH 1 /* ecryption mismatch */ +#define WLC_E_PRUNE_BCAST_BSSID 2 /* AP uses a broadcast BSSID */ +#define WLC_E_PRUNE_MAC_DENY 3 /* STA's MAC addr is in AP's MAC deny list */ +#define WLC_E_PRUNE_MAC_NA 4 /* STA's MAC addr is not in AP's MAC allow list */ +#define WLC_E_PRUNE_REG_PASSV 5 /* AP not allowed due to regulatory restriction */ +#define WLC_E_PRUNE_SPCT_MGMT 6 /* AP does not support STA locale spectrum mgmt */ +#define WLC_E_PRUNE_RADAR 7 /* AP is on a radar channel of STA locale */ +#define WLC_E_RSN_MISMATCH 8 /* STA does not support AP's RSN */ +#define WLC_E_PRUNE_NO_COMMON_RATES 9 /* No rates in common with AP */ +#define WLC_E_PRUNE_BASIC_RATES 10 /* STA does not support all basic rates of BSS */ +#define WLC_E_PRUNE_CCXFAST_PREVAP 11 /* CCX FAST ROAM: prune previous AP */ +#define WLC_E_PRUNE_CIPHER_NA 12 /* BSS's cipher not supported */ +#define WLC_E_PRUNE_KNOWN_STA 13 /* AP is already known to us as a STA */ +#define WLC_E_PRUNE_CCXFAST_DROAM 14 /* CCX FAST ROAM: prune unqulified AP */ +#define WLC_E_PRUNE_WDS_PEER 15 /* AP is already known to us as a WDS peer */ +#define WLC_E_PRUNE_QBSS_LOAD 16 /* QBSS LOAD - AAC is too low */ +#define WLC_E_PRUNE_HOME_AP 17 /* prune home AP */ + +/* WLC_SET_CALLBACK data type */ +typedef struct wlc_event_cb { + void (*fn)(void *, bcm_event_t *); /* Callback function */ + void *context; /* Passed to callback function */ +} wlc_event_cb_t; + +#undef PACKED +#if !defined(__GNUC__) +#pragma pack() +#endif /* PACKED */ + +#endif /* _BCMEVENT_H_ */ diff --git a/package/wlcompat/src/include/proto/ethernet.h b/package/wlcompat/src/include/proto/ethernet.h index 173464af6..38313ce52 100644 --- a/package/wlcompat/src/include/proto/ethernet.h +++ b/package/wlcompat/src/include/proto/ethernet.h @@ -1,14 +1,16 @@ -/******************************************************************************* - * $Id$ - * Copyright 2004, Broadcom Corporation - * All Rights Reserved. - * - * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY - * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM - * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. +/* * From FreeBSD 2.2.7: Fundamental constants relating to ethernet. - ******************************************************************************/ + * + * Copyright 2006, Broadcom Corporation + * All Rights Reserved. + * + * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY + * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM + * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. + * + * $Id$ + */ #ifndef _NET_ETHERNET_H_ /* use native BSD ethernet.h when available */ #define _NET_ETHERNET_H_ @@ -17,111 +19,80 @@ #include "typedefs.h" #endif +/* enable structure packing */ #if defined(__GNUC__) #define PACKED __attribute__((packed)) #else +#pragma pack(1) #define PACKED #endif /* * The number of bytes in an ethernet (MAC) address. */ -#ifndef ETHER_ADDR_LEN #define ETHER_ADDR_LEN 6 -#endif /* * The number of bytes in the type field. */ -#ifndef ETHER_TYPE_LEN #define ETHER_TYPE_LEN 2 -#endif /* * The number of bytes in the trailing CRC field. */ -#ifndef ETHER_CRC_LEN #define ETHER_CRC_LEN 4 -#endif /* * The length of the combined header. */ -#ifndef ETHER_HDR_LEN #define ETHER_HDR_LEN (ETHER_ADDR_LEN*2+ETHER_TYPE_LEN) -#endif /* * The minimum packet length. */ -#ifndef ETHER_MIN_LEN #define ETHER_MIN_LEN 64 -#endif /* * The minimum packet user data length. */ -#ifndef ETHER_MIN_DATA #define ETHER_MIN_DATA 46 -#endif /* * The maximum packet length. */ -#ifndef ETHER_MAX_LEN #define ETHER_MAX_LEN 1518 -#endif /* * The maximum packet user data length. */ #define ETHER_MAX_DATA 1500 -/* - * Used to uniquely identify a 802.1q VLAN-tagged header. - */ -#define VLAN_TAG 0x8100 - -/* - * Located after dest & src address in ether header. - */ -#define VLAN_FIELDS_OFFSET (ETHER_ADDR_LEN * 2) - -/* - * 4 bytes of vlan field info. - */ -#define VLAN_FIELDS_SIZE 4 - -/* location of bits in 16-bit vlan fields */ -#define VLAN_PRI_SHIFT 13 /* user priority */ -#define VLAN_CFI_SHIFT 12 /* canonical format indicator bit */ - -/* 3 bits of priority */ -#define VLAN_PRI_MASK 7 -/* 12 bits of vlan identfier (VID) */ -#define VLAN_VID_MASK 0xFFF /* VLAN identifier (VID) field */ - -struct vlan_tags { - uint16 tag_type; /* 0x8100 for VLAN */ - uint16 tag_control; /* prio | cfi | vid */ -} PACKED ; - -/* 802.1X ethertype */ - +/* ether types */ #define ETHER_TYPE_IP 0x0800 /* IP */ +#define ETHER_TYPE_ARP 0x0806 /* ARP */ +#define ETHER_TYPE_8021Q 0x8100 /* 802.1Q */ #define ETHER_TYPE_BRCM 0x886c /* Broadcom Corp. */ #define ETHER_TYPE_802_1X 0x888e /* 802.1x */ +#ifdef BCMWPA2 +#define ETHER_TYPE_802_1X_PREAUTH 0x88c7 /* 802.1x preauthentication */ +#endif -#define ETHER_BRCM_SUBTYPE_LEN 4 /* Broadcom 4byte subtype follows ethertype */ +/* Broadcom subtype follows ethertype; First 2 bytes are reserved; Next 2 are subtype; */ +#define ETHER_BRCM_SUBTYPE_LEN 4 /* Broadcom 4 byte subtype */ #define ETHER_BRCM_CRAM 0x1 /* Broadcom subtype cram protocol */ +/* ether header */ +#define ETHER_DEST_OFFSET 0 /* dest address offset */ +#define ETHER_SRC_OFFSET 6 /* src address offset */ +#define ETHER_TYPE_OFFSET 12 /* ether type offset */ + /* * A macro to validate a length with */ #define ETHER_IS_VALID_LEN(foo) \ ((foo) >= ETHER_MIN_LEN && (foo) <= ETHER_MAX_LEN) -#ifndef __NET_ETHERNET_H + #ifndef __INCif_etherh /* Quick and ugly hack for VxWorks */ /* * Structure of a 10Mb/s Ethernet header. @@ -130,16 +101,21 @@ struct ether_header { uint8 ether_dhost[ETHER_ADDR_LEN]; uint8 ether_shost[ETHER_ADDR_LEN]; uint16 ether_type; -} PACKED ; +} PACKED; /* * Structure of a 48-bit Ethernet address. */ struct ether_addr { uint8 octet[ETHER_ADDR_LEN]; -} PACKED ; -#endif -#endif +} PACKED; +#endif /* !__INCif_etherh Quick and ugly hack for VxWorks */ + +/* + * Takes a pointer, sets locally admininistered + * address bit in the 48-bit Ethernet address. + */ +#define ETHER_SET_LOCALADDR(ea) (((uint8 *)(ea))[0] = (((uint8 *)(ea))[0] | 2)) /* * Takes a pointer, returns true if a 48-bit multicast address @@ -147,6 +123,18 @@ struct ether_addr { */ #define ETHER_ISMULTI(ea) (((uint8 *)(ea))[0] & 1) + +/* compare two ethernet addresses - assumes the pointers can be referenced as shorts */ +#define ether_cmp(a, b) (!(((short*)a)[0] == ((short*)b)[0]) | \ + !(((short*)a)[1] == ((short*)b)[1]) | \ + !(((short*)a)[2] == ((short*)b)[2])) + +/* copy an ethernet address - assumes the pointers can be referenced as shorts */ +#define ether_copy(s, d) { \ + ((short*)d)[0] = ((short*)s)[0]; \ + ((short*)d)[1] = ((short*)s)[1]; \ + ((short*)d)[2] = ((short*)s)[2]; } + /* * Takes a pointer, returns true if a 48-bit broadcast (all ones) */ @@ -169,11 +157,9 @@ static const struct ether_addr ether_bcast = {{255, 255, 255, 255, 255, 255}}; ((uint8 *)(ea))[4] | \ ((uint8 *)(ea))[5]) == 0) -/* Differentiated Services Codepoint - lower 6 bits of tos in iphdr */ -#define DSCP_PRI_MASK 0x3F /* bits 0-6 */ -#define DSCP_WME_PRI_MASK 0x38 /* bits 3-6 */ -#define DSCP_WME_PRI_SHIFT 3 - #undef PACKED +#if !defined(__GNUC__) +#pragma pack() +#endif #endif /* _NET_ETHERNET_H_ */ diff --git a/package/wlcompat/src/include/proto/wpa.h b/package/wlcompat/src/include/proto/wpa.h new file mode 100644 index 000000000..dd35dbef0 --- /dev/null +++ b/package/wlcompat/src/include/proto/wpa.h @@ -0,0 +1,148 @@ +/* + * Fundamental types and constants relating to WPA + * + * Copyright 2006, Broadcom Corporation + * All Rights Reserved. + * + * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY + * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM + * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. + * + * $Id: wpa.h,v 1.1.1.4 2006/02/27 03:43:16 honor Exp $ + */ + +#ifndef _proto_wpa_h_ +#define _proto_wpa_h_ + +#include <typedefs.h> +#include <proto/ethernet.h> + +/* enable structure packing */ +#if defined(__GNUC__) +#define PACKED __attribute__((packed)) +#else +#pragma pack(1) +#define PACKED +#endif + +/* Reason Codes */ + +/* 10 and 11 are from TGh. */ +#define DOT11_RC_BAD_PC 10 /* Unacceptable power capability element */ +#define DOT11_RC_BAD_CHANNELS 11 /* Unacceptable supported channels element */ +/* 12 is unused */ +/* 13 through 23 taken from P802.11i/D3.0, November 2002 */ +#define DOT11_RC_INVALID_WPA_IE 13 /* Invalid info. element */ +#define DOT11_RC_MIC_FAILURE 14 /* Michael failure */ +#define DOT11_RC_4WH_TIMEOUT 15 /* 4-way handshake timeout */ +#define DOT11_RC_GTK_UPDATE_TIMEOUT 16 /* Group key update timeout */ +#define DOT11_RC_WPA_IE_MISMATCH 17 /* WPA IE in 4-way handshake differs from + * (re-)assoc. request/probe response + */ +#define DOT11_RC_INVALID_MC_CIPHER 18 /* Invalid multicast cipher */ +#define DOT11_RC_INVALID_UC_CIPHER 19 /* Invalid unicast cipher */ +#define DOT11_RC_INVALID_AKMP 20 /* Invalid authenticated key management protocol */ +#define DOT11_RC_BAD_WPA_VERSION 21 /* Unsupported WPA version */ +#define DOT11_RC_INVALID_WPA_CAP 22 /* Invalid WPA IE capabilities */ +#define DOT11_RC_8021X_AUTH_FAIL 23 /* 802.1X authentication failure */ + +#define WPA2_PMKID_LEN 16 + +/* WPA IE fixed portion */ +typedef struct +{ + uint8 tag; /* TAG */ + uint8 length; /* TAG length */ + uint8 oui[3]; /* IE OUI */ + uint8 oui_type; /* OUI type */ + struct { + uint8 low; + uint8 high; + } PACKED version; /* IE version */ +} PACKED wpa_ie_fixed_t; +#define WPA_IE_OUITYPE_LEN 4 +#define WPA_IE_FIXED_LEN 8 +#define WPA_IE_TAG_FIXED_LEN 6 + +#ifdef BCMWPA2 +typedef struct { + uint8 tag; /* TAG */ + uint8 length; /* TAG length */ + struct { + uint8 low; + uint8 high; + } PACKED version; /* IE version */ +} PACKED wpa_rsn_ie_fixed_t; +#define WPA_RSN_IE_FIXED_LEN 4 +#define WPA_RSN_IE_TAG_FIXED_LEN 2 +typedef uint8 wpa_pmkid_t[WPA2_PMKID_LEN]; +#endif + +/* WPA suite/multicast suite */ +typedef struct +{ + uint8 oui[3]; + uint8 type; +} PACKED wpa_suite_t, wpa_suite_mcast_t; +#define WPA_SUITE_LEN 4 + +/* WPA unicast suite list/key management suite list */ +typedef struct +{ + struct { + uint8 low; + uint8 high; + } PACKED count; + wpa_suite_t list[1]; +} PACKED wpa_suite_ucast_t, wpa_suite_auth_key_mgmt_t; +#define WPA_IE_SUITE_COUNT_LEN 2 +#ifdef BCMWPA2 +typedef struct +{ + struct { + uint8 low; + uint8 high; + } PACKED count; + wpa_pmkid_t list[1]; +} PACKED wpa_pmkid_list_t; +#endif + +/* WPA cipher suites */ +#define WPA_CIPHER_NONE 0 /* None */ +#define WPA_CIPHER_WEP_40 1 /* WEP (40-bit) */ +#define WPA_CIPHER_TKIP 2 /* TKIP: default for WPA */ +#define WPA_CIPHER_AES_OCB 3 /* AES (OCB) */ +#define WPA_CIPHER_AES_CCM 4 /* AES (CCM) */ +#define WPA_CIPHER_WEP_104 5 /* WEP (104-bit) */ + +#define IS_WPA_CIPHER(cipher) ((cipher) == WPA_CIPHER_NONE || \ + (cipher) == WPA_CIPHER_WEP_40 || \ + (cipher) == WPA_CIPHER_WEP_104 || \ + (cipher) == WPA_CIPHER_TKIP || \ + (cipher) == WPA_CIPHER_AES_OCB || \ + (cipher) == WPA_CIPHER_AES_CCM) + +/* WPA TKIP countermeasures parameters */ +#define WPA_TKIP_CM_DETECT 60 /* multiple MIC failure window (seconds) */ +#define WPA_TKIP_CM_BLOCK 60 /* countermeasures active window (seconds) */ + +/* WPA capabilities defined in 802.11i */ +#define WPA_CAP_4_REPLAY_CNTRS 2 +#define WPA_CAP_16_REPLAY_CNTRS 3 +#define WPA_CAP_REPLAY_CNTR_SHIFT 2 +#define WPA_CAP_REPLAY_CNTR_MASK 0x000c + +/* WPA Specific defines */ +#define WPA_CAP_LEN 2 /* Length of RSN capabilities in RSN IE (2 octets) */ + +#ifdef BCMWPA2 +#define WPA_CAP_WPA2_PREAUTH 1 +#endif /* BCMWPA2 */ + +#undef PACKED +#if !defined(__GNUC__) +#pragma pack() +#endif + +#endif /* _proto_wpa_h_ */ diff --git a/package/wlcompat/src/include/shutils.h b/package/wlcompat/src/include/shutils.h deleted file mode 100644 index 783ee9ede..000000000 --- a/package/wlcompat/src/include/shutils.h +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Shell-like utility functions - * - * Copyright 2004, Broadcom Corporation - * All Rights Reserved. - * - * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY - * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM - * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. - * - * $Id$ - */ - -#ifndef _shutils_h_ -#define _shutils_h_ -#include <string.h> -/* - * Reads file and returns contents - * @param fd file descriptor - * @return contents of file or NULL if an error occurred - */ -extern char * fd2str(int fd); - -/* - * Reads file and returns contents - * @param path path to file - * @return contents of file or NULL if an error occurred - */ -extern char * file2str(const char *path); - -/* - * Waits for a file descriptor to become available for reading or unblocked signal - * @param fd file descriptor - * @param timeout seconds to wait before timing out or 0 for no timeout - * @return 1 if descriptor changed status or 0 if timed out or -1 on error - */ -extern int waitfor(int fd, int timeout); - -/* - * Concatenates NULL-terminated list of arguments into a single - * commmand and executes it - * @param argv argument list - * @param path NULL, ">output", or ">>output" - * @param timeout seconds to wait before timing out or 0 for no timeout - * @param ppid NULL to wait for child termination or pointer to pid - * @return return value of executed command or errno - */ -extern int _eval(char *const argv[], char *path, int timeout, pid_t *ppid); - -/* - * Concatenates NULL-terminated list of arguments into a single - * commmand and executes it - * @param argv argument list - * @return stdout of executed command or NULL if an error occurred - */ -extern char * _backtick(char *const argv[]); - -/* - * Kills process whose PID is stored in plaintext in pidfile - * @param pidfile PID file - * @return 0 on success and errno on failure - */ -extern int kill_pidfile(char *pidfile); - -/* - * fread() with automatic retry on syscall interrupt - * @param ptr location to store to - * @param size size of each element of data - * @param nmemb number of elements - * @param stream file stream - * @return number of items successfully read - */ -extern int safe_fread(void *ptr, size_t size, size_t nmemb, FILE *stream); - -/* - * fwrite() with automatic retry on syscall interrupt - * @param ptr location to read from - * @param size size of each element of data - * @param nmemb number of elements - * @param stream file stream - * @return number of items successfully written - */ -extern int safe_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); - -/* - * Convert Ethernet address string representation to binary data - * @param a string in xx:xx:xx:xx:xx:xx notation - * @param e binary data - * @return TRUE if conversion was successful and FALSE otherwise - */ -extern int ether_atoe(const char *a, unsigned char *e); - -/* - * Convert Ethernet address binary data to string representation - * @param e binary data - * @param a string in xx:xx:xx:xx:xx:xx notation - * @return a - */ -extern char * ether_etoa(const unsigned char *e, char *a); - -/* - * Concatenate two strings together into a caller supplied buffer - * @param s1 first string - * @param s2 second string - * @param buf buffer large enough to hold both strings - * @return buf - */ -static inline char * strcat_r(const char *s1, const char *s2, char *buf) -{ - strcpy(buf, s1); - strcat(buf, s2); - return buf; -} - -/* Check for a blank character; that is, a space or a tab */ -#define isblank(c) ((c) == ' ' || (c) == '\t') - -/* Strip trailing CR/NL from string <s> */ -#define chomp(s) ({ \ - char *c = (s) + strlen((s)) - 1; \ - while ((c > (s)) && (*c == '\n' || *c == '\r' || *c == ' ')) \ - *c-- = '\0'; \ - s; \ -}) - -/* Simple version of _backtick() */ -#define backtick(cmd, args...) ({ \ - char *argv[] = { cmd, ## args, NULL }; \ - _backtick(argv); \ -}) - -/* Simple version of _eval() (no timeout and wait for child termination) */ -#define eval(cmd, args...) ({ \ - char *argv[] = { cmd, ## args, NULL }; \ - _eval(argv, ">/dev/console", 0, NULL); \ -}) - -/* Copy each token in wordlist delimited by space into word */ -#define foreach(word, wordlist, next) \ - for (next = &wordlist[strspn(wordlist, " ")], \ - strncpy(word, next, sizeof(word)), \ - word[strcspn(word, " ")] = '\0', \ - word[sizeof(word) - 1] = '\0', \ - next = strchr(next, ' '); \ - strlen(word); \ - next = next ? &next[strspn(next, " ")] : "", \ - strncpy(word, next, sizeof(word)), \ - word[strcspn(word, " ")] = '\0', \ - word[sizeof(word) - 1] = '\0', \ - next = strchr(next, ' ')) - -/* Return NUL instead of NULL if undefined */ -#define safe_getenv(s) (getenv(s) ? : "") - -/* Print directly to the console */ -#define cprintf(fmt, args...) do { \ - FILE *fp = fopen("/dev/console", "w"); \ - if (fp) { \ - fprintf(fp, fmt, ## args); \ - fclose(fp); \ - } \ -} while (0) - -/* Debug print */ -#ifdef DEBUG -#define dprintf(fmt, args...) cprintf("%s: " fmt, __FUNCTION__, ## args) -#else -#define dprintf(fmt, args...) -#endif - -#ifdef vxworks - -#include <inetLib.h> -#define inet_aton(a, n) ((inet_aton((a), (n)) == ERROR) ? 0 : 1) -#define inet_ntoa(n) ({ char a[INET_ADDR_LEN]; inet_ntoa_b ((n), a); a; }) - -#include <typedefs.h> -#include <bcmutils.h> -#define ether_atoe(a, e) bcm_ether_atoe((a), (e)) -#define ether_etoa(e, a) bcm_ether_ntoa((e), (a)) - -/* These declarations are not available where you would expect them */ -extern int vsnprintf (char *, size_t, const char *, va_list); -extern int snprintf(char *str, size_t count, const char *fmt, ...); -extern char *strdup(const char *); -extern char *strsep(char **stringp, char *delim); -extern int strcasecmp(const char *s1, const char *s2); -extern int strncasecmp(const char *s1, const char *s2, size_t n); - -/* Neither are socket() and connect() */ -#include <sockLib.h> - -#ifdef DEBUG -#undef dprintf -#define dprintf printf -#endif -#endif - -#endif /* _shutils_h_ */ diff --git a/package/wlcompat/src/include/typedefs.h b/package/wlcompat/src/include/typedefs.h index 6b0c25e04..574a1df74 100644 --- a/package/wlcompat/src/include/typedefs.h +++ b/package/wlcompat/src/include/typedefs.h @@ -1,45 +1,22 @@ /* - * Copyright 2004, Broadcom Corporation - * All Rights Reserved. - * - * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY - * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM - * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. + * Copyright 2006, Broadcom Corporation + * All Rights Reserved. + * + * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY + * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM + * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. * $Id$ */ #ifndef _TYPEDEFS_H_ #define _TYPEDEFS_H_ - -/* Define 'SITE_TYPEDEFS' in the compile to include a site specific - * typedef file "site_typedefs.h". - * - * If 'SITE_TYPEDEFS' is not defined, then the "Inferred Typedefs" - * section of this file makes inferences about the compile environment - * based on defined symbols and possibly compiler pragmas. +/* + * Inferred Typedefs * - * Following these two sections is the "Default Typedefs" - * section. This section is only prcessed if 'USE_TYPEDEF_DEFAULTS' is - * defined. This section has a default set of typedefs and a few - * proprocessor symbols (TRUE, FALSE, NULL, ...). */ -#ifdef SITE_TYPEDEFS - -/******************************************************************************* - * Site Specific Typedefs - *******************************************************************************/ - -#include "site_typedefs.h" - -#else - -/******************************************************************************* - * Inferred Typedefs - *******************************************************************************/ - /* Infer the compile environment based on preprocessor symbols and pramas. * Override type definitions as needed, and include configuration dependent * header files to define types. @@ -55,40 +32,15 @@ #define TRUE true #endif -#else /* ! __cplusplus */ - -/* for Windows build, define bool as a uchar instead of the default int */ -#if defined(_WIN32) - -#define TYPEDEF_BOOL -typedef unsigned char bool; +#endif /* __cplusplus */ -#endif /* _WIN32 */ - -#endif /* ! __cplusplus */ - -#ifdef _MSC_VER /* Microsoft C */ -#define TYPEDEF_INT64 -#define TYPEDEF_UINT64 -typedef signed __int64 int64; -typedef unsigned __int64 uint64; -#endif - -#if defined(MACOSX) && defined(KERNEL) -#define TYPEDEF_BOOL +#if defined(_NEED_SIZE_T_) +typedef long unsigned int size_t; #endif - -#if defined(linux) #define TYPEDEF_UINT #define TYPEDEF_USHORT #define TYPEDEF_ULONG -#endif - -#if !defined(linux) && !defined(_WIN32) && !defined(PMON) && !defined(_CFE_) -#define TYPEDEF_UINT -#define TYPEDEF_USHORT -#endif /* Do not support the (u)int64 types with strict ansi for GNU C */ @@ -97,57 +49,29 @@ typedef unsigned __int64 uint64; #define TYPEDEF_UINT64 #endif -/* ICL accepts unsigned 64 bit type only, and complains in ANSI mode - * for singned or unsigned */ -#if defined(__ICL) - -#define TYPEDEF_INT64 - -#if defined(__STDC__) -#define TYPEDEF_UINT64 -#endif - -#endif /* __ICL */ - - -#if !defined(_WIN32) && !defined(PMON) && !defined(_CFE_) - /* pick up ushort & uint from standard types.h */ #if defined(linux) && defined(__KERNEL__) - #include <linux/types.h> /* sys/types.h and linux/types.h are oil and water */ - #else - -#include <sys/types.h> - +#include <sys/types.h> #endif -#endif /* !_WIN32 && !PMON && !_CFE_ */ - -#if defined(MACOSX) && defined(KERNEL) -#include <IOKit/IOTypes.h> -#endif - - /* use the default typedefs in the next section of this file */ #define USE_TYPEDEF_DEFAULTS -#endif /* SITE_TYPEDEFS */ - - -/******************************************************************************* +/* * Default Typedefs - *******************************************************************************/ + * + */ #ifdef USE_TYPEDEF_DEFAULTS #undef USE_TYPEDEF_DEFAULTS #ifndef TYPEDEF_BOOL -typedef int bool; +typedef /* @abstract@ */ unsigned char bool; #endif -/*----------------------- define uchar, ushort, uint, ulong ----------------*/ +/* define uchar, ushort, uint, ulong */ #ifndef TYPEDEF_UCHAR typedef unsigned char uchar; @@ -165,7 +89,7 @@ typedef unsigned int uint; typedef unsigned long ulong; #endif -/*----------------------- define [u]int8/16/32/64 --------------------------*/ +/* define [u]int8/16/32/64, uintptr */ #ifndef TYPEDEF_UINT8 typedef unsigned char uint8; @@ -183,6 +107,10 @@ typedef unsigned int uint32; typedef unsigned long long uint64; #endif +#ifndef TYPEDEF_UINTPTR +typedef unsigned int uintptr; +#endif + #ifndef TYPEDEF_INT8 typedef signed char int8; #endif @@ -199,7 +127,7 @@ typedef signed int int32; typedef signed long long int64; #endif -/*----------------------- define float32/64, float_t -----------------------*/ +/* define float32/64, float_t */ #ifndef TYPEDEF_FLOAT32 typedef float float32; @@ -225,14 +153,14 @@ typedef float64 float_t; #endif /* TYPEDEF_FLOAT_T */ -/*----------------------- define macro values -----------------------------*/ +/* define macro values */ #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE -#define TRUE 1 +#define TRUE 1 /* TRUE */ #endif #ifndef NULL @@ -244,13 +172,15 @@ typedef float64 float_t; #endif #ifndef ON -#define ON 1 +#define ON 1 /* ON = 1 */ #endif -/*----------------------- define PTRSZ, INLINE ----------------------------*/ +#define AUTO (-1) /* Auto = -1 */ + +/* define PTRSZ, INLINE */ #ifndef PTRSZ -#define PTRSZ sizeof (char*) +#define PTRSZ sizeof(char*) #endif #ifndef INLINE @@ -280,6 +210,7 @@ typedef float64 float_t; #undef TYPEDEF_UINT16 #undef TYPEDEF_UINT32 #undef TYPEDEF_UINT64 +#undef TYPEDEF_UINTPTR #undef TYPEDEF_INT8 #undef TYPEDEF_INT16 #undef TYPEDEF_INT32 @@ -290,4 +221,10 @@ typedef float64 float_t; #endif /* USE_TYPEDEF_DEFAULTS */ +/* + * Including the bcmdefs.h here, to make sure everyone including typedefs.h + * gets this automatically +*/ +#include <bcmdefs.h> + #endif /* _TYPEDEFS_H_ */ diff --git a/package/wlcompat/src/include/utils.h b/package/wlcompat/src/include/utils.h deleted file mode 100644 index b8d1cdb7b..000000000 --- a/package/wlcompat/src/include/utils.h +++ /dev/null @@ -1,131 +0,0 @@ -#include <cy_conf.h> - -extern int diag_led(int type, int act); -extern int C_led(int i); -extern int get_single_ip(char *ipaddr, int which); -extern char *get_mac_from_ip(char *ip); -extern struct dns_lists *get_dns_list(int no); -extern int dns_to_resolv(void); -extern char *get_wan_face(void); -extern int check_wan_link(int num); -extern char *get_complete_lan_ip(char *ip); -extern int get_int_len(int num); -extern int file_to_buf(char *path, char *buf, int len); -extern int buf_to_file(char *path, char *buf); -extern pid_t* find_pid_by_name( char* pidName); -extern int find_pid_by_ps(char* pidName); -extern int *find_all_pid_by_ps(char* pidName); -extern char *find_name_by_proc(int pid); -extern int get_ppp_pid(char *file); -extern long convert_ver(char *ver); -extern int check_flash(void); -extern int check_action(void); -extern int check_now_boot(void); -extern int check_hw_type(void); -extern int is_exist(char *filename); -extern void set_ip_forward(char c); -struct mtu_lists *get_mtu(char *proto); -extern void set_host_domain_name(void); - -extern void encode(char *buf, int len); -extern void decode(char *buf, int len); - -extern int sys_netdev_ioctl(int family, int socket, char *if_name, int cmd, struct ifreq *ifr); - -int ct_openlog(const char *ident, int option, int facility, char *log_name); -void ct_syslog(int level, int enable, const char *fmt,...); -void ct_logger(int level, const char *fmt,...); -struct wl_assoc_mac * get_wl_assoc_mac(int *c); - - - -enum { DMZ, SESSION, DIAG , WL}; - -enum { START_LED, STOP_LED }; - -typedef enum { ACT_IDLE, - ACT_TFTP_UPGRADE, - ACT_WEB_UPGRADE, - ACT_WEBS_UPGRADE, - ACT_SW_RESTORE, - ACT_HW_RESTORE } ACTION; - -enum { UNKNOWN_BOOT = -1, PMON_BOOT, CFE_BOOT }; - -enum { BCM4702_CHIP, BCM4712_CHIP, BCM5325E_CHIP }; - -enum { FIRST, SECOND }; - -enum { SYSLOG_LOG=1, SYSLOG_DEBUG, CONSOLE_ONLY, LOG_CONSOLE, DEBUG_CONSOLE }; - -#define ACTION(cmd) buf_to_file(ACTION_FILE, cmd) - -struct dns_lists { - int num_servers; - char dns_server[4][16]; -}; - -#define NOT_USING 0 -#define USING 1 - -struct wl_assoc_mac -{ - char mac[18]; -}; - -struct mtu_lists { - char *proto; /* protocol */ - char *min; /* min mtu */ - char *max; /* max mtu */ -}; - - -#define PPP_PSEUDO_IP "10.64.64.64" -#define PPP_PSEUDO_NM "255.255.255.255" -#define PPP_PSEUDO_GW "10.112.112.112" - -#define PING_TMP "/tmp/ping.log" -#define TRACEROUTE_TMP "/tmp/traceroute.log" -#define MAX_BUF_LEN 254 - -#define RESOLV_FILE "/tmp/resolv.conf" -#define HOSTS_FILE "/tmp/hosts" - -#define LOG_FILE "/var/log/mess" - -#define ACTION_FILE "/tmp/action" - - -#define split(word, wordlist, next, delim) \ - for (next = wordlist, \ - strncpy(word, next, sizeof(word)), \ - word[(next=strstr(next, delim)) ? strstr(word, delim) - word : sizeof(word) - 1] = '\0', \ - next = next ? next + sizeof(delim) - 1 : NULL ; \ - strlen(word); \ - next = next ? : "", \ - strncpy(word, next, sizeof(word)), \ - word[(next=strstr(next, delim)) ? strstr(word, delim) - word : sizeof(word) - 1] = '\0', \ - next = next ? next + sizeof(delim) - 1 : NULL) - -#define STRUCT_LEN(name) sizeof(name)/sizeof(name[0]) - -#define printHEX(str,len) { \ - int i; \ - for (i=0 ; i<len ; i++) { \ - printf("%02X ", (unsigned char)*(str+i)); \ - if(((i+1)%16) == 0) printf("- "); \ - if(((i+1)%32) == 0) printf("\n"); \ - } \ - printf("\n\n"); \ -} - - -#define printASC(str,len) { \ - int i; \ - for (i=0 ; i<len ; i++) { \ - printf("%c", (unsigned char)*(str+i)); \ - if(((i+1)%16) == 0) printf("- "); \ - if(((i+1)%32) == 0) printf("\n"); \ - } \ - printf("\n\n"); \ -} diff --git a/package/wlcompat/src/include/wlioctl.h b/package/wlcompat/src/include/wlioctl.h index d5ef11f9e..0ebbcca64 100644 --- a/package/wlcompat/src/include/wlioctl.h +++ b/package/wlcompat/src/include/wlioctl.h @@ -4,7 +4,7 @@ * * Definitions subject to change without notice. * - * Copyright 2004, Broadcom Corporation + * Copyright 2006, Broadcom Corporation * All Rights Reserved. * * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY @@ -20,84 +20,108 @@ #include <typedefs.h> #include <proto/ethernet.h> +#include <proto/bcmeth.h> +#include <proto/bcmevent.h> #include <proto/802.11.h> -#if defined(__GNUC__) -#define PACKED __attribute__((packed)) -#else -#define PACKED +#ifdef __NetBSD__ +/* NetBSD 2.0 does not have SIOCDEVPRIVATE. This is NetBSD 2.0 specific */ +#define SIOCDEVPRIVATE _IOWR('i', 139, struct ifreq) #endif -#define WLC_ESSID_MAX_SIZE 32 - -#define WL_NUMRATES 255 /* max # of rates in a rateset */ - -typedef struct wl_rateset { - uint32 count; /* # rates in this set */ - uint8 rates[WL_NUMRATES]; /* rates in 500kbps units w/hi bit set if basic */ -} wl_rateset_t; +/* require default structure packing */ +#if !defined(__GNUC__) +#pragma pack(push, 8) +#endif -#define WL_CHANSPEC_CHAN_MASK 0x0fff -#define WL_CHANSPEC_BAND_MASK 0xf000 -#define WL_CHANSPEC_BAND_SHIFT 12 -#define WL_CHANSPEC_BAND_A 0x1000 -#define WL_CHANSPEC_BAND_B 0x2000 +/* A chanspec holds the channel number, band, bandwidth and control sideband */ +typedef uint16 chanspec_t; +#define WL_CHANSPEC_CHAN_MASK 0x00ff + +#define WL_CHANSPEC_CTL_SB_MASK 0x0300 +#define WL_CHANSPEC_CTL_SB_SHIFT 8 +#define WL_CHANSPEC_CTL_SB_LOWER 0x0100 +#define WL_CHANSPEC_CTL_SB_UPPER 0x0200 +#define WL_CHANSPEC_CTL_SB_NONE 0x0300 + +#define WL_CHANSPEC_BW_MASK 0x0C00 +#define WL_CHANSPEC_BW_SHIFT 10 +#define WL_CHANSPEC_BW_10 0x0400 +#define WL_CHANSPEC_BW_20 0x0800 +#define WL_CHANSPEC_BW_40 0x0C00 + +#define WL_CHANSPEC_BAND_MASK 0xf000 +#define WL_CHANSPEC_BAND_SHIFT 12 +#define WL_CHANSPEC_BAND_5G 0x1000 +#define WL_CHANSPEC_BAND_2G 0x2000 +#define INVCHANSPEC 255 + +/* Legacy structure to help keep backward compatible wl tool and tray app */ + +#define LEGACY_WL_BSS_INFO_VERSION 107 /* older version of wl_bss_info struct */ + +typedef struct wl_bss_info_107 { + uint32 version; /* version field */ + uint32 length; /* byte length of data in this record, + * starting at version and including IEs + */ + struct ether_addr BSSID; + uint16 beacon_period; /* units are Kusec */ + uint16 capability; /* Capability information */ + uint8 SSID_len; + uint8 SSID[32]; + struct { + uint count; /* # rates in this set */ + uint8 rates[16]; /* rates in 500kbps units w/hi bit set if basic */ + } rateset; /* supported rates */ + uint8 channel; /* Channel no. */ + uint16 atim_window; /* units are Kusec */ + uint8 dtim_period; /* DTIM period */ + int16 RSSI; /* receive signal strength (in dBm) */ + int8 phy_noise; /* noise (in dBm) */ + uint32 ie_length; /* byte length of Information Elements */ + /* variable length Information Elements */ +} wl_bss_info_107_t; /* * Per-bss information structure. */ -#define WL_LEGACY_BSS_INFO_VERSION 106 /* an older supported version of wl_bss_info struct */ -#define WL_BSS_INFO_VERSION 107 /* current version of wl_bss_info struct */ - -typedef struct wl_bss_info106 { - uint version; /* version field */ - struct ether_addr BSSID; - uint8 SSID_len; - uint8 SSID[32]; - uint8 Privacy; /* 0=No WEP, 1=Use WEP */ - int16 RSSI; /* receive signal strength (in dBm) */ - uint16 beacon_period; /* units are Kusec */ - uint16 atim_window; /* units are Kusec */ - uint8 channel; /* Channel no. */ - int8 infra; /* 0=IBSS, 1=infrastructure, 2=unknown */ - struct { - uint count; /* # rates in this set */ - uint8 rates[12]; /* rates in 500kbps units w/hi bit set if basic */ - } rateset; /* supported rates */ - uint8 dtim_period; /* DTIM period */ - int8 phy_noise; /* noise right after tx (in dBm) */ - uint16 capability; /* Capability information */ - struct dot11_bcn_prb *prb; /* probe response frame (ioctl na) */ - uint16 prb_len; /* probe response frame length (ioctl na) */ - struct { - uint8 supported; /* wpa supported */ - uint8 multicast; /* multicast cipher */ - uint8 ucount; /* count of unicast ciphers */ - uint8 unicast[4]; /* unicast ciphers */ - uint8 acount; /* count of auth modes */ - uint8 auth[4]; /* Authentication modes */ - } wpa; -} wl_bss_info106_t; +#define WL_BSS_INFO_VERSION 108 /* current version of wl_bss_info struct */ +/* BSS info structure + * Applications MUST CHECK ie_offset field and length field to access IEs and + * next bss_info structure in a vector (in wl_scan_results_t) + */ typedef struct wl_bss_info { - uint32 version; /* version field */ - uint32 length; /* byte length of data in this record, starting at version and including IEs */ + uint32 version; /* version field */ + uint32 length; /* byte length of data in this record, + * starting at version and including IEs + */ struct ether_addr BSSID; - uint16 beacon_period; /* units are Kusec */ - uint16 capability; /* Capability information */ + uint16 beacon_period; /* units are Kusec */ + uint16 capability; /* Capability information */ uint8 SSID_len; uint8 SSID[32]; struct { - uint count; /* # rates in this set */ - uint8 rates[16]; /* rates in 500kbps units w/hi bit set if basic */ - } rateset; /* supported rates */ - uint8 channel; /* Channel no. */ - uint16 atim_window; /* units are Kusec */ - uint8 dtim_period; /* DTIM period */ - int16 RSSI; /* receive signal strength (in dBm) */ - int8 phy_noise; /* noise (in dBm) */ - uint32 ie_length; /* byte length of Information Elements */ + uint count; /* # rates in this set */ + uint8 rates[16]; /* rates in 500kbps units w/hi bit set if basic */ + } rateset; /* supported rates */ + chanspec_t chanspec; /* chanspec for bss */ + uint16 atim_window; /* units are Kusec */ + uint8 dtim_period; /* DTIM period */ + int16 RSSI; /* receive signal strength (in dBm) */ + int8 phy_noise; /* noise (in dBm) */ + + bool n_cap; /* BSS is 802.11N Capable */ + uint32 nbss_cap; /* 802.11N BSS Capabilities (based on EWC_CAP_*) */ + uint8 ctl_ch; /* 802.11N BSS control channel number */ + uint32 reserved[2]; /* Reserved for expansion of BSS properties */ + uint8 basic_mcs[MCSSET_LEN]; /* 802.11N BSS required MCS set */ + + uint16 ie_offset; /* offset at which IEs start, from beginning */ + uint32 ie_length; /* byte length of Information Elements */ + /* Add new fields here */ /* variable length Information Elements */ } wl_bss_info_t; @@ -107,16 +131,26 @@ typedef struct wlc_ssid { } wlc_ssid_t; typedef struct wl_scan_params { - wlc_ssid_t ssid; /* default is {0, ""} */ - struct ether_addr bssid;/* default is bcast */ - int8 bss_type; /* default is any, DOT11_BSSTYPE_ANY/INFRASTRUCTURE/INDEPENDENT */ - int8 scan_type; /* -1 use default, DOT11_SCANTYPE_ACTIVE/PASSIVE */ - int32 nprobes; /* -1 use default, number of probes per channel */ - int32 active_time; /* -1 use default, dwell time per channel for active scanning */ - int32 passive_time; /* -1 use default, dwell time per channel for passive scanning */ - int32 home_time; /* -1 use default, dwell time for the home channel between channel scans */ - int32 channel_num; /* 0 use default (all available channels), count of channels in channel_list */ - uint16 channel_list[1]; /* list of chanspecs */ + wlc_ssid_t ssid; /* default: {0, ""} */ + struct ether_addr bssid; /* default: bcast */ + int8 bss_type; /* default: any, + * DOT11_BSSTYPE_ANY/INFRASTRUCTURE/INDEPENDENT + */ + int8 scan_type; /* -1 use default, DOT11_SCANTYPE_ACTIVE/PASSIVE */ + int32 nprobes; /* -1 use default, number of probes per channel */ + int32 active_time; /* -1 use default, dwell time per channel for + * active scanning + */ + int32 passive_time; /* -1 use default, dwell time per channel + * for passive scanning + */ + int32 home_time; /* -1 use default, dwell time for the home channel + * between channel scans + */ + int32 channel_num; /* 0 use default (all available channels), count of + * channels in channel_list + */ + uint16 channel_list[1]; /* list of chanspecs */ } wl_scan_params_t; /* size of wl_scan_params not including variable length array */ #define WL_SCAN_PARAMS_FIXED_SIZE 64 @@ -130,6 +164,13 @@ typedef struct wl_scan_results { /* size of wl_scan_results not including variable length array */ #define WL_SCAN_RESULTS_FIXED_SIZE 12 + +#define WL_NUMRATES 255 /* max # of rates in a rateset */ +typedef struct wl_rateset { + uint32 count; /* # rates in this set */ + uint8 rates[WL_NUMRATES]; /* rates in 500kbps units w/hi bit set if basic */ +} wl_rateset_t; + /* uint32 list */ typedef struct wl_uint32_list { /* in - # of elements, out - # of entries */ @@ -138,7 +179,18 @@ typedef struct wl_uint32_list { uint32 element[1]; } wl_uint32_list_t; -#define WLC_CNTRY_BUF_SZ 4 /* Country string is 3 bytes + NULL */ +#define WLC_CNTRY_BUF_SZ 4 /* Country string is 3 bytes + NULL */ + +/* defines used by the nrate iovar */ +#define NRATE_MCS_INUSE 0x00000080 /* MSC in use,indicates b0-6 holds an mcs */ +#define NRATE_RATE_MASK 0x0000007f /* rate/mcs value */ +#define NRATE_STF_MASK 0x0000ff00 /* stf mode mask: siso, cdd, stbc, sdm */ +#define NRATE_STF_SHIFT 8 /* stf mode shift */ + +#define ANTENNA_NUM_1 1 /* total number of antennas to be used */ +#define ANTENNA_NUM_2 2 +#define ANTENNA_NUM_3 3 +#define ANTENNA_NUM_4 4 typedef struct wl_channels_in_country { uint32 buflen; @@ -169,7 +221,7 @@ typedef struct wl_country_list { typedef struct wl_rm_req_elt { int8 type; int8 flags; - uint16 chanspec; + chanspec_t chanspec; uint32 token; /* token for this measurement */ uint32 tsf_h; /* TSF high 32-bits of Measurement start time */ uint32 tsf_l; /* TSF low 32-bits */ @@ -178,7 +230,7 @@ typedef struct wl_rm_req_elt { typedef struct wl_rm_req { uint32 token; /* overall measurement set token */ - uint32 count; /* number of measurement reqests */ + uint32 count; /* number of measurement requests */ wl_rm_req_elt_t req[1]; /* variable length block of requests */ } wl_rm_req_t; #define WL_RM_REQ_FIXED_LEN 8 @@ -186,7 +238,7 @@ typedef struct wl_rm_req { typedef struct wl_rm_rep_elt { int8 type; int8 flags; - uint16 chanspec; + chanspec_t chanspec; uint32 token; /* token for this measurement */ uint32 tsf_h; /* TSF high 32-bits of Measurement start time */ uint32 tsf_l; /* TSF low 32-bits */ @@ -210,28 +262,7 @@ typedef struct wl_rm_rep { #define WL_RM_REP_FIXED_LEN 8 -#define WLC_MAX_KEY_SIZE 32 /* max size of any key */ -#define WLC_MAX_IV_SIZE 16 /* max size of any IV */ -#define WLC_EXT_IV_FLAG (1<<5) /* flag to indicate IV is > 4 bytes */ -#define WLC_MAX_DEFAULT_KEYS 4 /* # of default WEP keys */ -#define WLC_MAX_KEYS 54 /* Max # of WEP keys */ -#define WLC_WEP1_KEY_SIZE 5 /* max size of any WEP key */ -#define WLC_WEP1_KEY_HEX_SIZE 10 /* size of WEP key in hex. */ -#define WLC_WEP128_KEY_SIZE 13 /* max size of any WEP key */ -#define WLC_WEP128_KEY_HEX_SIZE 26 /* size of WEP key in hex. */ -#define WLC_TKIP_MIC_SIZE 8 /* size of TKIP MIC */ -#define WLC_TKIP_EOM_SIZE 7 /* max size of TKIP EOM */ -#define WLC_TKIP_EOM_FLAG 0x5a /* TKIP EOM flag byte */ -#define WLC_TKIP_KEY_SIZE 32 /* size of any TKIP key */ -#define WLC_TKIP_MIC_AUTH_TX 16 /* offset to Authenticator MIC TX key */ -#define WLC_TKIP_MIC_AUTH_RX 24 /* offset to Authenticator MIC RX key */ -#define WLC_TKIP_MIC_SUP_RX 16 /* offset to Supplicant MIC RX key */ -#define WLC_TKIP_MIC_SUP_TX 24 /* offset to Supplicant MIC TX key */ -#define WLC_TKIP_P1_KEY_SIZE 10 /* size of TKHash Phase1 output, in bytes */ -#define WLC_TKIP_P2_KEY_SIZE 16 /* size of TKHash Phase2 output */ -#define WLC_AES_KEY_SIZE 16 /* size of AES key */ - - +#if defined(BCMSUP_PSK) typedef enum sup_auth_status { WLC_SUP_DISCONNECTED = 0, WLC_SUP_CONNECTING, @@ -239,8 +270,10 @@ typedef enum sup_auth_status { WLC_SUP_AUTHENTICATING, WLC_SUP_AUTHENTICATED, WLC_SUP_KEYXCHANGE, - WLC_SUP_KEYED + WLC_SUP_KEYED, + WLC_SUP_TIMEOUT } sup_auth_status_t; +#endif /* BCMCCX | BCMSUP_PSK */ /* Enumerate crypto algorithms */ #define CRYPTO_ALGO_OFF 0 @@ -260,39 +293,6 @@ typedef enum sup_auth_status { #define WL_KF_RES_4 (1 << 4) /* Reserved for backward compat */ #define WL_KF_RES_5 (1 << 5) /* Reserved for backward compat */ - -typedef struct wlc_tkip_info { - uint16 phase1[WLC_TKIP_P1_KEY_SIZE/sizeof(uint16)]; /* tkhash phase1 result */ - uint8 phase2[WLC_TKIP_P2_KEY_SIZE]; /* tkhash phase2 result */ - uint32 micl; - uint32 micr; -} tkip_info_t; - -typedef struct _wsec_iv { - uint32 hi; /* upper 32 bits of IV */ - uint16 lo; /* lower 16 bits of IV */ -} wsec_iv_t; - -typedef struct wsec_key { - uint32 index; /* key index */ - uint32 len; /* key length */ - uint8 data[WLC_MAX_KEY_SIZE]; /* key data */ - tkip_info_t tkip_tx; /* tkip transmit state */ - tkip_info_t tkip_rx; /* tkip receive state */ - uint32 algo; /* CRYPTO_ALGO_AES_CCM, CRYPTO_ALGO_WEP128, etc */ - uint32 flags; /* misc flags */ - uint32 algo_hw; /* cache for hw register*/ - uint32 aes_mode; /* cache for hw register*/ - int iv_len; /* IV length */ - int iv_initialized; /* has IV been initialized already? */ - int icv_len; /* ICV length */ - wsec_iv_t rxiv; /* Rx IV */ - wsec_iv_t txiv; /* Tx IV */ - struct ether_addr ea; /* per station */ -} wsec_key_t; - - - typedef struct wl_wsec_key { uint32 index; /* key index */ uint32 len; /* key length */ @@ -300,9 +300,9 @@ typedef struct wl_wsec_key { uint32 pad_1[18]; uint32 algo; /* CRYPTO_ALGO_AES_CCM, CRYPTO_ALGO_WEP128, etc */ uint32 flags; /* misc flags */ - uint32 pad_2[2]; + uint32 pad_2[2]; int pad_3; - int iv_initialized; /* has IV been initialized already? */ + int iv_initialized; /* has IV been initialized already? */ int pad_4; /* Rx IV */ struct { @@ -313,17 +313,13 @@ typedef struct wl_wsec_key { struct ether_addr ea; /* per station */ } wl_wsec_key_t; -/* For use with wlc_wep_key.flags */ -#define WSEC_PRIMARY_KEY (1 << 1) /* Indicates this key is the primary (ie tx) key */ -#define WSEC_TKIP_ERROR (1 << 2) /* Provoke deliberate error */ - #define WSEC_MIN_PSK_LEN 8 #define WSEC_MAX_PSK_LEN 64 /* Flag for key material needing passhash'ing */ #define WSEC_PASSPHRASE (1<<0) -/* recepticle for WLC_SET_WSEC_PMK parameter */ +/* receptacle for WLC_SET_WSEC_PMK parameter */ typedef struct { ushort key_len; /* octets in key material */ ushort flags; /* key handling qualification */ @@ -331,32 +327,50 @@ typedef struct { } wsec_pmk_t; /* wireless security bitvec */ -#define WEP_ENABLED 1 -#define TKIP_ENABLED 2 -#define AES_ENABLED 4 -#define WSEC_SWFLAG 8 - -#define WSEC_SW(wsec) ((wsec) & WSEC_SWFLAG) -#define WSEC_HW(wsec) (!WSEC_SW(wsec)) -#define WSEC_WEP_ENABLED(wsec) ((wsec) & WEP_ENABLED) -#define WSEC_TKIP_ENABLED(wsec) ((wsec) & TKIP_ENABLED) -#define WSEC_AES_ENABLED(wsec) ((wsec) & AES_ENABLED) -#define WSEC_ENABLED(wsec) ((wsec) & (WEP_ENABLED | TKIP_ENABLED | AES_ENABLED)) - - -/* wireless authentication bit vector */ -#define WPA_ENABLED 1 -#define PSK_ENABLED 2 - -#define WAUTH_WPA_ENABLED(wauth) ((wauth) & WPA_ENABLED) -#define WAUTH_PSK_ENABLED(wauth) ((wauth) & PSK_ENABLED) -#define WAUTH_ENABLED(wauth) ((wauth) & (WPA_ENABLED | PSK_ENABLED)) - -/* group/mcast cipher */ -#define WPA_MCAST_CIPHER(wsec) (((wsec) & TKIP_ENABLED) ? WPA_CIPHER_TKIP : \ - ((wsec) & AES_ENABLED) ? WPA_CIPHER_AES_CCM : \ - WPA_CIPHER_NONE) - +#define WEP_ENABLED 0x0001 +#define TKIP_ENABLED 0x0002 +#define AES_ENABLED 0x0004 +#define WSEC_SWFLAG 0x0008 +#define SES_OW_ENABLED 0x0040 /* to go into transition mode without setting wep */ +#define FIPS_ENABLED 0x0080 + +/* WPA authentication mode bitvec */ +#define WPA_AUTH_DISABLED 0x0000 /* Legacy (i.e., non-WPA) */ +#define WPA_AUTH_NONE 0x0001 /* none (IBSS) */ +#define WPA_AUTH_UNSPECIFIED 0x0002 /* over 802.1x */ +#define WPA_AUTH_PSK 0x0004 /* Pre-shared key */ +/* #define WPA_AUTH_8021X 0x0020 */ /* 802.1x, reserved */ +#ifdef BCMWPA2 +#define WPA2_AUTH_UNSPECIFIED 0x0040 /* over 802.1x */ +#define WPA2_AUTH_PSK 0x0080 /* Pre-shared key */ +#endif /* BCMWPA2 */ + +#ifdef BCMWPA2 +/* pmkid */ +#define MAXPMKID 16 + +typedef struct _pmkid +{ + struct ether_addr BSSID; + uint8 PMKID[WPA2_PMKID_LEN]; +} pmkid_t; + +typedef struct _pmkid_list +{ + uint32 npmkid; + pmkid_t pmkid[1]; +} pmkid_list_t; + +typedef struct _pmkid_cand { + struct ether_addr BSSID; + uint8 preauth; +} pmkid_cand_t; + +typedef struct _pmkid_cand_list { + uint32 npmkid_cand; + pmkid_cand_t pmkid_cand[1]; +} pmkid_cand_list_t; +#endif /* BCMWPA2 */ typedef struct wl_led_info { uint32 index; /* led index */ @@ -364,77 +378,20 @@ typedef struct wl_led_info { bool activehi; } wl_led_info_t; -/* - * definitions for driver messages passed from WL to NAS. - */ -/* Use this to recognize wpa and 802.1x driver messages. */ -static const uint8 wl_wpa_snap_template[] = - { 0xaa, 0xaa, 0x03, 0x00, 0x90, 0x4c }; - -#define WL_WPA_MSG_IFNAME_MAX 16 - -/* WPA driver message */ -typedef struct wl_wpa_header { - struct ether_header eth; - struct dot11_llc_snap_header snap; - uint8 version; - uint8 type; - /* version 2 additions */ - char ifname[WL_WPA_MSG_IFNAME_MAX]; - /* version specific data */ - /* uint8 data[1]; */ -} wl_wpa_header_t PACKED; - -/* - * definitions for 802.2 messages passed from WL to NAS. - */ -/* This seems not to be defined outside the kernel on linux. */ -#ifndef ETH_P_802_2 -#define ETH_P_802_2 4 -#endif - -#define WL_WPA_HEADER_LEN (ETHER_HDR_LEN + DOT11_LLC_SNAP_HDR_LEN + 2 + WL_WPA_MSG_IFNAME_MAX) - -/* WPA driver message ethertype - private between wlc and nas */ -#define WL_WPA_ETHER_TYPE 0x9999 - -/* WPA driver message current version */ -#define WL_WPA_MSG_VERSION 2 - -/* Type field values for the 802.2 driver messages for WPA. */ -#define WLC_ASSOC_MSG 1 -#define WLC_DISASSOC_MSG 2 -#define WLC_PTK_MIC_MSG 3 -#define WLC_GTK_MIC_MSG 4 - -/* Use this to recognize 802.2 driver messages. */ -static const uint8 wpa_snap_template[] = - { 0xaa, 0xaa, 0x03, 0x00, 0x90, 0x4c }; - - -/* 802.1x driver message */ -typedef struct wl_eapol_header { - struct ether_header eth; - struct dot11_llc_snap_header snap; - uint8 version; - uint8 reserved; - char ifname[WL_WPA_MSG_IFNAME_MAX]; - /* version specific data */ - /* uint8 802_1x_msg[1]; */ -} wl_eapol_header_t PACKED; - -#define WL_EAPOL_HEADER_LEN (ETHER_HDR_LEN + DOT11_LLC_SNAP_HDR_LEN + 2 + WL_WPA_MSG_IFNAME_MAX) - -/* 802.1x driver message ethertype - private between wlc and nas */ -#define WL_EAPOL_ETHER_TYPE 0x999A - -/* 802.1x driver message current version */ -#define WL_EAPOL_MSG_VERSION 1 - +typedef struct wlc_assoc_info { + uint32 req_len; + uint32 resp_len; + uint32 flags; + struct dot11_assoc_req req; + struct ether_addr reassoc_bssid; /* used in reassoc's */ + struct dot11_assoc_resp resp; +} wl_assoc_info_t; +/* flags */ +#define WLC_ASSOC_REQ_IS_REASSOC 0x01 /* assoc req was actually a reassoc */ /* srom read/write struct passed through ioctl */ typedef struct { - uint byteoff; /* byte offset */ - uint nbytes; /* number of bytes */ + uint byteoff; /* byte offset */ + uint nbytes; /* number of bytes */ uint16 buf[1]; } srom_rw_t; @@ -443,132 +400,89 @@ typedef struct { uint32 byteoff; /* byte offset of the field in d11regs_t */ uint32 val; /* read/write value of the field */ uint32 size; /* sizeof the field */ + uint band; /* band (optional) */ } rw_reg_t; -/* Structure used by GET/SET_ATTEN ioctls */ +/* Structure used by GET/SET_ATTEN ioctls - it controls power in b/g-band */ +/* PCL - Power Control Loop */ +/* current gain setting is replaced by user input */ +#define WL_ATTEN_APP_INPUT_PCL_OFF 0 /* turn off PCL, apply supplied input */ +#define WL_ATTEN_PCL_ON 1 /* turn on PCL */ +/* current gain setting is maintained */ +#define WL_ATTEN_PCL_OFF 2 /* turn off PCL. */ typedef struct { - uint16 auto_ctrl; /* 1: Automatic control, 0: overriden */ + uint16 auto_ctrl; /* WL_ATTEN_XX */ uint16 bb; /* Baseband attenuation */ uint16 radio; /* Radio attenuation */ uint16 txctl1; /* Radio TX_CTL1 value */ } atten_t; -/* Used to get specific STA parameters */ +/* defines used by poweridx iovar - it controls power in a-band */ +/* current gain setting is maintained */ +#define WL_PWRIDX_PCL_OFF -2 /* turn off PCL. */ +#define WL_PWRIDX_PCL_ON -1 /* turn on PCL */ +#define WL_PWRIDX_LOWER_LIMIT -2 /* lower limit */ +#define WL_PWRIDX_UPPER_LIMIT 63 /* upper limit */ +/* value >= 0 causes + * - input to be set to that value + * - PCL to be off + */ + +/* Used to get specific STA parameters */ typedef struct { uint32 val; struct ether_addr ea; } scb_val_t; -/* callback registration data types */ - -typedef struct _mac_event_params { - uint msg; - struct ether_addr *addr; - uint result; - uint status; - uint auth_type; -} mac_event_params_t; - -typedef struct _mic_error_params { - struct ether_addr *ea; - bool group; - bool flush_txq; -} mic_error_params_t; - -typedef enum _wl_callback { - WL_MAC_EVENT_CALLBACK = 0, - WL_LINK_UP_CALLBACK, - WL_LINK_DOWN_CALLBACK, - WL_MIC_ERROR_CALLBACK, - WL_LAST_CALLBACK -} wl_callback_t; - -typedef struct _callback { - void (*fn)(void *, void *); - void *context; -} callback_t; - -typedef struct _scan_callback { - void (*fn)(void *); - void *context; -} scan_callback_t; - -/* used to register an arbitrary callback via the IOCTL interface */ -typedef struct _set_callback { - int index; - callback_t callback; -} set_callback_t; - - /* Event data type */ -typedef struct { - uint msg; /* Message (see below) */ - struct ether_addr *addr; /* Station address (if applicable) */ - uint status; /* Status code (see below) */ - uint reason; /* Reason code (if applicable) */ - uint auth_type; /* WLC_E_AUTH */ - bool link; /* WLC_E_LINK */ - bool group; /* WLC_E_MIC_ERROR */ - bool flush_txq; /* WLC_E_MIC_ERROR */ +typedef struct wlc_event { + wl_event_msg_t event; /* encapsulated event */ + struct ether_addr *addr; /* used to keep a trace of the potential present of + * an address in wlc_event_msg_t + */ + void *data; /* used to hang additional data on an event */ + struct wlc_event *next; /* enables ordered list of pending events */ } wlc_event_t; +#define BCM_MAC_STATUS_INDICATION (0x40010200L) + +/* Please update the following when modifying this structure: + * StaInfo Twiki page flags section - description of the sta_info_t struct + * src/wl/exe/wlu.c - print of sta_info_t + * Pay attention to version if structure changes. + */ typedef struct { - uint16 ver; /* version of this struct */ - uint16 cap; /* sta's advertized capabilities */ - uint32 flags; /* flags defined below */ - uint32 idle; /* time since data pkt rx'd from sta */ - struct ether_addr ea; /* Station address */ - wl_rateset_t rateset; /* rateset in use */ + uint16 ver; /* version of this struct */ + uint16 len; /* length in bytes of this structure */ + uint16 cap; /* sta's advertised capabilities */ + uint32 flags; /* flags defined below */ + uint32 idle; /* time since data pkt rx'd from sta */ + struct ether_addr ea; /* Station address */ + wl_rateset_t rateset; /* rateset in use */ + uint32 in; /* seconds elapsed since associated */ + uint32 listen_interval_inms; /* Min Listen interval in ms for this STA */ } sta_info_t; -#define WL_STA_INFO_LEN 300 -#define WL_STA_VER 1 - -/* flags fields */ -#define WL_STA_BRCM 0x01 -#define WL_STA_WME 0x02 -#define WL_STA_ABCAP 0x04 -#define WL_STA_AUTHE 0x08 -#define WL_STA_ASSOC 0x10 -#define WL_STA_AUTHO 0x20 - -/* Event messages */ -#define WLC_E_SET_SSID 1 -#define WLC_E_JOIN 2 -#define WLC_E_START 3 -#define WLC_E_AUTH 4 -#define WLC_E_AUTH_IND 5 -#define WLC_E_DEAUTH 6 -#define WLC_E_DEAUTH_IND 7 -#define WLC_E_ASSOC 8 -#define WLC_E_ASSOC_IND 9 -#define WLC_E_REASSOC 10 -#define WLC_E_REASSOC_IND 11 -#define WLC_E_DISASSOC 12 -#define WLC_E_DISASSOC_IND 13 -#define WLC_E_QUIET_START 14 /* 802.11h Quiet period started */ -#define WLC_E_QUIET_END 15 /* 802.11h Quiet period ended */ -#define WLC_E_GOT_BEACONS 16 -#define WLC_E_LINK 17 /* Link indication */ -#define WLC_E_MIC_ERROR 18 /* TKIP MIC error occurred */ -#define WLC_E_NDIS_LINK 19 /* NDIS style link indication */ -#define WLC_E_ROAM 20 -#define WLC_E_LAST 21 - -/* Event status codes */ -#define WLC_E_STATUS_SUCCESS 0 -#define WLC_E_STATUS_FAIL 1 -#define WLC_E_STATUS_TIMEOUT 2 -#define WLC_E_STATUS_NO_NETWORKS 3 -#define WLC_E_STATUS_ABORT 4 - -typedef struct wlc_event_cb { - uint msg; /* Event message or 0 for all */ - void (*fn)(void *, wlc_event_t *); /* Callback function */ - void *context; /* Passed to callback function */ - struct wlc_event_cb *next; /* Next in the chain */ -} wlc_event_cb_t; +#define WL_STA_VER 2 + +/* Flags for sta_info_t indicating properties of STA */ +#define WL_STA_BRCM 0x1 /* Running a Broadcom driver */ +#define WL_STA_WME 0x2 /* WMM association */ +#define WL_STA_ABCAP 0x4 /* Afterburner-capable */ +#define WL_STA_AUTHE 0x8 /* Authenticated */ +#define WL_STA_ASSOC 0x10 /* Associated */ +#define WL_STA_AUTHO 0x20 /* Authorized */ +#define WL_STA_WDS 0x40 /* Wireless Distribution System */ +#define WL_STA_WDS_LINKUP 0x80 /* WDS traffic/probes flowing properly */ +#define WL_STA_PS 0x100 /* STA is in power save mode from AP's viewpoint */ +#define WL_STA_APSD_BE 0x200 /* APSD delv/trigger for AC_BE is default enabled */ +#define WL_STA_APSD_BK 0x400 /* APSD delv/trigger for AC_BK is default enabled */ +#define WL_STA_APSD_VI 0x800 /* APSD delv/trigger for AC_VI is default enabled */ +#define WL_STA_APSD_VO 0x1000 /* APSD delv/trigger for AC_VO is default enabled */ +#define WL_STA_N_CAP 0x2000 /* STA 802.11n capable */ + +#define WL_WDS_LINKUP WL_STA_WDS_LINKUP /* deprecated */ /* * Country locale determines which channels are available to us. @@ -585,7 +499,7 @@ typedef enum _wlc_locale { WLC_USL, /* US Low Band only */ WLC_JPH, /* Japan High Band only */ WLC_ALL, /* All the channels in this band */ - WLC_11D, /* Represents locale recieved by 11d beacons */ + WLC_11D, /* Represents locale received by 11d beacons */ WLC_LAST_LOCALE, WLC_UNDEFINED_LOCALE = 0xf } wlc_locale_t; @@ -621,9 +535,9 @@ typedef struct wl_ioctl { uint needed; /* bytes needed (optional) */ } wl_ioctl_t; -/* - * Structure for passing hardware and software - * revision info up from the driver. +/* + * Structure for passing hardware and software + * revision info up from the driver. */ typedef struct wlc_rev_info { uint vendorid; /* PCI vendor id */ @@ -637,38 +551,41 @@ typedef struct wlc_rev_info { uint driverrev; /* driver version */ uint ucoderev; /* microcode version */ uint bus; /* bus type */ - uint chipnum; /* chip number */ + uint chipnum; /* chip number */ } wlc_rev_info_t; +#define WL_BRAND_MAX 10 +typedef struct wl_instance_info { + uint instance; + char brand[WL_BRAND_MAX]; +} wl_instance_info_t; + /* check this magic number */ #define WLC_IOCTL_MAGIC 0x14e46c77 /* bump this number if you change the ioctl interface */ #define WLC_IOCTL_VERSION 1 -/* maximum length buffer required */ -#define WLC_IOCTL_MAXLEN 8192 +#define WLC_IOCTL_MAXLEN 8192 /* max length ioctl buffer required */ +#define WLC_IOCTL_SMLEN 256 /* "small" length ioctl buffer required */ /* common ioctl definitions */ #define WLC_GET_MAGIC 0 #define WLC_GET_VERSION 1 #define WLC_UP 2 #define WLC_DOWN 3 -#define WLC_GET_LOOP 4 -#define WLC_SET_LOOP 5 #define WLC_DUMP 6 #define WLC_GET_MSGLEVEL 7 #define WLC_SET_MSGLEVEL 8 #define WLC_GET_PROMISC 9 #define WLC_SET_PROMISC 10 -#define WLC_OBSOLETE 11 #define WLC_GET_RATE 12 -#define WLC_SET_RATE 13 +/* #define WLC_SET_RATE 13 */ /* no longer supported */ #define WLC_GET_INSTANCE 14 -#define WLC_GET_FRAG 15 -#define WLC_SET_FRAG 16 -#define WLC_GET_RTS 17 -#define WLC_SET_RTS 18 +/* #define WLC_GET_FRAG 15 */ /* no longer supported */ +/* #define WLC_SET_FRAG 16 */ /* no longer supported */ +/* #define WLC_GET_RTS 17 */ /* no longer supported */ +/* #define WLC_SET_RTS 18 */ /* no longer supported */ #define WLC_GET_INFRA 19 #define WLC_SET_INFRA 20 #define WLC_GET_AUTH 21 @@ -678,7 +595,6 @@ typedef struct wlc_rev_info { #define WLC_GET_SSID 25 #define WLC_SET_SSID 26 #define WLC_RESTART 27 -#define WLC_DUMP_SCB 28 #define WLC_GET_CHANNEL 29 #define WLC_SET_CHANNEL 30 #define WLC_GET_SRL 31 @@ -690,33 +606,26 @@ typedef struct wlc_rev_info { #define WLC_GET_RADIO 37 #define WLC_SET_RADIO 38 #define WLC_GET_PHYTYPE 39 -#define WLC_DUMP_RATE 40 -#define WLC_SET_RATE_PARAMS 41 -#define WLC_GET_WEP 42 -#define WLC_SET_WEP 43 +/* #define WLC_GET_WEP 42 */ /* no longer supported */ +/* #define WLC_SET_WEP 43 */ /* no longer supported */ #define WLC_GET_KEY 44 #define WLC_SET_KEY 45 #define WLC_GET_REGULATORY 46 #define WLC_SET_REGULATORY 47 -#define WLC_GET_PASSIVE 48 /* added by nbd */ -#define WLC_SET_PASSIVE 49 /* added by nbd */ +#define WLC_GET_PASSIVE 48 +#define WLC_SET_PASSIVE 49 #define WLC_SCAN 50 #define WLC_SCAN_RESULTS 51 #define WLC_DISASSOC 52 #define WLC_REASSOC 53 #define WLC_GET_ROAM_TRIGGER 54 #define WLC_SET_ROAM_TRIGGER 55 -#define WLC_GET_ROAM_DELTA 56 -#define WLC_SET_ROAM_DELTA 57 -#define WLC_GET_ROAM_SCAN_PERIOD 58 -#define WLC_SET_ROAM_SCAN_PERIOD 59 -#define WLC_EVM 60 #define WLC_GET_TXANT 61 #define WLC_SET_TXANT 62 #define WLC_GET_ANTDIV 63 #define WLC_SET_ANTDIV 64 -#define WLC_GET_TXPWR 65 -#define WLC_SET_TXPWR 66 +/* #define WLC_GET_TXPWR 65 */ /* no longer supported */ +/* #define WLC_SET_TXPWR 66 */ /* no longer supported */ #define WLC_GET_CLOSED 67 #define WLC_SET_CLOSED 68 #define WLC_GET_MACLIST 69 @@ -724,7 +633,7 @@ typedef struct wlc_rev_info { #define WLC_GET_RATESET 71 #define WLC_SET_RATESET 72 #define WLC_GET_LOCALE 73 -#define WLC_SET_LOCALE 74 +#define WLC_LONGTRAIN 74 #define WLC_GET_BCNPRD 75 #define WLC_SET_BCNPRD 76 #define WLC_GET_DTIMPRD 77 @@ -739,7 +648,7 @@ typedef struct wlc_rev_info { #define WLC_SET_PM 86 #define WLC_GET_WAKE 87 #define WLC_SET_WAKE 88 -#define WLC_GET_D11CNTS 89 +#define WLC_GET_D11CNTS 89 #define WLC_GET_FORCELINK 90 /* ndis only */ #define WLC_SET_FORCELINK 91 /* ndis only */ #define WLC_FREQ_ACCURACY 92 @@ -757,8 +666,8 @@ typedef struct wlc_rev_info { #define WLC_RESET_D11CNTS 104 #define WLC_GET_MACMODE 105 #define WLC_SET_MACMODE 106 -#define WLC_GET_MONITOR 107 /* added by nbd */ -#define WLC_SET_MONITOR 108 /* added by nbd */ +#define WLC_GET_MONITOR 107 +#define WLC_SET_MONITOR 108 #define WLC_GET_GMODE 109 #define WLC_SET_GMODE 110 #define WLC_GET_LEGACY_ERP 111 @@ -803,12 +712,8 @@ typedef struct wlc_rev_info { #define WLC_GET_GMODE_PROTECTION_OVERRIDE 150 #define WLC_SET_GMODE_PROTECTION_OVERRIDE 151 #define WLC_UPGRADE 152 -#define WLC_GET_MRATE 153 -#define WLC_SET_MRATE 154 -#define WLC_GET_IGNORE_BCNS 155 -#define WLC_SET_IGNORE_BCNS 156 -#define WLC_GET_SCB_TIMEOUT 157 -#define WLC_SET_SCB_TIMEOUT 158 +/* #define WLC_GET_MRATE 153 */ /* no longer supported */ +/* #define WLC_SET_MRATE 154 */ /* no longer supported */ #define WLC_GET_ASSOCLIST 159 #define WLC_GET_CLK 160 #define WLC_SET_CLK 161 @@ -816,85 +721,48 @@ typedef struct wlc_rev_info { #define WLC_OUT 163 #define WLC_GET_WPA_AUTH 164 #define WLC_SET_WPA_AUTH 165 -#define WLC_GET_UCFLAGS 166 -#define WLC_SET_UCFLAGS 167 -#define WLC_GET_PWRIDX 168 -#define WLC_SET_PWRIDX 169 -#define WLC_GET_TSSI 170 -#define WLC_GET_SUP_RATESET_OVERRIDE 171 -#define WLC_SET_SUP_RATESET_OVERRIDE 172 -#define WLC_SET_FAST_TIMER 173 -#define WLC_GET_FAST_TIMER 174 -#define WLC_SET_SLOW_TIMER 175 -#define WLC_GET_SLOW_TIMER 176 -#define WLC_DUMP_PHYREGS 177 -#define WLC_GET_GMODE_PROTECTION_CONTROL 178 -#define WLC_SET_GMODE_PROTECTION_CONTROL 179 +#define WLC_GET_PROTECTION_CONTROL 178 +#define WLC_SET_PROTECTION_CONTROL 179 #define WLC_GET_PHYLIST 180 -#define WLC_ENCRYPT_STRENGTH 181 /* ndis only */ -#define WLC_DECRYPT_STATUS 182 /* ndis only */ #define WLC_GET_KEY_SEQ 183 -#define WLC_GET_SCAN_CHANNEL_TIME 184 -#define WLC_SET_SCAN_CHANNEL_TIME 185 -#define WLC_GET_SCAN_UNASSOC_TIME 186 -#define WLC_SET_SCAN_UNASSOC_TIME 187 -#define WLC_GET_SCAN_HOME_TIME 188 -#define WLC_SET_SCAN_HOME_TIME 189 -#define WLC_GET_SCAN_PASSES 190 -#define WLC_SET_SCAN_PASSES 191 -#define WLC_GET_PRB_RESP_TIMEOUT 192 -#define WLC_SET_PRB_RESP_TIMEOUT 193 -#define WLC_GET_ATTEN 194 -#define WLC_SET_ATTEN 195 -#define WLC_GET_SHMEM 196 /* diag */ -#define WLC_SET_SHMEM 197 /* diag */ -#define WLC_GET_GMODE_PROTECTION_CTS 198 -#define WLC_SET_GMODE_PROTECTION_CTS 199 -#define WLC_SET_TKIP_MIC_FLAG 200 -#define WLC_SCB_DEAUTHENTICATE_FOR_REASON 201 -#define WLC_TKIP_COUNTERMEASURES 202 +/* #define WLC_GET_GMODE_PROTECTION_CTS 198 */ /* no longer supported */ +/* #define WLC_SET_GMODE_PROTECTION_CTS 199 */ /* no longer supported */ #define WLC_GET_PIOMODE 203 #define WLC_SET_PIOMODE 204 #define WLC_SET_LED 209 #define WLC_GET_LED 210 -#define WLC_GET_INTERFERENCE_MODE 211 -#define WLC_SET_INTERFERENCE_MODE 212 -#define WLC_GET_CHANNEL_QA 213 -#define WLC_START_CHANNEL_QA 214 #define WLC_GET_CHANNEL_SEL 215 #define WLC_START_CHANNEL_SEL 216 #define WLC_GET_VALID_CHANNELS 217 #define WLC_GET_FAKEFRAG 218 #define WLC_SET_FAKEFRAG 219 -#define WLC_GET_PWROUT_PERCENTAGE 220 -#define WLC_SET_PWROUT_PERCENTAGE 221 -#define WLC_SET_BAD_FRAME_PREEMPT 222 -#define WLC_GET_BAD_FRAME_PREEMPT 223 -#define WLC_SET_LEAP_LIST 224 -#define WLC_GET_LEAP_LIST 225 -#define WLC_GET_CWMIN 226 -#define WLC_SET_CWMIN 227 -#define WLC_GET_CWMAX 228 -#define WLC_SET_CWMAX 229 #define WLC_GET_WET 230 #define WLC_SET_WET 231 #define WLC_GET_KEY_PRIMARY 235 #define WLC_SET_KEY_PRIMARY 236 -#define WLC_SCAN_WITH_CALLBACK 240 -#define WLC_WDS_GET_REMOTE_HWADDR 246 /* currently handled in wl_linux.c/wl_vx.c */ +#define WLC_GET_RADAR 242 +#define WLC_SET_RADAR 243 +#define WLC_SET_SPECT_MANAGMENT 244 +#define WLC_GET_SPECT_MANAGMENT 245 +#define WLC_WDS_GET_REMOTE_HWADDR 246 /* handled in wl_linux.c/wl_vx.c */ #define WLC_SET_CS_SCAN_TIMER 248 #define WLC_GET_CS_SCAN_TIMER 249 +#define WLC_SEND_PWR_CONSTRAINT 254 #define WLC_CURRENT_PWR 256 #define WLC_GET_CHANNELS_IN_COUNTRY 260 #define WLC_GET_COUNTRY_LIST 261 #define WLC_GET_VAR 262 /* get value of named variable */ #define WLC_SET_VAR 263 /* set named variable to value */ -#define WLC_NVRAM_GET 264 +#define WLC_NVRAM_GET 264 /* deprecated */ #define WLC_NVRAM_SET 265 #define WLC_SET_WSEC_PMK 268 #define WLC_GET_AUTH_MODE 269 #define WLC_SET_AUTH_MODE 270 -#define WLC_LAST 273 /* do not change - use get_var/set_var */ +#define WLC_NDCONFIG_ITEM 273 /* currently handled in wl_oid.c */ +#define WLC_NVOTPW 274 +#define WLC_OTPW 275 +#define WLC_SET_LOCALE 278 +#define WLC_LAST 279 /* do not change - use get_var/set_var */ /* * Minor kludge alert: @@ -924,10 +792,7 @@ typedef struct wlc_rev_info { /* NDIS overrides */ #define OID_WL_GETINSTANCE (WL_OID_BASE + WLC_GET_INSTANCE) -#define OID_WL_GET_FORCELINK (WL_OID_BASE + WLC_GET_FORCELINK) -#define OID_WL_SET_FORCELINK (WL_OID_BASE + WLC_SET_FORCELINK) -#define OID_WL_ENCRYPT_STRENGTH (WL_OID_BASE + WLC_ENCRYPT_STRENGTH) -#define OID_WL_DECRYPT_STATUS (WL_OID_BASE + WLC_DECRYPT_STATUS) +#define OID_WL_NDCONFIG_ITEM (WL_OID_BASE + WLC_NDCONFIG_ITEM) #define WL_DECRYPT_STATUS_SUCCESS 1 #define WL_DECRYPT_STATUS_FAILURE 2 @@ -937,113 +802,205 @@ typedef struct wlc_rev_info { #define WLC_UPGRADE_SUCCESS 0 #define WLC_UPGRADE_PENDING 1 +#ifdef CONFIG_USBRNDIS_RETAIL +/* struct passed in for WLC_NDCONFIG_ITEM */ +typedef struct { + char *name; + void *param; +} ndconfig_item_t; +#endif + /* Bit masks for radio disabled status - returned by WL_GET_RADIO */ -#define WL_RADIO_SW_DISABLE (1<<0) -#define WL_RADIO_HW_DISABLE (1<<1) +#define WL_RADIO_SW_DISABLE (1<<0) +#define WL_RADIO_HW_DISABLE (1<<1) +#define WL_RADIO_MPC_DISABLE (1<<2) +#define WL_RADIO_COUNTRY_DISABLE (1<<3) /* some countries don't support any channel */ /* Override bit for WLC_SET_TXPWR. if set, ignore other level limits */ #define WL_TXPWR_OVERRIDE (1<<31) - -/* Bus types */ -#define WL_SB_BUS 0 /* Silicon Backplane */ -#define WL_PCI_BUS 1 /* PCI target */ -#define WL_PCMCIA_BUS 2 /* PCMCIA target */ +/* "diag" iovar argument and error code */ +#define WL_DIAG_INTERRUPT 1 /* d11 loopback interrupt test */ +#define WL_DIAG_MEMORY 3 /* d11 memory test */ +#define WL_DIAG_LED 4 /* LED test */ +#define WL_DIAG_REG 5 /* d11/phy register test */ +#define WL_DIAG_SROM 6 /* srom read/crc test */ +#define WL_DIAG_DMA 7 /* DMA test */ + +#define WL_DIAGERR_SUCCESS 0 +#define WL_DIAGERR_FAIL_TO_RUN 1 /* unable to run requested diag */ +#define WL_DIAGERR_NOT_SUPPORTED 2 /* diag requested is not supported */ +#define WL_DIAGERR_INTERRUPT_FAIL 3 /* loopback interrupt test failed */ +#define WL_DIAGERR_LOOPBACK_FAIL 4 /* loopback data test failed */ +#define WL_DIAGERR_SROM_FAIL 5 /* srom read failed */ +#define WL_DIAGERR_SROM_BADCRC 6 /* srom crc failed */ +#define WL_DIAGERR_REG_FAIL 7 /* d11/phy register test failed */ +#define WL_DIAGERR_MEMORY_FAIL 8 /* d11 memory test failed */ +#define WL_DIAGERR_NOMEM 9 /* diag test failed due to no memory */ +#define WL_DIAGERR_DMA_FAIL 10 /* DMA test failed */ /* band types */ #define WLC_BAND_AUTO 0 /* auto-select */ -#define WLC_BAND_A 1 /* "a" band (5 Ghz) */ -#define WLC_BAND_B 2 /* "b" band (2.4 Ghz) */ +#define WLC_BAND_5G 1 /* 5 Ghz */ +#define WLC_BAND_2G 2 /* 2.4 Ghz */ +#define WLC_BAND_ALL 3 /* all bands */ + +/* phy types (returned by WLC_GET_PHYTPE) */ +#define WLC_PHY_TYPE_A 0 +#define WLC_PHY_TYPE_B 1 +#define WLC_PHY_TYPE_G 2 +#define WLC_PHY_TYPE_N 4 +#define WLC_PHY_TYPE_NULL 0xf /* MAC list modes */ #define WLC_MACMODE_DISABLED 0 /* MAC list disabled */ #define WLC_MACMODE_DENY 1 /* Deny specified (i.e. allow unspecified) */ -#define WLC_MACMODE_ALLOW 2 /* Allow specified (i.e. deny unspecified) */ - - -/* 54g modes (basic bits may still be overridden) */ -#define GMODE_LEGACY_B 0 /* Rateset: 1b, 2b, 5.5, 11 */ - /* Preamble: Long */ - /* Shortslot: Off */ -#define GMODE_AUTO 1 /* Rateset: 1b, 2b, 5.5b, 11b, 18, 24, 36, 54 */ - /* Extended Rateset: 6, 9, 12, 48 */ - /* Preamble: Long */ - /* Shortslot: Auto */ -#define GMODE_ONLY 2 /* Rateset: 1b, 2b, 5.5b, 11b, 18, 24b, 36, 54 */ - /* Extended Rateset: 6b, 9, 12b, 48 */ - /* Preamble: Short required */ - /* Shortslot: Auto */ -#define GMODE_B_DEFERRED 3 /* Rateset: 1b, 2b, 5.5b, 11b, 18, 24, 36, 54 */ - /* Extended Rateset: 6, 9, 12, 48 */ - /* Preamble: Long */ - /* Shortslot: On */ -#define GMODE_PERFORMANCE 4 /* Rateset: 1b, 2b, 5.5b, 6b, 9, 11b, 12b, 18, 24b, 36, 48, 54 */ - /* Preamble: Short required */ - /* Shortslot: On and required */ -#define GMODE_LRS 5 /* Rateset: 1b, 2b, 5.5b, 11b */ - /* Extended Rateset: 6, 9, 12, 18, 24, 36, 48, 54 */ - /* Preamble: Long */ - /* Shortslot: Auto */ -#define GMODE_MAX 6 +#define WLC_MACMODE_ALLOW 2 /* Allow specified (i.e. deny unspecified) */ +/* + * + */ +#define GMODE_LEGACY_B 0 +#define GMODE_AUTO 1 +#define GMODE_ONLY 2 +#define GMODE_B_DEFERRED 3 +#define GMODE_PERFORMANCE 4 +#define GMODE_LRS 5 +#define GMODE_MAX 6 /* values for PLCPHdr_override */ #define WLC_PLCP_AUTO -1 #define WLC_PLCP_SHORT 0 #define WLC_PLCP_LONG 1 -/* values for g_protection_override */ -#define WLC_G_PROTECTION_AUTO -1 -#define WLC_G_PROTECTION_OFF 0 -#define WLC_G_PROTECTION_ON 1 +/* values for g_protection_override and n_protection_override */ +#define WLC_PROTECTION_AUTO -1 +#define WLC_PROTECTION_OFF 0 +#define WLC_PROTECTION_ON 1 + +/* values for g_protection_control and n_protection_control */ +#define WLC_PROTECTION_CTL_OFF 0 +#define WLC_PROTECTION_CTL_LOCAL 1 +#define WLC_PROTECTION_CTL_OVERLAP 2 + +/* deprecated const names for g_protection_override */ +#define WLC_G_PROTECTION_AUTO WLC_PROTECTION_AUTO +#define WLC_G_PROTECTION_OFF WLC_PROTECTION_OFF +#define WLC_G_PROTECTION_ON WLC_PROTECTION_ON -/* values for g_protection_control */ -#define WLC_G_PROTECTION_CTL_OFF 0 -#define WLC_G_PROTECTION_CTL_LOCAL 1 -#define WLC_G_PROTECTION_CTL_OVERLAP 2 +/* deprecated const names for g_protection_control */ +#define WLC_G_PROTECTION_CTL_OFF WLC_PROTECTION_CTL_OFF +#define WLC_G_PROTECTION_CTL_LOCAL WLC_PROTECTION_CTL_LOCAL +#define WLC_G_PROTECTION_CTL_OVERLAP WLC_PROTECTION_CTL_OVERLAP + +/* deprecated const names for get/set g_protection_control */ +#define WLC_GET_GMODE_PROTECTION_CONTROL WLC_GET_PROTECTION_CONTROL +#define WLC_SET_GMODE_PROTECTION_CONTROL WLC_SET_PROTECTION_CONTROL + +/* values for n_protection */ +#define WLC_N_PROTECTION_OFF 0 +#define WLC_N_PROTECTION_MIXEDMODE 1 +#define WLC_N_PROTECTION_CTS 2 + +/* values for n_preamble_type */ +#define WLC_N_PREAMBLE_MIXEDMODE 0 +#define WLC_N_PREAMBLE_GF 1 /* Values for PM */ #define PM_OFF 0 #define PM_MAX 1 #define PM_FAST 2 -/* interference mitigation options */ -#define INTERFERE_NONE 0 /* off */ -#define NON_WLAN 1 /* foreign/non 802.11 interference, no auto detect */ -#define WLAN_MANUAL 2 /* ACI: no auto detection */ -#define WLAN_AUTO 3 /* ACI: auto - detact */ - -/* Message levels */ -#define WL_ERROR_VAL 0x0001 -#define WL_TRACE_VAL 0x0002 -#define WL_PRHDRS_VAL 0x0004 -#define WL_PRPKT_VAL 0x0008 -#define WL_INFORM_VAL 0x0010 -#define WL_TMP_VAL 0x0020 -#define WL_OID_VAL 0x0040 -#define WL_RATE_VAL 0x0080 -#define WL_ASSOC_VAL 0x0100 -#define WL_PRUSR_VAL 0x0200 -#define WL_PS_VAL 0x0400 -#define WL_TXPWR_VAL 0x0800 -#define WL_GMODE_VAL 0x1000 -#define WL_DUAL_VAL 0x2000 -#define WL_WSEC_VAL 0x4000 -#define WL_WSEC_DUMP_VAL 0x8000 -#define WL_LOG_VAL 0x10000 -#define WL_NRSSI_VAL 0x20000 -#define WL_LOFT_VAL 0x40000 -#define WL_REGULATORY_VAL 0x80000 -#define WL_ACI_VAL 0x100000 - - -/* 802.11h enforcement levels */ -#define SPECT_MNGMT_OFF 0 /* 11h disabled */ -#define SPECT_MNGMT_LOOSE 1 /* Allow scan lists to contain non-11h AP */ - /* when 11h is enabled */ -#define SPECT_MNGMT_STRICT 2 /* Prine out non-11h APs from scan list */ +typedef struct { + int npulses; /* required number of pulses at n * t_int */ + int ncontig; /* required number of pulses at t_int */ + int min_pw; /* minimum pulse width (20 MHz clocks) */ + int max_pw; /* maximum pulse width (20 MHz clocks) */ + uint16 thresh0; /* Radar detection, thresh 0 */ + uint16 thresh1; /* Radar detection, thresh 1 */ + int npulses_lp; /* Radar detection, minimum long pulses */ + int min_pw_lp; /* Minimum pulsewidth for long pulses */ + int max_pw_lp; /* Maximum pulsewidth for long pulses */ + int min_fm_lp; /* Minimum fm for long pulses */ + int max_deltat_lp; /* Maximum deltat for long pulses */ + int min_deltat; /* Minimum spacing between pulses */ +} wl_radar_args_t; + +/* radar iovar SET defines */ +#define WL_RADAR_DETECTOR_OFF 0 /* radar detector off */ +#define WL_RADAR_DETECTOR_ON 1 /* radar detector on */ +#define WL_RADAR_SIMULATED 2 /* force radar detector to declare + * detection once + */ + +/* dfs_status iovar-related defines */ + +/* cac - channel availability check, + * ism - in-service monitoring + * csa - channel switching announcement + */ + +/* cac state values */ +#define WL_DFS_CACSTATE_IDLE 0 /* state for operating in non-radar channel */ +#define WL_DFS_CACSTATE_PREISM_CAC 1 /* CAC in progress */ +#define WL_DFS_CACSTATE_ISM 2 /* ISM in progress */ +#define WL_DFS_CACSTATE_CSA 3 /* csa */ +#define WL_DFS_CACSTATE_POSTISM_CAC 4 /* ISM CAC */ +#define WL_DFS_CACSTATE_PREISM_OOC 5 /* PREISM OOC */ +#define WL_DFS_CACSTATE_POSTISM_OOC 6 /* POSTISM OOC */ +#define WL_DFS_CACSTATES 7 /* this many states exist */ + +/* data structure used in 'dfs_status' wl interface, which is used to query dfs status */ +typedef struct { + uint state; /* noted by WL_DFS_CACSTATE_XX. */ + uint duration; /* time spent in ms in state. */ + /* as dfs enters ISM state, it removes the operational channel from quiet channel + * list and notes the channel in channel_cleared. set to 0 if no channel is cleared + */ + chanspec_t chanspec_cleared; + /* chanspec cleared used to be a uint, add another to uint16 to maintain size */ + uint16 pad; +} wl_dfs_status_t; + +#define NUM_PWRCTRL_RATES 12 + +typedef struct tx_inst_power { +} tx_inst_power_t; + + +/* regulatory enforcement levels */ +#define SPECT_MNGMT_OFF 0 /* both 11h and 11d disabled */ +#define SPECT_MNGMT_LOOSE_11H 1 /* allow non-11h APs in scan lists */ +#define SPECT_MNGMT_STRICT_11H 2 /* prune out non-11h APs from scan list */ +#define SPECT_MNGMT_STRICT_11D 3 /* switch to 802.11D mode */ +/* SPECT_MNGMT_LOOSE_11H_D - same as SPECT_MNGMT_LOOSE with the exception that Country IE + * adoption is done irregardless of capability-spectrum_management + */ +#define SPECT_MNGMT_LOOSE_11H_D 4 /* operation defined above */ + +#define WL_CHAN_VALID_HW (1 << 0) /* valid with current HW */ +#define WL_CHAN_VALID_SW (1 << 1) /* valid with current country setting */ +#define WL_CHAN_BAND_5G (1 << 2) /* 5GHz-band channel */ +#define WL_CHAN_RADAR (1 << 3) /* radar sensitive channel */ +#define WL_CHAN_INACTIVE (1 << 4) /* temporarily inactive due to radar */ +#define WL_CHAN_PASSIVE (1 << 5) /* channel is in passive mode */ +#define WL_CHAN_RESTRICTED (1 << 6) /* restricted use channel */ + +/* BTC mode used by "btc_mode" iovar */ +#define WL_BTC_DISABLE 0 /* disable BT coexistance */ +#define WL_BTC_ENABLE 1 /* enable BT coexistance */ +#define WL_BTC_PREMPT 2 /* enable BT coexistance and BT pre-emption */ + +#define WL_MPC_VAL 0x00400000 +#define WL_APSTA_VAL 0x00800000 +#define WL_DFS_VAL 0x01000000 +#define WL_BA_VAL 0x02000000 +#define WL_NITRO_VAL 0x04000000 +#define WL_CAC_VAL 0x08000000 +#define WL_AMSDU_VAL 0x10000000 +#define WL_AMPDU_VAL 0x20000000 /* max # of leds supported by GPIO (gpio pin# == led index#) */ #define WL_LED_NUMGPIO 16 /* gpio 0-15 */ @@ -1067,28 +1024,361 @@ typedef struct wlc_rev_info { #define WL_LED_BEH_MASK 0x7f /* behavior mask */ #define WL_LED_AL_MASK 0x80 /* activelow (polarity) bit */ - -/* maximum channels */ -#define WL_NUMCHANNELS 64 /* max # of channels in the band */ - -/* rate check */ -#define WL_RATE_OFDM(r) (((r) & 0x7f) == 12 || ((r) & 0x7f) == 18 || \ - ((r) & 0x7f) == 24 || ((r) & 0x7f) == 36 || \ - ((r) & 0x7f) == 48 || ((r) & 0x7f) == 72 || \ - ((r) & 0x7f) == 96 || ((r) & 0x7f) == 108) +/* max # of channels returnd by the get valid channels iovar */ +#define WL_NUMCHANSPECS 100 /* WDS link local endpoint WPA role */ #define WL_WDS_WPA_ROLE_AUTH 0 /* authenticator */ #define WL_WDS_WPA_ROLE_SUP 1 /* supplicant */ #define WL_WDS_WPA_ROLE_AUTO 255 /* auto, based on mac addr value */ -/* afterburner_override */ -#define ABO_AUTO -1 /* auto - no override */ -#define ABO_OFF 0 /* force afterburner off */ -#define ABO_ON 1 /* force afterburner on */ +/* number of bytes needed to define a 128-bit mask for MAC event reporting */ +#define WL_EVENTING_MASK_LEN 16 + +/* Structures and constants used for "vndr_ie" IOVar interface */ +#define VNDR_IE_CMD_LEN 4 /* length of the set command string: + * "add", "del" (+ NULL) + */ + +/* 802.11 Mgmt Packet flags */ +#define VNDR_IE_BEACON_FLAG 0x1 +#define VNDR_IE_PRBRSP_FLAG 0x2 +#define VNDR_IE_ASSOCRSP_FLAG 0x4 +#define VNDR_IE_AUTHRSP_FLAG 0x8 + +#define VNDR_IE_INFO_HDR_LEN (sizeof(uint32)) + +typedef struct { + uint32 pktflag; /* bitmask indicating which packet(s) contain this IE */ + vndr_ie_t vndr_ie_data; /* vendor IE data */ +} vndr_ie_info_t; + +typedef struct { + int iecount; /* number of entries in the vndr_ie_list[] array */ + vndr_ie_info_t vndr_ie_list[1]; /* variable size list of vndr_ie_info_t structs */ +} vndr_ie_buf_t; + +typedef struct { + char cmd[VNDR_IE_CMD_LEN]; /* vndr_ie IOVar set command : "add", "del" + NULL */ + vndr_ie_buf_t vndr_ie_buffer; /* buffer containing Vendor IE list information */ +} vndr_ie_setbuf_t; + +/* join target preference types */ +#define WL_JOIN_PREF_RSSI 1 /* by RSSI, mandatory */ +#define WL_JOIN_PREF_WPA 2 /* by akm and ciphers, optional, RSN and WPA as values */ +#define WL_JOIN_PREF_BAND 3 /* by 802.11 band, optional, WLC_BAND_XXXX as values */ -#define GMODE_AFTERBURNER 6 +/* band preference */ +#define WLJP_BAND_ASSOC_PREF 255 /* use assoc preference settings */ + /* others use WLC_BAND_XXXX as values */ + +/* any multicast cipher suite */ +#define WL_WPA_ACP_MCS_ANY "\x00\x00\x00\x00" + +struct tsinfo_arg { + uint8 octets[3]; +}; + +#if !defined(__GNUC__) +#pragma pack(pop) +#endif + +#define NFIFO 6 /* # tx/rx fifopairs */ + +#define WL_CNT_T_VERSION 1 /* current version of wl_cnt_t struct */ + +typedef struct { + uint16 version; /* see definition of WL_CNT_T_VERSION */ + uint16 length; /* length of entire structure */ + + /* transmit stat counters */ + uint32 txframe; /* tx data frames */ + uint32 txbyte; /* tx data bytes */ + uint32 txretrans; /* tx mac retransmits */ + uint32 txerror; /* tx data errors (derived: sum of others) */ + uint32 txctl; /* tx management frames */ + uint32 txprshort; /* tx short preamble frames */ + uint32 txserr; /* tx status errors */ + uint32 txnobuf; /* tx out of buffers errors */ + uint32 txnoassoc; /* tx discard because we're not associated */ + uint32 txrunt; /* tx runt frames */ + uint32 txchit; /* tx header cache hit (fastpath) */ + uint32 txcmiss; /* tx header cache miss (slowpath) */ + + /* transmit chip error counters */ + uint32 txuflo; /* tx fifo underflows */ + uint32 txphyerr; /* tx phy errors (indicated in tx status) */ + uint32 txphycrs; + + /* receive stat counters */ + uint32 rxframe; /* rx data frames */ + uint32 rxbyte; /* rx data bytes */ + uint32 rxerror; /* rx data errors (derived: sum of others) */ + uint32 rxctl; /* rx management frames */ + uint32 rxnobuf; /* rx out of buffers errors */ + uint32 rxnondata; /* rx non data frames in the data channel errors */ + uint32 rxbadds; /* rx bad DS errors */ + uint32 rxbadcm; /* rx bad control or management frames */ + uint32 rxfragerr; /* rx fragmentation errors */ + uint32 rxrunt; /* rx runt frames */ + uint32 rxgiant; /* rx giant frames */ + uint32 rxnoscb; /* rx no scb error */ + uint32 rxbadproto; /* rx invalid frames */ + uint32 rxbadsrcmac; /* rx frames with Invalid Src Mac */ + uint32 rxbadda; /* rx frames tossed for invalid da */ + uint32 rxfilter; /* rx frames filtered out */ + + /* receive chip error counters */ + uint32 rxoflo; /* rx fifo overflow errors */ + uint32 rxuflo[NFIFO]; /* rx dma descriptor underflow errors */ + + uint32 d11cnt_txrts_off; /* d11cnt txrts value when reset d11cnt */ + uint32 d11cnt_rxcrc_off; /* d11cnt rxcrc value when reset d11cnt */ + uint32 d11cnt_txnocts_off; /* d11cnt txnocts value when reset d11cnt */ + + /* misc counters */ + uint32 dmade; /* tx/rx dma descriptor errors */ + uint32 dmada; /* tx/rx dma data errors */ + uint32 dmape; /* tx/rx dma descriptor protocol errors */ + uint32 reset; /* reset count */ + uint32 tbtt; /* cnts the TBTT int's */ + uint32 txdmawar; + uint32 pkt_callback_reg_fail; /* callbacks register failure */ + + /* MAC counters: 32-bit version of d11.h's macstat_t */ + uint32 txallfrm; /* total number of frames sent, incl. Data, ACK, RTS, CTS, + * Control Management (includes retransmissions) + */ + uint32 txrtsfrm; /* number of RTS sent out by the MAC */ + uint32 txctsfrm; /* number of CTS sent out by the MAC */ + uint32 txackfrm; /* number of ACK frames sent out */ + uint32 txdnlfrm; /* Not used */ + uint32 txbcnfrm; /* beacons transmitted */ + uint32 txfunfl[8]; /* per-fifo tx underflows */ + uint32 txtplunfl; /* Template underflows (mac was too slow to transmit ACK/CTS + * or BCN) + */ + uint32 txphyerror; /* Transmit phy error, type of error is reported in tx-status for + * driver enqueued frames + */ + uint32 rxfrmtoolong; /* Received frame longer than legal limit (2346 bytes) */ + uint32 rxfrmtooshrt; /* Received frame did not contain enough bytes for its frame type */ + uint32 rxinvmachdr; /* Either the protocol version != 0 or frame type not + * data/control/management + */ + uint32 rxbadfcs; /* number of frames for which the CRC check failed in the MAC */ + uint32 rxbadplcp; /* parity check of the PLCP header failed */ + uint32 rxcrsglitch; /* PHY was able to correlate the preamble but not the header */ + uint32 rxstrt; /* Number of received frames with a good PLCP + * (i.e. passing parity check) + */ + uint32 rxdfrmucastmbss; /* Number of received DATA frames with good FCS and matching RA */ + uint32 rxmfrmucastmbss; /* number of received mgmt frames with good FCS and matching RA */ + uint32 rxcfrmucast; /* number of received CNTRL frames with good FCS and matching RA */ + uint32 rxrtsucast; /* number of unicast RTS addressed to the MAC (good FCS) */ + uint32 rxctsucast; /* number of unicast CTS addressed to the MAC (good FCS) */ + uint32 rxackucast; /* number of ucast ACKS received (good FCS) */ + uint32 rxdfrmocast; /* number of received DATA frames (good FCS and not matching RA) */ + uint32 rxmfrmocast; /* number of received MGMT frames (good FCS and not matching RA) */ + uint32 rxcfrmocast; /* number of received CNTRL frame (good FCS and not matching RA) */ + uint32 rxrtsocast; /* number of received RTS not addressed to the MAC */ + uint32 rxctsocast; /* number of received CTS not addressed to the MAC */ + uint32 rxdfrmmcast; /* number of RX Data multicast frames received by the MAC */ + uint32 rxmfrmmcast; /* number of RX Management multicast frames received by the MAC */ + uint32 rxcfrmmcast; /* number of RX Control multicast frames received by the MAC + * (unlikely to see these) + */ + uint32 rxbeaconmbss; /* beacons received from member of BSS */ + uint32 rxdfrmucastobss; /* number of unicast frames addressed to the MAC from + * other BSS (WDS FRAME) + */ + uint32 rxbeaconobss; /* beacons received from other BSS */ + uint32 rxrsptmout; /* Number of response timeouts for transmitted frames + * expecting a response + */ + uint32 bcntxcancl; /* transmit beacons canceled due to receipt of beacon (IBSS) */ + uint32 rxf0ovfl; /* Number of receive fifo 0 overflows */ + uint32 rxf1ovfl; /* Number of receive fifo 1 overflows (obsolete) */ + uint32 rxf2ovfl; /* Number of receive fifo 2 overflows (obsolete) */ + uint32 txsfovfl; /* Number of transmit status fifo overflows (obsolete) */ + uint32 pmqovfl; /* Number of PMQ overflows */ + uint32 rxcgprqfrm; /* Number of received Probe requests that made it into + * the PRQ fifo + */ + uint32 rxcgprsqovfl; /* Rx Probe Request Que overflow in the AP */ + uint32 txcgprsfail; /* Tx Probe Response Fail. AP sent probe response but did + * not get ACK + */ + uint32 txcgprssuc; /* Tx Probe Response Success (ACK was received) */ + uint32 prs_timeout; /* Number of probe requests that were dropped from the PRQ + * fifo because a probe response could not be sent out within + * the time limit defined in M_PRS_MAXTIME + */ + uint32 rxnack; /* Number of NACKS received (Afterburner) */ + uint32 frmscons; /* Number of frames completed without transmission because of an + * Afterburner re-queue + */ + uint32 txnack; /* Number of NACKs transmitted (Afterburner) */ + uint32 txglitch_nack; /* obsolete */ + uint32 txburst; /* obsolete */ + + /* 802.11 MIB counters, pp. 614 of 802.11 reaff doc. */ + uint32 txfrag; /* dot11TransmittedFragmentCount */ + uint32 txmulti; /* dot11MulticastTransmittedFrameCount */ + uint32 txfail; /* dot11FailedCount */ + uint32 txretry; /* dot11RetryCount */ + uint32 txretrie; /* dot11MultipleRetryCount */ + uint32 rxdup; /* dot11FrameduplicateCount */ + uint32 txrts; /* dot11RTSSuccessCount */ + uint32 txnocts; /* dot11RTSFailureCount */ + uint32 txnoack; /* dot11ACKFailureCount */ + uint32 rxfrag; /* dot11ReceivedFragmentCount */ + uint32 rxmulti; /* dot11MulticastReceivedFrameCount */ + uint32 rxcrc; /* dot11FCSErrorCount */ + uint32 txfrmsnt; /* dot11TransmittedFrameCount (bogus MIB?) */ + uint32 rxundec; /* dot11WEPUndecryptableCount */ + + /* WPA2 counters (see rxundec for DecryptFailureCount) */ + uint32 tkipmicfaill; /* TKIPLocalMICFailures */ + uint32 tkipcntrmsr; /* TKIPCounterMeasuresInvoked */ + uint32 tkipreplay; /* TKIPReplays */ + uint32 ccmpfmterr; /* CCMPFormatErrors */ + uint32 ccmpreplay; /* CCMPReplays */ + uint32 ccmpundec; /* CCMPDecryptErrors */ + uint32 fourwayfail; /* FourWayHandshakeFailures */ + uint32 wepundec; /* dot11WEPUndecryptableCount */ + uint32 wepicverr; /* dot11WEPICVErrorCount */ + uint32 decsuccess; /* DecryptSuccessCount */ + uint32 tkipicverr; /* TKIPICVErrorCount */ + uint32 wepexcluded; /* dot11WEPExcludedCount */ + + uint32 txchanrej; /* Tx frames suppressed due to channel rejection */ + uint32 psmwds; /* Count PSM watchdogs */ + uint32 phywatchdog; /* Count Phy lockups */ +} wl_cnt_t; + +#define WL_WME_CNT_VERSION 1 /* current version of wl_wme_cnt_t */ + +typedef struct { + uint32 packets; + uint32 bytes; +} wl_traffic_stats_t; + +typedef struct { + uint16 version; /* see definition of WL_CNT_T_VERSION */ + uint16 length; /* length of entire structure */ + + wl_traffic_stats_t tx[AC_COUNT]; /* Packets transmitted */ + wl_traffic_stats_t tx_failed[AC_COUNT]; /* Packets dropped or failed to transmit */ + wl_traffic_stats_t rx[AC_COUNT]; /* Packets received */ + wl_traffic_stats_t rx_failed[AC_COUNT]; /* Packets failed to receive */ + + wl_traffic_stats_t forward[AC_COUNT]; /* Packets forwarded by AP */ + + wl_traffic_stats_t tx_expired[AC_COUNT]; /* packets dropped due to lifetime expiry */ + +} wl_wme_cnt_t; + +#ifdef WLBA + +#define WLC_BA_CNT_VERSION 1 /* current version of wlc_ba_cnt_t */ + +/* block ack related stats */ +typedef struct wlc_ba_cnt { + uint16 version; /* WLC_BA_CNT_VERSION */ + uint16 length; /* length of entire structure */ + + /* transmit stat counters */ + uint32 txpdu; /* pdus sent */ + uint32 txsdu; /* sdus sent */ + uint32 txfc; /* tx side flow controlled packets */ + uint32 txfci; /* tx side flow control initiated */ + uint32 txretrans; /* retransmitted pdus */ + uint32 txbatimer; /* ba resend due to timer */ + uint32 txdrop; /* dropped packets */ + uint32 txaddbareq; /* addba req sent */ + uint32 txaddbaresp; /* addba resp sent */ + uint32 txdelba; /* delba sent */ + uint32 txba; /* ba sent */ + uint32 txbar; /* bar sent */ + uint32 txpad[4]; /* future */ + + /* receive side counters */ + uint32 rxpdu; /* pdus recd */ + uint32 rxqed; /* pdus buffered before sending up */ + uint32 rxdup; /* duplicate pdus */ + uint32 rxnobuf; /* pdus discarded due to no buf */ + uint32 rxaddbareq; /* addba req recd */ + uint32 rxaddbaresp; /* addba resp recd */ + uint32 rxdelba; /* delba recd */ + uint32 rxba; /* ba recd */ + uint32 rxbar; /* bar recd */ + uint32 rxinvba; /* invalid ba recd */ + uint32 rxbaholes; /* ba recd with holes */ + uint32 rxunexp; /* unexpected packets */ + uint32 rxpad[4]; /* future */ +} wlc_ba_cnt_t; +#endif /* WLBA */ + +/* structure for per-tid ampdu control */ +struct ampdu_tid_control { + uint8 tid; /* tid */ + uint8 enable; /* enable/disable */ +}; + +/* structure for addts arguments */ +/* For ioctls that take a list of TSPEC */ +struct tslist { + int count; /* number of tspecs */ + struct tsinfo_arg tsinfo[1]; /* variable length array of tsinfo */ +}; -#undef PACKED +/* structure for addts/delts arguments */ +typedef struct tspec_arg { + uint16 version; /* see definition of TSPEC_ARG_VERSION */ + uint16 length; /* length of entire structure */ + uint flag; /* bit field */ + /* TSPEC Arguments */ + struct tsinfo_arg tsinfo; /* TS Info bit field */ + uint16 nom_msdu_size; /* (Nominal or fixed) MSDU Size (bytes) */ + uint16 max_msdu_size; /* Maximum MSDU Size (bytes) */ + uint min_srv_interval; /* Minimum Service Interval (us) */ + uint max_srv_interval; /* Maximum Service Interval (us) */ + uint inactivity_interval; /* Inactivity Interval (us) */ + uint suspension_interval; /* Suspension Interval (us) */ + uint srv_start_time; /* Service Start Time (us) */ + uint min_data_rate; /* Minimum Data Rate (bps) */ + uint mean_data_rate; /* Mean Data Rate (bps) */ + uint peak_data_rate; /* Peak Data Rate (bps) */ + uint max_burst_size; /* Maximum Burst Size (bytes) */ + uint delay_bound; /* Delay Bound (us) */ + uint min_phy_rate; /* Minimum PHY Rate (bps) */ + uint16 surplus_bw; /* Surplus Bandwidth Allowance Factor */ + uint16 medium_time; /* Medium Time (32 us/s periods) */ +} tspec_arg_t; + +/* current version of wl_tspec_arg_t struct */ +#define TSPEC_ARG_VERSION 1 /* current version of wl_tspec_arg_t struct */ +#define TSPEC_ARG_LENGTH 55 /* argment length from tsinfo to medium_time */ + +/* define for flag */ +#define TSPEC_PENDING 0 /* TSPEC pending */ +#define TSPEC_ACCEPTED 1 /* TSPEC accepted */ +#define TSPEC_REJECTED 2 /* TSPEC rejected */ +#define TSPEC_UNKNOWN 3 /* TSPEC unknown */ +#define TSPEC_STATUS_MASK 7 /* TSPEC status mask */ + + +/* Software feature flag defines used by wlfeatureflag */ +#define WL_SWFL_ABBFL 0x0001 /* Allow Afterburner on systems w/o hardware BFL */ +#define WL_SWFL_ABENCORE 0x0002 /* Allow AB on non-4318E chips */ + +#define WL_LIFETIME_MAX 0xFFFF /* Max value in ms */ + +/* Packet lifetime configuration per ac */ +typedef struct wl_lifetime { + uint32 ac; /* access class */ + uint32 lifetime; /* Packet lifetime value in ms */ +} wl_lifetime_t; #endif /* _wlioctl_h_ */ diff --git a/package/wlcompat/src/include/wlutils.h b/package/wlcompat/src/include/wlutils.h index 07e2536ca..898fb29fb 100644 --- a/package/wlcompat/src/include/wlutils.h +++ b/package/wlcompat/src/include/wlutils.h @@ -1,7 +1,7 @@ /* * Broadcom wireless network adapter utility functions * - * Copyright 2004, Broadcom Corporation + * Copyright 2006, Broadcom Corporation * All Rights Reserved. * * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY @@ -29,31 +29,74 @@ extern int wl_ioctl(char *name, int cmd, void *buf, int len); /* - * Get the MAC (hardware) address of the specified interface. - * @param name interface name - * @param hwaddr 6-byte buffer for receiving address - * @return >= 0 if successful or < 0 otherwise - */ -extern int wl_hwaddr(char *name, unsigned char *hwaddr); - -/* * Probe the specified interface. * @param name interface name * @return >= 0 if a Broadcom wireless device or < 0 otherwise */ extern int wl_probe(char *name); +extern int wl_iovar_set(char *ifname, char *iovar, void *param, int paramlen); +extern int wl_iovar_get(char *ifname, char *iovar, void *bufptr, int buflen); /* * Set/Get named variable. - * @param name interface name - * @param var variable name - * @param val variable value/buffer - * @param len variable value/buffer length + * @param ifname interface name + * @param iovar variable name + * @param param input param value/buffer + * @param paramlen input param value/buffer length + * @param bufptr io buffer + * @param buflen io buffer length + * @param val val or val pointer for int routines + * @return success == 0, failure != 0 + */ +/* + * set named driver variable to int value + * calling example: wl_iovar_setint(ifname, "arate", rate) +*/ +static inline int +wl_iovar_setint(char *ifname, char *iovar, int val) +{ + return wl_iovar_set(ifname, iovar, &val, sizeof(val)); +} + +/* + * get named driver variable to int value and return error indication + * calling example: wl_iovar_getint(ifname, "arate", &rate) + */ +static inline int +wl_iovar_getint(char *ifname, char *iovar, int *val) +{ + return wl_iovar_get(ifname, iovar, val, sizeof(int)); +} + +/* + * Set/Get named variable indexed by BSS Configuration + * @param ifname interface name + * @param iovar variable name + * @param bssidx bsscfg index + * @param param input param value/buffer + * @param paramlen input param value/buffer length + * @param bufptr io buffer + * @param buflen io buffer length + * @param val val or val pointer for int routines * @return success == 0, failure != 0 */ -extern int wl_set_val(char *name, char *var, void *val, int len); -extern int wl_get_val(char *name, char *var, void *val, int len); -extern int wl_set_int(char *name, char *var, int val); -extern int wl_get_int(char *name, char *var, int *val); +extern int wl_bssiovar_get(char *ifname, char *iovar, int bssidx, void *outbuf, int len); +extern int wl_bssiovar_set(char *ifname, char *iovar, int bssidx, void *param, int paramlen); +/* + * set named & bss indexed driver variable to int value + */ +static inline int +wl_bssiovar_setint(char *ifname, char *iovar, int bssidx, int val) +{ + return wl_bssiovar_set(ifname, iovar, bssidx, &val, sizeof(int)); +} + +static inline int +wl_bssiovar_getint(char *ifname, char *iovar, int bssidx, int *val) +{ + return wl_bssiovar_get(ifname, iovar, bssidx, val, sizeof(int)); +} + +extern int wl_bssiovar_setint(char *ifname, char *iovar, int bssidx, int val); #endif /* _wlutils_h_ */ diff --git a/package/wlcompat/src/wlcompat.c b/package/wlcompat/src/wlcompat.c index 625da6a3a..d849be855 100644 --- a/package/wlcompat/src/wlcompat.c +++ b/package/wlcompat/src/wlcompat.c @@ -1,8 +1,8 @@ /* * wlcompat.c * - * Copyright (C) 2005 Mike Baker, - * Felix Fietkau <openwrt@nbd.name> + * Copyright (C) 2005 Mike Baker + * Copyright (C) 2005-2007 Felix Fietkau <nbd@openwrt.org> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -27,18 +27,23 @@ #include <linux/moduleparam.h> #include <linux/init.h> #include <linux/if_arp.h> -#include <asm/uaccess.h> #include <linux/wireless.h> #include <linux/timer.h> - +#include <linux/delay.h> #include <net/iw_handler.h> +#include <asm/uaccess.h> + +#include <typedefs.h> +#include <bcmutils.h> #include <wlioctl.h> -#include <proto/802.11.h> static struct net_device *dev; -static unsigned short bss_force; static struct iw_statistics wstats; +#ifndef DEBUG static int random = 1; +#endif +static int last_mode = -1; +static int scan_cur = 0; char buf[WLC_IOCTL_MAXLEN]; /* The frequency of each channel in MHz */ @@ -48,7 +53,8 @@ const long channel_frequency[] = { }; #define NUM_CHANNELS ( sizeof(channel_frequency) / sizeof(channel_frequency[0]) ) -#define RNG_POLL_FREQ 2 +#define SCAN_RETRY_MAX 5 +#define RNG_POLL_FREQ 1 typedef struct internal_wsec_key { uint8 index; // 0x00 @@ -61,10 +67,6 @@ typedef struct internal_wsec_key { } wkey; -static int wlcompat_private_ioctl(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, - char *extra); #ifdef DEBUG void print_buffer(int len, unsigned char *buf); #endif @@ -86,45 +88,187 @@ static int wl_ioctl(struct net_device *dev, int cmd, void *buf, int len) return ret; } -static int wl_set_val(struct net_device *dev, char *var, void *val, int len) +static int +wl_iovar_getbuf(struct net_device *dev, char *iovar, void *param, int paramlen, void *bufptr, int buflen) { - char buf[128]; - int buf_len; - int ret; + int err; + uint namelen; + uint iolen; + + namelen = strlen(iovar) + 1; /* length of iovar name plus null */ + iolen = namelen + paramlen; /* check for overflow */ - if ((buf_len = strlen(var)) + 1 + len > sizeof(buf)) - return -1; - - strcpy(buf, var); - buf_len += 1; + if (iolen > buflen) + return (BCME_BUFTOOSHORT); - /* append int value onto the end of the name string */ - memcpy(&(buf[buf_len]), val, len); - buf_len += len; + memcpy(bufptr, iovar, namelen); /* copy iovar name including null */ + memcpy((int8*)bufptr + namelen, param, paramlen); - ret = wl_ioctl(dev, WLC_SET_VAR, buf, buf_len); - return ret; + err = wl_ioctl(dev, WLC_GET_VAR, bufptr, buflen); + + return (err); +} + +static int +wl_iovar_setbuf(struct net_device *dev, char *iovar, void *param, int paramlen, void *bufptr, int buflen) +{ + uint namelen; + uint iolen; + + namelen = strlen(iovar) + 1; /* length of iovar name plus null */ + iolen = namelen + paramlen; + + /* check for overflow */ + if (iolen > buflen) + return (BCME_BUFTOOSHORT); + + memcpy(bufptr, iovar, namelen); /* copy iovar name including null */ + memcpy((int8*)bufptr + namelen, param, paramlen); + + return wl_ioctl(dev, WLC_SET_VAR, bufptr, iolen); +} + +static int +wl_iovar_set(struct net_device *dev, char *iovar, void *param, int paramlen) +{ + char smbuf[WLC_IOCTL_SMLEN]; + + return wl_iovar_setbuf(dev, iovar, param, paramlen, smbuf, sizeof(smbuf)); } -static int wl_get_val(struct net_device *dev, char *var, void *val, int len) +static int +wl_iovar_get(struct net_device *dev, char *iovar, void *bufptr, int buflen) { - char buf[128]; - int buf_len; + char smbuf[WLC_IOCTL_SMLEN]; int ret; + /* use the return buffer if it is bigger than what we have on the stack */ + if (buflen > sizeof(smbuf)) { + ret = wl_iovar_getbuf(dev, iovar, NULL, 0, bufptr, buflen); + } else { + ret = wl_iovar_getbuf(dev, iovar, NULL, 0, smbuf, sizeof(smbuf)); + if (ret == 0) + memcpy(bufptr, smbuf, buflen); + } + + return ret; +} + +#ifdef notyet +/* + * format a bsscfg indexed iovar buffer + */ +static int +wl_bssiovar_mkbuf(char *iovar, int bssidx, void *param, int paramlen, void *bufptr, int buflen, + int *plen) +{ + char *prefix = "bsscfg:"; + int8* p; + uint prefixlen; + uint namelen; + uint iolen; + + prefixlen = strlen(prefix); /* length of bsscfg prefix */ + namelen = strlen(iovar) + 1; /* length of iovar name + null */ + iolen = prefixlen + namelen + sizeof(int) + paramlen; + /* check for overflow */ - if ((buf_len = strlen(var)) + 1 > sizeof(buf) || len > sizeof(buf)) - return -1; - - strcpy(buf, var); - if (ret = wl_ioctl(dev, WLC_GET_VAR, buf, buf_len + len)) - return ret; + if (buflen < 0 || iolen > (uint)buflen) { + *plen = 0; + return BCME_BUFTOOSHORT; + } + + p = (int8*)bufptr; + + /* copy prefix, no null */ + memcpy(p, prefix, prefixlen); + p += prefixlen; + + /* copy iovar name including null */ + memcpy(p, iovar, namelen); + p += namelen; + + /* bss config index as first param */ + memcpy(p, &bssidx, sizeof(int32)); + p += sizeof(int32); + + /* parameter buffer follows */ + if (paramlen) + memcpy(p, param, paramlen); - memcpy(val, buf, len); + *plen = iolen; return 0; } +/* + * set named & bss indexed driver variable to buffer value + */ +static int +wl_bssiovar_setbuf(struct net_device *dev, char *iovar, int bssidx, void *param, int paramlen, void *bufptr, + int buflen) +{ + int err; + int iolen; + + err = wl_bssiovar_mkbuf(iovar, bssidx, param, paramlen, bufptr, buflen, &iolen); + if (err) + return err; + + return wl_ioctl(dev, WLC_SET_VAR, bufptr, iolen); +} + +/* + * get named & bss indexed driver variable buffer value + */ +static int +wl_bssiovar_getbuf(struct net_device *dev, char *iovar, int bssidx, void *param, int paramlen, void *bufptr, + int buflen) +{ + int err; + int iolen; + + err = wl_bssiovar_mkbuf(iovar, bssidx, param, paramlen, bufptr, buflen, &iolen); + if (err) + return err; + + return wl_ioctl(dev, WLC_GET_VAR, bufptr, buflen); +} + +/* + * set named & bss indexed driver variable to buffer value + */ +static int +wl_bssiovar_set(struct net_device *dev, char *iovar, int bssidx, void *param, int paramlen) +{ + char smbuf[WLC_IOCTL_SMLEN]; + + return wl_bssiovar_setbuf(dev, iovar, bssidx, param, paramlen, smbuf, sizeof(smbuf)); +} + +/* + * get named & bss indexed driver variable buffer value + */ +static int +wl_bssiovar_get(struct net_device *dev, char *iovar, int bssidx, void *outbuf, int len) +{ + char smbuf[WLC_IOCTL_SMLEN]; + int err; + + /* use the return buffer if it is bigger than what we have on the stack */ + if (len > (int)sizeof(smbuf)) { + err = wl_bssiovar_getbuf(dev, iovar, bssidx, NULL, 0, outbuf, len); + } else { + memset(smbuf, 0, sizeof(smbuf)); + err = wl_bssiovar_getbuf(dev, iovar, bssidx, NULL, 0, smbuf, sizeof(smbuf)); + if (err == 0) + memcpy(outbuf, smbuf, len); + } + + return err; +} +#endif + int get_primary_key(struct net_device *dev) { int key, val; @@ -145,7 +289,7 @@ static int wlcompat_ioctl_getiwrange(struct net_device *dev, struct iw_range *range; range = (struct iw_range *) extra; - bzero(extra, sizeof(struct iw_range)); + memset(extra, 0, sizeof(struct iw_range)); range->we_version_compiled = WIRELESS_EXT; range->we_version_source = WIRELESS_EXT; @@ -180,12 +324,12 @@ static int wlcompat_ioctl_getiwrange(struct net_device *dev, range->max_qual.noise = 0; range->min_rts = 0; - if (wl_ioctl(dev, WLC_GET_RTS, &range->max_rts, sizeof(int)) < 0) + if (wl_iovar_get(dev, "rtsthresh", &range->max_rts, sizeof(int)) < 0) range->max_rts = 2347; range->min_frag = 256; - if (wl_ioctl(dev, WLC_GET_FRAG, &range->max_frag, sizeof(int)) < 0) + if (wl_iovar_get(dev, "fragthresh", &range->max_frag, sizeof(int)) < 0) range->max_frag = 2346; range->txpower_capa = IW_TXPOW_DBM; @@ -199,7 +343,7 @@ static int wlcompat_set_scan(struct net_device *dev, union iwreq_data *wrqu, char *extra) { - int ap = 0, oldap = 0; + int ap = 0; wl_scan_params_t params; memset(¶ms, 0, sizeof(params)); @@ -214,23 +358,39 @@ static int wlcompat_set_scan(struct net_device *dev, params.home_time = -1; /* can only scan in STA mode */ - wl_ioctl(dev, WLC_GET_AP, &oldap, sizeof(oldap)); - if (oldap > 0) + wl_ioctl(dev, WLC_GET_AP, &last_mode, sizeof(last_mode)); + if (last_mode > 0) { + /* switch to ap mode, scan result query will switch back */ wl_ioctl(dev, WLC_SET_AP, &ap, sizeof(ap)); - - if (wl_ioctl(dev, WLC_SCAN, ¶ms, 64) < 0) + + /* wait 250 msec after mode change */ + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(msecs_to_jiffies(250)); + } + + scan_cur = SCAN_RETRY_MAX; + while (scan_cur-- && (wl_ioctl(dev, WLC_SCAN, ¶ms, 64) < 0)) { + /* sometimes the driver takes a few tries... */ + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(msecs_to_jiffies(250)); + } + + if (!scan_cur) return -EINVAL; - if (oldap > 0) - wl_ioctl(dev, WLC_SET_AP, &oldap, sizeof(oldap)); + scan_cur = 0; + /* wait at least 2 seconds for results */ + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(msecs_to_jiffies(2000)); + return 0; } struct iw_statistics *wlcompat_get_wireless_stats(struct net_device *dev) { - wl_bss_info_t *bss_info = (wl_bss_info_t *) buf; + struct wl_bss_info *bss_info = (struct wl_bss_info *) buf; get_pktcnt_t pkt; unsigned int rssi, noise, ap; @@ -283,15 +443,18 @@ static int wlcompat_get_scan(struct net_device *dev, int i, j; int rssi, noise; + memset(buf, 0, WLC_IOCTL_MAXLEN); results->buflen = WLC_IOCTL_MAXLEN - sizeof(wl_scan_results_t); if (wl_ioctl(dev, WLC_SCAN_RESULTS, buf, WLC_IOCTL_MAXLEN) < 0) return -EAGAIN; + if ((results->count <= 0) && (scan_cur++ < SCAN_RETRY_MAX)) + return -EAGAIN; + bss_info = &(results->bss_info[0]); info_ptr = (char *) bss_info; for (i = 0; i < results->count; i++) { - /* send the cell address (must be sent first) */ iwe.cmd = SIOCGIWAP; iwe.u.ap_addr.sa_family = ARPHRD_ETHER; @@ -319,7 +482,7 @@ static int wlcompat_get_scan(struct net_device *dev, /* send frequency/channel info */ iwe.cmd = SIOCGIWFREQ; iwe.u.freq.e = 0; - iwe.u.freq.m = bss_info->channel; + iwe.u.freq.m = bss_info->chanspec; current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_FREQ_LEN); /* add quality statistics */ @@ -362,6 +525,10 @@ static int wlcompat_get_scan(struct net_device *dev, wrqu->data.length = (current_ev - extra); wrqu->data.flags = 0; + if (last_mode > 0) + /* switch back to ap mode */ + wl_ioctl(dev, WLC_SET_AP, &last_mode, sizeof(last_mode)); + return 0; } @@ -430,20 +597,9 @@ static int wlcompat_ioctl(struct net_device *dev, if (wl_ioctl(dev, WLC_GET_INFRA, &infra, sizeof(infra)) < 0) return -EINVAL; - if (!infra) { + if (!infra) wl_ioctl(dev, WLC_SET_BSSID, wrqu->ap_addr.sa_data, 6); - reg.size = 4; - reg.byteoff = 0x184; - reg.val = bss_force << 16 | bss_force; - wl_ioctl(dev, WLC_W_REG, ®, sizeof(reg)); - - reg.byteoff = 0x180; - wl_ioctl(dev, WLC_R_REG, ®, sizeof(reg)); - reg.val = bss_force << 16; - wl_ioctl(dev, WLC_W_REG, ®, sizeof(reg)); - } - if (wl_ioctl(dev, ((ap || !infra) ? WLC_SET_BSSID : WLC_REASSOC), wrqu->ap_addr.sa_data, 6) < 0) return -EINVAL; @@ -451,20 +607,6 @@ static int wlcompat_ioctl(struct net_device *dev, } case SIOCGIWAP: { -#ifdef DEBUG - rw_reg_t reg; - memset(®, 0, sizeof(reg)); - - reg.size = 4; - reg.byteoff = 0x184; - wl_ioctl(dev, WLC_R_REG, ®, sizeof(reg)); - printk("bss time = 0x%08x", reg.val); - - reg.byteoff = 0x180; - wl_ioctl(dev, WLC_R_REG, ®, sizeof(reg)); - printk("%08x\n", reg.val); -#endif - wrqu->ap_addr.sa_family = ARPHRD_ETHER; if (wl_ioctl(dev,WLC_GET_BSSID,wrqu->ap_addr.sa_data,6) < 0) return -EINVAL; @@ -487,8 +629,8 @@ static int wlcompat_ioctl(struct net_device *dev, wlc_ssid_t ssid; memset(&ssid, 0, sizeof(ssid)); ssid.SSID_len = strlen(extra); - if (ssid.SSID_len > WLC_ESSID_MAX_SIZE) - ssid.SSID_len = WLC_ESSID_MAX_SIZE; + if (ssid.SSID_len > 32) + ssid.SSID_len = 32; memcpy(ssid.SSID, extra, ssid.SSID_len); if (wl_ioctl(dev, WLC_SET_SSID, &ssid, sizeof(ssid)) < 0) return -EINVAL; @@ -496,25 +638,25 @@ static int wlcompat_ioctl(struct net_device *dev, } case SIOCGIWRTS: { - if (wl_ioctl(dev,WLC_GET_RTS,&(wrqu->rts.value),sizeof(int)) < 0) + if (wl_iovar_get(dev, "rtsthresh", &(wrqu->rts.value), sizeof(int)) < 0) return -EINVAL; break; } case SIOCSIWRTS: { - if (wl_ioctl(dev,WLC_SET_RTS,&(wrqu->rts.value),sizeof(int)) < 0) + if (wl_iovar_set(dev, "rtsthresh", &(wrqu->rts.value), sizeof(int)) < 0) return -EINVAL; break; } case SIOCGIWFRAG: { - if (wl_ioctl(dev,WLC_GET_FRAG,&(wrqu->frag.value),sizeof(int)) < 0) + if (wl_iovar_get(dev, "fragthresh", &(wrqu->frag.value), sizeof(int)) < 0) return -EINVAL; break; } case SIOCSIWFRAG: { - if (wl_ioctl(dev,WLC_SET_FRAG,&(wrqu->frag.value),sizeof(int)) < 0) + if (wl_iovar_set(dev, "fragthresh", &(wrqu->frag.value), sizeof(int)) < 0) return -EINVAL; break; } @@ -524,7 +666,7 @@ static int wlcompat_ioctl(struct net_device *dev, wl_ioctl(dev, WLC_GET_RADIO, &radio, sizeof(int)); - if (wl_get_val(dev, "qtxpower", &(wrqu->txpower.value), sizeof(int)) < 0) + if (wl_iovar_get(dev, "qtxpower", &(wrqu->txpower.value), sizeof(int)) < 0) return -EINVAL; override = (wrqu->txpower.value & WL_TXPWR_OVERRIDE) == WL_TXPWR_OVERRIDE; @@ -548,7 +690,7 @@ static int wlcompat_ioctl(struct net_device *dev, if (!wrqu->txpower.disabled && (wrqu->txpower.value > 0)) { int value; - if (wl_get_val(dev, "qtxpower", &value, sizeof(int)) < 0) + if (wl_iovar_get(dev, "qtxpower", &value, sizeof(int)) < 0) return -EINVAL; value &= WL_TXPWR_OVERRIDE; @@ -559,7 +701,7 @@ static int wlcompat_ioctl(struct net_device *dev, return -EINVAL; if (wrqu->txpower.value > 0) - if (wl_set_val(dev, "qtxpower", &(wrqu->txpower.value), sizeof(int)) < 0) + if (wl_iovar_set(dev, "qtxpower", &(wrqu->txpower.value), sizeof(int)) < 0) return -EINVAL; } break; @@ -609,34 +751,23 @@ static int wlcompat_ioctl(struct net_device *dev, case SIOCGIWENCODE: { int val; + int key = get_primary_key(dev); + int *info_addr; + wkey *wep_key; - if (wl_ioctl(dev, WLC_GET_WEP, &val, sizeof(val)) < 0) + if (wl_ioctl(dev, WLC_GET_WSEC, &val, sizeof(val)) < 0) return -EINVAL; - - - if (val > 0) { - int key = get_primary_key(dev); - - wrqu->data.flags = IW_ENCODE_ENABLED; - if (key-- > 0) { - int *info_addr; - wkey *wep_key; - - info_addr = (int *) dev->priv; - wep_key = (wkey *) ((*info_addr) + 0x2752 + (key * 0x110)); - - wrqu->data.flags |= key + 1; - wrqu->data.length = wep_key->len; - - memset(extra, 0, 16); - memcpy(extra, wep_key->data, 16); - } else { - wrqu->data.flags |= IW_ENCODE_NOKEY; - } - } else { + if (!(val & WEP_ENABLED)) { wrqu->data.flags = IW_ENCODE_DISABLED; + break; } - + + key = get_primary_key(dev); + wrqu->data.flags = IW_ENCODE_ENABLED; + + /* the driver apparently doesn't allow us to read the wep key */ + wrqu->data.flags |= IW_ENCODE_NOKEY; + break; } case SIOCGIWRANGE: @@ -716,12 +847,8 @@ static int wlcompat_ioctl(struct net_device *dev, break; } default: - { - if (info->cmd >= SIOCIWFIRSTPRIV) - return wlcompat_private_ioctl(dev, info, wrqu, extra); - return -EINVAL; - } + break; } return 0; @@ -775,183 +902,10 @@ static const iw_handler wlcompat_handler[] = { }; -#define WLCOMPAT_SET_MONITOR SIOCIWFIRSTPRIV + 0 -#define WLCOMPAT_GET_MONITOR SIOCIWFIRSTPRIV + 1 -#define WLCOMPAT_SET_TXPWR_LIMIT SIOCIWFIRSTPRIV + 2 -#define WLCOMPAT_GET_TXPWR_LIMIT SIOCIWFIRSTPRIV + 3 -#define WLCOMPAT_SET_ANTDIV SIOCIWFIRSTPRIV + 4 -#define WLCOMPAT_GET_ANTDIV SIOCIWFIRSTPRIV + 5 -#define WLCOMPAT_SET_TXANT SIOCIWFIRSTPRIV + 6 -#define WLCOMPAT_GET_TXANT SIOCIWFIRSTPRIV + 7 -#define WLCOMPAT_SET_BSS_FORCE SIOCIWFIRSTPRIV + 8 -#define WLCOMPAT_GET_BSS_FORCE SIOCIWFIRSTPRIV + 9 - - -static int wlcompat_private_ioctl(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, - char *extra) -{ - int *value = (int *) wrqu->name; - - switch (info->cmd) { - case WLCOMPAT_SET_MONITOR: - { - if (wl_ioctl(dev, WLC_SET_MONITOR, value, sizeof(int)) < 0) - return -EINVAL; - - break; - } - case WLCOMPAT_GET_MONITOR: - { - if (wl_ioctl(dev, WLC_GET_MONITOR, extra, sizeof(int)) < 0) - return -EINVAL; - - break; - } - case WLCOMPAT_SET_TXPWR_LIMIT: - { - int val; - - - if (wl_get_val(dev, "qtxpower", &val, sizeof(int)) < 0) - return -EINVAL; - - if (*extra > 0) - val |= WL_TXPWR_OVERRIDE; - else - val &= ~WL_TXPWR_OVERRIDE; - - if (wl_set_val(dev, "qtxpower", &val, sizeof(int)) < 0) - return -EINVAL; - - break; - } - case WLCOMPAT_GET_TXPWR_LIMIT: - { - if (wl_get_val(dev, "qtxpower", value, sizeof(int)) < 0) - return -EINVAL; - - *value = ((*value & WL_TXPWR_OVERRIDE) == WL_TXPWR_OVERRIDE ? 1 : 0); - - break; - } - case WLCOMPAT_SET_ANTDIV: - { - if (wl_ioctl(dev, WLC_SET_ANTDIV, value, sizeof(int)) < 0) - return -EINVAL; - - break; - } - case WLCOMPAT_GET_ANTDIV: - { - if (wl_ioctl(dev, WLC_GET_ANTDIV, extra, sizeof(int)) < 0) - return -EINVAL; - - break; - } - case WLCOMPAT_SET_TXANT: - { - if (wl_ioctl(dev, WLC_SET_TXANT, value, sizeof(int)) < 0) - return -EINVAL; - - break; - } - case WLCOMPAT_GET_TXANT: - { - if (wl_ioctl(dev, WLC_GET_TXANT, extra, sizeof(int)) < 0) - return -EINVAL; - - break; - } - case WLCOMPAT_SET_BSS_FORCE: - { - bss_force = (unsigned short) *value; - break; - } - case WLCOMPAT_GET_BSS_FORCE: - { - *extra = (int) bss_force; - break; - } - default: - { - return -EINVAL; - } - - } - return 0; -} - -static const struct iw_priv_args wlcompat_private_args[] = -{ - { WLCOMPAT_SET_MONITOR, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, - 0, - "set_monitor" - }, - { WLCOMPAT_GET_MONITOR, - 0, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, - "get_monitor" - }, - { WLCOMPAT_SET_TXPWR_LIMIT, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, - 0, - "set_txpwr_force" - }, - { WLCOMPAT_GET_TXPWR_LIMIT, - 0, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, - "get_txpwr_force" - }, - { WLCOMPAT_SET_ANTDIV, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, - 0, - "set_antdiv" - }, - { WLCOMPAT_GET_ANTDIV, - 0, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, - "get_antdiv" - }, - { WLCOMPAT_SET_TXANT, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, - 0, - "set_txant" - }, - { WLCOMPAT_GET_TXANT, - 0, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, - "get_txant" - }, - { WLCOMPAT_SET_BSS_FORCE, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, - 0, - "set_bss_force" - }, - { WLCOMPAT_GET_BSS_FORCE, - 0, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, - "get_bss_force" - }, -}; - -static const iw_handler wlcompat_private[] = -{ - wlcompat_private_ioctl, - NULL -}; - - static const struct iw_handler_def wlcompat_handler_def = { .standard = (iw_handler *) wlcompat_handler, .num_standard = sizeof(wlcompat_handler)/sizeof(iw_handler), - .private = wlcompat_private, - .num_private = 1, - .private_args = wlcompat_private_args, - .num_private_args = sizeof(wlcompat_private_args) / sizeof(wlcompat_private_args[0]) }; @@ -979,14 +933,7 @@ static int new_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { #ifdef DEBUG printk("dev: %s ioctl: 0x%04x\n",dev->name,cmd); -#endif - - if (cmd >= SIOCIWFIRSTPRIV) { - info.cmd = cmd; - info.flags = 0; - ret = wlcompat_private_ioctl(dev, &info, &(iwr->u), (char *) &(iwr->u)); -#ifdef DEBUG - } else if (cmd==SIOCDEVPRIVATE) { + if (cmd==SIOCDEVPRIVATE) { wl_ioctl_t *ioc = (wl_ioctl_t *)ifr->ifr_data; unsigned char *buf = ioc->buf; printk(" cmd: %d buf: 0x%08x len: %d\n",ioc->cmd,&(ioc->buf),ioc->len); @@ -996,8 +943,9 @@ static int new_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { printk(" recv: ->"); print_buffer(ioc->len, buf); printk(" ret: %d\n", ret); + } else #endif - } else { + { ret = old_ioctl(dev,ifr,cmd); } return ret; @@ -1005,17 +953,22 @@ static int new_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { #ifndef DEBUG static struct timer_list rng_timer; +static spinlock_t rng_lock = SPIN_LOCK_UNLOCKED; static void rng_timer_tick(unsigned long n) { struct net_device *dev = (struct net_device *) n; + unsigned long flags; u16 data[4]; int i, ret; ret = 0; + spin_lock_irqsave(&rng_lock, flags); for (i = 0; i < 3; i++) { - ret |= wl_get_val(dev, "rand", &data[i], sizeof(u16)); + ret |= wl_iovar_get(dev, "rand", &data[i], sizeof(u16)); } + spin_unlock_irqrestore(&rng_lock, flags); + if (!ret) batch_entropy_store(*((u32 *) &data[0]), *((u32 *) &data[2]), (jiffies % 255)); @@ -1027,7 +980,6 @@ static int __init wlcompat_init() { int found = 0, i; char devname[4] = "wl0"; - bss_force = 0; while (!found && (dev = dev_get_by_name(devname))) { if ((dev->wireless_handlers == NULL) && ((wl_ioctl(dev, WLC_GET_MAGIC, &i, sizeof(i)) == 0) && i == WLC_IOCTL_MAGIC)) |