rtmp_init.c
来自「Ralink RT61 SoftAP Driver source code. 」· C语言 代码 · 共 1,988 行 · 第 1/5 页
C
1,988 行
}
len = strlen(ptr);
memset(dest, 0x00, destsize);
strncpy(dest, ptr, len >= destsize ? destsize: len);
kfree(temp_buf1);
kfree(temp_buf2);
return TRUE;
}
static void rtmp_read_key_parms_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, char *buffer)
{
char tok_str[16];
PUCHAR macptr;
INT i=0, idx;
ULONG KeyType[MAX_MBSSID_NUM];
ULONG KeyLen;
ULONG KeyIdx;
UCHAR CipherAlg = CIPHER_WEP64;
//DefaultKeyID
if(RTMPGetKeyParameter("DefaultKeyID", tmpbuf, 25, buffer))
{
for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
{
KeyIdx = simple_strtol(macptr, 0, 10);
if((KeyIdx >= 1 ) && (KeyIdx <= 4))
pAd->PortCfg.MBSSID[i].DefaultKeyId = (UCHAR) (KeyIdx - 1 );
else
pAd->PortCfg.MBSSID[i].DefaultKeyId = 0;
DBGPRINT(RT_DEBUG_TRACE, "I/F(ra%d) DefaultKeyID(0~3)=%d\n", i, pAd->PortCfg.MBSSID[i].DefaultKeyId);
}
}
for (idx=0; idx<4; idx++) {
sprintf(tok_str, "Key%dType", idx+1);
//Key1Type
if(RTMPGetKeyParameter(tok_str, tmpbuf, 128, buffer))
{
for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
{
KeyType[i] = simple_strtol(macptr, 0, 10);
}
sprintf(tok_str, "Key%dStr", idx+1);
//Key1Str
if(RTMPGetKeyParameter(tok_str, tmpbuf, 512, buffer))
{
for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
{
KeyLen = strlen(macptr);
if(KeyType[i] == 0)
{//Hex type
if( (KeyLen == 10) || (KeyLen == 26))
{
pAd->PortCfg.MBSSID[i].SharedKey[idx].KeyLen = KeyLen / 2;
AtoH(macptr, pAd->PortCfg.MBSSID[i].SharedKey[idx].Key, KeyLen / 2);
if (KeyLen == 10)
CipherAlg = CIPHER_WEP64;
else
CipherAlg = CIPHER_WEP128;
pAd->PortCfg.MBSSID[i].SharedKey[idx].CipherAlg = CipherAlg;
DBGPRINT(RT_DEBUG_TRACE, "I/F(ra%d) Key%dStr=%s and type=%s\n", i, idx+1, macptr, (KeyType[i]==0) ? "Hex":"Ascii");
}
else
{ //Invalid key length
DBGPRINT(RT_DEBUG_ERROR, "Key%dStr is Invalid key length!\n", idx+1);
}
}
else
{//Ascii
if( (KeyLen == 5) || (KeyLen == 13))
{
pAd->PortCfg.MBSSID[i].SharedKey[idx].KeyLen = KeyLen;
NdisMoveMemory(pAd->PortCfg.MBSSID[i].SharedKey[idx].Key, macptr, KeyLen);
if (KeyLen == 5)
CipherAlg = CIPHER_WEP64;
else
CipherAlg = CIPHER_WEP128;
pAd->PortCfg.MBSSID[i].SharedKey[idx].CipherAlg = CipherAlg;
DBGPRINT(RT_DEBUG_TRACE, "I/F(ra%d) Key%dStr=%s and type=%s\n", i, idx+1, macptr, (KeyType[i]==0) ? "Hex":"Ascii");
}
else
{ //Invalid key length
DBGPRINT(RT_DEBUG_ERROR, "Key%dStr is Invalid key length!\n", idx+1);
}
}
}
}
}
}
}
#ifdef APCLI_SUPPORT
static void rtmp_read_ap_client_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, char *buffer)
{
PUCHAR macptr;
INT i=0,j=0;
UCHAR macAddress[MAC_ADDR_LEN];
UCHAR keyMaterial[40];
//ApCliEnable
if(RTMPGetKeyParameter("ApCliEnable", tmpbuf, 128, buffer))
{
for (i = 0, macptr = rstrtok(tmpbuf,";"); (macptr && i < MAX_APCLI_ENTRY); macptr = rstrtok(NULL,";"), i++)
{
if ((strncmp(macptr, "0", 1) == 0))
pAd->ApCliTab.ApCliEntry[i].Enable = FALSE;
else if ((strncmp(macptr, "1", 1) == 0))
pAd->ApCliTab.ApCliEntry[i].Enable = TRUE;
else
pAd->ApCliTab.ApCliEntry[i].Enable = FALSE;
if (pAd->ApCliTab.ApCliEntry[i].Enable)
{
pAd->ApCliTab.ApCliEntry[i].WpaState = SS_NOTUSE;
pAd->ApCliTab.ApCliEntry[i].PortSecured = WPA_802_1X_PORT_NOT_SECURED;
NdisZeroMemory(pAd->ApCliTab.ApCliEntry[i].ReplayCounter, LEN_KEY_DESC_REPLAY);
}
DBGPRINT(RT_DEBUG_TRACE,"ApCliEntry[%d].Enable=%d\n", i, pAd->ApCliTab.ApCliEntry[i].Enable);
}
}
//ApCliSsid
if(RTMPGetKeyParameter("ApCliSsid", tmpbuf, MAX_PARAM_BUFFER_SIZE, buffer))
{
for (i=0, macptr = rstrtok(tmpbuf,";"); (macptr && i < MAX_APCLI_ENTRY); macptr = rstrtok(NULL,";"), i++)
{
//Ssid acceptable strlen must be less than 32 and bigger than 0.
if((strlen(macptr) < 0) || (strlen(macptr) > 32))
continue;
pAd->ApCliTab.ApCliEntry[i].CfgSsidLen = strlen(macptr);
if(pAd->ApCliTab.ApCliEntry[i].CfgSsidLen > 0)
{
memcpy(&pAd->ApCliTab.ApCliEntry[i].CfgSsid, macptr, pAd->ApCliTab.ApCliEntry[i].CfgSsidLen);
pAd->ApCliTab.ApCliEntry[i].Valid = FALSE;// it should be set when successfuley association
} else
{
NdisZeroMemory(&(pAd->ApCliTab.ApCliEntry[i].CfgSsid), MAX_LEN_OF_SSID);
continue;
}
DBGPRINT(RT_DEBUG_TRACE,"ApCliEntry[%d].CfgSsidLen=%d, CfgSsid=%s\n", i, pAd->ApCliTab.ApCliEntry[i].CfgSsidLen, pAd->ApCliTab.ApCliEntry[i].CfgSsid);
}
}
//ApCliBssid
if(RTMPGetKeyParameter("ApCliBssid", tmpbuf, MAX_PARAM_BUFFER_SIZE, buffer))
{
for (i=0, macptr = rstrtok(tmpbuf,";"); (macptr && i < MAX_APCLI_ENTRY); macptr = rstrtok(NULL,";"), i++)
{
if(strlen(macptr) != 17) //Mac address acceptable format 01:02:03:04:05:06 length 17
continue;
if(strcmp(macptr,"00:00:00:00:00:00") == 0)
continue;
if(i >= MAX_APCLI_ENTRY)
break;
for (j=0; j<ETH_LENGTH_OF_ADDRESS; j++)
{
AtoH(macptr, &macAddress[j], 2);
macptr=macptr+3;
}
memcpy(&pAd->ApCliTab.ApCliEntry[i].CfgApCliBssid[0], &macAddress, ETH_LENGTH_OF_ADDRESS);
pAd->ApCliTab.ApCliEntry[i].Valid = FALSE;// it should be set when successfuley association
}
}
// ApCliWPAPSK
if (RTMPGetKeyParameter("ApCliWPAPSK", tmpbuf, 255, buffer))
{
for (i = 0, macptr = rstrtok(tmpbuf,";"); (macptr && i < MAX_APCLI_ENTRY); macptr = rstrtok(NULL,";"), i++)
{
int err = 0;
if((strlen(macptr) < 8) || (strlen(macptr) > 64))
{
DBGPRINT(RT_DEBUG_ERROR, "APCli_WPAPSK_KEY, key string required 8 ~ 64 characters!!!\n");
continue;
}
NdisMoveMemory(pAd->ApCliTab.ApCliEntry[i].PSK, macptr, strlen(macptr));
pAd->ApCliTab.ApCliEntry[i].PSKLen = strlen(macptr);
DBGPRINT(RT_DEBUG_TRACE, "I/F(apcli%d) APCli_WPAPSK_KEY=%s, Len=%d\n", i, pAd->ApCliTab.ApCliEntry[i].PSK, pAd->ApCliTab.ApCliEntry[i].PSKLen);
if ((pAd->PortCfg.MBSSID[MAIN_MBSSID].AuthMode != Ndis802_11AuthModeWPAPSK) &&
(pAd->PortCfg.MBSSID[MAIN_MBSSID].AuthMode != Ndis802_11AuthModeWPA2PSK))
{
err = 1;
}
if ((strlen(macptr) >= 8) && (strlen(macptr) < 64))
{// ASCII mode
PasswordHash((char *)macptr, pAd->ApCliTab.ApCliEntry[i].CfgSsid, pAd->ApCliTab.ApCliEntry[i].CfgSsidLen, keyMaterial);
NdisMoveMemory(pAd->ApCliTab.ApCliEntry[i].PMK, keyMaterial, 32);
}
else if (strlen(macptr) == 64)
{// Hex mode
AtoH(macptr, pAd->ApCliTab.ApCliEntry[i].PMK, 32);
}
if (err == 0)
{
// Start STA supplicant WPA state machine
DBGPRINT(RT_DEBUG_TRACE, "Start STA supplicant WPA state machine \n");
pAd->ApCliTab.ApCliEntry[i].WpaState = SS_START;
}
#ifdef DBG
DBGPRINT(RT_DEBUG_TRACE, "I/F(apcli%d) PMK Material => \n", i);
for (j = 0; j < 32; j++)
{
printk("%02x:", pAd->ApCliTab.ApCliEntry[i].PMK[j]);
if ((j%16) == 15)
printk("\n");
}
printk("\n");
#endif
}
}
}
#endif
static void rtmp_read_acl_parms_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, char *buffer)
{
char tok_str[32];
PUCHAR macptr;
INT i=0, j=0, idx;
UCHAR macAddress[MAC_ADDR_LEN];
for (idx=0; idx<MAX_MBSSID_NUM; idx++) {
//AccessPolicy0
sprintf(tok_str, "AccessPolicy%d", idx);
if(RTMPGetKeyParameter(tok_str, tmpbuf, 10, buffer))
{
switch (simple_strtol(tmpbuf, 0, 10))
{
case 1: //Allow All
pAd->PortCfg.MBSSID[idx].AccessControlList.Policy = 1;
break;
case 2: //Reject All
pAd->PortCfg.MBSSID[idx].AccessControlList.Policy = 2;
break;
case 0: //Disable
default:
pAd->PortCfg.MBSSID[idx].AccessControlList.Policy = 0;
break;
}
DBGPRINT(RT_DEBUG_TRACE, "%s=%d\n", tok_str, pAd->PortCfg.MBSSID[idx].AccessControlList.Policy);
}
//AccessControlList0
sprintf(tok_str, "AccessControlList%d", idx);
if(RTMPGetKeyParameter(tok_str, tmpbuf, MAX_PARAM_BUFFER_SIZE, buffer))
{
for (i=0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
{
if (strlen(macptr) != 17) //Mac address acceptable format 01:02:03:04:05:06 length 17
continue;
if (pAd->PortCfg.MBSSID[idx].AccessControlList.Num >= MAX_NUM_OF_ACL_LIST)
break;
for (j=0; j<ETH_LENGTH_OF_ADDRESS; j++)
{
AtoH(macptr, &macAddress[j], 2);
macptr=macptr+3;
}
pAd->PortCfg.MBSSID[idx].AccessControlList.Num++;
NdisMoveMemory(pAd->PortCfg.MBSSID[idx].AccessControlList.Entry[i].Addr, macAddress, ETH_LENGTH_OF_ADDRESS);
}
DBGPRINT(RT_DEBUG_TRACE, "%s=Get %d Mac Address\n", tok_str, pAd->PortCfg.MBSSID[idx].AccessControlList.Num);
}
}
}
#ifdef WMM_SUPPORT
/*
========================================================================
Routine Description:
In kernel mode read parameters from file
Arguments:
src the location of the file.
dest put the parameters to the destination.
Length size to read.
Return Value:
None
Note:
========================================================================
*/
static void rtmp_read_wmm_parms_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, char *buffer)
{
PUCHAR macptr;
INT i=0;
//WmmCapable
if(RTMPGetKeyParameter("WmmCapable", tmpbuf, 32, buffer))
{
BOOLEAN bEnableWmm = FALSE;
for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
{
if(simple_strtol(macptr, 0, 10) != 0) //Enable
{
pAd->PortCfg.MBSSID[i].bWmmCapable = TRUE;
bEnableWmm = TRUE;
}
else //Disable
{
pAd->PortCfg.MBSSID[i].bWmmCapable = FALSE;
}
if (bEnableWmm)
{
pAd->PortCfg.APEdcaParm.bValid = TRUE;
pAd->PortCfg.BssEdcaParm.bValid = TRUE;
}
else
{
pAd->PortCfg.APEdcaParm.bValid = FALSE;
pAd->PortCfg.BssEdcaParm.bValid = FALSE;
}
DBGPRINT(RT_DEBUG_TRACE, "I/F(ra%d) WmmCapable=%d\n", i, pAd->PortCfg.MBSSID[i].bWmmCapable);
}
}
//DLSCapable
if(RTMPGetKeyParameter("DLSCapable", tmpbuf, 32, buffer))
{
for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
{
if(simple_strtol(macptr, 0, 10) != 0) //Enable
{
pAd->PortCfg.MBSSID[i].bDLSCapable = TRUE;
}
else //Disable
{
pAd->PortCfg.MBSSID[i].bDLSCapable = FALSE;
}
DBGPRINT(RT_DEBUG_TRACE, "I/F(ra%d) DLSCapable=%d\n", i, pAd->PortCfg.MBSSID[i].bDLSCapable);
}
}
//APAifsn
if(RTMPGetKeyParameter("APAifsn", tmpbuf, 32, buffer))
{
for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
{
pAd->PortCfg.APEdcaParm.Aifsn[i] = simple_strtol(macptr, 0, 10);;
DBGPRINT(RT_DEBUG_TRACE, "APAifsn[%d]=%d\n", i, pAd->PortCfg.APEdcaParm.Aifsn[i]);
}
}
//APCwmin
if(RTMPGetKeyParameter("APCwmin", tmpbuf, 32, buffer))
{
for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
{
pAd->PortCfg.APEdcaParm.Cwmin[i] = simple_strtol(macptr, 0, 10);;
DBGPRINT(RT_DEBUG_TRACE, "APCwmin[%d]=%d\n", i, pAd->PortCfg.APEdcaParm.Cwmin[i]);
}
}
//APCwmax
if(RTMPGetKeyParameter("APCwmax", tmpbuf, 32, buffer))
{
for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
{
pAd->PortCfg.APEdcaParm.Cwmax[i] = simple_strtol(macptr, 0, 10);;
DBGPRINT(RT_DEBUG_TRACE, "APCwmax[%d]=%d\n", i, pAd->PortCfg.APEdcaParm.Cwmax[i]);
}
}
//APTxop
if(RTMPGetKeyParameter("APTxop", tmpbuf, 32, buffer))
{
for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
{
pAd->PortCfg.APEdcaParm.Txop[i] = simple_strtol(macptr, 0, 10);;
DBGPRINT(RT_DEBUG_TRACE, "APTxop[%d]=%d\n", i, pAd->PortCfg.APEdcaParm.Txop[i]);
}
}
//APACM
if(RTMPGetKeyParameter("APACM", tmpbuf, 32, buffer))
{
for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++)
{
pAd->PortCfg.APEdcaParm.bACM[i] = simple_strtol(macptr, 0, 10);;
DBGPRINT(RT_DEBUG_TR
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?