From 2f18a92e2013729b608f8d95f80eb364e69594f6 Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Tue, 19 Apr 2016 12:09:35 -0700 Subject: Cleanup in numerous places, reduce network chattiness around MULTICAST_LIKE, and fix a "how was that working" latent bug causing some control traffic to take the scenic route. --- node/Network.cpp | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) (limited to 'node/Network.cpp') diff --git a/node/Network.cpp b/node/Network.cpp index 6577b65f..86780861 100644 --- a/node/Network.cpp +++ b/node/Network.cpp @@ -142,7 +142,7 @@ bool Network::tryAnnounceMulticastGroupsTo(const SharedPtr &peer) (peer->address() == this->controller()) || (RR->topology->isRoot(peer->identity())) ) { - _announceMulticastGroupsTo(peer->address(),_allMulticastGroups()); + _announceMulticastGroupsTo(peer,_allMulticastGroups()); return true; } return false; @@ -400,10 +400,10 @@ bool Network::_isAllowed(const SharedPtr &peer) const return false; // default position on any failure } -class _GetPeersThatNeedMulticastAnnouncement +class _MulticastAnnounceAll { public: - _GetPeersThatNeedMulticastAnnouncement(const RuntimeEnvironment *renv,Network *nw) : + _MulticastAnnounceAll(const RuntimeEnvironment *renv,Network *nw) : _now(renv->node->now()), _controller(nw->controller()), _network(nw), @@ -416,47 +416,45 @@ public: (p->address() == _controller) || (std::find(_rootAddresses.begin(),_rootAddresses.end(),p->address()) != _rootAddresses.end()) ) { - peers.push_back(p->address()); + peers.push_back(p); } } - std::vector
peers; + std::vector< SharedPtr > peers; private: - uint64_t _now; - Address _controller; - Network *_network; - std::vector
_rootAddresses; + const uint64_t _now; + const Address _controller; + Network *const _network; + const std::vector
_rootAddresses; }; void Network::_announceMulticastGroups() { // Assumes _lock is locked - - _GetPeersThatNeedMulticastAnnouncement gpfunc(RR,this); - RR->topology->eachPeer<_GetPeersThatNeedMulticastAnnouncement &>(gpfunc); - + _MulticastAnnounceAll gpfunc(RR,this); + RR->topology->eachPeer<_MulticastAnnounceAll &>(gpfunc); std::vector allMulticastGroups(_allMulticastGroups()); - for(std::vector
::const_iterator pa(gpfunc.peers.begin());pa!=gpfunc.peers.end();++pa) - _announceMulticastGroupsTo(*pa,allMulticastGroups); + for(std::vector< SharedPtr >::const_iterator i(gpfunc.peers.begin());i!=gpfunc.peers.end();++i) + _announceMulticastGroupsTo(*i,allMulticastGroups); } -void Network::_announceMulticastGroupsTo(const Address &peerAddress,const std::vector &allMulticastGroups) const +void Network::_announceMulticastGroupsTo(const SharedPtr &peer,const std::vector &allMulticastGroups) const { // Assumes _lock is locked // We push COMs ahead of MULTICAST_LIKE since they're used for access control -- a COM is a public // credential so "over-sharing" isn't really an issue (and we only do so with roots). - if ((_config)&&(_config.com())&&(!_config.isPublic())) { - Packet outp(peerAddress,RR->identity.address(),Packet::VERB_NETWORK_MEMBERSHIP_CERTIFICATE); + if ((_config)&&(_config.com())&&(!_config.isPublic())&&(peer->needsOurNetworkMembershipCertificate(_id,RR->node->now(),true))) { + Packet outp(peer->address(),RR->identity.address(),Packet::VERB_NETWORK_MEMBERSHIP_CERTIFICATE); _config.com().serialize(outp); RR->sw->send(outp,true,0); } { - Packet outp(peerAddress,RR->identity.address(),Packet::VERB_MULTICAST_LIKE); + Packet outp(peer->address(),RR->identity.address(),Packet::VERB_MULTICAST_LIKE); for(std::vector::const_iterator mg(allMulticastGroups.begin());mg!=allMulticastGroups.end();++mg) { if ((outp.size() + 18) >= ZT_UDP_DEFAULT_PAYLOAD_MTU) { RR->sw->send(outp,true,0); - outp.reset(peerAddress,RR->identity.address(),Packet::VERB_MULTICAST_LIKE); + outp.reset(peer->address(),RR->identity.address(),Packet::VERB_MULTICAST_LIKE); } // network ID, MAC, ADI -- cgit v1.2.3