diff options
| author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2015-11-10 17:37:38 -0800 |
|---|---|---|
| committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2015-11-10 17:37:38 -0800 |
| commit | 451b8aa7b293be0bdd62a0cc1c292bfe5b3de751 (patch) | |
| tree | c30029e6677a075b38f1cd92b7c8e6f87816f70b /node/Multicaster.cpp | |
| parent | 53731acf51ffecafc52779cc8942b7fc4c143299 (diff) | |
| download | infinitytier-451b8aa7b293be0bdd62a0cc1c292bfe5b3de751.tar.gz infinitytier-451b8aa7b293be0bdd62a0cc1c292bfe5b3de751.zip | |
Query both root and network controller for multicast last resort GATHER.
Diffstat (limited to 'node/Multicaster.cpp')
| -rw-r--r-- | node/Multicaster.cpp | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/node/Multicaster.cpp b/node/Multicaster.cpp index 41838552..fa9487ef 100644 --- a/node/Multicaster.cpp +++ b/node/Multicaster.cpp @@ -235,21 +235,26 @@ void Multicaster::send( if ((gs.members.empty())||((now - gs.lastExplicitGather) >= ZT_MULTICAST_EXPLICIT_GATHER_DELAY)) { gs.lastExplicitGather = now; - SharedPtr<Peer> r(RR->topology->getBestRoot()); - if (r) { - TRACE(">>MC upstream GATHER up to %u for group %.16llx/%s",gatherLimit,nwid,mg.toString().c_str()); + SharedPtr<Peer> explicitGatherPeers[2]; + explicitGatherPeers[0] = RR->topology->getBestRoot(); + explicitGatherPeers[1] = RR->topology->getPeer(Network::controllerFor(nwid)); + for(unsigned int k=0;k<2;++k) { + const SharedPtr<Peer> &p = explicitGatherPeers[k]; + if (!p) + continue; + //TRACE(">>MC upstream GATHER up to %u for group %.16llx/%s",gatherLimit,nwid,mg.toString().c_str()); const CertificateOfMembership *com = (CertificateOfMembership *)0; { SharedPtr<Network> nw(RR->node->network(nwid)); if (nw) { SharedPtr<NetworkConfig> nconf(nw->config2()); - if ((nconf)&&(nconf->com())&&(nconf->isPrivate())&&(r->needsOurNetworkMembershipCertificate(nwid,now,true))) + if ((nconf)&&(nconf->com())&&(nconf->isPrivate())&&(p->needsOurNetworkMembershipCertificate(nwid,now,true))) com = &(nconf->com()); } } - Packet outp(r->address(),RR->identity.address(),Packet::VERB_MULTICAST_GATHER); + Packet outp(p->address(),RR->identity.address(),Packet::VERB_MULTICAST_GATHER); outp.append(nwid); outp.append((uint8_t)(com ? 0x01 : 0x00)); mg.mac().appendTo(outp); @@ -257,8 +262,7 @@ void Multicaster::send( outp.append((uint32_t)gatherLimit); if (com) com->serialize(outp); - outp.armor(r->key(),true); - r->send(RR,outp.data(),outp.size(),now); + RR->sw->send(outp,true,0); } gatherLimit = 0; } |
