diff options
author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2018-01-25 14:16:07 -0500 |
---|---|---|
committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2018-01-25 14:16:07 -0500 |
commit | 384e5b66decbbe3eda00b95690c6a56cb140c4f7 (patch) | |
tree | acceb68d97d6f907eece4df86ab38d6a2387474d /node | |
parent | 7e7723e98f1d9d9a6f85665cc87543e7e37ac47c (diff) | |
download | infinitytier-384e5b66decbbe3eda00b95690c6a56cb140c4f7.tar.gz infinitytier-384e5b66decbbe3eda00b95690c6a56cb140c4f7.zip |
More work on GitHub issue #666
Diffstat (limited to 'node')
-rw-r--r-- | node/Network.cpp | 42 | ||||
-rw-r--r-- | node/NetworkConfig.hpp | 21 | ||||
-rw-r--r-- | node/Node.cpp | 2 |
3 files changed, 27 insertions, 38 deletions
diff --git a/node/Network.cpp b/node/Network.cpp index e8a52e33..4cb5fb57 100644 --- a/node/Network.cpp +++ b/node/Network.cpp @@ -44,6 +44,8 @@ #include "Peer.hpp" #include "Trace.hpp" +#include <set> + namespace ZeroTier { namespace { @@ -1413,32 +1415,25 @@ void Network::_sendUpdatesToMembers(void *tPtr,const MulticastGroup *const newMu groups.push_back(*newMulticastGroup); else groups = _allMulticastGroups(); + std::vector<Address> alwaysAnnounceTo; + if ((newMulticastGroup)||((now - _lastAnnouncedMulticastGroupsUpstream) >= ZT_MULTICAST_ANNOUNCE_PERIOD)) { if (!newMulticastGroup) _lastAnnouncedMulticastGroupsUpstream = now; - // Announce multicast groups to upstream peers (roots, etc.) and also send - // them our COM so that MULTICAST_GATHER can be authenticated properly. + alwaysAnnounceTo = _config.alwaysContactAddresses(); + if (std::find(alwaysAnnounceTo.begin(),alwaysAnnounceTo.end(),controller()) == alwaysAnnounceTo.end()) + alwaysAnnounceTo.push_back(controller()); const std::vector<Address> upstreams(RR->topology->upstreamAddresses()); for(std::vector<Address>::const_iterator a(upstreams.begin());a!=upstreams.end();++a) { - if (_config.com) { - Packet outp(*a,RR->identity.address(),Packet::VERB_NETWORK_CREDENTIALS); - _config.com.serialize(outp); - outp.append((uint8_t)0x00); - outp.append((uint16_t)0); // no capabilities - outp.append((uint16_t)0); // no tags - outp.append((uint16_t)0); // no revocations - outp.append((uint16_t)0); // no certificates of ownership - RR->sw->send(tPtr,outp,true); - } - _announceMulticastGroupsTo(tPtr,*a,groups); + if (std::find(alwaysAnnounceTo.begin(),alwaysAnnounceTo.end(),*a) == alwaysAnnounceTo.end()) + alwaysAnnounceTo.push_back(*a); } + std::sort(alwaysAnnounceTo.begin(),alwaysAnnounceTo.end()); - // Also announce to controller, and send COM to simplify and generalize behavior even though in theory it does not need it - const Address c(controller()); - if ( (std::find(upstreams.begin(),upstreams.end(),c) == upstreams.end()) && (!_memberships.contains(c)) ) { - if (_config.com) { - Packet outp(c,RR->identity.address(),Packet::VERB_NETWORK_CREDENTIALS); + for(std::vector<Address>::const_iterator a(alwaysAnnounceTo.begin());a!=alwaysAnnounceTo.end();++a) { + if ( (_config.com) && (!_memberships.contains(*a)) ) { // push COM to non-members so they can do multicast request auth + Packet outp(*a,RR->identity.address(),Packet::VERB_NETWORK_CREDENTIALS); _config.com.serialize(outp); outp.append((uint8_t)0x00); outp.append((uint16_t)0); // no capabilities @@ -1447,24 +1442,17 @@ void Network::_sendUpdatesToMembers(void *tPtr,const MulticastGroup *const newMu outp.append((uint16_t)0); // no certificates of ownership RR->sw->send(tPtr,outp,true); } - _announceMulticastGroupsTo(tPtr,c,groups); + _announceMulticastGroupsTo(tPtr,*a,groups); } } - // Make sure that all "network anchors" have Membership records so we will - // push multicasts to them. - const std::vector<Address> anchors(_config.anchors()); - for(std::vector<Address>::const_iterator a(anchors.begin());a!=anchors.end();++a) - _membership(*a); - - // Send credentials and multicast LIKEs to members, upstreams, and controller { Address *a = (Address *)0; Membership *m = (Membership *)0; Hashtable<Address,Membership>::Iterator i(_memberships); while (i.next(a,m)) { m->pushCredentials(RR,tPtr,now,*a,_config,-1,false); - if ( ( m->multicastLikeGate(now) || (newMulticastGroup) ) && (m->isAllowedOnNetwork(_config)) ) + if ( ( m->multicastLikeGate(now) || (newMulticastGroup) ) && (m->isAllowedOnNetwork(_config)) && (!std::binary_search(alwaysAnnounceTo.begin(),alwaysAnnounceTo.end(),*a)) ) _announceMulticastGroupsTo(tPtr,*a,groups); } } diff --git a/node/NetworkConfig.hpp b/node/NetworkConfig.hpp index ebe0d70e..00f5d80f 100644 --- a/node/NetworkConfig.hpp +++ b/node/NetworkConfig.hpp @@ -292,9 +292,6 @@ public: return r; } - /** - * @return ZeroTier addresses of "anchor" devices on this network - */ inline std::vector<Address> anchors() const { std::vector<Address> r; @@ -305,9 +302,6 @@ public: return r; } - /** - * @return ZeroTier addresses of multicast replicators - */ inline std::vector<Address> multicastReplicators() const { std::vector<Address> r; @@ -318,10 +312,17 @@ public: return r; } - /** - * Add addresses that we should attempt to stay connected to to a set - */ - inline void getAlwaysContactAddresses(Hashtable< Address,std::vector<InetAddress> > &a) const + inline std::vector<Address> alwaysContactAddresses() const + { + std::vector<Address> r; + for(unsigned int i=0;i<specialistCount;++i) { + if ((specialists[i] & (ZT_NETWORKCONFIG_SPECIALIST_TYPE_ANCHOR | ZT_NETWORKCONFIG_SPECIALIST_TYPE_MULTICAST_REPLICATOR)) != 0) + r.push_back(Address(specialists[i])); + } + return r; + } + + inline void alwaysContactAddresses(Hashtable< Address,std::vector<InetAddress> > &a) const { for(unsigned int i=0;i<specialistCount;++i) { if ((specialists[i] & (ZT_NETWORKCONFIG_SPECIALIST_TYPE_ANCHOR | ZT_NETWORKCONFIG_SPECIALIST_TYPE_MULTICAST_REPLICATOR)) != 0) { diff --git a/node/Node.cpp b/node/Node.cpp index c95e884b..db511430 100644 --- a/node/Node.cpp +++ b/node/Node.cpp @@ -290,7 +290,7 @@ ZT_ResultCode Node::processBackgroundTasks(void *tptr,int64_t now,volatile int64 uint64_t *nwid = (uint64_t *)0; SharedPtr<Network> *network = (SharedPtr<Network> *)0; while (i.next(nwid,network)) { - (*network)->config().getAlwaysContactAddresses(alwaysContact); + (*network)->config().alwaysContactAddresses(alwaysContact); networkConfigNeeded.push_back( std::pair< SharedPtr<Network>,bool >(*network,(((now - (*network)->lastConfigUpdate()) >= ZT_NETWORK_AUTOCONF_DELAY)||(!(*network)->hasConfig()))) ); } } |