default_udp.go 6.4 KB

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