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