avoid crashing AP wifi sample
This commit is contained in:
@@ -18,20 +18,26 @@
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
|
||||
#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 <iostream>
|
||||
@@ -39,14 +45,14 @@
|
||||
using namespace ns3;
|
||||
|
||||
void
|
||||
WifiNetDeviceTrace (const TraceContext &context, Ptr<const Packet> p, Mac48Address address)
|
||||
WifiNetDeviceTrace (Ptr<const Packet> 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="<<start<<" duration="<<duration<<std::endl;
|
||||
}
|
||||
|
||||
static Ptr<Node>
|
||||
CreateApNode (Ptr<WifiChannel> channel,
|
||||
Vector position,
|
||||
const char *macAddress,
|
||||
Ssid ssid,
|
||||
Time at)
|
||||
{
|
||||
Ptr<Node> node = CreateObject<Node> ();
|
||||
Ptr<NqapWifiNetDevice> device = CreateObject<NqapWifiNetDevice> (node, Mac48Address (macAddress));
|
||||
node->AddDevice (device);
|
||||
device->SetSsid (ssid);
|
||||
Simulator::Schedule (at, &NqapWifiNetDevice::StartBeaconing, device);
|
||||
device->Attach (channel);
|
||||
Ptr<MobilityModel> mobility = CreateObject<StaticMobilityModel> ();
|
||||
mobility->SetPosition (position);
|
||||
node->AggregateObject (mobility);
|
||||
return node;
|
||||
}
|
||||
|
||||
static Ptr<Node>
|
||||
CreateStaNode (Ptr<WifiChannel> channel,
|
||||
Vector position,
|
||||
const char *macAddress,
|
||||
Ssid ssid)
|
||||
{
|
||||
Ptr<Node> node = CreateObject<Node> ();
|
||||
Ptr<NqstaWifiNetDevice> device = CreateObject<NqstaWifiNetDevice> (node, Mac48Address (macAddress));
|
||||
node->AddDevice (device);
|
||||
Simulator::ScheduleNow (&NqstaWifiNetDevice::StartActiveAssociation, device,
|
||||
ssid);
|
||||
device->Attach (channel);
|
||||
Ptr<MobilityModel> mobility = CreateObject<StaticMobilityModel> ();
|
||||
mobility->SetPosition (position);
|
||||
node->AggregateObject (mobility);
|
||||
return node;
|
||||
}
|
||||
|
||||
static void
|
||||
SetPosition (Ptr<Node> node, Vector position)
|
||||
{
|
||||
@@ -138,47 +107,51 @@ int main (int argc, char *argv[])
|
||||
|
||||
Packet::EnableMetadata ();
|
||||
|
||||
//Simulator::EnableLogTo ("80211.log");
|
||||
|
||||
|
||||
// enable rts cts all the time.
|
||||
DefaultValue::Bind ("WifiRtsCtsThreshold", "0");
|
||||
Config::SetDefault ("WifiRemoteStationManager::RtsCtsThreshold", String ("0"));
|
||||
// disable fragmentation
|
||||
DefaultValue::Bind ("WifiFragmentationThreshold", "2200");
|
||||
DefaultValue::Bind ("WifiRateControlAlgorithm", "Aarf");
|
||||
//DefaultValue::Bind ("WifiRateControlAlgorithm", "Arf");
|
||||
Config::SetDefault ("WifiRemoteStationManager::FragmentationThreshold", String ("2200"));
|
||||
|
||||
WifiHelper wifi;
|
||||
MobilityHelper mobility;
|
||||
NodeContainer stas;
|
||||
NodeContainer ap;
|
||||
NetDeviceContainer staDevs;
|
||||
|
||||
stas.Create (2);
|
||||
ap.Create (1);
|
||||
|
||||
Ptr<WifiChannel> channel = CreateObject<WifiChannel> ();
|
||||
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<Node> 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<Node> b = CreateStaNode (channel,
|
||||
Vector (0.0, 0.0, 0.0),
|
||||
"00:00:00:00:00:02",
|
||||
ssid);
|
||||
|
||||
Ptr<Node> 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<Application> app =
|
||||
CreateObjectWith<OnOffApplication> ("Node", b,
|
||||
CreateObjectWith<OnOffApplication> ("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));
|
||||
|
||||
|
||||
@@ -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'])
|
||||
|
||||
@@ -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 ();
|
||||
}
|
||||
|
||||
@@ -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<DcaTxop> ();
|
||||
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<WifiPhy> phy)
|
||||
{
|
||||
m_phy = phy;
|
||||
m_dcfManager->SetupPhyListener (phy);
|
||||
m_low->SetPhy (phy);
|
||||
}
|
||||
void
|
||||
NqapWifiMac::SetWifiRemoteStationManager (Ptr<WifiRemoteStationManager> stationManager)
|
||||
{
|
||||
m_stationManager = stationManager;
|
||||
m_dca->SetWifiRemoteStationManager (stationManager);
|
||||
m_beaconDca->SetWifiRemoteStationManager (stationManager);
|
||||
m_low->SetWifiRemoteStationManager (stationManager);
|
||||
}
|
||||
void
|
||||
NqapWifiMac::SetForwardUpCallback (Callback<void,Ptr<Packet>, const Mac48Address &> upCallback)
|
||||
@@ -109,13 +161,14 @@ NqapWifiMac::SetForwardUpCallback (Callback<void,Ptr<Packet>, const Mac48Address
|
||||
void
|
||||
NqapWifiMac::SetLinkUpCallback (Callback<void> linkUp)
|
||||
{
|
||||
|
||||
if (!linkUp.IsNull ())
|
||||
{
|
||||
linkUp ();
|
||||
}
|
||||
}
|
||||
void
|
||||
NqapWifiMac::SetLinkDownCallback (Callback<void> 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)
|
||||
|
||||
@@ -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<WifiPhy> phy);
|
||||
virtual void SetWifiRemoteStationManager (Ptr<WifiRemoteStationManager> stationManager);
|
||||
virtual void Enqueue (Ptr<const Packet> 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<DcaTxop> m_dca;
|
||||
@@ -102,6 +107,7 @@ private:
|
||||
MacLow *m_low;
|
||||
Mac48Address m_address;
|
||||
Ssid m_ssid;
|
||||
EventId m_beaconEvent;
|
||||
};
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
@@ -79,6 +79,10 @@ NqstaWifiMac::GetTypeId (void)
|
||||
Uinteger (10),
|
||||
MakeUintegerAccessor (&NqstaWifiMac::m_maxMissedBeacons),
|
||||
MakeUintegerChecker<uint32_t> ())
|
||||
.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<DcaTxop> ();
|
||||
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<WifiPhy> phy)
|
||||
{
|
||||
m_phy = phy;
|
||||
m_dcfManager->SetupPhyListener (phy);
|
||||
m_low->SetPhy (phy);
|
||||
}
|
||||
void
|
||||
NqstaWifiMac::SetWifiRemoteStationManager (Ptr<WifiRemoteStationManager> stationManager)
|
||||
{
|
||||
m_stationManager = stationManager;
|
||||
m_dca->SetWifiRemoteStationManager (stationManager);
|
||||
m_low->SetWifiRemoteStationManager (stationManager);
|
||||
}
|
||||
void
|
||||
NqstaWifiMac::SetForwardUpCallback (Callback<void,Ptr<Packet>, 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> packet, const Mac48Address &address)
|
||||
{
|
||||
m_forwardUp (packet, address);
|
||||
@@ -445,7 +487,10 @@ NqstaWifiMac::Receive (Ptr<Packet> packet, WifiMacHeader const *hdr)
|
||||
}
|
||||
}
|
||||
}
|
||||
m_linkUp ();
|
||||
if (!m_linkUp.IsNull ())
|
||||
{
|
||||
m_linkUp ();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -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<WifiPhy> phy);
|
||||
virtual void SetWifiRemoteStationManager (Ptr<WifiRemoteStationManager> stationManager);
|
||||
virtual void Enqueue (Ptr<const Packet> 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> packet, const Mac48Address &address);
|
||||
void Receive (Ptr<Packet> packet, WifiMacHeader const *hdr);
|
||||
Mac48Address GetBroadcastBssid (void);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -58,9 +58,9 @@ WifiNetDevice::Setup (Ptr<Node> node, Ptr<WifiMac> mac, Ptr<WifiPhy> 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> node, Ptr<WifiMac> mac, Ptr<WifiPhy> phy,
|
||||
channel->Add (this, m_phy);
|
||||
|
||||
m_phy->SetChannel (channel);
|
||||
//XXX
|
||||
//m_stationManager->
|
||||
}
|
||||
Ptr<WifiMac>
|
||||
WifiNetDevice::GetMac (void) const
|
||||
|
||||
Reference in New Issue
Block a user