]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[2635] Make idle timeout configurable
authorThomas Markwalder <tmark@isc.org>
Wed, 16 Nov 2022 17:07:14 +0000 (12:07 -0500)
committerThomas Markwalder <tmark@isc.org>
Wed, 16 Nov 2022 17:07:14 +0000 (12:07 -0500)
modified:
    mt_tcp_listener_mgr.cc
    mt_tcp_listener_mgr.h
    tcp_listener.h
    tests/mt_tcp_listener_mgr_unittests.cc

src/lib/tcp/mt_tcp_listener_mgr.cc
src/lib/tcp/mt_tcp_listener_mgr.h
src/lib/tcp/tcp_listener.h
src/lib/tcp/tests/mt_tcp_listener_mgr_unittests.cc

index 25830f43a7484dd74f1886a85b217f4da83ac623..66a27e4e985d15085f4d52d37e3ed284257764f5 100644 (file)
@@ -31,7 +31,8 @@ MtTcpListenerMgr::MtTcpListenerMgr(TcpListenerFactory listener_factory,
     : listener_factory_(listener_factory),
       address_(address), port_(port), thread_io_service_(), tcp_listener_(),
       thread_pool_size_(thread_pool_size), thread_pool_(),
-      tls_context_(context), connection_filter_(connection_filter) {
+      tls_context_(context), connection_filter_(connection_filter),
+      idle_timeout_(TCP_IDLE_CONNECTION_TIMEOUT) {
 }
 
 MtTcpListenerMgr::~MtTcpListenerMgr() {
@@ -56,9 +57,11 @@ MtTcpListenerMgr::start() {
         thread_io_service_.reset(new IOService());
 
         // Create a new TCPListener derivation using the factory.
-        tcp_listener_ = listener_factory_(*thread_io_service_, address_,
-                                          port_, tls_context_,
-                                          TcpListener::IdleTimeout(TCP_IDLE_CONNECTION_TIMEOUT),
+        tcp_listener_ = listener_factory_(*thread_io_service_,
+                                          address_,
+                                          port_,
+                                          tls_context_,
+                                          idle_timeout_,
                                           connection_filter_);
 
         // Create the thread pool with immediate start.
index 41cc1e1e426df74b428a2cf0ff6d2403c6692e8e..fe7780f68fdafa9b0d0041654f786091d218619e 100644 (file)
@@ -18,7 +18,7 @@ namespace isc {
 namespace tcp {
 
 /// @brief Default connection idle timeout in milliseconds.
-const long TCP_IDLE_CONNECTION_TIMEOUT = 10000;
+const long TCP_IDLE_CONNECTION_TIMEOUT = 300 * 1000;
 
 /// @brief Defines a factory function for creating TcpListeners.
 typedef std::function<
@@ -158,6 +158,17 @@ public:
         return(tcp_listener_);
     }
 
+    /// @brief Sets the idle time per connection.
+    ///
+    /// @param timeout Amount of time in milliseconds
+    void setIdleTimeout(long milliseconds) {
+        idle_timeout_ = TcpListener::IdleTimeout(milliseconds);
+    }
+
+    long getIdleTimeout() {
+        return (idle_timeout_.value_);
+    }
+
 private:
     /// @brief Factory for creating TcpListener instances.
     TcpListenerFactory listener_factory_;
@@ -185,6 +196,10 @@ private:
 
     /// @brief Callback the listener may use to reject connections during acceptance.
     TcpConnectionFilterCallback connection_filter_;
+
+    /// @brief Time in milliseconds that a connection can remain idle before
+    /// it is closed.
+    TcpListener::IdleTimeout idle_timeout_;
 };
 
 /// @brief Defines a shared pointer to MtTcpListenerMgr.
index 67daf41e9f15178390ba4dde63a00c6286bd9ee7..20d88762ff9fae6e55cd48f1d0aa4013432168fb 100644 (file)
@@ -90,6 +90,11 @@ public:
     /// @brief Returns local port on which server is listening.
     uint16_t getLocalPort() const;
 
+    /// @brief Returns the idle timeout (in milliseconds).
+    long getIdleTimeout() const {
+        return (idle_timeout_);
+    }
+
 protected:
 
     /// @brief Creates @ref TcpConnection instance and adds it to the
index 4613ed2859c9ad812a6e1584f474419565559534..9e7f8e85c84eaf9e30ed8948297212bbc9d3fe57 100644 (file)
@@ -959,4 +959,27 @@ TEST_F(MtTcpListenerMgrTest, tls) {
     EXPECT_TRUE(mt_listener_mgr_->isStopped());
 }
 
+/// Verifies that idle timeout can be passed down to the internal listener.
+TEST_F(MtTcpListenerMgrTest, idleTimeout) {
+    // Create an  MtTcpListenerMgr.
+    createMtTcpListenerMgr(1, std::bind(&MtTcpListenerMgrTest::synchronizedCommandHandler,
+                                        this, ph::_1));
+    // Verify the defualt timeout value.
+    EXPECT_EQ(TCP_IDLE_CONNECTION_TIMEOUT, mt_listener_mgr_->getIdleTimeout());
+
+    // Set a new timeout value.
+    mt_listener_mgr_->setIdleTimeout(200);
+    EXPECT_EQ(200, mt_listener_mgr_->getIdleTimeout());
+
+    // Start the listener, which should instantiate the internal listener.
+    ASSERT_NO_THROW_LOG(mt_listener_mgr_->start());
+    ASSERT_TRUE(mt_listener_mgr_->isRunning());
+
+    // Verify the internal listener's timeout value.
+    auto tcp_listener = mt_listener_mgr_->getTcpListener();
+    ASSERT_TRUE(tcp_listener);
+    EXPECT_EQ(200, tcp_listener->getIdleTimeout());
+}
+
+
 } // end of anonymous namespace