linux-disable-pmtu-discovery-20041009
authorChaskiel M Grundman <cg2v@andrew.cmu.edu>
Sat, 9 Oct 2004 23:34:45 +0000 (23:34 +0000)
committerDerrick Brashear <shadow@dementia.org>
Sat, 9 Oct 2004 23:34:45 +0000 (23:34 +0000)
FIXES 15505

don't set DF bit; use setsockopt to turn of kernel "pmtu feature"

src/rx/LINUX/rx_knet.c
src/rx/rx_user.c

index 46d93a6..d03f485 100644 (file)
@@ -35,6 +35,8 @@ rxk_NewSocketHost(afs_uint32 ahost, short aport)
     struct socket *sockp;
     struct sockaddr_in myaddr;
     int code;
+    KERNEL_SPACE_DECL;
+    int pmtu = IP_PMTUDISC_DONT;
 
 
     /* We need a better test for this. if you need it back, tell us
@@ -64,6 +66,9 @@ rxk_NewSocketHost(afs_uint32 ahost, short aport)
        return NULL;
     }
 
+    TO_USER_SPACE();
+    sockp->ops->setsockopt(sockp, SOL_IP, IP_MTU_DISCOVER, &pmtu, sizeof(pmtu));
+    TO_KERNEL_SPACE();
     return (struct osi_socket *)sockp;
 }
 
index a3c6324..e4c7f9c 100644 (file)
@@ -100,7 +100,9 @@ rxi_GetHostUDPSocket(u_int ahost, u_short port)
     osi_socket socketFd = OSI_NULLSOCKET;
     struct sockaddr_in taddr;
     char *name = "rxi_GetUDPSocket: ";
-    int greedy = 0;
+#ifdef AFS_LINUX22_ENV
+    int pmtu=IP_PMTUDISC_DONT;
+#endif
 
 #if !defined(AFS_NT40_ENV) && !defined(AFS_DJGPP_ENV)
     if (ntohs(port) >= IPPORT_RESERVED && ntohs(port) < IPPORT_USERRESERVED) {
@@ -147,15 +149,16 @@ rxi_GetHostUDPSocket(u_int ahost, u_short port)
     fcntl(socketFd, F_SETFD, 1);
 #endif
 
+#ifndef AFS_DJGPP_ENV
     /* Use one of three different ways of getting a socket buffer expanded to
      * a reasonable size.
      */
     {
+       int greedy = 0;
        int len1, len2;
 
        len1 = 32766;
        len2 = rx_UdpBufSize;
-#ifndef AFS_DJGPP_ENV
        greedy =
            (setsockopt
             (socketFd, SOL_SOCKET, SO_RCVBUF, (char *)&len2,
@@ -172,14 +175,19 @@ rxi_GetHostUDPSocket(u_int ahost, u_short port)
            (setsockopt
             (socketFd, SOL_SOCKET, SO_RCVBUF, (char *)&len2,
              sizeof(len2)) >= 0);
-#endif /* AFS_DJGPP_ENV */
+       if (!greedy)
+           (osi_Msg "%s*WARNING* Unable to increase buffering on socket\n",
+            name);
+       MUTEX_ENTER(&rx_stats_mutex);
+       rx_stats.socketGreedy = greedy;
+       MUTEX_EXIT(&rx_stats_mutex);
     }
-
-#ifndef AFS_DJGPP_ENV
-    if (!greedy)
-       (osi_Msg "%s*WARNING* Unable to increase buffering on socket\n",
-        name);
 #endif /* AFS_DJGPP_ENV */
+
+#ifdef AFS_LINUX22_ENV
+    setsockopt(socketFd, SOL_IP, IP_MTU_DISCOVER, &pmtu, sizeof(pmtu));
+#endif
+
     if (rxi_Listen(socketFd) < 0) {
        goto error;
     }
@@ -195,9 +203,6 @@ rxi_GetHostUDPSocket(u_int ahost, u_short port)
        close(socketFd);
 #endif
 
-    MUTEX_ENTER(&rx_stats_mutex);
-    rx_stats.socketGreedy = greedy;
-    MUTEX_EXIT(&rx_stats_mutex);
     return OSI_NULLSOCKET;
 }