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

📄 sync.c

📁 ralink 2870 usb无线网卡 最新驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
								}		if ((pAd->CommonCfg.bIEEE80211H == 1) && (NewChannel != 0) && (Channel != NewChannel))		{			// Switching to channel 1 can prevent from rescanning the current channel immediately (by auto reconnection).			// In addition, clear the MLME queue and the scan table to discard the RX packets and previous scanning results.			AsicSwitchChannel(pAd, 1, FALSE);			AsicLockChannel(pAd, 1);		    LinkDown(pAd, FALSE);			MlmeQueueInit(&pAd->Mlme.Queue);			BssTableInit(&pAd->ScanTab);		    RTMPusecDelay(1000000);		// use delay to prevent STA do reassoc								// channel sanity check			for (index = 0 ; index < pAd->ChannelListNum; index++)			{				if (pAd->ChannelList[index].Channel == NewChannel)				{					pAd->ScanTab.BssEntry[Bssidx].Channel = NewChannel;					pAd->CommonCfg.Channel = NewChannel;					AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);					AsicLockChannel(pAd, pAd->CommonCfg.Channel);					DBGPRINT(RT_DEBUG_TRACE, ("PeerBeacon - STA receive channel switch announcement IE (New Channel =%d)\n", NewChannel));					break;				}			}			if (index >= pAd->ChannelListNum)			{				DBGPRINT_ERR(("PeerBeacon(can not find New Channel=%d in ChannelList[%d]\n", pAd->CommonCfg.Channel, pAd->ChannelListNum));			}		}		// if the ssid matched & bssid unmatched, we should select the bssid with large value.		// This might happened when two STA start at the same time		if ((! is_my_bssid) && ADHOC_ON(pAd))		{			INT	i;			// Add the safeguard against the mismatch of adhoc wep status			if (pAd->StaCfg.WepStatus != pAd->ScanTab.BssEntry[Bssidx].WepStatus)			{				return;			}						// collapse into the ADHOC network which has bigger BSSID value.			for (i = 0; i < 6; i++)			{				if (Bssid[i] > pAd->CommonCfg.Bssid[i])				{					DBGPRINT(RT_DEBUG_TRACE, ("SYNC - merge to the IBSS with bigger BSSID=%02x:%02x:%02x:%02x:%02x:%02x\n", 						Bssid[0], Bssid[1], Bssid[2], Bssid[3], Bssid[4], Bssid[5]));					AsicDisableSync(pAd);					COPY_MAC_ADDR(pAd->CommonCfg.Bssid, Bssid);					AsicSetBssid(pAd, pAd->CommonCfg.Bssid); 					MakeIbssBeacon(pAd);        // re-build BEACON frame					AsicEnableIbssSync(pAd);    // copy BEACON frame to on-chip memory					is_my_bssid = TRUE;					break;				}				else if (Bssid[i] < pAd->CommonCfg.Bssid[i])					break;			}		}		NdisGetSystemUpTime(&Now);		pBss = &pAd->ScanTab.BssEntry[Bssidx];		pBss->Rssi = RealRssi;       // lastest RSSI		pBss->LastBeaconRxTime = Now;   // last RX timestamp		//		// BEACON from my BSSID - either IBSS or INFRA network		// 		if (is_my_bssid)		{			RXWI_STRUC	RxWI;			pAd->StaCfg.DtimCount = DtimCount;			pAd->StaCfg.DtimPeriod = DtimPeriod;			pAd->StaCfg.LastBeaconRxTime = Now;			RxWI.RSSI0 = Elem->Rssi0;			RxWI.RSSI1 = Elem->Rssi1;			RxWI.RSSI2 = Elem->Rssi2;			Update_Rssi_Sample(pAd, &pAd->StaCfg.RssiSample, &RxWI);			if (AironetCellPowerLimit != 0xFF)			{				//				// We get the Cisco (ccx) "TxPower Limit" required				// Changed to appropriate TxPower Limit for Ciso Compatible Extensions				//				ChangeToCellPowerLimit(pAd, AironetCellPowerLimit);			}			else			{				//				// AironetCellPowerLimit equal to 0xFF means the Cisco (ccx) "TxPower Limit" not exist.				// Used the default TX Power Percentage, that set from UI.					//				pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault;				}			if (ADHOC_ON(pAd) && (CAP_IS_IBSS_ON(CapabilityInfo)))   			{				UCHAR			MaxSupportedRateIn500Kbps = 0;				UCHAR			idx;				MAC_TABLE_ENTRY *pEntry;					// supported rates array may not be sorted. sort it and find the maximum rate			    for (idx=0; idx<SupRateLen; idx++)				{			        if (MaxSupportedRateIn500Kbps < (SupRate[idx] & 0x7f)) 			            MaxSupportedRateIn500Kbps = SupRate[idx] & 0x7f;						}								for (idx=0; idx<ExtRateLen; idx++)			    {			        if (MaxSupportedRateIn500Kbps < (ExtRate[idx] & 0x7f)) 			            MaxSupportedRateIn500Kbps = ExtRate[idx] & 0x7f;					}										// look up the existing table				pEntry = MacTableLookup(pAd, Addr2);											// Ad-hoc mode is using MAC address as BA session. So we need to continuously find newly joined adhoc station by receiving beacon.				// To prevent always check this, we use wcid == RESERVED_WCID to recognize it as newly joined adhoc station.				if ((ADHOC_ON(pAd) && (Elem->Wcid == RESERVED_WCID)) ||					(pEntry && ((pEntry->LastBeaconRxTime + ADHOC_ENTRY_BEACON_LOST_TIME) < Now)))						{					if (pEntry == NULL)						// Another adhoc joining, add to our MAC table. 						pEntry = MacTableInsertEntry(pAd, Addr2, BSS0, FALSE);					if (StaAddMacTableEntry(pAd, 											pEntry, 											MaxSupportedRateIn500Kbps, 											&HtCapability, 											HtCapabilityLen, 											&AddHtInfo,											AddHtInfoLen,											CapabilityInfo) == FALSE)					{						DBGPRINT(RT_DEBUG_TRACE, ("ADHOC - Add Entry failed.\n"));						return;					}									if (pEntry &&						(Elem->Wcid == RESERVED_WCID))				{						idx = pAd->StaCfg.DefaultKeyId;						RTMP_STA_SECURITY_INFO_ADD(pAd, BSS0, idx, pEntry);				}				}				if (pEntry && pEntry->ValidAsCLI)					pEntry->LastBeaconRxTime = Now;				// At least another peer in this IBSS, declare MediaState as CONNECTED				if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))				{					OPSTATUS_SET_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); 					pAd->IndicateMediaState = NdisMediaStateConnected;					RTMP_IndicateMediaState(pAd);	                pAd->ExtraInfo = GENERAL_LINK_UP;					AsicSetBssid(pAd, pAd->CommonCfg.Bssid);										// 2003/03/12 - john					// Make sure this entry in "ScanTab" table, thus complies to Microsoft's policy that					// "site survey" result should always include the current connected network. 					//					Bssidx = BssTableSearch(&pAd->ScanTab, Bssid, Channel);					if (Bssidx == BSS_NOT_FOUND)					{						Bssidx = BssTableSetEntry(pAd, &pAd->ScanTab, Bssid, Ssid, SsidLen, BssType, BeaconPeriod, 									&CfParm, AtimWin, CapabilityInfo, SupRate, SupRateLen, ExtRate, ExtRateLen, &HtCapability,									&AddHtInfo, HtCapabilityLen, AddHtInfoLen, NewExtChannelOffset, Channel, RealRssi, TimeStamp, 0, 									&EdcaParm, &QosCapability, &QbssLoad, LenVIE, pVIE);					}					DBGPRINT(RT_DEBUG_TRACE, ("ADHOC  fOP_STATUS_MEDIA_STATE_CONNECTED.\n"));				}				}			if (INFRA_ON(pAd))			{				BOOLEAN bUseShortSlot, bUseBGProtection;				// decide to use/change to - 				//      1. long slot (20 us) or short slot (9 us) time				//      2. turn on/off RTS/CTS and/or CTS-to-self protection				//      3. short preamble									//bUseShortSlot = pAd->CommonCfg.bUseShortSlotTime && CAP_IS_SHORT_SLOT(CapabilityInfo);				bUseShortSlot = CAP_IS_SHORT_SLOT(CapabilityInfo);				if (bUseShortSlot != OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED))					AsicSetSlotTime(pAd, bUseShortSlot);				bUseBGProtection = (pAd->CommonCfg.UseBGProtection == 1) ||    // always use								   ((pAd->CommonCfg.UseBGProtection == 0) && ERP_IS_USE_PROTECTION(Erp));				if (pAd->CommonCfg.Channel > 14) // always no BG protection in A-band. falsely happened when switching A/G band to a dual-band AP					bUseBGProtection = FALSE;				if (bUseBGProtection != OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED))				{					if (bUseBGProtection)					{						OPSTATUS_SET_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED);						AsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, (OFDMSETPROTECT|CCKSETPROTECT|ALLN_SETPROTECT),FALSE,(pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent == 1));					}					else					{						OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED);						AsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, (OFDMSETPROTECT|CCKSETPROTECT|ALLN_SETPROTECT),TRUE,(pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent == 1));					}										DBGPRINT(RT_DEBUG_WARN, ("SYNC - AP changed B/G protection to %d\n", bUseBGProtection));				}				#ifdef DOT11_N_SUPPORT				// check Ht protection mode. and adhere to the Non-GF device indication by AP.				if ((AddHtInfoLen != 0) && 					((AddHtInfo.AddHtInfo2.OperaionMode != pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode) ||					(AddHtInfo.AddHtInfo2.NonGfPresent != pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent)))				{					pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent = AddHtInfo.AddHtInfo2.NonGfPresent;					pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode = AddHtInfo.AddHtInfo2.OperaionMode;					if (pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent == 1)				{						AsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, ALLN_SETPROTECT, FALSE, TRUE);					}					else						AsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, ALLN_SETPROTECT, FALSE, FALSE);					DBGPRINT(RT_DEBUG_TRACE, ("SYNC - AP changed N OperaionMode to %d\n", pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode));				}#endif // DOT11_N_SUPPORT //								if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED) && 					ERP_IS_USE_BARKER_PREAMBLE(Erp))				{					MlmeSetTxPreamble(pAd, Rt802_11PreambleLong);					DBGPRINT(RT_DEBUG_TRACE, ("SYNC - AP forced to use LONG preamble\n"));				}				if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED)    &&					(EdcaParm.bValid == TRUE)                          &&					(EdcaParm.EdcaUpdateCount != pAd->CommonCfg.APEdcaParm.EdcaUpdateCount))				{					DBGPRINT(RT_DEBUG_TRACE, ("SYNC - AP change EDCA parameters(from %d to %d)\n", 						pAd->CommonCfg.APEdcaParm.EdcaUpdateCount,						EdcaParm.EdcaUpdateCount));					AsicSetEdcaParm(pAd, &EdcaParm);				}				// copy QOS related information				NdisMoveMemory(&pAd->CommonCfg.APQbssLoad, &QbssLoad, sizeof(QBSS_LOAD_PARM));				NdisMoveMemory(&pAd->CommonCfg.APQosCapability, &QosCapability, sizeof(QOS_CAPABILITY_PARM));			}			// only INFRASTRUCTURE mode support power-saving feature			if ((INFRA_ON(pAd) && (pAd->StaCfg.Psm == PWR_SAVE)) || (pAd->CommonCfg.bAPSDForcePowerSave))			{				UCHAR FreeNumber;				//  1. AP has backlogged unicast-to-me frame, stay AWAKE, send PSPOLL				//  2. AP has backlogged broadcast/multicast frame and we want those frames, stay AWAKE				//  3. we have outgoing frames in TxRing or MgmtRing, better stay AWAKE				//  4. Psm change to PWR_SAVE, but AP not been informed yet, we better stay AWAKE				//  5. otherwise, put PHY back to sleep to save battery.				if (MessageToMe)				{					if (pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable &&						pAd->CommonCfg.bAPSDAC_BE && pAd->CommonCfg.bAPSDAC_BK && pAd->CommonCfg.bAPSDAC_VI && pAd->CommonCfg.bAPSDAC_VO)					{						pAd->CommonCfg.bNeedSendTriggerFrame = TRUE;					}					else						RTMP_PS_POLL_ENQUEUE(pAd);				}				else if (BcastFlag && (DtimCount == 0) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM))				{				} 				else if ((pAd->TxSwQueue[QID_AC_BK].Number != 0)													||						(pAd->TxSwQueue[QID_AC_BE].Number != 0)														||						(pAd->TxSwQueue[QID_AC_VI].Number != 0)														||						(pAd->TxSwQueue[QID_AC_VO].Number != 0)														||						(RTMPFreeTXDRequest(pAd, QID_AC_BK, TX_RING_SIZE - 1, &FreeNumber) != NDIS_STATUS_SUCCESS)	||						(RTMPFreeTXDRequest(pAd, QID_AC_BE, TX_RING_SIZE - 1, &FreeNumber) != NDIS_STATUS_SUCCESS)	||						(RTMPFreeTXDRequest(pAd, QID_AC_VI, TX_RING_SIZE - 1, &FreeNumber) != NDIS_STATUS_SUCCESS)	||						(RTMPFreeTXDRequest(pAd, QID_AC_VO, TX_RING_SIZE - 1, &FreeNumber) != NDIS_STATUS_SUCCESS)	||						(RTMPFreeTXDRequest(pAd, QID_MGMT, MGMT_RING_SIZE - 1, &FreeNumber) != NDIS_STATUS_SUCCESS)) 				{					// TODO: consider scheduled HCCA. might not be proper to use traditional DTIM-based power-saving scheme					// can we cheat here (i.e. just check MGMT & AC_BE) for better performance?				}				else 				{					if ((pAd->CommonCfg.bACMAPSDTr[QID_AC_VO]) ||						(pAd->CommonCfg.bACMAPSDTr[QID_AC_VI]) ||						(pAd->CommonCfg.bACMAPSDTr[QID_AC_BK]) ||						(pAd->CommonCfg.bACMAPSDTr[QID_AC_BE]))					{						/*							WMM Spec v1.0 3.6.2.4,							The WMM STA shall remain awake until it receives a							QoS Data or Null frame addressed to it, with the							EOSP subfield in QoS Control field set to 1.							So we can not sleep here or we will suffer a case:							PS Management Frame -->							Trigger frame -->							Beacon (TIM=0) (Beacon is closer to Trig frame) -->							Station goes to sleep -->							AP delivery queued UAPSD packets -->							Station can NOT receive the reply							Maybe we need a timeout timer to avoid that we do							NOT receive the EOSP frame.							We can not use More Data to check if SP is ended							due to MaxSPLength.						*/					}					else					{						USHORT NextDtim = DtimCount;						if (NextDtim == 0) 							NextDtim = DtimPeriod;						TbttNumToNextWakeUp = pAd->StaCfg.DefaultListenCount;						if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM) && (TbttNumToNextWakeUp > NextDtim))							TbttNumToNextWakeUp = NextDtim;						if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))						{							AsicSleepThenAutoWakeup(pAd, TbttNumToNextWakeUp);						}					}				}			}		}		// not my BSSID, ignore it	}	// sanity check fail, ignore this frame}/* 	==========================================================================	Description:		Receive PROBE REQ from remote peer when operating in IBSS mode

⌨️ 快捷键说明

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