diff --git a/samples/main-ap-wifi.cc b/samples/main-ap-wifi.cc index c04aeed07..e0d333f95 100644 --- a/samples/main-ap-wifi.cc +++ b/samples/main-ap-wifi.cc @@ -18,20 +18,26 @@ * Author: Mathieu Lacage */ -#include "ns3/wifi-net-device.h" -#include "ns3/wifi-channel.h" -#include "ns3/wifi-phy.h" #include "ns3/simulator.h" #include "ns3/callback.h" #include "ns3/ptr.h" #include "ns3/node.h" #include "ns3/onoff-application.h" -#include "ns3/static-mobility-model.h" +#include "ns3/mobility-helper.h" +#include "ns3/wifi-helper.h" +#include "ns3/node-container.h" #include "ns3/random-variable.h" #include "ns3/packet-socket-address.h" #include "ns3/packet.h" #include "ns3/node-list.h" +#include "ns3/ssid.h" +#include "ns3/wifi-phy.h" +#include "ns3/mobility-model.h" +#include "ns3/config.h" +#include "ns3/string.h" +#include "ns3/wifi-channel.h" +#include "ns3/boolean.h" #include @@ -39,14 +45,14 @@ using namespace ns3; void -WifiNetDeviceTrace (const TraceContext &context, Ptr p, Mac48Address address) +WifiNetDeviceTrace (Ptr p, Mac48Address address) { - std::cout << context << " ad=" << address << " p: " << p << std::endl; + std::cout << " ad=" << address << " p: " << p << std::endl; } void -WifiPhyStateTrace (const TraceContext &context, Time start, Time duration, enum WifiPhy::State state) +WifiPhyStateTrace (Time start, Time duration, enum WifiPhy::State state) { - std::cout << context << " state="; + std::cout << " state="; switch (state) { case WifiPhy::TX: std::cout << "tx "; @@ -64,43 +70,6 @@ WifiPhyStateTrace (const TraceContext &context, Time start, Time duration, enum std::cout << " start="< channel = CreateObject (); - Ssid ssid = Ssid ("mathieu"); + Ssid ssid = Ssid ("wifi-default"); + wifi.SetPhy ("WifiPhy"); + wifi.SetRemoteStationManager ("ArfWifiManager"); + // setup ap. + wifi.SetMac ("NqstaWifiMac", "Ssid", ssid, + "ActiveProbing", Boolean (false)); + staDevs = wifi.Build (stas, channel); + // setup stas. + wifi.SetMac ("NqapWifiMac", "Ssid", ssid, + "BeaconGeneration", Boolean (true), + "BeaconInterval", Seconds (2.5)); + wifi.Build (ap, channel); - Ptr a = CreateApNode (channel, - Vector (5.0,0.0,0.0), - "00:00:00:00:00:01", - ssid, - Seconds (0.1)); - Simulator::Schedule (Seconds (1.0), &AdvancePosition, a); + // mobility. + mobility.Layout (stas.Begin (), stas.End ()); + mobility.Layout (ap.Begin (), ap.End ()); - Ptr b = CreateStaNode (channel, - Vector (0.0, 0.0, 0.0), - "00:00:00:00:00:02", - ssid); - - Ptr c = CreateStaNode (channel, - Vector (0.0, 0.0, 0.0), - "00:00:00:00:00:03", - ssid); + Simulator::Schedule (Seconds (1.0), &AdvancePosition, ap.Get (0)); PacketSocketAddress destination = PacketSocketAddress (); destination.SetProtocol (1); destination.SetSingleDevice (0); - destination.SetPhysicalAddress (Mac48Address ("00:00:00:00:00:03")); + destination.SetPhysicalAddress (staDevs.Get(1)->GetAddress ()); Ptr app = - CreateObjectWith ("Node", b, + CreateObjectWith ("Node", stas.Get (0), "Remote", Address (destination), "Protocol", TypeId::LookupByName ("Packet"), "OnTime", ConstantVariable (42), "OffTime", ConstantVariable (0)); - b->AddApplication (app); + stas.Get (0)->AddApplication (app); app->Start (Seconds (0.5)); app->Stop (Seconds (43.0)); diff --git a/samples/wscript b/samples/wscript index 3b190c4be..b03196067 100644 --- a/samples/wscript +++ b/samples/wscript @@ -39,9 +39,9 @@ def build(bld): ['core', 'simulator', 'mobility', 'wifi']) obj.source = 'main-adhoc-wifi.cc' -# obj = bld.create_ns3_program('main-ap-wifi', -# ['core', 'simulator', 'mobility', 'wifi']) -# obj.source = 'main-ap-wifi.cc' + obj = bld.create_ns3_program('main-ap-wifi', + ['core', 'simulator', 'mobility', 'wifi']) + obj.source = 'main-ap-wifi.cc' obj = bld.create_ns3_program('main-random-walk', ['core', 'simulator', 'mobility']) diff --git a/src/devices/wifi/adhoc-wifi-mac.cc b/src/devices/wifi/adhoc-wifi-mac.cc index ec75548c4..d4e839e6e 100644 --- a/src/devices/wifi/adhoc-wifi-mac.cc +++ b/src/devices/wifi/adhoc-wifi-mac.cc @@ -67,8 +67,10 @@ AdhocWifiMac::DoDispose (void) { delete m_rxMiddle; delete m_low; + delete m_dcfManager; m_rxMiddle = 0; m_low = 0; + m_dcfManager = 0; m_phy = 0; WifiMac::DoDispose (); } diff --git a/src/devices/wifi/nqap-wifi-mac.cc b/src/devices/wifi/nqap-wifi-mac.cc index b28040d2c..93da66bd3 100644 --- a/src/devices/wifi/nqap-wifi-mac.cc +++ b/src/devices/wifi/nqap-wifi-mac.cc @@ -50,19 +50,26 @@ NqapWifiMac::GetTypeId (void) Seconds (1.0), MakeTimeAccessor (&NqapWifiMac::m_beaconInterval), MakeTimeChecker ()) + .AddAttribute ("BeaconGeneration", "Whether or not beacons are generated.", + Boolean (false), + MakeBooleanAccessor (&NqapWifiMac::SetBeaconGeneration, + &NqapWifiMac::GetBeaconGeneration), + MakeBooleanChecker ()) ; return tid; } NqapWifiMac::NqapWifiMac () { - m_dcfManager = new DcfManager (); - m_rxMiddle = new MacRxMiddle (); m_rxMiddle->SetForwardCallback (MakeCallback (&NqapWifiMac::Receive, this)); m_low = new MacLow (); m_low->SetRxCallback (MakeCallback (&MacRxMiddle::Receive, m_rxMiddle)); + m_low->SetMac (this); + + m_dcfManager = new DcfManager (); + m_dcfManager->SetupLowListener (m_low); m_dca = CreateObject (); m_dca->SetLow (m_low); @@ -82,24 +89,69 @@ NqapWifiMac::DoDispose (void) { delete m_rxMiddle; delete m_low; + delete m_dcfManager; m_rxMiddle = 0; m_low = 0; + m_dcfManager = 0; m_phy = 0; m_dca = 0; m_beaconDca = 0; + m_beaconEvent.Cancel (); WifiMac::DoDispose (); } +void +NqapWifiMac::SetBeaconGeneration (bool enable) +{ + if (enable) + { + m_beaconEvent = Simulator::ScheduleNow (&NqapWifiMac::SendOneBeacon, this); + } + else + { + m_beaconEvent.Cancel (); + } +} + +bool +NqapWifiMac::GetBeaconGeneration (void) const +{ + return m_beaconEvent.IsRunning (); +} + +void +NqapWifiMac::SetSlot (Time slotTime) +{ + m_dcfManager->SetSlot (slotTime); + WifiMac::SetSlot (slotTime); +} +void +NqapWifiMac::SetSifs (Time sifs) +{ + m_dcfManager->SetSifs (sifs); + WifiMac::SetSifs (sifs); +} +void +NqapWifiMac::SetEifsNoDifs (Time eifsNoDifs) +{ + m_dcfManager->SetEifsNoDifs (eifsNoDifs); + WifiMac::SetEifsNoDifs (eifsNoDifs); +} void NqapWifiMac::SetWifiPhy (Ptr phy) { m_phy = phy; + m_dcfManager->SetupPhyListener (phy); + m_low->SetPhy (phy); } void NqapWifiMac::SetWifiRemoteStationManager (Ptr stationManager) { m_stationManager = stationManager; + m_dca->SetWifiRemoteStationManager (stationManager); + m_beaconDca->SetWifiRemoteStationManager (stationManager); + m_low->SetWifiRemoteStationManager (stationManager); } void NqapWifiMac::SetForwardUpCallback (Callback, const Mac48Address &> upCallback) @@ -109,13 +161,14 @@ NqapWifiMac::SetForwardUpCallback (Callback, const Mac48Address void NqapWifiMac::SetLinkUpCallback (Callback linkUp) { - + if (!linkUp.IsNull ()) + { + linkUp (); + } } void NqapWifiMac::SetLinkDownCallback (Callback linkDown) -{ - -} +{} Mac48Address NqapWifiMac::GetAddress (void) const { @@ -261,7 +314,7 @@ NqapWifiMac::SendOneBeacon (void) packet->AddHeader (beacon); m_beaconDca->Queue (packet, hdr); - Simulator::Schedule (m_beaconInterval, &NqapWifiMac::SendOneBeacon, this); + m_beaconEvent = Simulator::Schedule (m_beaconInterval, &NqapWifiMac::SendOneBeacon, this); } void NqapWifiMac::TxOk (WifiMacHeader const &hdr) diff --git a/src/devices/wifi/nqap-wifi-mac.h b/src/devices/wifi/nqap-wifi-mac.h index 4fcde46f7..f547a618f 100644 --- a/src/devices/wifi/nqap-wifi-mac.h +++ b/src/devices/wifi/nqap-wifi-mac.h @@ -58,6 +58,9 @@ public: NqapWifiMac (); ~NqapWifiMac (); + virtual void SetSlot (Time slotTime); + virtual void SetSifs (Time sifs); + virtual void SetEifsNoDifs (Time eifsNoDifs); virtual void SetWifiPhy (Ptr phy); virtual void SetWifiRemoteStationManager (Ptr stationManager); virtual void Enqueue (Ptr packet, Mac48Address to); @@ -88,6 +91,8 @@ private: void SendAssocResp (Mac48Address to, bool success); void SendOneBeacon (void); SupportedRates GetSupportedRates (void) const; + void SetBeaconGeneration (bool enable); + bool GetBeaconGeneration (void) const; virtual void DoDispose (void); Ptr m_dca; @@ -102,6 +107,7 @@ private: MacLow *m_low; Mac48Address m_address; Ssid m_ssid; + EventId m_beaconEvent; }; } // namespace ns3 diff --git a/src/devices/wifi/nqsta-wifi-mac.cc b/src/devices/wifi/nqsta-wifi-mac.cc index c55a72d5e..77768ada2 100644 --- a/src/devices/wifi/nqsta-wifi-mac.cc +++ b/src/devices/wifi/nqsta-wifi-mac.cc @@ -79,6 +79,10 @@ NqstaWifiMac::GetTypeId (void) Uinteger (10), MakeUintegerAccessor (&NqstaWifiMac::m_maxMissedBeacons), MakeUintegerChecker ()) + .AddAttribute ("ActiveProbing", "XXX", + Boolean (false), + MakeBooleanAccessor (&NqstaWifiMac::SetActiveProbing), + MakeBooleanChecker ()) ; return tid; } @@ -97,6 +101,7 @@ NqstaWifiMac::NqstaWifiMac () m_low = new MacLow (); m_low->SetRxCallback (MakeCallback (&MacRxMiddle::Receive, m_rxMiddle)); + m_low->SetMac (this); m_dca = CreateObject (); m_dca->SetLow (m_low); @@ -111,22 +116,47 @@ NqstaWifiMac::DoDispose (void) { delete m_rxMiddle; delete m_low; + delete m_dcfManager; m_rxMiddle = 0; m_low = 0; + m_dcfManager = 0; m_phy = 0; m_dca = 0; WifiMac::DoDispose (); } +void +NqstaWifiMac::SetSlot (Time slotTime) +{ + m_dcfManager->SetSlot (slotTime); + WifiMac::SetSlot (slotTime); +} +void +NqstaWifiMac::SetSifs (Time sifs) +{ + m_dcfManager->SetSifs (sifs); + WifiMac::SetSifs (sifs); +} +void +NqstaWifiMac::SetEifsNoDifs (Time eifsNoDifs) +{ + m_dcfManager->SetEifsNoDifs (eifsNoDifs); + WifiMac::SetEifsNoDifs (eifsNoDifs); +} + void NqstaWifiMac::SetWifiPhy (Ptr phy) { m_phy = phy; + m_dcfManager->SetupPhyListener (phy); + m_low->SetPhy (phy); } void NqstaWifiMac::SetWifiRemoteStationManager (Ptr stationManager) { m_stationManager = stationManager; + m_dca->SetWifiRemoteStationManager (stationManager); + m_low->SetWifiRemoteStationManager (stationManager); } void NqstaWifiMac::SetForwardUpCallback (Callback, const Mac48Address &> upCallback) @@ -203,6 +233,18 @@ NqstaWifiMac::SetBssid (Mac48Address bssid) m_bssid = bssid; } void +NqstaWifiMac::SetActiveProbing (bool enable) +{ + if (enable) + { + TryToEnsureAssociated (); + } + else + { + m_probeRequestEvent.Cancel (); + } +} +void NqstaWifiMac::ForwardUp (Ptr packet, const Mac48Address &address) { m_forwardUp (packet, address); @@ -445,7 +487,10 @@ NqstaWifiMac::Receive (Ptr packet, WifiMacHeader const *hdr) } } } - m_linkUp (); + if (!m_linkUp.IsNull ()) + { + m_linkUp (); + } } else { diff --git a/src/devices/wifi/nqsta-wifi-mac.h b/src/devices/wifi/nqsta-wifi-mac.h index 1626d4f1d..43fd10baa 100644 --- a/src/devices/wifi/nqsta-wifi-mac.h +++ b/src/devices/wifi/nqsta-wifi-mac.h @@ -58,6 +58,9 @@ public: NqstaWifiMac (); ~NqstaWifiMac (); + virtual void SetSlot (Time slotTime); + virtual void SetSifs (Time sifs); + virtual void SetEifsNoDifs (Time eifsNoDifs); virtual void SetWifiPhy (Ptr phy); virtual void SetWifiRemoteStationManager (Ptr stationManager); virtual void Enqueue (Ptr packet, Mac48Address to); @@ -98,6 +101,8 @@ public: private: void SetBssid (Mac48Address bssid); + void SetActiveProbing (bool enable); + bool GetActiveProbing (void) const; void ForwardUp (Ptr packet, const Mac48Address &address); void Receive (Ptr packet, WifiMacHeader const *hdr); Mac48Address GetBroadcastBssid (void); diff --git a/src/devices/wifi/wifi-mac.cc b/src/devices/wifi/wifi-mac.cc index fddc38c24..7d80d581b 100644 --- a/src/devices/wifi/wifi-mac.cc +++ b/src/devices/wifi/wifi-mac.cc @@ -89,6 +89,11 @@ WifiMac::GetTypeId (void) Uinteger (2304), MakeUintegerAccessor (&WifiMac::GetMaxMsduSize), MakeUintegerChecker (1,2304)) + .AddAttribute ("Ssid", "XXX", + Ssid ("default"), + MakeSsidAccessor (&WifiMac::GetSsid, + &WifiMac::SetSsid), + MakeSsidChecker ()) ; return tid; } diff --git a/src/devices/wifi/wifi-net-device.cc b/src/devices/wifi/wifi-net-device.cc index 8eefe66cf..053ec32e4 100644 --- a/src/devices/wifi/wifi-net-device.cc +++ b/src/devices/wifi/wifi-net-device.cc @@ -58,9 +58,9 @@ WifiNetDevice::Setup (Ptr node, Ptr mac, Ptr phy, m_phy = phy; m_stationManager = manager; - manager->SetupPhy (phy); + m_stationManager->SetupPhy (m_phy); - m_mac->SetWifiRemoteStationManager (manager); + m_mac->SetWifiRemoteStationManager (m_stationManager); m_mac->SetWifiPhy (m_phy); m_mac->SetForwardUpCallback (MakeCallback (&WifiNetDevice::ForwardUp, this)); m_mac->SetLinkUpCallback (MakeCallback (&WifiNetDevice::LinkUp, this)); @@ -68,8 +68,6 @@ WifiNetDevice::Setup (Ptr node, Ptr mac, Ptr phy, channel->Add (this, m_phy); m_phy->SetChannel (channel); - //XXX - //m_stationManager-> } Ptr WifiNetDevice::GetMac (void) const