diff options
author | brian <brian@FreeBSD.org> | 2004-07-08 13:40:33 +0000 |
---|---|---|
committer | brian <brian@FreeBSD.org> | 2004-07-08 13:40:33 +0000 |
commit | 2821a50eaafae3e4c7204aef9e58c6f40d221bbb (patch) | |
tree | ebac46b3b358807a8144fabd366380413a43366c /sys | |
parent | 7c245468ef2fa07526f2540ec91012b5c7f4e9c8 (diff) | |
download | FreeBSD-src-2821a50eaafae3e4c7204aef9e58c6f40d221bbb.zip FreeBSD-src-2821a50eaafae3e4c7204aef9e58c6f40d221bbb.tar.gz |
Change the following kernel options to environment variables:
BOOTP -> bootp
BOOTP_NFSROOT -> bootp.nfsroot
BOOTP_NFSV3 -> bootp.nfsv3
BOOTP_COMPAT -> bootp.compat
BOOTP_WIRED_TO -> bootp.wired_to
This lets you PXE boot with a GENERIC kernel by putting this sort of thing
in loader.conf:
bootp="YES"
bootp.nfsroot="YES"
bootp.nfsv3="YES"
bootp.wired_to="bge1"
or even setting the variables manually from the OK prompt.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/alpha/alpha/autoconf.c | 12 | ||||
-rw-r--r-- | sys/amd64/amd64/autoconf.c | 19 | ||||
-rw-r--r-- | sys/boot/common/dev_net.c | 2 | ||||
-rw-r--r-- | sys/boot/common/loader.8 | 23 | ||||
-rw-r--r-- | sys/boot/forth/loader.conf | 5 | ||||
-rw-r--r-- | sys/conf/NOTES | 9 | ||||
-rw-r--r-- | sys/conf/files | 4 | ||||
-rw-r--r-- | sys/conf/options | 5 | ||||
-rw-r--r-- | sys/i386/i386/autoconf.c | 19 | ||||
-rw-r--r-- | sys/i386/i386/locore.s | 3 | ||||
-rw-r--r-- | sys/ia64/ia64/autoconf.c | 23 | ||||
-rw-r--r-- | sys/modules/nfs4client/Makefile | 2 | ||||
-rw-r--r-- | sys/modules/nfsclient/Makefile | 2 | ||||
-rw-r--r-- | sys/netinet/ip_input.c | 11 | ||||
-rw-r--r-- | sys/nfs4client/nfs4_vfsops.c | 1 | ||||
-rw-r--r-- | sys/nfsclient/bootp_subr.c | 156 | ||||
-rw-r--r-- | sys/nfsclient/nfs_vfsops.c | 16 |
17 files changed, 169 insertions, 143 deletions
diff --git a/sys/alpha/alpha/autoconf.c b/sys/alpha/alpha/autoconf.c index d3ffb23..0cf7e65 100644 --- a/sys/alpha/alpha/autoconf.c +++ b/sys/alpha/alpha/autoconf.c @@ -27,7 +27,6 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); -#include "opt_bootp.h" #include "opt_isa.h" #include "opt_nfs.h" #include "opt_nfsroot.h" @@ -203,11 +202,12 @@ void cpu_rootconf() { #if defined(NFSCLIENT) && defined(NFS_ROOT) - int order = 0; -#if !defined(BOOTP_NFSROOT) - if (nfs_diskless_valid) -#endif - rootdevnames[order++] = "nfs:"; + char *cp = NULL; + + if (nfs_diskless_valid || (cp = getenv("bootp.nfsroot")) != NULL) + rootdevnames[0] = "nfs:"; + if (cp != NULL) + freeenv(cp); #endif } SYSINIT(cpu_rootconf, SI_SUB_ROOT_CONF, SI_ORDER_FIRST, cpu_rootconf, NULL) diff --git a/sys/amd64/amd64/autoconf.c b/sys/amd64/amd64/autoconf.c index c646741..f5a4164 100644 --- a/sys/amd64/amd64/autoconf.c +++ b/sys/amd64/amd64/autoconf.c @@ -43,7 +43,6 @@ __FBSDID("$FreeBSD$"); * devices are determined (from possibilities mentioned in ioconf.c), * and the drivers are initialized. */ -#include "opt_bootp.h" #include "opt_isa.h" #include "opt_nfs.h" #include "opt_nfsroot.h" @@ -143,15 +142,19 @@ configure_final(dummy) void cpu_rootconf() { -#ifdef BOOTP - bootpc_init(); -#endif + char *cp; + + if ((cp = getenv("bootp")) != NULL) { + bootpc_init(); + freeenv(cp); + } #if defined(NFSCLIENT) && defined(NFS_ROOT) -#if !defined(BOOTP_NFSROOT) - nfs_setup_diskless(); - if (nfs_diskless_valid) -#endif + if ((cp = getenv("bootp.nfsroot")) == NULL) + nfs_setup_diskless(); + if (cp != NULL || nfs_diskless_valid) rootdevnames[0] = "nfs:"; + if (cp != NULL) + freeenv(cp); #endif } SYSINIT(cpu_rootconf, SI_SUB_ROOT_CONF, SI_ORDER_FIRST, cpu_rootconf, NULL) diff --git a/sys/boot/common/dev_net.c b/sys/boot/common/dev_net.c index b7ccbca..2e136c4 100644 --- a/sys/boot/common/dev_net.c +++ b/sys/boot/common/dev_net.c @@ -273,7 +273,7 @@ net_getparams(sock) /* * If present, strip the server's address off of the rootpath * before passing it along. This allows us to be compatible with - * the kernel's diskless (BOOTP_NFSROOT) booting conventions + * the kernel's diskless (kenv bootp.nfsroot=1) booting conventions */ for (i = 0; rootpath[i] != '\0' && i < FNAME_SIZE; i++) if (rootpath[i] == ':') diff --git a/sys/boot/common/loader.8 b/sys/boot/common/loader.8 index a77a828..958b33b 100644 --- a/sys/boot/common/loader.8 +++ b/sys/boot/common/loader.8 @@ -352,6 +352,29 @@ by the kernel during the boot phase. List of semicolon-separated search path for bootable kernels. The default is .Dq Li kernel;kernel.old . +.It Va bootp +Setting this variable tells the kernel to use BOOTP to obtain an IP address +and hostname at boot time. +The kernel must be built with +.Dv NFSCLIENT +and +.Dv NFS_ROOT +defined. +.It Va bootp.compat +Setting this variable enables a workaround for broken BOOTP daemons. +.It Va bootp.nfsroot +Setting this variable tells the kernel to NFS mount the root filesystem using +BOOTP information. +.It Va bootp.nfsv3 +Setting this variable tells the kernel to use NFS version 3 to mount the root +filesystem. +.It Va bootp.wired_to +This variable may be set to the name of the interface that is to be used to +boot from when +.Va bootp +is set. +If it is not set, the system will attempt to boot from all available +interfaces, using the first one found. .It Va console Defines the current console. .It Va currdev diff --git a/sys/boot/forth/loader.conf b/sys/boot/forth/loader.conf index 992ab06..db43699 100644 --- a/sys/boot/forth/loader.conf +++ b/sys/boot/forth/loader.conf @@ -67,6 +67,11 @@ module_path="/boot/kernel;/boot/modules" # Set the module search path #boot_single="" # Start system in single-user mode #boot_userconfig="" # Run kernel's interactive device configuration program #boot_verbose="" # Causes extra debugging information to be printed +#bootp="" # Use BOOTP to obtain an IP address at boot time +#bootp.compat="" # Enable a workaround for broken bootp daemons +#bootp.nfsroot="" # NFS mount the root filesystem using BOOTP info +#bootp.nfsv3="" # Use NFS v3 to mount the root filesystem +#bootp.wired_to="fxp0" # Use this interface only when bootp is enabled #init_path="/sbin/init:/sbin/oinit:/sbin/init.bak:/stand/sysinstall" # Sets the list of init candidates #dumpdev="ad0s1b" # Set device for crash dumps diff --git a/sys/conf/NOTES b/sys/conf/NOTES index fd1b42a..e1cbcad 100644 --- a/sys/conf/NOTES +++ b/sys/conf/NOTES @@ -2124,14 +2124,7 @@ device pps device lpbb device pcfclock -# Kernel BOOTP support - -options BOOTP # Use BOOTP to obtain IP address/hostname - # Requires NFSCLIENT and NFS_ROOT -options BOOTP_NFSROOT # NFS mount root filesystem using BOOTP info -options BOOTP_NFSV3 # Use NFS v3 to NFS mount root -options BOOTP_COMPAT # Workaround for broken bootp daemons. -options BOOTP_WIRED_TO=fxp0 # Use interface fxp0 for BOOTP +# Kernel BOOTP support - see loader(8) # # Add tie-ins for a hardware watchdog. This only enables the hooks; diff --git a/sys/conf/files b/sys/conf/files index 7237d64..1638778 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -1573,8 +1573,8 @@ netsmb/smb_trantcp.c optional netsmb netsmb/smb_usr.c optional netsmb nfs/nfs_common.c optional nfsclient nfs/nfs_common.c optional nfsserver -nfsclient/bootp_subr.c optional bootp nfsclient -nfsclient/krpc_subr.c optional bootp nfsclient +nfsclient/bootp_subr.c standard +nfsclient/krpc_subr.c optional nfsclient nfsclient/nfs_bio.c optional nfsclient nfsclient/nfs_diskless.c optional nfsclient nfs_root nfsclient/nfs_node.c optional nfsclient diff --git a/sys/conf/options b/sys/conf/options index b593318..71cf0fe 100644 --- a/sys/conf/options +++ b/sys/conf/options @@ -310,11 +310,6 @@ ALTQ_CDNR opt_altq.h ALTQ_PRIQ opt_altq.h ALTQ_NOPCC opt_altq.h ALTQ_DEBUG opt_altq.h -BOOTP opt_bootp.h -BOOTP_COMPAT opt_bootp.h -BOOTP_NFSROOT opt_bootp.h -BOOTP_NFSV3 opt_bootp.h -BOOTP_WIRED_TO opt_bootp.h BRIDGE opt_bdg.h DEV_PF opt_pf.h DEV_PFLOG opt_pf.h diff --git a/sys/i386/i386/autoconf.c b/sys/i386/i386/autoconf.c index c213a68..3239c1d 100644 --- a/sys/i386/i386/autoconf.c +++ b/sys/i386/i386/autoconf.c @@ -43,7 +43,6 @@ __FBSDID("$FreeBSD$"); * devices are determined (from possibilities mentioned in ioconf.c), * and the drivers are initialized. */ -#include "opt_bootp.h" #include "opt_isa.h" #include "opt_nfs.h" #include "opt_nfsroot.h" @@ -181,15 +180,19 @@ configure_final(dummy) void cpu_rootconf() { -#ifdef BOOTP - bootpc_init(); -#endif + char *cp; + + if ((cp = getenv("bootp")) != NULL) { + bootpc_init(); + freeenv(cp); + } #if defined(NFSCLIENT) && defined(NFS_ROOT) -#if !defined(BOOTP_NFSROOT) - nfs_setup_diskless(); - if (nfs_diskless_valid) -#endif + if ((cp = getenv("bootp.nfsroot")) == NULL) + nfs_setup_diskless(); + if (cp != NULL || nfs_diskless_valid) rootdevnames[0] = "nfs:"; + if (cp != NULL) + freeenv(cp); #endif } SYSINIT(cpu_rootconf, SI_SUB_ROOT_CONF, SI_ORDER_FIRST, cpu_rootconf, NULL) diff --git a/sys/i386/i386/locore.s b/sys/i386/i386/locore.s index 72ef2bf..50f32d4 100644 --- a/sys/i386/i386/locore.s +++ b/sys/i386/i386/locore.s @@ -39,7 +39,6 @@ * and many others. */ -#include "opt_bootp.h" #include "opt_compat.h" #include "opt_nfsroot.h" #include "opt_pmap.h" @@ -542,7 +541,6 @@ got_common_bi_size: movsb #ifdef NFS_ROOT -#ifndef BOOTP_NFSV3 /* * If we have a nfs_diskless structure copy it in */ @@ -557,7 +555,6 @@ got_common_bi_size: movl $R(nfs_diskless_valid),%edi movl $1,(%edi) #endif -#endif /* * The old style disk boot. diff --git a/sys/ia64/ia64/autoconf.c b/sys/ia64/ia64/autoconf.c index dcfd1b0..df2e03b 100644 --- a/sys/ia64/ia64/autoconf.c +++ b/sys/ia64/ia64/autoconf.c @@ -26,7 +26,6 @@ * $FreeBSD$ */ -#include "opt_bootp.h" #include "opt_isa.h" #include "opt_nfs.h" #include "opt_nfsroot.h" @@ -54,9 +53,7 @@ static void configure(void *); SYSINIT(configure, SI_SUB_CONFIGURE, SI_ORDER_THIRD, configure, NULL) -#ifdef BOOTP void bootpc_init(void); -#endif #ifdef DEV_ISA #include <isa/isavar.h> @@ -99,18 +96,18 @@ configure(void *dummy) void cpu_rootconf() { -#if defined(NFSCLIENT) && defined(NFS_ROOT) - int order = 0; -#endif + char *cp; -#ifdef BOOTP - bootpc_init(); -#endif + if ((cp = getenv("bootp")) != NULL) { + bootpc_init(); + freeenv(cp); + cp = NULL; + } #if defined(NFSCLIENT) && defined(NFS_ROOT) -#if !defined(BOOTP_NFSROOT) - if (nfs_diskless_valid) -#endif - rootdevnames[order++] = "nfs:"; + if (nfs_diskless_valid || (cp = getenv("bootp.nfsroot")) != NULL) + rootdevnames[0] = "nfs:"; + if (cp != NULL) + freeenv(cp); #endif } SYSINIT(cpu_rootconf, SI_SUB_ROOT_CONF, SI_ORDER_FIRST, cpu_rootconf, NULL) diff --git a/sys/modules/nfs4client/Makefile b/sys/modules/nfs4client/Makefile index 723f571..0259817 100644 --- a/sys/modules/nfs4client/Makefile +++ b/sys/modules/nfs4client/Makefile @@ -6,7 +6,7 @@ KMOD= nfs4client SRCS= vnode_if.h \ nfs_bio.c nfs_lock.c nfs_node.c nfs_nfsiod.c \ nfs_common.c \ - opt_inet.h opt_nfs.h opt_bootp.h opt_nfsroot.h \ + opt_inet.h opt_nfs.h opt_nfsroot.h \ nfs4_dev.c nfs4_idmap.c nfs4_socket.c nfs4_subs.c \ nfs4_vfs_subs.c nfs4_vfsops.c nfs4_vn_subs.c nfs4_vnops.c SRCS+= opt_inet6.h diff --git a/sys/modules/nfsclient/Makefile b/sys/modules/nfsclient/Makefile index 11b83eb..688bd37 100644 --- a/sys/modules/nfsclient/Makefile +++ b/sys/modules/nfsclient/Makefile @@ -7,7 +7,7 @@ KMOD= nfsclient SRCS= vnode_if.h \ nfs_bio.c nfs_lock.c nfs_node.c nfs_socket.c nfs_subs.c nfs_nfsiod.c \ nfs_vfsops.c nfs_vnops.c nfs_common.c \ - opt_inet.h opt_nfs.h opt_bootp.h opt_nfsroot.h + opt_inet.h opt_nfs.h opt_nfsroot.h SRCS+= nfs4_dev.c nfs4_idmap.c nfs4_socket.c nfs4_subs.c \ nfs4_vfs_subs.c nfs4_vfsops.c nfs4_vn_subs.c nfs4_vnops.c SRCS+= opt_inet6.h diff --git a/sys/netinet/ip_input.c b/sys/netinet/ip_input.c index 048f613..77c8c79 100644 --- a/sys/netinet/ip_input.c +++ b/sys/netinet/ip_input.c @@ -30,7 +30,6 @@ * $FreeBSD$ */ -#include "opt_bootp.h" #include "opt_ipfw.h" #include "opt_ipdn.h" #include "opt_ipdivert.h" @@ -299,6 +298,7 @@ ip_input(struct mbuf *m) struct ipq *fp; struct in_ifaddr *ia = NULL; struct ifaddr *ifa; + char *cp; int i, checkif, hlen = 0; u_short sum; struct in_addr pkt_dst; @@ -598,10 +598,11 @@ pass: goto ours; if (ia->ia_netbroadcast.s_addr == pkt_dst.s_addr) goto ours; -#ifdef BOOTP_COMPAT - if (IA_SIN(ia)->sin_addr.s_addr == INADDR_ANY) - goto ours; -#endif + if ((cp = getenv("bootp.compat")) != NULL) { + freeenv(cp); + if (IA_SIN(ia)->sin_addr.s_addr == INADDR_ANY) + goto ours; + } } } if (IN_MULTICAST(ntohl(ip->ip_dst.s_addr))) { diff --git a/sys/nfs4client/nfs4_vfsops.c b/sys/nfs4client/nfs4_vfsops.c index e20d176..c9b3e3c 100644 --- a/sys/nfs4client/nfs4_vfsops.c +++ b/sys/nfs4client/nfs4_vfsops.c @@ -62,7 +62,6 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); -#include "opt_bootp.h" #include "opt_nfsroot.h" #include <sys/param.h> diff --git a/sys/nfsclient/bootp_subr.c b/sys/nfsclient/bootp_subr.c index 2132ef5..d68a94f 100644 --- a/sys/nfsclient/bootp_subr.c +++ b/sys/nfsclient/bootp_subr.c @@ -43,8 +43,6 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); -#include "opt_bootp.h" - #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> @@ -590,6 +588,7 @@ bootpc_call(struct bootpc_globalcontext *gctx, struct thread *td) int gotrootpath; int retry; const char *s; + char *cp; NET_ASSERT_GIANT(); @@ -954,14 +953,19 @@ bootpc_call(struct bootpc_globalcontext *gctx, struct thread *td) error = 0; goto out; } -#ifndef BOOTP_NFSROOT - for (ifctx = gctx->interfaces; ifctx != NULL; ifctx = ifctx->next) { - if (bootpc_ifctx_isresolved(ifctx) != 0) { - error = 0; - goto out; + + if ((cp = getenv("bootp.nfsroot")) != NULL) + freeenv(cp); + else { + for (ifctx = gctx->interfaces; ifctx != NULL; + ifctx = ifctx->next) { + if (bootpc_ifctx_isresolved(ifctx) != 0) { + error = 0; + goto out; + } } } -#endif + error = ETIMEDOUT; goto out; @@ -1641,10 +1645,9 @@ bootpc_init(void) struct bootpc_ifcontext *ifctx, *nctx; /* Interface BOOTP contexts */ struct bootpc_globalcontext *gctx; /* Global BOOTP context */ struct ifnet *ifp; - int error; -#ifndef BOOTP_WIRED_TO + char *cp, *bootp_wired_to; + int bootp_nfsroot, error; int ifcnt; -#endif struct nfsv3_diskless *nd; struct thread *td; @@ -1667,31 +1670,31 @@ bootpc_init(void) /* * Find a network interface. */ -#ifdef BOOTP_WIRED_TO - printf("bootpc_init: wired to interface '%s'\n", - __XSTRING(BOOTP_WIRED_TO)); - allocifctx(gctx); -#else - /* - * Preallocate interface context storage, if another interface - * attaches and wins the race, it won't be eligible for bootp. - */ - IFNET_RLOCK(); - for (ifp = TAILQ_FIRST(&ifnet), ifcnt = 0; - ifp != NULL; - ifp = TAILQ_NEXT(ifp, if_link)) { - if ((ifp->if_flags & - (IFF_LOOPBACK | IFF_POINTOPOINT | IFF_BROADCAST)) != - IFF_BROADCAST) - continue; - ifcnt++; - } - IFNET_RUNLOCK(); - if (ifcnt == 0) - panic("bootpc_init: no eligible interfaces"); - for (; ifcnt > 0; ifcnt--) + if ((bootp_wired_to = getenv("bootp.wired_to")) != NULL) { + printf("bootpc_init: wired to interface '%s'\n", + bootp_wired_to); allocifctx(gctx); -#endif + } else { + /* + * Preallocate interface context storage, if another interface + * attaches and wins the race, it won't be eligible for bootp. + */ + IFNET_RLOCK(); + for (ifp = TAILQ_FIRST(&ifnet), ifcnt = 0; + ifp != NULL; + ifp = TAILQ_NEXT(ifp, if_link)) { + if ((ifp->if_flags & + (IFF_LOOPBACK | IFF_POINTOPOINT | IFF_BROADCAST)) != + IFF_BROADCAST) + continue; + ifcnt++; + } + IFNET_RUNLOCK(); + if (ifcnt == 0) + panic("bootpc_init: no eligible interfaces"); + for (; ifcnt > 0; ifcnt--) + allocifctx(gctx); + } IFNET_RLOCK(); for (ifp = TAILQ_FIRST(&ifnet), ifctx = gctx->interfaces; @@ -1699,29 +1702,24 @@ bootpc_init(void) ifp = TAILQ_NEXT(ifp, if_link)) { strlcpy(ifctx->ireq.ifr_name, ifp->if_xname, sizeof(ifctx->ireq.ifr_name)); -#ifdef BOOTP_WIRED_TO - if (strcmp(ifctx->ireq.ifr_name, - __XSTRING(BOOTP_WIRED_TO)) != 0) - continue; -#else - if ((ifp->if_flags & - (IFF_LOOPBACK | IFF_POINTOPOINT | IFF_BROADCAST)) != + if (bootp_wired_to) { + if (strcmp(ifctx->ireq.ifr_name, bootp_wired_to) != 0) + continue; + } else if ((ifp->if_flags & + (IFF_LOOPBACK | IFF_POINTOPOINT | IFF_BROADCAST)) != IFF_BROADCAST) continue; -#endif ifctx->ifp = ifp; ifctx = ifctx->next; } IFNET_RUNLOCK(); if (gctx->interfaces == NULL || gctx->interfaces->ifp == NULL) { -#ifdef BOOTP_WIRED_TO - panic("bootpc_init: Could not find interface specified " - "by BOOTP_WIRED_TO: " - __XSTRING(BOOTP_WIRED_TO)); -#else - panic("bootpc_init: no suitable interface"); -#endif + if (bootp_wired_to) + panic("bootpc_init: Could not find interface specified " + "by bootp.wired_to: %s", bootp_wired_to); + else + panic("bootpc_init: no suitable interface"); } for (ifctx = gctx->interfaces; ifctx != NULL; ifctx = ifctx->next) @@ -1732,12 +1730,17 @@ bootpc_init(void) error = bootpc_call(gctx, td); + if ((cp = getenv("bootp.nfsroot")) != NULL) { + freeenv(cp); + bootp_nfsroot = 1; + } else + bootp_nfsroot = 0; + if (error != 0) { -#ifdef BOOTP_NFSROOT - panic("BOOTP call failed"); -#else - printf("BOOTP call failed\n"); -#endif + if (bootp_nfsroot) + panic("BOOTP call failed"); + else + printf("BOOTP call failed\n"); } mountopts(&nd->root_args, NULL); @@ -1746,10 +1749,8 @@ bootpc_init(void) if (bootpc_ifctx_isresolved(ifctx) != 0) bootpc_decode_reply(nd, ifctx, gctx); -#ifdef BOOTP_NFSROOT - if (gctx->gotrootpath == 0) + if (bootp_nfsroot && gctx->gotrootpath == 0) panic("bootpc: No root path offered"); -#endif for (ifctx = gctx->interfaces; ifctx != NULL; ifctx = ifctx->next) { bootpc_adjust_interface(ifctx, gctx, td); @@ -1795,6 +1796,8 @@ out: free(ifctx, M_TEMP); } free(gctx, M_TEMP); + if (bootp_wired_to) + freeenv(bootp_wired_to); } /* @@ -1807,27 +1810,31 @@ md_mount(struct sockaddr_in *mdsin, char *path, u_char *fhp, int *fhsizep, struct nfs_args *args, struct thread *td) { struct mbuf *m; + char *cp; int error; int authunixok; int authcount; int authver; -#ifdef BOOTP_NFSV3 - /* First try NFS v3 */ - /* Get port number for MOUNTD. */ - error = krpc_portmap(mdsin, RPCPROG_MNT, RPCMNT_VER3, - &mdsin->sin_port, td); - if (error == 0) { - m = xdr_string_encode(path, strlen(path)); + if ((cp = getenv("bootp.nfsv3")) != NULL) { + /* First try NFS v3 */ + /* Get port number for MOUNTD. */ + freeenv(cp); + error = krpc_portmap(mdsin, RPCPROG_MNT, RPCMNT_VER3, + &mdsin->sin_port, td); + if (error == 0) { + m = xdr_string_encode(path, strlen(path)); + + /* Do RPC to mountd. */ + error = krpc_call(mdsin, RPCPROG_MNT, RPCMNT_VER3, + RPCMNT_MOUNT, &m, NULL, td); + } + if (error == 0) + args->flags |= NFSMNT_NFSV3; + } else + error = 1; /* Need to try NFS v2 */ - /* Do RPC to mountd. */ - error = krpc_call(mdsin, RPCPROG_MNT, RPCMNT_VER3, - RPCMNT_MOUNT, &m, NULL, td); - } - if (error == 0) { - args->flags |= NFSMNT_NFSV3; - } else { -#endif + if (error) { /* Fallback to NFS v2 */ /* Get port number for MOUNTD. */ @@ -1843,10 +1850,7 @@ md_mount(struct sockaddr_in *mdsin, char *path, u_char *fhp, int *fhsizep, RPCMNT_MOUNT, &m, NULL, td); if (error != 0) return error; /* message already freed */ - -#ifdef BOOTP_NFSV3 } -#endif if (xdr_int_decode(&m, &error) != 0 || error != 0) goto bad; diff --git a/sys/nfsclient/nfs_vfsops.c b/sys/nfsclient/nfs_vfsops.c index 9674628..ec63a7a 100644 --- a/sys/nfsclient/nfs_vfsops.c +++ b/sys/nfsclient/nfs_vfsops.c @@ -35,7 +35,6 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); -#include "opt_bootp.h" #include "opt_nfsroot.h" #include <sys/param.h> @@ -389,16 +388,23 @@ nfs_mountroot(struct mount *mp, struct thread *td) struct nfsv3_diskless *nd = &nfsv3_diskless; struct socket *so; struct vnode *vp; + char *cp; int error, i; u_long l; char buf[128]; GIANT_REQUIRED; /* XXX until socket locking done */ -#if defined(BOOTP_NFSROOT) && defined(BOOTP) - bootpc_init(); /* use bootp to get nfs_diskless filled in */ -#elif defined(NFS_ROOT) - nfs_setup_diskless(); + if ((cp = getenv("bootp")) != NULL) { + freeenv(cp); + if ((cp = getenv("bootp.nfsroot")) != NULL) { + freeenv(cp); + bootpc_init(); /* get nfs_diskless filled in */ + } + } +#if defined(NFS_ROOT) + if (cp == NULL) + nfs_setup_diskless(); #endif if (nfs_diskless_valid == 0) |