iPXE
Macros | Functions | Variables
autoboot.c File Reference

Automatic booting. More...

#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <ipxe/netdevice.h>
#include <ipxe/dhcp.h>
#include <ipxe/settings.h>
#include <ipxe/image.h>
#include <ipxe/sanboot.h>
#include <ipxe/uri.h>
#include <ipxe/open.h>
#include <ipxe/init.h>
#include <ipxe/keys.h>
#include <ipxe/version.h>
#include <ipxe/shell.h>
#include <ipxe/features.h>
#include <ipxe/timer.h>
#include <usr/ifmgmt.h>
#include <usr/route.h>
#include <usr/imgmgmt.h>
#include <usr/prompt.h>
#include <usr/autoboot.h>
#include <config/general.h>
#include <config/branding.h>

Go to the source code of this file.

Macros

#define ENOENT_BOOT   __einfo_error ( EINFO_ENOENT_BOOT )
 
#define EINFO_ENOENT_BOOT   __einfo_uniqify ( EINFO_ENOENT, 0x01, "Nothing to boot" )
 
#define NORMAL   "\033[0m"
 
#define BOLD   "\033[1m"
 
#define CYAN   "\033[36m"
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
const struct setting scriptlet_setting __setting (SETTING_MISC, scriptlet)
 The "scriptlet" setting. More...
 
__weak int pxe_menu_boot (struct net_device *netdev __unused)
 Perform PXE menu boot when PXE stack is not available. More...
 
const struct setting keep_san_setting __setting (SETTING_SANBOOT_EXTRA, keep-san)
 The "keep-san" setting. More...
 
const struct setting skip_san_boot_setting __setting (SETTING_SANBOOT_EXTRA, skip-san-boot)
 The "skip-san-boot" setting. More...
 
int uriboot (struct uri *filename, struct uri **root_paths, unsigned int root_path_count, int drive, const char *san_filename, unsigned int flags)
 Boot from filename and root-path URIs. More...
 
static void close_all_netdevs (void)
 Close all open net devices. More...
 
struct urifetch_next_server_and_filename (struct settings *settings)
 Fetch next-server and filename settings into a URI. More...
 
static struct urifetch_root_path (struct settings *settings)
 Fetch root-path setting into a URI. More...
 
static char * fetch_san_filename (struct settings *settings)
 Fetch san-filename setting. More...
 
static int have_pxe_menu (void)
 Check whether or not we have a usable PXE menu. More...
 
int netboot (struct net_device *netdev)
 Boot from a network device. More...
 
static int is_autoboot_busloc (struct net_device *netdev)
 Test if network device matches the autoboot device bus type and location. More...
 
void set_autoboot_busloc (unsigned int bus_type, unsigned int location)
 Identify autoboot device by bus type and location. More...
 
static int is_autoboot_ll_addr (struct net_device *netdev)
 Test if network device matches the autoboot device link-layer address. More...
 
void set_autoboot_ll_addr (const void *ll_addr, size_t len)
 Identify autoboot device by link-layer address. More...
 
static int autoboot (void)
 Boot the system. More...
 
static int shell_banner (void)
 Prompt for shell entry. More...
 
int ipxe (struct net_device *netdev)
 Main iPXE flow of execution. More...
 

Variables

static uint8_t autoboot_ll_addr [MAX_LL_ADDR_LEN]
 Link-layer address of preferred autoboot device, if known. More...
 
static struct device_description autoboot_desc
 Device location of preferred autoboot device, if known. More...
 
static int(* is_autoboot_device )(struct net_device *netdev)
 Autoboot device tester. More...
 

Detailed Description

Automatic booting.

Definition in file autoboot.c.

Macro Definition Documentation

◆ ENOENT_BOOT

#define ENOENT_BOOT   __einfo_error ( EINFO_ENOENT_BOOT )

Definition at line 67 of file autoboot.c.

◆ EINFO_ENOENT_BOOT

#define EINFO_ENOENT_BOOT   __einfo_uniqify ( EINFO_ENOENT, 0x01, "Nothing to boot" )

