--- a/src/internet/model/ipv6-l3-protocol.cc Wed Jun 19 09:10:31 2013 +0200
+++ b/src/internet/model/ipv6-l3-protocol.cc Wed Jun 19 09:21:39 2013 +0200
@@ -883,7 +883,7 @@
}
}
-void Ipv6L3Protocol::IpForward (Ptr<Ipv6Route> rtentry, Ptr<const Packet> p, const Ipv6Header& header)
+void Ipv6L3Protocol::IpForward (Ptr<const NetDevice> idev, Ptr<Ipv6Route> rtentry, Ptr<const Packet> p, const Ipv6Header& header)
{
NS_LOG_FUNCTION (this << rtentry << p << header);
NS_LOG_LOGIC ("Forwarding logic for node: " << m_node->GetId ());
@@ -920,9 +920,12 @@
* exists.
*/
- if (m_sendIcmpv6Redirect &&
- ((!rtentry->GetGateway ().IsAny () && rtentry->GetGateway ().CombinePrefix (Ipv6Prefix (64)) == header.GetSourceAddress ().CombinePrefix (Ipv6Prefix (64)))
- || (rtentry->GetDestination ().CombinePrefix (Ipv6Prefix (64)) == header.GetSourceAddress ().CombinePrefix (Ipv6Prefix (64)))))
+ /* Theoretically we should also check if the redirect target is on the same network
+ * as the source node. On the other hand, we are sure that the router we're redirecting to
+ * used a link-local address. As a consequence, they MUST be on the same network, the link-local net.
+ */
+
+ if (m_sendIcmpv6Redirect && (rtentry->GetOutputDevice ()==idev))
{
NS_LOG_LOGIC ("ICMPv6 redirect!");
Ptr<Icmpv6L4Protocol> icmpv6 = GetIcmpv6 ();
@@ -953,7 +956,7 @@
SendRealOut (rtentry, packet, ipHeader);
}
-void Ipv6L3Protocol::IpMulticastForward (Ptr<Ipv6MulticastRoute> mrtentry, Ptr<const Packet> p, const Ipv6Header& header)
+void Ipv6L3Protocol::IpMulticastForward (Ptr<const NetDevice> idev, Ptr<Ipv6MulticastRoute> mrtentry, Ptr<const Packet> p, const Ipv6Header& header)
{
NS_LOG_FUNCTION (this << mrtentry << p << header);
NS_LOG_LOGIC ("Multicast forwarding logic for node: " << m_node->GetId ());