diff options
author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2015-05-25 14:21:05 -0700 |
---|---|---|
committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2015-05-25 14:21:05 -0700 |
commit | 5e3c6d9e0d89b8284cf60978b658dab12d2814d1 (patch) | |
tree | aeb14563cb9b1061f9e0f5fb3f7697393052a7e1 /node/Network.cpp | |
parent | d8ad555b9ad7d70f6733f3d1e2ef795c752f45a4 (diff) | |
download | infinitytier-5e3c6d9e0d89b8284cf60978b658dab12d2814d1.tar.gz infinitytier-5e3c6d9e0d89b8284cf60978b658dab12d2814d1.zip |
Some nodeJS work, and apply fix from GitHub issue #166 plus a small optimization to avoid repeated calls to _allMulticastGroups().
Diffstat (limited to 'node/Network.cpp')
-rw-r--r-- | node/Network.cpp | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/node/Network.cpp b/node/Network.cpp index ebff1a5d..deb05d1c 100644 --- a/node/Network.cpp +++ b/node/Network.cpp @@ -139,21 +139,6 @@ Network::~Network() } } -std::vector<MulticastGroup> Network::allMulticastGroups() const -{ - Mutex::Lock _l(_lock); - std::vector<MulticastGroup> mgs(_myMulticastGroups); - std::vector<MulticastGroup>::iterator oldend(mgs.end()); - for(std::map< MulticastGroup,uint64_t >::const_iterator i(_multicastGroupsBehindMe.begin());i!=_multicastGroupsBehindMe.end();++i) { - if (!std::binary_search(mgs.begin(),oldend,i->first)) - mgs.push_back(i->first); - } - if ((_config)&&(_config->enableBroadcast())) - mgs.push_back(Network::BROADCAST); - std::sort(mgs.begin(),mgs.end()); - return mgs; -} - bool Network::subscribedToMulticastGroup(const MulticastGroup &mg,bool includeBridgedGroups) const { Mutex::Lock _l(_lock); @@ -510,6 +495,22 @@ bool Network::_isAllowed(const Address &peer) const return false; // default position on any failure } +std::vector<MulticastGroup> Network::_allMulticastGroups() const +{ + // Assumes _lock is locked + std::vector<MulticastGroup> mgs(_myMulticastGroups); + std::vector<MulticastGroup>::iterator oldend(mgs.end()); + for(std::map< MulticastGroup,uint64_t >::const_iterator i(_multicastGroupsBehindMe.begin());i!=_multicastGroupsBehindMe.end();++i) { + if (!std::binary_search(mgs.begin(),oldend,i->first)) + mgs.push_back(i->first); + } + if ((_config)&&(_config->enableBroadcast())) + mgs.push_back(Network::BROADCAST); + std::sort(mgs.begin(),mgs.end()); + std::unique(mgs.begin(),mgs.end()); + return mgs; +} + // Used in Network::_announceMulticastGroups() class _AnnounceMulticastGroupsToPeersWithActiveDirectPaths { @@ -518,7 +519,8 @@ public: RR(renv), _now(renv->node->now()), _network(nw), - _supernodeAddresses(renv->topology->supernodeAddresses()) + _supernodeAddresses(renv->topology->supernodeAddresses()), + _allMulticastGroups(nw->_allMulticastGroups()) {} inline void operator()(Topology &t,const SharedPtr<Peer> &p) @@ -526,9 +528,8 @@ public: if ( ( (p->hasActiveDirectPath(_now)) && (_network->_isAllowed(p->address())) ) || (std::find(_supernodeAddresses.begin(),_supernodeAddresses.end(),p->address()) != _supernodeAddresses.end()) ) { Packet outp(p->address(),RR->identity.address(),Packet::VERB_MULTICAST_LIKE); - std::vector<MulticastGroup> mgs(_network->allMulticastGroups()); - for(std::vector<MulticastGroup>::iterator mg(mgs.begin());mg!=mgs.end();++mg) { - if ((outp.size() + 18) > ZT_UDP_DEFAULT_PAYLOAD_MTU) { + for(std::vector<MulticastGroup>::iterator mg(_allMulticastGroups.begin());mg!=_allMulticastGroups.end();++mg) { + if ((outp.size() + 18) >= ZT_UDP_DEFAULT_PAYLOAD_MTU) { outp.armor(p->key(),true); p->send(RR,outp.data(),outp.size(),_now); outp.reset(p->address(),RR->identity.address(),Packet::VERB_MULTICAST_LIKE); @@ -552,6 +553,7 @@ private: uint64_t _now; Network *_network; std::vector<Address> _supernodeAddresses; + std::vector<MulticastGroup> _allMulticastGroups; }; void Network::_announceMulticastGroups() |