network: address: do not set IFA_F_PERMANENT flag

The flag is automatically set by kernel when the valid lifetime is
infinite. Note that the flag in netlink message for IPv4 address is
ignored. See set_ifa_lifetime() in kernel's net/ipv4/devinet.c.
But the flag is honored for IPv6 address. And if the flag is set with
finite valid lifetime, the address will not removed automatically by
the kernel.
This commit is contained in:
Yu Watanabe
2021-02-12 23:09:21 +09:00
parent a8481354f0
commit 53ae4762ef
+3 -5
View File
@@ -518,7 +518,6 @@ static int address_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, Link
}
static int address_set_netlink_message(const Address *address, sd_netlink_message *req, Link *link) {
uint32_t flags;
int r;
assert(address);
@@ -532,13 +531,12 @@ static int address_set_netlink_message(const Address *address, sd_netlink_messag
/* 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. */
flags = address->flags | IFA_F_PERMANENT;
r = sd_rtnl_message_addr_set_flags(req, flags & 0xff);
r = sd_rtnl_message_addr_set_flags(req, address->flags & 0xff);
if (r < 0)
return log_link_error_errno(link, r, "Could not set flags: %m");
if (flags & ~0xff) {
r = sd_netlink_message_append_u32(req, IFA_FLAGS, flags);
if ((address->flags & ~0xff) != 0) {
r = sd_netlink_message_append_u32(req, IFA_FLAGS, address->flags);
if (r < 0)
return log_link_error_errno(link, r, "Could not set extended flags: %m");
}