Browse Source

Improve efficiency of pushCredentials() method since it gets called a lot.

pull/1/head
Adam Ierymenko 9 years ago
parent
commit
59ba7c8bf5
  1. 96
      node/Membership.cpp

96
node/Membership.cpp

@ -41,59 +41,53 @@ Membership::Membership() :
void Membership::pushCredentials(const RuntimeEnvironment *RR,const uint64_t now,const Address &peerAddress,const NetworkConfig &nconf,int localCapabilityIndex,const bool force) void Membership::pushCredentials(const RuntimeEnvironment *RR,const uint64_t now,const Address &peerAddress,const NetworkConfig &nconf,int localCapabilityIndex,const bool force)
{ {
//TRACE("pushCredentials() to %s localCapabilityIndex==%d force==%d",peerAddress.toString().c_str(),localCapabilityIndex,(int)force); bool sendCom = ( (nconf.com) && ( ((now - _lastPushedCom) >= ZT_CREDENTIAL_PUSH_EVERY) || (force) ) );
try {
unsigned int localTagPtr = 0;
bool needCom = ( (nconf.com) && ( ((now - _lastPushedCom) >= ZT_CREDENTIAL_PUSH_EVERY) || (force) ) );
do {
Buffer<ZT_PROTO_MAX_PACKET_LENGTH> capsAndTags;
unsigned int appendedCaps = 0;
if (localCapabilityIndex >= 0) {
capsAndTags.addSize(2);
if ( (_localCaps[localCapabilityIndex].id != nconf.capabilities[localCapabilityIndex].id()) || ((now - _localCaps[localCapabilityIndex].lastPushed) >= ZT_CREDENTIAL_PUSH_EVERY) || (force) ) {
_localCaps[localCapabilityIndex].lastPushed = now;
_localCaps[localCapabilityIndex].id = nconf.capabilities[localCapabilityIndex].id();
nconf.capabilities[localCapabilityIndex].serialize(capsAndTags);
++appendedCaps;
}
capsAndTags.setAt<uint16_t>(0,(uint16_t)appendedCaps);
localCapabilityIndex = -1; // don't send this cap again on subsequent loops if force is true
} else {
capsAndTags.append((uint16_t)0);
}
unsigned int appendedTags = 0; const Capability *sendCap;
const unsigned int tagCountPos = capsAndTags.size(); if (localCapabilityIndex >= 0) {
capsAndTags.addSize(2); sendCap = &(nconf.capabilities[localCapabilityIndex]);
for(;localTagPtr<nconf.tagCount;++localTagPtr) { if ( (_localCaps[localCapabilityIndex].id != sendCap->id()) || ((now - _localCaps[localCapabilityIndex].lastPushed) >= ZT_CREDENTIAL_PUSH_EVERY) || (force) ) {
if ( (_localTags[localTagPtr].id != nconf.tags[localTagPtr].id()) || ((now - _localTags[localTagPtr].lastPushed) >= ZT_CREDENTIAL_PUSH_EVERY) || (force) ) { _localCaps[localCapabilityIndex].lastPushed = now;
if ((capsAndTags.size() + sizeof(Tag)) >= (ZT_PROTO_MAX_PACKET_LENGTH - sizeof(CertificateOfMembership))) _localCaps[localCapabilityIndex].id = sendCap->id();
break; } else sendCap = (const Capability *)0;
nconf.tags[localTagPtr].serialize(capsAndTags); } else sendCap = (const Capability *)0;
++appendedTags;
} unsigned int tagPtr = 0;
} while ((tagPtr < nconf.tagCount)||(sendCom)||(sendCap)) {
capsAndTags.setAt<uint16_t>(tagCountPos,(uint16_t)appendedTags); Packet outp(peerAddress,RR->identity.address(),Packet::VERB_NETWORK_CREDENTIALS);
if (needCom||appendedCaps||appendedTags) { if (sendCom) {
Packet outp(peerAddress,RR->identity.address(),Packet::VERB_NETWORK_CREDENTIALS); sendCom = false;
if (needCom) { nconf.com.serialize(outp);
nconf.com.serialize(outp); _lastPushedCom = now;
_lastPushedCom = now; }
} outp.append((uint8_t)0x00);
outp.append((uint8_t)0x00);
outp.append(capsAndTags.data(),capsAndTags.size()); if (sendCap) {
outp.append((uint16_t)0); // no revocations, these propagate differently outp.append((uint16_t)1);
outp.compress(); sendCap->serialize(outp);
RR->sw->send(outp,true); sendCap = (const Capability *)0;
needCom = false; // don't send COM again on subsequent loops if force is true } else outp.append((uint16_t)0);
const unsigned int tagCountAt = outp.size();
outp.addSize(2);
unsigned int thisPacketTagCount = 0;
while ((tagPtr < nconf.tagCount)&&((outp.size() + sizeof(Tag) + 32) < ZT_PROTO_MAX_PACKET_LENGTH)) {
if ( (_localTags[tagPtr].id != nconf.tags[tagPtr].id()) || ((now - _localTags[tagPtr].lastPushed) >= ZT_CREDENTIAL_PUSH_EVERY) || (force) ) {
_localTags[tagPtr].lastPushed = now;
_localTags[tagPtr].id = nconf.tags[tagPtr].id();
nconf.tags[tagPtr].serialize(outp);
++thisPacketTagCount;
} }
} while (localTagPtr < nconf.tagCount); ++tagPtr;
} catch ( ... ) { }
TRACE("unable to send credentials due to unexpected exception"); outp.setAt(tagCountAt,(uint16_t)thisPacketTagCount);
// No revocations, these propagate differently
outp.append((uint16_t)0);
outp.compress();
RR->sw->send(outp,true);
} }
} }

Loading…
Cancel
Save