diff options
| author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2015-09-04 13:53:48 -0700 |
|---|---|---|
| committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2015-09-04 13:53:48 -0700 |
| commit | d1341578d8dc7fd3e39b24dde1ac2dae4da7a632 (patch) | |
| tree | 5d47db5666618eabd2317f6746640d11f7586192 /node/Network.cpp | |
| parent | 7b8ce1605781f14d909e0aa099455b86d738c60a (diff) | |
| download | infinitytier-d1341578d8dc7fd3e39b24dde1ac2dae4da7a632.tar.gz infinitytier-d1341578d8dc7fd3e39b24dde1ac2dae4da7a632.zip | |
... and another one!
Diffstat (limited to 'node/Network.cpp')
| -rw-r--r-- | node/Network.cpp | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/node/Network.cpp b/node/Network.cpp index 8317cad9..b0c2627b 100644 --- a/node/Network.cpp +++ b/node/Network.cpp @@ -389,22 +389,34 @@ void Network::learnBridgeRoute(const MAC &mac,const Address &addr) Mutex::Lock _l(_lock); _remoteBridgeRoutes[mac] = addr; - // If _remoteBridgeRoutes exceeds sanity limit, trim worst offenders until below -- denial of service circuit breaker + // Anti-DOS circuit breaker to prevent nodes from spamming us with absurd numbers of bridge routes while (_remoteBridgeRoutes.size() > ZT_MAX_BRIDGE_ROUTES) { - std::map<Address,unsigned long> counts; + Hashtable< Address,unsigned long > counts; Address maxAddr; unsigned long maxCount = 0; - for(std::map<MAC,Address>::iterator br(_remoteBridgeRoutes.begin());br!=_remoteBridgeRoutes.end();++br) { - unsigned long c = ++counts[br->second]; - if (c > maxCount) { - maxCount = c; - maxAddr = br->second; + + MAC *m = (MAC *)0; + Address *a = (Address *)0; + + // Find the address responsible for the most entries + { + Hashtable<MAC,Address>::Iterator i(_remoteBridgeRoutes); + while (i.next(m,a)) { + const unsigned long c = ++counts[*a]; + if (c > maxCount) { + maxCount = c; + maxAddr = *a; + } } } - for(std::map<MAC,Address>::iterator br(_remoteBridgeRoutes.begin());br!=_remoteBridgeRoutes.end();) { - if (br->second == maxAddr) - _remoteBridgeRoutes.erase(br++); - else ++br; + + // Kill this address from our table, since it's most likely spamming us + { + Hashtable<MAC,Address>::Iterator i(_remoteBridgeRoutes); + while (i.next(m,a)) { + if (*a == maxAddr) + _remoteBridgeRoutes.erase(*m); + } } } } |
