summaryrefslogtreecommitdiff
path: root/node/Network.cpp
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2015-10-01 11:37:02 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2015-10-01 11:37:02 -0700
commit9405150b1147189586c427bc9e1fd9abb00b7ca0 (patch)
tree7194ee10379c93433283c15f9b021b44ceeed528 /node/Network.cpp
parenta3db7d0728c1bc5181b8a70e8c379632125ee376 (diff)
downloadinfinitytier-9405150b1147189586c427bc9e1fd9abb00b7ca0.tar.gz
infinitytier-9405150b1147189586c427bc9e1fd9abb00b7ca0.zip
Restore group announcement on Peer::receive() but centralize packet composition in one place.
Diffstat (limited to 'node/Network.cpp')
-rw-r--r--node/Network.cpp91
1 files changed, 51 insertions, 40 deletions
diff --git a/node/Network.cpp b/node/Network.cpp
index 9c8aabfa..d86145da 100644
--- a/node/Network.cpp
+++ b/node/Network.cpp
@@ -141,6 +141,12 @@ void Network::multicastUnsubscribe(const MulticastGroup &mg)
_myMulticastGroups.swap(nmg);
}
+bool Network::tryAnnounceMulticastGroupsTo(const SharedPtr<Peer> &peer)
+{
+ Mutex::Lock _l(_lock);
+ return _tryAnnounceMulticastGroupsTo(RR->topology->rootAddresses(),_allMulticastGroups(),peer,RR->node->now());
+}
+
bool Network::applyConfiguration(const SharedPtr<NetworkConfig> &conf)
{
if (_destroyed) // sanity check
@@ -394,65 +400,56 @@ bool Network::_isAllowed(const SharedPtr<Peer> &peer) const
return false; // default position on any failure
}
-std::vector<MulticastGroup> Network::_allMulticastGroups() const
-{
- // Assumes _lock is locked
- std::vector<MulticastGroup> mgs;
- mgs.reserve(_myMulticastGroups.size() + _multicastGroupsBehindMe.size() + 1);
- mgs.insert(mgs.end(),_myMulticastGroups.begin(),_myMulticastGroups.end());
- _multicastGroupsBehindMe.appendKeys(mgs);
- if ((_config)&&(_config->enableBroadcast()))
- mgs.push_back(Network::BROADCAST);
- std::sort(mgs.begin(),mgs.end());
- mgs.erase(std::unique(mgs.begin(),mgs.end()),mgs.end());
- return mgs;
-}
-
// Used in Network::_announceMulticastGroups()
class _AnnounceMulticastGroupsToPeersWithActiveDirectPaths
{
public:
_AnnounceMulticastGroupsToPeersWithActiveDirectPaths(const RuntimeEnvironment *renv,Network *nw) :
- RR(renv),
_now(renv->node->now()),
+ RR(renv),
_network(nw),
_rootAddresses(renv->topology->rootAddresses()),
_allMulticastGroups(nw->_allMulticastGroups())
{}
- inline void operator()(Topology &t,const SharedPtr<Peer> &p)
- {
- if ( ( (p->hasActiveDirectPath(_now)) && ( (_network->_isAllowed(p)) || (p->address() == _network->controller()) ) ) || (std::find(_rootAddresses.begin(),_rootAddresses.end(),p->address()) != _rootAddresses.end()) ) {
- Packet outp(p->address(),RR->identity.address(),Packet::VERB_MULTICAST_LIKE);
-
- 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);
- }
-
- // network ID, MAC, ADI
- outp.append((uint64_t)_network->id());
- mg->mac().appendTo(outp);
- outp.append((uint32_t)mg->adi());
- }
-
- if (outp.size() > ZT_PROTO_MIN_PACKET_LENGTH) {
- outp.armor(p->key(),true);
- p->send(RR,outp.data(),outp.size(),_now);
- }
- }
- }
+ inline void operator()(Topology &t,const SharedPtr<Peer> &p) { _network->_tryAnnounceMulticastGroupsTo(_rootAddresses,_allMulticastGroups,p,_now); }
private:
- const RuntimeEnvironment *RR;
uint64_t _now;
+ const RuntimeEnvironment *RR;
Network *_network;
std::vector<Address> _rootAddresses;
std::vector<MulticastGroup> _allMulticastGroups;
};
+bool Network::_tryAnnounceMulticastGroupsTo(const std::vector<Address> &alwaysAddresses,const std::vector<MulticastGroup> &allMulticastGroups,const SharedPtr<Peer> &peer,uint64_t now) const
+{
+ if ( ( (peer->hasActiveDirectPath(now)) && ( _isAllowed(peer) || (peer->address() == this->controller()) ) ) || (std::find(alwaysAddresses.begin(),alwaysAddresses.end(),peer->address()) != alwaysAddresses.end()) ) {
+ Packet outp(peer->address(),RR->identity.address(),Packet::VERB_MULTICAST_LIKE);
+
+ for(std::vector<MulticastGroup>::const_iterator mg(allMulticastGroups.begin());mg!=allMulticastGroups.end();++mg) {
+ if ((outp.size() + 18) >= ZT_UDP_DEFAULT_PAYLOAD_MTU) {
+ outp.armor(peer->key(),true);
+ peer->send(RR,outp.data(),outp.size(),now);
+ outp.reset(peer->address(),RR->identity.address(),Packet::VERB_MULTICAST_LIKE);
+ }
+
+ // network ID, MAC, ADI
+ outp.append((uint64_t)_id);
+ mg->mac().appendTo(outp);
+ outp.append((uint32_t)mg->adi());
+ }
+
+ if (outp.size() > ZT_PROTO_MIN_PACKET_LENGTH) {
+ outp.armor(peer->key(),true);
+ peer->send(RR,outp.data(),outp.size(),now);
+ }
+
+ return true;
+ }
+ return false;
+}
+
void Network::_announceMulticastGroups()
{
// Assumes _lock is locked
@@ -460,4 +457,18 @@ void Network::_announceMulticastGroups()
RR->topology->eachPeer<_AnnounceMulticastGroupsToPeersWithActiveDirectPaths &>(afunc);
}
+std::vector<MulticastGroup> Network::_allMulticastGroups() const
+{
+ // Assumes _lock is locked
+ std::vector<MulticastGroup> mgs;
+ mgs.reserve(_myMulticastGroups.size() + _multicastGroupsBehindMe.size() + 1);
+ mgs.insert(mgs.end(),_myMulticastGroups.begin(),_myMulticastGroups.end());
+ _multicastGroupsBehindMe.appendKeys(mgs);
+ if ((_config)&&(_config->enableBroadcast()))
+ mgs.push_back(Network::BROADCAST);
+ std::sort(mgs.begin(),mgs.end());
+ mgs.erase(std::unique(mgs.begin(),mgs.end()),mgs.end());
+ return mgs;
+}
+
} // namespace ZeroTier