|
@@ -121,6 +121,7 @@ void Switch::onLocalEthernet(const SharedPtr<Network> &network,const MAC &from,c
|
|
|
if (to.isMulticast()) {
|
|
|
// Destination is a multicast address (including broadcast)
|
|
|
|
|
|
+ uint64_t now = Utils::now();
|
|
|
MulticastGroup mg(to,0);
|
|
|
|
|
|
if (to.isBroadcast()) {
|
|
@@ -140,7 +141,7 @@ void Switch::onLocalEthernet(const SharedPtr<Network> &network,const MAC &from,c
|
|
|
* multicast addresses on bridge interfaces and subscribing each slave.
|
|
|
* But in that case this does no harm, as the sets are just merged. */
|
|
|
if (fromBridged)
|
|
|
- network->learnBridgedMulticastGroup(mg);
|
|
|
+ network->learnBridgedMulticastGroup(mg,now);
|
|
|
|
|
|
// Check multicast/broadcast bandwidth quotas and reject if quota exceeded
|
|
|
if (!network->updateAndCheckMulticastBalance(_r->identity.address(),mg,data.size())) {
|
|
@@ -166,9 +167,12 @@ void Switch::onLocalEthernet(const SharedPtr<Network> &network,const MAC &from,c
|
|
|
// All multicasts visit all active bridges first -- this is one of the two active/passive bridge differences
|
|
|
for(std::set<Address>::const_iterator ab(nconf->activeBridges().begin());ab!=nconf->activeBridges().end();++ab) {
|
|
|
if ((*ab != _r->identity.address())&&(ab->withinMulticastPropagationPrefix(prefix,nconf->multicastPrefixBits()))) {
|
|
|
- ab->copyTo(fifoPtr,ZT_ADDRESS_LENGTH);
|
|
|
- if ((fifoPtr += ZT_ADDRESS_LENGTH) == fifoEnd)
|
|
|
- break;
|
|
|
+ SharedPtr<Peer> abPeer(_r->topology->getPeer(*ab));
|
|
|
+ if ((abPeer)&&(abPeer->hasActiveDirectPath(now))) {
|
|
|
+ ab->copyTo(fifoPtr,ZT_ADDRESS_LENGTH);
|
|
|
+ if ((fifoPtr += ZT_ADDRESS_LENGTH) == fifoEnd)
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|