summaryrefslogtreecommitdiffstats
path: root/src/include
diff options
context:
space:
mode:
authorMichael Brown2017-04-12 16:03:25 +0200
committerMichael Brown2017-04-12 16:58:05 +0200
commit84d406ccf48c8808b0bb30d526b758e4b58cacc8 (patch)
treee0d262d87136fcaf8f202ab7d6e51760a387fe78 /src/include
parent[efi] Add efi_sprintf() and efi_vsprintf() (diff)
downloadipxe-84d406ccf48c8808b0bb30d526b758e4b58cacc8.tar.gz
ipxe-84d406ccf48c8808b0bb30d526b758e4b58cacc8.tar.xz
ipxe-84d406ccf48c8808b0bb30d526b758e4b58cacc8.zip
[block] Allow use of a non-default EFI SAN boot filename
Some older operating systems (e.g. RHEL6) use a non-default filename on the root disk and rely on setting an EFI variable to point to the bootloader. This does not work when performing a SAN boot on a machine where the EFI variable is not present. Fix by allowing a non-default filename to be specified via the "sanboot --filename" option or the "san-filename" setting. For example: sanboot --filename \efi\redhat\grub.efi \ iscsi:192.168.0.1::::iqn.2010-04.org.ipxe.demo:rhel6 or option ipxe.san-filename code 188 = string; option ipxe.san-filename "\\efi\\redhat\\grub.efi"; option root-path "iscsi:192.168.0.1::::iqn.2010-04.org.ipxe.demo:rhel6"; Originally-implemented-by: Vishvananda Ishaya Abrams <vish.ishaya@oracle.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/include')
-rw-r--r--src/include/ipxe/dhcp.h6
-rw-r--r--src/include/ipxe/sanboot.h3
-rw-r--r--src/include/ipxe/settings.h2
-rw-r--r--src/include/usr/autoboot.h2
4 files changed, 11 insertions, 2 deletions
diff --git a/src/include/ipxe/dhcp.h b/src/include/ipxe/dhcp.h
index 0f662d63..b7a5f004 100644
--- a/src/include/ipxe/dhcp.h
+++ b/src/include/ipxe/dhcp.h
@@ -440,6 +440,12 @@ struct dhcp_netdev_desc {
*/
#define DHCP_EB_SAN_RETRY DHCP_ENCAP_OPT ( DHCP_EB_ENCAP, 0xbb )
+/** SAN filename
+ *
+ * This is the path of the bootloader within the SAN device.
+ */
+#define DHCP_EB_SAN_FILENAME DHCP_ENCAP_OPT ( DHCP_EB_ENCAP, 0xbc )
+
/** SAN drive number
*
* This is the drive number for a SAN-hooked drive. For BIOS, 0x80 is
diff --git a/src/include/ipxe/sanboot.h b/src/include/ipxe/sanboot.h
index 8737bbc0..8b3e2b28 100644
--- a/src/include/ipxe/sanboot.h
+++ b/src/include/ipxe/sanboot.h
@@ -155,9 +155,10 @@ void san_unhook ( unsigned int drive );
* Attempt to boot from a SAN device
*
* @v drive Drive number
+ * @v filename Filename (or NULL to use default)
* @ret rc Return status code
*/
-int san_boot ( unsigned int drive );
+int san_boot ( unsigned int drive, const char *filename );
/**
* Describe SAN devices for SAN-booted operating system
diff --git a/src/include/ipxe/settings.h b/src/include/ipxe/settings.h
index 521efa99..36b4c241 100644
--- a/src/include/ipxe/settings.h
+++ b/src/include/ipxe/settings.h
@@ -452,6 +452,8 @@ filename_setting __setting ( SETTING_BOOT, filename );
extern const struct setting
root_path_setting __setting ( SETTING_SANBOOT, root-path );
extern const struct setting
+san_filename_setting __setting ( SETTING_SANBOOT, san-filename );
+extern const struct setting
username_setting __setting ( SETTING_AUTH, username );
extern const struct setting
password_setting __setting ( SETTING_AUTH, password );
diff --git a/src/include/usr/autoboot.h b/src/include/usr/autoboot.h
index c62d06c6..f88b8494 100644
--- a/src/include/usr/autoboot.h
+++ b/src/include/usr/autoboot.h
@@ -32,7 +32,7 @@ extern void set_autoboot_ll_addr ( const void *ll_addr, size_t len );
extern int uriboot ( struct uri *filename, struct uri **root_paths,
unsigned int root_path_count, int drive,
- unsigned int flags );
+ const char *san_filename, unsigned int flags );
extern struct uri *
fetch_next_server_and_filename ( struct settings *settings );
extern int netboot ( struct net_device *netdev );