X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-network%2Fsd-dhcp-client.c;h=f4a83fb7a4066b91416576e07f9bd74e2b98def4;hb=1238ee09b7babb175b9bf7ad1d0e8eb2a414ee6e;hp=1f676ccb655455ad1a15b21b70cb3a041fc1eb01;hpb=fe8db0c5ee3365a2fc80ee7ebffa238f9a0a2ae2;p=elogind.git diff --git a/src/libsystemd-network/sd-dhcp-client.c b/src/libsystemd-network/sd-dhcp-client.c index 1f676ccb6..f4a83fb7a 100644 --- a/src/libsystemd-network/sd-dhcp-client.c +++ b/src/libsystemd-network/sd-dhcp-client.c @@ -143,6 +143,15 @@ int sd_dhcp_client_set_mac(sd_dhcp_client *client, 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; @@ -176,7 +185,7 @@ static int client_stop(sd_dhcp_client *client, int error) { 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); @@ -255,6 +264,15 @@ static int client_message_init(sd_dhcp_client *client, DHCPMessage *message, 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; @@ -286,14 +304,13 @@ static int client_send_discover(sd_dhcp_client *client, uint16_t secs) { 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) { @@ -339,15 +356,14 @@ 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) @@ -530,7 +546,7 @@ static int client_timeout_t2(sd_event_source *s, uint64_t usec, void *userdata) 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; } @@ -587,6 +603,8 @@ static int client_handle_offer(sd_dhcp_client *client, DHCPMessage *offer, if (r != DHCP_OFFER) return -ENOMSG; + lease->next_server = offer->siaddr; + lease->address = offer->yiaddr; if (lease->address == INADDR_ANY || @@ -621,6 +639,8 @@ static int client_handle_ack(sd_dhcp_client *client, DHCPMessage *ack, if (r != DHCP_ACK) return -ENOMSG; + lease->next_server = ack->siaddr; + lease->address = ack->yiaddr; if (lease->address == INADDR_ANY || @@ -828,7 +848,7 @@ static int client_handle_message(sd_dhcp_client *client, DHCPMessage *message, client->receive_message = sd_event_source_unref(client->receive_message); - close(client->fd); + close_nointr_nofail(client->fd); client->fd = -1; }