Improve gVisor UDP
This commit is contained in:
parent
fd850d00e5
commit
bbf542f01a
4 changed files with 28 additions and 10 deletions
|
|
@ -23,6 +23,11 @@ type UDPForwarder struct {
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
stack *stack.Stack
|
stack *stack.Stack
|
||||||
udpNat *udpnat.Service[netip.AddrPort]
|
udpNat *udpnat.Service[netip.AddrPort]
|
||||||
|
|
||||||
|
// cache
|
||||||
|
cacheProto tcpip.NetworkProtocolNumber
|
||||||
|
cacheID stack.TransportEndpointID
|
||||||
|
cachePacket stack.PacketBufferPtr
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewUDPForwarder(ctx context.Context, stack *stack.Stack, handler Handler, udpTimeout int64) *UDPForwarder {
|
func NewUDPForwarder(ctx context.Context, stack *stack.Stack, handler Handler, udpTimeout int64) *UDPForwarder {
|
||||||
|
|
@ -37,24 +42,37 @@ func (f *UDPForwarder) HandlePacket(id stack.TransportEndpointID, pkt stack.Pack
|
||||||
var upstreamMetadata M.Metadata
|
var upstreamMetadata M.Metadata
|
||||||
upstreamMetadata.Source = M.SocksaddrFrom(AddrFromAddress(id.RemoteAddress), id.RemotePort)
|
upstreamMetadata.Source = M.SocksaddrFrom(AddrFromAddress(id.RemoteAddress), id.RemotePort)
|
||||||
upstreamMetadata.Destination = M.SocksaddrFrom(AddrFromAddress(id.LocalAddress), id.LocalPort)
|
upstreamMetadata.Destination = M.SocksaddrFrom(AddrFromAddress(id.LocalAddress), id.LocalPort)
|
||||||
var netProto tcpip.NetworkProtocolNumber
|
|
||||||
if upstreamMetadata.Source.IsIPv4() {
|
if upstreamMetadata.Source.IsIPv4() {
|
||||||
netProto = header.IPv4ProtocolNumber
|
f.cacheProto = header.IPv4ProtocolNumber
|
||||||
} else {
|
} else {
|
||||||
netProto = header.IPv6ProtocolNumber
|
f.cacheProto = header.IPv6ProtocolNumber
|
||||||
}
|
}
|
||||||
|
gBuffer := pkt.ToBuffer()
|
||||||
|
sBuffer := buf.NewSize(int(gBuffer.Size()))
|
||||||
|
gBuffer.Apply(func(view *buffer.View) {
|
||||||
|
sBuffer.Write(view.AsSlice())
|
||||||
|
})
|
||||||
|
f.cacheID = id
|
||||||
|
f.cachePacket = pkt
|
||||||
f.udpNat.NewPacket(
|
f.udpNat.NewPacket(
|
||||||
f.ctx,
|
f.ctx,
|
||||||
upstreamMetadata.Source.AddrPort(),
|
upstreamMetadata.Source.AddrPort(),
|
||||||
buf.As(pkt.Data().AsRange().ToSlice()),
|
sBuffer,
|
||||||
upstreamMetadata,
|
upstreamMetadata,
|
||||||
func(natConn N.PacketConn) N.PacketWriter {
|
f.newUDPConn,
|
||||||
return &UDPBackWriter{f.stack, id.RemoteAddress, id.RemotePort, netProto}
|
|
||||||
},
|
|
||||||
)
|
)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (f *UDPForwarder) newUDPConn(natConn N.PacketConn) N.PacketWriter {
|
||||||
|
return &UDPBackWriter{
|
||||||
|
stack: f.stack,
|
||||||
|
source: f.cacheID.RemoteAddress,
|
||||||
|
sourcePort: f.cacheID.RemotePort,
|
||||||
|
sourceNetwork: f.cacheProto,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type UDPBackWriter struct {
|
type UDPBackWriter struct {
|
||||||
stack *stack.Stack
|
stack *stack.Stack
|
||||||
source tcpip.Address
|
source tcpip.Address
|
||||||
|
|
|
||||||
2
lwip.go
2
lwip.go
|
|
@ -52,7 +52,7 @@ func (l *LWIP) loopIn() {
|
||||||
l.loopInWintun(winTun)
|
l.loopInWintun(winTun)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
buffer := make([]byte, int(l.tunMtu) + PacketOffset)
|
buffer := make([]byte, int(l.tunMtu)+PacketOffset)
|
||||||
for {
|
for {
|
||||||
n, err := l.tun.Read(buffer)
|
n, err := l.tun.Read(buffer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -134,7 +134,7 @@ func (s *System) tunLoop() {
|
||||||
s.wintunLoop(winTun)
|
s.wintunLoop(winTun)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
packetBuffer := make([]byte, s.mtu + PacketOffset)
|
packetBuffer := make([]byte, s.mtu+PacketOffset)
|
||||||
for {
|
for {
|
||||||
n, err := s.tun.Read(packetBuffer)
|
n, err := s.tun.Read(packetBuffer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ func (e *DarwinEndpoint) Attach(dispatcher stack.NetworkDispatcher) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *DarwinEndpoint) dispatchLoop() {
|
func (e *DarwinEndpoint) dispatchLoop() {
|
||||||
packetBuffer := make([]byte, e.tun.mtu + 4)
|
packetBuffer := make([]byte, e.tun.mtu+4)
|
||||||
for {
|
for {
|
||||||
n, err := e.tun.tunFile.Read(packetBuffer)
|
n, err := e.tun.tunFile.Read(packetBuffer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue