diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2019-06-18 11:18:46 +0900 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2019-06-18 10:27:59 +0200 |
commit | 3d9f670783989fc0a5ec6e6812199e9b656abf0e (patch) | |
tree | 73a9a0a95894c9006153e20e687e37581b76e5f0 /src/libsystemd-network | |
parent | 0ef67b7376375a7e180d1cf1c25120b42b06d340 (diff) | |
download | systemd-3d9f670783989fc0a5ec6e6812199e9b656abf0e.tar.gz |
dhcp: fix comparison with previous lease
Follow-up for f8862395e8f802e4106a07ceaaf02b6a1faa5a6d.
Fixes #12816.
Diffstat (limited to 'src/libsystemd-network')
-rw-r--r-- | src/libsystemd-network/sd-dhcp-client.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/src/libsystemd-network/sd-dhcp-client.c b/src/libsystemd-network/sd-dhcp-client.c index 6e077c0860..b0f0f84937 100644 --- a/src/libsystemd-network/sd-dhcp-client.c +++ b/src/libsystemd-network/sd-dhcp-client.c @@ -1385,6 +1385,23 @@ static int client_handle_forcerenew(sd_dhcp_client *client, DHCPMessage *force, return 0; } +static bool lease_equal(const sd_dhcp_lease *a, const sd_dhcp_lease *b) { + if (a->address != b->address) + return false; + + if (a->subnet_mask != b->subnet_mask) + return false; + + if (a->router_size != b->router_size) + return false; + + for (size_t i = 0; i < a->router_size; i++) + if (a->router[i].s_addr != b->router[i].s_addr) + return false; + + return true; +} + static int client_handle_ack(sd_dhcp_client *client, DHCPMessage *ack, size_t len) { _cleanup_(sd_dhcp_lease_unrefp) sd_dhcp_lease *lease = NULL; _cleanup_free_ char *error_message = NULL; @@ -1437,12 +1454,10 @@ static int client_handle_ack(sd_dhcp_client *client, DHCPMessage *ack, size_t le r = SD_DHCP_CLIENT_EVENT_IP_ACQUIRE; if (client->lease) { - if (client->lease->address != lease->address || - client->lease->subnet_mask != lease->subnet_mask || - client->lease->router != lease->router) { - r = SD_DHCP_CLIENT_EVENT_IP_CHANGE; - } else + if (lease_equal(client->lease, lease)) r = SD_DHCP_CLIENT_EVENT_RENEW; + else + r = SD_DHCP_CLIENT_EVENT_IP_CHANGE; client->lease = sd_dhcp_lease_unref(client->lease); } |