mirror of
https://github.com/SagerNet/sing-tun.git
synced 2025-11-01 20:32:46 +08:00
Update gVisor to 20220801.0
This commit is contained in:
6
go.mod
6
go.mod
@@ -5,9 +5,9 @@ go 1.18
|
|||||||
require (
|
require (
|
||||||
github.com/sagernet/netlink v0.0.0-20220803045538-bdac49abf805
|
github.com/sagernet/netlink v0.0.0-20220803045538-bdac49abf805
|
||||||
github.com/sagernet/sing v0.0.0-20220801112236-1bb95f9661fc
|
github.com/sagernet/sing v0.0.0-20220801112236-1bb95f9661fc
|
||||||
golang.org/x/net v0.0.0-20220802222814-0bcc04d9c69b
|
golang.org/x/net v0.0.0-20220805013720-a33c5aa5df48
|
||||||
golang.org/x/sys v0.0.0-20220803195053-6e608f9ce704
|
golang.org/x/sys v0.0.0-20220804214406-8e32c043e418
|
||||||
gvisor.dev/gvisor v0.0.0-20220711011657-cecae2f4234d
|
gvisor.dev/gvisor v0.0.0-20220801010827-addd1f7b3e97
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
|||||||
12
go.sum
12
go.sum
@@ -6,12 +6,12 @@ github.com/sagernet/sing v0.0.0-20220801112236-1bb95f9661fc h1:x7H64IiqyrpxPWl/K
|
|||||||
github.com/sagernet/sing v0.0.0-20220801112236-1bb95f9661fc/go.mod h1:GbtQfZSpmtD3cXeD1qX2LCMwY8dH+bnnInDTqd92IsM=
|
github.com/sagernet/sing v0.0.0-20220801112236-1bb95f9661fc/go.mod h1:GbtQfZSpmtD3cXeD1qX2LCMwY8dH+bnnInDTqd92IsM=
|
||||||
github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74 h1:gga7acRE695APm9hlsSMoOoE65U4/TcqNj90mc69Rlg=
|
github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74 h1:gga7acRE695APm9hlsSMoOoE65U4/TcqNj90mc69Rlg=
|
||||||
github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
|
github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
|
||||||
golang.org/x/net v0.0.0-20220802222814-0bcc04d9c69b h1:3ogNYyK4oIQdIKzTu68hQrr4iuVxF3AxKl9Aj/eDrw0=
|
golang.org/x/net v0.0.0-20220805013720-a33c5aa5df48 h1:N9Vc/rorQUDes6B9CNdIxAn5jODGj2wzfrei2x4wNj4=
|
||||||
golang.org/x/net v0.0.0-20220802222814-0bcc04d9c69b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
|
golang.org/x/net v0.0.0-20220805013720-a33c5aa5df48/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
|
||||||
golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20220803195053-6e608f9ce704 h1:Y7NOhdqIOU8kYI7BxsgL38d0ot0raxvcW+EMQU2QrT4=
|
golang.org/x/sys v0.0.0-20220804214406-8e32c043e418 h1:9vYwv7OjYaky/tlAeD7C4oC9EsPTlaFl1H2jS++V+ME=
|
||||||
golang.org/x/sys v0.0.0-20220803195053-6e608f9ce704/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220804214406-8e32c043e418/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs=
|
golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs=
|
||||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
gvisor.dev/gvisor v0.0.0-20220711011657-cecae2f4234d h1:KjI6i6P1ib9DiNdNIN8pb2TXfBewpKHf3O58cjj9vw4=
|
gvisor.dev/gvisor v0.0.0-20220801010827-addd1f7b3e97 h1:zncudP85ZlJelPsgxZXN00Rl5M5j7QuDK27L35Ez01M=
|
||||||
gvisor.dev/gvisor v0.0.0-20220711011657-cecae2f4234d/go.mod h1:TIvkJD0sxe8pIob3p6T8IzxXunlp6yfgktvTNp+DGNM=
|
gvisor.dev/gvisor v0.0.0-20220801010827-addd1f7b3e97/go.mod h1:TIvkJD0sxe8pIob3p6T8IzxXunlp6yfgktvTNp+DGNM=
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import (
|
|||||||
N "github.com/sagernet/sing/common/network"
|
N "github.com/sagernet/sing/common/network"
|
||||||
"github.com/sagernet/sing/common/udpnat"
|
"github.com/sagernet/sing/common/udpnat"
|
||||||
|
|
||||||
gBuffer "gvisor.dev/gvisor/pkg/buffer"
|
"gvisor.dev/gvisor/pkg/bufferv2"
|
||||||
"gvisor.dev/gvisor/pkg/tcpip"
|
"gvisor.dev/gvisor/pkg/tcpip"
|
||||||
"gvisor.dev/gvisor/pkg/tcpip/header"
|
"gvisor.dev/gvisor/pkg/tcpip/header"
|
||||||
"gvisor.dev/gvisor/pkg/tcpip/stack"
|
"gvisor.dev/gvisor/pkg/tcpip/stack"
|
||||||
@@ -43,7 +43,7 @@ func (f *UDPForwarder) HandlePacket(id stack.TransportEndpointID, pkt *stack.Pac
|
|||||||
f.udpNat.NewPacket(
|
f.udpNat.NewPacket(
|
||||||
f.ctx,
|
f.ctx,
|
||||||
upstreamMetadata.Source.AddrPort(),
|
upstreamMetadata.Source.AddrPort(),
|
||||||
buf.As(pkt.Data().AsRange().AsView()),
|
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}
|
||||||
@@ -58,9 +58,6 @@ type UDPBackWriter struct {
|
|||||||
sourcePort uint16
|
sourcePort uint16
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *UDPBackWriter) WriteIsThreadUnsafe() {
|
|
||||||
}
|
|
||||||
|
|
||||||
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()
|
||||||
|
|
||||||
@@ -85,8 +82,7 @@ func (w *UDPBackWriter) WritePacket(buffer *buf.Buffer, destination M.Socksaddr)
|
|||||||
|
|
||||||
packet := stack.NewPacketBuffer(stack.PacketBufferOptions{
|
packet := stack.NewPacketBuffer(stack.PacketBufferOptions{
|
||||||
ReserveHeaderBytes: header.UDPMinimumSize + int(route.MaxHeaderLength()),
|
ReserveHeaderBytes: header.UDPMinimumSize + int(route.MaxHeaderLength()),
|
||||||
Payload: gBuffer.NewWithData(buffer.Bytes()),
|
Payload: bufferv2.MakeWithData(buffer.Bytes()),
|
||||||
OnRelease: buffer.Release,
|
|
||||||
})
|
})
|
||||||
defer packet.DecRef()
|
defer packet.DecRef()
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import (
|
|||||||
|
|
||||||
"golang.org/x/net/route"
|
"golang.org/x/net/route"
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
gBuffer "gvisor.dev/gvisor/pkg/buffer"
|
"gvisor.dev/gvisor/pkg/bufferv2"
|
||||||
"gvisor.dev/gvisor/pkg/tcpip"
|
"gvisor.dev/gvisor/pkg/tcpip"
|
||||||
"gvisor.dev/gvisor/pkg/tcpip/header"
|
"gvisor.dev/gvisor/pkg/tcpip/header"
|
||||||
"gvisor.dev/gvisor/pkg/tcpip/stack"
|
"gvisor.dev/gvisor/pkg/tcpip/stack"
|
||||||
@@ -109,42 +109,36 @@ func (e *DarwinEndpoint) dispatchLoop() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
packet := buf.NewSize(n - 4)
|
packet := data[4:n]
|
||||||
common.Must1(packet.Write(data[4:n]))
|
var networkProtocol tcpip.NetworkProtocolNumber
|
||||||
pkt := stack.NewPacketBuffer(stack.PacketBufferOptions{
|
switch header.IPVersion(packet) {
|
||||||
Payload: gBuffer.NewWithData(packet.Bytes()),
|
|
||||||
IsForwardedPacket: true,
|
|
||||||
OnRelease: packet.Release,
|
|
||||||
})
|
|
||||||
var p tcpip.NetworkProtocolNumber
|
|
||||||
ipHeader, ok := pkt.Data().PullUp(1)
|
|
||||||
if !ok {
|
|
||||||
pkt.DecRef()
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
switch header.IPVersion(ipHeader) {
|
|
||||||
case header.IPv4Version:
|
case header.IPv4Version:
|
||||||
p = header.IPv4ProtocolNumber
|
networkProtocol = header.IPv4ProtocolNumber
|
||||||
if header.IPv4(packet.Bytes()).DestinationAddress() == e.tun.inet4Address {
|
if header.IPv4(packet).DestinationAddress() == e.tun.inet4Address {
|
||||||
_, err = e.tun.tunFile.Write(data[:n])
|
e.tun.tunFile.Write(data[:n])
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
case header.IPv6Version:
|
case header.IPv6Version:
|
||||||
p = header.IPv6ProtocolNumber
|
networkProtocol = header.IPv6ProtocolNumber
|
||||||
if header.IPv6(packet.Bytes()).DestinationAddress() == e.tun.inet6Address {
|
if header.IPv6(packet).DestinationAddress() == e.tun.inet6Address {
|
||||||
_, err = e.tun.tunFile.Write(data[:n])
|
e.tun.tunFile.Write(data[:n])
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
e.tun.tunFile.Write(data[:n])
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
pkt := stack.NewPacketBuffer(stack.PacketBufferOptions{
|
||||||
|
Payload: bufferv2.MakeWithData(data[4:n]),
|
||||||
|
IsForwardedPacket: true,
|
||||||
|
})
|
||||||
|
pkt.NetworkProtocolNumber = networkProtocol
|
||||||
dispatcher := e.dispatcher
|
dispatcher := e.dispatcher
|
||||||
if dispatcher == nil {
|
if dispatcher == nil {
|
||||||
pkt.DecRef()
|
pkt.DecRef()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
dispatcher.DeliverNetworkPacket(p, pkt)
|
dispatcher.DeliverNetworkPacket(networkProtocol, pkt)
|
||||||
pkt.DecRef()
|
pkt.DecRef()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -163,22 +157,22 @@ func (e *DarwinEndpoint) ARPHardwareType() header.ARPHardwareType {
|
|||||||
func (e *DarwinEndpoint) AddHeader(buffer *stack.PacketBuffer) {
|
func (e *DarwinEndpoint) AddHeader(buffer *stack.PacketBuffer) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
packetHeader4 = [4]byte{0x00, 0x00, 0x00, unix.AF_INET}
|
||||||
|
packetHeader6 = [4]byte{0x00, 0x00, 0x00, unix.AF_INET6}
|
||||||
|
)
|
||||||
|
|
||||||
func (e *DarwinEndpoint) WritePackets(packetBufferList stack.PacketBufferList) (int, tcpip.Error) {
|
func (e *DarwinEndpoint) WritePackets(packetBufferList stack.PacketBufferList) (int, tcpip.Error) {
|
||||||
_packetHeader := buf.StackNewSize(4)
|
|
||||||
defer common.KeepAlive(_packetHeader)
|
|
||||||
packetHeader := common.Dup(_packetHeader)
|
|
||||||
defer packetHeader.Release()
|
|
||||||
var n int
|
var n int
|
||||||
for _, packet := range packetBufferList.AsSlice() {
|
for _, packet := range packetBufferList.AsSlice() {
|
||||||
packetHeader.FullReset()
|
var packetHeader []byte
|
||||||
packetHeader.WriteZeroN(3)
|
|
||||||
switch packet.NetworkProtocolNumber {
|
switch packet.NetworkProtocolNumber {
|
||||||
case header.IPv4ProtocolNumber:
|
case header.IPv4ProtocolNumber:
|
||||||
packetHeader.WriteByte(unix.AF_INET)
|
packetHeader = packetHeader4[:]
|
||||||
case header.IPv6ProtocolNumber:
|
case header.IPv6ProtocolNumber:
|
||||||
packetHeader.WriteByte(unix.AF_INET6)
|
packetHeader = packetHeader6[:]
|
||||||
}
|
}
|
||||||
_, err := rw.WriteV(e.tun.tunFd, append([][]byte{packetHeader.Bytes()}, packet.Slices()...))
|
_, err := rw.WriteV(e.tun.tunFd, append([][]byte{packetHeader}, packet.AsSlices()...))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return n, &tcpip.ErrAborted{}
|
return n, &tcpip.ErrAborted{}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import (
|
|||||||
E "github.com/sagernet/sing/common/exceptions"
|
E "github.com/sagernet/sing/common/exceptions"
|
||||||
|
|
||||||
"golang.org/x/sys/windows"
|
"golang.org/x/sys/windows"
|
||||||
gBuffer "gvisor.dev/gvisor/pkg/buffer"
|
"gvisor.dev/gvisor/pkg/bufferv2"
|
||||||
"gvisor.dev/gvisor/pkg/tcpip"
|
"gvisor.dev/gvisor/pkg/tcpip"
|
||||||
"gvisor.dev/gvisor/pkg/tcpip/header"
|
"gvisor.dev/gvisor/pkg/tcpip/header"
|
||||||
"gvisor.dev/gvisor/pkg/tcpip/stack"
|
"gvisor.dev/gvisor/pkg/tcpip/stack"
|
||||||
@@ -318,33 +318,27 @@ func (e *WintunEndpoint) dispatchLoop() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
packet := buf.NewSize(n)
|
packet := data[:n]
|
||||||
common.Must1(packet.Write(data[:n]))
|
var networkProtocol tcpip.NetworkProtocolNumber
|
||||||
pkt := stack.NewPacketBuffer(stack.PacketBufferOptions{
|
switch header.IPVersion(packet) {
|
||||||
Payload: gBuffer.NewWithData(packet.Bytes()),
|
|
||||||
IsForwardedPacket: true,
|
|
||||||
OnRelease: packet.Release,
|
|
||||||
})
|
|
||||||
var p tcpip.NetworkProtocolNumber
|
|
||||||
ipHeader, ok := pkt.Data().PullUp(1)
|
|
||||||
if !ok {
|
|
||||||
pkt.DecRef()
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
switch header.IPVersion(ipHeader) {
|
|
||||||
case header.IPv4Version:
|
case header.IPv4Version:
|
||||||
p = header.IPv4ProtocolNumber
|
networkProtocol = header.IPv4ProtocolNumber
|
||||||
case header.IPv6Version:
|
case header.IPv6Version:
|
||||||
p = header.IPv6ProtocolNumber
|
networkProtocol = header.IPv6ProtocolNumber
|
||||||
default:
|
default:
|
||||||
|
e.tun.Write([][]byte{packet})
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
pkt := stack.NewPacketBuffer(stack.PacketBufferOptions{
|
||||||
|
Payload: bufferv2.MakeWithData(packet),
|
||||||
|
IsForwardedPacket: true,
|
||||||
|
})
|
||||||
dispatcher := e.dispatcher
|
dispatcher := e.dispatcher
|
||||||
if dispatcher == nil {
|
if dispatcher == nil {
|
||||||
pkt.DecRef()
|
pkt.DecRef()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
dispatcher.DeliverNetworkPacket(p, pkt)
|
dispatcher.DeliverNetworkPacket(networkProtocol, pkt)
|
||||||
pkt.DecRef()
|
pkt.DecRef()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -366,7 +360,7 @@ func (e *WintunEndpoint) AddHeader(buffer *stack.PacketBuffer) {
|
|||||||
func (e *WintunEndpoint) WritePackets(packetBufferList stack.PacketBufferList) (int, tcpip.Error) {
|
func (e *WintunEndpoint) WritePackets(packetBufferList stack.PacketBufferList) (int, tcpip.Error) {
|
||||||
var n int
|
var n int
|
||||||
for _, packet := range packetBufferList.AsSlice() {
|
for _, packet := range packetBufferList.AsSlice() {
|
||||||
_, err := e.tun.Write(packet.Slices())
|
_, err := e.tun.Write(packet.AsSlices())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return n, &tcpip.ErrAborted{}
|
return n, &tcpip.ErrAborted{}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user