From 0c975db0a6fc4373d5117fbbc6a4f807d7eca47b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Tue, 6 Sep 2022 00:54:57 +0800 Subject: [PATCH] Set udp dontfrag by default --- common/dialer/default.go | 4 ++++ inbound/default_udp.go | 9 +++++++-- option/inbound.go | 1 + option/outbound.go | 2 +- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/common/dialer/default.go b/common/dialer/default.go index 5d8e5b18..590456c6 100644 --- a/common/dialer/default.go +++ b/common/dialer/default.go @@ -112,6 +112,10 @@ func NewDefault(router adapter.Router, options option.DialerOptions) *DefaultDia if options.TCPFastOpen { warnTFOOnUnsupportedPlatform.Check() } + if !options.UDPFragment { + dialer.Control = control.Append(dialer.Control, control.DisableUDPFragment()) + listener.Control = control.Append(listener.Control, control.DisableUDPFragment()) + } var bindUDPAddr string udpDialer := dialer var bindAddress netip.Addr diff --git a/inbound/default_udp.go b/inbound/default_udp.go index 35850333..4140032d 100644 --- a/inbound/default_udp.go +++ b/inbound/default_udp.go @@ -10,6 +10,7 @@ import ( "github.com/sagernet/sing-dns" "github.com/sagernet/sing/common" "github.com/sagernet/sing/common/buf" + "github.com/sagernet/sing/common/control" E "github.com/sagernet/sing/common/exceptions" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" @@ -17,11 +18,15 @@ import ( func (a *myInboundAdapter) ListenUDP() (net.PacketConn, error) { bindAddr := M.SocksaddrFrom(netip.Addr(a.listenOptions.Listen), a.listenOptions.ListenPort) - udpConn, err := net.ListenUDP(M.NetworkFromNetAddr(N.NetworkUDP, bindAddr.Addr), bindAddr.UDPAddr()) + var lc net.ListenConfig + if !a.listenOptions.UDPFragment { + lc.Control = control.Append(lc.Control, control.DisableUDPFragment()) + } + udpConn, err := lc.ListenPacket(a.ctx, M.NetworkFromNetAddr(N.NetworkUDP, bindAddr.Addr), bindAddr.String()) if err != nil { return nil, err } - a.udpConn = udpConn + a.udpConn = udpConn.(*net.UDPConn) a.udpAddr = bindAddr a.logger.Info("udp server started at ", udpConn.LocalAddr()) return udpConn, err diff --git a/option/inbound.go b/option/inbound.go index 550e4647..f05317f4 100644 --- a/option/inbound.go +++ b/option/inbound.go @@ -114,6 +114,7 @@ type ListenOptions struct { Listen ListenAddress `json:"listen"` ListenPort uint16 `json:"listen_port,omitempty"` TCPFastOpen bool `json:"tcp_fast_open,omitempty"` + UDPFragment bool `json:"udp_fragment,omitempty"` UDPTimeout int64 `json:"udp_timeout,omitempty"` ProxyProtocol bool `json:"proxy_protocol,omitempty"` Detour string `json:"detour,omitempty"` diff --git a/option/outbound.go b/option/outbound.go index e1f39a26..0b00d44f 100644 --- a/option/outbound.go +++ b/option/outbound.go @@ -108,12 +108,12 @@ type DialerOptions struct { Detour string `json:"detour,omitempty"` BindInterface string `json:"bind_interface,omitempty"` BindAddress *ListenAddress `json:"bind_address,omitempty"` - BindAddress6 *ListenAddress `json:"bind_address6,omitempty"` ProtectPath string `json:"protect_path,omitempty"` RoutingMark int `json:"routing_mark,omitempty"` ReuseAddr bool `json:"reuse_addr,omitempty"` ConnectTimeout Duration `json:"connect_timeout,omitempty"` TCPFastOpen bool `json:"tcp_fast_open,omitempty"` + UDPFragment bool `json:"udp_fragment,omitempty"` DomainStrategy DomainStrategy `json:"domain_strategy,omitempty"` FallbackDelay Duration `json:"fallback_delay,omitempty"` }