iPXE
Macros | Enumerations | Functions
autoboot.h File Reference

Automatic booting. More...

#include <ipxe/device.h>

Go to the source code of this file.

Macros

#define URIBOOT_NO_SAN
 

Enumerations

enum  uriboot_flags { URIBOOT_NO_SAN_DESCRIBE = 0x0001, URIBOOT_NO_SAN_BOOT = 0x0002, URIBOOT_NO_SAN_UNHOOK = 0x0004 }
 uriboot() flags More...
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
void set_autoboot_busloc (unsigned int bus_type, unsigned int location)
 Identify autoboot device by bus type and location. More...
 
void set_autoboot_ll_addr (const void *ll_addr, size_t len, unsigned int vlan)
 Identify autoboot device by link-layer address. More...
 
int uriboot (struct uri *filename, struct uri **root_paths, unsigned int root_path_count, int drive, struct san_boot_config *san_config, unsigned int flags)
 Boot from filename and root-path URIs. More...
 
struct urifetch_next_server_and_filename (struct settings *settings)
 Fetch next-server and filename settings into a URI. More...
 
int netboot (struct net_device *netdev)
 Boot from a network device. More...
 
int ipxe (struct net_device *netdev)
 Main iPXE flow of execution. More...
 
int pxe_menu_boot (struct net_device *netdev)
 Boot using PXE boot menu. More...
 

Detailed Description

Automatic booting.

Definition in file autoboot.h.

Macro Definition Documentation

◆ URIBOOT_NO_SAN

#define URIBOOT_NO_SAN
Value:
URIBOOT_NO_SAN_BOOT | \
URIBOOT_NO_SAN_UNHOOK )

Definition at line 26 of file autoboot.h.

Enumeration Type Documentation

◆ uriboot_flags

uriboot() flags

Enumerator
URIBOOT_NO_SAN_DESCRIBE 
URIBOOT_NO_SAN_BOOT 
URIBOOT_NO_SAN_UNHOOK 

Definition at line 20 of file autoboot.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ set_autoboot_busloc()

void set_autoboot_busloc ( unsigned int  bus_type,
unsigned int  location 
)

Identify autoboot device by bus type and location.

Parameters
bus_typeBus type
locationLocation

Definition at line 490 of file autoboot.c.

490  {
491 
492  /* Record autoboot device description */
493  autoboot_desc.bus_type = bus_type;
494  autoboot_desc.location = location;
495 
496  /* Mark autoboot device as present */
498 }
static int(* is_autoboot_device)(struct net_device *netdev)
Autoboot device tester.
Definition: autoboot.c:68
unsigned int location
Location.
Definition: device.h:29
unsigned int bus_type
Bus type.
Definition: device.h:24
static struct device_description autoboot_desc
Device location of preferred autoboot device, if known.
Definition: autoboot.c:65
static int is_autoboot_busloc(struct net_device *netdev)
Test if network device matches the autoboot device bus type and location.
Definition: autoboot.c:473

References autoboot_desc, device_description::bus_type, is_autoboot_busloc(), is_autoboot_device, and device_description::location.

Referenced by pci_autoboot_init().

◆ set_autoboot_ll_addr()

void set_autoboot_ll_addr ( const void *  ll_addr,
size_t  len,
unsigned int  vlan 
)

Identify autoboot device by link-layer address.

Parameters
ll_addrLink-layer address
lenLength of link-layer address
vlanVLAN tag

Definition at line 520 of file autoboot.c.

