diff --git a/node/Constants.hpp b/node/Constants.hpp index 20ec0a6b5..f92540d67 100644 --- a/node/Constants.hpp +++ b/node/Constants.hpp @@ -284,22 +284,22 @@ error_no_ZT_ARCH_defined; /** * Default bytes per second limit for multicasts per peer on a network */ -#define ZT_MULTICAST_DEFAULT_BYTES_PER_SECOND 50.0 +#define ZT_MULTICAST_DEFAULT_BYTES_PER_SECOND 100.0 /** * Default balance preload for multicast rate limiters on a network */ -#define ZT_MULTICAST_DEFAULT_RATE_PRELOAD 20000.0 +#define ZT_MULTICAST_DEFAULT_RATE_PRELOAD 25000.0 /** * Default maximum balance for multicast rate limiters */ -#define ZT_MULTICAST_DEFAULT_RATE_MAX_BALANCE 20000.0 +#define ZT_MULTICAST_DEFAULT_RATE_MAX_BALANCE 25000.0 /** * Default minimum balance for multicast rate limiters (max debt) */ -#define ZT_MULTICAST_DEFAULT_RATE_MIN_BALANCE -10000.0 +#define ZT_MULTICAST_DEFAULT_RATE_MIN_BALANCE -5000.0 /** * Delay between scans of the topology active peer DB for peers that need ping diff --git a/node/RateLimiter.hpp b/node/RateLimiter.hpp index 69d47d0a5..e5403717f 100644 --- a/node/RateLimiter.hpp +++ b/node/RateLimiter.hpp @@ -135,6 +135,15 @@ public: return allow; } + /** + * @return Current balance + */ + inline double balance() const + throw() + { + return _balance; + } + private: double _lastTime; double _balance; diff --git a/selftest.cpp b/selftest.cpp index cf4635b75..0792c1eea 100644 --- a/selftest.cpp +++ b/selftest.cpp @@ -33,6 +33,7 @@ #include #include +#include "node/Constants.hpp" #include "node/InetAddress.hpp" #include "node/EllipticCurveKey.hpp" #include "node/EllipticCurveKeyPair.hpp" @@ -46,6 +47,7 @@ #include "node/Condition.hpp" #include "node/NodeConfig.hpp" #include "node/Dictionary.hpp" +#include "node/RateLimiter.hpp" #include @@ -366,6 +368,32 @@ static int testOther() return 0; } +static int testRateLimiter() +{ + RateLimiter limiter; + RateLimiter::Limit limit; + + std::cout << "[ratelimiter] preload: 10000.0, rate: 1000.0/sec, max: 15000.0, min: -7500.0" << std::endl; + limit.bytesPerSecond = 1000.0; + limit.maxBalance = 15000.0; + limit.minBalance = -7500.0; + limiter.init(10000.0); + for(int i=0;i<25;++i) { + Thread::sleep(100); + std::cout << "[ratelimiter] delayed 0.1s, gate(1000.0): " << (limiter.gate(limit,1000.0) ? "OK" : "BLOCK"); + std::cout << " (new balance afterwords: " << limiter.balance() << ")" << std::endl; + } + std::cout << "[ratelimiter] delaying 15s..." << std::endl; + Thread::sleep(15000); + for(int i=0;i<20;++i) { + Thread::sleep(1000); + std::cout << "[ratelimiter] delayed 1s, gate(2000.0): " << (limiter.gate(limit,2000.0) ? "OK" : "BLOCK"); + std::cout << " (new balance afterwords: " << limiter.balance() << ")" << std::endl; + } + + return 0; +} + int main(int argc,char **argv) { int r = 0; @@ -377,6 +405,7 @@ int main(int argc,char **argv) r |= testPacket(); r |= testOther(); r |= testIdentity(); + r |= testRateLimiter(); if (r) std::cout << std::endl << "SOMETHING FAILED!" << std::endl;