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;
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;
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;
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;