From: Sabrina Dubroca <[email protected]>
Date: Thu, 29 Jun 2017 16:56:54 +0200
> 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: 3c21edbd1137 ("[IPV6]: Defer IPv6 device initialization until the link
> becomes ready.")
> Signed-off-by: Sabrina Dubroca <[email protected]>
Applied and queued up for -stable, thanks.