original files of m241

This commit is contained in:
neelimap
2026-07-30 11:19:44 +05:30
parent 170c2b3f3a
commit afc7070c1f
12254 changed files with 7655111 additions and 0 deletions
+65
View File
@@ -0,0 +1,65 @@
# Top-level Makefile for Wind River Wireless Ethernet driver.
#
# modification history
# --------------------
# 01p,23sep10,hfc remove support of non-Vxbus wifi drivers
# 01o,03sep09,hfc fix for defect WIND00180118
# 01n,16oct08,hfc fix for defect WIND00139230
# 01m,13jul08,pee build only when option is selected. Clean otherwise.
# 01l,10jul08,hfc replace findstring SMP with _WRS_CONFIG_SMP to adopt vsb
# notion
# 01k,27feb08,hfc add support for vxbus/smp and legacy build
# 01j,17oct07,pee using ipcom rules.
# 01i,28jun07,spw Disable SMP builds
# 01h,15aug05,rb Tweak for 2.1.1 release
# 01g,03jun05,dxb Added dot11SmeApLib to doc build
# 01f,30may05,rb Added dot11KslLib.c to docBuild
# 01e,16may05,dxb Updated for Cyclops doc build
# 01d,25aug04,dxb Added DOC_DIR and DOC_CHAPTER
# 01c,17aug04,dxb Moved SNMP check to management directory.
# 01b,14jun04,dxb Removed reference to atheros directory.
# 01a,28apr04,dxb Created.
#
# DESCRIPTION
# This file contains the Makefile rules for building the Wind River
# 802.11a/b/g Wireless Ethernet Driver.
TGT_DIR = $(WIND_BASE)/target
LIB_BASE_NAME = wlanVxbEnd
include $(TGT_DIR)/h/make/defs.library
DOC_FILES = dot11Lib.c dot11KslLib.c dot11SmeApLib.c
ifndef _WRS_CONFIG_COMPONENT_WLAN
all : rclean
endif
# _WRS_CONFIG_IPWLAN_ATHEROS user specific
# _WRS_CONFIG_WLAN_ATH architecture specific
# user selection takes precedence over arch
# as long as arch support it.
ifdef _WRS_CONFIG_IPWLAN_ATHEROS
ifdef _WRS_CONFIG_WLAN_ATH
C_SOURCE = $(wildcard *.c)
OBJS_wlanVxbEnd = $(C_SOURCE:.c=.o)
CFLAGS_LIB_wlanVxbEnd = -DVXBUS
endif
endif
include $(WRVX_COMPBASE)/$(COMP_IPNET2)/osconfig/vxworks/make/defs.ipcom
include $(TGT_DIR)/h/make/rules.library
include $(WRVX_COMPBASE)/$(COMP_IPNET2)/osconfig/vxworks/make/rules.ipcom
DOC_DIR = $(DOCS_ROOT)/vxworks/ref/drv
DOC_CHAPTER = Driver_Libraries
include $(TGT_DIR)/h/make/config/comps/wlan/defs.docs
@@ -0,0 +1,224 @@
/* ar521xConf.c - Implements modular selection of ESS ,AP or IBSS mode for Atheros driver */
/*
* Copyright (c) 2008 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.
*/
#ifndef __INCsysDot11Endh
#define __INCsysDot11Endh
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#define VXBUS
#ifdef VXBUS
#include "drv/wlan/dot11Lib.h"
#include "drv/wlan/dot11Bsp.h"
IMPORT STATUS dot11SmeEssInit(DOT11_FW *);
IMPORT STATUS dot11SmeIbssInit(DOT11_FW *);
IMPORT STATUS dot11SmeApInit(DOT11_FW *);
IMPORT STATUS dot11RsnInit(DOT11_FW *);
IMPORT DOT11_BSP_FUNCS dot11BspFuncs;
/*
* Select which wireless component(s) to include in the command line BSP
* build. Note that any component selections in the Project Facility will
* override the settings here.
*/
#ifndef PRJ_BUILD
#define INCLUDE_AR521X_END /* include core support (mandatory) */
#define INCLUDE_AR521X_END_ESS /* include ESS (Station) support */
#define INCLUDE_AR521X_END_IBSS /* include IBSS (Ad-hoc) support */
#undef INCLUDE_AR521X_END_AP /* include AP (Access Point) support */
#ifdef INCLUDE_AR521X_END_AP
#ifndef BRIDGE_PORTS /* check for Learning Bridge component */
#warning Access Point requires the Learning Bridge component.
#endif /* BRIDGE_PORTS */
#endif /* INCLUDE_AR521X_END_AP */
#undef INCLUDE_AR521X_SECPOL_TSN
#undef INCLUDE_AR521X_SECPOL_WPA
#undef INCLUDE_AR521X_SECPOL_11i
#undef INCLUDE_AR521X_AUTH_PSK
#undef INCLUDE_AR521X_AUTH_8021X
#undef INCLUDE_AR521X_AUTH_PSK_PASSPHRASE
#undef INCLUDE_AR521X_CIPH_NONE
#undef INCLUDE_AR521X_CIPH_WEP40
#undef INCLUDE_AR521X_CIPH_WEP104
#undef INCLUDE_AR521X_CIPH_TKIP
#undef INCLUDE_AR521X_CIPH_AES
#endif /* PRJ_BUILD */
/* The IDE defines PSK-passphrase as a different type. Convert it */
#ifdef INCLUDE_AR521X_AUTH_PSK_PASSPHRASE
#define INCLUDE_AR521X_AUTH_PSK
#endif
/* Enforce these dependencies on both project and non-project builds, since
there is no way to do this in the IDE */
#if ((defined(INCLUDE_AR521X_CIPH_TKIP) || defined(INCLUDE_AR521X_CIPH_AES)) && \
(!(defined(INCLUDE_AR521X_SECPOL_11i) || (defined(INCLUDE_AR521X_SECPOL_WPA)))))
#error TKIP Cipher type requires 802.11i or WPA to be allowed
#endif
#if ((defined INCLUDE_AR521X_CIPH_WEP40) || \
(defined INCLUDE_AR521X_CIPH_WEP104))&&(!defined(INCLUDE_AR521X_SECPOL_TSN))
#error Cipher types WEP40 and WEP104 require a security policy of TSN to be allowed
#endif
/* Ensure that TSN is only selected with another security poicy */
#if ((defined(INCLUDE_AR521X_SECPOL_TSN)) && \
(!(defined(INCLUDE_AR521X_SECPOL_WPA) || \
defined(INCLUDE_AR521X_SECPOL_11i))))
#error The 802.11 TSN security policy must be defined in combination with either WPA and/or 802.11i
#endif
/* Ensure that if any cipher types or authentication types are selected, at
least one security policy is selected */
#if (((defined INCLUDE_AR521X_CIPH_WEP40) || \
(defined INCLUDE_AR521X_CIPH_WEP104) || \
(defined INCLUDE_AR521X_CIPH_TKIP) || \
(defined INCLUDE_AR521X_CIPH_AES) || \
(defined INCLUDE_AR521X_AUTH_PSK) || \
(defined INCLUDE_AR521X_AUTH_8021X)) && \
(!(defined(INCLUDE_AR521X_SECPOL_WPA) || \
defined(INCLUDE_AR521X_SECPOL_11i))))
#error In order to select an 802.11 Cipher or Authentication policy, you must select an 802.11 Security Policy
#endif
/* Ensure that if any security policy or authentication types are selected, at
least one cipher policy is selected */
#if ((defined(INCLUDE_AR521X_SECPOL_WPA) || \
defined(INCLUDE_AR521X_SECPOL_11i) || \
(defined INCLUDE_AR521X_AUTH_PSK) || \
(defined INCLUDE_AR521X_AUTH_8021X)) && \
(!((defined INCLUDE_AR521X_CIPH_WEP40) || \
(defined INCLUDE_AR521X_CIPH_WEP104) || \
(defined INCLUDE_AR521X_CIPH_TKIP) || \
(defined INCLUDE_AR521X_CIPH_AES))))
#error In order to select an 802.11 Cipher Policy or Authentication policy, you must select an 802.11 Security Policy
#endif
/* Ensure that if any cipher types or security policies are selected, at
least one authentication type is selected */
#if (((defined INCLUDE_AR521X_CIPH_WEP40) || \
(defined INCLUDE_AR521X_CIPH_WEP104) || \
(defined INCLUDE_AR521X_CIPH_TKIP) || \
(defined INCLUDE_AR521X_CIPH_AES) || \
(defined INCLUDE_AR521X_SECPOL_WPA) ||\
(defined INCLUDE_AR521X_SECPOL_11i)) && \
(!((defined INCLUDE_AR521X_AUTH_PSK) || \
(defined INCLUDE_AR521X_AUTH_8021X))))
#error In order to select an 802.11 Cipher or Security Policy, you must select an 802.11 Authentication Policy
#endif
/* Default WLAN configuration parameters */
LOCAL DOT11_DEFAULT_CONFIG sysDot11WlanCfg =
{
/* Network Name (also called the SSID, BSS Name or ESS Name) */
AR521X_DEFAULT_SSID,
/* Wireless Mode - STA, IBSS or AP mode */
AR521X_DEFAULT_MODE,
/* Radio Type - 802.11a, 802.11b, 802.11g or other modes */
AR521X_DEFAULT_RADIO,
/* Default Channel - used for IBSS and AP modes only */
AR521X_DEFAULT_CHANNEL,
/* Default Country - used for IBSS and AP modes only */
AR521X_DEFAULT_COUNTRY,
0,
0,
0,
AR521X_AUTH_PSK_KEY
};
void ar52xConf(void)
{
/* Fill in the rest of sysDot11WlanCfg that couldn't be configured above */
sysDot11WlanCfg.secPol = 0;
dot11BspFuncs.rsnInit = NULL;
#ifdef INCLUDE_AR521X_SECPOL_TSN
sysDot11WlanCfg.secPol |= DOT11_SECPOL_TSN;
dot11BspFuncs.rsnInit = dot11RsnInit;
#endif
#ifdef INCLUDE_AR521X_SECPOL_WPA
sysDot11WlanCfg.secPol |= DOT11_SECPOL_WPA;
dot11BspFuncs.rsnInit = dot11RsnInit;
#endif
#ifdef INCLUDE_AR521X_SECPOL_11i
sysDot11WlanCfg.secPol |= DOT11_SECPOL_11i;
dot11BspFuncs.rsnInit = dot11RsnInit;
#endif
sysDot11WlanCfg.authPol = DOT11_AUTHPOL_NONE;
sysDot11WlanCfg.rsnPassphrase = NULL;
#ifdef INCLUDE_AR521X_AUTH_8021X
sysDot11WlanCfg.authPol |= DOT11_AUTHPOL_8021X;
#endif
#if defined(INCLUDE_AR521X_AUTH_PSK)
sysDot11WlanCfg.authPol |= DOT11_AUTHPOL_PSK;
sysDot11WlanCfg.rsnPassphrase = NULL;
#endif
#if defined(INCLUDE_AR521X_AUTH_PSK_PASSPHRASE)
sysDot11WlanCfg.authPol |= DOT11_AUTHPOL_PSK;
sysDot11WlanCfg.rsnPassphrase = AR521X_AUTH_PSK_PASSPHRASE;
#endif
sysDot11WlanCfg.ciphPol = 0;
#ifdef INCLUDE_AR521X_CIPH_WEP40
sysDot11WlanCfg.ciphPol |= DOT11_CIPHPOL_WEP40;
#endif
#ifdef INCLUDE_AR521X_CIPH_WEP104
sysDot11WlanCfg.ciphPol |= DOT11_CIPHPOL_WEP104;
#endif
#ifdef INCLUDE_AR521X_CIPH_TKIP
sysDot11WlanCfg.ciphPol |= DOT11_CIPHPOL_TKIP;
#endif
#ifdef INCLUDE_AR521X_CIPH_AES
sysDot11WlanCfg.ciphPol |= DOT11_CIPHPOL_AES;
#endif
/* These definitions bring in the SME modules, if selected */
#ifdef INCLUDE_AR521X_END_ESS
dot11BspFuncs.essInit = dot11SmeEssInit;
#endif
#ifdef INCLUDE_AR521X_END_IBSS
dot11BspFuncs.ibssInit = dot11SmeIbssInit;
#endif
#ifdef INCLUDE_AR521X_END_AP
dot11BspFuncs.apInit = dot11SmeApInit;
#endif
dot11BspFuncs.sysDot11WlanCfg= &sysDot11WlanCfg;
/*register the device with vxBus*/
ar52Register();
}
#endif /* VXBUS */
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __INCsysDot11Endh */
@@ -0,0 +1,96 @@
# Makefile for Atheros AR521x Code Module
#
# modification history
# --------------------
# 01q,23sep10,hfc remove support of non-Vxbus wifi drivers
# 01p,03sep09,hfc fix for defect WIND00180118
# 01o,16oct08,hfc fix for defect WIND00139230
# 01n,15sep08,hfc Fix for defect WIND00132682
# 01m,19aug08,mze TOOL changes
# 01l,11jul08,hfc add PRECOM support for VSB build
# 01k,10jul08,hfc replace findstring SMP with _WRS_CONFIG_SMP to adopt vsb
# notion
# 01j,27feb08,hfc add support for vxbus/smp and legacy build
# 01i,27jun07,spw Disable SMP builds
# 01h,01apr05,rb Removed diab compilation protection
# 01g,24aug04,dxb Removed export parameter
# 01f,23aug04,dxb Added override directive
# 01e,27jul04,dxb fix typo
# 01d,27jul04,dxb override -ansi to allow c++ comment headers for GNU 3.3
# 01c,21jul04,eja Change BIG_ENDIAN to A_BIG_ENDIAN to resolve PCD little
# endian issue
# 01b,06may04,dxb Added additional include paths and gnu-only compile
# 01a,28apr04,dxb Created.
#
# DESCRIPTION
# This file contains the Makefile rules for building the Atheros AR521x
# 802.11a/b/g HAL (Hardware Interface Layer) proprietary code module
TGT_DIR = $(WIND_BASE)/target
LIB_BASE_NAME = ar521xVxbEnd
include $(TGT_DIR)/h/make/defs.library
ifndef _WRS_CONFIG_WLAN_ATH
all : rclean
endif
ifdef _WRS_CONFIG_IPWLAN_ATHEROS
C_SOURCE = ar52Lib.c halfake.c
AR_DIR = $(TGT_DIR)/src/drv/wlan/atheros_ar521x
OBJS_PRECOMP_ar521xVxbEnd = $(C_SOURCE:.c=.o)
CFLAGS_LIB_ar521xVxbEnd = -DVXBUS
endif
SUBDIRS =
# Extra include paths required by Atheros code
EXTRA_INCLUDE= -I. -I$(AR_DIR) -I$(AR_DIR)/hal -I$(AR_DIR)/include \
-I$(AR_DIR)/include/diags
include $(TGT_DIR)/h/make/rules.library
# Override -ansi compiler flag to allow C++ style comments
CC_COMPILER =
# Extra C flags required by Atheros code
override ADDED_CFLAGS += -DVXWORKS -DVXWORKS55 -DBUILD_AR5211 \
-DBUILD_AR5212 -DPCI_INTERFACE -DBUILD_AP -DDEBUG
# Need manual endian determination for Atheros code. Atheros should use the
# _BYTE_ORDER macro so we don't have to re-create the functionality here
ifeq ($(BUILD_ENDIAN_SUFFIX),be)
override ADDED_CFLAGS += -DA_BIG_ENDIAN
else
ifeq ($(BUILD_ENDIAN_SUFFIX),le)
else
# at this point, we've established that the endianness is not specified in
# the TOOL variable, so move to defaults based on CPU_FAMILY
ifeq ($(VX_CPU_FAMILY),arm)
endif
ifeq ($(VX_CPU_FAMILY),mips)
override ADDED_CFLAGS += -DA_BIG_ENDIAN
endif
ifeq ($(VX_CPU_FAMILY),ppc)
override ADDED_CFLAGS += -DA_BIG_ENDIAN
endif
ifeq ($(VX_CPU_FAMILY),sh)
override ADDED_CFLAGS += -DA_BIG_ENDIAN
endif
ifeq ($(VX_CPU_FAMILY),pentium)
endif
endif
endif
@@ -0,0 +1,95 @@
# Makefile for Atheros AR521x Code Module
#
# modification history
# --------------------
# 01p,23sep10,hfc remove support of non-Vxbus atheros driver
# 01o,03sep09,hfc fix for defect WIND00180118
# 01n,15sep08,hfc Fix for defect WIND00132682
# 01m,19aug08,mze TOOL changes
# 01l,11jul08,hfc add PRECOM support for VSB build
# 01k,10jul08,hfc replace findstring SMP with _WRS_CONFIG_SMP to adopt vsb
# notion
# 01j,27feb08,hfc add support for vxbus/smp and legacy build
# 01i,27jun07,spw Disable SMP builds
# 01h,01apr05,rb Removed diab compilation protection
# 01g,24aug04,dxb Removed export parameter
# 01f,23aug04,dxb Added override directive
# 01e,27jul04,dxb fix typo
# 01d,27jul04,dxb override -ansi to allow c++ comment headers for GNU 3.3
# 01c,21jul04,eja Change BIG_ENDIAN to A_BIG_ENDIAN to resolve PCD little
# endian issue
# 01b,06may04,dxb Added additional include paths and gnu-only compile
# 01a,28apr04,dxb Created.
#
# DESCRIPTION
# This file contains the Makefile rules for building the Atheros AR521x
# 802.11a/b/g HAL (Hardware Interface Layer) proprietary code module
TGT_DIR = $(WIND_BASE)/target
LIB_BASE_NAME = ar521xVxbEnd
include $(TGT_DIR)/h/make/defs.library
ifndef _WRS_CONFIG_WLAN_ATH
all : rclean
endif
ifdef _WRS_CONFIG_IPWLAN_ATHEROS
AR_DIR = $(TGT_DIR)/src/drv/wlan/atheros_ar521x
C_SOURCE = apmem.c desc.c display.c frameutil.c pktlog.c radardet.c vxbufs.c \
wlanbeacon.c wlanchannel.c wlanglobal.c wlanPhy.c wlanSend.c
OBJS_PRECOMP_ar521xVxbEnd = $(C_SOURCE:.c=.o)
CFLAGS_LIB_ar521xVxbEnd = -DVXBUS
endif
SUBDIRS =
# Extra include paths required by Atheros code
EXTRA_INCLUDE= -I. -I$(AR_DIR) -I$(AR_DIR)/hal -I$(AR_DIR)/include \
-I$(AR_DIR)/include/diags
include $(TGT_DIR)/h/make/rules.library
# Override -ansi compiler flag to allow C++ style comments
CC_COMPILER =
# Extra C flags required by Atheros code
override ADDED_CFLAGS += -DVXWORKS -DVXWORKS55 -DBUILD_AR5211 \
-DBUILD_AR5212 -DPCI_INTERFACE -DBUILD_AP -DDEBUG
# Need manual endian determination for Atheros code. Atheros should use the
# _BYTE_ORDER macro so we don't have to re-create the functionality here
ifeq ($(BUILD_ENDIAN_SUFFIX),be)
override ADDED_CFLAGS += -DA_BIG_ENDIAN
else
ifeq ($(BUILD_ENDIAN_SUFFIX),le)
else
# at this point, we've established that the endianness is not specified in
# the TOOL variable, so move to defaults based on CPU_FAMILY
ifeq ($(VX_CPU_FAMILY),arm)
endif
ifeq ($(VX_CPU_FAMILY),mips)
override ADDED_CFLAGS += -DA_BIG_ENDIAN
endif
ifeq ($(VX_CPU_FAMILY),ppc)
override ADDED_CFLAGS += -DA_BIG_ENDIAN
endif
ifeq ($(VX_CPU_FAMILY),sh)
override ADDED_CFLAGS += -DA_BIG_ENDIAN
endif
ifeq ($(VX_CPU_FAMILY),pentium)
endif
endif
endif
@@ -0,0 +1,93 @@
# Makefile for Atheros AR521x Code Module
#
# modification history
# --------------------
# 01p,23sep10,hfc remove support of non-Vxbus atheros driver
# 01o,03sep09,hfc fix for defect WIND00180118
# 01n,15sep08,hfc Fix for defect WIND00132682
# 01m,19aug08,mze TOOL changes
# 01l,11jul08,hfc add PRECOM support for VSB build
# 01k,10jul08,hfc replace findstring SMP with _WRS_CONFIG_SMP to adopt vsb
# notion
# 01j,27feb08,hfc add support for vxbus/smp and legacy build
# 01i,28jun07,spw Disable SMP builds
# 01h,01apr05,rb Removed diab compilation protection
# 01g,24aug04,dxb Removed export parameter
# 01f,23aug04,dxb Added override directive
# 01e,27jul04,dxb fix typo
# 01d,27jul04,dxb override -ansi to allow c++ comment headers for GNU 3.3
# 01c,21jul04,eja Change BIG_ENDIAN to A_BIG_ENDIAN to resolve PCD little
# endian issue
# 01b,06may04,dxb Added additional include paths and gnu-only compile
# 01a,28apr04,dxb Created.
#
# DESCRIPTION
# This file contains the Makefile rules for building the Atheros AR521x
# 802.11a/b/g HAL (Hardware Interface Layer) proprietary code module
TGT_DIR = $(WIND_BASE)/target
LIB_BASE_NAME = ar521xVxbEnd
include $(TGT_DIR)/h/make/defs.library
ifndef _WRS_CONFIG_WLAN_ATH
all : rclean
endif
ifdef _WRS_CONFIG_IPWLAN_ATHEROS
AR_DIR = $(TGT_DIR)/src/drv/wlan/atheros_ar521x
C_SOURCE = halAttach.c halBeacon.c halInterrupts.c halKeyCache.c halMisc.c halPower.c \
halReceive.c halReset.c halTransmit.c halUtil.c
OBJS_PRECOMP_ar521xVxbEnd = $(C_SOURCE:.c=.o)
CFLAGS_LIB_ar521xVxbEnd = -DVXBUS
endif
SUBDIRS =
# Extra include paths required by Atheros code
EXTRA_INCLUDE= -I. -I$(AR_DIR) -I$(AR_DIR)/hal -I$(AR_DIR)/include \
-I$(AR_DIR)/include/diags
include $(TGT_DIR)/h/make/rules.library
# Override -ansi compiler flag to allow C++ style comments
CC_COMPILER =
# Extra C flags required by Atheros code
override ADDED_CFLAGS += -DVXWORKS -DVXWORKS55 -DBUILD_AR5211 \
-DBUILD_AR5212 -DPCI_INTERFACE -DBUILD_AP -DDEBUG
# Need manual endian determination for Atheros code. Atheros should use the
# _BYTE_ORDER macro so we don't have to re-create the functionality here
ifeq ($(BUILD_ENDIAN_SUFFIX),be)
override ADDED_CFLAGS += -DA_BIG_ENDIAN
else
ifeq ($(BUILD_ENDIAN_SUFFIX),le)
else
# at this point, we've established that the endianness is not specified in
# the TOOL variable, so move to defaults based on CPU_FAMILY
ifeq ($(VX_CPU_FAMILY),arm)
endif
ifeq ($(VX_CPU_FAMILY),mips)
override ADDED_CFLAGS += -DA_BIG_ENDIAN
endif
ifeq ($(VX_CPU_FAMILY),ppc)
override ADDED_CFLAGS += -DA_BIG_ENDIAN
endif
ifeq ($(VX_CPU_FAMILY),sh)
override ADDED_CFLAGS += -DA_BIG_ENDIAN
endif
ifeq ($(VX_CPU_FAMILY),pentium)
endif
endif
endif
@@ -0,0 +1,95 @@
# Makefile for Atheros AR521x Code Module
#
# modification history
# --------------------
# 01p,23sep10,hfc remove support of non-Vxbus atheros driver
# 01o,03sep09,hfc fix for defect WIND00180118
# 01n,15sep08,hfc Fix for defect WIND00132682
# 01m,19aug08,mze TOOL changes
# 01l,11jul08,hfc add PRECOM support for VSB build
# 01k,10jul08,hfc replace findstring SMP with _WRS_CONFIG_SMP to adopt vsb
# notion
# 01j,27feb08,hfc add support for vxbus/smp and legacy build
# 01i,28jun07,spw Disable SMP builds
# 01h,01apr05,rb Removed diab compilation protection
# 01g,24aug04,dxb Removed export parameter
# 01f,23aug04,dxb Added override directive
# 01e,27jul04,dxb fix typo
# 01d,27jul04,dxb override -ansi to allow c++ comment headers for GNU 3.3
# 01c,21jul04,eja Change BIG_ENDIAN to A_BIG_ENDIAN to resolve PCD little
# endian issue
# 01b,06may04,dxb Added additional include paths and gnu-only compile
# 01a,28apr04,dxb Created.
#
# DESCRIPTION
# This file contains the Makefile rules for building the Atheros AR521x
# 802.11a/b/g HAL (Hardware Interface Layer) proprietary code module
TGT_DIR = $(WIND_BASE)/target
LIB_BASE_NAME = ar521xVxbEnd
include $(TGT_DIR)/h/make/defs.library
ifndef _WRS_CONFIG_WLAN_ATH
all : rclean
endif
ifdef _WRS_CONFIG_IPWLAN_ATHEROS
AR_DIR = $(TGT_DIR)/src/drv/wlan/atheros_ar521x
C_SOURCE = ar5211Attach.c ar5211Interrupts.c ar5211Misc.c ar5211Power.c ar5211Reset.c \
ar5211Beacon.c ar5211KeyCache.c ar5211Phy.c ar5211Receive.c ar5211Transmit.c
OBJS_PRECOMP_ar521xVxbEnd = $(C_SOURCE:.c=.o)
CFLAGS_LIB_ar521xVxbEnd = -DVXBUS
endif
SUBDIRS =
# Extra include paths required by Atheros code
EXTRA_INCLUDE= -I. -I$(AR_DIR) -I$(AR_DIR)/hal -I$(AR_DIR)/include \
-I$(AR_DIR)/include/diags
include $(TGT_DIR)/h/make/rules.library
# Override -ansi compiler flag to allow C++ style comments
CC_COMPILER =
# Extra C flags required by Atheros code
override ADDED_CFLAGS += -DVXWORKS -DVXWORKS55 -DBUILD_AR5211 \
-DBUILD_AR5212 -DPCI_INTERFACE -DBUILD_AP -DDEBUG
# Need manual endian determination for Atheros code. Atheros should use the
# _BYTE_ORDER macro so we don't have to re-create the functionality here
ifeq ($(BUILD_ENDIAN_SUFFIX),be)
override ADDED_CFLAGS += -DA_BIG_ENDIAN
else
ifeq ($(BUILD_ENDIAN_SUFFIX),le)
else
# at this point, we've established that the endianness is not specified in
# the TOOL variable, so move to defaults based on CPU_FAMILY
ifeq ($(VX_CPU_FAMILY),arm)
endif
ifeq ($(VX_CPU_FAMILY),mips)
override ADDED_CFLAGS += -DA_BIG_ENDIAN
endif
ifeq ($(VX_CPU_FAMILY),ppc)
override ADDED_CFLAGS += -DA_BIG_ENDIAN
endif
ifeq ($(VX_CPU_FAMILY),sh)
override ADDED_CFLAGS += -DA_BIG_ENDIAN
endif
ifeq ($(VX_CPU_FAMILY),pentium)
endif
endif
endif
@@ -0,0 +1,93 @@
# Makefile for Atheros AR521x Code Module
#
# modification history
# --------------------
# 01p,23sep10,hfc remove support of non-Vxbus atheros driver
# 01o,03sep09,hfc fix for defect WIND00180118
# 01n,15sep08,hfc Fix for defect WIND00132682
# 01m,19aug08,mze TOOL changes
# 01l,11jul08,hfc add PRECOM support for VSB build
# 01k,10jul08,hfc replace findstring SMP with _WRS_CONFIG_SMP to adopt vsb
# notion
# 01j,27feb08,hfc add support for vxbus/smp and legacy build
# 01i,28jun07,spw Disable SMP builds
# 01h,01apr05,rb Removed diab compilation protection
# 01g,24aug04,dxb Removed export parameter
# 01f,23aug04,dxb Added override directive
# 01e,27jul04,dxb fix typo
# 01d,27jul04,dxb override -ansi to allow c++ comment headers for GNU 3.3
# 01c,21jul04,eja Change BIG_ENDIAN to A_BIG_ENDIAN to resolve PCD little
# endian issue
# 01b,06may04,dxb Added additional include paths and gnu-only compile
# 01a,28apr04,dxb Created.
#
# DESCRIPTION
# This file contains the Makefile rules for building the Atheros AR521x
# 802.11a/b/g HAL (Hardware Interface Layer) proprietary code module
TGT_DIR = $(WIND_BASE)/target
LIB_BASE_NAME = ar521xVxbEnd
include $(TGT_DIR)/h/make/defs.library
ifndef _WRS_CONFIG_WLAN_ATH
all : rclean
endif
ifdef _WRS_CONFIG_IPWLAN_ATHEROS
AR_DIR = $(TGT_DIR)/src/drv/wlan/atheros_ar521x
C_SOURCE = ar5212Attach.c ar5212Interrupts.c ar5212Misc.c ar5212Power.c ar5212Reset.c \
ar5212Beacon.c ar5212KeyCache.c ar5212Phy.c ar5212Receive.c ar5212Transmit.c
OBJS_PRECOMP_ar521xVxbEnd = $(C_SOURCE:.c=.o)
CFLAGS_LIB_ar521xVxbEnd = -DVXBUS
endif
SUBDIRS =
# Extra include paths required by Atheros code
EXTRA_INCLUDE= -I. -I$(AR_DIR) -I$(AR_DIR)/hal -I$(AR_DIR)/include \
-I$(AR_DIR)/include/diags
include $(TGT_DIR)/h/make/rules.library
# Override -ansi compiler flag to allow C++ style comments
CC_COMPILER =
# Extra C flags required by Atheros code
override ADDED_CFLAGS += -DVXWORKS -DVXWORKS55 -DBUILD_AR5211 \
-DBUILD_AR5212 -DPCI_INTERFACE -DBUILD_AP -DDEBUG
# Need manual endian determination for Atheros code. Atheros should use the
# _BYTE_ORDER macro so we don't have to re-create the functionality here
ifeq ($(BUILD_ENDIAN_SUFFIX),be)
override ADDED_CFLAGS += -DA_BIG_ENDIAN
else
ifeq ($(BUILD_ENDIAN_SUFFIX),le)
else
# at this point, we've established that the endianness is not specified in
# the TOOL variable, so move to defaults based on CPU_FAMILY
ifeq ($(VX_CPU_FAMILY),arm)
endif
ifeq ($(VX_CPU_FAMILY),mips)
override ADDED_CFLAGS += -DA_BIG_ENDIAN
endif
ifeq ($(VX_CPU_FAMILY),ppc)
override ADDED_CFLAGS += -DA_BIG_ENDIAN
endif
ifeq ($(VX_CPU_FAMILY),sh)
override ADDED_CFLAGS += -DA_BIG_ENDIAN
endif
ifeq ($(VX_CPU_FAMILY),pentium)
endif
endif
endif
@@ -0,0 +1,424 @@
/* dot11CryptoLib.c - Encrypt/Decrypt functions for wireless framework */
/*
* Copyright (c) 2010 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
--------------------
02a,02mar10,kr Initial version
*/
/*
DESCRIPTION
This module contains functions for computing AES key wrap and unwrap:
- depends on openssl for the AES encryption;
- code adapted from the file ipcrypto_aeskeywrap.c.
This module also contains functions for computing RC4-TKIP encryption/decryption:
- does not depend on any library;
- code adapted from the CCI library (cci_DefaultCipherRC4TKIP.c).
\NOMANUAL
*/
#include <vxWorks.h>
#include <stdio.h>
#include <openssl/aes.h>
#include "drv/wlan/dot11Lib.h"
#include "drv/wlan/dot11RsnLib.h"
#define LOGERROR(__s) DOT11_LOG(DOT11_DEBUG_ERROR, DOT11_AREA_RSN, \
(__s "\n", 0,0,0,0,0,0))
#define AESKW_BLOCKSIZE 8
#define AES_BLOCKSIZE 16
#define AES_KEY_128_BYTES 16
#define AES_KEY_192_BYTES 24
#define AES_KEY_256_BYTES 32
#define AES_CHECK_KEYLEN(len) ((len==AES_KEY_128_BYTES)||(len==AES_KEY_192_BYTES)||(len==AES_KEY_256_BYTES))
#define AESKW_WRAP_MIN_BLOCK 2
#define AESKW_UNWRAP_MIN_BLOCK (AESKW_WRAP_MIN_BLOCK+1)
#define AESKW_XOR_BLOCK(out, in1, in2) {int ijk;for( ijk = 0; ijk < AESKW_BLOCKSIZE; ijk++ ) out[ijk] = in1[ijk] ^ in2[ijk];}
#define AESKW_CVT(b,n) {memset(b,0,AESKW_BLOCKSIZE);b[AESKW_BLOCKSIZE-1] = ((n)&0xFF);b[AESKW_BLOCKSIZE-2] = (((n)&0xFF00)>>8);\
b[AESKW_BLOCKSIZE-3] = (((n)&0xFF0000)>>16);b[AESKW_BLOCKSIZE-4] = (((n)&0xFF000000)>>24);}
/***************************************************************************
*
* dot11CryptoAesKeyWrap
*
* Description: Encrypt (wrap) a key using AES-KEYWRAP
* Parameters: key - pointer to key buffer
* keyLength - length of key, must be 128 bit, 192 bit or 256 bit (in bytes)
* iv - pointer to IV.
* ivLength - length of IV. Must be AESKW_BLOCKSIZE
* plainText - pointer to buffer to encrypt (wrap)
* plainTextLength - length of buffer to encrypt. Must be multiple of AESKW_BLOCKSIZE
* cipherText - pointer to buffer in which to copy output
* cipherTextLength - pointer to the length of the cipherText buffer. On output,
* this is updated to the length of data copied into the cipherText buffer
* Returns: OK or ERROR
*
*/
STATUS dot11CryptoAesKeyWrap(UINT8 *key, int keyLength,
UINT8 *iv, int ivLength,
UINT8 *plainText, int plainTextLength,
UINT8 *cipherText, UINT32 *cipherTextLength )
{
STATUS status = OK;
AES_KEY aesKey;
/*
** --- Check for proper key length
*/
if (AES_CHECK_KEYLEN(keyLength))
{
/*
** --- Check for proper IV length
*/
if (ivLength == AESKW_BLOCKSIZE)
{
/*
** --- Make sure the input is aligned to 64-bit boundaries
*/
if ( !(plainTextLength % AESKW_BLOCKSIZE) )
{
/*
** --- Make sure the output buffer is at least
** one block (64-bits) larger than the input.
*/
if (*cipherTextLength >= (plainTextLength+AESKW_BLOCKSIZE))
{
int numBlocks = plainTextLength/AESKW_BLOCKSIZE;
UINT8 *R;
UINT8 A[AESKW_BLOCKSIZE];
UINT8 B[AES_BLOCKSIZE];
UINT8 T[AESKW_BLOCKSIZE];
int i,j;
if (numBlocks >= AESKW_WRAP_MIN_BLOCK)
{
/*
** --- Set output buffer size
*/
*cipherTextLength = plainTextLength+AESKW_BLOCKSIZE;
/*
** --- Initialize variables
**
** Set A = IV, an initial value (see 2.2.3)
** For i = 1 to n
** R[i] = P[i]
*/
memcpy(A, iv, AESKW_BLOCKSIZE);
R = cipherText + AESKW_BLOCKSIZE;
memcpy( R, plainText, plainTextLength );
if ( -1 == AES_set_encrypt_key(key, keyLength << 3,&aesKey)) {
LOGERROR("AES_set_encrypt_key failed");
return ERROR;
}
for ( j = 0; j < 6; j++ )
{
for ( i = 0; i < numBlocks; i++ )
{
/*
** --- Do: B = AES(K, A | R[i])
** --- Do: R[i] = LSB(64, B)
*/
memcpy( B + AESKW_BLOCKSIZE, R + (i * AESKW_BLOCKSIZE), AESKW_BLOCKSIZE);
memcpy( B, A, AESKW_BLOCKSIZE);
AES_ecb_encrypt(B,B, &aesKey,AES_ENCRYPT);
/* ccip_aes_encrypt( CCI_MODE_ECB, key, keyLength, B, AES_BLOCKSIZE, B, NULL ); */
memcpy( A, B, AESKW_BLOCKSIZE);
memcpy( R + (i * AESKW_BLOCKSIZE), B + AESKW_BLOCKSIZE, AESKW_BLOCKSIZE);
/*
** --- Do: A = MSB(64, B) ^ t where t = (n*j)+i
*/
AESKW_CVT(T,(numBlocks*j)+(i+1));
AESKW_XOR_BLOCK(A,T,A);
}
}
/*
** --- Do: Set C[0] = A
*/
memcpy( cipherText, A, AESKW_BLOCKSIZE);
}
else
{
status = ERROR;
LOGERROR("Keywrap: outputBuffer too small\n");
}
}
else
{
status = ERROR;
LOGERROR("Keywrap: message too short\n");
}
}
else
{
status = ERROR;
LOGERROR("Keywrap: input buffer not a multiple of the blocksize");
}
}
else
{
status = ERROR;
LOGERROR("Keywrap: invalid blocksize");
}
}
else
{
status = ERROR;
LOGERROR("Keywrap: invalid keylength");
}
return( status );
}
/***************************************************************************
*
* dot11CryptoAesKeyUnwrap
*
* Description: Decrypt (unwrap) a key using AES-KEYWRAP
* Parameters: key - pointer to key buffer
* keyLength - length of key, must be 128 bit, 192 bit or 256 bit (in bytes)
* iv - pointer to IV.
* ivLength - length of IV. Must be AESKW_BLOCKSIZE
* cipherText - pointer to buffer to decrypt (unwrap)
* cipherTextLength - length of buffer to decrypt. Must be multiple of AESKW_BLOCKSIZE
* plainText - pointer to buffer in which to copy output
* plainTextLength - pointer to the length of the plainText buffer. On output,
* this is updated to the length of data copied into the plainText buffer
* Returns: OK or ERROR
*
*/
STATUS dot11CryptoAesKeyUnwrap(UINT8 *key, int keyLength,
UINT8 *iv, int ivLength,
UINT8 *cipherText, int cipherTextLength,
UINT8 *plainText, UINT32 *plainTextLength)
{
STATUS status = OK;
AES_KEY aesKey;
/*
** --- Check for proper key length
*/
if (AES_CHECK_KEYLEN(keyLength))
{
/*
** --- Check for proper IV length
*/
if (ivLength == AESKW_BLOCKSIZE)
{
/*
** --- Make sure the input is aligned to 64-bit boundaries
*/
if ( !(cipherTextLength % AESKW_BLOCKSIZE) )
{
/*
** --- Make sure the output buffer is at least
** one block (64-bits) smaller than the input
*/
if (*plainTextLength >= (cipherTextLength-AESKW_BLOCKSIZE))
{
int numBlocks = (cipherTextLength/AESKW_BLOCKSIZE)-1;
UINT8 *R, *A;
UINT8 B[AES_BLOCKSIZE];
UINT8 T[AESKW_BLOCKSIZE];
int i,j;
if ((numBlocks+1) >= AESKW_UNWRAP_MIN_BLOCK)
{
/*
** --- Set output buffer size
*/
*plainTextLength = cipherTextLength-AESKW_BLOCKSIZE;
/*
** --- Initialize variables
**
** Set A = C[0]
** For i = 1 to n
** R[i] = C[i]
*/
A = cipherText;
R = plainText;
memcpy( R, cipherText + AESKW_BLOCKSIZE, cipherTextLength-AESKW_BLOCKSIZE );
if ( -1 == AES_set_decrypt_key(key, keyLength << 3,&aesKey)) {
LOGERROR("AES_set_decrypt_key failed");
return ERROR;
}
for ( j = 6; j > 0; j-- )
{
for ( i = numBlocks; i > 0; i-- )
{
/*
** --- Do: (A ^ t)
*/
AESKW_CVT(T,((numBlocks)*(j-1))+(i));
AESKW_XOR_BLOCK(A,T,A);
/*
** --- Do: B = AES(K, A | R[i])
** --- Do: R[i] = LSB(64, B)
*/
memcpy( B + AESKW_BLOCKSIZE, R + ((i-1) * AESKW_BLOCKSIZE), AESKW_BLOCKSIZE);
memcpy( B, A, AESKW_BLOCKSIZE);
AES_ecb_encrypt(B, B,&aesKey, AES_DECRYPT);
memcpy( A, B, AESKW_BLOCKSIZE);
memcpy( R + ((i-1) * AESKW_BLOCKSIZE), B + AESKW_BLOCKSIZE, AESKW_BLOCKSIZE);
}
}
/*
** --- Make sure the first block is equal to the IV
*/
if (memcmp( A, iv, AESKW_BLOCKSIZE))
{
status = ERROR;
LOGERROR("Keyunwrap: decoding error");
}
}
else
{
LOGERROR("Keyunwrap:message too short");
status = ERROR;
}
}
else
{
status = ERROR;
LOGERROR("keyunwrap: output buffer too small");
}
}
else
{
LOGERROR("keyunwrap: input buffer not a multiple of the blocksize");
status = ERROR;
}
}
else
{
LOGERROR("keyunwrap: invalid iv length");
status = ERROR;
}
}
else
{
LOGERROR("invalid key length");
status = ERROR;
}
return( status );
}
/***************************************************************************
*
* dot11CryptoRc4 - Encrypts the given data using RC4
*
* RETURNS: OK or ERROR
*
*/
STATUS dot11CryptoRc4(
UINT8* key, /* Key to encrypt data with */
int keyLen, /* Length (in bytes) of the key */
int keyStreamOffset, /* Number of bytes to discard from start of KS */
UINT8 *inputData, /* Pointer to data to be encrypted */
UINT32 inputLength, /* Length of the data */
UINT8 *outputData, /* Pointer to result buffer */
UINT32 *outputDataLen /* I/O arg: len of outputData, set to len of result */
)
{
UINT8 swap; /* Temporary variable used to swap values in s-box*/
int loop, i, j; /* Counter variables */
int t; /* Temporary storage */
UINT8 K; /* Pseudo-random number to encrypt current byte */
UINT8 s[256]; /* Initial s-box for keystream */
UINT8 k[256]; /* Key array. */
if( *outputDataLen < inputLength )
{
return ERROR;
}
/* Fill up the arrays to starting values. S-box is numbered 0 - 255
and the key array is filled with the key, repeated over and over */
for (i=0; i<256; i++)
{
s[i] = i;
k[i] = key[i % keyLen];
}
/* Set up the s-table */
j = 0;
for (i=0; i<256; i++)
{
j = (j + s[i] + k[i]) & 0xff;
swap = s[i];
s[i] = s[j];
s[j] = swap;
}
i = j = 0;
/* Discard the first bytes of the keystream, if desired */
for (loop=0; loop < keyStreamOffset; loop++)
{
i = (i + 1) & 0xff;
j = (j + s[i]) & 0xff;
swap = s[i];
s[i] = s[j];
s[j] = swap;
t = (s[i] + s[j]) & 0xff;
K = s[t];
/* Do nothing with K */
}
/* Stream through the data, getting a different pseudo-random number
from the key-stream and XORing it with the data */
for (loop = 0; loop < inputLength; loop ++)
{
i = (i + 1) & 0xff;
j = (j + s[i]) & 0xff;
swap = s[i];
s[i] = s[j];
s[j] = swap;
t = (s[i] + s[j]) & 0xff;
K = s[t];
/*inputData[loop] ^= K;*/
outputData[loop] = inputData[loop] ^ K;
}
*outputDataLen = inputLength;
return OK;
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,173 @@
/* dot11HddLib.c - contains the generic Hardware Device Driver methods */
/* Copyright 2004-2005 Wind River Systems, Inc. */
/*
Modification History
--------------------
02e,27feb08,hfc replace task/intlock with new api and add support for vxbus
02d,01mar07,spw Add compatible AR5212 device ids to device table
02c,28sep05,rb Update header comments and copyright
02b,27apr05,rb Updated routines with APIGEN tags
02a,25aug04,rb Wind River Wireless Ethernet Driver 2.0 FCS
*/
/*
DESCRIPTION
SEE ALSO
Wind Net 802.11 Station 2.0 High Level Design Document
\NOMANUAL
*/
#include <vxWorks.h>
#include <muxLib.h>
#include "drv/wlan/dot11Lib.h"
#include "drv/wlan/dot11HddLib.h"
#include "drv/wlan/dot11Bsp.h"
#define MAX_HDD_OBJECTS (sizeof(hddDeviceTable) / sizeof(HDD_TABLE_ENTRY))
typedef struct
{
UINT16 vendorId;
UINT16 deviceId;
FUNCPTR hddInitialize;
} HDD_TABLE_ENTRY;
HDD_TABLE_ENTRY hddDeviceTable[] =
{
{AR5211_VENDOR_ID, AR5211_DEVID, ar52Initialize },
{AR5212_VENDOR_ID, AR5212_DEVID, ar52Initialize },
{AR5212_VENDOR_ID, AR5212_DEVID_0014, ar52Initialize },
{AR5212_VENDOR_ID, AR5212_DEVID_0015, ar52Initialize },
{AR5212_VENDOR_ID, AR5212_DEVID_0016, ar52Initialize },
{AR5212_VENDOR_ID, AR5212_DEVID_0017, ar52Initialize },
{AR5212_VENDOR_ID, AR5212_DEVID_0018, ar52Initialize },
{AR5212_VENDOR_ID, AR5212_DEVID_0019, ar52Initialize },
{AR5212_VENDOR_ID, AR5212_DEVID_001A, ar52Initialize },
{AR5212_VENDOR_ID, AR5212_DEVID_001B, ar52Initialize },
{0, 0, NULL}
};
/****************************************************************************
* dot11HddInit - Initialize the HDD structure
*
* This routine calls the device initialization functions in the
* hddDeviceTable[] above, hoping to find one that will match the vendor and
* device IDs in the table. If this occurs, the routine is called. If the
* routine succeeds, then the bringUp() function that is present in the
* HDD_OBJ is called.
*
* RETURNS: OK or ERROR
*
* ERRNO: N/A
*/
#ifdef VXBUS
STATUS dot11HddInit
(
VXB_DEVICE_ID wlsDev /* Pointer to the dot11 Framework */
)
#else
STATUS dot11HddInit
(
DOT11_FW * pDot11 /* Pointer to the dot11 Framework */
)
#endif
{
STATUS status = ERROR;
int i = 0;
#ifdef VXBUS
DOT11_FW * pDot11;
if(wlsDev==NULL)
{
DOT11_LOG(DOT11_DEBUG_FATAL, DOT11_AREA_HDD,
("ar521xBringUp: wlsDev is NULL\n", 0, 0,
0, 0, 0, 0));
return ERROR;
}
pDot11 =(DOT11_FW *)(wlsDev->pDrvCtrl);
if(pDot11==NULL)
{
DOT11_LOG(DOT11_DEBUG_FATAL, DOT11_AREA_HDD,
("ar521xBringUp: pBsp is NULL\n", 0, 0,
0, 0, 0, 0));
return ERROR;
}
#endif
/* Perform the PCI initialization */
/* Figure out what type of card this is and fill in the HDD object
appropriately */
DOT11_LOG(DOT11_DEBUG_INFO, DOT11_AREA_HDD,
("dot11HddInit: baseAddr = 0x%08x\n",pDot11->baseAddr,
0,0,0,0,0));
DOT11_LOG(DOT11_DEBUG_INFO, DOT11_AREA_HDD,
("dot11HddInit: PCI Vendor = 0x%04x\n",pDot11->pciVendorId,
0,0,0,0,0));
DOT11_LOG(DOT11_DEBUG_INFO, DOT11_AREA_HDD,
("dot11HddInit: PCI Device = 0x%04x\n",pDot11->pciDeviceId,
0,0,0,0,0));
/* Cycle through all of the hddDeviceTable */
while (hddDeviceTable[i].hddInitialize != NULL)
{
if ((hddDeviceTable[i].vendorId == pDot11->pciVendorId) &&
(hddDeviceTable[i].deviceId == pDot11->pciDeviceId))
{
if ((status = hddDeviceTable[0].hddInitialize(pDot11)) == OK)
{
/* We found a working device. Exit */
break;
}
}
i++;
}
/* Call the initialize routine to set up the rest of the HDD functions,
making sure that it exists first */
if (status != OK)
{
DOT11_LOG(DOT11_DEBUG_INFO, DOT11_AREA_HDD,
("dot11HddInit: hddDeviceTable[] for vendor=%04x,"
"device=%04x does not have an initialize function. \n",
pDot11->pciVendorId, pDot11->pciDeviceId,0,0,0,0));
return ERROR;
}
/* The initialize call in the loop above should have filled in the
function table in the rest of the HDD */
if (pDot11->hdd->bringUp != NULL)
{
#ifdef VXBUS
status = pDot11->hdd->bringUp(wlsDev);
#else
status = pDot11->hdd->bringUp(pDot11);
#endif
}
else
{
DOT11_LOG(DOT11_DEBUG_FATAL, DOT11_AREA_HDD,
("dot11HddInit: Unable to initialize driver\n",0,0,0,0,0,0));
return ERROR;
}
return status;
}
@@ -0,0 +1,209 @@
/* dot11HmacLib.c - HMAC functions for wireless framework */
/*
* Copyright (c) 2010 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
--------------------
02a,02mar10,kr Initial version
*/
/*
DESCRIPTION
This module contains functions for computing HMAC-MD5 and HMAC-SHA1.
Depends on the openssl library, but not the CCI library.
Code cloned from the ip8021x code (ip8021x_hmac.c).
\NOMANUAL
*/
#include <vxWorks.h>
#include <stdio.h>
#include "drv/wlan/dot11Lib.h"
#include "drv/wlan/dot11RsnLib.h"
#include <assert.h>
/****************************************************************************
*
* dot11HmacInit - calculate k_ipad and k_opad, add k_ipad to context
*
*
* RETURNS:
*
* ERRNO: N/A
*/
VOID dot11HmacInit(DOT11_HMAC_CTX* ctx, UINT8* key, UINT32 key_len, int hash_id)
{
UINT8 temp_key[20];
int i;
memset(ctx, 0, sizeof(DOT11_HMAC_CTX));
switch(hash_id)
{
case DOT11_HMAC_SHA1:
/* if key is longer than 64 bytes reset it to key=SHA1(key) */
if (key_len > 64)
{
(void)SHA1_Init(&ctx->hash_ctx.sha);
(void)SHA1_Update(&ctx->hash_ctx.sha, key, key_len);
(void)SHA1_Final(temp_key, &ctx->hash_ctx.sha);
key = temp_key;
key_len = 20;
}
break;
case DOT11_HMAC_MD5:
/* if key is longer than 64 bytes reset it to key=MD5(key) */
if (key_len > 64)
{
(void)MD5_Init(&ctx->hash_ctx.md5);
(void)MD5_Update(&ctx->hash_ctx.md5, key, key_len);
(void)MD5_Final(temp_key, &ctx->hash_ctx.md5);
key = temp_key;
key_len = 16;
}
break;
default:
assert(0);
}
ctx->hash_id = hash_id;
ctx->key_len = key_len;
memcpy(ctx->k_ipad, key, key_len);
memcpy(ctx->k_opad, key, key_len);
/* XOR key with ipad and opad values */
for (i=0; i<64; i++) {
ctx->k_ipad[i] ^= 0x36;
ctx->k_opad[i] ^= 0x5c;
}
switch(hash_id)
{
case DOT11_HMAC_SHA1:
(void)SHA1_Init(&ctx->hash_ctx.sha);
(void)SHA1_Update(&ctx->hash_ctx.sha, ctx->k_ipad, sizeof(ctx->k_ipad));
break;
case DOT11_HMAC_MD5:
(void)MD5_Init(&ctx->hash_ctx.md5);
(void)MD5_Update(&ctx->hash_ctx.md5, ctx->k_ipad, sizeof(ctx->k_ipad));
break;
}
}
/****************************************************************************
*
* dot11HmacUpdate - add data to context
*
*
* RETURNS:
*
* ERRNO: N/A
*/
VOID dot11HmacUpdate(DOT11_HMAC_CTX* ctx, UINT8* data, UINT32 data_len)
{
switch(ctx->hash_id)
{
case DOT11_HMAC_SHA1:
(void)SHA1_Update(&ctx->hash_ctx.sha, data, data_len);
break;
case DOT11_HMAC_MD5:
(void)MD5_Update(&ctx->hash_ctx.md5, data, data_len);
break;
default:
assert(0);
}
}
/****************************************************************************
*
* dot11HmacFinal - calculate hash(k_opad || hash(data in context))
*
*
* RETURNS:
*
* ERRNO: N/A
*/
VOID dot11HmacFinal(DOT11_HMAC_CTX* ctx, UINT8* digest, UINT32* digest_len)
{
UINT8 tmp_buf[20];
switch(ctx->hash_id)
{
case DOT11_HMAC_SHA1:
assert(*digest_len >= 20);
(void)SHA1_Final(tmp_buf, &ctx->hash_ctx.sha);
(void)SHA1_Init(&ctx->hash_ctx.sha);
(void)SHA1_Update(&ctx->hash_ctx.sha, ctx->k_opad, sizeof(ctx->k_opad));;
(void)SHA1_Update(&ctx->hash_ctx.sha, tmp_buf, sizeof(tmp_buf));
(void)SHA1_Final(digest, &ctx->hash_ctx.sha);
*digest_len = 20;
break;
case DOT11_HMAC_MD5:
assert(*digest_len >= 16);
(void)MD5_Final(tmp_buf, &ctx->hash_ctx.md5);
(void)MD5_Init(&ctx->hash_ctx.md5);
(void)MD5_Update(&ctx->hash_ctx.md5, ctx->k_opad, sizeof(ctx->k_opad));;
(void)MD5_Update(&ctx->hash_ctx.md5, tmp_buf, 16);
(void)MD5_Final(digest, &ctx->hash_ctx.md5);
*digest_len = 16;
break;
default:
assert(0);
}
}
/****************************************************************************
*
* dot11Hmac - calculate HMAC
*
* UINT8* digest: result is copied here
* UINT8* digest_len: I/O arg
* length of digest arg
* updated with length of result
*
* RETURNS:
*
* ERRNO: N/A
*/
VOID dot11Hmac(UINT8* key, UINT32 key_len, UINT8* data, UINT32 data_len,
UINT8* digest, UINT32* digest_len, int hash_id)
{
DOT11_HMAC_CTX ctx;
dot11HmacInit(&ctx, key, key_len, hash_id);
dot11HmacUpdate(&ctx, data, data_len);
dot11HmacFinal(&ctx, digest, digest_len);
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,286 @@
/* dot11RandLib.c - random number generator for wireless framework */
/*
Modification History
--------------------
02a,02mar10,kr Initial version
*/
/*
DESCRIPTION
This module contains functions for generating random numbers:
- depends on openssl for the SHA256 and MD5 hashes;
- code adapted from the CCI library (cci_DefaultRand.c).
\NOMANUAL
*/
#include <vxWorks.h>
#include <semLib.h>
#include <sys/types.h>
#include <stdio.h>
#include "drv/wlan/dot11Lib.h"
#include "drv/wlan/dot11RsnLib.h"
/****************************************************************************
*
* *** Restricted Rights Legend ***
*
* The programs and information contained herein are licensed only
* pursuant to a license agreement that contains use, reverse
* engineering, disclosure, and other restrictions; accordingly, it
* is "Unpublished--all rights reserved under the applicable
* copyright laws".
*
* Use duplication, or disclosure by the Government is subject to
* restrictions as set forth in subparagraph (c)(1)(ii) of the Rights
* in Technical Data and Computer Licensed Programs clause of DFARS
* 52.227 7013.
*
* Copyright 2000-2010 Wind River Systems, Inc.
* Copyright 1997 Epilogue Technology Corporation.
* Copyright 1998-1999 Integrated Systems, Inc.
* All rights reserved.
*
* *** Government Use ***
*
* The Licensed Programs and their documentation were developed at
* private expense and no part of them is in the public domain.
*
* The Licensed Programs are "Restricted Computer Software" as that
* term is defined in Clause 52.227-19 of the Federal Acquisition
* Regulations (FAR) and are "Commercial Computer Software" as that
* term is defined in Subpart 227.401 of the Department of Defense
* Federal Acquisition Regulation Supplement (DFARS).
*
* (i) If the licensed Programs are supplied to the Department of
* Defense (DoD), the Licensed Programs are classified as
* "Commercial Computer Software" and the Government is acquiring
* only "restricted rights" in the Licensed Programs and their
* documentation as that term is defined in Clause 52.227
* 7013(c)(1) of the DFARS, and
*
* (ii) If the Licensed Programs are supplied to any unit or agency
* of the United States Government other than DoD, the
* Government's rights in the Licensed Programs and their
* documentation will be as defined in Clause 52.227-19(c)(2) of
* the FAR.
****************************************************************************/
/*
* This file implements a cryptographically strong random number generator.
* The algorithm is based on the ANSI X9.17 generator. Keyed MD5 is used
* as the basic transform rather than TDES. The DT value is augmented with
* a monotonically increasing counter. See [Stallings - Network and
* Internetwork Security pp 102-103] or ANSI X9.17 Appendix C.
*/
/*
* these next 2 bits of magic are used to seed the generator with
* less than 32 bytes of randomness. If the user hands in N < 32 bytes (call
* them "B") we generate MD5 (MAGIC1 "+" B "+" MAGIC1), and
* MD5 (MAGIC2 "+" B "+" MAGIC2), and combine them to get our needed 32 bytes.
* The actual values here are *not* of any importance, although having a
* reasonably "random" bit distribution is useful. These were generated by
* running some real-time system statistics through MD5.
*/
static UINT8 PRNG_MAGIC1 [] =
{ 0xb4, 0x33, 0x4b, 0xf5, 0x9b, 0x7a, 0x24, 0x19,
0x8c, 0x04, 0xa5, 0xd1, 0x1e, 0xab, 0xa2, 0xe9
};
static UINT8 PRNG_MAGIC2 [] =
{ 0xaa, 0x9b, 0x49, 0xd4, 0x0f, 0x4c, 0xa7, 0x1b,
0x1d, 0x0e, 0x83, 0xd6, 0xe7, 0x9c, 0xab, 0xf8
};
#define PRNG_SEEDBYTES_NEEDED 32
static MD5_CTX PRNG_CCI_MD5_CONTEXT;
static UINT8 PRNG_MD5_K[16]; /* MD5 keyed hash key */
static UINT8 PRNG_SV[16]; /* current seed value */
static UINT8 PRNG_R[16]; /* current random pool */
static UINT32 PRNG_DT; /* "date+time" value */
static UINT32 PRNG_CNT; /* counter; increments with each call */
static UINT8 PRNG_N; /* number of "random" bytes currently available */
static UINT8 PRNG_INJIDX; /* index of PRNG_SV where prng_inject_random8 will xor next random input into */
static SEM_ID defaultMtx;
/*
** --- randomly get current time
*/
static UINT32 randomTime( void )
{
struct timespec tspec;
clock_gettime( CLOCK_REALTIME, &tspec );
return( (UINT32) tspec.tv_nsec );
}
/*
** --- Get a random number from the SHA256 algorithm that produces
** a 32-byte digest --- which is equal to PRNG_SEEDBYTES_NEEDED(the value of the variable 'length').
*/
static unsigned glue_seed_prng( UINT8 *buffer, unsigned length )
{
SHA256_CTX context;
UINT32 t = randomTime();
SHA256_Init( &context );
SHA256_Update( &context, (void *) &t, sizeof(UINT32) );
SHA256_Final( buffer, &context );
return( length );
}
/*
* compute next seed value and state
*/
static void prng_iterate( void )
{
int i;
UINT8 *p, *q;
UINT8 digest[16];
/* step 1. R = MD5_K (MD5_K ((DT concat (++CNT)) XOR SV)) */
/* digest <-- MD5 ((DT concat (++CNT)) XOR SV */
++PRNG_CNT;
PRNG_DT = randomTime();
MD5_Init( &PRNG_CCI_MD5_CONTEXT );
MD5_Update( &PRNG_CCI_MD5_CONTEXT, PRNG_MD5_K, 16 );
MD5_Update( &PRNG_CCI_MD5_CONTEXT, (UINT8 *) &PRNG_DT, 4 );
MD5_Update( &PRNG_CCI_MD5_CONTEXT, (UINT8 *) &PRNG_CNT, 4 );
MD5_Update( &PRNG_CCI_MD5_CONTEXT, PRNG_MD5_K, 16 );
MD5_Final( digest, &PRNG_CCI_MD5_CONTEXT );
/* PRNG_SV <-- (PRNG_SV XOR digest) */
/* leave digest alone as we'll need it again when we compute new SV */
for( i = 0, p = PRNG_SV, q = digest; i < 16; i++ ) *p++ ^= *q++;
/* PRNG_R <-- MD5 (PRNG_SV) */
MD5_Init( &PRNG_CCI_MD5_CONTEXT );
MD5_Update( &PRNG_CCI_MD5_CONTEXT, PRNG_MD5_K, 16 );
MD5_Update( &PRNG_CCI_MD5_CONTEXT, PRNG_SV, 16 );
MD5_Update( &PRNG_CCI_MD5_CONTEXT, PRNG_MD5_K, 16 );
MD5_Final( PRNG_R, &PRNG_CCI_MD5_CONTEXT );
/*
* step 2. SV = MD5_K (MD5_K ((DT concat (++CNT)) XOR R))
*
* digest is still MD5_K ((DT concat (++CNT)), so we dont need another
* MD5 operation
*/
/* PRNG_SV <-- (PRNG_SV XOR digest) */
for( i = 0, p = PRNG_R, q = digest; i < 16; i++ ) *q++ ^= *p++;
MD5_Init( &PRNG_CCI_MD5_CONTEXT );
MD5_Update( &PRNG_CCI_MD5_CONTEXT, PRNG_MD5_K, 16 );
MD5_Update( &PRNG_CCI_MD5_CONTEXT, (UINT8 *)digest, 16 );
MD5_Update( &PRNG_CCI_MD5_CONTEXT, PRNG_MD5_K, 16 );
MD5_Final( PRNG_SV, &PRNG_CCI_MD5_CONTEXT );
/* now we have another 16 bytes of usable R */
PRNG_N = 16;
}
/*
* seed the prng
*/
static void prng_seed( UINT32 seedSize, UINT8 *seedvalues )
{
if( seedSize <= PRNG_SEEDBYTES_NEEDED )
{
MD5_Init( &PRNG_CCI_MD5_CONTEXT );
MD5_Update( &PRNG_CCI_MD5_CONTEXT, PRNG_MAGIC1, 16 );
if( seedSize > 0 ) MD5_Update( &PRNG_CCI_MD5_CONTEXT, seedvalues, seedSize );
MD5_Update( &PRNG_CCI_MD5_CONTEXT, PRNG_MAGIC1, 16 );
MD5_Final( PRNG_MD5_K, &PRNG_CCI_MD5_CONTEXT );
MD5_Init( &PRNG_CCI_MD5_CONTEXT );
MD5_Update( &PRNG_CCI_MD5_CONTEXT, PRNG_MAGIC2, 16 );
MD5_Update( &PRNG_CCI_MD5_CONTEXT, seedvalues, seedSize );
MD5_Update( &PRNG_CCI_MD5_CONTEXT, PRNG_MAGIC2, 16 );
MD5_Final( PRNG_SV, &PRNG_CCI_MD5_CONTEXT );
memcpy( &PRNG_CNT, seedvalues, 4 );
}
else
{
memcpy( PRNG_SV, seedvalues, 16 );
memcpy( PRNG_MD5_K, seedvalues + 16, 16 );
memcpy( &PRNG_CNT, seedvalues, 4 );
}
PRNG_DT = randomTime();
PRNG_N = PRNG_INJIDX = 0;
prng_iterate(); /* kick start the PRNG */
}
/*
* Initialize the prng system. This involves calling out for seed bytes. 32
* of them, in fact.
*/
static void prng_init( void )
{
UINT8 seedvalues[PRNG_SEEDBYTES_NEEDED];
unsigned int seedSize;
memset( seedvalues, 0, PRNG_SEEDBYTES_NEEDED );
seedSize = glue_seed_prng( seedvalues, PRNG_SEEDBYTES_NEEDED );
prng_seed( seedSize, seedvalues );
}
/*
* hand back a "random" byte
*/
static UINT8 prng_random8( void )
{
if( !PRNG_N ) prng_iterate();
return PRNG_R[--PRNG_N];
}
/*
* fill up a buffer with "random" bytes
*/
static void prng_random( UINT8 *buf, UINT32 N )
{
while( N-- ) *buf++ = prng_random8();
}
/*************************************************************************************************
* Method Name: dot11RandNum
* Description: Fill buffer with random numbers.
*
* Parameters:
*
* < *buffer > -
* < byteCount > -
*
* Returns: void - No value returned.
*
**************************************************************************************************/
void dot11RandNum(UINT8 *buffer, UINT32 byteCount)
{
semTake(defaultMtx, WAIT_FOREVER);
prng_random( buffer, byteCount );
semGive(defaultMtx);
}
/*************************************************************************************************
* Method Name: dot11RandNumInit
* Description: Initialize the dot11RandLib
*
**************************************************************************************************/
void dot11RandNumInit(void)
{
defaultMtx = semBCreate(SEM_Q_FIFO, SEM_FULL);
prng_init();
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,868 @@
/* dot11TimerLib.c - A generic timer library for the dot11 framework */
/* Copyright 2004-2005 Wind River Systems, Inc. */
/*
Modification History
--------------------
02g,10sep10,hfc fix for defect WIND00232621
02f,27feb08,hfc replace task/intlock with new api and add support for vxbus
02e,28sep05,rb Update header comments and copyright
02d,27apr05,rb Updated routines with APIGEN tags
02c,02feb05,rb Compatability issue with vxWorks 6.0 resolved
02b,07oct04,rb Fix for SPR 102322: Random AP cluster overwrites
02a,23aug04,rb Wind River Wireless Ethernet Driver 2.0 FCS
*/
/*
DESCRIPTION
This is a basic timer library that executes functions for the DOT11 framework.
It is not meant for a high density of timers, or for timers that need to be
precise. The timeout is expected within one tick - on a typical
system, this is +/- 16.67 ms unless a higher priority task prempts this one,
which is possible in a highly utilized system.
ARCHITECTURE
The basic architecture is a task that pends on a message queue. Messages are
sent to the message queue to add or delete timers. The timer task pends on
this message queue with a timeout equal to the time until the next event.
Thus, the timer task is activated when the next event occurs or when there
is a message on the queue. If there is a message, it is processed (events
are added or removed from the sorted event-queue). The head of the event
queue is then examined. If there are events due (or past, since our task
could be prempted) the event queue is drained until the next event is in the
future. The time until this event is calculated, and
The priority setting of this task is slightly greater than tNetTask to ensure
that timeouts for network events are not preempted by high volumes of network
traffic.
NOTES
The events are called from the context of the timer task. Thus, any event functions should be short in duration and conservative in stack usage to avoid compromising the timer task.
SEE ALSO
Wind Net 802.11 Station 2.0 High Level Design Document
\IFSET KERNEL
*/
#include <vxWorks.h>
#include <tickLib.h>
#include <taskLib.h>
#include <msgQLib.h>
#include <logLib.h>
#include <stdio.h>
#include <intLib.h>
#include <memPartLib.h>
#include <string.h>
#include <netLib.h>
#include <spinLockLib.h>
/* #define this only if you are debugging the timer library */
#undef DOT11_TIMER_DEBUG
#ifdef DOT11_TIMER_DEBUG
#define DOT11_TIMER_LOG(a,b,c,d,e,f,g) logMsg(a,b,c,d,e,f,g)
#else
#define DOT11_TIMER_LOG(a,b,c,d,e,f,g)
#endif
/* A high volume of messages is not anticipated. */
#define DOT11_TIMER_MAX_MSGS 512
/* There is only one instance of the timer library regardless of the number
of devices using it */
#define DOT11_TIMER_TASK_NAME "tDot11Timer"
#define DOT11_TIMER_TASK_PRI_TNET (-2)
#define DOT11_TIMER_TASK_STACK 4096
#define DOT11_TIMER_ALLOC dot11TimerCalloc
#define DOT11_TIMER_FREE dot11TimerFree
#define DOT11_TIMER_MEM_PART_SZ (1024)
/* Delay to allow the task to delete itself on de-initialization. Two ticks
of the kernel clock should be more than enough time for this to occur */
#define DOT11_TIMER_TASK_DELETE_TIMEOUT 2
/*******************************************************************
* DOT11_TIMER - Struct identifying a particular timer in the LL
*******************************************************************/
typedef struct dot11Timer
{
int timerId; /* Unique identifier */
UINT32 fireTime; /* tick time when this timer fires */
FUNCPTR action; /* What to do when they fire. */
UINT32 actionParam0;
UINT32 actionParam1;
struct dot11Timer * pNext;
} DOT11_TIMER;
/*******************************************************************
* DOT11_TIMER_OP - A specific operation to be queued. These operations
* correspond to functions in dot11TimerOpFuncs[]
*******************************************************************/
typedef enum
{
DOT11_TIMER_ADD = 0, /* Add the specified timer */
DOT11_TIMER_DEL, /* Cancel the specified timer */
DOT11_TIMER_QUIT, /* Shut down the timer task */
DOT11_TIMER_NOP, /* No operation */
DOT11_TIMER_MAX_OPS
} DOT11_TIMER_OP;
/*******************************************************************
* DOT11_TIMER_REQ - A message passing a request up timerQueue
*******************************************************************/
typedef struct
{
DOT11_TIMER_OP operation; /* Operation to perform */
int timerId; /* ID of timer to add/delete */
/* The following are only used for additions */
UINT32 fireTime; /* Number of ticks to delay */
FUNCPTR actionPtr; /* Function to execute when done */
UINT32 param0; /* First parameter to actionPtr() */
UINT32 param1; /* Second parameter to actionPtr() */
} DOT11_TIMER_REQ;
/*******************************************************************
* DOT11_MEM_PART_T - Memory partition descriptor
*******************************************************************/
typedef struct dot11_mem_part_s
{
PART_ID id; /* partition ID */
UINT32 allocError; /* allocation error count */
UINT32 freeError; /* deallocation error count */
UINT32 allocSuccess;/* allocation success count */
UINT32 freeSuccess; /* deallocation success count */
struct dot11_block_s /* Basis parition element */
{
DOT11_TIMER timer; /* defines the timer element */
UINT32 overhead[4]; /* overhead per allocated elem */
} block[DOT11_TIMER_MEM_PART_SZ];
} DOT11_MEM_PART_T;
/*******************************************************************
* dot11TimerLib - Global structure containing
*******************************************************************/
struct dot11TimerStruct
{
DOT11_TIMER* pHead; /* Pointer to next time to expire */
MSG_Q_ID timerQueue; /* MEssage queue used to add/delete items */
int lastTimerId; /* Last timerId allocated */
int tid; /* Task ID of timer task */
DOT11_MEM_PART_T* memPart; /* Private memory partition */
} dot11TimerLib;
/* Determine whether the timer library has been initialized yet. Also stores
the number of tasks using the library */
static INT32 dot11TimerUsage = 0;
/* Local prototypes */
LOCAL void dot11TimerTask();
LOCAL STATUS dot11TimerOpAdd(DOT11_TIMER_REQ * pReq);
LOCAL STATUS dot11TimerOpDel(DOT11_TIMER_REQ * pReq);
LOCAL STATUS dot11TimerFlush();
LOCAL void* dot11TimerCalloc(size_t elemNum, size_t elemSize);
LOCAL STATUS dot11TimerFree(char* pBlock);
/* These are internal function pointers, not necessary for the user to use.
These functions correspond to the ennumerated values in DOT11_TIMER_OP */
LOCAL FUNCPTR dot11TimerOpFuncs[DOT11_TIMER_MAX_OPS] =
{
(FUNCPTR)dot11TimerOpAdd, /* DOT11_TIMER_ADD */
(FUNCPTR)dot11TimerOpDel, /* DOT11_TIMER_DEL */
NULL, /* Quit message doesn't need a pointer */
NULL /* A NOP */
};
/* Compile time static allocation of memory partition descriptor */
static DOT11_MEM_PART_T dot11MemPartition;
LOCAL spinlockIsr_t isrLock;
IMPORT INT32 sysClkRateGet();
/****************************************************************************
* dot11TimerInit - Initializes the timer object.
*
* There is just one timer object for all of the interfaces. The initialization
* routine will be run once for each interface, but only the first one will
* succeed. Subsequent calls will still return OK, but will not do anything.
* The number of initializations will be tracked so that only the last
* de-initialization will actually free the memory.
*
* RETURNS: OK or ERROR on allocation error.
*
* ERRNO: N/A
*/
STATUS dot11TimerInit(spinlockIsr_t lock)
{
int tNetTaskPriority;
TASK_ID netTaskId;
/* Check if the initialization has been run already.
If so, don't run it again*/
dot11TimerUsage ++;
if (dot11TimerUsage > 1)
{
DOT11_TIMER_LOG("dot11TimerInit: already started %d times\n",
dot11TimerUsage,0,0,0,0,0);
return OK;
}
isrLock=lock;
dot11TimerLib.pHead = NULL;
dot11TimerLib.lastTimerId = 0;
dot11TimerLib.memPart = (DOT11_MEM_PART_T*)&dot11MemPartition;
if ((dot11TimerLib.timerQueue = msgQCreate(DOT11_TIMER_MAX_MSGS,
sizeof(DOT11_TIMER_REQ),
MSG_Q_FIFO)) == NULL)
{
DOT11_TIMER_LOG("dot11TimerInit: Can't create msgq\n",0,0,0,0,0,0);
dot11TimerUsage = 0;
return ERROR;
}
/* Create the dot11TimerLib memory parition */
if ((dot11TimerLib.memPart->id =
memPartCreate((char*)dot11TimerLib.memPart->block,
sizeof(dot11TimerLib.memPart->block)))
== NULL)
{
DOT11_TIMER_LOG
("dot11TimerInit: Can't create memory partition\n",0,0,0,0,0,0);
return(ERROR);
}
/* Reset the timer statistics counters */
dot11TimerLib.memPart->allocError = 0;
dot11TimerLib.memPart->freeError = 0;
dot11TimerLib.memPart->allocSuccess = 0;
dot11TimerLib.memPart->freeSuccess = 0;
/* Get the priority of tNetTask so that we can assume that we will always
be higher priority than it. If it fails, use a hardcoded value of 50 */
if ((netTaskId=taskNameToId ("tNet0")) == TASK_ID_ERROR)
{
DOT11_TIMER_LOG("dot11TimerInit: Can't get taksID of tNet0. "
"Using task priority 50.\n",0,0,0,0,0,0);
tNetTaskPriority = 50;
}
else
{
if (taskPriorityGet(netTaskId,&tNetTaskPriority) != OK )
{
DOT11_TIMER_LOG("dot11TimerInit: Can't get priority of tNet0. "
"Using task priority 50.\n",0,0,0,0,0,0);
tNetTaskPriority = 50;
}
}
if (taskSpawn(DOT11_TIMER_TASK_NAME,
tNetTaskPriority + DOT11_TIMER_TASK_PRI_TNET,
0,
DOT11_TIMER_TASK_STACK,
(FUNCPTR)dot11TimerTask,
0,0,0,0,0,0,0,0,0,0) == ERROR)
{
DOT11_TIMER_LOG("dot11TimerInit: Can't create task\n",0,0,0,0,0,0);
dot11TimerUsage = 0;
return ERROR;
}
DOT11_TIMER_LOG("dot11TimerInit: started\n",0,0,0,0,0,0);
return OK;
}
/****************************************************************************
* dot11TimerAdd - Adds a timer to the event queue
*
* This function sends a message to the timer task to add an event to the
* event queue. The timer does not actually start until the message is
* received by the event queue, so there is a slight delay possible if a high
* priority task is running.
*
* RETURNS: Timer ID or ERROR (-1) on error.
*
* ERRNO: N/A
*/
int dot11TimerAdd
(
int delayTicks,
FUNCPTR action,
int param0,
int param1
)
{
int intLevel;
DOT11_TIMER_REQ req;
if (dot11TimerUsage == 0)
{
DOT11_TIMER_LOG("dot11TimerAdd: Device not initialized\n",0,0,0,0,0,0);
return ERROR;
}
if (action == NULL)
{
DOT11_TIMER_LOG("dot11TimerAdd: NULL action\n",0,0,0,0,0,0);
return ERROR;
}
/* Setup the request message. Since this is running in the caller's
context, intLock() when setting the timerID to prevent two tasks doing it
at the same time and doing something weird. An intLock() is necessary
since this could conceivably be running in the ISR contect.*/
SPIN_LOCK_ISR_TAKE(&isrLock);
/* Handle the rollover case cleanly */
if (++dot11TimerLib.lastTimerId == ERROR)
{
dot11TimerLib.lastTimerId = 1;
}
req.timerId = dot11TimerLib.lastTimerId;
SPIN_LOCK_ISR_GIVE(&isrLock);
req.operation = DOT11_TIMER_ADD;
req.fireTime = delayTicks + tickGet();
req.actionPtr = action;
req.param0 = param0;
req.param1 = param1;
/* Send it off to the task */
if (msgQSend(dot11TimerLib.timerQueue, (char *)&req,
sizeof(DOT11_TIMER_REQ),
sysClkRateGet() / 10, MSG_PRI_NORMAL) != OK)
{
return ERROR;
}
DOT11_TIMER_LOG("dot11TimerAdd: Allocated timer %d\n", req.timerId,0,0,0,0,0);
return req.timerId;
}
/****************************************************************************
* dot11TimerDel - Removes the specified timer
*
* This routine sends a message to the timer task informing it to delete the
* specified timer. The timer is specified by the timerId returned by
* dot11TimerAdd()
*
* RETURNS: OK or ERROR if the message could not be sent.
*
* ERRNO: N/A
*/
STATUS dot11TimerDel
(
int timerId /* The timerId returned by dot11TimerAdd */
)
{
DOT11_TIMER_REQ req;
if (dot11TimerUsage == 0)
{
return ERROR;
}
DOT11_TIMER_LOG("dot11TimerDel: Deleting timer %d\n",
timerId,0,0,0,0,0);
req.timerId = timerId;
req.operation = DOT11_TIMER_DEL;
if (msgQSend(dot11TimerLib.timerQueue, (char *)&req,
sizeof(DOT11_TIMER_REQ),
sysClkRateGet() / 10, MSG_PRI_NORMAL) != OK)
{
return ERROR;
}
return OK;
}
/****************************************************************************
* dot11TimerDestroy - De-initializes the timer object.
*
* This routine is the opposite of dot11TimerDestroy. It will delete the
* message queue and the listening task.
*
* RETURNS: OK or ERROR if already destroyed
*
* ERRNO: N/A
*/
STATUS dot11TimerDestroy()
{
DOT11_TIMER_REQ req;
int intLevel;
/* Check if it's even initialized */
if (dot11TimerUsage == 0)
{
DOT11_TIMER_LOG("dot11TimerDestroy: not initialized\n",0,0,0,0,0,0);
return ERROR;
}
/* If it's running, decrement the usage parameter */
if ((--dot11TimerUsage) > 0)
{
DOT11_TIMER_LOG("dot11TimerDestroy: somebody still using timer\n",
0,0,0,0,0,0);
return OK;
}
/* Try a gracefull exit first - Send the QUIT message */
req.operation = DOT11_TIMER_QUIT;
msgQSend(dot11TimerLib.timerQueue, (char *)&req, sizeof(DOT11_TIMER_REQ),
NO_WAIT, MSG_PRI_URGENT);
/* Delay to allow the task to delete itself if it got the message */
taskDelay(DOT11_TIMER_TASK_DELETE_TIMEOUT);
/* If the task hasn't deleted itself, then it must be stuck. Kill it */
if (taskIdVerify(dot11TimerLib.tid) != ERROR)
{
/* Grab the context and prevent the task from getting it back */
#ifndef _WRS_VX_SMP
SPIN_LOCK_ISR_TAKE(&isrLock);
dot11TimerFlush();
SPIN_LOCK_ISR_GIVE(&isrLock);
#else
dot11TimerFlush();
#endif
taskDelete(dot11TimerLib.tid);
}
dot11TimerLib.pHead = NULL;
dot11TimerLib.lastTimerId = 0;
/* Kill the message queue after the task */
if (msgQDelete(dot11TimerLib.timerQueue) != OK)
{
DOT11_TIMER_LOG("dot11TimerDestroy: Error deleting msgq\n",
0,0,0,0,0,0);
return ERROR;
}
/* There is no memPartDestroy() routine, so we need to manually
delete the descriptor */
free(dot11TimerLib.memPart->id);
DOT11_TIMER_LOG("dot11TimerDestroy: Gone!\n",0,0,0,0,0,0);
return OK;
}
/****************************************************************************
* dot11TimerShow - Show routine for the time library
*
* This routine shows basic information on the timer library and a list of all
* timers currently running.
*
* RETURNS: none
*
* ERRNO: N/A
*/
STATUS dot11TimerShow()
{
DOT11_TIMER * pBug;
if (dot11TimerUsage == 0)
{
printf("Timer library not initialized\n");
return ERROR;
}
printf("Last timer ID = %d\n", dot11TimerLib.lastTimerId);
if (dot11TimerLib.pHead == NULL)
{
printf("No timers set \n");
}
else
{
for (pBug = dot11TimerLib.pHead; pBug != NULL; pBug = pBug->pNext)
{
printf(" TIMER %d >> ft = %d delay=%ld\n", pBug->timerId,
pBug->fireTime, pBug->fireTime - tickGet());
}
}
/* Display timer statistics */
printf("Timer allocations errors %d\n",
dot11TimerLib.memPart->allocError);
printf("Timer deallocations errors %d\n",
dot11TimerLib.memPart->freeError);
printf("Timer allocations success %d\n",
dot11TimerLib.memPart->allocSuccess);
printf("Timer deallocations success %d\n",
dot11TimerLib.memPart->freeSuccess);
return OK;
}
/****************************************************************************
* dot11TimerTask - Central task for the timer library
*
* This task runs continuously. It pends on msgQReceive(), but uses the timeout
* feature of msgQReceive() to ensure that it will wake up before the next
* event, even if there hasn't been any messages.
*
* RETURNS: none
*
* ERRNO: N/A
*/
LOCAL void dot11TimerTask()
{
INT32 nextEvent = WAIT_FOREVER; /* Next wakeup point */
DOT11_TIMER_REQ req; /* Buffer to read request into */
STATUS status;
DOT11_TIMER * pBug;
FOREVER
{
status = msgQReceive(dot11TimerLib.timerQueue, (char *)&req,
sizeof(DOT11_TIMER_REQ), nextEvent);
DOT11_TIMER_LOG("dot11TimerTask: running\n",0,0,0,0,0,0);
/* Perform the operation we just dequeued, if a message was dequeued.
A status of ERROR could mean several things, including a simple
timeout */
if ((status != ERROR) &&(dot11TimerOpFuncs[req.operation] != NULL))
{
(dot11TimerOpFuncs[req.operation])(&req);
}
if (req.operation == DOT11_TIMER_QUIT)
{
/* Flush all timers from the queue */
dot11TimerFlush();
break;
}
/* See if any events timed out */
while ((dot11TimerLib.pHead != NULL) &&
(dot11TimerLib.pHead->fireTime <= tickGet()))
{
DOT11_TIMER_LOG("dot11TimerTask: event running tid=%d\n",
dot11TimerLib.pHead->timerId,0,0,0,0,0);
/* Call the action from tNetTask()*/
if (netJobAdd(dot11TimerLib.pHead->action,
dot11TimerLib.pHead->actionParam0,
dot11TimerLib.pHead->actionParam1,2,3,4) != OK)
{
DOT11_TIMER_LOG("Error adding timer netJob\n",0,0,0,0,0,0);
/* Just call it directly, so that the event is not lost. */
(dot11TimerLib.pHead->action)(dot11TimerLib.pHead->actionParam0,
dot11TimerLib.pHead->actionParam1);
}
/* Remove the timer */
pBug = dot11TimerLib.pHead;
dot11TimerLib.pHead = dot11TimerLib.pHead->pNext;
DOT11_TIMER_FREE((char*)pBug);
}
/* Calculate the next delay time*/
if (dot11TimerLib.pHead == NULL)
{
nextEvent = WAIT_FOREVER;
}
else
{
/* Calculate how long we need to wait for the next message */
nextEvent = (dot11TimerLib.pHead->fireTime - tickGet());
if (nextEvent < 0)
{
nextEvent = NO_WAIT;
}
}
req.operation = DOT11_TIMER_NOP;
}
DOT11_TIMER_LOG("dot11TimerTask: deleting\n",0,0,0,0,0,0);
/* Permanent existential discontinuity */
}
/****************************************************************************
* dot11TimerOpAdd - Adds a timer to the timer list
*
* This routine inserts a timer on the timer list. Since the timer list is
* sorted by firing time, the entry is added in the appropriate place. In the
* event of multiple events firing at the same time, the new event is placed
* after all the existing events to fire at that time
*
* RETURNS: OK or ERROR on allocation error
*
* ERRNO: N/A
*/
LOCAL STATUS dot11TimerOpAdd
(
DOT11_TIMER_REQ * pReq
)
{
DOT11_TIMER * pNewTimer;
DOT11_TIMER * pBug;
if (dot11TimerUsage == 0)
{
DOT11_TIMER_LOG("dot11TimerOpAdd: not initialized\n",0,0,0,0,0,0);
return ERROR;
}
/* Sanity check */
if (pReq->operation != DOT11_TIMER_ADD)
{
DOT11_TIMER_LOG("dot11TimerOpAdd: Not addition msg\n",0,0,0,0,0,0);
return ERROR;
}
if ((pNewTimer =
(DOT11_TIMER *)DOT11_TIMER_ALLOC(1, sizeof(DOT11_TIMER)))
== NULL)
{
DOT11_TIMER_LOG("dot11TimerOpAdd: allocation error\n",0,0,0,0,0,0);
return ERROR;
}
pNewTimer->timerId = pReq->timerId;
pNewTimer->fireTime = pReq->fireTime;
pNewTimer->action = pReq->actionPtr;
pNewTimer->actionParam0 = pReq->param0;
pNewTimer->actionParam1 = pReq->param1;
/* Link the new timer into the LL - a sorted insertion */
if ((dot11TimerLib.pHead == NULL) ||
(dot11TimerLib.pHead->fireTime > pNewTimer->fireTime))
{
/* This is the easiest case. If there's nothing on the queue or
nothing to fire earlier on the queue, then this just becomes the
first item on the queue */
pNewTimer->pNext = dot11TimerLib.pHead;
dot11TimerLib.pHead = pNewTimer;
}
else
{
/* We know that the first item on the queue is earlier or the same
firetime as us. Thus, search for either the packet before the end of
the queue or the last packet before the first one with a greater
firetime than us */
pBug = dot11TimerLib.pHead;
while ((pBug->pNext != NULL) && (pBug->pNext->fireTime <=
pNewTimer->fireTime))
{
pBug = pBug->pNext;
}
/* Now we know that we need to insert after pBug */
pNewTimer->pNext = pBug->pNext;
pBug->pNext = pNewTimer;
}
return OK;
}
/****************************************************************************
* dot11TimerOpDel - Deletes a specific entry on the timer list
*
* This function searches all of the entries on the timer queue. If one matches
* the given <timerId>, then it will be deleted.
*
* The case where the timer has already been deleted is accounted for.
*
* RETURNS: OK or ERROR if timer not found
*
* ERRNO: N/A
*/
LOCAL STATUS dot11TimerOpDel
(
DOT11_TIMER_REQ * pReq /* Request structure */
)
{
DOT11_TIMER * pBug;
DOT11_TIMER * pLast;
if (dot11TimerUsage == 0)
{
DOT11_TIMER_LOG("dot11TimerOpDel: Not init\n",0,0,0,0,0,0);
return ERROR;
}
DOT11_TIMER_LOG("dot11TimerOpDel: Deleting %d\n",pReq->timerId,0,0,0,0,0);
/* Check the special case where the head is the match */
if ((dot11TimerLib.pHead != NULL) &&
(dot11TimerLib.pHead->timerId == pReq->timerId))
{
pLast = dot11TimerLib.pHead;
dot11TimerLib.pHead = dot11TimerLib.pHead->pNext;
DOT11_TIMER_FREE((char*)pLast);
}
else
{
pBug = pLast = dot11TimerLib.pHead;
/* Search for your particular timerId */
while ((pBug != NULL) && (pBug->timerId != pReq->timerId))
{
pLast = pBug;
pBug = pBug->pNext;
}
/* See if we found a match or exited because we hit the end of the
LL */
if (pBug != NULL)
{
pLast->pNext = pBug->pNext;
DOT11_TIMER_FREE((char*)pBug);
}
else
{
DOT11_TIMER_LOG("dot11TimerOpDel: TimerId %d not found\n",
pReq->timerId,0,0,0,0,0);
}
}
return OK;
}
/****************************************************************************
* dot11TimerFlush - Deletes all pending timers
*
* This routine is used to clear all currently waiting timers on the timer
* list.
*
* RETURNS: none
*
* ERRNO: N/A
*/
LOCAL STATUS dot11TimerFlush()
{
DOT11_TIMER * pBug;
DOT11_TIMER * pLast;
DOT11_TIMER_LOG("dot11TimerFlush: flushing\n",0,0,0,0,0,0);
pBug = pLast = dot11TimerLib.pHead;
while (pBug != NULL)
{
pLast = pBug;
pBug = pBug->pNext;
DOT11_TIMER_FREE((char*)pLast);
}
dot11TimerLib.pHead = NULL;
return OK;
}
/****************************************************************************
* dot11TimerCalloc - Allocates and clears a block of memory from the
* libraries private memory pool.
*
* This routine attempts to allocate a block of memory from the
* dot11TimerLibs private memory pool. On success the block is cleared and
* the allocation success state variable is incremented. On failure the
* the allocation error state variable is incremented. Once the above
* operations are complete a pointer to the memory block is returned to
* the callee.
*
* RETURNS:
* a reference to a valid memory block on success, else NULL on error.
*
* ERRNO: N/A
*/
LOCAL void* dot11TimerCalloc
(
size_t elemNum, /* Number of elements to clear */
size_t elemSize /* Size of each element */
)
{
void* pBlock;
size_t nBytes = (size_t)(elemNum*elemSize);
/* Allocate a buffer from the memory partition */
if ((pBlock = memPartAlloc(dot11TimerLib.memPart->id,
(UINT32)nBytes))
!= NULL)
{
/* Clear the allocated buffer */
(void)memset(pBlock, 0, nBytes);
/* For each allocation success update the statistics
counter */
dot11TimerLib.memPart->allocSuccess++;
}
else
{
/* For each allocation error update the statistics
counter */
dot11TimerLib.memPart->allocError++;
}
/* Return the reference to the callee */
return(pBlock);
}
/****************************************************************************
* dot11TimerFree - Releases a block of memory to the libraries private
* memory pool.
*
* This routine attempts to deallocate a block of memory from the
* dot11TimerLibs private memory pool. On success the dealloction success
* state variable is incremented. On failure the the dealloction error state
* variable is incremented. Once the above operations are complete a status
* value of ERROR or SUCCESS is returned to the callee.
*
* RETURNS:
* SUCCESS on successful deallocation, else ERROR.
*
* ERRNO: N/A
*/
LOCAL STATUS dot11TimerFree
(
char* pBlock /* Reference to an allocated memory block */
)
{
STATUS retVal;
/* Attempt to free the allocated block */
if ((retVal = memPartFree(dot11TimerLib.memPart->id, pBlock))
== ERROR)
{
/* For each deallocation error update the statistics
counter */
dot11TimerLib.memPart->freeError++;
}
else
{
/* For each deallocation success update the statistics
counter */
dot11TimerLib.memPart->freeSuccess++;
}
/* Reclaim the allocated block */
return(retVal);
}
@@ -0,0 +1,82 @@
# Makefile for Wind River Wireless Ethernet driver
#
# modification history
# --------------------
# 01l,23sep10,hfc remove support of non-Vxbus wifi drivers
# 01k,22jan10,uol Adding ipssl2 include path, required when using
# ipcom_pautoconf.h.
# 01j,16oct08,hfc fix for defect WIND00139230
# 01i,16sep08,dwb Fix for WIND00134302
# 01h,10jul08,hfc replace findstring SMP with _WRS_CONFIG_SMP to adopt vsb
# notion
# 01g,27feb08,hfc add support for atheros vxbus/smp driver
# 01f,28jun07,spw Disable SMP builds
# 01e,31aug05,dxb Now look for install.h to verify SNMP is installed AND
# built.
# 01d,15aug05,rb Tweak timestamp for 2.1.1 release
# 01c,01jun05,dxb Added "man" target for Cyclops doc build.
# 01b,17aug04,dxb Added rule to build objects only when SNMP present.
# 01a,28apr04,dxb Created.
#
# DESCRIPTION
# This file contains the Makefile rules for building the Wind River
# 802dot11 MIB files.
TGT_DIR = $(WIND_BASE)/target
LIB_BASE_NAME = wlanVxbEnd
include $(TGT_DIR)/h/make/defs.library
ifndef _WRS_CONFIG_WLAN_ATH
all : rclean
endif
# If SNMP was installed and built, then install.h should be present
IS_DOT11SNMP := $(wildcard $(TGT_DIR)/h/wrn/wm/common/install.h)
# only build the current directory if WIND MANAGE SNMP is present
ifneq ($(IS_DOT11SNMP),)
C_SOURCE = $(wildcard *.c)
OBJS_wlanVxbEnd = $(C_SOURCE:.c=.o)
CFLAGS_LIB_wlanVxbEnd = -DVXBUS
ifeq ($(IP_PORT_VXWORKS),)
WR_IPCOM_NAME := vxworks
WR_IPCOM_VERSION := $(filter-out $(WR_IPCOM_NAME), $(subst -, ,$(WIND_PLATFORM)))
WR_IPCOM_VERSION := $(subst .,,$(WR_IPCOM_VERSION))
EXTRA_DEFINE += -DIP_PORT_VXWORKS=$(WR_IPCOM_VERSION)
endif
IPNET_ROOT_PATH := $(subst \,/,$(WRVX_COMPBASE))/$(subst \,/,$(COMP_IPNET2))
INCLUDE_CC += -I$(IPNET_ROOT_PATH)/ipnet2/include
INCLUDE_CC += -I$(IPNET_ROOT_PATH)/ipnet2/config
INCLUDE_CC += -I$(IPNET_ROOT_PATH)/ipcom/port/vxworks/include
INCLUDE_CC += -I$(IPNET_ROOT_PATH)/ipcom/port/vxworks/config
INCLUDE_CC += -I$(IPNET_ROOT_PATH)/ipcom/include
INCLUDE_CC += -I$(IPNET_ROOT_PATH)/ipcom/config
EXTRA_INCLUDE += -I$(IPNET_ROOT_PATH)/ipcrypto/openssl-0_9_8/include \
-I$(IPNET_ROOT_PATH)/ipcrypto/include \
-I$(IPNET_ROOT_PATH)/ipcrypto/config \
-I$(IPNET_ROOT_PATH)/ipssl2/include \
-I$(IPNET_ROOT_PATH)/ipssl2/config
include $(TGT_DIR)/h/make/rules.library
# if WIND MANAGE SNMP is not available, print a status message
else
default :
@echo
@echo SNMP component not available - this directory was not compiled
@echo
man :
include $(TGT_DIR)/h/make/rules.library
endif
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,95 @@
/******************************************************************************
******************************************************************************
**** This file was automatically generated by Wind River's
**** WindManage MIB Compiler, version 9.3.
**** This file was generated using the -skel.h switch.
****
**** This file contains declarations of stub functions to aid in building
**** the agent MIB interface. It declares all the MIB get, set, test and
**** next method routines that you will need to supply. You'll probably
**** want to FORCE-INCLUDE this file when using the -mib.c output mode.
****
**** To generate the skeletal stub functions themselves, run the MIB compiler
**** with the -skel switch.
****
**** YOU MAY MODIFY THIS FILE BUT BEWARE ACCIDENTALLY OVERWRITING IT
**** BY REGENERATING IT WITH THE MIB COMPILER.
****
**** Last build date: Mon Mar 17 11:30:36 2003
**** from files:
**** C:\PCDMIPS\target\src\wrn\wm\snmp\std-mibs\rfc1213.mib,
**** C:\PCDMIPS\target\src\wrn\wlan\newMib\ieee802dot11MIB.mib
**** starting from node: ieee802dot11
******************************************************************************
******************************************************************************
*/
void dot11StationConfigEntryGet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11StationConfigEntrySet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11StationConfigEntryTest(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11StationConfigEntryNext(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void null_next_async(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11AuthenticationAlgorithmsEntryGet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11AuthenticationAlgorithmsEntryNext(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11AuthenticationAlgorithmsEntrySet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11AuthenticationAlgorithmsEntryTest(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11WEPDefaultKeysEntryGet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11WEPDefaultKeysEntrySet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11WEPDefaultKeysEntryTest(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11WEPDefaultKeysEntryNext(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11WEPKeyMappingsEntryGet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11WEPKeyMappingsEntrySet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11WEPKeyMappingsEntryTest(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11WEPKeyMappingsEntryNext(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PrivacyEntryGet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PrivacyEntrySet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PrivacyEntryTest(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PrivacyEntryNext(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11OperationEntryGet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11OperationEntryNext(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11OperationEntrySet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11OperationEntryTest(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11CountersEntryGet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11CountersEntryNext(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11GroupAddressesEntryGet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11GroupAddressesEntrySet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11GroupAddressesEntryTest(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11GroupAddressesEntryNext(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11resAttributeGet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11resAttributeNext(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11ResourceInfoEntryGet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11ResourceInfoEntryNext(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PhyOperationEntryGet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PhyOperationEntryNext(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PhyOperationEntrySet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PhyOperationEntryTest(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PhyAntennaEntryGet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PhyAntennaEntrySet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PhyAntennaEntryTest(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PhyAntennaEntryNext(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PhyTxPowerEntryGet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PhyTxPowerEntryNext(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PhyTxPowerEntrySet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PhyTxPowerEntryTest(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PhyFHSSEntryGet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PhyFHSSEntryNext(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PhyFHSSEntrySet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PhyFHSSEntryTest(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PhyDSSSEntryGet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PhyDSSSEntrySet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PhyDSSSEntryTest(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PhyDSSSEntryNext(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PhyIREntryGet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PhyIREntrySet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PhyIREntryTest(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11PhyIREntryNext(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11RegDomainsSupportEntryGet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11RegDomainsSupportEntryNext(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11AntennasListEntryGet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11AntennasListEntrySet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11AntennasListEntryTest(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11AntennasListEntryNext(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11SupportedDataRatesTxEntryGet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11SupportedDataRatesTxEntryNext(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11SupportedDataRatesRxEntryGet(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
void dot11SupportedDataRatesRxEntryNext(OIDC_T, int, OIDC_T*, SNMP_PKT_T*, VB_T*);
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,320 @@
/******************************************************************************
******************************************************************************
**** This file was automatically generated by Wind River's
**** WindManage MIB Compiler, version 9.3.
**** This file was generated using the -leaf switch.
****
**** This file #defines C preprocessor macros providing a variety of
**** information for the leaf objects in the MIB.
****
**** The file includes a LEAF_xxx macro for each leaf object in the
**** MIB (xxx is replaced by the object's name). The value of the
**** LEAF_xxx macro is the final component of the object's object
**** identifier.
****
**** If the object's SYNTAX clause included named INTEGER values,
**** then there is a VAL_xxx_yyy macro for each named value (xxx is
**** replaced by the object's name and yyy by the value's name). The
**** value of the VAL_xxx_yyy macro is the value associated with the
**** named value.
****
**** If the object's SYNTAX clause specified a set of range limitations
**** for the value of the object, then there are one or more sets of
**** MIN_xxx and MAX_xxx macros specifying the lower and upper bound of
**** each range limitation.
****
**** If the object's SYNTAX clause specified a set of size constraints
**** for the value of the object, then there are one or more sets of
**** MINSIZE_xxx and MAXSIZE_xxx macros specifying the lower and upper
**** bound of each size constraint. (If the size constraint is a single
**** value rather than a range then the MINSIZE_xxx and MAXSIZE_xxx
**** macros are replaced by a single SIZE_xxx macro.)
****
**** DO NOT MODIFY THIS FILE BY HAND.
****
**** Last build date: Mon Mar 17 11:30:36 2003
**** from files:
**** C:\PCDMIPS\target\src\wrn\wm\snmp\std-mibs\rfc1213.mib,
**** C:\PCDMIPS\target\src\wrn\wlan\newMib\ieee802dot11MIB.mib
**** starting from node: ieee802dot11
******************************************************************************
******************************************************************************
*/
#define LEAF_dot11StationID 1
#define SIZE_dot11StationID 6L
#define LEAF_dot11MediumOccupancyLimit 2
#define MIN_dot11MediumOccupancyLimit 0L
#define MAX_dot11MediumOccupancyLimit 1000L
#define LEAF_dot11CFPollable 3
#define VAL_dot11CFPollable_true 1L
#define VAL_dot11CFPollable_false 2L
#define LEAF_dot11CFPPeriod 4
#define MIN_dot11CFPPeriod 0L
#define MAX_dot11CFPPeriod 255L
#define LEAF_dot11CFPMaxDuration 5
#define MIN_dot11CFPMaxDuration 0L
#define MAX_dot11CFPMaxDuration 65535L
#define LEAF_dot11AuthenticationResponseTimeOut 6
#define MIN_dot11AuthenticationResponseTimeOut 1L
#define MAX_dot11AuthenticationResponseTimeOut 4294967295L
#define LEAF_dot11PrivacyOptionImplemented 7
#define VAL_dot11PrivacyOptionImplemented_true 1L
#define VAL_dot11PrivacyOptionImplemented_false 2L
#define LEAF_dot11PowerManagementMode 8
#define VAL_dot11PowerManagementMode_active 1L
#define VAL_dot11PowerManagementMode_powersave 2L
#define LEAF_dot11DesiredSSID 9
#define MINSIZE_dot11DesiredSSID 0L
#define MAXSIZE_dot11DesiredSSID 32L
#define LEAF_dot11DesiredBSSType 10
#define VAL_dot11DesiredBSSType_infrastructure 1L
#define VAL_dot11DesiredBSSType_independent 2L
#define VAL_dot11DesiredBSSType_any 3L
#define LEAF_dot11OperationalRateSet 11
#define MINSIZE_dot11OperationalRateSet 1L
#define MAXSIZE_dot11OperationalRateSet 126L
#define LEAF_dot11BeaconPeriod 12
#define MIN_dot11BeaconPeriod 1L
#define MAX_dot11BeaconPeriod 65535L
#define LEAF_dot11DTIMPeriod 13
#define MIN_dot11DTIMPeriod 1L
#define MAX_dot11DTIMPeriod 255L
#define LEAF_dot11AssociationResponseTimeOut 14
#define MIN_dot11AssociationResponseTimeOut 1L
#define MAX_dot11AssociationResponseTimeOut 4294967295L
#define LEAF_dot11DisassociateReason 15
#define MIN_dot11DisassociateReason 0L
#define MAX_dot11DisassociateReason 65535L
#define LEAF_dot11DisassociateStation 16
#define SIZE_dot11DisassociateStation 6L
#define LEAF_dot11DeauthenticateReason 17
#define MIN_dot11DeauthenticateReason 0L
#define MAX_dot11DeauthenticateReason 65535L
#define LEAF_dot11DeauthenticateStation 18
#define SIZE_dot11DeauthenticateStation 6L
#define LEAF_dot11AuthenticateFailStatus 19
#define MIN_dot11AuthenticateFailStatus 0L
#define MAX_dot11AuthenticateFailStatus 65535L
#define LEAF_dot11AuthenticateFailStation 20
#define SIZE_dot11AuthenticateFailStation 6L
#define LEAF_dot11AuthenticationAlgorithmsIndex 1
#define LEAF_dot11AuthenticationAlgorithm 2
#define VAL_dot11AuthenticationAlgorithm_openSystem 1L
#define VAL_dot11AuthenticationAlgorithm_sharedKey 2L
#define LEAF_dot11AuthenticationAlgorithmsEnable 3
#define VAL_dot11AuthenticationAlgorithmsEnable_true 1L
#define VAL_dot11AuthenticationAlgorithmsEnable_false 2L
#define LEAF_dot11WEPDefaultKeyIndex 1
#define MIN_dot11WEPDefaultKeyIndex 1L
#define MAX_dot11WEPDefaultKeyIndex 4L
#define LEAF_dot11WEPDefaultKeyValue 2
#define SIZE_dot11WEPDefaultKeyValue 5L
#define LEAF_dot11WEPKeyMappingIndex 1
#define LEAF_dot11WEPKeyMappingAddress 2
#define SIZE_dot11WEPKeyMappingAddress 6L
#define LEAF_dot11WEPKeyMappingWEPOn 3
#define VAL_dot11WEPKeyMappingWEPOn_true 1L
#define VAL_dot11WEPKeyMappingWEPOn_false 2L
#define LEAF_dot11WEPKeyMappingValue 4
#define SIZE_dot11WEPKeyMappingValue 5L
#define LEAF_dot11WEPKeyMappingStatus 5
#define VAL_dot11WEPKeyMappingStatus_active 1L
#define VAL_dot11WEPKeyMappingStatus_notInService 2L
#define VAL_dot11WEPKeyMappingStatus_notReady 3L
#define VAL_dot11WEPKeyMappingStatus_createAndGo 4L
#define VAL_dot11WEPKeyMappingStatus_createAndWait 5L
#define VAL_dot11WEPKeyMappingStatus_destroy 6L
#define LEAF_dot11PrivacyInvoked 1
#define VAL_dot11PrivacyInvoked_true 1L
#define VAL_dot11PrivacyInvoked_false 2L
#define LEAF_dot11WEPDefaultKeyID 2
#define MIN_dot11WEPDefaultKeyID 0L
#define MAX_dot11WEPDefaultKeyID 3L
#define LEAF_dot11WEPKeyMappingLength 3
#define MIN_dot11WEPKeyMappingLength 10L
#define MAX_dot11WEPKeyMappingLength 4294967295L
#define LEAF_dot11ExcludeUnencrypted 4
#define VAL_dot11ExcludeUnencrypted_true 1L
#define VAL_dot11ExcludeUnencrypted_false 2L
#define LEAF_dot11WEPICVErrorCount 5
#define LEAF_dot11WEPExcludedCount 6
#define LEAF_dot11MACAddress 1
#define SIZE_dot11MACAddress 6L
#define LEAF_dot11RTSThreshold 2
#define MIN_dot11RTSThreshold 0L
#define MAX_dot11RTSThreshold 2347L
#define LEAF_dot11ShortRetryLimit 3
#define MIN_dot11ShortRetryLimit 1L
#define MAX_dot11ShortRetryLimit 255L
#define LEAF_dot11LongRetryLimit 4
#define MIN_dot11LongRetryLimit 1L
#define MAX_dot11LongRetryLimit 255L
#define LEAF_dot11FragmentationThreshold 5
#define MIN_dot11FragmentationThreshold 256L
#define MAX_dot11FragmentationThreshold 2346L
#define LEAF_dot11MaxTransmitMSDULifetime 6
#define MIN_dot11MaxTransmitMSDULifetime 1L
#define MAX_dot11MaxTransmitMSDULifetime 4294967295L
#define LEAF_dot11MaxReceiveLifetime 7
#define MIN_dot11MaxReceiveLifetime 1L
#define MAX_dot11MaxReceiveLifetime 4294967295L
#define LEAF_dot11ManufacturerID 8
#define MINSIZE_dot11ManufacturerID 0L
#define MAXSIZE_dot11ManufacturerID 128L
#define LEAF_dot11ProductID 9
#define MINSIZE_dot11ProductID 0L
#define MAXSIZE_dot11ProductID 128L
#define LEAF_dot11TransmittedFragmentCount 1
#define LEAF_dot11MulticastTransmittedFrameCount 2
#define LEAF_dot11FailedCount 3
#define LEAF_dot11RetryCount 4
#define LEAF_dot11MultipleRetryCount 5
#define LEAF_dot11FrameDuplicateCount 6
#define LEAF_dot11RTSSuccessCount 7
#define LEAF_dot11RTSFailureCount 8
#define LEAF_dot11ACKFailureCount 9
#define LEAF_dot11ReceivedFragmentCount 10
#define LEAF_dot11MulticastReceivedFrameCount 11
#define LEAF_dot11FCSErrorCount 12
#define LEAF_dot11TransmittedFrameCount 13
#define LEAF_dot11WEPUndecryptableCount 14
#define LEAF_dot11GroupAddressesIndex 1
#define LEAF_dot11Address 2
#define SIZE_dot11Address 6L
#define LEAF_dot11GroupAddressesStatus 3
#define VAL_dot11GroupAddressesStatus_active 1L
#define VAL_dot11GroupAddressesStatus_notInService 2L
#define VAL_dot11GroupAddressesStatus_notReady 3L
#define VAL_dot11GroupAddressesStatus_createAndGo 4L
#define VAL_dot11GroupAddressesStatus_createAndWait 5L
#define VAL_dot11GroupAddressesStatus_destroy 6L
#define LEAF_dot11ResourceTypeIDName 1
#define SIZE_dot11ResourceTypeIDName 4L
#define LEAF_dot11manufacturerOUI 1
#define SIZE_dot11manufacturerOUI 3L
#define LEAF_dot11manufacturerName 2
#define MINSIZE_dot11manufacturerName 0L
#define MAXSIZE_dot11manufacturerName 128L
#define LEAF_dot11manufacturerProductName 3
#define MINSIZE_dot11manufacturerProductName 0L
#define MAXSIZE_dot11manufacturerProductName 128L
#define LEAF_dot11manufacturerProductVersion 4
#define MINSIZE_dot11manufacturerProductVersion 0L
#define MAXSIZE_dot11manufacturerProductVersion 128L
#define LEAF_dot11PHYType 1
#define VAL_dot11PHYType_fhss 1L
#define VAL_dot11PHYType_dsss 2L
#define VAL_dot11PHYType_irbaseband 3L
#define LEAF_dot11CurrentRegDomain 2
#define LEAF_dot11TempType 3
#define VAL_dot11TempType_tempType1 1L
#define VAL_dot11TempType_tempType2 2L
#define LEAF_dot11CurrentTxAntenna 1
#define MIN_dot11CurrentTxAntenna 1L
#define MAX_dot11CurrentTxAntenna 255L
#define LEAF_dot11DiversitySupport 2
#define VAL_dot11DiversitySupport_fixedlist 1L
#define VAL_dot11DiversitySupport_notsupported 2L
#define VAL_dot11DiversitySupport_dynamic 3L
#define LEAF_dot11CurrentRxAntenna 3
#define MIN_dot11CurrentRxAntenna 1L
#define MAX_dot11CurrentRxAntenna 255L
#define LEAF_dot11NumberSupportedPowerLevels 1
#define MIN_dot11NumberSupportedPowerLevels 1L
#define MAX_dot11NumberSupportedPowerLevels 8L
#define LEAF_dot11TxPowerLevel1 2
#define MIN_dot11TxPowerLevel1 0L
#define MAX_dot11TxPowerLevel1 10000L
#define LEAF_dot11TxPowerLevel2 3
#define MIN_dot11TxPowerLevel2 0L
#define MAX_dot11TxPowerLevel2 10000L
#define LEAF_dot11TxPowerLevel3 4
#define MIN_dot11TxPowerLevel3 0L
#define MAX_dot11TxPowerLevel3 10000L
#define LEAF_dot11TxPowerLevel4 5
#define MIN_dot11TxPowerLevel4 0L
#define MAX_dot11TxPowerLevel4 10000L
#define LEAF_dot11TxPowerLevel5 6
#define MIN_dot11TxPowerLevel5 0L
#define MAX_dot11TxPowerLevel5 10000L
#define LEAF_dot11TxPowerLevel6 7
#define MIN_dot11TxPowerLevel6 0L
#define MAX_dot11TxPowerLevel6 10000L
#define LEAF_dot11TxPowerLevel7 8
#define MIN_dot11TxPowerLevel7 0L
#define MAX_dot11TxPowerLevel7 10000L
#define LEAF_dot11TxPowerLevel8 9
#define MIN_dot11TxPowerLevel8 0L
#define MAX_dot11TxPowerLevel8 10000L
#define LEAF_dot11CurrentTxPowerLevel 10
#define MIN_dot11CurrentTxPowerLevel 1L
#define MAX_dot11CurrentTxPowerLevel 8L
#define LEAF_dot11HopTime 1
#define MIN_dot11HopTime 224L
#define MAX_dot11HopTime 224L
#define LEAF_dot11CurrentChannelNumber 2
#define MIN_dot11CurrentChannelNumber 0L
#define MAX_dot11CurrentChannelNumber 99L
#define LEAF_dot11MaxDwellTime 3
#define MIN_dot11MaxDwellTime 1L
#define MAX_dot11MaxDwellTime 65535L
#define LEAF_dot11CurrentDwellTime 4
#define MIN_dot11CurrentDwellTime 1L
#define MAX_dot11CurrentDwellTime 65535L
#define LEAF_dot11CurrentSet 5
#define MIN_dot11CurrentSet 1L
#define MAX_dot11CurrentSet 255L
#define LEAF_dot11CurrentPattern 6
#define MIN_dot11CurrentPattern 0L
#define MAX_dot11CurrentPattern 255L
#define LEAF_dot11CurrentIndex 7
#define MIN_dot11CurrentIndex 1L
#define MAX_dot11CurrentIndex 255L
#define LEAF_dot11CurrentChannel 1
#define MIN_dot11CurrentChannel 1L
#define MAX_dot11CurrentChannel 14L
#define LEAF_dot11CCAModeSupported 2
#define MIN_dot11CCAModeSupported 1L
#define MAX_dot11CCAModeSupported 7L
#define LEAF_dot11CurrentCCAMode 3
#define VAL_dot11CurrentCCAMode_edonly 1L
#define VAL_dot11CurrentCCAMode_csonly 2L
#define VAL_dot11CurrentCCAMode_edandcs 4L
#define LEAF_dot11EDThreshold 4
#define LEAF_dot11CCAWatchdogTimerMax 1
#define LEAF_dot11CCAWatchdogCountMax 2
#define LEAF_dot11CCAWatchdogTimerMin 3
#define LEAF_dot11CCAWatchdogCountMin 4
#define LEAF_dot11RegDomainsSupportIndex 1
#define LEAF_dot11RegDomainsSupportValue 2
#define VAL_dot11RegDomainsSupportValue_fcc 16L
#define VAL_dot11RegDomainsSupportValue_doc 32L
#define VAL_dot11RegDomainsSupportValue_etsi 48L
#define VAL_dot11RegDomainsSupportValue_spain 49L
#define VAL_dot11RegDomainsSupportValue_france 50L
#define VAL_dot11RegDomainsSupportValue_mkk 64L
#define LEAF_dot11AntennaListIndex 1
#define MIN_dot11AntennaListIndex 1L
#define MAX_dot11AntennaListIndex 255L
#define LEAF_dot11SupportedTxAntenna 2
#define VAL_dot11SupportedTxAntenna_true 1L
#define VAL_dot11SupportedTxAntenna_false 2L
#define LEAF_dot11SupportedRxAntenna 3
#define VAL_dot11SupportedRxAntenna_true 1L
#define VAL_dot11SupportedRxAntenna_false 2L
#define LEAF_dot11DiversitySelectionRx 4
#define VAL_dot11DiversitySelectionRx_true 1L
#define VAL_dot11DiversitySelectionRx_false 2L
#define LEAF_dot11SupportedDataRatesTxIndex 1
#define MIN_dot11SupportedDataRatesTxIndex 1L
#define MAX_dot11SupportedDataRatesTxIndex 8L
#define LEAF_dot11SupportedDataRatesTxValue 2
#define MIN_dot11SupportedDataRatesTxValue 2L
#define MAX_dot11SupportedDataRatesTxValue 127L
#define LEAF_dot11SupportedDataRatesRxIndex 1
#define MIN_dot11SupportedDataRatesRxIndex 1L
#define MAX_dot11SupportedDataRatesRxIndex 8L
#define LEAF_dot11SupportedDataRatesRxValue 2
#define MIN_dot11SupportedDataRatesRxValue 2L
#define MAX_dot11SupportedDataRatesRxValue 127L