From ff2b308506ed67f6cc007356f6a10358c6ee48f1 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Tue, 3 Feb 2009 02:46:06 +0000 Subject: [pxe] Skip PXE boot server discovery if directed to do so Option 43.6 can direct us to skip PXE boot server discovery and just perform a standard DHCP filename boot. --- src/usr/autoboot.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'src/usr') diff --git a/src/usr/autoboot.c b/src/usr/autoboot.c index 41f134179..cad625e4c 100644 --- a/src/usr/autoboot.c +++ b/src/usr/autoboot.c @@ -167,9 +167,15 @@ int boot_root_path ( const char *root_path ) { * @ret rc Return status code */ static int netboot ( struct net_device *netdev ) { - struct setting tmp_setting = { .name = NULL }; + struct setting vendor_class_id_setting + = { .tag = DHCP_VENDOR_CLASS_ID }; + struct setting pxe_discovery_control_setting + = { .tag = DHCP_PXE_DISCOVERY_CONTROL }; + struct setting pxe_boot_menu_setting + = { .tag = DHCP_PXE_BOOT_MENU }; char buf[256]; struct in_addr next_server; + unsigned int pxe_discovery_control; int rc; /* Open device and display device status */ @@ -195,12 +201,15 @@ static int netboot ( struct net_device *netdev ) { if ( rc != ENOENT ) return rc; - /* Try PXE menu boot, if we have PXE menu options */ - tmp_setting.tag = DHCP_VENDOR_CLASS_ID; - fetch_string_setting ( NULL, &tmp_setting, buf, sizeof ( buf ) ); - tmp_setting.tag = DHCP_PXE_BOOT_MENU; + /* Try PXE menu boot, if applicable */ + fetch_string_setting ( NULL, &vendor_class_id_setting, + buf, sizeof ( buf ) ); + pxe_discovery_control = + fetch_uintz_setting ( NULL, &pxe_discovery_control_setting ); if ( ( strcmp ( buf, "PXEClient" ) == 0 ) && - setting_exists ( NULL, &tmp_setting ) ) { + setting_exists ( NULL, &pxe_boot_menu_setting ) && + ( ! ( ( pxe_discovery_control & PXEBS_SKIP ) && + setting_exists ( NULL, &filename_setting ) ) ) ) { printf ( "Booting from PXE menu\n" ); return pxe_menu_boot ( netdev ); } -- cgit v1.2.3-55-g7522