net: vrf: Handle ipv6 multicast and link-local addresses
authorDavid Ahern <dsa@cumulusnetworks.com>
Mon, 13 Jun 2016 20:44:19 +0000 (13:44 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 15 Jun 2016 19:34:34 +0000 (12:34 -0700)
commit9ff74384600aeecba34ebdacbbde0627489ff601
tree35a4899be648232e3a96c47220f08414eb5fd6c3
parentba46ee4c0ed122fa14aa2f5d6994c166a01ae2c0
net: vrf: Handle ipv6 multicast and link-local addresses

IPv6 multicast and link-local addresses require special handling by the
VRF driver:
1. Rather than using the VRF device index and full FIB lookups,
   packets to/from these addresses should use direct FIB lookups based on
   the VRF device table.

2. fail sends/receives on a VRF device to/from a multicast address
   (e.g, make ping6 ff02::1%<vrf> fail)

3. move the setting of the flow oif to the first dst lookup and revert
   the change in icmpv6_echo_reply made in ca254490c8dfd ("net: Add VRF
   support to IPv6 stack"). Linklocal/mcast addresses require use of the
   skb->dev.

With this change connections into and out of a VRF enslaved device work
for multicast and link-local addresses work (icmp, tcp, and udp)
e.g.,

1. packets into VM with VRF config:
    ping6 -c3 fe80::e0:f9ff:fe1c:b974%br1
    ping6 -c3 ff02::1%br1

    ssh -6 fe80::e0:f9ff:fe1c:b974%br1

2. packets going out a VRF enslaved device:
    ping6 -c3 fe80::18f8:83ff:fe4b:7a2e%eth1
    ping6 -c3 ff02::1%eth1
    ssh -6 root@fe80::18f8:83ff:fe4b:7a2e%eth1

Signed-off-by: David Ahern <dsa@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/vrf.c
include/net/ip6_route.h
net/ipv6/icmp.c
net/ipv6/route.c