add ascii/pcap trace helpers
This commit is contained in:
@@ -2,6 +2,10 @@
|
||||
#include "ns3/point-to-point-net-device.h"
|
||||
#include "ns3/point-to-point-channel.h"
|
||||
#include "ns3/queue.h"
|
||||
#include "ns3/pcap-writer.h"
|
||||
#include "ns3/config.h"
|
||||
#include "ns3/packet.h"
|
||||
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
@@ -40,6 +44,58 @@ PointToPointHelper::SetChannelParameter (std::string n1, Attribute v1)
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
PointToPointHelper::EnablePcap (std::string filename)
|
||||
{
|
||||
m_pcap = true;
|
||||
m_pcapFilename = filename;
|
||||
}
|
||||
void
|
||||
PointToPointHelper::DisablePcap (void)
|
||||
{
|
||||
m_pcap = false;
|
||||
}
|
||||
|
||||
void
|
||||
PointToPointHelper::EnableAscii (std::ostream &os)
|
||||
{
|
||||
m_ascii = true;
|
||||
m_asciiOs = &os;
|
||||
}
|
||||
void
|
||||
PointToPointHelper::DisableAscii (void)
|
||||
{
|
||||
m_ascii = false;
|
||||
}
|
||||
|
||||
void
|
||||
PointToPointHelper::EnablePcap (Ptr<Node> node, Ptr<NetDevice> device, Ptr<Queue> queue)
|
||||
{
|
||||
std::ostringstream oss;
|
||||
oss << m_pcapFilename << "-" << node->GetId () << "-" << device->GetIfIndex ();
|
||||
std::string filename = oss.str ();
|
||||
Ptr<PcapWriter> pcap = Create<PcapWriter> ();
|
||||
pcap->Open (filename);
|
||||
pcap->WriteEthernetHeader ();
|
||||
device->TraceConnectWithoutContext ("Rx", MakeBoundCallback (&PointToPointHelper::RxEvent, pcap));
|
||||
queue->TraceConnectWithoutContext ("Enqueue", MakeBoundCallback (&PointToPointHelper::EnqueueEvent, pcap));
|
||||
}
|
||||
|
||||
void
|
||||
PointToPointHelper::EnableAscii (Ptr<Node> node, Ptr<NetDevice> device)
|
||||
{
|
||||
Packet::EnableMetadata ();
|
||||
std::ostringstream oss;
|
||||
oss << "/NodeList/" << node->GetId () << "/DeviceList/" << device->GetIfIndex () << "/Rx";
|
||||
Config::Connect (oss.str (), MakeBoundCallback (&PointToPointHelper::AsciiEvent, m_asciiOs));
|
||||
oss.str ("");
|
||||
oss << "/NodeList/" << node->GetId () << "/DeviceList/" << device->GetIfIndex () << "/TxQueue/Enqueue";
|
||||
Config::Connect (oss.str (), MakeBoundCallback (&PointToPointHelper::AsciiEvent, m_asciiOs));
|
||||
oss.str ("");
|
||||
oss << "/NodeList/" << node->GetId () << "/DeviceList/" << device->GetIfIndex () << "/TxQueue/Dequeue";
|
||||
Config::Connect (oss.str (), MakeBoundCallback (&PointToPointHelper::AsciiEvent, m_asciiOs));
|
||||
}
|
||||
|
||||
NetDeviceContainer
|
||||
PointToPointHelper::Build (NodeContainer c)
|
||||
{
|
||||
@@ -64,11 +120,38 @@ PointToPointHelper::Build (Ptr<Node> a, Ptr<Node> b)
|
||||
Ptr<PointToPointChannel> channel = m_channelFactory.Create<PointToPointChannel> ();
|
||||
devA->Attach (channel);
|
||||
devB->Attach (channel);
|
||||
if (m_pcap)
|
||||
{
|
||||
EnablePcap (a, devA, queueA);
|
||||
EnablePcap (b, devB, queueB);
|
||||
}
|
||||
if (m_ascii)
|
||||
{
|
||||
EnableAscii (a, devA);
|
||||
EnableAscii (b, devB);
|
||||
}
|
||||
|
||||
container.Add (devA);
|
||||
container.Add (devB);
|
||||
|
||||
return container;
|
||||
}
|
||||
|
||||
void
|
||||
PointToPointHelper::EnqueueEvent (Ptr<PcapWriter> writer, Ptr<const Packet> packet)
|
||||
{
|
||||
writer->WritePacket (packet);
|
||||
}
|
||||
void
|
||||
PointToPointHelper::RxEvent (Ptr<PcapWriter> writer, Ptr<const Packet> packet)
|
||||
{
|
||||
writer->WritePacket (packet);
|
||||
}
|
||||
void
|
||||
PointToPointHelper::AsciiEvent (std::ostream *os, std::string path, Ptr<const Packet> packet)
|
||||
{
|
||||
*os << path << " " << *packet << std::endl;
|
||||
}
|
||||
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
@@ -8,6 +8,11 @@
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
class Queue;
|
||||
class NetDevice;
|
||||
class Node;
|
||||
class PcapWriter;
|
||||
|
||||
/**
|
||||
* \brief build a set of PointToPointNetDevice objects
|
||||
*/
|
||||
@@ -54,6 +59,36 @@ public:
|
||||
*/
|
||||
void SetChannelParameter (std::string name, Attribute value);
|
||||
|
||||
/**
|
||||
* \param filename file template to dump pcap traces in.
|
||||
*
|
||||
* Every ns3::PointToPointNetDevice created through subsequent calls
|
||||
* to PointToPointHelper::Build will be configured to dump
|
||||
* pcap output in a file named filename-nodeid-deviceid.
|
||||
*/
|
||||
void EnablePcap (std::string filename);
|
||||
/**
|
||||
* Every ns3::PointToPointNetDevice created through subsequent calls
|
||||
* to PointToPointHelper::Build will be configured to not dump any pcap
|
||||
* output.
|
||||
*/
|
||||
void DisablePcap (void);
|
||||
|
||||
/**
|
||||
* \param os an output stream where ascii trace should be sent.
|
||||
*
|
||||
* Every ns3::PointToPointNetDevice created through subsequent calls
|
||||
* to PointToPointHelper::Build will be configured to dump Rx, EnQueue
|
||||
* and Dequeue events as ascii data in the specified output stream.
|
||||
*/
|
||||
void EnableAscii (std::ostream &os);
|
||||
/**
|
||||
* Every ns3::PointToPointNetDevice created through subsequent calls
|
||||
* to PointToPointHelper::Build will be configured to not dump any
|
||||
* ascii output.
|
||||
*/
|
||||
void DisableAscii (void);
|
||||
|
||||
/**
|
||||
* \param c a set of nodes
|
||||
*
|
||||
@@ -74,9 +109,18 @@ public:
|
||||
NetDeviceContainer Build (Ptr<Node> a, Ptr<Node> b);
|
||||
|
||||
private:
|
||||
void EnablePcap (Ptr<Node> node, Ptr<NetDevice> device, Ptr<Queue> queue);
|
||||
void EnableAscii (Ptr<Node> node, Ptr<NetDevice> device);
|
||||
static void RxEvent (Ptr<PcapWriter> writer, Ptr<const Packet> packet);
|
||||
static void EnqueueEvent (Ptr<PcapWriter> writer, Ptr<const Packet> packet);
|
||||
static void AsciiEvent (std::ostream *os, std::string path, Ptr<const Packet> packet);
|
||||
ObjectFactory m_queueFactory;
|
||||
ObjectFactory m_channelFactory;
|
||||
ObjectFactory m_deviceFactory;
|
||||
bool m_pcap;
|
||||
std::string m_pcapFilename;
|
||||
bool m_ascii;
|
||||
std::ostream *m_asciiOs;
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user