Skip to content

Commit 6586c4b

Browse files
committed
Add UoT read waiter support
1 parent 7c9b4d6 commit 6586c4b

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

common/bufio/copy_direct_posix.go

-1
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,6 @@ func (w *syscallPacketReadWaiter) InitializeReadWaiter(newBuffer func() *buf.Buf
213213
buffer.Truncate(readN)
214214
} else {
215215
buffer.Release()
216-
buffer = nil
217216
}
218217
if w.readErr == syscall.EAGAIN {
219218
return false

common/uot/conn.go

+33
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,17 @@ import (
1313
N "github.com/sagernet/sing/common/network"
1414
)
1515

16+
var (
17+
_ N.NetPacketConn = (*Conn)(nil)
18+
_ N.PacketReadWaiter = (*Conn)(nil)
19+
)
20+
1621
type Conn struct {
1722
net.Conn
1823
isConnect bool
1924
destination M.Socksaddr
2025
writer N.VectorisedWriter
26+
newBuffer func() *buf.Buffer
2127
}
2228

2329
func NewConn(conn net.Conn, request Request) *Conn {
@@ -135,6 +141,33 @@ func (c *Conn) WritePacket(buffer *buf.Buffer, destination M.Socksaddr) error {
135141
return c.writer.WriteVectorised([]*buf.Buffer{header, buffer})
136142
}
137143

144+
func (c *Conn) InitializeReadWaiter(newBuffer func() *buf.Buffer) {
145+
c.newBuffer = newBuffer
146+
}
147+
148+
func (c *Conn) WaitReadPacket() (destination M.Socksaddr, err error) {
149+
if c.isConnect {
150+
destination = c.destination
151+
} else {
152+
destination, err = AddrParser.ReadAddrPort(c.Conn)
153+
if err != nil {
154+
return
155+
}
156+
}
157+
var length uint16
158+
err = binary.Read(c.Conn, binary.BigEndian, &length)
159+
if err != nil {
160+
return
161+
}
162+
buffer := c.newBuffer()
163+
_, err = buffer.ReadFullFrom(c.Conn, int(length))
164+
if err != nil {
165+
buffer.Release()
166+
return M.Socksaddr{}, E.Cause(err, "UoT read")
167+
}
168+
return
169+
}
170+
138171
func (c *Conn) NeedAdditionalReadDeadline() bool {
139172
return true
140173
}

0 commit comments

Comments
 (0)