]> git.baikalelectronics.ru Git - kernel.git/commit
ipv6: dad: don't remove dynamic addresses if link is down
authorSabrina Dubroca <sd@queasysnail.net>
Thu, 29 Jun 2017 14:56:54 +0000 (16:56 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 3 Jul 2017 08:53:51 +0000 (01:53 -0700)
commit0de6edb99c9ef92338b58fa2f84335ea27a024cd
tree829f11482cf0c157164dd570838c067c5654fee3
parent07ebb8644fdb401565fb43797f2de7be713f74be
ipv6: dad: don't remove dynamic addresses if link is down

Currently, when the link for $DEV is down, this command succeeds but the
address is removed immediately by DAD (1):

    ip addr add 1111::12/64 dev $DEV valid_lft 3600 preferred_lft 1800

In the same situation, this will succeed and not remove the address (2):

    ip addr add 1111::12/64 dev $DEV
    ip addr change 1111::12/64 dev $DEV valid_lft 3600 preferred_lft 1800

The comment in addrconf_dad_begin() when !IF_READY makes it look like
this is the intended behavior, but doesn't explain why:

     * If the device is not ready:
     * - keep it tentative if it is a permanent address.
     * - otherwise, kill it.

We clearly cannot prevent userspace from doing (2), but we can make (1)
work consistently with (2).

addrconf_dad_stop() is only called in two cases: if DAD failed, or to
skip DAD when the link is down. In that second case, the fix is to avoid
deleting the address, like we already do for permanent addresses.

Fixes: a8fc4c59d3ed ("[IPV6]: Defer IPv6 device initialization until the link becomes ready.")
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/addrconf.c