/* ************************************************************************* * 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"; #ifdef DOT11_N_SUPPORT case MODE_HTMIX: return "HTMIX"; case MODE_HTGREENFIELD: return "GREEN"; #endif // DOT11_N_SUPPORT // default: return "N/A"; } } char* GetBW( int BW) { switch(BW) { case BW_10: return "10M"; case BW_20: return "20M"; #ifdef DOT11_N_SUPPORT case BW_40: return "40M"; #endif // DOT11_N_SUPPORT // 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( IN PRTMP_ADAPTER pAd, IN PSTRING arg, IN INT band) { LONG region, regionMax; UCHAR *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= (UCHAR) region; } else if ((region == REGION_31_BG_BAND) && (band == BAND_24G)) { *pCountryRegion = (UCHAR) 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( IN PRTMP_ADAPTER pAd, IN PSTRING arg) { INT MaxPhyMode = PHY_11G; LONG WirelessMode; #ifdef DOT11_N_SUPPORT MaxPhyMode = PHY_11N_5G; #endif // DOT11_N_SUPPORT // WirelessMode = simple_strtol(arg, 0, 10); if (WirelessMode <= MaxPhyMode) { pAd->CommonCfg.PhyMode = WirelessMode; pAd->CommonCfg.DesiredPhyMode = WirelessMode; return TRUE; } return FALSE; } INT RT_CfgSetShortSlot( IN PRTMP_ADAPTER pAd, IN PSTRING 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( IN PRTMP_ADAPTER pAd, IN PSTRING keyString, IN CIPHER_KEY *pSharedKey, IN INT keyIdx) { INT KeyLen; INT i; UCHAR CipherAlg = CIPHER_NONE; BOOLEAN bKeyIsHex = FALSE; // TODO: Shall we do memset for the original key info?? memset(pSharedKey, 0, sizeof(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( IN RTMP_ADAPTER *pAd, IN PSTRING keyString, IN UCHAR *pHashStr, IN INT hashStrLen, OUT PUCHAR pPMKBuf) { int keyLen; UCHAR 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; }