]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
2444. [port] Linux, FreeBSD, AIX: Turn of path mtu discovery
authorMark Andrews <marka@isc.org>
Tue, 23 Sep 2008 02:20:21 +0000 (02:20 +0000)
committerMark Andrews <marka@isc.org>
Tue, 23 Sep 2008 02:20:21 +0000 (02:20 +0000)
                        (clear DF) for UDP responses and requests.

CHANGES
lib/isc/unix/socket.c

diff --git a/CHANGES b/CHANGES
index e0c725d3e8a99e213e17b9c225e09c8bd0faf6b8..99a3773f6c5b57732b42ae51bfc9da537aa68ae5 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+2444.  [port]          Linux, FreeBSD, AIX: Turn of path mtu discovery
+                       (clear DF) for UDP responses and requests.
+
 2443.  [bug]           win32: UDP connect() would not generate an event,
                        and so connected UDP sockets would never clean up.
                        Fix this by doing an immediate WSAConnect() rather
index a895405bea3a247aa9ca53a2920bc5ca756aafa0..531bac1a4678b77b1cc4a77642a4ff75f6256a5b 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: socket.c,v 1.302 2008/09/04 05:56:43 marka Exp $ */
+/* $Id: socket.c,v 1.303 2008/09/23 02:20:21 marka Exp $ */
 
 /*! \file */
 
@@ -2031,6 +2031,27 @@ opensocket(isc_socketmgr_t *manager, isc_socket_t *sock) {
 #endif /* ISC_PLATFORM_HAVEIPV6 */
 #endif /* defined(USE_CMSG) */
 
+#if defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DONT)
+               /*
+                * Turn off Path MTU discovery on IPv4/UDP sockets.
+                */
+               if (sock->pf == AF_INET) {
+                       int action = IP_PMTUDISC_DONT;
+                       (void)setsockopt(sock->fd, IPPROTO_IP, IP_MTU_DISCOVER,
+                                        &action, sizeof(action));
+               }
+#endif
+#if defined(IP_DONTFRAG)
+               /*
+                * Turn off Path MTU discovery on IPv4/UDP sockets.
+                */
+               if (sock->pf == AF_INET) {
+                       int off = 0;
+                       (void)setsockopt(sock->fd, IPPROTO_IP, IP_DONTFRAG,
+                                        &off, sizeof(off));
+               }
+#endif
+
 #if defined(SO_RCVBUF)
                optlen = sizeof(size);
                if (getsockopt(sock->fd, SOL_SOCKET, SO_RCVBUF,