From aaaca0421684adcfac2606edc93a9d041bf21fc2 Mon Sep 17 00:00:00 2001 From: Jon Sexson Date: Thu, 15 May 2014 13:21:00 +0300 Subject: [PATCH 4/4] Add init_delay option Add "init_delay" - a main config option specifying the initial delay before transmitting general requests, not affecting the CoA IRT. Specifying initial transmission delay lower than the current 1/3 of a second allows reducing overall request processing time for proxied requests on low-latency links. --- raddb/radiusd.conf.in | 11 +++++++++++ src/include/radiusd.h | 1 + src/main/mainconfig.c | 2 ++ src/main/process.c | 5 +++-- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/raddb/radiusd.conf.in b/raddb/radiusd.conf.in index 307ae10..256a286 100644 --- a/raddb/radiusd.conf.in +++ b/raddb/radiusd.conf.in @@ -172,6 +172,17 @@ pidfile = ${run_dir}/${name}.pid # max_request_time = 30 +# init_delay: Initial delay (in microseconds) before sending a request. +# +# Requests will be sent this amount of time after being triggered. E.g. a +# request to a proxy will be sent with this delay after receiving the +# original request. +# +# NOTE: This doesn't affect CoA request IRT (initial retransmit timeout), +# which is similar, but is specified using home server's coa.irt option. +# +init_delay = 333333 + # cleanup_delay: The time to wait (in seconds) before cleaning up # a reply which was sent to the NAS. # diff --git a/src/include/radiusd.h b/src/include/radiusd.h index ced55a6..3df1474 100644 --- a/src/include/radiusd.h +++ b/src/include/radiusd.h @@ -409,6 +409,7 @@ typedef struct main_config_t { char const *allow_vulnerable_openssl; int max_request_time; + int init_delay; int cleanup_delay; int max_requests; #ifdef DELETE_BLOCKED_REQUESTS diff --git a/src/main/mainconfig.c b/src/main/mainconfig.c index ace7a3c..38a9740 100644 --- a/src/main/mainconfig.c +++ b/src/main/mainconfig.c @@ -163,6 +163,7 @@ static const CONF_PARSER server_config[] = { { "radacctdir", PW_TYPE_STRING_PTR, 0, &radacct_dir, "${logdir}/radacct" }, { "panic_action", PW_TYPE_STRING_PTR, 0, &main_config.panic_action, NULL}, { "hostname_lookups", PW_TYPE_BOOLEAN, 0, &fr_dns_lookups, "no" }, + { "init_delay", PW_TYPE_INTEGER, 0, &main_config.init_delay, "333333" }, { "max_request_time", PW_TYPE_INTEGER, 0, &main_config.max_request_time, STRINGIFY(MAX_REQUEST_TIME) }, { "cleanup_delay", PW_TYPE_INTEGER, 0, &main_config.cleanup_delay, STRINGIFY(CLEANUP_DELAY) }, { "max_requests", PW_TYPE_INTEGER, 0, &main_config.max_requests, STRINGIFY(MAX_REQUESTS) }, @@ -913,6 +914,7 @@ do {\ fr_debug_flag = debug_flag; FR_INTEGER_COND_CHECK("max_request_time", main_config.max_request_time, (main_config.max_request_time != 0), 100); + FR_INTEGER_BOUND_CHECK("init_delay", main_config.init_delay, >=, 10); FR_INTEGER_BOUND_CHECK("reject_delay", main_config.reject_delay, <=, 10); FR_INTEGER_BOUND_CHECK("cleanup_delay", main_config.cleanup_delay, <=, 10); /* diff --git a/src/main/process.c b/src/main/process.c index f07d377..fe1c8c7 100644 --- a/src/main/process.c +++ b/src/main/process.c @@ -642,7 +642,8 @@ STATE_MACHINE_DECL(request_done) #endif when = now; - if (request->delay < (USEC / 3)) request->delay = USEC / 3; + if (request->delay < request->root->init_delay) + request->delay = request->root->init_delay; tv_add(&when, request->delay); request->delay += request->delay >> 1; if (request->delay > (10 * USEC)) request->delay = 10 * USEC; @@ -941,7 +942,7 @@ static void request_queue_or_run(UNUSED REQUEST *request, /* * (re) set the initial delay. */ - request->delay = USEC / 3; + request->delay = request->root->init_delay; gettimeofday(&when, NULL); tv_add(&when, request->delay); request->delay += request->delay >> 1; -- 1.9.2