diff options
-rw-r--r-- | node/BandwidthAccount.hpp | 40 | ||||
-rw-r--r-- | node/Network.hpp | 17 |
2 files changed, 37 insertions, 20 deletions
diff --git a/node/BandwidthAccount.hpp b/node/BandwidthAccount.hpp index 1f337ca4..e8fc51d4 100644 --- a/node/BandwidthAccount.hpp +++ b/node/BandwidthAccount.hpp @@ -66,7 +66,7 @@ public: * @param maxb Maximum allowed balance (> 0) * @param acc Rate of accrual in bytes per second */ - BandwidthAccount(int32_t preload,int32_t maxb,int32_t acc) + BandwidthAccount(uint32_t preload,uint32_t maxb,uint32_t acc) throw() { init(preload,maxb,acc); @@ -79,7 +79,7 @@ public: * @param maxb Maximum allowed balance (> 0) * @param acc Rate of accrual in bytes per second */ - inline void init(int32_t preload,int32_t maxb,int32_t acc) + inline void init(uint32_t preload,uint32_t maxb,uint32_t acc) throw() { _lastTime = Utils::nowf(); @@ -89,27 +89,43 @@ public: } /** - * Update balance by accruing and then deducting + * Update and retrieve balance of this account * - * @param deduct Amount to deduct, or 0.0 to just update - * @return New balance after deduction -- if negative, it didn't fit + * @return New balance updated from current clock */ - inline int32_t update(int32_t deduct) + inline uint32_t update() throw() { double lt = _lastTime; double now = Utils::nowf(); _lastTime = now; - int32_t newbal = (int32_t)round((double)_balance + ((double)_accrual * (now - lt))) - deduct; - _balance = std::max((int32_t)0,std::min(_maxBalance,newbal)); - return newbal; + return (_balance = std::min(_maxBalance,(uint32_t)round((double)_balance + ((double)_accrual * (now - lt))))); + } + + /** + * Update balance and conditionally deduct + * + * If the deduction amount fits, it is deducted after update. Otherwise + * balance is updated and false is returned. + * + * @param amt Amount to deduct + * @return True if amount fit within balance and was deducted + */ + inline bool deduct(uint32_t amt) + throw() + { + if (update() >= amt) { + _balance -= amt; + return true; + } + return false; } private: double _lastTime; - int32_t _balance; - int32_t _maxBalance; - int32_t _accrual; + uint32_t _balance; + uint32_t _maxBalance; + uint32_t _accrual; }; } // namespace ZeroTier diff --git a/node/Network.hpp b/node/Network.hpp index 324ab3cf..13c1338d 100644 --- a/node/Network.hpp +++ b/node/Network.hpp @@ -34,6 +34,7 @@ #include <set> #include <map> #include <vector> +#include <algorithm> #include <stdexcept> #include "Constants.hpp" @@ -185,15 +186,15 @@ public: struct Rate { Rate() {} - Rate(int32_t pl,int32_t maxb,int32_t acc) + Rate(uint32_t pl,uint32_t maxb,uint32_t acc) { preload = pl; maxBalance = maxb; accrual = acc; } - int32_t preload; - int32_t maxBalance; - int32_t accrual; + uint32_t preload; + uint32_t maxBalance; + uint32_t accrual; }; MulticastRates() {} @@ -243,13 +244,13 @@ public: for(char *f=Utils::stok(tmp,",",&saveptr);(f);f=Utils::stok((char *)0,",",&saveptr)) { switch(fn++) { case 0: - r.preload = (int32_t)Utils::hexStrToLong(f); + r.preload = (uint32_t)Utils::hexStrToULong(f); break; case 1: - r.maxBalance = (int32_t)Utils::hexStrToLong(f); + r.maxBalance = (uint32_t)Utils::hexStrToULong(f); break; case 2: - r.accrual = (int32_t)Utils::hexStrToLong(f); + r.accrual = (uint32_t)Utils::hexStrToULong(f); break; } } @@ -579,7 +580,7 @@ public: MulticastRates::Rate r(_mcRates.get(mg)); bal = _multicastRateAccounts.insert(std::pair< std::pair<Address,MulticastGroup>,BandwidthAccount >(k,BandwidthAccount(r.preload,r.maxBalance,r.accrual))).first; } - return (bal->second.update((int32_t)bytes) >= 0); + return bal->second.deduct(bytes); } private: |