mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-04-08 11:44:13 +00:00
Look up rate info from database, but going to drop min balance cause it seems unnecessary. Also work in progress on membership certs.
This commit is contained in:
parent
a40b8c07f4
commit
a3a2b8dedb
@ -114,7 +114,7 @@ int main(int argc,char **argv)
|
||||
strcpy(mysqlPassword,ee);
|
||||
}
|
||||
|
||||
char buf[131072];
|
||||
char buf[131072],buf2[131072];
|
||||
std::string dictBuf;
|
||||
|
||||
try {
|
||||
@ -255,6 +255,30 @@ int main(int argc,char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
Dictionary multicastRates;
|
||||
{
|
||||
Query q = dbCon->query();
|
||||
q << "SELECT DISTINCT multicastGroupMac,multicastGroupAdi,preload,maxBalance,accrual FROM NetworkMulticastRates WHERE Network_id = " << nwid;
|
||||
StoreQueryResult rs = q.store();
|
||||
for(unsigned long i=0;i<rs.num_rows();++i) {
|
||||
long preload = (long)rs[i]["preload"];
|
||||
long maxBalance = (long)rs[i]["maxBalance"];
|
||||
long accrual = (long)rs[i]["accrual"];
|
||||
sprintf(buf2,"%s%lx,%s%lx,%s%lx",
|
||||
((preload < 0) ? "-" : ""),
|
||||
preload,
|
||||
((maxBalance < 0) ? "-" : ""),
|
||||
maxBalance,
|
||||
((accrual < 0) ? "-" : ""),
|
||||
accrual);
|
||||
unsigned long long mac = (unsigned long long)rs[i]["multicastGroupMac"];
|
||||
if (mac) {
|
||||
sprintf(buf,"%.12llx/%lx",(mac & 0xffffffffffffULL),(unsigned long)rs[i]["multicastGroupAdi"]);
|
||||
multicastRates[buf] = buf2;
|
||||
} else multicastRates["*"] = buf2;
|
||||
}
|
||||
}
|
||||
|
||||
Dictionary netconf;
|
||||
|
||||
sprintf(buf,"%.16llx",(unsigned long long)nwid);
|
||||
@ -265,6 +289,7 @@ int main(int argc,char **argv)
|
||||
netconf["desc"] = desc;
|
||||
netconf["etherTypes"] = etherTypeWhitelistOld; // TODO: remove, old name
|
||||
netconf["et"] = etherTypeWhitelist;
|
||||
netconf["mr"] = multicastRates.toString();
|
||||
sprintf(buf,"%llx",(unsigned long long)Utils::now());
|
||||
netconf["ts"] = buf;
|
||||
|
||||
|
@ -101,12 +101,12 @@ public:
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Human readable string representing this group
|
||||
* @return Human readable string representing this group (MAC/ADI in hex)
|
||||
*/
|
||||
inline std::string toString() const
|
||||
{
|
||||
char buf[64];
|
||||
Utils::snprintf(buf,sizeof(buf),"%.2x%.2x%.2x%.2x%.2x%.2x/%.8lx",(unsigned int)_mac.data[0],(unsigned int)_mac.data[1],(unsigned int)_mac.data[2],(unsigned int)_mac.data[3],(unsigned int)_mac.data[4],(unsigned int)_mac.data[5],(unsigned long)_adi);
|
||||
Utils::snprintf(buf,sizeof(buf),"%.2x%.2x%.2x%.2x%.2x%.2x/%lx",(unsigned int)_mac.data[0],(unsigned int)_mac.data[1],(unsigned int)_mac.data[2],(unsigned int)_mac.data[3],(unsigned int)_mac.data[4],(unsigned int)_mac.data[5],(unsigned long)_adi);
|
||||
return std::string(buf);
|
||||
}
|
||||
|
||||
|
@ -82,6 +82,32 @@ class Network : NonCopyable
|
||||
public:
|
||||
/**
|
||||
* A certificate of network membership for private network participation
|
||||
*
|
||||
* Certificates consist of a dictionary containing one or more values with
|
||||
* optional max delta paramters. A max delta paramter defines the maximum
|
||||
* absolute value of the difference between each set of two values in order
|
||||
* for two certificates to match. If there is no max delta parameter, each
|
||||
* value is compared for straightforward string equality. Values must be
|
||||
* in hexadecimal (and may be negative) for max delta comparison purposes.
|
||||
* Decimals are not allowed, so decimal values must be multiplied by some
|
||||
* factor to convert them to integers with the required relative precision.
|
||||
* Math is done in 64-bit, allowing plenty of room for this.
|
||||
*
|
||||
* This allows membership in a network to be defined not only in terms of
|
||||
* absolute parameters but also relative comparisons. For example, a network
|
||||
* could be created that defined membership in terms of a geographic radius.
|
||||
* Its certificates would contain latitude, longitude, and a max delta for
|
||||
* each defining the radius.
|
||||
*
|
||||
* Max deltas are prefixed by "~". For example, a max delta for "longitude"
|
||||
* would be "~longitude".
|
||||
*
|
||||
* One value and its associated max delta is just about always present: a
|
||||
* timestamp. This represents the time the certificate was issued by the
|
||||
* netconf controller. Each peer requests netconf updates periodically with
|
||||
* new certificates, so this causes peers that are no longer members of the
|
||||
* network to lose the ability to communicate with their certificate's "ts"
|
||||
* field differs from everyone else's "ts" by more than "~ts".
|
||||
*/
|
||||
class Certificate : private Dictionary
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user