iPXE
autoboot.c File Reference

Automatic booting. More...

#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <ipxe/netdevice.h>
#include <ipxe/vlan.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)
 FILE_SECBOOT (PERMITTED)
const struct setting scriptlet_setting __setting (SETTING_MISC, scriptlet)
 The "scriptlet" setting.
__weak int pxe_menu_boot (struct net_device *netdev __unused)
 Perform PXE menu boot when PXE stack is not available.
const struct setting keep_san_setting __setting (SETTING_SANBOOT_EXTRA, keep-san)
 The "keep-san" setting.
const struct setting skip_san_boot_setting __setting (SETTING_SANBOOT_EXTRA, skip-san-boot)
 The "skip-san-boot" setting.
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.
static void close_other_netdevs (struct net_device *netdev)
 Close all but one network device.
struct urifetch_next_server_and_filename (struct settings *settings)
 Fetch next-server and filename settings into a URI.
static struct urifetch_root_path (struct settings *settings)
 Fetch root-path setting into a URI.
static char * fetch_san_filename (struct settings *settings)
 Fetch san-filename setting.
static int have_pxe_menu (void)
 Check whether or not we have a usable PXE menu.
int netboot (struct net_device *netdev)
 Boot from a network device.
static int is_autoboot_busloc (struct net_device *netdev)
 Test if network device matches the autoboot device bus type and location.
void set_autoboot_busloc (unsigned int bus_type, unsigned int location)
 Identify autoboot device by bus type and location.
static int is_autoboot_ll_addr (struct net_device *netdev)
 Test if network device matches the autoboot device link-layer address.
void set_autoboot_ll_addr (const void *ll_addr, size_t len, unsigned int vlan)
 Identify autoboot device by link-layer address.
static int autoboot (void)
 Boot the system.
static int shell_banner (void)
 Prompt for shell entry.
int ipxe (struct net_device *netdev)
 Main iPXE flow of execution.

Variables

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

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

Referenced by netboot().

◆ EINFO_ENOENT_BOOT

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

Definition at line 73 of file autoboot.c.

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

◆ NORMAL

#define NORMAL   "\033[0m"

Definition at line 76 of file autoboot.c.

Referenced by ipxe().

◆ BOLD

#define BOLD   "\033[1m"

Definition at line 77 of file autoboot.c.

Referenced by ipxe().

◆ CYAN

#define CYAN   "\033[36m"

Definition at line 78 of file autoboot.c.

Referenced by ipxe().

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED )

◆ __setting() [1/3]

const struct setting scriptlet_setting __setting ( SETTING_MISC ,
scriptlet  )

The "scriptlet" setting.

References __setting, DHCP_EB_SCRIPTLET, and SETTING_MISC.

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

91 {
92 return -ENOTSUP;
93}
#define ENOTSUP
Operation not supported.
Definition errno.h:590

References __unused, __weak, ENOTSUP, and netdev.

Referenced by netboot().

◆ __setting() [2/3]

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

The "keep-san" setting.

References __setting, DHCP_EB_KEEP_SAN, and SETTING_SANBOOT_EXTRA.

◆ __setting() [3/3]

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

The "skip-san-boot" setting.

References __setting, DHCP_EB_SKIP_SAN_BOOT, and SETTING_SANBOOT_EXTRA.

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

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

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().

◆ close_other_netdevs()

void close_other_netdevs ( struct net_device * netdev)
static

Close all but one network device.

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

227 {
228 struct net_device *other;
229
230 for_each_netdev ( other ) {
231 if ( other != netdev )
232 ifclose ( other );
233 }
234}
static struct net_device * netdev
Definition gdbudp.c:53
void ifclose(struct net_device *netdev)
Close network device.
Definition ifmgmt.c:83
#define for_each_netdev(netdev)
Iterate over all network devices.
Definition netdevice.h:547
A network device.
Definition netdevice.h:353

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

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

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()

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

