Pass 1 at adding DNS to controller

This commit is contained in:
Grant Limberg 2020-07-20 14:34:19 -07:00
commit 387039456d
No known key found for this signature in database
GPG key ID: 2BA62CCABBB4095A
5 changed files with 164 additions and 1 deletions

59
node/DNS.hpp Normal file
View file

@ -0,0 +1,59 @@
/*
* Copyright (c)2020 ZeroTier, Inc.
*
* Use of this software is governed by the Business Source License included
* in the LICENSE.TXT file in the project's root directory.
*
* Change Date: 2023-01-01
*
* On the date above, in accordance with the Business Source License, use
* of this software will be governed by version 2.0 of the Apache License.
*/
/****/
#ifndef ZT_DNS_HPP
#define ZT_DNS_HPP
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Buffer.hpp"
#include "InetAddress.hpp"
#include "../include/ZeroTierOne.h"
namespace ZeroTier {
/**
* DNS data serealization methods
*/
class DNS {
public:
template<unsigned int C>
static inline void serializeDNS(Buffer<C> &b, const ZT_VirtualNetworkDNS *dns, unsigned int dnsCount)
{
for(unsigned int i = 0; i < dnsCount; ++i) {
b.append(dns[i].domain, 128);
for(unsigned int j = 0; j < ZT_MAX_DNS_SERVERS; ++j) {
InetAddress tmp(dns[i].server_addr[j]);
tmp.serialize(b);
}
}
}
template<unsigned int C>
static inline void deserializeDNS(const Buffer<C> &b, unsigned int &p, ZT_VirtualNetworkDNS *dns, const unsigned int dnsCount)
{
for(unsigned int i = 0; i < dnsCount; ++i) {
char *d = (char*)b.data()+p;
memcpy(dns[i].domain, d, 128);
p += 128;
for (unsigned int j = 0; j < ZT_MAX_DNS_SERVERS; ++j) {
p += reinterpret_cast<InetAddress *>(&(dns[i].server_addr[j]))->deserialize(b, p);
}
}
}
};
}
#endif // ZT_DNS_HPP

View file

@ -176,6 +176,15 @@ bool NetworkConfig::toDictionary(Dictionary<ZT_NETWORKCONFIG_DICT_CAPACITY> &d,b
}
}
tmp->clear();
if (dnsCount > 0) {
tmp->append(dnsCount);
DNS::serializeDNS(*tmp, dns, dnsCount);
if (tmp->size()) {
if (!d.add(ZT_NETWORKCONFIG_DICT_KEY_DNS,*tmp)) return false;
}
}
delete tmp;
} catch ( ... ) {
delete tmp;
@ -354,6 +363,13 @@ bool NetworkConfig::fromDictionary(const Dictionary<ZT_NETWORKCONFIG_DICT_CAPACI
unsigned int p = 0;
Capability::deserializeRules(*tmp,p,this->rules,this->ruleCount,ZT_MAX_NETWORK_RULES);
}
if (d.get(ZT_NETWORKCONFIG_DICT_KEY_DNS, *tmp)) {
unsigned int p = 0;
this->dnsCount = tmp->at<unsigned int>(p);
p += sizeof(unsigned int);
DNS::deserializeDNS(*tmp, p, dns, (this->dnsCount <= ZT_MAX_NETWORK_DNS) ? this->dnsCount : ZT_MAX_NETWORK_DNS);
}
}
//printf("~~~\n%s\n~~~\n",d.data());

View file

@ -26,6 +26,7 @@
#include "Constants.hpp"
#include "Buffer.hpp"
#include "DNS.hpp"
#include "InetAddress.hpp"
#include "MulticastGroup.hpp"
#include "Address.hpp"
@ -175,6 +176,8 @@ namespace ZeroTier {
#define ZT_NETWORKCONFIG_DICT_KEY_TAGS "TAG"
// tags (binary blobs)
#define ZT_NETWORKCONFIG_DICT_KEY_CERTIFICATES_OF_OWNERSHIP "COO"
// dns (binary blobs)
#define ZT_NETWORKCONFIG_DICT_KEY_DNS "DNS"
// Legacy fields -- these are obsoleted but are included when older clients query
@ -229,13 +232,15 @@ public:
capabilities(),
tags(),
certificatesOfOwnership(),
type(ZT_NETWORK_TYPE_PRIVATE)
type(ZT_NETWORK_TYPE_PRIVATE),
dnsCount(0)
{
name[0] = 0;
memset(specialists, 0, sizeof(uint64_t)*ZT_MAX_NETWORK_SPECIALISTS);
memset(routes, 0, sizeof(ZT_VirtualNetworkRoute)*ZT_MAX_NETWORK_ROUTES);
memset(staticIps, 0, sizeof(InetAddress)*ZT_MAX_ZT_ASSIGNED_ADDRESSES);
memset(rules, 0, sizeof(ZT_VirtualNetworkRule)*ZT_MAX_NETWORK_RULES);
memset(dns, 0, sizeof(ZT_VirtualNetworkDNS)*ZT_MAX_NETWORK_DNS);
}
/**
@ -589,6 +594,16 @@ public:
* Certificate of membership (for private networks)
*/
CertificateOfMembership com;
/**
* Number of ZT-pushed DNS configurations
*/
unsigned int dnsCount;
/**
* ZT pushed DNS configuration
*/
ZT_VirtualNetworkDNS dns[ZT_MAX_NETWORK_DNS];
};
} // namespace ZeroTier