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 + -
显示快捷键?