296 lines
7.1 KiB
C
296 lines
7.1 KiB
C
|
/*
|
||
|
*************************************************************************
|
||
|
* 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;
|
||
|
}
|