/* src/prism2/driver/prism2mib.c * * Management request for mibset/mibget * * Copyright (C) 1999 AbsoluteValue Systems, Inc. All Rights Reserved. * -------------------------------------------------------------------- * * linux-wlan * * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * Alternatively, the contents of this file may be used under the * terms of the GNU Public License version 2 (the "GPL"), in which * case the provisions of the GPL are applicable instead of the * above. If you wish to allow the use of your version of this file * only under the terms of the GPL and not to allow others to use * your version of this file under the MPL, indicate your decision * by deleting the provisions above and replace them with the notice * and other provisions required by the GPL. If you do not delete * the provisions above, a recipient may use your version of this * file under either the MPL or the GPL. * * -------------------------------------------------------------------- * * Inquiries regarding the linux-wlan Open Source project can be * made directly to: * * AbsoluteValue Systems Inc. * info@linux-wlan.com * http://www.linux-wlan.com * * -------------------------------------------------------------------- * * Portions of the development of this software were funded by * Intersil Corporation as part of PRISM(R) chipset product development. * * -------------------------------------------------------------------- * * The functions in this file handle the mibset/mibget management * functions. * * -------------------------------------------------------------------- */ /*================================================================*/ /* System Includes */ #define WLAN_DBVAR prism2_debug #include "version.h" #include #include #include #include #include #include #include #include #include #include #include #include "wlan_compat.h" //#if (WLAN_HOSTIF == WLAN_PCMCIA) //#include //#include //#include //#include //#include //#include //#endif // //#if ((WLAN_HOSTIF == WLAN_PLX) || (WLAN_HOSTIF == WLAN_PCI)) //#include //#include //endif //#if (WLAN_HOSTIF == WLAN_USB) #include //#endif /*================================================================*/ /* Project Includes */ #include "p80211types.h" #include "p80211hdr.h" #include "p80211mgmt.h" #include "p80211conv.h" #include "p80211msg.h" #include "p80211netdev.h" #include "p80211metadef.h" #include "p80211metastruct.h" #include "hfa384x.h" #include "prism2mgmt.h" /*================================================================*/ /* Local Constants */ #define MIB_TMP_MAXLEN 200 /* Max length of RID record (in bytes). */ /*================================================================*/ /* Local Types */ #define F_AP 0x1 /* MIB is supported on Access Points. */ #define F_STA 0x2 /* MIB is supported on stations. */ #define F_READ 0x4 /* MIB may be read. */ #define F_WRITE 0x8 /* MIB may be written. */ typedef struct mibrec { UINT32 did; UINT16 flag; UINT16 parm1; UINT16 parm2; UINT16 parm3; int (*func)(struct mibrec *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data); } mibrec_t; /*================================================================*/ /* Local Function Declarations */ static int prism2mib_bytestr2pstr( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data); static int prism2mib_bytearea2pstr( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data); static int prism2mib_uint32( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data); static int prism2mib_uint32array( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data); static int prism2mib_uint32offset( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data); static int prism2mib_truth( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data); static int prism2mib_preamble( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data); static int prism2mib_flag( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data); static int prism2mib_appcfinfoflag( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data); static int prism2mib_regulatorydomains( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data); static int prism2mib_wepdefaultkey( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data); static int prism2mib_powermanagement( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data); static int prism2mib_privacyinvoked( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data); static int prism2mib_excludeunencrypted( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data); static int prism2mib_fragmentationthreshold( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data); static int prism2mib_operationalrateset( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data); static int prism2mib_groupaddress( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data); static int prism2mib_fwid( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data); static int prism2mib_authalg( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data); static int prism2mib_authalgenable( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data); static int prism2mib_priv( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data); static void prism2mib_priv_authlist( hfa384x_t *hw, prism2sta_authlist_t *list); static void prism2mib_priv_accessmode( hfa384x_t *hw, UINT32 mode); static void prism2mib_priv_accessallow( hfa384x_t *hw, p80211macarray_t *macarray); static void prism2mib_priv_accessdeny( hfa384x_t *hw, p80211macarray_t *macarray); static void prism2mib_priv_deauthenticate( hfa384x_t *hw, UINT8 *addr); /*================================================================*/ /* Local Static Definitions */ static mibrec_t mibtab[] = { /* dot11smt MIB's */ { DIDmib_dot11smt_dot11StationConfigTable_dot11StationID, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFOWNMACADDR, HFA384x_RID_CNFOWNMACADDR_LEN, 0, prism2mib_bytearea2pstr }, { DIDmib_dot11smt_dot11StationConfigTable_dot11MediumOccupancyLimit, F_AP | F_READ | F_WRITE, HFA384x_RID_CNFAPPCFINFO, HFA384x_RID_CNFAPPCFINFO_LEN, 0, prism2mib_uint32offset }, { DIDmib_dot11smt_dot11StationConfigTable_dot11CFPollable, F_STA | F_READ, HFA384x_RID_CFPOLLABLE, 0, 0, prism2mib_uint32 }, { DIDmib_dot11smt_dot11StationConfigTable_dot11CFPPeriod, F_AP | F_READ | F_WRITE, HFA384x_RID_CNFAPPCFINFO, HFA384x_RID_CNFAPPCFINFO_LEN, 1, prism2mib_uint32offset }, { DIDmib_dot11smt_dot11StationConfigTable_dot11CFPMaxDuration, F_AP | F_READ | F_WRITE, HFA384x_RID_CNFAPPCFINFO, HFA384x_RID_CNFAPPCFINFO_LEN, 2, prism2mib_uint32offset }, { DIDmib_dot11smt_dot11StationConfigTable_dot11AuthenticationResponseTimeOut, F_STA | F_READ | F_WRITE, HFA384x_RID_CNFAUTHRSPTIMEOUT, 0, 0, prism2mib_uint32 }, { DIDmib_dot11smt_dot11StationConfigTable_dot11PrivacyOptionImplemented, F_AP | F_STA | F_READ, HFA384x_RID_PRIVACYOPTIMP, 0, 0, prism2mib_uint32 }, { DIDmib_dot11smt_dot11StationConfigTable_dot11PowerManagementMode, F_STA | F_READ | F_WRITE, HFA384x_RID_CNFPMENABLED, 0, 0, prism2mib_powermanagement }, { DIDmib_dot11smt_dot11StationConfigTable_dot11DesiredSSID, F_STA | F_READ | F_WRITE, HFA384x_RID_CNFDESIREDSSID, HFA384x_RID_CNFDESIREDSSID_LEN, 0, prism2mib_bytestr2pstr }, { DIDmib_dot11smt_dot11StationConfigTable_dot11DesiredBSSType, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_priv }, { DIDmib_dot11smt_dot11StationConfigTable_dot11OperationalRateSet, F_STA | F_READ | F_WRITE, HFA384x_RID_TXRATECNTL, 0, 0, prism2mib_operationalrateset }, { DIDmib_dot11smt_dot11StationConfigTable_dot11OperationalRateSet, F_AP | F_READ | F_WRITE, HFA384x_RID_TXRATECNTL0, 0, 0, prism2mib_operationalrateset }, { DIDmib_dot11smt_dot11StationConfigTable_dot11BeaconPeriod, F_AP | F_READ | F_WRITE, HFA384x_RID_CNFAPBCNINT, 0, 0, prism2mib_uint32 }, { DIDmib_dot11smt_dot11StationConfigTable_dot11DTIMPeriod, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFOWNDTIMPER, 0, 0, prism2mib_uint32 }, { DIDmib_dot11smt_dot11StationConfigTable_dot11AssociationResponseTimeOut, F_AP | F_STA | F_READ, HFA384x_RID_PROTOCOLRSPTIME, 0, 0, prism2mib_uint32 }, { DIDmib_dot11smt_dot11AuthenticationAlgorithmsTable_dot11AuthenticationAlgorithm1, F_AP | F_STA | F_READ, 1, 0, 0, prism2mib_authalg }, { DIDmib_dot11smt_dot11AuthenticationAlgorithmsTable_dot11AuthenticationAlgorithm2, F_AP | F_STA | F_READ, 2, 0, 0, prism2mib_authalg }, { DIDmib_dot11smt_dot11AuthenticationAlgorithmsTable_dot11AuthenticationAlgorithm3, F_AP | F_STA | F_READ, 3, 0, 0, prism2mib_authalg }, { DIDmib_dot11smt_dot11AuthenticationAlgorithmsTable_dot11AuthenticationAlgorithm4, F_AP | F_STA | F_READ, 4, 0, 0, prism2mib_authalg }, { DIDmib_dot11smt_dot11AuthenticationAlgorithmsTable_dot11AuthenticationAlgorithm5, F_AP | F_STA | F_READ, 5, 0, 0, prism2mib_authalg }, { DIDmib_dot11smt_dot11AuthenticationAlgorithmsTable_dot11AuthenticationAlgorithm6, F_AP | F_STA | F_READ, 6, 0, 0, prism2mib_authalg }, { DIDmib_dot11smt_dot11AuthenticationAlgorithmsTable_dot11AuthenticationAlgorithmsEnable1, F_AP | F_STA | F_READ | F_WRITE, 1, 0, 0, prism2mib_authalgenable }, { DIDmib_dot11smt_dot11AuthenticationAlgorithmsTable_dot11AuthenticationAlgorithmsEnable2, F_AP | F_STA | F_READ | F_WRITE, 2, 0, 0, prism2mib_authalgenable }, { DIDmib_dot11smt_dot11AuthenticationAlgorithmsTable_dot11AuthenticationAlgorithmsEnable3, F_AP | F_STA | F_READ | F_WRITE, 3, 0, 0, prism2mib_authalgenable }, { DIDmib_dot11smt_dot11AuthenticationAlgorithmsTable_dot11AuthenticationAlgorithmsEnable4, F_AP | F_STA | F_READ | F_WRITE, 4, 0, 0, prism2mib_authalgenable }, { DIDmib_dot11smt_dot11AuthenticationAlgorithmsTable_dot11AuthenticationAlgorithmsEnable5, F_AP | F_STA | F_READ | F_WRITE, 5, 0, 0, prism2mib_authalgenable }, { DIDmib_dot11smt_dot11AuthenticationAlgorithmsTable_dot11AuthenticationAlgorithmsEnable6, F_AP | F_STA | F_READ | F_WRITE, 6, 0, 0, prism2mib_authalgenable }, { DIDmib_dot11smt_dot11WEPDefaultKeysTable_dot11WEPDefaultKey0, F_AP | F_STA | F_WRITE, HFA384x_RID_CNFWEPDEFAULTKEY0, 0, 0, prism2mib_wepdefaultkey }, { DIDmib_dot11smt_dot11WEPDefaultKeysTable_dot11WEPDefaultKey1, F_AP | F_STA | F_WRITE, HFA384x_RID_CNFWEPDEFAULTKEY1, 0, 0, prism2mib_wepdefaultkey }, { DIDmib_dot11smt_dot11WEPDefaultKeysTable_dot11WEPDefaultKey2, F_AP | F_STA | F_WRITE, HFA384x_RID_CNFWEPDEFAULTKEY2, 0, 0, prism2mib_wepdefaultkey }, { DIDmib_dot11smt_dot11WEPDefaultKeysTable_dot11WEPDefaultKey3, F_AP | F_STA | F_WRITE, HFA384x_RID_CNFWEPDEFAULTKEY3, 0, 0, prism2mib_wepdefaultkey }, { DIDmib_dot11smt_dot11PrivacyTable_dot11PrivacyInvoked, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFWEPFLAGS, HFA384x_WEPFLAGS_PRIVINVOKED, 0, prism2mib_privacyinvoked }, { DIDmib_dot11smt_dot11PrivacyTable_dot11WEPDefaultKeyID, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFWEPDEFAULTKEYID, 0, 0, prism2mib_uint32 }, { DIDmib_dot11smt_dot11PrivacyTable_dot11ExcludeUnencrypted, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFWEPFLAGS, HFA384x_WEPFLAGS_EXCLUDE, 0, prism2mib_excludeunencrypted }, { DIDmib_dot11phy_dot11PhyOperationTable_dot11ShortPreambleEnabled, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFSHORTPREAMBLE, 0, 0, prism2mib_preamble }, /* dot11mac MIB's */ { DIDmib_dot11mac_dot11OperationTable_dot11MACAddress, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFOWNMACADDR, HFA384x_RID_CNFOWNMACADDR_LEN, 0, prism2mib_bytearea2pstr }, { DIDmib_dot11mac_dot11OperationTable_dot11RTSThreshold, F_STA | F_READ | F_WRITE, HFA384x_RID_RTSTHRESH, 0, 0, prism2mib_uint32 }, { DIDmib_dot11mac_dot11OperationTable_dot11RTSThreshold, F_AP | F_READ | F_WRITE, HFA384x_RID_RTSTHRESH0, 0, 0, prism2mib_uint32 }, { DIDmib_dot11mac_dot11OperationTable_dot11ShortRetryLimit, F_AP | F_STA | F_READ, HFA384x_RID_SHORTRETRYLIMIT, 0, 0, prism2mib_uint32 }, { DIDmib_dot11mac_dot11OperationTable_dot11LongRetryLimit, F_AP | F_STA | F_READ, HFA384x_RID_LONGRETRYLIMIT, 0, 0, prism2mib_uint32 }, { DIDmib_dot11mac_dot11OperationTable_dot11FragmentationThreshold, F_STA | F_READ | F_WRITE, HFA384x_RID_FRAGTHRESH, 0, 0, prism2mib_fragmentationthreshold }, { DIDmib_dot11mac_dot11OperationTable_dot11FragmentationThreshold, F_AP | F_READ | F_WRITE, HFA384x_RID_FRAGTHRESH0, 0, 0, prism2mib_fragmentationthreshold }, { DIDmib_dot11mac_dot11OperationTable_dot11MaxTransmitMSDULifetime, F_AP | F_STA | F_READ, HFA384x_RID_MAXTXLIFETIME, 0, 0, prism2mib_uint32 }, { DIDmib_dot11mac_dot11OperationTable_dot11MaxReceiveLifetime, F_AP | F_STA | F_READ, HFA384x_RID_MAXRXLIFETIME, 0, 0, prism2mib_uint32 }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address1, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address2, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address3, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address4, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address5, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address6, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address7, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address8, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address9, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address10, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address11, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address12, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address13, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address14, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address15, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address16, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address17, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address18, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address19, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address20, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address21, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address22, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address23, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address24, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address25, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address26, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address27, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address28, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address29, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address30, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address31, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, { DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address32, F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_groupaddress }, /* dot11phy MIB's */ { DIDmib_dot11phy_dot11PhyOperationTable_dot11PHYType, F_AP | F_STA | F_READ, HFA384x_RID_PHYTYPE, 0, 0, prism2mib_uint32 }, { DIDmib_dot11phy_dot11PhyOperationTable_dot11TempType, F_AP | F_STA | F_READ, HFA384x_RID_TEMPTYPE, 0, 0, prism2mib_uint32 }, { DIDmib_dot11phy_dot11PhyDSSSTable_dot11CurrentChannel, F_STA | F_READ, HFA384x_RID_CURRENTCHANNEL, 0, 0, prism2mib_uint32 }, { DIDmib_dot11phy_dot11PhyDSSSTable_dot11CurrentChannel, F_AP | F_READ, HFA384x_RID_CNFOWNCHANNEL, 0, 0, prism2mib_uint32 }, { DIDmib_dot11phy_dot11PhyDSSSTable_dot11CurrentCCAMode, F_AP | F_STA | F_READ, HFA384x_RID_CCAMODE, 0, 0, prism2mib_uint32 }, /* p2Table MIB's */ { DIDmib_p2_p2Table_p2MMTx, F_AP | F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_priv }, { DIDmib_p2_p2Table_p2EarlyBeacon, F_AP | F_READ | F_WRITE, BIT7, 0, 0, prism2mib_appcfinfoflag }, { DIDmib_p2_p2Table_p2ReceivedFrameStatistics, F_AP | F_STA | F_READ, 0, 0, 0, prism2mib_priv }, { DIDmib_p2_p2Table_p2CommunicationTallies, F_AP | F_STA | F_READ, 0, 0, 0, prism2mib_priv }, { DIDmib_p2_p2Table_p2Authenticated, F_AP | F_READ, 0, 0, 0, prism2mib_priv }, { DIDmib_p2_p2Table_p2Associated, F_AP | F_READ, 0, 0, 0, prism2mib_priv }, { DIDmib_p2_p2Table_p2PowerSaveUserCount, F_AP | F_READ, 0, 0, 0, prism2mib_priv }, { DIDmib_p2_p2Table_p2Comment, F_AP | F_STA | F_READ | F_WRITE, 0, 0, 0, prism2mib_priv }, { DIDmib_p2_p2Table_p2AccessMode, F_AP | F_READ | F_WRITE, 0, 0, 0, prism2mib_priv }, { DIDmib_p2_p2Table_p2AccessAllow, F_AP | F_READ | F_WRITE, 0, 0, 0, prism2mib_priv }, { DIDmib_p2_p2Table_p2AccessDeny, F_AP | F_READ | F_WRITE, 0, 0, 0, prism2mib_priv }, { DIDmib_p2_p2Table_p2ChannelInfoResults, F_AP | F_READ, 0, 0, 0, prism2mib_priv }, /* p2Static MIB's */ { DIDmib_p2_p2Static_p2CnfPortType, F_STA | F_READ | F_WRITE, HFA384x_RID_CNFPORTTYPE, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Static_p2CnfOwnMACAddress, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFOWNMACADDR, HFA384x_RID_CNFOWNMACADDR_LEN, 0, prism2mib_bytearea2pstr }, { DIDmib_p2_p2Static_p2CnfDesiredSSID, F_STA | F_READ | F_WRITE, HFA384x_RID_CNFDESIREDSSID, HFA384x_RID_CNFDESIREDSSID_LEN, 0, prism2mib_bytestr2pstr }, { DIDmib_p2_p2Static_p2CnfOwnChannel, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFOWNCHANNEL, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Static_p2CnfOwnSSID, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFOWNSSID, HFA384x_RID_CNFOWNSSID_LEN, 0, prism2mib_bytestr2pstr }, { DIDmib_p2_p2Static_p2CnfOwnATIMWindow, F_STA | F_READ | F_WRITE, HFA384x_RID_CNFOWNATIMWIN, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Static_p2CnfSystemScale, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFSYSSCALE, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Static_p2CnfMaxDataLength, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFMAXDATALEN, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Static_p2CnfWDSAddress, F_STA | F_READ | F_WRITE, HFA384x_RID_CNFWDSADDR, HFA384x_RID_CNFWDSADDR_LEN, 0, prism2mib_bytearea2pstr }, { DIDmib_p2_p2Static_p2CnfPMEnabled, F_STA | F_READ | F_WRITE, HFA384x_RID_CNFPMENABLED, 0, 0, prism2mib_truth }, { DIDmib_p2_p2Static_p2CnfPMEPS, F_STA | F_READ | F_WRITE, HFA384x_RID_CNFPMEPS, 0, 0, prism2mib_truth }, { DIDmib_p2_p2Static_p2CnfMulticastReceive, F_STA | F_READ | F_WRITE, HFA384x_RID_CNFMULTICASTRX, 0, 0, prism2mib_truth }, { DIDmib_p2_p2Static_p2CnfMaxSleepDuration, F_STA | F_READ | F_WRITE, HFA384x_RID_CNFMAXSLEEPDUR, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Static_p2CnfPMHoldoverDuration, F_STA | F_READ | F_WRITE, HFA384x_RID_CNFPMHOLDDUR, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Static_p2CnfOwnName, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFOWNNAME, HFA384x_RID_CNFOWNNAME_LEN, 0, prism2mib_bytestr2pstr }, { DIDmib_p2_p2Static_p2CnfOwnDTIMPeriod, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFOWNDTIMPER, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Static_p2CnfWDSAddress1, F_AP | F_READ | F_WRITE, HFA384x_RID_CNFWDSADDR1, HFA384x_RID_CNFWDSADDR1_LEN, 0, prism2mib_bytearea2pstr }, { DIDmib_p2_p2Static_p2CnfWDSAddress2, F_AP | F_READ | F_WRITE, HFA384x_RID_CNFWDSADDR2, HFA384x_RID_CNFWDSADDR2_LEN, 0, prism2mib_bytearea2pstr }, { DIDmib_p2_p2Static_p2CnfWDSAddress3, F_AP | F_READ | F_WRITE, HFA384x_RID_CNFWDSADDR3, HFA384x_RID_CNFWDSADDR3_LEN, 0, prism2mib_bytearea2pstr }, { DIDmib_p2_p2Static_p2CnfWDSAddress4, F_AP | F_READ | F_WRITE, HFA384x_RID_CNFWDSADDR4, HFA384x_RID_CNFWDSADDR4_LEN, 0, prism2mib_bytearea2pstr }, { DIDmib_p2_p2Static_p2CnfWDSAddress5, F_AP | F_READ | F_WRITE, HFA384x_RID_CNFWDSADDR5, HFA384x_RID_CNFWDSADDR5_LEN, 0, prism2mib_bytearea2pstr }, { DIDmib_p2_p2Static_p2CnfWDSAddress6, F_AP | F_READ | F_WRITE, HFA384x_RID_CNFWDSADDR6, HFA384x_RID_CNFWDSADDR6_LEN, 0, prism2mib_bytearea2pstr }, { DIDmib_p2_p2Static_p2CnfMulticastPMBuffering, F_AP | F_READ | F_WRITE, HFA384x_RID_CNFMCASTPMBUFF, 0, 0, prism2mib_truth }, { DIDmib_p2_p2Static_p2CnfWEPDefaultKeyID, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFWEPDEFAULTKEYID, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Static_p2CnfWEPDefaultKey0, F_AP | F_STA | F_WRITE, HFA384x_RID_CNFWEPDEFAULTKEY0, 0, 0, prism2mib_wepdefaultkey }, { DIDmib_p2_p2Static_p2CnfWEPDefaultKey1, F_AP | F_STA | F_WRITE, HFA384x_RID_CNFWEPDEFAULTKEY1, 0, 0, prism2mib_wepdefaultkey }, { DIDmib_p2_p2Static_p2CnfWEPDefaultKey2, F_AP | F_STA | F_WRITE, HFA384x_RID_CNFWEPDEFAULTKEY2, 0, 0, prism2mib_wepdefaultkey }, { DIDmib_p2_p2Static_p2CnfWEPDefaultKey3, F_AP | F_STA | F_WRITE, HFA384x_RID_CNFWEPDEFAULTKEY3, 0, 0, prism2mib_wepdefaultkey }, { DIDmib_p2_p2Static_p2CnfWEPFlags, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFWEPFLAGS, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Static_p2CnfAuthentication, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFAUTHENTICATION, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Static_p2CnfMaxAssociatedStations, F_AP | F_READ | F_WRITE, HFA384x_RID_CNFMAXASSOCSTATIONS, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Static_p2CnfTxControl, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFTXCONTROL, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Static_p2CnfRoamingMode, F_STA | F_READ | F_WRITE, HFA384x_RID_CNFROAMINGMODE, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Static_p2CnfHostAuthentication, F_AP | F_READ | F_WRITE, HFA384x_RID_CNFHOSTAUTHASSOC, 0, 0, prism2mib_truth }, { DIDmib_p2_p2Static_p2CnfRcvCrcError, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFRCVCRCERROR, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Static_p2CnfAltRetryCount, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFALTRETRYCNT, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Static_p2CnfBeaconInterval, F_AP | F_READ | F_WRITE, HFA384x_RID_CNFAPBCNINT, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Static_p2CnfMediumOccupancyLimit, F_AP | F_READ | F_WRITE, HFA384x_RID_CNFAPPCFINFO, HFA384x_RID_CNFAPPCFINFO_LEN, 0, prism2mib_uint32offset }, { DIDmib_p2_p2Static_p2CnfCFPPeriod, F_AP | F_READ | F_WRITE, HFA384x_RID_CNFAPPCFINFO, HFA384x_RID_CNFAPPCFINFO_LEN, 1, prism2mib_uint32offset }, { DIDmib_p2_p2Static_p2CnfCFPMaxDuration, F_AP | F_READ | F_WRITE, HFA384x_RID_CNFAPPCFINFO, HFA384x_RID_CNFAPPCFINFO_LEN, 2, prism2mib_uint32offset }, { DIDmib_p2_p2Static_p2CnfCFPFlags, F_AP | F_READ | F_WRITE, HFA384x_RID_CNFAPPCFINFO, HFA384x_RID_CNFAPPCFINFO_LEN, 3, prism2mib_uint32offset }, { DIDmib_p2_p2Static_p2CnfSTAPCFInfo, F_STA | F_READ | F_WRITE, HFA384x_RID_CNFSTAPCFINFO, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Static_p2CnfPriorityQUsage, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFPRIORITYQUSAGE, HFA384x_RID_CNFPRIOQUSAGE_LEN, 0, prism2mib_uint32array }, { DIDmib_p2_p2Static_p2CnfTIMCtrl, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFTIMCTRL, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Static_p2CnfThirty2Tally, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFTHIRTY2TALLY, 0, 0, prism2mib_truth }, { DIDmib_p2_p2Static_p2CnfEnhSecurity, F_AP | F_READ | F_WRITE, HFA384x_RID_CNFENHSECURITY, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Static_p2CnfShortPreamble, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFSHORTPREAMBLE, 0, 0, prism2mib_preamble }, { DIDmib_p2_p2Static_p2CnfExcludeLongPreamble, F_AP | F_READ | F_WRITE, HFA384x_RID_CNFEXCLONGPREAMBLE, 0, 0, prism2mib_truth }, { DIDmib_p2_p2Static_p2CnfAuthenticationRspTO, F_STA | F_READ | F_WRITE, HFA384x_RID_CNFAUTHRSPTIMEOUT, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Static_p2CnfBasicRates, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFBASICRATES, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Static_p2CnfSupportedRates, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_CNFSUPPRATES, 0, 0, prism2mib_uint32 }, /* p2Dynamic MIB's */ { DIDmib_p2_p2Dynamic_p2CreateIBSS, F_STA | F_READ | F_WRITE, HFA384x_RID_CREATEIBSS, 0, 0, prism2mib_truth }, { DIDmib_p2_p2Dynamic_p2FragmentationThreshold, F_STA | F_READ | F_WRITE, HFA384x_RID_FRAGTHRESH, 0, 0, prism2mib_fragmentationthreshold }, { DIDmib_p2_p2Dynamic_p2RTSThreshold, F_STA | F_READ | F_WRITE, HFA384x_RID_RTSTHRESH, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Dynamic_p2TxRateControl, F_STA | F_READ | F_WRITE, HFA384x_RID_TXRATECNTL, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Dynamic_p2PromiscuousMode, F_STA | F_READ | F_WRITE, HFA384x_RID_PROMISCMODE, 0, 0, prism2mib_truth }, { DIDmib_p2_p2Dynamic_p2FragmentationThreshold0, F_AP | F_READ | F_WRITE, HFA384x_RID_FRAGTHRESH0, 0, 0, prism2mib_fragmentationthreshold }, { DIDmib_p2_p2Dynamic_p2FragmentationThreshold1, F_AP | F_READ | F_WRITE, HFA384x_RID_FRAGTHRESH1, 0, 0, prism2mib_fragmentationthreshold }, { DIDmib_p2_p2Dynamic_p2FragmentationThreshold2, F_AP | F_READ | F_WRITE, HFA384x_RID_FRAGTHRESH2, 0, 0, prism2mib_fragmentationthreshold }, { DIDmib_p2_p2Dynamic_p2FragmentationThreshold3, F_AP | F_READ | F_WRITE, HFA384x_RID_FRAGTHRESH3, 0, 0, prism2mib_fragmentationthreshold }, { DIDmib_p2_p2Dynamic_p2FragmentationThreshold4, F_AP | F_READ | F_WRITE, HFA384x_RID_FRAGTHRESH4, 0, 0, prism2mib_fragmentationthreshold }, { DIDmib_p2_p2Dynamic_p2FragmentationThreshold5, F_AP | F_READ | F_WRITE, HFA384x_RID_FRAGTHRESH5, 0, 0, prism2mib_fragmentationthreshold }, { DIDmib_p2_p2Dynamic_p2FragmentationThreshold6, F_AP | F_READ | F_WRITE, HFA384x_RID_FRAGTHRESH6, 0, 0, prism2mib_fragmentationthreshold }, { DIDmib_p2_p2Dynamic_p2RTSThreshold0, F_AP | F_READ | F_WRITE, HFA384x_RID_RTSTHRESH0, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Dynamic_p2RTSThreshold1, F_AP | F_READ | F_WRITE, HFA384x_RID_RTSTHRESH1, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Dynamic_p2RTSThreshold2, F_AP | F_READ | F_WRITE, HFA384x_RID_RTSTHRESH2, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Dynamic_p2RTSThreshold3, F_AP | F_READ | F_WRITE, HFA384x_RID_RTSTHRESH3, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Dynamic_p2RTSThreshold4, F_AP | F_READ | F_WRITE, HFA384x_RID_RTSTHRESH4, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Dynamic_p2RTSThreshold5, F_AP | F_READ | F_WRITE, HFA384x_RID_RTSTHRESH5, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Dynamic_p2RTSThreshold6, F_AP | F_READ | F_WRITE, HFA384x_RID_RTSTHRESH6, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Dynamic_p2TxRateControl0, F_AP | F_READ | F_WRITE, HFA384x_RID_TXRATECNTL0, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Dynamic_p2TxRateControl1, F_AP | F_READ | F_WRITE, HFA384x_RID_TXRATECNTL1, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Dynamic_p2TxRateControl2, F_AP | F_READ | F_WRITE, HFA384x_RID_TXRATECNTL2, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Dynamic_p2TxRateControl3, F_AP | F_READ | F_WRITE, HFA384x_RID_TXRATECNTL3, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Dynamic_p2TxRateControl4, F_AP | F_READ | F_WRITE, HFA384x_RID_TXRATECNTL4, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Dynamic_p2TxRateControl5, F_AP | F_READ | F_WRITE, HFA384x_RID_TXRATECNTL5, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Dynamic_p2TxRateControl6, F_AP | F_READ | F_WRITE, HFA384x_RID_TXRATECNTL6, 0, 0, prism2mib_uint32 }, /* p2Behavior MIB's */ { DIDmib_p2_p2Behavior_p2TickTime, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_ITICKTIME, 0, 0, prism2mib_uint32 }, /* p2NIC MIB's */ { DIDmib_p2_p2NIC_p2MaxLoadTime, F_AP | F_STA | F_READ, HFA384x_RID_MAXLOADTIME, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2NIC_p2DLBufferPage, F_AP | F_STA | F_READ, HFA384x_RID_DOWNLOADBUFFER, HFA384x_RID_DOWNLOADBUFFER_LEN, 0, prism2mib_uint32offset }, { DIDmib_p2_p2NIC_p2DLBufferOffset, F_AP | F_STA | F_READ, HFA384x_RID_DOWNLOADBUFFER, HFA384x_RID_DOWNLOADBUFFER_LEN, 1, prism2mib_uint32offset }, { DIDmib_p2_p2NIC_p2DLBufferLength, F_AP | F_STA | F_READ, HFA384x_RID_DOWNLOADBUFFER, HFA384x_RID_DOWNLOADBUFFER_LEN, 2, prism2mib_uint32offset }, { DIDmib_p2_p2NIC_p2PRIIdentity, F_AP | F_STA | F_READ, HFA384x_RID_PRIIDENTITY, HFA384x_RID_PRIIDENTITY_LEN, 0, prism2mib_uint32array }, { DIDmib_p2_p2NIC_p2PRISupRange, F_AP | F_STA | F_READ, HFA384x_RID_PRISUPRANGE, HFA384x_RID_PRISUPRANGE_LEN, 0, prism2mib_uint32array }, { DIDmib_p2_p2NIC_p2CFIActRanges, F_AP | F_STA | F_READ, HFA384x_RID_PRI_CFIACTRANGES, HFA384x_RID_CFIACTRANGES_LEN, 0, prism2mib_uint32array }, { DIDmib_p2_p2NIC_p2BuildSequence, F_AP | F_STA | F_READ, HFA384x_RID_BUILDSEQ, HFA384x_RID_BUILDSEQ_LEN, 0, prism2mib_uint32array }, { DIDmib_p2_p2NIC_p2PrimaryFWID, F_AP | F_STA | F_READ, 0, 0, 0, prism2mib_fwid }, { DIDmib_p2_p2NIC_p2SecondaryFWID, F_AP | F_STA | F_READ, 0, 0, 0, prism2mib_fwid }, { DIDmib_p2_p2NIC_p2TertiaryFWID, F_AP | F_READ, 0, 0, 0, prism2mib_fwid }, { DIDmib_p2_p2NIC_p2NICSerialNumber, F_AP | F_STA | F_READ, HFA384x_RID_NICSERIALNUMBER, HFA384x_RID_NICSERIALNUMBER_LEN, 0, prism2mib_bytearea2pstr }, { DIDmib_p2_p2NIC_p2NICIdentity, F_AP | F_STA | F_READ, HFA384x_RID_NICIDENTITY, HFA384x_RID_NICIDENTITY_LEN, 0, prism2mib_uint32array }, { DIDmib_p2_p2NIC_p2MFISupRange, F_AP | F_STA | F_READ, HFA384x_RID_MFISUPRANGE, HFA384x_RID_MFISUPRANGE_LEN, 0, prism2mib_uint32array }, { DIDmib_p2_p2NIC_p2CFISupRange, F_AP | F_STA | F_READ, HFA384x_RID_CFISUPRANGE, HFA384x_RID_CFISUPRANGE_LEN, 0, prism2mib_uint32array }, { DIDmib_p2_p2NIC_p2ChannelList, F_AP | F_STA | F_READ, HFA384x_RID_CHANNELLIST, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2NIC_p2RegulatoryDomains, F_AP | F_STA | F_READ, HFA384x_RID_REGULATORYDOMAINS, HFA384x_RID_REGULATORYDOMAINS_LEN, 0, prism2mib_regulatorydomains }, { DIDmib_p2_p2NIC_p2TempType, F_AP | F_STA | F_READ, HFA384x_RID_TEMPTYPE, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2NIC_p2STAIdentity, F_AP | F_STA | F_READ, HFA384x_RID_STAIDENTITY, HFA384x_RID_STAIDENTITY_LEN, 0, prism2mib_uint32array }, { DIDmib_p2_p2NIC_p2STASupRange, F_AP | F_STA | F_READ, HFA384x_RID_STASUPRANGE, HFA384x_RID_STASUPRANGE_LEN, 0, prism2mib_uint32array }, { DIDmib_p2_p2NIC_p2MFIActRanges, F_AP | F_STA | F_READ, HFA384x_RID_STA_MFIACTRANGES, HFA384x_RID_MFIACTRANGES_LEN, 0, prism2mib_uint32array }, { DIDmib_p2_p2NIC_p2STACFIActRanges, F_AP | F_STA | F_READ, HFA384x_RID_STA_CFIACTRANGES, HFA384x_RID_CFIACTRANGES2_LEN, 0, prism2mib_uint32array }, /* p2MAC MIB's */ { DIDmib_p2_p2MAC_p2PortStatus, F_STA | F_READ, HFA384x_RID_PORTSTATUS, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2MAC_p2CurrentSSID, F_STA | F_READ, HFA384x_RID_CURRENTSSID, HFA384x_RID_CURRENTSSID_LEN, 0, prism2mib_bytestr2pstr }, { DIDmib_p2_p2MAC_p2CurrentBSSID, F_STA | F_READ, HFA384x_RID_CURRENTBSSID, HFA384x_RID_CURRENTBSSID_LEN, 0, prism2mib_bytearea2pstr }, { DIDmib_p2_p2MAC_p2CommsQuality, F_STA | F_READ, HFA384x_RID_COMMSQUALITY, HFA384x_RID_COMMSQUALITY_LEN, 0, prism2mib_uint32array }, { DIDmib_p2_p2MAC_p2CommsQualityCQ, F_STA | F_READ, HFA384x_RID_COMMSQUALITY, HFA384x_RID_COMMSQUALITY_LEN, 0, prism2mib_uint32offset }, { DIDmib_p2_p2MAC_p2CommsQualityASL, F_STA | F_READ, HFA384x_RID_COMMSQUALITY, HFA384x_RID_COMMSQUALITY_LEN, 1, prism2mib_uint32offset }, { DIDmib_p2_p2MAC_p2CommsQualityANL, F_STA | F_READ, HFA384x_RID_COMMSQUALITY, HFA384x_RID_COMMSQUALITY_LEN, 2, prism2mib_uint32offset }, { DIDmib_p2_p2MAC_p2dbmCommsQuality, F_STA | F_READ, HFA384x_RID_DBMCOMMSQUALITY, HFA384x_RID_DBMCOMMSQUALITY_LEN, 0, prism2mib_uint32array }, { DIDmib_p2_p2MAC_p2dbmCommsQualityCQ, F_STA | F_READ, HFA384x_RID_COMMSQUALITY, HFA384x_RID_COMMSQUALITY_LEN, 0, prism2mib_uint32offset }, { DIDmib_p2_p2MAC_p2dbmCommsQualityASL, F_STA | F_READ, HFA384x_RID_COMMSQUALITY, HFA384x_RID_COMMSQUALITY_LEN, 1, prism2mib_uint32offset }, { DIDmib_p2_p2MAC_p2dbmCommsQualityANL, F_STA | F_READ, HFA384x_RID_COMMSQUALITY, HFA384x_RID_COMMSQUALITY_LEN, 2, prism2mib_uint32offset }, { DIDmib_p2_p2MAC_p2CurrentTxRate, F_STA | F_READ, HFA384x_RID_CURRENTTXRATE, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2MAC_p2CurrentBeaconInterval, F_AP | F_STA | F_READ, HFA384x_RID_CURRENTBCNINT, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2MAC_p2StaCurrentScaleThresholds, F_STA | F_READ, HFA384x_RID_CURRENTSCALETHRESH, HFA384x_RID_STACURSCALETHRESH_LEN, 0, prism2mib_uint32array }, { DIDmib_p2_p2MAC_p2APCurrentScaleThresholds, F_AP | F_READ, HFA384x_RID_CURRENTSCALETHRESH, HFA384x_RID_APCURSCALETHRESH_LEN, 0, prism2mib_uint32array }, { DIDmib_p2_p2MAC_p2ProtocolRspTime, F_AP | F_STA | F_READ, HFA384x_RID_PROTOCOLRSPTIME, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2MAC_p2ShortRetryLimit, F_AP | F_STA | F_READ, HFA384x_RID_SHORTRETRYLIMIT, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2MAC_p2LongRetryLimit, F_AP | F_STA | F_READ, HFA384x_RID_LONGRETRYLIMIT, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2MAC_p2MaxTransmitLifetime, F_AP | F_STA | F_READ, HFA384x_RID_MAXTXLIFETIME, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2MAC_p2MaxReceiveLifetime, F_AP | F_STA | F_READ, HFA384x_RID_MAXRXLIFETIME, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2MAC_p2CFPollable, F_STA | F_READ, HFA384x_RID_CFPOLLABLE, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2MAC_p2AuthenticationAlgorithms, F_AP | F_STA | F_READ, HFA384x_RID_AUTHALGORITHMS, HFA384x_RID_AUTHALGORITHMS_LEN, 0, prism2mib_uint32array }, { DIDmib_p2_p2MAC_p2PrivacyOptionImplemented, F_AP | F_STA | F_READ, HFA384x_RID_PRIVACYOPTIMP, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2MAC_p2CurrentTxRate1, F_AP | F_READ, HFA384x_RID_CURRENTTXRATE1, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2MAC_p2CurrentTxRate2, F_AP | F_READ, HFA384x_RID_CURRENTTXRATE2, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2MAC_p2CurrentTxRate3, F_AP | F_READ, HFA384x_RID_CURRENTTXRATE3, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2MAC_p2CurrentTxRate4, F_AP | F_READ, HFA384x_RID_CURRENTTXRATE4, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2MAC_p2CurrentTxRate5, F_AP | F_READ, HFA384x_RID_CURRENTTXRATE5, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2MAC_p2CurrentTxRate6, F_AP | F_READ, HFA384x_RID_CURRENTTXRATE6, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2MAC_p2OwnMACAddress, F_AP | F_READ, HFA384x_RID_OWNMACADDRESS, HFA384x_RID_OWNMACADDRESS_LEN, 0, prism2mib_bytearea2pstr }, /* p2Modem MIB's */ { DIDmib_p2_p2Modem_p2PHYType, F_AP | F_STA | F_READ, HFA384x_RID_PHYTYPE, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Modem_p2CurrentChannel, F_AP | F_STA | F_READ, HFA384x_RID_CURRENTCHANNEL, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Modem_p2CurrentPowerState, F_AP | F_STA | F_READ, HFA384x_RID_CURRENTPOWERSTATE, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Modem_p2CCAMode, F_AP | F_STA | F_READ, HFA384x_RID_CCAMODE, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Modem_p2TxPowerMax, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_TXPOWERMAX, 0, 0, prism2mib_uint32 }, { DIDmib_dot11phy_dot11PhyTxPowerTable_dot11CurrentTxPowerLevel, F_AP | F_STA | F_READ | F_WRITE, HFA384x_RID_TXPOWERMAX, 0, 0, prism2mib_uint32 }, { DIDmib_p2_p2Modem_p2SupportedDataRates, F_AP | F_STA | F_READ, HFA384x_RID_SUPPORTEDDATARATES, HFA384x_RID_SUPPORTEDDATARATES_LEN, 0, prism2mib_bytestr2pstr }, /* And finally, lnx mibs */ { DIDmib_lnx_lnxConfigTable_lnxRSNAIE, F_STA | F_READ | F_WRITE, HFA384x_RID_CNFWPADATA, 0, 0, prism2mib_priv }, { 0, 0, 0, 0, 0, NULL}}; /*---------------------------------------------------------------- These MIB's are not supported at this time: DIDmib_dot11phy_dot11PhyOperationTable_dot11ChannelAgilityPresent DIDmib_dot11phy_dot11PhyOperationTable_dot11ChannelAgilityEnabled DIDmib_dot11phy_dot11PhyDSSSTable_dot11PBCCOptionImplemented DIDmib_dot11phy_dot11RegDomainsSupportedTable_dot11RegDomainsSupportIndex DIDmib_dot11phy_dot11SupportedDataRatesTxTable_dot11SupportedDataRatesTxIndex DIDmib_dot11phy_dot11SupportedDataRatesTxTable_dot11SupportedDataRatesTxValue DIDmib_dot11phy_dot11SupportedDataRatesRxTable_dot11SupportedDataRatesRxIndex DIDmib_dot11phy_dot11SupportedDataRatesRxTable_dot11SupportedDataRatesRxValue DIDmib_dot11phy_dot11RegDomainsSupportedTable_dot11RegDomainsSupportValue TODO: need to investigate why wlan has this as enumerated and Prism2 has this as btye str. DIDmib_dot11phy_dot11PhyDSSSTable_dot11ShortPreambleOptionImplemented TODO: Find out the firmware version number(s) for identifying whether the firmware is capable of short preamble. TRUE or FALSE will be returned based on the version of the firmware. WEP Key mappings aren't supported in the f/w. DIDmib_dot11smt_dot11WEPKeyMappingsTable_dot11WEPKeyMappingIndex DIDmib_dot11smt_dot11WEPKeyMappingsTable_dot11WEPKeyMappingAddress DIDmib_dot11smt_dot11WEPKeyMappingsTable_dot11WEPKeyMappingWEPOn DIDmib_dot11smt_dot11WEPKeyMappingsTable_dot11WEPKeyMappingValue DIDmib_dot11smt_dot11PrivacyTable_dot11WEPKeyMappingLength TODO: implement counters. DIDmib_dot11smt_dot11PrivacyTable_dot11WEPICVErrorCount DIDmib_dot11smt_dot11PrivacyTable_dot11WEPExcludedCount DIDmib_dot11mac_dot11CountersTable_dot11TransmittedFragmentCount DIDmib_dot11mac_dot11CountersTable_dot11MulticastTransmittedFrameCount DIDmib_dot11mac_dot11CountersTable_dot11FailedCount DIDmib_dot11mac_dot11CountersTable_dot11RetryCount DIDmib_dot11mac_dot11CountersTable_dot11MultipleRetryCount DIDmib_dot11mac_dot11CountersTable_dot11FrameDuplicateCount DIDmib_dot11mac_dot11CountersTable_dot11RTSSuccessCount DIDmib_dot11mac_dot11CountersTable_dot11RTSFailureCount DIDmib_dot11mac_dot11CountersTable_dot11ACKFailureCount DIDmib_dot11mac_dot11CountersTable_dot11ReceivedFragmentCount DIDmib_dot11mac_dot11CountersTable_dot11MulticastReceivedFrameCount DIDmib_dot11mac_dot11CountersTable_dot11FCSErrorCount DIDmib_dot11mac_dot11CountersTable_dot11TransmittedFrameCount DIDmib_dot11mac_dot11CountersTable_dot11WEPUndecryptableCount TODO: implement sane values for these. DIDmib_dot11mac_dot11OperationTable_dot11ManufacturerID DIDmib_dot11mac_dot11OperationTable_dot11ProductID Not too worried about these at the moment. DIDmib_dot11phy_dot11PhyAntennaTable_dot11CurrentTxAntenna DIDmib_dot11phy_dot11PhyAntennaTable_dot11DiversitySupport DIDmib_dot11phy_dot11PhyAntennaTable_dot11CurrentRxAntenna DIDmib_dot11phy_dot11PhyTxPowerTable_dot11NumberSupportedPowerLevels DIDmib_dot11phy_dot11PhyTxPowerTable_dot11TxPowerLevel1 DIDmib_dot11phy_dot11PhyTxPowerTable_dot11TxPowerLevel2 DIDmib_dot11phy_dot11PhyTxPowerTable_dot11TxPowerLevel3 DIDmib_dot11phy_dot11PhyTxPowerTable_dot11TxPowerLevel4 DIDmib_dot11phy_dot11PhyTxPowerTable_dot11TxPowerLevel5 DIDmib_dot11phy_dot11PhyTxPowerTable_dot11TxPowerLevel6 DIDmib_dot11phy_dot11PhyTxPowerTable_dot11TxPowerLevel7 DIDmib_dot11phy_dot11PhyTxPowerTable_dot11TxPowerLevel8 DIDmib_dot11phy_dot11PhyTxPowerTable_dot11CurrentTxPowerLevel Ummm, FH and IR don't apply DIDmib_dot11phy_dot11PhyFHSSTable_dot11HopTime DIDmib_dot11phy_dot11PhyFHSSTable_dot11CurrentChannelNumber DIDmib_dot11phy_dot11PhyFHSSTable_dot11MaxDwellTime DIDmib_dot11phy_dot11PhyFHSSTable_dot11CurrentDwellTime DIDmib_dot11phy_dot11PhyFHSSTable_dot11CurrentSet DIDmib_dot11phy_dot11PhyFHSSTable_dot11CurrentPattern DIDmib_dot11phy_dot11PhyFHSSTable_dot11CurrentIndex DIDmib_dot11phy_dot11PhyDSSSTable_dot11CCAModeSupported DIDmib_dot11phy_dot11PhyDSSSTable_dot11EDThreshold DIDmib_dot11phy_dot11PhyIRTable_dot11CCAWatchdogTimerMax DIDmib_dot11phy_dot11PhyIRTable_dot11CCAWatchdogCountMax DIDmib_dot11phy_dot11PhyIRTable_dot11CCAWatchdogTimerMin DIDmib_dot11phy_dot11PhyIRTable_dot11CCAWatchdogCountMin We just don't have enough antennas right now to worry about this. DIDmib_dot11phy_dot11AntennasListTable_dot11AntennaListIndex DIDmib_dot11phy_dot11AntennasListTable_dot11SupportedTxAntenna DIDmib_dot11phy_dot11AntennasListTable_dot11SupportedRxAntenna DIDmib_dot11phy_dot11AntennasListTable_dot11DiversitySelectionRx ------------------------------------------------------------------*/ /*================================================================*/ /* Function Definitions */ /*---------------------------------------------------------------- * prism2mgmt_mibset_mibget * * Set the value of a mib item. * * Arguments: * wlandev wlan device structure * msgp ptr to msg buffer * * Returns: * 0 success and done * <0 success, but we're waiting for something to finish. * >0 an error occurred while handling the message. * Side effects: * * Call context: * process thread (usually) * interrupt ----------------------------------------------------------------*/ int prism2mgmt_mibset_mibget(wlandevice_t *wlandev, void *msgp) { hfa384x_t *hw = wlandev->priv; int result, isget; mibrec_t *mib; UINT16 which; p80211msg_dot11req_mibset_t *msg = msgp; p80211itemd_t *mibitem; DBFENTER; msg->resultcode.status = P80211ENUM_msgitem_status_data_ok; msg->resultcode.data = P80211ENUM_resultcode_success; /* ** Determine if this is an Access Point or a station. */ which = hw->ap ? F_AP : F_STA; /* ** Find the MIB in the MIB table. Note that a MIB may be in the ** table twice...once for an AP and once for a station. Make sure ** to get the correct one. Note that DID=0 marks the end of the ** MIB table. */ mibitem = (p80211itemd_t *) msg->mibattribute.data; for (mib = mibtab; mib->did != 0; mib++) if (mib->did == mibitem->did && (mib->flag & which)) break; if (mib->did == 0) { msg->resultcode.data = P80211ENUM_resultcode_not_supported; goto done; } /* ** Determine if this is a "mibget" or a "mibset". If this is a ** "mibget", then make sure that the MIB may be read. Otherwise, ** this is a "mibset" so make make sure that the MIB may be written. */ isget = (msg->msgcode == DIDmsg_dot11req_mibget); if (isget) { if (!(mib->flag & F_READ)) { msg->resultcode.data = P80211ENUM_resultcode_cant_get_writeonly_mib; goto done; } } else { if (!(mib->flag & F_WRITE)) { msg->resultcode.data = P80211ENUM_resultcode_cant_set_readonly_mib; goto done; } } /* ** Execute the MIB function. If things worked okay, then make ** sure that the MIB function also worked okay. If so, and this ** is a "mibget", then the status value must be set for both the ** "mibattribute" parameter and the mib item within the data ** portion of the "mibattribute". */ result = mib->func(mib, isget, wlandev, hw, msg, (void *) mibitem->data); if (msg->resultcode.data == P80211ENUM_resultcode_success) { if (result != 0) { WLAN_LOG_DEBUG(1, "get/set failure, result=%d\n", result); msg->resultcode.data = P80211ENUM_resultcode_implementation_failure; } else { if (isget) { msg->mibattribute.status = P80211ENUM_msgitem_status_data_ok; mibitem->status = P80211ENUM_msgitem_status_data_ok; } } } done: DBFEXIT; return(0); } /*---------------------------------------------------------------- * prism2mib_bytestr2pstr * * Get/set pstr data to/from a byte string. * * MIB record parameters: * parm1 Prism2 RID value. * parm2 Number of bytes of RID data. * parm3 Not used. * * Arguments: * mib MIB record. * isget MIBGET/MIBSET flag. * wlandev wlan device structure. * priv "priv" structure. * hw "hw" structure. * msg Message structure. * data Data buffer. * * Returns: * 0 - Success. * ~0 - Error. * ----------------------------------------------------------------*/ static int prism2mib_bytestr2pstr( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data) { int result; p80211pstrd_t *pstr = (p80211pstrd_t*) data; UINT8 bytebuf[MIB_TMP_MAXLEN]; hfa384x_bytestr_t *p2bytestr = (hfa384x_bytestr_t*) bytebuf; DBFENTER; if (isget) { result = hfa384x_drvr_getconfig(hw, mib->parm1, bytebuf, mib->parm2); prism2mgmt_bytestr2pstr(p2bytestr, pstr); } else { memset(bytebuf, 0, mib->parm2); prism2mgmt_pstr2bytestr(p2bytestr, pstr); result = hfa384x_drvr_setconfig(hw, mib->parm1, bytebuf, mib->parm2); } DBFEXIT; return(result); } /*---------------------------------------------------------------- * prism2mib_bytearea2pstr * * Get/set pstr data to/from a byte area. * * MIB record parameters: * parm1 Prism2 RID value. * parm2 Number of bytes of RID data. * parm3 Not used. * * Arguments: * mib MIB record. * isget MIBGET/MIBSET flag. * wlandev wlan device structure. * priv "priv" structure. * hw "hw" structure. * msg Message structure. * data Data buffer. * * Returns: * 0 - Success. * ~0 - Error. * ----------------------------------------------------------------*/ static int prism2mib_bytearea2pstr( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data) { int result; p80211pstrd_t *pstr = (p80211pstrd_t*) data; UINT8 bytebuf[MIB_TMP_MAXLEN]; DBFENTER; if (isget) { result = hfa384x_drvr_getconfig(hw, mib->parm1, bytebuf, mib->parm2); prism2mgmt_bytearea2pstr(bytebuf, pstr, mib->parm2); } else { memset(bytebuf, 0, mib->parm2); prism2mgmt_pstr2bytearea(bytebuf, pstr); result = hfa384x_drvr_setconfig(hw, mib->parm1, bytebuf, mib->parm2); } DBFEXIT; return(result); } /*---------------------------------------------------------------- * prism2mib_uint32 * * Get/set uint32 data. * * MIB record parameters: * parm1 Prism2 RID value. * parm2 Not used. * parm3 Not used. * * Arguments: * mib MIB record. * isget MIBGET/MIBSET flag. * wlandev wlan device structure. * priv "priv" structure. * hw "hw" structure. * msg Message structure. * data Data buffer. * * Returns: * 0 - Success. * ~0 - Error. * ----------------------------------------------------------------*/ static int prism2mib_uint32( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data) { int result; UINT32 *uint32 = (UINT32*) data; UINT8 bytebuf[MIB_TMP_MAXLEN]; UINT16 *wordbuf = (UINT16*) bytebuf; DBFENTER; if (isget) { result = hfa384x_drvr_getconfig16(hw, mib->parm1, wordbuf); *uint32 = *wordbuf; /* [MSM] Removed, getconfig16 returns the value in host order. * prism2mgmt_prism2int2p80211int(wordbuf, uint32); */ } else { /* [MSM] Removed, setconfig16 expects host order. * prism2mgmt_p80211int2prism2int(wordbuf, uint32); */ *wordbuf = *uint32; result = hfa384x_drvr_setconfig16(hw, mib->parm1, *wordbuf); } DBFEXIT; return(result); } /*---------------------------------------------------------------- * prism2mib_uint32array * * Get/set an array of uint32 data. * * MIB record parameters: * parm1 Prism2 RID value. * parm2 Number of bytes of RID data. * parm3 Not used. * * Arguments: * mib MIB record. * isget MIBGET/MIBSET flag. * wlandev wlan device structure. * priv "priv" structure. * hw "hw" structure. * msg Message structure. * data Data buffer. * * Returns: * 0 - Success. * ~0 - Error. * ----------------------------------------------------------------*/ static int prism2mib_uint32array( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data) { int result; UINT32 *uint32 = (UINT32 *) data; UINT8 bytebuf[MIB_TMP_MAXLEN]; UINT16 *wordbuf = (UINT16*) bytebuf; int i, cnt; DBFENTER; cnt = mib->parm2 / sizeof(UINT16); if (isget) { result = hfa384x_drvr_getconfig(hw, mib->parm1, wordbuf, mib->parm2); for (i = 0; i < cnt; i++) prism2mgmt_prism2int2p80211int(wordbuf+i, uint32+i); } else { for (i = 0; i < cnt; i++) prism2mgmt_p80211int2prism2int(wordbuf+i, uint32+i); result = hfa384x_drvr_setconfig(hw, mib->parm1, wordbuf, mib->parm2); } DBFEXIT; return(result); } /*---------------------------------------------------------------- * prism2mib_uint32offset * * Get/set a single element in an array of uint32 data. * * MIB record parameters: * parm1 Prism2 RID value. * parm2 Number of bytes of RID data. * parm3 Element index. * * Arguments: * mib MIB record. * isget MIBGET/MIBSET flag. * wlandev wlan device structure. * priv "priv" structure. * hw "hw" structure. * msg Message structure. * data Data buffer. * * Returns: * 0 - Success. * ~0 - Error. * ----------------------------------------------------------------*/ static int prism2mib_uint32offset( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data) { int result; UINT32 *uint32 = (UINT32*) data; UINT8 bytebuf[MIB_TMP_MAXLEN]; UINT16 *wordbuf = (UINT16*) bytebuf; UINT16 cnt; DBFENTER; cnt = mib->parm2 / sizeof(UINT16); result = hfa384x_drvr_getconfig(hw, mib->parm1, wordbuf, mib->parm2); if (result == 0) { if (isget) { if (mib->parm3 < cnt) prism2mgmt_prism2int2p80211int(wordbuf+mib->parm3, uint32); else *uint32 = 0; } else { if (mib->parm3 < cnt) { prism2mgmt_p80211int2prism2int(wordbuf+mib->parm3, uint32); result = hfa384x_drvr_setconfig(hw, mib->parm1, wordbuf, mib->parm2); } } } DBFEXIT; return(result); } /*---------------------------------------------------------------- * prism2mib_truth * * Get/set truth data. * * MIB record parameters: * parm1 Prism2 RID value. * parm2 Not used. * parm3 Not used. * * Arguments: * mib MIB record. * isget MIBGET/MIBSET flag. * wlandev wlan device structure. * priv "priv" structure. * hw "hw" structure. * msg Message structure. * data Data buffer. * * Returns: * 0 - Success. * ~0 - Error. * ----------------------------------------------------------------*/ static int prism2mib_truth( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data) { int result; UINT32 *uint32 = (UINT32*) data; UINT8 bytebuf[MIB_TMP_MAXLEN]; UINT16 *wordbuf = (UINT16*) bytebuf; DBFENTER; if (isget) { result = hfa384x_drvr_getconfig16(hw, mib->parm1, wordbuf); *uint32 = (*wordbuf) ? P80211ENUM_truth_true : P80211ENUM_truth_false; } else { *wordbuf = ((*uint32) == P80211ENUM_truth_true) ? 1 : 0; result = hfa384x_drvr_setconfig16(hw, mib->parm1, *wordbuf); } DBFEXIT; return(result); } /*---------------------------------------------------------------- * prism2mib_flag * * Get/set a flag. * * MIB record parameters: * parm1 Prism2 RID value. * parm2 Bit to get/set. * parm3 Not used. * * Arguments: * mib MIB record. * isget MIBGET/MIBSET flag. * wlandev wlan device structure. * priv "priv" structure. * hw "hw" structure. * msg Message structure. * data Data buffer. * * Returns: * 0 - Success. * ~0 - Error. * ----------------------------------------------------------------*/ static int prism2mib_flag( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data) { int result; UINT32 *uint32 = (UINT32*) data; UINT8 bytebuf[MIB_TMP_MAXLEN]; UINT16 *wordbuf = (UINT16*) bytebuf; UINT32 flags; DBFENTER; result = hfa384x_drvr_getconfig16(hw, mib->parm1, wordbuf); if (result == 0) { /* [MSM] Removed, getconfig16 returns the value in host order. * prism2mgmt_prism2int2p80211int(wordbuf, &flags); */ flags = *wordbuf; if (isget) { *uint32 = (flags & mib->parm2) ? P80211ENUM_truth_true : P80211ENUM_truth_false; } else { if ((*uint32) == P80211ENUM_truth_true) flags |= mib->parm2; else flags &= ~mib->parm2; /* [MSM] Removed, setconfig16 expects host order. * prism2mgmt_p80211int2prism2int(wordbuf, &flags); */ *wordbuf = flags; result = hfa384x_drvr_setconfig16(hw, mib->parm1, *wordbuf); } } DBFEXIT; return(result); } /*---------------------------------------------------------------- * prism2mib_appcfinfoflag * * Get/set a single flag in the APPCFINFO record. * * MIB record parameters: * parm1 Bit to get/set. * parm2 Not used. * parm3 Not used. * * Arguments: * mib MIB record. * isget MIBGET/MIBSET flag. * wlandev wlan device structure. * priv "priv" structure. * hw "hw" structure. * msg Message structure. * data Data buffer. * * Returns: * 0 - Success. * ~0 - Error. * ----------------------------------------------------------------*/ static int prism2mib_appcfinfoflag( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data) { int result; UINT32 *uint32 = (UINT32*) data; UINT8 bytebuf[MIB_TMP_MAXLEN]; UINT16 *wordbuf = (UINT16*) bytebuf; UINT16 word; DBFENTER; result = hfa384x_drvr_getconfig(hw, HFA384x_RID_CNFAPPCFINFO, bytebuf, HFA384x_RID_CNFAPPCFINFO_LEN); if (result == 0) { if (isget) { *uint32 = (hfa384x2host_16(wordbuf[3]) & mib->parm1) ? P80211ENUM_truth_true : P80211ENUM_truth_false; } else { word = hfa384x2host_16(wordbuf[3]); word = ((*uint32) == P80211ENUM_truth_true) ? (word | mib->parm1) : (word & ~mib->parm1); wordbuf[3] = host2hfa384x_16(word); result = hfa384x_drvr_setconfig(hw, HFA384x_RID_CNFAPPCFINFO, bytebuf, HFA384x_RID_CNFAPPCFINFO_LEN); } } DBFEXIT; return(result); } /*---------------------------------------------------------------- * prism2mib_regulatorydomains * * Get regulatory domain data. * * MIB record parameters: * parm1 Prism2 RID value. * parm2 Number of bytes of RID data. * parm3 Not used. * * Arguments: * mib MIB record. * isget MIBGET/MIBSET flag. * wlandev wlan device structure. * priv "priv" structure. * hw "hw" structure. * msg Message structure. * data Data buffer. * * Returns: * 0 - Success. * ~0 - Error. * ----------------------------------------------------------------*/ static int prism2mib_regulatorydomains( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data) { int result; UINT32 cnt; p80211pstrd_t *pstr = (p80211pstrd_t*) data; UINT8 bytebuf[MIB_TMP_MAXLEN]; UINT16 *wordbuf = (UINT16*) bytebuf; DBFENTER; result = 0; if (isget) { result = hfa384x_drvr_getconfig(hw, mib->parm1, wordbuf, mib->parm2); prism2mgmt_prism2int2p80211int(wordbuf, &cnt); pstr->len = (UINT8) cnt; memcpy(pstr->data, &wordbuf[1], pstr->len); } DBFEXIT; return(result); } /*---------------------------------------------------------------- * prism2mib_wepdefaultkey * * Get/set WEP default keys. * * MIB record parameters: * parm1 Prism2 RID value. * parm2 Number of bytes of RID data. * parm3 Not used. * * Arguments: * mib MIB record. * isget MIBGET/MIBSET flag. * wlandev wlan device structure. * priv "priv" structure. * hw "hw" structure. * msg Message structure. * data Data buffer. * * Returns: * 0 - Success. * ~0 - Error. * ----------------------------------------------------------------*/ static int prism2mib_wepdefaultkey( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data) { int result; p80211pstrd_t *pstr = (p80211pstrd_t*) data; UINT8 bytebuf[MIB_TMP_MAXLEN]; UINT16 len; DBFENTER; if (isget) { result = 0; /* Should never happen. */ } else { len = (pstr->len > 5) ? HFA384x_RID_CNFWEP128DEFAULTKEY_LEN : HFA384x_RID_CNFWEPDEFAULTKEY_LEN; memset(bytebuf, 0, len); prism2mgmt_pstr2bytearea(bytebuf, pstr); result = hfa384x_drvr_setconfig(hw, mib->parm1, bytebuf, len); } DBFEXIT; return(result); } /*---------------------------------------------------------------- * prism2mib_powermanagement * * Get/set 802.11 power management value. Note that this is defined differently * by 802.11 and Prism2: * * Meaning 802.11 Prism2 * active 1 false * powersave 2 true * * MIB record parameters: * parm1 Prism2 RID value. * parm2 Not used. * parm3 Not used. * * Arguments: * mib MIB record. * isget MIBGET/MIBSET flag. * wlandev wlan device structure. * priv "priv" structure. * hw "hw" structure. * msg Message structure. * data Data buffer. * * Returns: * 0 - Success. * ~0 - Error. * ----------------------------------------------------------------*/ static int prism2mib_powermanagement( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data) { int result; UINT32 *uint32 = (UINT32*) data; UINT32 value; DBFENTER; if (isget) { result = prism2mib_uint32(mib, isget, wlandev, hw, msg, &value); *uint32 = (value == 0) ? 1 : 2; } else { value = ((*uint32) == 1) ? 0 : 1; result = prism2mib_uint32(mib, isget, wlandev, hw, msg, &value); } DBFEXIT; return(result); } /*---------------------------------------------------------------- * prism2mib_preamble * * Get/set Prism2 short preamble * * MIB record parameters: * parm1 Prism2 RID value. * parm2 Not used. * parm3 Not used. * * Arguments: * mib MIB record. * isget MIBGET/MIBSET flag. * wlandev wlan device structure. * priv "priv" structure. * hw "hw" structure. * msg Message structure. * data Data buffer. * * Returns: * 0 - Success. * ~0 - Error. * ----------------------------------------------------------------*/ static int prism2mib_preamble( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data) { int result; UINT32 *uint32 = (UINT32*) data; UINT8 bytebuf[MIB_TMP_MAXLEN]; UINT16 *wordbuf = (UINT16*) bytebuf; DBFENTER; if (isget) { result = hfa384x_drvr_getconfig16(hw, mib->parm1, wordbuf); *uint32 = *wordbuf; } else { *wordbuf = *uint32; result = hfa384x_drvr_setconfig16(hw, mib->parm1, *wordbuf); } DBFEXIT; return(result); } /*---------------------------------------------------------------- * prism2mib_privacyinvoked * * Get/set the dot11PrivacyInvoked value. * * MIB record parameters: * parm1 Prism2 RID value. * parm2 Bit value for PrivacyInvoked flag. * parm3 Not used. * * Arguments: * mib MIB record. * isget MIBGET/MIBSET flag. * wlandev wlan device structure. * priv "priv" structure. * hw "hw" structure. * msg Message structure. * data Data buffer. * * Returns: * 0 - Success. * ~0 - Error. * ----------------------------------------------------------------*/ static int prism2mib_privacyinvoked( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data) { int result; DBFENTER; if (wlandev->hostwep & HOSTWEP_DECRYPT) { if (wlandev->hostwep & HOSTWEP_DECRYPT) mib->parm2 |= HFA384x_WEPFLAGS_DISABLE_RXCRYPT; if (wlandev->hostwep & HOSTWEP_ENCRYPT) mib->parm2 |= HFA384x_WEPFLAGS_DISABLE_TXCRYPT; } result = prism2mib_flag(mib, isget, wlandev, hw, msg, data); DBFEXIT; return(result); } /*---------------------------------------------------------------- * prism2mib_excludeunencrypted * * Get/set the dot11ExcludeUnencrypted value. * * MIB record parameters: * parm1 Prism2 RID value. * parm2 Bit value for ExcludeUnencrypted flag. * parm3 Not used. * * Arguments: * mib MIB record. * isget MIBGET/MIBSET flag. * wlandev wlan device structure. * priv "priv" structure. * hw "hw" structure. * msg Message structure. * data Data buffer. * * Returns: * 0 - Success. * ~0 - Error. * ----------------------------------------------------------------*/ static int prism2mib_excludeunencrypted( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data) { int result; DBFENTER; result = prism2mib_flag(mib, isget, wlandev, hw, msg, data); DBFEXIT; return(result); } /*---------------------------------------------------------------- * prism2mib_fragmentationthreshold * * Get/set the fragmentation threshold. * * MIB record parameters: * parm1 Prism2 RID value. * parm2 Not used. * parm3 Not used. * * Arguments: * mib MIB record. * isget MIBGET/MIBSET flag. * wlandev wlan device structure. * priv "priv" structure. * hw "hw" structure. * msg Message structure. * data Data buffer. * * Returns: * 0 - Success. * ~0 - Error. * ----------------------------------------------------------------*/ static int prism2mib_fragmentationthreshold( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data) { int result; UINT32 *uint32 = (UINT32*) data; DBFENTER; if (!isget) if ((*uint32) % 2) { WLAN_LOG_WARNING("Attempt to set odd number " "FragmentationThreshold\n"); msg->resultcode.data = P80211ENUM_resultcode_not_supported; return(0); } result = prism2mib_uint32(mib, isget, wlandev, hw, msg, data); DBFEXIT; return(result); } /*---------------------------------------------------------------- * prism2mib_operationalrateset * * Get/set the operational rate set. * * MIB record parameters: * parm1 Prism2 RID value. * parm2 Not used. * parm3 Not used. * * Arguments: * mib MIB record. * isget MIBGET/MIBSET flag. * wlandev wlan device structure. * priv "priv" structure. * hw "hw" structure. * msg Message structure. * data Data buffer. * * Returns: * 0 - Success. * ~0 - Error. * ----------------------------------------------------------------*/ static int prism2mib_operationalrateset( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data) { int result; p80211pstrd_t *pstr = (p80211pstrd_t *) data; UINT8 bytebuf[MIB_TMP_MAXLEN]; UINT16 *wordbuf = (UINT16*) bytebuf; DBFENTER; if (isget) { result = hfa384x_drvr_getconfig16(hw, mib->parm1, wordbuf); prism2mgmt_get_oprateset(wordbuf, pstr); } else { prism2mgmt_set_oprateset(wordbuf, pstr); result = hfa384x_drvr_setconfig16(hw, mib->parm1, *wordbuf); result = hfa384x_drvr_setconfig16(hw, HFA384x_RID_CNFSUPPRATES, *wordbuf); } DBFEXIT; return(result); } /*---------------------------------------------------------------- * prism2mib_groupaddress * * Get/set the dot11GroupAddressesTable. * * MIB record parameters: * parm1 Not used. * parm2 Not used. * parm3 Not used. * * Arguments: * mib MIB record. * isget MIBGET/MIBSET flag. * wlandev wlan device structure. * priv "priv" structure. * hw "hw" structure. * msg Message structure. * data Data buffer. * * Returns: * 0 - Success. * ~0 - Error. * ----------------------------------------------------------------*/ static int prism2mib_groupaddress( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data) { int result; p80211pstrd_t *pstr = (p80211pstrd_t *) data; UINT8 bytebuf[MIB_TMP_MAXLEN]; UINT16 len; DBFENTER; /* TODO: fix this. f/w doesn't support mcast filters */ if (isget) { prism2mgmt_get_grpaddr(mib->did, pstr, hw); return(0); } result = prism2mgmt_set_grpaddr(mib->did, bytebuf, pstr, hw); if (result != 0) { msg->resultcode.data = P80211ENUM_resultcode_not_supported; return(result); } if (hw->dot11_grpcnt <= MAX_PRISM2_GRP_ADDR) { len = hw->dot11_grpcnt * WLAN_ADDR_LEN; memcpy(bytebuf, hw->dot11_grp_addr[0], len); result = hfa384x_drvr_setconfig(hw, HFA384x_RID_GROUPADDR, bytebuf, len); /* ** Turn off promiscuous mode if count is equal to MAX. We may ** have been at a higher count in promiscuous mode and need to ** turn it off. */ /* but only if we're not already in promisc mode. :) */ if ((hw->dot11_grpcnt == MAX_PRISM2_GRP_ADDR) && !( wlandev->netdev->flags & IFF_PROMISC)) { result = hfa384x_drvr_setconfig16(hw, HFA384x_RID_PROMISCMODE, 0); } } else { /* ** Clear group addresses in card and set to promiscuous mode. */ memset(bytebuf, 0, sizeof(bytebuf)); result = hfa384x_drvr_setconfig(hw, HFA384x_RID_GROUPADDR, bytebuf, 0); if (result == 0) { result = hfa384x_drvr_setconfig16(hw, HFA384x_RID_PROMISCMODE, 1); } } DBFEXIT; return(result); } /*---------------------------------------------------------------- * prism2mib_fwid * * Get the firmware ID. * * MIB record parameters: * parm1 Not used. * parm2 Not used. * parm3 Not used. * * Arguments: * mib MIB record. * isget MIBGET/MIBSET flag. * wlandev wlan device structure. * priv "priv" structure. * hw "hw" structure. * msg Message structure. * data Data buffer. * * Returns: * 0 - Success. * ~0 - Error. * ----------------------------------------------------------------*/ static int prism2mib_fwid( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data) { int result; p80211pstrd_t *pstr = (p80211pstrd_t *) data; hfa384x_FWID_t fwid; DBFENTER; if (isget) { result = hfa384x_drvr_getconfig(hw, HFA384x_RID_FWID, &fwid, HFA384x_RID_FWID_LEN); if (mib->did == DIDmib_p2_p2NIC_p2PrimaryFWID) { fwid.primary[HFA384x_FWID_LEN - 1] = '\0'; pstr->len = strlen(fwid.primary); memcpy(pstr->data, fwid.primary, pstr->len); } else { fwid.secondary[HFA384x_FWID_LEN - 1] = '\0'; pstr->len = strlen(fwid.secondary); memcpy(pstr->data, fwid.secondary, pstr->len); } } else result = 0; /* Should never happen. */ DBFEXIT; return(result); } /*---------------------------------------------------------------- * prism2mib_authalg * * Get values from the AuhtenticationAlgorithmsTable. * * MIB record parameters: * parm1 Table index (1-6). * parm2 Not used. * parm3 Not used. * * Arguments: * mib MIB record. * isget MIBGET/MIBSET flag. * wlandev wlan device structure. * priv "priv" structure. * hw "hw" structure. * msg Message structure. * data Data buffer. * * Returns: * 0 - Success. * ~0 - Error. * ----------------------------------------------------------------*/ static int prism2mib_authalg( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data) { UINT32 *uint32 = (UINT32*) data; DBFENTER; /* MSM: pkx supplied code that code queries RID FD4D....but the f/w's * results are bogus. Therefore, we have to simulate the appropriate * results here in the driver based on our knowledge of existing MAC * features. That's the whole point behind this ugly function. */ if (isget) { msg->resultcode.data = P80211ENUM_resultcode_success; switch (mib->parm1) { case 1: /* Open System */ *uint32 = P80211ENUM_authalg_opensystem; break; case 2: /* SharedKey */ *uint32 = P80211ENUM_authalg_sharedkey; break; default: *uint32 = 0; msg->resultcode.data = P80211ENUM_resultcode_not_supported; break; } } DBFEXIT; return(0); } /*---------------------------------------------------------------- * prism2mib_authalgenable * * Get/set the enable values from the AuhtenticationAlgorithmsTable. * * MIB record parameters: * parm1 Table index (1-6). * parm2 Not used. * parm3 Not used. * * Arguments: * mib MIB record. * isget MIBGET/MIBSET flag. * wlandev wlan device structure. * priv "priv" structure. * hw "hw" structure. * msg Message structure. * data Data buffer. * * Returns: * 0 - Success. * ~0 - Error. * ----------------------------------------------------------------*/ static int prism2mib_authalgenable( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data) { int result; UINT32 *uint32 = (UINT32*) data; int index; UINT16 cnf_auth; UINT16 mask; DBFENTER; index = mib->parm1 - 1; result = hfa384x_drvr_getconfig16( hw, HFA384x_RID_CNFAUTHENTICATION, &cnf_auth); WLAN_LOG_DEBUG(2,"cnfAuthentication0=%d, index=%d\n", cnf_auth, index); if (isget) { if ( index == 0 || index == 1 ) { *uint32 = (cnf_auth & (1<resultcode.data = P80211ENUM_resultcode_not_supported; } } else { if ( index == 0 || index == 1 ) { mask = 1 << index; if (*uint32==P80211ENUM_truth_true ) { cnf_auth |= mask; } else { cnf_auth &= ~mask; } result = hfa384x_drvr_setconfig16( hw, HFA384x_RID_CNFAUTHENTICATION, cnf_auth); WLAN_LOG_DEBUG(2,"cnfAuthentication:=%d\n", cnf_auth); if ( result ) { WLAN_LOG_DEBUG(1,"Unable to set p2cnfAuthentication to %d\n", cnf_auth); msg->resultcode.data = P80211ENUM_resultcode_implementation_failure; } } else { msg->resultcode.data = P80211ENUM_resultcode_not_supported; } } DBFEXIT; return(result); } /*---------------------------------------------------------------- * prism2mib_priv * * Get/set values in the "priv" data structure. * * MIB record parameters: * parm1 Not used. * parm2 Not used. * parm3 Not used. * * Arguments: * mib MIB record. * isget MIBGET/MIBSET flag. * wlandev wlan device structure. * priv "priv" structure. * hw "hw" structure. * msg Message structure. * data Data buffer. * * Returns: * 0 - Success. * ~0 - Error. * ----------------------------------------------------------------*/ static int prism2mib_priv( mibrec_t *mib, int isget, wlandevice_t *wlandev, hfa384x_t *hw, p80211msg_dot11req_mibset_t *msg, void *data) { UINT32 *uint32 = (UINT32*) data; p80211pstrd_t *pstr = (p80211pstrd_t*) data; p80211macarray_t *macarray = (p80211macarray_t *) data; int i, cnt, result, done; prism2sta_authlist_t old; /* ** "test" is a lot longer than necessary but who cares? ...as long as ** it is long enough! */ UINT8 test[sizeof(wlandev->rx) + sizeof(hw->tallies)]; DBFENTER; switch (mib->did) { case DIDmib_p2_p2Table_p2ReceivedFrameStatistics: /* ** Note: The values in this record are changed by the ** interrupt handler and therefore cannot be guaranteed ** to be stable while they are being copied. However, ** the interrupt handler will take priority over this ** code. Hence, if the same values are copied twice, ** then we are ensured that the values have not been ** changed. If they have, then just try again. Don't ** try more than 10 times...if we still haven't got it, ** then the values we do have are probably good enough. ** This scheme for copying values is used in order to ** prevent having to block the interrupt handler while ** we copy the values. */ if (isget) for (i = 0; i < 10; i++) { memcpy(data, &wlandev->rx, sizeof(wlandev->rx)); memcpy(test, &wlandev->rx, sizeof(wlandev->rx)); if (memcmp(data, test, sizeof(wlandev->rx)) == 0) break; } break; case DIDmib_p2_p2Table_p2CommunicationTallies: /* ** Note: The values in this record are changed by the ** interrupt handler and therefore cannot be guaranteed ** to be stable while they are being copied. See the ** note above about copying values. */ if (isget) { result = hfa384x_drvr_commtallies(hw); /* ?????? We need to wait a bit here for the */ /* tallies to get updated. ?????? */ /* MSM: TODO: The right way to do this is to * add a "commtallie" wait queue to the * priv structure that gets run every time * we receive a commtally info frame. * This process would sleep on that * queue and get awakened when the * the requested info frame arrives. * Don't have time to do and test this * right now. */ /* Ugh, this is nasty. */ for (i = 0; i < 10; i++) { memcpy(data, &hw->tallies, sizeof(hw->tallies)); memcpy(test, &hw->tallies, sizeof(hw->tallies)); if ( memcmp(data, test, sizeof(hw->tallies)) == 0) break; } } break; case DIDmib_p2_p2Table_p2Authenticated: if (isget) { prism2mib_priv_authlist(hw, &old); macarray->cnt = 0; for (i = 0; i < old.cnt; i++) { if (!old.assoc[i]) { memcpy(macarray->data[macarray->cnt], old.addr[i], WLAN_ADDR_LEN); macarray->cnt++; } } } break; case DIDmib_p2_p2Table_p2Associated: if (isget) { prism2mib_priv_authlist(hw, &old); macarray->cnt = 0; for (i = 0; i < old.cnt; i++) { if (old.assoc[i]) { memcpy(macarray->data[macarray->cnt], old.addr[i], WLAN_ADDR_LEN); macarray->cnt++; } } } break; case DIDmib_p2_p2Table_p2PowerSaveUserCount: if (isget) *uint32 = hw->psusercount; break; case DIDmib_p2_p2Table_p2Comment: if (isget) { pstr->len = strlen(hw->comment); memcpy(pstr->data, hw->comment, pstr->len); } else { cnt = pstr->len; if (cnt < 0) cnt = 0; if (cnt >= sizeof(hw->comment)) cnt = sizeof(hw->comment)-1; memcpy(hw->comment, pstr->data, cnt); pstr->data[cnt] = '\0'; } break; case DIDmib_p2_p2Table_p2AccessMode: if (isget) *uint32 = hw->accessmode; else prism2mib_priv_accessmode(hw, *uint32); break; case DIDmib_p2_p2Table_p2AccessAllow: if (isget) { macarray->cnt = hw->allow.cnt; memcpy(macarray->data, hw->allow.addr, macarray->cnt*WLAN_ADDR_LEN); } else { prism2mib_priv_accessallow(hw, macarray); } break; case DIDmib_p2_p2Table_p2AccessDeny: if (isget) { macarray->cnt = hw->deny.cnt; memcpy(macarray->data, hw->deny.addr, macarray->cnt*WLAN_ADDR_LEN); } else { prism2mib_priv_accessdeny(hw, macarray); } break; case DIDmib_p2_p2Table_p2ChannelInfoResults: if (isget) { done = atomic_read(&hw->channel_info.done); if (done == 0) { msg->resultcode.status = P80211ENUM_msgitem_status_no_value; break; } if (done == 1) { msg->resultcode.status = P80211ENUM_msgitem_status_incomplete_itemdata; break; } for (i = 0; i < 14; i++, uint32 += 5) { uint32[0] = i+1; uint32[1] = hw->channel_info.results.result[i].anl; uint32[2] = hw->channel_info.results.result[i].pnl; uint32[3] = (hw->channel_info.results.result[i].active & HFA384x_CHINFORESULT_BSSACTIVE) ? 1 : 0; uint32[4] = (hw->channel_info.results.result[i].active & HFA384x_CHINFORESULT_PCFACTIVE) ? 1 : 0; } } break; case DIDmib_dot11smt_dot11StationConfigTable_dot11DesiredBSSType: if (isget) *uint32 = hw->dot11_desired_bss_type; else hw->dot11_desired_bss_type = *uint32; break; case DIDmib_lnx_lnxConfigTable_lnxRSNAIE: { hfa384x_WPAData_t wpa; if (isget) { hfa384x_drvr_getconfig( hw, HFA384x_RID_CNFWPADATA, (UINT8 *) &wpa, sizeof(wpa)); pstr->len = hfa384x2host_16(wpa.datalen); memcpy(pstr->data, wpa.data, pstr->len); } else { wpa.datalen = host2hfa384x_16(pstr->len); memcpy(wpa.data, pstr->data, pstr->len); result = hfa384x_drvr_setconfig(hw, HFA384x_RID_CNFWPADATA, (UINT8 *) &wpa, sizeof(wpa)); } break; } default: WLAN_LOG_ERROR("Unhandled DID 0x%08x\n", mib->did); } DBFEXIT; return(0); } /*---------------------------------------------------------------- * prism2mib_priv_authlist * * Get a copy of the list of authenticated stations. * * Arguments: * priv "priv" structure. * list List of authenticated stations. * * Returns: * Nothing * ----------------------------------------------------------------*/ static void prism2mib_priv_authlist( hfa384x_t *hw, prism2sta_authlist_t *list) { prism2sta_authlist_t test; int i; DBFENTER; /* ** Note: The values in this record are changed by the interrupt ** handler and therefore cannot be guaranteed to be stable while ** they are being copied. However, the interrupt handler will ** take priority over this code. Hence, if the same values are ** copied twice, then we are ensured that the values have not ** been changed. If they have, then just try again. Don't try ** more than 10 times...the list of authenticated stations is ** unlikely to be changing frequently enough that we can't get ** a snapshot in 10 tries. Don't try more than this so that we ** don't risk locking-up for long periods of time. If we still ** haven't got the snapshot, then generate an error message and ** return an empty list (since this is the only valid list that ** we can guarentee). This scheme for copying values is used in ** order to prevent having to block the interrupt handler while ** we copy the values. */ for (i = 0; i < 10; i++) { memcpy(list, &hw->authlist, sizeof(prism2sta_authlist_t)); memcpy(&test, &hw->authlist, sizeof(prism2sta_authlist_t)); if (memcmp(list, &test, sizeof(prism2sta_authlist_t)) == 0) break; } if (i >= 10) { list->cnt = 0; WLAN_LOG_ERROR("Could not obtain snapshot of authenticated stations.\n"); } DBFEXIT; return; } /*---------------------------------------------------------------- * prism2mib_priv_accessmode * * Set the Access Mode. * * Arguments: * priv "priv" structure. * hw "hw" structure. * mode New access mode. * * Returns: * Nothing * ----------------------------------------------------------------*/ static void prism2mib_priv_accessmode( hfa384x_t *hw, UINT32 mode) { prism2sta_authlist_t old; int i, j, deauth; UINT8 *addr; DBFENTER; /* ** If the mode is not changing or it is changing to "All", then it's ** okay to go ahead without a lot of messing around. Otherwise, the ** access mode is changing in a way that may leave some stations ** authenticated which should not be authenticated. It will be ** necessary to de-authenticate these stations. */ if (mode == WLAN_ACCESS_ALL || mode == hw->accessmode) { hw->accessmode = mode; return; } /* ** Switch to the new access mode. Once this is done, then the interrupt ** handler (which uses this value) will be prevented from authenticating ** ADDITIONAL stations which should not be authenticated. Then get a ** copy of the current list of authenticated stations. */ hw->accessmode = mode; prism2mib_priv_authlist(hw, &old); /* ** Now go through the list of previously authenticated stations (some ** of which might de-authenticate themselves while we are processing it ** but that is okay). Any station which no longer matches the access ** mode, must be de-authenticated. */ for (i = 0; i < old.cnt; i++) { addr = old.addr[i]; if (mode == WLAN_ACCESS_NONE) deauth = 1; else { if (mode == WLAN_ACCESS_ALLOW) { for (j = 0; j < hw->allow.cnt; j++) if (memcmp(addr, hw->allow.addr[j], WLAN_ADDR_LEN) == 0) break; deauth = (j >= hw->allow.cnt); } else { for (j = 0; j < hw->deny.cnt; j++) if (memcmp(addr, hw->deny.addr[j], WLAN_ADDR_LEN) == 0) break; deauth = (j < hw->deny.cnt); } } if (deauth) prism2mib_priv_deauthenticate(hw, addr); } DBFEXIT; return; } /*---------------------------------------------------------------- * prism2mib_priv_accessallow * * Change the list of allowed MAC addresses. * * Arguments: * priv "priv" structure. * hw "hw" structure. * macarray New array of MAC addresses. * * Returns: * Nothing * ----------------------------------------------------------------*/ static void prism2mib_priv_accessallow( hfa384x_t *hw, p80211macarray_t *macarray) { prism2sta_authlist_t old; int i, j; DBFENTER; /* ** Change the access list. Note that the interrupt handler may be in ** the middle of using the access list!!! Since the interrupt handler ** will always have priority over this process and this is the only ** process that will modify the list, this problem can be handled as ** follows: ** ** 1. Set the "modify" flag. ** 2. Change the first copy of the list. ** 3. Clear the "modify" flag. ** 4. Change the backup copy of the list. ** ** The interrupt handler will check the "modify" flag. If NOT set, then ** the first copy of the list is valid and may be used. Otherwise, the ** first copy is being changed but the backup copy is valid and may be ** used. Doing things this way prevents having to have the interrupt ** handler block while the list is being updated. */ hw->allow.modify = 1; hw->allow.cnt = macarray->cnt; memcpy(hw->allow.addr, macarray->data, macarray->cnt*WLAN_ADDR_LEN); hw->allow.modify = 0; hw->allow.cnt1 = macarray->cnt; memcpy(hw->allow.addr1, macarray->data, macarray->cnt*WLAN_ADDR_LEN); /* ** If the current access mode is "Allow", then changing the access ** list may leave some stations authenticated which should not be ** authenticated. It will be necessary to de-authenticate these ** stations. Otherwise, the list can be changed without a lot of fuss. */ if (hw->accessmode == WLAN_ACCESS_ALLOW) { /* ** Go through the list of authenticated stations (some of ** which might de-authenticate themselves while we are ** processing it but that is okay). Any station which is ** no longer in the list of allowed stations, must be ** de-authenticated. */ prism2mib_priv_authlist(hw, &old); for (i = 0; i < old.cnt; i++) { for (j = 0; j < hw->allow.cnt; j++) if (memcmp(old.addr[i], hw->allow.addr[j], WLAN_ADDR_LEN) == 0) break; if (j >= hw->allow.cnt) prism2mib_priv_deauthenticate(hw, old.addr[i]); } } DBFEXIT; return; } /*---------------------------------------------------------------- * prism2mib_priv_accessdeny * * Change the list of denied MAC addresses. * * Arguments: * priv "priv" structure. * hw "hw" structure. * macarray New array of MAC addresses. * * Returns: * Nothing * ----------------------------------------------------------------*/ static void prism2mib_priv_accessdeny( hfa384x_t *hw, p80211macarray_t *macarray) { prism2sta_authlist_t old; int i, j; DBFENTER; /* ** Change the access list. Note that the interrupt handler may be in ** the middle of using the access list!!! Since the interrupt handler ** will always have priority over this process and this is the only ** process that will modify the list, this problem can be handled as ** follows: ** ** 1. Set the "modify" flag. ** 2. Change the first copy of the list. ** 3. Clear the "modify" flag. ** 4. Change the backup copy of the list. ** ** The interrupt handler will check the "modify" flag. If NOT set, then ** the first copy of the list is valid and may be used. Otherwise, the ** first copy is being changed but the backup copy is valid and may be ** used. Doing things this way prevents having to have the interrupt ** handler block while the list is being updated. */ hw->deny.modify = 1; hw->deny.cnt = macarray->cnt; memcpy(hw->deny.addr, macarray->data, macarray->cnt*WLAN_ADDR_LEN); hw->deny.modify = 0; hw->deny.cnt1 = macarray->cnt; memcpy(hw->deny.addr1, macarray->data, macarray->cnt*WLAN_ADDR_LEN); /* ** If the current access mode is "Deny", then changing the access ** list may leave some stations authenticated which should not be ** authenticated. It will be necessary to de-authenticate these ** stations. Otherwise, the list can be changed without a lot of fuss. */ if (hw->accessmode == WLAN_ACCESS_DENY) { /* ** Go through the list of authenticated stations (some of ** which might de-authenticate themselves while we are ** processing it but that is okay). Any station which is ** now in the list of denied stations, must be de-authenticated. */ prism2mib_priv_authlist(hw, &old); for (i = 0; i < old.cnt; i++) for (j = 0; j < hw->deny.cnt; j++) if (memcmp(old.addr[i], hw->deny.addr[j], WLAN_ADDR_LEN) == 0) { prism2mib_priv_deauthenticate(hw, old.addr[i]); break; } } DBFEXIT; return; } /*---------------------------------------------------------------- * prism2mib_priv_deauthenticate * * De-authenticate a station. This is done by sending a HandoverAddress * information frame to the firmware. This should work, according to * Intersil. * * Arguments: * priv "priv" structure. * hw "hw" structure. * addr MAC address of station to be de-authenticated. * * Returns: * Nothing * ----------------------------------------------------------------*/ static void prism2mib_priv_deauthenticate( hfa384x_t *hw, UINT8 *addr) { DBFENTER; hfa384x_drvr_handover(hw, addr); DBFEXIT; return; } /*---------------------------------------------------------------- * prism2mgmt_pstr2bytestr * * Convert the pstr data in the WLAN message structure into an hfa384x * byte string format. * * Arguments: * bytestr hfa384x byte string data type * pstr wlan message data * * Returns: * Nothing * ----------------------------------------------------------------*/ void prism2mgmt_pstr2bytestr(hfa384x_bytestr_t *bytestr, p80211pstrd_t *pstr) { DBFENTER; bytestr->len = host2hfa384x_16((UINT16)(pstr->len)); memcpy(bytestr->data, pstr->data, pstr->len); DBFEXIT; } /*---------------------------------------------------------------- * prism2mgmt_pstr2bytearea * * Convert the pstr data in the WLAN message structure into an hfa384x * byte area format. * * Arguments: * bytearea hfa384x byte area data type * pstr wlan message data * * Returns: * Nothing * ----------------------------------------------------------------*/ void prism2mgmt_pstr2bytearea(UINT8 *bytearea, p80211pstrd_t *pstr) { DBFENTER; memcpy(bytearea, pstr->data, pstr->len); DBFEXIT; } /*---------------------------------------------------------------- * prism2mgmt_bytestr2pstr * * Convert the data in an hfa384x byte string format into a * pstr in the WLAN message. * * Arguments: * bytestr hfa384x byte string data type * msg wlan message * * Returns: * Nothing * ----------------------------------------------------------------*/ void prism2mgmt_bytestr2pstr(hfa384x_bytestr_t *bytestr, p80211pstrd_t *pstr) { DBFENTER; pstr->len = (UINT8)(hfa384x2host_16((UINT16)(bytestr->len))); memcpy(pstr->data, bytestr->data, pstr->len); DBFEXIT; } /*---------------------------------------------------------------- * prism2mgmt_bytearea2pstr * * Convert the data in an hfa384x byte area format into a pstr * in the WLAN message. * * Arguments: * bytearea hfa384x byte area data type * msg wlan message * * Returns: * Nothing * ----------------------------------------------------------------*/ void prism2mgmt_bytearea2pstr(UINT8 *bytearea, p80211pstrd_t *pstr, int len) { DBFENTER; pstr->len = (UINT8)len; memcpy(pstr->data, bytearea, len); DBFEXIT; } /*---------------------------------------------------------------- * prism2mgmt_prism2int2p80211int * * Convert an hfa384x integer into a wlan integer * * Arguments: * prism2enum pointer to hfa384x integer * wlanenum pointer to p80211 integer * * Returns: * Nothing * ----------------------------------------------------------------*/ void prism2mgmt_prism2int2p80211int(UINT16 *prism2int, UINT32 *wlanint) { DBFENTER; *wlanint = (UINT32)hfa384x2host_16(*prism2int); DBFEXIT; } /*---------------------------------------------------------------- * prism2mgmt_p80211int2prism2int * * Convert a wlan integer into an hfa384x integer * * Arguments: * prism2enum pointer to hfa384x integer * wlanenum pointer to p80211 integer * * Returns: * Nothing * ----------------------------------------------------------------*/ void prism2mgmt_p80211int2prism2int(UINT16 *prism2int, UINT32 *wlanint) { DBFENTER; *prism2int = host2hfa384x_16((UINT16)(*wlanint)); DBFEXIT; } /*---------------------------------------------------------------- * prism2mgmt_prism2enum2p80211enum * * Convert the hfa384x enumerated int into a p80211 enumerated int * * Arguments: * prism2enum pointer to hfa384x integer * wlanenum pointer to p80211 integer * rid hfa384x record id * * Returns: * Nothing * ----------------------------------------------------------------*/ void prism2mgmt_prism2enum2p80211enum(UINT16 *prism2enum, UINT32 *wlanenum, UINT16 rid) { DBFENTER; /* At the moment, the need for this functionality hasn't presented itself. All the wlan enumerated values are a 1-to-1 match against the Prism2 enumerated values*/ DBFEXIT; return; } /*---------------------------------------------------------------- * prism2mgmt_p80211enum2prism2enum * * Convert the p80211 enumerated int into an hfa384x enumerated int * * Arguments: * prism2enum pointer to hfa384x integer * wlanenum pointer to p80211 integer * rid hfa384x record id * * Returns: * Nothing * ----------------------------------------------------------------*/ void prism2mgmt_p80211enum2prism2enum(UINT16 *prism2enum, UINT32 *wlanenum, UINT16 rid) { DBFENTER; /* At the moment, the need for this functionality hasn't presented itself. All the wlan enumerated values are a 1-to-1 match against the Prism2 enumerated values*/ DBFEXIT; return; } /*---------------------------------------------------------------- * prism2mgmt_get_oprateset * * Convert the hfa384x bit area into a wlan octet string. * * Arguments: * rate Prism2 bit area * pstr wlan octet string * * Returns: * Nothing * ----------------------------------------------------------------*/ void prism2mgmt_get_oprateset(UINT16 *rate, p80211pstrd_t *pstr) { UINT8 len; UINT8 *datarate; DBFENTER; len = 0; datarate = pstr->data; /* 1 Mbps */ if ( BIT0 & (*rate) ) { len += (UINT8)1; *datarate = (UINT8)2; datarate++; } /* 2 Mbps */ if ( BIT1 & (*rate) ) { len += (UINT8)1; *datarate = (UINT8)4; datarate++; } /* 5.5 Mbps */ if ( BIT2 & (*rate) ) { len += (UINT8)1; *datarate = (UINT8)11; datarate++; } /* 11 Mbps */ if ( BIT3 & (*rate) ) { len += (UINT8)1; *datarate = (UINT8)22; datarate++; } pstr->len = len; DBFEXIT; return; } /*---------------------------------------------------------------- * prism2mgmt_set_oprateset * * Convert the wlan octet string into an hfa384x bit area. * * Arguments: * rate Prism2 bit area * pstr wlan octet string * * Returns: * Nothing * ----------------------------------------------------------------*/ void prism2mgmt_set_oprateset(UINT16 *rate, p80211pstrd_t *pstr) { UINT8 *datarate; int i; DBFENTER; *rate = 0; datarate = pstr->data; for ( i=0; i < pstr->len; i++, datarate++ ) { switch (*datarate) { case 2: /* 1 Mbps */ *rate |= BIT0; break; case 4: /* 2 Mbps */ *rate |= BIT1; break; case 11: /* 5.5 Mbps */ *rate |= BIT2; break; case 22: /* 11 Mbps */ *rate |= BIT3; break; default: WLAN_LOG_DEBUG(1, "Unrecoginzed Rate of %d\n", *datarate); break; } } DBFEXIT; return; } /*---------------------------------------------------------------- * prism2mgmt_get_grpaddr * * Retrieves a particular group address from the list of * group addresses. * * Arguments: * did mibitem did * pstr wlan octet string * priv prism2 driver private data structure * * Returns: * Nothing * ----------------------------------------------------------------*/ void prism2mgmt_get_grpaddr(UINT32 did, p80211pstrd_t *pstr, hfa384x_t *hw ) { int index; DBFENTER; index = prism2mgmt_get_grpaddr_index(did); if ( index >= 0 ) { pstr->len = WLAN_ADDR_LEN; memcpy(pstr->data, hw->dot11_grp_addr[index], WLAN_ADDR_LEN); } DBFEXIT; return; } /*---------------------------------------------------------------- * prism2mgmt_set_grpaddr * * Convert the wlan octet string into an hfa384x bit area. * * Arguments: * did mibitem did * buf * groups * * Returns: * 0 Success * !0 Error * ----------------------------------------------------------------*/ int prism2mgmt_set_grpaddr(UINT32 did, UINT8 *prism2buf, p80211pstrd_t *pstr, hfa384x_t *hw ) { UINT8 no_addr[WLAN_ADDR_LEN]; int index; DBFENTER; memset(no_addr, 0, WLAN_ADDR_LEN); if (memcmp(no_addr, pstr->data, WLAN_ADDR_LEN) != 0) { /* ** The address is NOT 0 so we are "adding" an address to the ** group address list. Check to make sure we aren't trying ** to add more than the maximum allowed number of group ** addresses in the list. The new address is added to the ** end of the list regardless of the DID used to add the ** address. */ if (hw->dot11_grpcnt >= MAX_GRP_ADDR) return(-1); memcpy(hw->dot11_grp_addr[hw->dot11_grpcnt], pstr->data, WLAN_ADDR_LEN); hw->dot11_grpcnt += 1; } else { /* ** The address is 0. Interpret this as "deleting" an address ** from the group address list. Get the address index from ** the DID. If this is within the range of used addresses, ** then delete the specified address by shifting all following ** addresses down. Then clear the last address (which should ** now be unused). If the address index is NOT within the ** range of used addresses, then just ignore the address. */ index = prism2mgmt_get_grpaddr_index(did); if (index >= 0 && index < hw->dot11_grpcnt) { hw->dot11_grpcnt -= 1; memmove(hw->dot11_grp_addr[index], hw->dot11_grp_addr[index + 1], ((hw->dot11_grpcnt)-index) * WLAN_ADDR_LEN); memset(hw->dot11_grp_addr[hw->dot11_grpcnt], 0, WLAN_ADDR_LEN); } } DBFEXIT; return(0); } /*---------------------------------------------------------------- * prism2mgmt_get_grpaddr_index * * Gets the index in the group address list based on the did. * * Arguments: * did mibitem did * * Returns: * >= 0 If valid did * < 0 If not valid did * ----------------------------------------------------------------*/ int prism2mgmt_get_grpaddr_index( UINT32 did ) { int index; DBFENTER; index = -1; switch (did) { case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address1: index = 0; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address2: index = 1; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address3: index = 2; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address4: index = 3; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address5: index = 4; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address6: index = 5; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address7: index = 6; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address8: index = 7; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address9: index = 8; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address10: index = 9; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address11: index = 10; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address12: index = 11; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address13: index = 12; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address14: index = 13; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address15: index = 14; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address16: index = 15; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address17: index = 16; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address18: index = 17; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address19: index = 18; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address20: index = 19; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address21: index = 20; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address22: index = 21; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address23: index = 22; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address24: index = 23; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address25: index = 24; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address26: index = 25; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address27: index = 26; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address28: index = 27; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address29: index = 28; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address30: index = 29; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address31: index = 30; break; case DIDmib_dot11mac_dot11GroupAddressesTable_dot11Address32: index = 31; break; } DBFEXIT; return index; }