default_udp.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. package inbound
  2. import (
  3. "net"
  4. "os"
  5. "time"
  6. "github.com/sagernet/sing-box/adapter"
  7. "github.com/sagernet/sing/common"
  8. "github.com/sagernet/sing/common/buf"
  9. "github.com/sagernet/sing/common/control"
  10. E "github.com/sagernet/sing/common/exceptions"
  11. M "github.com/sagernet/sing/common/metadata"
  12. N "github.com/sagernet/sing/common/network"
  13. )
  14. func (a *myInboundAdapter) ListenUDP() (net.PacketConn, error) {
  15. bindAddr := M.SocksaddrFrom(a.listenOptions.Listen.Build(), a.listenOptions.ListenPort)
  16. var lc net.ListenConfig
  17. var udpFragment bool
  18. if a.listenOptions.UDPFragment != nil {
  19. udpFragment = *a.listenOptions.UDPFragment
  20. } else {
  21. udpFragment = a.listenOptions.UDPFragmentDefault
  22. }
  23. if !udpFragment {
  24. lc.Control = control.Append(lc.Control, control.DisableUDPFragment())
  25. }
  26. udpConn, err := lc.ListenPacket(a.ctx, M.NetworkFromNetAddr(N.NetworkUDP, bindAddr.Addr), bindAddr.String())
  27. if err != nil {
  28. return nil, err
  29. }
  30. a.udpConn = udpConn.(*net.UDPConn)
  31. a.udpAddr = bindAddr
  32. a.logger.Info("udp server started at ", udpConn.LocalAddr())
  33. return udpConn, err
  34. }
  35. func (a *myInboundAdapter) loopUDPIn() {
  36. defer close(a.packetOutboundClosed)
  37. buffer := buf.NewPacket()
  38. defer buffer.Release()
  39. buffer.IncRef()
  40. defer buffer.DecRef()
  41. packetService := (*myInboundPacketAdapter)(a)
  42. for {
  43. buffer.Reset()
  44. n, addr, err := a.udpConn.ReadFromUDPAddrPort(buffer.FreeBytes())
  45. if err != nil {
  46. return
  47. }
  48. buffer.Truncate(n)
  49. var metadata adapter.InboundContext
  50. metadata.Inbound = a.tag
  51. metadata.InboundType = a.protocol
  52. metadata.InboundOptions = a.listenOptions.InboundOptions
  53. metadata.Source = M.SocksaddrFromNetIP(addr).Unwrap()
  54. metadata.OriginDestination = a.udpAddr
  55. err = a.packetHandler.NewPacket(a.ctx, packetService, buffer, metadata)
  56. if err != nil {
  57. a.newError(E.Cause(err, "process packet from ", metadata.Source))
  58. }
  59. }
  60. }
  61. func (a *myInboundAdapter) loopUDPOOBIn() {
  62. defer close(a.packetOutboundClosed)
  63. buffer := buf.NewPacket()
  64. defer buffer.Release()
  65. buffer.IncRef()
  66. defer buffer.DecRef()
  67. packetService := (*myInboundPacketAdapter)(a)
  68. oob := make([]byte, 1024)
  69. for {
  70. buffer.Reset()
  71. n, oobN, _, addr, err := a.udpConn.ReadMsgUDPAddrPort(buffer.FreeBytes(), oob)
  72. if err != nil {
  73. return
  74. }
  75. buffer.Truncate(n)
  76. var metadata adapter.InboundContext
  77. metadata.Inbound = a.tag
  78. metadata.InboundType = a.protocol
  79. metadata.InboundOptions = a.listenOptions.InboundOptions
  80. metadata.Source = M.SocksaddrFromNetIP(addr).Unwrap()
  81. metadata.OriginDestination = a.udpAddr
  82. err = a.oobPacketHandler.NewPacket(a.ctx, packetService, buffer, oob[:oobN], metadata)
  83. if err != nil {
  84. a.newError(E.Cause(err, "process packet from ", metadata.Source))
  85. }
  86. }
  87. }
  88. func (a *myInboundAdapter) loopUDPInThreadSafe() {
  89. defer close(a.packetOutboundClosed)
  90. packetService := (*myInboundPacketAdapter)(a)
  91. for {
  92. buffer := buf.NewPacket()
  93. n, addr, err := a.udpConn.ReadFromUDPAddrPort(buffer.FreeBytes())
  94. if err != nil {
  95. buffer.Release()
  96. return
  97. }
  98. buffer.Truncate(n)
  99. var metadata adapter.InboundContext
  100. metadata.Inbound = a.tag
  101. metadata.InboundType = a.protocol
  102. metadata.InboundOptions = a.listenOptions.InboundOptions
  103. metadata.Source = M.SocksaddrFromNetIP(addr).Unwrap()
  104. metadata.OriginDestination = a.udpAddr
  105. err = a.packetHandler.NewPacket(a.ctx, packetService, buffer, metadata)
  106. if err != nil {
  107. buffer.Release()
  108. a.newError(E.Cause(err, "process packet from ", metadata.Source))
  109. }
  110. }
  111. }
  112. func (a *myInboundAdapter) loopUDPOOBInThreadSafe() {
  113. defer close(a.packetOutboundClosed)
  114. packetService := (*myInboundPacketAdapter)(a)
  115. oob := make([]byte, 1024)
  116. for {
  117. buffer := buf.NewPacket()
  118. n, oobN, _, addr, err := a.udpConn.ReadMsgUDPAddrPort(buffer.FreeBytes(), oob)
  119. if err != nil {
  120. buffer.Release()
  121. return
  122. }
  123. buffer.Truncate(n)
  124. var metadata adapter.InboundContext
  125. metadata.Inbound = a.tag
  126. metadata.InboundType = a.protocol
  127. metadata.InboundOptions = a.listenOptions.InboundOptions
  128. metadata.Source = M.SocksaddrFromNetIP(addr).Unwrap()
  129. metadata.OriginDestination = a.udpAddr
  130. err = a.oobPacketHandler.NewPacket(a.ctx, packetService, buffer, oob[:oobN], metadata)
  131. if err != nil {
  132. buffer.Release()
  133. a.newError(E.Cause(err, "process packet from ", metadata.Source))
  134. }
  135. }
  136. }
  137. func (a *myInboundAdapter) loopUDPOut() {
  138. for {
  139. select {
  140. case packet := <-a.packetOutbound:
  141. err := a.writePacket(packet.buffer, packet.destination)
  142. if err != nil && !E.IsClosed(err) {
  143. a.newError(E.New("write back udp: ", err))
  144. }
  145. continue
  146. case <-a.packetOutboundClosed:
  147. }
  148. for {
  149. select {
  150. case packet := <-a.packetOutbound:
  151. packet.buffer.Release()
  152. default:
  153. return
  154. }
  155. }
  156. }
  157. }
  158. func (a *myInboundAdapter) writePacket(buffer *buf.Buffer, destination M.Socksaddr) error {
  159. defer buffer.Release()
  160. if destination.IsFqdn() {
  161. udpAddr, err := net.ResolveUDPAddr(N.NetworkUDP, destination.String())
  162. if err != nil {
  163. return err
  164. }
  165. return common.Error(a.udpConn.WriteTo(buffer.Bytes(), udpAddr))
  166. }
  167. return common.Error(a.udpConn.WriteToUDPAddrPort(buffer.Bytes(), destination.AddrPort()))
  168. }
  169. type myInboundPacketAdapter myInboundAdapter
  170. func (s *myInboundPacketAdapter) ReadPacket(buffer *buf.Buffer) (M.Socksaddr, error) {
  171. n, addr, err := s.udpConn.ReadFromUDPAddrPort(buffer.FreeBytes())
  172. if err != nil {
  173. return M.Socksaddr{}, err
  174. }
  175. buffer.Truncate(n)
  176. return M.SocksaddrFromNetIP(addr), nil
  177. }
  178. func (s *myInboundPacketAdapter) WriteIsThreadUnsafe() {
  179. }
  180. type myInboundPacket struct {
  181. buffer *buf.Buffer
  182. destination M.Socksaddr
  183. }
  184. func (s *myInboundPacketAdapter) Upstream() any {
  185. return s.udpConn
  186. }
  187. func (s *myInboundPacketAdapter) WritePacket(buffer *buf.Buffer, destination M.Socksaddr) error {
  188. select {
  189. case s.packetOutbound <- &myInboundPacket{buffer, destination}:
  190. return nil
  191. case <-s.packetOutboundClosed:
  192. return os.ErrClosed
  193. }
  194. }
  195. func (s *myInboundPacketAdapter) Close() error {
  196. return s.udpConn.Close()
  197. }
  198. func (s *myInboundPacketAdapter) LocalAddr() net.Addr {
  199. return s.udpConn.LocalAddr()
  200. }
  201. func (s *myInboundPacketAdapter) SetDeadline(t time.Time) error {
  202. return s.udpConn.SetDeadline(t)
  203. }
  204. func (s *myInboundPacketAdapter) SetReadDeadline(t time.Time) error {
  205. return s.udpConn.SetReadDeadline(t)
  206. }
  207. func (s *myInboundPacketAdapter) SetWriteDeadline(t time.Time) error {
  208. return s.udpConn.SetWriteDeadline(t)
  209. }