Print this page
4953763 Need way to configure NFS window sizes without changing system wide defaults
6216670 NFS server needs a bigger transmit buffer

@@ -126,10 +126,23 @@
  * Set the default for server delegation enablement and set per
  * /etc/default/nfs configuration (if present).
  */
 int     nfs_server_delegation = NFS_SERVER_DELEGATION_DEFAULT;
 
+/*
+ * Default values for TCP send and receive buffer size of NFS server
+ * connections.
+ *
+ * These values can be tuned by user via /etc/default/nfs configuration
+ * file by setting NFS_SERVER_SNDBUFSZ and NFS_SERVER_RCVBUFSZ.
+ *
+ * To force NFS connections to use system-wide default for TCP send and
+ * receive buffer, set NFS_SERVER_SNDBUFSZ and NFS_SERVER_RCVBUFSZ to 0.
+ */
+int     nfs_server_sndbufsz = 1048576;
+int     nfs_server_rcvbufsz = 1048576;
+
 int
 main(int ac, char *av[])
 {
         char *dir = "/";
         int allflag = 0;

@@ -137,11 +150,11 @@
         int opt_cnt = 0;
         int maxservers = 1;     /* zero allows inifinte number of threads */
         int maxservers_set = 0;
         int logmaxservers = 0;
         int pid;
-        int i;
+        int i, bufsz;
         char *provider = (char *)NULL;
         char *df_provider = (char *)NULL;
         struct protob *protobp0, *protobp;
         NETSELDECL(proto) = NULL;
         NETSELDECL(df_proto) = NULL;

@@ -233,10 +246,22 @@
                 if ((defval = defread("NFS_SERVER_DELEGATION=")) != NULL) {
                         if (strcmp(defval, "off") == 0) {
                                 nfs_server_delegation = FALSE;
                         }
                 }
+                if ((defval = defread("NFS_SERVER_SNDBUFSZ=")) != NULL) {
+                        errno = 0;
+                        bufsz = strtol(defval, (char **)NULL, 10);
+                        if (errno == 0)
+                                nfs_server_sndbufsz = bufsz;
+                }
+                if ((defval = defread("NFS_SERVER_RCVBUFSZ=")) != NULL) {
+                        errno = 0;
+                        bufsz = strtol(defval, (char **)NULL, 10);
+                        if (errno == 0)
+                                nfs_server_rcvbufsz = bufsz;
+                }
 
                 /* close defaults file */
                 defopen(NULL);
         }
 

@@ -532,11 +557,12 @@
             NFS_ACL_V3 : nfs_server_vers_max;
         protobp->program = NFS_ACL_PROGRAM;
         protobp->next = (struct protob *)NULL;
 
         if (allflag) {
-                if (do_all(protobp0, nfssvc, 0) == -1) {
+                if (do_all_setbuf(protobp0, nfssvc, 0, nfs_server_sndbufsz,
+                    nfs_server_rcvbufsz) == -1) {
                         fprintf(stderr, "setnetconfig failed : %s",
                             strerror(errno));
                         exit(1);
                 }
         } else if (proto) {

@@ -550,27 +576,30 @@
                         goto done;
                 }
                 while (nconf = getnetconfig(nc)) {
                         if (strcmp(nconf->nc_proto, proto) == 0) {
                                 protoFound = TRUE;
-                                do_one(nconf->nc_device, NULL,
-                                    protobp0, nfssvc, 0);
+                                do_one_setbuf(nconf->nc_device, NULL,
+                                    protobp0, nfssvc, 0,
+                                    nfs_server_sndbufsz, nfs_server_rcvbufsz);
                         }
                 }
                 (void) endnetconfig(nc);
                 if (protoFound == FALSE) {
                         fprintf(stderr,
                             "couldn't find netconfig entry for protocol %s",
                             proto);
                 }
         } else if (provider)
-                do_one(provider, proto, protobp0, nfssvc, 0);
+                do_one_setbuf(provider, proto, protobp0, nfssvc, 0,
+                    nfs_server_sndbufsz, nfs_server_rcvbufsz);
         else {
                 for (providerp = defaultproviders;
                     *providerp != NULL; providerp++) {
                         provider = *providerp;
-                        do_one(provider, NULL, protobp0, nfssvc, 0);
+                        do_one_setbuf(provider, NULL, protobp0, nfssvc, 0,
+                            nfs_server_sndbufsz, nfs_server_rcvbufsz);
                 }
         }
 done:
 
         free(protobp);