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

📄 sync.c

📁 r73模块的无线网卡在Linux下的驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
        // Start a new IBSS. All IBSS parameters are decided now....        //        pAd->MlmeAux.BssType           = BSS_ADHOC;        memcpy(pAd->MlmeAux.Ssid, Ssid, SsidLen);        pAd->MlmeAux.SsidLen           = SsidLen;        // generate a radom number as BSSID        MacAddrRandomBssid(pAd, pAd->MlmeAux.Bssid);        Privacy = (pAd->PortCfg.WepStatus == Ndis802_11Encryption1Enabled) ||                  (pAd->PortCfg.WepStatus == Ndis802_11Encryption2Enabled) ||                  (pAd->PortCfg.WepStatus == Ndis802_11Encryption3Enabled);        pAd->MlmeAux.CapabilityInfo    = CAP_GENERATE(0,1,Privacy, (pAd->PortCfg.TxPreamble == Rt802_11PreambleShort), 1);        pAd->MlmeAux.BeaconPeriod      = pAd->PortCfg.BeaconPeriod;        pAd->MlmeAux.AtimWin           = pAd->PortCfg.AtimWin;        pAd->MlmeAux.Channel           = pAd->PortCfg.Channel;        pAd->MlmeAux.SupRateLen= pAd->PortCfg.SupRateLen;        memcpy(pAd->MlmeAux.SupRate, pAd->PortCfg.SupRate, MAX_LEN_OF_SUPPORTED_RATES);        RTMPCheckRates(pAd, pAd->MlmeAux.SupRate, &pAd->MlmeAux.SupRateLen);        pAd->MlmeAux.ExtRateLen = pAd->PortCfg.ExtRateLen;        memcpy(pAd->MlmeAux.ExtRate, pAd->PortCfg.ExtRate, MAX_LEN_OF_SUPPORTED_RATES);        RTMPCheckRates(pAd, pAd->MlmeAux.ExtRate, &pAd->MlmeAux.ExtRateLen);        // temporarily not support QOS in IBSS        memset(&pAd->MlmeAux.APEdcaParm, 0, sizeof(EDCA_PARM));        memset(&pAd->MlmeAux.APQbssLoad, 0, sizeof(QBSS_LOAD_PARM));        memset(&pAd->MlmeAux.APQosCapability, 0, sizeof(QOS_CAPABILITY_PARM));        AsicSwitchChannel(pAd, pAd->MlmeAux.Channel);        AsicLockChannel(pAd, pAd->MlmeAux.Channel);        DBGPRINT(RT_DEBUG_TRACE, "SYNC - MlmeStartReqAction(ch= %d,sup rates= %d, ext rates=%d)\n",            pAd->MlmeAux.Channel, pAd->MlmeAux.SupRateLen, pAd->MlmeAux.ExtRateLen);#ifdef	SINGLE_ADHOC_LINKUP		// Add itself as the entry within BSS table		Bssidx = BssTableSearch(&pAd->ScanTab, pAd->MlmeAux.Bssid, pAd->MlmeAux.Channel);		if (Bssidx == BSS_NOT_FOUND)		{			Bssidx = BssTableSetEntry(pAd, &pAd->ScanTab, pAd->MlmeAux.Bssid,				Ssid, SsidLen, pAd->MlmeAux.BssType, pAd->MlmeAux.BeaconPeriod,				&CfParm, pAd->MlmeAux.AtimWin, pAd->MlmeAux.CapabilityInfo,				pAd->MlmeAux.SupRate, pAd->MlmeAux.SupRateLen, pAd->MlmeAux.ExtRate, pAd->MlmeAux.ExtRateLen,				pAd->MlmeAux.Channel, pAd->BbpRssiToDbmDelta - 30, TimeStamp, 0, NULL, NULL, NULL, 0, pVIE);		}#endif        pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;        Status = MLME_SUCCESS;        MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_START_CONF, 2, &Status);    }    else    {        DBGPRINT_ERR("SYNC - MlmeStartReqAction() sanity check fail.\n");        pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;        Status = MLME_INVALID_FORMAT;        MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_START_CONF, 2, &Status);    }}/*    ==========================================================================    Description:        peer sends beacon back when scanning    ========================================================================== */VOID PeerBeaconAtScanAction(    IN PRTMP_ADAPTER pAd,    IN MLME_QUEUE_ELEM *Elem){    UCHAR           Bssid[MAC_ADDR_LEN], Addr2[MAC_ADDR_LEN];    UCHAR           Ssid[MAX_LEN_OF_SSID], BssType, Channel, NewChannel,                    SsidLen, DtimCount, DtimPeriod, BcastFlag, MessageToMe;    CF_PARM         CfParm;    USHORT          BeaconPeriod, AtimWin, CapabilityInfo;    PFRAME_802_11   pFrame;    LARGE_INTEGER   TimeStamp;    UCHAR           Erp;	UCHAR         	SupRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRate[MAX_LEN_OF_SUPPORTED_RATES];	UCHAR		  	SupRateLen, ExtRateLen;	UCHAR			LenVIE;	UCHAR			CkipFlag;	UCHAR			AironetCellPowerLimit;	EDCA_PARM       EdcaParm;	QBSS_LOAD_PARM  QbssLoad;	QOS_CAPABILITY_PARM QosCapability;    ULONG           RalinkIe;	UCHAR						VarIE[MAX_VIE_LEN];		// Total VIE length = MAX_VIE_LEN - -5	NDIS_802_11_VARIABLE_IEs	*pVIE = NULL;	DBGPRINT(RT_DEBUG_TRACE, "--> %s\n", __FUNCTION__);    // NdisFillMemory(Ssid, MAX_LEN_OF_SSID, 0x00);    pFrame = (PFRAME_802_11) Elem->Msg;	// Init Variable IE structure	pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE;	pVIE->Length = 0;    if (PeerBeaconAndProbeRspSanity(pAd,                                Elem->Msg,                                Elem->MsgLen,                                Addr2,                                Bssid,                                Ssid,                                &SsidLen,                                &BssType,                                &BeaconPeriod,                                &Channel,                                &NewChannel,                                &TimeStamp,                                &CfParm,                                &AtimWin,                                &CapabilityInfo,                                &Erp,                                &DtimCount,                                &DtimPeriod,                                &BcastFlag,                                &MessageToMe,                                SupRate,                                &SupRateLen,                                ExtRate,                                &ExtRateLen,                                &CkipFlag,                                &AironetCellPowerLimit,                                &EdcaParm,                                &QbssLoad,                                &QosCapability,                                &RalinkIe,                                &LenVIE,                                pVIE))    {        ULONG Idx;        UCHAR Rssi = 0;        CHAR  RealRssi;        // This correct im-proper RSSI indication during SITE SURVEY issue.        // Always report bigger RSSI during SCANNING when receiving multiple BEACONs from the same AP.        // This case happens because BEACONs come from adjacent channels, so RSSI become weaker as we        // switch to more far away channels.		if (Elem->Channel != Channel)			return;        Idx = BssTableSearch(&pAd->ScanTab, Bssid, Channel);        if (Idx != BSS_NOT_FOUND)            Rssi = pAd->ScanTab.BssEntry[Idx].Rssi;	    RealRssi = ConvertToRssi(pAd, Elem->Rssi, RSSI_NO_1);	    if ((RealRssi + pAd->BbpRssiToDbmDelta) > Rssi)	        Rssi = RealRssi + pAd->BbpRssiToDbmDelta;//        DBGPRINT(RT_DEBUG_TRACE, "SYNC - PeerBeaconAtScanAction (SubType=%d, SsidLen=%d, Ssid=%s)\n", pFrame->Hdr.FC.SubType, SsidLen,Ssid);        // Back Door Mechanism: Get AP Cfg Data        if (pAd->PortCfg.bGetAPConfig)	{		CHAR CfgData[MAX_CFG_BUFFER_LEN+1] = {0};		if (BackDoorProbeRspSanity(pAd, Elem->Msg, Elem->MsgLen, CfgData))		{			DBGPRINT(RT_DEBUG_ERROR, "- %s: CfgData(len:%d): %s\n",					__FUNCTION__, (int)strlen(CfgData), CfgData);			pAd->PortCfg.bGetAPConfig = FALSE;		}	}        Idx = BssTableSetEntry(pAd, &pAd->ScanTab, Bssid, Ssid, SsidLen, BssType,                    BeaconPeriod, &CfParm, AtimWin, CapabilityInfo, SupRate,                    SupRateLen, ExtRate, ExtRateLen, Channel, Rssi, TimeStamp, CkipFlag,                    &EdcaParm, &QosCapability, &QbssLoad, LenVIE, pVIE);    }    // sanity check fail, ignored}/*    ==========================================================================    Description:        When waiting joining the (I)BSS, beacon received from external    ========================================================================== */VOID PeerBeaconAtJoinAction(    IN PRTMP_ADAPTER pAd,    IN MLME_QUEUE_ELEM *Elem){    UCHAR         Bssid[MAC_ADDR_LEN], Addr2[MAC_ADDR_LEN];    UCHAR         Ssid[MAX_LEN_OF_SSID], SsidLen, BssType, Channel, MessageToMe,                  DtimCount, DtimPeriod, BcastFlag, NewChannel;    LARGE_INTEGER TimeStamp;    USHORT        BeaconPeriod, AtimWin, CapabilityInfo;//    UINT          FrameLen = 0;    CF_PARM       Cf;    UCHAR         Erp;	UCHAR         SupRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRate[MAX_LEN_OF_SUPPORTED_RATES];	UCHAR		  SupRateLen, ExtRateLen;	UCHAR         CkipFlag;	UCHAR		  LenVIE;	UCHAR		  AironetCellPowerLimit;	EDCA_PARM       EdcaParm;	QBSS_LOAD_PARM  QbssLoad;	QOS_CAPABILITY_PARM QosCapability;    USHORT        Status;	CHAR	        RealRssi = -85; //assume -85 dB	UCHAR						VarIE[MAX_VIE_LEN];		// Total VIE length = MAX_VIE_LEN - -5	NDIS_802_11_VARIABLE_IEs	*pVIE = NULL;    ULONG           RalinkIe;    ULONG           Idx;	UCHAR   		PeerTxType;	DBGPRINT(RT_DEBUG_TRACE, "--> %s\n", __FUNCTION__);	// Init Variable IE structure	pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE;	pVIE->Length = 0;    if (PeerBeaconAndProbeRspSanity(pAd,                                Elem->Msg,                                Elem->MsgLen,                                Addr2,                                Bssid,                                Ssid,                                &SsidLen,                                &BssType,                                &BeaconPeriod,                                &Channel,                                &NewChannel,                                &TimeStamp,                                &Cf,                                &AtimWin,                                &CapabilityInfo,                                &Erp,                                &DtimCount,                                &DtimPeriod,                                &BcastFlag,                                &MessageToMe,                                SupRate,                                &SupRateLen,                                ExtRate,                                &ExtRateLen,                                &CkipFlag,                                &AironetCellPowerLimit,                                &EdcaParm,                                &QbssLoad,                                &QosCapability,                                &RalinkIe,                                &LenVIE,                                pVIE))    {		// Disqualify 11b only adhoc when we are in 11g only adhoc mode		if (BssType == BSS_ADHOC)		{			PeerTxType = PeerTxTypeInUseSanity(Channel, SupRate, SupRateLen, ExtRate, ExtRateLen);			if ((pAd->PortCfg.AdhocMode == ADHOC_11G) && (PeerTxType == CCK_RATE))			{				return;			}			else if ((pAd->PortCfg.AdhocMode == ADHOC_11B) && (PeerTxType == OFDM_RATE))			{			    return;			}		}		// BEACON from desired BSS/IBSS found. We should be able to decide most		// BSS parameters here.		// Q. But what happen if this JOIN doesn't conclude a successful ASSOCIATEION?		//    Do we need to receover back all parameters belonging to previous BSS?		// A. Should be not. There's no back-door recover to previous AP. It still need		//    a new JOIN-AUTH-ASSOC sequence.		if (MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, Bssid))        {            DBGPRINT(RT_DEBUG_TRACE, "SYNC (%s) - receive desired BEACON Chan=%d\n", __FUNCTION__, Channel);		    RTMPCancelTimer(&pAd->MlmeAux.BeaconTimer);	        RealRssi = ConvertToRssi(pAd, Elem->Rssi, RSSI_NO_1);	        pAd->PortCfg.LastRssi = RealRssi + pAd->BbpRssiToDbmDelta;	        pAd->PortCfg.AvgRssi  = pAd->PortCfg.LastRssi;	        pAd->PortCfg.AvgRssiX8 = pAd->PortCfg.AvgRssi << 3;			//			// We need to check if SSID only set to any, then we can record the current SSID.			// Otherwise will cause hidden SSID association failed.			//			if (pAd->MlmeAux.SsidLen == 0)			{	           	memcpy(pAd->MlmeAux.Ssid, Ssid, SsidLen);	           	pAd->MlmeAux.SsidLen = SsidLen;			}			else			{				Idx = BssSsidTableSearch(&pAd->ScanTab, Bssid, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen, Channel);				if (Idx != BSS_NOT_FOUND)				{					//					// Multiple SSID case, used correct CapabilityInfo					//					CapabilityInfo = pAd->ScanTab.BssEntry[Idx].CapabilityInfo;				}			}           	pAd->MlmeAux.CapabilityInfo = CapabilityInfo & SUPPORTED_CAPABILITY_INFO;            pAd->MlmeAux.BssType = BssType;            pAd->MlmeAux.BeaconPeriod = BeaconPeriod;            pAd->MlmeAux.Channel = Channel;            pAd->MlmeAux.AtimWin = AtimWin;            pAd->MlmeAux.CfpPeriod = Cf.CfpPeriod;            pAd->MlmeAux.CfpMaxDuration = Cf.CfpMaxDuration;            pAd->MlmeAux.APRalinkIe = RalinkIe;            // Copy AP's supported rate to MlmeAux for creating assoication request            // Also filter out not supported rate            pAd->MlmeAux.SupRateLen = SupRateLen;            memcpy(pAd->MlmeAux.SupRate, SupRate, SupRateLen);			RTMPCheckRates(pAd, pAd->MlmeAux.SupRate, &pAd->MlmeAux.SupRateLen);            pAd->MlmeAux.ExtRateLen = ExtRateLen;            memcpy(pAd->MlmeAux.ExtRate, ExtRate, ExtRateLen);			RTMPCheckRates(pAd, pAd->MlmeAux.ExtRate, &pAd->MlmeAux.ExtRateLen);			//			// Update MlmeRate & RtsRate.			// We need to update those rates, for example on Roaming A to B,			// MlmeRate will be RATE_6(OFDM) on 11A, but when roam to B.			// RATE_6 can't be recognized by 11B AP and vice versa.			//			PeerTxType = PeerTxTypeInUseSanity(Channel, SupRate, SupRateLen, ExtRate, ExtRateLen);			switch (PeerTxType)			{				case CCK_RATE: //CCK				case CCKOFDM_RATE: //CCK + OFDM					pAd->PortCfg.MlmeRate = RATE_2;					pAd->PortCfg.RtsRate = RATE_2;					break;				case OFDM_RATE: //OFDM					pAd->PortCfg.MlmeRate = RATE_6;

⌨️ 快捷键说明

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