diff --git a/config/config.go b/config/config.go index b017fea60e314e6ed250ba6421f2a5959936eb46..0348f191408df66e06e5c1a9ea195b464b13a1d6 100644 --- a/config/config.go +++ b/config/config.go @@ -44,8 +44,9 @@ type Config struct { Insecure bool Protector pnet.Protector - Relay bool - RelayOpts []circuit.RelayOpt + RelayCustom bool + Relay bool + RelayOpts []circuit.RelayOpt ListenAddrs []ma.Multiaddr AddrsFactory bhost.AddrsFactory diff --git a/defaults.go b/defaults.go index f19e5ab08ce6d700e0c98bdb83590c5600e934fe..679fd7af5a511f873a04458a3a98cc88abc12c18 100644 --- a/defaults.go +++ b/defaults.go @@ -70,6 +70,11 @@ var DefaultListenAddrs = func(cfg *Config) error { )) } +// DefaultEnableRelay enables relay dialing and listening by default +var DefaultEnableRelay = func(cfg *Config) error { + return cfg.Apply(EnableRelay()) +} + // Complete list of default options and when to fallback on them. // // Please *DON'T* specify default options any other way. Putting this all here @@ -102,6 +107,10 @@ var defaults = []struct { fallback: func(cfg *Config) bool { return cfg.Peerstore == nil }, opt: DefaultPeerstore, }, + { + fallback: func(cfg *Config) bool { return !cfg.RelayCustom }, + opt: DefaultEnableRelay, + }, } // Defaults configures libp2p to use the default options. Can be combined with diff --git a/libp2p_test.go b/libp2p_test.go index 0685f4b6ef741f6256bfabd9d59dbdc820363e1b..3ecedb3b83a21080628d721a6d81d3184ef1a27a 100644 --- a/libp2p_test.go +++ b/libp2p_test.go @@ -81,6 +81,7 @@ func TestDefaultListenAddrs(t *testing.T) { ctx := context.Background() re := regexp.MustCompile("/(ip)[4|6]/((0.0.0.0)|(::))/tcp/") + re2 := regexp.MustCompile("/p2p-circuit") // Test 1: Setting the correct listen addresses if userDefined.Transport == nil && userDefined.ListenAddrs == nil h, err := New(ctx) @@ -88,14 +89,15 @@ func TestDefaultListenAddrs(t *testing.T) { t.Fatal(err) } for _, addr := range h.Network().ListenAddresses() { - if re.FindStringSubmatchIndex(addr.String()) == nil { - t.Error("expected ip4 or ip6 interface") + if re.FindStringSubmatchIndex(addr.String()) == nil && + re2.FindStringSubmatchIndex(addr.String()) == nil { + t.Error("expected ip4 or ip6 or relay interface") } } h.Close() - // Test 2: Listen addr should not set if user defined transport is passed. + // Test 2: Listen addr only include relay if user defined transport is passed. h, err = New( ctx, Transport(tcp.NewTCPTransport), @@ -104,8 +106,11 @@ func TestDefaultListenAddrs(t *testing.T) { t.Fatal(err) } - if len(h.Network().ListenAddresses()) != 0 { - t.Error("expected zero listen addrs as none is set with user defined transport") + if len(h.Network().ListenAddresses()) != 1 { + t.Error("expected one listen addr with user defined transport") + } + if re2.FindStringSubmatchIndex(h.Network().ListenAddresses()[0].String()) == nil { + t.Error("expected relay address") } h.Close() } diff --git a/options.go b/options.go index ed8e89cfd554deae65da74de8f5a15c6d504e031..224336ead6b03d08e95398077fa24c5e1a707ef8 100644 --- a/options.go +++ b/options.go @@ -201,15 +201,25 @@ func AddrsFactory(factory config.AddrsFactory) Option { } } -// EnableRelay configures libp2p to enable the relay transport. +// EnableRelay configures libp2p to enable the relay transport with configuration options. func EnableRelay(options ...circuit.RelayOpt) Option { return func(cfg *Config) error { + cfg.RelayCustom = true cfg.Relay = true cfg.RelayOpts = options return nil } } +// DisableRelay configures libp2p to disable the relay transport +func DisableRelay() Option { + return func(cfg *Config) error { + cfg.RelayCustom = true + cfg.Relay = false + return nil + } +} + // FilterAddresses configures libp2p to never dial nor accept connections from // the given addresses. func FilterAddresses(addrs ...*net.IPNet) Option { @@ -245,9 +255,15 @@ func NATManager(nm config.NATManagerC) Option { // NoListenAddrs will configure libp2p to not listen by default. // // This will both clear any configured listen addrs and prevent libp2p from -// applying the default listen address option. +// applying the default listen address option. It also disables relay, unless the +// user explicitly specifies with an option, as the transport creates an implicit +// listen address that would make the node dialable through any relay it was connected to. var NoListenAddrs = func(cfg *Config) error { cfg.ListenAddrs = []ma.Multiaddr{} + if !cfg.RelayCustom { + cfg.RelayCustom = true + cfg.Relay = false + } return nil }