summaryrefslogtreecommitdiff
path: root/node
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 /node
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.
Diffstat (limited to 'node')
-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