summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2015-04-20 17:47:12 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2015-04-20 17:47:12 -0700
commited107c4daf9e6ccd1bc158ccdb2dbe0950aa845a (patch)
tree038c1d2df93e8f01598d68b395aa4784668245e5
parent8a13cfdacee72a4af90336a329aaecb0ed38c33d (diff)
downloadinfinitytier-ed107c4daf9e6ccd1bc158ccdb2dbe0950aa845a.tar.gz
infinitytier-ed107c4daf9e6ccd1bc158ccdb2dbe0950aa845a.zip
Network preferred relay stuff in netconf controller.
-rw-r--r--controller/SqliteNetworkController.cpp27
-rw-r--r--controller/SqliteNetworkController.hpp1
-rw-r--r--controller/schema.sql5
-rw-r--r--controller/schema.sql.c5
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"\