@@ -4,8 +4,7 @@ package tun
44
55import (
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
4744type 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+ }
0 commit comments