21 #include "ns3/config.h"
22 #include "ns3/data-rate.h"
23 #include "ns3/double.h"
25 #include "ns3/net-device-queue-interface.h"
26 #include "ns3/node-container.h"
27 #include "ns3/pointer.h"
28 #include "ns3/queue.h"
29 #include "ns3/simple-net-device-helper.h"
30 #include "ns3/simulator.h"
31 #include "ns3/string.h"
33 #include "ns3/traffic-control-helper.h"
34 #include "ns3/traffic-control-layer.h"
35 #include "ns3/uinteger.h"
63 void AddHeader()
override;
106 void DoRun()
override;
140 uint32_t deviceQueueLength,
141 uint32_t totalTxPackets)
142 :
TestCase(
"Test the operation of the flow control mechanism"),
144 m_deviceQueueLength(deviceQueueLength),
145 m_totalTxPackets(totalTxPackets)
157 for (uint16_t i = 0; i < nPackets; i++)
159 tc->Send(n->
GetDevice(0), Create<QueueDiscTestItem>(Create<Packet>(1000)));
166 const std::string msg)
169 dev->GetAttributeFailSafe(
"TxQueue", ptr);
177 const std::string msg)
180 NS_ASSERT_MSG(ndqi,
"A device queue interface has not been aggregated to the device");
187 const std::string msg)
208 simple.
SetQueue(
"ns3::DropTailQueue",
216 simple.
Install(n.
Get(0), DynamicCast<SimpleChannel>(rxDevC.
Get(0)->GetChannel())).
Get(0);
248 uint32_t checkTimeMs = 0;
249 uint32_t deviceQueuePackets = 0;
250 uint32_t qdiscPackets = 0;
252 uint32_t txPackets = 0;
255 checkTimeMs = 8 * (txPackets - 1) + 1;
265 "The device queue must be stopped after " +
275 "The device queue must not be stopped after " +
294 " packets in the queue disc after " +
314 "There must be 3 packets in the device queue after 1ms");
320 "The device queue must be stopped after 1ms");
326 "There must be 6 packets in the queue disc after 1ms");
334 "There must be 3 packets in the device queue after 9ms");
340 "The device queue must be stopped after 9ms");
346 "There must be 5 packets in the queue disc after 9ms");
354 "There must be 3 packets in the device queue after 17ms");
360 "The device queue must be stopped after 17ms");
366 "There must be 4 packets in the queue disc after 17ms");
374 "There must be 3 packets in the device queue after 25ms");
380 "The device queue must be stopped after 25ms");
386 "There must be 3 packets in the queue disc after 25ms");
394 "There must be 3 packets in the device queue after 33ms");
400 "The device queue must be stopped after 33ms");
406 "There must be 2 packets in the queue disc after 33ms");
414 "There must be 3 packets in the device queue after 41ms");
420 "The device queue must be stopped after 41ms");
426 "There must be 1 packet in the queue disc after 41ms");
434 "There must be 3 packets in the device queue after 49ms");
440 "The device queue must be stopped after 49ms");
446 "The queue disc must be empty after 49ms");
455 "There must be 2 packets in the device queue after 57ms");
461 "The device queue must not be stopped after 57ms");
467 "The queue disc must be empty after 57ms");
476 "The device queue must be empty after 81ms");
482 "The device queue must not be stopped after 81ms");
488 "The queue disc must be empty after 81ms");
492 Simulator::Destroy();
bool Mark() override
Marks the packet as a substitute for dropping it, such as for Explicit Congestion Notification.
QueueDiscTestItem(const QueueDiscTestItem &)=delete
QueueDiscTestItem & operator=(const QueueDiscTestItem &)=delete
QueueDiscTestItem()=delete
~QueueDiscTestItem() override
void AddHeader() override
Add the header to the packet.
Traffic Control Flow Control Test Case.
uint32_t m_deviceQueueLength
the queue length of the device
void CheckPacketsInQueueDisc(Ptr< NetDevice > dev, uint16_t nPackets, const std::string msg)
Check if the queue disc stores the expected number of packets.
void DoRun() override
Implementation to actually run this TestCase.
void SendPackets(Ptr< Node > n, uint16_t nPackets)
Instruct a node to send a specified number of packets.
TcFlowControlTestCase(QueueSizeUnit tt, uint32_t deviceQueueLength, uint32_t totalTxPackets)
Constructor.
void CheckDeviceQueueStopped(Ptr< NetDevice > dev, bool value, const std::string msg)
Check if the device queue is in the expected status (stopped or not)
~TcFlowControlTestCase() override
QueueSizeUnit m_type
the test type
void CheckPacketsInDeviceQueue(Ptr< NetDevice > dev, uint16_t nPackets, const std::string msg)
Check if the device queue stores the expected number of packets.
uint32_t m_totalTxPackets
the toal number of packets to transmit
Traffic Control Flow Control Test Suite.
holds a vector of ns3::NetDevice pointers
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
Network device transmission queue interface.
keep track of a set of node pointers.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
Ptr< NetDevice > GetDevice(uint32_t index) const
Retrieve the index-th NetDevice associated to this node.
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
void AggregateObject(Ptr< Object > other)
Aggregate two Objects together.
Hold objects of type Ptr<T>.
QueueDiscItem is the abstract base class for items that are stored in a queue disc.
Template class for packet Queues.
build a set of SimpleNetDevice objects
void SetQueue(std::string type, Ts &&... args)
Each net device must have a queue to pass packets through.
void SetDeviceAttribute(std::string n1, const AttributeValue &v1)
NetDeviceContainer Install(Ptr< Node > node) const
This method creates an ns3::SimpleChannel with the attributes configured by SimpleNetDeviceHelper::Se...
Hold variables of type string.
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
@ UNIT
This test suite implements a Unit Test.
Build a set of QueueDisc objects.
QueueDiscContainer Install(NetDeviceContainer c)
The Traffic Control layer aims at introducing an equivalent of the Linux Traffic Control infrastructu...
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
void(* DataRate)(DataRate oldValue, DataRate newValue)
TracedValue callback signature for DataRate.
QueueSizeUnit
Enumeration of the operating modes of queues.
@ BYTES
Use number of bytes for queue size.
@ PACKETS
Use number of packets for queue size.
#define NS_TEST_EXPECT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report if not.
Time Seconds(double value)
Construct a Time in the indicated unit.
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
TcFlowControlTestSuite g_tcFlowControlTestSuite
the test suite
NLOHMANN_BASIC_JSON_TPL_DECLARATION std::string to_string(const NLOHMANN_BASIC_JSON_TPL &j)
user-defined to_string function for JSON values
void(* Time)(Time oldValue, Time newValue)
TracedValue callback signature for Time.
Every class exported by the ns3 library is enclosed in the ns3 namespace.