Add WifiMacHelper

This commit is contained in:
Mirko Banchi
2009-04-24 10:01:41 +02:00
parent 3a2586631b
commit 9f0c9cd975
20 changed files with 341 additions and 141 deletions

View File

@@ -144,13 +144,14 @@ main (int argc, char *argv[])
// our container
//
WifiHelper wifi;
wifi.SetMac ("ns3::AdhocWifiMac");
NqosWifiMacHelper mac = NqosWifiMacHelper::Default ();
mac.SetType ("ns3::AdhocWifiMac");
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
"DataMode", StringValue ("wifia-54mbs"));
YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();
YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
wifiPhy.SetChannel (wifiChannel.Create ());
NetDeviceContainer backboneDevices = wifi.Install (wifiPhy, backbone);
NetDeviceContainer backboneDevices = wifi.Install (wifiPhy, mac, backbone);
//
// Add the IPv4 protocol stack to the nodes in our container
//
@@ -258,6 +259,7 @@ main (int argc, char *argv[])
// Create an infrastructure network
//
WifiHelper wifiInfra = WifiHelper::Default ();
NqosWifiMacHelper macInfra = NqosWifiMacHelper::Default ();
wifiPhy.SetChannel (wifiChannel.Create ());
// Create unique ssids for these networks
std::string ssidString("wifi-infra");
@@ -267,15 +269,15 @@ main (int argc, char *argv[])
Ssid ssid = Ssid (ssidString);
wifiInfra.SetRemoteStationManager ("ns3::ArfWifiManager");
// setup stas
wifiInfra.SetMac ("ns3::NqstaWifiMac",
macInfra.SetType ("ns3::NqstaWifiMac",
"Ssid", SsidValue (ssid),
"ActiveProbing", BooleanValue (false));
NetDeviceContainer staDevices = wifiInfra.Install (wifiPhy, stas);
NetDeviceContainer staDevices = wifiInfra.Install (wifiPhy, macInfra, stas);
// setup ap.
wifiInfra.SetMac ("ns3::NqapWifiMac", "Ssid", SsidValue (ssid),
macInfra.SetType ("ns3::NqapWifiMac", "Ssid", SsidValue (ssid),
"BeaconGeneration", BooleanValue (true),
"BeaconInterval", TimeValue (Seconds (2.5)));
NetDeviceContainer apDevices = wifiInfra.Install (wifiPhy, backbone.Get (i));
NetDeviceContainer apDevices = wifiInfra.Install (wifiPhy, macInfra, backbone.Get (i));
// Collect all of these new devices
NetDeviceContainer infraDevices (apDevices, staDevices);

View File

@@ -128,11 +128,12 @@ int main(int argc, char *argv[]) {
NS_LOG_INFO("Installing WiFi and Internet stack.");
WifiHelper wifi = WifiHelper::Default ();
wifi.SetMac("ns3::AdhocWifiMac");
NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
wifiMac.SetType ("ns3::AdhocWifiMac");
YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();
YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
wifiPhy.SetChannel (wifiChannel.Create ());
NetDeviceContainer nodeDevices = wifi.Install(wifiPhy, nodes);
NetDeviceContainer nodeDevices = wifi.Install(wifiPhy, wifiMac, nodes);
InternetStackHelper internet;
internet.Install(nodes);

View File

@@ -151,19 +151,20 @@ main (int argc, char *argv[])
Ssid ssid = Ssid ("left");
WifiHelper wifi = WifiHelper::Default ();
NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
wifi.SetRemoteStationManager ("ns3::ArfWifiManager");
wifi.SetMac ("ns3::NqapWifiMac",
"Ssid", SsidValue (ssid),
"BeaconGeneration", BooleanValue (true),
"BeaconInterval", TimeValue (Seconds (2.5)));
NetDeviceContainer devicesLeft = wifi.Install (wifiPhy, nodesLeft.Get (0));
wifiMac.SetType ("ns3::NqapWifiMac",
"Ssid", SsidValue (ssid),
"BeaconGeneration", BooleanValue (true),
"BeaconInterval", TimeValue (Seconds (2.5)));
NetDeviceContainer devicesLeft = wifi.Install (wifiPhy, wifiMac, nodesLeft.Get (0));
wifi.SetMac ("ns3::NqstaWifiMac",
"Ssid", SsidValue (ssid),
"ActiveProbing", BooleanValue (false));
devicesLeft.Add (wifi.Install (wifiPhy, NodeContainer (nodesLeft.Get (1), nodesLeft.Get (2), nodesLeft.Get (3))));
wifiMac.SetType ("ns3::NqstaWifiMac",
"Ssid", SsidValue (ssid),
"ActiveProbing", BooleanValue (false));
devicesLeft.Add (wifi.Install (wifiPhy, wifiMac, NodeContainer (nodesLeft.Get (1), nodesLeft.Get (2), nodesLeft.Get (3))));
MobilityHelper mobility;
mobility.Install (nodesLeft);

View File

@@ -89,21 +89,23 @@ main (int argc, char *argv[])
WifiHelper wifi = WifiHelper::Default ();
wifi.SetRemoteStationManager ("ns3::AarfWifiManager");
NqosWifiMacHelper mac = NqosWifiMacHelper::Default ();
Ssid ssid = Ssid ("ns-3-ssid");
wifi.SetMac ("ns3::NqstaWifiMac",
mac.SetType ("ns3::NqstaWifiMac",
"Ssid", SsidValue (ssid),
"ActiveProbing", BooleanValue (false));
NetDeviceContainer staDevices;
staDevices = wifi.Install (phy, wifiStaNodes);
staDevices = wifi.Install (phy, mac, wifiStaNodes);
wifi.SetMac ("ns3::NqapWifiMac",
mac.SetType ("ns3::NqapWifiMac",
"Ssid", SsidValue (ssid),
"BeaconGeneration", BooleanValue (true),
"BeaconInterval", TimeValue (Seconds (2.5)));
NetDeviceContainer apDevices;
apDevices = wifi.Install (phy, wifiApNode);
apDevices = wifi.Install (phy, mac, wifiApNode);
MobilityHelper mobility;

View File

@@ -36,7 +36,8 @@ class Experiment
public:
Experiment ();
Experiment (std::string name);
Gnuplot2dDataset Run (const WifiHelper &wifi, const YansWifiPhyHelper &wifiPhy, const YansWifiChannelHelper &wifiChannel);
Gnuplot2dDataset Run (const WifiHelper &wifi, const YansWifiPhyHelper &wifiPhy,
const NqosWifiMacHelper &wifiMac, const YansWifiChannelHelper &wifiChannel);
private:
void ReceivePacket (Ptr<Socket> socket);
void SetPosition (Ptr<Node> node, Vector position);
@@ -109,7 +110,8 @@ Experiment::SetupPacketReceive (Ptr<Node> node)
}
Gnuplot2dDataset
Experiment::Run (const WifiHelper &wifi, const YansWifiPhyHelper &wifiPhy, const YansWifiChannelHelper &wifiChannel)
Experiment::Run (const WifiHelper &wifi, const YansWifiPhyHelper &wifiPhy,
const NqosWifiMacHelper &wifiMac, const YansWifiChannelHelper &wifiChannel)
{
m_bytesTotal = 0;
@@ -121,7 +123,9 @@ Experiment::Run (const WifiHelper &wifi, const YansWifiPhyHelper &wifiPhy, const
YansWifiPhyHelper phy = wifiPhy;
phy.SetChannel (wifiChannel.Create ());
NetDeviceContainer devices = wifi.Install (phy, c);
NqosWifiMacHelper mac = wifiMac;
NetDeviceContainer devices = wifi.Install (phy, mac, c);
MobilityHelper mobility;
Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
@@ -170,66 +174,67 @@ int main (int argc, char *argv[])
Experiment experiment;
WifiHelper wifi = WifiHelper::Default ();
NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();
YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
Gnuplot2dDataset dataset;
wifi.SetMac ("ns3::AdhocWifiMac");
wifiMac.SetType ("ns3::AdhocWifiMac");
NS_LOG_DEBUG ("54");
experiment = Experiment ("54mb");
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
"DataMode", StringValue ("wifia-54mbs"));
dataset = experiment.Run (wifi, wifiPhy, wifiChannel);
dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel);
gnuplot.AddDataset (dataset);
NS_LOG_DEBUG ("48");
experiment = Experiment ("48mb");
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
"DataMode", StringValue ("wifia-48mbs"));
dataset = experiment.Run (wifi, wifiPhy, wifiChannel);
dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel);
gnuplot.AddDataset (dataset);
NS_LOG_DEBUG ("36");
experiment = Experiment ("36mb");
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
"DataMode", StringValue ("wifia-36mbs"));
dataset = experiment.Run (wifi, wifiPhy, wifiChannel);
dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel);
gnuplot.AddDataset (dataset);
NS_LOG_DEBUG ("24");
experiment = Experiment ("24mb");
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
"DataMode", StringValue ("wifia-24mbs"));
dataset = experiment.Run (wifi, wifiPhy, wifiChannel);
dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel);
gnuplot.AddDataset (dataset);
NS_LOG_DEBUG ("18");
experiment = Experiment ("18mb");
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
"DataMode", StringValue ("wifia-18mbs"));
dataset = experiment.Run (wifi, wifiPhy, wifiChannel);
dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel);
gnuplot.AddDataset (dataset);
NS_LOG_DEBUG ("12");
experiment = Experiment ("12mb");
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
"DataMode", StringValue ("wifia-12mbs"));
dataset = experiment.Run (wifi, wifiPhy, wifiChannel);
dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel);
gnuplot.AddDataset (dataset);
NS_LOG_DEBUG ("9");
experiment = Experiment ("9mb");
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
"DataMode", StringValue ("wifia-9mbs"));
dataset = experiment.Run (wifi, wifiPhy, wifiChannel);
dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel);
gnuplot.AddDataset (dataset);
NS_LOG_DEBUG ("6");
experiment = Experiment ("6mb");
wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
"DataMode", StringValue ("wifia-6mbs"));
dataset = experiment.Run (wifi, wifiPhy, wifiChannel);
dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel);
gnuplot.AddDataset (dataset);
gnuplot.GenerateOutput (std::cout);
@@ -242,37 +247,37 @@ int main (int argc, char *argv[])
NS_LOG_DEBUG ("arf");
experiment = Experiment ("arf");
wifi.SetRemoteStationManager ("ns3::ArfWifiManager");
dataset = experiment.Run (wifi, wifiPhy, wifiChannel);
dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel);
gnuplot.AddDataset (dataset);
NS_LOG_DEBUG ("aarf");
experiment = Experiment ("aarf");
wifi.SetRemoteStationManager ("ns3::AarfWifiManager");
dataset = experiment.Run (wifi, wifiPhy, wifiChannel);
dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel);
gnuplot.AddDataset (dataset);
NS_LOG_DEBUG ("aarf-cd");
experiment = Experiment ("aarf-cd");
wifi.SetRemoteStationManager ("ns3::AarfcdWifiManager");
dataset = experiment.Run (wifi, wifiPhy, wifiChannel);
dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel);
gnuplot.AddDataset (dataset);
NS_LOG_DEBUG ("cara");
experiment = Experiment ("cara");
wifi.SetRemoteStationManager ("ns3::CaraWifiManager");
dataset = experiment.Run (wifi, wifiPhy, wifiChannel);
dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel);
gnuplot.AddDataset (dataset);
NS_LOG_DEBUG ("rraa");
experiment = Experiment ("rraa");
wifi.SetRemoteStationManager ("ns3::RraaWifiManager");
dataset = experiment.Run (wifi, wifiPhy, wifiChannel);
dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel);
gnuplot.AddDataset (dataset);
NS_LOG_DEBUG ("ideal");
experiment = Experiment ("ideal");
wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
dataset = experiment.Run (wifi, wifiPhy, wifiChannel);
dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel);
gnuplot.AddDataset (dataset);
gnuplot.GenerateOutput (std::cout);

