diff options
author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2015-04-20 17:47:12 -0700 |
---|---|---|
committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2015-04-20 17:47:12 -0700 |
commit | ed107c4daf9e6ccd1bc158ccdb2dbe0950aa845a (patch) | |
tree | 038c1d2df93e8f01598d68b395aa4784668245e5 | |
parent | 8a13cfdacee72a4af90336a329aaecb0ed38c33d (diff) | |
download | infinitytier-ed107c4daf9e6ccd1bc158ccdb2dbe0950aa845a.tar.gz infinitytier-ed107c4daf9e6ccd1bc158ccdb2dbe0950aa845a.zip |
Network preferred relay stuff in netconf controller.
-rw-r--r-- | controller/SqliteNetworkController.cpp | 27 | ||||
-rw-r--r-- | controller/SqliteNetworkController.hpp | 1 | ||||
-rw-r--r-- | controller/schema.sql | 5 | ||||
-rw-r--r-- | controller/schema.sql.c | 5 |
4 files changed, 35 insertions, 3 deletions
diff --git a/controller/SqliteNetworkController.cpp b/controller/SqliteNetworkController.cpp index b3cef1f0..abef3387 100644 --- a/controller/SqliteNetworkController.cpp +++ b/controller/SqliteNetworkController.cpp @@ -105,12 +105,13 @@ SqliteNetworkController::SqliteNetworkController(const char *dbPath) : ||(sqlite3_prepare_v2(_db,"UPDATE Member SET clientReportedRevision = ? WHERE rowid = ?",-1,&_sUpdateMemberClientReportedRevision,(const char **)0) != SQLITE_OK) ||(sqlite3_prepare_v2(_db,"SELECT etherType FROM Rule WHERE networkId = ? AND \"action\" = 'accept'",-1,&_sGetEtherTypesFromRuleTable,(const char **)0) != SQLITE_OK) ||(sqlite3_prepare_v2(_db,"SELECT mgMac,mgAdi,preload,maxBalance,accrual FROM MulticastRate WHERE networkId = ?",-1,&_sGetMulticastRates,(const char **)0) != SQLITE_OK) - ||(sqlite3_prepare_v2(_db,"SELECT nodeId FROM Member WHERE networkId = ? AND authorized > 0 AND activeBridge > 0",-1,&_sGetActiveBridges,(const char **)0) != SQLITE_OK) + ||(sqlite3_prepare_v2(_db,"SELECT nodeId FROM Member WHERE networkId = ? AND activeBridge > 0 AND authorized > 0",-1,&_sGetActiveBridges,(const char **)0) != SQLITE_OK) ||(sqlite3_prepare_v2(_db,"SELECT DISTINCT ip,ipNetmaskBits FROM IpAssignment WHERE networkId = ? AND nodeId = ? AND ipVersion = ?",-1,&_sGetIpAssignmentsForNode,(const char **)0) != SQLITE_OK) ||(sqlite3_prepare_v2(_db,"SELECT DISTINCT ipNetwork,ipNetmaskBits FROM IpAssignmentPool WHERE networkId = ? AND ipVersion = ? AND active > 0",-1,&_sGetIpAssignmentPools,(const char **)0) != SQLITE_OK) ||(sqlite3_prepare_v2(_db,"SELECT 1 FROM IpAssignment WHERE networkId = ? AND ip = ? AND ipVersion = ?",-1,&_sCheckIfIpIsAllocated,(const char **)0) != SQLITE_OK) ||(sqlite3_prepare_v2(_db,"INSERT INTO IpAssignment (networkId,nodeId,ip,ipNetmaskBits,ipVersion) VALUES (?,?,?,?,?)",-1,&_sAllocateIp,(const char **)0) != SQLITE_OK) ||(sqlite3_prepare_v2(_db,"UPDATE Member SET cachedNetconf = ?,cachedNetconfRevision = ? WHERE rowid = ?",-1,&_sCacheNetconf,(const char **)0) != SQLITE_OK) + ||(sqlite3_prepare_v2(_db,"SELECT DISTINCT nodeId,address FROM Relay WHERE networkId = ?",-1,&_sGetRelays,(const char **)0) != SQLITE_OK) ) { sqlite3_close(_db); throw std::runtime_error("SqliteNetworkController unable to initialize one or more prepared statements"); @@ -137,6 +138,7 @@ SqliteNetworkController::~SqliteNetworkController() sqlite3_finalize(_sCheckIfIpIsAllocated); sqlite3_finalize(_sAllocateIp); sqlite3_finalize(_sCacheNetconf); + sqlite3_finalize(_sGetRelays); sqlite3_close(_db); } } @@ -389,6 +391,29 @@ NetworkController::ResultCode SqliteNetworkController::doNetworkConfigRequest(co netconf[ZT_NETWORKCONFIG_DICT_KEY_ACTIVE_BRIDGES] = activeBridges; } + { + std::string relays; + sqlite3_reset(_sGetRelays); + sqlite3_bind_text(_sGetRelays,1,network.id,16,SQLITE_STATIC); + while (sqlite3_step(_sGetRelays) == SQLITE_ROW) { + const char *n = (const char *)sqlite3_column_text(_sGetRelays,0); + const char *a = (const char *)sqlite3_column_text(_sGetRelays,1); + if ((n)&&(a)) { + Address node(n); + InetAddress addr(a); + if ((node)&&(addr)) { + if (relays.length()) + relays.push_back(','); + relays.append(node.toString()); + relays.push_back(';'); + relays.append(addr.toString()); + } + } + } + if (relays.length()) + netconf[ZT_NETWORKCONFIG_DICT_KEY_RELAYS] = relays; + } + if ((network.v4AssignMode)&&(!strcmp(network.v4AssignMode,"zt"))) { std::string v4s; diff --git a/controller/SqliteNetworkController.hpp b/controller/SqliteNetworkController.hpp index 5487b59a..406aff1e 100644 --- a/controller/SqliteNetworkController.hpp +++ b/controller/SqliteNetworkController.hpp @@ -81,6 +81,7 @@ private: sqlite3_stmt *_sCheckIfIpIsAllocated; sqlite3_stmt *_sAllocateIp; sqlite3_stmt *_sCacheNetconf; + sqlite3_stmt *_sGetRelays; Mutex _lock; diff --git a/controller/schema.sql b/controller/schema.sql index 54571a22..f6d6e7e7 100644 --- a/controller/schema.sql +++ b/controller/schema.sql @@ -40,6 +40,8 @@ CREATE TABLE Member ( CREATE INDEX Member_networkId ON Member (networkId); +CREATE INDEX Member_networkId_activeBridge ON Member(networkId, activeBridge); + CREATE UNIQUE INDEX Member_networkId_nodeId ON Member (networkId, nodeId); CREATE TABLE MulticastRate ( @@ -68,7 +70,8 @@ CREATE TABLE Network ( CREATE TABLE Relay ( networkId char(16) NOT NULL, - nodeId char(10) NOT NULL + nodeId char(10) NOT NULL, + address varchar(64) NOT NULL ); CREATE UNIQUE INDEX Relay_networkId_nodeId ON Relay (networkId, nodeId); diff --git a/controller/schema.sql.c b/controller/schema.sql.c index 655f8e05..a5d46973 100644 --- a/controller/schema.sql.c +++ b/controller/schema.sql.c @@ -41,6 +41,8 @@ "\n"\ "CREATE INDEX Member_networkId ON Member (networkId);\n"\ "\n"\ +"CREATE INDEX Member_networkId_activeBridge ON Member(networkId, activeBridge);\n"\ +"\n"\ "CREATE UNIQUE INDEX Member_networkId_nodeId ON Member (networkId, nodeId);\n"\ "\n"\ "CREATE TABLE MulticastRate (\n"\ @@ -69,7 +71,8 @@ "\n"\ "CREATE TABLE Relay (\n"\ " networkId char(16) NOT NULL,\n"\ -" nodeId char(10) NOT NULL\n"\ +" nodeId char(10) NOT NULL,\n"\ +" address varchar(64) NOT NULL\n"\ ");\n"\ "\n"\ "CREATE UNIQUE INDEX Relay_networkId_nodeId ON Relay (networkId, nodeId);\n"\ |