521  {
522 
523  /* Record autoboot link-layer address (truncated if necessary) */
524  if ( len > sizeof ( autoboot_ll_addr ) )
525  len = sizeof ( autoboot_ll_addr );
526  memcpy ( autoboot_ll_addr, ll_addr, len );
527 
528  /* Record autoboot VLAN tag */
529  autoboot_vlan = vlan;
530 
531  /* Mark autoboot device as present */
533 }
static unsigned int autoboot_vlan
VLAN tag of preferred autoboot device, if known.
Definition: autoboot.c:62
static uint8_t autoboot_ll_addr[MAX_LL_ADDR_LEN]
Link-layer address of preferred autoboot device, if known.
Definition: autoboot.c:59
static int is_autoboot_ll_addr(struct net_device *netdev)
Test if network device matches the autoboot device link-layer address.
Definition: autoboot.c:506
static int(* is_autoboot_device)(struct net_device *netdev)
Autoboot device tester.
Definition: autoboot.c:68
void * memcpy(void *dest, const void *src, size_t len) __nonnull
uint32_t len
Length.
Definition: ena.h:14

References autoboot_ll_addr, autoboot_vlan, is_autoboot_device, is_autoboot_ll_addr(), len, and memcpy().

Referenced by efi_set_autoboot_ll_addr().

◆ uriboot()

int uriboot ( struct uri filename,
struct uri **  root_paths,
unsigned int  root_path_count,
int  drive,
struct san_boot_config san_config,
unsigned int  flags 
)

Boot from filename and root-path URIs.

Parameters
filenameFilename
root_pathsRoot path(s)
root_path_countNumber of root paths
driveSAN drive (if applicable)
san_configSAN boot configuration parameters
flagsBoot action flags
Return values
rcReturn status code

The somewhat tortuous flow of control in this function exists in order to ensure that the "sanboot" command remains identical in function to a SAN boot via a DHCP-specified root path, and to provide backwards compatibility for the "keep-san" and "skip-san-boot" options.

Definition at line 129 of file autoboot.c.

131  {
132  struct image *image;
133  const char *san_filename;
134  int rc;
135 
136  /* Hook SAN device, if applicable */
137  if ( root_path_count ) {
138  drive = san_hook ( drive, root_paths, root_path_count,
140  SAN_NO_DESCRIBE : 0 ) );
141  if ( drive < 0 ) {
142  rc = drive;
143  printf ( "Could not open SAN device: %s\n",
144  strerror ( rc ) );
145  goto err_san_hook;
146  }
147  printf ( "Registered SAN device %#02x\n", drive );
148  }
149 
150  /* Describe SAN device, if applicable */
151  if ( ! ( flags & URIBOOT_NO_SAN_DESCRIBE ) ) {
152  if ( ( rc = san_describe() ) != 0 ) {
153  printf ( "Could not describe SAN devices: %s\n",
154  strerror ( rc ) );
155  goto err_san_describe;
156  }
157  }
158 
159  /* Allow a root-path-only boot with skip-san enabled to succeed */
160  rc = 0;
161 
162  /* Attempt filename boot if applicable */
163  if ( filename ) {
164  if ( ( rc = imgdownload ( filename, 0, &image ) ) != 0 )
165  goto err_download;
166  imgstat ( image );
168  if ( ( rc = image_exec ( image ) ) != 0 ) {
169  printf ( "Could not boot image: %s\n",
170  strerror ( rc ) );
171  /* Fall through to (possibly) attempt a SAN boot
172  * as a fallback. If no SAN boot is attempted,
173  * our status will become the return status.
174  */
175  } else {
176  /* Always print an extra newline, because we
177  * don't know where the NBP may have left the
178  * cursor.
179  */
180  printf ( "\n" );
181  }
182  }
183 
184  /* Attempt SAN boot if applicable */
185  if ( ! ( flags & URIBOOT_NO_SAN_BOOT ) ) {
186  san_filename = san_config->filename;
187  if ( fetch_intz_setting ( NULL, &skip_san_boot_setting) == 0 ) {
188  printf ( "Booting%s%s from SAN device %#02x\n",
189  ( san_filename ? " " : "" ),
190  ( san_filename ? san_filename : "" ), drive );
191  rc = san_boot ( drive, san_config );
192  printf ( "Boot from SAN device %#02x failed: %s\n",
193  drive, strerror ( rc ) );
194  } else {
195  printf ( "Skipping boot from SAN device %#02x\n",
196  drive );
197  /* Avoid overwriting a possible failure status
198  * from a filename boot.
199  */
200  }
201  }
202 
203  err_download:
204  err_san_describe:
205  /* Unhook SAN device, if applicable */
206  if ( ! ( flags & URIBOOT_NO_SAN_UNHOOK ) ) {
207  if ( fetch_intz_setting ( NULL, &keep_san_setting ) == 0 ) {
208  san_unhook ( drive );
209  printf ( "Unregistered SAN device %#02x\n", drive );
210  } else {
211  printf ( "Preserving SAN device %#02x\n", drive );
212  }
213  }
214  err_san_hook:
215  return rc;
216 }
long fetch_intz_setting(struct settings *settings, const struct setting *setting)
Fetch value of signed integer setting, or zero.
Definition: settings.c:1053
unsigned int flags
Flags.
Definition: image.h:36
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
int printf(const char *fmt,...)
Write a formatted string to the console.
Definition: vsprintf.c:464
int san_describe(void)
Describe SAN devices for SAN-booted operating system.
int san_hook(unsigned int drive, struct uri **uris, unsigned int count, unsigned int flags)
Hook SAN device.
int san_boot(unsigned int drive, struct san_boot_config *config)
Attempt to boot from a SAN device.
An executable image.
Definition: image.h:24
uint8_t drive
Drive number.
Definition: int13.h:16
#define IMAGE_AUTO_UNREGISTER
Image will be automatically unregistered after execution.
Definition: image.h:70
int image_exec(struct image *image)
Execute image.
Definition: image.c:359
void imgstat(struct image *image)
Display status of an image.
Definition: imgmgmt.c:158
const char * filename
Boot filename (or NULL to use default)
Definition: sanboot.h:112
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
Device should not be included in description tables.
Definition: sanboot.h:106
void san_unhook(unsigned int drive)
Unhook SAN device.
int imgdownload(struct uri *uri, unsigned long timeout, struct image **image)
Download a new image.
Definition: imgmgmt.c:51
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
uint8_t flags
Flags.
Definition: ena.h:18

