chiark / gitweb /
libsystemd-dhcp: Compute UDP checksum only if set
[elogind.git] / src / libsystemd-dhcp / sd-dhcp-client.c
index 8115b7f769f8e20e1149d55c41fae95682a732c5..37fad9a30159f915eb53ae218ff92660d3199865 100644 (file)
@@ -726,7 +726,7 @@ static int client_timeout_t1(sd_event_source *s, uint64_t usec, void *userdata)
         return client_initialize_events(client, usec);
 }
 
-static int client_parse_offer(uint8_t code, uint8_t len, const uint8_t *option,
+static int client_parse_options(uint8_t code, uint8_t len, const uint8_t *option,
                               void *user_data) {
         DHCPLease *lease = user_data;
         be32_t val;
@@ -838,13 +838,18 @@ static int client_verify_headers(sd_dhcp_client *client, DHCPPacket *message,
                                                            hdrlen))
                 return -EINVAL;
 
-        message->ip.check = message->udp.len;
-        message->ip.ttl = 0;
-
-        if (hdrlen + be16toh(message->udp.len) > len ||
-            client_checksum(&message->ip.ttl, be16toh(message->udp.len) + 12))
+        if (hdrlen + be16toh(message->udp.len) > len)
                 return -EINVAL;
 
+        if (message->udp.check) {
+                message->ip.check = message->udp.len;
+                message->ip.ttl = 0;
+
+                if (client_checksum(&message->ip.ttl,
+                                    be16toh(message->udp.len) + 12))
+                        return -EINVAL;
+        }
+
         if (be16toh(message->udp.source) != DHCP_PORT_SERVER ||
             be16toh(message->udp.dest) != DHCP_PORT_CLIENT)
                 return -EINVAL;
@@ -876,7 +881,7 @@ static int client_receive_offer(sd_dhcp_client *client, DHCPPacket *offer,
                 return -ENOMEM;
 
         len = len - DHCP_IP_UDP_SIZE;
-        r = dhcp_option_parse(&offer->dhcp, len, client_parse_offer,
+        r = dhcp_option_parse(&offer->dhcp, len, client_parse_options,
                               lease);
         if (r != DHCP_OFFER)
                 return -ENOMSG;
@@ -919,7 +924,7 @@ static int client_receive_ack(sd_dhcp_client *client, const uint8_t *buf,
         if (!lease)
                 return -ENOMEM;
 
-        r = dhcp_option_parse(dhcp, len, client_parse_offer, lease);
+        r = dhcp_option_parse(dhcp, len, client_parse_options, lease);
         if (r == DHCP_NAK)
                 return DHCP_EVENT_NO_LEASE;