summaryrefslogtreecommitdiff
path: root/node
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2015-05-25 14:21:05 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2015-05-25 14:21:05 -0700
commit5e3c6d9e0d89b8284cf60978b658dab12d2814d1 (patch)
treeaeb14563cb9b1061f9e0f5fb3f7697393052a7e1 /node
parentd8ad555b9ad7d70f6733f3d1e2ef795c752f45a4 (diff)
downloadinfinitytier-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')
-rw-r--r--node/Network.cpp40
-rw-r--r--node/Network.hpp7
2 files changed, 27 insertions, 20 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()
diff --git a/node/Network.hpp b/node/Network.hpp
index f99ea525..7976d901 100644
--- a/node/Network.hpp
+++ b/node/Network.hpp
@@ -106,7 +106,11 @@ public:
/**
* @return All multicast groups including learned groups that are behind any bridges we're attached to
*/
- std::vector<MulticastGroup> allMulticastGroups() const;
+ inline std::vector<MulticastGroup> allMulticastGroups() const
+ {
+ Mutex::Lock _l(_lock);
+ return _allMulticastGroups();
+ }
/**
* @param mg Multicast group
@@ -356,6 +360,7 @@ private:
void _externalConfig(ZT1_VirtualNetworkConfig *ec) const; // assumes _lock is locked
bool _isAllowed(const Address &peer) const;
void _announceMulticastGroups();
+ std::vector<MulticastGroup> _allMulticastGroups() const;
const RuntimeEnvironment *RR;
uint64_t _id;