References drive, fetch_intz_setting(), san_boot_config::filename, flags, image::flags, IMAGE_AUTO_UNREGISTER, image_exec(), imgdownload(), imgstat(), NULL, printf(), rc, san_boot(), san_describe(), san_hook(), SAN_NO_DESCRIBE, san_unhook(), strerror(), URIBOOT_NO_SAN_BOOT, URIBOOT_NO_SAN_DESCRIBE, and URIBOOT_NO_SAN_UNHOOK.

Referenced by netboot(), pxe_menu_boot(), and sanboot_core_exec().

◆ fetch_next_server_and_filename()

struct uri* fetch_next_server_and_filename ( struct settings settings)

Fetch next-server and filename settings into a URI.

Parameters
settingsSettings block
Return values
uriURI, or NULL on failure

Definition at line 241 of file autoboot.c.

241  {
242  union {
243  struct sockaddr sa;
244  struct sockaddr_in sin;
245  } next_server;
246  char *raw_filename = NULL;
247  struct uri *uri = NULL;
248  char *filename;
249 
250  /* Initialise server address */
251  memset ( &next_server, 0, sizeof ( next_server ) );
252 
253  /* If we have a filename, fetch it along with the next-server
254  * setting from the same settings block.
255  */
256  if ( fetch_setting ( settings, &filename_setting, &settings,
257  NULL, NULL, 0 ) >= 0 ) {
258  fetch_string_setting_copy ( settings, &filename_setting,
259  &raw_filename );
260  fetch_ipv4_setting ( settings, &next_server_setting,
261  &next_server.sin.sin_addr );
262  }
263  if ( ! raw_filename )
264  goto err_fetch;
265 
266  /* Populate server address */
267  if ( next_server.sin.sin_addr.s_addr ) {
268  next_server.sin.sin_family = AF_INET;
269  printf ( "Next server: %s\n",
270  inet_ntoa ( next_server.sin.sin_addr ) );
271  }
272 
273  /* Expand filename setting */
274  filename = expand_settings ( raw_filename );
275  if ( ! filename )
276  goto err_expand;
277  if ( filename[0] )
278  printf ( "Filename: %s\n", filename );
279 
280  /* Construct URI */
281  uri = pxe_uri ( &next_server.sa, filename );
282  if ( ! uri )
283  goto err_parse;
284 
285  err_parse:
286  free ( filename );
287  err_expand:
288  free ( raw_filename );
289  err_fetch:
290  return uri;
291 }
int printf(const char *fmt,...)
Write a formatted string to the console.
Definition: vsprintf.c:464
int fetch_ipv4_setting(struct settings *settings, const struct setting *setting, struct in_addr *inp)
Fetch value of IPv4 address setting.
Definition: settings.c:912
struct uri * pxe_uri(struct sockaddr *sa_server, const char *filename)
Construct URI from server address and filename.
Definition: uri.c:808
IPv4 socket address.
Definition: in.h:82
char * expand_settings(const char *string)
Expand variables within string.
Definition: settings.c:2330
struct sockaddr sa
Definition: syslog.c:55
int fetch_string_setting_copy(struct settings *settings, const struct setting *setting, char **data)
Fetch value of string setting.
Definition: settings.c:873
Generalized socket address structure.
Definition: socket.h:96
int fetch_setting(struct settings *settings, const struct setting *setting, struct settings **origin, struct setting *fetched, void *data, size_t len)
Fetch setting.
Definition: settings.c:666
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
char * inet_ntoa(struct in_addr in)
Convert IPv4 address to dotted-quad notation.
Definition: ipv4.c:658
A settings block.
Definition: settings.h:132
A Uniform Resource Identifier.
Definition: uri.h:64
struct sockaddr_in sin
Definition: syslog.c:57
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
#define AF_INET
IPv4 Internet addresses.
Definition: socket.h:63
void * memset(void *dest, int character, size_t len) __nonnull

