diff options
| author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2013-08-03 12:53:46 -0400 |
|---|---|---|
| committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2013-08-03 12:53:46 -0400 |
| commit | bf5c07f79a0f78e714fe47a5d1e09330022261ea (patch) | |
| tree | 99b41a9e4f006a2ae742fb1d6eb66e0be2a19742 /node/Network.cpp | |
| parent | 63fa4a684d15409e185422e7641e7c4680d19ec3 (diff) | |
| download | infinitytier-bf5c07f79a0f78e714fe47a5d1e09330022261ea.tar.gz infinitytier-bf5c07f79a0f78e714fe47a5d1e09330022261ea.zip | |
Scratch that... more work wiring up netconf. Got to handle OK.
Diffstat (limited to 'node/Network.cpp')
| -rw-r--r-- | node/Network.cpp | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/node/Network.cpp b/node/Network.cpp index a50d56dc..37761aff 100644 --- a/node/Network.cpp +++ b/node/Network.cpp @@ -57,7 +57,8 @@ static const std::string _DELTA_PREFIX("~"); bool Network::Certificate::qualifyMembership(const Network::Certificate &mc) const { // Note: optimization probably needed here, probably via some kind of - // memoization / dynamic programming. + // memoization / dynamic programming. But make it work first, then make + // it fast. for(const_iterator myField(begin());myField!=end();++myField) { if (!((myField->first.length() > 1)&&(myField->first[0] == '~'))) { // ~fields are max delta range specs @@ -104,8 +105,8 @@ Network::Network(const RuntimeEnvironment *renv,uint64_t id) throw(std::runtime_error) : _r(renv), _tap(renv,renv->identity.address().toMAC(),ZT_IF_MTU,&_CBhandleTapData,this), - _lastConfigUpdate(0), - _id(id) + _id(id), + _lastConfigUpdate(0) { } @@ -143,20 +144,23 @@ bool Network::isAllowed(const Address &peer) const return _myCertificate.qualifyMembership(pc->second); } catch (std::exception &exc) { TRACE("isAllowed() check failed for peer %s: unexpected exception: %s",peer.toString().c_str(),exc.what()); - return false; } catch ( ... ) { TRACE("isAllowed() check failed for peer %s: unexpected exception: unknown exception",peer.toString().c_str()); - return false; } + return false; } void Network::clean() { Mutex::Lock _l(_lock); - for(std::map<Address,Certificate>::iterator i=(_membershipCertificates.begin());i!=_membershipCertificates.end();) { - if (_myCertificate.qualifyMembership(i->second)) - ++i; - else _membershipCertificates.erase(i++); + if (_configuration.isOpen()) + _membershipCertificates.clear(); + else { + for(std::map<Address,Certificate>::iterator i=(_membershipCertificates.begin());i!=_membershipCertificates.end();) { + if (_myCertificate.qualifyMembership(i->second)) + ++i; + else _membershipCertificates.erase(i++); + } } } |
