From 2eaac3891ec5f6da0ba9577bd032fd692392dd40 Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Sat, 6 Jul 2013 15:56:12 -0400 Subject: [PATCH] Enable ff:ff:ff:ff:ff:ff w/no ADI a.k.a. broadcast. YOLO. --- node/EthernetTap.cpp | 8 ++++++++ node/EthernetTap.hpp | 3 +++ node/Switch.cpp | 8 +++++--- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/node/EthernetTap.cpp b/node/EthernetTap.cpp index 596cc5c20..688844640 100644 --- a/node/EthernetTap.cpp +++ b/node/EthernetTap.cpp @@ -31,6 +31,10 @@ #include "Logger.hpp" #include "RuntimeEnvironment.hpp" #include "Mutex.hpp" +#include "MulticastGroup.hpp" + +// ff:ff:ff:ff:ff:ff with no ADI +static const ZeroTier::MulticastGroup _blindWildcardMulticastGroup(ZeroTier::MAC(0xff),0); /* ======================================================================== */ #if defined(__linux__) || defined(linux) || defined(__LINUX__) || defined(__linux) @@ -337,6 +341,8 @@ bool EthernetTap::updateMulticastGroups(std::set &groups) bool changed = false; + newGroups.insert(_blindWildcardMulticastGroup); // always join this + for(std::set::iterator mg(newGroups.begin());mg!=newGroups.end();++mg) { if (!groups.count(*mg)) { groups.insert(*mg); @@ -658,6 +664,8 @@ bool EthernetTap::updateMulticastGroups(std::set &groups) bool changed = false; + newGroups.insert(_blindWildcardMulticastGroup); // always join this + for(std::set::iterator mg(newGroups.begin());mg!=newGroups.end();++mg) { if (!groups.count(*mg)) { groups.insert(*mg); diff --git a/node/EthernetTap.hpp b/node/EthernetTap.hpp index bf1d0eef0..5c6669078 100644 --- a/node/EthernetTap.hpp +++ b/node/EthernetTap.hpp @@ -164,6 +164,9 @@ public: * This populates a set or, if already populated, modifies it to contain * only multicast groups in which this device is interested. * + * This should always include the blind wildcard MulticastGroup (MAC of + * ff:ff:ff:ff:ff:ff and 0 ADI field). + * * @param groups Set to modify in place * @return True if set was changed since last call */ diff --git a/node/Switch.cpp b/node/Switch.cpp index 87218b0df..ed646308a 100644 --- a/node/Switch.cpp +++ b/node/Switch.cpp @@ -252,9 +252,11 @@ void Switch::onLocalEthernet(const SharedPtr &network,const MAC &from,c if (to.isMulticast()) { MulticastGroup mg(to,0); - // Handle special cases: IPv4 ARP - if ((etherType == ZT_ETHERTYPE_ARP)&&(data.size() == 28)&&(data[2] == 0x08)&&(data[3] == 0x00)&&(data[4] == 6)&&(data[5] == 4)&&(data[7] == 0x01)) - mg = MulticastGroup::deriveMulticastGroupForAddressResolution(InetAddress(data.field(24,4),4,0)); + if (to.isBroadcast()) { + // Cram IPv4 IP into ADI field to make IPv4 ARP broadcast channel specific and scalable + if ((etherType == ZT_ETHERTYPE_ARP)&&(data.size() == 28)&&(data[2] == 0x08)&&(data[3] == 0x00)&&(data[4] == 6)&&(data[5] == 4)&&(data[7] == 0x01)) + mg = MulticastGroup::deriveMulticastGroupForAddressResolution(InetAddress(data.field(24,4),4,0)); + } // Remember this message's CRC, but don't drop if we've already seen it // since it's our own.