[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>
This commit is contained in:
Joshua Oreman
2009-12-08 03:40:50 -05:00
committed by Marty Connor
parent 337e1ed4b4
commit b1ba80f8fb
4 changed files with 122 additions and 2 deletions

View File

@@ -16,6 +16,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <gpxe/tables.h>
#include <gpxe/uuid.h>
#include <gpxe/netdevice.h>
#include <gpxe/uaccess.h>
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 */