uint32_t t1;
uint32_t t2;
uint32_t lifetime;
- uint32_t address;
- uint32_t server_address;
- uint32_t subnet_mask;
- uint32_t router;
+ be32_t address;
+ be32_t server_address;
+ be32_t subnet_mask;
+ be32_t router;
};
typedef struct DHCPLease DHCPLease;
sd_event_source *receive_message;
uint8_t *req_opts;
size_t req_opts_size;
- uint32_t last_addr;
+ be32_t last_addr;
struct ether_addr mac_addr;
uint32_t xid;
usec_t start_time;
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)
lease = new0(DHCPLease, 1);
if (!lease)
- return -ENOBUFS;
+ return -ENOMEM;
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;
+ }
lease->address = offer->dhcp.yiaddr;
client_notify(client, DHCP_EVENT_IP_ACQUIRE);
- close(client->fd);
- client->fd = -1;
client->receive_message =
sd_event_source_unref(client->receive_message);
+ close(client->fd);
+ client->fd = -1;
}
r = 0;