diff --git a/p2p/net/interface.go b/p2p/net/interface.go index 577c496cb..5998f2a63 100644 --- a/p2p/net/interface.go +++ b/p2p/net/interface.go @@ -69,6 +69,9 @@ type Network interface { // If there is no connection to p, attempts to create one. NewStream(peer.ID) (Stream, error) + // Listen tells the network to start listening on given multiaddrs. + Listen(...ma.Multiaddr) error + // ListenAddresses returns a list of addresses at which this network listens. ListenAddresses() []ma.Multiaddr diff --git a/p2p/net/mock/mock_peernet.go b/p2p/net/mock/mock_peernet.go index b6bbbaa61..87e51faf6 100644 --- a/p2p/net/mock/mock_peernet.go +++ b/p2p/net/mock/mock_peernet.go @@ -305,6 +305,12 @@ func (pn *peernet) BandwidthTotals() (in uint64, out uint64) { return 0, 0 } +// Listen tells the network to start listening on given multiaddrs. +func (pn *peernet) Listen(addrs ...ma.Multiaddr) error { + pn.Peerstore().AddAddresses(pn.LocalPeer(), addrs) + return nil +} + // ListenAddresses returns a list of addresses at which this network listens. func (pn *peernet) ListenAddresses() []ma.Multiaddr { return pn.Peerstore().Addresses(pn.LocalPeer()) diff --git a/p2p/net/swarm/swarm.go b/p2p/net/swarm/swarm.go index 56e88445c..6512f67e5 100644 --- a/p2p/net/swarm/swarm.go +++ b/p2p/net/swarm/swarm.go @@ -49,12 +49,9 @@ type Swarm struct { func NewSwarm(ctx context.Context, listenAddrs []ma.Multiaddr, local peer.ID, peers peer.Peerstore) (*Swarm, error) { - if len(listenAddrs) > 0 { - filtered := addrutil.FilterUsableAddrs(listenAddrs) - if len(filtered) < 1 { - return nil, fmt.Errorf("swarm cannot use any addr in: %s", listenAddrs) - } - listenAddrs = filtered + listenAddrs, err := filterAddrs(listenAddrs) + if err != nil { + return nil, err } s := &Swarm{ @@ -77,6 +74,28 @@ func (s *Swarm) teardown() error { return s.swarm.Close() } +// CtxGroup returns the Context Group of the swarm +func filterAddrs(listenAddrs []ma.Multiaddr) ([]ma.Multiaddr, error) { + if len(listenAddrs) > 0 { + filtered := addrutil.FilterUsableAddrs(listenAddrs) + if len(filtered) < 1 { + return nil, fmt.Errorf("swarm cannot use any addr in: %s", listenAddrs) + } + listenAddrs = filtered + } + return listenAddrs, nil +} + +// CtxGroup returns the Context Group of the swarm +func (s *Swarm) Listen(addrs ...ma.Multiaddr) error { + addrs, err := filterAddrs(addrs) + if err != nil { + return err + } + + return s.listen(addrs) +} + // CtxGroup returns the Context Group of the swarm func (s *Swarm) CtxGroup() ctxgroup.ContextGroup { return s.cg diff --git a/p2p/net/swarm/swarm_net.go b/p2p/net/swarm/swarm_net.go index 561ceef82..857eabd26 100644 --- a/p2p/net/swarm/swarm_net.go +++ b/p2p/net/swarm/swarm_net.go @@ -102,6 +102,11 @@ func (n *Network) Close() error { return n.Swarm().cg.Close() } +// Listen tells the network to start listening on given multiaddrs. +func (n *Network) Listen(addrs ...ma.Multiaddr) error { + return n.Swarm().Listen(addrs...) +} + // ListenAddresses returns a list of addresses at which this network listens. func (n *Network) ListenAddresses() []ma.Multiaddr { return n.Swarm().ListenAddresses()