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:
@@ -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");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user