git: c4640126f116 - main - loader.efi: Apply command-line DHCP overrides earlier

From: Krzysztof Galazka <kgalazka_at_FreeBSD.org>
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)