Definition at line 68 of file autoboot.c.

◆ NORMAL

#define NORMAL   "\033[0m"

Definition at line 71 of file autoboot.c.

◆ BOLD

#define BOLD   "\033[1m"

Definition at line 72 of file autoboot.c.

◆ CYAN

#define CYAN   "\033[36m"

Definition at line 73 of file autoboot.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ __setting() [1/3]

const struct setting scriptlet_setting __setting ( SETTING_MISC  ,
scriptlet   
)

The "scriptlet" setting.

◆ pxe_menu_boot()

__weak int pxe_menu_boot ( struct net_device *netdev  __unused)

Perform PXE menu boot when PXE stack is not available.

Definition at line 86 of file autoboot.c.

86  {
87  return -ENOTSUP;
88 }
#define ENOTSUP
Operation not supported.
Definition: errno.h:589

References ENOTSUP.

Referenced by netboot().

◆ __setting() [2/3]

const struct setting keep_san_setting __setting ( SETTING_SANBOOT_EXTRA  ,
keep-  san 
)

The "keep-san" setting.

◆ __setting() [3/3]

const struct setting skip_san_boot_setting __setting ( SETTING_SANBOOT_EXTRA  ,
skip-san-  boot 
)

The "skip-san-boot" setting.

◆ uriboot()

int uriboot ( struct uri filename,
struct uri **  root_paths,
unsigned int  root_path_count,
int  drive,
const char *  san_filename,
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_filenameSAN filename (or NULL to use default)
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 125 of file autoboot.c.

127  {
128  struct image *image;
129  int rc;
130 
131  /* Hook SAN device, if applicable */
132  if ( root_path_count ) {
133  drive = san_hook ( drive, root_paths, root_path_count,
135  SAN_NO_DESCRIBE : 0 ) );
136  if ( drive < 0 ) {
137  rc = drive;
138  printf ( "Could not open SAN device: %s\n",
139  strerror ( rc ) );
140  goto err_san_hook;
141  }
142  printf ( "Registered SAN device %#02x\n", drive );
143  }
144 
145  /* Describe SAN device, if applicable */
146  if ( ! ( flags & URIBOOT_NO_SAN_DESCRIBE ) ) {
147  if ( ( rc = san_describe() ) != 0 ) {
148  printf ( "Could not describe SAN devices: %s\n",
149  strerror ( rc ) );
150  goto err_san_describe;
151  }
152  }
153 
154  /* Allow a root-path-only boot with skip-san enabled to succeed */
155  rc = 0;
156 
157  /* Attempt filename boot if applicable */
158  if ( filename ) {
159  if ( ( rc = imgdownload ( filename, 0, &image ) ) != 0 )
160  goto err_download;
161  imgstat ( image );
163  if ( ( rc = image_exec ( image ) ) != 0 ) {
164  printf ( "Could not boot image: %s\n",
165  strerror ( rc ) );
166  /* Fall through to (possibly) attempt a SAN boot
167  * as a fallback. If no SAN boot is attempted,
168  * our status will become the return status.
169  */
170  } else {
171  /* Always print an extra newline, because we
172  * don't know where the NBP may have left the
173  * cursor.
174  */
175  printf ( "\n" );
176  }
177  }
178 
179  /* Attempt SAN boot if applicable */
180  if ( ! ( flags & URIBOOT_NO_SAN_BOOT ) ) {
181  if ( fetch_intz_setting ( NULL, &skip_san_boot_setting) == 0 ) {
182  printf ( "Booting%s%s from SAN device %#02x\n",
183  ( san_filename ? " " : "" ),
184  ( san_filename ? san_filename : "" ), drive );
185  rc = san_boot ( drive, san_filename );
186  printf ( "Boot from SAN device %#02x failed: %s\n",
187  drive, strerror ( rc ) );
188  } else {
189  printf ( "Skipping boot from SAN device %#02x\n",
190  drive );
191  /* Avoid overwriting a possible failure status
192  * from a filename boot.
193  */
194  }
195  }
196 
197  err_download:
198  err_san_describe:
199  /* Unhook SAN device, if applicable */
200  if ( ! ( flags & URIBOOT_NO_SAN_UNHOOK ) ) {
201  if ( fetch_intz_setting ( NULL, &keep_san_setting ) == 0 ) {
202  san_unhook ( drive );
203  printf ( "Unregistered SAN device %#02x\n", drive );
204  } else {
205  printf ( "Preserving SAN device %#02x\n", drive );
206  }
207  }
208  err_san_hook:
209  return rc;
210 }
long fetch_intz_setting(struct settings *settings, const struct setting *setting)
Fetch value of signed integer setting, or zero.
Definition: settings.c:1057
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, const char *filename)
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:73
int image_exec(struct image *image)
Execute image.
Definition: image.c:291
void imgstat(struct image *image)
Display status of an image.
Definition: imgmgmt.c:158
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:95
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:362
uint8_t flags
Flags.
Definition: ena.h:18

