summaryrefslogtreecommitdiff
path: root/node
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2015-04-06 16:52:52 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2015-04-06 16:52:52 -0700
commit8001b2c0cb6d35bfbc7b7be78d1a8b6d0fafbd53 (patch)
tree2491d429727fb9d732d86bfae778068a889d363e /node
parenta86300c58fe29e9a8626f935f0b3ed25e844b0aa (diff)
downloadinfinitytier-8001b2c0cb6d35bfbc7b7be78d1a8b6d0fafbd53.tar.gz
infinitytier-8001b2c0cb6d35bfbc7b7be78d1a8b6d0fafbd53.zip
Network now calls port config function as per new API.
Diffstat (limited to 'node')
-rw-r--r--node/Network.cpp78
-rw-r--r--node/Network.hpp21
-rw-r--r--node/NetworkConfig.cpp4
-rw-r--r--node/Node.cpp8
-rw-r--r--node/Node.hpp42
5 files changed, 108 insertions, 45 deletions
diff --git a/node/Network.cpp b/node/Network.cpp
index dc6b87a0..7b033181 100644
--- a/node/Network.cpp
+++ b/node/Network.cpp
@@ -49,7 +49,8 @@ Network::Network(const RuntimeEnvironment *renv,uint64_t nwid) :
_enabled(true),
_lastConfigUpdate(0),
_destroyed(false),
- _netconfFailure(NETCONF_FAILURE_NONE)
+ _netconfFailure(NETCONF_FAILURE_NONE),
+ _portError(0)
{
char confn[128],mcdbn[128];
Utils::snprintf(confn,sizeof(confn),"networks.d/%.16llx.conf",_id);
@@ -96,10 +97,16 @@ Network::Network(const RuntimeEnvironment *renv,uint64_t nwid) :
}
requestConfiguration();
+
+ ZT1_VirtualNetworkConfig ctmp;
+ _externalConfig(&ctmp);
+ _portError = RR->node->configureVirtualNetworkPort(_id,&ctmp);
}
Network::~Network()
{
+ RR->node->configureVirtualNetworkPort(_id,(const ZT1_VirtualNetworkConfig *)0);
+
char n[128];
if (_destroyed) {
Utils::snprintf(n,sizeof(n),"networks.d/%.16llx.conf",_id);
@@ -179,6 +186,11 @@ bool Network::applyConfiguration(const SharedPtr<NetworkConfig> &conf)
_config = conf;
_lastConfigUpdate = RR->node->now();
_netconfFailure = NETCONF_FAILURE_NONE;
+
+ ZT1_VirtualNetworkConfig ctmp;
+ _externalConfig(&ctmp);
+ _portError = RR->node->configureVirtualNetworkPort(_id,&ctmp);
+
return true;
} else {
LOG("ignored invalid configuration for network %.16llx (configuration contains mismatched network ID or issued-to address)",(unsigned long long)_id);
@@ -368,21 +380,6 @@ void Network::clean()
}
}
-ZT1_VirtualNetworkStatus Network::status() const
-{
- Mutex::Lock _l(_lock);
- switch(_netconfFailure) {
- case NETCONF_FAILURE_ACCESS_DENIED:
- return ZT1_NETWORK_STATUS_ACCESS_DENIED;
- case NETCONF_FAILURE_NOT_FOUND:
- return ZT1_NETWORK_STATUS_NOT_FOUND;
- case NETCONF_FAILURE_NONE:
- return ((_lastConfigUpdate > 0) ? ZT1_NETWORK_STATUS_OK : ZT1_NETWORK_STATUS_REQUESTING_CONFIGURATION);
- default:
- return ZT1_NETWORK_STATUS_INITIALIZATION_FAILED;
- }
-}
-
void Network::learnBridgeRoute(const MAC &mac,const Address &addr)
{
Mutex::Lock _l(_lock);
@@ -421,4 +418,53 @@ void Network::destroy()
_destroyed = true;
}
+ZT1_VirtualNetworkStatus Network::_status() const
+{
+ // assumes _lock is locked
+ if (_portError)
+ return ZT1_NETWORK_STATUS_PORT_ERROR;
+ switch(_netconfFailure) {
+ case NETCONF_FAILURE_ACCESS_DENIED:
+ return ZT1_NETWORK_STATUS_ACCESS_DENIED;
+ case NETCONF_FAILURE_NOT_FOUND:
+ return ZT1_NETWORK_STATUS_NOT_FOUND;
+ case NETCONF_FAILURE_NONE:
+ return ((_lastConfigUpdate > 0) ? ZT1_NETWORK_STATUS_OK : ZT1_NETWORK_STATUS_REQUESTING_CONFIGURATION);
+ default:
+ return ZT1_NETWORK_STATUS_PORT_ERROR;
+ }
+}
+
+void Network::_externalConfig(ZT1_VirtualNetworkConfig *ec) const
+{
+ // assumes _lock is locked
+ ec->nwid = _id;
+ ec->mac = MAC(RR->identity.address(),_id);
+ if (_config)
+ Utils::scopy(ec->name,sizeof(ec->name),_config->name().c_str());
+ else ec->name[0] = (char)0;
+ ec->status = _status();
+ ec->type = (_config) ? (_config->isPrivate() ? ZT1_NETWORK_TYPE_PRIVATE : ZT1_NETWORK_TYPE_PUBLIC) : ZT1_NETWORK_TYPE_PRIVATE;
+ ec->mtu = ZT_IF_MTU;
+ ec->dhcp = 0;
+ ec->bridge = (_config) ? ((_config->allowPassiveBridging() || (std::find(_config->activeBridges().begin(),_config->activeBridges().end(),RR->identity.address()) != _config->activeBridges().end())) ? 1 : 0) : 0;
+ ec->broadcastEnabled = (_config) ? (_config->enableBroadcast() ? 1 : 0) : 0;
+ ec->portError = _portError;
+ ec->netconfRevision = (_config) ? (unsigned long)_config->revision() : 0;
+
+ ec->multicastSubscriptionCount = std::max((unsigned int)_myMulticastGroups.size(),(unsigned int)ZT1_MAX_NETWORK_MULTICAST_SUBSCRIPTIONS);
+ for(unsigned int i=0;i<ec->multicastSubscriptionCount;++i) {
+ ec->multicastSubscriptions[i].mac = _myMulticastGroups[i].mac().toInt();
+ ec->multicastSubscriptions[i].adi = _myMulticastGroups[i].adi();
+ }
+
+ if (_config) {
+ ec->assignedAddressCount = (unsigned int)_config->staticIps().size();
+ for(unsigned long i=0;i<ZT1_MAX_ZT_ASSIGNED_ADDRESSES;++i) {
+ if (i < _config->staticIps().size())
+ memcpy(&(ec->assignedAddresses[i]),&(_config->staticIps()[i]),sizeof(struct sockaddr_storage));
+ }
+ } else ec->assignedAddressCount = 0;
+}
+
} // namespace ZeroTier
diff --git a/node/Network.hpp b/node/Network.hpp
index 5693ff49..b51164a3 100644
--- a/node/Network.hpp
+++ b/node/Network.hpp
@@ -192,7 +192,20 @@ public:
/**
* @return Status of this network
*/
- ZT1_VirtualNetworkStatus status() const;
+ inline ZT1_VirtualNetworkStatus status() const
+ {
+ Mutex::Lock _l(_lock);
+ return _status();
+ }
+
+ /**
+ * @param ec Buffer to fill with externally-visible network configuration
+ */
+ inline void externalConfig(ZT1_VirtualNetworkConfig *ec) const
+ {
+ Mutex::Lock _l(_lock);
+ _externalConfig(ec);
+ }
/**
* Update and check multicast rate balance for a multicast group
@@ -321,6 +334,9 @@ public:
void destroy();
private:
+ ZT1_VirtualNetworkStatus _status() const;
+ void _externalConfig(ZT1_VirtualNetworkConfig *ec) const; // assumes _lock is locked
+
const RuntimeEnvironment *RR;
uint64_t _id;
MAC _mac; // local MAC address
@@ -340,12 +356,13 @@ private:
volatile bool _destroyed;
- volatile enum {
+ enum {
NETCONF_FAILURE_NONE,
NETCONF_FAILURE_ACCESS_DENIED,
NETCONF_FAILURE_NOT_FOUND,
NETCONF_FAILURE_INIT_FAILED
} _netconfFailure;
+ int _portError; // return value from port config callback
Mutex _lock;
diff --git a/node/NetworkConfig.cpp b/node/NetworkConfig.cpp
index e42b0299..ba72a415 100644
--- a/node/NetworkConfig.cpp
+++ b/node/NetworkConfig.cpp
@@ -125,6 +125,8 @@ void NetworkConfig::_fromDictionary(const Dictionary &d)
_private = (Utils::hexStrToUInt(d.get(ZT_NETWORKCONFIG_DICT_KEY_PRIVATE,one).c_str()) != 0);
_enableBroadcast = (Utils::hexStrToUInt(d.get(ZT_NETWORKCONFIG_DICT_KEY_ENABLE_BROADCAST,one).c_str()) != 0);
_name = d.get(ZT_NETWORKCONFIG_DICT_KEY_NAME);
+ if (_name.length() > ZT1_MAX_NETWORK_SHORT_NAME_LENGTH)
+ throw std::invalid_argument("network short name too long (max: 255 characters)");
_description = d.get(ZT_NETWORKCONFIG_DICT_KEY_DESC,std::string());
// In dictionary IPs are split into V4 and V6 addresses, but we don't really
@@ -156,6 +158,8 @@ void NetworkConfig::_fromDictionary(const Dictionary &d)
}
_staticIps.push_back(addr);
}
+ if (_staticIps.size() > ZT1_MAX_ZT_ASSIGNED_ADDRESSES)
+ throw std::invalid_argument("too many ZT-assigned IP addresses");
std::sort(_staticIps.begin(),_staticIps.end());
std::unique(_staticIps.begin(),_staticIps.end());
diff --git a/node/Node.cpp b/node/Node.cpp
index f1d107f1..29262eda 100644
--- a/node/Node.cpp
+++ b/node/Node.cpp
@@ -54,14 +54,14 @@ Node::Node(
ZT1_DataStorePutFunction dataStorePutFunction,
ZT1_WirePacketSendFunction wirePacketSendFunction,
ZT1_VirtualNetworkFrameFunction virtualNetworkFrameFunction,
- ZT1_VirtualNetworkConfigCallback virtualNetworkConfigCallback,
+ ZT1_VirtualNetworkConfigFunction virtualNetworkConfigFunction,
ZT1_StatusCallback statusCallback) :
RR(new RuntimeEnvironment(this)),
_dataStoreGetFunction(dataStoreGetFunction),
_dataStorePutFunction(dataStorePutFunction),
_wirePacketSendFunction(wirePacketSendFunction),
_virtualNetworkFrameFunction(virtualNetworkFrameFunction),
- _virtualNetworkConfigCallback(virtualNetworkConfigCallback),
+ _virtualNetworkConfigFunction(virtualNetworkConfigFunction),
_statusCallback(statusCallback),
_networks(),
_networks_m(),
@@ -217,12 +217,12 @@ enum ZT1_ResultCode ZT1_Node_new(
ZT1_DataStorePutFunction dataStorePutFunction,
ZT1_WirePacketSendFunction wirePacketSendFunction,
ZT1_VirtualNetworkFrameFunction virtualNetworkFrameFunction,
- ZT1_VirtualNetworkConfigCallback virtualNetworkConfigCallback,
+ ZT1_VirtualNetworkConfigFunction virtualNetworkConfigFunction,
ZT1_StatusCallback statusCallback)
{
*node = (ZT1_Node *)0;
try {
- *node = reinterpret_cast<ZT1_Node *>(new ZeroTier::Node(now,dataStoreGetFunction,dataStorePutFunction,wirePacketSendFunction,virtualNetworkFrameFunction,virtualNetworkConfigCallback,statusCallback));
+ *node = reinterpret_cast<ZT1_Node *>(new ZeroTier::Node(now,dataStoreGetFunction,dataStorePutFunction,wirePacketSendFunction,virtualNetworkFrameFunction,virtualNetworkConfigFunction,statusCallback));
return ZT1_RESULT_OK;
} catch (std::bad_alloc &exc) {
return ZT1_RESULT_FATAL_ERROR_OUT_OF_MEMORY;
diff --git a/node/Node.hpp b/node/Node.hpp
index fe704532..5b158228 100644
--- a/node/Node.hpp
+++ b/node/Node.hpp
@@ -61,7 +61,7 @@ public:
ZT1_DataStorePutFunction dataStorePutFunction,
ZT1_WirePacketSendFunction wirePacketSendFunction,
ZT1_VirtualNetworkFrameFunction virtualNetworkFrameFunction,
- ZT1_VirtualNetworkConfigCallback virtualNetworkConfigCallback,
+ ZT1_VirtualNetworkConfigFunction virtualNetworkConfigFunction,
ZT1_StatusCallback statusCallback);
~Node();
@@ -115,16 +115,12 @@ public:
*/
inline bool putPacket(const InetAddress &addr,const void *data,unsigned int len,unsigned int desperation)
{
- try {
- return (_wirePacketSendFunction(
- reinterpret_cast<ZT1_Node *>(this),
- reinterpret_cast<const struct sockaddr_storage *>(&addr),
- desperation,
- data,
- len) == 0);
- } catch ( ... ) { // callbacks should not throw
- return false;
- }
+ return (_wirePacketSendFunction(
+ reinterpret_cast<ZT1_Node *>(this),
+ reinterpret_cast<const struct sockaddr_storage *>(&addr),
+ desperation,
+ data,
+ len) == 0);
}
/**
@@ -140,17 +136,15 @@ public:
*/
inline void putFrame(uint64_t nwid,const MAC &source,const MAC &dest,unsigned int etherType,unsigned int vlanId,const void *data,unsigned int len)
{
- try {
- _virtualNetworkFrameFunction(
- reinterpret_cast<ZT1_Node *>(this),
- nwid,
- source.toInt(),
- dest.toInt(),
- etherType,
- vlanId,
- data,
- len);
- } catch ( ... ) {} // callbacks should not throw
+ _virtualNetworkFrameFunction(
+ reinterpret_cast<ZT1_Node *>(this),
+ nwid,
+ source.toInt(),
+ dest.toInt(),
+ etherType,
+ vlanId,
+ data,
+ len);
}
inline SharedPtr<Network> network(uint64_t nwid)
@@ -167,6 +161,8 @@ public:
inline void postEvent(ZT1_Event ev) { _statusCallback(reinterpret_cast<ZT1_Node *>(this),ev); }
+ inline int configureVirtualNetworkPort(uint64_t nwid,const ZT1_VirtualNetworkConfig *nc) { return _virtualNetworkConfigFunction(reinterpret_cast<ZT1_Node *>(this),nwid,nc); }
+
void postNewerVersionIfNewer(unsigned int major,unsigned int minor,unsigned int rev);
private:
@@ -176,7 +172,7 @@ private:
ZT1_DataStorePutFunction _dataStorePutFunction;
ZT1_WirePacketSendFunction _wirePacketSendFunction;
ZT1_VirtualNetworkFrameFunction _virtualNetworkFrameFunction;
- ZT1_VirtualNetworkConfigCallback _virtualNetworkConfigCallback;
+ ZT1_VirtualNetworkConfigFunction _virtualNetworkConfigFunction;
ZT1_StatusCallback _statusCallback;
//Dictionary _localConfig; // persisted as local.conf