References AF_INET, expand_settings(), fetch_ipv4_setting(), fetch_setting(), fetch_string_setting_copy(), free, inet_ntoa(), memset(), NULL, printf(), pxe_uri(), sa, and sin.

Referenced by netboot(), and pxe_menu_boot().

◆ netboot()

int netboot ( struct net_device netdev)

Boot from a network device.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 391 of file autoboot.c.

391  {
392  struct san_boot_config san_config;
393  struct uri *filename;
394  struct uri *root_path;
395  char *san_filename;
396  int rc;
397 
398  /* Close all other network devices */
400 
401  /* Open device and display device status */
402  if ( ( rc = ifopen ( netdev ) ) != 0 )
403  goto err_ifopen;
404  ifstat ( netdev );
405 
406  /* Configure device */
407  if ( ( rc = ifconf ( netdev, NULL, 0 ) ) != 0 )
408  goto err_dhcp;
409  route();
410 
411  /* Try PXE menu boot, if applicable */
412  if ( have_pxe_menu() ) {
413  printf ( "Booting from PXE menu\n" );
414  rc = pxe_menu_boot ( netdev );
415  goto err_pxe_menu_boot;
416  }
417 
418  /* Fetch next server and filename (if any) */
419  filename = fetch_next_server_and_filename ( NULL );
420 
421  /* Fetch root path (if any) */
422  root_path = fetch_root_path ( NULL );
423 
424  /* Fetch SAN filename (if any) */
425  san_filename = fetch_san_filename ( NULL );
426 
427  /* Construct SAN boot configuration parameters */
428  memset ( &san_config, 0, sizeof ( san_config ) );
429  san_config.filename = san_filename;
430 
431  /* If we have both a filename and a root path, ignore an
432  * unsupported or missing URI scheme in the root path, since
433  * it may represent an NFS root.
434  */
435  if ( filename && root_path &&
436  ( ( ! uri_is_absolute ( root_path ) ) ||
437  ( xfer_uri_opener ( root_path->scheme ) == NULL ) ) ) {
438  printf ( "Ignoring unsupported root path\n" );
439  uri_put ( root_path );
440  root_path = NULL;
441  }
442 
443  /* Check that we have something to boot */
444  if ( ! ( filename || root_path ) ) {
445  rc = -ENOENT_BOOT;
446  printf ( "Nothing to boot: %s\n", strerror ( rc ) );
447  goto err_no_boot;
448  }
449 
450  /* Boot using next server, filename and root path */
451  if ( ( rc = uriboot ( filename, &root_path, ( root_path ? 1 : 0 ),
452  san_default_drive(), &san_config,
453  ( root_path ? 0 : URIBOOT_NO_SAN ) ) ) != 0 )
454  goto err_uriboot;
455 
456  err_uriboot:
457  err_no_boot:
458  free ( san_filename );
459  uri_put ( root_path );
460  uri_put ( filename );
461  err_pxe_menu_boot:
462  err_dhcp:
463  err_ifopen:
464  return rc;
465 }
int uriboot(struct uri *filename, struct uri **root_paths, unsigned int root_path_count, int drive, struct san_boot_config *san_config, unsigned int flags)
Boot from filename and root-path URIs.
Definition: autoboot.c:129
#define URIBOOT_NO_SAN
Definition: autoboot.h:26
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
int ifconf(struct net_device *netdev, struct net_device_configurator *configurator, unsigned long timeout)
Perform network device configuration.
Definition: ifmgmt.c:274
int printf(const char *fmt,...)
Write a formatted string to the console.
Definition: vsprintf.c:464
static void uri_put(struct uri *uri)
Decrement URI reference count.
Definition: uri.h:205
static void close_other_netdevs(struct net_device *netdev)
Close all but one network device.
Definition: autoboot.c:226
static int uri_is_absolute(const struct uri *uri)
URI is an absolute URI.
Definition: uri.h:135
unsigned int san_default_drive(void)
Get default SAN drive number.
Definition: sanboot.c:970
const char * scheme
Scheme.
Definition: uri.h:68
struct uri * fetch_next_server_and_filename(struct settings *settings)
Fetch next-server and filename settings into a URI.
Definition: autoboot.c:241
SAN boot configuration parameters.
Definition: sanboot.h:110
static struct net_device * netdev
Definition: gdbudp.c:52
void route(void)
Print routing table.
Definition: route.c:39
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
static struct uri * fetch_root_path(struct settings *settings)
Fetch root-path setting into a URI.
Definition: autoboot.c:299
static char * fetch_san_filename(struct settings *settings)
Fetch san-filename setting.
Definition: autoboot.c:336
__weak int pxe_menu_boot(struct net_device *netdev __unused)
Perform PXE menu boot when PXE stack is not available.
Definition: autoboot.c:90
int ifopen(struct net_device *netdev)
Open network device.
Definition: ifmgmt.c:65
static int have_pxe_menu(void)
Check whether or not we have a usable PXE menu.
Definition: autoboot.c:364
A Uniform Resource Identifier.
Definition: uri.h:64
struct uri_opener * xfer_uri_opener(const char *scheme)
Find opener for URI scheme.
Definition: open.c:47
void ifstat(struct net_device *netdev)
Print status of network device.
Definition: ifmgmt.c:110
#define ENOENT_BOOT
Definition: autoboot.c:71
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
void * memset(void *dest, int character, size_t len) __nonnull

