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

📄 sync.c

📁 TP Link 321 Linux Driver
💻 C
📖 第 1 页 / 共 5 页
字号:
        }		//		// To prevent data lost.		// Send an NULL data with turned PSM bit on to current associated AP before SCAN progress.		// Now, we need to send an NULL data with turned PSM bit off to AP, when scan progress done 		//		if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && (INFRA_ON(pAd)))		{            NStatus = MlmeAllocateMemory(pAd, (PVOID *)&pOutBuffer);  //Get an unused nonpaged memory            if (NStatus == NDIS_STATUS_SUCCESS)            {				pHdr80211 = (PHEADER_802_11) pOutBuffer;				MgtMacHeaderInit(pAd, pHdr80211, SUBTYPE_NULL_FUNC, 1, pAd->PortCfg.Bssid, pAd->PortCfg.Bssid);				pHdr80211->Duration = 0;				pHdr80211->FC.Type = BTYPE_DATA;				pHdr80211->FC.PwrMgmt = PWR_ACTIVE;				// Send using priority queue				MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, sizeof(HEADER_802_11));				DBGPRINT(RT_DEBUG_TRACE, "MlmeScanReqAction -- Send PSM Data frame\n");				RTMPusecDelay(5000);			}		}        pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;        Status = MLME_SUCCESS;        MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status);	    }    else if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST) || VIRTUAL_IF_NUM(pAd)==0)	{		pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;		Status = MLME_FAIL_NO_RESOURCE;		MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status);	}    else     {        // BBP and RF are not accessible in PS mode, we has to wake them up first        if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))            AsicForceWakeup(pAd);        // leave PSM during scanning. otherwise we may lost ProbeRsp & BEACON        if (pAd->PortCfg.Psm == PWR_SAVE)            MlmeSetPsmBit(pAd, PWR_ACTIVE);                AsicSwitchChannel(pAd, pAd->MlmeAux.Channel);        AsicLockChannel(pAd, pAd->MlmeAux.Channel);               // G band - set BBP_R62 to 0x02 when site survey or rssi<-82		// A band - always set BBP_R62 to 0x04        if (pAd->MlmeAux.Channel <= 14)        {       		    //			// For the high power and False CCA issue.(Gary)			//				RTUSBWriteBBPRegister(pAd, BBP_R62, 0x04);			RTUSBWriteBBPRegister(pAd, 17, pAd->BbpTuning.R17LowerBoundG);        }              else        {            if ((pAd->PortCfg.bIEEE80211H == 1) && RadarChannelCheck(pAd, pAd->MlmeAux.Channel))			    ScanType = SCAN_PASSIVE;                  	RTUSBWriteBBPRegister(pAd, 17, pAd->BbpTuning.R17LowerBoundA);                	RTUSBWriteBBPRegister(pAd, BBP_R62, 0x04);        }                		// We need to shorten active scan time in order for WZC connect issue		// Chnage the channel scan time for CISCO stuff based on its IAPP announcement        if (ScanType == FAST_SCAN_ACTIVE)        {			RTMPSetTimer(&pAd->MlmeAux.ScanTimer, FAST_ACTIVE_SCAN_TIME);        }        else // must be SCAN_PASSIVE or SCAN_ACTIVE        {        	if (pAd->PortCfg.PhyMode == PHY_11ABG_MIXED)				RTMPSetTimer(&pAd->MlmeAux.ScanTimer, MIN_CHANNEL_TIME);			else			    RTMPSetTimer(&pAd->MlmeAux.ScanTimer, MAX_CHANNEL_TIME);        }	if ((pAd->MlmeAux.Channel == 34) || (pAd->MlmeAux.Channel == 38) || 	    (pAd->MlmeAux.Channel == 42) || (pAd->MlmeAux.Channel == 46))	{			ScanType = SCAN_PASSIVE;	}	        if ((ScanType == SCAN_ACTIVE) || (ScanType == FAST_SCAN_ACTIVE))        {            NStatus = MlmeAllocateMemory(pAd, (PVOID *)&pOutBuffer);  //Get an unused nonpaged memory            if (NStatus != NDIS_STATUS_SUCCESS)            {    	        DBGPRINT(RT_DEBUG_TRACE, "SYNC - ScanNextChannel() allocate memory fail\n");        	    pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;        	    Status = MLME_FAIL_NO_RESOURCE;                MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status);	            return;    	    }    		// There is no need to send broadcast probe request if active scan is in effect.            SsidLen = pAd->MlmeAux.SsidLen;      	if (pAd->MlmeAux.Channel <= 14)	{		// B&G band use 1,2,5.5,11		pSupRate = pAd->PortCfg.SupRate;		SupRateLen = pAd->PortCfg.SupRateLen;		pExtRate = pAd->PortCfg.ExtRate;		ExtRateLen = pAd->PortCfg.ExtRateLen;	}	else    // A band use OFDM rate	{		//		// Overwrite Support Rate, CCK rate are not allowed		//		pSupRate = ASupRate;		SupRateLen = ASupRateLen;		ExtRateLen = 0;					}    	    MgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, BROADCAST_ADDR, BROADCAST_ADDR);            MakeOutgoingFrame(pOutBuffer,               &FrameLen,                              sizeof(HEADER_802_11),    &Hdr80211,                              1,                        &SsidIe,                              1,                        &SsidLen,                              SsidLen,			pAd->MlmeAux.Ssid,                              1,                        &SupRateIe,                              1,                        &SupRateLen,	                      SupRateLen,  		pSupRate,                              END_OF_ARGS);            if (ExtRateLen)            {                ULONG Tmp;            	MakeOutgoingFrame(pOutBuffer + FrameLen,        &Tmp,                                  1,                            &ExtRateIe,                                  1,                            &ExtRateLen,                                  ExtRateLen,      		pExtRate,                                   END_OF_ARGS);            	FrameLen += Tmp;            }            if (pAd->PortCfg.bGetAPConfig)             {                UCHAR RalinkSpecificIEForGetCfg[6] = {IE_VENDOR_SPECIFIC, 4, 0x00, 0x0c, 0x43, 0x80};                ULONG Tmp = 0;                MakeOutgoingFrame(pOutBuffer + FrameLen,        &Tmp,                                  6,                            RalinkSpecificIEForGetCfg,                                  END_OF_ARGS);                FrameLen += Tmp;            }            MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);                        DBGPRINT(RT_DEBUG_INFO, "SYNC - send ProbeReq @ channel=%d, Len=%d\n", pAd->MlmeAux.Channel, FrameLen);        }		// For SCAN_CISCO_PASSIVE, do nothing and silently wait for beacon or other probe reponse 	        pAd->Mlme.SyncMachine.CurrState = SCAN_LISTEN;    }}/*     ==========================================================================    Description:    ========================================================================== */VOID InvalidStateWhenScan(    IN PRTMP_ADAPTER pAd,     IN MLME_QUEUE_ELEM *Elem) {    USHORT  Status;    DBGPRINT(RT_DEBUG_TRACE, "AYNC - InvalidStateWhenScan(state=%d). Reset SYNC machine\n", pAd->Mlme.SyncMachine.CurrState);    pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;    Status = MLME_STATE_MACHINE_REJECT;    MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status);}/*     ==========================================================================    Description:    ========================================================================== */VOID InvalidStateWhenJoin(    IN PRTMP_ADAPTER pAd,     IN MLME_QUEUE_ELEM *Elem) {    USHORT  Status;        DBGPRINT(RT_DEBUG_TRACE, "AYNC - InvalidStateWhenJoin(state=%d). Reset SYNC machine\n", pAd->Mlme.SyncMachine.CurrState);    pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;    Status = MLME_STATE_MACHINE_REJECT;    MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_JOIN_CONF, 2, &Status);}/*     ==========================================================================    Description:    ========================================================================== */VOID InvalidStateWhenStart(    IN PRTMP_ADAPTER pAd,     IN MLME_QUEUE_ELEM *Elem) {    USHORT  Status;        DBGPRINT(RT_DEBUG_TRACE, "AYNC - InvalidStateWhenStart(state=%d). Reset SYNC machine\n", pAd->Mlme.SyncMachine.CurrState);    pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;    Status = MLME_STATE_MACHINE_REJECT;    MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_START_CONF, 2, &Status);}/*     ==========================================================================    Description:    	    ========================================================================== */VOID EnqueuePsPoll(    IN PRTMP_ADAPTER pAd) {#ifdef RALINK_ATE    if(pAd->ate.Mode != ATE_STASTART)    {	return;    }#endif	    DBGPRINT(RT_DEBUG_TRACE, "SYNC - send PsPoll ...\n");    MiniportMMRequest(pAd, QID_AC_BE, (PUCHAR)&pAd->PsPollFrame, sizeof(PSPOLL_FRAME));}// 2003-04-17 john// driver force send out a BEACON frame to cover ADHOC mode BEACON starving issue// that is, in ADHOC mode, driver guarantee itself can send out at least a BEACON// per a specified duration, even the peer's clock is faster than us and win all the// hardware-based BEACON TX oppertunity. // we may remove this software feature once 2560 IC fix this problem in ASIC.VOID EnqueueBeaconFrame(    IN PRTMP_ADAPTER pAd) {    PTXD_STRUC		pTxD;#ifdef BIG_ENDIAN    PTXD_STRUC      pDestTxD;    TXD_STRUC       TxD;#endif    PCHAR           pBeaconFrame = pAd->BeaconBuf;    PUCHAR			pOutBuffer = NULL;    LARGE_INTEGER   Tsf;    NDIS_STATUS		NStatus;#ifndef BIG_ENDIAN	pTxD = &pAd->BeaconTxD;#else    pDestTxD  = &pAd->BeaconTxD;    TxD = *pDestTxD;    pTxD = &TxD;    RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD);#endif    DBGPRINT(RT_DEBUG_TRACE, "SYNC - driver sent BEACON (len=%d)...\n",pTxD->DataByteCnt);    NStatus = MlmeAllocateMemory(pAd, (PVOID *)&pOutBuffer);  //Get an unused nonpaged memory	if (NStatus != NDIS_STATUS_SUCCESS) 	{		DBGPRINT(RT_DEBUG_TRACE, "EnqueueBeaconFrame allocate memory fail\n");		return;	}	    RTUSBReadMACRegister(pAd, TXRX_CSR13, &Tsf.vv.HighPart);    RTUSBReadMACRegister(pAd, TXRX_CSR12, &Tsf.vv.LowPart);        // TODO: not good if porting to big endian platform - TSF byte order ???    NdisMoveMemory(pBeaconFrame + sizeof(HEADER_802_11), &Tsf, TIMESTAMP_LEN);	NdisMoveMemory(pOutBuffer, pBeaconFrame, 256);	MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, pTxD->DataByteCnt);	#ifdef BIG_ENDIAN    RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD);    WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, FALSE, TYPE_TXD);#endif}/*     ==========================================================================    Description:    ========================================================================== */VOID EnqueueProbeRequest(    IN PRTMP_ADAPTER pAd) {    PUCHAR          pOutBuffer;    ULONG           FrameLen = 0;    HEADER_802_11   Hdr80211;    USHORT          NStatus;        DBGPRINT(RT_DEBUG_TRACE, "force out a ProbeRequest ...\n");        NStatus = MlmeAllocateMemory(pAd, (PVOID *)&pOutBuffer);  //Get an unused nonpaged memory    if (NStatus != NDIS_STATUS_SUCCESS)    {        DBGPRINT(RT_DEBUG_TRACE, "EnqueueProbeRequest() allocate memory fail\n");        return;    }        else    {        MgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, BROADCAST_ADDR, BROADCAST_ADDR);		// this ProbeRequest explicitly specify SSID to reduce unwanted ProbeResponse        MakeOutgoingFrame(pOutBuffer,                     &FrameLen,                          sizeof(HEADER_802_11),          &Hdr80211,                          1,                              &SsidIe,                          1,                              &pAd->PortCfg.SsidLen,                          pAd->PortCfg.SsidLen,		      pAd->PortCfg.Ssid,                          1,                              &SupRateIe,                          1,                              &pAd->ActiveCfg.SupRateLen,                          pAd->ActiveCfg.SupRateLen,      pAd->ActiveCfg.SupRate,                           END_OF_ARGS);	    if (pAd->PortCfg.bGetAPConfig)         	    {            	 	    UCHAR RalinkSpecificIEForGetCfg[6] = {IE_VENDOR_SPECIFIC, 4, 0x00, 0x0c, 0x43, 0x80};            		    ULONG Tmp = 0;            		    MakeOutgoingFrame(pOutBuffer + FrameLen,        &Tmp,                              			  

⌨️ 快捷键说明

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