Esempio n. 1
0
INT	RT_CfgSetFixedTxPhyMode(PSTRING arg)
{
	INT fix_tx_mode = FIXED_TXMODE_HT;
	ULONG value;


	if (rtstrcasecmp(arg, "OFDM") == TRUE)
		fix_tx_mode = FIXED_TXMODE_OFDM;
	else if (rtstrcasecmp(arg, "CCK") == TRUE)
	    fix_tx_mode = FIXED_TXMODE_CCK;
	else if (rtstrcasecmp(arg, "HT") == TRUE)
	    fix_tx_mode = FIXED_TXMODE_HT;
	else if (rtstrcasecmp(arg, "VHT") == TRUE)
		fix_tx_mode = FIXED_TXMODE_VHT;
	else
	{
		value = simple_strtol(arg, 0, 10);
		switch (value)
		{
			case FIXED_TXMODE_CCK:
			case FIXED_TXMODE_OFDM:
			case FIXED_TXMODE_HT:
			case FIXED_TXMODE_VHT:
				fix_tx_mode = value;
			default:
				fix_tx_mode = FIXED_TXMODE_HT;
		}
	}

	return fix_tx_mode;
					
}	
Esempio n. 2
0
VOID rtmp_read_wds_from_file(RTMP_ADAPTER *pAd, RTMP_STRING *tmpbuf, RTMP_STRING *buffer)
{
	RTMP_STRING *macptr;
	INT			i=0, j;
	RTMP_STRING tok_str[16];
	BOOLEAN		bUsePrevFormat = FALSE;
	UCHAR		macAddress[MAC_ADDR_LEN];
	UCHAR	    keyMaterial[40];	
	UCHAR		KeyLen, CipherAlg = CIPHER_NONE, KeyIdx;
	PRT_802_11_WDS_ENTRY pWdsEntry;
	struct wifi_dev *wdev;


	/*WdsPhyMode */
	if (RTMPGetKeyParameter("WdsPhyMode", tmpbuf, MAX_PARAM_BUFFER_SIZE, buffer, TRUE))
	{	
		for (i=0, macptr = rstrtok(tmpbuf,";"); (macptr && i < MAX_WDS_ENTRY); macptr = rstrtok(NULL,";"), i++) 
		{
			pWdsEntry = &pAd->WdsTab.WdsEntry[i];
			wdev = &pWdsEntry->wdev;
	        if (rtstrcasecmp(macptr, "CCK") == TRUE)
	            wdev->PhyMode = MODE_CCK;
	        else if (rtstrcasecmp(macptr, "OFDM") == TRUE)
	            wdev->PhyMode = MODE_OFDM;
#ifdef DOT11_N_SUPPORT
	        else if (rtstrcasecmp(macptr, "HTMIX") == TRUE)
	            wdev->PhyMode = MODE_HTMIX;
	        else if (rtstrcasecmp(macptr, "GREENFIELD") == TRUE)
	            wdev->PhyMode = MODE_HTGREENFIELD;
#endif /* DOT11_N_SUPPORT */
	        else
	            wdev->PhyMode = 0xff;
		
			DBGPRINT(RT_DEBUG_TRACE, ("If/wds%d - PeerPhyMode=%d\n", i, wdev->PhyMode));
		}
	}
	
	/*WdsList */
	if (RTMPGetKeyParameter("WdsList", tmpbuf, MAX_PARAM_BUFFER_SIZE, buffer, TRUE))
	{
		if (pAd->WdsTab.Mode != WDS_LAZY_MODE)
		{
			for (i=0, macptr = rstrtok(tmpbuf,";"); (macptr && i < MAX_WDS_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_WDS_ENTRY)
					break; 

				for (j=0; j<MAC_ADDR_LEN; j++)
				{
					AtoH(macptr, &macAddress[j], 1);
					macptr=macptr+3;
				}	

				WdsEntryAlloc(pAd, macAddress);
			}
		}
	}
	/*WdsEncrypType */
	if (RTMPGetKeyParameter("WdsEncrypType", tmpbuf, 128, buffer, TRUE))
	{				
	    for (i = 0, macptr = rstrtok(tmpbuf,";"); (macptr && i < MAX_WDS_ENTRY); macptr = rstrtok(NULL,";"), i++)
	    {
		pWdsEntry = &pAd->WdsTab.WdsEntry[i];
		wdev = &pWdsEntry->wdev;
			
	        if (rtstrcasecmp(macptr, "NONE") == TRUE)
	            wdev->WepStatus = Ndis802_11WEPDisabled;
	        else if (rtstrcasecmp(macptr, "WEP") == TRUE)
	            wdev->WepStatus = Ndis802_11WEPEnabled;
	        else if (rtstrcasecmp(macptr, "TKIP") ==TRUE)
	            wdev->WepStatus = Ndis802_11TKIPEnable;
	        else if (rtstrcasecmp(macptr, "AES") == TRUE)
	            wdev->WepStatus = Ndis802_11AESEnable;
	        else
	            wdev->WepStatus = Ndis802_11WEPDisabled;

	        DBGPRINT(RT_DEBUG_TRACE, ("WdsEncrypType[%d]=%d(%s)\n",
					i, wdev->WepStatus, GetEncryptType(wdev->WepStatus)));
	    }
		
		/* Previous WDS only supports single encryption type. */
		/* For backward compatible, other wds link encryption type shall be the same with the first. */
		if (i == 1)
		{
			for (j = 1; j < MAX_WDS_ENTRY; j++)
			{
				wdev = &pAd->WdsTab.WdsEntry[j].wdev;
				wdev->WepStatus = pAd->WdsTab.WdsEntry[0].wdev.WepStatus;	
				DBGPRINT(RT_DEBUG_TRACE, ("WdsEncrypType[%d]=%d(%s)\n",
							j, wdev->WepStatus, GetEncryptType(wdev->WepStatus)));	
			}
		}
			
	}
	/* WdsKey */
	/* This is a previous parameter and it only stores WPA key material, not WEP key */
	if (RTMPGetKeyParameter("WdsKey", tmpbuf, 255, buffer, FALSE))
	{
		for (i = 0; i < MAX_WDS_ENTRY; i++)
			NdisZeroMemory(&pAd->WdsTab.WdsEntry[i].WdsKey, sizeof(CIPHER_KEY));

		if (strlen(tmpbuf) > 0)
			bUsePrevFormat = TRUE;

		wdev = &pAd->WdsTab.WdsEntry[0].wdev;
		pWdsEntry = &pAd->WdsTab.WdsEntry[0];
		/* check if the wds-0 link key material is valid */
		if (((wdev->WepStatus == Ndis802_11TKIPEnable)
			|| (wdev->WepStatus == Ndis802_11AESEnable))
			&& (strlen(tmpbuf) >= 8) && (strlen(tmpbuf) <= 64))
		{
			RT_CfgSetWPAPSKKey(pAd, tmpbuf, strlen(tmpbuf), (PUCHAR)RALINK_PASSPHRASE, sizeof(RALINK_PASSPHRASE), keyMaterial);
			if (wdev->WepStatus == Ndis802_11AESEnable)
				pWdsEntry->WdsKey.CipherAlg = CIPHER_AES;
			else
				pWdsEntry->WdsKey.CipherAlg = CIPHER_TKIP;
			
			NdisMoveMemory(&pWdsEntry->WdsKey.Key, keyMaterial, 16);
			pWdsEntry->WdsKey.KeyLen = 16;
			NdisMoveMemory(&pWdsEntry->WdsKey.RxMic, keyMaterial+16, 8);
			NdisMoveMemory(&pWdsEntry->WdsKey.TxMic, keyMaterial+16, 8);
		}

		/* Previous WDS only supports single key-material. */
		/* For backward compatible, other wds link key-material shall be the same with the first. */
		if (pAd->WdsTab.WdsEntry[0].WdsKey.KeyLen == 16)
		{
			for (j = 1; j < MAX_WDS_ENTRY; j++)
			{
				NdisMoveMemory(&pAd->WdsTab.WdsEntry[j].WdsKey, &pAd->WdsTab.WdsEntry[0].WdsKey, sizeof(CIPHER_KEY));								
			}
		}
	
	}

	/* The parameters can provide different key information for each WDS-Link */
	/* no matter WEP or WPA */
	if (!bUsePrevFormat)
	{
		for (i = 0; i < MAX_WDS_ENTRY; i++)
		{
			AP_WDS_KeyNameMakeUp(tok_str, sizeof(tok_str), i);
			pWdsEntry = &pAd->WdsTab.WdsEntry[i];
			wdev = &pWdsEntry->wdev;
			/* WdsXKey (X=0~MAX_WDS_ENTRY-1) */
			if (RTMPGetKeyParameter(tok_str, tmpbuf, 128, buffer, FALSE))
			{			
				if (wdev->WepStatus == Ndis802_11WEPEnabled)
				{
					/* Ascii type */
					if (strlen(tmpbuf) == 5 || strlen(tmpbuf) == 13)
					{		
						KeyLen = strlen(tmpbuf);
						pWdsEntry->WdsKey.KeyLen = KeyLen;
						NdisMoveMemory(pWdsEntry->WdsKey.Key, tmpbuf, KeyLen);
						if (KeyLen == 5)
							CipherAlg = CIPHER_WEP64;
						else
							CipherAlg = CIPHER_WEP128;	

						pWdsEntry->WdsKey.CipherAlg = CipherAlg;
						DBGPRINT(RT_DEBUG_TRACE, ("IF/wds%d Key=%s ,type=Ascii, CipherAlg(%s)\n",
									i, tmpbuf, (CipherAlg == CIPHER_WEP64 ? "wep64" : "wep128")));
					}
					/* Hex type */
					else if (strlen(tmpbuf) == 10 || strlen(tmpbuf) == 26)
					{		
						KeyLen = strlen(tmpbuf);
						pWdsEntry->WdsKey.KeyLen = KeyLen / 2;
						AtoH(tmpbuf, pWdsEntry->WdsKey.Key, KeyLen / 2);						
						if (KeyLen == 10)
							CipherAlg = CIPHER_WEP64;
						else
							CipherAlg = CIPHER_WEP128;	

						pWdsEntry->WdsKey.CipherAlg = CipherAlg;
						DBGPRINT(RT_DEBUG_TRACE, ("IF/wds%d Key=%s ,type=Hex, CipherAlg(%s)\n",
									i, tmpbuf, (CipherAlg == CIPHER_WEP64 ? "wep64" : "wep128")));
					}
					/* Invalid type */
					else
					{
						wdev->WepStatus = Ndis802_11EncryptionDisabled;
						NdisZeroMemory(&pWdsEntry->WdsKey, sizeof(CIPHER_KEY));
						DBGPRINT(RT_DEBUG_TRACE, ("IF/wds%d has invalid key for WEP, reset encryption to OPEN\n", i));
					}
				}
				else if ((wdev->WepStatus == Ndis802_11TKIPEnable)
					|| (wdev->WepStatus == Ndis802_11AESEnable))					
				{
					if ((strlen(tmpbuf) >= 8) && (strlen(tmpbuf) <= 64))
					{
						RT_CfgSetWPAPSKKey(pAd, tmpbuf, strlen(tmpbuf), (PUCHAR) RALINK_PASSPHRASE, sizeof(RALINK_PASSPHRASE), keyMaterial);
						if (wdev->WepStatus == Ndis802_11AESEnable)
							pWdsEntry->WdsKey.CipherAlg = CIPHER_AES;
						else
							pWdsEntry->WdsKey.CipherAlg = CIPHER_TKIP;
						
						NdisMoveMemory(&pWdsEntry->WdsKey.Key, keyMaterial, 16);
						pWdsEntry->WdsKey.KeyLen = 16;
						NdisMoveMemory(&pWdsEntry->WdsKey.RxMic, keyMaterial+16, 8);
						NdisMoveMemory(&pWdsEntry->WdsKey.TxMic, keyMaterial+16, 8);
						DBGPRINT(RT_DEBUG_TRACE, ("IF/wds%d Key=%s, CipherAlg(%s)\n", i, tmpbuf, (CipherAlg == CIPHER_AES ? "AES" : "TKIP")));
					}
					else
					{
						DBGPRINT(RT_DEBUG_TRACE, ("IF/wds%d has invalid key for WPA, reset encryption to OPEN\n", i));
						wdev->WepStatus = Ndis802_11EncryptionDisabled;
						NdisZeroMemory(&pWdsEntry->WdsKey, sizeof(CIPHER_KEY));
					}

				}
				else
				{									
					wdev->WepStatus = Ndis802_11EncryptionDisabled;
					NdisZeroMemory(&pWdsEntry->WdsKey, sizeof(CIPHER_KEY));
				}								
			}
		}
	}

	/* WdsDefaultKeyID */
	if(RTMPGetKeyParameter("WdsDefaultKeyID", tmpbuf, 10, buffer, TRUE))
	{
		for (i = 0, macptr = rstrtok(tmpbuf,";"); (macptr && i < MAX_WDS_ENTRY); macptr = rstrtok(NULL,";"), i++)
		{
			pWdsEntry = &pAd->WdsTab.WdsEntry[i];
			wdev = &pWdsEntry->wdev;

			KeyIdx = (UCHAR) simple_strtol(macptr, 0, 10);
			if((KeyIdx >= 1 ) && (KeyIdx <= 4))
				pWdsEntry->KeyIdx = (UCHAR) (KeyIdx - 1);
			else
				pWdsEntry->KeyIdx = 0;

			if ((wdev->WepStatus == Ndis802_11TKIPEnable)
				|| (wdev->WepStatus == Ndis802_11AESEnable))
				pWdsEntry->KeyIdx = 0;	

			DBGPRINT(RT_DEBUG_TRACE, ("IF/wds%d - WdsDefaultKeyID(0~3)=%d\n",
						i, pWdsEntry->KeyIdx));
		}				
	}

	/* WdsTxMode */
	if (RTMPGetKeyParameter("WdsTxMode", tmpbuf, 25, buffer, TRUE))
	{
		for (i = 0, macptr = rstrtok(tmpbuf,";"); (macptr && i < MAX_WDS_ENTRY); macptr = rstrtok(NULL,";"), i++)
		{
			wdev = &pAd->WdsTab.WdsEntry[i].wdev;

			wdev->DesiredTransmitSetting.field.FixedTxMode = 
										RT_CfgSetFixedTxPhyMode(macptr);
			DBGPRINT(RT_DEBUG_TRACE, ("I/F(wds%d) Tx Mode = %d\n", i,
											wdev->DesiredTransmitSetting.field.FixedTxMode));					
		}	
	}

	/* WdsTxMcs */
	if (RTMPGetKeyParameter("WdsTxMcs", tmpbuf, 50, buffer, TRUE))
	{
		for (i = 0, macptr = rstrtok(tmpbuf,";"); (macptr && i < MAX_WDS_ENTRY); macptr = rstrtok(NULL,";"), i++)
		{
			wdev = &pAd->WdsTab.WdsEntry[i].wdev;

			wdev->DesiredTransmitSetting.field.MCS = 
					RT_CfgSetTxMCSProc(macptr, &wdev->bAutoTxRateSwitch);

			if (wdev->DesiredTransmitSetting.field.MCS == MCS_AUTO)
			{
				DBGPRINT(RT_DEBUG_TRACE, ("I/F(wds%d) Tx MCS = AUTO\n", i));
			}
			else
			{
				DBGPRINT(RT_DEBUG_TRACE, ("I/F(wds%d) Tx MCS = %d\n", i, 
									wdev->DesiredTransmitSetting.field.MCS));
			}
		}	
	}
	
	/*WdsEnable */
	if(RTMPGetKeyParameter("WdsEnable", tmpbuf, 10, buffer, TRUE))
	{						
		RT_802_11_WDS_ENTRY *pWdsEntry;
		switch(simple_strtol(tmpbuf, 0, 10))
		{
			case WDS_BRIDGE_MODE: /* Bridge mode, DisAllow association(stop Beacon generation and Probe Req. */
				pAd->WdsTab.Mode = WDS_BRIDGE_MODE;
				break;
			case WDS_RESTRICT_MODE:	
			case WDS_REPEATER_MODE: /* Repeater mode */
				pAd->WdsTab.Mode = WDS_REPEATER_MODE;
				break;
			case WDS_LAZY_MODE: /* Lazy mode, Auto learn wds entry by same SSID, channel, security policy */
				for(i = 0; i < MAX_WDS_ENTRY; i++)
				{
					pWdsEntry = &pAd->WdsTab.WdsEntry[i];
					if (pWdsEntry->Valid)
						WdsEntryDel(pAd, pWdsEntry->PeerWdsAddr);
				
					/* When Lazy mode is enabled, the all wds-link shall share the same encryption type and key material */
					if (i > 0)
					{
						pWdsEntry->wdev.WepStatus = pAd->WdsTab.WdsEntry[0].wdev.WepStatus;
						pWdsEntry->KeyIdx = pAd->WdsTab.WdsEntry[0].KeyIdx;
						NdisMoveMemory(&pWdsEntry->WdsKey, &pAd->WdsTab.WdsEntry[0].WdsKey, sizeof(CIPHER_KEY));
					}
				}
				pAd->WdsTab.Mode = WDS_LAZY_MODE;
				break;
		    case WDS_DISABLE_MODE: /* Disable mode */
		    default:
				APWdsInitialize(pAd);
			    pAd->WdsTab.Mode = WDS_DISABLE_MODE;
			   	break;
		}

		DBGPRINT(RT_DEBUG_TRACE, ("WDS-Enable mode=%d\n", pAd->WdsTab.Mode));

	}
	
#ifdef WDS_VLAN_SUPPORT
	/* WdsVlan */
	if (RTMPGetKeyParameter("WDS_VLANID", tmpbuf, MAX_PARAM_BUFFER_SIZE, buffer, TRUE))
	{	
		for (i=0, macptr = rstrtok(tmpbuf,";"); (macptr && i < MAX_WDS_ENTRY); macptr = rstrtok(NULL,";"), i++) 
		{
            pAd->WdsTab.WdsEntry[i].wdev.VLAN_VID = simple_strtol(macptr, 0, 10);
            pAd->WdsTab.WdsEntry[i].wdev.VLAN_Priority = 0;
		
	        DBGPRINT(RT_DEBUG_TRACE, ("If/wds%d - WdsVlanId=%d\n", i, pAd->WdsTab.WdsEntry[i].wdev.VLAN_VID));
		}
	}
#endif /* WDS_VLAN_SUPPORT */
}
Esempio n. 3
0
void CFG80211DRV_Set_NOA(
	VOID						*pAdOrg,
	VOID						*pData)
{
	PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg;
	//iversonmcc
	UINT32   Lowpart, Highpart ,NextTbtt, temp;

	if (pAd->Mlme.bStartMcc == TRUE)
	{
		//scan , send null fram to infra , and switch to GO 
		Stop_MCC(pAd,1);	
	}

/*
pNdev->name = wlan0
[ 2434.071449] 80211> CFG80211_OpsScan ==> wlan0(2)
10ms  start scan
one channel 85 ms ~  7 channel
600ms
600 + wait 120 =720 

 898.328054] mt76x2_switch_channel(): Switch to Ch#9(2T2R), BBP_BW=0, bbp_ch_idx=0)
interval = 400+120 ms
Count =4;


pNdev->name = p2p0
10ms  start scan

85ms & 3 
260ms
count =2
*/

	if(RTMP_CFG80211_VIF_P2P_GO_ON(pAd))
	{

		if(rtstrcasecmp(pData, "p2p0") == TRUE)
		{

		    AsicGetTsfTime(pAd, &Highpart, &Lowpart);
		    DBGPRINT(RT_DEBUG_ERROR,("!!!!Current Tsf LSB = = %ld \n",  Lowpart));

 		    RTMP_IO_READ32(pAd, LPON_T1STR, &temp);
		    temp = temp & 0x0000FFFF;  		
		    NextTbtt	= temp % pAd->CommonCfg.BeaconPeriod; 
		    DBGPRINT(RT_DEBUG_ERROR,("!!!!NextTbtt =  %ld  \n", NextTbtt));

		    temp = NextTbtt*1024+Lowpart;
		    DBGPRINT(RT_DEBUG_ERROR,("!!!!Tsf LSB + TimeTillTbtt= %ld \n", temp));

		    pAd->cfg80211_ctrl.GONoASchedule.StartTime = Lowpart + NextTbtt*1024+ 409600 + 3200;
		    DBGPRINT(RT_DEBUG_ERROR,(" pAd->GONoASchedule.StartTime = %ld \n", pAd->cfg80211_ctrl.GONoASchedule.StartTime));
		    pAd->cfg80211_ctrl.GONoASchedule.Count = 9;
		    pAd->cfg80211_ctrl.GONoASchedule.Duration= 260000;
		    pAd->cfg80211_ctrl.GONoASchedule.Interval=  384800;

		}

		if(rtstrcasecmp(pData, "wlan0") == TRUE)
		{
		    AsicGetTsfTime(pAd, &Highpart, &Lowpart);
		    DBGPRINT(RT_DEBUG_ERROR,("!!!!Current Tsf LSB = = %ld \n",  Lowpart));

 		    RTMP_IO_READ32(pAd, LPON_T1STR, &temp);
		    temp = temp & 0x0000FFFF;  		
		    NextTbtt	= temp % pAd->CommonCfg.BeaconPeriod; 
		    DBGPRINT(RT_DEBUG_ERROR,("!!!!NextTbtt =  %ld  \n", NextTbtt));

		    temp = NextTbtt*1024+Lowpart;
		    DBGPRINT(RT_DEBUG_ERROR,("!!!!Tsf LSB + TimeTillTbtt= %ld \n", temp));

		    pAd->cfg80211_ctrl.GONoASchedule.StartTime = Lowpart + NextTbtt*1024 + 512000 + 3200;

		    DBGPRINT(RT_DEBUG_ERROR,(" pAd->GONoASchedule.StartTime = %ld \n", pAd->cfg80211_ctrl.GONoASchedule.StartTime));
		    pAd->cfg80211_ctrl.GONoASchedule.Count = (4 + (11*5)+2); /*wait 4 beacon + (interval * 4)*/ 
		    pAd->cfg80211_ctrl.GONoASchedule.Duration= 737280; /*720*1024*/
		    pAd->cfg80211_ctrl.GONoASchedule.Interval=  737280+(400*1024);
			
		}

	}
	return TRUE;
}