Index: uspace/srv/net/dhcp/dhcp.c
===================================================================
--- uspace/srv/net/dhcp/dhcp.c	(revision b417559d1675d7d38ae1bd8281e4d9a5ded91c92)
+++ uspace/srv/net/dhcp/dhcp.c	(revision 1b0602a36b2970e8760e8f0c3dcf0efd499e7cbb)
@@ -53,6 +53,12 @@
 #include "transport.h"
 
-#define DHCP_DISCOVER_TIMEOUT_VAL (5 * 1000 * 1000)
-#define DHCP_REQUEST_TIMEOUT_VAL (1 * 1000 * 1000)
+enum {
+	/** In microseconds */
+	dhcp_discover_timeout_val = 5 * 1000 * 1000,
+	/** In microseconds */
+	dhcp_request_timeout_val = 1 * 1000 * 1000,
+	dhcp_discover_retries = 5,
+	dhcp_request_retries = 3
+};
 
 #define MAX_MSG_SIZE 1024
@@ -67,4 +73,5 @@
 typedef enum {
 	ds_bound,
+	ds_fail,
 	ds_init,
 	ds_init_reboot,
@@ -99,4 +106,6 @@
 	/** Transport timeout */
 	fibril_timer_t *timeout;
+	/** Number of retries */
+	int retries_left;
 	/** Link state */
 	dhcp_state_t state;
@@ -455,9 +464,11 @@
 	rc = dhcp_send_discover(dlink);
 	if (rc != EOK) {
+		dlink->state = ds_fail;
 		rc = EIO;
 		goto error;
 	}
 
-	fibril_timer_set(dlink->timeout, DHCP_DISCOVER_TIMEOUT_VAL,
+	dlink->retries_left = dhcp_discover_retries;
+	fibril_timer_set(dlink->timeout, dhcp_discover_timeout_val,
 	    dhcpsrv_discover_timeout, dlink);
 
@@ -498,5 +509,6 @@
 	}
 
-	fibril_timer_set(dlink->timeout, DHCP_REQUEST_TIMEOUT_VAL,
+	dlink->retries_left = dhcp_request_retries;
+	fibril_timer_set(dlink->timeout, dhcp_request_timeout_val,
 	    dhcpsrv_request_timeout, dlink);
 }
@@ -559,12 +571,20 @@
 	log_msg(LOG_DEFAULT, LVL_NOTE, "dcpsrv_discover_timeout");
 
+	if (dlink->retries_left == 0) {
+		log_msg(LOG_DEFAULT, LVL_NOTE, "Retries exhausted");
+		dlink->state = ds_fail;
+		return;
+	}
+	--dlink->retries_left;
+
 	log_msg(LOG_DEFAULT, LVL_DEBUG, "Send DHCPDISCOVER");
 	rc = dhcp_send_discover(dlink);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Error sending DHCPDISCOVER");
-		return;
-	}
-
-	fibril_timer_set(dlink->timeout, DHCP_DISCOVER_TIMEOUT_VAL,
+		dlink->state = ds_fail;
+		return;
+	}
+
+	fibril_timer_set(dlink->timeout, dhcp_discover_timeout_val,
 	    dhcpsrv_discover_timeout, dlink);
 }
@@ -578,12 +598,20 @@
 	log_msg(LOG_DEFAULT, LVL_NOTE, "dcpsrv_request_timeout");
 
+	if (dlink->retries_left == 0) {
+		log_msg(LOG_DEFAULT, LVL_NOTE, "Retries exhausted");
+		dlink->state = ds_fail;
+		return;
+	}
+	--dlink->retries_left;
+
 	log_msg(LOG_DEFAULT, LVL_DEBUG, "Send DHCPREQUEST");
 	rc = dhcp_send_request(dlink, &dlink->offer);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_DEBUG, "Error sending request.");
-		return;
-	}
-
-	fibril_timer_set(dlink->timeout, DHCP_REQUEST_TIMEOUT_VAL,
+		dlink->state = ds_fail;
+		return;
+	}
+
+	fibril_timer_set(dlink->timeout, dhcp_request_timeout_val,
 	    dhcpsrv_request_timeout, dlink);
 }
