Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
authorGustavo J. A. M. Carneiro <gjc@inescporto.pt>
Mon, 31 Aug 2009 18:48:37 +0100
changeset 5204 cb3087d8f330
parent 4742 f22beb219798
child 5205 673aae891b2b
Ipv4L3Protocol::Drop trace source enhanced, and add new SendOutgoing, UnicastForward, and LocalDeliver trace sources, for the FlowMonitor.
src/internet-stack/ipv4-l3-protocol.cc
src/internet-stack/ipv4-l3-protocol.h
--- a/src/internet-stack/ipv4-l3-protocol.cc	Mon Aug 31 11:31:32 2009 +0100
+++ b/src/internet-stack/ipv4-l3-protocol.cc	Mon Aug 31 18:48:37 2009 +0100
@@ -69,6 +69,14 @@
                    ObjectVectorValue (),
                    MakeObjectVectorAccessor (&Ipv4L3Protocol::m_interfaces),
                    MakeObjectVectorChecker<Ipv4Interface> ())
+
+    .AddTraceSource ("SendOutgoing", "A newly-generated by this node ipv4 packet is about to be queued for transmission",
+                     MakeTraceSourceAccessor (&Ipv4L3Protocol::m_sendOutgoingTrace))
+    .AddTraceSource ("UnicastForward", "A unicast ipv4 packet was received by this node and is being forwarded to another node",
+                     MakeTraceSourceAccessor (&Ipv4L3Protocol::m_unicastForwardTrace))
+    .AddTraceSource ("LocalDeliver", "An ipv4 packet was received by/for this node, and it is being forward up the stack",
+                     MakeTraceSourceAccessor (&Ipv4L3Protocol::m_localDeliverTrace))
+
     ;
   return tid;
 }
@@ -369,7 +377,7 @@
   Ptr<Ipv4Interface> ipv4Interface;
   for (Ipv4InterfaceList::const_iterator i = m_interfaces.begin (); 
        i != m_interfaces.end (); 
-       i++)
+       i++, interface++)
     {
       ipv4Interface = *i;
       if (ipv4Interface->GetDevice () == device)
@@ -382,11 +390,12 @@
           else
             {
               NS_LOG_LOGIC ("Dropping received packet-- interface is down");
-              m_dropTrace (packet);
+              Ipv4Header ipHeader;
+              packet->RemoveHeader (ipHeader);
+              m_dropTrace (ipHeader, packet, DROP_INTERFACE_DOWN, interface);
               return;
             }
         }
-      interface++;
     }
 
   Ipv4Header ipHeader;
@@ -398,7 +407,7 @@
 
   if (!ipHeader.IsChecksumOk ()) 
     {
-      m_dropTrace (packet);
+      m_dropTrace (ipHeader, packet, DROP_BAD_CHECKSUM, interface);
       return;
     }
 
@@ -477,6 +486,8 @@
           Ptr<Packet> packetCopy = packet->Copy ();
 
           NS_ASSERT (packetCopy->GetSize () <= outInterface->GetDevice()->GetMtu ());
+
+          m_sendOutgoingTrace (ipHeader, packetCopy, ifaceIndex);
           packetCopy->AddHeader (ipHeader);
           m_txTrace (packetCopy, ifaceIndex);
           outInterface->Send (packetCopy, destination);
@@ -501,6 +512,7 @@
               ttl = 1;
               ipHeader = BuildHeader (source, destination, protocol, packet->GetSize (), ttl, mayFragment);
               Ptr<Packet> packetCopy = packet->Copy ();
+              m_sendOutgoingTrace (ipHeader, packetCopy, ifaceIndex);
               packetCopy->AddHeader (ipHeader);
               m_txTrace (packetCopy, ifaceIndex);
               outInterface->Send (packetCopy, destination);
@@ -515,6 +527,8 @@
     {
       NS_LOG_LOGIC ("Ipv4L3Protocol::Send case 3:  passed in with route");
       ipHeader = BuildHeader (source, destination, protocol, packet->GetSize (), ttl, mayFragment);
+      int32_t interface = GetInterfaceForDevice (route->GetOutputDevice ());
+      m_sendOutgoingTrace (ipHeader, packet, interface);
       SendRealOut (route, packet, ipHeader);
       return; 
     } 
@@ -535,12 +549,14 @@
   Ptr<Ipv4Route> newRoute = m_routingProtocol->RouteOutput (packet, ipHeader, oif, errno_);
   if (newRoute)
     {
+      int32_t interface = GetInterfaceForDevice (newRoute->GetOutputDevice ());
+      m_sendOutgoingTrace (ipHeader, packet, interface);
       SendRealOut (newRoute, packet, ipHeader);
     }
   else
     {
       NS_LOG_WARN ("No route to host.  Drop.");
-      m_dropTrace (packet);
+      m_dropTrace (ipHeader, packet, DROP_NO_ROUTE, 0);
     }
 }
 
