summaryrefslogtreecommitdiffstats
path: root/src/include
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/include
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/include')
-rw-r--r--src/include/gpxe/dhcp.h19
1 files changed, 19 insertions, 0 deletions
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 <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 */