Skip to content

Commit 349e408

Browse files
committed
Crazy sekai overturns the small pond
1 parent d59ac57 commit 349e408

File tree

15 files changed

+563
-130
lines changed

15 files changed

+563
-130
lines changed

common/bufio/addr_conn.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,20 @@ import (
99

1010
type AddrConn struct {
1111
net.Conn
12-
M.Metadata
12+
Source M.Socksaddr
13+
Destination M.Socksaddr
1314
}
1415

1516
func (c *AddrConn) LocalAddr() net.Addr {
16-
if c.Metadata.Destination.IsValid() {
17-
return c.Metadata.Destination.TCPAddr()
17+
if c.Destination.IsValid() {
18+
return c.Destination.TCPAddr()
1819
}
1920
return c.Conn.LocalAddr()
2021
}
2122

2223
func (c *AddrConn) RemoteAddr() net.Addr {
23-
if c.Metadata.Source.IsValid() {
24-
return c.Metadata.Source.TCPAddr()
24+
if c.Source.IsValid() {
25+
return c.Source.TCPAddr()
2526
}
2627
return c.Conn.RemoteAddr()
2728
}

common/bufio/vectorised_unix.go

-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ func (w *SyscallVectorisedWriter) WriteVectorised(buffers []*buf.Buffer) error {
3838
var innerErr unix.Errno
3939
err := w.rawConn.Write(func(fd uintptr) (done bool) {
4040
//nolint:staticcheck
41-
//goland:noinspection GoDeprecation
4241
_, _, innerErr = unix.Syscall(unix.SYS_WRITEV, fd, uintptr(unsafe.Pointer(&iovecList[0])), uintptr(len(iovecList)))
4342
return innerErr != unix.EAGAIN && innerErr != unix.EWOULDBLOCK
4443
})

common/exceptions/error.go

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
F "github.com/sagernet/sing/common/format"
1313
)
1414

15+
// Deprecated: wtf is this?
1516
type Handler interface {
1617
NewError(ctx context.Context, err error)
1718
}

common/exceptions/timeout.go

-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ type TimeoutError interface {
1212
func IsTimeout(err error) bool {
1313
var netErr net.Error
1414
if errors.As(err, &netErr) {
15-
//goland:noinspection GoDeprecation
1615
//nolint:staticcheck
1716
return netErr.Temporary() && netErr.Timeout()
1817
}

common/metadata/metadata.go

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package metadata
22

3+
// Deprecated: wtf is this?
34
type Metadata struct {
45
Protocol string
56
Source Socksaddr

common/network/conn.go

+38-3
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,29 @@ type ExtendedConn interface {
7070
net.Conn
7171
}
7272

73+
type CloseHandler = func(it error)
74+
75+
func AppendCloseHandler(parent CloseHandler, child CloseHandler) CloseHandler {
76+
if parent == nil {
77+
return parent
78+
} else if child == nil {
79+
return child
80+
}
81+
return func(it error) {
82+
child(it)
83+
parent(it)
84+
}
85+
}
86+
87+
// Deprecated: Use TCPConnectionHandlerEx instead.
7388
type TCPConnectionHandler interface {
74-
NewConnection(ctx context.Context, conn net.Conn, metadata M.Metadata) error
89+
NewConnection(ctx context.Context, conn net.Conn,
90+
//nolint:staticcheck
91+
metadata M.Metadata) error
92+
}
93+
94+
type TCPConnectionHandlerEx interface {
95+
NewConnectionEx(ctx context.Context, conn net.Conn, source M.Socksaddr, destination M.Socksaddr, onClose CloseHandler)
7596
}
7697

7798
type NetPacketConn interface {
@@ -85,12 +106,26 @@ type BindPacketConn interface {
85106
net.Conn
86107
}
87108

109+
// Deprecated: Use UDPHandlerEx instead.
88110
type UDPHandler interface {
89-
NewPacket(ctx context.Context, conn PacketConn, buffer *buf.Buffer, metadata M.Metadata) error
111+
NewPacket(ctx context.Context, conn PacketConn, buffer *buf.Buffer,
112+
//nolint:staticcheck
113+
metadata M.Metadata) error
114+
}
115+
116+
type UDPHandlerEx interface {
117+
NewPacket(ctx context.Context, conn PacketConn, buffer *buf.Buffer, source M.Socksaddr, destination M.Socksaddr) error
90118
}
91119

120+
// Deprecated: Use UDPConnectionHandlerEx instead.
92121
type UDPConnectionHandler interface {
93-
NewPacketConnection(ctx context.Context, conn PacketConn, metadata M.Metadata) error
122+
NewPacketConnection(ctx context.Context, conn PacketConn,
123+
//nolint:staticcheck
124+
metadata M.Metadata) error
125+
}
126+
127+
type UDPConnectionHandlerEx interface {
128+
NewPacketConnectionEx(ctx context.Context, conn PacketConn, source M.Socksaddr, destination M.Socksaddr, onClose CloseHandler)
94129
}
95130

96131
type CachedReader interface {

common/network/handshake.go

+54-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package network
22

33
import (
4+
"net"
5+
46
"github.com/sagernet/sing/common"
57
E "github.com/sagernet/sing/common/exceptions"
68
)
@@ -13,17 +15,65 @@ type HandshakeSuccess interface {
1315
HandshakeSuccess() error
1416
}
1517

16-
func ReportHandshakeFailure(conn any, err error) error {
17-
if handshakeConn, isHandshakeConn := common.Cast[HandshakeFailure](conn); isHandshakeConn {
18+
type ConnHandshakeSuccess interface {
19+
ConnHandshakeSuccess(conn net.Conn) error
20+
}
21+
22+
type PacketConnHandshakeSuccess interface {
23+
PacketConnHandshakeSuccess(conn net.PacketConn) error
24+
}
25+
26+
func ReportHandshakeFailure(reporter any, err error) error {
27+
if handshakeConn, isHandshakeConn := common.Cast[HandshakeFailure](reporter); isHandshakeConn {
1828
return E.Append(err, handshakeConn.HandshakeFailure(err), func(err error) error {
1929
return E.Cause(err, "write handshake failure")
2030
})
2131
}
2232
return err
2333
}
2434

25-
func ReportHandshakeSuccess(conn any) error {
26-
if handshakeConn, isHandshakeConn := common.Cast[HandshakeSuccess](conn); isHandshakeConn {
35+
func CloseOnHandshakeFailure(reporter any, onClose CloseHandler, err error) error {
36+
if handshakeConn, isHandshakeConn := common.Cast[HandshakeFailure](reporter); isHandshakeConn {
37+
err = E.Append(err, handshakeConn.HandshakeFailure(err), func(err error) error {
38+
return E.Cause(err, "write handshake failure")
39+
})
40+
} else {
41+
if tcpConn, isTCPConn := common.Cast[interface {
42+
SetLinger(sec int) error
43+
}](reporter); isTCPConn {
44+
tcpConn.SetLinger(0)
45+
}
46+
common.Close(reporter)
47+
}
48+
if onClose != nil {
49+
onClose(err)
50+
}
51+
return err
52+
}
53+
54+
// Deprecated: use ReportConnHandshakeSuccess/ReportPacketConnHandshakeSuccess instead
55+
func ReportHandshakeSuccess(reporter any) error {
56+
if handshakeConn, isHandshakeConn := common.Cast[HandshakeSuccess](reporter); isHandshakeConn {
57+
return handshakeConn.HandshakeSuccess()
58+
}
59+
return nil
60+
}
61+
62+
func ReportConnHandshakeSuccess(reporter any, conn net.Conn) error {
63+
if handshakeConn, isHandshakeConn := common.Cast[ConnHandshakeSuccess](reporter); isHandshakeConn {
64+
return handshakeConn.ConnHandshakeSuccess(conn)
65+
}
66+
if handshakeConn, isHandshakeConn := common.Cast[HandshakeSuccess](reporter); isHandshakeConn {
67+
return handshakeConn.HandshakeSuccess()
68+
}
69+
return nil
70+
}
71+
72+
func ReportPacketConnHandshakeSuccess(reporter any, conn net.PacketConn) error {
73+
if handshakeConn, isHandshakeConn := common.Cast[PacketConnHandshakeSuccess](reporter); isHandshakeConn {
74+
return handshakeConn.PacketConnHandshakeSuccess(conn)
75+
}
76+
if handshakeConn, isHandshakeConn := common.Cast[HandshakeSuccess](reporter); isHandshakeConn {
2777
return handshakeConn.HandshakeSuccess()
2878
}
2979
return nil

common/network/thread.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ type ThreadUnsafeWriter interface {
1111
}
1212

1313
// Deprecated: Use ReadWaiter interface instead.
14+
1415
type ThreadSafeReader interface {
1516
// Deprecated: Use ReadWaiter interface instead.
1617
ReadBufferThreadSafe() (buffer *buf.Buffer, err error)
1718
}
1819

1920
// Deprecated: Use ReadWaiter interface instead.
2021
type ThreadSafePacketReader interface {
21-
// Deprecated: Use ReadWaiter interface instead.
2222
ReadPacketThreadSafe() (buffer *buf.Buffer, addr M.Socksaddr, err error)
2323
}
2424

common/random/seed_go119.go

-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,5 @@ func InitializeSeed() {
2020
func initializeSeed() {
2121
var seed int64
2222
common.Must(binary.Read(rand.Reader, binary.LittleEndian, &seed))
23-
//goland:noinspection GoDeprecation
2423
mRand.Seed(seed)
2524
}

common/rw/varint.go

-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ func ToByteReader(reader io.Reader) io.ByteReader {
2727

2828
// Deprecated: Use binary.ReadUvarint instead.
2929
func ReadUVariant(reader io.Reader) (uint64, error) {
30-
//goland:noinspection GoDeprecation
3130
return binary.ReadUvarint(ToByteReader(reader))
3231
}
3332

common/udpnat/service.go

+56-13
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,23 @@ import (
1616
"github.com/sagernet/sing/common/pipe"
1717
)
1818

19+
// Deprecated: Use N.UDPConnectionHandler instead.
20+
//
21+
//nolint:staticcheck
1922
type Handler interface {
2023
N.UDPConnectionHandler
2124
E.Handler
2225
}
2326

2427
type Service[K comparable] struct {
25-
nat *cache.LruCache[K, *conn]
26-
handler Handler
28+
nat *cache.LruCache[K, *conn]
29+
handler Handler
30+
handlerEx N.UDPConnectionHandlerEx
2731
}
2832

33+
// Deprecated: Use NewEx instead.
2934
func New[K comparable](maxAge int64, handler Handler) *Service[K] {
30-
return &Service[K]{
35+
service := &Service[K]{
3136
nat: cache.New(
3237
cache.WithAge[K, *conn](maxAge),
3338
cache.WithUpdateAgeOnGet[K, *conn](),
@@ -37,11 +42,27 @@ func New[K comparable](maxAge int64, handler Handler) *Service[K] {
3742
),
3843
handler: handler,
3944
}
45+
return service
46+
}
47+
48+
func NewEx[K comparable](maxAge int64, handler N.UDPConnectionHandlerEx) *Service[K] {
49+
service := &Service[K]{
50+
nat: cache.New(
51+
cache.WithAge[K, *conn](maxAge),
52+
cache.WithUpdateAgeOnGet[K, *conn](),
53+
cache.WithEvict[K, *conn](func(key K, conn *conn) {
54+
conn.Close()
55+
}),
56+
),
57+
handlerEx: handler,
58+
}
59+
return service
4060
}
4161

4262
func (s *Service[T]) WriteIsThreadUnsafe() {
4363
}
4464

65+
// Deprecated: don't use
4566
func (s *Service[T]) NewPacketDirect(ctx context.Context, key T, conn N.PacketConn, buffer *buf.Buffer, metadata M.Metadata) {
4667
s.NewContextPacket(ctx, key, buffer, metadata, func(natConn N.PacketConn) (context.Context, N.PacketWriter) {
4768
return ctx, &DirectBackWriter{conn, natConn}
@@ -61,18 +82,30 @@ func (w *DirectBackWriter) Upstream() any {
6182
return w.Source
6283
}
6384

85+
// Deprecated: use NewPacketEx instead.
6486
func (s *Service[T]) NewPacket(ctx context.Context, key T, buffer *buf.Buffer, metadata M.Metadata, init func(natConn N.PacketConn) N.PacketWriter) {
6587
s.NewContextPacket(ctx, key, buffer, metadata, func(natConn N.PacketConn) (context.Context, N.PacketWriter) {
6688
return ctx, init(natConn)
6789
})
6890
}
6991

92+
func (s *Service[T]) NewPacketEx(ctx context.Context, key T, buffer *buf.Buffer, source M.Socksaddr, destination M.Socksaddr, init func(natConn N.PacketConn) N.PacketWriter) {
93+
s.NewContextPacketEx(ctx, key, buffer, source, destination, func(natConn N.PacketConn) (context.Context, N.PacketWriter) {
94+
return ctx, init(natConn)
95+
})
96+
}
97+
98+
// Deprecated: Use NewPacketConnectionEx instead.
7099
func (s *Service[T]) NewContextPacket(ctx context.Context, key T, buffer *buf.Buffer, metadata M.Metadata, init func(natConn N.PacketConn) (context.Context, N.PacketWriter)) {
100+
s.NewContextPacketEx(ctx, key, buffer, metadata.Source, metadata.Destination, init)
101+
}
102+
103+
func (s *Service[T]) NewContextPacketEx(ctx context.Context, key T, buffer *buf.Buffer, source M.Socksaddr, destination M.Socksaddr, init func(natConn N.PacketConn) (context.Context, N.PacketWriter)) {
71104
c, loaded := s.nat.LoadOrStore(key, func() *conn {
72105
c := &conn{
73106
data: make(chan packet, 64),
74-
localAddr: metadata.Source,
75-
remoteAddr: metadata.Destination,
107+
localAddr: source,
108+
remoteAddr: destination,
76109
readDeadline: pipe.MakeDeadline(),
77110
}
78111
c.ctx, c.cancel = common.ContextWithCancelCause(ctx)
@@ -81,26 +114,36 @@ func (s *Service[T]) NewContextPacket(ctx context.Context, key T, buffer *buf.Bu
81114
if !loaded {
82115
ctx, c.source = init(c)
83116
go func() {
84-
err := s.handler.NewPacketConnection(ctx, c, metadata)
85-
if err != nil {
86-
s.handler.NewError(ctx, err)
117+
if s.handlerEx != nil {
118+
s.handlerEx.NewPacketConnectionEx(ctx, c, source, destination, func(err error) {
119+
s.nat.Delete(key)
120+
})
121+
} else {
122+
//nolint:staticcheck
123+
err := s.handler.NewPacketConnection(ctx, c, M.Metadata{
124+
Source: source,
125+
Destination: destination,
126+
})
127+
if err != nil {
128+
s.handler.NewError(ctx, err)
129+
}
130+
c.Close()
131+
s.nat.Delete(key)
87132
}
88-
c.Close()
89-
s.nat.Delete(key)
90133
}()
91134
} else {
92-
c.localAddr = metadata.Source
135+
c.localAddr = source
93136
}
94137
if common.Done(c.ctx) {
95138
s.nat.Delete(key)
96139
if !common.Done(ctx) {
97-
s.NewContextPacket(ctx, key, buffer, metadata, init)
140+
s.NewContextPacketEx(ctx, key, buffer, source, destination, init)
98141
}
99142
return
100143
}
101144
c.data <- packet{
102145
data: buffer,
103-
destination: metadata.Destination,
146+
destination: destination,
104147
}
105148
}
106149

0 commit comments

Comments
 (0)