mirror of
https://github.com/SagerNet/sing-box.git
synced 2025-06-13 21:54:13 +08:00
Compare commits
89 Commits
139a48780f
...
45798b10c8
Author | SHA1 | Date | |
---|---|---|---|
![]() |
45798b10c8 | ||
![]() |
0f8bd01aad | ||
![]() |
e528d425a1 | ||
![]() |
05b6a088a6 | ||
![]() |
73f4b41366 | ||
![]() |
a15f35a076 | ||
![]() |
2316ca38a9 | ||
![]() |
fc0096b0e6 | ||
![]() |
d6ab06e1aa | ||
![]() |
55ca427721 | ||
![]() |
26ae7a61e9 | ||
![]() |
013c707ee8 | ||
![]() |
01b3d719f5 | ||
![]() |
3722fc4987 | ||
![]() |
ed3aca4208 | ||
![]() |
5155f95ace | ||
![]() |
7185c03f01 | ||
![]() |
839c4a31fc | ||
![]() |
fd6e5abb86 | ||
![]() |
407f2dad75 | ||
![]() |
883cd0eb62 | ||
![]() |
f0c3464757 | ||
![]() |
8b27e1f23f | ||
![]() |
d1a11df54f | ||
![]() |
0c6b7e7d16 | ||
![]() |
20dd4b74c6 | ||
![]() |
c5df6c8c49 | ||
![]() |
d379dcc53d | ||
![]() |
ea012b4173 | ||
![]() |
0b52e96b3c | ||
![]() |
d998a73a4c | ||
![]() |
015f6efc09 | ||
![]() |
1befa4bf2f | ||
![]() |
6ab62ea5c7 | ||
![]() |
a6e9d900c8 | ||
![]() |
f40e9e7306 | ||
![]() |
724d74e6ae | ||
![]() |
9afdd2d0fb | ||
![]() |
8f1e2566da | ||
![]() |
aa6a6fd002 | ||
![]() |
2288a080de | ||
![]() |
62a9691016 | ||
![]() |
74f6941c3c | ||
![]() |
551db61d33 | ||
![]() |
55e1fa8a15 | ||
![]() |
13bffd4819 | ||
![]() |
0a6e6d773c | ||
![]() |
572285eef1 | ||
![]() |
f670078ebf | ||
![]() |
8e8211b3e8 | ||
![]() |
192f452e0f | ||
![]() |
b953dad23f | ||
![]() |
c42598c5a3 | ||
![]() |
2c730e3ca6 | ||
![]() |
df788c7925 | ||
![]() |
f56bd38060 | ||
![]() |
0614d85b01 | ||
![]() |
483fd413fb | ||
![]() |
cb048be805 | ||
![]() |
ead0b3d99a | ||
![]() |
42fd9b50cf | ||
![]() |
aa91604522 | ||
![]() |
dfc6398442 | ||
![]() |
6cdf99dc45 | ||
![]() |
382ed8158a | ||
![]() |
d43767f992 | ||
![]() |
eccace2329 | ||
![]() |
06b6369f89 | ||
![]() |
ad4f82243a | ||
![]() |
9c53916115 | ||
![]() |
ceb7a25cf7 | ||
![]() |
9d4bab4723 | ||
![]() |
0e0ca7508d | ||
![]() |
ea8aeb04f0 | ||
![]() |
493bc247d7 | ||
![]() |
9e4dfcf644 | ||
![]() |
5d2a70a92a | ||
![]() |
348cc39975 | ||
![]() |
987899f94a | ||
![]() |
d8b2d5142f | ||
![]() |
134802d1ee | ||
![]() |
e5e81b4de1 | ||
![]() |
300c961efa | ||
![]() |
7c7f512405 | ||
![]() |
03e8d029c2 | ||
![]() |
787b5f1931 | ||
![]() |
56a7624618 | ||
![]() |
3a84acf122 | ||
![]() |
f600e02e47 |
@ -1 +1 @@
|
|||||||
Subproject commit 55f31c29bb68895ce544e0dfbf852b4b3e32b530
|
Subproject commit 6a15780ce1659a234816f7248cbc09e8ea54a1be
|
@ -341,7 +341,17 @@ func (d *DefaultDialer) ListenSerialInterfacePacket(ctx context.Context, destina
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *DefaultDialer) ListenPacketCompat(network, address string) (net.PacketConn, error) {
|
func (d *DefaultDialer) ListenPacketCompat(network, address string) (net.PacketConn, error) {
|
||||||
return d.udpListener.ListenPacket(context.Background(), network, address)
|
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 udpListener.ListenPacket(context.Background(), network, address)
|
||||||
}
|
}
|
||||||
|
|
||||||
func trackConn(conn net.Conn, err error) (net.Conn, error) {
|
func trackConn(conn net.Conn, err error) (net.Conn, error) {
|
||||||
|
@ -268,13 +268,10 @@ func (c *Client) Lookup(ctx context.Context, transport adapter.DNSTransport, dom
|
|||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
err := group.Run(ctx)
|
err := group.Run(ctx)
|
||||||
if len(response4) > 0 || len(response6) > 0 {
|
if len(response4) == 0 && len(response6) == 0 {
|
||||||
return sortAddresses(response4, response6, options.Strategy), nil
|
|
||||||
} else if err != nil {
|
|
||||||
return nil, err
|
return nil, err
|
||||||
} else {
|
|
||||||
return nil, RcodeError(dns.RcodeNameError)
|
|
||||||
}
|
}
|
||||||
|
return sortAddresses(response4, response6, options.Strategy), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) ClearCache() {
|
func (c *Client) ClearCache() {
|
||||||
|
@ -323,6 +323,9 @@ func (r *Router) Lookup(ctx context.Context, domain string, options adapter.DNSQ
|
|||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
printResult := func() {
|
printResult := func() {
|
||||||
|
if err == nil && len(responseAddrs) == 0 {
|
||||||
|
err = E.New("empty result")
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Is(err, ErrResponseRejectedCached) {
|
if errors.Is(err, ErrResponseRejectedCached) {
|
||||||
r.logger.DebugContext(ctx, "response rejected for ", domain, " (cached)")
|
r.logger.DebugContext(ctx, "response rejected for ", domain, " (cached)")
|
||||||
@ -331,14 +334,15 @@ func (r *Router) Lookup(ctx context.Context, domain string, options adapter.DNSQ
|
|||||||
} else {
|
} else {
|
||||||
r.logger.ErrorContext(ctx, E.Cause(err, "lookup failed for ", domain))
|
r.logger.ErrorContext(ctx, E.Cause(err, "lookup failed for ", domain))
|
||||||
}
|
}
|
||||||
} else if len(responseAddrs) == 0 {
|
}
|
||||||
panic("unexpected empty result")
|
if err != nil {
|
||||||
|
err = E.Cause(err, "lookup ", domain)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
responseAddrs, cached = r.client.LookupCache(domain, options.Strategy)
|
responseAddrs, cached = r.client.LookupCache(domain, options.Strategy)
|
||||||
if cached {
|
if cached {
|
||||||
if len(responseAddrs) == 0 {
|
if len(responseAddrs) == 0 {
|
||||||
return nil, RcodeNameError
|
return nil, E.New("lookup ", domain, ": empty result (cached)")
|
||||||
}
|
}
|
||||||
return responseAddrs, nil
|
return responseAddrs, nil
|
||||||
}
|
}
|
||||||
|
@ -93,7 +93,9 @@ func NewHTTPS(ctx context.Context, logger log.ContextLogger, tag string, options
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
serverAddr := options.DNSServerAddressOptions.Build()
|
serverAddr := options.DNSServerAddressOptions.Build()
|
||||||
if serverAddr.Port == 0 {
|
if !serverAddr.Addr.IsValid() {
|
||||||
|
return nil, E.New("invalid server address: ", serverAddr)
|
||||||
|
} else if serverAddr.Port == 0 {
|
||||||
serverAddr.Port = 443
|
serverAddr.Port = 443
|
||||||
}
|
}
|
||||||
return NewHTTPSRaw(
|
return NewHTTPSRaw(
|
||||||
|
@ -3,6 +3,7 @@ package local
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
"net/netip"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/sagernet/sing-box/adapter"
|
"github.com/sagernet/sing-box/adapter"
|
||||||
@ -90,8 +91,9 @@ func (t *Transport) exchangeParallel(ctx context.Context, systemConfig *dnsConfi
|
|||||||
startRacer := func(ctx context.Context, fqdn string) {
|
startRacer := func(ctx context.Context, fqdn string) {
|
||||||
response, err := t.tryOneName(ctx, systemConfig, fqdn, message)
|
response, err := t.tryOneName(ctx, systemConfig, fqdn, message)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
addresses, _ := dns.MessageToAddresses(response)
|
var addresses []netip.Addr
|
||||||
if len(addresses) == 0 {
|
addresses, err = dns.MessageToAddresses(response)
|
||||||
|
if err == nil && len(addresses) == 0 {
|
||||||
err = E.New(fqdn, ": empty result")
|
err = E.New(fqdn, ": empty result")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -89,7 +89,9 @@ func NewHTTP3(ctx context.Context, logger log.ContextLogger, tag string, options
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
serverAddr := options.DNSServerAddressOptions.Build()
|
serverAddr := options.DNSServerAddressOptions.Build()
|
||||||
if serverAddr.Port == 0 {
|
if !serverAddr.Addr.IsValid() {
|
||||||
|
return nil, E.New("invalid server address: ", serverAddr)
|
||||||
|
} else if serverAddr.Port == 0 {
|
||||||
serverAddr.Port = 443
|
serverAddr.Port = 443
|
||||||
}
|
}
|
||||||
return &HTTP3Transport{
|
return &HTTP3Transport{
|
||||||
|
@ -16,6 +16,7 @@ import (
|
|||||||
sQUIC "github.com/sagernet/sing-quic"
|
sQUIC "github.com/sagernet/sing-quic"
|
||||||
"github.com/sagernet/sing/common"
|
"github.com/sagernet/sing/common"
|
||||||
"github.com/sagernet/sing/common/bufio"
|
"github.com/sagernet/sing/common/bufio"
|
||||||
|
E "github.com/sagernet/sing/common/exceptions"
|
||||||
"github.com/sagernet/sing/common/logger"
|
"github.com/sagernet/sing/common/logger"
|
||||||
M "github.com/sagernet/sing/common/metadata"
|
M "github.com/sagernet/sing/common/metadata"
|
||||||
N "github.com/sagernet/sing/common/network"
|
N "github.com/sagernet/sing/common/network"
|
||||||
@ -55,7 +56,9 @@ func NewQUIC(ctx context.Context, logger log.ContextLogger, tag string, options
|
|||||||
tlsConfig.SetNextProtos([]string{"doq"})
|
tlsConfig.SetNextProtos([]string{"doq"})
|
||||||
}
|
}
|
||||||
serverAddr := options.DNSServerAddressOptions.Build()
|
serverAddr := options.DNSServerAddressOptions.Build()
|
||||||
if serverAddr.Port == 0 {
|
if !serverAddr.Addr.IsValid() {
|
||||||
|
return nil, E.New("invalid server address: ", serverAddr)
|
||||||
|
} else if serverAddr.Port == 0 {
|
||||||
serverAddr.Port = 853
|
serverAddr.Port = 853
|
||||||
}
|
}
|
||||||
return &Transport{
|
return &Transport{
|
||||||
|
@ -13,6 +13,7 @@ import (
|
|||||||
"github.com/sagernet/sing-box/option"
|
"github.com/sagernet/sing-box/option"
|
||||||
"github.com/sagernet/sing/common"
|
"github.com/sagernet/sing/common"
|
||||||
"github.com/sagernet/sing/common/buf"
|
"github.com/sagernet/sing/common/buf"
|
||||||
|
E "github.com/sagernet/sing/common/exceptions"
|
||||||
M "github.com/sagernet/sing/common/metadata"
|
M "github.com/sagernet/sing/common/metadata"
|
||||||
N "github.com/sagernet/sing/common/network"
|
N "github.com/sagernet/sing/common/network"
|
||||||
|
|
||||||
@ -37,7 +38,9 @@ func NewTCP(ctx context.Context, logger log.ContextLogger, tag string, options o
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
serverAddr := options.DNSServerAddressOptions.Build()
|
serverAddr := options.DNSServerAddressOptions.Build()
|
||||||
if serverAddr.Port == 0 {
|
if !serverAddr.Addr.IsValid() {
|
||||||
|
return nil, E.New("invalid server address: ", serverAddr)
|
||||||
|
} else if serverAddr.Port == 0 {
|
||||||
serverAddr.Port = 53
|
serverAddr.Port = 53
|
||||||
}
|
}
|
||||||
return &TCPTransport{
|
return &TCPTransport{
|
||||||
|
@ -54,7 +54,9 @@ func NewTLS(ctx context.Context, logger log.ContextLogger, tag string, options o
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
serverAddr := options.DNSServerAddressOptions.Build()
|
serverAddr := options.DNSServerAddressOptions.Build()
|
||||||
if serverAddr.Port == 0 {
|
if !serverAddr.Addr.IsValid() {
|
||||||
|
return nil, E.New("invalid server address: ", serverAddr)
|
||||||
|
} else if serverAddr.Port == 0 {
|
||||||
serverAddr.Port = 853
|
serverAddr.Port = 853
|
||||||
}
|
}
|
||||||
return &TLSTransport{
|
return &TLSTransport{
|
||||||
|
@ -13,6 +13,7 @@ import (
|
|||||||
"github.com/sagernet/sing-box/log"
|
"github.com/sagernet/sing-box/log"
|
||||||
"github.com/sagernet/sing-box/option"
|
"github.com/sagernet/sing-box/option"
|
||||||
"github.com/sagernet/sing/common/buf"
|
"github.com/sagernet/sing/common/buf"
|
||||||
|
E "github.com/sagernet/sing/common/exceptions"
|
||||||
"github.com/sagernet/sing/common/logger"
|
"github.com/sagernet/sing/common/logger"
|
||||||
M "github.com/sagernet/sing/common/metadata"
|
M "github.com/sagernet/sing/common/metadata"
|
||||||
N "github.com/sagernet/sing/common/network"
|
N "github.com/sagernet/sing/common/network"
|
||||||
@ -44,7 +45,9 @@ func NewUDP(ctx context.Context, logger log.ContextLogger, tag string, options o
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
serverAddr := options.DNSServerAddressOptions.Build()
|
serverAddr := options.DNSServerAddressOptions.Build()
|
||||||
if serverAddr.Port == 0 {
|
if !serverAddr.Addr.IsValid() {
|
||||||
|
return nil, E.New("invalid server address: ", serverAddr)
|
||||||
|
} else if serverAddr.Port == 0 {
|
||||||
serverAddr.Port = 53
|
serverAddr.Port = 53
|
||||||
}
|
}
|
||||||
return NewUDPRaw(logger, dns.NewTransportAdapterWithRemoteOptions(C.DNSTypeUDP, tag, options), transportDialer, serverAddr), nil
|
return NewUDPRaw(logger, dns.NewTransportAdapterWithRemoteOptions(C.DNSTypeUDP, tag, options), transportDialer, serverAddr), nil
|
||||||
|
@ -2,6 +2,16 @@
|
|||||||
icon: material/alert-decagram
|
icon: material/alert-decagram
|
||||||
---
|
---
|
||||||
|
|
||||||
|
#### 1.12.0-beta.6
|
||||||
|
|
||||||
|
* Fixes and improvements
|
||||||
|
|
||||||
|
### 1.11.9
|
||||||
|
|
||||||
|
* Fixes and improvements
|
||||||
|
|
||||||
|
_We are temporarily unable to update sing-box apps on the App Store because the reviewer mistakenly found that we violated the rules (TestFlight users are not affected)._
|
||||||
|
|
||||||
#### 1.12.0-beta.5
|
#### 1.12.0-beta.5
|
||||||
|
|
||||||
* Fixes and improvements
|
* Fixes and improvements
|
||||||
|
@ -83,7 +83,6 @@ type DialerOptions struct {
|
|||||||
NetworkType badoption.Listable[InterfaceType] `json:"network_type,omitempty"`
|
NetworkType badoption.Listable[InterfaceType] `json:"network_type,omitempty"`
|
||||||
FallbackNetworkType badoption.Listable[InterfaceType] `json:"fallback_network_type,omitempty"`
|
FallbackNetworkType badoption.Listable[InterfaceType] `json:"fallback_network_type,omitempty"`
|
||||||
FallbackDelay badoption.Duration `json:"fallback_delay,omitempty"`
|
FallbackDelay badoption.Duration `json:"fallback_delay,omitempty"`
|
||||||
IsWireGuardListener bool `json:"-"`
|
|
||||||
|
|
||||||
// Deprecated: migrated to domain resolver
|
// Deprecated: migrated to domain resolver
|
||||||
DomainStrategy DomainStrategy `json:"domain_strategy,omitempty"`
|
DomainStrategy DomainStrategy `json:"domain_strategy,omitempty"`
|
||||||
|
@ -45,8 +45,8 @@ func NewEndpoint(ctx context.Context, router adapter.Router, logger log.ContextL
|
|||||||
logger: logger,
|
logger: logger,
|
||||||
localAddresses: options.Address,
|
localAddresses: options.Address,
|
||||||
}
|
}
|
||||||
if options.Detour == "" {
|
if options.Detour != "" && options.ListenPort != 0 {
|
||||||
options.IsWireGuardListener = true
|
return nil, E.New("`listen_port` is conflict with `detour`")
|
||||||
}
|
}
|
||||||
outboundDialer, err := dialer.NewWithOptions(dialer.Options{
|
outboundDialer, err := dialer.NewWithOptions(dialer.Options{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
|
@ -46,9 +46,7 @@ func NewOutbound(ctx context.Context, router adapter.Router, logger log.ContextL
|
|||||||
logger: logger,
|
logger: logger,
|
||||||
localAddresses: options.LocalAddress,
|
localAddresses: options.LocalAddress,
|
||||||
}
|
}
|
||||||
if options.Detour == "" {
|
if options.Detour != "" && options.GSO {
|
||||||
options.IsWireGuardListener = true
|
|
||||||
} else if options.GSO {
|
|
||||||
return nil, E.New("gso is conflict with detour")
|
return nil, E.New("gso is conflict with detour")
|
||||||
}
|
}
|
||||||
outboundDialer, err := dialer.NewWithOptions(dialer.Options{
|
outboundDialer, err := dialer.NewWithOptions(dialer.Options{
|
||||||
|
@ -7,6 +7,7 @@ import (
|
|||||||
"net"
|
"net"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
@ -66,7 +67,17 @@ func (m *ConnectionManager) NewConnection(ctx context.Context, this N.Dialer, co
|
|||||||
remoteConn, err = this.DialContext(ctx, N.NetworkTCP, metadata.Destination)
|
remoteConn, err = this.DialContext(ctx, N.NetworkTCP, metadata.Destination)
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = E.Cause(err, "open outbound connection")
|
var remoteString string
|
||||||
|
if len(metadata.DestinationAddresses) > 0 {
|
||||||
|
remoteString = "[" + strings.Join(common.Map(metadata.DestinationAddresses, netip.Addr.String), ",") + "]"
|
||||||
|
} else {
|
||||||
|
remoteString = metadata.Destination.String()
|
||||||
|
}
|
||||||
|
var dialerString string
|
||||||
|
if outbound, isOutbound := this.(adapter.Outbound); isOutbound {
|
||||||
|
dialerString = " using outbound/" + outbound.Type() + "[" + outbound.Tag() + "]"
|
||||||
|
}
|
||||||
|
err = E.Cause(err, "open connection to ", remoteString, dialerString)
|
||||||
N.CloseOnHandshakeFailure(conn, onClose, err)
|
N.CloseOnHandshakeFailure(conn, onClose, err)
|
||||||
m.logger.ErrorContext(ctx, err)
|
m.logger.ErrorContext(ctx, err)
|
||||||
return
|
return
|
||||||
@ -133,8 +144,19 @@ func (m *ConnectionManager) NewPacketConnection(ctx context.Context, this N.Dial
|
|||||||
remoteConn, err = this.DialContext(ctx, N.NetworkUDP, metadata.Destination)
|
remoteConn, err = this.DialContext(ctx, N.NetworkUDP, metadata.Destination)
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
var remoteString string
|
||||||
|
if len(metadata.DestinationAddresses) > 0 {
|
||||||
|
remoteString = "[" + strings.Join(common.Map(metadata.DestinationAddresses, netip.Addr.String), ",") + "]"
|
||||||
|
} else {
|
||||||
|
remoteString = metadata.Destination.String()
|
||||||
|
}
|
||||||
|
var dialerString string
|
||||||
|
if outbound, isOutbound := this.(adapter.Outbound); isOutbound {
|
||||||
|
dialerString = " using outbound/" + outbound.Type() + "[" + outbound.Tag() + "]"
|
||||||
|
}
|
||||||
|
err = E.Cause(err, "open packet connection to ", remoteString, dialerString)
|
||||||
N.CloseOnHandshakeFailure(conn, onClose, err)
|
N.CloseOnHandshakeFailure(conn, onClose, err)
|
||||||
m.logger.ErrorContext(ctx, "open outbound packet connection: ", err)
|
m.logger.ErrorContext(ctx, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
remotePacketConn = bufio.NewUnbindPacketConn(remoteConn)
|
remotePacketConn = bufio.NewUnbindPacketConn(remoteConn)
|
||||||
@ -149,8 +171,13 @@ func (m *ConnectionManager) NewPacketConnection(ctx context.Context, this N.Dial
|
|||||||
remotePacketConn, err = this.ListenPacket(ctx, metadata.Destination)
|
remotePacketConn, err = this.ListenPacket(ctx, metadata.Destination)
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
var dialerString string
|
||||||
|
if outbound, isOutbound := this.(adapter.Outbound); isOutbound {
|
||||||
|
dialerString = " using outbound/" + outbound.Type() + "[" + outbound.Tag() + "]"
|
||||||
|
}
|
||||||
|
err = E.Cause(err, "listen packet connection using ", dialerString)
|
||||||
N.CloseOnHandshakeFailure(conn, onClose, err)
|
N.CloseOnHandshakeFailure(conn, onClose, err)
|
||||||
m.logger.ErrorContext(ctx, "listen outbound packet connection: ", err)
|
m.logger.ErrorContext(ctx, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -141,7 +141,7 @@ func (e *Endpoint) Start(resolve bool) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var bind conn.Bind
|
var bind conn.Bind
|
||||||
wgListener, isWgListener := e.options.Dialer.(conn.Listener)
|
wgListener, isWgListener := common.Cast[conn.Listener](e.options.Dialer)
|
||||||
if isWgListener {
|
if isWgListener {
|
||||||
bind = conn.NewStdNetBind(wgListener)
|
bind = conn.NewStdNetBind(wgListener)
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user