References drive, fetch_intz_setting(), 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().

◆ close_all_netdevs()

static void close_all_netdevs ( void  )
static

Close all open net devices.

Called before a fresh boot attempt in order to free up memory. We don't just close the device immediately after the boot fails, because there may still be TCP connections in the process of closing.

Definition at line 220 of file autoboot.c.

220  {
221  struct net_device *netdev;
222 
223  for_each_netdev ( netdev ) {
224  ifclose ( netdev );
225  }
226 }
void ifclose(struct net_device *netdev)
Close network device.
Definition: ifmgmt.c:82
static struct net_device * netdev
Definition: gdbudp.c:52
#define for_each_netdev(netdev)
Iterate over all network devices.
Definition: netdevice.h:526
A network device.
Definition: netdevice.h:348

References for_each_netdev, ifclose(), and netdev.

Referenced by netboot().

◆ 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 234 of file autoboot.c.

234  {
235  union {
236  struct sockaddr sa;
237  struct sockaddr_in sin;
238  } next_server;
239  char *raw_filename = NULL;
240  struct uri *uri = NULL;
241  char *filename;
242 
243  /* Initialise server address */
244  memset ( &next_server, 0, sizeof ( next_server ) );
245 
246  /* If we have a filename, fetch it along with the next-server
247  * setting from the same settings block.
248  */
249  if ( fetch_setting ( settings, &filename_setting, &settings,
250  NULL, NULL, 0 ) >= 0 ) {
251  fetch_string_setting_copy ( settings, &filename_setting,
252  &raw_filename );
253  fetch_ipv4_setting ( settings, &next_server_setting,
254  &next_server.sin.sin_addr );
255  }
256  if ( ! raw_filename )
257  goto err_fetch;
258 
259  /* Populate server address */
260  if ( next_server.sin.sin_addr.s_addr ) {
261  next_server.sin.sin_family = AF_INET;
262  printf ( "Next server: %s\n",
263  inet_ntoa ( next_server.sin.sin_addr ) );
264  }
265 
266  /* Expand filename setting */
267  filename = expand_settings ( raw_filename );
268  if ( ! filename )
269  goto err_expand;
270  if ( filename[0] )
271  printf ( "Filename: %s\n", filename );
272 
273  /* Construct URI */
274  uri = pxe_uri ( &next_server.sa, filename );
275  if ( ! uri )
276  goto err_parse;
277 
278  err_parse:
279  free ( filename );
280  err_expand:
281  free ( raw_filename );
282  err_fetch:
283  return uri;
284 }
int printf(const char *fmt,...)
Write a formatted string to the console.
Definition: vsprintf.c:464
struct sockaddr sa
Definition: dns.c:68
int fetch_ipv4_setting(struct settings *settings, const struct setting *setting, struct in_addr *inp)
Fetch value of IPv4 address setting.
Definition: settings.c:916
struct uri * pxe_uri(struct sockaddr *sa_server, const char *filename)
Construct URI from server address and filename.
Definition: uri.c:774
IPv4 socket address.
Definition: in.h:82
char * expand_settings(const char *string)
Expand variables within string.
Definition: settings.c:2288
struct sockaddr_in sin
Definition: dns.c:70
int fetch_string_setting_copy(struct settings *settings, const struct setting *setting, char **data)
Fetch value of string setting.
Definition: settings.c:877
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:670
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:50
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
#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().

