Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 31 May 2016 17:01:54 +0000 (UTC)
From:      Ian Lepore <ian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r301056 - in stable/10: lib/libstand sys/boot/common sys/boot/i386/libi386 sys/boot/libstand32 sys/boot/userboot/libstand sys/nfs
Message-ID:  <201605311701.u4VH1seM006215@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ian
Date: Tue May 31 17:01:54 2016
New Revision: 301056
URL: https://svnweb.freebsd.org/changeset/base/301056

Log:
  MFC r297147, r297148, r297149, r297150, r297151:
  
    Make both the loader and kernel use the interface-mtu option if the
    dhcp server provides it.  Made up of these (semi-)related changes...
  
    [kernel...] If the dhcp server provides an interface-mtu option, parse
    the value and set that mtu on the interface.
  
    [libstand...]
  
    Garbage collect the bswap routines from libstand, use sys/endian.h.
  
    If the dhcp server delivers an interface-mtu option, parse it and store
    the value in a new global intf_mtu for use by the application.
  
    [loader...]
  
    If the dhcp server provided an interface-mtu option, transcribe the value
    to the boot.netif.mtu env var, which will be picked up by pre-existing code
    in nfs_mountroot() and used to configure the interface accordingly.
  
  PR:		187094

Deleted:
  stable/10/lib/libstand/bswap.c
Modified:
  stable/10/lib/libstand/Makefile
  stable/10/lib/libstand/bootp.c
  stable/10/lib/libstand/bootp.h
  stable/10/lib/libstand/globals.c
  stable/10/lib/libstand/net.h
  stable/10/lib/libstand/stand.h
  stable/10/sys/boot/common/dev_net.c
  stable/10/sys/boot/i386/libi386/pxe.c
  stable/10/sys/boot/libstand32/Makefile
  stable/10/sys/boot/userboot/libstand/Makefile
  stable/10/sys/nfs/bootp_subr.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/lib/libstand/Makefile
==============================================================================
--- stable/10/lib/libstand/Makefile	Tue May 31 16:58:00 2016	(r301055)
+++ stable/10/lib/libstand/Makefile	Tue May 31 17:01:54 2016	(r301056)
@@ -43,7 +43,7 @@ CFLAGS+=	-G0 -fno-pic -mno-abicalls
 .endif
 
 # standalone components and stuff we have modified locally
-SRCS+=	gzguts.h zutil.h __main.c assert.c bcd.c bswap.c environment.c getopt.c gets.c \
+SRCS+=	gzguts.h zutil.h __main.c assert.c bcd.c environment.c getopt.c gets.c \
 	globals.c pager.c printf.c strdup.c strerror.c strtol.c strtoul.c random.c \
 	sbrk.c twiddle.c zalloc.c zalloc_malloc.c
 

Modified: stable/10/lib/libstand/bootp.c
==============================================================================
--- stable/10/lib/libstand/bootp.c	Tue May 31 16:58:00 2016	(r301055)
+++ stable/10/lib/libstand/bootp.c	Tue May 31 17:01:54 2016	(r301056)
@@ -39,6 +39,7 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/types.h>
+#include <sys/endian.h>
 #include <netinet/in.h>
 #include <netinet/in_systm.h>
 
@@ -393,6 +394,13 @@ vend_rfc1048(cp, len)
 				val = (const char *)cp;
 			strlcpy(hostname, val, sizeof(hostname));
 		}
