Files
m241Neelima/vxworks-6.9/target/h/drv/wlan/dot11Lib.h
T
2026-07-30 11:19:44 +05:30

2523 lines
94 KiB
C

/* dot11Lib.h - Contains the main definitions for the 802.11 Framework. */
/*
* Copyright (c) 2004-2007 Wind River Systems, Inc.
*
* The right to copy, distribute, modify or otherwise make use
* of this software may be licensed only pursuant to the terms
* of an applicable Wind River license agreement.
*/
/*
Modification History
--------------------
04r,31oct08,mry fix for defect WIND00139450
04q,03sep08,hfc fix for vxBus register read/write macro
04p,27jun08,mry Changing callback notification so that it is not called from
the tNet task context
04o,11jun08,mry Add capability to notify external supp of MIC Failure events
04n,13may08,hfc fix for defect WIND00120394
04m,23apr08,hfc fix issue to load the rsn module
04l,02apr08,mry Adding support in Atheros driver for external supplicant to
specify external EAPOL processing (4wayHS)
04k,27feb08,hfc added entries for vxbus driver
04j,12jun07,mry Changing DOT11_MAX_AID to 2007 to conform with 802.11 spec
(part 7.3.1.8) (WIND00037924)
04i,11dec06,tfo Fix various roaming issues.
04h,15mar06,rb Fix to SPR 118966 - ACL does not work with WPA/RSN
04g,28Feb06,rb Merge of SPR branch
04f,26jan06,rb Fix to SPR 117213 - WPAv2 should alllow AES
04e,16jan06,rb Fix to SPR 116783 - Max AID is larger that largest value
allowed by 802.11 specification
04d,15dec05,rb Added per-station duplicate detection
04c,13dec05,rb Fix to SPR 115265 - Variables reset on AP reset
04b,27zeb06,rb Code inspection changes
04a,17feb06,rb Code cleanup
03z,16feb06,rb Added 802.1Q macro definitions
03y,14feb06,rb Added 802.1Q ethertype
03x,14feb06,rb Added VLAN support
03w,09feb06,rb Implemented WIOCDOT1XINT
03v,11nov05,rb Added mSSID feature
03u,09sep05,rb Added countryCode as boot parameter
03t,25aug05,rb Added 11d info to channel structure
03t,30aug05,rb Removed EIOCSUNICASTKEYNUM and related
03s,19aug05,rb Added Turbo support
03r,19aug05,rb Increased timeout time for Windows stations
03q,04aug04,rb Moved DOT11_CHANNEL_LIST to dot11UsrLib.h
03p,04aug05,rb Increase default passive scan time to be greater than default
beacon interval
03o,03aug05,rb Implemented user authentication callback
03n,28jul05,rb Added hdd->calTime
03m,28jul05,rb Added hdd->calTimer
03l,25jul05,rb Removed pAp->pmCount
03k,20jul05,rb Fix #warning
03j,14jul05,rb Implemented KSL memory pool, moved lastSeq into pDot11
03i,14jul05,rb Move pmState to SME_OBJ to alllow DOT11_MODE_NONE config
03h,10jun05,rb Added RSN passphrase caching and 4way timer
03g,18may05,rb Fix for bug B0367 - TSN does not work on Sta
03f,28apr05,rb Added _BIT definition to dot11UsrLib.h; Moved encryption types
to usrLib
03e,25apr05,rb Moved definitions needed for IOCTLs from dot11Lib.h to
dot11UsrLib.h
03d,22apr05,rb Added authentication callback wrapper
03c,15apr05,rb Corrected 4-way retry time to value specified by standard
03b,14apr05,rb Added support fr Transmit Power Scaling (WIOCSTXPOWERSCALE)
03a,06apr05,rb Fix for SPR 107235: data path does not handle non-ethernet
packets correctly
02z,09mar05,rb Change prototype of pDot11->sme->ksl.show
02y,09mar05,rb Added hdd->hwVersionGet
02x,08mar05,rb Added dtimPacketFlush() to HDD_OBJ
02w,03mar05,rb Security code review changes
02v,01mar05,rb Modified definition of WIOCSDOT1XPORTSTATUS and
WIOCSAUTHCALLBACK
02u,16feb05,rb Renumbered IOCTLs to work with RTP management
02t,11feb05,rb Increased timeout
02s,11feb05,rb Adjusted EAPOL-timeout
02r,04feb05,rb Added B/G compatibility mode
02q,02feb05,rb Resolved vxWorks 6.0 compatability issue (cioTimer.h)
02p,26jan05,rb Implemented SKA
02o,25jan05,rb Made security components optionally buildable
02n,21jan05,rb Added hdd->countryCodeChange() and hdd->macAddrChange()
02m,21jan05,rb Removed some dead IOCTLs
02l,20jan05,rb Added new security stats, MIC ctrmsrs
02k,17jan05,rb Revised DOT11_SCAN_REQ structure
02j,06jan05,rb Added decrypt & MIC error counters, MIC countermeasures
02i,05jan05,rb Fix for SPR 103854 - Need to update reference in TXD to use
MBlks
02h,04jan05,rb Added gtkRecalc member to RSN_OBJ
02g,23dec04,rb Memory footprint reduction
02f,21dec04,rb Added WPA2/802.11i support
02e,01nov04,rb Added security policy parameters
02d,27oct04,rb Added WEP Key Mapping Support
02c,03oct04,rb Changes from dot11SmeApLib.c and dot11SmeIbssLib.c code review
02b,26aug04,rb Fix for SPR 101351 : Supplicant does not work on LE
architectures.
02a,25aug04,rb Wind River Wireless Ethernet Driver 2.0 FCS
*/
#ifndef __INCdot11Libh
#define __INCdot11Libh
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#include <vxWorks.h>
#include <end.h>
#include <muxLib.h>
#include <wdLib.h>
#include <logLib.h>
#include <taskLib.h>
#include <msgQLib.h>
#include "dot11UsrLib.h"
/************************************************************************
* USER MODIFIABLE PARAMETERS
************************************************************************/
/* Memory initialization constants */
#define DOT11_NUMCL 256
#define DOT11_NUMCLBLK DOT11_NUMCL
#define DOT11_NUMMBLK DOT11_NUMCL * 2
/*
* DOT11_FOURWAY_MSG_TIMEOUT - specified the amount of time the RSN libraries
* will wait for a response to an EAPOL-KEY message before assuming the
* message is lost and retrying
*/
#define DOT11_FOURWAY_MSG_TIMEOUT (sysClkRateGet() / 2) /* 500 ms */
/*
* DOT11_FOURWAY_GLOBAL_TIMEOUT - specified the amount of time the RSN libraries
* will wait for the fourway handshake to complete before resetting the
* connection.
*/
#define DOT11_FOURWAY_GLOBAL_TIMEOUT (sysClkRateGet() * 3 / 2) /* 1500 ms */
/*
* DOT11_FOURWAY_8021X_TIMEOUT - specified the amount of time the RSN libraries
* will wait for the 802.1X auth to finish and the fourway handshake to
* commence before resetting the connection.
*/
#define DOT11_FOURWAY_8021X_TIMEOUT (sysClkRateGet() * 20) /* 20 sec */
/*
* DOT11_FOURWAY_TIMEOUT_MAX - Maximum number of times that the RSN libraries
* will resent an EAPOL-KEY message before assuming that there is an
* error and giving up.
*/
#define DOT11_FOURWAY_TIMEOUT_MAX 5
/*
* DOT11_FRAGMENT_TIMEOUT_TICKS - The maximum delay between fragments, in
* ticks of the kernel clock. Since the kernel clock is really
* coarse, pretty much any value is reasonable - fragments should not
* be delayed by much time at all.
*/
#define DOT11_FRAGMENT_TIMEOUT_TICKS 10
/*
* DOT11_KSL_POOL_SIZE - The number of entries in the KSL pool. This represents
* an upper limit on the number of stations or APs that the device can
* keep track of. This number should be increased for a device that
* will be operated in an extremely busy environment
*/
#define DOT11_KSL_POOL_SIZE 64
/*
* DOT11_KSL_CLEANUP_TIME - The time between cleanups of the KSL. Every
* DOT11_KSL_CLEANUP_TIME seconds, the KSL cleanup task runs, to check
* for any stale/inactive KSL entries and return them to the free pool.
*/
#define DOT11_KSL_CLEANUP_TIME (sysClkRateGet() * 60 * 2) /* 2 min */
/*
* DOT11_KSL_MAX_AGE - This is the amount of time a station can be inactive for
* before the KSL considers it to be "inactive". Entries with an
* inactivity time older than this value are eligible for deletion next
* time the KSL cleanup task runs.
*/
#define DOT11_KSL_MAX_AGE (sysClkRateGet() * 60 * 5) /* 5 min */
/*
* DOT11_BSS_MAX - Maximum number of virtual wireless networks. This
* controls the number of virtual networks that the
* AP can use. It it currently set to 4, but may be
* expanded if memory is available.
*/
#define DOT11_BSS_MAX 4
/* These values are used to calculate a running aveage of RSSI on beacon
* packets. This average is used when an LQ_PROBATION event occurs to
* determine if the station should do a scan or not.
*/
#define DOT11_RSSI_PROBATION_SHIFT 3 /* 2^3=8 values will be used */
#define DOT11_RSSI_PROBATION_COUNT (1 << DOT11_RSSI_PROBATION_SHIFT)
/*
* APs that we haven't heard from in this amount of time are not considered
* when choosing the best AP to associate to.
*/
#define DOT11_KSL_LOOKUP_IGNORE_AGE (sysClkRateGet() * 15)
/*
* We don't consider an AP if we attempted association this amount of time ago.
*/
#define DOT11_KSL_LOOKUP_RETRY_AGE (sysClkRateGet() * 3)
#define DOT11_DOT1XAUTHCALLBACK(_pDot11_,_event_,_addr_) \
taskSpawn ("tAthAuthCB", 100 /*Priority*/, 0 /*options */, 4*1024 /* stack size */, \
(FUNCPTR)(_pDot11_)->sme->dot1xAuthCallback, (int)(_pDot11_)->sme->dot1xAuthCallbackParam, \
(int)(_event_), (int)(_addr_), 0, 0, 0, 0, 0, 0, 0)
/************************************************************************
* CONSTANT PARAMETERS - Do not change anything below this point
************************************************************************/
/* Forward declaration of DOT11_FW so the objects below can use it */
typedef struct dot11Framework DOT11_FW;
/* Include the slave header files */
#include "drv/wlan/dot11SmeIbssLib.h"
#include "drv/wlan/dot11SmeEssLib.h"
#include "drv/wlan/dot11SmeApLib.h"
#include "drv/wlan/dot11Bsp.h"
typedef unsigned long long int DOT11_UINT64;
/* This is a really handy macro that we're going to need. We'll define it if
it's not already defined */
#ifndef _BIT
#define _BIT(x) (1<<(x))
#endif
#define DOT11_MAC_ADDR_STR "%02x:%02x:%02x:%02x:%02x:%02x"
#define DOT11_MAC_ADDR(x) (x)[0],(x)[1],(x)[2],(x)[3],(x)[4],(x)[5]
#define DOT11_IS_MCAST(x) (((x)[0] & 0x01) == 0x01)
/* The Universal / Local bit, located in byte zero of the mac address */
#define DOT11_MAC_LOCAL 0x02
/* These macros convert between native byte oder and the oder used by the PCI
bus, Little Endian */
#if (_BYTE_ORDER == _BIG_ENDIAN)
#define DOT11_LE_TO_CPU_16(x) (((x) >> 8) | (((x) & 0xff) << 8))
#define DOT11_CPU_TO_LE_16(x) (((x) >> 8) | (((x) & 0xff) << 8))
#define DOT11_LE_TO_CPU_32(x) LONGSWAP(x)
#define DOT11_CPU_TO_LE_32(x) LONGSWAP(x)
#define DOT11_BCOPY_LE_TO_CPU(src, dst, len) dot11BcopySwap(src,dst,len)
#else
#define DOT11_LE_TO_CPU_16(x) (x)
#define DOT11_CPU_TO_LE_16(x) (x)
#define DOT11_LE_TO_CPU_32(x) (x)
#define DOT11_CPU_TO_LE_32(x) (x)
#define DOT11_BCOPY_LE_TO_CPU(src, dst, len) bcopy(src,dst,len)
#endif
#define DOT11_ADDR_COPY(src,dst ) { \
*((UINT16 *)(dst)) = *((UINT16 *)(src)); \
*((UINT16 *)(dst) + 1) = *((UINT16 *)(src) + 1); \
*((UINT16 *)(dst) + 2) = *((UINT16 *)(src) + 2); }
/*************************************************************************
*Debugging macros that control the debug levels
**************************************************************************/
/* *** undefine this to get rid of all debugging in the driver. This might
be desirable for production builds */
#define DOT11_DEBUG_GLOBAL
#ifdef DOT11_DEBUG_GLOBAL
/* Debug level definitions */
#define DOT11_DEBUG_ALL 0 /* Always log message */
#define DOT11_DEBUG_FATAL 1 /* Non-recoverable error */
#define DOT11_DEBUG_ERROR 2 /* Recoverable error */
#define DOT11_DEBUG_INFO 3 /* Information message */
#define DOT11_DEBUG_FLOOD 4 /* Packet traces, info in a loop */
#define DOT11_DEBUG_NONE 99 /* Do not print any debug info */
/* Debug area definitions */
#define DOT11_AREA_ALL 0 /* Don't use for macro */
#define DOT11_AREA_INIT 1
#define DOT11_AREA_SME 2
#define DOT11_AREA_DPE 3
#define DOT11_AREA_HDD 4
#define DOT11_AREA_INT 5
#define DOT11_AREA_RSN 6
#define DOT11_MAX_DEBUG_AREAS 7
IMPORT INT32 dot11DebugArray[DOT11_MAX_DEBUG_AREAS];
#define DOT11_LOG(level, area, message) \
if ((level) <= dot11DebugArray[(area)]) logMsg message
/* DOT11_LOG_FLUSH is used after passing a string parameter to cause logLib
to execute immediately. This should not be used on the critical path */
#define DOT11_LOG_FLUSH taskDelay(0)
/* DOT11_ASSERT() is no longer supported, but it is necessary to keep it in
for a while for backwards compatability */
#define DOT11_ASSERT(x)
#else /* ! DOT11_DEBUG_GLOBAL */
#define DOT11_LOG(level, area, message)
#define DOT11_LOG_FLUSH
#define DOT11_ASSERT(x)
#endif /* DOT11_DEBUG_GLOBAL */
/* Channel flags */
#define DOT11_RADIO_UNKNOWN -1
/* These modes are not currently implemented */
#define DOT11_RADIO_MAX 0x20
/* The total number of the above modes that we support.
It is used in ar52SuppRateGet() */
#define DOT11_RADIO_SUPP_MODES 3
#define DOT11_CHANNEL_INVALID 0
IMPORT const char * dot11ModeStr[];
IMPORT const char * dot11ModeNames[];
IMPORT char * dot11BcastMAC;
IMPORT char * dot11NullMAC;
IMPORT const char * dot11EncryptNames[];
IMPORT const char * dot114wayStateNames[];
IMPORT const char * dot11SecPolNames[];
IMPORT const char * dot11AuthPolNames[];
IMPORT const char * dot11AuthTypeStr[];
/* Values for hdd.pmState */
#define DOT11_PMMODE_ACTIVE 1
#define DOT11_PMMODE_POWERSAVE 2
#define DOT11_SNAP_HEADER_LEN 8
typedef struct
{
UINT16 snap;
UINT16 control; /* first byte contain actual control field */
UINT16 orgCode;
UINT16 protocol;
} _WRS_PACK_ALIGN(1) DOT11_LLC_HEADER;
#define DOT11_LLC_RFC1024 0x00F8
#define DOT11_LLC_8021H 0x0000
#define DOT11_ETHER_HEADER_LEN 14
#define DOT11_FCS_SIZE 4 /* Size of Frame Checksum field */
#define DOT11_MTU 2304
#define DOT11_MAX_PACKET 2346
#define DOT11_ETHERMTU 1500
#define DOT11_MAXRATE 54
#define DOT11_8021Q_TAG_LEN 4
/* Fix for SPR 101351 - preswap DOT1X_ETHERTYPE, then swap it back for BE
archs */
#define DOT1X_ETHERTYPE DOT11_CPU_TO_LE_16(0x8e88)
#define DOT11_ETHERTYPE_8021Q 0x8100
/* VLAN macros */
#define DOT11_NO_VLAN 0
#define DOT11_VLANID_MAX 4095 /* maximum VLAN as per 802.1Q */
/* Masks out the vlanId from the rest of the 802.1Q tag */
#define DOT11_8021Q_VLAN_MASK 0xfff
/* Callback called due to association*/
#define DOT1X_CALLBACK_ASSOC (1)
/* Callback called due to disassociation*/
#define DOT1X_CALLBACK_DISASSOC (2)
/* Callback called due to Groupwise Mic Error */
#define DOT1X_CALLBACK_MIC_ERR_PAIR (3)
/* Callback called due to Pairwise Mic Error */
#define DOT1X_CALLBACK_MIC_ERR_GROUP (4)
/* Max number of associations to an AP */
#define DOT11_MAX_ASSOC 59
/* These definitions are used with WIOCSDOT1XPORTSTATE */
#define DOT11_DOT1XPORT_UNCONTROLLED 0
#define DOT11_DOT1XPORT_CLOSED 1
#define DOT11_DOT1XPORT_OPEN 2
/* The maximum association ID value MUST be between 1 and 2007
* according to part 7.3.1.8 of 802.11 spec */
#define DOT11_MAX_AID 2007
/* The time that a STA waits for a response on each channel when doing an
active scan */
#define DOT11_SCAN_ACTIVE_DWELL_TIME ((sysClkRateGet() / 50) + 1)
/* The time that a STA listens for beacons on each channel when doing a
passive scan */
#define DOT11_SCAN_PASSIVE_DWELL_TIME (sysClkRateGet() * 2 / 5) /* 400 ms */
/* The beacon response time is the amount of time it takes the beacon to go
from the tranmitter to the beacon receive routine. This time is measured in
802.11 time units. */
#define DOT11_BEACON_RESP_TIME 1
/* The default DTIM time is the default number of beacons between DTIMS */
#define DOT11_DEFAULT_DTIM_PERIOD 2
/* The following definitions control the behaviour of the transmit queue */
#define DOT11_TX_SEM_WAIT 30 /* ticks */
#define DOT11_TX_QUEUE_LIFETIME 90 /* ticks */
/* A magic number used to represent the "ANY" SSID */
#define DOT11_SSID_NONE ((char)-1)
/* The size of an OUI = 3 bytes */
#define DOT11_OUI_SIZE 3
/* A macro to convert between timestamps and times in 802.11 timeunits
(1024 us). This macro assumes the parameter is a DOT11_TIMESTAMP. */
#define DOT11_TSF_TO_TU(tsf) ((tsf.low >> 10) | (tsf.high << 22))
/***************************************************************************/
/* IEEE 802.11 Header Information */
/***************************************************************************/
/* This is the header for a standard packet (no WDS). What follows depends on
the specific type of the packet, as detailed in the frame control header */
typedef struct
{
UINT16 frameCtrl;
UINT16 duration;
UINT8 addr1[DOT11_ADDR_LEN];
UINT8 addr2[DOT11_ADDR_LEN];
UINT8 addr3[DOT11_ADDR_LEN];
UINT16 seqCtrl;
} _WRS_PACK_ALIGN(1) DOT11_HEADER;
/* Fields in the Frame Control Header */
#define DOT11_FCTL_VERSION_MASK 0x0003
#define DOT11_FCTL_VERSION_SHIFT _BIT(0)
#define DOT11_FCTL_TYPE_MASK 0x000C
#define DOT11_FCTL_TYPE_SHIFT _BIT(2)
#define DOT11_FCTL_SUBTYPE_MASK 0x00F0
#define DOT11_FCTL_SUBTYPE_SHIFT _BIT(4)
#define DOT11_FCTL_TO_DS _BIT(8)
#define DOT11_FCTL_FROM_DS _BIT(9)
#define DOT11_FCTL_MORE_FRAG _BIT(10)
#define DOT11_FCTL_RETRY _BIT(11)
#define DOT11_FCTL_PM _BIT(12)
#define DOT11_FCTL_MORE_DATA _BIT(13)
#define DOT11_FCTL_WEP _BIT(14)
#define DOT11_FCTL_ORDER _BIT(15)
/* Frame types */
#define DOT11_FTYPE_DATA 0x8
#define DOT11_FTYPE_MGMT 0x0
#define DOT11_FTYPE_CTRL 0x4
/* Frame subtypes */
#define DOT11_STYPE_ASSOC_REQ 0x00
#define DOT11_STYPE_ASSOC_RESP 0x10
#define DOT11_STYPE_REASSOC_REQ 0x20
#define DOT11_STYPE_REASSOC_RESP 0x30
#define DOT11_STYPE_PROBE_REQ 0x40
#define DOT11_STYPE_PROBE_RESP 0x50
#define DOT11_STYPE_BEACON 0x80
#define DOT11_STYPE_ATIM 0x90
#define DOT11_STYPE_DISASSOC 0xa0
#define DOT11_STYPE_AUTH 0xb0
#define DOT11_STYPE_DEAUTH 0xc0
#define DOT11_STYPE_PS_POLL 0xa0
#define DOT11_STYPE_RTS 0xb0
#define DOT11_STYPE_CTS 0xc0
#define DOT11_STYPE_ACK 0xd0
#define DOT11_STYPE_DATA 0x00
#define DOT11_STYPE_DATA_NULL 0x40
/* The DOT11_FTYPE macro masks off the frame type and subtype portions of the
frame control header, which is passed in */
#define DOT11_FTYPE(frameCtrl) ((frameCtrl) & (DOT11_FCTL_TYPE_MASK | \
DOT11_FCTL_SUBTYPE_MASK))
/* Merged subtypes and types used with DOT11_FTYPE macro */
#define DOT11_TYPE_ASSOC_REQ 0x00
#define DOT11_TYPE_ASSOC_RESP 0x10
#define DOT11_TYPE_REASSOC_REQ 0x20
#define DOT11_TYPE_REASSOC_RESP 0x30
#define DOT11_TYPE_PROBE_REQ 0x40
#define DOT11_TYPE_PROBE_RESP 0x50
#define DOT11_TYPE_BEACON 0x80
#define DOT11_TYPE_ATIM 0x90
#define DOT11_TYPE_DISASSOC 0xa0
#define DOT11_TYPE_AUTH 0xb0
#define DOT11_TYPE_DEAUTH 0xc0
#define DOT11_TYPE_PS_POLL 0xa4
#define DOT11_TYPE_RTS 0xb4
#define DOT11_TYPE_CTS 0xc4
#define DOT11_TYPE_ACK 0xd4
#define DOT11_TYPE_DATA 0x08
#define DOT11_TYPE_DATA_NULL 0x48
/* The RX MAP is passed to the HDD as an array of 64 function pointers. */
#define DOT11_RX_MAP_NUM 64
/* This is a macro that gives an RX MAP index given the frame control header*/
#define DOT11_FCTL_TO_RXMAP_INDEX(x) (((x) & 0xfc) >> 2)
#define DOT11_RXMAP_ASSOC_REQ DOT11_FCTL_TO_RXMAP_INDEX(0x00)
#define DOT11_RXMAP_ASSOC_RESP DOT11_FCTL_TO_RXMAP_INDEX(0x10)
#define DOT11_RXMAP_REASSOC_REQ DOT11_FCTL_TO_RXMAP_INDEX(0x20)
#define DOT11_RXMAP_REASSOC_RESP DOT11_FCTL_TO_RXMAP_INDEX(0x30)
#define DOT11_RXMAP_PROBE_REQ DOT11_FCTL_TO_RXMAP_INDEX(0x40)
#define DOT11_RXMAP_PROBE_RESP DOT11_FCTL_TO_RXMAP_INDEX(0x50)
#define DOT11_RXMAP_BEACON DOT11_FCTL_TO_RXMAP_INDEX(0x80)
#define DOT11_RXMAP_ATIM DOT11_FCTL_TO_RXMAP_INDEX(0x90)
#define DOT11_RXMAP_DISASSOC DOT11_FCTL_TO_RXMAP_INDEX(0xa0)
#define DOT11_RXMAP_AUTH DOT11_FCTL_TO_RXMAP_INDEX(0xb0)
#define DOT11_RXMAP_DEAUTH DOT11_FCTL_TO_RXMAP_INDEX(0xc0)
#define DOT11_RXMAP_PSPOLL DOT11_FCTL_TO_RXMAP_INDEX(0xa4)
#define DOT11_RXMAP_RTS DOT11_FCTL_TO_RXMAP_INDEX(0xb4)
#define DOT11_RXMAP_CTS DOT11_FCTL_TO_RXMAP_INDEX(0xc4)
#define DOT11_RXMAP_ACK DOT11_FCTL_TO_RXMAP_INDEX(0xd4)
#define DOT11_RXMAP_CFEND DOT11_FCTL_TO_RXMAP_INDEX(0xe4)
#define DOT11_RXMAP_CFENDACK DOT11_FCTL_TO_RXMAP_INDEX(0xf4)
#define DOT11_RXMAP_DATA DOT11_FCTL_TO_RXMAP_INDEX(0x08)
#define DOT11_RXMAP_DATA_CFACK DOT11_FCTL_TO_RXMAP_INDEX(0x18)
#define DOT11_RXMAP_DATA_CFPOLL DOT11_FCTL_TO_RXMAP_INDEX(0x28)
#define DOT11_RXMAP_DATA_CFACKPOLL DOT11_FCTL_TO_RXMAP_INDEX(0x38)
#define DOT11_RXMAP_DATA_NULL DOT11_FCTL_TO_RXMAP_INDEX(0x48)
#define DOT11_RXMAP_CF_ACK DOT11_FCTL_TO_RXMAP_INDEX(0x58)
#define DOT11_RXMAP_CF_POLL DOT11_FCTL_TO_RXMAP_INDEX(0x68)
#define DOT11_RXMAP_CF_ACK_POLL DOT11_FCTL_TO_RXMAP_INDEX(0x78)
/* The mask to get fragment number from the seqctl field */
#define DOT11_SEQCTL_FRAGNUM 0x000f
#define DOT11_SEQCTL_SEQ 0xfff0
#define DOT11_WEP_IV_SIZE 4
#define DOT11_WEP_EXT_IV_SIZE 4
#define DOT11_EXT_IV _BIT(5)
#define DOT11_WEP_ICV_SIZE 4
#define DOT11_MIC_LEN 8
typedef struct
{
UINT32 low;
UINT32 high;
} DOT11_TIMESTAMP;
typedef UINT16 DOT11_FCTL;
typedef UINT16 DOT11_DURATION;
typedef UINT16 DOT11_BEACON_RATE;
typedef UINT16 DOT11_LISTEN_INT;
typedef UINT16 DOT11_STATUS;
typedef UINT16 DOT11_AID;
/* Mask to get the AID out of the AID field - bits 14 and 15 are always set */
#define DOT11_AID_MASK 0x3fff
#define DOT11_AID_MASK_POS 0xc000
/* These are definitions for the element IDs found in Information Element
fields in Management Frames as per 7.3.2 of IEEE 802.11(2003) */
#define DOT11_ELEMID_SSID 0
#define DOT11_ELEMID_SUPP_RATES 1
#define DOT11_ELEMID_FH_PARAM 2
#define DOT11_ELEMID_DS_PARAM 3
#define DOT11_ELEMID_CF_PARAM 4
#define DOT11_ELEMID_TIM 5
#define DOT11_ELEMID_IBSS 6
#define DOT11_ELEMID_COUNTRY 7
#define DOT11_ELEMID_HOP_PARAM 8
#define DOT11_ELEMID_HOP_TABLE 9
#define DOT11_ELEMID_REQUEST 10
#define DOT11_ELEMID_CHALLENGE 16
#define DOT11_ELEMID_CHALLENGE_EXT 17
#define DOT11_ELEMID_ERP 42
#define DOT11_ELEMID_RSN 48
#define DOT11_ELEMID_EXT_RATES 50
#define DOT11_ELEMID_WPA 221
#define DOT11_ELEMID_KDE 221 /* Yes - the same as WPA */
/* These are the possible STATUS codes that can be returned in an Auth
or Assoc Rsp frame */
#define DOT11_STATUS_OK 0
#define DOT11_STATUS_FAIL 1
#define DOT11_STATUS_CAP_UNSUPPORT 10
#define DOT11_STATUS_NO_ASSOC 11
#define DOT11_STATUS_ASSOC_DENIED 12
#define DOT11_STATUS_AUTH_UNSUPPORT 13
#define DOT11_STATUS_BAD_SEQ 14
#define DOT11_STATUS_CHAL_FAIL 15
#define DOT11_STATUS_TIMEOUT 16
#define DOT11_STATUS_NO_MORE_ASSOC 17
#define DOT11_STATUS_RATE_UNSUPPORT 18
#define DOT11_STATUS_INVALID_IE 40
#define DOT11_STATUS_POLICY_REJECT 46
/* These are the possible reason codes that can be used in a deauth / disassoc*/
#define DOT11_REASON_UNSPECIFIED 1
#define DOT11_REASON_NO_LONGER_VALID 2
#define DOT11_REASON_DEAUTH_LEAVING 3
#define DOT11_REASON_INACTIVITY 4
#define DOT11_REASON_AP_FULL 5
#define DOT11_REASON_NOT_AUTH 6
#define DOT11_REASON_NOT_ASSOC 7
#define DOT11_REASON_DISASSOC_LEAVING 8
#define DOT11_REASON_ASSOC_NOT_AUTH 9
#define DOT11_REASON_MIC_FAILURE 14
#define DOT11_REASON_FOURWAY_TIMEOUT 15
#define DOT11_AUTH_CHAL_MAX 253
#define DOT11_AUTH_CHAL_SIZE 128
#define DOT11_IE_HEADER_SIZE 2 /* size of the length and elementId */
#define DOT11_IE_MAX_SIZE 255
/**************************************************************************
* DOT11_IE_GENERIC - A structure holding an information element of
* indeterminate type
***************************************************************************/
typedef struct
{
UINT8 elementId;
UINT8 length;
UINT8 data[DOT11_IE_MAX_SIZE]; /* Arbitary amount of data - use ptr once typed */
} _WRS_PACK_ALIGN(1) DOT11_IE_GENERIC;
/**************************************************************************
* DOT11_IE_SSID - A structure holding the SSID Information Element. Note
* that the ssid field may be up to 32 bytes long.
***************************************************************************/
typedef struct
{
UINT8 elementId;
UINT8 length;
char ssid[DOT11_SSID_LEN];
} _WRS_PACK_ALIGN(1) DOT11_IE_SSID;
/**************************************************************************
* DOT11_IE_CFP - PCF information element
***************************************************************************/
typedef struct
{
UINT8 elementId;
UINT8 length; /* Should always be 6 */
UINT8 cfpCount;
UINT8 cfpPeriod;
UINT16 cfpMaxDuration; /* Maximum duration of CFP */
UINT16 cfpRemDuration; /* Duration left in current CFP */
} _WRS_PACK_ALIGN(1) DOT11_IE_CFP;
/**************************************************************************
* DOT11_IE_SUPP_RATES - The Supported Rates Information Element
***************************************************************************/
#define DOT11_IE_SUPP_RATES_MAX 8
#define DOT11_RATE_MAX 8
typedef struct
{
UINT8 elementId;
UINT8 length;
UINT8 rates[DOT11_IE_SUPP_RATES_MAX];
} _WRS_PACK_ALIGN(1) DOT11_IE_SUPP_RATES;
/**************************************************************************
* DOT11_IE_CHAL_TEXT - Challenge text for shared key authentication
***************************************************************************/
typedef struct
{
UINT8 elementId;
UINT8 length;
char chalText[DOT11_AUTH_CHAL_MAX];
} _WRS_PACK_ALIGN(1) DOT11_IE_CHAL_TEXT;
/**************************************************************************
* DOT11_IE_EXT_RATES - The Extended Rates Information Element
***************************************************************************/
#define DOT11_IE_EXT_RATES_MAX 253
typedef struct
{
UINT8 elementId;
UINT8 length;
UINT8 rates[DOT11_IE_EXT_RATES_MAX];
} _WRS_PACK_ALIGN(1) DOT11_IE_EXT_RATES;
/**************************************************************************
* DOT11_IE_TIM - Traffic Indication Message IE
***************************************************************************/
#define DOT11_MAX_PVB 251 /* Maximum size of Partial Virtual Bm*/
#define DOT11_TIM_TI 0x1 /* Traffic ind. bit in bmControl */
#define DOT11_TIM_MIN_LEN 4 /* Length of empty TIM */
#define DOT11_TIM_HDR_LEN 5 /* Length of TIM header */
typedef struct
{
UINT8 elementId;
UINT8 length;
UINT8 dtimCount;
UINT8 dtimPeriod;
UINT8 bitmapCtrl;
UINT8 pvb[DOT11_MAX_PVB];
} _WRS_PACK_ALIGN(1) DOT11_IE_TIM;
/**************************************************************************
* DOT11_IE_IBSS - IBSS parameters.
***************************************************************************/
typedef struct
{
UINT8 elementId;
UINT8 length;
UINT16 atimWindow;
} _WRS_PACK_ALIGN(1) DOT11_IE_IBSS;
/**************************************************************************
* DOT11_IE_COUNTRY - 802.11d parmameters
***************************************************************************/
typedef struct
{
UINT8 elementId;
UINT8 length;
char data[DOT11_SSID_LEN];
} _WRS_PACK_ALIGN(1) DOT11_IE_COUNTRY;
/**************************************************************************
* DOT11_IE_ERP - Extended Rate Phy (802.11g) parameters
***************************************************************************/
#define DOT11_ERP_NONERP_PRESENT _BIT(0)
#define DOT11_ERP_USE_PROTECTION _BIT(1)
#define DOT11_ERP_LONG_PREAMBLE _BIT(2)
typedef struct
{
UINT8 elementId;
UINT8 length;
UINT8 erpInfo;
} _WRS_PACK_ALIGN(1) DOT11_IE_ERP;
/**************************************************************************
* DOT11_ASSOC_RESP_PACKET - An association response packet
***************************************************************************/
typedef struct
{
DOT11_HEADER header; /* 802.11 Mgmt Header */
UINT16 capabilities; /* 16 bit capabilities field */
UINT16 status; /* 16 bit Status field */
UINT16 aid;
DOT11_IE_SUPP_RATES rates;
} _WRS_PACK_ALIGN(1) DOT11_ASSOC_RESP_PACKET;
/**************************************************************************
* DOT11_PS_POLL_PACKET - A powersave-poll packet
***************************************************************************/
typedef struct
{
UINT16 frameCtrl;
UINT16 aid; /* Assoc AI with bit 14,15 set */
UINT8 bssid[DOT11_ADDR_LEN];
UINT8 ta[DOT11_ADDR_LEN];
} _WRS_PACK_ALIGN(1) DOT11_PS_POLL_PACKET;
/**************************************************************************
* DOT11_AUTH_PACKET - An authentication packet
***************************************************************************/
typedef struct
{
DOT11_HEADER header;
UINT16 authAlg;
UINT16 authSeq;
UINT16 status;
DOT11_IE_CHAL_TEXT challenge;
} _WRS_PACK_ALIGN(1) DOT11_AUTH_PACKET;
#define DOT11_PTK_LEN 64
#define DOT11_GMK_LEN 32
#define DOT11_GTK_LEN 32 /* MAX - only 128 bits for AES */
#define DOT11_KEK_LEN 16
#define DOT11_KCK_LEN 16
#define DOT11_TK_LEN 32 /* MAX - only 128 bits for AES */
#define DOT11_TK_AES_LEN 16
#define DOT11_TK_TKIP_LEN 32
#define DOT11_RSN_PASSPHRASE_MAX 63
/* The length of the global key counter, in bytes. It should be 256 bits */
#define DOT11_GKC_LEN 32
#define DOT11_PMK_LEN 32
typedef UINT8 DOT11_PMK[DOT11_PMK_LEN];
#define DOT11_PRF_KEY_MAX 128
#define DOT11_PRF_PREFIX_MAX 64
#define DOT11_PRF_DATA_MAX 256
/**************************************************************************
* DOT11_EAPOL_KEY_PKT - This structure contains the format of an EAPOL-Key
* Packet. Most EAPOL packets are parsed in the 802.1X
* code, with the exception of this frame.
**************************************************************************/
#define DOT11_EAPOL_REPLAY_LEN 8
#define DOT11_EAPOL_KEYRSC_LEN 8
#define DOT11_EAPOL_KEYID_LEN 8
#define DOT11_EAPOL_IV_LEN 16
#define DOT11_EAPOL_MIC_LEN 16
#define DOT11_NONCE_LEN 32
/* This structure includes the EAPOL Header. Note that the EAPOL-Key packet is
misaligned due to the <type> field - data should be accessed using byte
operations only. */
typedef struct
{
/* EAPOL Packet Header */
UINT8 version;
UINT8 eapolType;
UINT16 length;
/* EAPOL-Key Packet */
UINT8 type;
UINT8 keyInfo[sizeof(UINT16)];
UINT8 keyLen[sizeof(UINT16)];
UINT8 replayCtr[DOT11_EAPOL_REPLAY_LEN];
UINT8 nonce[DOT11_NONCE_LEN];
UINT8 iv[DOT11_EAPOL_IV_LEN];
UINT8 rcvSeqCtr[8];
UINT8 keyId[DOT11_EAPOL_KEYID_LEN]; /* Reserved in 802.11 */
UINT8 mic[DOT11_EAPOL_MIC_LEN];
UINT8 keyDataLen[2];
/* The key data would follow here, if any */
} _WRS_PACK_ALIGN(1) DOT11_EAPOL_KEY_PKT;
/* The size of the EAPOL packet header */
#define DOT11_EAPOL_HEADER_SIZE 4
/* The defined EAPOL type for an EAPOL-key packet */
#define DOT11_EAPOL_TYPE_KEY 3
#define DOT11_EAPOL_VERSION 1
/* The defined keytype for IEEE 802.11 */
#define DOT11_EAPOL_KEYTYPE_WPA 254
#define DOT11_EAPOL_KEYTYPE_11i 2
#define DOT11_RSN_MAX_KDE 1024
/* The length of the KDE header is calculated as follows:
*
* type 1
* length 1 does not include type or length fields
* OUI 3
* dataType 1
*/
#define DOT11_EAPOL_KDE_HEADER_LEN 6
/* A GTK KDE element has additional overhead - 2 bytes for the keyId */
#define DOT11_EAPOL_KDE_GTK_HEADER_LEN 8
#define DOT11_EAPOL_KDE_TYPE_GTK 1
#define DOT11_EAPOL_KDE_TYPE_STAKEY 2
#define DOT11_EAPOL_KDE_TYPE_MACADDR 3
#define DOT11_EAPOL_KDE_TYPE_PMKID 4
#define DOT11_EAPOL_KDE_KEYINDEX 3
#define DOT11_EAPOL_KDE_TXENABLE _BIT(2)
/* This structure represents a GTK KDE in 802.11i */
typedef struct
{
UINT8 type;
UINT8 length;
UINT8 oui[3];
UINT8 dataType;
UINT8 keyId;
UINT8 reserved;
UINT8 gtk[DOT11_GTK_LEN];
} DOT11_KDE;
#define DOT11_KEYTYPE_PAIRWISE _BIT(3)
#define DOT11_KEYTYPE_GROUP 0
/* Bit set in the key information field.
Note, these use bytes accesses. The below is in the first byte [0] */
#define DOT11_EAPOL_INFO_DESC_AES 2
#define DOT11_EAPOL_INFO_DESC_RC4 1
#define DOT11_EAPOL_INFO_DESC_MASK 0x3
#define DOT11_EAPOL_INFO_KEY_MASK 0x30
#define DOT11_EAPOL_INFO_KEYTYPE _BIT(3)
#define DOT11_EAPOL_INFO_INSTALL _BIT(6)
#define DOT11_EAPOL_INFO_NO_INSTALL 0
#define DOT11_EAPOL_INFO_ACK _BIT(7)
#define DOT11_EAPOL_INFO_NO_ACK 0
/* This info is in the second byte [1] */
#define DOT11_EAPOL_INFO_MIC _BIT(8)
#define DOT11_EAPOL_INFO_NO_MIC 0
#define DOT11_EAPOL_INFO_SECURE _BIT(9)
#define DOT11_EAPOL_INFO_NO_SECURE 0
#define DOT11_EAPOL_INFO_ERROR _BIT(10)
#define DOT11_EAPOL_INFO_NO_ERROR 0
#define DOT11_EAPOL_INFO_REQUEST _BIT(11)
#define DOT11_EAPOL_INFO_NO_REQUEST 0
#define DOT11_EAPOL_INFO_ENCRYPT _BIT(12)
#define DOT11_EAPOL_INFO_NO_ENCRYPT 0
#define DOT11_EAPOL_NO_KEY_RSC NULL
#define DOT11_EAPOL_NO_NONCE NULL
#define DOT11_EAPOL_NO_RSN_IE NULL
#define DOT11_EAPOL_NO_GTK NULL
#define DOT11_EAPOL_NO_KEY_DATA NULL
/* These are the keyInfo combinations that are tested on in
dot11RsnEapolReceive() */
#define DOT11_EAPOL_4WAY_MASK DOT11_EAPOL_INFO_KEYTYPE | \
DOT11_EAPOL_INFO_INSTALL | DOT11_EAPOL_INFO_ACK | DOT11_EAPOL_INFO_MIC | \
DOT11_EAPOL_INFO_SECURE | DOT11_EAPOL_INFO_ERROR | \
DOT11_EAPOL_INFO_REQUEST
#define DOT11_EAPOL_4WAY_A (DOT11_KEYTYPE_PAIRWISE | DOT11_EAPOL_INFO_ACK)
#define DOT11_EAPOL_4WAY_B (DOT11_KEYTYPE_PAIRWISE | DOT11_EAPOL_INFO_MIC)
#define DOT11_EAPOL_4WAY_C (DOT11_KEYTYPE_PAIRWISE | DOT11_EAPOL_INFO_ACK | \
DOT11_EAPOL_INFO_MIC)
#define DOT11_EAPOL_4WAY_D (DOT11_KEYTYPE_PAIRWISE | DOT11_EAPOL_INFO_MIC)
#define DOT11_EAPOL_GROUP_1 (DOT11_KEYTYPE_GROUP | DOT11_EAPOL_INFO_ACK | \
DOT11_EAPOL_INFO_MIC)
#define DOT11_EAPOL_GROUP_2 (DOT11_KEYTYPE_GROUP | DOT11_EAPOL_INFO_MIC)
#define DOT11_GROUP_REKEY_TIME (sysClkRateGet() * 60 * 2)
/* This defines the number of bytes to remove from the front of the RC4
keystream in order to discard bytes that may reveal key bits */
#define DOT11_EAPOL_RC4_OFFSET 256
/* This is the size of a TSC (for TKIP) or a PN (for AES). They both serve
the same function, they just depend on the chosen algorithm */
#define DOT11_TSC_LEN 6
#define DOT11_BYTEARRAY_INC(ba, numBytes) {\
int iii=-1;\
do {\
ba[++iii]++;\
} while ((ba[iii] == 0) && (iii<(numBytes-1)));}
#define DOT11_BYTEARRAY_INC_BE(ba, numBytes) {\
int iii = numBytes;\
do {\
ba[--iii]++;\
} while ((ba[iii] == 0) && (iii >= 0));}
/* This copies the given byte array, reversing the order of the bytes */
#define DOT11_BE_COPY(src,dst,len) {\
int iii;\
for (iii = 0; iii < len; iii++) {\
(dst)[(len-1)-iii] = (src)[iii];\
}}
#define DOT11_KSL_HASH(macAddr) ((macAddr[3]) ^ (macAddr[4]) ^ (macAddr[5]))
#define DOT11_KSL_MAX_HASH 256
/* The amount of time te KSL entry allocation routines will wait for the
semaphore before giving up */
#define DOT11_KSL_ALLOC_TIME (sysClkRateGet() / 8)
/**************************************************************************
* DOT11_FOURWAY_STATE - definitions used in pKsl->fourWayState
***************************************************************************/
/* States that apply to both the AP and the STA */
#define DOT11_FOURWAY_INIT 0
#define DOT11_FOURWAY_ESTABLISHED 10
/* States that apply to the AP */
#define DOT11_FOURWAY_SENT_1 1
#define DOT11_FOURWAY_GOT_2 2
#define DOT11_FOURWAY_SENT_3 3
#define DOT11_FOURWAY_GOT_4 4
/* States that apply to the STA */
#define DOT11_FOURWAY_GOT_1 6
#define DOT11_FOURWAY_SENT_2 7
#define DOT11_FOURWAY_GOT_3 8
#define DOT11_FOURWAY_SENT_4 9
/**************************************************************************
* DOT11_AUTH_ALGS - Supported MAC layer authentication algorithms
***************************************************************************/
#define DOT11_AUTH_OPEN 0
#define DOT11_AUTH_SHARED_KEY 1
#define DOT11_AUTH_NETWORK_EAP 128
/* This isn't an official 802.11 authtype, but it is used by the driver to
mean "any" authtype */
#define DOT11_AUTH_ALL 3
/*****************************************************************************
* DOT11_AUTH_SEQ - macros for ease of reading
***************************************************************************/
#define DOT11_AUTH_SEQ_1 1
#define DOT11_AUTH_SEQ_2 2
#define DOT11_AUTH_SEQ_3 3
#define DOT11_AUTH_SEQ_4 4
/**************************************************************************
* RATE CONTROL TASK
***************************************************************************/
#define DOT11_RC_DEPTH 256 /* Must be power of two */
/* Reevaluate the link this many packets. */
#define DOT11_RC_EVAL (DOT11_RC_DEPTH / 2)
#define DOT11_RC_STATUS_SUCCESS 1
#define DOT11_RC_STATUS_RETRY_OK 2
#define DOT11_RC_STATUS_RETRY_FAIL 3
#define DOT11_RC_STATUS_FAIL 4
/* This determines how often the rate control task runs, in seconds. */
#define DOT11_RC_EVAL_TIME 2 /* Seconds */
#define DOT11_RC_TASK_NAME "tDot11RC%d"
#define DOT11_RC_TASK_PRI 70
#define DOT11_RC_STACK_SIZE (10 * 1024)
/* These values specify the threshold for a rate change. They are expressed in
the ratio of total packets to failed packets or retries (note: more than one
retry per packet is possible) to avoid floating point math. A higher value
represents a more stable link*/
#define DOT11_RC_DOWN_T_TO_R 6 /* 5 == 20 % retries */
#define DOT11_RC_DOWN_T_TO_F 500 /* 1000 == 0.01 % failure */
#define DOT11_RC_UP_T_TO_R 50 /* 33 ~= 3% retries */
#define DOT11_RC_UP_T_TO_F 8000 /* 6250 == 0.016 % retries */
/* How many retries a failed packet counts as. Adjusting this affects how much
a missed packet affects the rate */
#define DOT11_RC_RETRY_FAIL_WEIGHT 16
/* The minimum number of packets that need to be received in order for the
rate control algorithm to run. */
#define DOT11_RC_MIN_PACKET 4
#ifdef VXBUS
/******************* VXBUS BAR handle ****************/
#define WLS_BAR(p) ((DOT11_BSP_INFO *)(p)->pDrvCtrl)->wlsBar
#define WLS_HANDLE(p) ((DOT11_BSP_INFO *)(p)->pDrvCtrl)->wlsHandle
/***********************************************************/
#endif
/*************************************************************************
* DOT11_COUNTRY_DISC - Country discovery structure, used by
* dot11SmeEssCcChoose()
**************************************************************************/
#define DOT11_SCAN_COUNTRY_MAX 8
typedef struct
{
int countryCode;
int num;
} DOT11_COUNTRY_DISC;
/* Different power-save modes */
#define DOT11_POWER_ACTIVE 0
#define DOT11_POWER_SLEEP 1
#define DOT11_POWER_PROB 2
/*************************************************************************
* DOT11_RC_INFO - Info for the rate control task. Part of SME.
**************************************************************************/
typedef struct dot11_rc_info
{
/* The number of packets since the last time the RC task was run on this
KSL entry. */
UINT32 packetTotal;
/* Running sum of the number of retries since the last time the RC task
was run on this KSL entry. */
UINT32 retryTotal;
/* Running sum of the number of transmit failures (usually due to excessive
retries) since the last time the RC task was run */
UINT32 failureTotal;
/* Running sum of the SSI since the last time the RC task was run. Div by
"packetTotal" to get the average SSI */
UINT32 ackTotal;
} DOT11_RC_INFO;
/***************************************************************************
* DOT11_BSS - A structure representing an individual wireless network. This
* was added with the implementation of mSSID to keep details
* for the separate virtual networks separate
****************************************************************************/
typedef struct dot11_bss
{
int bssNum;
/* Is this BSS currently in use? */
BOOL inUse;
/* Current link status */
int linkStatus;
/* Current connected BSSID. This does uniquely identify the network, since
each BSS has to have a unique BSSID.*/
UINT8 bssid[DOT11_ADDR_LEN];
/* The SSID that the SME is currently working with. Since there may be
more than AP with a given SSID, this does not uniquely identify the
network */
char currentSsid[DOT11_SSID_LEN + 1];
M_BLK_ID pMblkBeacon; /* Cluster allocated for beacons */
/* The VLAN this SSID is associated with, is VLAN support is turned on */
int vlanId;
/* These are the parameters that control WPA and 802.11 mode */
/* Security Policy : a bitmap of allowed sec. policies */
UINT32 secPol;
/* Authentication Policy: specifies 802.1X or PSK */
UINT32 authPol;
/* Cipher Policy: Specifies list of allowed ciphers */
UINT32 ciphPol;
char rsnPassphrase[DOT11_PASSPHRASE_LEN+1];
char rsnPassLastSsid[DOT11_SSID_LEN + 1];
/* If authPol == PSK, then this contains the PSK*/
UINT8 preSharedKey[64];
BOOL pskValid;
/* The desired broadcast rate is that set by WIOCSBCASTRATE. It is taken
into consideration when choosing a new bcast rate. If this rate is not in
the BSS basic rate set, the next lowest basic rate will be chosen. */
UINT32 desiredBcastRate;
/* These are the rates that the user wishes to use. They may or may not
be a subset of the supported rates - the intersection of the two sets will
be used */
DOT11_RATES allowedRates;
/* This is the rate that is used to transmit management and control frames,
as well and multicast and broadcast frames. It is typically one of the
station's basic rates, but is not required to be */
UINT32 bcastRate;
/* This is the default authentication method for a station, and the allowed
authentication method for an AP */
UINT32 authType;
/****** AP Specific parameters *******/
UINT32 dtimCount; /* number of bcns until DTIM */
UINT32 cfpCount; /* number of bcns until CFP */
BOOL respondBcastSsid; /* Respond to requests for ANY ssid */
BOOL showSsidInBeacon; /* Respond to requests for ANY ssid */
DOT11_IE_TIM * pTim; /* Pointer to the TIM IE */
UINT8 tivb[DOT11_MAX_PVB]; /* Complete TIVB */
INT32 tivbStart; /* Start of real data in the tivb*/
INT32 tivbStop; /* End of data in the tivb */
SEM_ID tivbSem; /* Sem protecting TIVB */
/* 802.11g compatibility info */
/* Set to TRUE if a non-ERP station is present in 11g network */
BOOL nonErpPresent;
/* Set to TRUE if all ERP stations are required to use protection */
BOOL useProtection;
/* Set to TRUE if use of short time slot is allowed in this BSS */
BOOL useShortTimeslot;
/* Set to TRUE if use of short preamble is not allowed in this BSS */
BOOL useLongPreamble;
/* Pointer to the ERP IE in the beacon, for easy updating of 802.11g info
as stations join. Can be NULL is not in 11g mode */
DOT11_IE_ERP * pErpIe;
/* Pointer to the capabilities field in the beacon */
UINT16 * pCaps;
/* Maximum number of stations allowed to associate to this BSS */
UINT32 assocLimit;
/* These are the multicast keys for the BSS (multicast as in "all
devices, not as in unicast and multicast packets) */
DOT11_ENCRYPT_TYPE multiEncryptType;
UINT32 multiEncryptIndex;
UINT32 multiKeySlot;
/* This setting is only used on an ESS or IBSS, since a STA will always
send to an AP directly. */
UINT32 multiDecryptIndex;
/* Counters for TKIP/AES multicast packets */
UINT8 tscMultiTx[DOT11_TSC_LEN];
UINT8 tscMultiRx[DOT11_TSC_LEN];
UINT8 gmk[DOT11_GMK_LEN];
UINT8 gtk[DOT11_GTK_LEN];
BOOL gtkValid;
UINT8 gNonce[DOT11_NONCE_LEN];
} DOT11_BSS;
#define DOT11_DEFAULT_BSS (&pDot11->sme->bss[0])
/**************************************************************************
* DOT11_KSL_ENTRY - An entry in the Known Station List
***************************************************************************/
typedef struct kslEntry
{
struct kslEntry * pNext;
/* This is a pointer to the BSS to which this station belongs. In an ESS
or IBSS, this will always be a pointer to pDot11->sme->bss[0] */
DOT11_BSS * pBss;
UINT8 macAddr[DOT11_ADDR_LEN];
int dot11Mode; /* Is it an AP, STA or IBSS */
UINT32 timestamp; /* When did we last hear from it */
DOT11_RC_INFO rcInfo ; /* Rate control info, stats */
DOT11_RATES suppRates; /* Supported rates for entry */
UINT16 capabilities; /* 802.11 capabilities field */
/* Rates used to communicate with this station. It is the intersection
of the supported rates for this station, the supported rates for the
remote station and the allowed rates as set by the user. Note that
these rates are expected to be in order from slowest to fastest. */
DOT11_RATES actualRates;
UINT32 currentTxRate;
UINT32 currentTxRateIndex;
UINT32 lastRxRate;
/* Determines if this is a static KSL entry for WEP key mapping. This
entry won't be recycled until the key is manually deleted.*/
BOOL wepKeyMapping;
/* This values is used to inform the HDD which key mapping entry is to be
used for this destination. This is the unicast key for this station. If
not set, then the multicast key from the DPE will be used if present. The
decryptIndex is used only with TKIP to allow for separate TX and RX
entries (different MICs). */
INT32 uniDecryptIndex;
INT32 uniEncryptIndex;
UINT32 uniEncryptType;
/* The SSID that this entry is connected to. */
char ssid[DOT11_SSID_LEN + 1];
/* This KSL_Entry is access controlled. The type of control is left
up to the controlling SME module */
BOOL accessControlled;
/* These entries are used by WIOCSDOT1XPORTSTATUS to determine if packets
are allowed to be transmitted through the port */
BOOL dot1xControlled;
BOOL dot1xAllowed;
/* These records are used to keep track of the advertised security
policies */
UINT32 secPol;
UINT32 authPol;
UINT32 ciphPol;
UINT32 groupPol;
UINT32 rsnCap;
/* These records keep track of the chosen security policies */
UINT32 negSecPol;
UINT32 negAuthPol;
/* This contains the Pairwise Master key, and a flag determining whether
this is a valid PMK */
UINT8 pmk[DOT11_PMK_LEN];
BOOL pmkValid;
/* The variables control the state of the four-way state machine. The
timer is used to wait a limited time for a reply before retransmitting */
UINT32 fourWayState;
INT32 fourWayGlobalTimer;
INT32 eapolMsgTimer;
/* The dervied keys are generated from the combination of the PMK, the
local nonce and the remote nonce */
BOOL derivedKeysValid;
UINT8 kck[DOT11_KCK_LEN];
UINT8 kek[DOT11_KCK_LEN];
UINT8 tk[DOT11_TK_LEN];
/* The EAPOL replay counter is used for the fourway key exchange, and keeps
track of the last key number observed or used */
UINT8 eapolReplay[DOT11_EAPOL_REPLAY_LEN];
/* The nonce information governs whether we have a valid nonce, and
whether our information about the remote nonce is valid */
UINT8 localNonce[DOT11_NONCE_LEN];
BOOL localNonceValid;
UINT8 remoteNonce[DOT11_NONCE_LEN];
BOOL remoteNonceValid;
/* These elements store the last WPA oe RSN IE used by the enitity to which
the KSL record points. This is used in the fourway handshake to compare
against to ensure the IE has not been tampered with */
UINT8 lastRsnIe[DOT11_IE_MAX_SIZE];
UINT8 lastWpaIe[DOT11_IE_MAX_SIZE];
/* The transmit sequence counters store the packet number of the last
packet transmitted to this station, as well as the last packet received
from this station */
UINT8 tscUniTx[DOT11_TSC_LEN];
UINT8 tscUniRx[DOT11_TSC_LEN];
/* Reflects the number of times that this entity has failed the fourway
handshake */
UINT32 fourWayTimeouts;
/* The tickGet() of the last connection attempt. This is used by
dot11KslSSIDLookup() so that the same AP will not always be chosen if it
is rejecting connection attempts */
UINT32 lastAttempt;
/* This is the sequence number of the last packet received; used for
duplicate detection as a fix to SPR 110780 */
UINT16 lastSeq;
/* The "type" union reflects the type of the KSL entry, NOT the SME */
union
{
struct /* KSL_ENTRY is an AP */
{
int channel; /* Last channel we heard from entry on*/
int mode; /* PHY mode last heard in */
int ssi; /* Last SSI we heard from entry on */
int aid; /* Association ID, if associated */
/* The shared key buffer stores the last challenge text that was
sent to the STA */
UINT8 skaBuffer[DOT11_AUTH_CHAL_MAX];
int skaLength;
/* Offset of TIM IE in beacon packets in bytes from start of pkt*/
UINT32 timIeOffset;
/* Offset of byte in complete virtual bitmap */
UINT32 timByteOffset;
/* Mask of byte pointed to by timByteOffset for this STA */
UINT32 timMask;
/* Information stripped from last received beacon */
BOOL beaconSync;
DOT11_TIMESTAMP lastBeaconTsf;
UINT32 beaconPeriod;
UINT32 dtimPeriod;
UINT32 dtimCount;
UINT32 cfpPeriod;
UINT32 cfpCount;
UINT32 cfpDuration;
UINT32 lastProbation;
/* Used to calculate an average RSSI to smooth Probation Events */
UINT8 rssiProbationVal[DOT11_RSSI_PROBATION_COUNT];
UINT8 rssiProbationPos;
/* 802.11g compatibility information */
BOOL useProtection;
BOOL useShortTimeslot;
BOOL useLongPreamble;
/* 802.11d information */
UINT32 countryCode;
} ap;
struct /* KSL_ENTRY is a station in ESS mode */
{
int rate; /* Last rate we heard from entry on */
int aid; /* Association ID */
BOOL authenticatedSka; /* Has passed stage 1 of SKA */
BOOL authenticated; /* Has passed final stage of auth */
BOOL associated; /* Assoc success sent */
/* The shared key buffer stores the last challenge text that was
sent to the STA */
UINT8 skaBuffer[DOT11_AUTH_CHAL_MAX];
int skaLength;
BOOL ratesUpdated; /* Do we have rates for this device */
BOOL powerManaged; /* Whether this station is in PM */
M_BLK_ID pmQueueHead; /* Removal point */
M_BLK_ID pmQueueTail; /* Insertion point */
} sta;
struct /* KSL_ENTRY is a STA in IBSS mode */
{
int channel; /* Last channel it was heard on */
int mode; /* PHY mode last heard in */
int ssi;
UINT16 atimWindow;
UINT16 beaconInterval; /* BI used by this sta */
UINT8 bssid[DOT11_ADDR_LEN]; /* BSSID it's connected to */
DOT11_TIMESTAMP lastBeaconTsf; /* Their TSF */
DOT11_TIMESTAMP ourTsf; /* When we received it */
BOOL adoptIbss; /* if TRUE adopt this ibss */
BOOL ratesUpdated; /* Do we have rates for this device */
/* 802.11d information */
UINT32 countryCode;
} ibss;
} type;
} DOT11_KSL_ENTRY;
/**************************************************************************
* DOT11_FRAGMENT - Reassembly space for ingress fragment
***************************************************************************/
typedef struct
{
BOOL used; /* Determines if this slot is used */
UINT8 addr2[DOT11_ADDR_LEN];
UINT8 addr1[DOT11_ADDR_LEN];
UINT16 sequence; /* seq out of seqCtl field */
INT32 lastFrag; /* The last fragment that was received */
int timerId; /* Identifies timer */
M_BLK_ID pHead; /* The head of the reassembled packet*/
M_BLK_ID pLast; /* Pointer to last MBlk for convenience */
} DOT11_FRAGMENT;
#define DOT11_MAX_REASSEMBLY 16
/**************************************************************************
* DOT11_REASSEMBLY - Structure used to store packet statistics
***************************************************************************/
typedef struct
{
DOT11_FRAGMENT packet[DOT11_MAX_REASSEMBLY];
} DOT11_REASSEMBLY;
#define DOT11_FRAGMENT_LAST _BIT(15)
#define DOT11_FRAGMENT_MASK 0x000f
#define DOT11_FRAGMENT_MIN_SIZE 256
#define DOT11_FRAGMENT_MAX_NUM 16
typedef struct
{
int a;
} DOT11_SW_KEY_TABLE;
typedef struct
{
int a;
} DOT11_TX_POWER_RANGE;
#define DOT11_MAX_DEFAULT_KEY 4
#define DOT11_MAX_KEYS 64
/* This is a magic number passed to pDot11->hdd->hwEncryptionKeySet() to
signal it to look for the first available unicast key slot */
#define DOT11_KEYINDEX_SEARCH 65536
/* This is a parameter passed to hdd->rawSend() that specifies no encryption*/
#define DOT11_KEYINDEX_NONE -1
/**************************************************************************
* DOT11_KEYTAB_ENTRY - An entry in the soft key table
***************************************************************************/
typedef struct
{
BOOL used;
DOT11_KSL_ENTRY * pKsl;
} DOT11_KEYTAB_ENTRY;
/*****************************************************************************
* DOT11_RX_FUNC - A type representing a function pointer to a receive function
* as used by the rxMap in the Hdd.
*****************************************************************************/
typedef STATUS (* DOT11_RX_FUNC)(DOT11_FW * pDot11, M_BLK_ID pMblk,
UINT32 rate, UINT8 ssi);
/*****************************************************************************
* DOT11_RX_FILTER - Filter describing which packets will be received by the
* hardware
*****************************************************************************/
#define DOT11_RX_FILTER_NONE 0
/* DOT11_RX_FILTER_UNI - Unicast packets, with the stations addr in addr1 */
#define DOT11_RX_FILTER_UNI _BIT(0)
/* DOT11_RX_FILTER_MULTI - Multicast packets matching filter */
#define DOT11_RX_FILTER_MULTI _BIT(1)
/* DOT11_RX_FILTER_BROAD - Broadcast (non-matching BSSID)packets */
#define DOT11_RX_FILTER_BROAD _BIT(1)
/* DOT11_RX_FILTER_BEACON - Beacons */
#define DOT11_RX_FILTER_BEACON _BIT(2)
/* DOT11_RX_FILTER_PROBE_REQ - Broadcast management packets */
#define DOT11_RX_FILTER_PROBE_REQ _BIT(3)
/* DOT11_RX_FILTER_CONTROL - All 802.11 Control frames */
#define DOT11_RX_FILTER_CONTROL _BIT(4)
/* DOT11_RX_FILTER_PROMISC - All frames */
#define DOT11_RX_FILTER_PROMISC _BIT(5)
IMPORT const char * dot11StateNames[];
#define DOT11_DEFAULT_AUTH_TIMEOUT (sysClkRateGet() / 5) /* 200ms */
#define DOT11_DEFAULT_ASSOC_TIMEOUT (sysClkRateGet() / 5) /* 200ms */
/*****************************************************************************
* DPE_OBJ - Object representing the Data Path Entity
*****************************************************************************/
typedef struct /* DPE_OBJ */
{
STATUS (*free)(DOT11_FW * pDot11);
STATUS (*endSend)(END_OBJ * pEnd, M_BLK_ID pMblk);
STATUS (*endReceive)(DOT11_FW * pDot11, M_BLK_ID pMblk,
UINT32 rate, UINT8 SSI);
STATUS (*fragThresholdSet)(DOT11_FW * pDot11, UINT32 fragThresh);
STATUS (*fragThresholdGet)(DOT11_FW * pDot11,
UINT32 * fragThresh);
STATUS (*endPollSend)(END_OBJ* pEnd, M_BLK_ID pMblk);
STATUS (*endPollRcv)(END_OBJ* pEnd, M_BLK_ID pMblk);
STATUS (*transmitQueueFlush)(DOT11_FW * pDot11);
/* The reassembly buffer stores packet fragments awaiting reassembly */
DOT11_REASSEMBLY reassemblyBuff;
/* Packets above this size will be fragmented */
UINT32 fragThreshold;
DOT11_EX_POLICY exclusionPolicy;
/* Timer for group re-keying */
INT32 groupRekeyTimer;
UINT32 groupRekeyTime;
/* This specifies the last initialization vector used on an egress packet*/
UINT32 currentIV;
/* Protects the order of the transmission path */
SEM_ID transmitSem;
/* This queues up packets that attempted transmission while the link was
not up. Upon resumption of the link, these packets will be sent before any
fresh packets. Use a head and tail for quick insertion and removal.*/
M_BLK_ID transmitQueueHead;
M_BLK_ID transmitQueueTail;
} DPE_OBJ;
/*****************************************************************************
* DOT11_KSL_OBJ - the Known Station List object
*****************************************************************************/
typedef struct /* DOT11_KSL_OBJ */
{
/* The init routine, dot11KslInit() is called directly from the SME to
create this structure */
STATUS (*free)(DOT11_FW * pDot11);
STATUS (*show)(int unitNum);
STATUS (*lock)(DOT11_FW * pDot11);
STATUS (*unlock)(DOT11_FW * pDot11);
STATUS (*flush)(DOT11_FW * pDot11);
DOT11_KSL_ENTRY * (*lookup)(DOT11_FW * pDot11, UINT8 * macAddr);
DOT11_KSL_ENTRY * (*ssidLookup)(DOT11_FW * pDot11, char * ssid,
int dot11Mode);
DOT11_KSL_ENTRY * (*rxUpdate)(DOT11_FW * pDot11, UINT8 * macAddr,
int rate, int ssi);
DOT11_KSL_ENTRY * (*txUpdate)(DOT11_FW * pDot11, UINT8 * macAddr,
BOOL success, UINT32 nRetries,
UINT32 ackSSI);
DOT11_KSL_ENTRY * (*add)(DOT11_FW * pDot11, UINT8 * macAddr);
STATUS (*delete)(DOT11_FW * pDot11, DOT11_KSL_ENTRY * pKsl);
STATUS (*lastAttemptReset)(DOT11_FW * pDot11);
/* Private data members */
/* This is the pointer to the head of the free pool of KSL entries and the
semaphore to guard the LL */
DOT11_KSL_ENTRY * pPool;
DOT11_KSL_ENTRY * pFreeEntry;
int poolUsed;
int poolMaxUsed;
SEM_ID poolSem;
DOT11_KSL_ENTRY * list[DOT11_KSL_MAX_HASH];
SEM_ID lockSem; /* Table protection */
int cleanupTimer;
} DOT11_KSL_OBJ;
/*****************************************************************************
* DOT11_RSN_OBJ - Specialized SME OBJ for RSN use. Only used in SME_OBJ
*****************************************************************************/
typedef struct /* DOT11_RSN_OBJ */
{
STATUS (*free)(DOT11_FW * pDot11);
INT32 (*rsnIeCreate)(DOT11_FW * pDot11, DOT11_KSL_ENTRY * pKsl,
DOT11_BSS * pBss, UINT8 * buffer, int type);
STATUS (*ieProcess)(DOT11_FW * pDot11, DOT11_KSL_ENTRY * pKsl,
UINT8 * buffer);
UINT32 (*groupPolicyRecalc)(DOT11_FW * pDot11,
DOT11_KSL_ENTRY * pKsl,
DOT11_BSS * pBss);
STATUS (*eapolPktReceive)(DOT11_FW * pDot11, M_BLK_ID pMblk);
STATUS (*pskSet)(DOT11_FW * pDot11, const UINT8 * pKey);
STATUS (*pmkSet)(DOT11_FW * pDot11, const UINT8 * pKey);
STATUS (*passphraseSet)(DOT11_FW * pDot11, const char * passphrase);
STATUS (*fourwayStart)(DOT11_FW * pDot11, DOT11_KSL_ENTRY * pKsl);
STATUS (*fourwayTimeout)(DOT11_FW * pDot11, DOT11_KSL_ENTRY * pKsl);
STATUS (*gtkRecalc)(DOT11_FW * pDot11);
STATUS (*micFailureProcess)(DOT11_FW * pDot11, UINT8 * srcAddr);
UINT8 globalKeyCounter[DOT11_GKC_LEN];
/* Keeps track of the tickGet() of the last MIC failure. Used by
dot11RsnMicFailureProcess() to enforce TKIP countermeasures. */
INT32 lastMicFailure;
/* TRUE if TKIP countermeasures are active. Prevents association to and
from stations with TKIP cipher */
BOOL micLockout;
/* timerId for the dot11RsnMicReenable() */
UINT32 micLockoutTimer;
/* The source address of the packet that had the MIC error */
UINT8 micLockoutAddr[DOT11_ADDR_LEN];
} DOT11_RSN_OBJ;
/*****************************************************************************
* DOT11_ESS_OBJ - Specialized SME OBJ for ESS use. Only used in SME_OBJ
*****************************************************************************/
typedef struct /* DOT11_ESS_OBJ */
{
/* PRIVATE */
DOT11_ESS_SM sm; /* State machine object */
MSG_Q_ID scanMsgQ; /* Message queue for scan task */
int scanTaskId; /* TID of scan task */
SEM_ID scanTaskExitAckSem; /* Semaphore to Ack that scan task terminated */
int probationTimer; /* Timer to recove from link p */
int authTimer; /* Timer for auth and assoc */
/* There are used when re-associating to an AP */
UINT16 assocRequestType;
UINT8 oldApMacAddr[DOT11_ADDR_LEN];
/* This is a pointer to the KSL_ENTRY of the currently connected BSS */
DOT11_KSL_ENTRY * pKslAp;
} DOT11_ESS_OBJ;
/*****************************************************************************
* DOT11_IBSS_OBJ - Specialized SME OBJ for IBSS use. Only used in SME_OBJ
*****************************************************************************/
typedef struct /* DOT11_IBSS_OBJ */
{
M_BLK_ID pMblkBeacon; /* Cluster allocated for beacons */
BOOL beaconing; /* Tue if beacons are being sent */
BOOL syncBeacon; /* Are we sync'd to the IBSS's bcns */
int stateTid; /* Task ID of state task; for del */
MSG_Q_ID stateMsgQ; /* Message queue for state task */
int state; /* Current state of SM */
int atimWindow; /* Window after beacon for ATIM */
/* This is the pointer to the KSL_ENTRY that we used to create the
IBSS. This is just one station in the IBSS, but it should be sufficient
to get the IBSS parameters from. If we get a beacon with a later timestamp
than this one, then we can shift to using that one */
DOT11_KSL_ENTRY * pKslIbss;
} DOT11_IBSS_OBJ;
/*****************************************************************************
* DOT11_AP_OBJ - Specialized SME OBJ for AP use. Only used in SME_OBJ
*****************************************************************************/
/* The timeout for the TIVB is small so that we don't break beacons waiting
for it */
#define DOT11_TIVB_SEM_TIMEOUT (30)
typedef struct /* DOT11_AP_OBJ */
{
int channel;
UINT32 cfpDuration; /* Length of CFP, in tu */
int beaconTid; /* Beacon task-ID */
SEM_ID beaconSem; /* Semaphore to wake beacontask */
UINT16 lastAid; /* Last AID allocated */
/* A pointer to the real raw packet send */
STATUS (*origRawPacketSend)(DOT11_FW * pDot11, M_BLK_ID pMBlk, int rate,
int keyIndex);
} DOT11_AP_OBJ;
/*****************************************************************************
* SME_OBJ - Object representing the Station Management Entity.
*****************************************************************************/
typedef struct /* SME_OBJ */
{
/* PUBLIC members */
/* Frees the entire SME, including the current SME module, if necessary */
STATUS (*free)(DOT11_FW * pDot11);
/* Starts the specified mode. Will de-init old mode if one was started */
STATUS (*modeStart)(DOT11_FW * pDot11, int dot11Mode);
/* Frees just the current SME module */
STATUS (*modeStop)(DOT11_FW * pDot11);
/* A helper function called by modeStop that stops the currently selected
SME module */
STATUS (*modeFree)(DOT11_FW * pDot11);
/* Show routine for the specific mode */
STATUS (*modeShow)(DOT11_FW *);
int (*endIoctl)(END_OBJ* pDrvCtrl, unsigned int cmd, caddr_t data);
/* IOCTL routines specific to the SME type. Implemented in
dot11SmeXXXLib.c */
int (*smeSpecificIoctl)(DOT11_FW * pDrvCtrl, unsigned int cmd,
caddr_t data);
/* IOCTL routines common to all SME types. Implemented in dot11SmeLib.c */
int (*smeCommonIoctl)(DOT11_FW * pDrvCtrl, unsigned int cmd, caddr_t data);
/* Notifies the SME about link events */
VOID (*linkEventNotify)(DOT11_FW * pDot11, int event);
/* Perform a BSS scan */
INT32 (*bssScanDo)(DOT11_FW * pDot11, char * ssid,
DOT11_SCAN_RESULTS * results, int numresults);
int (*dot11StateGet)(DOT11_FW * pDot11);
STATUS (*endMCastAddrGet)(END_OBJ* pEnd,MULTI_TABLE* pTable);
STATUS (*endMCastAddrAdd)(END_OBJ* pEnd, char * address);
STATUS (*endMCastAddrDel)(END_OBJ* pEnd, char * address);
STATUS (*reset)(DOT11_FW * pDot11);
STATUS (*txMultiRateSet)(DOT11_FW * pDot11, UINT32 rate,
DOT11_BSS * pBss);
UINT32 (*txMultiRateGet)(DOT11_FW * pDot11, DOT11_BSS * pBss);
STATUS (*txUniRateSet)(DOT11_FW * pDot11, DOT11_RATES * pRate,
DOT11_BSS * pBss);
STATUS (*txUniRateGet)(DOT11_FW * pDot11, DOT11_RATES * pRate,
DOT11_BSS * pBss);
/* PRIVATE */
STATUS (*nullDataSend)(DOT11_FW * pDot11,UINT8 * pDstAddr, BOOL toDs,
DOT11_BSS * pBss);
STATUS (*probeReqSend)(DOT11_FW * pDot11,DOT11_IE_SSID * pSsid,
DOT11_RATES * pRates, DOT11_BSS * pBss);
STATUS (*authSend)(DOT11_FW * pDot11, UINT8 * pDstMacAddr, UINT16 authAlg,
UINT16 authSeq, UINT16 status, int chalLen,
UINT8 * pChallenge, DOT11_BSS * pBss);
STATUS (*assocReqSend)(DOT11_FW * pDot11, UINT8 * pDstMacAddr,
DOT11_CAPABILITIES * pCap, UINT16 listenInt,
DOT11_IE_SSID *pSsid, DOT11_RATES * pRates,
DOT11_BSS * pBss, UINT16 assocRequestType);
STATUS (*assocRspSend)(DOT11_FW * pDot11, UINT8 * pDstMacAddr,
DOT11_CAPABILITIES * pCap, UINT16 status,
UINT16 aid, DOT11_RATES * pRates,
DOT11_BSS * pBss);
STATUS (*deauthSend)(DOT11_FW * pDot11, UINT8 * pDstAddr,
UINT16 reason, DOT11_BSS * pBss);
STATUS (*disassocSend)(DOT11_FW * pDot11, UINT8 * pDstAddr,
UINT16 reason, DOT11_BSS * pBss);
DOT11_RX_FUNC assocReceive;
DOT11_RX_FUNC disassocReceive;
DOT11_RX_FUNC authReceive;
DOT11_RX_FUNC deauthReceive;
DOT11_RX_FUNC beaconReceive;
DOT11_RX_FUNC nullDataReceive;
DOT11_RX_FUNC pollReceive;
STATUS (*essJoin)(DOT11_FW * pDot11, char * pSsid);
UINT32 (*linkStatusGet)(DOT11_FW * pDot11, DOT11_BSS * pBss);
UINT32 (*assocCallback)(DOT11_FW * pDot11, DOT11_KSL_ENTRY * pKsl,
UINT32 event);
/* Called by the HDD when it needs the beacon updated. Only used for AP
mode */
STATUS (*beaconUpdate)(DOT11_FW * pDot11, DOT11_BSS * pBss);
/* Regenerates the list of channels that match the current radio mode */
STATUS (*scanListBuild)(DOT11_FW * pDot11);
/* Determines whether a BSS scan will send Probe Requests and use info from
Probe Responses to locate BSSes. */
BOOL activeScan;
/* Determines whether a BSS scan will use info from Beacons to locate
BSSes. */
BOOL passiveScan;
DOT11_CHANNEL_LIST scanList;
int lastProbScanChannel;
BOOL probScanIncomplete;
/* The TID for the rate control task. Used in the deinitialization of the
SME. */
int rateControlTask;
/* This semaphore is given to force an update of the rc task. */
SEM_ID rcForceUpdate;
/* Rates that this station supports, in IEEE 802.11 format (ie. in units of
500 kbps, with 0x80 masked over for basic (required) rates) */
DOT11_RATES suppRates;
/* This is the list of channels available and the mode they're available
in */
DOT11_CHANNEL_LIST channelList;
/* This controls whether power management mode in on in ESS mode */
BOOL powerManagement;
/* This is the 802.1X authentication callback. The ESS and AP modules will
call this function if they associate (or associate someone) or disassociate
*/
FUNCPTR dot1xAuthCallback;
UINT32 dot1xAuthCallbackParam;
/* The user callback is used to register a callback whereby the user is
notified of changes to the drivers state */
FUNCPTR userAuthCallback;
/* These are accumulators that are used for calculating the bytes/s stats*/
DOT11_UINT64 accRxBytesPerSec;
DOT11_UINT64 accRxBytesPer16Sec;
DOT11_UINT64 accTxBytesPerSec;
DOT11_UINT64 accTxBytesPer16Sec;
/* These are the timout values, in ticks, for authentication and
association messages. These are dynamic because the MIB wants to manage
them */
UINT32 authTimeout;
UINT32 assocTimeout;
/* TRUE if 802.11d support is turned on. This effects all modes of
operation */
BOOL multiDomainEnabled;
/* This is the SME specific object.v */
union
{
DOT11_ESS_OBJ ess;
DOT11_IBSS_OBJ ibss;
DOT11_AP_OBJ ap;
} type;
/* The KSL object that implements the KSL*/
DOT11_KSL_OBJ ksl;
/* The Object containing routines and data for managing the RSNA */
DOT11_RSN_OBJ rsn;
/* The object representing a BSS or wireless network */
DOT11_BSS bss[DOT11_BSS_MAX];
/* Enable VLAN trunking operation - used with mSSID */
BOOL vlanEnabled;
/* The numer of bits in the BSSID used for the bssNum */
int bssAddrBits;
/* Mask for getting bssNum from BSSID */
UINT8 bssAddrMask[DOT11_ADDR_LEN];
/* The BSS that configuration IOCTLs will affect */
int curConfigBss;
/* Time (in 802.11 tu) between beacons */
int beaconInterval;
/* Access Control List mode */
UINT32 aclMode;
/* number of bcns per DTIM */
UINT32 dtimPeriod;
/* number of bcns per CFP */
UINT32 cfpPeriod;
} SME_OBJ;
/*****************************************************************************
* HDD_OBJ - Object representing the Hardware Device Driver abstraction
*****************************************************************************/
typedef struct /* HDD_OBJ */
{
STATUS (*initialize)(DOT11_FW * pDot11);
#ifdef VXBUS
STATUS (*free)(VXB_DEVICE_ID wlsDev );
STATUS (*bringUp)(VXB_DEVICE_ID wlsDev );
STATUS (*takeDown)(VXB_DEVICE_ID wlsDev);
#else
STATUS (*free)(DOT11_FW * pDot11);
STATUS (*bringUp)(DOT11_FW * pDot11);
STATUS (*takeDown)(DOT11_FW * pDot11);
#endif
STATUS (*start)(DOT11_FW * pDot11);
STATUS (*stop)(DOT11_FW * pDot11);
STATUS (*show)(DOT11_FW * pDot11);
STATUS (*psPollSend)(DOT11_FW * pDot11);
STATUS (*rawPacketSend)(DOT11_FW * pDot11, M_BLK_ID pMBlk, int rate,
int keyIndex);
STATUS (*dtimPacketAdd)(DOT11_FW * pDot11, M_BLK_ID pMBlk, int rate,
int keyIndex);
STATUS (*dtimPacketFlush)(DOT11_FW * pDot11, DOT11_BSS *);
STATUS (*rxMapRegisterInit)(DOT11_FW * pDot11,DOT11_RX_FUNC rxMap[]);
STATUS (*rxMapRegisterSet)(DOT11_FW *pDot11,int entry,DOT11_RX_FUNC rxMap);
STATUS (*macAddrGet)(DOT11_FW * pDot11, UINT8 * pmacAddr );
STATUS (*channelSet)(DOT11_FW * pDot11, int channel, int mode);
STATUS (*channelGet)(DOT11_FW * pDot11, int * channel, int * mode);
STATUS (*channelListGet)(DOT11_FW * pDot11,
DOT11_CHANNEL_INFO * pChannelInfo);
STATUS (*pmStateSet)(DOT11_FW * pDot11, BOOL pmState);
BOOL (*pmStateGet)(DOT11_FW * pDot11);
STATUS (*probStateSet)(DOT11_FW * pDot11, BOOL probState);
STATUS (*bssidSet)(DOT11_FW * pDot11, UINT8 * bssid, INT32 AID,
UINT32 timOffset);
STATUS (*suppRatesGet)(DOT11_FW * pDot11, DOT11_RATES * pRates);
STATUS (*hwEncryptionKeySet)(DOT11_FW * pDot11, DOT11_KEY * pKey);
STATUS (*hwEncryptionKeyDel)(DOT11_FW * pDot11, UINT32 keyNum);
int (*hwEncryptionKeyMaxGet)(DOT11_FW * pDot11);
STATUS (*staBeaconSync)(DOT11_FW * pDot11);
STATUS (*beaconStart)(DOT11_FW * pDot11, M_BLK_ID pMblk,
INT32 nextBeacon, int beaconInterval, int atimWin);
STATUS (*beaconStop)(DOT11_FW * pDot11);
STATUS (*rtsThresholdSet)(DOT11_FW * pDot11, UINT32 rtsThreshold);
UINT32 (*rtsThresholdGet)(DOT11_FW * pDot11);
VOID (*rxFilterSet)(DOT11_FW * pDot11, UINT32 rxFilter);
UINT32 (*nextDtimGet)(DOT11_FW * pDot11);
STATUS (*multicastAddressDel)(DOT11_FW * pDot11, char * pAddress);
STATUS (*multicastAddressAdd)(DOT11_FW * pDot11, char * pAddress);
UINT32 (*cardTypeGet)(DOT11_FW * pDot11);
STATUS (*tsfGet)(DOT11_FW * pDot11, DOT11_TIMESTAMP * pTsf);
VOID (*setTsf)(DOT11_FW * pDot11,UINT32 h_val,UINT32 l_val);
VOID (*resetTsf)(DOT11_FW * pDot11);
STATUS (*countryCodeChange)(DOT11_FW * pDot11);
STATUS (*macAddrChange)(DOT11_FW * pDot11, UINT8 * macAddr);
STATUS (*txParamsSet)(DOT11_FW * pDot11, BOOL useShortPreamble,
BOOL use11gProt, BOOL use11gShortSlot);
STATUS (*controlRateSet)(DOT11_FW * pDot11, UINT8 ctrlRate);
STATUS (*hwVersGet)(DOT11_FW * pDot11, char * buffer);
STATUS (*frameLongRetrySet)(DOT11_FW * pDot11, UINT32 longRetry);
STATUS (*frameLongRetryGet)(DOT11_FW * pDot11, UINT32 *longRetry);
STATUS (*frameShortRetrySet)(DOT11_FW * pDot11, UINT32 shortRetry);
STATUS (*frameShortRetryGet)(DOT11_FW * pDot11, UINT32 *shortRetry);
STATUS (*txPowerScaleSet)(DOT11_FW * pDot11, UINT32 scale);
STATUS (*txPowerScaleGet)(DOT11_FW * pDot11, UINT32 * scale);
STATUS (*countryCodeIeGet)(DOT11_FW * pDot11, UINT8 * pIe);
int (*countryCodeNumGet)(DOT11_FW * pDot11, char * country);
int dot11Type; /* Are we an AP, STA in ESS or IBSS */
/* Packets larger than this threhsold get sent using CTS/RTS protection*/
UINT32 ctsRtsThreshold;
/* BRSSI Threshold will generate an interupt if signal strength drops
below this level */
UINT8 brssiThresholdPercent;
/* This describes the wireless mode that the card is currently in. It
cannot contain more than one mode (unlike pDot11->radioMode) since
it represents a physical setting */
int curMode;
/* This is the channel that the card is currently tuned to */
int curChannel;
DOT11_CHANNEL_INFO * pCurChannel;
void * pHw; /* A pointer to a hardware specific data structure */
int pmState; /* Current state of power management */
UINT32 maxSleepTime; /* in milliseconds */
DOT11_RX_FUNC rxMap[DOT11_RX_MAP_NUM];
/* The information about the beacon task */
int beaconTid;
SEM_ID beaconSem;
/* The watchdog that is used to defer interrupts for a bit if tNetTask
overflows */
WDOG_ID intReenableWdog;
/* Keeps track of the current value of the exponential backoff. */
int intRenableTime;
/* Keeps track of which keys are currently in use. Applicable only to
unicast keys */
DOT11_KEYTAB_ENTRY keyTab[DOT11_MAX_KEYS];
/* Used for the periodic hardware calibration timer */
int calTimer;
int calTime;
} HDD_OBJ;
#ifdef VXBUS
/* rx/tx buffer descriptors definitions */
typedef struct wls_desc
{
volatile UINT32 addr;
} WLS_DESC;
#endif
/*****************************************************************************
* DOT11_FW - The wireless framework object; the root object of the driver
*****************************************************************************/
struct dot11Framework
{
/* the END_OBJ must go first so that we can use the pEnd to reference this
struct. Conceptually, we are extending the END_OBJ */
END_OBJ endObj;
#ifdef VXBUS
VXB_DEVICE_ID wlsDev;
void *wlMuxDevCookie;
#endif
STATUS (*endLoad)(char * initString, void * pBSP);
STATUS (*endUnload)(END_OBJ * pEnd);
STATUS (*endStart)(END_OBJ * pEnd);
STATUS (*endStop)(END_OBJ * pEnd);
STATUS (*debugLevelGet)(END_OBJ * pEnd,int area);
STATUS (*debugLevelSet)(DOT11_FW * pDot11, int area, int level);
UINT8 macAddr[6];
/* The Station Management Entity handles management and control frames
and performs most aspects of the 802.11 protocol. */
SME_OBJ * sme;
/* The Hardware Device Driver implements the card-specific routines to
talk to the card. */
HDD_OBJ * hdd;
/* The Data Path Entity handles data packets, implementing the receive and
transmit path */
DPE_OBJ * dpe;
/* The type of device - ESS, IBSS or AP */
INT32 dot11Mode;
/* MRY: If set, let external supp handle eapol and 4way handshake */
BOOL externalRsn;
/* The unit number of the device */
INT32 unitNum;
/* Base address of the device's registers */
UINT32 baseAddr;
/* Base address for the memory pool */
#ifdef VXBUS
WLS_DESC *dmaBuff;
#endif
UINT32 dmaBufAddr; /* Address of the DMA buffer */
UINT32 dmaBufSize; /* Total size of the DMA buffer */
UINT32 dmaBufUsed; /* How much has already been allocated */
#ifdef VXBUS
void *wlsHandle;
void *wlsBar;
/* DMA tags and maps for vxBus */
VXB_DMA_TAG_ID wlsParentTag;
VXB_DMA_TAG_ID wlsRfdTag;
VXB_DMA_MAP_ID wlsRfdMap;
/* end DMA tags */
INT32 magicNum; /* Magic number */
#endif
/* Interrupt request line assigned to the card */
INT32 intVector;
INT32 intLevel;
/* PCI Device ID for HDD chipset dection */
UINT16 pciDeviceId;
/* PCI Vendor ID for HDD chipset dection */
UINT16 pciVendorId;
/* PCI Device ID for HDD chipset dection */
UINT16 pciSubDeviceId;
/* PCI Vendor ID for HDD chipset dection */
UINT16 pciSubVendorId;
/* PCI Vendor ID for HDD chipset dection */
UINT8 pciChipRevId;
/* Size of the cache line. Typically 8 or 32 bytes. Always power of 2 */
int cacheLineSize;
/* The SSID to which the user would like us to join. Note that this may
be the broadcast addr, in which case the currentSsid may be different */
char desiredSsid[DOT11_SSID_LEN + 1];
/* Radio type - controls which channels the card is allowed to access */
UINT32 radioMode;
/* Default channel - if the device needs a channel to create an AP or a
new IBSS, this is the channel chosen. This setting does not do anything
in ESS mode. */
int defaultChannel;
/* Country code - controls which channels and transmit power levels are
available */
int countryCode;
/* Packet statistics */
DOT11_STATS stats;
UINT32 rxTimestamp; /* received packet HW given timestamp (last received beacon) */
CL_POOL_ID pClPool; /* Pointer to cluster pool for END use */
M_CL_CONFIG mClBlkConfig; /* mbuf config table */
CL_DESC clDescTbl; /* Cluster description table */
/* Contains the MUX function table */
NET_FUNCS dot11EndFuncTable;
/* Timer IDs for the statistics rate timers */
int oneSecTimer;
int sixteenSecTimer;
#ifdef VXBUS
DOT11_DEFAULT_CONFIG* config; /* Default configuration */
/* SME types declared here so that the configlettes / cmd line can
include or exclude them at will */
STATUS (*essInit)(DOT11_FW*);
STATUS (*ibssInit)(DOT11_FW*);
STATUS (*apInit)(DOT11_FW*);
STATUS (*rsnInit)(DOT11_FW*);
#endif
#ifndef VXBUS
/* A pointer to the BSP info structure passed in the initString */
DOT11_BSP_INFO * pBsp;
#endif
/* Dot11 spinlock for the ISR and interrupt sensitive task */
spinlockIsr_t isrLock;
spinlockTask_t tasLock;
}; /* No typedef since it had to be forward declared. See DOT11_FW above*/
typedef struct
{
void (*sysUsDelay) (int);
STATUS (*cacheInval) (void *, UINT32);
STATUS (*cacheFlush) (void *, UINT32);
UINT32 (*physToVirt) (UINT32);
UINT32 (*virtToPhys) (UINT32);
#ifndef VXBUS
void (*sysIntConnect) (int vector, int func,
int params, STATUS *result);
void (*sysIntDisconnect) (int vector, int func,
int params, STATUS *result);
void (*sysIntEnable) (INT32, STATUS *);
void (*sysIntDisable) (INT32, STATUS *);
#endif
/* Declare the SME init functions here, so that there are no hard links
for when we want to run them */
STATUS (*essInit)(DOT11_FW * pDot11);
STATUS (*ibssInit)(DOT11_FW * pDot11);
STATUS (*apInit)(DOT11_FW * pDot11);
STATUS (*rsnInit)(DOT11_FW * pDot11);
void (*dmaMemFree)(UINT32);
#ifdef VXBUS
DOT11_DEFAULT_CONFIG *sysDot11WlanCfg;
#endif
} DOT11_BSP_FUNCS;
IMPORT DOT11_BSP_FUNCS dot11BspFuncs;
/*################################################################*/
/* These are internal IOCTL calls that are only callable from within the
kernel */
/*################################################################*/
typedef struct
{
INT32 status; /* Port status */
UINT8 macAddr[6]; /* mac address of the port */
} _WRS_PACK_ALIGN(1) DOT11_DOT1X_PORTSTATUS;
typedef struct param_s
{
UINT32 callback; /* Callback event handler */
UINT32 cookie; /* private data */
} _WRS_PACK_ALIGN(1) DOT11_DOT1X_PARAMS;
typedef struct dot1xIntegration
{
UINT8 * pSuppAddr;
int cmd;
caddr_t data;
} DOT11_DOT1X_INT;
/* Capability Information Field */
#define DOT11_CAP_ESS 0x0001 /* d11 cap. ESS */
#define DOT11_CAP_IBSS 0x0002 /* d11 cap. IBSS */
#define DOT11_CAP_PRIVACY 0x0010 /* d11 cap. privacy */
/* Give dot1x port status change callback */
#define WIOCSDOT1XPORTSTATUS _IOW('x', 0x01, DOT11_DOT1X_PORTSTATUS)
/* Register authentication callback FUNCPTR */
#define WIOCSAUTHCALLBACK _IOW('x', 0x02, DOT11_DOT1X_PARAMS)
/* <Internal> Set the PMK */
#define WIOCSPMK _IOWU('x', 0x03, DOT11_PMK)
/* <Internal> 802.1X Integration IOCTL */
#define WIOCDOT1XINT _IOWR('x', 0x04, DOT11_DOT1X_INT)
/*
* LEGACY IOCTL DEFINITIONS
*/
#ifndef EIOCSWEPTYPE
#define EIOCSWEPTYPE (0x21d) /* Set WEP type - 64 bit or 128 bit */
#endif
#ifndef EIOCGWEPSTATUS
#define EIOCGWEPSTATUS (0x20f) /* Get WEP status*/
#endif
#ifndef EIOCSWEP
#define EIOCSWEP (0x210) /* Enable/disable WEP*/
#endif
#ifndef EIOCSWEPKEY0
#define EIOCSWEPKEY0 (0x211) /* Set WEP key 0*/
#endif
#ifndef EIOCSWEPKEY1
#define EIOCSWEPKEY1 (0x212) /* Set WEP key 1*/
#endif
#ifndef EIOCSWEPKEY2
#define EIOCSWEPKEY2 (0x213) /* Set WEP key 2*/
#endif
#ifndef EIOCSWEPKEY3
#define EIOCSWEPKEY3 (0x214) /* Set WEP key 3*/
#endif
#ifndef EIOCSWEPDEFAULTKEY
#define EIOCSWEPDEFAULTKEY (0x215) /* Set WEP key 3*/
#endif
#ifndef EIOCSAUTHCALLBACK
#define EIOCSAUTHCALLBACK (0x24B) /* Register authentication callback */
#endif
#ifndef EIOCS802DOT1XMODE
#define EIOCS802DOT1XMODE (0x24C) /* Set 802.1x mode */
#endif
#ifndef EIOCG802DOT1XMODE
#define EIOCG802DOT1XMODE (0x24D) /* Get 802.1x mode status */
#endif
#ifndef EIOCGCONNECTEDBSSID
#define EIOCGCONNECTEDBSSID (0x220) /* Get BSSID */
#endif
#ifndef EIOCSAUTHCALLBACK
#define EIOCSAUTHCALLBACK (0x24B) /* Get BSSID */
#endif
#ifdef VXBUS
/***************************************************************************
* The following default wireless network settings are used for command-line
* builds if they are not updated by the corresponding ioctl() routines at
* run time. Note that any settings made in the Project Facility will
* override the settings here. These settings provide the minimum
* functionality required to enable a wireless network connection and do
* not include security, power management, or other advanced mode settings.
***************************************************************************/
/*
* Default Network Name (also called the SSID, BSS Name or ESS Name).
* Maximum length is DOT11_SSID_LEN as defined in dot11Lib.h. Some
* examples are:
*
* NULL (ESS/IBSS/AP modes: deny all connections)
* "" (ESS mode only: connect to first discovered AP)
* "myNetwork" (ESS mode: connect to AP named "myNetwork" only)
* (AP/IBSS mode: allow network connections named "myNetwork")
*/
#ifndef AR521X_DEFAULT_SSID
#define AR521X_DEFAULT_SSID NULL
#endif
/*
* Default Wireless Mode. Select from the following options as defined in
* dot11Lib.h:
*
* DOT11_MODE_NONE (disabled)
* DOT11_MODE_ESS (enable ESS or 'station' mode)
* DOT11_MODE_IBSS (enable IBSS or 'ad-hoc' mode)
* DOT11_MODE_AP (enable Access Point mode)
*/
#ifndef AR521X_DEFAULT_MODE
#define AR521X_DEFAULT_MODE DOT11_MODE_NONE
#endif
/*
* Default Radio Type. Select from the following options as defined in
* dot11Lib.h:
* DOT11_RADIO_11a (802.11a, 5.3 GHz, 54 Mbit/sec max.)
* DOT11_RADIO_11b (802.11b, 2.4 GHz, 11 Mbit/sec max.)
* DOT11_RADIO_11g (802.11g, 2.4 GHz, 54 Mbit/sec max.)
* DOT11_RADIO_ANY (ESS mode only - search for SSID on all radios)
*/
#ifndef AR521X_DEFAULT_RADIO
#define AR521X_DEFAULT_RADIO DOT11_RADIO_ANY
#endif
/*
* Default radio channel, used in IBSS and AP modes only. This parameter
* is ignored in ESS (Station) mode as the station will perform a channel
* scan to find a matching SSID. IEEE channel number designations are
* used as described in Section 17.3.8.3.3 (802.11a channels) and Section
* 18.4.6.2 (802.11b/g channels) of the IEEE 802.11-2003 standard.
* Allowable channels are country-specific. Allowable values for North
* America are:
*
* 802.11b/g: channels 1-11 (2.4 GHz)
* 802.11a: channels 36,40,44,48 (5.2 GHz)
* channels 52,56,60,64 (5.3 GHz)
* channels 149,153,157,161 (5.8 GHz)
*/
#ifndef AR521X_DEFAULT_CHANNEL
#define AR521X_DEFAULT_CHANNEL 11
#endif
/*
* Default country code. This affects the list of channels, modes and rates
* that are allowed. If you want an AP to advertise the country it is in to
* allow stations in 802.11d mode to connect, or you wish to make a ESS or
* IBSS that uses 802.11d to determine the country instead of using this
* definition, turn 802.11d on with WIOCS80211D
*
*/
#ifndef AR521X_DEFAULT_COUNTRY
#define AR521X_DEFAULT_COUNTRY DOT11_COUNTRY_UNITED_STATES
#endif
/*
* The default Pre Shared Key value. This is the value used if 802.11i or
* WPA is set to use Pre-Shared Key as the authentication method. The PSK
* should be a 256 bit (63 byte) value.
*
*/
#ifndef AR521X_AUTH_PSK_KEY
#define AR521X_AUTH_PSK_KEY "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
#endif
#ifdef INCLUDE_AR521X_AUTH_PSK_PASSPHRASE
# ifndef AR521X_AUTH_PSK_PASSPHRASE
# define AR521X_AUTH_PSK_PASSPHRASE "Wind River Wireless Security 2.0"
# endif /* AR521X_AUTH_PSK_PASSPHRASE */
#else /* INCLUDE_AR521X_AUTH_PSK_PASSPHRASE */
# ifndef AR521X_AUTH_PSK_PASSPHRASE
# define AR521X_AUTH_PSK_PASSPHRASE NULL
# endif /* AR521X_AUTH_PSK_PASSPHRASE */
#endif /* INCLUDE_AR521X_AUTH_PSK_PASSPHRASE */
/* End of default wireless network settings */
/* Device Driver macros that are used to flag various error conditions */
#define DOT11_BUS_MEM_SIZE (0x10000) /* 64KB */
#define DOT11_BSP_VERSION DOT11_BSP_INFO_VER_0
#define DOT11_BSP_FUNC_NOT_SUPPORTED NULL
#define DOT11_BSP_PTR_PARAM_NOT_SUPPORTED NULL
#define DOT11_BSP_PARAM_NOT_SUPPORTED 0
#define DOT11_BSP_CPU_TO_BUS_DEFAULT 0
/* end hfc */
#endif VXBUS
/*
* Public prototypes
*/
/* Initialization functions */
#ifdef VXBUS
void ar52Register(void);
#endif
END_OBJ * dot11EndLoad(char * initString, void * pBSP);
#ifdef VXBUS
STATUS dot11HddInit(VXB_DEVICE_ID wlsDev);
STATUS dot11SmeInit(VXB_DEVICE_ID wlsDev);
#else
STATUS dot11HddInit(DOT11_FW * pDot11);
STATUS dot11SmeInit(DOT11_FW * pDot11);
#endif
STATUS dot11DpeInit(DOT11_FW * pDot11);
STATUS dot11RsnInit(DOT11_FW * pDot11);
INT32 dot11DebugLevelGet(int area);
STATUS dot11DebugLevelSet(int area, int level);
IMPORT void dot11BcopySwap(const char * src, char * dst, int length );
DOT11_BSS * dot11SmeBssidToBss(DOT11_FW * pDot11, UINT8 * bssid);
IMPORT INT32 sysClkRateGet();
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __INCdot11Libh */