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

📄 sync.c

📁 TP Link 321 Linux Driver
💻 C
📖 第 1 页 / 共 5 页
字号:
			pAd->PortCfg.AvgRssi  = pAd->PortCfg.AvgRssiX8 >> 3;		   			if ((pAd->PortCfg.RssiTriggerMode == RSSI_TRIGGERED_UPON_BELOW_THRESHOLD) &&				(pAd->PortCfg.LastRssi < pAd->PortCfg.RssiTrigger))			{				DBGPRINT(RT_DEBUG_TRACE, "SYNC - NdisMIndicateStatus *** RSSI %d dBm, less than threshold %d dBm\n", 					pAd->PortCfg.LastRssi - pAd->BbpRssiToDbmDelta, 					pAd->PortCfg.RssiTrigger - pAd->BbpRssiToDbmDelta);			}			else if ((pAd->PortCfg.RssiTriggerMode == RSSI_TRIGGERED_UPON_EXCCEED_THRESHOLD) &&				(pAd->PortCfg.LastRssi > pAd->PortCfg.RssiTrigger))			{				DBGPRINT(RT_DEBUG_TRACE, "SYNC - NdisMIndicateStatus *** RSSI %d dBm, greater than threshold %d dBm\n", 					pAd->PortCfg.LastRssi - pAd->BbpRssiToDbmDelta, 					pAd->PortCfg.RssiTrigger - pAd->BbpRssiToDbmDelta);			}			if (INFRA_ON(pAd)) // && (pAd->PortCfg.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->PortCfg.UseShortSlotTime && CAP_IS_SHORT_SLOT(CapabilityInfo);				if (bUseShortSlot != OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED))					AsicSetSlotTime(pAd, bUseShortSlot);				bUseBGProtection = (pAd->PortCfg.UseBGProtection == 1) ||	 // always use								   ((pAd->PortCfg.UseBGProtection == 0) && ERP_IS_USE_PROTECTION(Erp));				if (pAd->PortCfg.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);					else						OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED);					DBGPRINT(RT_DEBUG_TRACE, "SYNC - AP changed B/G protection to %d\n", bUseBGProtection);				}				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->PortCfg.APEdcaParm.EdcaUpdateCount))				{					DBGPRINT(RT_DEBUG_TRACE, "SYNC - AP change EDCA parameters(from %d to %d)\n", 						pAd->PortCfg.APEdcaParm.EdcaUpdateCount,						EdcaParm.EdcaUpdateCount);					AsicSetEdcaParm(pAd, &EdcaParm);				}								// copy QOS related information				NdisMoveMemory(&pAd->PortCfg.APQbssLoad, &QbssLoad, sizeof(QBSS_LOAD_PARM));				NdisMoveMemory(&pAd->PortCfg.APQosCapability, &QosCapability, sizeof(QOS_CAPABILITY_PARM));						}						// only INFRASTRUCTURE mode support power-saving feature			if (INFRA_ON(pAd) && (pAd->PortCfg.Psm == PWR_SAVE)) 			{//				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");					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 0				 				else if ((RTUSBFreeTXDRequest(pAd, QID_AC_BE, TX_RING_SIZE, &FreeNumber) != NDIS_STATUS_SUCCESS)  ||//						 (RTUSBFreeTXDRequest(pAd, QID_AC_BK, TX_RING_SIZE, &FreeNumber) != NDIS_STATUS_SUCCESS)  ||//						 (RTUSBFreeTXDRequest(pAd, QID_AC_VI, TX_RING_SIZE, &FreeNumber) != NDIS_STATUS_SUCCESS)	   ||//						 (RTUSBFreeTXDRequest(pAd, QID_AC_VO, TX_RING_SIZE, &FreeNumber) != NDIS_STATUS_SUCCESS)	   ||						 (RTUSBFreeTXDRequest(pAd, QID_MGMT, MGMT_RING_SIZE, &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?					DBGPRINT(RT_DEBUG_TRACE, "SYNC - outgoing frame in TxRing/MgmtRing, stay AWAKE\n");				}#endif				  				else 				{					USHORT NextDtim = DtimCount;					if (NextDtim == 0) 						NextDtim = DtimPeriod;											TbttNumToNextWakeUp = pAd->PortCfg.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);					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) &&				(BssType == BSS_ADHOC))			{				OPSTATUS_SET_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);				// 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, Channel, RealRssi + pAd->BbpRssiToDbmDelta, TimeStamp, CkipFlag, 								&EdcaParm, &QosCapability, &QbssLoad, LenVIE, pVIE);				}			}#endif		}		// not my BSSID, ignore it	}    	// sanity check fail, ignore this frame}/*     ==========================================================================    Description:        Receive PROBE REQ from remote peer when operating in IBSS mode    ========================================================================== */VOID PeerProbeReqAction(    IN PRTMP_ADAPTER pAd,     IN MLME_QUEUE_ELEM *Elem) {    UCHAR         Addr2[MAC_ADDR_LEN];    CHAR          Ssid[MAX_LEN_OF_SSID+1];    UCHAR         SsidLen;    HEADER_802_11 ProbeRspHdr;    PUCHAR        pOutBuffer = NULL;    ULONG         FrameLen = 0;    LARGE_INTEGER FakeTimestamp;    UCHAR         DsLen = 1, IbssLen = 2;    UCHAR         LocalErpIe[3] = {IE_ERP, 1, 0};    USHORT        NStatus;    BOOLEAN       Privacy;    USHORT        CapabilityInfo;        if (! ADHOC_ON(pAd))        return;    if (PeerProbeReqSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, Ssid, &SsidLen))    {        if ((SsidLen == 0) || SSID_EQUAL(Ssid, SsidLen, pAd->PortCfg.Ssid, pAd->PortCfg.SsidLen))        {#if 0                    CSR15_STRUC Csr15;                        // we should respond a ProbeRsp only when we're the last BEACON transmitter             // in this ADHOC network.            RTMP_IO_READ32(pAd, CSR15, &Csr15.word);            if (Csr15.field.BeaconSent == 0)            {                DBGPRINT(RT_DEBUG_INFO, "SYNC - NOT last BEACON sender, no PROBE_RSP to %02x:%02x:%02x:%02x:%02x:%02x...\n",                    Addr2[0],Addr2[1],Addr2[2],Addr2[3],Addr2[4],Addr2[5] );                return;            }#endif			            // allocate and send out ProbeReq frame            NStatus = MlmeAllocateMemory(pAd, (PVOID *)&pOutBuffer);  //Get an unused nonpaged memory            if (NStatus != NDIS_STATUS_SUCCESS)	            return;                        //pAd->PortCfg.AtimWin = 0;  // ??????            DBGPRINT(RT_DEBUG_TRACE, "SYNC - Send PROBE_RSP to %02x:%02x:%02x:%02x:%02x:%02x...\n",                 Addr2[0],Addr2[1],Addr2[2],Addr2[3],Addr2[4],Addr2[5] );            MgtMacHeaderInit(pAd, &ProbeRspHdr, SUBTYPE_PROBE_RSP, 0, Addr2, pAd->PortCfg.Bssid);			Privacy = (pAd->PortCfg.WepStatus == Ndis802_11Encryption1Enabled) || 					  (pAd->PortCfg.WepStatus == Ndis802_11Encryption2Enabled) || 					  (pAd->PortCfg.WepStatus == Ndis802_11Encryption3Enabled);			CapabilityInfo = CAP_GENERATE(0, 1, Privacy, (pAd->PortCfg.TxPreamble == Rt802_11PreambleShort), 0);                        MakeOutgoingFrame(pOutBuffer,                   &FrameLen,                               sizeof(HEADER_802_11),        &ProbeRspHdr,                               TIMESTAMP_LEN,                &FakeTimestamp,                              2,                            &pAd->PortCfg.BeaconPeriod,                              2,                            &CapabilityInfo,                              1,                            &SsidIe,                               1,                            &pAd->PortCfg.SsidLen,                               pAd->PortCfg.SsidLen,         pAd->PortCfg.Ssid,                              1,                            &SupRateIe,                               1,                            &pAd->ActiveCfg.SupRateLen,                              pAd->ActiveCfg.SupRateLen,    pAd->ActiveCfg.SupRate,                               1,                            &DsIe,                               1,                            &DsLen,                               1,                            &pAd->PortCfg.Channel,                              1,                            &IbssIe,                               1,                            &IbssLen,                               2,                            &pAd->ActiveCfg.AtimWin,                              END_OF_ARGS);            if (pAd->ActiveCfg.ExtRateLen)            {                ULONG tmp;                MakeOutgoingFrame(pOutBuffer + FrameLen,        &tmp,                                   3,                            LocalErpIe,                                  1,                            &ExtRateIe,                                  1,                            &pAd->ActiveCfg.ExtRateLen,                                  pAd->ActiveCfg.ExtRateLen,    &pAd->ActiveCfg.ExtRate,                                  END_OF_ARGS);                FrameLen += tmp;            }            			// If adhoc secruity is set for WPA-None, append the cipher suite IE			if (pAd->PortCfg.AuthMode == Ndis802_11AuthModeWPANone)			{				ULONG	tmp;								if (pAd->PortCfg.WepStatus == Ndis802_11Encryption2Enabled) 	// Tkip				{					MakeOutgoingFrame(pOutBuffer + FrameLen, 		&tmp,							          1,						    &WpaIe,							          1,							&CipherSuiteWpaNoneTkipLen,							          CipherSuiteWpaNoneTkipLen,	&CipherSuiteWpaNoneTkip[0],							          END_OF_ARGS);					FrameLen += tmp;				}				else if (pAd->PortCfg.WepStatus == Ndis802_11Encryption3Enabled)	// Aes				{					MakeOutgoingFrame(pOutBuffer + FrameLen, 		&tmp,							          1,						    &WpaIe,							          1,							&CipherSuiteWpaNoneAesLen,							          CipherSuiteWpaNoneAesLen,	    &CipherSuiteWpaNoneAes[0],							          END_OF_ARGS);					FrameLen += tmp;				}			}                            MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);        }    }}VOID BeaconTimeoutAtJoinAction(    IN PRTMP_ADAPTER pAd,     IN MLME_QUEUE_ELEM *Elem) {    USHORT  Status;        DBGPRINT(RT_DEBUG_TRACE, "SYNC - BeaconTimeoutAtJoinAction\n");    pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;    Status = MLME_REJ_TIMEOUT;    MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_JOIN_CONF, 2, &Status);}/*     ==========================================================================    Description:        Scan timeout procedure. basically add channel index by 1 and rescan    ========================================================================== */VOID ScanTimeoutAction(    IN PRTMP_ADAPTER pAd,     IN MLME_QUEUE_ELEM *Elem) {//  DBGPRINT(RT_DEBUG_TRACE,"SYNC - ScanTimeoutAction\n");    pAd->MlmeAux.Channel = NextChannel(pAd, pAd->MlmeAux.Channel);    ScanNextChannel(pAd); // this routine will stop if pAd->MlmeAux.Channel == 0}/*     ==========================================================================    Description:        Scan next channel    ========================================================================== */VOID ScanNextChannel(	IN PRTMP_ADAPTER pAd){    HEADER_802_11   Hdr80211;    PUCHAR          pOutBuffer = NULL;    ULONG           FrameLen = 0;    UCHAR           SsidLen = 0, ScanType = pAd->MlmeAux.ScanType;    USHORT          Status;    PHEADER_802_11  pHdr80211;     USHORT          NStatus;    PUCHAR          pSupRate = NULL;    UCHAR           SupRateLen;    PUCHAR          pExtRate = NULL;    UCHAR           ExtRateLen;//For A band     UCHAR           ASupRate[] = {0x8C, 0x12, 0x98, 0x24, 0xb0, 0x48, 0x60, 0x6C};    UCHAR           ASupRateLen = sizeof(ASupRate)/sizeof(UCHAR);        DBGPRINT(RT_DEBUG_INFO, "ScanNextChannel(ch=%d)\n",pAd->MlmeAux.Channel);    if (pAd->MlmeAux.Channel == 0)     {        DBGPRINT(RT_DEBUG_TRACE, "SYNC - End of SCAN, restore to channel %d\n",pAd->PortCfg.Channel);               AsicSwitchChannel(pAd, pAd->PortCfg.Channel);        AsicLockChannel(pAd, pAd->PortCfg.Channel);                // G band - set BBP_R62 to 0x02 when site survey or rssi<-82		// A band - always set BBP_R62 to 0x04        if (pAd->PortCfg.Channel <= 14)        {        	RTUSBWriteBBPRegister(pAd, BBP_R62, 0x02);        }        else        {        	RTUSBWriteBBPRegister(pAd, BBP_R62, 0x04);

⌨️ 快捷键说明

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