if (client->lease)
client->lease = sd_dhcp_lease_unref(client->lease);
+ log_dhcp_client(client, "STOPPED");
+
return 0;
}
client->state == DHCP_STATE_REBINDING)
message->ciaddr = client->lease->address;
- /* Some DHCP servers will refuse to issue an DHCP lease if the Cliient
+ /* Some DHCP servers will refuse to issue an DHCP lease if the Client
Identifier option is not set */
r = dhcp_option_append(opt, optlen, DHCP_OPTION_CLIENT_IDENTIFIER,
ETH_ALEN, &client->mac_addr);
err = dhcp_network_send_raw_socket(client->fd, &client->link,
discover, len);
+ log_dhcp_client(client, "DISCOVER");
+
return err;
}
request, len);
}
+ log_dhcp_client(client, "REQUEST");
+
return err;
}
next_timeout += (random_u32() & 0x1fffff);
- r = sd_event_add_monotonic(client->event, next_timeout,
+ client->timeout_resend = sd_event_source_unref(client->timeout_resend);
+
+ r = sd_event_add_monotonic(client->event,
+ &client->timeout_resend,
+ next_timeout,
10 * USEC_PER_MSEC,
- client_timeout_resend, client,
- &client->timeout_resend);
+ client_timeout_resend, client);
if (r < 0)
goto error;
assert(client);
assert(client->event);
- r = sd_event_add_io(client->event, client->fd, EPOLLIN, io_callback,
- client, &client->receive_message);
+ r = sd_event_add_io(client->event, &client->receive_message,
+ client->fd, EPOLLIN, io_callback,
+ client);
if (r < 0)
goto error;
if (r < 0)
goto error;
- r = sd_event_add_monotonic(client->event, usec, 0,
- client_timeout_resend, client,
- &client->timeout_resend);
+ client->timeout_resend = sd_event_source_unref(client->timeout_resend);
+
+ r = sd_event_add_monotonic(client->event,
+ &client->timeout_resend,
+ usec, 0,
+ client_timeout_resend, client);
if (r < 0)
goto error;
void *userdata) {
sd_dhcp_client *client = userdata;
+ log_dhcp_client(client, "EXPIRED");
+
client_stop(client, DHCP_EVENT_EXPIRED);
return 0;
client->fd = r;
+ log_dhcp_client(client, "TIMEOUT T2");
+
return client_initialize_events(client, client_receive_message_raw,
usec);
}
client->fd = r;
+ log_dhcp_client(client, "TIMEOUT T1");
+
return client_initialize_events(client, client_receive_message_udp, usec);
}
client->lease = lease;
lease = NULL;
+ log_dhcp_client(client, "OFFER");
+
return 0;
}
return r;
r = dhcp_option_parse(ack, len, dhcp_lease_parse_options, lease);
- if (r == DHCP_NAK)
+ if (r == DHCP_NAK) {
+ log_dhcp_client(client, "NAK");
return DHCP_EVENT_NO_LEASE;
+ }
if (r != DHCP_ACK)
return -ENOMSG;
client->lease = lease;
lease = NULL;
+ log_dhcp_client(client, "ACK");
+
return r;
}
if (next_timeout < usec)
return -EINVAL;
- r = sd_event_add_monotonic(client->event, next_timeout,
+ r = sd_event_add_monotonic(client->event,
+ &client->timeout_t1,
+ next_timeout,
10 * USEC_PER_MSEC,
- client_timeout_t1, client,
- &client->timeout_t1);
+ client_timeout_t1, client);
if (r < 0)
return r;
if (next_timeout < usec)
return -EINVAL;
- r = sd_event_add_monotonic(client->event, next_timeout,
+ r = sd_event_add_monotonic(client->event,
+ &client->timeout_t2,
+ next_timeout,
10 * USEC_PER_MSEC,
- client_timeout_t2, client,
- &client->timeout_t2);
+ client_timeout_t2, client);
if (r < 0)
return r;
if (next_timeout < usec)
return -EINVAL;
- r = sd_event_add_monotonic(client->event, next_timeout,
+ r = sd_event_add_monotonic(client->event,
+ &client->timeout_expire, next_timeout,
10 * USEC_PER_MSEC,
- client_timeout_expire, client,
- &client->timeout_expire);
+ client_timeout_expire, client);
if (r < 0)
return r;
assert(message);
if (be32toh(message->xid) != client->xid)
- return -EINVAL;
+ return 0;
if (memcmp(&message->chaddr[0], &client->mac_addr.ether_addr_octet,
ETHER_ADDR_LEN))
- return -EINVAL;
+ return 0;
switch (client->state) {
case DHCP_STATE_SELECTING:
client->state = DHCP_STATE_REQUESTING;
client->attempt = 1;
- r = sd_event_add_monotonic(client->event, time_now, 0,
+ r = sd_event_add_monotonic(client->event,
+ &client->timeout_resend,
+ time_now, 0,
client_timeout_resend,
- client,
- &client->timeout_resend);
+ client);
if (r < 0)
goto error;
return 0;
}
-static int client_receive_message_raw(sd_event_source *s, int fd,
+static int client_receive_message_udp(sd_event_source *s, int fd,
uint32_t revents, void *userdata) {
sd_dhcp_client *client = userdata;
uint8_t buf[sizeof(DHCPMessage) + DHCP_MIN_OPTIONS_SIZE];
time_now);
}
-static int client_receive_message_udp(sd_event_source *s, int fd,
+static int client_receive_message_raw(sd_event_source *s, int fd,
uint32_t revents, void *userdata) {
sd_dhcp_client *client = userdata;
uint8_t buf[sizeof(DHCPPacket) + DHCP_MIN_OPTIONS_SIZE];
packet = (DHCPPacket *) buf;
r = dhcp_packet_verify_headers(packet, BOOTREPLY, len);
- if (r < 0)
- return r;
+ if (r < 0) {
+ log_dhcp_client(client, "ignoring DHCP packet with invalid headers");
+ return 0;
+ }
len -= DHCP_IP_UDP_SIZE;
client->start_time = now(CLOCK_MONOTONIC);
client->secs = 0;
- return client_initialize_events(client, client_receive_message_udp,
+ log_dhcp_client(client, "STARTED");
+
+ return client_initialize_events(client, client_receive_message_raw,
client->start_time);
}