mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-06-03 16:00:51 +00:00
Always announce multicast groups, not just to peers with direct links, and push network COMs to any MULTICAST_LIKE recipient for future use.
This commit is contained in:
parent
a7409850d6
commit
d6676a9d6c
@ -400,11 +400,53 @@ bool Network::_isAllowed(const SharedPtr<Peer> &peer) const
|
|||||||
return false; // default position on any failure
|
return false; // default position on any failure
|
||||||
}
|
}
|
||||||
|
|
||||||
// Used in Network::_announceMulticastGroups()
|
bool Network::_tryAnnounceMulticastGroupsTo(const std::vector<Address> &alwaysAddresses,const std::vector<MulticastGroup> &allMulticastGroups,const SharedPtr<Peer> &peer,uint64_t now) const
|
||||||
class _AnnounceMulticastGroupsToPeersWithActiveDirectPaths
|
{
|
||||||
|
// 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:
|
public:
|
||||||
_AnnounceMulticastGroupsToPeersWithActiveDirectPaths(const RuntimeEnvironment *renv,Network *nw) :
|
_AnnounceMulticastGroupsToAll(const RuntimeEnvironment *renv,Network *nw) :
|
||||||
_now(renv->node->now()),
|
_now(renv->node->now()),
|
||||||
RR(renv),
|
RR(renv),
|
||||||
_network(nw),
|
_network(nw),
|
||||||
@ -421,40 +463,11 @@ private:
|
|||||||
std::vector<Address> _rootAddresses;
|
std::vector<Address> _rootAddresses;
|
||||||
std::vector<MulticastGroup> _allMulticastGroups;
|
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()
|
void Network::_announceMulticastGroups()
|
||||||
{
|
{
|
||||||
// Assumes _lock is locked
|
// Assumes _lock is locked
|
||||||
_AnnounceMulticastGroupsToPeersWithActiveDirectPaths afunc(RR,this);
|
_AnnounceMulticastGroupsToAll afunc(RR,this);
|
||||||
RR->topology->eachPeer<_AnnounceMulticastGroupsToPeersWithActiveDirectPaths &>(afunc);
|
RR->topology->eachPeer<_AnnounceMulticastGroupsToAll &>(afunc);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<MulticastGroup> Network::_allMulticastGroups() const
|
std::vector<MulticastGroup> Network::_allMulticastGroups() const
|
||||||
|
@ -55,8 +55,8 @@
|
|||||||
namespace ZeroTier {
|
namespace ZeroTier {
|
||||||
|
|
||||||
class RuntimeEnvironment;
|
class RuntimeEnvironment;
|
||||||
class _AnnounceMulticastGroupsToPeersWithActiveDirectPaths;
|
|
||||||
class Peer;
|
class Peer;
|
||||||
|
class _AnnounceMulticastGroupsToAll; // internal function object in Network.cpp
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A virtual LAN
|
* A virtual LAN
|
||||||
@ -64,7 +64,7 @@ class Peer;
|
|||||||
class Network : NonCopyable
|
class Network : NonCopyable
|
||||||
{
|
{
|
||||||
friend class SharedPtr<Network>;
|
friend class SharedPtr<Network>;
|
||||||
friend class _AnnounceMulticastGroupsToPeersWithActiveDirectPaths;
|
friend class _AnnounceMulticastGroupsToAll;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user