From 1cfae5217776e8f527b9529e19e22730c5977d66 Mon Sep 17 00:00:00 2001 From: Dmitry Kozlov Date: Mon, 15 Nov 2010 19:35:33 +0300 Subject: log: implemented log_tcp logging target which sends logs to specified host over tcp/ip radius: implemented accounting interim update timeout --- accel-pptpd/radius/acct.c | 39 ++++++++++++++++++++++++++++++--------- accel-pptpd/radius/radius.c | 5 +++++ accel-pptpd/radius/radius_p.h | 3 ++- 3 files changed, 37 insertions(+), 10 deletions(-) (limited to 'accel-pptpd/radius') 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; diff --git a/accel-pptpd/radius/radius.c b/accel-pptpd/radius/radius.c index 3c885d8..fd3cd1e 100644 --- a/accel-pptpd/radius/radius.c +++ b/accel-pptpd/radius/radius.c @@ -24,6 +24,7 @@ int conf_max_try = 3; int conf_timeout = 3; +int conf_acct_timeout = 600; char *conf_nas_identifier = "accel-pptpd"; in_addr_t conf_nas_ip_address; in_addr_t conf_gw_ip_address; @@ -382,6 +383,10 @@ static void __init radius_init(void) if (opt && atoi(opt) > 0) conf_timeout = atoi(opt); + opt = conf_get_opt("radius", "acct-timeout"); + if (opt && atoi(opt) > 0) + conf_acct_timeout = atoi(opt); + opt = conf_get_opt("radius", "verbose"); if (opt && atoi(opt) > 0) conf_verbose = 1; diff --git a/accel-pptpd/radius/radius_p.h b/accel-pptpd/radius/radius_p.h index 6c4ef8f..978431a 100644 --- a/accel-pptpd/radius/radius_p.h +++ b/accel-pptpd/radius/radius_p.h @@ -31,7 +31,7 @@ struct radius_pd_t struct ipdb_item_t ipaddr; int acct_interim_interval; - int acct_delay_time; + time_t acct_timestamp; uint8_t *attr_class; int attr_class_len; @@ -56,6 +56,7 @@ struct rad_req_t extern int conf_max_try; extern int conf_timeout; +extern int conf_acct_timeout; extern int conf_verbose; extern int conf_interim_verbose; extern char *conf_nas_identifier; -- cgit v1.2.3