From d73982f098db9fdedb28a3826eb97a6832eac1e4 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Thu, 25 Jun 2015 17:30:49 +0100 Subject: [dhcp] Defer discovery if link is blocked If the link is blocked (e.g. due to a Spanning Tree Protocol port not yet forwarding packets) then defer DHCP discovery until the link becomes unblocked. Signed-off-by: Michael Brown --- src/net/udp/dhcp.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'src/net') diff --git a/src/net/udp/dhcp.c b/src/net/udp/dhcp.c index 8fe2774..61bef99 100644 --- a/src/net/udp/dhcp.c +++ b/src/net/udp/dhcp.c @@ -436,6 +436,15 @@ static void dhcp_discovery_rx ( struct dhcp_session *dhcp, static void dhcp_discovery_expired ( struct dhcp_session *dhcp ) { unsigned long elapsed = ( currticks() - dhcp->start ); + /* If link is blocked, defer DHCP discovery (and reset timeout) */ + if ( netdev_link_blocked ( dhcp->netdev ) ) { + DBGC ( dhcp, "DHCP %p deferring discovery\n", dhcp ); + start_timer_fixed ( &dhcp->timer, + ( DHCP_DISC_START_TIMEOUT_SEC * + TICKS_PER_SEC ) ); + return; + } + /* Give up waiting for ProxyDHCP before we reach the failure point */ if ( dhcp->offer.s_addr && ( elapsed > DHCP_DISC_PROXY_TIMEOUT_SEC * TICKS_PER_SEC ) ) { -- cgit v1.1