300 {
301 struct uri *uri = NULL;
302 char *raw_root_path;
303 char *root_path;
304
305 /* Fetch root-path setting */
306 fetch_string_setting_copy ( settings, &root_path_setting,
307 &raw_root_path );
308 if ( ! raw_root_path )
309 goto err_fetch;
310
311 /* Expand filename setting */
312 root_path = expand_settings ( raw_root_path );
313 if ( ! root_path )
314 goto err_expand;
315 if ( root_path[0] )
316 printf ( "Root path: %s\n", root_path );
317
318 /* Parse root path */
319 uri = parse_uri ( root_path );
320 if ( ! uri )
321 goto err_parse;
322
323 err_parse:
324 free ( root_path );
325 err_expand:
326 free ( raw_root_path );
327 err_fetch:
328 return uri;
329}
struct uri * parse_uri(const char *uri_string)
Parse URI.
Definition uri.c:297

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

Referenced by netboot().

◆ fetch_san_filename()

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

337 {
338 char *raw_san_filename;
339 char *san_filename = NULL;
340
341 /* Fetch san-filename setting */
342 fetch_string_setting_copy ( settings, &san_filename_setting,
343 &raw_san_filename );
344 if ( ! raw_san_filename )
345 goto err_fetch;
346
347 /* Expand san-filename setting */
348 san_filename = expand_settings ( raw_san_filename );
349 if ( ! san_filename )
350 goto err_expand;
351 if ( san_filename[0] )
352 printf ( "SAN filename: %s\n", san_filename );
353
354 err_expand:
355 free ( raw_san_filename );
356 err_fetch:
357 return san_filename;
358}

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

Referenced by netboot().

◆ have_pxe_menu()

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

365 {
366 struct setting vendor_class_id_setting
367 = { .tag = DHCP_VENDOR_CLASS_ID };
368 struct setting pxe_discovery_control_setting
369 = { .tag = DHCP_PXE_DISCOVERY_CONTROL };
370 struct setting pxe_boot_menu_setting
371 = { .tag = DHCP_PXE_BOOT_MENU };
372 char buf[ 10 /* "PXEClient" + NUL */ ];
373 unsigned int pxe_discovery_control;
374
375 fetch_string_setting ( NULL, &vendor_class_id_setting,
376 buf, sizeof ( buf ) );
377 pxe_discovery_control =
378 fetch_uintz_setting ( NULL, &pxe_discovery_control_setting );
379
380 return ( ( strcmp ( buf, "PXEClient" ) == 0 ) &&
381 setting_exists ( NULL, &pxe_boot_menu_setting ) &&
382 ( ! ( ( pxe_discovery_control & PXEBS_SKIP ) &&
383 setting_exists ( NULL, &filename_setting ) ) ) );
384}
#define DHCP_VENDOR_CLASS_ID
Vendor class identifier.
Definition dhcp.h:217
#define DHCP_PXE_DISCOVERY_CONTROL
PXE boot server discovery control.
Definition dhcp.h:96
#define DHCP_PXE_BOOT_MENU
PXE boot menu.
Definition dhcp.h:127
@ PXEBS_SKIP
Skip discovery if filename present.
Definition dhcp.h:107
static int setting_exists(struct settings *settings, const struct setting *setting)
Check existence of predefined setting.
Definition settings.h:546
unsigned long fetch_uintz_setting(struct settings *settings, const struct setting *setting)
Fetch value of unsigned integer setting, or zero.
Definition settings.c:1069
int fetch_string_setting(struct settings *settings, const struct setting *setting, char *data, size_t len)
Fetch value of string setting.
Definition settings.c:842
int strcmp(const char *first, const char *second)
Compare strings.
Definition string.c:174
A setting.
Definition settings.h:24

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

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

