wgengine/magicsock: avoid ReadBatch/WriteBatch on old Linux kernels
Fixes
"tailscale.com/derp/derphttp"
"tailscale.com/disco"
"tailscale.com/health"
+ "tailscale.com/hostinfo"
"tailscale.com/ipn/ipnstate"
"tailscale.com/logtail/backoff"
"tailscale.com/net/connstats"
@@ -3208,6 +3209,14 @@ type RebindingUDPConn struct {
func upgradePacketConn(p nettype.PacketConn, network string) nettype.PacketConn {
uc, ok := p.(*net.UDPConn)
if ok && runtime.GOOS == "linux" && (network == "udp4" || network == "udp6") {
+ // recvmmsg/sendmmsg were added in 2.6.33 but we support down to 2.6.32
+ // for old NAS devices. See https://github.com/tailscale/tailscale/issues/6807.
+ // As a cheap heuristic: if the Linux kernel starts with "2", just consider
+ // it too old for the fast paths. Nobody who cares about performance runs such
+ // ancient kernels.
+ if strings.HasPrefix(hostinfo.GetOSVersion(), "2") {
+ return p
+ }
// Non-Linux does not support batch operations. x/net will fall back to
// recv/sendmsg, but not all platforms have recv/sendmsg support. Keep
// this simple for now.
