diff options
Diffstat (limited to 'accel-pptpd')
-rw-r--r-- | accel-pptpd/accel-pptp.conf | 3 | ||||
-rw-r--r-- | accel-pptpd/accel-pptp.conf.5 | 9 | ||||
-rw-r--r-- | accel-pptpd/ppp/ppp.c | 2 | ||||
-rw-r--r-- | accel-pptpd/radius/acct.c | 39 | ||||
-rw-r--r-- | accel-pptpd/radius/radius.c | 5 | ||||
-rw-r--r-- | accel-pptpd/radius/radius_p.h | 3 |
6 files changed, 50 insertions, 11 deletions
diff --git a/accel-pptpd/accel-pptp.conf b/accel-pptpd/accel-pptp.conf index 17f497b6..83b1b979 100644 --- a/accel-pptpd/accel-pptp.conf +++ b/accel-pptpd/accel-pptp.conf @@ -64,6 +64,9 @@ acct-server=127.0.0.1:1813,testing123 dae-server=127.0.0.1:3799,testing123 #dm_coa_secret=testing123 (deprecated) verbose=1 +#timeout=3 +#max-try=3 +#acct-timeout=120 [client-ip-range] 10.0.0.0/8 diff --git a/accel-pptpd/accel-pptp.conf.5 b/accel-pptpd/accel-pptp.conf.5 index f7266a94..687ab599 100644 --- a/accel-pptpd/accel-pptp.conf.5 +++ b/accel-pptpd/accel-pptp.conf.5 @@ -241,6 +241,15 @@ If this option is given and .B n is greater of zero then radius module will produce verbose logging of interim radius packets. .TP +.BI "timeout=" n +Timeout to wait response from server (sec) +.TP +.BI "max-try=" n +Specifies number of tries to send Access-Request/Accounting-Request queries. +.TP +.BI "acct-timeout=" n +Specifies timeout of accounting interim update. +.TP .SH [log] .br Configuration of log and log_file modules. diff --git a/accel-pptpd/ppp/ppp.c b/accel-pptpd/ppp/ppp.c index ceefc1ea..a26e6446 100644 --- a/accel-pptpd/ppp/ppp.c +++ b/accel-pptpd/ppp/ppp.c @@ -397,7 +397,7 @@ void __export ppp_layer_finished(struct ppp_t *ppp, struct ppp_layer_data_t *d) list_for_each_entry(n, &ppp->layers, entry) { list_for_each_entry(d, &n->items, entry) { - if (!d->finished) + if (d->starting && !d->finished) return; } } diff --git a/accel-pptpd/radius/acct.c b/accel-pptpd/radius/acct.c index f8cfee7a..cc0fdea9 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, TERM_NAS_ERROR, 0); + 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 3c885d89..fd3cd1e1 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 6c4ef8f9..978431a7 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; |