changed how retransmissions of connectivity checks are sent

This commit is contained in:
Tobias Brunner 2008-04-07 11:26:15 +00:00
parent 852abcd3a3
commit b03c1d415c
1 changed files with 10 additions and 16 deletions

View File

@ -29,16 +29,16 @@
#include <encoding/payloads/endpoint_notify.h> #include <encoding/payloads/endpoint_notify.h>
/* base timeout /* base timeout
* the check interval is ME_INTERVAL * active checklists (N) */ * the check interval is ME_INTERVAL */
#define ME_INTERVAL 20 /* ms */ #define ME_INTERVAL 25 /* ms */
/* retransmission timeout is first ME_RTO_B * N for ME_BOOST retransmissions /* retransmission timeout is first ME_INTERVAL for ME_BOOST retransmissions
* then gets reduced to ME_RTO * N. */ * then gets reduced to ME_INTERVAL * ME_RETRANS_BASE ^ (sent retransmissions - ME_BOOST). */
/* number of initial retransmissions sent in short interval */ /* number of initial retransmissions sent in short interval */
#define ME_BOOST 2 #define ME_BOOST 2
/* retransmission timeout */ /* base for retransmissions */
#define ME_RTO 100 /* ms */ #define ME_RETRANS_BASE 1.8
/* max number of retransmissions */ /* max number of retransmissions */
#define ME_MAX_RETRANS 9 #define ME_MAX_RETRANS 14
typedef struct private_connect_manager_t private_connect_manager_t; typedef struct private_connect_manager_t private_connect_manager_t;
@ -996,18 +996,12 @@ static void queue_retransmission(private_connect_manager_t *this, check_list_t *
retransmit_data_t *data = retransmit_data_create(this, chunk_clone(checklist->connect_id), pair->id); retransmit_data_t *data = retransmit_data_create(this, chunk_clone(checklist->connect_id), pair->id);
job_t *job = (job_t*)callback_job_create((callback_job_cb_t)retransmit, data, (callback_job_cleanup_t)retransmit_data_destroy, NULL); job_t *job = (job_t*)callback_job_create((callback_job_cb_t)retransmit, data, (callback_job_cleanup_t)retransmit_data_destroy, NULL);
/* u_int32_t rto = ME_INTERVAL;
u_int32_t NW = 0;
checklist->pairs->invoke_function(checklist->pairs, (linked_list_invoke_t)count_waiting_pairs, &NW);
u_int32_t rto = max(ME_INTERVAL * N * (NW + 1), ME_RTO_MIN);
*/
u_int32_t N = this->checklists->get_count(this->checklists);
u_int32_t rto = ME_INTERVAL * N;
if (pair->retransmitted > ME_BOOST) if (pair->retransmitted > ME_BOOST)
{ {
rto = ME_RTO * N; rto = (u_int32_t)(ME_INTERVAL * pow(ME_RETRANS_BASE, pair->retransmitted - ME_BOOST));
} }
DBG2(DBG_IKE, "retransmission of pair '%d' in %dms - %d active checklist(s)", pair->id, rto, N); DBG2(DBG_IKE, "retransmission %d of pair '%d' in %dms", pair->retransmitted, pair->id, rto);
charon->scheduler->schedule_job(charon->scheduler, (job_t*)job, rto); charon->scheduler->schedule_job(charon->scheduler, (job_t*)job, rto);
} }