summaryrefslogtreecommitdiff
path: root/src/network/networkd-ipv4ll.c
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2021-09-06 16:09:38 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2021-09-24 21:46:32 +0900
commit3b6a3bdebfb555754fdc6ee507e3f6964de7b61c (patch)
treeb904859c12346774a65f0704d8f42f197045b23e /src/network/networkd-ipv4ll.c
parentc7e445abd59c808520cf5f09f059b993f0773aaa (diff)
downloadsystemd-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.c13
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) {