summaryrefslogtreecommitdiff
path: root/node/Switch.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'node/Switch.cpp')
-rw-r--r--node/Switch.cpp33
1 files changed, 18 insertions, 15 deletions
diff --git a/node/Switch.cpp b/node/Switch.cpp
index e3d57835..82b13483 100644
--- a/node/Switch.cpp
+++ b/node/Switch.cpp
@@ -334,26 +334,16 @@ 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()) {
- if (network->config().multicastLimit == 0) {
- TRACE("%.16llx: dropped multicast: not allowed on network",network->id());
- return;
- }
-
MulticastGroup multicastGroup(to,0);
if (to.isBroadcast()) {
@@ -457,6 +447,12 @@ void Switch::onLocalEthernet(const SharedPtr<Network> &network,const MAC &from,c
} // else no NDP emulation
}
+ // Check this after NDP emulation, since that has to be allowed in exactly this case
+ if (network->config().multicastLimit == 0) {
+ TRACE("%.16llx: dropped multicast: not allowed on network",network->id());
+ return;
+ }
+
/* Learn multicast groups for bridged-in hosts.
* Note that some OSes, most notably Linux, do this for you by learning
* multicast addresses on bridge interfaces and subscribing each slave.
@@ -476,12 +472,16 @@ void Switch::onLocalEthernet(const SharedPtr<Network> &network,const MAC &from,c
network->config().multicastLimit,
RR->node->now(),
network->id(),
+ network->config().disableCompression(),
network->config().activeBridges(),
multicastGroup,
(fromBridged) ? from : MAC(),
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
@@ -501,14 +501,16 @@ void Switch::onLocalEthernet(const SharedPtr<Network> &network,const MAC &from,c
from.appendTo(outp);
outp.append((uint16_t)etherType);
outp.append(data,len);
- outp.compress();
+ if (!network->config().disableCompression())
+ outp.compress();
send(outp,true);
} else {
Packet outp(toZT,RR->identity.address(),Packet::VERB_FRAME);
outp.append(network->id());
outp.append((uint16_t)etherType);
outp.append(data,len);
- outp.compress();
+ if (!network->config().disableCompression())
+ outp.compress();
send(outp,true);
}
@@ -565,7 +567,8 @@ void Switch::onLocalEthernet(const SharedPtr<Network> &network,const MAC &from,c
from.appendTo(outp);
outp.append((uint16_t)etherType);
outp.append(data,len);
- outp.compress();
+ if (!network->config().disableCompression())
+ outp.compress();
send(outp,true);
} else {
TRACE("%.16llx: %s -> %s %s packet not sent: filterOutgoingPacket() returned false",network->id(),from.toString().c_str(),to.toString().c_str(),etherTypeName(etherType));