|
|
|
|
@ -202,11 +202,13 @@ void Multicaster::send(
|
|
|
|
|
unsigned int count = 0; |
|
|
|
|
|
|
|
|
|
for(std::vector<Address>::const_iterator ast(alwaysSendTo.begin());ast!=alwaysSendTo.end();++ast) { |
|
|
|
|
{ // TODO / LEGACY: don't send new multicast frame to old peers (if we know their version)
|
|
|
|
|
#ifdef ZT_SUPPORT_LEGACY_MULTICAST |
|
|
|
|
{ |
|
|
|
|
SharedPtr<Peer> p(RR->topology->getPeer(*ast)); |
|
|
|
|
if ((p)&&(p->remoteVersionKnown())&&(p->remoteVersionMajor() < 1)) |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
out.sendOnly(RR,*ast); |
|
|
|
|
if (++count >= limit) |
|
|
|
|
@ -217,11 +219,13 @@ void Multicaster::send(
|
|
|
|
|
while (count < limit) { // limit <= gs.members.size() so idx will never overflow here
|
|
|
|
|
const MulticastGroupMember &m = gs.members[indexes[idx++]]; |
|
|
|
|
|
|
|
|
|
{ // TODO / LEGACY: don't send new multicast frame to old peers (if we know their version)
|
|
|
|
|
#ifdef ZT_SUPPORT_LEGACY_MULTICAST |
|
|
|
|
{ |
|
|
|
|
SharedPtr<Peer> p(RR->topology->getPeer(m.address)); |
|
|
|
|
if ((p)&&(p->remoteVersionKnown())&&(p->remoteVersionMajor() < 1)) |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
if (std::find(alwaysSendTo.begin(),alwaysSendTo.end(),m.address) == alwaysSendTo.end()) { |
|
|
|
|
out.sendOnly(RR,m.address); |
|
|
|
|
@ -268,11 +272,13 @@ void Multicaster::send(
|
|
|
|
|
unsigned int count = 0; |
|
|
|
|
|
|
|
|
|
for(std::vector<Address>::const_iterator ast(alwaysSendTo.begin());ast!=alwaysSendTo.end();++ast) { |
|
|
|
|
{ // TODO / LEGACY: don't send new multicast frame to old peers (if we know their version)
|
|
|
|
|
#ifdef ZT_SUPPORT_LEGACY_MULTICAST |
|
|
|
|
{ |
|
|
|
|
SharedPtr<Peer> p(RR->topology->getPeer(*ast)); |
|
|
|
|
if ((p)&&(p->remoteVersionKnown())&&(p->remoteVersionMajor() < 1)) |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
out.sendAndLog(RR,*ast); |
|
|
|
|
if (++count >= limit) |
|
|
|
|
@ -283,11 +289,13 @@ void Multicaster::send(
|
|
|
|
|
while ((count < limit)&&(idx < gs.members.size())) { |
|
|
|
|
const MulticastGroupMember &m = gs.members[indexes[idx++]]; |
|
|
|
|
|
|
|
|
|
{ // TODO / LEGACY: don't send new multicast frame to old peers (if we know their version)
|
|
|
|
|
#ifdef ZT_SUPPORT_LEGACY_MULTICAST |
|
|
|
|
{ |
|
|
|
|
SharedPtr<Peer> p(RR->topology->getPeer(m.address)); |
|
|
|
|
if ((p)&&(p->remoteVersionKnown())&&(p->remoteVersionMajor() < 1)) |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
if (std::find(alwaysSendTo.begin(),alwaysSendTo.end(),m.address) == alwaysSendTo.end()) { |
|
|
|
|
out.sendAndLog(RR,m.address); |
|
|
|
|
@ -299,11 +307,7 @@ void Multicaster::send(
|
|
|
|
|
if (indexes != idxbuf) |
|
|
|
|
delete [] indexes; |
|
|
|
|
|
|
|
|
|
// DEPRECATED / LEGACY / TODO:
|
|
|
|
|
// Currently we also always send a legacy P5_MULTICAST_FRAME packet to our
|
|
|
|
|
// supernode. Our supernode then takes care of relaying it down to <1.0.0
|
|
|
|
|
// nodes. This code can go away (along with support for P5_MULTICAST_FRAME)
|
|
|
|
|
// once there are no more such nodes on the network.
|
|
|
|
|
#ifdef ZT_SUPPORT_LEGACY_MULTICAST |
|
|
|
|
{ |
|
|
|
|
SharedPtr<Peer> sn(RR->topology->getBestSupernode()); |
|
|
|
|
if (sn) { |
|
|
|
|
@ -342,6 +346,7 @@ void Multicaster::send(
|
|
|
|
|
sn->send(RR,outp.data(),outp.size(),now); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Multicaster::clean(uint64_t now) |
|
|
|
|
|