Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/nfs Add support to honor MTU settings from DHCP during n...



details:   https://anonhg.NetBSD.org/src/rev/995e5448eb3d
branches:  trunk
changeset: 757933:995e5448eb3d
user:      cyber <cyber%NetBSD.org@localhost>
date:      Mon Oct 04 23:48:22 2010 +0000

description:
Add support to honor MTU settings from DHCP during netboot.

Defines IP_MIN_MTU as 576.

Glanced over quickly by martin@ and joerg@.

diffstat:

 sys/nfs/nfs_boot.c     |  54 ++++++++++++++++++++++++++++++++++++++++++++++++-
 sys/nfs/nfs_bootdhcp.c |  27 ++++++++++++++++++++++--
 sys/nfs/nfsdiskless.h  |   8 ++++--
 3 files changed, 81 insertions(+), 8 deletions(-)

diffs (217 lines):

diff -r a96586a5bead -r 995e5448eb3d sys/nfs/nfs_boot.c
--- a/sys/nfs/nfs_boot.c        Mon Oct 04 22:31:53 2010 +0000
+++ b/sys/nfs/nfs_boot.c        Mon Oct 04 23:48:22 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: nfs_boot.c,v 1.79 2009/03/04 06:56:25 nisimura Exp $   */
+/*     $NetBSD: nfs_boot.c,v 1.80 2010/10/04 23:48:22 cyber Exp $      */
 
 /*-
  * Copyright (c) 1995, 1997 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nfs_boot.c,v 1.79 2009/03/04 06:56:25 nisimura Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nfs_boot.c,v 1.80 2010/10/04 23:48:22 cyber Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_nfs.h"
@@ -91,6 +91,8 @@
 int nfs_boot_bootstatic = 1; /* BOOTSTATIC enabled (default) */
 #endif
 
+#define IP_MIN_MTU 576
+
 /* mountd RPC */
 static int md_mount(struct sockaddr_in *mdsin, char *path,
        struct nfs_args *argp, struct lwp *l);
@@ -155,6 +157,12 @@
                return (error);
 
        /*
+        * Set MTU if passed
+        */
+       if (nd->nd_mtu >= IP_MIN_MTU )
+               nfs_boot_setmtu(nd->nd_ifp, nd->nd_mtu, lwp);
+       
+       /*
         * If the gateway address is set, add a default route.
         * (The mountd RPCs may go across a gateway.)
         */
@@ -236,6 +244,48 @@
        return (error);
 }
 
+void
+nfs_boot_setmtu(struct ifnet *ifp, int mtu, struct lwp *lwp)
+{
+       struct socket *so;
+       struct ifreq ireq;
+       int error;
+
+       memset(&ireq, 0, sizeof(ireq));
+       memcpy(ireq.ifr_name, ifp->if_xname, IFNAMSIZ);
+
+       /*
+        * Get a socket to use for various things in here.
+        * After this, use "goto out" to cleanup and return.
+        */
+       error = socreate(AF_INET, &so, SOCK_DGRAM, 0, lwp, NULL);
+       if (error) {
+               printf("setmtu: socreate, error=%d\n", error);
+               return;
+       }
+
+       /*
+        * Get structure, set the new MTU, push structure.
+        */
+       error = ifioctl(so, SIOCGIFMTU, (void *)&ireq, lwp);
+       if (error) {
+               printf("setmtu: GIFMTU, error=%d\n", error);
+               goto out;
+       }
+
+       ireq.ifr_mtu = mtu;
+
+       error = ifioctl(so, SIOCSIFMTU, &ireq, lwp);
+       if (error) {
+               printf("setmtu: SIFMTU, error=%d\n", error);
+               goto out;
+       }
+
+out:
+       soclose(so);
+       return;
+}
+
 int
 nfs_boot_setaddress(struct ifnet *ifp, struct lwp *lwp,
                uint32_t addr, uint32_t netmask, uint32_t braddr)
diff -r a96586a5bead -r 995e5448eb3d sys/nfs/nfs_bootdhcp.c
--- a/sys/nfs/nfs_bootdhcp.c    Mon Oct 04 22:31:53 2010 +0000
+++ b/sys/nfs/nfs_bootdhcp.c    Mon Oct 04 23:48:22 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: nfs_bootdhcp.c,v 1.51 2009/07/10 12:16:31 roy Exp $    */
+/*     $NetBSD: nfs_bootdhcp.c,v 1.52 2010/10/04 23:48:22 cyber Exp $  */
 
 /*-
  * Copyright (c) 1995, 1997 The NetBSD Foundation, Inc.
@@ -44,7 +44,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nfs_bootdhcp.c,v 1.51 2009/07/10 12:16:31 roy Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nfs_bootdhcp.c,v 1.52 2010/10/04 23:48:22 cyber Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_nfs_boot.h"
@@ -176,6 +176,8 @@
 #define TAG_DOMAIN_NAME                ((unsigned char)  15)
 #define TAG_SWAP_SERVER                ((unsigned char)  16)
 #define TAG_ROOT_PATH          ((unsigned char)  17)
+/* RFC 2132 */
+#define TAG_INTERFACE_MTU      ((unsigned char)  26)
 /* End of stuff from bootp.h */
 
 #ifdef NFS_BOOT_DHCP