View File

@@ -131,21 +131,22 @@ int main (int argc, char *argv[])
packetSocket.Install (stas);
packetSocket.Install (ap);
NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();
YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
wifiPhy.SetChannel (wifiChannel.Create ());
Ssid ssid = Ssid ("wifi-default");
wifi.SetRemoteStationManager ("ns3::ArfWifiManager");
// setup stas.
wifi.SetMac ("ns3::NqstaWifiMac",
wifiMac.SetType ("ns3::NqstaWifiMac",
"Ssid", SsidValue (ssid),
"ActiveProbing", BooleanValue (false));
staDevs = wifi.Install (wifiPhy, stas);
staDevs = wifi.Install (wifiPhy, wifiMac, stas);
// setup ap.
wifi.SetMac ("ns3::NqapWifiMac", "Ssid", SsidValue (ssid),
wifiMac.SetType ("ns3::NqapWifiMac", "Ssid", SsidValue (ssid),
"BeaconGeneration", BooleanValue (true),
"BeaconInterval", TimeValue (Seconds (2.5)));
wifi.Install (wifiPhy, ap);
wifi.Install (wifiPhy, wifiMac, ap);
// mobility.
mobility.Install (stas);

View File

@@ -104,6 +104,7 @@ int main (int argc, char *argv[])
MobilityHelper mobility;
BridgeHelper bridge;
WifiHelper wifi = WifiHelper::Default ();
NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();
YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
wifiPhy.SetChannel (wifiChannel.Create ());
@@ -121,11 +122,11 @@ int main (int argc, char *argv[])
// setup the AP.
mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
mobility.Install (backboneNodes.Get (i));
wifi.SetMac ("ns3::NqapWifiMac",
wifiMac.SetType ("ns3::NqapWifiMac",
"Ssid", SsidValue (ssid),
"BeaconGeneration", BooleanValue (true),
"BeaconInterval", TimeValue (Seconds (2.5)));
apDev = wifi.Install (wifiPhy, backboneNodes.Get (i));
apDev = wifi.Install (wifiPhy, wifiMac, backboneNodes.Get (i));
NetDeviceContainer bridgeDev;
bridgeDev = bridge.Install (backboneNodes.Get (i), NetDeviceContainer (apDev, backboneDevices.Get (i)));
@@ -141,10 +142,10 @@ int main (int argc, char *argv[])
"Speed", StringValue ("Constant:1.0"),
"Bounds", RectangleValue (Rectangle (wifiX, wifiX+5.0,0.0, (nStas+1)*5.0)));
mobility.Install (sta);
wifi.SetMac ("ns3::NqstaWifiMac",
wifiMac.SetType ("ns3::NqstaWifiMac",
"Ssid", SsidValue (ssid),
"ActiveProbing", BooleanValue (false));
staDev = wifi.Install (wifiPhy, sta);
staDev = wifi.Install (wifiPhy, wifiMac, sta);
staInterface = ip.Assign (staDev);
// save everything in containers.

View File

@@ -46,7 +46,8 @@ AdhocWifiMac::GetTypeId (void)
.AddConstructor<AdhocWifiMac> ()
.AddAttribute ("DcaTxop", "The DcaTxop object",
PointerValue (),
MakePointerAccessor (&AdhocWifiMac::DoGetDcaTxop),
MakePointerAccessor (&AdhocWifiMac::GetDcaTxop,
&AdhocWifiMac::SetDcaTxop),
MakePointerChecker<DcaTxop> ())
;
return tid;
@@ -63,10 +64,6 @@ AdhocWifiMac::AdhocWifiMac ()
m_dcfManager = new DcfManager ();
m_dcfManager->SetupLowListener (m_low);
m_dca = CreateObject<DcaTxop> ();
m_dca->SetLow (m_low);
m_dca->SetManager (m_dcfManager);
}
AdhocWifiMac::~AdhocWifiMac ()
{}
@@ -250,9 +247,18 @@ AdhocWifiMac::ForwardUp (Ptr<Packet> packet, WifiMacHeader const *hdr)
m_upCallback (packet, hdr->GetAddr2 (), hdr->GetAddr1 ());
}
Ptr<DcaTxop>
AdhocWifiMac::DoGetDcaTxop(void) const
AdhocWifiMac::GetDcaTxop(void) const
{
return m_dca;
}
void
AdhocWifiMac::SetDcaTxop (Ptr<DcaTxop> dcaTxop)
{
m_dca = dcaTxop;
m_dca->SetLow (m_low);
m_dca->SetManager (m_dcfManager);
}
} // namespace ns3

