aboutsummaryrefslogtreecommitdiffstats
path: root/src/net/udp
diff options
context:
space:
mode:
authorJoshua Oreman <oremanj@rwcr.net>2009-12-08 03:40:50 -0500
committerMarty Connor <mdc@etherboot.org>2010-01-20 17:15:51 -0500
commitb1ba80f8fbe2377e992848c3c6e6eb55fbe6d909 (patch)
tree7f999145480b9dfdfa8ab094230d395374de3303 /src/net/udp
parent337e1ed4b4aea8d73ced8077be1f78ac7b347ba6 (diff)
downloadipxe-b1ba80f8fbe2377e992848c3c6e6eb55fbe6d909.tar.gz
[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/net/udp')
-rw-r--r--src/net/udp/dhcp.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/net/udp/dhcp.c b/src/net/udp/dhcp.c
index aba90002..0edd0ad8 100644
--- a/src/net/udp/dhcp.c
+++ b/src/net/udp/dhcp.c
@@ -110,6 +110,14 @@ struct setting user_class_setting __setting = {
.type = &setting_type_string,
};
+/** Use cached network settings */
+struct setting use_cached_setting __setting = {
+ .name = "use-cached",
+ .description = "Use cached network settings",
+ .tag = DHCP_EB_USE_CACHED,
+ .type = &setting_type_uint8,
+};
+
/**
* Name a DHCP packet type
*
@@ -1237,16 +1245,28 @@ static struct sockaddr dhcp_peer = {
*
* @v job Job control interface
* @v netdev Network device
- * @ret rc Return status code
+ * @ret rc Return status code, or positive if cached
*
* Starts DHCP on the specified network device. If successful, the
* DHCPACK (and ProxyDHCPACK, if applicable) will be registered as
* option sources.
+ *
+ * On a return of 0, a background job has been started to perform the
+ * DHCP request. Any nonzero return means the job has not been
+ * started; a positive return value indicates the success condition of
+ * having fetched the appropriate data from cached information.
*/
int start_dhcp ( struct job_interface *job, struct net_device *netdev ) {
struct dhcp_session *dhcp;
int rc;
+ /* Check for cached DHCP information */
+ get_cached_dhcpack();
+ if ( fetch_uintz_setting ( NULL, &use_cached_setting ) ) {
+ DBG ( "DHCP using cached network settings\n" );
+ return 1;
+ }
+
/* Allocate and initialise structure */
dhcp = zalloc ( sizeof ( *dhcp ) );
if ( ! dhcp )