diff options
author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2016-08-26 14:43:16 -0700 |
---|---|---|
committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2016-08-26 14:43:16 -0700 |
commit | a3c7627acffc1f425477d9cd5c740980b31e5f1e (patch) | |
tree | 7a63b0092c723dcf616f149327401d656be5d53b /node | |
parent | 297b1b4258f6ec59f08590170e0dbad22dd6e790 (diff) | |
download | infinitytier-a3c7627acffc1f425477d9cd5c740980b31e5f1e.tar.gz infinitytier-a3c7627acffc1f425477d9cd5c740980b31e5f1e.zip |
Push more than one packet for credentials if we happen to have a whole lot. Should not happen often but might if a member has tons of tags.
Diffstat (limited to 'node')
-rw-r--r-- | node/Membership.cpp | 86 | ||||
-rw-r--r-- | node/Membership.hpp | 3 |
2 files changed, 46 insertions, 43 deletions
diff --git a/node/Membership.cpp b/node/Membership.cpp index 7ced9dcf..e809e2bd 100644 --- a/node/Membership.cpp +++ b/node/Membership.cpp @@ -28,61 +28,65 @@ namespace ZeroTier { -bool Membership::sendCredentialsIfNeeded(const RuntimeEnvironment *RR,const uint64_t now,const Address &peerAddress,const NetworkConfig &nconf,const Capability *cap) +void Membership::sendCredentialsIfNeeded(const RuntimeEnvironment *RR,const uint64_t now,const Address &peerAddress,const NetworkConfig &nconf,const Capability *cap) { if ((now - _lastPushAttempt) < 1000ULL) - return false; + return; _lastPushAttempt = now; try { - Buffer<ZT_PROTO_MAX_PACKET_LENGTH> capsAndTags; + bool unfinished; + do { + unfinished = false; + Buffer<ZT_PROTO_MAX_PACKET_LENGTH> capsAndTags; - unsigned int appendedCaps = 0; - if (cap) { - capsAndTags.addSize(2); - std::map<uint32_t,CState>::iterator cs(_caps.find(cap->id())); - if ((cs != _caps.end())&&((now - cs->second.lastPushed) >= ZT_CREDENTIAL_PUSH_EVERY)) { - cap->serialize(capsAndTags); - cs->second.lastPushed = now; - ++appendedCaps; + unsigned int appendedCaps = 0; + if (cap) { + capsAndTags.addSize(2); + std::map<uint32_t,CState>::iterator cs(_caps.find(cap->id())); + if ((cs != _caps.end())&&((now - cs->second.lastPushed) >= ZT_CREDENTIAL_PUSH_EVERY)) { + cap->serialize(capsAndTags); + cs->second.lastPushed = now; + ++appendedCaps; + } + capsAndTags.setAt<uint16_t>(0,(uint16_t)appendedCaps); + } else { + capsAndTags.append((uint16_t)0); } - capsAndTags.setAt<uint16_t>(0,(uint16_t)appendedCaps); - } else { - capsAndTags.append((uint16_t)0); - } - unsigned int appendedTags = 0; - const unsigned int tagCountPos = capsAndTags.size(); - capsAndTags.addSize(2); - for(unsigned int i=0;i<nconf.tagCount;++i) { - TState *const ts = _tags.get(nconf.tags[i].id()); - if ((now - ts->lastPushed) >= ZT_CREDENTIAL_PUSH_EVERY) { - if ((capsAndTags.size() + sizeof(Tag)) > (ZT_PROTO_MAX_PACKET_LENGTH - sizeof(CertificateOfMembership))) - break; - nconf.tags[i].serialize(capsAndTags); - ts->lastPushed = now; - ++appendedTags; + unsigned int appendedTags = 0; + const unsigned int tagCountPos = capsAndTags.size(); + capsAndTags.addSize(2); + for(unsigned int i=0;i<nconf.tagCount;++i) { + TState *const ts = _tags.get(nconf.tags[i].id()); + if ((now - ts->lastPushed) >= ZT_CREDENTIAL_PUSH_EVERY) { + if ((capsAndTags.size() + sizeof(Tag)) >= (ZT_PROTO_MAX_PACKET_LENGTH - sizeof(CertificateOfMembership))) { + unfinished = true; + break; + } + nconf.tags[i].serialize(capsAndTags); + ts->lastPushed = now; + ++appendedTags; + } } - } - capsAndTags.setAt<uint16_t>(tagCountPos,(uint16_t)appendedTags); + capsAndTags.setAt<uint16_t>(tagCountPos,(uint16_t)appendedTags); - const bool needCom = ((nconf.isPrivate())&&(nconf.com)&&((now - _lastPushedCom) >= ZT_CREDENTIAL_PUSH_EVERY)); - if ( (needCom) || (appendedCaps) || (appendedTags) ) { - Packet outp(peerAddress,RR->identity.address(),Packet::VERB_NETWORK_CREDENTIALS); - if (needCom) { - nconf.com.serialize(outp); - _lastPushedCom = now; + const bool needCom = ((nconf.isPrivate())&&(nconf.com)&&((now - _lastPushedCom) >= ZT_CREDENTIAL_PUSH_EVERY)); + if ( (needCom) || (appendedCaps) || (appendedTags) ) { + Packet outp(peerAddress,RR->identity.address(),Packet::VERB_NETWORK_CREDENTIALS); + if (needCom) { + nconf.com.serialize(outp); + _lastPushedCom = now; + } + outp.append((uint8_t)0x00); + outp.append(capsAndTags.data(),capsAndTags.size()); + outp.compress(); + RR->sw->send(outp,true); } - outp.append((uint8_t)0x00); - outp.append(capsAndTags.data(),capsAndTags.size()); - outp.compress(); - RR->sw->send(outp,true); - return true; - } + } while (unfinished); // if there are many tags, etc., we can send more than one } catch ( ... ) { TRACE("unable to send credentials due to unexpected exception"); } - return false; } int Membership::addCredential(const RuntimeEnvironment *RR,const CertificateOfMembership &com) diff --git a/node/Membership.hpp b/node/Membership.hpp index 580aa529..90363e2e 100644 --- a/node/Membership.hpp +++ b/node/Membership.hpp @@ -127,9 +127,8 @@ public: * @param peerAddress Address of member peer * @param nconf My network config * @param cap Capability to send or 0 if none - * @return True if we pushed something */ - bool sendCredentialsIfNeeded(const RuntimeEnvironment *RR,const uint64_t now,const Address &peerAddress,const NetworkConfig &nconf,const Capability *cap); + void sendCredentialsIfNeeded(const RuntimeEnvironment *RR,const uint64_t now,const Address &peerAddress,const NetworkConfig &nconf,const Capability *cap); /** * @param nconf Our network config |