examples/simple-p2p.cc
changeset 382 26528ff50d38
parent 381 83b52d112c99
child 383 780e2f7d7231
--- a/examples/simple-p2p.cc	Tue Mar 27 21:48:22 2007 -0700
+++ b/examples/simple-p2p.cc	Tue Mar 27 23:14:31 2007 -0700
@@ -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 <iostream>
 #include <fstream>
@@ -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 @@
   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="<<name<<std::endl;
-  for (uint32_t i = 0; i < ipv4->GetNInterfaces (); i++)
-    {
-      Ipv4Interface *interface = ipv4->GetInterface (i);
-      std::cout << "interface addr="<<interface->GetAddress () 
-                << ", netmask="<<interface->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 @@
   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 @@
   // 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 @@
   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 ();
 }