default_udp.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  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.StackNewPacket()
  38. defer common.KeepAlive(_buffer)
  39. buffer := common.Dup(_buffer)
  40. defer buffer.Release()
  41. buffer.IncRef()
  42. defer buffer.DecRef()
  43. packetService := (*myInboundPacketAdapter)(a)
  44. for {
  45. buffer.Reset()
  46. n, addr, err := a.udpConn.ReadFromUDPAddrPort(buffer.FreeBytes())
  47. if err != nil {
  48. return
  49. }
  50. buffer.Truncate(n)
  51. var metadata adapter.InboundContext
  52. metadata.Inbound = a.tag
  53. metadata.InboundType = a.protocol
  54. metadata.InboundOptions = a.listenOptions.InboundOptions
  55. metadata.Source = M.SocksaddrFromNetIP(addr).Unwrap()
  56. metadata.OriginDestination = a.udpAddr
  57. err = a.packetHandler.NewPacket(a.ctx, packetService, buffer, metadata)
  58. if err != nil {
  59. a.newError(E.Cause(err, "process packet from ", metadata.Source))
  60. }
  61. }
  62. }
  63. func (a *myInboundAdapter) loopUDPOOBIn() {
  64. defer close(a.packetOutboundClosed)
  65. _buffer := buf.StackNewPacket()
  66. defer common.KeepAlive(_buffer)
  67. buffer := common.Dup(_buffer)
  68. defer buffer.Release()
  69. buffer.IncRef()
  70. defer buffer.DecRef()
  71. packetService := (*myInboundPacketAdapter)(a)
  72. oob := make([]byte, 1024)
  73. for {
  74. buffer.Reset()
  75. n, oobN, _, addr, err := a.udpConn.ReadMsgUDPAddrPort(buffer.FreeBytes(), oob)
  76. if err != nil {
  77. return
  78. }
  79. buffer.Truncate(n)
  80. var metadata adapter.InboundContext
  81. metadata.Inbound = a.tag
  82. metadata.InboundType = a.protocol
  83. metadata.InboundOptions = a.listenOptions.InboundOptions
  84. metadata.Source = M.SocksaddrFromNetIP(addr).Unwrap()
  85. metadata.OriginDestination = a.udpAddr
  86. err = a.oobPacketHandler.NewPacket(a.ctx, packetService, buffer, oob[:oobN], metadata)
  87. if err != nil {
  88. a.newError(E.Cause(err, "process packet from ", metadata.Source))
  89. }
  90. }
  91. }
  92. func (a *myInboundAdapter) loopUDPInThreadSafe() {
  93. defer close(a.packetOutboundClosed)
  94. packetService := (*myInboundPacketAdapter)(a)
  95. for {
  96. buffer := buf.NewPacket()
  97. n, addr, err := a.udpConn.ReadFromUDPAddrPort(buffer.FreeBytes())
  98. if err != nil {
  99. buffer.Release()
  100. return
  101. }
  102. buffer.Truncate(n)
  103. var metadata adapter.InboundContext
  104. metadata.Inbound = a.tag
  105. metadata.InboundType = a.protocol
  106. metadata.InboundOptions = a.listenOptions.InboundOptions
  107. metadata.Source = M.SocksaddrFromNetIP(addr).Unwrap()
  108. metadata.OriginDestination = a.udpAddr
  109. err = a.packetHandler.NewPacket(a.ctx, packetService, buffer, metadata)
  110. if err != nil {
  111. buffer.Release()
  112. a.newError(E.Cause(err, "process packet from ", metadata.Source))
  113. }
  114. }
  115. }
  116. func (a *myInboundAdapter) loopUDPOOBInThreadSafe() {
  117. defer close(a.packetOutboundClosed)
  118. packetService := (*myInboundPacketAdapter)(a)
  119. oob := make([]byte, 1024)
  120. for {
  121. buffer := buf.NewPacket()
  122. n, oobN, _, addr, err := a.udpConn.ReadMsgUDPAddrPort(buffer.FreeBytes(), oob)
  123. if err != nil {
  124. buffer.Release()
  125. return
  126. }
  127. buffer.Truncate(n)
  128. var metadata adapter.InboundContext
  129. metadata.Inbound = a.tag
  130. metadata.InboundType = a.protocol
  131. metadata.InboundOptions = a.listenOptions.InboundOptions
  132. metadata.Source = M.SocksaddrFromNetIP(addr).Unwrap()
  133. metadata.OriginDestination = a.udpAddr
  134. err = a.oobPacketHandler.NewPacket(a.ctx, packetService, buffer, oob[:oobN], metadata)
  135. if err != nil {
  136. buffer.Release()
  137. a.newError(E.Cause(err, "process packet from ", metadata.Source))
  138. }
  139. }
  140. }
  141. func (a *myInboundAdapter) loopUDPOut() {
  142. for {
  143. select {
  144. case packet := <-a.packetOutbound:
  145. err := a.writePacket(packet.buffer, packet.destination)
  146. if err != nil && !E.IsClosed(err) {
  147. a.newError(E.New("write back udp: ", err))
  148. }
  149. continue
  150. case <-a.packetOutboundClosed:
  151. }
  152. for {
  153. select {
  154. case packet := <-a.packetOutbound:
  155. packet.buffer.Release()
  156. default:
  157. return
  158. }
  159. }
  160. }
  161. }
  162. func (a *myInboundAdapter) writePacket(buffer *buf.Buffer, destination M.Socksaddr) error {
  163. defer buffer.Release()
  164. if destination.IsFqdn() {
  165. udpAddr, err := net.ResolveUDPAddr(N.NetworkUDP, destination.String())
  166. if err != nil {
  167. return err
  168. }
  169. return common.Error(a.udpConn.WriteTo(buffer.Bytes(), udpAddr))
  170. }
  171. return common.Error(a.udpConn.WriteToUDPAddrPort(buffer.Bytes(), destination.AddrPort()))
  172. }
  173. type myInboundPacketAdapter myInboundAdapter
  174. func (s *myInboundPacketAdapter) ReadPacket(buffer *buf.Buffer) (M.Socksaddr, error) {
  175. n, addr, err := s.udpConn.ReadFromUDPAddrPort(buffer.FreeBytes())
  176. if err != nil {
  177. return M.Socksaddr{}, err
  178. }
  179. buffer.Truncate(n)
  180. return M.SocksaddrFromNetIP(addr), nil
  181. }
  182. func (s *myInboundPacketAdapter) WriteIsThreadUnsafe() {
  183. }
  184. type myInboundPacket struct {
  185. buffer *buf.Buffer
  186. destination M.Socksaddr
  187. }
  188. func (s *myInboundPacketAdapter) Upstream() any {
  189. return s.udpConn
  190. }
  191. func (s *myInboundPacketAdapter) WritePacket(buffer *buf.Buffer, destination M.Socksaddr) error {
  192. select {
  193. case s.packetOutbound <- &myInboundPacket{buffer, destination}:
  194. return nil
  195. case <-s.packetOutboundClosed:
  196. return os.ErrClosed
  197. }
  198. }
  199. func (s *myInboundPacketAdapter) Close() error {
  200. return s.udpConn.Close()
  201. }
  202. func (s *myInboundPacketAdapter) LocalAddr() net.Addr {
  203. return s.udpConn.LocalAddr()
  204. }
  205. func (s *myInboundPacketAdapter) SetDeadline(t time.Time) error {
  206. return s.udpConn.SetDeadline(t)
  207. }
  208. func (s *myInboundPacketAdapter) SetReadDeadline(t time.Time) error {
  209. return s.udpConn.SetReadDeadline(t)
  210. }
  211. func (s *myInboundPacketAdapter) SetWriteDeadline(t time.Time) error {
  212. return s.udpConn.SetWriteDeadline(t)
  213. }