◆ fetch_root_path()

static struct uri* fetch_root_path ( struct settings settings)
static

Fetch root-path setting into a URI.

Parameters
settingsSettings block
Return values
uriURI, or NULL on failure

Definition at line 292 of file autoboot.c.

292  {
293  struct uri *uri = NULL;
294  char *raw_root_path;
295  char *root_path;
296 
297  /* Fetch root-path setting */
298  fetch_string_setting_copy ( settings, &root_path_setting,
299  &raw_root_path );
300  if ( ! raw_root_path )
301  goto err_fetch;
302 
303  /* Expand filename setting */
304  root_path = expand_settings ( raw_root_path );
305  if ( ! root_path )
306  goto err_expand;
307  if ( root_path[0] )
308  printf ( "Root path: %s\n", root_path );
309 
310  /* Parse root path */
311  uri = parse_uri ( root_path );
312  if ( ! uri )
313  goto err_parse;
314 
315  err_parse:
316  free ( root_path );
317  err_expand:
318  free ( raw_root_path );
319  err_fetch:
320  return uri;
321 }
int printf(const char *fmt,...)
Write a formatted string to the console.
Definition: vsprintf.c:464
char * expand_settings(const char *string)
Expand variables within string.
Definition: settings.c:2288
int fetch_string_setting_copy(struct settings *settings, const struct setting *setting, char **data)
Fetch value of string setting.
Definition: settings.c:877
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
A settings block.
Definition: settings.h:132
A Uniform Resource Identifier.
Definition: uri.h:50
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
struct uri * parse_uri(const char *uri_string)
Parse URI.
Definition: uri.c:295

References expand_settings(), fetch_string_setting_copy(), free, NULL, parse_uri(), and printf().

Referenced by netboot().

◆ fetch_san_filename()

static char* fetch_san_filename ( struct settings settings)
static

Fetch san-filename setting.

Parameters
settingsSettings block
Return values
san_filenameSAN filename, or NULL on failure

Definition at line 329 of file autoboot.c.

329  {
330  char *raw_san_filename;
331  char *san_filename = NULL;
332 
333  /* Fetch san-filename setting */
334  fetch_string_setting_copy ( settings, &san_filename_setting,
335  &raw_san_filename );
336  if ( ! raw_san_filename )
337  goto err_fetch;
338 
339  /* Expand san-filename setting */
340  san_filename = expand_settings ( raw_san_filename );
341  if ( ! san_filename )
342  goto err_expand;
343  if ( san_filename[0] )
344  printf ( "SAN filename: %s\n", san_filename );
345 
346  err_expand:
347  free ( raw_san_filename );
348  err_fetch:
349  return san_filename;
350 }
int printf(const char *fmt,...)
Write a formatted string to the console.
Definition: vsprintf.c:464
char * expand_settings(const char *string)
Expand variables within string.
Definition: settings.c:2288
int fetch_string_setting_copy(struct settings *settings, const struct setting *setting, char **data)
Fetch value of string setting.
Definition: settings.c:877
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
A settings block.
Definition: settings.h:132
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References expand_settings(), fetch_string_setting_copy(), free, NULL, and printf().

Referenced by netboot().

◆ have_pxe_menu()

static int have_pxe_menu ( void  )
static

Check whether or not we have a usable PXE menu.

Return values
have_menuA usable PXE menu is present

Definition at line 357 of file autoboot.c.

