mlme.c

来自「ralink最新rt3070 usb wifi 无线网卡驱动程序」· C语言 代码 · 共 1,979 行 · 第 1/5 页

C
1,979
字号
		if (pAd->StaCfg.bFastRoaming)		{			SHORT	dBmToRoam = (SHORT)pAd->StaCfg.dBmToRoam;						DBGPRINT(RT_DEBUG_TRACE, ("Rssi=%d, dBmToRoam=%d\n", RTMPMaxRssi(pAd, pAd->StaCfg.RssiSample.LastRssi0, pAd->StaCfg.RssiSample.LastRssi1, pAd->StaCfg.RssiSample.LastRssi2), (CHAR)dBmToRoam));						if (RTMPMaxRssi(pAd, pAd->StaCfg.RssiSample.LastRssi0, pAd->StaCfg.RssiSample.LastRssi1, pAd->StaCfg.RssiSample.LastRssi2) <= (CHAR)dBmToRoam)			{				MlmeCheckForFastRoaming(pAd, pAd->Mlme.Now32);			}		}	}	else if (ADHOC_ON(pAd))	{		//radar detect		if ((pAd->CommonCfg.Channel > 14)			&& (pAd->CommonCfg.bIEEE80211H == 1)			&& RadarChannelCheck(pAd, pAd->CommonCfg.Channel))		{			RadarDetectPeriodic(pAd);		}		// If all peers leave, and this STA becomes the last one in this IBSS, then change MediaState		// to DISCONNECTED. But still holding this IBSS (i.e. sending BEACON) so that other STAs can		// join later.		if ((pAd->StaCfg.LastBeaconRxTime + ADHOC_BEACON_LOST_TIME < pAd->Mlme.Now32) &&			OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))		{			MLME_START_REQ_STRUCT     StartReq;						DBGPRINT(RT_DEBUG_TRACE, ("MMCHK - excessive BEACON lost, last STA in this IBSS, MediaState=Disconnected\n")); 			LinkDown(pAd, FALSE);			StartParmFill(pAd, &StartReq, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen);			MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_START_REQ, sizeof(MLME_START_REQ_STRUCT), &StartReq);			pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_START;		}		for (i = 1; i < MAX_LEN_OF_MAC_TABLE; i++) 		{			MAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[i];			if (pEntry->ValidAsCLI == FALSE)				continue;			if (pEntry->LastBeaconRxTime + ADHOC_BEACON_LOST_TIME < pAd->Mlme.Now32)				MacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr);		}	}	else // no INFRA nor ADHOC connection	{		if (pAd->StaCfg.bScanReqIsFromWebUI &&            ((pAd->StaCfg.LastScanTime + 30 * OS_HZ) > pAd->Mlme.Now32))			goto SKIP_AUTO_SCAN_CONN;        else            pAd->StaCfg.bScanReqIsFromWebUI = FALSE;      		if ((pAd->StaCfg.bAutoReconnect == TRUE)			&& RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP)			&& (MlmeValidateSSID(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen) == TRUE))		{			if ((pAd->ScanTab.BssNr==0) && (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE))			{				MLME_SCAN_REQ_STRUCT	   ScanReq;				if ((pAd->StaCfg.LastScanTime + 10 * OS_HZ) < pAd->Mlme.Now32)				{					DBGPRINT(RT_DEBUG_TRACE, ("STAMlmePeriodicExec():CNTL - ScanTab.BssNr==0, start a new ACTIVE scan SSID[%s]\n", pAd->MlmeAux.AutoReconnectSsid));					ScanParmFill(pAd, &ScanReq, pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen, BSS_ANY, SCAN_ACTIVE);					MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ, sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq);					pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN;					// Reset Missed scan number					pAd->StaCfg.LastScanTime = pAd->Mlme.Now32;				}				else if (pAd->StaCfg.BssType == BSS_ADHOC)	// Quit the forever scan when in a very clean room					MlmeAutoReconnectLastSSID(pAd);			}			else if (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE)			{				if ((pAd->Mlme.OneSecPeriodicRound % 7) == 0)				{					MlmeAutoScan(pAd);					pAd->StaCfg.LastScanTime = pAd->Mlme.Now32;				}				else				{#ifdef CARRIER_DETECTION_SUPPORT // Roger sync Carrier					if (pAd->CommonCfg.CarrierDetect.Enable == TRUE)					{						if ((pAd->Mlme.OneSecPeriodicRound % 5) == 1)							MlmeAutoReconnectLastSSID(pAd);					}					else#endif // CARRIER_DETECTION_SUPPORT // 						MlmeAutoReconnectLastSSID(pAd);				}			}		}	}SKIP_AUTO_SCAN_CONN:#ifdef DOT11_N_SUPPORT    if ((pAd->MacTab.Content[BSSID_WCID].TXBAbitmap !=0) && (pAd->MacTab.fAnyBASession == FALSE))	{		pAd->MacTab.fAnyBASession = TRUE;		AsicUpdateProtect(pAd, HT_FORCERTSCTS,  ALLN_SETPROTECT, FALSE, FALSE);	}	else if ((pAd->MacTab.Content[BSSID_WCID].TXBAbitmap ==0) && (pAd->MacTab.fAnyBASession == TRUE))	{		pAd->MacTab.fAnyBASession = FALSE;		AsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode,  ALLN_SETPROTECT, FALSE, FALSE);	}#endif // DOT11_N_SUPPORT //#ifdef DOT11_N_SUPPORT#ifdef DOT11N_DRAFT3	if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SCAN_2040))		TriEventCounterMaintenance(pAd);#endif // DOT11N_DRAFT3 //#endif // DOT11_N_SUPPORT //	return;}// Link down reportVOID LinkDownExec(	IN PVOID SystemSpecific1, 	IN PVOID FunctionContext, 	IN PVOID SystemSpecific2, 	IN PVOID SystemSpecific3) {	RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext;		pAd->IndicateMediaState = NdisMediaStateDisconnected;		RTMP_IndicateMediaState(pAd);    pAd->ExtraInfo = GENERAL_LINK_DOWN;}// IRQL = DISPATCH_LEVELVOID MlmeAutoScan(	IN PRTMP_ADAPTER pAd){	// check CntlMachine.CurrState to avoid collision with NDIS SetOID request	if (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE)	{		DBGPRINT(RT_DEBUG_TRACE, ("MMCHK - Driver auto scan\n"));		MlmeEnqueue(pAd, 					MLME_CNTL_STATE_MACHINE, 					OID_802_11_BSSID_LIST_SCAN, 					0, 					NULL);		RT28XX_MLME_HANDLER(pAd);	}}	// IRQL = DISPATCH_LEVELVOID MlmeAutoReconnectLastSSID(	IN PRTMP_ADAPTER pAd){	// check CntlMachine.CurrState to avoid collision with NDIS SetOID request	if ((pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE) && 		(MlmeValidateSSID(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen) == TRUE))	{		NDIS_802_11_SSID OidSsid;		OidSsid.SsidLength = pAd->MlmeAux.AutoReconnectSsidLen;		NdisMoveMemory(OidSsid.Ssid, pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen);		DBGPRINT(RT_DEBUG_TRACE, ("Driver auto reconnect to last OID_802_11_SSID setting - %s, len - %d\n", pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen));		MlmeEnqueue(pAd, 					MLME_CNTL_STATE_MACHINE, 					OID_802_11_SSID, 					sizeof(NDIS_802_11_SSID), 					&OidSsid);		RT28XX_MLME_HANDLER(pAd);	}}#endif // CONFIG_STA_SUPPORT ///*	==========================================================================	Validate SSID for connection try and rescan purpose	Valid SSID will have visible chars only.	The valid length is from 0 to 32.	IRQL = DISPATCH_LEVEL	========================================================================== */BOOLEAN MlmeValidateSSID(	IN PUCHAR	pSsid,	IN UCHAR	SsidLen){	int	index;	if (SsidLen > MAX_LEN_OF_SSID)		return (FALSE);	// Check each character value	for (index = 0; index < SsidLen; index++)	{		if (pSsid[index] < 0x20)			return (FALSE);	}	// All checked	return (TRUE);}VOID MlmeSelectTxRateTable(	IN PRTMP_ADAPTER		pAd,	IN PMAC_TABLE_ENTRY		pEntry,	IN PUCHAR				*ppTable,	IN PUCHAR				pTableSize,	IN PUCHAR				pInitTxRateIdx){	do	{		// decide the rate table for tuning		if (pAd->CommonCfg.TxRateTableSize > 0)		{			*ppTable = RateSwitchTable;			*pTableSize = RateSwitchTable[0];			*pInitTxRateIdx = RateSwitchTable[1];						break;		}#ifdef CONFIG_STA_SUPPORT		if ((pAd->OpMode == OPMODE_STA) && ADHOC_ON(pAd))		{#ifdef DOT11_N_SUPPORT			if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && 				(pEntry->HTCapability.MCSSet[0] == 0xff) && 				((pEntry->HTCapability.MCSSet[1] == 0x00) || (pAd->Antenna.field.TxPath == 1)))			{// 11N 1S Adhoc				*ppTable = RateSwitchTable11N1S;				*pTableSize = RateSwitchTable11N1S[0];				*pInitTxRateIdx = RateSwitchTable11N1S[1];							}			else if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && 					(pEntry->HTCapability.MCSSet[0] == 0xff) && 					(pEntry->HTCapability.MCSSet[1] == 0xff) &&					(pAd->Antenna.field.TxPath == 2))			{// 11N 2S Adhoc				if (pAd->LatchRfRegs.Channel <= 14)				{					*ppTable = RateSwitchTable11N2S;					*pTableSize = RateSwitchTable11N2S[0];					*pInitTxRateIdx = RateSwitchTable11N2S[1];				}				else				{					*ppTable = RateSwitchTable11N2SForABand;					*pTableSize = RateSwitchTable11N2SForABand[0];					*pInitTxRateIdx = RateSwitchTable11N2SForABand[1];				}							}			else#endif // DOT11_N_SUPPORT //								if ((pEntry->RateLen == 4) #ifdef DOT11_N_SUPPORT					&& (pEntry->HTCapability.MCSSet[0] == 0) && (pEntry->HTCapability.MCSSet[1] == 0)#endif // DOT11_N_SUPPORT //					)			{				*ppTable = RateSwitchTable11B;				*pTableSize = RateSwitchTable11B[0];				*pInitTxRateIdx = RateSwitchTable11B[1];							}			else if (pAd->LatchRfRegs.Channel <= 14)			{				*ppTable = RateSwitchTable11BG;				*pTableSize = RateSwitchTable11BG[0];				*pInitTxRateIdx = RateSwitchTable11BG[1];							}			else			{				*ppTable = RateSwitchTable11G;				*pTableSize = RateSwitchTable11G[0];				*pInitTxRateIdx = RateSwitchTable11G[1];							}			break;		}#endif // CONFIG_STA_SUPPORT //#ifdef DOT11_N_SUPPORT		//if ((pAd->StaActive.SupRateLen + pAd->StaActive.ExtRateLen == 12) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0xff) &&		//	((pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0x00) || (pAd->Antenna.field.TxPath == 1)))		if ((pEntry->RateLen == 12) && (pEntry->HTCapability.MCSSet[0] == 0xff) &&			((pEntry->HTCapability.MCSSet[1] == 0x00) || (pAd->CommonCfg.TxStream == 1)))		{// 11BGN 1S AP			*ppTable = RateSwitchTable11BGN1S;			*pTableSize = RateSwitchTable11BGN1S[0];			*pInitTxRateIdx = RateSwitchTable11BGN1S[1];						break;		}		//else if ((pAd->StaActive.SupRateLen + pAd->StaActive.ExtRateLen == 12) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0xff) &&		//	(pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0xff) && (pAd->Antenna.field.TxPath == 2))		if ((pEntry->RateLen == 12) && (pEntry->HTCapability.MCSSet[0] == 0xff) &&			(pEntry->HTCapability.MCSSet[1] == 0xff) && (pAd->CommonCfg.TxStream == 2))		{// 11BGN 2S AP			if (pAd->LatchRfRegs.Channel <= 14)			{				*ppTable = RateSwitchTable11BGN2S;				*pTableSize = RateSwitchTable11BGN2S[0];				*pInitTxRateIdx = RateSwitchTable11BGN2S[1];							}			else			{				*ppTable = RateSwitchTable11BGN2SForABand;				*pTableSize = RateSwitchTable11BGN2SForABand[0];				*pInitTxRateIdx = RateSwitchTable11BGN2SForABand[1];                					}			break;		}		//else if ((pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0xff) && ((pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0x00) || (pAd->Antenna.field.TxPath == 1)))		if ((pEntry->HTCapability.MCSSet[0] == 0xff) && ((pEntry->HTCapability.MCSSet[1] == 0x00) || (pAd->CommonCfg.TxStream == 1)))		{// 11N 1S AP			*ppTable = RateSwitchTable11N1S;			*pTableSize = RateSwitchTable11N1S[0];			*pInitTxRateIdx = RateSwitchTable11N1S[1];						break;		}		//else if ((pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0xff) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0xff) && (pAd->Antenna.field.TxPath == 2))		if ((pEntry->HTCapability.MCSSet[0] == 0xff) && (pEntry->HTCapability.MCSSet[1] == 0xff) && (pAd->CommonCfg.TxStream == 2))		{// 11N 2S AP			if (pAd->LatchRfRegs.Channel <= 14)			{			*ppTable = RateSwitchTable11N2S;			*pTableSize = RateSwitchTable11N2S[0];			*pInitTxRateIdx = RateSwitchTable11N2S[1];            }			else			{				*ppTable = RateSwitchTable11N2SForABand;				*pTableSize = RateSwitchTable11N2SForABand[0];				*pInitTxRateIdx = RateSwitchTable11N2SForABand[1];			}						break;		}#endif // DOT11_N_SUPPORT //		//else if ((pAd->StaActive.SupRateLen == 4) && (pAd->StaActive.ExtRateLen == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0))		if ((pEntry->RateLen == 4) #ifdef DOT11_N_SUPPORT//Iverson mark for Adhoc b mode,sta will use rate 54  Mbps when connect with sta b/g/n mode //			&& (pEntry->HTCapability.MCSSet[0] == 0) && (pEntry->HTCapability.MCSSet[1] == 0)#endif // DOT11_N_SUPPORT //			)		{// B only AP			*ppTable = RateSwitchTable11B;			*pTableSize = RateSwitchTable11B[0];			*pInitTxRateIdx = RateSwitchTable11B[1];						break;		}		//else if ((pAd->StaActive.SupRateLen + pAd->StaActive.ExtRateLen > 8) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0))		if ((pEntry->RateLen > 8) #ifdef DOT11_N_SUPPORT			&& (pEntry->HTCapability.MCSSet[0] == 0) && (pEntry->HTCapability.MCSSet[1] == 0)#endif // DOT11_N_SUPPORT //			)		{// B/G  mixed AP			*ppTable = RateSwitchTable11BG;			*pTableSize = RateSwitchTable11BG[0];			*pInitTxRateIdx = RateSwitchTable11BG[1];						break;		}		//else if ((pAd->StaActive.SupRateLen + pAd->StaActive.ExtRateLen == 8) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0))		if ((pEntry->RateLen == 8) #ifdef DOT11_N_SUPPORT			&& (pEntry->HTCapability.MCSSet[0] == 0) && (pEntry->HTCapability.MCSSet[1] == 0)#endif // DOT11_N_SUPPORT //			)		{// G only AP			*ppTable = RateSwitchTable11G;			*pTableSize = RateSwitchTable11G[0];

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?