From df0967d6ee323a16103a6799481701c5315fd74a Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 30 Jan 2015 04:13:02 -0800 Subject: [PATCH] p2p/net: network interface Listen func network interface now allows setting Listeners after the fact. This is useful to create the network and start listening as separate steps. And to keep the network up to date on new addresses the node might have to listen to. --- p2p/net/interface.go | 3 +++ p2p/net/mock/mock_peernet.go | 6 ++++++ p2p/net/swarm/swarm.go | 31 +++++++++++++++++++++++++------ p2p/net/swarm/swarm_net.go | 5 +++++ 4 files changed, 39 insertions(+), 6 deletions(-) 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()