|
|
@@ -14,6 +14,7 @@ import (
|
|
|
C "github.com/sagernet/sing-box/constant"
|
|
|
"github.com/sagernet/sing-box/log"
|
|
|
"github.com/sagernet/sing-box/option"
|
|
|
+ tun "github.com/sagernet/sing-tun"
|
|
|
"github.com/sagernet/sing/common"
|
|
|
"github.com/sagernet/sing/common/batch"
|
|
|
E "github.com/sagernet/sing/common/exceptions"
|
|
|
@@ -170,6 +171,21 @@ func (s *URLTest) NewPacketConnectionEx(ctx context.Context, conn N.PacketConn,
|
|
|
s.connection.NewPacketConnection(ctx, s, conn, metadata, onClose)
|
|
|
}
|
|
|
|
|
|
+func (s *URLTest) NewDirectRouteConnection(metadata adapter.InboundContext, routeContext tun.DirectRouteContext, timeout time.Duration) (tun.DirectRouteDestination, error) {
|
|
|
+ s.group.Touch()
|
|
|
+ selected := s.group.selectedOutboundTCP
|
|
|
+ if selected == nil {
|
|
|
+ selected, _ = s.group.Select(N.NetworkTCP)
|
|
|
+ }
|
|
|
+ if selected == nil {
|
|
|
+ return nil, E.New("missing supported outbound")
|
|
|
+ }
|
|
|
+ if !common.Contains(selected.Network(), metadata.Network) {
|
|
|
+ return nil, E.New(metadata.Network, " is not supported by outbound: ", selected.Tag())
|
|
|
+ }
|
|
|
+ return selected.(adapter.DirectRouteOutbound).NewDirectRouteConnection(metadata, routeContext, timeout)
|
|
|
+}
|
|
|
+
|
|
|
type URLTestGroup struct {
|
|
|
ctx context.Context
|
|
|
router adapter.Router
|