/* ************************************************************************* * Ralink Tech Inc. * 5F., No.36, Taiyuan St., Jhubei City, * Hsinchu County 302, * Taiwan, R.O.C. * * (c) Copyright 2002-2007, Ralink Technology, Inc. * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * ************************************************************************* Module Name: cmm_cfg.c Abstract: Ralink WiFi Driver configuration related subroutines Revision History: Who When What --------- ---------- ---------------------------------------------- */ #include "../rt_config.h" char *GetPhyMode(int Mode) { switch (Mode) { case MODE_CCK: return "CCK"; case MODE_OFDM: return "OFDM"; case MODE_HTMIX: return "HTMIX"; case MODE_HTGREENFIELD: return "GREEN"; default: return "N/A"; } } char *GetBW(int BW) { switch (BW) { case BW_10: return "10M"; case BW_20: return "20M"; case BW_40: return "40M"; default: return "N/A"; } } /* ========================================================================== Description: Set Country Region to pAd->CommonCfg.CountryRegion. This command will not work, if the field of CountryRegion in eeprom is programmed. Return: TRUE if all parameters are OK, FALSE otherwise ========================================================================== */ int RT_CfgSetCountryRegion(struct rt_rtmp_adapter *pAd, char *arg, int band) { long region, regionMax; u8 *pCountryRegion; region = simple_strtol(arg, 0, 10); if (band == BAND_24G) { pCountryRegion = &pAd->CommonCfg.CountryRegion; regionMax = REGION_MAXIMUM_BG_BAND; } else { pCountryRegion = &pAd->CommonCfg.CountryRegionForABand; regionMax = REGION_MAXIMUM_A_BAND; } /* TODO: Is it neccesay for following check??? */ /* Country can be set only when EEPROM not programmed */ if (*pCountryRegion & 0x80) { DBGPRINT(RT_DEBUG_ERROR, ("CfgSetCountryRegion():CountryRegion in eeprom was programmed\n")); return FALSE; } if ((region >= 0) && (region <= REGION_MAXIMUM_BG_BAND)) { *pCountryRegion = (u8)region; } else if ((region == REGION_31_BG_BAND) && (band == BAND_24G)) { *pCountryRegion = (u8)region; } else { DBGPRINT(RT_DEBUG_ERROR, ("CfgSetCountryRegion():region(%ld) out of range!\n", region)); return FALSE; } return TRUE; } /* ========================================================================== Description: Set Wireless Mode Return: TRUE if all parameters are OK, FALSE otherwise ========================================================================== */ int RT_CfgSetWirelessMode(struct rt_rtmp_adapter *pAd, char *arg) { int MaxPhyMode = PHY_11G; long WirelessMode; MaxPhyMode = PHY_11N_5G; WirelessMode = simple_strtol(arg, 0, 10); if (WirelessMode <= MaxPhyMode) { pAd->CommonCfg.PhyMode = WirelessMode; return TRUE; } return FALSE; } int RT_CfgSetShortSlot(struct rt_rtmp_adapter *pAd, char *arg) { long ShortSlot; ShortSlot = simple_strtol(arg, 0, 10); if (ShortSlot == 1) pAd->CommonCfg.bUseShortSlotTime = TRUE; else if (ShortSlot == 0) pAd->CommonCfg.bUseShortSlotTime = FALSE; else return FALSE; /*Invalid argument */ return TRUE; } /* ========================================================================== Description: Set WEP KEY base on KeyIdx Return: TRUE if all parameters are OK, FALSE otherwise ========================================================================== */ int RT_CfgSetWepKey(struct rt_rtmp_adapter *pAd, char *keyString, struct rt_cipher_key *pSharedKey, int keyIdx) { int KeyLen; int i; u8 CipherAlg = CIPHER_NONE; BOOLEAN bKeyIsHex = FALSE; /* TODO: Shall we do memset for the original key info?? */ memset(pSharedKey, 0, sizeof(struct rt_cipher_key)); KeyLen = strlen(keyString); switch (KeyLen) { case 5: /*wep 40 Ascii type */ case 13: /*wep 104 Ascii type */ bKeyIsHex = FALSE; pSharedKey->KeyLen = KeyLen; NdisMoveMemory(pSharedKey->Key, keyString, KeyLen); break; case 10: /*wep 40 Hex type */ case 26: /*wep 104 Hex type */ for (i = 0; i < KeyLen; i++) { if (!isxdigit(*(keyString + i))) return FALSE; /*Not Hex value; */ } bKeyIsHex = TRUE; pSharedKey->KeyLen = KeyLen / 2; AtoH(keyString, pSharedKey->Key, pSharedKey->KeyLen); break; default: /*Invalid argument */ DBGPRINT(RT_DEBUG_TRACE, ("RT_CfgSetWepKey(keyIdx=%d):Invalid argument (arg=%s)\n", keyIdx, keyString)); return FALSE; } pSharedKey->CipherAlg = ((KeyLen % 5) ? CIPHER_WEP128 : CIPHER_WEP64); DBGPRINT(RT_DEBUG_TRACE, ("RT_CfgSetWepKey:(KeyIdx=%d,type=%s, Alg=%s)\n", keyIdx, (bKeyIsHex == FALSE ? "Ascii" : "Hex"), CipherName[CipherAlg])); return TRUE; } /* ========================================================================== Description: Set WPA PSK key Arguments: pAdapter Pointer to our adapter keyString WPA pre-shared key string pHashStr String used for password hash function hashStrLen Lenght of the hash string pPMKBuf Output buffer of WPAPSK key Return: TRUE if all parameters are OK, FALSE otherwise ========================================================================== */ int RT_CfgSetWPAPSKKey(struct rt_rtmp_adapter *pAd, char *keyString, u8 * pHashStr, int hashStrLen, u8 *pPMKBuf) { int keyLen; u8 keyMaterial[40]; keyLen = strlen(keyString); if ((keyLen < 8) || (keyLen > 64)) { DBGPRINT(RT_DEBUG_TRACE, ("WPAPSK Key length(%d) error, required 8 ~ 64 characters!(keyStr=%s)\n", keyLen, keyString)); return FALSE; } memset(pPMKBuf, 0, 32); if (keyLen == 64) { AtoH(keyString, pPMKBuf, 32); } else { PasswordHash(keyString, pHashStr, hashStrLen, keyMaterial); NdisMoveMemory(pPMKBuf, keyMaterial, 32); } return TRUE; }