From d764e768f94464021462e4b53c40a467eb4840f3 Mon Sep 17 00:00:00 2001 From: Chaskiel M Grundman Date: Sat, 9 Oct 2004 23:34:45 +0000 Subject: [PATCH] linux-disable-pmtu-discovery-20041009 FIXES 15505 don't set DF bit; use setsockopt to turn of kernel "pmtu feature" --- src/rx/LINUX/rx_knet.c | 5 +++++ src/rx/rx_user.c | 27 ++++++++++++++++----------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/rx/LINUX/rx_knet.c b/src/rx/LINUX/rx_knet.c index 46d93a6..d03f485 100644 --- a/src/rx/LINUX/rx_knet.c +++ b/src/rx/LINUX/rx_knet.c @@ -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; } diff --git a/src/rx/rx_user.c b/src/rx/rx_user.c index a3c6324..e4c7f9c 100644 --- a/src/rx/rx_user.c +++ b/src/rx/rx_user.c @@ -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; } -- 1.9.4