]> git.ipfire.org Git - thirdparty/openvpn.git/commitdiff
Fix --mtu-disc option with IPv6 transport
authorJulien Muchembled <jm@nexedi.com>
Sat, 10 Oct 2015 09:44:51 +0000 (11:44 +0200)
committerGert Doering <gert@greenie.muc.de>
Sat, 10 Oct 2015 09:58:41 +0000 (11:58 +0200)
Socket configuration of MTU discovery was done unconditionally at IP level,
which has no effect for other protocols. This fixes the issue of OpenVPN
sending fragmented tcp6/udp6 packets even when 'mtu-disc yes' option is
passed.

Patch V2 (by Arne Schwabe): Rebase to current master and have
separate #ifdefs for IPv4 an IPv6

Signed-off-by: Julien Muchembled <jm@nexedi.com>
Acked-by: Arne Schwabe <arne@rfc2549.org>
Acked-by: Gert Doering <gert@greenie.muc.de>
Message-Id: <1444470291-2980-1-git-send-email-arne@rfc2549.org>
URL: http://article.gmane.org/gmane.network.openvpn.devel/10229
Signed-off-by: Gert Doering <gert@greenie.muc.de>
src/openvpn/mtu.c
src/openvpn/mtu.h
src/openvpn/socket.c

index 3665a34ddd05bbb7ce66620fc3dca49078837145..24531c92a8b93cdb21f7eac87923482d4057c6e7 100644 (file)
@@ -153,17 +153,32 @@ frame_print (const struct frame *frame,
 #define MTUDISC_NOT_SUPPORTED_MSG "--mtu-disc is not supported on this OS"
 
 void
-set_mtu_discover_type (int sd, int mtu_type)
+set_mtu_discover_type (int sd, int mtu_type, sa_family_t proto_af)
 {
   if (mtu_type >= 0)
     {
-#if defined(HAVE_SETSOCKOPT) && defined(SOL_IP) && defined(IP_MTU_DISCOVER)
-      if (setsockopt (sd, SOL_IP, IP_MTU_DISCOVER, (void *) &mtu_type, sizeof (mtu_type)))
-       msg (M_ERR, "Error setting IP_MTU_DISCOVER type=%d on TCP/UDP socket",
-            mtu_type);
-#else
-      msg (M_FATAL, MTUDISC_NOT_SUPPORTED_MSG);
+      switch (proto_af)
+       {
+#if defined(HAVE_SETSOCKOPT) && defined(IP_MTU_DISCOVER)
+       case AF_INET:
+         if (setsockopt
+             (sd, IPPROTO_IP, IP_MTU_DISCOVER, &mtu_type, sizeof (mtu_type)))
+           msg (M_ERR, "Error setting IP_MTU_DISCOVER type=%d on TCP/UDP socket",
+                mtu_type);
+         break;
+#endif
+#if defined(HAVE_SETSOCKOPT) && defined(IPV6_MTU_DISCOVER)
+       case AF_INET6:
+         if (setsockopt
+             (sd, IPPROTO_IPV6, IPV6_MTU_DISCOVER, &mtu_type, sizeof (mtu_type)))
+           msg (M_ERR, "Error setting IPV6_MTU_DISCOVER type=%d on TCP6/UDP6 socket",
+                mtu_type);
+         break;
 #endif
+       default:
+         msg (M_FATAL, MTUDISC_NOT_SUPPORTED_MSG);
+         break;
+       }
     }
 }
 
index bccd6810fdec5dea3e54d50df80045afaf77dc72..f94de89b73c3f902c30941f5cdb3615ab8a787c8 100644 (file)
@@ -207,7 +207,7 @@ void frame_print (const struct frame *frame,
                  int level,
                  const char *prefix);
 
-void set_mtu_discover_type (int sd, int mtu_type);
+void set_mtu_discover_type (int sd, int mtu_type, sa_family_t proto_af);
 int translate_mtu_discover_type_name (const char *name);
 
 /*
index bd8dcb1bcdb3cb9ec006b5f4b128e1aa89d1a330..925665c521326456f2d20b7c058189d30e5ab28e 100644 (file)
@@ -1676,7 +1676,7 @@ phase2_set_socket_flags (struct link_socket* sock)
     set_cloexec (sock->ctrl_sd);
 
   /* set Path MTU discovery options on the socket */
-  set_mtu_discover_type (sock->sd, sock->mtu_discover_type);
+  set_mtu_discover_type (sock->sd, sock->mtu_discover_type, sock->info.af);
 
 #if EXTENDED_SOCKET_ERROR_CAPABILITY
   /* if the OS supports it, enable extended error passing on the socket */