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.
pull/1/head
Michael Brown 2007-11-21 22:10:04 +00:00
parent 0becbf5fba
commit b3abf25e3c
2 changed files with 24 additions and 9 deletions

View File

@ -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 /** Network device descriptor
* *
* Byte 0 is the bus type ID; remaining bytes depend on the bus type. * Byte 0 is the bus type ID; remaining bytes depend on the bus type.
@ -514,7 +521,7 @@ dhcpopt_put ( struct dhcp_option_block *options ) {
} }
/** Maximum time that we will wait for ProxyDHCP offers */ /** 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; extern struct list_head dhcp_option_blocks;

View File

@ -832,9 +832,10 @@ static int dhcp_deliver_raw ( struct xfer_interface *xfer,
const struct dhcphdr *dhcphdr = data; const struct dhcphdr *dhcphdr = data;
struct dhcp_option_block *options; struct dhcp_option_block *options;
struct dhcp_option_block **store_options; struct dhcp_option_block **store_options;
int is_proxy;
unsigned int msgtype; unsigned int msgtype;
unsigned long elapsed; unsigned long elapsed;
int is_proxy;
int ignore_proxy;
/* Check for matching transaction ID */ /* Check for matching transaction ID */
if ( dhcphdr->xid != dhcp_xid ( dhcp->netdev ) ) { if ( dhcphdr->xid != dhcp_xid ( dhcp->netdev ) ) {
@ -878,17 +879,22 @@ static int dhcp_deliver_raw ( struct xfer_interface *xfer,
dhcpopt_put ( options ); 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 */ /* Handle DHCP response */
ignore_proxy = find_dhcp_num_option ( dhcp->options,
DHCP_EB_NO_PROXYDHCP );
switch ( dhcp->state ) { switch ( dhcp->state ) {
case DHCPDISCOVER: case DHCPDISCOVER:
/* If we have received a valid standard DHCP response /* If we have allowed sufficient time for ProxyDHCP
* (i.e. one with an IP address), and we have allowed * reponses, then transition to making the DHCPREQUEST.
* sufficient time for ProxyDHCP reponses, then
* transition to making the DHCPREQUEST.
*/ */
elapsed = ( currticks() - dhcp->start ); elapsed = ( currticks() - dhcp->start );
if ( dhcp->options && if ( ignore_proxy || ( elapsed > PROXYDHCP_WAIT_TIME ) ) {
( elapsed > PROXYDHCP_WAIT_TIME ) ) {
stop_timer ( &dhcp->timer ); stop_timer ( &dhcp->timer );
dhcp->state = DHCPREQUEST; dhcp->state = DHCPREQUEST;
dhcp_send_request ( dhcp ); dhcp_send_request ( dhcp );
@ -896,9 +902,10 @@ static int dhcp_deliver_raw ( struct xfer_interface *xfer,
break; break;
case DHCPREQUEST: case DHCPREQUEST:
/* DHCP finished; register options and exit */ /* DHCP finished; register options and exit */
if ( dhcp->proxy_options ) if ( dhcp->proxy_options && ( ! ignore_proxy ) ) {
dhcp->register_options ( dhcp->netdev, dhcp->register_options ( dhcp->netdev,
dhcp->proxy_options ); dhcp->proxy_options );
}
dhcp->register_options ( dhcp->netdev, dhcp->options ); dhcp->register_options ( dhcp->netdev, dhcp->options );
dhcp_finished ( dhcp, 0 ); dhcp_finished ( dhcp, 0 );
break; break;
@ -906,6 +913,7 @@ static int dhcp_deliver_raw ( struct xfer_interface *xfer,
assert ( 0 ); assert ( 0 );
} }
out:
return 0; return 0;
out_discard: out_discard: