Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=bf0b48dfc368c07c42b5a3a5658c8ee81b4283ac
Commit:     bf0b48dfc368c07c42b5a3a5658c8ee81b4283ac
Parent:     bf1b803b01b00c3801e0aa373ba0305f8278e260
Author:     Brian Haley <[EMAIL PROTECTED]>
AuthorDate: Mon Oct 8 00:12:05 2007 -0700
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Mon Oct 8 00:12:05 2007 -0700

    [IPv6]: Fix ICMPv6 redirect handling with target multicast address
    
    When the ICMPv6 Target address is multicast, Linux processes the
    redirect instead of dropping it.  The problem is in this code in
    ndisc_redirect_rcv():
    
             if (ipv6_addr_equal(dest, target)) {
                     on_link = 1;
             } else if (!(ipv6_addr_type(target) & IPV6_ADDR_LINKLOCAL)) {
                     ND_PRINTK2(KERN_WARNING
                                "ICMPv6 Redirect: target address is not
    link-local.\n");
                     return;
             }
    
    This second check will succeed if the Target address is, for example,
    FF02::1 because it has link-local scope.  Instead, it should be checking
    if it's a unicast link-local address, as stated in RFC 2461/4861 Section
    8.1:
    
           - The ICMP Target Address is either a link-local address (when
             redirected to a router) or the same as the ICMP Destination
             Address (when redirected to the on-link destination).
    
    I know this doesn't explicitly say unicast link-local address, but it's
    implied.
    
    This bug is preventing Linux kernels from achieving IPv6 Logo Phase II
    certification because of a recent error that was found in the TAHI test
    suite - Neighbor Disovery suite test 206 (v6LC.2.3.6_G) had the
    multicast address in the Destination field instead of Target field, so
    we were passing the test.  This won't be the case anymore.
    
    The patch below fixes this problem, and also fixes ndisc_send_redirect()
    to not send an invalid redirect with a multicast address in the Target
    field.  I re-ran the TAHI Neighbor Discovery section to make sure Linux
    passes all 245 tests now.
    
    Signed-off-by: Brian Haley <[EMAIL PROTECTED]>
    Acked-by: David L Stevens <[EMAIL PROTECTED]>
    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
---
 net/ipv6/ndisc.c |    9 +++++----
 1 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
index 73a894a..5b59665 100644
--- a/net/ipv6/ndisc.c
+++ b/net/ipv6/ndisc.c
@@ -1268,9 +1268,10 @@ static void ndisc_redirect_rcv(struct sk_buff *skb)
 
        if (ipv6_addr_equal(dest, target)) {
                on_link = 1;
-       } else if (!(ipv6_addr_type(target) & IPV6_ADDR_LINKLOCAL)) {
+       } else if (ipv6_addr_type(target) !=
+                  (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) {
                ND_PRINTK2(KERN_WARNING
-                          "ICMPv6 Redirect: target address is not 
link-local.\n");
+                          "ICMPv6 Redirect: target address is not link-local 
unicast.\n");
                return;
        }
 
@@ -1344,9 +1345,9 @@ void ndisc_send_redirect(struct sk_buff *skb, struct 
neighbour *neigh,
        }
 
        if (!ipv6_addr_equal(&ipv6_hdr(skb)->daddr, target) &&
-           !(ipv6_addr_type(target) & IPV6_ADDR_LINKLOCAL)) {
+           ipv6_addr_type(target) != (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) {
                ND_PRINTK2(KERN_WARNING
-                       "ICMPv6 Redirect: target address is not link-local.\n");
+                       "ICMPv6 Redirect: target address is not link-local 
unicast.\n");
                return;
        }
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to