assert_return(client, -EINVAL);
assert_return(client->state == DHCP_STATE_INIT, -EBUSY);
+ log_dhcp_client(client, "set MAC address to "
+ "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
+ addr->ether_addr_octet[0],
+ addr->ether_addr_octet[1],
+ addr->ether_addr_octet[2],
+ addr->ether_addr_octet[3],
+ addr->ether_addr_octet[4],
+ addr->ether_addr_octet[5]);
+
memcpy(&client->mac_addr, addr, ETH_ALEN);
return 0;
sd_event_source_unref(client->receive_message);
if (client->fd >= 0)
- close(client->fd);
+ close_nointr_nofail(client->fd);
client->fd = -1;
client->timeout_resend = sd_event_source_unref(client->timeout_resend);
return 0;
}
+static int dhcp_client_send_raw(sd_dhcp_client *client, DHCPPacket *packet,
+ size_t len) {
+ dhcp_packet_append_ip_headers(packet, INADDR_ANY, DHCP_PORT_CLIENT,
+ INADDR_BROADCAST, DHCP_PORT_SERVER, len);
+
+ return dhcp_network_send_raw_socket(client->fd, &client->link,
+ packet, len);
+}
+
static int client_send_discover(sd_dhcp_client *client, uint16_t secs) {
int err = 0;
_cleanup_free_ DHCPPacket *discover;
if (err < 0)
return err;
- dhcp_packet_append_ip_headers(discover, len);
-
- err = dhcp_network_send_raw_socket(client->fd, &client->link,
- discover, len);
+ err = dhcp_client_send_raw(client, discover, len);
+ if (err < 0)
+ return err;
log_dhcp_client(client, "DISCOVER");
- return err;
+ return 0;
}
static int client_send_request(sd_dhcp_client *client, uint16_t secs) {
&request->dhcp,
len - DHCP_IP_UDP_SIZE);
} else {
- dhcp_packet_append_ip_headers(request, len);
-
- err = dhcp_network_send_raw_socket(client->fd, &client->link,
- request, len);
+ err = dhcp_client_send_raw(client, request, len);
}
+ if (err < 0)
+ return err;
log_dhcp_client(client, "REQUEST");
- return err;
+ return 0;
}
static uint16_t client_update_secs(sd_dhcp_client *client, usec_t time_now)
if (client->fd >= 0) {
client->receive_message =
sd_event_source_unref(client->receive_message);
- close(client->fd);
+ close_nointr_nofail(client->fd);
client->fd = -1;
}
if (r != DHCP_OFFER)
return -ENOMSG;
+ lease->next_server = offer->siaddr;
+
lease->address = offer->yiaddr;
if (lease->address == INADDR_ANY ||
if (r != DHCP_ACK)
return -ENOMSG;
+ lease->next_server = ack->siaddr;
+
lease->address = ack->yiaddr;
if (lease->address == INADDR_ANY ||
client->receive_message =
sd_event_source_unref(client->receive_message);
- close(client->fd);
+ close_nointr_nofail(client->fd);
client->fd = -1;
}