Fix gvisor udp write back
This commit is contained in:
parent
ce3573838b
commit
8b6630a3b0
4 changed files with 19 additions and 21 deletions
|
|
@ -1,7 +0,0 @@
|
||||||
package tun
|
|
||||||
|
|
||||||
//go:generate go install -v mvdan.cc/gofumpt@latest
|
|
||||||
//go:generate go install -v github.com/daixiang0/gci@v0.4.0
|
|
||||||
//go:generate gofumpt -l -w .
|
|
||||||
//go:generate gofmt -s -w .
|
|
||||||
//go:generate gci write -s "standard,prefix(github.com/sagernet/),default" .
|
|
||||||
|
|
@ -39,14 +39,19 @@ func (f *UDPForwarder) HandlePacket(id stack.TransportEndpointID, pkt *stack.Pac
|
||||||
var upstreamMetadata M.Metadata
|
var upstreamMetadata M.Metadata
|
||||||
upstreamMetadata.Source = M.SocksaddrFrom(M.AddrFromIP(net.IP(id.RemoteAddress)), id.RemotePort)
|
upstreamMetadata.Source = M.SocksaddrFrom(M.AddrFromIP(net.IP(id.RemoteAddress)), id.RemotePort)
|
||||||
upstreamMetadata.Destination = M.SocksaddrFrom(M.AddrFromIP(net.IP(id.LocalAddress)), id.LocalPort)
|
upstreamMetadata.Destination = M.SocksaddrFrom(M.AddrFromIP(net.IP(id.LocalAddress)), id.LocalPort)
|
||||||
|
var netProto tcpip.NetworkProtocolNumber
|
||||||
|
if upstreamMetadata.Source.IsIPv4() {
|
||||||
|
netProto = header.IPv4ProtocolNumber
|
||||||
|
} else {
|
||||||
|
netProto = header.IPv6ProtocolNumber
|
||||||
|
}
|
||||||
f.udpNat.NewPacket(
|
f.udpNat.NewPacket(
|
||||||
f.ctx,
|
f.ctx,
|
||||||
upstreamMetadata.Source.AddrPort(),
|
upstreamMetadata.Source.AddrPort(),
|
||||||
buf.As(pkt.Data().AsRange().ToSlice()),
|
buf.As(pkt.Data().AsRange().ToSlice()),
|
||||||
upstreamMetadata,
|
upstreamMetadata,
|
||||||
func(natConn N.PacketConn) N.PacketWriter {
|
func(natConn N.PacketConn) N.PacketWriter {
|
||||||
return &UDPBackWriter{f.stack, id.RemoteAddress, id.RemotePort}
|
return &UDPBackWriter{f.stack, id.RemoteAddress, id.RemotePort, netProto}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
return true
|
return true
|
||||||
|
|
@ -56,23 +61,23 @@ type UDPBackWriter struct {
|
||||||
stack *stack.Stack
|
stack *stack.Stack
|
||||||
source tcpip.Address
|
source tcpip.Address
|
||||||
sourcePort uint16
|
sourcePort uint16
|
||||||
|
sourceNetwork tcpip.NetworkProtocolNumber
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *UDPBackWriter) WritePacket(buffer *buf.Buffer, destination M.Socksaddr) error {
|
func (w *UDPBackWriter) WritePacket(buffer *buf.Buffer, destination M.Socksaddr) error {
|
||||||
defer buffer.Release()
|
defer buffer.Release()
|
||||||
|
|
||||||
var netProto tcpip.NetworkProtocolNumber
|
if w.sourceNetwork == header.IPv4ProtocolNumber && destination.Addr.Is4In6() {
|
||||||
if destination.IsIPv4() {
|
destination = destination.Unwrap()
|
||||||
netProto = header.IPv4ProtocolNumber
|
} else if w.sourceNetwork == header.IPv6ProtocolNumber && destination.Addr.Is4() {
|
||||||
} else {
|
destination = M.SocksaddrFrom(netip.AddrFrom16(destination.Addr.As16()), destination.Port)
|
||||||
netProto = header.IPv6ProtocolNumber
|
|
||||||
}
|
}
|
||||||
|
|
||||||
route, err := w.stack.FindRoute(
|
route, err := w.stack.FindRoute(
|
||||||
defaultNIC,
|
defaultNIC,
|
||||||
tcpip.Address(destination.Addr.AsSlice()),
|
tcpip.Address(destination.Addr.AsSlice()),
|
||||||
w.source,
|
w.source,
|
||||||
netProto,
|
w.sourceNetwork,
|
||||||
false,
|
false,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -95,7 +100,7 @@ func (w *UDPBackWriter) WritePacket(buffer *buf.Buffer, destination M.Socksaddr)
|
||||||
Length: pLen,
|
Length: pLen,
|
||||||
})
|
})
|
||||||
|
|
||||||
if route.RequiresTXTransportChecksum() && netProto == header.IPv6ProtocolNumber {
|
if route.RequiresTXTransportChecksum() && w.sourceNetwork == header.IPv6ProtocolNumber {
|
||||||
xsum := udpHdr.CalculateChecksum(header.ChecksumCombine(
|
xsum := udpHdr.CalculateChecksum(header.ChecksumCombine(
|
||||||
route.PseudoHeaderChecksum(header.UDPProtocolNumber, pLen),
|
route.PseudoHeaderChecksum(header.UDPProtocolNumber, pLen),
|
||||||
packet.Data().AsRange().Checksum(),
|
packet.Data().AsRange().Checksum(),
|
||||||
|
|
|
||||||
|
|
@ -5,9 +5,9 @@ package tun
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"sync"
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/sagernet/sing/common/x/list"
|
"github.com/sagernet/sing/common/x/list"
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func (m *networkUpdateMonitor) RegisterCallback(callback NetworkUpdateCallback) *list.Element[NetworkUpdateCallback] {
|
func (m *networkUpdateMonitor) RegisterCallback(callback NetworkUpdateCallback) *list.Element[NetworkUpdateCallback] {
|
||||||
|
|
|
||||||
|
|
@ -8,11 +8,11 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/sagernet/abx-go"
|
||||||
"github.com/sagernet/sing/common"
|
"github.com/sagernet/sing/common"
|
||||||
E "github.com/sagernet/sing/common/exceptions"
|
E "github.com/sagernet/sing/common/exceptions"
|
||||||
|
|
||||||
"github.com/fsnotify/fsnotify"
|
"github.com/fsnotify/fsnotify"
|
||||||
"github.com/sagernet/abx-go"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type packageManager struct {
|
type packageManager struct {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue