diff --git a/main/distro/all/all.go b/main/distro/all/all.go index 9c6e1b0fb..5351a54cb 100644 --- a/main/distro/all/all.go +++ b/main/distro/all/all.go @@ -23,6 +23,8 @@ import ( _ "github.com/v2fly/v2ray-core/v4/app/router" _ "github.com/v2fly/v2ray-core/v4/app/stats" + _ "github.com/v2fly/v2ray-core/v4/transport/internet/tagged/taggedimpl" + // Inbound and outbound proxies. _ "github.com/v2fly/v2ray-core/v4/proxy/blackhole" _ "github.com/v2fly/v2ray-core/v4/proxy/dns" diff --git a/transport/internet/dialer.go b/transport/internet/dialer.go index 8a93bf3ad..66af2f0e5 100644 --- a/transport/internet/dialer.go +++ b/transport/internet/dialer.go @@ -2,8 +2,7 @@ package internet import ( "context" - core "github.com/v2fly/v2ray-core/v4" - "github.com/v2fly/v2ray-core/v4/features/routing" + "github.com/v2fly/v2ray-core/v4/transport/internet/tagged" "github.com/v2fly/v2ray-core/v4/common/net" "github.com/v2fly/v2ray-core/v4/common/session" @@ -79,28 +78,8 @@ func DialSystem(ctx context.Context, dest net.Destination, sockopt *SocketConfig } func DialTaggedOutbound(ctx context.Context, dest net.Destination, tag string) (net.Conn, error) { - var dispatcher routing.Dispatcher - if err := core.RequireFeatures(ctx, func(dispatcherInstance routing.Dispatcher) { - dispatcher = dispatcherInstance - }); err != nil { - return nil, newError("Required Feature dispatcher not resolved").Base(err) + if tagged.Dialer == nil { + return nil, newError("tagged dial not enabled") } - - content := new(session.Content) - content.SkipDNSResolve = true - session.SetForcedOutboundTagToContext(ctx, tag) - - ctx = session.ContextWithContent(ctx, content) - - r, err := dispatcher.Dispatch(ctx, dest) - if err != nil { - return nil, err - } - var readerOpt net.ConnectionOption - if dest.Network == net.Network_TCP { - readerOpt = net.ConnectionOutputMulti(r.Reader) - } else { - readerOpt = net.ConnectionOutputMultiUDP(r.Reader) - } - return net.NewConnection(net.ConnectionInputMulti(r.Writer), readerOpt), nil + return tagged.Dialer(ctx, dest, tag) } diff --git a/transport/internet/tagged/tagged.go b/transport/internet/tagged/tagged.go new file mode 100644 index 000000000..a99a7b88d --- /dev/null +++ b/transport/internet/tagged/tagged.go @@ -0,0 +1,10 @@ +package tagged + +import ( + "context" + "github.com/v2fly/v2ray-core/v4/common/net" +) + +type DialFunc func(ctx context.Context, dest net.Destination, tag string) (net.Conn, error) + +var Dialer DialFunc diff --git a/transport/internet/tagged/taggedimpl/impl.go b/transport/internet/tagged/taggedimpl/impl.go new file mode 100644 index 000000000..21a00a4fb --- /dev/null +++ b/transport/internet/tagged/taggedimpl/impl.go @@ -0,0 +1,41 @@ +package taggedimpl + +import ( + "context" + core "github.com/v2fly/v2ray-core/v4" + "github.com/v2fly/v2ray-core/v4/common/net" + "github.com/v2fly/v2ray-core/v4/common/session" + "github.com/v2fly/v2ray-core/v4/features/routing" + "github.com/v2fly/v2ray-core/v4/transport/internet/tagged" +) + +func DialTaggedOutbound(ctx context.Context, dest net.Destination, tag string) (net.Conn, error) { + var dispatcher routing.Dispatcher + if err := core.RequireFeatures(ctx, func(dispatcherInstance routing.Dispatcher) { + dispatcher = dispatcherInstance + }); err != nil { + return nil, newError("Required Feature dispatcher not resolved").Base(err) + } + + content := new(session.Content) + content.SkipDNSResolve = true + session.SetForcedOutboundTagToContext(ctx, tag) + + ctx = session.ContextWithContent(ctx, content) + + r, err := dispatcher.Dispatch(ctx, dest) + if err != nil { + return nil, err + } + var readerOpt net.ConnectionOption + if dest.Network == net.Network_TCP { + readerOpt = net.ConnectionOutputMulti(r.Reader) + } else { + readerOpt = net.ConnectionOutputMultiUDP(r.Reader) + } + return net.NewConnection(net.ConnectionInputMulti(r.Writer), readerOpt), nil +} + +func init() { + tagged.Dialer = DialTaggedOutbound +} diff --git a/transport/internet/tagged/taggedimpl/taggedimpl.go b/transport/internet/tagged/taggedimpl/taggedimpl.go new file mode 100644 index 000000000..1597c7b75 --- /dev/null +++ b/transport/internet/tagged/taggedimpl/taggedimpl.go @@ -0,0 +1,3 @@ +package taggedimpl + +//go:generate go run github.com/v2fly/v2ray-core/v4/common/errors/errorgen