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

📄 sync.c

📁 Linux下的RT系列无线网卡驱动,可以直接在x86平台上编译
💻 C
📖 第 1 页 / 共 5 页
字号:
				Bssidx, RealRssi, Bssid[0], Bssid[1], Bssid[2], Bssid[3], Bssid[4], Bssid[5]));		}		if ((pAd->CommonCfg.bIEEE80211H == 1) && (NewChannel != 0) && (Channel != NewChannel))		{			// channel sanity check			for (index = 0 ; index < pAd->ChannelListNum; index++)			{				if (pAd->ChannelList[index].Channel == NewChannel)				{					pAd->MlmeAux.SsidBssTab.BssEntry[Bssidx].Channel = NewChannel;					pAd->CommonCfg.Channel = NewChannel;					AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);					AsicLockChannel(pAd, pAd->CommonCfg.Channel);					LinkDown(pAd, FALSE);					RTMPusecDelay(1000000);		// use delay to prevent STA do reassoc					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->MlmeAux.SsidBssTab.BssEntry[Bssidx].WepStatus)			{				DBGPRINT(RT_DEBUG_TRACE, ("SYNC - Not matched wep status %d %d\n", pAd->StaCfg.WepStatus, pAd->MlmeAux.SsidBssTab.BssEntry[Bssidx].WepStatus));				DBGPRINT(RT_DEBUG_TRACE, ("bssid=%s\n", pAd->MlmeAux.SsidBssTab.BssEntry[Bssidx].Bssid));				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;			}		}		DBGPRINT(RT_DEBUG_INFO, ("SYNC - PeerBeacon from %02x:%02x:%02x:%02x:%02x:%02x - Dtim=%d/%d, Rssi=%02x\n", 			Bssid[0], Bssid[1], Bssid[2], Bssid[3], Bssid[4], Bssid[5], 			DtimCount, DtimPeriod, RealRssi));		NdisGetSystemUpTime(&Now);		pBss = &pAd->MlmeAux.SsidBssTab.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);			DBGPRINT(RT_DEBUG_INFO, ("SYNC - my beacon from %02x:%02x:%02x:%02x:%02x:%02x - Dtim=%d/%d, Rssi=%d, Rssi2=%d, Rssi3=%d\n", 				Bssid[0], Bssid[1], Bssid[2], Bssid[3], Bssid[4], Bssid[5], DtimCount, DtimPeriod, pAd->StaCfg.RssiSample.LastRssi0, pAd->StaCfg.RssiSample.LastRssi1, pAd->StaCfg.RssiSample.LastRssi2));			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;				}			// at least one 11b peer joined. downgrade the MaxTxRate to 11Mbps			// after last 11b peer left for several seconds, we'll auto switch back to 11G rate			// in MlmePeriodicExec()			if (ADHOC_ON(pAd) && (CAP_IS_IBSS_ON(CapabilityInfo)))   			{				 BOOLEAN	bRestart;                BOOLEAN	bnRestart;                				// this timestamp is for MlmePeriodicExec() to check if all 11B peers have left				pAd->StaCfg.Last11bBeaconRxTime = Now;				bRestart = FALSE;                bnRestart = FALSE;				if ((SupRateLen+ExtRateLen <= 4) && (pAd->CommonCfg.MaxTxRate > RATE_11))				{					DBGPRINT(RT_DEBUG_TRACE, ("SYNC - 11b peer joined. down-grade to 11b TX rates \n"));					NdisMoveMemory(pAd->StaActive.SupRate, SupRate, MAX_LEN_OF_SUPPORTED_RATES);					pAd->StaActive.SupRateLen = SupRateLen;					NdisMoveMemory(pAd->StaActive.ExtRate, ExtRate, MAX_LEN_OF_SUPPORTED_RATES);					pAd->StaActive.ExtRateLen = ExtRateLen;					bRestart = TRUE;				}								// Update Ht Phy. 				if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED))				{				}								// If peer Adhoc is legacy mode, I don't need to call MlmeUpdateHtTxRates no matter I support HT or not				if ((bRestart == TRUE) && (bnRestart == FALSE))				{					MlmeUpdateTxRates(pAd, FALSE);					MakeIbssBeacon(pAd);        // re-build BEACON frame					AsicEnableIbssSync(pAd);    // copy to on-chip memory				}				else if ((bRestart == TRUE) && (bnRestart == TRUE))				{					MlmeUpdateTxRates(pAd, FALSE);					MlmeUpdateHtTxRates(pAd, Elem->Wcid);					MakeIbssBeacon(pAd);        // re-build BEACON frame					AsicEnableIbssSync(pAd);    // copy to on-chip memory				}			}			if (INFRA_ON(pAd)) // && (pAd->CommonCfg.PhyMode == PHY_11BG_MIXED))			{				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);				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));				}								// 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));				}								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)				{					DBGPRINT(RT_DEBUG_TRACE, ("SYNC - AP backlog unicast-to-me, stay AWAKE, send PSPOLL\n"));					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						EnqueuePsPoll(pAd);				}				else if (BcastFlag && (DtimCount == 0) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM))				{					DBGPRINT(RT_DEBUG_TRACE, ("SYNC - AP backlog broadcast/multicast, stay AWAKE\n"));				} #if 1				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)) #else				else if ((RTMPFreeTXDRequest(pAd, QID_AC_BE, TX_RING_SIZE, &FreeNumber) != NDIS_STATUS_SUCCESS)  ||//						(RTMPFreeTXDRequest(pAd, QID_AC_BK, TX_RING_SIZE, &FreeNumber) != NDIS_STATUS_SUCCESS)  ||//						(RTMPFreeTXDRequest(pAd, QID_AC_VI, TX_RING_SIZE, &FreeNumber) != NDIS_STATUS_SUCCESS)       ||//						(RTMPFreeTXDRequest(pAd, QID_AC_VO, TX_RING_SIZE, &FreeNumber) != NDIS_STATUS_SUCCESS)       ||						(RTMPFreeTXDRequest(pAd, QID_MGMT, MGMT_RING_SIZE, &FreeNumber) != NDIS_STATUS_SUCCESS))#endif				{					// 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?					DBGPRINT(RT_DEBUG_TRACE, ("SYNC - outgoing frame in TxRing/MgmtRing, stay AWAKE\n"));				}				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;					DBGPRINT(RT_DEBUG_INFO, ("SYNC - PHY sleeps for %d TBTT, Dtim=%d/%d\n", TbttNumToNextWakeUp, DtimCount, DtimPeriod));					if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))					{						AsicSleepThenAutoWakeup(pAd, TbttNumToNextWakeUp);					}				}			}#ifndef	SINGLE_ADHOC_LINKUP			// At least another peer in this IBSS, declare MediaState as CONNECTED			if (ADHOC_ON(pAd) && 				!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && ((CapabilityInfo&0x1)==0))			{				OPSTATUS_SET_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); 				pAd->IndicateMediaState = NdisMediaStateConnected;				RTMP_IndicateMediaState();				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"));			}				// 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))			{				UCHAR	idx;				MAC_TABLE_ENTRY *pEntry;								// look up the existing table				pEntry = MacTableLookup(pAd, Addr2);				if (pEntry == NULL)				{					// Another adhoc joining, add to our MAC table. 					pEntry = MacTableInsertEntry(pAd, Addr2, BSS0, TRUE);	 			

⌨️ 快捷键说明

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