| /* |
| ************************************************************************* |
| * 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; |
| } |