git: c4640126f116 - main - loader.efi: Apply command-line DHCP overrides earlier
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 29 Sep 2026 19:56:09 UTC
The branch main has been updated by kgalazka:
URL: https://cgit.FreeBSD.org/src/commit/?id=c4640126f1160c3eb939aa138445f4b4ea98efb0
commit c4640126f1160c3eb939aa138445f4b4ea98efb0
Author: Krzysztof Galazka <kgalazka@FreeBSD.org>
AuthorDate: 2026-09-29 19:54:54 +0000
Commit: Krzysztof Galazka <kgalazka@FreeBSD.org>
CommitDate: 2026-09-29 19:55:17 +0000
loader.efi: Apply command-line DHCP overrides earlier
Ability to override DHCP options with command-line arguments
was affected by intoduction of initmd support. Initmd discovery
configures the network before loader arguments
were parsed, so a dhcp.root-path override was unavailable
during the first network configuration. Move parsing
arguments earlier and apply dhcp.root-path even if DHCP response
does not contain option 17. This allows providing a dynamic NFS
root e.g. by chain loading loader.efi from iPXE.
Signed-off-by: Krzysztof Galazka <krzysztof.galazka@intel.com>
Reviewed by: imp
Assisted by: Github Copilot (GPT-5.6 Sol)
Sponsored by: Intel Corporation
Differential Revision: https://reviews.freebsd.org/D59998
---
stand/common/dev_net.c | 3 +++
stand/efi/loader/main.c | 7 ++++++-
stand/libsa/bootp.c | 4 +---
3 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/stand/common/dev_net.c b/stand/common/dev_net.c
index 897b09c648eb..aecb5bcde81c 100644
--- a/stand/common/dev_net.c
+++ b/stand/common/dev_net.c
@@ -248,6 +248,7 @@ static int
net_getparams(int sock)
{
char buf[MAXHOSTNAMELEN];
+ const char *val;
n_long rootaddr, smask;
#ifdef SUPPORT_BOOTP
@@ -306,6 +307,8 @@ net_getparams(int sock)
return (EIO);
}
exit:
+ if ((val = getenv("dhcp.root-path")) != NULL)
+ strlcpy(rootpath, val, sizeof(rootpath));
if ((rootaddr = net_parse_rootpath()) != htonl(INADDR_NONE))
rootip.s_addr = rootaddr;
diff --git a/stand/efi/loader/main.c b/stand/efi/loader/main.c
index fa4647101d62..bfb221ee80f5 100644
--- a/stand/efi/loader/main.c
+++ b/stand/efi/loader/main.c
@@ -1382,6 +1382,12 @@ main(int argc, CHAR16 *argv[])
devinit();
+ /*
+ * Parse command line arguments before any operation that may configure
+ * the network so DHCP overrides are available on the first attempt.
+ */
+ howto = parse_args(argc, argv);
+
/*
* If we didn't find a ipxe image, and we're netbooting, try to
* download an initmd that the dhcp server tells us about.
@@ -1394,7 +1400,6 @@ main(int argc, CHAR16 *argv[])
* args (eg -h) or via the UEFI ConOut variable.
*/
has_kbd = has_keyboard();
- howto = parse_args(argc, argv);
if (!has_kbd && (howto & RB_PROBE))
howto |= RB_SERIAL | RB_MULTIPLE;
howto &= ~RB_PROBE;
diff --git a/stand/libsa/bootp.c b/stand/libsa/bootp.c
index f708006169d0..8cbcede7bb0e 100644
--- a/stand/libsa/bootp.c
+++ b/stand/libsa/bootp.c
@@ -474,9 +474,7 @@ vend_rfc1048(u_char *cp, u_int len)
bcopy(cp, &rootip.s_addr, sizeof(rootip.s_addr));
}
if (tag == TAG_ROOTPATH) {
- if ((val = getenv("dhcp.root-path")) == NULL)
- val = (const char *)cp;
- strlcpy(rootpath, val, sizeof(rootpath));
+ strlcpy(rootpath, (const char *)cp, sizeof(rootpath));
}
if (tag == TAG_HOSTNAME) {
if ((val = getenv("dhcp.host-name")) == NULL)