summaryrefslogtreecommitdiff
path: root/accel-pptpd/radius/acct.c
diff options
context:
space:
mode:
Diffstat (limited to 'accel-pptpd/radius/acct.c')
-rw-r--r--accel-pptpd/radius/acct.c39
1 files changed, 30 insertions, 9 deletions
diff --git a/accel-pptpd/radius/acct.c b/accel-pptpd/radius/acct.c
index f8cfee7a..e0561822 100644
--- a/accel-pptpd/radius/acct.c
+++ b/accel-pptpd/radius/acct.c
@@ -112,11 +112,30 @@ static int rad_acct_read(struct triton_md_handler_t *h)
static void rad_acct_timeout(struct triton_timer_t *t)
{
struct rad_req_t *req = container_of(t, typeof(*req), timeout);
+ time_t ts, dt;
+
+ time(&ts);
+
+ dt = ts - req->rpd->acct_timestamp;
+
+ if (dt > conf_acct_timeout) {
+ log_ppp_warn("radius: acct: no response, terminating session...\n");
+ ppp_terminate(req->rpd->ppp, 0, TERM_NAS_ERROR);
+ return;
+ }
+ if (dt > conf_acct_timeout / 2) {
+ req->timeout.period += 1000;
+ triton_timer_mod(&req->timeout, 0);
+ } else if (dt > conf_acct_timeout / 3) {
+ if (req->timeout.period != conf_timeout * 2000) {
+ req->timeout.period = conf_timeout * 2000;
+ triton_timer_mod(&req->timeout, 0);
+ }
+ }
- req->rpd->acct_delay_time += conf_timeout;
req->pack->id++;
- rad_packet_change_int(req->pack, "Acct-Delay-Time", req->rpd->acct_delay_time);
+ rad_packet_change_int(req->pack, "Acct-Delay-Time", dt);
req_set_RA(req, conf_acct_secret);
rad_req_send(req, conf_interim_verbose);
}
@@ -132,7 +151,7 @@ static void rad_acct_interim_update(struct triton_timer_t *t)
if (!rpd->acct_interim_interval)
return;
- rpd->acct_delay_time = 0;
+ time(&rpd->acct_timestamp);
rpd->acct_req->pack->id++;
rad_packet_change_val(rpd->acct_req->pack, "Acct-Status-Type", "Interim-Update");
@@ -146,6 +165,7 @@ static void rad_acct_interim_update(struct triton_timer_t *t)
int rad_acct_start(struct radius_pd_t *rpd)
{
int i;
+ time_t ts;
rpd->acct_req = rad_req_alloc(rpd, CODE_ACCOUNTING_REQUEST, rpd->ppp->username);
if (!rpd->acct_req) {
@@ -168,11 +188,11 @@ int rad_acct_start(struct radius_pd_t *rpd)
rpd->acct_req->reply = NULL;
}
- rpd->acct_delay_time = 0;
+ time(&rpd->acct_timestamp);
for (i = 0; i < conf_max_try; i++) {
- rad_packet_change_int(rpd->acct_req->pack, "Acct-Delay-Time", rpd->acct_delay_time);
- rpd->acct_delay_time += conf_timeout;
+ time(&ts);
+ rad_packet_change_int(rpd->acct_req->pack, "Acct-Delay-Time", ts - rpd->acct_timestamp);
if (req_set_RA(rpd->acct_req, conf_acct_secret))
goto out_err;
if (rad_req_send(rpd->acct_req, conf_verbose))
@@ -222,6 +242,7 @@ out_err:
void rad_acct_stop(struct radius_pd_t *rpd)
{
int i;
+ time_t ts;
if (rpd->acct_interim_timer.tpd)
triton_timer_del(&rpd->acct_interim_timer);
@@ -259,11 +280,11 @@ void rad_acct_stop(struct radius_pd_t *rpd)
rpd->acct_req->reply = NULL;
}
- rpd->acct_delay_time = 0;
+ time(&rpd->acct_timestamp);
for(i = 0; i < conf_max_try; i++) {
- rad_packet_change_int(rpd->acct_req->pack, "Acct-Delay-Time", rpd->acct_delay_time);
- rpd->acct_delay_time += conf_timeout;
+ time(&ts);
+ rad_packet_change_int(rpd->acct_req->pack, "Acct-Delay-Time", ts - rpd->acct_timestamp);
rpd->acct_req->pack->id++;
if (req_set_RA(rpd->acct_req, conf_acct_secret))
break;