392 {
393 struct san_boot_config san_config;
394 struct uri *filename;
395 struct uri *root_path;
396 char *san_filename;
397 int rc;
398
399 /* Close all other network devices */
401
402 /* Open device and display device status */
403 if ( ( rc = ifopen ( netdev ) ) != 0 )
404 goto err_ifopen;
405 ifstat ( netdev );
406
407 /* Configure device */
408 if ( ( rc = ifconf ( netdev, NULL, 0 ) ) != 0 )
409 goto err_dhcp;
410 route();
411
412 /* Try PXE menu boot, if applicable */
413 if ( have_pxe_menu() ) {
414 printf ( "Booting from PXE menu\n" );
415 rc = pxe_menu_boot ( netdev );
416 goto err_pxe_menu_boot;
417 }
418
419 /* Fetch next server and filename (if any) */
421
422 /* Fetch root path (if any) */
423 root_path = fetch_root_path ( NULL );
424
425 /* Fetch SAN filename (if any) */
426 san_filename = fetch_san_filename ( NULL );
427
428 /* Construct SAN boot configuration parameters */
429 memset ( &san_config, 0, sizeof ( san_config ) );
430 san_config.filename = san_filename;
431
432 /* If we have both a filename and a root path, ignore an
433 * unsupported or missing URI scheme in the root path, since
434 * it may represent an NFS root.
435 */
436 if ( filename && root_path &&
437 ( ( ! uri_is_absolute ( root_path ) ) ||
438 ( xfer_uri_opener ( root_path->scheme ) == NULL ) ) ) {
439 printf ( "Ignoring unsupported root path\n" );
440 uri_put ( root_path );
441 root_path = NULL;
442 }
443
444 /* Check that we have something to boot */
445 if ( ! ( filename || root_path ) ) {
446 rc = -ENOENT_BOOT;
447 printf ( "Nothing to boot: %s\n", strerror ( rc ) );
448 goto err_no_boot;
449 }
450
451 /* Boot using next server, filename and root path */
452 if ( ( rc = uriboot ( filename, &root_path, ( root_path ? 1 : 0 ),
453 san_default_drive(), &san_config,
454 ( root_path ? 0 : URIBOOT_NO_SAN ) ) ) != 0 )
455 goto err_uriboot;
456
457 err_uriboot:
458 err_no_boot:
459 free ( san_filename );
460 uri_put ( root_path );
461 uri_put ( filename );
462 err_pxe_menu_boot:
463 err_dhcp:
464 err_ifopen:
465 return rc;
466}
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:130
#define ENOENT_BOOT
Definition autoboot.c:72
static char * fetch_san_filename(struct settings *settings)
Fetch san-filename setting.
Definition autoboot.c:337
static struct uri * fetch_root_path(struct settings *settings)
Fetch root-path setting into a URI.
Definition autoboot.c:300
static int have_pxe_menu(void)
Check whether or not we have a usable PXE menu.
Definition autoboot.c:365
struct uri * fetch_next_server_and_filename(struct settings *settings)
Fetch next-server and filename settings into a URI.
Definition autoboot.c:242
__weak int pxe_menu_boot(struct net_device *netdev __unused)
Perform PXE menu boot when PXE stack is not available.
Definition autoboot.c:91
static void close_other_netdevs(struct net_device *netdev)
Close all but one network device.
Definition autoboot.c:227
#define URIBOOT_NO_SAN
Definition autoboot.h:27
int ifopen(struct net_device *netdev)
Open network device.
Definition ifmgmt.c:66
int ifconf(struct net_device *netdev, struct net_device_configurator *configurator, unsigned long timeout)
Perform network device configuration.
Definition ifmgmt.c:275
void ifstat(struct net_device *netdev)
Print status of network device.
Definition ifmgmt.c:111
struct uri_opener * xfer_uri_opener(const char *scheme)
Find opener for URI scheme.
Definition open.c:48
void route(void)
Print routing table.
Definition route.c:40
unsigned int san_default_drive(void)
Get default SAN drive number.
Definition sanboot.c:973
SAN boot configuration parameters.
Definition sanboot.h:111
const char * scheme
Scheme.
Definition uri.h:69
static int uri_is_absolute(const struct uri *uri)
URI is an absolute URI.
Definition uri.h:136
static void uri_put(struct uri *uri)
Decrement URI reference count.
Definition uri.h:206

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().