357  {
358  struct setting vendor_class_id_setting
359  = { .tag = DHCP_VENDOR_CLASS_ID };
360  struct setting pxe_discovery_control_setting
362  struct setting pxe_boot_menu_setting
363  = { .tag = DHCP_PXE_BOOT_MENU };
364  char buf[ 10 /* "PXEClient" + NUL */ ];
365  unsigned int pxe_discovery_control;
366 
367  fetch_string_setting ( NULL, &vendor_class_id_setting,
368  buf, sizeof ( buf ) );
369  pxe_discovery_control =
370  fetch_uintz_setting ( NULL, &pxe_discovery_control_setting );
371 
372  return ( ( strcmp ( buf, "PXEClient" ) == 0 ) &&
373  setting_exists ( NULL, &pxe_boot_menu_setting ) &&
374  ( ! ( ( pxe_discovery_control & PXEBS_SKIP ) &&
375  setting_exists ( NULL, &filename_setting ) ) ) );
376 }
uint64_t tag
Setting tag, if applicable.
Definition: settings.h:43
int fetch_string_setting(struct settings *settings, const struct setting *setting, char *data, size_t len)
Fetch value of string setting.
Definition: settings.c:845
unsigned long fetch_uintz_setting(struct settings *settings, const struct setting *setting)
Fetch value of unsigned integer setting, or zero.
Definition: settings.c:1072
#define DHCP_PXE_BOOT_MENU
PXE boot menu.
Definition: dhcp.h:124
A setting.
Definition: settings.h:23
static int setting_exists(struct settings *settings, const struct setting *setting)
Check existence of predefined setting.
Definition: settings.h:538
#define DHCP_VENDOR_CLASS_ID
Vendor class identifier.
Definition: dhcp.h:214
Skip discovery if filename present.
Definition: dhcp.h:104
int strcmp(const char *first, const char *second)
Compare strings.
Definition: string.c:157
#define DHCP_PXE_DISCOVERY_CONTROL
PXE boot server discovery control.
Definition: dhcp.h:93
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References DHCP_PXE_BOOT_MENU, DHCP_PXE_DISCOVERY_CONTROL, DHCP_VENDOR_CLASS_ID, fetch_string_setting(), fetch_uintz_setting(), NULL, PXEBS_SKIP, setting_exists(), strcmp(), and setting::tag.

Referenced by netboot().

◆ netboot()

int netboot ( struct net_device netdev)

Boot from a network device.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 384 of file autoboot.c.

