• Mike Manning's avatar
    net: ipv6: Remove addresses for failures with strict DAD · 85b51b12
    Mike Manning authored
    If DAD fails with accept_dad set to 2, global addresses and host routes
    are incorrectly left in place. Even though disable_ipv6 is set,
    contrary to documentation, the addresses are not dynamically deleted
    from the interface. It is only on a subsequent link down/up that these
    are removed. The fix is not only to set the disable_ipv6 flag, but
    also to call addrconf_ifdown(), which is the action to carry out when
    disabling IPv6. This results in the addresses and routes being deleted
    immediately. The DAD failure for the LL addr is determined as before
    via netlink, or by the absence of the LL addr (which also previously
    would have had to be checked for in case of an intervening link down
    and up). As the call to addrconf_ifdown() requires an rtnl lock, the
    logic to disable IPv6 when DAD fails is moved to addrconf_dad_work().
    
    Previous behavior:
    
    root@vm1:/# sysctl net.ipv6.conf.eth3.accept_dad=2
    net.ipv6.conf.eth3.accept_dad = 2
    root@vm1:/# ip -6 addr add 2000::10/64 dev eth3
    root@vm1:/# ip link set up eth3
    root@vm1:/# ip -6 addr show dev eth3
    5: eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
        inet6 2000::10/64 scope global
           valid_lft forever preferred_lft forever
        inet6 fe80::5054:ff:fe43:dd5a/64 scope link tentative dadfailed
           valid_lft forever preferred_lft forever
    root@vm1:/# ip -6 route show dev eth3
    2000::/64  proto kernel  metric 256
    fe80::/64  proto kernel  metric 256
    root@vm1:/# ip link set down eth3
    root@vm1:/# ip link set up eth3
    root@vm1:/# ip -6 addr show dev eth3
    root@vm1:/# ip -6 route show dev eth3
    root@vm1:/#
    
    New behavior:
    
    root@vm1:/# sysctl net.ipv6.conf.eth3.accept_dad=2
    net.ipv6.conf.eth3.accept_dad = 2
    root@vm1:/# ip -6 addr add 2000::10/64 dev eth3
    root@vm1:/# ip link set up eth3
    root@vm1:/# ip -6 addr show dev eth3
    root@vm1:/# ip -6 route show dev eth3
    root@vm1:/#
    Signed-off-by: default avatarMike Manning <mmanning@brocade.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    85b51b12
addrconf.c 151 KB