[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.
This commit is contained in:
parent
4b276b8df9
commit
ff2b308506
|
@ -82,6 +82,21 @@ struct dhcp_packet;
|
||||||
/** Vendor encapsulated options */
|
/** Vendor encapsulated options */
|
||||||
#define DHCP_VENDOR_ENCAP 43
|
#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 */
|
/** PXE boot server multicast address */
|
||||||
#define DHCP_PXE_BOOT_SERVER_MCAST DHCP_ENCAP_OPT ( DHCP_VENDOR_ENCAP, 7 )
|
#define DHCP_PXE_BOOT_SERVER_MCAST DHCP_ENCAP_OPT ( DHCP_VENDOR_ENCAP, 7 )
|
||||||
|
|
||||||
|
|
|
@ -167,9 +167,15 @@ int boot_root_path ( const char *root_path ) {
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
*/
|
*/
|
||||||
static int netboot ( struct net_device *netdev ) {
|
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];
|
char buf[256];
|
||||||
struct in_addr next_server;
|
struct in_addr next_server;
|
||||||
|
unsigned int pxe_discovery_control;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
/* Open device and display device status */
|
/* Open device and display device status */
|
||||||
|
@ -195,12 +201,15 @@ static int netboot ( struct net_device *netdev ) {
|
||||||
if ( rc != ENOENT )
|
if ( rc != ENOENT )
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
/* Try PXE menu boot, if we have PXE menu options */
|
/* Try PXE menu boot, if applicable */
|
||||||
tmp_setting.tag = DHCP_VENDOR_CLASS_ID;
|
fetch_string_setting ( NULL, &vendor_class_id_setting,
|
||||||
fetch_string_setting ( NULL, &tmp_setting, buf, sizeof ( buf ) );
|
buf, sizeof ( buf ) );
|
||||||
tmp_setting.tag = DHCP_PXE_BOOT_MENU;
|
pxe_discovery_control =
|
||||||
|
fetch_uintz_setting ( NULL, &pxe_discovery_control_setting );
|
||||||
if ( ( strcmp ( buf, "PXEClient" ) == 0 ) &&
|
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" );
|
printf ( "Booting from PXE menu\n" );
|
||||||
return pxe_menu_boot ( netdev );
|
return pxe_menu_boot ( netdev );
|
||||||
}
|
}
|
||||||
|
|
Reference in New Issue