384  {
385  struct uri *filename;
386  struct uri *root_path;
387  char *san_filename;
388  int rc;
389 
390  /* Close all other network devices */
392 
393  /* Open device and display device status */
394  if ( ( rc = ifopen ( netdev ) ) != 0 )
395  goto err_ifopen;
396  ifstat ( netdev );
397 
398  /* Configure device */
399  if ( ( rc = ifconf ( netdev, NULL ) ) != 0 )
400  goto err_dhcp;
401  route();
402 
403  /* Try PXE menu boot, if applicable */
404  if ( have_pxe_menu() ) {
405  printf ( "Booting from PXE menu\n" );
406  rc = pxe_menu_boot ( netdev );
407  goto err_pxe_menu_boot;
408  }
409 
410  /* Fetch next server and filename (if any) */
411  filename = fetch_next_server_and_filename ( NULL );
412 
413  /* Fetch root path (if any) */
414  root_path = fetch_root_path ( NULL );
415 
416  /* Fetch SAN filename (if any) */
417  san_filename = fetch_san_filename ( NULL );
418 
419  /* If we have both a filename and a root path, ignore an
420  * unsupported or missing URI scheme in the root path, since
421  * it may represent an NFS root.
422  */
423  if ( filename && root_path &&
424  ( ( ! uri_is_absolute ( root_path ) ) ||
425  ( xfer_uri_opener ( root_path->scheme ) == NULL ) ) ) {
426  printf ( "Ignoring unsupported root path\n" );
427  uri_put ( root_path );
428  root_path = NULL;
429  }
430 
431  /* Check that we have something to boot */
432  if ( ! ( filename || root_path ) ) {
433  rc = -ENOENT_BOOT;
434  printf ( "Nothing to boot: %s\n", strerror ( rc ) );
435  goto err_no_boot;
436  }
437 
438  /* Boot using next server, filename and root path */
439  if ( ( rc = uriboot ( filename, &root_path, ( root_path ? 1 : 0 ),
440  san_default_drive(), san_filename,
441  ( root_path ? 0 : URIBOOT_NO_SAN ) ) ) != 0 )
442  goto err_uriboot;
443 
444  err_uriboot:
445  err_no_boot:
446  free ( san_filename );
447  uri_put ( root_path );
448  uri_put ( filename );
449  err_pxe_menu_boot:
450  err_dhcp:
451  err_ifopen:
452  return rc;
453 }
#define URIBOOT_NO_SAN
Definition: autoboot.h:25
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
static void uri_put(struct uri *uri)
Decrement URI reference count.
Definition: uri.h:188
static void close_all_netdevs(void)
Close all open net devices.
Definition: autoboot.c:220
static int uri_is_absolute(const struct uri *uri)
URI is an absolute URI.
Definition: uri.h:118
unsigned int san_default_drive(void)
Get default SAN drive number.
Definition: sanboot.c:956
int uriboot(struct uri *filename, struct uri **root_paths, unsigned int root_path_count, int drive, const char *san_filename, unsigned int flags)
Boot from filename and root-path URIs.
Definition: autoboot.c:125
const char * scheme
Scheme.
Definition: uri.h:54
struct uri * fetch_next_server_and_filename(struct settings *settings)
Fetch next-server and filename settings into a URI.
Definition: autoboot.c:234
static struct net_device * netdev
Definition: gdbudp.c:52
void route(void)
Print routing table.
Definition: route.c:39
int ifconf(struct net_device *netdev, struct net_device_configurator *configurator)
Perform network device configuration.
Definition: ifmgmt.c:269
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:292
static char * fetch_san_filename(struct settings *settings)
Fetch san-filename setting.
Definition: autoboot.c:329
__weak int pxe_menu_boot(struct net_device *netdev __unused)
Perform PXE menu boot when PXE stack is not available.
Definition: autoboot.c:86
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:357
A Uniform Resource Identifier.
Definition: uri.h:50
struct uri_opener * xfer_uri_opener(const char *scheme)
Find opener for URI scheme.
Definition: open.c:46
void ifstat(struct net_device *netdev)
Print status of network device.
Definition: ifmgmt.c:110
#define ENOENT_BOOT
Definition: autoboot.c:67
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References close_all_netdevs(), ENOENT_BOOT, fetch_next_server_and_filename(), fetch_root_path(), fetch_san_filename(), free, have_pxe_menu(), ifconf(), ifopen(), ifstat(), 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().

◆ is_autoboot_busloc()

static int is_autoboot_busloc ( struct net_device netdev)
static

Test if network device matches the autoboot device bus type and location.

Parameters
netdevNetwork device
Return values
is_autobootNetwork device matches the autoboot device

Definition at line 461 of file autoboot.c.

461  {
462  struct device *dev;
463 
464  for ( dev = netdev->dev ; dev ; dev = dev->parent ) {
465  if ( ( dev->desc.bus_type == autoboot_desc.bus_type ) &&
466  ( dev->desc.location == autoboot_desc.location ) )
467  return 1;
468  }
469  return 0;
470 }
struct device * parent
Bus device.
Definition: device.h:85
A hardware device.
Definition: device.h:73
static struct net_device * netdev
Definition: gdbudp.c:52
unsigned int location
Location.
Definition: device.h:29
struct device * dev
Underlying hardware device.
Definition: netdevice.h:360
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:61
struct device_description desc
Device description.
Definition: device.h:79

References autoboot_desc, device_description::bus_type, device::desc, net_device::dev, device_description::location, netdev, and device::parent.

Referenced by set_autoboot_busloc().

◆ 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 478 of file autoboot.c.

478  {
479 
480  /* Record autoboot device description */
481  autoboot_desc.bus_type = bus_type;
482  autoboot_desc.location = location;
483 
484  /* Mark autoboot device as present */
486 }
static int(* is_autoboot_device)(struct net_device *netdev)
Autoboot device tester.
Definition: autoboot.c:64
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:61
static int is_autoboot_busloc(struct net_device *netdev)
Test if network device matches the autoboot device bus type and location.
Definition: autoboot.c:461

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

