mirror of
https://github.com/SagerNet/sing.git
synced 2025-04-02 03:17:37 +03:00
Fix disable UDP fragment
This commit is contained in:
parent
3374a45475
commit
442cceb9fa
3 changed files with 30 additions and 19 deletions
|
@ -4,19 +4,26 @@ import (
|
|||
"os"
|
||||
"syscall"
|
||||
|
||||
N "github.com/sagernet/sing/common/network"
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
||||
func DisableUDPFragment() Func {
|
||||
return func(network, address string, conn syscall.RawConn) error {
|
||||
if N.NetworkName(network) != N.NetworkUDP {
|
||||
return nil
|
||||
}
|
||||
return Raw(conn, func(fd uintptr) error {
|
||||
switch network {
|
||||
case "udp4":
|
||||
if err := unix.SetsockoptInt(int(fd), unix.IPPROTO_IP, unix.IP_DONTFRAG, 1); err != nil {
|
||||
if network == "udp" || network == "udp4" {
|
||||
err := unix.SetsockoptInt(int(fd), unix.IPPROTO_IP, unix.IP_DONTFRAG, 1)
|
||||
if err != nil {
|
||||
return os.NewSyscallError("SETSOCKOPT IP_DONTFRAG", err)
|
||||
}
|
||||
case "udp6":
|
||||
if err := unix.SetsockoptInt(int(fd), unix.IPPROTO_IPV6, unix.IPV6_DONTFRAG, 1); err != nil {
|
||||
}
|
||||
if network == "udp" || network == "udp6" {
|
||||
err := unix.SetsockoptInt(int(fd), unix.IPPROTO_IPV6, unix.IPV6_DONTFRAG, 1)
|
||||
if err != nil {
|
||||
return os.NewSyscallError("SETSOCKOPT IPV6_DONTFRAG", err)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,17 +11,19 @@ import (
|
|||
|
||||
func DisableUDPFragment() Func {
|
||||
return func(network, address string, conn syscall.RawConn) error {
|
||||
switch N.NetworkName(network) {
|
||||
case N.NetworkUDP:
|
||||
default:
|
||||
if N.NetworkName(network) != N.NetworkUDP {
|
||||
return nil
|
||||
}
|
||||
return Raw(conn, func(fd uintptr) error {
|
||||
if err := unix.SetsockoptInt(int(fd), unix.IPPROTO_IP, unix.IP_MTU_DISCOVER, unix.IP_PMTUDISC_DO); err != nil {
|
||||
return os.NewSyscallError("SETSOCKOPT IP_MTU_DISCOVER IP_PMTUDISC_DO", err)
|
||||
if network == "udp" || network == "udp4" {
|
||||
err := unix.SetsockoptInt(int(fd), unix.IPPROTO_IP, unix.IP_MTU_DISCOVER, unix.IP_PMTUDISC_DO)
|
||||
if err != nil {
|
||||
return os.NewSyscallError("SETSOCKOPT IP_MTU_DISCOVER IP_PMTUDISC_DO", err)
|
||||
}
|
||||
}
|
||||
if network == "udp6" {
|
||||
if err := unix.SetsockoptInt(int(fd), unix.IPPROTO_IPV6, unix.IPV6_MTU_DISCOVER, unix.IP_PMTUDISC_DO); err != nil {
|
||||
if network == "udp" || network == "udp6" {
|
||||
err := unix.SetsockoptInt(int(fd), unix.IPPROTO_IPV6, unix.IPV6_MTU_DISCOVER, unix.IP_PMTUDISC_DO)
|
||||
if err != nil {
|
||||
return os.NewSyscallError("SETSOCKOPT IPV6_MTU_DISCOVER IP_PMTUDISC_DO", err)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,17 +25,19 @@ const (
|
|||
|
||||
func DisableUDPFragment() Func {
|
||||
return func(network, address string, conn syscall.RawConn) error {
|
||||
switch N.NetworkName(network) {
|
||||
case N.NetworkUDP:
|
||||
default:
|
||||
if N.NetworkName(network) != N.NetworkUDP {
|
||||
return nil
|
||||
}
|
||||
return Raw(conn, func(fd uintptr) error {
|
||||
if err := windows.SetsockoptInt(windows.Handle(fd), windows.IPPROTO_IP, IP_MTU_DISCOVER, IP_PMTUDISC_DO); err != nil {
|
||||
return os.NewSyscallError("SETSOCKOPT IP_MTU_DISCOVER IP_PMTUDISC_DO", err)
|
||||
if network == "udp" || network == "udp4" {
|
||||
err := windows.SetsockoptInt(windows.Handle(fd), windows.IPPROTO_IP, IP_MTU_DISCOVER, IP_PMTUDISC_DO)
|
||||
if err != nil {
|
||||
return os.NewSyscallError("SETSOCKOPT IP_MTU_DISCOVER IP_PMTUDISC_DO", err)
|
||||
}
|
||||
}
|
||||
if network == "udp6" {
|
||||
if err := windows.SetsockoptInt(windows.Handle(fd), windows.IPPROTO_IPV6, IPV6_MTU_DISCOVER, IP_PMTUDISC_DO); err != nil {
|
||||
if network == "udp" || network == "udp6" {
|
||||
err := windows.SetsockoptInt(windows.Handle(fd), windows.IPPROTO_IPV6, IPV6_MTU_DISCOVER, IP_PMTUDISC_DO)
|
||||
if err != nil {
|
||||
return os.NewSyscallError("SETSOCKOPT IPV6_MTU_DISCOVER IP_PMTUDISC_DO", err)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue