Browse Source

Bridging #68 should work now!

Adam Ierymenko 11 years ago
parent
commit
0b0d5fabac
1 changed files with 34 additions and 19 deletions
  1. 34 19
      node/Switch.cpp

+ 34 - 19
node/Switch.cpp

@@ -219,24 +219,37 @@ void Switch::onLocalEthernet(const SharedPtr<Network> &network,const MAC &from,c
 		return;
 	}
 
-	// Unicast from local peer to another non-bridged ZeroTier node
-	if ((!fromBridged)&&(to[0] == MAC::firstOctetForNetwork(network->id()))) {
+	// Destination is another ZeroTier node
+	if (to[0] == MAC::firstOctetForNetwork(network->id())) {
 		Address toZT(to.toAddress(network->id()));
 		if (network->isAllowed(toZT)) {
 			network->pushMembershipCertificate(toZT,false,Utils::now());
-
-			Packet outp(toZT,_r->identity.address(),Packet::VERB_FRAME);
-			outp.append(network->id());
-			outp.append((uint16_t)etherType);
-			outp.append(data);
-			outp.compress();
-			send(outp,true);
+			if (fromBridged) {
+				// Must use EXT_FRAME if source is not myself
+				Packet outp(toZT,_r->identity.address(),Packet::VERB_EXT_FRAME);
+				outp.append(network->id());
+				outp.append((unsigned char)0);
+				to.appendTo(outp);
+				from.appendTo(outp);
+				outp.append((uint16_t)etherType);
+				outp.append(data);
+				outp.compress();
+				send(outp,true);
+			} else {
+				// VERB_FRAME is really just lighter weight EXT_FRAME, can use for direct-to-direct (before bridging this was the only unicast method)
+				Packet outp(toZT,_r->identity.address(),Packet::VERB_FRAME);
+				outp.append(network->id());
+				outp.append((uint16_t)etherType);
+				outp.append(data);
+				outp.compress();
+				send(outp,true);
+			}
 		} else {
 			TRACE("%s: UNICAST: %s -> %s %s dropped, destination not a member of closed network %.16llx",network->tapDeviceName().c_str(),from.toString().c_str(),to.toString().c_str(),etherTypeName(etherType),network->id());
 		}
 	}
 
-	// Unicast to another node behind another bridge, whether from us or not
+	// Destination is behind another bridge
 
 	Address bridges[ZT_MAX_BRIDGE_SPAM];
 	unsigned int numBridges = 0;
@@ -266,15 +279,17 @@ void Switch::onLocalEthernet(const SharedPtr<Network> &network,const MAC &from,c
 	}
 
 	for(unsigned int b=0;b<numBridges;++b) {
-		Packet outp(bridges[b],_r->identity.address(),Packet::VERB_EXT_FRAME);
-		outp.append(network->id());
-		outp.append((unsigned char)0);
-		to.appendTo(outp);
-		from.appendTo(outp);
-		outp.append((uint16_t)etherType);
-		outp.append(data);
-		outp.compress();
-		send(outp,true);
+		if (network->isAllowed(bridges[b])) {
+			Packet outp(bridges[b],_r->identity.address(),Packet::VERB_EXT_FRAME);
+			outp.append(network->id());
+			outp.append((unsigned char)0);
+			to.appendTo(outp);
+			from.appendTo(outp);
+			outp.append((uint16_t)etherType);
+			outp.append(data);
+			outp.compress();
+			send(outp,true);
+		}
 	}
 }