diff --git a/adapter/adapter.go b/adapter/adapter.go index 4320702d9..5e89e8bf5 100644 --- a/adapter/adapter.go +++ b/adapter/adapter.go @@ -17,7 +17,6 @@ import ( "github.com/metacubex/mihomo/common/queue" "github.com/metacubex/mihomo/common/utils" "github.com/metacubex/mihomo/component/ca" - "github.com/metacubex/mihomo/component/dialer" C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/log" "github.com/puzpuzpuz/xsync/v3" @@ -63,8 +62,8 @@ func (p *Proxy) Dial(metadata *C.Metadata) (C.Conn, error) { } // DialContext implements C.ProxyAdapter -func (p *Proxy) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.Conn, error) { - conn, err := p.ProxyAdapter.DialContext(ctx, metadata, opts...) +func (p *Proxy) DialContext(ctx context.Context, metadata *C.Metadata) (C.Conn, error) { + conn, err := p.ProxyAdapter.DialContext(ctx, metadata) return conn, err } @@ -76,8 +75,8 @@ func (p *Proxy) DialUDP(metadata *C.Metadata) (C.PacketConn, error) { } // ListenPacketContext implements C.ProxyAdapter -func (p *Proxy) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.PacketConn, error) { - pc, err := p.ProxyAdapter.ListenPacketContext(ctx, metadata, opts...) +func (p *Proxy) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (C.PacketConn, error) { + pc, err := p.ProxyAdapter.ListenPacketContext(ctx, metadata) return pc, err } diff --git a/adapter/outbound/anytls.go b/adapter/outbound/anytls.go index 7fb1d9c64..ad5c6c0fa 100644 --- a/adapter/outbound/anytls.go +++ b/adapter/outbound/anytls.go @@ -43,9 +43,7 @@ type AnyTLSOption struct { MinIdleSession int `proxy:"min-idle-session,omitempty"` } -func (t *AnyTLS) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.Conn, err error) { - options := t.Base.DialOptions(opts...) - t.dialer.SetDialer(dialer.NewDialer(options...)) +func (t *AnyTLS) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn, err error) { c, err := t.client.CreateProxy(ctx, M.ParseSocksaddrHostPort(metadata.String(), metadata.DstPort)) if err != nil { return nil, err @@ -53,10 +51,8 @@ func (t *AnyTLS) DialContext(ctx context.Context, metadata *C.Metadata, opts ... return NewConn(c, t), nil } -func (t *AnyTLS) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.PacketConn, err error) { +func (t *AnyTLS) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (_ C.PacketConn, err error) { // create tcp - options := t.Base.DialOptions(opts...) - t.dialer.SetDialer(dialer.NewDialer(options...)) c, err := t.client.CreateProxy(ctx, uot.RequestDestination(2)) if err != nil { return nil, err @@ -93,8 +89,23 @@ func (t *AnyTLS) Close() error { func NewAnyTLS(option AnyTLSOption) (*AnyTLS, error) { addr := net.JoinHostPort(option.Server, strconv.Itoa(option.Port)) + outbound := &AnyTLS{ + Base: &Base{ + name: option.Name, + addr: addr, + tp: C.AnyTLS, + udp: option.UDP, + tfo: option.TFO, + mpTcp: option.MPTCP, + iface: option.Interface, + rmark: option.RoutingMark, + prefer: C.NewDNSPrefer(option.IPVersion), + }, + option: &option, + } - singDialer := proxydialer.NewByNameSingDialer(option.DialerProxy, dialer.NewDialer()) + singDialer := proxydialer.NewByNameSingDialer(option.DialerProxy, dialer.NewDialer(outbound.DialOptions()...)) + outbound.dialer = singDialer tOption := anytls.ClientConfig{ Password: option.Password, @@ -116,22 +127,8 @@ func NewAnyTLS(option AnyTLSOption) (*AnyTLS, error) { } tOption.TLSConfig = tlsConfig - outbound := &AnyTLS{ - Base: &Base{ - name: option.Name, - addr: addr, - tp: C.AnyTLS, - udp: option.UDP, - tfo: option.TFO, - mpTcp: option.MPTCP, - iface: option.Interface, - rmark: option.RoutingMark, - prefer: C.NewDNSPrefer(option.IPVersion), - }, - client: anytls.NewClient(context.TODO(), tOption), - option: &option, - dialer: singDialer, - } + client := anytls.NewClient(context.TODO(), tOption) + outbound.client = client return outbound, nil } diff --git a/adapter/outbound/base.go b/adapter/outbound/base.go index b2f1ac562..7b4b93ab3 100644 --- a/adapter/outbound/base.go +++ b/adapter/outbound/base.go @@ -18,7 +18,7 @@ import ( type ProxyAdapter interface { C.ProxyAdapter - DialOptions(opts ...dialer.Option) []dialer.Option + DialOptions() []dialer.Option } type Base struct { @@ -59,7 +59,7 @@ func (b *Base) StreamConnContext(ctx context.Context, c net.Conn, metadata *C.Me return c, C.ErrNotSupport } -func (b *Base) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.Conn, error) { +func (b *Base) DialContext(ctx context.Context, metadata *C.Metadata) (C.Conn, error) { return nil, C.ErrNotSupport } @@ -69,7 +69,7 @@ func (b *Base) DialContextWithDialer(ctx context.Context, dialer C.Dialer, metad } // ListenPacketContext implements C.ProxyAdapter -func (b *Base) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.PacketConn, error) { +func (b *Base) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (C.PacketConn, error) { return nil, C.ErrNotSupport } @@ -128,7 +128,7 @@ func (b *Base) Unwrap(metadata *C.Metadata, touch bool) C.Proxy { } // DialOptions return []dialer.Option from struct -func (b *Base) DialOptions(opts ...dialer.Option) []dialer.Option { +func (b *Base) DialOptions() (opts []dialer.Option) { if b.iface != "" { opts = append(opts, dialer.WithInterface(b.iface)) } @@ -167,8 +167,8 @@ func (b *Base) Close() error { type BasicOption struct { TFO bool `proxy:"tfo,omitempty"` MPTCP bool `proxy:"mptcp,omitempty"` - Interface string `proxy:"interface-name,omitempty" group:"interface-name,omitempty"` - RoutingMark int `proxy:"routing-mark,omitempty" group:"routing-mark,omitempty"` + Interface string `proxy:"interface-name,omitempty"` + RoutingMark int `proxy:"routing-mark,omitempty"` IPVersion string `proxy:"ip-version,omitempty"` DialerProxy string `proxy:"dialer-proxy,omitempty"` // don't apply this option into groups, but can set a group name in a proxy } @@ -317,8 +317,8 @@ type autoCloseProxyAdapter struct { closeErr error } -func (p *autoCloseProxyAdapter) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.Conn, err error) { - c, err := p.ProxyAdapter.DialContext(ctx, metadata, opts...) +func (p *autoCloseProxyAdapter) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn, err error) { + c, err := p.ProxyAdapter.DialContext(ctx, metadata) if err != nil { return nil, err } @@ -339,8 +339,8 @@ func (p *autoCloseProxyAdapter) DialContextWithDialer(ctx context.Context, diale return c, nil } -func (p *autoCloseProxyAdapter) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.PacketConn, err error) { - pc, err := p.ProxyAdapter.ListenPacketContext(ctx, metadata, opts...) +func (p *autoCloseProxyAdapter) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (_ C.PacketConn, err error) { + pc, err := p.ProxyAdapter.ListenPacketContext(ctx, metadata) if err != nil { return nil, err } diff --git a/adapter/outbound/direct.go b/adapter/outbound/direct.go index dbde55933..788a4b933 100644 --- a/adapter/outbound/direct.go +++ b/adapter/outbound/direct.go @@ -20,12 +20,13 @@ type DirectOption struct { } // DialContext implements C.ProxyAdapter -func (d *Direct) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.Conn, error) { +func (d *Direct) DialContext(ctx context.Context, metadata *C.Metadata) (C.Conn, error) { if err := d.loopBack.CheckConn(metadata); err != nil { return nil, err } + opts := d.DialOptions() opts = append(opts, dialer.WithResolver(resolver.DirectHostResolver)) - c, err := dialer.DialContext(ctx, "tcp", metadata.RemoteAddress(), d.Base.DialOptions(opts...)...) + c, err := dialer.DialContext(ctx, "tcp", metadata.RemoteAddress(), opts...) if err != nil { return nil, err } @@ -33,7 +34,7 @@ func (d *Direct) DialContext(ctx context.Context, metadata *C.Metadata, opts ... } // ListenPacketContext implements C.ProxyAdapter -func (d *Direct) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.PacketConn, error) { +func (d *Direct) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (C.PacketConn, error) { if err := d.loopBack.CheckPacketConn(metadata); err != nil { return nil, err } @@ -45,7 +46,7 @@ func (d *Direct) ListenPacketContext(ctx context.Context, metadata *C.Metadata, } metadata.DstIP = ip } - pc, err := dialer.NewDialer(d.Base.DialOptions(opts...)...).ListenPacket(ctx, "udp", "", metadata.AddrPort()) + pc, err := dialer.NewDialer(d.DialOptions()...).ListenPacket(ctx, "udp", "", metadata.AddrPort()) if err != nil { return nil, err } diff --git a/adapter/outbound/dns.go b/adapter/outbound/dns.go index 8686b288e..40e70f259 100644 --- a/adapter/outbound/dns.go +++ b/adapter/outbound/dns.go @@ -7,7 +7,6 @@ import ( N "github.com/metacubex/mihomo/common/net" "github.com/metacubex/mihomo/common/pool" - "github.com/metacubex/mihomo/component/dialer" "github.com/metacubex/mihomo/component/resolver" C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/log" @@ -23,14 +22,14 @@ type DnsOption struct { } // DialContext implements C.ProxyAdapter -func (d *Dns) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.Conn, error) { +func (d *Dns) DialContext(ctx context.Context, metadata *C.Metadata) (C.Conn, error) { left, right := N.Pipe() go resolver.RelayDnsConn(context.Background(), right, 0) return NewConn(left, d), nil } // ListenPacketContext implements C.ProxyAdapter -func (d *Dns) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.PacketConn, error) { +func (d *Dns) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (C.PacketConn, error) { log.Debugln("[DNS] hijack udp:%s from %s", metadata.RemoteAddress(), metadata.SourceAddrPort()) ctx, cancel := context.WithCancel(context.Background()) diff --git a/adapter/outbound/http.go b/adapter/outbound/http.go index 543e48a1b..f02308b92 100644 --- a/adapter/outbound/http.go +++ b/adapter/outbound/http.go @@ -58,8 +58,8 @@ func (h *Http) StreamConnContext(ctx context.Context, c net.Conn, metadata *C.Me } // DialContext implements C.ProxyAdapter -func (h *Http) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.Conn, err error) { - return h.DialContextWithDialer(ctx, dialer.NewDialer(h.Base.DialOptions(opts...)...), metadata) +func (h *Http) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn, err error) { + return h.DialContextWithDialer(ctx, dialer.NewDialer(h.DialOptions()...), metadata) } // DialContextWithDialer implements C.ProxyAdapter diff --git a/adapter/outbound/hysteria.go b/adapter/outbound/hysteria.go index 56db76017..5863fd3b7 100644 --- a/adapter/outbound/hysteria.go +++ b/adapter/outbound/hysteria.go @@ -46,8 +46,8 @@ type Hysteria struct { client *core.Client } -func (h *Hysteria) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.Conn, error) { - tcpConn, err := h.client.DialTCP(metadata.String(), metadata.DstPort, h.genHdc(ctx, opts...)) +func (h *Hysteria) DialContext(ctx context.Context, metadata *C.Metadata) (C.Conn, error) { + tcpConn, err := h.client.DialTCP(metadata.String(), metadata.DstPort, h.genHdc(ctx)) if err != nil { return nil, err } @@ -55,20 +55,20 @@ func (h *Hysteria) DialContext(ctx context.Context, metadata *C.Metadata, opts . return NewConn(tcpConn, h), nil } -func (h *Hysteria) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.PacketConn, error) { - udpConn, err := h.client.DialUDP(h.genHdc(ctx, opts...)) +func (h *Hysteria) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (C.PacketConn, error) { + udpConn, err := h.client.DialUDP(h.genHdc(ctx)) if err != nil { return nil, err } return newPacketConn(&hyPacketConn{udpConn}, h), nil } -func (h *Hysteria) genHdc(ctx context.Context, opts ...dialer.Option) utils.PacketDialer { +func (h *Hysteria) genHdc(ctx context.Context) utils.PacketDialer { return &hyDialerWithContext{ ctx: context.Background(), hyDialer: func(network string, rAddr net.Addr) (net.PacketConn, error) { var err error - var cDialer C.Dialer = dialer.NewDialer(h.Base.DialOptions(opts...)...) + var cDialer C.Dialer = dialer.NewDialer(h.DialOptions()...) if len(h.option.DialerProxy) > 0 { cDialer, err = proxydialer.NewByName(h.option.DialerProxy, cDialer) if err != nil { diff --git a/adapter/outbound/hysteria2.go b/adapter/outbound/hysteria2.go index c1d356333..4b55d24bf 100644 --- a/adapter/outbound/hysteria2.go +++ b/adapter/outbound/hysteria2.go @@ -68,9 +68,7 @@ type Hysteria2Option struct { MaxConnectionReceiveWindow uint64 `proxy:"max-connection-receive-window,omitempty"` } -func (h *Hysteria2) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.Conn, err error) { - options := h.Base.DialOptions(opts...) - h.dialer.SetDialer(dialer.NewDialer(options...)) +func (h *Hysteria2) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn, err error) { c, err := h.client.DialConn(ctx, M.ParseSocksaddrHostPort(metadata.String(), metadata.DstPort)) if err != nil { return nil, err @@ -78,9 +76,7 @@ func (h *Hysteria2) DialContext(ctx context.Context, metadata *C.Metadata, opts return NewConn(c, h), nil } -func (h *Hysteria2) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.PacketConn, err error) { - options := h.Base.DialOptions(opts...) - h.dialer.SetDialer(dialer.NewDialer(options...)) +func (h *Hysteria2) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (_ C.PacketConn, err error) { pc, err := h.client.ListenPacket(ctx) if err != nil { return nil, err @@ -108,6 +104,22 @@ func (h *Hysteria2) ProxyInfo() C.ProxyInfo { func NewHysteria2(option Hysteria2Option) (*Hysteria2, error) { addr := net.JoinHostPort(option.Server, strconv.Itoa(option.Port)) + outbound := &Hysteria2{ + Base: &Base{ + name: option.Name, + addr: addr, + tp: C.Hysteria2, + udp: true, + iface: option.Interface, + rmark: option.RoutingMark, + prefer: C.NewDNSPrefer(option.IPVersion), + }, + option: &option, + } + + singDialer := proxydialer.NewByNameSingDialer(option.DialerProxy, dialer.NewDialer(outbound.DialOptions()...)) + outbound.dialer = singDialer + var salamanderPassword string if len(option.Obfs) > 0 { if option.ObfsPassword == "" { @@ -155,8 +167,6 @@ func NewHysteria2(option Hysteria2Option) (*Hysteria2, error) { MaxConnectionReceiveWindow: option.MaxConnectionReceiveWindow, } - singDialer := proxydialer.NewByNameSingDialer(option.DialerProxy, dialer.NewDialer()) - clientOptions := hysteria2.ClientOptions{ Context: context.TODO(), Dialer: singDialer, @@ -207,21 +217,7 @@ func NewHysteria2(option Hysteria2Option) (*Hysteria2, error) { if err != nil { return nil, err } - - outbound := &Hysteria2{ - Base: &Base{ - name: option.Name, - addr: addr, - tp: C.Hysteria2, - udp: true, - iface: option.Interface, - rmark: option.RoutingMark, - prefer: C.NewDNSPrefer(option.IPVersion), - }, - option: &option, - client: client, - dialer: singDialer, - } + outbound.client = client return outbound, nil } diff --git a/adapter/outbound/mieru.go b/adapter/outbound/mieru.go index b0f24323c..1d8c78f75 100644 --- a/adapter/outbound/mieru.go +++ b/adapter/outbound/mieru.go @@ -40,8 +40,8 @@ type MieruOption struct { } // DialContext implements C.ProxyAdapter -func (m *Mieru) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.Conn, error) { - if err := m.ensureClientIsRunning(opts...); err != nil { +func (m *Mieru) DialContext(ctx context.Context, metadata *C.Metadata) (C.Conn, error) { + if err := m.ensureClientIsRunning(); err != nil { return nil, err } addr := metadataToMieruNetAddrSpec(metadata) @@ -53,8 +53,8 @@ func (m *Mieru) DialContext(ctx context.Context, metadata *C.Metadata, opts ...d } // ListenPacketContext implements C.ProxyAdapter -func (m *Mieru) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.PacketConn, err error) { - if err := m.ensureClientIsRunning(opts...); err != nil { +func (m *Mieru) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (_ C.PacketConn, err error) { + if err := m.ensureClientIsRunning(); err != nil { return nil, err } c, err := m.client.DialContext(ctx, metadata.UDPAddr()) @@ -76,7 +76,7 @@ func (m *Mieru) ProxyInfo() C.ProxyInfo { return info } -func (m *Mieru) ensureClientIsRunning(opts ...dialer.Option) error { +func (m *Mieru) ensureClientIsRunning() error { m.mu.Lock() defer m.mu.Unlock() @@ -85,7 +85,7 @@ func (m *Mieru) ensureClientIsRunning(opts ...dialer.Option) error { } // Create a dialer and add it to the client config, before starting the client. - var dialer C.Dialer = dialer.NewDialer(m.Base.DialOptions(opts...)...) + var dialer C.Dialer = dialer.NewDialer(m.DialOptions()...) var err error if len(m.option.DialerProxy) > 0 { dialer, err = proxydialer.NewByName(m.option.DialerProxy, dialer) diff --git a/adapter/outbound/reject.go b/adapter/outbound/reject.go index a8e2100d1..da3a4e3c6 100644 --- a/adapter/outbound/reject.go +++ b/adapter/outbound/reject.go @@ -7,7 +7,6 @@ import ( "time" "github.com/metacubex/mihomo/common/buf" - "github.com/metacubex/mihomo/component/dialer" C "github.com/metacubex/mihomo/constant" ) @@ -21,7 +20,7 @@ type RejectOption struct { } // DialContext implements C.ProxyAdapter -func (r *Reject) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.Conn, error) { +func (r *Reject) DialContext(ctx context.Context, metadata *C.Metadata) (C.Conn, error) { if r.drop { return NewConn(dropConn{}, r), nil } @@ -29,7 +28,7 @@ func (r *Reject) DialContext(ctx context.Context, metadata *C.Metadata, opts ... } // ListenPacketContext implements C.ProxyAdapter -func (r *Reject) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.PacketConn, error) { +func (r *Reject) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (C.PacketConn, error) { return newPacketConn(&nopPacketConn{}, r), nil } diff --git a/adapter/outbound/shadowsocks.go b/adapter/outbound/shadowsocks.go index 85b078eb8..41ea03a4d 100644 --- a/adapter/outbound/shadowsocks.go +++ b/adapter/outbound/shadowsocks.go @@ -155,8 +155,8 @@ func (ss *ShadowSocks) StreamConnContext(ctx context.Context, c net.Conn, metada } // DialContext implements C.ProxyAdapter -func (ss *ShadowSocks) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.Conn, err error) { - return ss.DialContextWithDialer(ctx, dialer.NewDialer(ss.Base.DialOptions(opts...)...), metadata) +func (ss *ShadowSocks) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn, err error) { + return ss.DialContextWithDialer(ctx, dialer.NewDialer(ss.DialOptions()...), metadata) } // DialContextWithDialer implements C.ProxyAdapter @@ -181,8 +181,8 @@ func (ss *ShadowSocks) DialContextWithDialer(ctx context.Context, dialer C.Diale } // ListenPacketContext implements C.ProxyAdapter -func (ss *ShadowSocks) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.PacketConn, error) { - return ss.ListenPacketWithDialer(ctx, dialer.NewDialer(ss.Base.DialOptions(opts...)...), metadata) +func (ss *ShadowSocks) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (C.PacketConn, error) { + return ss.ListenPacketWithDialer(ctx, dialer.NewDialer(ss.DialOptions()...), metadata) } // ListenPacketWithDialer implements C.ProxyAdapter diff --git a/adapter/outbound/shadowsocksr.go b/adapter/outbound/shadowsocksr.go index 7957d6cd4..d7b932e6a 100644 --- a/adapter/outbound/shadowsocksr.go +++ b/adapter/outbound/shadowsocksr.go @@ -67,8 +67,8 @@ func (ssr *ShadowSocksR) StreamConnContext(ctx context.Context, c net.Conn, meta } // DialContext implements C.ProxyAdapter -func (ssr *ShadowSocksR) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.Conn, err error) { - return ssr.DialContextWithDialer(ctx, dialer.NewDialer(ssr.Base.DialOptions(opts...)...), metadata) +func (ssr *ShadowSocksR) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn, err error) { + return ssr.DialContextWithDialer(ctx, dialer.NewDialer(ssr.DialOptions()...), metadata) } // DialContextWithDialer implements C.ProxyAdapter @@ -93,8 +93,8 @@ func (ssr *ShadowSocksR) DialContextWithDialer(ctx context.Context, dialer C.Dia } // ListenPacketContext implements C.ProxyAdapter -func (ssr *ShadowSocksR) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.PacketConn, error) { - return ssr.ListenPacketWithDialer(ctx, dialer.NewDialer(ssr.Base.DialOptions(opts...)...), metadata) +func (ssr *ShadowSocksR) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (C.PacketConn, error) { + return ssr.ListenPacketWithDialer(ctx, dialer.NewDialer(ssr.DialOptions()...), metadata) } // ListenPacketWithDialer implements C.ProxyAdapter diff --git a/adapter/outbound/singmux.go b/adapter/outbound/singmux.go index 13f9f66c1..88294c6d2 100644 --- a/adapter/outbound/singmux.go +++ b/adapter/outbound/singmux.go @@ -41,9 +41,7 @@ type BrutalOption struct { Down string `proxy:"down,omitempty"` } -func (s *SingMux) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.Conn, err error) { - options := s.ProxyAdapter.DialOptions(opts...) - s.dialer.SetDialer(dialer.NewDialer(options...)) +func (s *SingMux) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn, err error) { c, err := s.client.DialContext(ctx, "tcp", M.ParseSocksaddrHostPort(metadata.String(), metadata.DstPort)) if err != nil { return nil, err @@ -51,12 +49,10 @@ func (s *SingMux) DialContext(ctx context.Context, metadata *C.Metadata, opts .. return NewConn(c, s), err } -func (s *SingMux) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.PacketConn, err error) { +func (s *SingMux) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (_ C.PacketConn, err error) { if s.onlyTcp { - return s.ProxyAdapter.ListenPacketContext(ctx, metadata, opts...) + return s.ProxyAdapter.ListenPacketContext(ctx, metadata) } - options := s.ProxyAdapter.DialOptions(opts...) - s.dialer.SetDialer(dialer.NewDialer(options...)) // sing-mux use stream-oriented udp with a special address, so we need a net.UDPAddr if !metadata.Resolved() { @@ -109,7 +105,7 @@ func NewSingMux(option SingMuxOption, proxy ProxyAdapter) (ProxyAdapter, error) // TODO // "TCP Brutal is only supported on Linux-based systems" - singDialer := proxydialer.NewSingDialer(proxy, dialer.NewDialer(), option.Statistic) + singDialer := proxydialer.NewSingDialer(proxy, dialer.NewDialer(proxy.DialOptions()...), option.Statistic) client, err := mux.NewClient(mux.Options{ Dialer: singDialer, Logger: log.SingLogger, diff --git a/adapter/outbound/snell.go b/adapter/outbound/snell.go index cf3cdcb3c..275f72636 100644 --- a/adapter/outbound/snell.go +++ b/adapter/outbound/snell.go @@ -75,8 +75,8 @@ func (s *Snell) writeHeaderContext(ctx context.Context, c net.Conn, metadata *C. } // DialContext implements C.ProxyAdapter -func (s *Snell) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.Conn, err error) { - if s.version == snell.Version2 && dialer.IsZeroOptions(opts) { +func (s *Snell) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn, err error) { + if s.version == snell.Version2 { c, err := s.pool.Get() if err != nil { return nil, err @@ -89,7 +89,7 @@ func (s *Snell) DialContext(ctx context.Context, metadata *C.Metadata, opts ...d return NewConn(c, s), err } - return s.DialContextWithDialer(ctx, dialer.NewDialer(s.Base.DialOptions(opts...)...), metadata) + return s.DialContextWithDialer(ctx, dialer.NewDialer(s.DialOptions()...), metadata) } // DialContextWithDialer implements C.ProxyAdapter @@ -114,8 +114,8 @@ func (s *Snell) DialContextWithDialer(ctx context.Context, dialer C.Dialer, meta } // ListenPacketContext implements C.ProxyAdapter -func (s *Snell) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.PacketConn, error) { - return s.ListenPacketWithDialer(ctx, dialer.NewDialer(s.Base.DialOptions(opts...)...), metadata) +func (s *Snell) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (C.PacketConn, error) { + return s.ListenPacketWithDialer(ctx, dialer.NewDialer(s.DialOptions()...), metadata) } // ListenPacketWithDialer implements C.ProxyAdapter @@ -207,7 +207,7 @@ func NewSnell(option SnellOption) (*Snell, error) { if option.Version == snell.Version2 { s.pool = snell.NewPool(func(ctx context.Context) (*snell.Snell, error) { var err error - var cDialer C.Dialer = dialer.NewDialer(s.Base.DialOptions()...) + var cDialer C.Dialer = dialer.NewDialer(s.DialOptions()...) if len(s.option.DialerProxy) > 0 { cDialer, err = proxydialer.NewByName(s.option.DialerProxy, cDialer) if err != nil { diff --git a/adapter/outbound/socks5.go b/adapter/outbound/socks5.go index f42011d76..4bb774b93 100644 --- a/adapter/outbound/socks5.go +++ b/adapter/outbound/socks5.go @@ -66,8 +66,8 @@ func (ss *Socks5) StreamConnContext(ctx context.Context, c net.Conn, metadata *C } // DialContext implements C.ProxyAdapter -func (ss *Socks5) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.Conn, err error) { - return ss.DialContextWithDialer(ctx, dialer.NewDialer(ss.Base.DialOptions(opts...)...), metadata) +func (ss *Socks5) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn, err error) { + return ss.DialContextWithDialer(ctx, dialer.NewDialer(ss.DialOptions()...), metadata) } // DialContextWithDialer implements C.ProxyAdapter @@ -101,8 +101,8 @@ func (ss *Socks5) SupportWithDialer() C.NetWork { } // ListenPacketContext implements C.ProxyAdapter -func (ss *Socks5) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.PacketConn, err error) { - var cDialer C.Dialer = dialer.NewDialer(ss.Base.DialOptions(opts...)...) +func (ss *Socks5) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (_ C.PacketConn, err error) { + var cDialer C.Dialer = dialer.NewDialer(ss.DialOptions()...) if len(ss.option.DialerProxy) > 0 { cDialer, err = proxydialer.NewByName(ss.option.DialerProxy, cDialer) if err != nil { diff --git a/adapter/outbound/ssh.go b/adapter/outbound/ssh.go index d6c546f32..861999ed6 100644 --- a/adapter/outbound/ssh.go +++ b/adapter/outbound/ssh.go @@ -43,8 +43,8 @@ type SshOption struct { HostKeyAlgorithms []string `proxy:"host-key-algorithms,omitempty"` } -func (s *Ssh) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.Conn, err error) { - var cDialer C.Dialer = dialer.NewDialer(s.Base.DialOptions(opts...)...) +func (s *Ssh) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn, err error) { + var cDialer C.Dialer = dialer.NewDialer(s.DialOptions()...) if len(s.option.DialerProxy) > 0 { cDialer, err = proxydialer.NewByName(s.option.DialerProxy, cDialer) if err != nil { diff --git a/adapter/outbound/trojan.go b/adapter/outbound/trojan.go index 855893a2e..a321caf0e 100644 --- a/adapter/outbound/trojan.go +++ b/adapter/outbound/trojan.go @@ -165,10 +165,10 @@ func (t *Trojan) writeHeaderContext(ctx context.Context, c net.Conn, metadata *C } // DialContext implements C.ProxyAdapter -func (t *Trojan) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.Conn, err error) { +func (t *Trojan) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn, err error) { var c net.Conn // gun transport - if t.transport != nil && dialer.IsZeroOptions(opts) { + if t.transport != nil { c, err = gun.StreamGunWithTransport(t.transport, t.gunConfig) if err != nil { return nil, err @@ -184,7 +184,7 @@ func (t *Trojan) DialContext(ctx context.Context, metadata *C.Metadata, opts ... return NewConn(c, t), nil } - return t.DialContextWithDialer(ctx, dialer.NewDialer(t.Base.DialOptions(opts...)...), metadata) + return t.DialContextWithDialer(ctx, dialer.NewDialer(t.DialOptions()...), metadata) } // DialContextWithDialer implements C.ProxyAdapter @@ -213,11 +213,11 @@ func (t *Trojan) DialContextWithDialer(ctx context.Context, dialer C.Dialer, met } // ListenPacketContext implements C.ProxyAdapter -func (t *Trojan) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.PacketConn, err error) { +func (t *Trojan) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (_ C.PacketConn, err error) { var c net.Conn // grpc transport - if t.transport != nil && dialer.IsZeroOptions(opts) { + if t.transport != nil { c, err = gun.StreamGunWithTransport(t.transport, t.gunConfig) if err != nil { return nil, fmt.Errorf("%s connect error: %w", t.addr, err) @@ -234,7 +234,7 @@ func (t *Trojan) ListenPacketContext(ctx context.Context, metadata *C.Metadata, pc := trojan.NewPacketConn(c) return newPacketConn(pc, t), err } - return t.ListenPacketWithDialer(ctx, dialer.NewDialer(t.Base.DialOptions(opts...)...), metadata) + return t.ListenPacketWithDialer(ctx, dialer.NewDialer(t.DialOptions()...), metadata) } // ListenPacketWithDialer implements C.ProxyAdapter @@ -338,7 +338,7 @@ func NewTrojan(option TrojanOption) (*Trojan, error) { if option.Network == "grpc" { dialFn := func(ctx context.Context, network, addr string) (net.Conn, error) { var err error - var cDialer C.Dialer = dialer.NewDialer(t.Base.DialOptions()...) + var cDialer C.Dialer = dialer.NewDialer(t.DialOptions()...) if len(t.option.DialerProxy) > 0 { cDialer, err = proxydialer.NewByName(t.option.DialerProxy, cDialer) if err != nil { diff --git a/adapter/outbound/tuic.go b/adapter/outbound/tuic.go index 92b8e7789..01fe9da20 100644 --- a/adapter/outbound/tuic.go +++ b/adapter/outbound/tuic.go @@ -66,8 +66,8 @@ type TuicOption struct { } // DialContext implements C.ProxyAdapter -func (t *Tuic) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.Conn, error) { - return t.DialContextWithDialer(ctx, dialer.NewDialer(t.Base.DialOptions(opts...)...), metadata) +func (t *Tuic) DialContext(ctx context.Context, metadata *C.Metadata) (C.Conn, error) { + return t.DialContextWithDialer(ctx, dialer.NewDialer(t.DialOptions()...), metadata) } // DialContextWithDialer implements C.ProxyAdapter @@ -80,8 +80,8 @@ func (t *Tuic) DialContextWithDialer(ctx context.Context, dialer C.Dialer, metad } // ListenPacketContext implements C.ProxyAdapter -func (t *Tuic) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.PacketConn, err error) { - return t.ListenPacketWithDialer(ctx, dialer.NewDialer(t.Base.DialOptions(opts...)...), metadata) +func (t *Tuic) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (_ C.PacketConn, err error) { + return t.ListenPacketWithDialer(ctx, dialer.NewDialer(t.DialOptions()...), metadata) } // ListenPacketWithDialer implements C.ProxyAdapter diff --git a/adapter/outbound/vless.go b/adapter/outbound/vless.go index 4d1a23b8e..3baf66cc5 100644 --- a/adapter/outbound/vless.go +++ b/adapter/outbound/vless.go @@ -225,10 +225,10 @@ func (v *Vless) streamTLSConn(ctx context.Context, conn net.Conn, isH2 bool) (ne } // DialContext implements C.ProxyAdapter -func (v *Vless) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.Conn, err error) { +func (v *Vless) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn, err error) { var c net.Conn // gun transport - if v.transport != nil && dialer.IsZeroOptions(opts) { + if v.transport != nil { c, err = gun.StreamGunWithTransport(v.transport, v.gunConfig) if err != nil { return nil, err @@ -244,7 +244,7 @@ func (v *Vless) DialContext(ctx context.Context, metadata *C.Metadata, opts ...d return NewConn(c, v), nil } - return v.DialContextWithDialer(ctx, dialer.NewDialer(v.Base.DialOptions(opts...)...), metadata) + return v.DialContextWithDialer(ctx, dialer.NewDialer(v.DialOptions()...), metadata) } // DialContextWithDialer implements C.ProxyAdapter @@ -271,7 +271,7 @@ func (v *Vless) DialContextWithDialer(ctx context.Context, dialer C.Dialer, meta } // ListenPacketContext implements C.ProxyAdapter -func (v *Vless) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.PacketConn, err error) { +func (v *Vless) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (_ C.PacketConn, err error) { // vless use stream-oriented udp with a special address, so we need a net.UDPAddr if !metadata.Resolved() { ip, err := resolver.ResolveIP(ctx, metadata.Host) @@ -282,7 +282,7 @@ func (v *Vless) ListenPacketContext(ctx context.Context, metadata *C.Metadata, o } var c net.Conn // gun transport - if v.transport != nil && dialer.IsZeroOptions(opts) { + if v.transport != nil { c, err = gun.StreamGunWithTransport(v.transport, v.gunConfig) if err != nil { return nil, err @@ -298,7 +298,7 @@ func (v *Vless) ListenPacketContext(ctx context.Context, metadata *C.Metadata, o return v.ListenPacketOnStreamConn(ctx, c, metadata) } - return v.ListenPacketWithDialer(ctx, dialer.NewDialer(v.Base.DialOptions(opts...)...), metadata) + return v.ListenPacketWithDialer(ctx, dialer.NewDialer(v.DialOptions()...), metadata) } // ListenPacketWithDialer implements C.ProxyAdapter @@ -571,7 +571,7 @@ func NewVless(option VlessOption) (*Vless, error) { case "grpc": dialFn := func(ctx context.Context, network, addr string) (net.Conn, error) { var err error - var cDialer C.Dialer = dialer.NewDialer(v.Base.DialOptions()...) + var cDialer C.Dialer = dialer.NewDialer(v.DialOptions()...) if len(v.option.DialerProxy) > 0 { cDialer, err = proxydialer.NewByName(v.option.DialerProxy, cDialer) if err != nil { diff --git a/adapter/outbound/vmess.go b/adapter/outbound/vmess.go index fddef0e1b..34c892366 100644 --- a/adapter/outbound/vmess.go +++ b/adapter/outbound/vmess.go @@ -280,10 +280,10 @@ func (v *Vmess) streamConnContext(ctx context.Context, c net.Conn, metadata *C.M } // DialContext implements C.ProxyAdapter -func (v *Vmess) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.Conn, err error) { +func (v *Vmess) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn, err error) { var c net.Conn // gun transport - if v.transport != nil && dialer.IsZeroOptions(opts) { + if v.transport != nil { c, err = gun.StreamGunWithTransport(v.transport, v.gunConfig) if err != nil { return nil, err @@ -299,7 +299,7 @@ func (v *Vmess) DialContext(ctx context.Context, metadata *C.Metadata, opts ...d return NewConn(c, v), nil } - return v.DialContextWithDialer(ctx, dialer.NewDialer(v.Base.DialOptions(opts...)...), metadata) + return v.DialContextWithDialer(ctx, dialer.NewDialer(v.DialOptions()...), metadata) } // DialContextWithDialer implements C.ProxyAdapter @@ -323,7 +323,7 @@ func (v *Vmess) DialContextWithDialer(ctx context.Context, dialer C.Dialer, meta } // ListenPacketContext implements C.ProxyAdapter -func (v *Vmess) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.PacketConn, err error) { +func (v *Vmess) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (_ C.PacketConn, err error) { // vmess use stream-oriented udp with a special address, so we need a net.UDPAddr if !metadata.Resolved() { ip, err := resolver.ResolveIP(ctx, metadata.Host) @@ -334,7 +334,7 @@ func (v *Vmess) ListenPacketContext(ctx context.Context, metadata *C.Metadata, o } var c net.Conn // gun transport - if v.transport != nil && dialer.IsZeroOptions(opts) { + if v.transport != nil { c, err = gun.StreamGunWithTransport(v.transport, v.gunConfig) if err != nil { return nil, err @@ -349,7 +349,7 @@ func (v *Vmess) ListenPacketContext(ctx context.Context, metadata *C.Metadata, o } return v.ListenPacketOnStreamConn(ctx, c, metadata) } - return v.ListenPacketWithDialer(ctx, dialer.NewDialer(v.Base.DialOptions(opts...)...), metadata) + return v.ListenPacketWithDialer(ctx, dialer.NewDialer(v.DialOptions()...), metadata) } // ListenPacketWithDialer implements C.ProxyAdapter @@ -482,7 +482,7 @@ func NewVmess(option VmessOption) (*Vmess, error) { case "grpc": dialFn := func(ctx context.Context, network, addr string) (net.Conn, error) { var err error - var cDialer C.Dialer = dialer.NewDialer(v.Base.DialOptions()...) + var cDialer C.Dialer = dialer.NewDialer(v.DialOptions()...) if len(v.option.DialerProxy) > 0 { cDialer, err = proxydialer.NewByName(v.option.DialerProxy, cDialer) if err != nil { diff --git a/adapter/outbound/wireguard.go b/adapter/outbound/wireguard.go index 06d67f873..75ea5fd53 100644 --- a/adapter/outbound/wireguard.go +++ b/adapter/outbound/wireguard.go @@ -166,8 +166,9 @@ func NewWireGuard(option WireGuardOption) (*WireGuard, error) { rmark: option.RoutingMark, prefer: C.NewDNSPrefer(option.IPVersion), }, - dialer: proxydialer.NewSlowDownSingDialer(proxydialer.NewByNameSingDialer(option.DialerProxy, dialer.NewDialer()), slowdown.New()), } + singDialer := proxydialer.NewSlowDownSingDialer(proxydialer.NewByNameSingDialer(option.DialerProxy, dialer.NewDialer(outbound.DialOptions()...)), slowdown.New()) + outbound.dialer = singDialer var reserved [3]uint8 if len(option.Reserved) > 0 { @@ -488,9 +489,7 @@ func (w *WireGuard) Close() error { return nil } -func (w *WireGuard) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.Conn, err error) { - options := w.Base.DialOptions(opts...) - w.dialer.SetDialer(dialer.NewDialer(options...)) +func (w *WireGuard) DialContext(ctx context.Context, metadata *C.Metadata) (_ C.Conn, err error) { var conn net.Conn if err = w.init(ctx); err != nil { return nil, err @@ -500,6 +499,7 @@ func (w *WireGuard) DialContext(ctx context.Context, metadata *C.Metadata, opts if w.resolver != nil { r = w.resolver } + options := w.DialOptions() options = append(options, dialer.WithResolver(r)) options = append(options, dialer.WithNetDialer(wgNetDialer{tunDevice: w.tunDevice})) conn, err = dialer.NewDialer(options...).DialContext(ctx, "tcp", metadata.RemoteAddress()) @@ -515,9 +515,7 @@ func (w *WireGuard) DialContext(ctx context.Context, metadata *C.Metadata, opts return NewConn(conn, w), nil } -func (w *WireGuard) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.PacketConn, err error) { - options := w.Base.DialOptions(opts...) - w.dialer.SetDialer(dialer.NewDialer(options...)) +func (w *WireGuard) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (_ C.PacketConn, err error) { var pc net.PacketConn if err = w.init(ctx); err != nil { return nil, err diff --git a/adapter/outboundgroup/fallback.go b/adapter/outboundgroup/fallback.go index b8bb458f0..8f8842a1c 100644 --- a/adapter/outboundgroup/fallback.go +++ b/adapter/outboundgroup/fallback.go @@ -6,11 +6,9 @@ import ( "errors" "time" - "github.com/metacubex/mihomo/adapter/outbound" "github.com/metacubex/mihomo/common/callback" N "github.com/metacubex/mihomo/common/net" "github.com/metacubex/mihomo/common/utils" - "github.com/metacubex/mihomo/component/dialer" C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/constant/provider" ) @@ -31,9 +29,9 @@ func (f *Fallback) Now() string { } // DialContext implements C.ProxyAdapter -func (f *Fallback) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.Conn, error) { +func (f *Fallback) DialContext(ctx context.Context, metadata *C.Metadata) (C.Conn, error) { proxy := f.findAliveProxy(true) - c, err := proxy.DialContext(ctx, metadata, f.Base.DialOptions(opts...)...) + c, err := proxy.DialContext(ctx, metadata) if err == nil { c.AppendToChains(f) } else { @@ -54,9 +52,9 @@ func (f *Fallback) DialContext(ctx context.Context, metadata *C.Metadata, opts . } // ListenPacketContext implements C.ProxyAdapter -func (f *Fallback) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.PacketConn, error) { +func (f *Fallback) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (C.PacketConn, error) { proxy := f.findAliveProxy(true) - pc, err := proxy.ListenPacketContext(ctx, metadata, f.Base.DialOptions(opts...)...) + pc, err := proxy.ListenPacketContext(ctx, metadata) if err == nil { pc.AppendToChains(f) } @@ -155,18 +153,14 @@ func (f *Fallback) ForceSet(name string) { func NewFallback(option *GroupCommonOption, providers []provider.ProxyProvider) *Fallback { return &Fallback{ GroupBase: NewGroupBase(GroupBaseOption{ - outbound.BaseOption{ - Name: option.Name, - Type: C.Fallback, - Interface: option.Interface, - RoutingMark: option.RoutingMark, - }, - option.Filter, - option.ExcludeFilter, - option.ExcludeType, - option.TestTimeout, - option.MaxFailedTimes, - providers, + Name: option.Name, + Type: C.Fallback, + Filter: option.Filter, + ExcludeFilter: option.ExcludeFilter, + ExcludeType: option.ExcludeType, + TestTimeout: option.TestTimeout, + MaxFailedTimes: option.MaxFailedTimes, + Providers: providers, }), disableUDP: option.DisableUDP, testUrl: option.URL, diff --git a/adapter/outboundgroup/groupbase.go b/adapter/outboundgroup/groupbase.go index f89101687..dc66976bb 100644 --- a/adapter/outboundgroup/groupbase.go +++ b/adapter/outboundgroup/groupbase.go @@ -41,53 +41,47 @@ type GroupBase struct { } type GroupBaseOption struct { - outbound.BaseOption - filter string - excludeFilter string - excludeType string + Name string + Type C.AdapterType + Filter string + ExcludeFilter string + ExcludeType string TestTimeout int - maxFailedTimes int - providers []provider.ProxyProvider + MaxFailedTimes int + Providers []provider.ProxyProvider } func NewGroupBase(opt GroupBaseOption) *GroupBase { - if opt.RoutingMark != 0 { - log.Warnln("The group [%s] with routing-mark configuration is deprecated, please set it directly on the proxy instead", opt.Name) - } - if opt.Interface != "" { - log.Warnln("The group [%s] with interface-name configuration is deprecated, please set it directly on the proxy instead", opt.Name) - } - var excludeTypeArray []string - if opt.excludeType != "" { - excludeTypeArray = strings.Split(opt.excludeType, "|") + if opt.ExcludeType != "" { + excludeTypeArray = strings.Split(opt.ExcludeType, "|") } var excludeFilterRegs []*regexp2.Regexp - if opt.excludeFilter != "" { - for _, excludeFilter := range strings.Split(opt.excludeFilter, "`") { + if opt.ExcludeFilter != "" { + for _, excludeFilter := range strings.Split(opt.ExcludeFilter, "`") { excludeFilterReg := regexp2.MustCompile(excludeFilter, regexp2.None) excludeFilterRegs = append(excludeFilterRegs, excludeFilterReg) } } var filterRegs []*regexp2.Regexp - if opt.filter != "" { - for _, filter := range strings.Split(opt.filter, "`") { + if opt.Filter != "" { + for _, filter := range strings.Split(opt.Filter, "`") { filterReg := regexp2.MustCompile(filter, regexp2.None) filterRegs = append(filterRegs, filterReg) } } gb := &GroupBase{ - Base: outbound.NewBase(opt.BaseOption), + Base: outbound.NewBase(outbound.BaseOption{Name: opt.Name, Type: opt.Type}), filterRegs: filterRegs, excludeFilterRegs: excludeFilterRegs, excludeTypeArray: excludeTypeArray, - providers: opt.providers, + providers: opt.Providers, failedTesting: atomic.NewBool(false), TestTimeout: opt.TestTimeout, - maxFailedTimes: opt.maxFailedTimes, + maxFailedTimes: opt.MaxFailedTimes, } if gb.TestTimeout == 0 { diff --git a/adapter/outboundgroup/loadbalance.go b/adapter/outboundgroup/loadbalance.go index c3222b3a4..99e11c46f 100644 --- a/adapter/outboundgroup/loadbalance.go +++ b/adapter/outboundgroup/loadbalance.go @@ -9,12 +9,10 @@ import ( "sync" "time" - "github.com/metacubex/mihomo/adapter/outbound" "github.com/metacubex/mihomo/common/callback" "github.com/metacubex/mihomo/common/lru" N "github.com/metacubex/mihomo/common/net" "github.com/metacubex/mihomo/common/utils" - "github.com/metacubex/mihomo/component/dialer" C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/constant/provider" @@ -88,9 +86,9 @@ func jumpHash(key uint64, buckets int32) int32 { } // DialContext implements C.ProxyAdapter -func (lb *LoadBalance) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (c C.Conn, err error) { +func (lb *LoadBalance) DialContext(ctx context.Context, metadata *C.Metadata) (c C.Conn, err error) { proxy := lb.Unwrap(metadata, true) - c, err = proxy.DialContext(ctx, metadata, lb.Base.DialOptions(opts...)...) + c, err = proxy.DialContext(ctx, metadata) if err == nil { c.AppendToChains(lb) @@ -112,7 +110,7 @@ func (lb *LoadBalance) DialContext(ctx context.Context, metadata *C.Metadata, op } // ListenPacketContext implements C.ProxyAdapter -func (lb *LoadBalance) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (pc C.PacketConn, err error) { +func (lb *LoadBalance) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (pc C.PacketConn, err error) { defer func() { if err == nil { pc.AppendToChains(lb) @@ -120,7 +118,7 @@ func (lb *LoadBalance) ListenPacketContext(ctx context.Context, metadata *C.Meta }() proxy := lb.Unwrap(metadata, true) - return proxy.ListenPacketContext(ctx, metadata, lb.Base.DialOptions(opts...)...) + return proxy.ListenPacketContext(ctx, metadata) } // SupportUDP implements C.ProxyAdapter @@ -255,18 +253,14 @@ func NewLoadBalance(option *GroupCommonOption, providers []provider.ProxyProvide } return &LoadBalance{ GroupBase: NewGroupBase(GroupBaseOption{ - outbound.BaseOption{ - Name: option.Name, - Type: C.LoadBalance, - Interface: option.Interface, - RoutingMark: option.RoutingMark, - }, - option.Filter, - option.ExcludeFilter, - option.ExcludeType, - option.TestTimeout, - option.MaxFailedTimes, - providers, + Name: option.Name, + Type: C.LoadBalance, + Filter: option.Filter, + ExcludeFilter: option.ExcludeFilter, + ExcludeType: option.ExcludeType, + TestTimeout: option.TestTimeout, + MaxFailedTimes: option.MaxFailedTimes, + Providers: providers, }), strategyFn: strategyFn, disableUDP: option.DisableUDP, diff --git a/adapter/outboundgroup/parser.go b/adapter/outboundgroup/parser.go index b073c4bba..9c09a0f4a 100644 --- a/adapter/outboundgroup/parser.go +++ b/adapter/outboundgroup/parser.go @@ -7,12 +7,12 @@ import ( "github.com/dlclark/regexp2" - "github.com/metacubex/mihomo/adapter/outbound" "github.com/metacubex/mihomo/adapter/provider" "github.com/metacubex/mihomo/common/structure" "github.com/metacubex/mihomo/common/utils" C "github.com/metacubex/mihomo/constant" types "github.com/metacubex/mihomo/constant/provider" + "github.com/metacubex/mihomo/log" ) var ( @@ -23,7 +23,6 @@ var ( ) type GroupCommonOption struct { - outbound.BasicOption Name string `group:"name"` Type string `group:"type"` Proxies []string `group:"proxies,omitempty"` @@ -43,6 +42,10 @@ type GroupCommonOption struct { IncludeAllProviders bool `group:"include-all-providers,omitempty"` Hidden bool `group:"hidden,omitempty"` Icon string `group:"icon,omitempty"` + + // removed configs, only for error logging + Interface string `group:"interface-name,omitempty"` + RoutingMark int `group:"routing-mark,omitempty"` } func ParseProxyGroup(config map[string]any, proxyMap map[string]C.Proxy, providersMap map[string]types.ProxyProvider, AllProxies []string, AllProviders []string) (C.ProxyAdapter, error) { @@ -59,6 +62,13 @@ func ParseProxyGroup(config map[string]any, proxyMap map[string]C.Proxy, provide return nil, errFormat } + if groupOption.RoutingMark != 0 { + log.Errorln("The group [%s] with routing-mark configuration was removed, please set it directly on the proxy instead", groupOption.Name) + } + if groupOption.Interface != "" { + log.Errorln("The group [%s] with interface-name configuration was removed, please set it directly on the proxy instead", groupOption.Name) + } + groupName := groupOption.Name providers := []types.ProxyProvider{} diff --git a/adapter/outboundgroup/relay.go b/adapter/outboundgroup/relay.go index 29aa9c6a7..77a2f03b8 100644 --- a/adapter/outboundgroup/relay.go +++ b/adapter/outboundgroup/relay.go @@ -19,17 +19,17 @@ type Relay struct { } // DialContext implements C.ProxyAdapter -func (r *Relay) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.Conn, error) { +func (r *Relay) DialContext(ctx context.Context, metadata *C.Metadata) (C.Conn, error) { proxies, chainProxies := r.proxies(metadata, true) switch len(proxies) { case 0: - return outbound.NewDirect().DialContext(ctx, metadata, r.Base.DialOptions(opts...)...) + return outbound.NewDirect().DialContext(ctx, metadata) case 1: - return proxies[0].DialContext(ctx, metadata, r.Base.DialOptions(opts...)...) + return proxies[0].DialContext(ctx, metadata) } var d C.Dialer - d = dialer.NewDialer(r.Base.DialOptions(opts...)...) + d = dialer.NewDialer() for _, proxy := range proxies[:len(proxies)-1] { d = proxydialer.New(proxy, d, false) } @@ -49,18 +49,18 @@ func (r *Relay) DialContext(ctx context.Context, metadata *C.Metadata, opts ...d } // ListenPacketContext implements C.ProxyAdapter -func (r *Relay) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (_ C.PacketConn, err error) { +func (r *Relay) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (_ C.PacketConn, err error) { proxies, chainProxies := r.proxies(metadata, true) switch len(proxies) { case 0: - return outbound.NewDirect().ListenPacketContext(ctx, metadata, r.Base.DialOptions(opts...)...) + return outbound.NewDirect().ListenPacketContext(ctx, metadata) case 1: - return proxies[0].ListenPacketContext(ctx, metadata, r.Base.DialOptions(opts...)...) + return proxies[0].ListenPacketContext(ctx, metadata) } var d C.Dialer - d = dialer.NewDialer(r.Base.DialOptions(opts...)...) + d = dialer.NewDialer() for _, proxy := range proxies[:len(proxies)-1] { d = proxydialer.New(proxy, d, false) } @@ -153,18 +153,9 @@ func NewRelay(option *GroupCommonOption, providers []provider.ProxyProvider) *Re log.Warnln("The group [%s] with relay type is deprecated, please using dialer-proxy instead", option.Name) return &Relay{ GroupBase: NewGroupBase(GroupBaseOption{ - outbound.BaseOption{ - Name: option.Name, - Type: C.Relay, - Interface: option.Interface, - RoutingMark: option.RoutingMark, - }, - "", - "", - "", - 5000, - 5, - providers, + Name: option.Name, + Type: C.Relay, + Providers: providers, }), Hidden: option.Hidden, Icon: option.Icon, diff --git a/adapter/outboundgroup/selector.go b/adapter/outboundgroup/selector.go index 20eca70ff..a3f425251 100644 --- a/adapter/outboundgroup/selector.go +++ b/adapter/outboundgroup/selector.go @@ -5,8 +5,6 @@ import ( "encoding/json" "errors" - "github.com/metacubex/mihomo/adapter/outbound" - "github.com/metacubex/mihomo/component/dialer" C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/constant/provider" ) @@ -20,8 +18,8 @@ type Selector struct { } // DialContext implements C.ProxyAdapter -func (s *Selector) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.Conn, error) { - c, err := s.selectedProxy(true).DialContext(ctx, metadata, s.Base.DialOptions(opts...)...) +func (s *Selector) DialContext(ctx context.Context, metadata *C.Metadata) (C.Conn, error) { + c, err := s.selectedProxy(true).DialContext(ctx, metadata) if err == nil { c.AppendToChains(s) } @@ -29,8 +27,8 @@ func (s *Selector) DialContext(ctx context.Context, metadata *C.Metadata, opts . } // ListenPacketContext implements C.ProxyAdapter -func (s *Selector) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.PacketConn, error) { - pc, err := s.selectedProxy(true).ListenPacketContext(ctx, metadata, s.Base.DialOptions(opts...)...) +func (s *Selector) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (C.PacketConn, error) { + pc, err := s.selectedProxy(true).ListenPacketContext(ctx, metadata) if err == nil { pc.AppendToChains(s) } @@ -105,18 +103,14 @@ func (s *Selector) selectedProxy(touch bool) C.Proxy { func NewSelector(option *GroupCommonOption, providers []provider.ProxyProvider) *Selector { return &Selector{ GroupBase: NewGroupBase(GroupBaseOption{ - outbound.BaseOption{ - Name: option.Name, - Type: C.Selector, - Interface: option.Interface, - RoutingMark: option.RoutingMark, - }, - option.Filter, - option.ExcludeFilter, - option.ExcludeType, - option.TestTimeout, - option.MaxFailedTimes, - providers, + Name: option.Name, + Type: C.Selector, + Filter: option.Filter, + ExcludeFilter: option.ExcludeFilter, + ExcludeType: option.ExcludeType, + TestTimeout: option.TestTimeout, + MaxFailedTimes: option.MaxFailedTimes, + Providers: providers, }), selected: "COMPATIBLE", disableUDP: option.DisableUDP, diff --git a/adapter/outboundgroup/urltest.go b/adapter/outboundgroup/urltest.go index bdb15734c..5dc620547 100644 --- a/adapter/outboundgroup/urltest.go +++ b/adapter/outboundgroup/urltest.go @@ -6,12 +6,10 @@ import ( "errors" "time" - "github.com/metacubex/mihomo/adapter/outbound" "github.com/metacubex/mihomo/common/callback" N "github.com/metacubex/mihomo/common/net" "github.com/metacubex/mihomo/common/singledo" "github.com/metacubex/mihomo/common/utils" - "github.com/metacubex/mihomo/component/dialer" C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/constant/provider" ) @@ -62,9 +60,9 @@ func (u *URLTest) ForceSet(name string) { } // DialContext implements C.ProxyAdapter -func (u *URLTest) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (c C.Conn, err error) { +func (u *URLTest) DialContext(ctx context.Context, metadata *C.Metadata) (c C.Conn, err error) { proxy := u.fast(true) - c, err = proxy.DialContext(ctx, metadata, u.Base.DialOptions(opts...)...) + c, err = proxy.DialContext(ctx, metadata) if err == nil { c.AppendToChains(u) } else { @@ -85,9 +83,9 @@ func (u *URLTest) DialContext(ctx context.Context, metadata *C.Metadata, opts .. } // ListenPacketContext implements C.ProxyAdapter -func (u *URLTest) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.PacketConn, error) { +func (u *URLTest) ListenPacketContext(ctx context.Context, metadata *C.Metadata) (C.PacketConn, error) { proxy := u.fast(true) - pc, err := proxy.ListenPacketContext(ctx, metadata, u.Base.DialOptions(opts...)...) + pc, err := proxy.ListenPacketContext(ctx, metadata) if err == nil { pc.AppendToChains(u) } else { @@ -207,19 +205,14 @@ func parseURLTestOption(config map[string]any) []urlTestOption { func NewURLTest(option *GroupCommonOption, providers []provider.ProxyProvider, options ...urlTestOption) *URLTest { urlTest := &URLTest{ GroupBase: NewGroupBase(GroupBaseOption{ - outbound.BaseOption{ - Name: option.Name, - Type: C.URLTest, - Interface: option.Interface, - RoutingMark: option.RoutingMark, - }, - - option.Filter, - option.ExcludeFilter, - option.ExcludeType, - option.TestTimeout, - option.MaxFailedTimes, - providers, + Name: option.Name, + Type: C.URLTest, + Filter: option.Filter, + ExcludeFilter: option.ExcludeFilter, + ExcludeType: option.ExcludeType, + TestTimeout: option.TestTimeout, + MaxFailedTimes: option.MaxFailedTimes, + Providers: providers, }), fastSingle: singledo.NewSingle[C.Proxy](time.Second * 10), disableUDP: option.DisableUDP, diff --git a/component/proxydialer/proxydialer.go b/component/proxydialer/proxydialer.go index 71a658b86..e1a3cda0a 100644 --- a/component/proxydialer/proxydialer.go +++ b/component/proxydialer/proxydialer.go @@ -55,8 +55,8 @@ func (p proxyDialer) DialContext(ctx context.Context, network, address string) ( } var conn C.Conn var err error - if d, ok := p.dialer.(dialer.Dialer); ok { // first using old function to let mux work - conn, err = p.proxy.DialContext(ctx, currentMeta, dialer.WithOption(d.Opt)) + if _, ok := p.dialer.(dialer.Dialer); ok { // first using old function to let mux work + conn, err = p.proxy.DialContext(ctx, currentMeta) } else { conn, err = p.proxy.DialContextWithDialer(ctx, p.dialer, currentMeta) } @@ -78,8 +78,8 @@ func (p proxyDialer) listenPacket(ctx context.Context, currentMeta *C.Metadata) var pc C.PacketConn var err error currentMeta.NetWork = C.UDP - if d, ok := p.dialer.(dialer.Dialer); ok { // first using old function to let mux work - pc, err = p.proxy.ListenPacketContext(ctx, currentMeta, dialer.WithOption(d.Opt)) + if _, ok := p.dialer.(dialer.Dialer); ok { // first using old function to let mux work + pc, err = p.proxy.ListenPacketContext(ctx, currentMeta) } else { pc, err = p.proxy.ListenPacketWithDialer(ctx, p.dialer, currentMeta) } diff --git a/constant/adapters.go b/constant/adapters.go index 4289dfa73..280552ec3 100644 --- a/constant/adapters.go +++ b/constant/adapters.go @@ -134,8 +134,8 @@ type ProxyAdapter interface { // DialContext return a C.Conn with protocol which // contains multiplexing-related reuse logic (if any) - DialContext(ctx context.Context, metadata *Metadata, opts ...dialer.Option) (Conn, error) - ListenPacketContext(ctx context.Context, metadata *Metadata, opts ...dialer.Option) (PacketConn, error) + DialContext(ctx context.Context, metadata *Metadata) (Conn, error) + ListenPacketContext(ctx context.Context, metadata *Metadata) (PacketConn, error) // SupportUOT return UDP over TCP support SupportUOT() bool diff --git a/dns/dhcp.go b/dns/dhcp.go index e3829b7c2..fdd9b2f18 100644 --- a/dns/dhcp.go +++ b/dns/dhcp.go @@ -82,7 +82,7 @@ func (d *dhcpClient) resolve(ctx context.Context) ([]dnsClient, error) { for _, item := range dns { nameserver = append(nameserver, NameServer{ Addr: net.JoinHostPort(item.String(), "53"), - Interface: d.ifaceName, + ProxyName: d.ifaceName, }) } diff --git a/dns/resolver.go b/dns/resolver.go index 9f7e28f38..0dfeadd28 100644 --- a/dns/resolver.go +++ b/dns/resolver.go @@ -393,7 +393,6 @@ func (r *Resolver) ResetConnection() { type NameServer struct { Net string Addr string - Interface string ProxyAdapter C.ProxyAdapter ProxyName string Params map[string]string @@ -407,7 +406,6 @@ func (ns NameServer) Equal(ns2 NameServer) bool { }() if ns.Net == ns2.Net && ns.Addr == ns2.Addr && - ns.Interface == ns2.Interface && ns.ProxyAdapter == ns2.ProxyAdapter && ns.ProxyName == ns2.ProxyName && maps.Equal(ns.Params, ns2.Params) && diff --git a/dns/util.go b/dns/util.go index ee04d24e1..a4ca98d4f 100644 --- a/dns/util.go +++ b/dns/util.go @@ -11,7 +11,6 @@ import ( "time" "github.com/metacubex/mihomo/common/picker" - "github.com/metacubex/mihomo/component/dialer" "github.com/metacubex/mihomo/component/resolver" "github.com/metacubex/mihomo/log" @@ -115,11 +114,6 @@ func transform(servers []NameServer, resolver *Resolver) []dnsClient { continue } - var options []dialer.Option - if s.Interface != "" { - options = append(options, dialer.WithInterface(s.Interface)) - } - host, port, _ := net.SplitHostPort(s.Addr) ret = append(ret, &client{ Client: &D.Client{ @@ -132,7 +126,7 @@ func transform(servers []NameServer, resolver *Resolver) []dnsClient { }, port: port, host: host, - dialer: newDNSDialer(resolver, s.ProxyAdapter, s.ProxyName, options...), + dialer: newDNSDialer(resolver, s.ProxyAdapter, s.ProxyName), }) } return ret diff --git a/tunnel/dns_dialer.go b/tunnel/dns_dialer.go index 1839869b4..c141d9664 100644 --- a/tunnel/dns_dialer.go +++ b/tunnel/dns_dialer.go @@ -21,18 +21,17 @@ type DNSDialer struct { r resolver.Resolver proxyAdapter C.ProxyAdapter proxyName string - opts []dialer.Option } -func NewDNSDialer(r resolver.Resolver, proxyAdapter C.ProxyAdapter, proxyName string, opts ...dialer.Option) *DNSDialer { - return &DNSDialer{r: r, proxyAdapter: proxyAdapter, proxyName: proxyName, opts: opts} +func NewDNSDialer(r resolver.Resolver, proxyAdapter C.ProxyAdapter, proxyName string) *DNSDialer { + return &DNSDialer{r: r, proxyAdapter: proxyAdapter, proxyName: proxyName} } func (d *DNSDialer) DialContext(ctx context.Context, network, addr string) (net.Conn, error) { r := d.r proxyName := d.proxyName proxyAdapter := d.proxyAdapter - opts := d.opts + var opts []dialer.Option var rule C.Rule metadata := &C.Metadata{ NetWork: C.TCP, @@ -94,7 +93,7 @@ func (d *DNSDialer) DialContext(ctx context.Context, network, addr string) (net. metadata.Host = "" // clear host to avoid double resolve in proxy } - conn, err := proxyAdapter.DialContext(ctx, metadata, opts...) + conn, err := proxyAdapter.DialContext(ctx, metadata) if err != nil { logMetadataErr(metadata, rule, proxyAdapter, err) return nil, err @@ -113,7 +112,7 @@ func (d *DNSDialer) DialContext(ctx context.Context, network, addr string) (net. return nil, fmt.Errorf("proxy adapter [%s] UDP is not supported", proxyAdapter) } - packetConn, err := proxyAdapter.ListenPacketContext(ctx, metadata, opts...) + packetConn, err := proxyAdapter.ListenPacketContext(ctx, metadata) if err != nil { logMetadataErr(metadata, rule, proxyAdapter, err) return nil, err @@ -131,7 +130,7 @@ func (d *DNSDialer) ListenPacket(ctx context.Context, network, addr string) (net r := d.r proxyAdapter := d.proxyAdapter proxyName := d.proxyName - opts := d.opts + var opts []dialer.Option metadata := &C.Metadata{ NetWork: C.UDP, Type: C.INNER, @@ -173,7 +172,7 @@ func (d *DNSDialer) ListenPacket(ctx context.Context, network, addr string) (net return nil, fmt.Errorf("proxy adapter [%s] UDP is not supported", proxyAdapter) } - packetConn, err := proxyAdapter.ListenPacketContext(ctx, metadata, opts...) + packetConn, err := proxyAdapter.ListenPacketContext(ctx, metadata) if err != nil { logMetadataErr(metadata, rule, proxyAdapter, err) return nil, err