@@ -203,6 +205,8 @@
 #define DHCPRELEASE 7
 #endif
 
+#define IP_MIN_MTU 576
+
 #ifdef NFS_BOOT_DHCP
 #define BOOTP_SIZE_MAX (sizeof(struct bootp)+312-64)
 #else
@@ -453,13 +457,14 @@
        int vcilen;
        
        *area++ = TAG_PARAM_REQ;
-       *area++ = 6;
+       *area++ = 7;
        *area++ = TAG_SUBNET_MASK;
        *area++ = TAG_GATEWAY;
        *area++ = TAG_HOST_NAME;
        *area++ = TAG_DOMAIN_NAME;
        *area++ = TAG_ROOT_PATH;
        *area++ = TAG_SWAP_SERVER;
+       *area++ = TAG_INTERFACE_MTU;
 
        /* Insert a NetBSD Vendor Class Identifier option. */
        snprintf(vci, sizeof(vci), "%s:%s:kernel:%s", ostype, MACHINE,
@@ -699,6 +704,7 @@
        char *myname;   /* my hostname */
        char *mydomain; /* my domainname */
        char *rootpath;
+       uint16_t myinterfacemtu;
        int mynamelen;
        int mydomainlen;
        int rootpathlen;
@@ -716,6 +722,8 @@
        rootserver = bootp->bp_siaddr;
        /* assume that server name field is not overloaded by default */
        overloaded = 0;
+       /* MTU can't be less than IP_MIN_MTU, set to 0 to indicate unset */
+       myinterfacemtu = 0;
 
        p = &bootp->bp_vend[4];
        limit = ((u_char*)bootp) + replylen;
@@ -776,6 +784,15 @@
                        rootpath = p;
                        rootpathlen = len;
                        break;
+                   case TAG_INTERFACE_MTU:
+                       if (len != 2) {
+                               printf("nfs_boot: interface-mtu len != 2 (%d)",
+                                       len);
+                               break;
+                       }
+                       memcpy(&myinterfacemtu, p, 2);
+                       myinterfacemtu = ntohs(myinterfacemtu);
+                       break;
                    case TAG_SWAP_SERVER:
                        /* override NFS server address */
                        if (len < 4) {
@@ -831,6 +848,10 @@
                printf("nfs_boot: gateway=%s\n", inet_ntoa(nd->nd_gwip));
                *flags |= NFS_BOOT_HAS_GWIP;
        }
+       if (myinterfacemtu >= IP_MIN_MTU) {
+               nd->nd_mtu = myinterfacemtu;
+               printf("nfs_boot: mtu=%d\n", nd->nd_mtu);
+       }
 
        /*
         * Store the information about our NFS root mount.
diff -r a96586a5bead -r 995e5448eb3d sys/nfs/nfsdiskless.h
--- a/sys/nfs/nfsdiskless.h     Mon Oct 04 22:31:53 2010 +0000
+++ b/sys/nfs/nfsdiskless.h     Mon Oct 04 23:48:22 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: nfsdiskless.h,v 1.29 2008/10/27 10:58:23 cegger Exp $  */
+/*     $NetBSD: nfsdiskless.h,v 1.30 2010/10/04 23:48:23 cyber Exp $   */
 
 /*-
  * Copyright (c) 1995, 1997 The NetBSD Foundation, Inc.
@@ -56,6 +56,7 @@
        struct in_addr nd_myip; /* My IP address */
        struct in_addr nd_mask; /* My netmask */
        struct in_addr nd_gwip; /* My gateway */
+       int nd_mtu;             /* Interface MTU */
        /* Information for each mount point we need. */
        struct nfs_dlmount nd_root;     /* Mount info for root */
 #ifdef TFTPROOT
@@ -65,11 +66,12 @@
 };
 
 #ifdef _KERNEL
-int nfs_boot_init (struct nfs_diskless *nd, struct lwp *lwp);
-void nfs_boot_cleanup (struct nfs_diskless *nd, struct lwp *lwp);
+int nfs_boot_init (struct nfs_diskless *, struct lwp *);
+void nfs_boot_cleanup (struct nfs_diskless *, struct lwp *);
 int nfs_boot_ifupdown (struct ifnet *, struct lwp *, int);
 int nfs_boot_setaddress (struct ifnet *, struct lwp *,
                             uint32_t, uint32_t, uint32_t);
+void nfs_boot_setmtu (struct ifnet *, int, struct lwp *);
 int nfs_boot_deladdress (struct ifnet *, struct lwp *, uint32_t);
 void nfs_boot_flushrt (struct ifnet *);
 int nfs_boot_setrecvtimo (struct socket *);



Home | Main Index | Thread Index | Old Index