Message ID | 20220222143514.3480-1-gert@greenie.muc.de |
---|---|
State | Accepted |
Headers | show |
Series | [Openvpn-devel] Implement --mtu-disc for IPv6 UDP sockets. | expand |
Am 22.02.22 um 15:35 schrieb Gert Doering: > Commit 4225114b96 repaired "--mtu-disc yes" brokenness for IPv4 UDP sockets > (caused by autoconf/ifdef issues). This patch adds new functionality > to do --mtu-disc for IPv6 sockets as well. > > Half of it (setsockopt(IPV6_MTU_DISCOVER)) was already there, but > receiving of detailed socket errors was missing the enablement of > setsockopt(IPV6_RECVERR) and parsing of IPPROTO_IPV6/IPV6_RECVERR > messages received. > > With that, we now get (sending over a route with "mtu 1300"): > > 2022-02-22 15:28:07 write UDPv6 [EMSGSIZE Path-MTU=1300]: Message too long (fd=3,code=90) > 2022-02-22 15:28:07 Note adjusting 'mssfix 1400 mtu' to 'mssfix 1300 mtu' according to path MTU discovery > 2022-02-22 15:28:07 Note adjusting 'fragment 1400 mtu' to 'fragment 1300 mtu' according to path MTU discovery Looks simple enough. Acked-By: Arne Schwabe <arne@rfc2549.org> Arne
Patch has been applied to the master branch. commit 043c67f36342969cd171d24c70ee6b62ebc95fee Author: Gert Doering Date: Tue Feb 22 15:35:14 2022 +0100 Implement --mtu-disc for IPv6 UDP sockets. Signed-off-by: Gert Doering <gert@greenie.muc.de> Acked-by: Arne Schwabe <arne@rfc2549.org> Message-Id: <20220222143514.3480-1-gert@greenie.muc.de> URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg23879.html Signed-off-by: Gert Doering <gert@greenie.muc.de> -- kind regards, Gert Doering
diff --git a/src/openvpn/mtu.c b/src/openvpn/mtu.c index aa810f1c..51eeaa64 100644 --- a/src/openvpn/mtu.c +++ b/src/openvpn/mtu.c @@ -352,6 +352,17 @@ format_extended_socket_error(int fd, int *mtu, struct gc_arena *gc) buf_printf(&out,"CMSG=%d|", cmsg->cmsg_type); } } + else if (cmsg->cmsg_level == IPPROTO_IPV6) + { + if (cmsg->cmsg_type == IPV6_RECVERR) + { + e = (struct sock_extended_err *) CMSG_DATA(cmsg); + } + else + { + buf_printf(&out,"CMSG=%d|", cmsg->cmsg_type); + } + } } if (e == NULL) { @@ -405,11 +416,18 @@ void set_sock_extended_error_passing(int sd) { int on = 1; - if (setsockopt(sd, SOL_IP, IP_RECVERR, (void *) &on, sizeof(on))) + /* see "man 7 ip" (on Linux) */ + if (setsockopt(sd, SOL_IP, IP_RECVERR, (void *) &on, sizeof(on)) != 0) { msg(M_WARN | M_ERRNO, "Note: enable extended error passing on TCP/UDP socket failed (IP_RECVERR)"); } + /* see "man 7 ipv6" (on Linux) */ + if (setsockopt(sd, IPPROTO_IPV6, IPV6_RECVERR, (void *) &on, sizeof(on)) != 0) + { + msg(M_WARN | M_ERRNO, + "Note: enable extended error passing on TCP/UDP socket failed (IPV6_RECVERR)"); + } } #endif /* if EXTENDED_SOCKET_ERROR_CAPABILITY */
Commit 4225114b96 repaired "--mtu-disc yes" brokenness for IPv4 UDP sockets (caused by autoconf/ifdef issues). This patch adds new functionality to do --mtu-disc for IPv6 sockets as well. Half of it (setsockopt(IPV6_MTU_DISCOVER)) was already there, but receiving of detailed socket errors was missing the enablement of setsockopt(IPV6_RECVERR) and parsing of IPPROTO_IPV6/IPV6_RECVERR messages received. With that, we now get (sending over a route with "mtu 1300"): 2022-02-22 15:28:07 write UDPv6 [EMSGSIZE Path-MTU=1300]: Message too long (fd=3,code=90) 2022-02-22 15:28:07 Note adjusting 'mssfix 1400 mtu' to 'mssfix 1300 mtu' according to path MTU discovery 2022-02-22 15:28:07 Note adjusting 'fragment 1400 mtu' to 'fragment 1300 mtu' according to path MTU discovery Signed-off-by: Gert Doering <gert@greenie.muc.de> --- src/openvpn/mtu.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-)