Switch over simple-p2p.cc to use OnOffApplication

This commit is contained in:
Tom Henderson
2007-03-27 23:14:31 -07:00
parent f1cd4984a1
commit 5233780b1c
5 changed files with 58 additions and 118 deletions

View File

@@ -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 @@ 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="<<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 @@ 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 ();
}

View File

@@ -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);

View File

@@ -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 <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);

View File

@@ -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<double>(m_cbrRate.GetBitRate()))); // Time till next packet
Simulator::Schedule(nextTime, &OnOffApplication::SendPacket, this);
}
else

View File

@@ -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: