Skip to content

Commit 81c3078

Browse files
committed
Update gVisor to release-20230605.0-21-g457c1c36d
1 parent b02f252 commit 81c3078

20 files changed

+71
-550
lines changed

go.mod

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ require (
99
github.com/sagernet/netlink v0.0.0-20220905062125-8043b4a9aa97
1010
github.com/sagernet/sing v0.2.4
1111
github.com/scjalliance/comshim v0.0.0-20230315213746-5e51f40bd3b9
12-
golang.org/x/net v0.9.0
13-
golang.org/x/sys v0.7.0
14-
gvisor.dev/gvisor v0.0.0-20230415003630-3981d5d5e523
12+
golang.org/x/net v0.10.0
13+
golang.org/x/sys v0.8.0
14+
gvisor.dev/gvisor v0.0.0-20230609002524-f143e1baf0bb
1515
)
1616

1717
require (

go.sum

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@ github.com/scjalliance/comshim v0.0.0-20230315213746-5e51f40bd3b9 h1:rc/CcqLH3lh
1515
github.com/scjalliance/comshim v0.0.0-20230315213746-5e51f40bd3b9/go.mod h1:a/83NAfUXvEuLpmxDssAXxgUgrEy12MId3Wd7OTs76s=
1616
github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74 h1:gga7acRE695APm9hlsSMoOoE65U4/TcqNj90mc69Rlg=
1717
github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
18-
golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
19-
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
18+
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
19+
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
2020
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
2121
golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
2222
golang.org/x/sys v0.0.0-20220731174439-a90be440212d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
2323
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
24-
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
25-
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
24+
golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
25+
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
2626
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44=
2727
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
28-
gvisor.dev/gvisor v0.0.0-20230415003630-3981d5d5e523 h1:zUQYeyyPLnSR6yMvLSOmLH37xDWCZ7BqlpE69fE5K3Q=
29-
gvisor.dev/gvisor v0.0.0-20230415003630-3981d5d5e523/go.mod h1:pzr6sy8gDLfVmDAg8OYrlKvGEHw5C3PGTiBXBTCx76Q=
28+
gvisor.dev/gvisor v0.0.0-20230609002524-f143e1baf0bb h1:A5Zr25mHIiXEZUjN92wAopvMv2XL4jTbl2/+9D4ATgE=
29+
gvisor.dev/gvisor v0.0.0-20230609002524-f143e1baf0bb/go.mod h1:sQuqOkxbfJq/GS2uSnqHphtXclHyk/ZrAGhZBxxsq6g=

gvisor.go

Lines changed: 19 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ package tun
44

55
import (
66
"context"
7-
"net"
8-
"syscall"
7+
"net/netip"
98
"time"
109

1110
"github.com/sagernet/sing/common/bufio"
@@ -36,12 +35,10 @@ type GVisor struct {
3635
tunMtu uint32
3736
endpointIndependentNat bool
3837
udpTimeout int64
39-
router Router
4038
handler Handler
4139
logger logger.Logger
4240
stack *stack.Stack
4341
endpoint stack.LinkEndpoint
44-
routeMapping *RouteMapping
4542
}
4643

4744
type GVisorTun interface {
@@ -63,13 +60,9 @@ func NewGVisor(
6360
tunMtu: options.MTU,
6461
endpointIndependentNat: options.EndpointIndependentNat,
6562
udpTimeout: options.UDPTimeout,
66-
router: options.Router,
6763
handler: options.Handler,
6864
logger: options.Logger,
6965
}
70-
if gStack.router != nil {
71-
gStack.routeMapping = NewRouteMapping(options.UDPTimeout)
72-
}
7366
return gStack, nil
7467
}
7568

@@ -155,44 +148,7 @@ func (t *GVisor) Start() error {
155148
}
156149
}()
157150
})
158-
ipStack.SetTransportProtocolHandler(tcp.ProtocolNumber, func(id stack.TransportEndpointID, buffer stack.PacketBufferPtr) bool {
159-
if t.router != nil {
160-
var routeSession RouteSession
161-
routeSession.Network = syscall.IPPROTO_TCP
162-
var ipHdr header.Network
163-
if buffer.NetworkProtocolNumber == header.IPv4ProtocolNumber {
164-
routeSession.IPVersion = 4
165-
ipHdr = header.IPv4(buffer.NetworkHeader().Slice())
166-
} else {
167-
routeSession.IPVersion = 6
168-
ipHdr = header.IPv6(buffer.NetworkHeader().Slice())
169-
}
170-
tcpHdr := header.TCP(buffer.TransportHeader().Slice())
171-
routeSession.Source = M.AddrPortFrom(net.IP(ipHdr.SourceAddress()), tcpHdr.SourcePort())
172-
routeSession.Destination = M.AddrPortFrom(net.IP(ipHdr.DestinationAddress()), tcpHdr.DestinationPort())
173-
action := t.routeMapping.Lookup(routeSession, func() RouteAction {
174-
if routeSession.IPVersion == 4 {
175-
return t.router.RouteConnection(routeSession, &systemTCPDirectPacketWriter4{t.tun, routeSession.Source})
176-
} else {
177-
return t.router.RouteConnection(routeSession, &systemTCPDirectPacketWriter6{t.tun, routeSession.Source})
178-
}
179-
})
180-
switch actionType := action.(type) {
181-
case *ActionBlock:
182-
// TODO: send icmp unreachable
183-
return true
184-
case *ActionDirect:
185-
buffer.IncRef()
186-
err = actionType.WritePacketBuffer(buffer)
187-
if err != nil {
188-
t.logger.Trace("route gvisor tcp packet: ", err)
189-
}
190-
return true
191-
}
192-
}
193-
return tcpForwarder.HandlePacket(id, buffer)
194-
})
195-
151+
ipStack.SetTransportProtocolHandler(tcp.ProtocolNumber, tcpForwarder.HandlePacket)
196152
if !t.endpointIndependentNat {
197153
udpForwarder := udp.NewForwarder(ipStack, func(request *udp.ForwarderRequest) {
198154
var wq waiter.Queue
@@ -218,43 +174,7 @@ func (t *GVisor) Start() error {
218174
}
219175
}()
220176
})
221-
ipStack.SetTransportProtocolHandler(udp.ProtocolNumber, func(id stack.TransportEndpointID, buffer stack.PacketBufferPtr) bool {
222-
if t.router != nil {
223-
var routeSession RouteSession
224-
routeSession.Network = syscall.IPPROTO_UDP
225-
var ipHdr header.Network
226-
if buffer.NetworkProtocolNumber == header.IPv4ProtocolNumber {
227-
routeSession.IPVersion = 4
228-
ipHdr = header.IPv4(buffer.NetworkHeader().Slice())
229-
} else {
230-
routeSession.IPVersion = 6
231-
ipHdr = header.IPv6(buffer.NetworkHeader().Slice())
232-
}
233-
udpHdr := header.UDP(buffer.TransportHeader().Slice())
234-
routeSession.Source = M.AddrPortFrom(net.IP(ipHdr.SourceAddress()), udpHdr.SourcePort())
235-
routeSession.Destination = M.AddrPortFrom(net.IP(ipHdr.DestinationAddress()), udpHdr.DestinationPort())
236-
action := t.routeMapping.Lookup(routeSession, func() RouteAction {
237-
if routeSession.IPVersion == 4 {
238-
return t.router.RouteConnection(routeSession, &systemUDPDirectPacketWriter4{t.tun, routeSession.Source})
239-
} else {
240-
return t.router.RouteConnection(routeSession, &systemUDPDirectPacketWriter6{t.tun, routeSession.Source})
241-
}
242-
})
243-
switch actionType := action.(type) {
244-
case *ActionBlock:
245-
// TODO: send icmp unreachable
246-
return true
247-
case *ActionDirect:
248-
buffer.IncRef()
249-
err = actionType.WritePacketBuffer(buffer)
250-
if err != nil {
251-
t.logger.Trace("route gvisor udp packet: ", err)
252-
}
253-
return true
254-
}
255-
}
256-
return udpForwarder.HandlePacket(id, buffer)
257-
})
177+
ipStack.SetTransportProtocolHandler(udp.ProtocolNumber, udpForwarder.HandlePacket)
258178
} else {
259179
ipStack.SetTransportProtocolHandler(udp.ProtocolNumber, NewUDPForwarder(t.ctx, ipStack, t.handler, t.udpTimeout).HandlePacket)
260180
}
@@ -272,3 +192,19 @@ func (t *GVisor) Close() error {
272192
}
273193
return nil
274194
}
195+
196+
func addressFromAddr(destination netip.Addr) tcpip.Address {
197+
if destination.Is6() {
198+
return tcpip.AddrFrom16(destination.As16())
199+
} else {
200+
return tcpip.AddrFrom4(destination.As4())
201+
}
202+
}
203+
204+
func addrFromAddress(address tcpip.Address) netip.Addr {
205+
if address.Len() == 16 {
206+
return netip.AddrFrom16(address.As16())
207+
} else {
208+
return netip.AddrFrom4(address.As4())
209+
}
210+
}

