summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--node/Node.cpp22
-rw-r--r--node/Node.hpp4
-rw-r--r--root-topology/test/README.md6
-rwxr-xr-xroot-topology/test/create-test-root-topology.sh31
4 files changed, 49 insertions, 14 deletions
diff --git a/node/Node.cpp b/node/Node.cpp
index e77a977e..1661e9d1 100644
--- a/node/Node.cpp
+++ b/node/Node.cpp
@@ -59,7 +59,8 @@ Node::Node(
ZT1_VirtualNetworkConfigFunction virtualNetworkConfigFunction,
ZT1_EventCallback eventCallback,
const char *overrideRootTopology) :
- RR(new RuntimeEnvironment(this)),
+ _RR(this),
+ RR(&_RR),
_uPtr(uptr),
_dataStoreGetFunction(dataStoreGetFunction),
_dataStorePutFunction(dataStorePutFunction),
@@ -86,19 +87,18 @@ Node::Node(
TRACE("identity.secret not found, generating...");
RR->identity.generate();
idtmp = RR->identity.toString(true);
- if (!dataStorePut("identity.secret",idtmp,true)) {
- delete RR;
+ if (!dataStorePut("identity.secret",idtmp,true))
throw std::runtime_error("unable to write identity.secret");
- }
- idtmp = RR->identity.toString(false);
- if (!dataStorePut("identity.public",idtmp,false)) {
- delete RR;
- throw std::runtime_error("unable to write identity.public");
- }
}
RR->publicIdentityStr = RR->identity.toString(false);
RR->secretIdentityStr = RR->identity.toString(true);
+ idtmp = dataStoreGet("identity.public");
+ if (idtmp != RR->publicIdentityStr) {
+ if (!dataStorePut("identity.public",RR->publicIdentityStr,false))
+ throw std::runtime_error("unable to write identity.public");
+ }
+
try {
RR->prng = new CMWC4096();
RR->sw = new Switch(RR);
@@ -113,7 +113,6 @@ Node::Node(
delete RR->mc;
delete RR->sw;
delete RR->prng;
- delete RR;
throw;
}
@@ -138,14 +137,13 @@ Node::Node(
Node::~Node()
{
Mutex::Lock _l(_networks_m);
- _networks.clear(); // delete these before we delete RR
+ _networks.clear();
delete RR->sa;
delete RR->topology;
delete RR->antiRec;
delete RR->mc;
delete RR->sw;
delete RR->prng;
- delete RR;
}
ZT1_ResultCode Node::processWirePacket(
diff --git a/node/Node.hpp b/node/Node.hpp
index 396e04c0..70531bf8 100644
--- a/node/Node.hpp
+++ b/node/Node.hpp
@@ -38,6 +38,7 @@
#include "../include/ZeroTierOne.h"
+#include "RuntimeEnvironment.hpp"
#include "InetAddress.hpp"
#include "Mutex.hpp"
#include "MAC.hpp"
@@ -52,8 +53,6 @@
namespace ZeroTier {
-class RuntimeEnvironment;
-
/**
* Implementation of Node object as defined in CAPI
*
@@ -229,6 +228,7 @@ public:
#endif
private:
+ RuntimeEnvironment _RR;
RuntimeEnvironment *RR;
void *_uPtr; // _uptr (lower case) is reserved in Visual Studio :P
diff --git a/root-topology/test/README.md b/root-topology/test/README.md
new file mode 100644
index 00000000..332f8297
--- /dev/null
+++ b/root-topology/test/README.md
@@ -0,0 +1,6 @@
+Test Root Topology Script
+======
+
+This builds a test-root-topology from any number of running test-supernode-# Docker containers. This can then be used with the (undocumented) -T (override root topology) option to run test networks under Docker.
+
+Once you have a local Docker test network running you can use iptables rules to simulate a variety of network pathologies, or you can just use it to test any new changes to the protocol or node behavior at some limited scale.
diff --git a/root-topology/test/create-test-root-topology.sh b/root-topology/test/create-test-root-topology.sh
new file mode 100755
index 00000000..032d9c2e
--- /dev/null
+++ b/root-topology/test/create-test-root-topology.sh
@@ -0,0 +1,31 @@
+#!/bin/bash
+
+if [ ! -e ../mktopology ]; then
+ echo 'Build ../mktopology first!'
+ exit 1
+fi
+
+echo 'Populating supernodes/* with all Docker test-supernode-* container IPs and identities...'
+
+rm -rf supernodes
+mkdir supernodes
+
+for cid in `docker ps -f 'name=test-supernode-*' -q`; do
+ id=`docker exec $cid cat /var/lib/zerotier-one/identity.public`
+ ztaddr=`echo $id | cut -d : -f 1`
+ ip=`docker exec $cid ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'`
+ echo $cid $ztaddr $id $ip
+ echo "id=$id" >supernodes/$ztaddr
+ echo "udp=$ip/9993" >>supernodes/$ztaddr
+done
+
+echo 'Creating test-root-topology...'
+
+rm -f test-root-topology
+../mktopology >test-root-topology
+
+echo 'Done!'
+echo
+cat test-root-topology
+
+exit 0