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

📄 sync.c

📁 台湾RALink公司的 rt2570无线 802.11g 网卡的 驱动的源代码 ,支持linux2.4以上的 内河
💻 C
📖 第 1 页 / 共 5 页
字号:
    IN PRT2570ADAPTER pAd, 
    IN MLME_QUEUE_ELEM *Elem) 
{
    DBGPRINT(RT_DEBUG_TRACE, "SYNC - BeaconTimeoutAtJoinAction\n");
    pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
    MlmeCntlConfirm(pAd, MT2_JOIN_CONF, MLME_REJ_TIMEOUT);
}

/* 
    ==========================================================================
    Description:
        Scan timeout procedure. basically add channel index by 1 and rescan
    ==========================================================================
 */
VOID ScanTimeoutAction(
    IN PRT2570ADAPTER pAd, 
    IN MLME_QUEUE_ELEM *Elem) 
{
    if (pAd->Mlme.SyncMachine.CurrState == SCAN_LISTEN)//MLME could have been reset. Make sure this is not the case before going on. 
    {
        pAd->Mlme.SyncAux.Channel = NextChannel(pAd, pAd->Mlme.SyncAux.Channel);
        ScanNextChannel(pAd);
    }
}

/* 
    ==========================================================================
    Description:
        Scan next channel
    ==========================================================================
 */
VOID ScanNextChannel(
    IN PRT2570ADAPTER pAd) 
{
	MACHDR          Hdr;
	UCHAR           SsidIe = IE_SSID, SuppRateIe = IE_SUPP_RATES;
	VOID           *OutBuffer = NULL;
	VOID           *OutBuffer2 = NULL;
	NDIS_STATUS     NStatus;
	ULONG           FrameLen = 0;
	UCHAR           SsidLen = 0;

	if ((pAd->Mlme.SyncAux.Channel == 0) ) 
	{
		DBGPRINT(RT_DEBUG_TRACE, "SYNC - End of SCAN, restore to channel %d, find %d BSS\n",pAd->PortCfg.Channel, pAd->PortCfg.BssTab.BssNr);
		AsicSwitchChannel(pAd, pAd->PortCfg.Channel);
		AsicLockChannel(pAd, pAd->PortCfg.Channel);

		pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
		MlmeCntlConfirm(pAd, MT2_SCAN_CONF, MLME_SUCCESS);
	}
	else if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS))
	{
		pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
		MlmeCntlConfirm(pAd, MT2_SCAN_CONF, MLME_FAIL_NO_RESOURCE);
	}
	else 
	{
		AsicSwitchChannel(pAd, pAd->Mlme.SyncAux.Channel);
		AsicLockChannel(pAd, pAd->Mlme.SyncAux.Channel);

        // Total SCAN time still limits within 3 sec (DDK constraint). 
        // TODO: We need more intelligent rules here to further improve out-of-service issue.
        // e.g. temporary stop copying NDIS packet to TxRing until SCAN complete

        // We need to shorten active scan time in order for WZC connect issue
        if (pAd->Mlme.SyncAux.ScanType == SCAN_ACTIVE) 
        {
		RTMPSetTimer(pAd, &pAd->Mlme.SyncAux.ScanTimer, ACTIVE_SCAN_TIME); 
        }
        else if (pAd->PortCfg.PhyMode == PHY_11ABG_MIXED)
        {
		RTMPSetTimer(pAd, &pAd->Mlme.SyncAux.ScanTimer, MIN_CHANNEL_TIME); 
        }
        else
    	{
		RTMPSetTimer(pAd, &pAd->Mlme.SyncAux.ScanTimer, MAX_CHANNEL_TIME); 
    	}
		
        MgtMacHeaderInit(pAd, &Hdr, SUBTYPE_PROBE_REQ, 0, &pAd->PortCfg.Broadcast, &pAd->PortCfg.Broadcast);
        // There is no need to send broadcast probe request if active scan is in effect.
        // The same rulr should apply to passive scan also.
        if (pAd->Mlme.SyncAux.ScanType == SCAN_PASSIVE) 
        {
            // Send the first probe request with empty SSID
            NStatus = MlmeAllocateMemory(pAd, (PVOID)&OutBuffer);  //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;
                MlmeCntlConfirm(pAd, MT2_SCAN_CONF, MLME_FAIL_NO_RESOURCE);
                return;
            }
            
            DBGPRINT(RT_DEBUG_INFO, "SYNC - send passive ProbeReq @ channel=%d...\n", pAd->Mlme.SyncAux.Channel);
            SsidLen = 0;
            MakeOutgoingFrame(OutBuffer,    &FrameLen,
                          sizeof(MACHDR),   (UCHAR*)&Hdr,
                          1,                &SsidIe,
                          1,                &SsidLen,  
                          1,                &SuppRateIe,
                          1,                &pAd->PortCfg.SupportedRatesLen,
                          pAd->PortCfg.SupportedRatesLen, pAd->PortCfg.SupportedRates, 
                          END_OF_ARGS);
            MiniportMMRequest(pAd, OutBuffer, FrameLen);
        }
        else if (pAd->Mlme.SyncAux.ScanType == SCAN_ACTIVE) 
        {
            // Allocate another for probe scan with SSID
            NStatus = MlmeAllocateMemory(pAd, (PVOID)&OutBuffer2);  //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;
                MlmeCntlConfirm(pAd, MT2_SCAN_CONF, MLME_FAIL_NO_RESOURCE);
                return;
            }
            // make another probe scan with SSID from mlme.cntlaux.ssid
            SsidLen = pAd->Mlme.SyncAux.SsidLen;
            MakeOutgoingFrame(OutBuffer2,       &FrameLen,
                              sizeof(MACHDR),   &Hdr,
                              1,                &SsidIe,
                              1,                &SsidLen,
                              SsidLen,          pAd->Mlme.SyncAux.Ssid,
                              1,                &SuppRateIe,
                              1,                &pAd->PortCfg.SupportedRatesLen,
                              pAd->PortCfg.SupportedRatesLen, pAd->PortCfg.SupportedRates, 
                              END_OF_ARGS);
            MiniportMMRequest(pAd, OutBuffer2, FrameLen);

            DBGPRINT(RT_DEBUG_INFO, "SYNC - send active ProbeReq @ channel=%d...\n", pAd->Mlme.SyncAux.Channel);
        }

        pAd->Mlme.SyncMachine.CurrState = SCAN_LISTEN;
    }
}

