|
@@ -678,7 +678,7 @@ bool Network::filterOutgoingPacket(
|
|
|
accept = true;
|
|
|
|
|
|
if ((!noTee)&&(cc2)) {
|
|
|
- _memberships[cc2].sendCredentialsIfNeeded(RR,RR->node->now(),cc2,_config,relevantCap);
|
|
|
+ _membership(cc2).sendCredentialsIfNeeded(RR,RR->node->now(),cc2,_config,relevantCap);
|
|
|
|
|
|
Packet outp(cc2,RR->identity.address(),Packet::VERB_EXT_FRAME);
|
|
|
outp.append(_id);
|
|
@@ -710,7 +710,7 @@ bool Network::filterOutgoingPacket(
|
|
|
|
|
|
if (accept) {
|
|
|
if ((!noTee)&&(cc)) {
|
|
|
- _memberships[cc].sendCredentialsIfNeeded(RR,RR->node->now(),cc,_config,relevantCap);
|
|
|
+ _membership(cc).sendCredentialsIfNeeded(RR,RR->node->now(),cc,_config,relevantCap);
|
|
|
|
|
|
Packet outp(cc,RR->identity.address(),Packet::VERB_EXT_FRAME);
|
|
|
outp.append(_id);
|
|
@@ -724,7 +724,7 @@ bool Network::filterOutgoingPacket(
|
|
|
}
|
|
|
|
|
|
if ((ztDest != ztDest2)&&(ztDest2)) {
|
|
|
- _memberships[ztDest2].sendCredentialsIfNeeded(RR,RR->node->now(),ztDest2,_config,relevantCap);
|
|
|
+ _membership(ztDest2).sendCredentialsIfNeeded(RR,RR->node->now(),ztDest2,_config,relevantCap);
|
|
|
|
|
|
Packet outp(ztDest2,RR->identity.address(),Packet::VERB_EXT_FRAME);
|
|
|
outp.append(_id);
|
|
@@ -764,7 +764,7 @@ int Network::filterIncomingPacket(
|
|
|
|
|
|
Mutex::Lock _l(_lock);
|
|
|
|
|
|
- Membership &m = _memberships[ztDest];
|
|
|
+ Membership &m = _membership(ztDest);
|
|
|
const unsigned int remoteTagCount = m.getAllTags(_config,remoteTagIds,remoteTagValues,ZT_MAX_NETWORK_TAGS);
|
|
|
|
|
|
switch (_doZtFilter(RR,_config,true,sourcePeer->address(),ztDest2,macSource,macDest,frameData,frameLen,etherType,vlanId,_config.rules,_config.ruleCount,_config.tags,_config.tagCount,remoteTagIds,remoteTagValues,remoteTagCount,cc,ccLength)) {
|
|
@@ -791,7 +791,7 @@ int Network::filterIncomingPacket(
|
|
|
|
|
|
if (accept) {
|
|
|
if (cc2) {
|
|
|
- _memberships[cc2].sendCredentialsIfNeeded(RR,RR->node->now(),cc2,_config,(const Capability *)0);
|
|
|
+ _membership(cc2).sendCredentialsIfNeeded(RR,RR->node->now(),cc2,_config,(const Capability *)0);
|
|
|
|
|
|
Packet outp(cc2,RR->identity.address(),Packet::VERB_EXT_FRAME);
|
|
|
outp.append(_id);
|
|
@@ -822,7 +822,7 @@ int Network::filterIncomingPacket(
|
|
|
|
|
|
if (accept) {
|
|
|
if (cc) {
|
|
|
- _memberships[cc].sendCredentialsIfNeeded(RR,RR->node->now(),cc,_config,(const Capability *)0);
|
|
|
+ _membership(cc).sendCredentialsIfNeeded(RR,RR->node->now(),cc,_config,(const Capability *)0);
|
|
|
|
|
|
Packet outp(cc,RR->identity.address(),Packet::VERB_EXT_FRAME);
|
|
|
outp.append(_id);
|
|
@@ -836,7 +836,7 @@ int Network::filterIncomingPacket(
|
|
|
}
|
|
|
|
|
|
if ((ztDest != ztDest2)&&(ztDest2)) {
|
|
|
- _memberships[ztDest2].sendCredentialsIfNeeded(RR,RR->node->now(),ztDest2,_config,(const Capability *)0);
|
|
|
+ _membership(ztDest2).sendCredentialsIfNeeded(RR,RR->node->now(),ztDest2,_config,(const Capability *)0);
|
|
|
|
|
|
Packet outp(ztDest2,RR->identity.address(),Packet::VERB_EXT_FRAME);
|
|
|
outp.append(_id);
|
|
@@ -1247,7 +1247,8 @@ void Network::_announceMulticastGroups(const MulticastGroup *const onlyThis)
|
|
|
}
|
|
|
|
|
|
// Make sure that all "network anchors" have Membership records so we will
|
|
|
- // push multicasts to them.
|
|
|
+ // push multicasts to them. Note that _membership() also does this but in a
|
|
|
+ // piecemeal on-demand fashion.
|
|
|
const std::vector<Address> anchors(_config.anchors());
|
|
|
for(std::vector<Address>::const_iterator a(anchors.begin());a!=anchors.end();++a)
|
|
|
_memberships[*a];
|
|
@@ -1306,4 +1307,18 @@ std::vector<MulticastGroup> Network::_allMulticastGroups() const
|
|
|
return mgs;
|
|
|
}
|
|
|
|
|
|
+Membership &Network::_membership(const Address &a)
|
|
|
+{
|
|
|
+ // assumes _lock is locked
|
|
|
+ const unsigned long ms = _memberships.size();
|
|
|
+ Membership &m = _memberships[a];
|
|
|
+ if (ms != _memberships.size()) {
|
|
|
+ const uint64_t now = RR->node->now();
|
|
|
+ m.sendCredentialsIfNeeded(RR,now,a,_config,(const Capability *)0);
|
|
|
+ _announceMulticastGroupsTo(a,_allMulticastGroups());
|
|
|
+ m.likingMulticasts(now);
|
|
|
+ }
|
|
|
+ return m;
|
|
|
+}
|
|
|
+
|
|
|
} // namespace ZeroTier
|