diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index 2756ce74f8..700475f27b 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -656,6 +656,7 @@ static void log_address_debug(const Address *address, const char *str, const Lin } static int address_set_netlink_message(const Address *address, sd_netlink_message *req, Link *link) { + uint32_t flags; int r; assert(address); @@ -667,14 +668,16 @@ static int address_set_netlink_message(const Address *address, sd_netlink_messag return log_link_error_errno(link, r, "Could not set prefixlen: %m"); /* On remove, only IFA_F_MANAGETEMPADDR flag for IPv6 addresses are used. But anyway, set all - * flags here unconditionally. Without setting the flag, the template addresses generated by - * kernel will not be removed automatically when the main address is removed. */ - r = sd_rtnl_message_addr_set_flags(req, address->flags & 0xff); + * flags except tentative flag here unconditionally. Without setting the flag, the template + * addresses generated by kernel will not be removed automatically when the main address is + * removed. */ + flags = address->flags & ~IFA_F_TENTATIVE; + r = sd_rtnl_message_addr_set_flags(req, flags & 0xff); if (r < 0) return log_link_error_errno(link, r, "Could not set flags: %m"); - if ((address->flags & ~0xff) != 0) { - r = sd_netlink_message_append_u32(req, IFA_FLAGS, address->flags); + if ((flags & ~0xff) != 0) { + r = sd_netlink_message_append_u32(req, IFA_FLAGS, flags); if (r < 0) return log_link_error_errno(link, r, "Could not set extended flags: %m"); }