📄 sync.c
字号:
// 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 + -