}
static int address_set_netlink_message(const Address *address, sd_netlink_message *req, Link *link) {
+ uint32_t flags;
int r;
assert(address);
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");
}