Bug 2201: Simulation fails when active probing is used in 802.11n/ac with channel bonding enabled

This commit is contained in:
Sébastien Deronne
2015-11-22 22:51:53 +01:00
parent dc841819cc
commit 4b99141022
3 changed files with 24 additions and 9 deletions

View File

@@ -54,6 +54,7 @@ Bugs fixed
- Bug 2183 - LiIonEnergySourceHelper is not in the energy wscript
- Bug 2185 - WiFi MacLow may respond to errored frames that it should ignore
- Bug 2195 - Udp[*]Client can't send packets to broadcast address
- Bug 2201 - Simulation fails when active probing is used in 802.11n/ac with channel bonding enabled
- Bug 2207 - Print node ID and time when printing routing tables
- Bug 2206 - Split internet-apps from applications
- Bug 2208 - Interface index based L4 protocols

View File

@@ -541,6 +541,18 @@ StaWifiMac::Receive (Ptr<Packet> packet, const WifiMacHeader *hdr)
return;
}
}
for (uint32_t i = 0; i < m_phy->GetNModes (); i++)
{
WifiMode mode = m_phy->GetMode (i);
if (rates.IsSupportedRate (mode.GetDataRate (m_phy->GetChannelWidth (), false, 1)))
{
m_stationManager->AddSupportedMode (hdr->GetAddr2 (), mode);
if (rates.IsBasicRate (mode.GetDataRate (m_phy->GetChannelWidth (), false, 1)))
{
m_stationManager->AddBasicMode (mode);
}
}
}
SetBssid (hdr->GetAddr3 ());
Time delay = MicroSeconds (probeResp.GetBeaconIntervalUs () * m_maxMissedBeacons);
RestartBeaconWatchdog (delay);

View File

@@ -1003,8 +1003,9 @@ WifiRemoteStationManager::GetControlAnswerMode (Mac48Address address, WifiMode r
//First, search the BSS Basic Rate set
for (WifiModeListIterator i = m_bssBasicRateSet.begin (); i != m_bssBasicRateSet.end (); i++)
{
if ((!found || i->GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1) > mode.GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1))
&& (i->GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1) <= reqMode.GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1))
if ((!found || i->GetPhyRate (m_wifiPhy->GetChannelWidth (), 0, 1) > mode.GetPhyRate (m_wifiPhy->GetChannelWidth (), 0, 1))
&& (i->GetPhyRate (m_wifiPhy->GetChannelWidth (), 0, 1) <= reqMode.GetPhyRate (m_wifiPhy->GetChannelWidth (), 0, 1))
&& (i->GetConstellationSize (1) <= reqMode.GetConstellationSize (1))
&& ((i->GetModulationClass () == reqMode.GetModulationClass ())
|| (reqMode.GetModulationClass () == WIFI_MOD_CLASS_HT)
|| (reqMode.GetModulationClass () == WIFI_MOD_CLASS_VHT)))
@@ -1024,8 +1025,8 @@ WifiRemoteStationManager::GetControlAnswerMode (Mac48Address address, WifiMode r
mode = GetDefaultMcs ();
for (WifiModeListIterator i = m_bssBasicMcsSet.begin (); i != m_bssBasicMcsSet.end (); i++)
{
if ((!found || i->GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1) > mode.GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1))
&& i->GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1) <= reqMode.GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1))
if ((!found || i->GetPhyRate (m_wifiPhy->GetChannelWidth (), 0, 1) > mode.GetPhyRate (m_wifiPhy->GetChannelWidth (), 0, 1))
&& i->GetPhyRate (m_wifiPhy->GetChannelWidth (), 0, 1) <= reqMode.GetPhyRate (m_wifiPhy->GetChannelWidth (), 0, 1))
//&& thismode.GetModulationClass () == reqMode.GetModulationClass ()) //TODO: check standard
{
mode = *i;
@@ -1076,8 +1077,9 @@ WifiRemoteStationManager::GetControlAnswerMode (Mac48Address address, WifiMode r
* ...then it's our best choice so far.
*/
if (thismode.IsMandatory ()
&& (!found || thismode.GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1) > mode.GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1))
&& (thismode.GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1) <= reqMode.GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1))
&& (!found || thismode.GetPhyRate (m_wifiPhy->GetChannelWidth (), 0, 1) > mode.GetPhyRate (m_wifiPhy->GetChannelWidth (), 0, 1))
&& (thismode.GetPhyRate (m_wifiPhy->GetChannelWidth (), 0, 1) <= reqMode.GetPhyRate (m_wifiPhy->GetChannelWidth (), 0, 1))
&& (thismode.GetConstellationSize (1) <= reqMode.GetConstellationSize (1))
&& ((thismode.GetModulationClass () == reqMode.GetModulationClass ())
|| (reqMode.GetModulationClass () == WIFI_MOD_CLASS_HT)
|| (reqMode.GetModulationClass () == WIFI_MOD_CLASS_HT)))
@@ -1096,9 +1098,9 @@ WifiRemoteStationManager::GetControlAnswerMode (Mac48Address address, WifiMode r
{
WifiMode thismode = m_wifiPhy->GetMcs (idx);
if (thismode.IsMandatory ()
&& (!found || thismode.GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1) > mode.GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1))
&& thismode.GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1) <= reqMode.GetPhyRate (m_wifiPhy->GetChannelWidth (), m_wifiPhy->GetGuardInterval (), 1)
&& thismode.GetModulationClass () == reqMode.GetModulationClass ())
&& (!found || thismode.GetPhyRate (m_wifiPhy->GetChannelWidth (), 0, 1) > mode.GetPhyRate (m_wifiPhy->GetChannelWidth (), 0, 1))
&& thismode.GetPhyRate (m_wifiPhy->GetChannelWidth (), 0, 1) <= reqMode.GetPhyRate (m_wifiPhy->GetChannelWidth (), 0, 1))
//&& thismode.GetModulationClass () == reqMode.GetModulationClass ()) //TODO: check standard
{
mode = thismode;
//As above; we've found a potentially-suitable transmit