View File

@@ -86,7 +86,8 @@ private:
void ForwardUp (Ptr<Packet> packet, WifiMacHeader const*hdr);
AdhocWifiMac (const AdhocWifiMac & ctor_arg);
AdhocWifiMac &operator = (const AdhocWifiMac &o);
Ptr<DcaTxop> DoGetDcaTxop(void) const;
Ptr<DcaTxop> GetDcaTxop(void) const;
void SetDcaTxop (Ptr<DcaTxop> dcaTxop);
Ptr<DcaTxop> m_dca;
Callback<void,Ptr<Packet>, Mac48Address, Mac48Address> m_upCallback;

View File

@@ -60,7 +60,8 @@ NqapWifiMac::GetTypeId (void)
MakeBooleanChecker ())
.AddAttribute ("DcaTxop", "The DcaTxop object",
PointerValue (),
MakePointerAccessor (&NqapWifiMac::DoGetDcaTxop),
MakePointerAccessor (&NqapWifiMac::GetDcaTxop,
&NqapWifiMac::SetDcaTxop),
MakePointerChecker<DcaTxop> ())
;
return tid;
@@ -78,12 +79,6 @@ NqapWifiMac::NqapWifiMac ()
m_dcfManager = new DcfManager ();
m_dcfManager->SetupLowListener (m_low);
m_dca = CreateObject<DcaTxop> ();
m_dca->SetLow (m_low);
m_dca->SetManager (m_dcfManager);
m_dca->SetTxOkCallback (MakeCallback (&NqapWifiMac::TxOk, this));
m_dca->SetTxFailedCallback (MakeCallback (&NqapWifiMac::TxFailed, this));
m_beaconDca = CreateObject<DcaTxop> ();
m_beaconDca->SetAifsn(1);
m_beaconDca->SetMinCw(0);
@@ -108,6 +103,7 @@ NqapWifiMac::DoDispose (void)
m_phy = 0;
m_dca = 0;
m_beaconDca = 0;
m_stationManager = 0;
m_beaconEvent.Cancel ();
WifiMac::DoDispose ();
}
@@ -300,8 +296,7 @@ NqapWifiMac::ForwardDown (Ptr<const Packet> packet, Mac48Address from, Mac48Addr
hdr.SetAddr3 (from);
hdr.SetDsFrom ();
hdr.SetDsNotTo ();
m_dca->Queue (packet, hdr);
m_dca->Queue (packet, hdr);
}
void
NqapWifiMac::Enqueue (Ptr<const Packet> packet, Mac48Address to, Mac48Address from)
@@ -565,9 +560,19 @@ NqapWifiMac::Receive (Ptr<Packet> packet, WifiMacHeader const *hdr)
}
}
Ptr<DcaTxop>
NqapWifiMac::DoGetDcaTxop(void) const
NqapWifiMac::GetDcaTxop(void) const
{
return m_dca;
}
void
NqapWifiMac::SetDcaTxop (Ptr<DcaTxop> dcaTxop)
{
m_dca = dcaTxop;
m_dca->SetLow (m_low);
m_dca->SetManager (m_dcfManager);
m_dca->SetTxOkCallback (MakeCallback (&NqapWifiMac::TxOk, this));
m_dca->SetTxFailedCallback (MakeCallback (&NqapWifiMac::TxFailed, this));
}
} // namespace ns3