/* 
    ==========================================================================
    Description:
    ==========================================================================
 */
VOID InvalidStateWhenScan(
    IN PRT2570ADAPTER pAd, 
    IN MLME_QUEUE_ELEM *Elem) 
{
    DBGPRINT(RT_DEBUG_TRACE, "AYNC - InvalidStateWhenScan(state=%d). Reset SYNC machine\n", pAd->Mlme.SyncMachine.CurrState);
    pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
    MlmeCntlConfirm(pAd, MT2_SCAN_CONF, MLME_STATE_MACHINE_REJECT);
}

/* 
    ==========================================================================
    Description:
    ==========================================================================
 */
VOID InvalidStateWhenJoin(
    IN PRT2570ADAPTER pAd, 
    IN MLME_QUEUE_ELEM *Elem) 
{
    DBGPRINT(RT_DEBUG_TRACE, "InvalidStateWhenJoin(state=%d). Reset SYNC machine\n", pAd->Mlme.SyncMachine.CurrState);
    pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
    MlmeCntlConfirm(pAd, MT2_JOIN_CONF, MLME_STATE_MACHINE_REJECT);
}

/* 
    ==========================================================================
    Description:
    ==========================================================================
 */
VOID InvalidStateWhenStart(
    IN PRT2570ADAPTER pAd, 
    IN MLME_QUEUE_ELEM *Elem) 
{
    DBGPRINT(RT_DEBUG_TRACE, "InvalidStateWhenStart(state=%d). Reset SYNC machine\n", pAd->Mlme.SyncMachine.CurrState);
    pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
    MlmeCntlConfirm(pAd, MT2_START_CONF, MLME_STATE_MACHINE_REJECT);
}

/* 
    ==========================================================================
    Description:
    ==========================================================================
 */
