From ea55c60fe3a5365872006cbb5952567f06d56058 Mon Sep 17 00:00:00 2001 From: Tom Henderson Date: Fri, 4 May 2007 12:17:14 -0700 Subject: [PATCH] Enable both ascii and pcap tracing --- examples/simple-p2p.cc | 58 +++++++++++++++++------------ src/devices/p2p/p2p-topology.cc | 66 +++++++++++++++++++++------------ src/devices/p2p/p2p-topology.h | 8 ++-- src/node/net-device.cc | 12 ++++++ src/node/net-device.h | 26 ++++++++----- src/node/node.cc | 1 + 6 files changed, 112 insertions(+), 59 deletions(-) diff --git a/examples/simple-p2p.cc b/examples/simple-p2p.cc index 7e687f0d3..fb4f91311 100644 --- a/examples/simple-p2p.cc +++ b/examples/simple-p2p.cc @@ -75,7 +75,7 @@ int main (int argc, char *argv[]) // Users may find it convenient to turn on explicit debugging // for selected modules; the below lines suggest how to do this -#if 0 +#if 0 DebugComponentEnable("Object"); DebugComponentEnable("Queue"); DebugComponentEnable("DropTailQueue"); @@ -108,25 +108,32 @@ int main (int argc, char *argv[]) // We create the channels first without any IP addressing information PointToPointChannel *channel0 = PointToPointTopology::AddPointToPointLink ( - n0, Ipv4Address("10.1.1.1"), - n2, Ipv4Address("10.1.1.2"), - DataRate(5000000), MilliSeconds(2)); - channel0->Unref (); - + n0, n2, DataRate(5000000), MilliSeconds(2)); + PointToPointChannel *channel1 = PointToPointTopology::AddPointToPointLink ( - n1, Ipv4Address("10.1.2.1"), - n2, Ipv4Address("10.1.2.2"), - DataRate(5000000), MilliSeconds(2)); - channel1->Unref (); - + n1, n2, DataRate(5000000), MilliSeconds(2)); + PointToPointChannel *channel2 = PointToPointTopology::AddPointToPointLink ( - n2, Ipv4Address("10.1.3.1"), - n3, Ipv4Address("10.1.3.2"), - DataRate(1500000), MilliSeconds(10)); - channel2->Unref (); + n2, n3, DataRate(1500000), MilliSeconds(10)); + // Later, we add IP addresses. + PointToPointTopology::AddIpv4Addresses ( + channel0, n0, Ipv4Address("10.1.1.1"), + n2, Ipv4Address("10.1.1.2")); + channel0->Unref (); + + PointToPointTopology::AddIpv4Addresses ( + channel1, n1, Ipv4Address("10.1.2.1"), + n2, Ipv4Address("10.1.2.2")); + channel1->Unref (); + + PointToPointTopology::AddIpv4Addresses ( + channel2, n2, Ipv4Address("10.1.3.1"), + n3, Ipv4Address("10.1.3.2")); + channel2->Unref (); + // Create the OnOff application to send UDP datagrams of size // 210 bytes at a rate of 448 Kb/s OnOffApplication* ooff0 = new OnOffApplication( @@ -138,9 +145,11 @@ int main (int argc, char *argv[]) DataRate(448000), 210); // Add to Node's ApplicationList (takes ownership of pointer) - ApplicationList *apl0 = n0->QueryInterface (ApplicationList::iid); + ApplicationList *apl0 = n0->QueryInterface + (ApplicationList::iid); apl0->Add(ooff0); apl0->Unref (); + // Start the application ooff0->Start(Seconds(1.0)); ooff0->Stop (Seconds(10.0)); @@ -181,14 +190,15 @@ int main (int argc, char *argv[]) // Configure tracing of all enqueue, dequeue, and NetDevice receive events // Trace output will be sent to the simple-p2p.tr file -#if 1 - AsciiTrace trace ("simple-p2p.tr"); - trace.TraceAllQueues (); - trace.TraceAllNetDeviceRx (); -#else - PcapTrace trace ("simple-p2p.tr"); - trace.TraceAllIp (); -#endif + AsciiTrace asciitrace ("simple-p2p.tr"); + asciitrace.TraceAllQueues (); + asciitrace.TraceAllNetDeviceRx (); + + // Also configure some tcpdump traces; each interface will be traced + // The output files will be named simple-p2p.pcap-- + // and can be read by the "tcpdump -r" command + PcapTrace pcaptrace ("simple-p2p.pcap"); + pcaptrace.TraceAllIp (); Simulator::Run (); diff --git a/src/devices/p2p/p2p-topology.cc b/src/devices/p2p/p2p-topology.cc index dfe442d81..6ff05eab9 100644 --- a/src/devices/p2p/p2p-topology.cc +++ b/src/devices/p2p/p2p-topology.cc @@ -22,7 +22,7 @@ // Topology helper for ns3. // George F. Riley, Georgia Tech, Spring 2007 -#include "ns3/debug.h" +#include #include "ns3/assert.h" #include "ns3/nstime.h" @@ -36,58 +36,78 @@ #include "p2p-net-device.h" #include "p2p-topology.h" -#define nil 0 - namespace ns3 { PointToPointChannel * PointToPointTopology::AddPointToPointLink( Node* n1, - const Ipv4Address& addr1, Node* n2, - const Ipv4Address& addr2, const DataRate& bps, const Time& delay) { - // Duplex link is assumed to be subnetted as a /30 - // May run this unnumbered in the future? - Ipv4Mask netmask("255.255.255.252"); - NS_ASSERT (netmask.IsMatch(addr1,addr2)); - - // create channel expicitly (XXX no reference counting here yet) PointToPointChannel* channel = new PointToPointChannel(bps, delay); PointToPointNetDevice* net1 = new PointToPointNetDevice(n1); net1->AddQueue(Queue::Default().Copy()); n1->AddDevice (net1); - IIpv4 *ip1 = n1->QueryInterface (IIpv4::iid); - uint32_t index1 = ip1->AddInterface (net1); net1->Attach (channel); net1->Unref (); + + PointToPointNetDevice* net2 = new PointToPointNetDevice(n2); + net2->AddQueue(Queue::Default().Copy()); + n2->AddDevice (net2); + net2->Attach (channel); + net2->Unref (); + + return channel; +} + +bool +PointToPointTopology::AddIpv4Addresses( + const PointToPointChannel *chan, + Node* n1, const Ipv4Address& addr1, + Node* n2, const Ipv4Address& addr2) +{ + + // Duplex link is assumed to be subnetted as a /30 + // May run this unnumbered in the future? + Ipv4Mask netmask("255.255.255.252"); + NS_ASSERT (netmask.IsMatch(addr1,addr2)); + + // The PointToPoint channel is used to find the relevant NetDevices + NS_ASSERT (chan->GetNDevices () == 2); + NetDevice* nd1 = chan->GetDevice (0); + NetDevice* nd2 = chan->GetDevice (1); + // Make sure that nd1 belongs to n1 and nd2 to n2 + if ( (nd1->PeekNode ()->GetId () == n2->GetId () ) && + (nd2->PeekNode ()->GetId () == n1->GetId () ) ) + { + std::swap(nd1, nd2); + } + NS_ASSERT (nd1->PeekNode ()->GetId () == n1->GetId ()); + NS_ASSERT (nd2->PeekNode ()->GetId () == n2->GetId ()); + + IIpv4 *ip1 = n1->QueryInterface (IIpv4::iid); + uint32_t index1 = ip1->AddInterface (nd1); ip1->SetAddress (index1, addr1); ip1->SetNetworkMask (index1, netmask); ip1->SetUp (index1); - PointToPointNetDevice* net2 = new PointToPointNetDevice(n2); - net2->AddQueue(Queue::Default().Copy()); - n2->AddDevice (net2); IIpv4 *ip2 = n2->QueryInterface (IIpv4::iid); - uint32_t index2 = ip2->AddInterface (net2); - net2->Attach (channel); - net2->Unref (); + uint32_t index2 = ip2->AddInterface (nd2); ip2->SetAddress (index2, addr2); ip2->SetNetworkMask (index2, netmask); ip2->SetUp (index2); - + ip1->AddHostRouteTo (addr2, index1); ip2->AddHostRouteTo (addr1, index2); - + ip1->Unref (); ip2->Unref (); - - return channel; + + return true; } #ifdef NOTYET diff --git a/src/devices/p2p/p2p-topology.h b/src/devices/p2p/p2p-topology.h index 22520db2a..dc8cbb88d 100644 --- a/src/devices/p2p/p2p-topology.h +++ b/src/devices/p2p/p2p-topology.h @@ -51,10 +51,12 @@ public: * and propagation delay. */ static PointToPointChannel* AddPointToPointLink( - Node*, const Ipv4Address&, + Node*, Node*, const DataRate&, const Time&); + + static bool AddIpv4Addresses( + const PointToPointChannel*, Node*, const Ipv4Address&, - const DataRate&, - const Time&); + Node*, const Ipv4Address&); /** * Get the connecting node n1 to node n2 diff --git a/src/node/net-device.cc b/src/node/net-device.cc index 3565a0e4c..40ecc59ae 100644 --- a/src/node/net-device.cc +++ b/src/node/net-device.cc @@ -80,6 +80,18 @@ NetDevice::GetName(void) const return m_name; } +void +NetDevice::SetIfIndex(uint32_t index) +{ + m_ifIndex = index; +} + +uint32_t +NetDevice::GetIfIndex(void) const +{ + return m_ifIndex; +} + bool NetDevice::IsLinkUp (void) const { diff --git a/src/node/net-device.h b/src/node/net-device.h index b0e28eb3a..cfb4a40e9 100644 --- a/src/node/net-device.h +++ b/src/node/net-device.h @@ -106,6 +106,14 @@ public: * \return name name of the device (e.g. "eth0") */ std::string GetName(void) const; + /** + * \param index ifIndex of the device + */ + void SetIfIndex(const uint32_t); + /** + * \return index ifIndex of the device + */ + uint32_t GetIfIndex(void) const; /** * \return true if link is up; false otherwise */ @@ -153,6 +161,15 @@ public: * \return whether the Send operation succeeded */ bool Send(Packet& p, const MacAddress& dest, uint16_t protocolNumber); + /** + * \returns the node base class which contains this network + * interface. + * + * When a subclass needs to get access to the underlying node + * base class to print the nodeid for example, it can invoke + * this method. + */ + Node* PeekNode (void) const; bool NeedsArp (void) const; @@ -195,15 +212,6 @@ public: * down, it notifies its parent class by calling this method. */ void NotifyLinkDown (void); - /** - * \returns the node base class which contains this network - * interface. - * - * When a subclass needs to get access to the underlying node - * base class to print the nodeid for example, it can invoke - * this method. - */ - Node* PeekNode (void) const; /** * \param p packet sent from below up to Network Device diff --git a/src/node/node.cc b/src/node/node.cc index 22e1a3135..baf74d17c 100644 --- a/src/node/node.cc +++ b/src/node/node.cc @@ -75,6 +75,7 @@ Node::AddDevice (NetDevice *device) uint32_t index = m_devices.size (); m_devices.push_back (device); DoAddDevice (device); + device->SetIfIndex(index); return index; } NetDevice *