◆ is_autoboot_busloc()

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

474 {
475 struct device *dev;
476
477 for ( dev = netdev->dev ; dev ; dev = dev->parent ) {
478 if ( ( dev->desc.bus_type == autoboot_desc.bus_type ) &&
479 ( dev->desc.location == autoboot_desc.location ) )
480 return 1;
481 }
482 return 0;
483}
static struct device_description autoboot_desc
Device location of preferred autoboot device, if known.
Definition autoboot.c:66
unsigned int bus_type
Bus type.
Definition device.h:25
unsigned int location
Location.
Definition device.h:30
A hardware device.
Definition device.h:77
struct device_description desc
Device description.
Definition device.h:83
struct device * parent
Bus device.
Definition device.h:89

References autoboot_desc, device_description::bus_type, device::desc, 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 491 of file autoboot.c.

491 {
492
493 /* Record autoboot device description */
494 autoboot_desc.bus_type = bus_type;
495 autoboot_desc.location = location;
496
497 /* Mark autoboot device as present */
499}
static int is_autoboot_busloc(struct net_device *netdev)
Test if network device matches the autoboot device bus type and location.
Definition autoboot.c:474
static int(* is_autoboot_device)(struct net_device *netdev)
Autoboot device tester.
Definition autoboot.c:69

References autoboot_desc, is_autoboot_busloc(), and is_autoboot_device.

Referenced by pci_autoboot_init().

◆ is_autoboot_ll_addr()

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

507 {
508
509 return ( ( memcmp ( netdev->ll_addr, autoboot_ll_addr,
510 netdev->ll_protocol->ll_addr_len ) == 0 ) &&
511 ( vlan_tag ( netdev ) == autoboot_vlan ) );
512}
static unsigned int autoboot_vlan
VLAN tag of preferred autoboot device, if known.
Definition autoboot.c:63
static uint8_t autoboot_ll_addr[MAX_LL_ADDR_LEN]
Link-layer address of preferred autoboot device, if known.
Definition autoboot.c:60
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
Definition string.c:115
static unsigned int vlan_tag(struct net_device *netdev)
Get the VLAN tag.
Definition vlan.h:74

References autoboot_ll_addr, autoboot_vlan, memcmp(), netdev, and vlan_tag().

Referenced by set_autoboot_ll_addr().

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

522 {
523
524 /* Record autoboot link-layer address (truncated if necessary) */
525 if ( len > sizeof ( autoboot_ll_addr ) )
526 len = sizeof ( autoboot_ll_addr );
527 memcpy ( autoboot_ll_addr, ll_addr, len );
528
529 /* Record autoboot VLAN tag */
530 autoboot_vlan = vlan;
531
532 /* Mark autoboot device as present */
534}
static int is_autoboot_ll_addr(struct net_device *netdev)
Test if network device matches the autoboot device link-layer address.
Definition autoboot.c:507
ring len
Length.
Definition dwmac.h:226
void * memcpy(void *dest, const void *src, size_t len) __nonnull

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

Referenced by efi_set_autoboot_ll_addr().

◆ autoboot()

int autoboot ( void )
static

Boot the system.

Definition at line 539 of file autoboot.c.

539 {
540 struct net_device *netdev;
541 int rc = -ENODEV;
542
543 /* Try booting from each network device. If we have a
544 * specified autoboot device location, then use only devices
545 * matching that location.
546 */
548
549 /* Skip any non-matching devices, if applicable */
551 continue;
552
553 /* Attempt booting from this device */
554 rc = netboot ( netdev );
555 }
556
557 printf ( "No more network devices\n" );
558 return rc;
559}
int netboot(struct net_device *netdev)
Boot from a network device.
Definition autoboot.c:392
#define ENODEV
No such device.
Definition errno.h:510

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

Referenced by COMMAND(), and ipxe().

◆ shell_banner()

int shell_banner ( void )
static

Prompt for shell entry.