VOID EnqueuePsPoll(
    IN PRT2570ADAPTER pAdapter) 
{
	PTX_CONTEXT pPsPollContext;
	PSPOLL_FRAME	*pPsPollFrame;
	
	if ((RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RESET_IN_PROGRESS)) ||
	    (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET)) ||
	    (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS)))
	{
		return;
	}
    
	pPsPollContext = &(pAdapter->PsPollContext);
	pPsPollFrame = (PSPOLL_FRAME*)pAdapter->PsPollContext.TransferBuffer->WirelessPacket;
	if (pPsPollContext->InUse == FALSE)
	{
		PTXD_STRUC  pTxD;
		    
		pPsPollContext->InUse = TRUE;

		pTxD  = &(pPsPollContext->TransferBuffer->TxDesc);
		NdisZeroMemory(pTxD, sizeof(TXD_STRUC));
		RTUSBWriteTxDescriptor(pTxD, FALSE, 0, FALSE, FALSE, TRUE, IFS_BACKOFF,
		    sizeof(PSPOLL_FRAME), FALSE, 0, CW_MIN_IN_BITS, CW_MAX_IN_BITS,
		    sizeof(PSPOLL_FRAME) + 4, pAdapter->PortCfg.MlmeRate, 4,
		    pAdapter->PortCfg.TxPreambleInUsed);

		pPsPollFrame->PwrMgmt = 0;

		// Fill out frame length information for global Bulk out arbitor
		pPsPollContext->BulkOutSize = sizeof(PS_POLL_BUFFER);
		RTUSB_SET_BULK_FLAG(pAdapter, fRTUSB_BULK_OUT_PSPOLL);

		// Kick bulk out 
		RTUSBKickBulkOut(pAdapter);
	}
}

/* 
    ==========================================================================
    Description:
        Send out a NULL frame to AP. The prpose is to inform AP this client 
        current PSM bit.
    NOTE:
        This routine should only be used in infrastructure mode.
    ==========================================================================
 */
VOID    EnqueueNullFrame(
    IN  PRT2570ADAPTER  pAdapter,
    IN  UCHAR           TxRate) 
{
	PTX_CONTEXT pNullContext;
	PTXD_STRUC      pTxD;
	HEADER_802_11	*pNullFrame;

	if ((RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RESET_IN_PROGRESS)) ||
	    (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BULKOUT_RESET)) ||
	    (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_HALT_IN_PROGRESS)) ||
	    (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_REMOVE_IN_PROGRESS)))
	{
		return;
	}
    
	// WPA 802.1x secured port control
	if (((pAdapter->PortCfg.AuthMode == Ndis802_11AuthModeWPA) || 
	    (pAdapter->PortCfg.AuthMode == Ndis802_11AuthModeWPAPSK)) &&
	    (pAdapter->PortCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED))
	{
		return;
	}
	pNullFrame = (HEADER_802_11*)pAdapter->NullContext.TransferBuffer->WirelessPacket;
	pNullContext = &(pAdapter->NullContext);
	if (pNullContext->InUse == FALSE)
	{
		// Set the in use bit
		pNullContext->InUse = TRUE;

		// Fill Null frame body and TxD
		pTxD  = &(pNullContext->TransferBuffer->TxDesc);
		NdisZeroMemory(pTxD, sizeof(TXD_STRUC));
		RTUSBWriteTxDescriptor(pTxD, FALSE, 7, TRUE, FALSE, TRUE, IFS_BACKOFF, sizeof(MACHDR), FALSE, 0, CW_MIN_IN_BITS, CW_MAX_IN_BITS, sizeof(MACHDR) + 4, TxRate, 4, pAdapter->PortCfg.TxPreambleInUsed);
		pNullFrame->Controlhead.Duration = RTUSBCalcDuration(pAdapter, TxRate, 14);
		pNullFrame->Controlhead.Frame.PwrMgt = (pAdapter->PortCfg.Psm == PWR_SAVE);     
		DBGPRINT(RT_DEBUG_TRACE, "SYNC - send NULL Frame @%d Mbps...\n", RateIdToMbps[TxRate]);

		// Fill out frame length information for global Bulk out arbitor
		pNullContext->BulkOutSize = sizeof(TXD_STRUC) + sizeof(HEADER_802_11);
		RTUSB_SET_BULK_FLAG(pAdapter, fRTUSB_BULK_OUT_DATA_NULL);

		// Kick bulk out 
		RTUSBKickBulkOut(pAdapter);
	}
}

/* 
    ==========================================================================
    Description:
        Update PortCfg->ChannelList[] according to 1) Country Region 2) RF IC type,
        and 3) PHY-mode user selected.
        The outcome is used by driver when doing site survey.
    ==========================================================================
 */
VOID BuildChannelList(
    IN PRT2570ADAPTER pAd)
{
    UCHAR i,  index 

⌨️ 快捷键说明

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