Skip to content

Commit

Permalink
[pxe] Skip PXE boot server discovery if directed to do so
Browse files Browse the repository at this point in the history
Option 43.6 can direct us to skip PXE boot server discovery and just
perform a standard DHCP filename boot.
  • Loading branch information
Michael Brown committed Feb 5, 2009
1 parent 4b276b8 commit ff2b308
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 6 deletions.
15 changes: 15 additions & 0 deletions src/include/gpxe/dhcp.h
Expand Up @@ -82,6 +82,21 @@ struct dhcp_packet;
/** Vendor encapsulated options */
#define DHCP_VENDOR_ENCAP 43

/** PXE boot server discovery control */
#define DHCP_PXE_DISCOVERY_CONTROL DHCP_ENCAP_OPT ( DHCP_VENDOR_ENCAP, 6 )

/** PXE boot server discovery control bits */
enum dhcp_pxe_discovery_control {
/** Inhibit broadcast discovery */
PXEBS_NO_BROADCAST = 1,
/** Inhibit multicast discovery */
PXEBS_NO_MULTICAST = 2,
/** Accept only servers in DHCP_PXE_BOOT_SERVERS list */
PXEBS_NO_UNKNOWN_SERVERS = 4,
/** Skip discovery if filename present */
PXEBS_SKIP = 8,
};

/** PXE boot server multicast address */
#define DHCP_PXE_BOOT_SERVER_MCAST DHCP_ENCAP_OPT ( DHCP_VENDOR_ENCAP, 7 )

Expand Down
21 changes: 15 additions & 6 deletions src/usr/autoboot.c
Expand Up @@ -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 */
Expand All @@ -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 );
}
Expand Down

0 comments on commit ff2b308

Please sign in to comment.