From 8b2fe3d93db7e2e72190bc9f51d5a3622e98e490 Mon Sep 17 00:00:00 2001 From: Tommaso Pecorella Date: Sat, 18 Nov 2017 00:02:30 +0100 Subject: [PATCH] internet: (fixes #2824) ICMP opcode for fragment timeout drop is wrong. --- src/internet/bindings/modulegen__gcc_ILP32.py | 4 ++-- src/internet/bindings/modulegen__gcc_LP64.py | 4 ++-- src/internet/model/icmpv4-l4-protocol.cc | 11 +++++++++-- src/internet/model/icmpv4-l4-protocol.h | 3 ++- src/internet/model/ipv4-l3-protocol.cc | 4 ++-- 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/internet/bindings/modulegen__gcc_ILP32.py b/src/internet/bindings/modulegen__gcc_ILP32.py index a640f63c3..db2c4204d 100644 --- a/src/internet/bindings/modulegen__gcc_ILP32.py +++ b/src/internet/bindings/modulegen__gcc_ILP32.py @@ -18821,10 +18821,10 @@ def register_Ns3Icmpv4L4Protocol_methods(root_module, cls): cls.add_method('SendDestUnreachPort', 'void', [param('ns3::Ipv4Header', 'header'), param('ns3::Ptr< ns3::Packet const >', 'orgData')]) - ## icmpv4-l4-protocol.h (module 'internet'): void ns3::Icmpv4L4Protocol::SendTimeExceededTtl(ns3::Ipv4Header header, ns3::Ptr orgData) [member function] + ## icmpv4-l4-protocol.h (module 'internet'): void ns3::Icmpv4L4Protocol::SendTimeExceededTtl(ns3::Ipv4Header header, ns3::Ptr orgData, bool isFragment) [member function] cls.add_method('SendTimeExceededTtl', 'void', - [param('ns3::Ipv4Header', 'header'), param('ns3::Ptr< ns3::Packet const >', 'orgData')]) + [param('ns3::Ipv4Header', 'header'), param('ns3::Ptr< ns3::Packet const >', 'orgData'), param('bool', 'isFragment')]) ## icmpv4-l4-protocol.h (module 'internet'): void ns3::Icmpv4L4Protocol::SetDownTarget(ns3::IpL4Protocol::DownTargetCallback cb) [member function] cls.add_method('SetDownTarget', 'void', diff --git a/src/internet/bindings/modulegen__gcc_LP64.py b/src/internet/bindings/modulegen__gcc_LP64.py index a640f63c3..db2c4204d 100644 --- a/src/internet/bindings/modulegen__gcc_LP64.py +++ b/src/internet/bindings/modulegen__gcc_LP64.py @@ -18821,10 +18821,10 @@ def register_Ns3Icmpv4L4Protocol_methods(root_module, cls): cls.add_method('SendDestUnreachPort', 'void', [param('ns3::Ipv4Header', 'header'), param('ns3::Ptr< ns3::Packet const >', 'orgData')]) - ## icmpv4-l4-protocol.h (module 'internet'): void ns3::Icmpv4L4Protocol::SendTimeExceededTtl(ns3::Ipv4Header header, ns3::Ptr orgData) [member function] + ## icmpv4-l4-protocol.h (module 'internet'): void ns3::Icmpv4L4Protocol::SendTimeExceededTtl(ns3::Ipv4Header header, ns3::Ptr orgData, bool isFragment) [member function] cls.add_method('SendTimeExceededTtl', 'void', - [param('ns3::Ipv4Header', 'header'), param('ns3::Ptr< ns3::Packet const >', 'orgData')]) + [param('ns3::Ipv4Header', 'header'), param('ns3::Ptr< ns3::Packet const >', 'orgData'), param('bool', 'isFragment')]) ## icmpv4-l4-protocol.h (module 'internet'): void ns3::Icmpv4L4Protocol::SetDownTarget(ns3::IpL4Protocol::DownTargetCallback cb) [member function] cls.add_method('SetDownTarget', 'void', diff --git a/src/internet/model/icmpv4-l4-protocol.cc b/src/internet/model/icmpv4-l4-protocol.cc index bc167a4fc..85ad2295b 100644 --- a/src/internet/model/icmpv4-l4-protocol.cc +++ b/src/internet/model/icmpv4-l4-protocol.cc @@ -179,7 +179,7 @@ Icmpv4L4Protocol::SendDestUnreach (Ipv4Header header, Ptr orgData, } void -Icmpv4L4Protocol::SendTimeExceededTtl (Ipv4Header header, Ptr orgData) +Icmpv4L4Protocol::SendTimeExceededTtl (Ipv4Header header, Ptr orgData, bool isFragment) { NS_LOG_FUNCTION (this << header << *orgData); Ptr p = Create (); @@ -187,7 +187,14 @@ Icmpv4L4Protocol::SendTimeExceededTtl (Ipv4Header header, Ptr orgD time.SetHeader (header); time.SetData (orgData); p->AddHeader (time); - SendMessage (p, header.GetSource (), Icmpv4Header::TIME_EXCEEDED, Icmpv4TimeExceeded::TIME_TO_LIVE); + if (!isFragment) + { + SendMessage (p, header.GetSource (), Icmpv4Header::TIME_EXCEEDED, Icmpv4TimeExceeded::TIME_TO_LIVE); + } + else + { + SendMessage (p, header.GetSource (), Icmpv4Header::TIME_EXCEEDED, Icmpv4TimeExceeded::FRAGMENT_REASSEMBLY); + } } void diff --git a/src/internet/model/icmpv4-l4-protocol.h b/src/internet/model/icmpv4-l4-protocol.h index db10b76c5..0daec3a26 100644 --- a/src/internet/model/icmpv4-l4-protocol.h +++ b/src/internet/model/icmpv4-l4-protocol.h @@ -107,8 +107,9 @@ public: * \brief Send a Time Exceeded ICMP error * \param header the original IP header * \param orgData the original packet + * \param isFragment true if the opcode must be FRAGMENT_REASSEMBLY */ - void SendTimeExceededTtl (Ipv4Header header, Ptr orgData); + void SendTimeExceededTtl (Ipv4Header header, Ptr orgData, bool isFragment); /** * \brief Send a Time Exceeded ICMP error diff --git a/src/internet/model/ipv4-l3-protocol.cc b/src/internet/model/ipv4-l3-protocol.cc index 88a4223c8..72df3bf3b 100644 --- a/src/internet/model/ipv4-l3-protocol.cc +++ b/src/internet/model/ipv4-l3-protocol.cc @@ -1036,7 +1036,7 @@ Ipv4L3Protocol::IpForward (Ptr rtentry, Ptr p, const Ip ipHeader.GetDestination ().IsMulticast () == false) { Ptr icmp = GetIcmp (); - icmp->SendTimeExceededTtl (ipHeader, packet); + icmp->SendTimeExceededTtl (ipHeader, packet, false); } NS_LOG_WARN ("TTL exceeded. Drop."); m_dropTrace (header, packet, DROP_TTL_EXPIRED, m_node->GetObject (), interface); @@ -1689,7 +1689,7 @@ Ipv4L3Protocol::HandleFragmentsTimeout (std::pair key, Ipv4H if ( packet->GetSize () > 8 ) { Ptr icmp = GetIcmp (); - icmp->SendTimeExceededTtl (ipHeader, packet); + icmp->SendTimeExceededTtl (ipHeader, packet, true); } m_dropTrace (ipHeader, packet, DROP_FRAGMENT_TIMEOUT, m_node->GetObject (), iif);