Skip to content

Commit dc5d3e8

Browse files
committed
Update network handler usages
1 parent 087eef2 commit dc5d3e8

14 files changed

Lines changed: 54 additions & 81 deletions

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ require (
88
github.com/sagernet/gvisor v0.0.0-20241019061641-46bad1ee6ecc
99
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a
1010
github.com/sagernet/nftables v0.3.0-beta.4
11-
github.com/sagernet/sing v0.5.0-rc.4
11+
github.com/sagernet/sing v0.5.0-rc.4.0.20241020060022-1270938dd44a
1212
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba
1313
golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8
1414
golang.org/x/net v0.26.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a h1:ObwtHN2VpqE0ZN
2222
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM=
2323
github.com/sagernet/nftables v0.3.0-beta.4 h1:kbULlAwAC3jvdGAC1P5Fa3GSxVwQJibNenDW2zaXr8I=
2424
github.com/sagernet/nftables v0.3.0-beta.4/go.mod h1:OQXAjvjNGGFxaTgVCSTRIhYB5/llyVDeapVoENYBDS8=
25-
github.com/sagernet/sing v0.5.0-rc.4 h1:pnZQz9leyY2nckGvOG0AUcBIyHOCrapwBd63qmP1hSk=
26-
github.com/sagernet/sing v0.5.0-rc.4/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
25+
github.com/sagernet/sing v0.5.0-rc.4.0.20241020060022-1270938dd44a h1:6qlFfBvLZT/MhDpUr4cKY6RxYTnaCcFgOrJEnf/0+io=
26+
github.com/sagernet/sing v0.5.0-rc.4.0.20241020060022-1270938dd44a/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
2727
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
2828
github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8=
2929
github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=

monitor_windows.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"sync"
55

66
"github.com/sagernet/sing-tun/internal/winipcfg"
7-
E "github.com/sagernet/sing/common/exceptions"
87
"github.com/sagernet/sing/common/logger"
98
"github.com/sagernet/sing/common/x/list"
109

@@ -14,7 +13,6 @@ import (
1413
type networkUpdateMonitor struct {
1514
routeListener *winipcfg.RouteChangeCallback
1615
interfaceListener *winipcfg.InterfaceChangeCallback
17-
errorHandler E.Handler
1816

1917
access sync.Mutex
2018
callbacks list.List[NetworkUpdateCallback]

redirect.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55

66
"github.com/sagernet/sing/common/control"
77
"github.com/sagernet/sing/common/logger"
8+
N "github.com/sagernet/sing/common/network"
89

910
"go4.org/netipx"
1011
)
@@ -23,7 +24,7 @@ type AutoRedirect interface {
2324
type AutoRedirectOptions struct {
2425
TunOptions *Options
2526
Context context.Context
26-
Handler Handler
27+
Handler N.TCPConnectionHandlerEx
2728
Logger logger.Logger
2829
NetworkMonitor NetworkUpdateMonitor
2930
InterfaceFinder control.InterfaceFinder

redirect_linux.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
E "github.com/sagernet/sing/common/exceptions"
1414
"github.com/sagernet/sing/common/logger"
1515
M "github.com/sagernet/sing/common/metadata"
16+
N "github.com/sagernet/sing/common/network"
1617
"github.com/sagernet/sing/common/x/list"
1718

1819
"go4.org/netipx"
@@ -21,7 +22,7 @@ import (
2122
type autoRedirect struct {
2223
tunOptions *Options
2324
ctx context.Context
24-
handler Handler
25+
handler N.TCPConnectionHandlerEx
2526
logger logger.Logger
2627
tableName string
2728
networkMonitor NetworkUpdateMonitor

redirect_server.go

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,19 @@ import (
1414
E "github.com/sagernet/sing/common/exceptions"
1515
"github.com/sagernet/sing/common/logger"
1616
M "github.com/sagernet/sing/common/metadata"
17+
N "github.com/sagernet/sing/common/network"
1718
)
1819

19-
const ProtocolRedirect = "redirect"
20-
2120
type redirectServer struct {
2221
ctx context.Context
23-
handler Handler
22+
handler N.TCPConnectionHandlerEx
2423
logger logger.Logger
2524
listenAddr netip.Addr
2625
listener *net.TCPListener
2726
inShutdown atomic.Bool
2827
}
2928

30-
func newRedirectServer(ctx context.Context, handler Handler, logger logger.Logger, listenAddr netip.Addr) *redirectServer {
29+
func newRedirectServer(ctx context.Context, handler N.TCPConnectionHandlerEx, logger logger.Logger, listenAddr netip.Addr) *redirectServer {
3130
return &redirectServer{
3231
ctx: ctx,
3332
handler: handler,
@@ -59,7 +58,6 @@ func (s *redirectServer) loopIn() {
5958
conn, err := s.listener.AcceptTCP()
6059
if err != nil {
6160
var netError net.Error
62-
//goland:noinspection GoDeprecation
6361
//nolint:staticcheck
6462
if errors.As(err, &netError) && netError.Temporary() {
6563
s.logger.Error(err)
@@ -72,17 +70,14 @@ func (s *redirectServer) loopIn() {
7270
s.logger.Error("serve error: ", err)
7371
continue
7472
}
75-
var metadata M.Metadata
76-
metadata.Protocol = ProtocolRedirect
77-
metadata.Source = M.SocksaddrFromNet(conn.RemoteAddr()).Unwrap()
73+
source := M.SocksaddrFromNet(conn.RemoteAddr()).Unwrap()
7874
destination, err := control.GetOriginalDestination(conn)
7975
if err != nil {
8076
_ = conn.SetLinger(0)
8177
_ = conn.Close()
82-
s.logger.Error("process connection from ", metadata.Source, ": invalid connection: ", err)
78+
s.logger.Error("process redirect connection from ", source, ": invalid connection: ", err)
8379
continue
8480
}
85-
metadata.Destination = M.SocksaddrFromNetIP(destination).Unwrap()
86-
go s.handler.NewConnection(s.ctx, conn, metadata)
81+
go s.handler.NewConnectionEx(s.ctx, conn, source, M.SocksaddrFromNetIP(destination).Unwrap(), nil)
8782
}
8883
}

stack.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111
"github.com/sagernet/sing/common/logger"
1212
)
1313

14+
var ErrDrop = E.New("drop connections by rule")
15+
1416
type Stack interface {
1517
Start() error
1618
Close() error

stack_gvisor.go

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -76,17 +76,16 @@ func (t *GVisor) Start() error {
7676
return err
7777
}
7878
tcpForwarder := tcp.NewForwarder(ipStack, 0, 1024, func(r *tcp.ForwarderRequest) {
79-
var metadata M.Metadata
80-
metadata.Source = M.SocksaddrFrom(AddrFromAddress(r.ID().RemoteAddress), r.ID().RemotePort)
81-
metadata.Destination = M.SocksaddrFrom(AddrFromAddress(r.ID().LocalAddress), r.ID().LocalPort)
79+
source := M.SocksaddrFrom(AddrFromAddress(r.ID().RemoteAddress), r.ID().RemotePort)
80+
destination := M.SocksaddrFrom(AddrFromAddress(r.ID().LocalAddress), r.ID().LocalPort)
8281
conn := &gLazyConn{
8382
parentCtx: t.ctx,
8483
stack: t.stack,
8584
request: r,
86-
localAddr: metadata.Source.TCPAddr(),
87-
remoteAddr: metadata.Destination.TCPAddr(),
85+
localAddr: source.TCPAddr(),
86+
remoteAddr: destination.TCPAddr(),
8887
}
89-
_ = t.handler.NewConnection(t.ctx, conn, metadata)
88+
go t.handler.NewConnectionEx(t.ctx, conn, source, destination, nil)
9089
})
9190
ipStack.SetTransportProtocolHandler(tcp.ProtocolNumber, tcpForwarder.HandlePacket)
9291
if !t.endpointIndependentNat {
@@ -104,14 +103,10 @@ func (t *GVisor) Start() error {
104103
return
105104
}
106105
go func() {
107-
var metadata M.Metadata
108-
metadata.Source = M.SocksaddrFromNet(lAddr)
109-
metadata.Destination = M.SocksaddrFromNet(rAddr)
110-
ctx, conn := canceler.NewPacketConn(t.ctx, bufio.NewUnbindPacketConnWithAddr(udpConn, metadata.Destination), time.Duration(t.udpTimeout)*time.Second)
111-
hErr := t.handler.NewPacketConnection(ctx, conn, metadata)
112-
if hErr != nil {
113-
endpoint.Abort()
114-
}
106+
source := M.SocksaddrFromNet(lAddr)
107+
destination := M.SocksaddrFromNet(rAddr)
108+
ctx, conn := canceler.NewPacketConn(t.ctx, bufio.NewUnbindPacketConnWithAddr(udpConn, destination), time.Duration(t.udpTimeout)*time.Second)
109+
t.handler.NewPacketConnectionEx(ctx, conn, source, destination, nil)
115110
}()
116111
})
117112
ipStack.SetTransportProtocolHandler(udp.ProtocolNumber, udpForwarder.HandlePacket)

stack_gvisor_lazy.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,7 @@ func (c *gLazyConn) HandshakeFailure(err error) error {
7171
if c.handshakeDone {
7272
return nil
7373
}
74-
wErr := gWriteUnreachable(c.stack, c.request.Packet(), err)
75-
c.request.Complete(wErr == os.ErrInvalid)
74+
c.request.Complete(gWriteUnreachable(c.stack, c.request.Packet(), err) == os.ErrInvalid)
7675
c.handshakeDone = true
7776
c.handshakeErr = err
7877
return nil
@@ -196,9 +195,11 @@ func (c *gLazyConn) Upstream() any {
196195
}
197196

198197
func gWriteUnreachable(gStack *stack.Stack, packet *stack.PacketBuffer, err error) error {
199-
if errors.Is(err, syscall.ENETUNREACH) {
198+
if errors.Is(err, ErrDrop) {
199+
return nil
200+
} else if errors.Is(err, syscall.ENETUNREACH) {
200201
if packet.NetworkProtocolNumber == header.IPv4ProtocolNumber {
201-
return gWriteUnreachable4(gStack, packet, stack.RejectIPv4WithICMPPortUnreachable)
202+
return gWriteUnreachable4(gStack, packet, stack.RejectIPv4WithICMPNetProhibited)
202203
} else {
203204
return gWriteUnreachable6(gStack, packet, stack.RejectIPv6WithICMPNoRoute)
204205
}

stack_gvisor_udp.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,14 @@ func NewUDPForwarder(ctx context.Context, stack *stack.Stack, handler Handler, u
3636
return &UDPForwarder{
3737
ctx: ctx,
3838
stack: stack,
39-
udpNat: udpnat.New[netip.AddrPort](udpTimeout, handler),
39+
udpNat: udpnat.NewEx[netip.AddrPort](udpTimeout, handler),
4040
}
4141
}
4242

4343
func (f *UDPForwarder) HandlePacket(id stack.TransportEndpointID, pkt *stack.PacketBuffer) bool {
44-
var upstreamMetadata M.Metadata
45-
upstreamMetadata.Source = M.SocksaddrFrom(AddrFromAddress(id.RemoteAddress), id.RemotePort)
46-
upstreamMetadata.Destination = M.SocksaddrFrom(AddrFromAddress(id.LocalAddress), id.LocalPort)
47-
if upstreamMetadata.Source.IsIPv4() {
44+
source := M.SocksaddrFrom(AddrFromAddress(id.RemoteAddress), id.RemotePort)
45+
destination := M.SocksaddrFrom(AddrFromAddress(id.LocalAddress), id.LocalPort)
46+
if source.IsIPv4() {
4847
f.cacheProto = header.IPv4ProtocolNumber
4948
} else {
5049
f.cacheProto = header.IPv6ProtocolNumber
@@ -55,11 +54,12 @@ func (f *UDPForwarder) HandlePacket(id stack.TransportEndpointID, pkt *stack.Pac
5554
sBuffer.Write(view.AsSlice())
5655
})
5756
f.cacheID = id
58-
f.udpNat.NewPacket(
57+
f.udpNat.NewPacketEx(
5958
f.ctx,
60-
upstreamMetadata.Source.AddrPort(),
59+
source.AddrPort(),
6160
sBuffer,
62-
upstreamMetadata,
61+
source,
62+
destination,
6363
f.newUDPConn,
6464
)
6565
return true

0 commit comments

Comments
 (0)