default_udp.go 5.5 KB

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