diff options
| author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2013-09-12 12:11:21 -0400 |
|---|---|---|
| committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2013-09-12 12:11:21 -0400 |
| commit | 55e7ddba1eefdc819d4d0e3b0b6fd6e4ceb7ec43 (patch) | |
| tree | 330693a84051b37962c85a387833cc4316a253e0 /node/Switch.cpp | |
| parent | d74b5f4bc6df791c6e067700c1d31e5a203a3d79 (diff) | |
| download | infinitytier-55e7ddba1eefdc819d4d0e3b0b6fd6e4ceb7ec43.tar.gz infinitytier-55e7ddba1eefdc819d4d0e3b0b6fd6e4ceb7ec43.zip | |
Get a default rate that works for multicast.
Diffstat (limited to 'node/Switch.cpp')
| -rw-r--r-- | node/Switch.cpp | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/node/Switch.cpp b/node/Switch.cpp index 5ba56555..e0ffba0b 100644 --- a/node/Switch.cpp +++ b/node/Switch.cpp @@ -105,10 +105,16 @@ void Switch::onLocalEthernet(const SharedPtr<Network> &network,const MAC &from,c mg = MulticastGroup::deriveMulticastGroupForAddressResolution(InetAddress(data.field(24,4),4,0)); } - // Check our own multicasts against the global rate for this network - // just to be polite. + uint64_t crc = Multicaster::computeMulticastDedupCrc(network->id(),from,mg,etherType,data.data(),data.size()); + uint64_t now = Utils::now(); + + if (_r->multicaster->checkDuplicate(crc,now)) { + LOG("%s/%.16llx: multicast group %s: dropped %u bytes, duplicate multicast in too short a time frame",network->tap().deviceName().c_str(),(unsigned long long)network->id(),mg.toString().c_str(),(unsigned int)data.size()); + return; + } + _r->multicaster->addToDedupHistory(crc,now); if (!network->updateAndCheckMulticastBalance(_r->identity.address(),mg,data.size())) { - LOG("didn't send local multicast %u byte multicast packet to network %.16llx: not within budget for multicast group %s",(unsigned int)data.size(),(unsigned long long)network->id(),mg.toString().c_str()); + LOG("%s/%.16llx: multicast group %s: dropped %u bytes, out of budget",network->tap().deviceName().c_str(),(unsigned long long)network->id(),mg.toString().c_str(),(unsigned int)data.size()); return; } @@ -124,7 +130,7 @@ void Switch::onLocalEthernet(const SharedPtr<Network> &network,const MAC &from,c bloom, ZT_MULTICAST_PROPAGATION_BREADTH, propPeers, - Utils::now()); + now); if (!np) return; |
