]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
dhcp: fix comparison with previous lease
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 18 Jun 2019 02:18:46 +0000 (11:18 +0900)
committerLennart Poettering <lennart@poettering.net>
Tue, 18 Jun 2019 08:27:59 +0000 (10:27 +0200)
Follow-up for f8862395e8f802e4106a07ceaaf02b6a1faa5a6d.

Fixes #12816.

src/libsystemd-network/sd-dhcp-client.c

index 6e077c0860c543857b918b7fd811ecc7b0fe701b..b0f0f849379e622ebb825c636e30e975e5407ece 100644 (file)
@@ -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);
         }