55 "encoding/binary"
66 "net"
77 "os"
8+ "time"
89
910 "github.com/sagernet/sing-box/adapter"
1011 C "github.com/sagernet/sing-box/constant"
@@ -50,14 +51,15 @@ func (d *DNS) NewConnection(ctx context.Context, conn net.Conn, metadata adapter
5051 metadata .Destination = M.Socksaddr {}
5152 defer conn .Close ()
5253 for {
53- err := d .handleConnection (ctx , conn , metadata )
54+ conn .SetReadDeadline (time .Now ().Add (C .DNSTimeout ))
55+ err := HandleStreamDNSRequest (ctx , d .router , conn , metadata )
5456 if err != nil {
5557 return err
5658 }
5759 }
5860}
5961
60- func ( d * DNS ) handleConnection ( ctx context.Context , conn net.Conn , metadata adapter.InboundContext ) error {
62+ func HandleStreamDNSRequest ( ctx context.Context , router adapter. Router , conn net.Conn , metadata adapter.InboundContext ) error {
6163 var queryLength uint16
6264 err := binary .Read (conn , binary .BigEndian , & queryLength )
6365 if err != nil {
@@ -79,7 +81,7 @@ func (d *DNS) handleConnection(ctx context.Context, conn net.Conn, metadata adap
7981 }
8082 metadataInQuery := metadata
8183 go func () error {
82- response , err := d . router .Exchange (adapter .WithContext (ctx , & metadataInQuery ), & message )
84+ response , err := router .Exchange (adapter .WithContext (ctx , & metadataInQuery ), & message )
8385 if err != nil {
8486 return err
8587 }
@@ -100,10 +102,14 @@ func (d *DNS) handleConnection(ctx context.Context, conn net.Conn, metadata adap
100102
101103// Deprecated
102104func (d * DNS ) NewPacketConnection (ctx context.Context , conn N.PacketConn , metadata adapter.InboundContext ) error {
105+ return NewDNSPacketConnection (ctx , d .router , conn , nil , metadata )
106+ }
107+
108+ func NewDNSPacketConnection (ctx context.Context , router adapter.Router , conn N.PacketConn , cachedPackets []* N.PacketBuffer , metadata adapter.InboundContext ) error {
103109 metadata .Destination = M.Socksaddr {}
104110 var reader N.PacketReader = conn
105111 var counters []N.CountFunc
106- var cachedPackets [] * N. PacketBuffer
112+ cachedPackets = common . Reverse ( cachedPackets )
107113 for {
108114 reader , counters = N .UnwrapCountPacketReader (reader , counters )
109115 if cachedReader , isCached := reader .(N.CachedPacketReader ); isCached {
@@ -115,7 +121,7 @@ func (d *DNS) NewPacketConnection(ctx context.Context, conn N.PacketConn, metada
115121 }
116122 if readWaiter , created := bufio .CreatePacketReadWaiter (reader ); created {
117123 readWaiter .InitializeReadWaiter (N.ReadWaitOptions {})
118- return d . newPacketConnection (ctx , conn , readWaiter , counters , cachedPackets , metadata )
124+ return newDNSPacketConnection (ctx , router , conn , readWaiter , counters , cachedPackets , metadata )
119125 }
120126 break
121127 }
@@ -161,7 +167,7 @@ func (d *DNS) NewPacketConnection(ctx context.Context, conn N.PacketConn, metada
161167 }
162168 metadataInQuery := metadata
163169 go func () error {
164- response , err := d . router .Exchange (adapter .WithContext (ctx , & metadataInQuery ), & message )
170+ response , err := router .Exchange (adapter .WithContext (ctx , & metadataInQuery ), & message )
165171 if err != nil {
166172 cancel (err )
167173 return err
@@ -186,7 +192,7 @@ func (d *DNS) NewPacketConnection(ctx context.Context, conn N.PacketConn, metada
186192 return group .Run (fastClose )
187193}
188194
189- func ( d * DNS ) newPacketConnection ( ctx context.Context , conn N.PacketConn , readWaiter N.PacketReadWaiter , readCounters []N.CountFunc , cached []* N.PacketBuffer , metadata adapter.InboundContext ) error {
195+ func newDNSPacketConnection ( ctx context.Context , router adapter. Router , conn N.PacketConn , readWaiter N.PacketReadWaiter , readCounters []N.CountFunc , cached []* N.PacketBuffer , metadata adapter.InboundContext ) error {
190196 fastClose , cancel := common .ContextWithCancelCause (ctx )
191197 timeout := canceler .New (fastClose , cancel , C .DNSTimeout )
192198 var group task.Group
@@ -206,11 +212,12 @@ func (d *DNS) newPacketConnection(ctx context.Context, conn N.PacketConn, readWa
206212 }
207213 err = message .Unpack (packet .Buffer .Bytes ())
208214 packet .Buffer .Release ()
215+ destination = packet .Destination
216+ N .PutPacketBuffer (packet )
209217 if err != nil {
210218 cancel (err )
211219 return err
212220 }
213- destination = packet .Destination
214221 } else {
215222 buffer , destination , err = readWaiter .WaitReadPacket ()
216223 if err != nil {
@@ -230,7 +237,7 @@ func (d *DNS) newPacketConnection(ctx context.Context, conn N.PacketConn, readWa
230237 }
231238 metadataInQuery := metadata
232239 go func () error {
233- response , err := d . router .Exchange (adapter .WithContext (ctx , & metadataInQuery ), & message )
240+ response , err := router .Exchange (adapter .WithContext (ctx , & metadataInQuery ), & message )
234241 if err != nil {
235242 cancel (err )
236243 return err
0 commit comments