From 5233780b1c59b68006bfc5a99260c87f90339f9e Mon Sep 17 00:00:00 2001 From: Tom Henderson Date: Tue, 27 Mar 2007 23:14:31 -0700 Subject: [PATCH] Switch over simple-p2p.cc to use OnOffApplication --- examples/simple-p2p.cc | 144 +++++++++------------------------- src/node/application-list.cc | 6 ++ src/node/application-list.h | 3 +- src/node/onoff-application.cc | 14 ++-- src/node/onoff-application.h | 9 ++- 5 files changed, 58 insertions(+), 118 deletions(-) diff --git a/examples/simple-p2p.cc b/examples/simple-p2p.cc index 8bbc33769..16d9aea3e 100644 --- a/examples/simple-p2p.cc +++ b/examples/simple-p2p.cc @@ -33,8 +33,9 @@ // - CBR/UDP flows from n0 to n3, and from n3 to n1 // - FTP/TCP flow from n0 to n3, starting at time 1.2 to time 1.35 sec. // - UDP packet size of 210 bytes, with per-packet interval 0.00375 sec. +// (i.e., DataRate of 448,000 bps) // - DropTail queues -// - Tracing of queues and packet receptions to file "out.tr" +// - Tracing of queues and packet receptions to file "simple-p2p.tr" #include #include @@ -65,7 +66,6 @@ #include "ns3/udp-header.h" #include "ns3/node-list.h" #include "ns3/trace-root.h" -#include "ns3/object-container.h" #include "ns3/p2p-topology.h" #include "ns3/onoff-application.h" #include "ns3/application-list.h" @@ -148,58 +148,6 @@ AsciiTrace::LogDevRx (TraceContext const &context, Packet &p) m_os << std::endl; } - -static void -GenerateTraffic (DatagramSocket *socket, uint32_t size) -{ - std::cout << "Node: " << socket->GetNode()->GetId () - << " at=" << Simulator::Now ().GetSeconds () << "s," - << " tx bytes=" << size << std::endl; - socket->SendDummy (size); - if (size > 50) - { - Simulator::Schedule (Seconds (0.5), &GenerateTraffic, socket, size - 50); - } -} - -static void -DatagramSocketPrinter (DatagramSocket *socket, uint32_t size, Ipv4Address from, uint16_t fromPort) -{ - std::cout << "Node: " << socket->GetNode()->GetId () - << " at=" << Simulator::Now ().GetSeconds () << "s," - << " rx bytes=" << size << std::endl; -} - -static void -PrintTraffic (DatagramSocket *socket) -{ - socket->SetDummyRxCallback (MakeCallback (&DatagramSocketPrinter)); -} - -#if 0 -static void -PrintRoutingTable (InternetNode *a, std::string name) -{ - Ipv4 *ipv4 = a->GetIpv4 (); - std::cout << "interfaces node="<GetNInterfaces (); i++) - { - Ipv4Interface *interface = ipv4->GetInterface (i); - std::cout << "interface addr="<GetAddress () - << ", netmask="<GetNetworkMask () - << std::endl; - } - - std::cout << "routing table:" << std::endl; - for (uint32_t i = 0; i < ipv4->GetNRoutes (); i++) - { - Ipv4Route *route = ipv4->GetRoute (i); - std::cout << (*route) << std::endl; - } - std::cout << "node end" << std::endl; -} -#endif - int main (int argc, char *argv[]) { #if 0 @@ -210,7 +158,6 @@ int main (int argc, char *argv[]) DebugComponentEnable("PointToPointChannel"); DebugComponentEnable("PointToPointNetDevice"); #endif - ObjectContainer container; // Optionally, specify some default values for Queue objects. // For this example, we specify that we want each queue to @@ -218,7 +165,7 @@ int main (int argc, char *argv[]) // Specify DropTail for default queue type (note. this is actually // the default, but included here as an example). Queue::Default(DropTailQueue()); - // Specify limit of 30 in units of packets. + // Specify limit of 30 in units of packets (not implemented). // Queue::Default().SetLimitPackets(30); // The node factory is designed to allow user specification @@ -236,83 +183,64 @@ int main (int argc, char *argv[]) Node* n2 = Node::Create(); Node* n3 = Node::Create(); - PointToPointChannel* ch1; - ch1 = PointToPointTopology::AddPointToPointLink ( + PointToPointTopology::AddPointToPointLink ( n0, Ipv4Address("10.1.1.1"), n2, Ipv4Address("10.1.1.2"), 5000000, MilliSeconds(2)); - PointToPointChannel* ch2; - ch2 = PointToPointTopology::AddPointToPointLink ( + PointToPointTopology::AddPointToPointLink ( n1, Ipv4Address("10.1.2.1"), n2, Ipv4Address("10.1.2.2"), DataRate(5000000), MilliSeconds(2)); - PointToPointChannel* ch3; - ch3 = PointToPointTopology::AddPointToPointLink ( + PointToPointTopology::AddPointToPointLink ( n2, Ipv4Address("10.1.3.1"), n3, Ipv4Address("10.1.3.2"), DataRate(1500000), MilliSeconds(10)); - // To Do: - // avoid "new" calls, instead use application list - // OnOffSink - // use of rate and time objects - DatagramSocket *source0 = new DatagramSocket (n0); - DatagramSocket *source3 = new DatagramSocket (n3); - DatagramSocket *sink3 = new DatagramSocket(n3); - sink3->Bind (80); - DatagramSocket *sink1 = new DatagramSocket(n1); - sink1->Bind (80); + // Create the OnOff application to send UDP datagrams of size + // 210 bytes at a rate of 448 Kb/s + OnOffApplication* ooff0 = new OnOffApplication( + *n0, + Ipv4Address("10.1.3.2"), + 80, + ConstantVariable(1), + ConstantVariable(0), + DataRate(448000), + 210); + // Add to Node's ApplicationList (takes ownership of pointer) + n0->GetApplicationList()->Add(ooff0); + // Start the application + ooff0->Start(Seconds(1.0)); -#ifdef NOTYET - // The arguments to ApplicationTCPSend constructor are the IPAddress - // of the server, port number for the server, and a random variable - // specifying the amount of data to send. - OnOffApplication* ooff = n1->GetApplicationList()-> - Add(OnOffApplication(*n0, Ipv4Address("10.1.2.2"), - 80, ConstantVariable(1), ConstantVariable(0), 1000, 210)); - - // This is functional and could soon replace the above DatagramSockets, - // but needs tuning - OnOffApplication* ooff = new OnOffApplication(*n0, Ipv4Address("10.1.2.2"), - 80, ConstantVariable(1), ConstantVariable(0), 1000, 210); - container.Acquire (ooff); - ooff->Start(Seconds(1.0)); -#endif - - container.Acquire (source0); - container.Acquire (source3); - container.Acquire (sink3); - container.Acquire (sink1); - - source3->SetDefaultDestination (Ipv4Address ("10.1.2.1"), 80); - source0->SetDefaultDestination (Ipv4Address ("10.1.3.2"), 80); + // Create a similar flow from n3 to n1, starting at time 1.1 seconds + OnOffApplication* ooff1 = new OnOffApplication( + *n3, + Ipv4Address("10.1.2.1"), + 80, + ConstantVariable(1), + ConstantVariable(0), + DataRate(448000), + 210); + // Add to Node's ApplicationList (takes ownership of pointer) + n3->GetApplicationList()->Add(ooff1); + // Start the application + ooff1->Start(Seconds(1.1)); // Here, finish off packet routing configuration + // This will likely set by some global StaticRouting object in the future n0->GetIpv4()->SetDefaultRoute (Ipv4Address ("10.1.1.2"), 1); n3->GetIpv4()->SetDefaultRoute (Ipv4Address ("10.1.3.1"), 1); + // Configure tracing of all enqueue, dequeue, and NetDevice receive events + // Trace output will be sent to the simple-p2p.tr file AsciiTrace trace ("simple-p2p.tr"); trace.TraceAllQueues (); trace.TraceAllNetDeviceRx (); - PrintTraffic (sink3); - GenerateTraffic (source0, 100); - - PrintTraffic (sink1); - GenerateTraffic (source3, 100); - Simulator::StopAt (Seconds(10.0)); Simulator::Run (); - // The below deletes will be managed by future topology objects - // or containers or smart pointers - Simulator::Destroy (); - - ch1->Unref (); - ch2->Unref (); - ch3->Unref (); } diff --git a/src/node/application-list.cc b/src/node/application-list.cc index bdb357515..2d6ee7527 100644 --- a/src/node/application-list.cc +++ b/src/node/application-list.cc @@ -49,6 +49,12 @@ ApplicationList* ApplicationList::Copy(Node& n) const return r; } +void +ApplicationList::Add(Application* a) +{ + m_apps.Add(a); +} + void ApplicationList::SetNode(Node& n) { Capability::SetNode(n); diff --git a/src/node/application-list.h b/src/node/application-list.h index 211749b3b..d2d9838f7 100644 --- a/src/node/application-list.h +++ b/src/node/application-list.h @@ -39,8 +39,9 @@ public: // Inherited from Capabilty virtual ApplicationList* Copy(Node&) const; virtual void SetNode(Node&); // Sets the node for all apps + virtual void Add(Application*); // Add an already new'ed app // Manage the list - template T* Add(const T& t) // Add a new application + template T* AddCopy(const T& t) // Add a new application { T* a = t.Copy(); m_apps.Add(a); diff --git a/src/node/onoff-application.cc b/src/node/onoff-application.cc index a4f00621d..cec8f94ac 100644 --- a/src/node/onoff-application.cc +++ b/src/node/onoff-application.cc @@ -26,6 +26,7 @@ #include "node.h" #include "node-reference.h" #include "ns3/nstime.h" +#include "ns3/data-rate.h" #include "onoff-application.h" #include "ns3/random-variable.h" #include "datagram-socket.h" @@ -36,7 +37,7 @@ using namespace std; namespace ns3 { // Defaults for rate/size -double OnOffApplication::g_defaultRate = 500000.0; +DataRate OnOffApplication::g_defaultRate = DataRate(500000.0); uint32_t OnOffApplication::g_defaultSize = 512; #define nil 0 @@ -48,7 +49,7 @@ uint32_t OnOffApplication::g_defaultSize = 512; uint16_t rport, // Remote port const RandomVariable& ontime, const RandomVariable& offtime, - double rate, + DataRate rate, uint32_t size) : Application(n), m_socket(nil), // Socket allocated on Start @@ -179,7 +180,7 @@ void OnOffApplication::StopApplication() // Called at time specified by Stop m_sendScheduled = false; // Calculate residual bits since last packet sent Time delta(Simulator::Now() - m_lastStartTime); - m_residualBits += (uint32_t)(m_cbrRate * delta.GetSeconds()); + m_residualBits += (uint32_t)(m_cbrRate.GetBitRate() * delta.GetSeconds()); } } @@ -192,7 +193,9 @@ OnOffApplication* OnOffApplication::Copy() const void OnOffApplication::StartSending() { m_startStopScheduled = true; - ScheduleNextTx(); // Schedule the send packet event +// commented out by tomh-- I think you want to start sending immediately +// ScheduleNextTx(); // Schedule the send packet event + SendPacket(); } void OnOffApplication::StopSending() @@ -207,7 +210,8 @@ void OnOffApplication::ScheduleNextTx() if (m_totBytes < m_maxBytes) { uint32_t bits = m_pktSize * 8 - m_residualBits; - Time nextTime(Seconds (bits / m_cbrRate)); // Time till next packet + Time nextTime(Seconds (bits / + static_cast(m_cbrRate.GetBitRate()))); // Time till next packet Simulator::Schedule(nextTime, &OnOffApplication::SendPacket, this); } else diff --git a/src/node/onoff-application.h b/src/node/onoff-application.h index b4a6a942c..ce9b97f00 100644 --- a/src/node/onoff-application.h +++ b/src/node/onoff-application.h @@ -37,6 +37,7 @@ namespace ns3 { class Ipv4Address; class RandomVariable; class DatagramSocket; +class DataRate; class OnOffApplication : public Application { @@ -46,7 +47,7 @@ public: uint16_t, // Peer port const RandomVariable&, // Random variable for On time const RandomVariable&, // Random variable for Off time - double = g_defaultRate, // Data rate when on + DataRate = g_defaultRate, // Data rate when on uint32_t = g_defaultSize); // Size of packets OnOffApplication(const Node& n, const OnOffApplication&); // Copy constructor @@ -68,13 +69,13 @@ public: // Static methods static void DefaultSize(uint32_t s) { g_defaultSize = s;} public: - DatagramSocket* m_socket; // Associated socket + DatagramSocket* m_socket; // Associated socket Ipv4Address m_peerIP; // Peer IP address uint16_t m_peerPort; // Peer port bool m_connected; // True if connected RandomVariable* m_onTime; // rng for On Time RandomVariable* m_offTime; // rng for Off Time - double m_cbrRate; // Rate that data is generated + DataRate m_cbrRate; // Rate that data is generated uint32_t m_pktSize; // Size of packets uint32_t m_residualBits; // Number of generated, but not sent, bits Time m_lastStartTime;// Time last packet sent @@ -87,7 +88,7 @@ public: bool m_sending; // True if currently in sending state public: - static double g_defaultRate; // Default sending rate when on + static DataRate g_defaultRate; // Default sending rate when on static uint32_t g_defaultSize; // Default packet size private: