diff options
| author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2013-10-01 16:01:36 -0400 |
|---|---|---|
| committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2013-10-01 16:01:36 -0400 |
| commit | 3443b203e4035104071f5af0143591dcd48a4974 (patch) | |
| tree | 149d93cacdd5d1e75abc50ad7bd894844284d5d4 /node/Switch.cpp | |
| parent | 1a764559863c823da227098701521ed29bec037e (diff) | |
| download | infinitytier-3443b203e4035104071f5af0143591dcd48a4974.tar.gz infinitytier-3443b203e4035104071f5af0143591dcd48a4974.zip | |
Each peer now tracks the last time it announced multicast LIKEs independently and does so frequently enough to prevent expires. Also add a multicast debug facility for use on the testnet.
Diffstat (limited to 'node/Switch.cpp')
| -rw-r--r-- | node/Switch.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/node/Switch.cpp b/node/Switch.cpp index 14b658a7..896c6435 100644 --- a/node/Switch.cpp +++ b/node/Switch.cpp @@ -400,6 +400,7 @@ void Switch::announceMulticastGroups(const std::map< SharedPtr<Network>,std::set outp.reset((*p)->address(),_r->identity.address(),Packet::VERB_MULTICAST_LIKE); } + // network ID, MAC, ADI outp.append((uint64_t)nwmgs->first->id()); outp.append(mg->mac().data,6); outp.append((uint32_t)mg->adi()); @@ -412,6 +413,30 @@ void Switch::announceMulticastGroups(const std::map< SharedPtr<Network>,std::set } } +void Switch::announceMulticastGroups(const SharedPtr<Peer> &peer) +{ + Packet outp(peer->address(),_r->identity.address(),Packet::VERB_MULTICAST_LIKE); + std::vector< SharedPtr<Network> > networks(_r->nc->networks()); + for(std::vector< SharedPtr<Network> >::iterator n(networks.begin());n!=networks.end();++n) { + if (((*n)->isAllowed(peer->address()))||(_r->topology->isSupernode(peer->address()))) { + std::set<MulticastGroup> mgs((*n)->multicastGroups()); + for(std::set<MulticastGroup>::iterator mg(mgs.begin());mg!=mgs.end();++mg) { + if ((outp.size() + 18) > ZT_UDP_DEFAULT_PAYLOAD_MTU) { + send(outp,true); + outp.reset(peer->address(),_r->identity.address(),Packet::VERB_MULTICAST_LIKE); + } + + // network ID, MAC, ADI + outp.append((uint64_t)(*n)->id()); + outp.append(mg->mac().data,6); + outp.append((uint32_t)mg->adi()); + } + } + } + if (outp.size() > ZT_PROTO_MIN_PACKET_LENGTH) + send(outp,true); +} + void Switch::requestWhois(const Address &addr) { TRACE("requesting WHOIS for %s",addr.toString().c_str()); |