+		if (tag == TAG_INTF_MTU) {
+			if ((val = getenv("dhcp.interface-mtu")) != NULL) {
+				intf_mtu = (u_int)strtoul(val, NULL, 0);
+			} else {
+				intf_mtu = be16dec(cp);
+			}
+		}
 #ifdef SUPPORT_DHCP
 		if (tag == TAG_DHCP_MSGTYPE) {
 			if(*cp != expected_dhcpmsgtype)

Modified: stable/10/lib/libstand/bootp.h
==============================================================================
--- stable/10/lib/libstand/bootp.h	Tue May 31 16:58:00 2016	(r301055)
+++ stable/10/lib/libstand/bootp.h	Tue May 31 17:01:54 2016	(r301056)
@@ -91,6 +91,7 @@ struct bootp {
 #define TAG_DOMAINNAME		((unsigned char)  15)
 #define TAG_SWAPSERVER		((unsigned char)  16)
 #define TAG_ROOTPATH		((unsigned char)  17)
+#define TAG_INTF_MTU		((unsigned char)  26)
 
 #ifdef SUPPORT_DHCP
 #define TAG_REQ_ADDR		((unsigned char)  50)

Modified: stable/10/lib/libstand/globals.c
==============================================================================
--- stable/10/lib/libstand/globals.c	Tue May 31 16:58:00 2016	(r301055)
+++ stable/10/lib/libstand/globals.c	Tue May 31 17:01:54 2016	(r301056)
@@ -32,5 +32,6 @@ struct	in_addr rootip;			/* root ip addr
 struct	in_addr swapip;			/* swap ip address */
 struct	in_addr gateip;			/* swap ip address */
 n_long	netmask = 0xffffff00;		/* subnet or net mask */
+u_int	intf_mtu;			/* interface mtu from bootp/dhcp */
 int	errno;				/* our old friend */
 

Modified: stable/10/lib/libstand/net.h
==============================================================================
--- stable/10/lib/libstand/net.h	Tue May 31 16:58:00 2016	(r301055)
+++ stable/10/lib/libstand/net.h	Tue May 31 17:01:54 2016	(r301056)
@@ -83,6 +83,7 @@ extern	struct in_addr swapip;
 extern	struct in_addr gateip;
 extern	struct in_addr nameip;
 extern	n_long netmask;
+extern	u_int intf_mtu;
 
 extern	int debug;			/* defined in the machdep sources */
 

Modified: stable/10/lib/libstand/stand.h
==============================================================================
--- stable/10/lib/libstand/stand.h	Tue May 31 16:58:00 2016	(r301055)
+++ stable/10/lib/libstand/stand.h	Tue May 31 17:01:54 2016	(r301056)
@@ -334,11 +334,6 @@ static __inline quad_t qmin(quad_t a, qu
 static __inline u_long ulmax(u_long a, u_long b) { return (a > b ? a : b); }
 static __inline u_long ulmin(u_long a, u_long b) { return (a < b ? a : b); }
 
-/* swaps (undocumented, useful?) */
-#ifdef __i386__
-extern u_int32_t	bswap32(u_int32_t x);
-extern u_int64_t	bswap64(u_int64_t x);
-#endif
 
 /* null functions for device/filesystem switches (undocumented) */
 extern int	nodev(void);

Modified: stable/10/sys/boot/common/dev_net.c
==============================================================================
--- stable/10/sys/boot/common/dev_net.c	Tue May 31 16:58:00 2016	(r301055)
+++ stable/10/sys/boot/common/dev_net.c	Tue May 31 17:01:54 2016	(r301056)
@@ -171,6 +171,12 @@ net_open(struct open_file *f, ...)
 		setenv("boot.netif.gateway", inet_ntoa(gateip), 1);
 		setenv("boot.nfsroot.server", inet_ntoa(rootip), 1);
 		setenv("boot.nfsroot.path", rootpath, 1);
+		if (intf_mtu != 0) {
+			char mtu[16];
+			sprintf(mtu, "%u", intf_mtu);
+			setenv("boot.netif.mtu", mtu, 1);
+		}
+
 	}
 	netdev_opens++;
 	f->f_devdata = &netdev_sock;

Modified: stable/10/sys/boot/i386/libi386/pxe.c
==============================================================================
--- stable/10/sys/boot/i386/libi386/pxe.c	Tue May 31 16:58:00 2016	(r301055)
+++ stable/10/sys/boot/i386/libi386/pxe.c	Tue May 31 17:01:54 2016	(r301056)
@@ -312,6 +312,11 @@ pxe_open(struct open_file *f, ...)
 		    sprintf(temp, "%6D", bootplayer.CAddr, ":");
 		    setenv("boot.netif.hwaddr", temp, 1);
 		}
+		if (intf_mtu != 0) {
+			char mtu[16];
+			sprintf(mtu, "%u", intf_mtu);
+			setenv("boot.netif.mtu", mtu, 1);
+		}
 		setenv("boot.nfsroot.server", inet_ntoa(rootip), 1);
 		setenv("boot.nfsroot.path", rootpath, 1);
 		setenv("dhcp.host-name", hostname, 1);

Modified: stable/10/sys/boot/libstand32/Makefile
==============================================================================
--- stable/10/sys/boot/libstand32/Makefile	Tue May 31 16:58:00 2016	(r301055)
+++ stable/10/sys/boot/libstand32/Makefile	Tue May 31 17:01:54 2016	(r301056)
@@ -45,7 +45,7 @@ CFLAGS+=	-G0 -fno-pic -mno-abicalls
 .endif
 
 # standalone components and stuff we have modified locally
-SRCS+=	gzguts.h zutil.h __main.c assert.c bcd.c bswap.c environment.c getopt.c gets.c \
+SRCS+=	gzguts.h zutil.h __main.c assert.c bcd.c environment.c getopt.c gets.c \
 	globals.c pager.c printf.c strdup.c strerror.c strtol.c strtoul.c random.c \
 	sbrk.c twiddle.c zalloc.c zalloc_malloc.c
 

Modified: stable/10/sys/boot/userboot/libstand/Makefile
==============================================================================
--- stable/10/sys/boot/userboot/libstand/Makefile	Tue May 31 16:58:00 2016	(r301055)
+++ stable/10/sys/boot/userboot/libstand/Makefile	Tue May 31 17:01:54 2016	(r301056)
@@ -42,7 +42,7 @@ CFLAGS+=	-msoft-float -D_STANDALONE
 .endif
 
 # standalone components and stuff we have modified locally
-SRCS+=	gzguts.h zutil.h __main.c assert.c bcd.c bswap.c environment.c getopt.c gets.c \
+SRCS+=	gzguts.h zutil.h __main.c assert.c bcd.c environment.c getopt.c gets.c \
 	globals.c pager.c printf.c strdup.c strerror.c strtol.c random.c \
 	sbrk.c twiddle.c zalloc.c zalloc_malloc.c
 

Modified: stable/10/sys/nfs/bootp_subr.c
==============================================================================
--- stable/10/sys/nfs/bootp_subr.c	Tue May 31 16:58:00 2016	(r301055)
+++ stable/10/sys/nfs/bootp_subr.c	Tue May 31 17:01:54 2016	(r301056)
@@ -49,6 +49,7 @@ __FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
 #include <sys/systm.h>
+#include <sys/endian.h>
 #include <sys/jail.h>
 #include <sys/kernel.h>
 #include <sys/sockio.h>
@@ -154,6 +155,7 @@ struct bootpc_ifcontext {
 	int dhcpquerytype;		/* dhcp type sent */
 	struct in_addr dhcpserver;
 	int gotdhcpserver;
+	uint16_t mtu;
 };
 
 #define TAG_MAXLEN 1024
@@ -195,6 +197,7 @@ struct bootpc_globalcontext {
 #define TAG_ROUTERS	  3  /* Routers (in order of preference) */
 #define TAG_HOSTNAME	 12  /* Client host name */
 #define TAG_ROOT	 17  /* Root path */
+#define TAG_INTF_MTU	 26  /* Interface MTU Size (RFC2132) */
 
 /* DHCP specific tags */
 #define TAG_OVERLOAD	 52  /* Option Overload */
@@ -1030,7 +1033,19 @@ bootpc_adjust_interface(struct bootpc_if
 		return (0);
 	}
 
-	printf("Adjusted interface %s\n", ifctx->ireq.ifr_name);
+	printf("Adjusted interface %s", ifctx->ireq.ifr_name);
+
+	/* Do BOOTP interface options */
+	if (ifctx->mtu != 0) {
+		printf(" (MTU=%d%s)", ifctx->mtu, 
+		    (ifctx->mtu > 1514) ? "/JUMBO" : "");
+		ifr->ifr_mtu = ifctx->mtu;
+		error = ifioctl(bootp_so, SIOCSIFMTU, (caddr_t) ifr, td);
+		if (error != 0)
+			panic("%s: SIOCSIFMTU, error=%d", __func__, error);
+	}
+	printf("\n");
+
 	/*
 	 * Do enough of ifconfig(8) so that the chosen interface
 	 * can talk to the servers.  (just set the address)
@@ -1518,6 +1533,11 @@ bootpc_decode_reply(struct nfsv3_diskles
 		p[i] = '\0';
 	}
 
+	p = bootpc_tag(&gctx->tag, &ifctx->reply, ifctx->replylen,
+		       TAG_INTF_MTU);
+	if (p != NULL) {
+		ifctx->mtu = be16dec(p);
+	}
 
 	printf("\n");
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201605311701.u4VH1seM006215>