gvisor_udp.go

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,14 @@ package tun
55
import (
66
"context"
77
"math"
8-
"net"
98
"net/netip"
109

1110
"github.com/sagernet/sing/common/buf"
1211
M "github.com/sagernet/sing/common/metadata"
1312
N "github.com/sagernet/sing/common/network"
1413
"github.com/sagernet/sing/common/udpnat"
1514

16-
"gvisor.dev/gvisor/pkg/bufferv2"
15+
"gvisor.dev/gvisor/pkg/buffer"
1716
"gvisor.dev/gvisor/pkg/tcpip"
1817
"gvisor.dev/gvisor/pkg/tcpip/checksum"
1918
"gvisor.dev/gvisor/pkg/tcpip/header"
@@ -36,8 +35,8 @@ func NewUDPForwarder(ctx context.Context, stack *stack.Stack, handler Handler, u
3635

3736
func (f *UDPForwarder) HandlePacket(id stack.TransportEndpointID, pkt stack.PacketBufferPtr) bool {
3837
var upstreamMetadata M.Metadata
39-
upstreamMetadata.Source = M.SocksaddrFrom(M.AddrFromIP(net.IP(id.RemoteAddress)), id.RemotePort)
40-
upstreamMetadata.Destination = M.SocksaddrFrom(M.AddrFromIP(net.IP(id.LocalAddress)), id.LocalPort)
38+
upstreamMetadata.Source = M.SocksaddrFrom(addrFromAddress(id.RemoteAddress), id.RemotePort)
39+
upstreamMetadata.Destination = M.SocksaddrFrom(addrFromAddress(id.LocalAddress), id.LocalPort)
4140
var netProto tcpip.NetworkProtocolNumber
4241
if upstreamMetadata.Source.IsIPv4() {
4342
netProto = header.IPv4ProtocolNumber
@@ -63,12 +62,12 @@ type UDPBackWriter struct {
6362
sourceNetwork tcpip.NetworkProtocolNumber
6463
}
6564

66-
func (w *UDPBackWriter) WritePacket(buffer *buf.Buffer, destination M.Socksaddr) error {
67-
defer buffer.Release()
65+
func (w *UDPBackWriter) WritePacket(packetBuffer *buf.Buffer, destination M.Socksaddr) error {
66+
defer packetBuffer.Release()
6867

6968
route, err := w.stack.FindRoute(
7069
defaultNIC,
71-
tcpip.Address(destination.Addr.AsSlice()),
70+
addressFromAddr(destination.Addr),
7271
w.source,
7372
w.sourceNetwork,
7473
false,
@@ -80,7 +79,7 @@ func (w *UDPBackWriter) WritePacket(buffer *buf.Buffer, destination M.Socksaddr)
8079

8180
packet := stack.NewPacketBuffer(stack.PacketBufferOptions{
8281
ReserveHeaderBytes: header.UDPMinimumSize + int(route.MaxHeaderLength()),
83-
Payload: bufferv2.MakeWithData(buffer.Bytes()),
82+
Payload: buffer.MakeWithData(packetBuffer.Bytes()),
8483
})
8584
defer packet.DecRef()
8685

internal/fdbased/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
# fdbased
22

3-
Version: release-20230417.0
3+
Version: release-20230605.0-21-g457c1c36d

internal/fdbased/endpoint.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ import (
4545

4646
"golang.org/x/sys/unix"
4747
"gvisor.dev/gvisor/pkg/atomicbitops"
48-
"gvisor.dev/gvisor/pkg/bufferv2"
48+
"gvisor.dev/gvisor/pkg/buffer"
4949
"gvisor.dev/gvisor/pkg/sync"
5050
"gvisor.dev/gvisor/pkg/tcpip"
5151
"gvisor.dev/gvisor/pkg/tcpip/header"
@@ -545,7 +545,7 @@ func (e *endpoint) writePacket(pkt stack.PacketBufferPtr) tcpip.Error {
545545
vnetHdr.csumStart = header.EthernetMinimumSize + pkt.GSOOptions.L3HdrLen
546546
vnetHdr.csumOffset = pkt.GSOOptions.CsumOffset
547547
}
548-
if pkt.GSOOptions.Type != stack.GSONone && uint16(pkt.Data().Size()) > pkt.GSOOptions.MSS {
548+
if uint16(pkt.Data().Size()) > pkt.GSOOptions.MSS {
549549
switch pkt.GSOOptions.Type {
550550
case stack.GSOTCPv4:
551551
vnetHdr.gsoType = _VIRTIO_NET_HDR_GSO_TCPV4
@@ -732,7 +732,7 @@ func (e *endpoint) WritePackets(pkts stack.PacketBufferList) (int, tcpip.Error)
732732
}
733733

734734
// InjectOutbound implements stack.InjectableEndpoint.InjectOutbound.
735-
func (e *endpoint) InjectOutbound(dest tcpip.Address, packet *bufferv2.View) tcpip.Error {
735+
func (e *endpoint) InjectOutbound(dest tcpip.Address, packet *buffer.View) tcpip.Error {
736736
return rawfile.NonBlockingWrite(e.fds[0].fd, packet.AsSlice())
737737
}
738738

@@ -756,7 +756,7 @@ func (e *endpoint) GSOMaxSize() uint32 {
756756
return e.gsoMaxSize
757757
}
758758

759-
// SupportsHWGSO implements stack.GSOEndpoint.
759+
// SupportedGSO implements stack.GSOEndpoint.
760760
func (e *endpoint) SupportedGSO() stack.SupportedGSO {
761761
return e.gsoKind
762762
}

internal/fdbased/mmap.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import (
2424
"github.com/sagernet/sing-tun/internal/fdbased/stopfd"
2525

2626
"golang.org/x/sys/unix"
27-
"gvisor.dev/gvisor/pkg/bufferv2"
27+
"gvisor.dev/gvisor/pkg/buffer"
2828
"gvisor.dev/gvisor/pkg/tcpip"
2929
"gvisor.dev/gvisor/pkg/tcpip/header"
3030
"gvisor.dev/gvisor/pkg/tcpip/link/rawfile"
@@ -135,7 +135,7 @@ type packetMMapDispatcher struct {
135135

136136
func (*packetMMapDispatcher) release() {}
137137

138-
func (d *packetMMapDispatcher) readMMappedPacket() (*bufferv2.View, bool, tcpip.Error) {
138+
func (d *packetMMapDispatcher) readMMappedPacket() (*buffer.View, bool, tcpip.Error) {
139139
hdr := tPacketHdr(d.ringBuffer[d.ringOffset*tpFrameSize:])
140140
for hdr.tpStatus()&tpStatusUser == 0 {
141141
stopped, errno := rawfile.BlockingPollUntilStopped(d.EFD, d.fd, unix.POLLIN|unix.POLLERR)
@@ -159,7 +159,7 @@ func (d *packetMMapDispatcher) readMMappedPacket() (*bufferv2.View, bool, tcpip.
159159
}
160160

161161
// Copy out the packet from the mmapped frame to a locally owned buffer.
162-
pkt := bufferv2.NewView(int(hdr.tpSnapLen()))
162+
pkt := buffer.NewView(int(hdr.tpSnapLen()))
163163
pkt.Write(hdr.Payload())
164164
// Release packet to kernel.
165165
hdr.setTPStatus(tpStatusKernel)
@@ -191,7 +191,7 @@ func (d *packetMMapDispatcher) dispatch() (bool, tcpip.Error) {
191191
}
192192

193193
pbuf := stack.NewPacketBuffer(stack.PacketBufferOptions{
194-
Payload: bufferv2.MakeWithView(pkt),
194+
Payload: buffer.MakeWithView(pkt),
195195
})
196196
defer pbuf.DecRef()
197197
if d.e.hdrSize > 0 {

internal/fdbased/packet_dispatchers.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import (
2121
"github.com/sagernet/sing-tun/internal/fdbased/stopfd"
2222

2323
"golang.org/x/sys/unix"
24-
"gvisor.dev/gvisor/pkg/bufferv2"
24+
"gvisor.dev/gvisor/pkg/buffer"
2525
"gvisor.dev/gvisor/pkg/tcpip"
2626
"gvisor.dev/gvisor/pkg/tcpip/header"
2727
"gvisor.dev/gvisor/pkg/tcpip/link/rawfile"
@@ -35,7 +35,7 @@ type iovecBuffer struct {
3535
// buffer is the actual buffer that holds the packet contents. Some contents
3636
// are reused across calls to pullBuffer if number of requested bytes is
3737
// smaller than the number of bytes allocated in the buffer.
38-
views []*bufferv2.View
38+
views []*buffer.View
3939

4040
// iovecs are initialized with base pointers/len of the corresponding
4141
// entries in the views defined above, except when GSO is enabled
@@ -59,7 +59,7 @@ type iovecBuffer struct {
5959

6060
func newIovecBuffer(sizes []int, skipsVnetHdr bool) *iovecBuffer {
6161
b := &iovecBuffer{
62-
views: make([]*bufferv2.View, len(sizes)),
62+
views: make([]*buffer.View, len(sizes)),
6363
sizes: sizes,
6464
skipsVnetHdr: skipsVnetHdr,
6565
}
@@ -87,7 +87,7 @@ func (b *iovecBuffer) nextIovecs() []unix.Iovec {
8787
if b.views[i] != nil {
8888
break
8989
}
90-
v := bufferv2.NewViewSize(b.sizes[i])
90+
v := buffer.NewViewSize(b.sizes[i])
9191
b.views[i] = v
9292
b.iovecs[i+vnetHdrOff] = unix.Iovec{Base: v.BasePtr()}
9393
b.iovecs[i+vnetHdrOff].SetLen(v.Size())
@@ -100,14 +100,14 @@ func (b *iovecBuffer) nextIovecs() []unix.Iovec {
100100
// that holds the storage, and updates pulledIndex to indicate which part
101101
// of b.buffer's storage must be reallocated during the next call to
102102
// nextIovecs.
103-
func (b *iovecBuffer) pullBuffer(n int) bufferv2.Buffer {
104-
var views []*bufferv2.View
103+
func (b *iovecBuffer) pullBuffer(n int) buffer.Buffer {
104+
var views []*buffer.View
105105
c := 0
106106
if b.skipsVnetHdr {
107107
c += virtioNetHdrSize
108108
if c >= n {
109109
// Nothing in the packet.
110-
return bufferv2.Buffer{}
110+
return buffer.Buffer{}
111111
}
112112
}
113113
// Remove the used views from the buffer.
@@ -126,7 +126,7 @@ func (b *iovecBuffer) pullBuffer(n int) bufferv2.Buffer {
126126
// Exclude the size of the vnet header.
127127
n -= virtioNetHdrSize
128128
}
129-
pulled := bufferv2.Buffer{}
129+
pulled := buffer.Buffer{}
130130
for _, v := range views {
131131
pulled.Append(v)
132132
}

internal/fdbased/stopfd/stopfd_state_autogen.go

Lines changed: 0 additions & 6 deletions
This file was deleted.

0 commit comments

Comments
 (0)