diff options
author | Joshua Oreman <oremanj@rwcr.net> | 2009-12-08 03:40:50 -0500 |
---|---|---|
committer | Marty Connor <mdc@etherboot.org> | 2010-01-20 17:15:51 -0500 |
commit | b1ba80f8fbe2377e992848c3c6e6eb55fbe6d909 (patch) | |
tree | 7f999145480b9dfdfa8ab094230d395374de3303 /src/usr/dhcpmgmt.c | |
parent | 337e1ed4b4aea8d73ced8077be1f78ac7b347ba6 (diff) | |
download | ipxe-b1ba80f8fbe2377e992848c3c6e6eb55fbe6d909.zip ipxe-b1ba80f8fbe2377e992848c3c6e6eb55fbe6d909.tar.gz ipxe-b1ba80f8fbe2377e992848c3c6e6eb55fbe6d909.tar.bz2 |
[dhcp] Add generic facility for using cached network settings
When a DHCP session is started (using autoboot or a command-line `dhcp
net0'), check whether the new setting use-cached (DHCP option 175.178)
is TRUE; if so, skip DHCP and rely on currently registered
settings. This lets one combine a static IP with autoboot.
Before checking the use-cached setting, call a weak
get_cached_dhcpack() hook that can be implemented by particular builds
of gPXE supporting some fashion of retrieving a cached DHCPACK packet.
If one is available, it is registered as an options source, and then
either that packet's option 175.178 or the user's prior manual
use-cached setting can allow skipping duplicate DHCP.
Using cached packets is not the default because DHCP servers are often
configured to give gPXE different options than they give a vendor PXE
client; in order to break the infinite loop of PXE chaining, one would
need to load a gPXE with an embedded image that does something more
than autoboot.
Signed-off-by: Marty Connor <mdc@etherboot.org>
Diffstat (limited to 'src/usr/dhcpmgmt.c')
-rw-r--r-- | src/usr/dhcpmgmt.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/usr/dhcpmgmt.c b/src/usr/dhcpmgmt.c index aa96985..f82a3bb 100644 --- a/src/usr/dhcpmgmt.c +++ b/src/usr/dhcpmgmt.c @@ -55,8 +55,13 @@ int dhcp ( struct net_device *netdev ) { printf ( "DHCP (%s ", netdev->name ); while ( hlen-- ) printf ( "%02x%c", *(chaddr++), ( hlen ? ':' : ')' ) ); - if ( ( rc = start_dhcp ( &monojob, netdev ) ) == 0 ) + + if ( ( rc = start_dhcp ( &monojob, netdev ) ) == 0 ) { rc = monojob_wait ( "" ); + } else if ( rc > 0 ) { + printf ( " using cached\n" ); + rc = 0; + } return rc; } |