From b1ba80f8fbe2377e992848c3c6e6eb55fbe6d909 Mon Sep 17 00:00:00 2001 From: Joshua Oreman Date: Tue, 8 Dec 2009 03:40:50 -0500 Subject: [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 --- src/include/gpxe/dhcp.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'src/include') diff --git a/src/include/gpxe/dhcp.h b/src/include/gpxe/dhcp.h index 2d9f88533..ebfe8edeb 100644 --- a/src/include/gpxe/dhcp.h +++ b/src/include/gpxe/dhcp.h @@ -16,6 +16,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include #include #include +#include struct job_interface; struct dhcp_options; @@ -332,6 +333,16 @@ struct dhcp_netdev_desc { uint16_t device; } __attribute__ (( packed )); +/** Use cached network settings + * + * Cached network settings may be available from a prior DHCP request + * (if running as a PXE NBP), non-volatile storage on the NIC, or + * settings set via the command line or an embedded image. If this + * flag is not set, it will be assumed that those sources are + * insufficient and that DHCP should still be run when autobooting. + */ +#define DHCP_EB_USE_CACHED DHCP_ENCAP_OPT ( DHCP_EB_ENCAP, 0xb2 ) + /** BIOS drive number * * This is the drive number for a drive emulated via INT 13. 0x80 is @@ -615,4 +626,12 @@ extern int start_dhcp ( struct job_interface *job, struct net_device *netdev ); extern int start_pxebs ( struct job_interface *job, struct net_device *netdev, unsigned int pxe_type ); +/* In environments that can provide cached DHCP packets, this function + * should look for such a packet and call store_cached_dhcpack() with + * it if it exists. + */ +__weak_decl ( void, get_cached_dhcpack, ( void ), (), ); + +extern void store_cached_dhcpack ( userptr_t data, size_t len ); + #endif /* _GPXE_DHCP_H */ -- cgit v1.2.3-55-g7522