@@ -590,16 +606,13 @@
 {
   NS_LOG_FUNCTION (this << packet << &ipHeader);
 
-  // We add a header regardless of whether there is a route, since 
-  // we may want to drop trace
-  packet->AddHeader (ipHeader);
   if (route == 0)
     {
       NS_LOG_WARN ("No route to host.  Drop.");
-      m_dropTrace (packet);
+      m_dropTrace (ipHeader, packet, DROP_NO_ROUTE, 0);
       return;
     }
-
+  packet->AddHeader (ipHeader);
   Ptr<NetDevice> outDev = route->GetOutputDevice ();
   int32_t interface = GetInterfaceForDevice (outDev);
   NS_ASSERT (interface >= 0);
@@ -618,7 +631,9 @@
       else
         {
           NS_LOG_LOGIC ("Dropping-- outgoing interface is down: " << route->GetGateway ());
-          m_dropTrace (packet);
+          Ipv4Header ipHeader;
+          packet->RemoveHeader (ipHeader);
+          m_dropTrace (ipHeader, packet, DROP_INTERFACE_DOWN, interface);
         }
     } 
   else 
@@ -632,7 +647,9 @@
       else
         {
           NS_LOG_LOGIC ("Dropping-- outgoing interface is down: " << ipHeader.GetDestination ());
-          m_dropTrace (packet);
+          Ipv4Header ipHeader;
+          packet->RemoveHeader (ipHeader);
+          m_dropTrace (ipHeader, packet, DROP_INTERFACE_DOWN, interface);
         }
     }
 }
@@ -655,7 +672,7 @@
           if (h.GetTtl () == 0)
             {
               NS_LOG_WARN ("TTL exceeded.  Drop.");
-              m_dropTrace (packet);
+              m_dropTrace (header, packet, DROP_TTL_EXPIRED, i);
               return;
             }
           NS_LOG_LOGIC ("Forward multicast via interface " << i);
@@ -679,6 +696,7 @@
   // Forwarding
   Ipv4Header ipHeader = header;
   Ptr<Packet> packet = p->Copy ();
+  int32_t interface = GetInterfaceForDevice (rtentry->GetOutputDevice ());
   ipHeader.SetTtl (ipHeader.GetTtl () - 1);
   if (ipHeader.GetTtl () == 0)
     {
@@ -691,9 +709,10 @@
           icmp->SendTimeExceededTtl (ipHeader, packet);
         }
       NS_LOG_WARN ("TTL exceeded.  Drop.");
-      m_dropTrace (packet);
+      m_dropTrace (header, packet, DROP_TTL_EXPIRED, interface);
       return;
     }
+  m_unicastForwardTrace (ipHeader, packet, interface);
   SendRealOut (rtentry, packet, ipHeader);
 }
 
@@ -703,6 +722,8 @@
   NS_LOG_FUNCTION (this << packet << &ip);
   Ptr<Packet> p = packet->Copy (); // need to pass a non-const packet up
 
+  m_localDeliverTrace (ip, packet, iif);
+
   Ptr<Ipv4L4Protocol> protocol = GetProtocol (ip.GetProtocol ());
   if (protocol != 0)
     {
@@ -891,7 +912,7 @@
 {
   NS_LOG_FUNCTION (this << p << ipHeader << sockErrno);
   NS_LOG_LOGIC ("Route input failure-- dropping packet to " << ipHeader << " with errno " << sockErrno); 
-  m_dropTrace (p);
+  m_dropTrace (ipHeader, p, DROP_ROUTE_ERROR, 0);
 }
 
 
--- a/src/internet-stack/ipv4-l3-protocol.h	Mon Aug 31 11:31:32 2009 +0100
+++ b/src/internet-stack/ipv4-l3-protocol.h	Mon Aug 31 18:48:37 2009 +0100
@@ -63,6 +63,15 @@
   Ipv4L3Protocol();
   virtual ~Ipv4L3Protocol ();
 
+  enum DropReason 
+    {
+      DROP_TTL_EXPIRED = 1,
+      DROP_NO_ROUTE,
+      DROP_BAD_CHECKSUM,
+      DROP_INTERFACE_DOWN,
+      DROP_ROUTE_ERROR,
+    };
+
   void SetNode (Ptr<Node> node);
 
   // functions defined in base class Ipv4
@@ -215,9 +224,15 @@
   uint8_t m_defaultTtl;
   uint16_t m_identification;
   Ptr<Node> m_node;
+
+  TracedCallback<const Ipv4Header &, Ptr<const Packet>, uint32_t> m_sendOutgoingTrace;
+  TracedCallback<const Ipv4Header &, Ptr<const Packet>, uint32_t> m_unicastForwardTrace;
+  TracedCallback<const Ipv4Header &, Ptr<const Packet>, uint32_t> m_localDeliverTrace;
+
   TracedCallback<Ptr<const Packet>, uint32_t> m_txTrace;
   TracedCallback<Ptr<const Packet>, uint32_t> m_rxTrace;
-  TracedCallback<Ptr<const Packet> > m_dropTrace;
+  // <ip-header, payload, reason, ifindex> (ifindex not valid if reason is DROP_NO_ROUTE)
+  TracedCallback<const Ipv4Header &, Ptr<const Packet>, DropReason, uint32_t> m_dropTrace;
 
   Ptr<Ipv4RoutingProtocol> m_routingProtocol;