Return values
enter_shellUser wants to enter shell

Definition at line 566 of file autoboot.c.

566 {
567
568 /* Skip prompt if timeout is zero */
569 if ( BANNER_TIMEOUT <= 0 )
570 return 0;
571
572 /* Prompt user */
573 printf ( "\n" );
574 return ( prompt ( "Press Ctrl-B for the " PRODUCT_SHORT_NAME
575 " command line...",
576 ( ( BANNER_TIMEOUT * TICKS_PER_SEC ) / 10 ),
577 CTRL_B ) == 0 );
578}
#define PRODUCT_SHORT_NAME
Definition branding.h:29
#define BANNER_TIMEOUT
Definition general.h:223
#define TICKS_PER_SEC
Number of ticks per second.
Definition timer.h:16
#define CTRL_B
Definition keys.h:20
int prompt(const char *text, unsigned long timeout, int key)
Prompt for keypress.
Definition prompt.c:49

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

586 {
587 struct feature *feature;
588 struct image *image;
589 char *scriptlet;
590 int rc;
591
592 /*
593 * Print welcome banner
594 *
595 *
596 * If you wish to brand this build of iPXE, please do so by
597 * defining the string PRODUCT_NAME in config/branding.h.
598 *
599 * While nothing in the GPL prevents you from removing all
600 * references to iPXE or https://ipxe.org, we prefer you not
601 * to do so.
602 *
603 */
605 NORMAL " -- " PRODUCT_TAG_LINE " -- "
606 CYAN PRODUCT_URI NORMAL "\nFeatures:", product_version );
608 printf ( " %s", feature->name );
609 printf ( "\n" );
610
611 /* Boot system */
612 if ( ( image = first_image() ) != NULL ) {
613 /* We have an embedded image; execute it */
614 return image_exec ( image );
615 } else if ( shell_banner() ) {
616 /* User wants shell; just give them a shell */
617 return shell();
618 } else {
619 fetch_string_setting_copy ( NULL, &scriptlet_setting,
620 &scriptlet );
621 if ( scriptlet ) {
622 /* User has defined a scriptlet; execute it */
623 rc = system ( scriptlet );
624 free ( scriptlet );
625 return rc;
626 } else {
627 /* Try booting. If booting fails, offer the
628 * user another chance to enter the shell.
629 */
630 if ( netdev ) {
631 rc = netboot ( netdev );
632 } else {
633 rc = autoboot();
634 }
635 if ( shell_banner() )
636 rc = shell();
637 return rc;
638 }
639 }
640}
#define NORMAL
Definition autoboot.c:76
#define BOLD
Definition autoboot.c:77
static int autoboot(void)
Boot the system.
Definition autoboot.c:539
#define CYAN
Definition autoboot.c:78
static int shell_banner(void)
Prompt for shell entry.
Definition autoboot.c:566
#define PRODUCT_NAME
Definition branding.h:28
#define PRODUCT_TAG_LINE
Definition branding.h:39
#define PRODUCT_URI
Definition branding.h:30
uint8_t system[ETH_ALEN]
System identifier.
Definition eth_slow.h:13
static struct image * first_image(void)
Retrieve first image.
Definition image.h:203
#define FEATURES
Named feature table.
Definition features.h:85
int shell(void)
Start command shell.
Definition shell.c:82
A named feature.
Definition features.h:79
char * name
Feature name.
Definition features.h:81
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition tables.h:386
const char product_version[]
Product version string.
Definition version.c:71

References autoboot(), BOLD, CYAN, 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 60 of file autoboot.c.

Referenced by is_autoboot_ll_addr(), and set_autoboot_ll_addr().

◆ autoboot_vlan

unsigned int autoboot_vlan
static

VLAN tag of preferred autoboot device, if known.

Definition at line 63 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 66 of file autoboot.c.

Referenced by is_autoboot_busloc(), and set_autoboot_busloc().

◆ is_autoboot_device

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

Autoboot device tester.

Definition at line 69 of file autoboot.c.

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