Enable both ascii and pcap tracing
authorTom Henderson <tomh@tomh.org>
Fri, 04 May 2007 12:17:14 -0700
changeset 535 fb6735f93868
parent 534 9fa0b6f245d7
child 536 059cec00b41e
Enable both ascii and pcap tracing
examples/simple-p2p.cc
src/devices/p2p/p2p-topology.cc
src/devices/p2p/p2p-topology.h
src/node/net-device.cc
src/node/net-device.h
src/node/node.cc
--- a/examples/simple-p2p.cc	Fri May 04 11:50:02 2007 -0700
+++ b/examples/simple-p2p.cc	Fri May 04 12:17:14 2007 -0700
@@ -75,7 +75,7 @@
 
   // 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 @@
   // 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));
+      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 @@
     DataRate(448000), 
     210);
   // Add to Node's ApplicationList (takes ownership of pointer)
-  ApplicationList *apl0 = n0->QueryInterface<ApplicationList> (ApplicationList::iid);
+  ApplicationList *apl0 = n0->QueryInterface<ApplicationList> 
+    (ApplicationList::iid);
   apl0->Add(ooff0);
   apl0->Unref ();
+
   // Start the application
   ooff0->Start(Seconds(1.0));
   ooff0->Stop (Seconds(10.0));
@@ -181,14 +190,15 @@
 
   // 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-<nodeId>-<interfaceId>
+  // and can be read by the "tcpdump -r" command
+  PcapTrace pcaptrace ("simple-p2p.pcap");
+  pcaptrace.TraceAllIp ();
 
   Simulator::Run ();
     
--- a/src/devices/p2p/p2p-topology.cc	Fri May 04 11:50:02 2007 -0700
+++ b/src/devices/p2p/p2p-topology.cc	Fri May 04 12:17:14 2007 -0700
@@ -22,7 +22,7 @@
 // Topology helper for ns3.
 // George F. Riley, Georgia Tech, Spring 2007
 
-#include "ns3/debug.h"
+#include <algorithm>
 #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> (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> (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> (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
--- a/src/devices/p2p/p2p-topology.h	Fri May 04 11:50:02 2007 -0700
+++ b/src/devices/p2p/p2p-topology.h	Fri May 04 12:17:14 2007 -0700
@@ -51,10 +51,12 @@
    * 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
--- a/src/node/net-device.cc	Fri May 04 11:50:02 2007 -0700
+++ b/src/node/net-device.cc	Fri May 04 12:17:14 2007 -0700
@@ -80,6 +80,18 @@
   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
 {
--- a/src/node/net-device.h	Fri May 04 11:50:02 2007 -0700
+++ b/src/node/net-device.h	Fri May 04 12:17:14 2007 -0700
@@ -107,6 +107,14 @@
    */
   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
    */
   bool IsLinkUp (void) const;
@@ -153,6 +161,15 @@
    * \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 @@
    * 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
--- a/src/node/node.cc	Fri May 04 11:50:02 2007 -0700
+++ b/src/node/node.cc	Fri May 04 12:17:14 2007 -0700
@@ -75,6 +75,7 @@
   uint32_t index = m_devices.size ();
   m_devices.push_back (device);
   DoAddDevice (device);
+  device->SetIfIndex(index);
   return index;
 }
 NetDevice *