]> err.no Git - linux-2.6/commitdiff
[IPV6]: Try not to send icmp to anycast address.
authorYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Wed, 21 Dec 2005 13:57:06 +0000 (22:57 +0900)
committerYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Wed, 21 Dec 2005 13:57:06 +0000 (22:57 +0900)
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
net/ipv6/icmp.c

index 34a332225c1749f215f126d46788404f5e5e9850..6ec6a2b549bbd6d6930230d8bb8ca00d0e208f1f 100644 (file)
@@ -328,8 +328,10 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
                iif = skb->dev->ifindex;
 
        /*
-        *      Must not send if we know that source is Anycast also.
-        *      for now we don't know that.
+        *      Must not send error if the source does not uniquely
+        *      identify a single node (RFC2463 Section 2.4).
+        *      We check unspecified / multicast addresses here,
+        *      and anycast addresses will be checked later.
         */
        if ((addr_type == IPV6_ADDR_ANY) || (addr_type & IPV6_ADDR_MULTICAST)) {
                LIMIT_NETDEBUG(KERN_DEBUG "icmpv6_send: addr_any/mcast source\n");
@@ -373,6 +375,16 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
        err = ip6_dst_lookup(sk, &dst, &fl);
        if (err)
                goto out;
+
+       /*
+        * We won't send icmp if the destination is known
+        * anycast.
+        */
+       if (((struct rt6_info *)dst)->rt6i_flags & RTF_ANYCAST) {
+               LIMIT_NETDEBUG(KERN_DEBUG "icmpv6_send: acast source\n");
+               goto out_dst_release;
+       }
+
        if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0)
                goto out;