|
|
|
|
@ -400,11 +400,53 @@ bool Network::_isAllowed(const SharedPtr<Peer> &peer) const
|
|
|
|
|
return false; // default position on any failure
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Used in Network::_announceMulticastGroups()
|
|
|
|
|
class _AnnounceMulticastGroupsToPeersWithActiveDirectPaths |
|
|
|
|
bool Network::_tryAnnounceMulticastGroupsTo(const std::vector<Address> &alwaysAddresses,const std::vector<MulticastGroup> &allMulticastGroups,const SharedPtr<Peer> &peer,uint64_t now) const |
|
|
|
|
{ |
|
|
|
|
// assumes _lock is locked
|
|
|
|
|
if ( |
|
|
|
|
(_isAllowed(peer)) || |
|
|
|
|
(peer->address() == this->controller()) || |
|
|
|
|
(std::find(alwaysAddresses.begin(),alwaysAddresses.end(),peer->address()) != alwaysAddresses.end()) |
|
|
|
|
) { |
|
|
|
|
|
|
|
|
|
if ((_config)&&(_config->com())&&(!_config->isPublic())&&(peer->needsOurNetworkMembershipCertificate(_id,now,true))) { |
|
|
|
|
Packet outp(peer->address(),RR->identity.address(),Packet::VERB_NETWORK_MEMBERSHIP_CERTIFICATE); |
|
|
|
|
_config->com().serialize(outp); |
|
|
|
|
outp.armor(peer->key(),true); |
|
|
|
|
peer->send(RR,outp.data(),outp.size(),now); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
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; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
class _AnnounceMulticastGroupsToAll |
|
|
|
|
{ |
|
|
|
|
public: |
|
|
|
|
_AnnounceMulticastGroupsToPeersWithActiveDirectPaths(const RuntimeEnvironment *renv,Network *nw) : |
|
|
|
|
_AnnounceMulticastGroupsToAll(const RuntimeEnvironment *renv,Network *nw) : |
|
|
|
|
_now(renv->node->now()), |
|
|
|
|
RR(renv), |
|
|
|
|
_network(nw), |
|
|
|
|
@ -421,40 +463,11 @@ private:
|
|
|
|
|
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
|
|
|
|
|
_AnnounceMulticastGroupsToPeersWithActiveDirectPaths afunc(RR,this); |
|
|
|
|
RR->topology->eachPeer<_AnnounceMulticastGroupsToPeersWithActiveDirectPaths &>(afunc); |
|
|
|
|
_AnnounceMulticastGroupsToAll afunc(RR,this); |
|
|
|
|
RR->topology->eachPeer<_AnnounceMulticastGroupsToAll &>(afunc); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::vector<MulticastGroup> Network::_allMulticastGroups() const |
|
|
|
|
|