From: Yu Watanabe Date: Fri, 12 Feb 2021 05:44:42 +0000 (+0900) Subject: network: address: do not set IFA_F_PERMANENT flag X-Git-Tag: v248-rc1~146^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=53ae4762efb37e1b6ea1139eca836c53af61293d;p=thirdparty%2Fsystemd.git 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. --- diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index c3e92d98719..d857b6d8794 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -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"); }