From 4c6280072cde54dcbf95155f57b0e0bcca43eece Mon Sep 17 00:00:00 2001 From: Guowang Shi Date: Sat, 15 Jun 2013 10:56:55 +0200 Subject: [PATCH] bug 1646 - ICMPv6 Redirect are sent from global address instead of link-local --- src/internet/model/icmpv6-l4-protocol.cc | 7 +++++-- src/internet/model/icmpv6-l4-protocol.h | 5 +++-- src/internet/model/ipv6-l3-protocol.cc | 5 +++-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/internet/model/icmpv6-l4-protocol.cc b/src/internet/model/icmpv6-l4-protocol.cc index 55785a17e..1700da653 100644 --- a/src/internet/model/icmpv6-l4-protocol.cc +++ b/src/internet/model/icmpv6-l4-protocol.cc @@ -1083,7 +1083,7 @@ void Icmpv6L4Protocol::SendErrorParameterError (Ptr malformedPacket, Ipv SendMessage (p, dst, header, 255); } -void Icmpv6L4Protocol::SendRedirection (Ptr redirectedPacket, Ipv6Address dst, Ipv6Address redirTarget, Ipv6Address redirDestination, Address redirHardwareTarget) +void Icmpv6L4Protocol::SendRedirection (Ptr redirectedPacket, Ipv6Address src, Ipv6Address dst, Ipv6Address redirTarget, Ipv6Address redirDestination, Address redirHardwareTarget) { NS_LOG_FUNCTION (this << redirectedPacket << dst << redirTarget << redirDestination << redirHardwareTarget); uint32_t llaSize = 0; @@ -1128,7 +1128,10 @@ void Icmpv6L4Protocol::SendRedirection (Ptr redirectedPacket, Ipv6Addres Icmpv6Redirection redirectionHeader; redirectionHeader.SetTarget (redirTarget); redirectionHeader.SetDestination (redirDestination); - SendMessage (p, dst, redirectionHeader, 64); + redirectionHeader.CalculatePseudoHeaderChecksum (src, dst, p->GetSize () + redirectionHeader.GetSerializedSize (), PROT_NUMBER); + p->AddHeader (redirectionHeader); + + SendMessage (p, src, dst, 64); } Ptr Icmpv6L4Protocol::ForgeNA (Ipv6Address src, Ipv6Address dst, Address* hardwareAddress, uint8_t flags) diff --git a/src/internet/model/icmpv6-l4-protocol.h b/src/internet/model/icmpv6-l4-protocol.h index 5f816989e..753533386 100644 --- a/src/internet/model/icmpv6-l4-protocol.h +++ b/src/internet/model/icmpv6-l4-protocol.h @@ -274,12 +274,13 @@ public: /** * \brief Send an ICMPv6 Redirection. * \param redirectedPacket the redirected packet - * \param dst destination IPv6 address + * \param src IPv6 address to send the redirect from + * \param dst IPv6 address to send the redirect to * \param redirTarget IPv6 target address for Icmpv6Redirection * \param redirDestination IPv6 destination address for Icmpv6Redirection * \param redirHardwareTarget L2 target address for Icmpv6OptionRdirected */ - void SendRedirection (Ptr redirectedPacket, Ipv6Address dst, Ipv6Address redirTarget, Ipv6Address redirDestination, Address redirHardwareTarget); + void SendRedirection (Ptr redirectedPacket, Ipv6Address src, Ipv6Address dst, Ipv6Address redirTarget, Ipv6Address redirDestination, Address redirHardwareTarget); /** * \brief Forge a Neighbor Solicitation. diff --git a/src/internet/model/ipv6-l3-protocol.cc b/src/internet/model/ipv6-l3-protocol.cc index a03688f12..9de2226f9 100644 --- a/src/internet/model/ipv6-l3-protocol.cc +++ b/src/internet/model/ipv6-l3-protocol.cc @@ -938,14 +938,15 @@ void Ipv6L3Protocol::IpForward (Ptr rtentry, Ptr p, con } copy->AddHeader (header); + Ipv6Address linkLocal = GetInterface (GetInterfaceForDevice (rtentry->GetOutputDevice ()))->GetLinkLocalAddress ().GetAddress (); if (icmpv6->Lookup (target, rtentry->GetOutputDevice (), 0, &hardwareTarget)) { - icmpv6->SendRedirection (copy, src, target, dst, hardwareTarget); + icmpv6->SendRedirection (copy, linkLocal, src, target, dst, hardwareTarget); } else { - icmpv6->SendRedirection (copy, src, target, dst, Address ()); + icmpv6->SendRedirection (copy, linkLocal, src, target, dst, Address ()); } }