From eaebc4b4bdd57cd024cfe607ac3a7c5b8230a040 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Tue, 15 Sep 2009 13:00:29 +0100 Subject: [PATCH] Modifications to the Ipv6L3Protocol::Drop trace source to align with Ipv4L3Protocol::Drop --- src/internet-stack/ipv6-l3-protocol.cc | 26 ++++++++++++++------------ src/internet-stack/ipv6-l3-protocol.h | 11 ++++++++++- src/internet-stack/wscript | 1 + 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/internet-stack/ipv6-l3-protocol.cc b/src/internet-stack/ipv6-l3-protocol.cc index 1bdf10012..7be86e33d 100644 --- a/src/internet-stack/ipv6-l3-protocol.cc +++ b/src/internet-stack/ipv6-l3-protocol.cc @@ -646,7 +646,7 @@ void Ipv6L3Protocol::Send (Ptr packet, Ipv6Address source, Ipv6Address d else { NS_LOG_WARN ("No route to host, drop!"); - m_dropTrace (packet); + m_dropTrace (hdr, packet, DROP_NO_ROUTE, oif); } } @@ -672,7 +672,9 @@ void Ipv6L3Protocol::Receive (Ptr device, Ptr p, uint16 else { NS_LOG_LOGIC ("Dropping received packet-- interface is down"); - m_dropTrace (packet); + Ipv6Header hdr; + packet->RemoveHeader (hdr); + m_dropTrace (hdr, packet, DROP_INTERFACE_DOWN, interface); return; } } @@ -701,8 +703,6 @@ void Ipv6L3Protocol::SendRealOut (Ptr route, Ptr packet, Ipv6 { NS_LOG_FUNCTION (this << route << packet << ipHeader); - packet->AddHeader (ipHeader); - if (!route) { NS_LOG_LOGIC ("No route to host, drop!."); @@ -716,20 +716,20 @@ void Ipv6L3Protocol::SendRealOut (Ptr route, Ptr packet, Ipv6 Ptr outInterface = GetInterface (interface); NS_LOG_LOGIC ("Send via NetDevice ifIndex " << dev->GetIfIndex () << " Ipv6InterfaceIndex " << interface); - NS_ASSERT (packet->GetSize () <= outInterface->GetDevice ()->GetMtu ()); - if (!route->GetGateway ().IsEqual (Ipv6Address::GetAny ())) { if (outInterface->IsUp ()) { NS_LOG_LOGIC ("Send to gateway " << route->GetGateway ()); + packet->AddHeader (ipHeader); + NS_ASSERT (packet->GetSize () <= outInterface->GetDevice ()->GetMtu ()); m_txTrace (packet, interface); outInterface->Send (packet, route->GetGateway ()); } else { NS_LOG_LOGIC ("Dropping-- outgoing interface is down: " << route->GetGateway ()); - m_dropTrace (packet); + m_dropTrace (ipHeader, packet, DROP_INTERFACE_DOWN, interface); } } else @@ -737,13 +737,15 @@ void Ipv6L3Protocol::SendRealOut (Ptr route, Ptr packet, Ipv6 if (outInterface->IsUp ()) { NS_LOG_LOGIC ("Send to destination " << ipHeader.GetDestinationAddress ()); + packet->AddHeader (ipHeader); + NS_ASSERT (packet->GetSize () <= outInterface->GetDevice ()->GetMtu ()); m_txTrace (packet, interface); outInterface->Send (packet, ipHeader.GetDestinationAddress ()); } else { NS_LOG_LOGIC ("Dropping-- outgoing interface is down: " << ipHeader.GetDestinationAddress ()); - m_dropTrace (packet); + m_dropTrace (ipHeader, packet, DROP_INTERFACE_DOWN, interface); } } } @@ -766,6 +768,8 @@ void Ipv6L3Protocol::IpForward (Ptr rtentry, Ptr p, con if (ipHeader.GetHopLimit () == 0) { + NS_LOG_WARN ("TTL exceeded. Drop."); + m_dropTrace (ipHeader, packet, DROP_TTL_EXPIRED, 0); // Do not reply to ICMPv6 or to multicast IPv6 address if (ipHeader.GetNextHeader () != Icmpv6L4Protocol::PROT_NUMBER && ipHeader.GetDestinationAddress ().IsMulticast () == false) @@ -773,8 +777,6 @@ void Ipv6L3Protocol::IpForward (Ptr rtentry, Ptr p, con packet->AddHeader (ipHeader); GetIcmpv6 ()->SendErrorTimeExceeded (packet, ipHeader.GetSourceAddress (), Icmpv6Header::ICMPV6_HOPLIMIT); } - NS_LOG_WARN ("TTL exceeded. Drop."); - m_dropTrace (packet); return; } @@ -832,7 +834,7 @@ void Ipv6L3Protocol::IpMulticastForward (Ptr mrtentry, Ptr p, const Ipv6Header& ipH { 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); } Ipv6Header Ipv6L3Protocol::BuildHeader (Ipv6Address src, Ipv6Address dst, uint8_t protocol, uint16_t payloadSize, uint8_t ttl) diff --git a/src/internet-stack/ipv6-l3-protocol.h b/src/internet-stack/ipv6-l3-protocol.h index 0d213c793..17852e648 100644 --- a/src/internet-stack/ipv6-l3-protocol.h +++ b/src/internet-stack/ipv6-l3-protocol.h @@ -59,6 +59,15 @@ class Ipv6L3Protocol : public Ipv6 * \brief The protocol number for IPv6 (0x86DD). */ static const uint16_t PROT_NUMBER; + + enum DropReason + { + DROP_TTL_EXPIRED = 1, + DROP_NO_ROUTE, + DROP_BAD_CHECKSUM, + DROP_INTERFACE_DOWN, + DROP_ROUTE_ERROR, + }; /** * \brief Constructor. @@ -344,7 +353,7 @@ class Ipv6L3Protocol : public Ipv6 /** * \brief Callback to trace drop packets. */ - TracedCallback > m_dropTrace; + TracedCallback, DropReason, uint32_t> m_dropTrace; /** * \brief Copy constructor. diff --git a/src/internet-stack/wscript b/src/internet-stack/wscript index dec9a0af4..1513c0bb3 100644 --- a/src/internet-stack/wscript +++ b/src/internet-stack/wscript @@ -122,6 +122,7 @@ def build(bld): 'icmpv4.h', 'icmpv6-header.h', 'ipv4-l3-protocol.h', + 'ipv6-l3-protocol.h', 'arp-l3-protocol.h', 'udp-l4-protocol.h', 'tcp-l4-protocol.h',