summaryrefslogtreecommitdiffstats
path: root/src/net/udp/dhcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/udp/dhcp.c')
-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 )