@@ -19,6 +19,7 @@ import (
1919 "github.com/sagernet/sing/common/cache"
2020 E "github.com/sagernet/sing/common/exceptions"
2121 M "github.com/sagernet/sing/common/metadata"
22+ N "github.com/sagernet/sing/common/network"
2223)
2324
2425var udpMessagePool = sync.Pool {
@@ -114,20 +115,26 @@ func fragUDPMessage(message *udpMessage, maxPacketSize int) []*udpMessage {
114115 return fragments
115116}
116117
118+ var (
119+ _ N.NetPacketConn = (* udpPacketConn )(nil )
120+ _ N.PacketReadWaiter = (* udpPacketConn )(nil )
121+ )
122+
117123type udpPacketConn struct {
118- ctx context.Context
119- cancel common.ContextCancelCauseFunc
120- sessionID uint16
121- quicConn quic.Connection
122- data chan * udpMessage
123- udpStream bool
124- udpMTU int
125- udpMTUTime time.Time
126- packetId atomic.Uint32
127- closeOnce sync.Once
128- isServer bool
129- defragger * udpDefragger
130- onDestroy func ()
124+ ctx context.Context
125+ cancel common.ContextCancelCauseFunc
126+ sessionID uint16
127+ quicConn quic.Connection
128+ data chan * udpMessage
129+ udpStream bool
130+ udpMTU int
131+ udpMTUTime time.Time
132+ packetId atomic.Uint32
133+ closeOnce sync.Once
134+ isServer bool
135+ defragger * udpDefragger
136+ onDestroy func ()
137+ readWaitOptions N.ReadWaitOptions
131138}
132139
133140func newUDPPacketConn (ctx context.Context , quicConn quic.Connection , udpStream bool , isServer bool , onDestroy func ()) * udpPacketConn {
@@ -144,18 +151,6 @@ func newUDPPacketConn(ctx context.Context, quicConn quic.Connection, udpStream b
144151 }
145152}
146153
147- func (c * udpPacketConn ) ReadPacketThreadSafe () (buffer * buf.Buffer , destination M.Socksaddr , err error ) {
148- select {
149- case p := <- c .data :
150- buffer = p .data
151- destination = p .destination
152- p .release ()
153- return
154- case <- c .ctx .Done ():
155- return nil , M.Socksaddr {}, io .ErrClosedPipe
156- }
157- }
158-
159154func (c * udpPacketConn ) ReadPacket (buffer * buf.Buffer ) (destination M.Socksaddr , err error ) {
160155 select {
161156 case p := <- c .data :
@@ -168,18 +163,6 @@ func (c *udpPacketConn) ReadPacket(buffer *buf.Buffer) (destination M.Socksaddr,
168163 }
169164}
170165
171- func (c * udpPacketConn ) WaitReadPacket (newBuffer func () * buf.Buffer ) (destination M.Socksaddr , err error ) {
172- select {
173- case p := <- c .data :
174- _ , err = newBuffer ().ReadOnceFrom (p .data )
175- destination = p .destination
176- p .releaseMessage ()
177- return
178- case <- c .ctx .Done ():
179- return M.Socksaddr {}, io .ErrClosedPipe
180- }
181- }
182-
183166func (c * udpPacketConn ) ReadFrom (p []byte ) (n int , addr net.Addr , err error ) {
184167 select {
185168 case pkt := <- c .data :
0 commit comments