[gPXE-devel] [PATCH, REPOST] Fix autoboot for multiple NIC's on different networks

Gianni Tedesco gianni.tedesco at citrix.com
Fri Sep 17 12:53:00 EDT 2010


When retrieving next-server/filename options during autboot from 2nd and
subsequent NIC's after a boot failure, settings obtained from previous
NIC's may be used - with erroneous results. Fix this by unregistering
all DHCP obtained parameters before trying the next interface.

Signed-off-by: Gianni Tedesco <gianni.tedesco at citrix.com>

diff -r 608f4232e0ca tools/firmware/etherboot/gpxe-1.0.0/src/core/settings.c
--- a/tools/firmware/etherboot/gpxe-1.0.0/src/core/settings.c	Thu Jul 08 12:25:37 2010 +0100
+++ b/tools/firmware/etherboot/gpxe-1.0.0/src/core/settings.c	Thu Jul 08 12:27:27 2010 +0100
@@ -237,7 +237,7 @@
  * @v name		Name within this parent
  * @ret settings	Settings block, or NULL
  */
-static struct settings * find_child_settings ( struct settings *parent,
+struct settings * find_child_settings ( struct settings *parent,
 					       const char *name ) {
 	struct settings *settings;
 
diff -r 608f4232e0ca tools/firmware/etherboot/gpxe-1.0.0/src/include/gpxe/settings.h
--- a/tools/firmware/etherboot/gpxe-1.0.0/src/include/gpxe/settings.h	Thu Jul 08 12:25:37 2010 +0100
+++ b/tools/firmware/etherboot/gpxe-1.0.0/src/include/gpxe/settings.h	Thu Jul 08 12:27:27 2010 +0100
@@ -209,6 +209,8 @@
 extern void clear_settings ( struct settings *settings );
 extern int setting_cmp ( struct setting *a, struct setting *b );
 
+extern struct settings * find_child_settings ( struct settings *parent,
+						const char *name );
 extern struct settings * find_settings ( const char *name );
 
 extern int storef_setting ( struct settings *settings,
diff -r 608f4232e0ca tools/firmware/etherboot/gpxe-1.0.0/src/usr/autoboot.c
--- a/tools/firmware/etherboot/gpxe-1.0.0/src/usr/autoboot.c	Thu Jul 08 12:25:37 2010 +0100
+++ b/tools/firmware/etherboot/gpxe-1.0.0/src/usr/autoboot.c	Thu Jul 08 12:27:27 2010 +0100
@@ -183,6 +183,7 @@
 	fetch_ipv4_setting ( NULL, &next_server_setting, &next_server );
 	fetch_string_setting ( NULL, &filename_setting, buf, sizeof ( buf ) );
 	if ( buf[0] ) {
+		struct settings *dhcpset;
 		printf ( "Booting from filename \"%s\"\n", buf );
 
 		/* Clear the flag that says we're running PVS if  
@@ -191,15 +192,23 @@
 		if (strcasecmp("ardbp32.bin", buf) != 0)
 			running_pvs_nbp = 0;
 
-		if ( ( rc = boot_next_server_and_filename ( next_server,
-							    buf ) ) != 0 ) {
+		rc = boot_next_server_and_filename ( next_server, buf );
+		if ( ( dhcpset = find_child_settings (
+				netdev_settings(netdev),
+				DHCP_SETTINGS_NAME) ))
+			unregister_settings ( dhcpset );
+		if ( ( dhcpset = find_child_settings (
+				netdev_settings(netdev),
+				PROXYDHCP_SETTINGS_NAME) ))
+			unregister_settings ( dhcpset );
+		if ( rc ) {
 			printf ( "Could not boot from filename \"%s\": %s\n",
 				 buf, strerror ( rc ) );
 			return rc;
 		}
 		return 0;
 	}
-	
+
 	/* No filename; try the root path */
 	fetch_string_setting ( NULL, &root_path_setting, buf, sizeof ( buf ) );
 	if ( buf[0] ) {




More information about the gPXE-devel mailing list