+static int client_timeout_resend(sd_event_source *s, uint64_t usec,
+ void *userdata)
+{
+ sd_dhcp_client *client = userdata;
+ usec_t next_timeout;
+ uint16_t secs;
+ int err = 0;
+
+ switch (client->state) {
+ case DHCP_STATE_INIT:
+ case DHCP_STATE_SELECTING:
+
+ if (!client->start_time)
+ client->start_time = usec;
+
+ secs = (usec - client->start_time) / USEC_PER_SEC;
+
+ next_timeout = usec + 2 * USEC_PER_SEC + (random() & 0x1fffff);
+
+ err = sd_event_add_monotonic(client->event, next_timeout,
+ 10 * USEC_PER_MSEC,
+ client_timeout_resend, client,
+ &client->timeout_resend);
+ if (err < 0)
+ goto error;
+
+ if (client_send_discover(client, secs) >= 0)
+ client->state = DHCP_STATE_SELECTING;
+
+ break;
+
+ case DHCP_STATE_INIT_REBOOT:
+ case DHCP_STATE_REBOOTING:
+ case DHCP_STATE_REQUESTING:
+ case DHCP_STATE_BOUND:
+ case DHCP_STATE_RENEWING:
+ case DHCP_STATE_REBINDING:
+
+ break;
+ }
+
+ return 0;
+
+error:
+ client_stop(client, err);
+
+ /* Errors were dealt with when stopping the client, don't spill
+ errors into the event loop handler */
+ return 0;
+}
+