Referenced by pci_autoboot_init().

◆ is_autoboot_ll_addr()

static int is_autoboot_ll_addr ( struct net_device netdev)
static

Test if network device matches the autoboot device link-layer address.

Parameters
netdevNetwork device
Return values
is_autobootNetwork device matches the autoboot device

Definition at line 494 of file autoboot.c.

494  {
495 
496  return ( memcmp ( netdev->ll_addr, autoboot_ll_addr,
497  netdev->ll_protocol->ll_addr_len ) == 0 );
498 }
uint8_t ll_addr_len
Link-layer address length.
Definition: netdevice.h:198
static uint8_t autoboot_ll_addr[MAX_LL_ADDR_LEN]
Link-layer address of preferred autoboot device, if known.
Definition: autoboot.c:58
static struct net_device * netdev
Definition: gdbudp.c:52
uint8_t ll_addr[MAX_LL_ADDR_LEN]
Link-layer address.
Definition: netdevice.h:381
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
Definition: string.c:98
struct ll_protocol * ll_protocol
Link-layer protocol.
Definition: netdevice.h:366

References autoboot_ll_addr, net_device::ll_addr, ll_protocol::ll_addr_len, net_device::ll_protocol, memcmp(), and netdev.

Referenced by set_autoboot_ll_addr().

◆ set_autoboot_ll_addr()

void set_autoboot_ll_addr ( const void *  ll_addr,
size_t  len 
)

Identify autoboot device by link-layer address.

Parameters
ll_addrLink-layer address
lenLength of link-layer address

Definition at line 506 of file autoboot.c.

506  {
507 
508  /* Record autoboot link-layer address (truncated if necessary) */
509  if ( len > sizeof ( autoboot_ll_addr ) )
510  len = sizeof ( autoboot_ll_addr );
511  memcpy ( autoboot_ll_addr, ll_addr, len );
512 
513  /* Mark autoboot device as present */
515 }
static uint8_t autoboot_ll_addr[MAX_LL_ADDR_LEN]
Link-layer address of preferred autoboot device, if known.
Definition: autoboot.c:58
static int is_autoboot_ll_addr(struct net_device *netdev)
Test if network device matches the autoboot device link-layer address.
Definition: autoboot.c:494
static int(* is_autoboot_device)(struct net_device *netdev)
Autoboot device tester.
Definition: autoboot.c:64
void * memcpy(void *dest, const void *src, size_t len) __nonnull
uint32_t len
Length.
Definition: ena.h:14

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

Referenced by efi_set_autoboot().

◆ autoboot()

static int autoboot ( void  )
static

Boot the system.

Definition at line 520 of file autoboot.c.

520  {
521  struct net_device *netdev;
522  int rc = -ENODEV;
523 
524  /* Try booting from each network device. If we have a
525  * specified autoboot device location, then use only devices
526  * matching that location.
527  */
528  for_each_netdev ( netdev ) {
529 
530  /* Skip any non-matching devices, if applicable */
531  if ( is_autoboot_device && ( ! is_autoboot_device ( netdev ) ) )
532  continue;
533 
534  /* Attempt booting from this device */
535  rc = netboot ( netdev );
536  }
537 
538  printf ( "No more network devices\n" );
539  return rc;
540 }
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 netboot(struct net_device *netdev)
Boot from a network device.
Definition: autoboot.c:384
static int(* is_autoboot_device)(struct net_device *netdev)
Autoboot device tester.
Definition: autoboot.c:64
static struct net_device * netdev
Definition: gdbudp.c:52
#define for_each_netdev(netdev)
Iterate over all network devices.
Definition: netdevice.h:526
A network device.
Definition: netdevice.h:348
#define ENODEV
No such device.
Definition: errno.h:509

References ENODEV, for_each_netdev, is_autoboot_device, netboot(), netdev, printf(), and rc.

Referenced by ipxe().

◆ shell_banner()

static int shell_banner ( void  )
static

Prompt for shell entry.

Return values
enter_shellUser wants to enter shell

Definition at line 547 of file autoboot.c.

