1
linux/net/ipv6
Brian Haley bf0b48dfc3 [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 <brian.haley@hp.com>
Acked-by: David L Stevens <dlstevens@us.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2007-10-08 00:12:05 -07:00
..
netfilter [NETFILTER]: Fix/improve deadlock condition on module removal netfilter 2007-09-11 11:28:26 +02:00
addrconf_core.c [IPV6]: ipv6_addr_type() doesn't know about RFC4193 addresses. 2007-07-31 02:28:21 -07:00
addrconf.c [IPV6]: Fix source address selection. 2007-09-16 14:48:21 -07:00
af_inet6.c [TCP]: Invoke tcp_sendmsg() directly, do not use inet_sendmsg(). 2007-08-02 19:42:28 -07:00
ah6.c [XFRM]: Add module alias for transformation type. 2007-07-10 22:15:43 -07:00
anycast.c [NET]: Make all initialized struct seq_operations const. 2007-07-10 23:07:31 -07:00
datagram.c [IPV6]: Do not send RH0 anymore. 2007-07-10 22:55:49 -07:00
esp6.c [XFRM]: Add module alias for transformation type. 2007-07-10 22:15:43 -07:00
exthdrs_core.c
exthdrs.c [IPV6]: Do not send RH0 anymore. 2007-07-10 22:55:49 -07:00
fib6_rules.c [NETLINK]: Mark netlink policies const 2007-06-07 13:40:10 -07:00
icmp.c [IPV6]: MSG_ERRQUEUE messages do not pass to connected raw sockets 2007-07-14 23:53:08 -07:00
inet6_connection_sock.c
inet6_hashtables.c
ip6_fib.c mm: Remove slab destructors from kmem_cache_create(). 2007-07-20 10:11:58 +09:00
ip6_flowlabel.c [NET]: Make all initialized struct seq_operations const. 2007-07-10 23:07:31 -07:00
ip6_input.c [IPV6]: Reverse sense of promisc tests in ip6_mc_input 2007-05-14 03:00:27 -07:00
ip6_output.c [IPv6]: Fix NULL pointer dereference in ip6_flush_pending_frames 2007-09-11 11:31:43 +02:00
ip6_tunnel.c ip6_tunnel - endianness annotations 2007-07-26 11:11:56 -07:00
ipcomp6.c [XFRM]: Add module alias for transformation type. 2007-07-10 22:15:43 -07:00
ipv6_sockglue.c [NET]: Fix IP_ADD/DROP_MEMBERSHIP to handle only connectionless 2007-08-26 18:35:35 -07:00
Kconfig [IPV6] MIP6: Loadable module support for MIPv6. 2007-07-10 22:15:42 -07:00
Makefile [IPV6] MIP6: Loadable module support for MIPv6. 2007-07-10 22:15:42 -07:00
mcast.c [NET]: Make all initialized struct seq_operations const. 2007-07-10 23:07:31 -07:00
mip6.c [XFRM]: Add module alias for transformation type. 2007-07-10 22:15:43 -07:00
ndisc.c [IPv6]: Fix ICMPv6 redirect handling with target multicast address 2007-10-08 00:12:05 -07:00
netfilter.c [SK_BUFF]: Introduce ipv6_hdr(), remove skb->nh.ipv6h 2007-04-25 22:25:14 -07:00
proc.c [IPV6]: Track device renames in snmp6. 2007-04-28 21:16:39 -07:00
protocol.c [IPV6]: Decentralize EXPORT_SYMBOLs. 2007-04-25 22:23:36 -07:00
raw.c [IPV6]: Fix unbalanced socket reference with MSG_CONFIRM. 2007-09-14 16:45:40 -07:00
reassembly.c [SK_BUFF]: unions of just one member don't get anything done, kill them 2007-04-25 22:26:20 -07:00
route.c [IPV6]: Don't update ADVMSS on routes where the MTU is not also updated 2007-07-31 02:28:04 -07:00
sit.c [NET]: Avoid copying writable clones in tunnel drivers 2007-07-10 22:19:05 -07:00
sysctl_net_ipv6.c [PATCH] sysctl: remove insert_at_head from register_sysctl 2007-02-14 08:09:59 -08:00
tcp_ipv6.c [TCP]: Fix MD5 signature handling on big-endian. 2007-09-28 15:18:35 -07:00
tunnel6.c [IPSEC]: changing API of xfrm6_tunnel_register 2007-02-13 12:55:55 -08:00
udp_impl.h [UDP]: Revert 2-pass hashing changes. 2007-06-07 13:40:50 -07:00
udp.c [IPV6]: Just increment OutDatagrams once per a datagram. 2007-09-14 17:15:01 -07:00
udplite.c [UDP]: Revert 2-pass hashing changes. 2007-06-07 13:40:50 -07:00
xfrm6_input.c [IPSEC]: Fix panic when using inter address familiy IPsec on loopback. 2007-05-31 01:23:28 -07:00
xfrm6_mode_beet.c [SK_BUFF]: unions of just one member don't get anything done, kill them 2007-04-25 22:26:20 -07:00
xfrm6_mode_ro.c [SK_BUFF]: Some more layer header conversions 2007-04-25 22:26:03 -07:00
xfrm6_mode_transport.c [SK_BUFF]: unions of just one member don't get anything done, kill them 2007-04-25 22:26:20 -07:00
xfrm6_mode_tunnel.c [IPSEC]: Fix panic when using inter address familiy IPsec on loopback. 2007-05-31 01:23:28 -07:00
xfrm6_output.c [SK_BUFF]: Introduce skb_reset_network_header(skb) 2007-04-25 22:24:46 -07:00
xfrm6_policy.c [IPV6] MIP6: Loadable module support for MIPv6. 2007-07-10 22:15:42 -07:00
xfrm6_state.c [IPV6] MIP6: Loadable module support for MIPv6. 2007-07-10 22:15:42 -07:00
xfrm6_tunnel.c mm: Remove slab destructors from kmem_cache_create(). 2007-07-20 10:11:58 +09:00