📄 sync.c
字号:
pAd->PortCfg.SupportedRates[pAd->PortCfg.SupportedRatesLen] = Rates[i];
pAd->PortCfg.SupportedRatesLen ++;
}
else if ((Rate == 2 || Rate == 4 || Rate == 11 || Rate == 22) ||
(Rate == 12 || Rate == 18 || Rate == 24 || Rate == 36) ||
(Rate == 48 || Rate == 72 || Rate == 96 || Rate == 108))
{
// DBGPRINT(RT_DEBUG_TRACE, ("SYNC - Supported Rate[%d] = 0x%02x\n",pAd->PortCfg.SupportedRatesLen, Rates[i]));
pAd->PortCfg.SupportedRates[pAd->PortCfg.SupportedRatesLen] = Rates[i];
pAd->PortCfg.SupportedRatesLen ++;
}
}
}
// Copy AP's supported rate to portcfg for creating assoication request
// Also filter out not supported rate
// Supported rate
{
int i;
pAd->PortCfg.SupRateLen = 0;
for (i = 0; i < SupRateLen; i++)
{
UCHAR Rate = SupRate[i] & 0x7f;
if ((pAd->PortCfg.PhyMode == PHY_11B) &&
(Rate == 2 || Rate == 4 || Rate == 11 || Rate == 22))
{
pAd->PortCfg.SupRate[pAd->PortCfg.SupRateLen] = SupRate[i];
pAd->PortCfg.SupRateLen ++;
}
else if ((Rate == 2 || Rate == 4 || Rate == 11 || Rate == 22) ||
(Rate == 12 || Rate == 18 || Rate == 24 || Rate == 36) ||
(Rate == 48 || Rate == 72 || Rate == 96 || Rate == 108))
{
pAd->PortCfg.SupRate[pAd->PortCfg.SupRateLen] = SupRate[i];
pAd->PortCfg.SupRateLen ++;
}
}
}
// Copy AP's supported rate to portcfg for creating assoication request
// Also filter out not supported rate
// Extended rate
if (ExtendedRateIeExist == TRUE)
{
int i;
pAd->PortCfg.ExtRateLen = 0;
for (i = 0; i < ExtRateLen; i++)
{
UCHAR Rate = ExtRate[i] & 0x7f;
if ((pAd->PortCfg.PhyMode == PHY_11B) &&
(Rate == 2 || Rate == 4 || Rate == 11 || Rate == 22))
{
pAd->PortCfg.ExtRate[pAd->PortCfg.ExtRateLen] = ExtRate[i];
pAd->PortCfg.ExtRateLen ++;
}
else if ((Rate == 2 || Rate == 4 || Rate == 11 || Rate == 22) ||
(Rate == 12 || Rate == 18 || Rate == 24 || Rate == 36) ||
(Rate == 48 || Rate == 72 || Rate == 96 || Rate == 108))
{
pAd->PortCfg.ExtRate[pAd->PortCfg.ExtRateLen] = ExtRate[i];
pAd->PortCfg.ExtRateLen ++;
}
}
}
else
{
pAd->PortCfg.ExtRateLen = 0;
}
DBGPRINT(RT_DEBUG_TRACE, "SYNC - AP's SupportedRatesLen=%d, set STA's SupportedRateLen=%d\n",
RatesLen, pAd->PortCfg.SupportedRatesLen);
// Mask out unnecessary capability information
CapabilityInfo &= SUPPORTED_CAPABILITY_INFO;
// Check for 802.11g information, if 802.11 b/g mixed mode.
// We can't support its short preamble for now.
pAd->PortCfg.CapabilityInfo = CapabilityInfo;
if ((BssType == BSS_INDEP) && (CAP_IS_IBSS_ON(CapabilityInfo)))
{
pAd->PortCfg.AtimWin = AtimWin;
}
else if (BssType == BSS_INFRA)
{
pAd->PortCfg.CfpPeriod = Cf.CfpPeriod;
pAd->PortCfg.CfpMaxDuration = Cf.CfpMaxDuration;
pAd->PortCfg.CfpDurRemain = Cf.CfpDurRemaining;
pAd->PortCfg.CfpCount = Cf.CfpCount;
pAd->PortCfg.CfpPeriod = Cf.CfpPeriod;
AsicEnableBssSync(pAd);
}
pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
MlmeCntlConfirm(pAd, MT2_JOIN_CONF, MLME_SUCCESS);
}
// not to me BEACON, ignored
}
// sanity check fail, ignore this frame
}
/*
==========================================================================
Description:
receive BEACON from peer
==========================================================================
*/
VOID PeerBeacon(
IN PRT2570ADAPTER pAd,
IN MLME_QUEUE_ELEM *Elem)
{
MACADDR Bssid, Addr2;
CHAR Ssid[MAX_LEN_OF_SSID];
CF_PARM CfParm;
UCHAR SsidLen, MessageToMe=0, BssType, Channel, Rates[MAX_LEN_OF_SUPPORTED_RATES];
UCHAR RatesLen, DtimCount=0, DtimPeriod=0, BcastFlag=0, Legacy;
USHORT CapabilityInfo, AtimWin, BeaconPeriod;
LARGE_INTEGER TimeStamp;
BOOLEAN CfExist = FALSE;
USHORT TbttNumToNextWakeUp;
BOOLEAN ExtendedRateIeExist;
UCHAR Erp;
UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRate[MAX_LEN_OF_SUPPORTED_RATES];
UCHAR SupRateLen, ExtRateLen;
UCHAR LenVIE;
// New for WPA security suites
UCHAR VarIE[MAX_VIE_LEN]; // Total VIE length = MAX_VIE_LEN - -5
NDIS_802_11_VARIABLE_IEs *pVIE = NULL;
if (!INFRA_ON(pAd) && !ADHOC_ON(pAd))
{ // return;
}
// 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,
&TimeStamp,
&CfExist,
&CfParm,
&AtimWin,
&CapabilityInfo,
Rates,
&RatesLen,
&ExtendedRateIeExist,
&Erp,
&DtimCount,
&DtimPeriod,
&BcastFlag,
&MessageToMe,
&Legacy,
SupRate,
&SupRateLen,
ExtRate,
&ExtRateLen,
&LenVIE,
pVIE))
{
BOOLEAN is_my_bssid, is_my_ssid;
ULONG Bssidx, Now;
BSS_ENTRY *pBss;
// Init Variable IE structure
pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE;
pVIE->Length = 0;
is_my_bssid = (MAC_ADDR_EQUAL(&Bssid, &pAd->PortCfg.Bssid) ? TRUE : FALSE);
is_my_ssid = (((pAd->PortCfg.SsidLen == SsidLen) && RTMPEqualMemory(Ssid, pAd->PortCfg.Ssid, (ULONG) SsidLen)) ? TRUE : FALSE);
// Mask out unnecessary capability information
CapabilityInfo &= SUPPORTED_CAPABILITY_INFO;
// ignore BEACON not for my SSID
if ((! is_my_ssid) && (! is_my_bssid))
{
return;
}
//
// Housekeeping "SsidBssTab" table for later-on ROAMing usage.
//
Bssidx = BssTableSearch(&pAd->Mlme.CntlAux.SsidBssTab, &Bssid);
if (Bssidx == BSS_NOT_FOUND)
{
// Return immediately when in transition process when changing association
// Found this bug when doing WHQL ad-hoc test case
if (pAd->PortCfg.SsidLen != pAd->Mlme.CntlAux.SsidLen)
return;
if (!RTMPEqualMemory(pAd->PortCfg.Ssid, pAd->Mlme.CntlAux.Ssid, pAd->PortCfg.SsidLen))
return;
// discover new AP of this network, create BSS entry
Bssidx = BssTableSetEntry(pAd, &pAd->Mlme.CntlAux.SsidBssTab, &Bssid, Ssid, SsidLen,
BssType, BeaconPeriod, CfExist, &CfParm, AtimWin, CapabilityInfo,
Rates, RatesLen, ExtendedRateIeExist, Channel, Elem->Rssi, TimeStamp, LenVIE, pVIE);
if (Bssidx == BSS_NOT_FOUND) // return if BSS table full
return;
DBGPRINT(RT_DEBUG_TRACE, "SYNC - New AP added to SsidBssTab[%d], RSSI=%d, MAC=%02x:%02x:%02x:%02x:%02x:%02x\n",
Bssidx, Elem->Rssi, Bssid.Octet[0], Bssid.Octet[1], Bssid.Octet[2],
Bssid.Octet[3], Bssid.Octet[4], Bssid.Octet[5]);
}
// if the ssid matched & bssid unmatched, we should select the bssid with large value.
// This might happened when two STA start at the same time
if (is_my_ssid && (! is_my_bssid) && ADHOC_ON(pAd))
{
INT i;
// Add to safe guard adhoc wep status mismatch
if (pAd->PortCfg.WepStatus != pAd->Mlme.CntlAux.SsidBssTab.BssEntry[Bssidx].WepStatus)
return;
// link down the one with smaller BSSID value.
for (i = 0; i < 6; i++)
{
if (Bssid.Octet[i] > pAd->PortCfg.Bssid.Octet[i])
{
AsicDisableSync(pAd);
NdisMoveMemory(&pAd->PortCfg.Bssid, &Bssid, 6);
AsicSetBssid(pAd, &pAd->PortCfg.Bssid);
AsicEnableIbssSync(pAd);
break;
}
}
}
DBGPRINT(RT_DEBUG_INFO, "SYNC - PeerBeacon from %02x:%02x:%02x:%02x:%02x:%02x - Dtim=%d/%d, Rssi=%02x\n",
Bssid.Octet[0], Bssid.Octet[1], Bssid.Octet[2],
Bssid.Octet[3], Bssid.Octet[4], Bssid.Octet[5],
DtimCount, DtimPeriod, Elem->Rssi);
Now = jiffies;
pBss = &pAd->Mlme.CntlAux.SsidBssTab.BssEntry[Bssidx];
pBss->Rssi = Elem->Rssi; // lastest RSSI
pBss->LastBeaconRxTime = Now; // last RX timestamp
//
// BEACON from my BSSID - either IBSS or INFRA network
//
if (is_my_bssid)
{
// 2002/12/06 - patch Abocom AP bug, which forgets to set "Privacy" bit in
// AssocRsp even though this bit is ON in Beacon. So we update according
// to following Beacon frame.
// pAd->PortCfg.PrivacyInvoked = CAP_IS_PRIVACY_ON(CapabilityInfo);
pAd->PortCfg.LastBeaconRxTime = Now;
#if 1
// at least one 11b peer joined. downgrade the MaxTxRate to 11Mbps
// after last 11b peer left for several seconds, we'll auto switch back to 11G rate
// in MlmePeriodicExec()
if (ADHOC_ON(pAd) && (RatesLen <= 4))
{
// this timestamp is for MlmePeriodicExec() to check if all 11B peers have left
pAd->PortCfg.Last11bBeaconRxTime = Now;
if (pAd->PortCfg.MaxTxRate > RATE_11)
{
DBGPRINT(RT_DEBUG_TRACE, "SYNC - 11b peer joined. down-grade to 11b TX rates \n");
NdisMoveMemory(pAd->PortCfg.SupportedRates, Rates, MAX_LEN_OF_SUPPORTED_RATES);
pAd->PortCfg.SupportedRatesLen = RatesLen;
MlmeUpdateTxRates(pAd, FALSE);
MakeIbssBeacon(pAd); // supported rates changed
}
}
#endif
// check if RSSI reaches threshold
pAd->PortCfg.LastRssi = (pAd->PortCfg.LastRssi + Elem->Rssi) / 2;
pAd->PortCfg.AvgRssi = (pAd->PortCfg.AvgRssi * 7 + Elem->Rssi) >> 3;
if ((pAd->PortCfg.RssiTriggerMode == RSSI_TRIGGERED_UPON_BELOW_THRESHOLD) &&
(pAd->PortCfg.LastRssi < pAd->PortCfg.RssiTrigger))
{
NdisMIndicateStatus(pAd->AdapterHandle, NDIS_STATUS_MEDIA_SPECIFIC_INDICATION, &Dbm, sizeof(NDIS_802_11_RSSI));
}
else if ((pAd->PortCfg.RssiTriggerMode == RSSI_TRIGGERED_UPON_EXCCEED_THRESHOLD) &&
(pAd->PortCfg.LastRssi > pAd->PortCfg.RssiTrigger))
{
//NDIS_802_11_RSSI Dbm = pAd->PortCfg.LastRssi - pAd->BBPTuningParameters.RSSIToDbmOffset;
NdisMIndicateStatus(pAd->AdapterHandle, NDIS_STATUS_MEDIA_SPECIFIC_INDICATION, &Dbm, sizeof(NDIS_802_11_RSSI));
//DBGPRINT(RT_DEBUG_TRACE, "SYNC - NdisMIndicateStatus *** RSSI %d dBm, greater than threshold %d dBm\n",
// Dbm, pAd->PortCfg.RssiTrigger - pAd->BBPTuningParameters.RSSIToDbmOffset);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -