From 29936626b2d206db1b3f7d4dcf2fbd0ee62d2e8c Mon Sep 17 00:00:00 2001 From: Max Lv Date: Sat, 12 Oct 2019 17:13:28 +0800 Subject: [PATCH] Refine the timeout logic --- src/server.c | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/src/server.c b/src/server.c index 576da899..43acc69c 100644 --- a/src/server.c +++ b/src/server.c @@ -74,10 +74,6 @@ #define MAX_FRAG 1 #endif -#ifndef FRAG_TIMEOUT -#define FRAG_TIMEOUT 0.5f -#endif - #ifdef USE_NFCONNTRACK_TOS #ifndef MARK_MAX_PACKET @@ -710,11 +706,8 @@ server_recv_cb(EV_P_ ev_io *w, int revents) buf = remote->buf; // Only timer the watcher if a valid connection is established - ev_timer_again(EV_A_ & server->recv_ctx->watcher); - } else if (server->stage == STAGE_INIT && server->frag > 0) { - - // reset the timer for fragment request - ev_timer_set(&server->recv_ctx->watcher, MAX_REQUEST_TIMEOUT, MAX_REQUEST_TIMEOUT); + int timeout = max(MIN_TCP_IDLE_TIMEOUT, server->listen_ctx->timeout); + ev_timer_set(&server->recv_ctx->watcher, timeout, timeout); ev_timer_again(EV_A_ & server->recv_ctx->watcher); } @@ -754,8 +747,6 @@ server_recv_cb(EV_P_ ev_io *w, int revents) return; } else if (err == CRYPTO_NEED_MORE) { if (server->stage != STAGE_STREAM) { - ev_timer_set(&server->recv_ctx->watcher, FRAG_TIMEOUT, FRAG_TIMEOUT); - ev_timer_again(EV_A_ & server->recv_ctx->watcher); if (server->frag > MAX_FRAG) { report_addr(server->fd, "malicious fragmentation"); stop_server(EV_A_ server); @@ -1123,6 +1114,8 @@ remote_recv_cb(EV_P_ ev_io *w, int revents) return; } + int timeout = max(MIN_TCP_IDLE_TIMEOUT, server->listen_ctx->timeout); + ev_timer_set(&server->recv_ctx->watcher, timeout, timeout); ev_timer_again(EV_A_ & server->recv_ctx->watcher); ssize_t r = recv(remote->fd, server->buf->data, SOCKET_BUF_SIZE, 0); @@ -1403,16 +1396,12 @@ new_server(int fd, listen_ctx_t *listener) crypto->ctx_init(crypto->cipher, server->e_ctx, 1); crypto->ctx_init(crypto->cipher, server->d_ctx, 0); - int request_timeout = min(MAX_REQUEST_TIMEOUT, listener->timeout) - + rand() % MAX_REQUEST_TIMEOUT; - - int repeat_interval = max(MIN_TCP_IDLE_TIMEOUT, listener->timeout) - + rand() % listener->timeout; + int request_timeout = min(MAX_REQUEST_TIMEOUT, listener->timeout); ev_io_init(&server->recv_ctx->io, server_recv_cb, fd, EV_READ); ev_io_init(&server->send_ctx->io, server_send_cb, fd, EV_WRITE); ev_timer_init(&server->recv_ctx->watcher, server_timeout_cb, - request_timeout, repeat_interval); + request_timeout, request_timeout); cork_dllist_add(&connections, &server->entries);