diff --git a/netconf-service/netconf.cpp b/netconf-service/netconf.cpp index 71cf38b92..c061c98d2 100644 --- a/netconf-service/netconf.cpp +++ b/netconf-service/netconf.cpp @@ -245,11 +245,13 @@ int main(int argc,char **argv) unsigned int multicastDepth = 0; bool emulateArp = false; bool emulateNdp = false; + unsigned int arpCacheTtl = 0; + unsigned int ndpCacheTtl = 0; std::string name; std::string desc; { Query q = dbCon->query(); - q << "SELECT name,`desc`,isOpen,multicastPrefixBits,multicastDepth,emulateArp,emulateNdp FROM Network WHERE id = " << nwid; + q << "SELECT name,`desc`,isOpen,multicastPrefixBits,multicastDepth,emulateArp,emulateNdp,arpCacheTtl,ndpCacheTtl FROM Network WHERE id = " << nwid; StoreQueryResult rs = q.store(); if (rs.num_rows() > 0) { name = rs[0]["name"].c_str(); @@ -257,6 +259,8 @@ int main(int argc,char **argv) isOpen = ((int)rs[0]["isOpen"] > 0); emulateArp = ((int)rs[0]["emulateArp"] > 0); emulateNdp = ((int)rs[0]["emulateNdp"] > 0); + arpCacheTtl = (unsigned int)rs[0]["arpCacheTtl"]; + ndpCacheTtl = (unsigned int)rs[0]["ndpCacheTtl"]; multicastPrefixBits = (unsigned int)rs[0]["multicastPrefixBits"]; multicastDepth = (unsigned int)rs[0]["multicastDepth"]; } else { @@ -427,6 +431,10 @@ int main(int argc,char **argv) netconf["ts"] = buf; netconf["eARP"] = (emulateArp ? "1" : "0"); netconf["eNDP"] = (emulateNdp ? "1" : "0"); + sprintf(buf,"%x",arpCacheTtl); + netconf["cARP"] = buf; + sprintf(buf,"%x",ndpCacheTtl); + netconf["cNDP"] = buf; if (multicastPrefixBits) { sprintf(buf,"%x",multicastPrefixBits); netconf["mpb"] = buf; diff --git a/node/Network.cpp b/node/Network.cpp index db84ada0d..1c14e9f66 100644 --- a/node/Network.cpp +++ b/node/Network.cpp @@ -91,6 +91,8 @@ SharedPtr Network::newInstance(const RuntimeEnvironment *renv,uint64_t nw->_isOpen = false; nw->_emulateArp = false; nw->_emulateNdp = false; + nw->_arpCacheTtl = 0; + nw->_ndpCacheTtl = 0; nw->_multicastPrefixBits = ZT_DEFAULT_MULTICAST_PREFIX_BITS; nw->_multicastDepth = ZT_DEFAULT_MULTICAST_DEPTH; nw->_status = NETWORK_WAITING_FOR_FIRST_AUTOCONF; @@ -120,6 +122,8 @@ void Network::setConfiguration(const Network::Config &conf,bool saveToDisk) _isOpen = conf.isOpen(); _emulateArp = conf.emulateArp(); _emulateNdp = conf.emulateNdp(); + _arpCacheTtl = conf.arpCacheTtl(); + _ndpCacheTtl = conf.ndpCacheTtl(); _multicastPrefixBits = conf.multicastPrefixBits(); _multicastDepth = conf.multicastDepth(); @@ -153,6 +157,8 @@ void Network::setConfiguration(const Network::Config &conf,bool saveToDisk) _isOpen = false; _emulateArp = false; _emulateNdp = false; + _arpCacheTtl = 0; + _ndpCacheTtl = 0; _status = NETWORK_WAITING_FOR_FIRST_AUTOCONF; _lastConfigUpdate = 0; diff --git a/node/Network.hpp b/node/Network.hpp index 5af169826..e72f9a4e0 100644 --- a/node/Network.hpp +++ b/node/Network.hpp @@ -272,6 +272,28 @@ public: else return (e->second == "1"); } + /** + * @return ARP cache TTL in seconds or 0 for no ARP caching + */ + inline unsigned int arpCacheTtl() const + { + const_iterator ttl(find("cARP")); + if (ttl == end()) + return 0; + return Utils::hexStrToUInt(ttl->second.c_str()); + } + + /** + * @return NDP cache TTL in seconds or 0 for no NDP caching + */ + inline unsigned int ndpCacheTtl() const + { + const_iterator ttl(find("cNDP")); + if (ttl == end()) + return 0; + return Utils::hexStrToUInt(ttl->second.c_str()); + } + /** * @return Multicast rates for this network */ @@ -684,6 +706,8 @@ private: bool _isOpen; bool _emulateArp; bool _emulateNdp; + unsigned int _arpCacheTtl; + unsigned int _ndpCacheTtl; unsigned int _multicastPrefixBits; unsigned int _multicastDepth;