summaryrefslogtreecommitdiffstats
path: root/src/usr/dhcpmgmt.c
diff options
context:
space:
mode:
authorJoshua Oreman2009-12-08 09:40:50 +0100
committerMarty Connor2010-01-20 23:15:51 +0100
commitb1ba80f8fbe2377e992848c3c6e6eb55fbe6d909 (patch)
tree7f999145480b9dfdfa8ab094230d395374de3303 /src/usr/dhcpmgmt.c
parent[pxe] Separate parent PXE API caller from UNDINET driver (diff)
downloadipxe-b1ba80f8fbe2377e992848c3c6e6eb55fbe6d909.tar.gz
ipxe-b1ba80f8fbe2377e992848c3c6e6eb55fbe6d909.tar.xz
ipxe-b1ba80f8fbe2377e992848c3c6e6eb55fbe6d909.zip
[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.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/usr/dhcpmgmt.c b/src/usr/dhcpmgmt.c
index aa969856..f82a3bb8 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;
}