A Discrete-Event Network Simulator
API
wifi-ac-mapping-test-suite.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2016 Universita' degli Studi di Napoli Federico II
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Stefano Avallone <stavallo@unina.it>
19  */
20 
21 #include "ns3/string.h"
22 #include "ns3/test.h"
23 #include "ns3/pointer.h"
24 #include "ns3/ssid.h"
25 #include "ns3/packet-sink.h"
26 #include "ns3/wifi-net-device.h"
27 #include "ns3/wifi-mac.h"
28 #include "ns3/wifi-mac-queue.h"
29 #include "ns3/qos-txop.h"
30 #include "ns3/yans-wifi-helper.h"
31 #include "ns3/mobility-helper.h"
32 #include "ns3/internet-stack-helper.h"
33 #include "ns3/ipv4-address-helper.h"
34 #include "ns3/packet-sink-helper.h"
35 #include "ns3/on-off-helper.h"
36 #include "ns3/traffic-control-helper.h"
37 #include "ns3/traffic-control-layer.h"
38 #include "ns3/llc-snap-header.h"
39 
40 using namespace ns3;
41 
42 NS_LOG_COMPONENT_DEFINE ("WifiAcMappingTest");
43 
45 {
46 public:
47  WifiAcMappingTest (uint8_t tos, uint8_t expectedQueue);
48  virtual void DoRun (void);
49 
50 private:
51  static void PacketEnqueuedInQueueDisc (uint8_t tos, uint16_t* count, Ptr<const QueueDiscItem> item);
52  static void PacketEnqueuedInWifiMacQueue (uint8_t tos, uint16_t* count, Ptr<const WifiMacQueueItem> item);
53  uint8_t m_tos;
54  uint16_t m_expectedQueue;
55  uint16_t m_QueueDiscCount[4];
56  uint16_t m_WifiMacQueueCount[4];
57 };
58 
59 WifiAcMappingTest::WifiAcMappingTest (uint8_t tos, uint8_t expectedQueue)
60  : TestCase ("User priority to Access Category mapping test. Checks that packets are "
61  "enqueued in the correct child queue disc of the mq root queue disc and "
62  "in the correct wifi MAC queue"),
63  m_tos (tos),
64  m_expectedQueue (expectedQueue)
65 {
66  for (uint8_t i = 0; i < 4; i++)
67  {
68  m_QueueDiscCount[i] = 0;
69  m_WifiMacQueueCount[i] = 0;
70  }
71 }
72 
73 void
75 {
76  uint8_t val;
77  if (item->GetUint8Value (QueueItem::IP_DSFIELD, val) && val == tos)
78  {
79  (*count)++;
80  }
81 }
82 
83 void
85 {
86  LlcSnapHeader llc;
87  Ptr<Packet> packet = item->GetPacket ()->Copy ();
88  packet->RemoveHeader (llc);
89 
90  if (llc.GetType () == Ipv4L3Protocol::PROT_NUMBER)
91  {
92  Ipv4Header iph;
93  packet->PeekHeader (iph);
94  if (iph.GetTos () == tos)
95  {
96  (*count)++;
97  }
98  }
99 }
100 
101 void
103 {
105  WifiMacHelper wifiMac;
106  YansWifiPhyHelper wifiPhy;
107  YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
108  wifiPhy.SetChannel (wifiChannel.Create ());
109 
110  Ssid ssid = Ssid ("wifi-ac-mapping");
111  wifi.SetRemoteStationManager ("ns3::ArfWifiManager");
112 
113  // Setup the AP, which will be the source of traffic for this test
114  NodeContainer ap;
115  ap.Create (1);
116  wifiMac.SetType ("ns3::ApWifiMac",
117  "QosSupported", BooleanValue (true),
118  "Ssid", SsidValue (ssid));
119 
120  NetDeviceContainer apDev = wifi.Install (wifiPhy, wifiMac, ap);
121 
122  // Setup one STA, which will be the sink for traffic in this test.
123  NodeContainer sta;
124  sta.Create (1);
125  wifiMac.SetType ("ns3::StaWifiMac",
126  "QosSupported", BooleanValue (true),
127  "Ssid", SsidValue (ssid));
128  NetDeviceContainer staDev = wifi.Install (wifiPhy, wifiMac, sta);
129 
130  // Our devices will have fixed positions
132  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
133  mobility.SetPositionAllocator ("ns3::GridPositionAllocator",
134  "MinX", DoubleValue (0.0),
135  "MinY", DoubleValue (0.0),
136  "DeltaX", DoubleValue (5.0),
137  "DeltaY", DoubleValue (10.0),
138  "GridWidth", UintegerValue (2),
139  "LayoutType", StringValue ("RowFirst"));
140  mobility.Install (sta);
141  mobility.Install (ap);
142 
143  // Now we install internet stacks on our devices
145  stack.Install (ap);
146  stack.Install (sta);
147 
149  uint16_t handle = tch.SetRootQueueDisc ("ns3::MqQueueDisc");
150  TrafficControlHelper::ClassIdList cls = tch.AddQueueDiscClasses (handle, 4, "ns3::QueueDiscClass");
151  tch.AddChildQueueDiscs (handle, cls, "ns3::FqCoDelQueueDisc");
152  tch.Install (apDev);
153  tch.Install (staDev);
154 
156  address.SetBase ("192.168.0.0", "255.255.255.0");
157  Ipv4InterfaceContainer staNodeInterface, apNodeInterface;
158  staNodeInterface = address.Assign (staDev);
159  apNodeInterface = address.Assign (apDev);
160 
161  uint16_t udpPort = 50000;
162 
163  PacketSinkHelper packetSink ("ns3::UdpSocketFactory",
164  InetSocketAddress (Ipv4Address::GetAny (), udpPort));
165  ApplicationContainer sinkApp = packetSink.Install (sta.Get (0));
166  sinkApp.Start (Seconds (0));
167  sinkApp.Stop (Seconds (4.0));
168 
169  // The packet source is an on-off application on the AP device
170  InetSocketAddress dest (staNodeInterface.GetAddress (0), udpPort);
171  dest.SetTos (m_tos);
172  OnOffHelper onoff ("ns3::UdpSocketFactory", dest);
173  onoff.SetConstantRate (DataRate ("5kbps"), 500);
174  ApplicationContainer sourceApp = onoff.Install (ap.Get (0));
175  sourceApp.Start (Seconds (1.0));
176  sourceApp.Stop (Seconds (4.0));
177 
178  // The first packet will be transmitted at time 1+(500*8)/5000 = 1.8s.
179  // The second packet will be transmitted at time 1.8+(500*8)/5000 = 2.6s.
180  // The third packet will be transmitted at time 2.6+(500*8)/5000 = 3.4s.
181 
182  Simulator::Stop (Seconds (5.0));
183 
184  Ptr<QueueDisc> root = ap.Get (0)->GetObject<TrafficControlLayer> ()->GetRootQueueDiscOnDevice (apDev.Get (0));
185  NS_TEST_ASSERT_MSG_EQ (root->GetNQueueDiscClasses (), 4, "The root queue disc should have 4 classes");
186  // Get the four child queue discs and connect their Enqueue trace to the PacketEnqueuedInQueueDisc
187  // method, which counts how many packets with the given ToS value have been enqueued
188  root->GetQueueDiscClass (0)->GetQueueDisc ()->TraceConnectWithoutContext ("Enqueue",
190 
191  root->GetQueueDiscClass (1)->GetQueueDisc ()->TraceConnectWithoutContext ("Enqueue",
193 
194  root->GetQueueDiscClass (2)->GetQueueDisc ()->TraceConnectWithoutContext ("Enqueue",
196 
197  root->GetQueueDiscClass (3)->GetQueueDisc ()->TraceConnectWithoutContext ("Enqueue",
199 
200  Ptr<WifiMac> apMac = DynamicCast<WifiNetDevice> (apDev.Get (0))->GetMac ();
201  PointerValue ptr;
202  // Get the four wifi mac queues and connect their Enqueue trace to the PacketEnqueuedInWifiMacQueue
203  // method, which counts how many packets with the given ToS value have been enqueued
204  apMac->GetAttribute ("BE_Txop", ptr);
205  ptr.Get<QosTxop> ()->GetWifiMacQueue ()->TraceConnectWithoutContext ("Enqueue",
207 
208  apMac->GetAttribute ("BK_Txop", ptr);
209  ptr.Get<QosTxop> ()->GetWifiMacQueue ()->TraceConnectWithoutContext ("Enqueue",
211 
212  apMac->GetAttribute ("VI_Txop", ptr);
213  ptr.Get<QosTxop> ()->GetWifiMacQueue ()->TraceConnectWithoutContext ("Enqueue",
215 
216  apMac->GetAttribute ("VO_Txop", ptr);
217  ptr.Get<QosTxop> ()->GetWifiMacQueue ()->TraceConnectWithoutContext ("Enqueue",
219 
220  Simulator::Run ();
221 
222  for (uint32_t i = 0; i < 4; i++)
223  {
224  if (i == m_expectedQueue)
225  {
226  NS_TEST_ASSERT_MSG_GT_OR_EQ (m_QueueDiscCount[i], 1, "There is no packet in the expected queue disc " << i);
227  NS_TEST_ASSERT_MSG_GT_OR_EQ (m_WifiMacQueueCount[i], 1, "There is no packet in the expected Wifi MAC queue " << i);
228  }
229  else
230  {
231  NS_TEST_ASSERT_MSG_EQ (m_QueueDiscCount[i], 0, "Unexpectedly, there is a packet in queue disc " << i);
232  NS_TEST_ASSERT_MSG_EQ (m_WifiMacQueueCount[i], 0, "Unexpectedly, there is a packet in Wifi MAC queue " << i);
233  }
234  }
235 
236  uint32_t totalOctetsThrough =
237  DynamicCast<PacketSink> (sinkApp.Get (0))->GetTotalRx ();
238 
239  // Check that the three packets have been received
240  NS_TEST_ASSERT_MSG_EQ (totalOctetsThrough, 1500, "Three packets should have been received");
241 
242  Simulator::Destroy ();
243 }
244 
245 
247 {
248 public:
250 };
251 
253  : TestSuite ("wifi-ac-mapping", SYSTEM)
254 {
255  AddTestCase (new WifiAcMappingTest (0xb8, 2), TestCase::QUICK); // EF in AC_VI
256  AddTestCase (new WifiAcMappingTest (0x28, 1), TestCase::QUICK); // AF11 in AC_BK
257  AddTestCase (new WifiAcMappingTest (0x70, 0), TestCase::QUICK); // AF32 in AC_BE
258  AddTestCase (new WifiAcMappingTest (0xc0, 3), TestCase::QUICK); // CS7 in AC_VO
259 }
260 
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
Definition: packet.cc:280
holds a vector of ns3::Application pointers.
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
WifiAcMappingTest(uint8_t tos, uint8_t expectedQueue)
an Inet address class
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:73
AttributeValue implementation for Boolean.
Definition: boolean.h:36
QueueDiscContainer Install(NetDeviceContainer c)
Ptr< T > Get(void) const
Definition: pointer.h:201
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Hold variables of type string.
Definition: string.h:41
Introspection did not find any typical Config paths.
Make it easy to create and manage PHY objects for the YANS model.
A suite of tests to run.
Definition: test.h:1343
Callback< R > MakeBoundCallback(R(*fnPtr)(TX), ARG a1)
Make Callbacks with one bound argument.
Definition: callback.h:1703
static void PacketEnqueuedInWifiMacQueue(uint8_t tos, uint16_t *count, Ptr< const WifiMacQueueItem > item)
Handle packet fragmentation and retransmissions for QoS data frames as well as MSDU aggregation (A-MS...
Definition: qos-txop.h:92
uint8_t GetTos(void) const
Definition: ipv4-header.cc:194
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
ApplicationContainer Install(NodeContainer c) const
Install an ns3::PacketSinkApplication on each node of the input container configured with all the att...
aggregate IP/TCP/UDP functionality to existing Nodes.
ClassIdList AddQueueDiscClasses(uint16_t handle, uint16_t count, const std::string &type, Args &&... args)
Helper function used to add the given number of queue disc classes (of the given type and with the gi...
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes...
encapsulates test code
Definition: test.h:1153
helps to create WifiNetDevice objects
Definition: wifi-helper.h:318
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
Definition: on-off-helper.h:42
stack
Definition: first.py:41
Ptr< YansWifiChannel > Create(void) const
mobility
Definition: third.py:108
Class for representing data rates.
Definition: data-rate.h:88
Packet header for IPv4.
Definition: ipv4-header.h:33
void SetChannel(Ptr< YansWifiChannel > channel)
ApplicationContainer Install(NodeContainer c) const
Install an ns3::OnOffApplication on each node of the input container configured with all the attribut...
uint16_t GetType(void)
Return the Ethertype.
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
Hold an unsigned integer type.
Definition: uinteger.h:44
ssid
Definition: third.py:100
#define NS_TEST_ASSERT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report and abort if not.
Definition: test.h:166
holds a vector of ns3::NetDevice pointers
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
Definition: packet.cc:290
Build a set of QueueDisc objects.
static void PacketEnqueuedInQueueDisc(uint8_t tos, uint16_t *count, Ptr< const QueueDiscItem > item)
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter...
Ptr< QueueDiscClass > GetQueueDiscClass(std::size_t i) const
Get the i-th queue disc class.
Definition: queue-disc.cc:662
uint16_t SetRootQueueDisc(const std::string &type, Args &&... args)
Helper function used to set a root queue disc of the given type and with the given attributes...
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:470
std::vector< uint16_t > ClassIdList
Container type for Class IDs.
Ptr< const Packet > GetPacket(void) const
Get the packet stored in this item.
bool TraceConnectWithoutContext(std::string name, const CallbackBase &cb)
Connect a TraceSource to a Callback without a context.
Definition: object-base.cc:293
Every class exported by the ns3 library is enclosed in the ns3 namespace.
void SetConstantRate(DataRate dataRate, uint32_t packetSize=512)
Helper function to set a constant rate source.
keep track of a set of node pointers.
Hold objects of type Ptr<T>.
Definition: pointer.h:36
std::size_t GetNQueueDiscClasses(void) const
Get the number of queue disc classes.
Definition: queue-disc.cc:669
address
Definition: first.py:44
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
Definition: packet.cc:121
manage and create wifi channel objects for the YANS model.
create MAC layers for a ns3::WifiNetDevice.
virtual bool GetUint8Value(Uint8Values field, uint8_t &value) const
Retrieve the value of a given field from the packet, if present.
Definition: queue-item.cc:57
The IEEE 802.11 SSID Information Element.
Definition: ssid.h:35
HandleList AddChildQueueDiscs(uint16_t handle, const ClassIdList &classes, const std::string &type, Args &&... args)
Helper function used to attach a child queue disc (of the given type and with the given attributes) t...
virtual 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(), std::string n8="", const AttributeValue &v8=EmptyAttributeValue(), std::string n9="", const AttributeValue &v9=EmptyAttributeValue(), std::string n10="", const AttributeValue &v10=EmptyAttributeValue())
wifi
Definition: third.py:96
Helper class used to assign positions and mobility models to nodes.
void Stop(Time stop)
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter...
static WifiAcMappingTestSuite wifiAcMappingTestSuite
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1278
AttributeValue implementation for Ssid.
Definition: ssid.h:105
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
virtual void DoRun(void)
Implementation to actually run this TestCase.
This class can be used to hold variables of floating point type such as &#39;double&#39; or &#39;float&#39;...
Definition: double.h:41
#define NS_TEST_ASSERT_MSG_GT_OR_EQ(actual, limit, msg)
Test that an actual value is greater than or equal to a limit and report and abort if not...
Definition: test.h:1016
void GetAttribute(std::string name, AttributeValue &value) const
Get the value of an attribute, raising fatal errors if unsuccessful.
Definition: object-base.cc:223
Ptr< Application > Get(uint32_t i) const
Get the Ptr<Application> stored in this container at a given index.
Header for the LLC/SNAP encapsulation.