]>
git.ipfire.org Git - thirdparty/strongswan.git/blob - src/libcharon/sa/task_manager.c
2 * Copyright (C) 2011-2023 Tobias Brunner
4 * Copyright (C) secunet Security Networks AG
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2 of the License, or (at your
9 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 #include "task_manager.h"
20 #include <sa/ikev1/task_manager_v1.h>
21 #include <sa/ikev2/task_manager_v2.h>
26 void retransmission_parse_default(retransmission_t
*settings
)
28 settings
->timeout
= lib
->settings
->get_double(lib
->settings
,
29 "%s.retransmit_timeout", RETRANSMIT_TIMEOUT
, lib
->ns
);
30 settings
->base
= lib
->settings
->get_double(lib
->settings
,
31 "%s.retransmit_base", RETRANSMIT_BASE
, lib
->ns
);
32 settings
->jitter
= min(lib
->settings
->get_int(lib
->settings
,
33 "%s.retransmit_jitter", 0, lib
->ns
), RETRANSMIT_JITTER_MAX
);
34 settings
->limit
= lib
->settings
->get_int(lib
->settings
,
35 "%s.retransmit_limit", 0, lib
->ns
) * 1000;
36 settings
->tries
= lib
->settings
->get_int(lib
->settings
,
37 "%s.retransmit_tries", RETRANSMIT_TRIES
, lib
->ns
);
39 if (settings
->base
> 1)
40 { /* based on 1000 * timeout * base^try */
41 settings
->max_tries
= log(UINT32_MAX
/
42 (1000.0 * settings
->timeout
))/
50 uint32_t retransmission_timeout(retransmission_t
*settings
, u_int
try,
53 double timeout
= UINT32_MAX
, max_jitter
;
55 if (!settings
->max_tries
|| try <= settings
->max_tries
)
57 timeout
= settings
->timeout
* 1000.0 * pow(settings
->base
, try);
61 timeout
= min(timeout
, settings
->limit
);
63 if (randomize
&& settings
->jitter
)
65 max_jitter
= (timeout
/ 100.0) * settings
->jitter
;
66 timeout
-= max_jitter
* (random() / (RAND_MAX
+ 1.0));
68 return (uint32_t)timeout
;
74 u_int
retransmission_timeout_total(retransmission_t
*settings
)
79 for (i
= 0; i
<= settings
->tries
; i
++)
81 total
+= retransmission_timeout(settings
, i
, FALSE
) / 1000.0;
89 task_manager_t
*task_manager_create(ike_sa_t
*ike_sa
)
91 switch (ike_sa
->get_version(ike_sa
))
95 return &task_manager_v1_create(ike_sa
)->task_manager
;
100 return &task_manager_v2_create(ike_sa
)->task_manager
;