# HG changeset patch # User Mathieu Lacage # Date 1192720793 -7200 # Node ID e2e16c1712c8ca22ef2ef37f0bf9d7e131d50955 # Parent afed751cc0b5e2f6a032cbdd64c2e7778ac7d21a handle the BasicRateSet in the AP diff -r afed751cc0b5 -r e2e16c1712c8 src/devices/wifi/mac-high-nqap.cc --- a/src/devices/wifi/mac-high-nqap.cc Thu Oct 18 15:59:33 2007 +0200 +++ b/src/devices/wifi/mac-high-nqap.cc Thu Oct 18 17:19:53 2007 +0200 @@ -23,6 +23,7 @@ #include "wifi-net-device.h" #include "wifi-mac-header.h" #include "mgt-headers.h" +#include "wifi-phy.h" #include "ns3/assert.h" #define noNQAP_DEBUG 1 @@ -62,17 +63,17 @@ { m_stations = stations; } +void +MacHighNqap::SetPhy (WifiPhy *phy) +{ + m_phy = phy; +} void MacHighNqap::SetForwardCallback (ForwardCallback callback) { m_forwardUp = callback; } void -MacHighNqap::SetSupportedRates (SupportedRates rates) -{ - m_rates = rates; -} -void MacHighNqap::SetBeaconIntervalUs (uint64_t us) { m_beaconIntervalUs = us; @@ -94,11 +95,6 @@ { ForwardDown (packet, m_device->GetSelfAddress (), to); } -SupportedRates -MacHighNqap::GetSupportedRates (void) -{ - return m_rates; -} void MacHighNqap::SendProbeResp (Mac48Address to) { @@ -113,7 +109,20 @@ Packet packet; MgtProbeResponseHeader probe; probe.SetSsid (m_device->GetSsid ()); - SupportedRates rates = GetSupportedRates (); + // send the set of supported rates and make sure that we indicate + // the Basic Rate set in this set of supported rates. + SupportedRates rates; + for (uint32_t i = 0; i < m_phy->GetNModes (); i++) + { + WifiMode mode = m_phy->GetMode (i); + rates.AddSupportedRate (mode.GetPhyRate ()); + } + // set the basic rates + for (uint32_t j = 0; j < m_stations->GetNBasicModes (); j++) + { + WifiMode mode = m_stations->GetBasicMode (j); + rates.SetBasicRate (mode.GetPhyRate ()); + } probe.SetSupportedRates (rates); probe.SetBeaconIntervalUs (m_beaconIntervalUs); packet.AddHeader (probe); @@ -121,7 +130,7 @@ m_dca->Queue (packet, hdr); } void -MacHighNqap::SendAssocResp (Mac48Address to) +MacHighNqap::SendAssocResp (Mac48Address to, bool success) { TRACE ("send assoc response to="<IsAssocReq ()) { - station->RecordWaitAssocTxOk (); - SendAssocResp (hdr->GetAddr2 ()); + // first, verify that the the station's supported + // rate set is compatible with our Basic Rate set + MgtAssocRequestHeader assocReq; + packet.RemoveHeader (assocReq); + SupportedRates rates = assocReq.GetSupportedRates (); + bool problem = false; + for (uint32_t i = 0; i < m_stations->GetNBasicModes (); i++) + { + WifiMode mode = m_stations->GetBasicMode (i); + if (!rates.IsSupportedRate (mode.GetPhyRate ())) + { + problem = true; + break; + } + } + if (problem) + { + // one of the Basic Rate set mode is not + // supported by the station. So, we return an assoc + // response with an error status. + SendAssocResp (hdr->GetAddr2 (), false); + } + else + { + // station supports all rates in Basic Rate Set. + // record all its supported modes in its associated MacStation + for (uint32_t j = 0; j < m_phy->GetNModes (); j++) + { + WifiMode mode = m_phy->GetMode (j); + if (rates.IsSupportedRate (mode.GetPhyRate ())) + { + station->AddSupportedMode (mode); + } + } + station->RecordWaitAssocTxOk (); + // send assoc response with success status. + SendAssocResp (hdr->GetAddr2 (), true); + } } else if (hdr->IsDisassociation ()) { diff -r afed751cc0b5 -r e2e16c1712c8 src/devices/wifi/mac-high-nqap.h --- a/src/devices/wifi/mac-high-nqap.h Thu Oct 18 15:59:33 2007 +0200 +++ b/src/devices/wifi/mac-high-nqap.h Thu Oct 18 17:19:53 2007 +0200 @@ -24,7 +24,6 @@ #include "ns3/mac48-address.h" #include "ns3/callback.h" #include "ns3/packet.h" -#include "supported-rates.h" namespace ns3 { @@ -32,6 +31,7 @@ class WifiNetDevice; class DcaTxop; class MacStations; +class WifiPhy; class MacHighNqap { public: @@ -43,8 +43,8 @@ void SetDcaTxop (DcaTxop *dca); void SetDevice (WifiNetDevice *device); void SetStations (MacStations *stations); + void SetPhy (WifiPhy *phy); void SetForwardCallback (ForwardCallback callback); - void SetSupportedRates (SupportedRates rates); void SetBeaconIntervalUs (uint64_t us); void Queue (Packet packet, Mac48Address to); @@ -55,14 +55,13 @@ void TxOk (WifiMacHeader const &hdr); void TxFailed (WifiMacHeader const &hdr); void SendProbeResp (Mac48Address to); - void SendAssocResp (Mac48Address to); - SupportedRates GetSupportedRates (void); + void SendAssocResp (Mac48Address to, bool success); DcaTxop *m_dca; WifiNetDevice *m_device; MacStations *m_stations; + WifiPhy *m_phy; ForwardCallback m_forwardUp; - SupportedRates m_rates; uint64_t m_beaconIntervalUs; }; diff -r afed751cc0b5 -r e2e16c1712c8 src/devices/wifi/wifi-net-device.cc --- a/src/devices/wifi/wifi-net-device.cc Thu Oct 18 15:59:33 2007 +0200 +++ b/src/devices/wifi/wifi-net-device.cc Thu Oct 18 17:19:53 2007 +0200 @@ -389,20 +389,25 @@ m_dca = CreateDca (15, 1023); - SupportedRates rates; - for (uint32_t i = 0; i < m_phy->GetNModes (); i++) + // By default, we configure the Basic Rate Set to be the set + // of rates we support which are mandatory. + // This could be trivially made user-configurable + for (uint32_t i = 0; i < m_phy->GetNModes (); i++) { WifiMode mode = m_phy->GetMode (i); - rates.AddSupportedRate (mode.GetPhyRate ()); - } + if (mode.IsMandatory ()) + { + m_stations->AddBasicMode (mode); + } + } MacHighNqap *high = new MacHighNqap (); high->SetDevice (this); high->SetDcaTxop (m_dca); high->SetStations (m_stations); + high->SetPhy (m_phy); high->SetForwardCallback (MakeCallback (&NqapWifiNetDevice::DoForwardUp, this)); - high->SetSupportedRates (rates); m_rxMiddle->SetForwardCallback (MakeCallback (&MacHighNqap::Receive, high)); m_high = high; }