summaryrefslogtreecommitdiff
path: root/accel-pptpd/radius/acct.c
diff options
context:
space:
mode:
authorDmitry Kozlov <xeb@mail.ru>2010-11-15 19:35:33 +0300
committerDmitry Kozlov <xeb@mail.ru>2010-11-15 20:43:28 +0300
commit1cfae5217776e8f527b9529e19e22730c5977d66 (patch)
tree0ea080fedbda83eb2b7bf82fe23168388262dbfd /accel-pptpd/radius/acct.c
parentb85986e561d4fc6532c0666e38014b51b66f485a (diff)
downloadaccel-ppp-xebd-1cfae5217776e8f527b9529e19e22730c5977d66.tar.gz
accel-ppp-xebd-1cfae5217776e8f527b9529e19e22730c5977d66.zip
log: implemented log_tcp logging target which sends logs to specified host over tcp/ip
radius: implemented accounting interim update timeout
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 f8cfee7..e056182 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;