diff options
Diffstat (limited to 'src/charon/config/configuration.c')
-rwxr-xr-x | src/charon/config/configuration.c | 50 |
1 files changed, 10 insertions, 40 deletions
diff --git a/src/charon/config/configuration.c b/src/charon/config/configuration.c index 39fc4d922..f43afdaa4 100755 --- a/src/charon/config/configuration.c +++ b/src/charon/config/configuration.c @@ -33,25 +33,11 @@ #define HALF_OPEN_IKE_SA_TIMEOUT 30000 /** - * The retransmission algorithm uses a multiple sequences. - * Each sequence contains multiple retransmits. Those retransmits - * are sent using a exponential backoff algorithm. The sequences - * are retried with linear timings: + * Retransmission uses a backoff algorithm. The timeout is calculated using + * TIMEOUT * (BASE ** try). + * When try reaches TRIES, retransmission is given up. * - * <------sequence---------><------sequence---------><------sequence---------> - * - * T-R---R-----R---------R--R-R---R-----R---------R--R-R---R-----R---------R--X - * - * T = first transmit - * R = retransmit - * X = giving up, peer is dead - * - * if (retransmit >= TRIES * sequences) - * => abort - * TIMEOUT * (BASE ** (try % TRIES)) - * - * Using an initial TIMEOUT of 4s, a BASE of 1.8, 5 TRIES - * per sequnce and 3 sequences, this gives us: + * Using an initial TIMEOUT of 4s, a BASE of 1.8, and 5 TRIES gives us: * * | relative | absolute * --------------------------------------------------------- @@ -61,22 +47,8 @@ * 4s * (1.8 ** (3 % 5)) = 23s 47s * 4s * (1.8 ** (4 % 5)) = 42s 89s * 4s * (1.8 ** (5 % 5)) = 76s 165s - * 4s * (1.8 ** (6 % 5)) = 4s 169s - * 4s * (1.8 ** (7 % 5)) = 7s 176s - * 4s * (1.8 ** (8 % 5)) = 13s 189s - * 4s * (1.8 ** (9 % 5)) = 23s 212s - * 4s * (1.8 ** (10 % 5)) = 42s 254s - * 4s * (1.8 ** (11 % 5)) = 76s 330s - * 4s * (1.8 ** (12 % 5)) = 4s 334 - * 4s * (1.8 ** (13 % 5)) = 7s 341s - * 4s * (1.8 ** (14 % 5)) = 13s 354s - * 4s * (1.8 ** (15 % 5)) = 23s 377s - * 4s * (1.8 ** (16 % 5)) = 42s 419s - * 4s * (1.8 ** (17 % 5)) = 76s 495s * - * If the configuration uses 1 sequence, the peer is considered dead - * after 2min 45s when no reply comes in. If it uses 3 sequences, after - * 8min 15s the DPD action is executed... + * The peer is considered dead after 2min 45s when no reply comes in. */ /** @@ -119,17 +91,15 @@ struct private_configuration_t { * Implementation of configuration_t.get_retransmit_timeout. */ static u_int32_t get_retransmit_timeout (private_configuration_t *this, - u_int32_t retransmit_count, - u_int32_t max_sequences) + u_int32_t retransmit_count) { - if (max_sequences != 0 && - retransmit_count >= RETRANSMIT_TRIES * max_sequences) + if (retransmit_count > RETRANSMIT_TRIES) { /* give up */ return 0; } - return (u_int32_t)(RETRANSMIT_TIMEOUT * - pow(RETRANSMIT_BASE, retransmit_count % RETRANSMIT_TRIES)); + return (u_int32_t) + (RETRANSMIT_TIMEOUT * pow(RETRANSMIT_BASE, retransmit_count)); } /** @@ -165,7 +135,7 @@ configuration_t *configuration_create() /* public functions */ this->public.destroy = (void(*)(configuration_t*))destroy; - this->public.get_retransmit_timeout = (u_int32_t (*) (configuration_t*,u_int32_t,u_int32_t))get_retransmit_timeout; + this->public.get_retransmit_timeout = (u_int32_t (*) (configuration_t*,u_int32_t))get_retransmit_timeout; this->public.get_half_open_ike_sa_timeout = (u_int32_t (*) (configuration_t*)) get_half_open_ike_sa_timeout; this->public.get_keepalive_interval = (u_int32_t (*) (configuration_t*)) get_keepalive_interval; |