Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Allow DHCP server to instruct gPXE to ignore ProxyDHCP (which will
also avoid waiting for ProxyDHCP offers).

Also reduce the ProxyDHCP timeout, because it's already irritating me.
  • Loading branch information
Michael Brown committed Nov 21, 2007
1 parent 0becbf5 commit b3abf25
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 9 deletions.
9 changes: 8 additions & 1 deletion src/include/gpxe/dhcp.h
Expand Up @@ -183,6 +183,13 @@ struct job_interface;
*
*/

/** Ignore ProxyDHCP
*
* If set to a non-zero value, gPXE will not wait for ProxyDHCP offers
* and will ignore any ProxyDHCP offers that it receives.
*/
#define DHCP_EB_NO_PROXYDHCP DHCP_ENCAP_OPT ( DHCP_EB_ENCAP, 0xb0 )

/** Network device descriptor
*
* Byte 0 is the bus type ID; remaining bytes depend on the bus type.
Expand Down Expand Up @@ -514,7 +521,7 @@ dhcpopt_put ( struct dhcp_option_block *options ) {
}

/** Maximum time that we will wait for ProxyDHCP offers */
#define PROXYDHCP_WAIT_TIME ( TICKS_PER_SEC * 2 )
#define PROXYDHCP_WAIT_TIME ( TICKS_PER_SEC * 1 )

extern struct list_head dhcp_option_blocks;

Expand Down
24 changes: 16 additions & 8 deletions src/net/udp/dhcp.c
Expand Up @@ -832,9 +832,10 @@ static int dhcp_deliver_raw ( struct xfer_interface *xfer,
const struct dhcphdr *dhcphdr = data;
struct dhcp_option_block *options;
struct dhcp_option_block **store_options;
int is_proxy;
unsigned int msgtype;
unsigned long elapsed;
int is_proxy;
int ignore_proxy;

/* Check for matching transaction ID */
if ( dhcphdr->xid != dhcp_xid ( dhcp->netdev ) ) {
Expand Down Expand Up @@ -878,34 +879,41 @@ static int dhcp_deliver_raw ( struct xfer_interface *xfer,
dhcpopt_put ( options );
}

/* If we don't yet have a standard DHCP response (i.e. one
* with an IP address), then just leave the timer running.
*/
if ( ! dhcp->options )
goto out;

/* Handle DHCP response */
ignore_proxy = find_dhcp_num_option ( dhcp->options,
DHCP_EB_NO_PROXYDHCP );
switch ( dhcp->state ) {
case DHCPDISCOVER:
/* If we have received a valid standard DHCP response
* (i.e. one with an IP address), and we have allowed
* sufficient time for ProxyDHCP reponses, then
* transition to making the DHCPREQUEST.
/* If we have allowed sufficient time for ProxyDHCP
* reponses, then transition to making the DHCPREQUEST.
*/
elapsed = ( currticks() - dhcp->start );
if ( dhcp->options &&
( elapsed > PROXYDHCP_WAIT_TIME ) ) {
if ( ignore_proxy || ( elapsed > PROXYDHCP_WAIT_TIME ) ) {
stop_timer ( &dhcp->timer );
dhcp->state = DHCPREQUEST;
dhcp_send_request ( dhcp );
}
break;
case DHCPREQUEST:
/* DHCP finished; register options and exit */
if ( dhcp->proxy_options )
if ( dhcp->proxy_options && ( ! ignore_proxy ) ) {
dhcp->register_options ( dhcp->netdev,
dhcp->proxy_options );
}
dhcp->register_options ( dhcp->netdev, dhcp->options );
dhcp_finished ( dhcp, 0 );
break;
default:
assert ( 0 );
}

out:
return 0;

out_discard:
Expand Down

0 comments on commit b3abf25

Please sign in to comment.