diff options
author | Michael Brown <mcb30@etherboot.org> | 2007-11-21 04:48:18 +0000 |
---|---|---|
committer | Michael Brown <mcb30@etherboot.org> | 2007-11-21 04:48:18 +0000 |
commit | fb809da2dfe9d715a02de7033ede46854d176c2e (patch) | |
tree | 78b7f6462aa74a4ebc9f243c69bf2c41676d0714 /src/usr | |
parent | 8d18338ae705993355214873625b2fd22a55e075 (diff) | |
download | ipxe-fb809da2dfe9d715a02de7033ede46854d176c2e.zip ipxe-fb809da2dfe9d715a02de7033ede46854d176c2e.tar.gz ipxe-fb809da2dfe9d715a02de7033ede46854d176c2e.tar.bz2 |
Remove some assumptions about DHCP obtaining only a single options block.
Diffstat (limited to 'src/usr')
-rw-r--r-- | src/usr/dhcpmgmt.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/src/usr/dhcpmgmt.c b/src/usr/dhcpmgmt.c index bd05c5e..0c6b458 100644 --- a/src/usr/dhcpmgmt.c +++ b/src/usr/dhcpmgmt.c @@ -32,27 +32,30 @@ * */ -static struct dhcp_option_block *dhcp_options = NULL; - static int dhcp_success ( struct net_device *netdev, struct dhcp_option_block *options ) { - dhcp_options = dhcpopt_get ( options ); + DBGC ( options, "DHCP client registering options %p\n", options ); register_dhcp_options ( options ); return dhcp_configure_netdev ( netdev, options ); } int dhcp ( struct net_device *netdev ) { + struct dhcp_option_block *options; + struct dhcp_option_block *tmp; int rc; /* Check we can open the interface first */ if ( ( rc = ifopen ( netdev ) ) != 0 ) return rc; - /* Unregister any previously acquired options */ - if ( dhcp_options ) { - unregister_dhcp_options ( dhcp_options ); - dhcpopt_put ( dhcp_options ); - dhcp_options = NULL; + /* Unregister any option blocks acquired via DHCP */ + list_for_each_entry_safe ( options, tmp, &dhcp_option_blocks, list ) { + /* Skip static option blocks (e.g. from NVS) */ + if ( find_dhcp_option ( options, DHCP_MESSAGE_TYPE ) ) { + DBGC ( options, "DHCP client unregistering options " + "%p\n", options ); + unregister_dhcp_options ( options ); + } } /* Perform DHCP */ |