diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-09-06 16:09:38 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-09-24 21:46:32 +0900 |
commit | 3b6a3bdebfb555754fdc6ee507e3f6964de7b61c (patch) | |
tree | b904859c12346774a65f0704d8f42f197045b23e /src/network/networkd-ipv4ll.c | |
parent | c7e445abd59c808520cf5f09f059b993f0773aaa (diff) | |
download | systemd-3b6a3bdebfb555754fdc6ee507e3f6964de7b61c.tar.gz |
network: use NetworkConfigSource/State to manage addresses and routes
This also fixes #20146.
Diffstat (limited to 'src/network/networkd-ipv4ll.c')
-rw-r--r-- | src/network/networkd-ipv4ll.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/network/networkd-ipv4ll.c b/src/network/networkd-ipv4ll.c index 83ed3726f7..a3e5b4ba74 100644 --- a/src/network/networkd-ipv4ll.c +++ b/src/network/networkd-ipv4ll.c @@ -28,6 +28,7 @@ static int address_new_from_ipv4ll(Link *link, Address **ret) { if (r < 0) return -ENOMEM; + address->source = NETWORK_CONFIG_SOURCE_IPV4LL; address->family = AF_INET; address->in_addr.in = addr; address->prefixlen = 16; @@ -41,6 +42,7 @@ static int address_new_from_ipv4ll(Link *link, Address **ret) { static int ipv4ll_address_lost(Link *link) { _cleanup_(address_freep) Address *address = NULL; + Address *existing; int r; assert(link); @@ -53,10 +55,19 @@ static int ipv4ll_address_lost(Link *link) { if (r < 0) return r; + if (address_get(link, address, &existing) < 0) + return 0; + + if (existing->source != NETWORK_CONFIG_SOURCE_IPV4LL) + return 0; + + if (!address_exists(existing)) + return 0; + log_link_debug(link, "IPv4 link-local release "IPV4_ADDRESS_FMT_STR, IPV4_ADDRESS_FMT_VAL(address->in_addr.in)); - return address_remove(address, link); + return address_remove(existing); } static int ipv4ll_address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) { |