From d5f4d381d01a4428558627feb42cea70fa7a90e2 Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Wed, 5 Oct 2016 10:12:06 -0700 Subject: Go ahead and loop back packets whose destination is self. Some OSes require this since they aactually follow the full network path even for local IPs. --- node/Switch.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) (limited to 'node') diff --git a/node/Switch.cpp b/node/Switch.cpp index 75898d21..82b13483 100644 --- a/node/Switch.cpp +++ b/node/Switch.cpp @@ -334,18 +334,13 @@ void Switch::onLocalEthernet(const SharedPtr &network,const MAC &from,c if (!network->hasConfig()) return; - // Sanity check -- bridge loop? OS problem? - if (to == network->mac()) - return; - // Check if this packet is from someone other than the tap -- i.e. bridged in - bool fromBridged = false; - if (from != network->mac()) { + bool fromBridged; + if ((fromBridged = (from != network->mac()))) { if (!network->config().permitsBridging(RR->identity.address())) { TRACE("%.16llx: %s -> %s %s not forwarded, bridging disabled or this peer not a bridge",network->id(),from.toString().c_str(),to.toString().c_str(),etherTypeName(etherType)); return; } - fromBridged = true; } if (to.isMulticast()) { @@ -484,6 +479,9 @@ void Switch::onLocalEthernet(const SharedPtr &network,const MAC &from,c etherType, data, len); + } else if (to == network->mac()) { + // Destination is this node, so just reinject it + RR->node->putFrame(network->id(),network->userPtr(),from,to,etherType,vlanId,data,len); } else if (to[0] == MAC::firstOctetForNetwork(network->id())) { // Destination is another ZeroTier peer on the same network -- cgit v1.2.3