summaryrefslogtreecommitdiff
path: root/node/Switch.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'node/Switch.hpp')
-rw-r--r--node/Switch.hpp35
1 files changed, 3 insertions, 32 deletions
diff --git a/node/Switch.hpp b/node/Switch.hpp
index d0fbf02b..a6c753fb 100644
--- a/node/Switch.hpp
+++ b/node/Switch.hpp
@@ -44,6 +44,7 @@
#include "Network.hpp"
#include "SharedPtr.hpp"
#include "Demarc.hpp"
+#include "Multicaster.hpp"
namespace ZeroTier {
@@ -171,7 +172,7 @@ private:
static void _CBaddPeerFromHello(void *arg,const SharedPtr<Peer> &p,Topology::PeerVerifyResult result);
static void _CBaddPeerFromWhois(void *arg,const SharedPtr<Peer> &p,Topology::PeerVerifyResult result); // arg == this
- void _propagateMulticast(const SharedPtr<Network> &network,const Address &upstream,unsigned char *bloom,const MulticastGroup &mg,unsigned int mcHops,unsigned int mcLoadFactor,const MAC &from,unsigned int etherType,const void *data,unsigned int len);
+ void _propagateMulticast(const SharedPtr<Network> &network,const Address &upstream,const unsigned char *bloom,const MulticastGroup &mg,unsigned int mcHops,const MAC &from,unsigned int etherType,const void *data,unsigned int len);
PacketServiceAttemptResult _tryHandleRemotePacket(Demarc::Port localPort,const InetAddress &fromAddr,Packet &packet);
void _doHELLO(Demarc::Port localPort,const InetAddress &fromAddr,Packet &packet);
void _requestWhois(const Address &addr);
@@ -179,39 +180,9 @@ private:
PacketServiceAttemptResult _trySend(const Packet &packet,bool encrypt);
void _retryPendingFor(const Address &addr);
- // Updates entry for crc in multicast history, returns true if already
- // present in history and not expired.
- inline bool _checkAndUpdateMulticastHistory(const MAC &fromMac,const MAC &toMulticastMac,const void *payload,unsigned int len,const uint64_t nwid,const uint64_t now)
- {
- uint64_t crc = Utils::crc64(0,fromMac.data,6);
- crc = Utils::crc64(crc,toMulticastMac.data,6);
- crc = Utils::crc64(crc,payload,len);
- crc += nwid; // also include network ID
-
- uint64_t earliest = 0xffffffffffffffffULL;
- unsigned long earliestIdx = 0;
- for(unsigned int i=0;i<ZT_MULTICAST_DEDUP_HISTORY_LENGTH;++i) {
- if (_multicastHistory[i][0] == crc) {
- uint64_t then = _multicastHistory[i][1];
- _multicastHistory[i][1] = now;
- return ((now - then) < ZT_MULTICAST_DEDUP_HISTORY_EXPIRE);
- } else if (_multicastHistory[i][1] < earliest) {
- earliest = _multicastHistory[i][1];
- earliestIdx = i;
- }
- }
-
- _multicastHistory[earliestIdx][0] = crc; // replace oldest entry
- _multicastHistory[earliestIdx][1] = now;
-
- return false;
- }
-
const RuntimeEnvironment *const _r;
- // Multicast packet CRC64's for packets we've received recently, to reject
- // duplicates during propagation. [0] is CRC64, [1] is time.
- uint64_t _multicastHistory[ZT_MULTICAST_DEDUP_HISTORY_LENGTH][2];
+ Multicaster _multicaster;
struct WhoisRequest
{