References close_other_netdevs(), ENOENT_BOOT, fetch_next_server_and_filename(), fetch_root_path(), fetch_san_filename(), san_boot_config::filename, free, have_pxe_menu(), ifconf(), ifopen(), ifstat(), memset(), netdev, NULL, printf(), pxe_menu_boot(), rc, route(), san_default_drive(), uri::scheme, strerror(), uri_is_absolute(), uri_put(), uriboot(), URIBOOT_NO_SAN, and xfer_uri_opener().

Referenced by autoboot(), autoboot_payload(), and ipxe().

◆ ipxe()

int ipxe ( struct net_device netdev)

Main iPXE flow of execution.

Parameters
netdevNetwork device, or NULL
Return values
rcReturn status code

Definition at line 585 of file autoboot.c.

585  {
586  struct feature *feature;
587  struct image *image;
588  char *scriptlet;
589  int rc;
590 
591  /*
592  * Print welcome banner
593  *
594  *
595  * If you wish to brand this build of iPXE, please do so by
596  * defining the string PRODUCT_NAME in config/branding.h.
597  *
598  * While nothing in the GPL prevents you from removing all
599  * references to iPXE or https://ipxe.org, we prefer you not
600  * to do so.
601  *
602  */
603  printf ( NORMAL "\n\n" PRODUCT_NAME "\n" BOLD PRODUCT_SHORT_NAME " %s"
604  NORMAL " -- " PRODUCT_TAG_LINE " -- "
605  CYAN PRODUCT_URI NORMAL "\nFeatures:", product_version );
607  printf ( " %s", feature->name );
608  printf ( "\n" );
609 
610  /* Boot system */
611  if ( ( image = first_image() ) != NULL ) {
612  /* We have an embedded image; execute it */
613  return image_exec ( image );
614  } else if ( shell_banner() ) {
615  /* User wants shell; just give them a shell */
616  return shell();
617  } else {
618  fetch_string_setting_copy ( NULL, &scriptlet_setting,
619  &scriptlet );
620  if ( scriptlet ) {
621  /* User has defined a scriptlet; execute it */
622  rc = system ( scriptlet );
623  free ( scriptlet );
624  return rc;
625  } else {
626  /* Try booting. If booting fails, offer the
627  * user another chance to enter the shell.
628  */
629  if ( netdev ) {
630  rc = netboot ( netdev );
631  } else {
632  rc = autoboot();
633  }
634  if ( shell_banner() )
635  rc = shell();
636  return rc;
637  }
638  }
639 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
char * name
Feature name.
Definition: features.h:80
#define PRODUCT_SHORT_NAME
Definition: branding.h:28
int printf(const char *fmt,...)
Write a formatted string to the console.
Definition: vsprintf.c:464
#define FEATURES
Named feature table.
Definition: features.h:84
int netboot(struct net_device *netdev)
Boot from a network device.
Definition: autoboot.c:391
#define NORMAL
Definition: autoboot.c:75
#define PRODUCT_URI
Definition: branding.h:29
int shell(void)
Start command shell.
Definition: shell.c:84
An executable image.
Definition: image.h:24
union ena_feature feature
Feature.
Definition: ena.h:14
#define CYAN
Definition: autoboot.c:77
int image_exec(struct image *image)
Execute image.
Definition: image.c:359
static struct net_device * netdev
Definition: gdbudp.c:52
int fetch_string_setting_copy(struct settings *settings, const struct setting *setting, char **data)
Fetch value of string setting.
Definition: settings.c:873
static struct image * first_image(void)
Retrieve first image.
Definition: image.h:184
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition: tables.h:385
const char product_version[]
Product version string.
Definition: version.c:70
static int autoboot(void)
Boot the system.
Definition: autoboot.c:538
#define PRODUCT_TAG_LINE
Definition: branding.h:38
A named feature.
Definition: features.h:78
static int shell_banner(void)
Prompt for shell entry.
Definition: autoboot.c:565
#define PRODUCT_NAME
Definition: branding.h:27
#define BOLD
Definition: autoboot.c:76
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
uint8_t system[ETH_ALEN]
System identifier.
Definition: eth_slow.h:24

References autoboot(), BOLD, CYAN, feature, FEATURES, fetch_string_setting_copy(), first_image(), for_each_table_entry, free, image_exec(), feature::name, netboot(), netdev, NORMAL, NULL, printf(), PRODUCT_NAME, PRODUCT_SHORT_NAME, PRODUCT_TAG_LINE, PRODUCT_URI, product_version, rc, shell(), shell_banner(), and system.

Referenced by efi_snp_load_file(), and main().

◆ pxe_menu_boot()

int pxe_menu_boot ( struct net_device netdev)

Boot using PXE boot menu.

Return values
rcReturn status code

Note that a success return status indicates that a PXE boot menu item has been selected, and that the DHCP session should perform a boot server request/ack.

Definition at line 344 of file pxemenu.c.

344  {
345  struct pxe_menu *menu;
346  unsigned int pxe_type;
347  struct settings *pxebs_settings;
348  struct uri *uri;
349  int rc;
350 
351  /* Parse and allocate boot menu */
352  if ( ( rc = pxe_menu_parse ( &menu ) ) != 0 )
353  return rc;
354 
355  /* Make selection from boot menu */
356  if ( ( rc = pxe_menu_prompt_and_select ( menu ) ) != 0 ) {
357  free ( menu );
358  return rc;
359  }
360  pxe_type = menu->items[menu->selection].type;
361 
362  /* Free boot menu */
363  free ( menu );
364 
365  /* Return immediately if local boot selected */
366  if ( ! pxe_type )
367  return 0;
368 
369  /* Attempt PXE Boot Server Discovery */
370  if ( ( rc = pxebs ( netdev, pxe_type ) ) != 0 )
371  return rc;
372 
373  /* Fetch next server and filename */
374  pxebs_settings = find_settings ( PXEBS_SETTINGS_NAME );
375  assert ( pxebs_settings );
376  uri = fetch_next_server_and_filename ( pxebs_settings );
377  if ( ! uri )
378  return -ENOMEM;
379 
380  /* Attempt boot */
381  rc = uriboot ( uri, NULL, 0, 0, NULL, URIBOOT_NO_SAN );
382  uri_put ( uri );
383  return rc;
384 }
int uriboot(struct uri *filename, struct uri **root_paths, unsigned int root_path_count, int drive, struct san_boot_config *san_config, unsigned int flags)
Boot from filename and root-path URIs.
Definition: autoboot.c:129
#define URIBOOT_NO_SAN
Definition: autoboot.h:26
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
A PXE boot menu.
Definition: pxemenu.c:63
static void uri_put(struct uri *uri)
Decrement URI reference count.
Definition: uri.h:205
static int pxe_menu_prompt_and_select(struct pxe_menu *menu)
Prompt for (and make selection from) PXE boot menu.
Definition: pxemenu.c:281
struct list_head items
Menu items.
Definition: menu.h:23
#define ENOMEM
Not enough space.
Definition: errno.h:534
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
struct uri * fetch_next_server_and_filename(struct settings *settings)
Fetch next-server and filename settings into a URI.
Definition: autoboot.c:241
static struct net_device * netdev
Definition: gdbudp.c:52
#define PXEBS_SETTINGS_NAME
Setting block name used for BootServerDHCP responses.
Definition: dhcp.h:714
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
A settings block.
Definition: settings.h:132
static int pxe_menu_parse(struct pxe_menu **menu)
Parse and allocate PXE boot menu.
Definition: pxemenu.c:88
struct settings * find_settings(const char *name)
Find settings block.
Definition: settings.c:406
A Uniform Resource Identifier.
Definition: uri.h:64
A menu.
Definition: menu.h:15
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
int pxebs(struct net_device *netdev, unsigned int pxe_type)
Definition: dhcpmgmt.c:41

References assert(), ENOMEM, fetch_next_server_and_filename(), find_settings(), free, menu::items, netdev, NULL, pxe_menu_parse(), pxe_menu_prompt_and_select(), pxebs(), PXEBS_SETTINGS_NAME, rc, uri_put(), uriboot(), and URIBOOT_NO_SAN.