mirror of https://github.com/ipxe/ipxe.git
[dhcp] Limit maximum number of DHCP discovery deferrals
For switches which remain permanently in the non-forwarding state (or which erroneously report a non-forwarding state), ensure that iPXE will eventually give up waiting for the link to become unblocked. Originally-fixed-by: Wissam Shoukair <wissams@mellanox.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/41/head
parent
d5f7ee60e7
commit
ed0d7c4f6f
|
@ -24,6 +24,12 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||||
//#define DHCP_DISC_START_TIMEOUT_SEC 4 /* as per PXE spec */
|
//#define DHCP_DISC_START_TIMEOUT_SEC 4 /* as per PXE spec */
|
||||||
//#define DHCP_DISC_END_TIMEOUT_SEC 32 /* as per PXE spec */
|
//#define DHCP_DISC_END_TIMEOUT_SEC 32 /* as per PXE spec */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Maximum number of discovery deferrals due to blocked links
|
||||||
|
* (e.g. from non-forwarding STP ports)
|
||||||
|
*/
|
||||||
|
#define DHCP_DISC_MAX_DEFERRALS 60
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ProxyDHCP offers are given precedence by continue to wait for them
|
* ProxyDHCP offers are given precedence by continue to wait for them
|
||||||
* after a valid DHCPOFFER is received. We'll wait through this
|
* after a valid DHCPOFFER is received. We'll wait through this
|
||||||
|
|
|
@ -444,7 +444,8 @@ static void dhcp_discovery_expired ( struct dhcp_session *dhcp ) {
|
||||||
unsigned long elapsed = ( currticks() - dhcp->start );
|
unsigned long elapsed = ( currticks() - dhcp->start );
|
||||||
|
|
||||||
/* If link is blocked, defer DHCP discovery (and reset timeout) */
|
/* If link is blocked, defer DHCP discovery (and reset timeout) */
|
||||||
if ( netdev_link_blocked ( dhcp->netdev ) ) {
|
if ( netdev_link_blocked ( dhcp->netdev ) &&
|
||||||
|
( dhcp->count <= DHCP_DISC_MAX_DEFERRALS ) ) {
|
||||||
DBGC ( dhcp, "DHCP %p deferring discovery\n", dhcp );
|
DBGC ( dhcp, "DHCP %p deferring discovery\n", dhcp );
|
||||||
dhcp->start = currticks();
|
dhcp->start = currticks();
|
||||||
start_timer_fixed ( &dhcp->timer,
|
start_timer_fixed ( &dhcp->timer,
|
||||||
|
@ -1115,7 +1116,7 @@ static int dhcp_tx ( struct dhcp_session *dhcp ) {
|
||||||
* session state into packet traces. Useful for extracting
|
* session state into packet traces. Useful for extracting
|
||||||
* debug information from non-debug builds.
|
* debug information from non-debug builds.
|
||||||
*/
|
*/
|
||||||
dhcppkt.dhcphdr->secs = htons ( ( ++(dhcp->count) << 2 ) |
|
dhcppkt.dhcphdr->secs = htons ( ( dhcp->count << 2 ) |
|
||||||
( dhcp->offer.s_addr ? 0x02 : 0 ) |
|
( dhcp->offer.s_addr ? 0x02 : 0 ) |
|
||||||
( dhcp->proxy_offer ? 0x01 : 0 ) );
|
( dhcp->proxy_offer ? 0x01 : 0 ) );
|
||||||
|
|
||||||
|
@ -1259,6 +1260,9 @@ static void dhcp_timer_expired ( struct retry_timer *timer, int fail ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Increment transmission counter */
|
||||||
|
dhcp->count++;
|
||||||
|
|
||||||
/* Handle timer expiry based on current state */
|
/* Handle timer expiry based on current state */
|
||||||
dhcp->state->expired ( dhcp );
|
dhcp->state->expired ( dhcp );
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue