chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
libsystemd-dhcp: Add functions for sending unicast UDP messages
[elogind.git]
/
src
/
libsystemd-dhcp
/
dhcp-client.c
diff --git
a/src/libsystemd-dhcp/dhcp-client.c
b/src/libsystemd-dhcp/dhcp-client.c
index 18a6e3c50d725cb93ed06df60cd708267284e9c1..68a3b1a1b64c319db8d186091c88530c4c2f1605 100644
(file)
--- a/
src/libsystemd-dhcp/dhcp-client.c
+++ b/
src/libsystemd-dhcp/dhcp-client.c
@@
-382,10
+382,13
@@
static uint16_t client_checksum(void *buf, int len)
if (len & 0x01) {
odd = buf;
if (len & 0x01) {
odd = buf;
- sum += odd[len];
+ sum += odd[len
- 1
];
}
}
- return ~((sum & 0xffff) + (sum >> 16));
+ while (sum >> 16)
+ sum = (sum & 0xffff) + (sum >> 16);
+
+ return ~sum;
}
static void client_append_ip_headers(DHCPPacket *packet, uint16_t len)
}
static void client_append_ip_headers(DHCPPacket *packet, uint16_t len)
@@
-731,8
+734,15
@@
static int client_receive_ack(sd_dhcp_client *client, DHCPPacket *offer,
len = len - DHCP_IP_UDP_SIZE;
r = dhcp_option_parse(&offer->dhcp, len, client_parse_offer, lease);
len = len - DHCP_IP_UDP_SIZE;
r = dhcp_option_parse(&offer->dhcp, len, client_parse_offer, lease);
- if (r != DHCP_ACK)
+ if (r == DHCP_NAK) {
+ r = DHCP_EVENT_NO_LEASE;
+ goto error;
+ }
+
+ if (r != DHCP_ACK) {
+ r = -ENOMSG;
goto error;
goto error;
+ }
lease->address = offer->dhcp.yiaddr;
lease->address = offer->dhcp.yiaddr;