summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2016-10-05 10:12:06 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2016-10-05 10:12:06 -0700
commitd5f4d381d01a4428558627feb42cea70fa7a90e2 (patch)
tree4ee14b89cbb9c9cabfc81df9f7a3be3c9c87372e
parent988049f39bf7731c0189544b316850b81b004de3 (diff)
downloadinfinitytier-d5f4d381d01a4428558627feb42cea70fa7a90e2.tar.gz
infinitytier-d5f4d381d01a4428558627feb42cea70fa7a90e2.zip
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.
-rw-r--r--node/Switch.cpp12
1 files changed, 5 insertions, 7 deletions
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> &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> &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