From e433d13df6ac99fa317b5ce27d04c7dad307cab3 Mon Sep 17 00:00:00 2001 From: albexk Date: Wed, 3 Apr 2024 18:42:37 +0300 Subject: [PATCH] Add disabling UDP GSO when an error occurs due to inconsistent peer mtu --- conn/bind_std.go | 2 +- conn/errors_linux.go | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/conn/bind_std.go b/conn/bind_std.go index b416e22..ea06cd5 100644 --- a/conn/bind_std.go +++ b/conn/bind_std.go @@ -336,7 +336,7 @@ type ErrUDPGSODisabled struct { } func (e ErrUDPGSODisabled) Error() string { - return fmt.Sprintf("disabled UDP GSO on %s, NIC(s) may not support checksum offload", e.onLaddr) + return fmt.Sprintf("disabled UDP GSO on %s, NIC(s) may not support checksum offload or peer MTU with protocol headers is greater than path MTU", e.onLaddr) } func (e ErrUDPGSODisabled) Unwrap() error { diff --git a/conn/errors_linux.go b/conn/errors_linux.go index 8e61000..7548a8a 100644 --- a/conn/errors_linux.go +++ b/conn/errors_linux.go @@ -20,7 +20,9 @@ func errShouldDisableUDPGSO(err error) bool { // See: // https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/man7/udp.7?id=806eabd74910447f21005160e90957bde4db0183#n228 // https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/net/ipv4/udp.c?h=v6.2&id=c9c3395d5e3dcc6daee66c6908354d47bf98cb0c#n942 - return serr.Err == unix.EIO + // If gso_size + udp + ip headers > fragment size EINVAL is returned. + // It occurs when the peer mtu + wg headers is greater than path mtu. + return serr.Err == unix.EIO || serr.Err == unix.EINVAL } return false }