From 68240908bca991b0d091c51bbb2c6d0dc403518b Mon Sep 17 00:00:00 2001 From: John Sharratt Date: Sat, 1 Jul 2017 10:21:14 +0200 Subject: [PATCH] Separated the TTL so that invalid sessions can be expired faster than valid sessions (DDOS protection and better error handling) --- src/ndppd.cc | 5 +++++ src/proxy.cc | 12 +++++++++++- src/proxy.h | 6 +++++- src/session.cc | 4 ++-- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/ndppd.cc b/src/ndppd.cc index cb5450c..80dc6d4 100644 --- a/src/ndppd.cc +++ b/src/ndppd.cc @@ -169,6 +169,11 @@ static bool configure(ptr& cf) pr->ttl(30000); else pr->ttl(*x_cf); + + if (!(x_cf = pr_cf->find("deadtime"))) + pr->deadtime(pr->ttl()); + else + pr->deadtime(*x_cf); if (!(x_cf = pr_cf->find("timeout"))) pr->timeout(500); diff --git a/src/proxy.cc b/src/proxy.cc index 2b6d1c9..da71c36 100644 --- a/src/proxy.cc +++ b/src/proxy.cc @@ -30,7 +30,7 @@ NDPPD_NS_BEGIN std::list > proxy::_list; proxy::proxy() : - _router(true), _ttl(30000), _timeout(500), _autowire(false) + _router(true), _ttl(30000), _deadtime(3000), _timeout(500), _autowire(false) { } @@ -197,6 +197,16 @@ void proxy::ttl(int val) _ttl = (val >= 0) ? val : 30000; } +int proxy::deadtime() const +{ + return _deadtime; +} + +void proxy::deadtime(int val) +{ + _deadtime = (val >= 0) ? val : 30000; +} + int proxy::timeout() const { return _timeout; diff --git a/src/proxy.h b/src/proxy.h index 9baf720..829321c 100644 --- a/src/proxy.h +++ b/src/proxy.h @@ -60,6 +60,10 @@ public: int ttl() const; void ttl(int val); + + int deadtime() const; + + void deadtime(int val); private: static std::list > _list; @@ -76,7 +80,7 @@ private: bool _autowire; - int _ttl, _timeout; + int _ttl, _deadtime, _timeout; proxy(); }; diff --git a/src/session.cc b/src/session.cc index 85d0f75..b3c4802 100644 --- a/src/session.cc +++ b/src/session.cc @@ -45,7 +45,7 @@ void session::update_all(int elapsed_time) case session::WAITING: logger::debug() << "session is now invalid"; se->_status = session::INVALID; - se->_ttl = se->_pr->ttl(); + se->_ttl = se->_pr->deadtime(); break; default: @@ -81,7 +81,7 @@ ptr session::create(const ptr& pr, const address& saddr, logger::debug() << "session::create() pr=" << logger::format("%x", (proxy* )pr) << ", saddr=" << saddr - << ", daddr=" << daddr << ", taddr=" << taddr << ", autowire=" << (_autowire ? "yes" : "no") << " =" << logger::format("%x", (session* )se); + << ", daddr=" << daddr << ", taddr=" << taddr << ", autowire=" << (auto_wire == true ? "yes" : "no") << " =" << logger::format("%x", (session* )se); return se; }