--- 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 ();
}
--- a/src/node/application-list.cc Tue Mar 27 21:48:22 2007 -0700
+++ b/src/node/application-list.cc Tue Mar 27 23:14:31 2007 -0700
@@ -49,6 +49,12 @@
return r;
}
+void
+ApplicationList::Add(Application* a)
+{
+ m_apps.Add(a);
+}
+
void ApplicationList::SetNode(Node& n)
{
Capability::SetNode(n);
--- a/src/node/application-list.h Tue Mar 27 21:48:22 2007 -0700
+++ b/src/node/application-list.h Tue Mar 27 23:14:31 2007 -0700
@@ -39,8 +39,9 @@
// 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 <typename T> T* Add(const T& t) // Add a new application
+ template <typename T> T* AddCopy(const T& t) // Add a new application
{
T* a = t.Copy();
m_apps.Add(a);
--- a/src/node/onoff-application.cc Tue Mar 27 21:48:22 2007 -0700
+++ b/src/node/onoff-application.cc Tue Mar 27 23:14:31 2007 -0700
@@ -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 @@
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 @@
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 @@
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 @@
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 @@
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<double>(m_cbrRate.GetBitRate()))); // Time till next packet
Simulator::Schedule(nextTime, &OnOffApplication::SendPacket, this);
}
else
--- a/src/node/onoff-application.h Tue Mar 27 21:48:22 2007 -0700
+++ b/src/node/onoff-application.h Tue Mar 27 23:14:31 2007 -0700
@@ -37,6 +37,7 @@
class Ipv4Address;
class RandomVariable;
class DatagramSocket;
+class DataRate;
class OnOffApplication : public Application {
@@ -46,7 +47,7 @@
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 @@
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 @@
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: