mirror of
https://github.com/ipxe/ipxe
synced 2025-12-21 04:20:17 +03:00
[pxe] Always retrieve cached DHCPACK and apply to relevant network device
When chainloading, always retrieve the cached DHCPACK packet from the underlying PXE stack, and apply it as the original contents of the "net<X>.dhcp" settings block. This allows cached DHCP settings to be used for any chainloaded iPXE binary (not just undionly.kkpxe). This change eliminates the undocumented "use-cached" setting. Issuing the "dhcp" command will now always result in a fresh DHCP request. Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -1,78 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2009 Joshua Oreman <oremanj@rwcr.net>.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301, USA.
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER );
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ipxe/dhcp.h>
|
||||
#include <ipxe/dhcppkt.h>
|
||||
#include <ipxe/netdevice.h>
|
||||
#include <ipxe/iobuf.h>
|
||||
#include <ipxe/uaccess.h>
|
||||
|
||||
/** @file
|
||||
*
|
||||
* Cached DHCP packet handling
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Store cached DHCPACK packet
|
||||
*
|
||||
* @v data User pointer to cached DHCP packet data
|
||||
* @v len Length of cached DHCP packet data
|
||||
* @ret rc Return status code
|
||||
*
|
||||
* This function should be called by the architecture-specific
|
||||
* get_cached_dhcpack() handler.
|
||||
*/
|
||||
void store_cached_dhcpack ( userptr_t data, size_t len ) {
|
||||
struct dhcp_packet *dhcppkt;
|
||||
struct dhcphdr *dhcphdr;
|
||||
struct settings *parent;
|
||||
int rc;
|
||||
|
||||
/* Create DHCP packet */
|
||||
dhcppkt = zalloc ( sizeof ( *dhcppkt ) + len );
|
||||
if ( ! dhcppkt )
|
||||
return;
|
||||
|
||||
/* Fill in data for DHCP packet */
|
||||
dhcphdr = ( ( ( void * ) dhcppkt ) + sizeof ( * dhcppkt ) );
|
||||
copy_from_user ( dhcphdr, data, 0, len );
|
||||
dhcppkt_init ( dhcppkt, dhcphdr, len );
|
||||
DBG_HD ( dhcppkt->options.data, dhcppkt->options.used_len );
|
||||
|
||||
/* Register settings on the last opened network device.
|
||||
* This will have the effect of registering cached settings
|
||||
* with a network device when "dhcp netX" is performed for that
|
||||
* device, which is usually what we want.
|
||||
*/
|
||||
parent = netdev_settings ( last_opened_netdev() );
|
||||
if ( ( rc = register_settings ( &dhcppkt->settings, parent,
|
||||
DHCP_SETTINGS_NAME ) ) != 0 )
|
||||
DBG ( "DHCP could not register cached settings: %s\n",
|
||||
strerror ( rc ) );
|
||||
|
||||
dhcppkt_put ( dhcppkt );
|
||||
|
||||
DBG ( "DHCP registered cached settings\n" );
|
||||
}
|
||||
@@ -107,14 +107,6 @@ struct setting user_class_setting __setting ( SETTING_HOST_EXTRA ) = {
|
||||
.type = &setting_type_string,
|
||||
};
|
||||
|
||||
/** Use cached network settings */
|
||||
struct setting use_cached_setting __setting ( SETTING_MISC ) = {
|
||||
.name = "use-cached",
|
||||
.description = "Use cached settings",
|
||||
.tag = DHCP_EB_USE_CACHED,
|
||||
.type = &setting_type_uint8,
|
||||
};
|
||||
|
||||
/**
|
||||
* Most recent DHCP transaction ID
|
||||
*
|
||||
@@ -1284,38 +1276,21 @@ static struct sockaddr dhcp_peer = {
|
||||
.sa_family = AF_INET,
|
||||
};
|
||||
|
||||
/**
|
||||
* Get cached DHCPACK where none exists
|
||||
*/
|
||||
__weak void get_cached_dhcpack ( void ) { __keepme }
|
||||
|
||||
/**
|
||||
* Start DHCP state machine on a network device
|
||||
*
|
||||
* @v job Job control interface
|
||||
* @v netdev Network device
|
||||
* @ret rc Return status code, or positive if cached
|
||||
* @ret rc Return status code
|
||||
*
|
||||
* 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 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 )
|
||||
|
||||
Reference in New Issue
Block a user