mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-06-05 03:53:44 +02:00
Improved rate limit logic for QoS/ACK packets. Also reduced how often processBackgroundPathMeasurements() is called
This commit is contained in:
parent
7c53adbcfe
commit
6fddf31db3
4 changed files with 27 additions and 29 deletions
|
@ -289,7 +289,7 @@
|
||||||
* CUTOFF_LIMIT times per CUTOFF_TIME milliseconds per peer to prevent
|
* CUTOFF_LIMIT times per CUTOFF_TIME milliseconds per peer to prevent
|
||||||
* this from being useful for DOS amplification attacks.
|
* this from being useful for DOS amplification attacks.
|
||||||
*/
|
*/
|
||||||
#define ZT_PATH_QOS_ACK_CUTOFF_LIMIT 16
|
#define ZT_PATH_QOS_ACK_CUTOFF_LIMIT 128
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Path choice history window size. This is used to keep track of which paths were
|
* Path choice history window size. This is used to keep track of which paths were
|
||||||
|
@ -372,11 +372,6 @@
|
||||||
*/
|
*/
|
||||||
#define ZT_PATH_MAX_OUTSTANDING_QOS_RECORDS 128
|
#define ZT_PATH_MAX_OUTSTANDING_QOS_RECORDS 128
|
||||||
|
|
||||||
/**
|
|
||||||
* How often we check the age of QoS records
|
|
||||||
*/
|
|
||||||
#define ZT_PATH_QOS_RECORD_PURGE_INTERVAL 1000
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Timeout for QoS records
|
* Timeout for QoS records
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -566,9 +566,9 @@ public:
|
||||||
* @param now Current time
|
* @param now Current time
|
||||||
*/
|
*/
|
||||||
inline void processBackgroundPathMeasurements(int64_t now, const int64_t peerId) {
|
inline void processBackgroundPathMeasurements(int64_t now, const int64_t peerId) {
|
||||||
Mutex::Lock _l(_statistics_m);
|
|
||||||
// Compute path stability
|
// Compute path stability
|
||||||
if (now - _lastPathQualityComputeTime > ZT_PATH_QUALITY_COMPUTE_INTERVAL) {
|
if (now - _lastPathQualityComputeTime > ZT_PATH_QUALITY_COMPUTE_INTERVAL) {
|
||||||
|
Mutex::Lock _l(_statistics_m);
|
||||||
_lastPathQualityComputeTime = now;
|
_lastPathQualityComputeTime = now;
|
||||||
address().toString(_addrString);
|
address().toString(_addrString);
|
||||||
_meanThroughput = _throughputSamples->mean();
|
_meanThroughput = _throughputSamples->mean();
|
||||||
|
@ -593,10 +593,8 @@ public:
|
||||||
_lastComputedStability = pdv_contrib + latency_contrib + throughput_disturbance_contrib;
|
_lastComputedStability = pdv_contrib + latency_contrib + throughput_disturbance_contrib;
|
||||||
_lastComputedStability *= 1 - _packetErrorRatio;
|
_lastComputedStability *= 1 - _packetErrorRatio;
|
||||||
_qualitySamples->push(_lastComputedStability);
|
_qualitySamples->push(_lastComputedStability);
|
||||||
}
|
|
||||||
// Prevent QoS records from sticking around for too long
|
// Prevent QoS records from sticking around for too long
|
||||||
if (now - _lastQoSRecordPurge > ZT_PATH_QOS_RECORD_PURGE_INTERVAL)
|
|
||||||
{
|
|
||||||
std::map<uint64_t,uint64_t>::iterator it = _outQoSRecords.begin();
|
std::map<uint64_t,uint64_t>::iterator it = _outQoSRecords.begin();
|
||||||
while (it != _outQoSRecords.end()) {
|
while (it != _outQoSRecords.end()) {
|
||||||
// Time since egress of tracked packet
|
// Time since egress of tracked packet
|
||||||
|
|
|
@ -24,7 +24,6 @@
|
||||||
* of your own application.
|
* of your own application.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "../version.h"
|
#include "../version.h"
|
||||||
#include "Constants.hpp"
|
#include "Constants.hpp"
|
||||||
#include "Peer.hpp"
|
#include "Peer.hpp"
|
||||||
|
@ -55,6 +54,8 @@ Peer::Peer(const RuntimeEnvironment *renv,const Identity &myIdentity,const Ident
|
||||||
_lastCredentialsReceived(0),
|
_lastCredentialsReceived(0),
|
||||||
_lastTrustEstablishedPacketReceived(0),
|
_lastTrustEstablishedPacketReceived(0),
|
||||||
_lastSentFullHello(0),
|
_lastSentFullHello(0),
|
||||||
|
_lastACKWindowReset(0),
|
||||||
|
_lastQoSWindowReset(0),
|
||||||
_vProto(0),
|
_vProto(0),
|
||||||
_vMajor(0),
|
_vMajor(0),
|
||||||
_vMinor(0),
|
_vMinor(0),
|
||||||
|
|
|
@ -523,30 +523,34 @@ public:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Rate limit gate for VERB_QOS_MEASUREMENT
|
|
||||||
*/
|
|
||||||
inline bool rateGateQoS(const int64_t now)
|
|
||||||
{
|
|
||||||
if ((now - _lastQoSReceive) <= ZT_PATH_QOS_ACK_CUTOFF_TIME)
|
|
||||||
++_QoSCutoffCount;
|
|
||||||
else _QoSCutoffCount = 0;
|
|
||||||
_lastQoSReceive = now;
|
|
||||||
return (_QoSCutoffCount < ZT_PATH_QOS_ACK_CUTOFF_LIMIT);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rate limit gate for VERB_ACK
|
* Rate limit gate for VERB_ACK
|
||||||
*/
|
*/
|
||||||
inline bool rateGateACK(const int64_t now)
|
inline bool rateGateACK(const int64_t now)
|
||||||
{
|
{
|
||||||
if ((now - _lastACKReceive) <= ZT_PATH_QOS_ACK_CUTOFF_TIME)
|
if ((now - _lastACKWindowReset) >= ZT_PATH_QOS_ACK_CUTOFF_TIME) {
|
||||||
|
_lastACKWindowReset = now;
|
||||||
|
_ACKCutoffCount = 0;
|
||||||
|
} else {
|
||||||
++_ACKCutoffCount;
|
++_ACKCutoffCount;
|
||||||
else _ACKCutoffCount = 0;
|
}
|
||||||
_lastACKReceive = now;
|
|
||||||
return (_ACKCutoffCount < ZT_PATH_QOS_ACK_CUTOFF_LIMIT);
|
return (_ACKCutoffCount < ZT_PATH_QOS_ACK_CUTOFF_LIMIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rate limit gate for VERB_QOS_MEASUREMENT
|
||||||
|
*/
|
||||||
|
inline bool rateGateQoS(const int64_t now)
|
||||||
|
{
|
||||||
|
if ((now - _lastQoSWindowReset) >= ZT_PATH_QOS_ACK_CUTOFF_TIME) {
|
||||||
|
_lastQoSWindowReset = now;
|
||||||
|
_QoSCutoffCount = 0;
|
||||||
|
} else {
|
||||||
|
++_QoSCutoffCount;
|
||||||
|
}
|
||||||
|
return (_QoSCutoffCount < ZT_PATH_QOS_ACK_CUTOFF_LIMIT);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Serialize a peer for storage in local cache
|
* Serialize a peer for storage in local cache
|
||||||
*
|
*
|
||||||
|
@ -644,10 +648,10 @@ private:
|
||||||
int64_t _lastComRequestSent;
|
int64_t _lastComRequestSent;
|
||||||
int64_t _lastCredentialsReceived;
|
int64_t _lastCredentialsReceived;
|
||||||
int64_t _lastTrustEstablishedPacketReceived;
|
int64_t _lastTrustEstablishedPacketReceived;
|
||||||
int64_t _lastQoSReceive;
|
|
||||||
int64_t _lastACKReceive;
|
|
||||||
int64_t _lastSentFullHello;
|
int64_t _lastSentFullHello;
|
||||||
int64_t _lastPathPrune;
|
int64_t _lastPathPrune;
|
||||||
|
int64_t _lastACKWindowReset;
|
||||||
|
int64_t _lastQoSWindowReset;
|
||||||
|
|
||||||
uint16_t _vProto;
|
uint16_t _vProto;
|
||||||
uint16_t _vMajor;
|
uint16_t _vMajor;
|
||||||
|
|
Loading…
Add table
Reference in a new issue