⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mlme.c

📁 ralink 2870 usb无线网卡 最新驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
			{				if (pAd->CommonCfg.TxStream == 1)				{					*ppTable = RateSwitchTable11N1S;					*pTableSize = RateSwitchTable11N1S[0];					*pInitTxRateIdx = RateSwitchTable11N1S[1];					DBGPRINT_RAW(RT_DEBUG_ERROR,("DRS: unkown mode,default use 11N 1S AP \n"));				}				else				{					*ppTable = RateSwitchTable11N2SForABand;					*pTableSize = RateSwitchTable11N2SForABand[0];					*pInitTxRateIdx = RateSwitchTable11N2SForABand[1];					DBGPRINT_RAW(RT_DEBUG_ERROR,("DRS: unkown mode,default use 11N 2S AP \n"));									}			}#endif // DOT11_N_SUPPORT //			DBGPRINT_RAW(RT_DEBUG_ERROR,("DRS: unkown mode (SupRateLen=%d, ExtRateLen=%d, MCSSet[0]=0x%x, MCSSet[1]=0x%x)\n",				pAd->StaActive.SupRateLen, pAd->StaActive.ExtRateLen, pAd->StaActive.SupportedPhyInfo.MCSSet[0], pAd->StaActive.SupportedPhyInfo.MCSSet[1]));		}#endif // CONFIG_STA_SUPPORT //	} while(FALSE);}#ifdef CONFIG_STA_SUPPORTVOID STAMlmePeriodicExec(	PRTMP_ADAPTER pAd){	ULONG			    TxTotalCnt;	int 	i;//// We return here in ATE mode, because the statistics // that ATE needs are not collected via this routine.//#ifdef RALINK_ATE	// It is supposed that we will never reach here in ATE mode.	ASSERT(!(ATE_ON(pAd)));	if (ATE_ON(pAd))		return;#endif // RALINK_ATE //#ifdef WPA_SUPPLICANT_SUPPORT    if (pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_DISABLE)    #endif // WPA_SUPPLICANT_SUPPORT //            {    	// WPA MIC error should block association attempt for 60 seconds		if (pAd->StaCfg.bBlockAssoc && 			RTMP_TIME_AFTER(pAd->Mlme.Now32, pAd->StaCfg.LastMicErrorTime + (60*OS_HZ)))    		pAd->StaCfg.bBlockAssoc = FALSE;    }    if ((pAd->PreMediaState != pAd->IndicateMediaState) && (pAd->CommonCfg.bWirelessEvent))	{		if (pAd->IndicateMediaState == NdisMediaStateConnected)		{			RTMPSendWirelessEvent(pAd, IW_STA_LINKUP_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); 		}		pAd->PreMediaState = pAd->IndicateMediaState;  	}		if (pAd->CommonCfg.PSPXlink && ADHOC_ON(pAd))	{	}	else	{    	AsicStaBbpTuning(pAd);	}	TxTotalCnt = pAd->RalinkCounters.OneSecTxNoRetryOkCount + 					 pAd->RalinkCounters.OneSecTxRetryOkCount + 					 pAd->RalinkCounters.OneSecTxFailCount;	if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) 	{		// update channel quality for Roaming and UI LinkQuality display		MlmeCalculateChannelQuality(pAd, pAd->Mlme.Now32);	}	// must be AFTER MlmeDynamicTxRateSwitching() because it needs to know if	// Radio is currently in noisy environment	if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) 	AsicAdjustTxPower(pAd);	if (INFRA_ON(pAd))	{#ifdef QOS_DLS_SUPPORT		// Check DLS time out, then tear down those session		RTMPCheckDLSTimeOut(pAd);#endif // QOS_DLS_SUPPORT //		// Is PSM bit consistent with user power management policy?		// This is the only place that will set PSM bit ON.		if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))		MlmeCheckPsmChange(pAd, pAd->Mlme.Now32);		pAd->RalinkCounters.LastOneSecTotalTxCount = TxTotalCnt;		if ((RTMP_TIME_AFTER(pAd->Mlme.Now32, pAd->StaCfg.LastBeaconRxTime + (1*OS_HZ))) &&			(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) &&			(((TxTotalCnt + pAd->RalinkCounters.OneSecRxOkCnt) < 600)))		{			RTMPSetAGCInitValue(pAd, BW_20);			DBGPRINT(RT_DEBUG_TRACE, ("MMCHK - No BEACON. restore R66 to the low bound(%d) \n", (0x2E + GET_LNA_GAIN(pAd))));		}        //if ((pAd->RalinkCounters.OneSecTxNoRetryOkCount == 0) &&        //    (pAd->RalinkCounters.OneSecTxRetryOkCount == 0))        {    		if (pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable)    		{    		    // When APSD is enabled, the period changes as 20 sec    			if ((pAd->Mlme.OneSecPeriodicRound % 20) == 8)    				RTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE);    		}    		else    		{    		    // Send out a NULL frame every 10 sec to inform AP that STA is still alive (Avoid being age out)    			if ((pAd->Mlme.OneSecPeriodicRound % 10) == 8)                {                             if (pAd->CommonCfg.bWmmCapable)    					RTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE);                    else						RTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, FALSE);                }    		}        }		if (CQI_IS_DEAD(pAd->Mlme.ChannelQuality))			{			DBGPRINT(RT_DEBUG_TRACE, ("MMCHK - No BEACON. Dead CQI. Auto Recovery attempt #%ld\n", pAd->RalinkCounters.BadCQIAutoRecoveryCount));			// Lost AP, send disconnect & link down event			LinkDown(pAd, FALSE);			#ifdef WPA_SUPPLICANT_SUPPORT#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT		//send disassociate event to wpa_supplicant		if (pAd->StaCfg.WpaSupplicantUP) {			RtmpOSWrielessEventSend(pAd, IWEVCUSTOM, RT_DISASSOC_EVENT_FLAG, NULL, NULL, 0);		} #endif // NATIVE_WPA_SUPPLICANT_SUPPORT //#endif // WPA_SUPPLICANT_SUPPORT //			#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT		RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, NULL, NULL, 0);#endif // NATIVE_WPA_SUPPLICANT_SUPPORT //        						// RTMPPatchMacBbpBug(pAd);			MlmeAutoReconnectLastSSID(pAd);		}		else if (CQI_IS_BAD(pAd->Mlme.ChannelQuality))		{			pAd->RalinkCounters.BadCQIAutoRecoveryCount ++;			DBGPRINT(RT_DEBUG_TRACE, ("MMCHK - Bad CQI. Auto Recovery attempt #%ld\n", pAd->RalinkCounters.BadCQIAutoRecoveryCount));			MlmeAutoReconnectLastSSID(pAd);		}				if (pAd->StaCfg.bAutoRoaming)		{			BOOLEAN	rv = FALSE;			CHAR	dBmToRoam = pAd->StaCfg.dBmToRoam;			CHAR 	MaxRssi = RTMPMaxRssi(pAd, 										  pAd->StaCfg.RssiSample.LastRssi0, 										  pAd->StaCfg.RssiSample.LastRssi1, 										  pAd->StaCfg.RssiSample.LastRssi2);									// Scanning, ignore Roaming			if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS) &&				(pAd->Mlme.SyncMachine.CurrState == SYNC_IDLE) &&				(MaxRssi <= dBmToRoam))			{				DBGPRINT(RT_DEBUG_TRACE, ("Rssi=%d, dBmToRoam=%d\n", MaxRssi, (CHAR)dBmToRoam));				// Add auto seamless roaming				if (rv == FALSE)					rv = MlmeCheckForFastRoaming(pAd);								if (rv == FALSE)				{					if ((pAd->StaCfg.LastScanTime + 10 * OS_HZ) < pAd->Mlme.Now32)					{						DBGPRINT(RT_DEBUG_TRACE, ("MMCHK - Roaming, No eligable entry, try new scan!\n"));						pAd->StaCfg.ScanCnt = 2;						pAd->StaCfg.LastScanTime = pAd->Mlme.Now32;						MlmeAutoScan(pAd);					}				}			}		}	}	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 (RTMP_TIME_AFTER(pAd->Mlme.Now32, pAd->StaCfg.LastBeaconRxTime + ADHOC_BEACON_LOST_TIME) &&			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, (CHAR *)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 (RTMP_TIME_AFTER(pAd->Mlme.Now32, pEntry->LastBeaconRxTime + ADHOC_BEACON_LOST_TIME))				MacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr);		}	}	else // no INFRA nor ADHOC connection	{		if (pAd->StaCfg.bScanReqIsFromWebUI &&			RTMP_TIME_BEFORE(pAd->Mlme.Now32, pAd->StaCfg.LastScanTime + (30 * OS_HZ)))			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 (RTMP_TIME_AFTER(pAd->Mlme.Now32, pAd->StaCfg.LastScanTime + (10 * OS_HZ)))				{					DBGPRINT(RT_DEBUG_TRACE, ("STAMlmePeriodicExec():CNTL - ScanTab.BssNr==0, start a new ACTIVE scan SSID[%s]\n", pAd->MlmeAux.AutoReconnectSsid));					ScanParmFill(pAd, &ScanReq, (PSTRING) 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;	if (pAd != NULL)	{		MLME_DISASSOC_REQ_STRUCT   DisassocReq;				if ((pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED) &&			(INFRA_ON(pAd)))		{			DBGPRINT(RT_DEBUG_TRACE, ("LinkDownExec(): disassociate with current AP...\n"));			DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid, REASON_DISASSOC_STA_LEAVING);			MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ, 						sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq);			pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;			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, 					pAd->MlmeAux.AutoReconnectSsidLen, 					pAd->MlmeAux.AutoReconnectSsid);		RTMP_MLME_HANDLER(pAd);	}}	// IRQL = DISPATCH_LEVELVOID MlmeAutoReconnectLastSSID(	IN PRTMP_ADAPTER pAd){	if (pAd->StaCfg.bAutoConnectByBssid)	{			DBGPRINT(RT_DEBUG_TRACE, ("Driver auto reconnect to last OID_802_11_BSSID setting - %02X:%02X:%02X:%02X:%02X:%02X\n",									pAd->MlmeAux.Bssid[0],									pAd->MlmeAux.Bssid[1],									pAd->MlmeAux.Bssid[2],									pAd->MlmeAux.Bssid[3],									pAd->MlmeAux.Bssid[4],									pAd->MlmeAux.Bssid[5]));		pAd->MlmeAux.Channel = pAd->CommonCfg.Channel;		MlmeEnqueue(pAd,			 MLME_CNTL_STATE_MACHINE,			 OID_802_11_BSSID,			 MAC_ADDR_LEN,			 pAd->MlmeAux.Bssid);		pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;		RTMP_MLME_HANDLER(pAd);	}	// check CntlMachine.CurrState to avoid collision with NDIS SetOID request	else 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);		RTMP_MLME_HANDLER(pAd);	}}

⌨️ 快捷键说明

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