diff options
author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2013-09-07 12:23:53 -0400 |
---|---|---|
committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2013-09-07 12:23:53 -0400 |
commit | cdb96726df0f383c20bc83448a4e2427317371c0 (patch) | |
tree | ba4956bd41941b8268736a32c44b9314d8f788b9 /node/Network.hpp | |
parent | 56d8bbf780240be34759c5f6c9ff67d09d231468 (diff) | |
download | infinitytier-cdb96726df0f383c20bc83448a4e2427317371c0.tar.gz infinitytier-cdb96726df0f383c20bc83448a4e2427317371c0.zip |
updateAndCheckMulticastBalance and friends
Diffstat (limited to 'node/Network.hpp')
-rw-r--r-- | node/Network.hpp | 53 |
1 files changed, 33 insertions, 20 deletions
diff --git a/node/Network.hpp b/node/Network.hpp index 6e79705d..88035586 100644 --- a/node/Network.hpp +++ b/node/Network.hpp @@ -142,7 +142,8 @@ public: * Key is multicast group in lower case hex format: MAC (without :s) / * ADI (hex). Value is a comma-delimited list of: preload, min, max, * rate of accrual for bandwidth accounts. A key called '*' indicates - * the default for unlisted groups. + * the default for unlisted groups. Values are in hexadecimal and may + * be prefixed with '-' to indicate a negative value. */ class MulticastRates : private Dictionary { @@ -153,16 +154,17 @@ public: struct Rate { Rate() {} - Rate(double pl,double minr,double maxr,double bps) + Rate(int32_t pl,int32_t minb,int32_t maxb,int32_t acc) { preload = pl; - accrual.bytesPerSecond = bps; - accrual.maxBalance = maxr; - accrual.minBalance = minr; + minBalance = minb; + maxBalance = maxb; + accrual = acc; } - - double preload; - BandwidthAccount::Accrual accrual; + int32_t preload; + int32_t minBalance; + int32_t maxBalance; + int32_t accrual; }; MulticastRates() {} @@ -178,7 +180,7 @@ public: /** * @return Default rate, or GLOBAL_DEFAULT_RATE if not specified */ - Rate defaultRate() const + inline Rate defaultRate() const { Rate r; const_iterator dfl(find("*")); @@ -193,7 +195,7 @@ public: * @param mg Multicast group * @return Rate or default() rate if not specified */ - Rate get(const MulticastGroup &mg) const + inline Rate get(const MulticastGroup &mg) const { const_iterator r(find(mg.toString())); if (r == end()) @@ -206,26 +208,22 @@ public: { char tmp[16384]; Utils::scopy(tmp,sizeof(tmp),s.c_str()); - Rate r; - r.preload = 0.0; - r.accrual.bytesPerSecond = 0.0; - r.accrual.maxBalance = 0.0; - r.accrual.minBalance = 0.0; + Rate r(0,0,0,0); char *saveptr = (char *)0; unsigned int fn = 0; for(char *f=Utils::stok(tmp,",",&saveptr);(f);f=Utils::stok((char *)0,",",&saveptr)) { switch(fn++) { case 0: - r.preload = Utils::strToDouble(f); + r.preload = (int32_t)Utils::hexStrToLong(f); break; case 1: - r.accrual.minBalance = Utils::strToDouble(f); + r.minBalance = (int32_t)Utils::hexStrToLong(f); break; case 2: - r.accrual.maxBalance = Utils::strToDouble(f); + r.maxBalance = (int32_t)Utils::hexStrToLong(f); break; case 3: - r.accrual.bytesPerSecond = Utils::strToDouble(f); + r.accrual = (int32_t)Utils::hexStrToLong(f); break; } } @@ -538,10 +536,24 @@ public: else return ((_etWhitelist[etherType / 8] & (unsigned char)(1 << (etherType % 8))) != 0); } + /** + * Update multicast balance for an address and multicast group, return whether packet is allowed + * + * @param a Address that wants to send/relay packet + * @param mg Multicast group + * @param bytes Size of packet + * @return True if packet is within budget + */ inline bool updateAndCheckMulticastBalance(const Address &a,const MulticastGroup &mg,unsigned int bytes) { Mutex::Lock _l(_lock); - std::map< std::pair<Address,MulticastGroup>,BandwidthAccount >::iterator bal(_multicastRateAccounts.find(std::pair<Address,MulticastGroup>(a,mg))); + std::pair<Address,MulticastGroup> k(a,mg); + std::map< std::pair<Address,MulticastGroup>,BandwidthAccount >::iterator bal(_multicastRateAccounts.find(k)); + if (bal == _multicastRateAccounts.end()) { + MulticastRates::Rate r(_mcRates.get(mg)); + bal = _multicastRateAccounts.insert(std::make_pair(k,BandwidthAccount(r.preload,r.minBalance,r.maxBalance,r.accrual))).first; + } + return (bal->second.update((int32_t)bytes) < (int32_t)bytes); } private: @@ -563,6 +575,7 @@ private: // Configuration from network master node Config _configuration; Certificate _myCertificate; + MulticastRates _mcRates; // Ethertype whitelist bit field, set from config, for really fast lookup unsigned char _etWhitelist[65536 / 8]; |