547  {
548 
549  /* Skip prompt if timeout is zero */
550  if ( BANNER_TIMEOUT <= 0 )
551  return 0;
552 
553  /* Prompt user */
554  printf ( "\n" );
555  return ( prompt ( "Press Ctrl-B for the " PRODUCT_SHORT_NAME
556  " command line...",
557  ( ( BANNER_TIMEOUT * TICKS_PER_SEC ) / 10 ),
558  CTRL_B ) == 0 );
559 }
#define CTRL_B
Definition: keys.h:19
#define TICKS_PER_SEC
Number of ticks per second.
Definition: timer.h:15
#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 BANNER_TIMEOUT
Definition: general.h:29
int prompt(const char *text, unsigned long timeout, int key)
Prompt for keypress.
Definition: prompt.c:48

References BANNER_TIMEOUT, CTRL_B, printf(), PRODUCT_SHORT_NAME, prompt(), and TICKS_PER_SEC.

Referenced by 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 567 of file autoboot.c.

567  {
568  struct feature *feature;
569  struct image *image;
570  char *scriptlet;
571  int rc;
572 
573  /*
574  * Print welcome banner
575  *
576  *
577  * If you wish to brand this build of iPXE, please do so by
578  * defining the string PRODUCT_NAME in config/branding.h.
579  *
580  * While nothing in the GPL prevents you from removing all
581  * references to iPXE or http://ipxe.org, we prefer you not to
582  * do so.
583  *
584  */
585  printf ( NORMAL "\n\n" PRODUCT_NAME "\n" BOLD PRODUCT_SHORT_NAME " %s"
586  NORMAL " -- " PRODUCT_TAG_LINE " -- "
587  CYAN PRODUCT_URI NORMAL "\nFeatures:", product_version );
589  printf ( " %s", feature->name );
590  printf ( "\n" );
591 
592  /* Boot system */
593  if ( ( image = first_image() ) != NULL ) {
594  /* We have an embedded image; execute it */
595  return image_exec ( image );
596  } else if ( shell_banner() ) {
597  /* User wants shell; just give them a shell */
598  return shell();
599  } else {
600  fetch_string_setting_copy ( NULL, &scriptlet_setting,
601  &scriptlet );
602  if ( scriptlet ) {
603  /* User has defined a scriptlet; execute it */
604  rc = system ( scriptlet );
605  free ( scriptlet );
606  return rc;
607  } else {
608  /* Try booting. If booting fails, offer the
609  * user another chance to enter the shell.
610  */
611  if ( netdev ) {
612  rc = netboot ( netdev );
613  } else {
614  rc = autoboot();
615  }
616  if ( shell_banner() )
617  rc = shell();
618  return rc;
619  }
620  }
621 }
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:384
#define NORMAL
Definition: autoboot.c:71
#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:73
int image_exec(struct image *image)
Execute image.
Definition: image.c:291
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:877
static struct image * first_image(void)
Retrieve first image.
Definition: image.h:170
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:358
const char product_version[]
Product version string.
Definition: version.c:69
static int autoboot(void)
Boot the system.
Definition: autoboot.c:520
#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:547
#define PRODUCT_NAME
Definition: branding.h:27
#define BOLD
Definition: autoboot.c:72
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
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().

Variable Documentation

◆ autoboot_ll_addr

uint8_t autoboot_ll_addr[MAX_LL_ADDR_LEN]
static

Link-layer address of preferred autoboot device, if known.

Definition at line 58 of file autoboot.c.

Referenced by is_autoboot_ll_addr(), and set_autoboot_ll_addr().

◆ autoboot_desc

struct device_description autoboot_desc
static

Device location of preferred autoboot device, if known.

Definition at line 61 of file autoboot.c.

Referenced by is_autoboot_busloc(), and set_autoboot_busloc().

◆ is_autoboot_device

int( * is_autoboot_device) (struct net_device *netdev)
static

Autoboot device tester.

Definition at line 64 of file autoboot.c.

Referenced by autoboot(), set_autoboot_busloc(), and set_autoboot_ll_addr().