diff --git a/core/core.go b/core/core.go index 7151fc8c5..38788ac55 100644 --- a/core/core.go +++ b/core/core.go @@ -214,7 +214,7 @@ func (n *IpfsNode) startOnlineServices(ctx context.Context, routingOption Routin } peerhost, err := hostOption(ctx, n.Identity, n.Peerstore, n.Reporter, - addrfilter, tpt, protec) + addrfilter, tpt, protec, &ConstructPeerHostOpts{DisableNatPortMap: cfg.Swarm.DisableNatPortMap}) if err != nil { return err } @@ -709,12 +709,16 @@ func listenAddresses(cfg *config.Config) ([]ma.Multiaddr, error) { return listen, nil } -type HostOption func(ctx context.Context, id peer.ID, ps pstore.Peerstore, bwr metrics.Reporter, fs []*net.IPNet, tpt smux.Transport, protc ipnet.Protector) (p2phost.Host, error) +type ConstructPeerHostOpts struct { + DisableNatPortMap bool +} + +type HostOption func(ctx context.Context, id peer.ID, ps pstore.Peerstore, bwr metrics.Reporter, fs []*net.IPNet, tpt smux.Transport, protc ipnet.Protector, opts *ConstructPeerHostOpts) (p2phost.Host, error) var DefaultHostOption HostOption = constructPeerHost // isolates the complex initialization steps -func constructPeerHost(ctx context.Context, id peer.ID, ps pstore.Peerstore, bwr metrics.Reporter, fs []*net.IPNet, tpt smux.Transport, protec ipnet.Protector) (p2phost.Host, error) { +func constructPeerHost(ctx context.Context, id peer.ID, ps pstore.Peerstore, bwr metrics.Reporter, fs []*net.IPNet, tpt smux.Transport, protec ipnet.Protector, opts *ConstructPeerHostOpts) (p2phost.Host, error) { // no addresses to begin with. we'll start later. swrm, err := swarm.NewSwarmWithProtector(ctx, nil, id, ps, protec, tpt, bwr) @@ -728,7 +732,12 @@ func constructPeerHost(ctx context.Context, id peer.ID, ps pstore.Peerstore, bwr network.Swarm().Filters.AddDialFilter(f) } - host := p2pbhost.New(network, p2pbhost.NATPortMap, bwr) + hostOpts := []interface{}{bwr} + if !opts.DisableNatPortMap { + hostOpts = append(hostOpts, p2pbhost.NATPortMap) + } + + host := p2pbhost.New(network, hostOpts...) return host, nil } diff --git a/core/mock/mock.go b/core/mock/mock.go index 0e28034e4..7d3bc1410 100644 --- a/core/mock/mock.go +++ b/core/mock/mock.go @@ -34,7 +34,7 @@ func NewMockNode() (*core.IpfsNode, error) { } func MockHostOption(mn mocknet.Mocknet) core.HostOption { - return func(ctx context.Context, id peer.ID, ps pstore.Peerstore, bwr metrics.Reporter, fs []*net.IPNet, _ smux.Transport, _ ipnet.Protector) (host.Host, error) { + return func(ctx context.Context, id peer.ID, ps pstore.Peerstore, bwr metrics.Reporter, fs []*net.IPNet, _ smux.Transport, _ ipnet.Protector, _ *core.ConstructPeerHostOpts) (host.Host, error) { return mn.AddPeerWithPeerstore(id, ps) } } diff --git a/docs/config.md b/docs/config.md index bd9395bcf..c922fc398 100644 --- a/docs/config.md +++ b/docs/config.md @@ -216,7 +216,10 @@ See https://github.com/ipfs/go-ipfs/issues/1226#issuecomment-120494604 for more - `DisableBandwidthMetrics` A boolean value that when set to true, will cause ipfs to not keep track of bandwidth metrics. Disabling bandwidth metrics can lead to a slight performance -improvement, as well as a reduction in memory usage. +improvement, as well as a reduction in memory usage. + +- `DisableNatPortMap` +Disable NAT discovery. ## `Tour` Unused. diff --git a/repo/config/swarm.go b/repo/config/swarm.go index 7d074d996..d61c0a2e5 100644 --- a/repo/config/swarm.go +++ b/repo/config/swarm.go @@ -3,4 +3,5 @@ package config type SwarmConfig struct { AddrFilters []string DisableBandwidthMetrics bool + DisableNatPortMap bool }