diff --git a/common/dialer/default.go b/common/dialer/default.go index 2ebb83d9..34f7550d 100644 --- a/common/dialer/default.go +++ b/common/dialer/default.go @@ -341,6 +341,16 @@ func (d *DefaultDialer) ListenSerialInterfacePacket(ctx context.Context, destina } func (d *DefaultDialer) ListenPacketCompat(network, address string) (net.PacketConn, error) { + udpListener := d.udpListener + udpListener.Control = control.Append(udpListener.Control, func(network, address string, conn syscall.RawConn) error { + for _, wgControlFn := range WgControlFns { + err := wgControlFn(network, address, conn) + if err != nil { + return err + } + } + return nil + }) return d.udpListener.ListenPacket(context.Background(), network, address) } diff --git a/option/outbound.go b/option/outbound.go index 1b852d26..e4475ee0 100644 --- a/option/outbound.go +++ b/option/outbound.go @@ -83,7 +83,6 @@ type DialerOptions struct { NetworkType badoption.Listable[InterfaceType] `json:"network_type,omitempty"` FallbackNetworkType badoption.Listable[InterfaceType] `json:"fallback_network_type,omitempty"` FallbackDelay badoption.Duration `json:"fallback_delay,omitempty"` - IsWireGuardListener bool `json:"-"` // Deprecated: migrated to domain resolver DomainStrategy DomainStrategy `json:"domain_strategy,omitempty"` diff --git a/protocol/wireguard/endpoint.go b/protocol/wireguard/endpoint.go index 29acbf12..4165d126 100644 --- a/protocol/wireguard/endpoint.go +++ b/protocol/wireguard/endpoint.go @@ -45,8 +45,8 @@ func NewEndpoint(ctx context.Context, router adapter.Router, logger log.ContextL logger: logger, localAddresses: options.Address, } - if options.Detour == "" { - options.IsWireGuardListener = true + if options.Detour != "" && options.ListenPort != 0 { + return nil, E.New("`listen_port` is conflict with `detour`") } outboundDialer, err := dialer.NewWithOptions(dialer.Options{ Context: ctx, diff --git a/protocol/wireguard/outbound.go b/protocol/wireguard/outbound.go index 1e7a32c7..129e69b8 100644 --- a/protocol/wireguard/outbound.go +++ b/protocol/wireguard/outbound.go @@ -46,9 +46,7 @@ func NewOutbound(ctx context.Context, router adapter.Router, logger log.ContextL logger: logger, localAddresses: options.LocalAddress, } - if options.Detour == "" { - options.IsWireGuardListener = true - } else if options.GSO { + if options.Detour != "" && options.GSO { return nil, E.New("gso is conflict with detour") } outboundDialer, err := dialer.NewWithOptions(dialer.Options{ diff --git a/transport/wireguard/endpoint.go b/transport/wireguard/endpoint.go index bddd2a12..3801640f 100644 --- a/transport/wireguard/endpoint.go +++ b/transport/wireguard/endpoint.go @@ -141,7 +141,7 @@ func (e *Endpoint) Start(resolve bool) error { return nil } var bind conn.Bind - wgListener, isWgListener := e.options.Dialer.(conn.Listener) + wgListener, isWgListener := common.Cast[conn.Listener](e.options.Dialer) if isWgListener { bind = conn.NewStdNetBind(wgListener) } else {