📄 wlan_ccx.c
字号:
/** @file wlan_ccx.c * @brief This file contains data structures and functions * for CCX standard * * Copyright (c) Marvell Semiconductor, Inc., 2003-2005 *//*********************************************************Change log: 09/27/05: add comments for Doxygen*********************************************************/#ifdef CCX#include "precomp.h"#include "wlan_ccx.h"// For WinCE +++#define u8 UCHAR#define s8 char#define u16 USHORT#define WLAN_STATUS_SUCCESS (0)#define cpu_to_le16(x) x// For WinCE ---#pragma pack(1)// wlan_types.h +++/** Local Power Capability */typedef struct _MrvlIEtypes_PowerCapability_t { MrvlIEtypesHeader_t Header; s8 MinPower; s8 MaxPower;} MrvlIEtypes_PowerCapability_t;// wlan_types.h ---/** OUI Types encoded in the CCX Vendor specific IE. */typedef enum{ CCX_OUI_TYPE_VERSION = 0x03, CCX_OUI_TYPE_QOS_PARAM = 0x04,} CCX_OUI_Type_t;/** CCX IE types that are checked for in BSS descriptions returned in scans. */typedef enum{ CCX_IE_VERSION = VENDOR_SPECIFIC_221, CCX_IE_CELL_POWER_LIMIT = 0x96, CCX_IE_AIRONET = 133,} CCX_IE_Id_t;/** Generic IE Structure containing an OUI and oui type used to encapsulate * CCX Proprietary elements. */typedef struct _CCX_IE_OUT_Hdr{ u8 elemId; u8 len; u8 oui[3]; u8 ouiType;} CCX_IE_OUI_Hdr_t; /** CCX Version IE * Received in beacons/probe responses and sent out in (Re)Assocation * requests as a vendor specific 221 element with the OUI set to 0x004096 * and the ouiType set to 0x03. * One octet specifying the major CCX Version supported. */ typedef struct{ CCX_IE_OUI_Hdr_t ouiHdr; u8 version;} CCX_IE_Version_t;typedef struct{ CCX_IE_OUI_Hdr_t ouiHdr; u8 cwMin[2]; u8 cwMax[2]; u8 flags[2]; u8 apName[16]; u8 clients; u8 value[3];} CCX_IE_AIRONET_t;/** CCX Cell Power Limit IE * Received in beacon and probe responses (scans) with a Element ID of 0x96 * with the OUI set to 0x004096 and the ouiType set to 0x00. * One octet containing the maximum transmit power for the STA */typedef struct{ CCX_IE_OUI_Hdr_t ouiHdr; u8 maxPower; u8 reserved;} CCX_IE_Cell_Power_Limit_t;///crlo:fastroam ++///This is the header our firmware is using to generate our own packet which is not from TCP/IP stacktypedef struct _MRVPKT_DESC { UCHAR dstAddr[MRVDRV_ETH_ADDR_LEN]; UCHAR srcAddr[MRVDRV_ETH_ADDR_LEN]; UCHAR protocolLen[2]; // protocol Length set to 0 can set SNAP} MRVPKTDESC, *PMRVPKTDESC;/// /* almost a macro, inline function instead *//* convert big endian bytes pointed to by pSrc to native UINT16 */_inline static OS_UINT16 GetBigEndian(OS_UINT8 *pSrc) { OS_UINT16 dest; dest = pSrc[0]; dest = (dest << 8) + pSrc[1]; return dest;}/* ** The following struct is used by STA to send previous AP info to new AP with** a single member in the imList field as well as messages from the AP with up ** to 30 AP in teh imList field.*/typedef struct _CCX_IAPP_HEADER_ /// header of IAPP message{ OS_UINT16 Length; /// Big endian length, including this field OS_UINT8 Type; OS_UINT8 Func_SubType; NDIS_802_11_MAC_ADDRESS imDest; /// unicast destination NDIS_802_11_MAC_ADDRESS imSrc; /// source address /// [list follows here]} CCX_IAPP_HEADER,*PCCX_IAPP_HEADER;typedef struct _CCX_DDPINFO_CONTENT_{ OS_UINT16 imTag; /// 0x009b OS_UINT16 imIELength; /// Big endian length, including this field OS_UINT8 imIEOUI[4]; /// 00 40 96 00 NDIS_802_11_MAC_ADDRESS imPreAPMac; /// mac Addr of the previous AP OS_UINT16 imChannel; /// Channel of the previous AP OS_UINT16 imSSIDLength; BYTE ssid[32]; OS_UINT16 disassocTime; ///Disconnected period} CCX_DDPINFO_CONTENT,*PCCX_DDPINF_CONTENT;typedef struct _CCX_IAPP_FRAME_{ CCX_IAPP_HEADER iappHdr; /// Type defined as 0x30 /// SubType defined as 0x00 CCX_DDPINFO_CONTENT Content;} CCX_DDPINFO, *PCCX_DDPINFO;////// [S36] Radio Measurement////// Data structure of Beacon measurement report///typedef struct _CCX_BEACON_MEASURE_REPORT_ { OS_UINT8 ChannelNumber; OS_UINT8 Spare; /* unused */ OS_UINT16 MeasureDuration; OS_UINT8 PhyType; OS_UINT8 RcvSignalPower; OS_UINT8 BSSID[6]; OS_UINT32 ParentTSF; OS_UINT8 TargetTSF[8]; OS_UINT16 BeaconInterval; OS_UINT16 CapabilityInfo;/// OS_UINT8 RcvElements[1]; /* variable elements */} CCX_BEACON_MEASURE_REPORT,*PCCX_BEACON_MEASURE_REPORT;/// Header for radio measurement report elementstypedef struct _CCX_MEASURE_REPORT_ELEMENT_ { OS_UINT16 ElementID; /// Element ID 39 OS_UINT16 Length; /// Big endian length, including this field OS_UINT16 MeasureToken; OS_UINT8 MeasureMode; OS_UINT8 MeasureType; // Measure Reports follow (variable length) } CCX_MEASURE_REPORT_ELEMENT,*PCCX_MEASURE_REPORT_ELEMENT;/// Header fo radio measurement request element fieldstypedef struct _CCX_MEASURE_REQ_ELEMENT_ { OS_UINT16 ElementID; /// Element ID 38 OS_UINT16 Length; /// Big endian length, including this field OS_UINT16 MeasureToken; OS_UINT8 MeasureMode; OS_UINT8 MeasureType; CCX_MEASURE_REQUEST MeasureReq[1]; /// Measure Requests follow (variable length)} CCX_MEASURE_REQ_ELEMENT,*PCCX_MEASURE_REQ_ELEMENT;////// Header for radio measurement report message///typedef struct _CCX_MEASURE_REPORT_MSG_ { CCX_IAPP_HEADER iappHdr; /// Type defined as 0x32 /// SubType defined as 0x81 OS_UINT16 dialogToken; /// equal to value in corresponding request frame ///CCX_MEASURE_REPORT_ELEMENT repElement[1]; /// Measure report elements follow (variable)} CCX_MEASURE_REPORT_MSG,*PCCX_MEASURE_REPORT_MSG;////// Header for radio measurement request message///typedef struct _CCX_MEASURE_REQ_MSG_ { CCX_IAPP_HEADER iappHdr; /// Type defined as 0x32 /// SubType defined as 0x01 OS_UINT16 dialogToken; /// nonzero value chosen by STA OS_UINT8 activateDelay; /// # of TBTTs until Measurement Offset field starts OS_UINT8 measureOffset; /// time after activation delay CCX_MEASURE_REQ_ELEMENT reqElement[1]; /// Measure request elements follow (variable)} CCX_MEASURE_REQ_MSG,*PCCX_MEASURE_REQ_MSG;#ifdef CCX_CCKM/// CCKM +++typedef enum{ CCX_CCKM_START = 0, CCX_CCKM_REQUEST, CCX_CCKM_RESULT, CCX_CCKM_COMPLETE} CCX_CCKM_STATES;/// CCKM ---#endif/// Element ID, /// ref: Table S36-4 of CCX specific#define ELEM_MEASURE_REQUEST 38#define ELEM_MEASUR_REPORT 39#define ELEM_AP_TXPOWER 150#define ELEM_RM_CAPABILITY 221/// Radio measurement request element mode/// ref: Figure S36-5#define MEASURE_MODE_REQ_PARALLEL 1 /// 0 - req starts immediately after prev req completed /// 1 = request start as same time as prev req #define MEASURE_MODE_REQ_ENABLE 2 /// 0 - req and report bits are invalid /// 1 - req and report bits are valid#define MEASURE_MODE_REQ_REPORT 4 /// 0 - disable autonomous report or report bit is invalid /// 1 - enable autonomous report/// Measurement types for Measurement request element/// ref: Table S36-6#define MEASURE_REQ_UNUSED 0#define MEASURE_REQ_CHANNEL_LOAD 1#define MEASURE_REQ_NOISE_HIST 2#define MEASURE_REQ_BEACON 3#define MEASURE_REQ_FRAME 4#define MEASURE_REQ_HIDDENNODE 5/// Measurement types for Measurement report element/// ref: Table S36-6#define MEASURE_REP_UNUSED 0#define MEASURE_REP_CHANNEL_LOAD 1#define MEASURE_REP_NOISE_HIST 2#define MEASURE_REP_BEACON 3#define MEASURE_REP_FRAME 4#define MEASURE_REP_HIDDENNODE 5/// Different PHY types for mrpPhyType ( All others are undefined )/// ref: Table 36-9#define PHY_TYPE_FH 1#define PHY_TYPE_DSS 2 ///b, b/g#define PHY_TYPE_UNUSED 3#define PHY_TYPE_OFDM 4 ///a#define PHY_TYPE_HIGH_RATE_DSS 5#define PHY_TYPE_ERP 6 ///g-only///Measure Report Mode/// ref: Table 36-12#define MEASURE_REPORT_MODE_PARALLEL 0x01 // 0 - req starts immediately after prev req completed // 1 = request start as same time as prev req#define MEASURE_REPORT_MODE_INCAPABLE 0x02 // 0 - STA is capable or report is autonomous // 1 - STA is incapable#define MEASURE_REPORT_MODE_REFUSED 0x04 // 0 - STA is not refusing or report is autonomous // 1 - STA is refusing#define CCX_IAPP_TYPE_REPORT_INFORM 0x30 ///Type for information reporting#define CCX_IAPP_TYPE_RADIO_MEASURE 0x32 ///Type for Radio Measurement#define CCX_IAPP_SUBTYPE_REQUEST 0x01#define CCX_IAPP_SUBTYPE_REPORT 0x81///#define CCX_IAPP_FUNCTION 0x00 /* function for above *////#define CCX_TAG_ADJACENT_AP 0x009b /* 16 bites *////crlo:fastroam --typedef struct _ccx_msg_t { UCHAR dstAddr[6]; UCHAR srcAddr[6]; UCHAR protocolLen[2]; // protocol Length set to 0 can set SNAP UCHAR snapHdr[8]; UCHAR length[2]; // UCHAR msgType; // 0x40 UCHAR function; // 0x8e UCHAR apAddr[6]; // MAC address of destination AP UCHAR staAddr[6]; // station MAC addr UCHAR failcode[2]; // failure code UCHAR rogueAddr[6]; // MAC address of Rogue AP UCHAR rogueName[16]; // name of Rogue AP} CCX_MSG_T, *PCCX_MSG_T;#pragma pack()/******************************************************** Local Variables********************************************************//** * Supported version included in CCX Version IE for (Re)Association requests */static u8 ccx_supported_version = 3U;/** * Cisco OUI parsed in Vendor Specific IEs */static u8 cisco_oui[] = { 0x00, 0x40, 0x96 };static u8 aironet_oui[] = { 0x00, 0x01, 0x6d };static ULONG ccx_flags = 0U;static ULONG ccx_EAPstate = 0U;// BSSIDstatic NDIS_802_11_SSID ccxCurSsid;static NDIS_802_11_MAC_ADDRESS ccxCurBSSID;static NDIS_802_11_MAC_ADDRESS ccxStaMac;// Rogue AP#define CCX_ROGUE_AP_COUNT 16static FSW_CCX_ROGUE_AP_DETECTED ccxRogueAP[CCX_ROGUE_AP_COUNT];// packetstatic NDIS_HANDLE ccxPacketPoolHandle;static NDIS_HANDLE ccxBufferPoolHandle;static PNDIS_PACKET pCCXPacket[CCX_ROGUE_AP_COUNT];static PNDIS_BUFFER pCCXBuffer[CCX_ROGUE_AP_COUNT];static PVOID pCCXBufVM[CCX_ROGUE_AP_COUNT];static PNDIS_PACKET pCCXCurPacket = NULL;static NDIS_HANDLE *pMrvDrvAdapterHdl = NULL;static PMRVDRV_ADAPTER pCcxAdapter = NULL;static UCHAR ccxAssociationRequestIE[128];#ifdef CCX_TPCstatic int ifNeedTPC=0;static int ccxTPCMinPower;static int ccxTPCMaxPower;static int ccxTPCUserPower = CCX_TPC_MaxPowerValue;#endif#ifdef CCX_CCKM// CCKMstatic CCX_CCKM_STATES ccxCCKMState = CCX_CCKM_START;static ULONG ccxAssociationRequestIELength;static UCHAR ccxAssociationRequestIE[128];#endif/******************************************************** Global Variables********************************************************//******************************************************** Local Functions********************************************************//** * @brief Append a ccx version ie to the buffer and advance * the buffer pointer by the size of the IE appended. * Return the size appended. * * @param ppBuffer pointer to the buffer pointer * @return number of bytes appended to **ppBuffer */ static int append_ccx_version_ie( u8** ppBuffer ){ CCX_IE_Version_t versionIe; /* Null checks */ if (ppBuffer == 0) return 0; if (*ppBuffer == 0) return 0; /* Setup OUI Header information */ versionIe.ouiHdr.elemId = CCX_IE_VERSION; versionIe.ouiHdr.len = sizeof(CCX_IE_Version_t) - 2; /* -2 for len + id */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -