summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--accel-pptpd/accel-pptp.conf3
-rw-r--r--accel-pptpd/accel-pptp.conf.59
-rw-r--r--accel-pptpd/ppp/ppp.c2
-rw-r--r--accel-pptpd/radius/acct.c39
-rw-r--r--accel-pptpd/radius/radius.c5
-rw-r--r--accel-pptpd/radius/radius_p.h3
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;