فهرست منبع

Accept supernode dictionaries in Topology, also fix (unused) field name in one of these.

Adam Ierymenko 11 سال پیش
والد
کامیت
be6b61b1bc
3فایلهای تغییر یافته به همراه34 افزوده شده و 1 حذف شده
  1. 22 0
      node/Topology.cpp
  2. 11 0
      node/Topology.hpp
  3. 1 1
      root-topology/supernodes/9d219039f3

+ 22 - 0
node/Topology.cpp

@@ -30,6 +30,7 @@
 #include "Topology.hpp"
 #include "NodeConfig.hpp"
 #include "CMWC4096.hpp"
+#include "Dictionary.hpp"
 
 #define ZT_PEER_WRITE_BUF_SIZE 131072
 
@@ -75,6 +76,27 @@ void Topology::setSupernodes(const std::map< Identity,std::vector< std::pair<Ine
 	_amSupernode = (_supernodes.find(_r->identity) != _supernodes.end());
 }
 
+void Topology::setSupernodes(const Dictionary &sn)
+{
+	std::map< Identity,std::vector< std::pair<InetAddress,bool> > > m;
+	for(Dictionary::const_iterator d(sn.begin());d!=sn.end();++d) {
+		if ((d->first.length() == ZT_ADDRESS_LENGTH_HEX)&&(d->second.length() > 0)) {
+			try {
+				Dictionary snspec(d->second);
+				std::vector< std::pair<InetAddress,bool> > &a = m[Identity(snspec.get("id"))];
+				std::string udp(snspec.get("udp",std::string()));
+				if (udp.length() > 0)
+					a.push_back(std::pair<InetAddress,bool>(InetAddress(udp),false));
+				std::string tcp(snspec.get("tcp",std::string()));
+					a.push_back(std::pair<InetAddress,bool>(InetAddress(tcp),true));
+			} catch ( ... ) {
+				LOG("supernode list contained invalid entry for: %s",d->first.c_str());
+			}
+		}
+	}
+	this->setSupernodes(m);
+}
+
 SharedPtr<Peer> Topology::addPeer(const SharedPtr<Peer> &peer)
 {
 	if (peer->address() == _r->identity.address()) {

+ 11 - 0
node/Topology.hpp

@@ -48,6 +48,7 @@
 namespace ZeroTier {
 
 class RuntimeEnvironment;
+class Dictionary;
 
 /**
  * Database of network topology
@@ -65,6 +66,16 @@ public:
 	 */
 	void setSupernodes(const std::map< Identity,std::vector< std::pair<InetAddress,bool> > > &sn);
 
+	/**
+	 * Set up supernodes for this network
+	 *
+	 * This performs no signature verification of any kind. The caller must
+	 * check the signature of the root topology dictionary first.
+	 *
+	 * @param sn Supernodes dictionary from root-topology
+	 */
+	void setSupernodes(const Dictionary &sn);
+
 	/**
 	 * Add a peer to database
 	 *

+ 1 - 1
root-topology/supernodes/9d219039f3

@@ -2,4 +2,4 @@ id=9d219039f3:0:01f0922a98e3b34ebcbff333269dc265d7a020aab69d72be4d4acc9c8c929478
 udp=128.199.197.217/9993
 tcp=128.199.197.217/443
 desc=Singapore
-hn=mi-go.zerotier.com
+dns=mi-go.zerotier.com