From 586d3d9e37201a5cf4f976e9e9a7c46322f8bab0 Mon Sep 17 00:00:00 2001 From: Pasquale Imputato Date: Tue, 8 Mar 2016 10:48:13 -0800 Subject: [PATCH] traffic-control: fix the RED examples --- src/traffic-control/examples/pfifo-vs-red.cc | 85 +++++++++++++------- src/traffic-control/examples/red-tests.cc | 75 +++++++++-------- src/traffic-control/examples/wscript | 8 +- 3 files changed, 103 insertions(+), 65 deletions(-) diff --git a/src/traffic-control/examples/pfifo-vs-red.cc b/src/traffic-control/examples/pfifo-vs-red.cc index 768867be6..b8caf0ac0 100644 --- a/src/traffic-control/examples/pfifo-vs-red.cc +++ b/src/traffic-control/examples/pfifo-vs-red.cc @@ -14,6 +14,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Author: John Abraham + * Modified by: Pasquale Imputato * */ @@ -24,6 +25,7 @@ #include "ns3/point-to-point-module.h" #include "ns3/applications-module.h" #include "ns3/point-to-point-layout-module.h" +#include "ns3/traffic-control-module.h" #include #include @@ -37,65 +39,64 @@ int main (int argc, char *argv[]) uint32_t nLeaf = 5; uint32_t maxPackets = 100; uint32_t modeBytes = 0; + uint32_t queueDiscLimitPackets = 1000; double minTh = 50; double maxTh = 80; uint32_t pktSize = 512; std::string appDataRate = "10Mbps"; - std::string queueType = "DropTail"; + std::string queueDiscType = "PfifoFast"; uint16_t port = 5001; std::string bottleNeckLinkBw = "1Mbps"; std::string bottleNeckLinkDelay = "50ms"; CommandLine cmd; cmd.AddValue ("nLeaf", "Number of left and right side leaf nodes", nLeaf); - cmd.AddValue ("maxPackets","Max Packets allowed in the queue", maxPackets); - cmd.AddValue ("queueType", "Set Queue type to DropTail or RED", queueType); + cmd.AddValue ("maxPackets","Max Packets allowed in the device queue", maxPackets); + cmd.AddValue ("queueDiscLimitPackets","Max Packets allowed in the queue disc", queueDiscLimitPackets); + cmd.AddValue ("queueDiscType", "Set QueueDisc type to PfifoFast or RED", queueDiscType); cmd.AddValue ("appPktSize", "Set OnOff App Packet Size", pktSize); cmd.AddValue ("appDataRate", "Set OnOff App DataRate", appDataRate); - cmd.AddValue ("modeBytes", "Set Queue mode to Packets <0> or bytes <1>", modeBytes); + cmd.AddValue ("modeBytes", "Set QueueDisc mode to Packets <0> or bytes <1>", modeBytes); cmd.AddValue ("redMinTh", "RED queue minimum threshold", minTh); cmd.AddValue ("redMaxTh", "RED queue maximum threshold", maxTh); cmd.Parse (argc,argv); - if ((queueType != "RED") && (queueType != "DropTail")) + if ((queueDiscType != "RED") && (queueDiscType != "PfifoFast")) { - NS_ABORT_MSG ("Invalid queue type: Use --queueType=RED or --queueType=DropTail"); + NS_ABORT_MSG ("Invalid queue disc type: Use --queueDiscType=RED or --queueDiscType=PfifoFast"); } Config::SetDefault ("ns3::OnOffApplication::PacketSize", UintegerValue (pktSize)); Config::SetDefault ("ns3::OnOffApplication::DataRate", StringValue (appDataRate)); + Config::SetDefault ("ns3::Queue::Mode", StringValue ("QUEUE_MODE_PACKETS")); + Config::SetDefault ("ns3::Queue::MaxPackets", UintegerValue (maxPackets)); if (!modeBytes) - { - Config::SetDefault ("ns3::DropTailQueue::Mode", StringValue ("QUEUE_MODE_PACKETS")); - Config::SetDefault ("ns3::DropTailQueue::MaxPackets", UintegerValue (maxPackets)); - Config::SetDefault ("ns3::RedQueue::Mode", StringValue ("QUEUE_MODE_PACKETS")); - Config::SetDefault ("ns3::RedQueue::QueueLimit", UintegerValue (maxPackets)); - } + { + Config::SetDefault ("ns3::RedQueueDisc::Mode", StringValue ("QUEUE_MODE_PACKETS")); + Config::SetDefault ("ns3::RedQueueDisc::QueueLimit", UintegerValue (queueDiscLimitPackets)); + Config::SetDefault ("ns3::PfifoFastQueueDisc::Limit", UintegerValue (queueDiscLimitPackets)); + } else - { - Config::SetDefault ("ns3::DropTailQueue::Mode", StringValue ("QUEUE_MODE_BYTES")); - Config::SetDefault ("ns3::DropTailQueue::MaxBytes", UintegerValue (maxPackets * pktSize)); - Config::SetDefault ("ns3::RedQueue::Mode", StringValue ("QUEUE_MODE_BYTES")); - Config::SetDefault ("ns3::RedQueue::QueueLimit", UintegerValue (maxPackets * pktSize)); - minTh *= pktSize; - maxTh *= pktSize; - } + { + Config::SetDefault ("ns3::RedQueueDisc::Mode", StringValue ("QUEUE_MODE_BYTES")); + Config::SetDefault ("ns3::RedQueueDisc::QueueLimit", UintegerValue (queueDiscLimitPackets * pktSize)); + minTh *= pktSize; + maxTh *= pktSize; + } + + Config::SetDefault ("ns3::RedQueueDisc::MinTh", DoubleValue (minTh)); + Config::SetDefault ("ns3::RedQueueDisc::MaxTh", DoubleValue (maxTh)); + Config::SetDefault ("ns3::RedQueueDisc::LinkBandwidth", StringValue (bottleNeckLinkBw)); + Config::SetDefault ("ns3::RedQueueDisc::LinkDelay", StringValue (bottleNeckLinkDelay)); // Create the point-to-point link helpers PointToPointHelper bottleNeckLink; bottleNeckLink.SetDeviceAttribute ("DataRate", StringValue (bottleNeckLinkBw)); bottleNeckLink.SetChannelAttribute ("Delay", StringValue (bottleNeckLinkDelay)); - if (queueType == "RED") - { - bottleNeckLink.SetQueue ("ns3::RedQueue", - "MinTh", DoubleValue (minTh), - "MaxTh", DoubleValue (maxTh), - "LinkBandwidth", StringValue (bottleNeckLinkBw), - "LinkDelay", StringValue (bottleNeckLinkDelay)); - } + PointToPointHelper pointToPointLeaf; pointToPointLeaf.SetDeviceAttribute ("DataRate", StringValue ("10Mbps")); pointToPointLeaf.SetChannelAttribute ("Delay", StringValue ("1ms")); @@ -106,7 +107,29 @@ int main (int argc, char *argv[]) // Install Stack InternetStackHelper stack; - d.InstallStack (stack); + for (uint32_t i = 0; i < d.LeftCount (); ++i) + { + stack.Install (d.GetLeft (i)); + } + for (uint32_t i = 0; i < d.RightCount (); ++i) + { + stack.Install (d.GetRight (i)); + } + + if (queueDiscType == "PfifoFast") + { + stack.Install (d.GetLeft ()); + stack.Install (d.GetRight ()); + } + else if (queueDiscType == "RED") + { + stack.Install (d.GetLeft ()); + stack.Install (d.GetRight ()); + TrafficControlHelper tchBottleneck; + tchBottleneck.SetRootQueueDisc ("ns3::RedQueueDisc"); + tchBottleneck.Install (d.GetLeft ()->GetDevice (0)); + tchBottleneck.Install (d.GetRight ()->GetDevice (0)); + } // Assign IP Addresses d.AssignIpv4Addresses (Ipv4AddressHelper ("10.1.1.0", "255.255.255.0"), @@ -150,8 +173,8 @@ int main (int argc, char *argv[]) Ptr pktSink = DynamicCast (app); totalRxBytesCounter += pktSink->GetTotalRx (); } - NS_LOG_UNCOND ("----------------------------\nQueue Type:" - << queueType + NS_LOG_UNCOND ("----------------------------\nQueueDisc Type:" + << queueDiscType << "\nGoodput Bytes/sec:" << totalRxBytesCounter/Simulator::Now ().GetSeconds ()); NS_LOG_UNCOND ("----------------------------"); diff --git a/src/traffic-control/examples/red-tests.cc b/src/traffic-control/examples/red-tests.cc index 0150ca3bf..10a457984 100644 --- a/src/traffic-control/examples/red-tests.cc +++ b/src/traffic-control/examples/red-tests.cc @@ -15,6 +15,7 @@ * * Authors: Marcos Talau * Duy Nguyen + * Modified by: Pasquale Imputato * */ @@ -43,6 +44,7 @@ #include "ns3/flow-monitor-helper.h" #include "ns3/point-to-point-module.h" #include "ns3/applications-module.h" +#include "ns3/traffic-control-module.h" using namespace ns3; @@ -75,9 +77,9 @@ std::stringstream filePlotQueue; std::stringstream filePlotQueueAvg; void -CheckQueueSize (Ptr queue) +CheckQueueSize (Ptr queue) { - uint32_t qSize = StaticCast (queue)->GetQueueSize (); + uint32_t qSize = StaticCast (queue)->GetQueueSize (); avgQueueSize += qSize; checkTimes++; @@ -253,7 +255,7 @@ BuildAppsTest (uint32_t test) int main (int argc, char *argv[]) { - LogComponentEnable ("RedQueue", LOG_LEVEL_INFO); + LogComponentEnable ("RedQueueDisc", LOG_LEVEL_INFO); uint32_t redTest; std::string redLinkDataRate = "1.5Mbps"; @@ -315,33 +317,42 @@ main (int argc, char *argv[]) // RED params NS_LOG_INFO ("Set RED params"); - Config::SetDefault ("ns3::RedQueue::Mode", StringValue ("QUEUE_MODE_PACKETS")); - Config::SetDefault ("ns3::RedQueue::MeanPktSize", UintegerValue (meanPktSize)); - Config::SetDefault ("ns3::RedQueue::Wait", BooleanValue (true)); - Config::SetDefault ("ns3::RedQueue::Gentle", BooleanValue (true)); - Config::SetDefault ("ns3::RedQueue::QW", DoubleValue (0.002)); - Config::SetDefault ("ns3::RedQueue::MinTh", DoubleValue (5)); - Config::SetDefault ("ns3::RedQueue::MaxTh", DoubleValue (15)); - Config::SetDefault ("ns3::RedQueue::QueueLimit", UintegerValue (25)); + Config::SetDefault ("ns3::RedQueueDisc::Mode", StringValue ("QUEUE_MODE_PACKETS")); + Config::SetDefault ("ns3::RedQueueDisc::MeanPktSize", UintegerValue (meanPktSize)); + Config::SetDefault ("ns3::RedQueueDisc::Wait", BooleanValue (true)); + Config::SetDefault ("ns3::RedQueueDisc::Gentle", BooleanValue (true)); + Config::SetDefault ("ns3::RedQueueDisc::QW", DoubleValue (0.002)); + Config::SetDefault ("ns3::RedQueueDisc::MinTh", DoubleValue (5)); + Config::SetDefault ("ns3::RedQueueDisc::MaxTh", DoubleValue (15)); + Config::SetDefault ("ns3::RedQueueDisc::QueueLimit", UintegerValue (1000)); if (redTest == 3) // test like 1, but with bad params { - Config::SetDefault ("ns3::RedQueue::MaxTh", DoubleValue (10)); - Config::SetDefault ("ns3::RedQueue::QW", DoubleValue (0.003)); + Config::SetDefault ("ns3::RedQueueDisc::MaxTh", DoubleValue (10)); + Config::SetDefault ("ns3::RedQueueDisc::QW", DoubleValue (0.003)); } else if (redTest == 5) // test 5, same of test 4, but in byte mode { - Config::SetDefault ("ns3::RedQueue::Mode", StringValue ("QUEUE_MODE_BYTES")); - Config::SetDefault ("ns3::RedQueue::Ns1Compat", BooleanValue (true)); - Config::SetDefault ("ns3::RedQueue::MinTh", DoubleValue (5 * meanPktSize)); - Config::SetDefault ("ns3::RedQueue::MaxTh", DoubleValue (15 * meanPktSize)); - Config::SetDefault ("ns3::RedQueue::QueueLimit", UintegerValue (25 * meanPktSize)); + Config::SetDefault ("ns3::RedQueueDisc::Mode", StringValue ("QUEUE_MODE_BYTES")); + Config::SetDefault ("ns3::RedQueueDisc::Ns1Compat", BooleanValue (true)); + Config::SetDefault ("ns3::RedQueueDisc::MinTh", DoubleValue (5 * meanPktSize)); + Config::SetDefault ("ns3::RedQueueDisc::MaxTh", DoubleValue (15 * meanPktSize)); + Config::SetDefault ("ns3::RedQueueDisc::QueueLimit", UintegerValue (1000 * meanPktSize)); } NS_LOG_INFO ("Install internet stack on all nodes."); InternetStackHelper internet; internet.Install (c); + TrafficControlHelper tchPfifo; + uint16_t handle = tchPfifo.SetRootQueueDisc ("ns3::PfifoFastQueueDisc"); + tchPfifo.AddInternalQueues (handle, 3, "ns3::DropTailQueue", "MaxPackets", UintegerValue (1000)); + tchPfifo.AddPacketFilter (handle, "ns3::PfifoFastIpv4PacketFilter"); + + TrafficControlHelper tchRed; + tchRed.SetRootQueueDisc ("ns3::RedQueueDisc", "LinkBandwidth", StringValue (redLinkDataRate), + "LinkDelay", StringValue (redLinkDelay)); + NS_LOG_INFO ("Create channels"); PointToPointHelper p2p; @@ -349,28 +360,32 @@ main (int argc, char *argv[]) p2p.SetDeviceAttribute ("DataRate", StringValue ("10Mbps")); p2p.SetChannelAttribute ("Delay", StringValue ("2ms")); NetDeviceContainer devn0n2 = p2p.Install (n0n2); + tchPfifo.Install (devn0n2); p2p.SetQueue ("ns3::DropTailQueue"); p2p.SetDeviceAttribute ("DataRate", StringValue ("10Mbps")); p2p.SetChannelAttribute ("Delay", StringValue ("3ms")); NetDeviceContainer devn1n2 = p2p.Install (n1n2); + tchPfifo.Install (devn1n2); - p2p.SetQueue ("ns3::RedQueue", // only backbone link has RED queue - "LinkBandwidth", StringValue (redLinkDataRate), - "LinkDelay", StringValue (redLinkDelay)); + p2p.SetQueue ("ns3::DropTailQueue"); p2p.SetDeviceAttribute ("DataRate", StringValue (redLinkDataRate)); p2p.SetChannelAttribute ("Delay", StringValue (redLinkDelay)); NetDeviceContainer devn2n3 = p2p.Install (n2n3); + // only backbone link has RED queue disc + QueueDiscContainer queueDiscs = tchRed.Install (devn2n3); p2p.SetQueue ("ns3::DropTailQueue"); p2p.SetDeviceAttribute ("DataRate", StringValue ("10Mbps")); p2p.SetChannelAttribute ("Delay", StringValue ("4ms")); NetDeviceContainer devn3n4 = p2p.Install (n3n4); + tchPfifo.Install (devn3n4); p2p.SetQueue ("ns3::DropTailQueue"); p2p.SetDeviceAttribute ("DataRate", StringValue ("10Mbps")); p2p.SetChannelAttribute ("Delay", StringValue ("5ms")); NetDeviceContainer devn3n5 = p2p.Install (n3n5); + tchPfifo.Install (devn3n5); NS_LOG_INFO ("Assign IP Addresses"); Ipv4AddressHelper ipv4; @@ -396,12 +411,11 @@ main (int argc, char *argv[]) if (redTest == 5) { // like in ns2 test, r2 -> r1, have a queue in packet mode - Ptr nd = StaticCast (devn2n3.Get (1)); - Ptr queue = nd->GetQueue (); + Ptr queue = queueDiscs.Get (1); - StaticCast (queue)->SetMode (RedQueue::QUEUE_MODE_PACKETS); - StaticCast (queue)->SetTh (5, 15); - StaticCast (queue)->SetQueueLimit (25); + StaticCast (queue)->SetMode (Queue::QUEUE_MODE_PACKETS); + StaticCast (queue)->SetTh (5, 15); + StaticCast (queue)->SetQueueLimit (1000); } BuildAppsTest (redTest); @@ -428,8 +442,7 @@ main (int argc, char *argv[]) remove (filePlotQueue.str ().c_str ()); remove (filePlotQueueAvg.str ().c_str ()); - Ptr nd = StaticCast (devn2n3.Get (0)); - Ptr queue = nd->GetQueue (); + Ptr queue = queueDiscs.Get (0); Simulator::ScheduleNow (&CheckQueueSize, queue); } @@ -446,15 +459,13 @@ main (int argc, char *argv[]) if (printRedStats) { - Ptr nd = StaticCast (devn2n3.Get (0)); - RedQueue::Stats st = StaticCast (nd->GetQueue ())->GetStats (); + RedQueueDisc::Stats st = StaticCast (queueDiscs.Get (0))->GetStats (); std::cout << "*** RED stats from Node 2 queue ***" << std::endl; std::cout << "\t " << st.unforcedDrop << " drops due prob mark" << std::endl; std::cout << "\t " << st.forcedDrop << " drops due hard mark" << std::endl; std::cout << "\t " << st.qLimDrop << " drops due queue full" << std::endl; - nd = StaticCast (devn2n3.Get (1)); - st = StaticCast (nd->GetQueue ())->GetStats (); + st = StaticCast (queueDiscs.Get (1))->GetStats (); std::cout << "*** RED stats from Node 3 queue ***" << std::endl; std::cout << "\t " << st.unforcedDrop << " drops due prob mark" << std::endl; std::cout << "\t " << st.forcedDrop << " drops due hard mark" << std::endl; diff --git a/src/traffic-control/examples/wscript b/src/traffic-control/examples/wscript index 6c879c3b8..93c16fdd1 100644 --- a/src/traffic-control/examples/wscript +++ b/src/traffic-control/examples/wscript @@ -2,6 +2,10 @@ def build(bld): pass -# obj = bld.create_ns3_program('traffic-control-example', ['traffic-control']) -# obj.source = 'traffic-control-example.cc' + + obj = bld.create_ns3_program('red-tests', ['point-to-point', 'internet', 'applications', 'flow-monitor', 'traffic-control']) + obj.source = 'red-tests.cc' + + obj = bld.create_ns3_program('pfifo-vs-red', ['point-to-point', 'point-to-point-layout', 'internet', 'applications', 'traffic-control']) + obj.source = 'pfifo-vs-red.cc'