diff --git a/dialer/dialer.go b/dialer/dialer.go index 8bac12d1..217fc3df 100644 --- a/dialer/dialer.go +++ b/dialer/dialer.go @@ -19,7 +19,7 @@ type ExtraOption struct { UtlsImitate string BandwidthMaxTx string BandwidthMaxRx string - UDPHopInterval time.Duration + UDPHopInterval time.Duration } type Property struct { diff --git a/pkg/cert/cert_pool_windows.go b/pkg/cert/cert_pool_windows.go index 7ccc7f31..0c086fa1 100644 --- a/pkg/cert/cert_pool_windows.go +++ b/pkg/cert/cert_pool_windows.go @@ -1,3 +1,4 @@ +//go:build windows // +build windows package cert diff --git a/protocol/hysteria2/client/client.go b/protocol/hysteria2/client/client.go index 3d1dc1d3..b6f65cb2 100644 --- a/protocol/hysteria2/client/client.go +++ b/protocol/hysteria2/client/client.go @@ -59,7 +59,7 @@ type clientImpl struct { } func (c *clientImpl) connect(ctx context.Context) (*HandshakeInfo, error) { - pktConn, err := c.config.ConnFactory.New(ctx) + pktConn, serverAddr, err := c.config.ConnFactory.New(ctx) if err != nil { return nil, err } @@ -86,7 +86,7 @@ func (c *clientImpl) connect(ctx context.Context) (*HandshakeInfo, error) { TLSClientConfig: tlsConfig, QUICConfig: quicConfig, Dial: func(ctx context.Context, _ string, tlsCfg *tls.Config, cfg *quic.Config) (quic.EarlyConnection, error) { - qc, err := quic.DialEarly(ctx, pktConn, c.config.ServerAddr, tlsCfg, cfg) + qc, err := quic.DialEarly(ctx, pktConn, serverAddr, tlsCfg, cfg) if err != nil { return nil, err } diff --git a/protocol/hysteria2/client/config.go b/protocol/hysteria2/client/config.go index 961bc058..657ff087 100644 --- a/protocol/hysteria2/client/config.go +++ b/protocol/hysteria2/client/config.go @@ -19,7 +19,6 @@ const ( type Config struct { ConnFactory ConnFactory - ServerAddr net.Addr Auth string TLSConfig TLSConfig QUICConfig QUICConfig @@ -39,9 +38,6 @@ func (c *Config) verifyAndFill() error { if c.ConnFactory == nil { return errors.ConfigError{Field: "ConnFactory", Reason: "must be set"} } - if c.ServerAddr == nil { - return errors.ConfigError{Field: "ServerAddr", Reason: "must be set"} - } if c.QUICConfig.InitialStreamReceiveWindow == 0 { c.QUICConfig.InitialStreamReceiveWindow = defaultStreamReceiveWindow } else if c.QUICConfig.InitialStreamReceiveWindow < 16384 { @@ -79,14 +75,14 @@ func (c *Config) verifyAndFill() error { } type ConnFactory interface { - New(context.Context) (net.PacketConn, error) + New(context.Context) (net.PacketConn, net.Addr, error) } type UdpConnFactory struct { - NewFunc func(ctx context.Context) (net.PacketConn, error) + NewFunc func(ctx context.Context) (net.PacketConn, net.Addr, error) } -func (f *UdpConnFactory) New(ctx context.Context) (net.PacketConn, error) { +func (f *UdpConnFactory) New(ctx context.Context) (net.PacketConn, net.Addr, error) { return f.NewFunc(ctx) } diff --git a/protocol/hysteria2/dialer.go b/protocol/hysteria2/dialer.go index 282efc94..12697ee4 100644 --- a/protocol/hysteria2/dialer.go +++ b/protocol/hysteria2/dialer.go @@ -56,19 +56,13 @@ func NewDialer(nextDialer netproxy.Dialer, header protocol.Header) (netproxy.Dia config.UDPHopInterval = feature.(*Feature1).UDPHopInterval } - var err error - if !isPortHoppingPort(port) { - config.ServerAddr, err = net.ResolveUDPAddr("udp", hostPort) - } else { - config.ServerAddr, err = udphop.ResolveUDPHopAddr(hostPort) - } - if err != nil { - return nil, err - } - - if config.ServerAddr.Network() == "udphop" { + if isPortHoppingPort(port) { config.ConnFactory = &client.UdpConnFactory{ - NewFunc: func(ctx context.Context) (net.PacketConn, error) { + NewFunc: func(ctx context.Context) (net.PacketConn, net.Addr, error) { + serverAddr, err := udphop.ResolveUDPHopAddr(hostPort) + if err != nil { + return nil, nil, err + } dialFunc := func(addr net.Addr) (net.PacketConn, error) { conn, err := nextDialer.DialContext(ctx, "udp", addr.String()) if err != nil { @@ -80,21 +74,29 @@ func NewDialer(nextDialer netproxy.Dialer, header protocol.Header) (netproxy.Dia addr, ), nil } - return udphop.NewUDPHopPacketConn(config.ServerAddr.(*udphop.UDPHopAddr), config.UDPHopInterval, dialFunc) + conn, err := udphop.NewUDPHopPacketConn(serverAddr, config.UDPHopInterval, dialFunc) + if err != nil { + return nil, nil, err + } + return conn, serverAddr, nil }, } } else { config.ConnFactory = &client.UdpConnFactory{ - NewFunc: func(ctx context.Context) (net.PacketConn, error) { - conn, err := nextDialer.DialContext(ctx, "udp", config.ServerAddr.String()) + NewFunc: func(ctx context.Context) (net.PacketConn, net.Addr, error) { + serverAddr, err := net.ResolveUDPAddr("udp", hostPort) + if err != nil { + return nil, nil, err + } + conn, err := nextDialer.DialContext(ctx, "udp", serverAddr.String()) if err != nil { - return nil, err + return nil, nil, err } return netproxy.NewFakeNetPacketConn( conn.(netproxy.PacketConn), net.UDPAddrFromAddrPort(common.GetUniqueFakeAddrPort()), - config.ServerAddr, - ), nil + serverAddr, + ), serverAddr, nil }, } } diff --git a/transport/shadowsocksr/obfs/obfs.go b/transport/shadowsocksr/obfs/obfs.go index 0d331834..fe0176e4 100644 --- a/transport/shadowsocksr/obfs/obfs.go +++ b/transport/shadowsocksr/obfs/obfs.go @@ -7,7 +7,7 @@ import ( type Creator func() IObfs type constructor struct { - New Creator + New Creator Overhead int }