summaryrefslogtreecommitdiff
path: root/node/Network.cpp
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2013-09-24 17:35:05 -0400
committerAdam Ierymenko <adam.ierymenko@gmail.com>2013-09-24 17:35:05 -0400
commit5557a8192db253ed125db26a3b8761fd528c2781 (patch)
tree3ea731809f8fb7cb90e057d7fef97c03183ca86d /node/Network.cpp
parentbddbf4d2760c68efec2c11507243586031d6bf05 (diff)
downloadinfinitytier-5557a8192db253ed125db26a3b8761fd528c2781.tar.gz
infinitytier-5557a8192db253ed125db26a3b8761fd528c2781.zip
Work in progress...
Diffstat (limited to 'node/Network.cpp')
-rw-r--r--node/Network.cpp31
1 files changed, 23 insertions, 8 deletions
diff --git a/node/Network.cpp b/node/Network.cpp
index 455820d9..2d43e383 100644
--- a/node/Network.cpp
+++ b/node/Network.cpp
@@ -147,6 +147,7 @@ Network::~Network()
SharedPtr<Network> Network::newInstance(const RuntimeEnvironment *renv,uint64_t id)
throw(std::runtime_error)
{
+ // Tag to identify tap device -- used on some OSes like Windows
char tag[32];
Utils::snprintf(tag,sizeof(tag),"%.16llx",(unsigned long long)id);
@@ -159,8 +160,7 @@ SharedPtr<Network> Network::newInstance(const RuntimeEnvironment *renv,uint64_t
nw->_ready = false; // disable handling of Ethernet frames during construct
nw->_r = renv;
nw->_tap = new EthernetTap(renv,tag,renv->identity.address().toMAC(),ZT_IF_MTU,&_CBhandleTapData,nw.ptr());
- nw->_multicastPropagationBreadth = 0;
- nw->_multicastPropagationDepth = 0;
+ nw->_isOpen = false;
memset(nw->_etWhitelist,0,sizeof(nw->_etWhitelist));
nw->_id = id;
nw->_lastConfigUpdate = 0;
@@ -179,28 +179,39 @@ void Network::setConfiguration(const Network::Config &conf)
try {
if (conf.networkId() == _id) { // sanity check
_configuration = conf;
+
+ // Grab some things from conf for faster lookup and memoize them
_myCertificate = conf.certificateOfMembership();
_mcRates = conf.multicastRates();
- _multicastPropagationBreadth = conf.multicastPropagationBreadth();
- _multicastPropagationDepth = conf.multicastPropagationDepth();
+ _staticAddresses = conf.staticAddresses();
+ _isOpen = conf.isOpen();
+
_lastConfigUpdate = Utils::now();
- _tap->setIps(conf.staticAddresses());
+ _tap->setIps(_staticAddresses);
_tap->setDisplayName((std::string("ZeroTier One [") + conf.name() + "]").c_str());
+ // Expand ethertype whitelist into fast-lookup bit field
memset(_etWhitelist,0,sizeof(_etWhitelist));
std::set<unsigned int> wl(conf.etherTypes());
for(std::set<unsigned int>::const_iterator t(wl.begin());t!=wl.end();++t)
_etWhitelist[*t / 8] |= (unsigned char)(1 << (*t % 8));
+ // Save most recent configuration to disk in networks.d
std::string confPath(_r->homePath + ZT_PATH_SEPARATOR_S + "networks.d" + ZT_PATH_SEPARATOR_S + idString() + ".conf");
if (!Utils::writeFile(confPath.c_str(),conf.toString())) {
LOG("error: unable to write network configuration file at: %s",confPath.c_str());
}
}
} catch ( ... ) {
+ // If conf is invalid, reset everything
_configuration = Config();
+
_myCertificate = CertificateOfMembership();
+ _mcRates = MulticastRates();
+ _staticAddresses.clear();
+ _isOpen = false;
+
_lastConfigUpdate = 0;
LOG("unexpected exception handling config for network %.16llx, retrying fetch...",(unsigned long long)_id);
}
@@ -209,9 +220,11 @@ void Network::setConfiguration(const Network::Config &conf)
void Network::requestConfiguration()
{
if (controller() == _r->identity.address()) {
+ // FIXME: Right now the netconf master cannot be a member of its own nets
LOG("unable to request network configuration for network %.16llx: I am the network master, cannot query self",(unsigned long long)_id);
return;
}
+
TRACE("requesting netconf for network %.16llx from netconf master %s",(unsigned long long)_id,controller().toString().c_str());
Packet outp(controller(),_r->identity.address(),Packet::VERB_NETWORK_CONFIG_REQUEST);
outp.append((uint64_t)_id);
@@ -222,7 +235,7 @@ void Network::requestConfiguration()
void Network::addMembershipCertificate(const Address &peer,const CertificateOfMembership &cert)
{
Mutex::Lock _l(_lock);
- if (!_configuration.isOpen())
+ if (!_isOpen)
_membershipCertificates[peer] = cert;
}
@@ -231,7 +244,7 @@ bool Network::isAllowed(const Address &peer) const
// Exceptions can occur if we do not yet have *our* configuration.
try {
Mutex::Lock _l(_lock);
- if (_configuration.isOpen())
+ if (_isOpen)
return true;
std::map<Address,CertificateOfMembership>::const_iterator pc(_membershipCertificates.find(peer));
if (pc == _membershipCertificates.end())
@@ -249,9 +262,11 @@ void Network::clean()
{
std::string mcdbPath(_r->homePath + ZT_PATH_SEPARATOR_S + "networks.d" + ZT_PATH_SEPARATOR_S + idString() + ".mcerts");
+ _multicaster.clean(Utils::now());
+
Mutex::Lock _l(_lock);
- if ((!_id)||(_configuration.isOpen())) {
+ if ((!_id)||(_isOpen)) {
_membershipCertificates.clear();
Utils::rm(mcdbPath);
} else {