View File

@@ -21,6 +21,7 @@
#define MAC_HIGH_NQAP_H
#include <stdint.h>
#include "ns3/mac48-address.h"
#include "ns3/callback.h"
#include "ns3/packet.h"
@@ -113,7 +114,8 @@ private:
virtual void DoDispose (void);
NqapWifiMac (const NqapWifiMac & ctor_arg);
NqapWifiMac &operator = (const NqapWifiMac &o);
Ptr<DcaTxop> DoGetDcaTxop(void) const;
Ptr<DcaTxop> GetDcaTxop (void) const;
void SetDcaTxop (Ptr<DcaTxop> dcaTxop);
Ptr<DcaTxop> m_dca;
Ptr<DcaTxop> m_beaconDca;

View File

@@ -89,7 +89,8 @@ NqstaWifiMac::GetTypeId (void)
MakeBooleanChecker ())
.AddAttribute ("DcaTxop", "The DcaTxop object",
PointerValue (),
MakePointerAccessor (&NqstaWifiMac::DoGetDcaTxop),
MakePointerAccessor (&NqstaWifiMac::GetDcaTxop,
&NqstaWifiMac::SetDcaTxop),
MakePointerChecker<DcaTxop> ())
.AddTraceSource ("Assoc", "Associated with an access point.",
MakeTraceSourceAccessor (&NqstaWifiMac::m_assocLogger))
@@ -99,7 +100,6 @@ NqstaWifiMac::GetTypeId (void)
return tid;
}
NqstaWifiMac::NqstaWifiMac ()
: m_state (BEACON_MISSED),
m_probeRequestEvent (),
@@ -115,10 +115,6 @@ NqstaWifiMac::NqstaWifiMac ()
m_dcfManager = new DcfManager ();
m_dcfManager->SetupLowListener (m_low);
m_dca = CreateObject<DcaTxop> ();
m_dca->SetLow (m_low);
m_dca->SetManager (m_dcfManager);
}
NqstaWifiMac::~NqstaWifiMac ()
@@ -137,6 +133,7 @@ NqstaWifiMac::DoDispose (void)
m_dcfManager = 0;
m_phy = 0;
m_dca = 0;
m_stationManager = 0;
WifiMac::DoDispose ();
}
@@ -207,10 +204,17 @@ NqstaWifiMac::GetPifs (void) const
return m_low->GetPifs ();
}
Ptr<DcaTxop>
NqstaWifiMac::DoGetDcaTxop(void) const
NqstaWifiMac::GetDcaTxop(void) const
{
return m_dca;
}
void
NqstaWifiMac::SetDcaTxop (Ptr<DcaTxop> dcaTxop)
{
m_dca = dcaTxop;
m_dca->SetLow (m_low);
m_dca->SetManager (m_dcfManager);
}
void
NqstaWifiMac::SetWifiPhy (Ptr<WifiPhy> phy)
{
@@ -565,7 +569,7 @@ NqstaWifiMac::Receive (Ptr<Packet> packet, WifiMacHeader const *hdr)
SetState (WAIT_ASSOC_RESP);
SendAssociationRequest ();
}
}
}
else if (hdr->IsProbeResp ())
{
if (m_state == WAIT_PROBE_RESP)

View File

@@ -137,7 +137,8 @@ private:
virtual void DoDispose (void);
NqstaWifiMac (const NqstaWifiMac & ctor_arg);
NqstaWifiMac &operator = (const NqstaWifiMac & ctor_arg);
Ptr<DcaTxop> DoGetDcaTxop(void) const;
Ptr<DcaTxop> GetDcaTxop(void) const;
void SetDcaTxop (Ptr<DcaTxop> dcaTxop);
void SetState (enum MacState value);
enum MacState m_state;

View File

@@ -33,6 +33,8 @@
#include "ns3/simulator.h"
#include "ns3/test.h"
#include "ns3/object-factory.h"
#include "dca-txop.h"
#include "ns3/pointer.h"
namespace ns3 {
@@ -69,7 +71,9 @@ WifiTest::CreateOne (Vector pos, Ptr<YansWifiChannel> channel)
Ptr<Node> node = CreateObject<Node> ();
Ptr<WifiNetDevice> dev = CreateObject<WifiNetDevice> ();
Ptr<DcaTxop> queue = CreateObject<DcaTxop> ();
Ptr<WifiMac> mac = m_mac.Create<WifiMac> ();
mac->SetAttribute("DcaTxop", PointerValue (queue));
Ptr<ConstantPositionMobilityModel> mobility = CreateObject<ConstantPositionMobilityModel> ();
Ptr<YansWifiPhy> phy = CreateObject<YansWifiPhy> ();
Ptr<ErrorRateModel> error = CreateObject<YansErrorRateModel> ();

View File

@@ -81,6 +81,8 @@ def build(bld):
'supported-rates.h',
'error-rate-model.h',
'yans-error-rate-model.h',
'dca-txop.h',
'wifi-mac-header.h'
]
obj = bld.create_ns3_program('wifi-phy-test',

View File

@@ -0,0 +1,86 @@
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2009 MIRKO BANCHI
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Mirko Banchi <mk.banchi@gmail.com>
*/
#include "nqos-wifi-mac-helper.h"
#include "ns3/wifi-mac.h"
#include "ns3/pointer.h"
#include "ns3/dca-txop.h"
namespace ns3 {
NqosWifiMacHelper::NqosWifiMacHelper ()
{
m_queue.SetTypeId ("ns3::DcaTxop");
}
NqosWifiMacHelper::~NqosWifiMacHelper ()
{}
NqosWifiMacHelper
NqosWifiMacHelper::Default (void)
{
NqosWifiMacHelper helper;
helper.SetType ("ns3::AdhocWifiMac");
return helper;
}
void
NqosWifiMacHelper::SetType (std::string type,
std::string n0, const AttributeValue &v0,
std::string n1, const AttributeValue &v1,
std::string n2, const AttributeValue &v2,
std::string n3, const AttributeValue &v3,
std::string n4, const AttributeValue &v4,
std::string n5, const AttributeValue &v5,
std::string n6, const AttributeValue &v6,
std::string n7, const AttributeValue &v7)
{
m_mac.SetTypeId (type);
m_mac.Set (n0, v0);
m_mac.Set (n1, v1);
m_mac.Set (n2, v2);
m_mac.Set (n3, v3);
m_mac.Set (n4, v4);
m_mac.Set (n5, v5);
m_mac.Set (n6, v6);
m_mac.Set (n7, v7);
}
void
NqosWifiMacHelper::SetDcaParameters (std::string n0, const AttributeValue &v0,
std::string n1, const AttributeValue &v1,
std::string n2, const AttributeValue &v2,
std::string n3, const AttributeValue &v3)
{
m_queue.Set (n0, v0);
m_queue.Set (n1, v1);
m_queue.Set (n2, v2);
m_queue.Set (n3, v3);
}
Ptr<WifiMac>
NqosWifiMacHelper::Create (void) const
{
Ptr<WifiMac> mac = m_mac.Create<WifiMac> ();
Ptr<DcaTxop> queue = m_queue.Create<DcaTxop> ();
mac->SetAttribute ("DcaTxop", PointerValue (queue));
return mac;
}
} //namespace ns3

View File

@@ -0,0 +1,95 @@
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2009 MIRKO BANCHI
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Mirko Banchi <mk.banchi@gmail.com>
*/
#ifndef NQOS_WIFI_MAC_HELPER_H
#define NQOS_WIFI_MAC_HELPER_H
#include "wifi-helper.h"
namespace ns3 {
class NqosWifiMacHelper : public WifiMacHelper
{
public:
NqosWifiMacHelper ();
virtual ~NqosWifiMacHelper ();
/**
* Create a mac helper in a default working state.
*/
static NqosWifiMacHelper Default (void);
/**
* \param type the type of ns3::WifiMac to create.
* \param n0 the name of the attribute to set
* \param v0 the value of the attribute to set
* \param n1 the name of the attribute to set
* \param v1 the value of the attribute to set
* \param n2 the name of the attribute to set
* \param v2 the value of the attribute to set
* \param n3 the name of the attribute to set
* \param v3 the value of the attribute to set
* \param n4 the name of the attribute to set
* \param v4 the value of the attribute to set
* \param n5 the name of the attribute to set
* \param v5 the value of the attribute to set
* \param n6 the name of the attribute to set
* \param v6 the value of the attribute to set
* \param n7 the name of the attribute to set
* \param v7 the value of the attribute to set
*
* All the attributes specified in this method should exist
* in the requested mac.
*/
void SetType (std::string type,
std::string n0 = "", const AttributeValue &v0 = EmptyAttributeValue (),
std::string n1 = "", const AttributeValue &v1 = EmptyAttributeValue (),
std::string n2 = "", const AttributeValue &v2 = EmptyAttributeValue (),
std::string n3 = "", const AttributeValue &v3 = EmptyAttributeValue (),
std::string n4 = "", const AttributeValue &v4 = EmptyAttributeValue (),
std::string n5 = "", const AttributeValue &v5 = EmptyAttributeValue (),
std::string n6 = "", const AttributeValue &v6 = EmptyAttributeValue (),
std::string n7 = "", const AttributeValue &v7 = EmptyAttributeValue ());
/**
* \param type the type of ns3::WifiMac to create.
* \param n0 the name of the attribute to set
* \param v0 the value of the attribute to set
* \param n1 the name of the attribute to set
* \param v1 the value of the attribute to set
* \param n2 the name of the attribute to set
* \param v2 the value of the attribute to set
* \param n3 the name of the attribute to set
*/
void SetDcaParameters (std::string n0 = "", const AttributeValue &v0 = EmptyAttributeValue (),
std::string n1 = "", const AttributeValue &v1 = EmptyAttributeValue (),
std::string n2 = "", const AttributeValue &v2 = EmptyAttributeValue (),
std::string n3 = "", const AttributeValue &v3 = EmptyAttributeValue ());
private:
/**
* \returns a newly-created MAC object.
*
* This method implements the pure virtual method defined in \ref ns3::WifiMacHelper.
*/
virtual Ptr<WifiMac> Create (void) const;
ObjectFactory m_mac;
ObjectFactory m_queue;
};
} //namespace ns3
#endif /* NQOS_WIFI_MAC_HELPER_H */

View File

@@ -1,6 +1,7 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2008 INRIA
* Copyright (c) 2009 MIRKO BANCHI
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -16,6 +17,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
* Author: Mirko Banchi <mk.banchi@gmail.com>
*/
#include "wifi-helper.h"
#include "ns3/wifi-net-device.h"
@@ -40,6 +42,8 @@ namespace ns3 {
WifiPhyHelper::~WifiPhyHelper ()
{}
WifiMacHelper::~WifiMacHelper ()
{}
WifiHelper::WifiHelper ()
{}
@@ -49,7 +53,6 @@ WifiHelper::Default (void)
{
WifiHelper helper;
helper.SetRemoteStationManager ("ns3::ArfWifiManager");
helper.SetMac ("ns3::AdhocWifiMac");
return helper;
}
@@ -76,31 +79,9 @@ WifiHelper::SetRemoteStationManager (std::string type,
m_stationManager.Set (n7, v7);
}
void
WifiHelper::SetMac (std::string type,
std::string n0, const AttributeValue &v0,
std::string n1, const AttributeValue &v1,
std::string n2, const AttributeValue &v2,
std::string n3, const AttributeValue &v3,
std::string n4, const AttributeValue &v4,
std::string n5, const AttributeValue &v5,
std::string n6, const AttributeValue &v6,
std::string n7, const AttributeValue &v7)
{
m_mac = ObjectFactory ();
m_mac.SetTypeId (type);
m_mac.Set (n0, v0);
m_mac.Set (n1, v1);
m_mac.Set (n2, v2);
m_mac.Set (n3, v3);
m_mac.Set (n4, v4);
m_mac.Set (n5, v5);
m_mac.Set (n6, v6);
m_mac.Set (n7, v7);
}
NetDeviceContainer
WifiHelper::Install (const WifiPhyHelper &phyHelper, NodeContainer c) const
WifiHelper::Install (const WifiPhyHelper &phyHelper,
const WifiMacHelper &macHelper, NodeContainer c) const
{
NetDeviceContainer devices;
for (NodeContainer::Iterator i = c.Begin (); i != c.End (); ++i)
@@ -108,7 +89,7 @@ WifiHelper::Install (const WifiPhyHelper &phyHelper, NodeContainer c) const
Ptr<Node> node = *i;
Ptr<WifiNetDevice> device = CreateObject<WifiNetDevice> ();
Ptr<WifiRemoteStationManager> manager = m_stationManager.Create<WifiRemoteStationManager> ();
Ptr<WifiMac> mac = m_mac.Create<WifiMac> ();
Ptr<WifiMac> mac = macHelper.Create ();
Ptr<WifiPhy> phy = phyHelper.Create (node, device);
mac->SetAddress (Mac48Address::Allocate ());
device->SetMac (mac);
@@ -120,16 +101,20 @@ WifiHelper::Install (const WifiPhyHelper &phyHelper, NodeContainer c) const
}
return devices;
}
NetDeviceContainer
WifiHelper::Install (const WifiPhyHelper &phy, Ptr<Node> node) const
WifiHelper::Install (const WifiPhyHelper &phy,
const WifiMacHelper &mac, Ptr<Node> node) const
{
return Install (phy, NodeContainer (node));
return Install (phy, mac, NodeContainer (node));
}
NetDeviceContainer
WifiHelper::Install (const WifiPhyHelper &phy, std::string nodeName) const
WifiHelper::Install (const WifiPhyHelper &phy,
const WifiMacHelper &mac, std::string nodeName) const
{
Ptr<Node> node = Names::Find<Node> (nodeName);
return Install (phy, NodeContainer (node));
return Install (phy, mac, NodeContainer (node));
}
} // namespace ns3

View File

@@ -1,6 +1,7 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2008 INRIA
* Copyright (c) 2009 MIRKO BANCHI
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -16,6 +17,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
* Author: Mirko Banchi <mk.banchi@gmail.com>
*/
#ifndef WIFI_HELPER_H
#define WIFI_HELPER_H
@@ -29,6 +31,7 @@
namespace ns3 {
class WifiPhy;
class WifiMac;
class WifiNetDevice;
class Node;
@@ -53,6 +56,25 @@ public:
virtual Ptr<WifiPhy> Create (Ptr<Node> node, Ptr<WifiNetDevice> device) const = 0;
};
/**
* \brief create MAC objects
*
* This base class must be implemented by new MAC implementation which wish to integrate
* with the \ref ns3::WifiHelper class.
*/
class WifiMacHelper
{
public:
virtual ~WifiMacHelper ();
/**
* \returns a new MAC object.
*
* Subclasses must implement this method to allow the ns3::WifiHelper class
* to create MAC objects from ns3::WifiHelper::Install.
*/
virtual Ptr<WifiMac> Create (void) const = 0;
};
/**
* \brief helps to create WifiNetDevice objects
*
@@ -108,61 +130,33 @@ public:
std::string n5 = "", const AttributeValue &v5 = EmptyAttributeValue (),
std::string n6 = "", const AttributeValue &v6 = EmptyAttributeValue (),
std::string n7 = "", const AttributeValue &v7 = EmptyAttributeValue ());
/**
* \param type the type of ns3::WifiMac to create.
* \param n0 the name of the attribute to set
* \param v0 the value of the attribute to set
* \param n1 the name of the attribute to set
* \param v1 the value of the attribute to set
* \param n2 the name of the attribute to set
* \param v2 the value of the attribute to set
* \param n3 the name of the attribute to set
* \param v3 the value of the attribute to set
* \param n4 the name of the attribute to set
* \param v4 the value of the attribute to set
* \param n5 the name of the attribute to set
* \param v5 the value of the attribute to set
* \param n6 the name of the attribute to set
* \param v6 the value of the attribute to set
* \param n7 the name of the attribute to set
* \param v7 the value of the attribute to set
*
* All the attributes specified in this method should exist
* in the requested mac.
*/
void SetMac (std::string type,
std::string n0 = "", const AttributeValue &v0 = EmptyAttributeValue (),
std::string n1 = "", const AttributeValue &v1 = EmptyAttributeValue (),
std::string n2 = "", const AttributeValue &v2 = EmptyAttributeValue (),
std::string n3 = "", const AttributeValue &v3 = EmptyAttributeValue (),
std::string n4 = "", const AttributeValue &v4 = EmptyAttributeValue (),
std::string n5 = "", const AttributeValue &v5 = EmptyAttributeValue (),
std::string n6 = "", const AttributeValue &v6 = EmptyAttributeValue (),
std::string n7 = "", const AttributeValue &v7 = EmptyAttributeValue ());
/**
* \param phy the PHY helper to create PHY objects
* \param mac the MAC helper to create MAC objects
* \param c the set of nodes on which a wifi device must be created
* \returns a device container which contains all the devices created by this method.
*/
NetDeviceContainer Install (const WifiPhyHelper &phy, NodeContainer c) const;
NetDeviceContainer Install (const WifiPhyHelper &phy,
const WifiMacHelper &mac, NodeContainer c) const;
/**
* \param phy the PHY helper to create PHY objects
* \param mac the MAC helper to create MAC objects
* \param node the node on which a wifi device must be created
* \returns a device container which contains all the devices created by this method.
*/
NetDeviceContainer Install (const WifiPhyHelper &phy, Ptr<Node> node) const;
NetDeviceContainer Install (const WifiPhyHelper &phy,
const WifiMacHelper &mac, Ptr<Node> node) const;
/**
* \param phy the PHY helper to create PHY objects
* \param mac the MAC helper to create MAC objects
* \param nodeName the name of node on which a wifi device must be created
* \returns a device container which contains all the devices created by this method.
*/
NetDeviceContainer Install (const WifiPhyHelper &phy, std::string nodeName) const;
NetDeviceContainer Install (const WifiPhyHelper &phy,
const WifiMacHelper &mac, std::string nodeName) const;
private:
ObjectFactory m_stationManager;
ObjectFactory m_mac;
};
} // namespace ns3

View File

@@ -23,6 +23,7 @@ def build(bld):
'bridge-helper.cc',
'yans-wifi-helper.cc',
'v4ping-helper.cc',
'nqos-wifi-mac-helper.cc',
]
headers = bld.new_task_gen('ns3header')
@@ -48,6 +49,7 @@ def build(bld):
'bridge-helper.h',
'yans-wifi-helper.h',
'v4ping-helper.h',
'nqos-wifi-mac-helper.h',
]
env = bld.env_of_name('default')