summaryrefslogtreecommitdiff
path: root/accel-pppd/radius/radius.c
diff options
context:
space:
mode:
authorKozlov Dmitry <xeb@mail.ru>2012-07-19 22:20:02 +0400
committerKozlov Dmitry <xeb@mail.ru>2012-07-19 22:20:02 +0400
commit3c343b7902755f6110d89c9a87bf8c08ed30c705 (patch)
treea32dc70bf5660e1b79e2ba0b5f01f02e7c095806 /accel-pppd/radius/radius.c
parent6fe9ea35fb1484c37aa5f7eb9b023780f986f1e8 (diff)
downloadaccel-ppp-3c343b7902755f6110d89c9a87bf8c08ed30c705.tar.gz
accel-ppp-3c343b7902755f6110d89c9a87bf8c08ed30c705.zip
radius: implemented Idle-Timeout
Diffstat (limited to 'accel-pppd/radius/radius.c')
-rw-r--r--accel-pppd/radius/radius.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/accel-pppd/radius/radius.c b/accel-pppd/radius/radius.c
index 048f7362..f10b1567 100644
--- a/accel-pppd/radius/radius.c
+++ b/accel-pppd/radius/radius.c
@@ -4,6 +4,7 @@
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
+#include <linux/if_link.h>
#include "mempool.h"
#include "events.h"
@@ -94,6 +95,9 @@ int rad_proc_attrs(struct rad_req_t *req)
case Session_Timeout:
req->rpd->session_timeout.expire_tv.tv_sec = attr->val.integer;
break;
+ case Idle_Timeout:
+ req->rpd->idle_timeout.period = attr->val.integer * 1000;
+ break;
case Class:
if (!req->rpd->attr_class)
req->rpd->attr_class = _malloc(attr->len);
@@ -227,6 +231,25 @@ static void session_timeout(struct triton_timer_t *t)
ap_session_terminate(rpd->ses, TERM_SESSION_TIMEOUT, 0);
}
+static void idle_timeout(struct triton_timer_t *t)
+{
+ struct radius_pd_t *rpd = container_of(t, typeof(*rpd), idle_timeout);
+ struct rtnl_link_stats stats;
+
+ if (rpd->ses->stop_time)
+ return;
+
+ rad_read_stats(rpd, &stats);
+
+ if (stats.rx_packets == rpd->acct_rx_packets && stats.tx_packets == rpd->acct_tx_packets) {
+ log_ppp_msg("radius: session timed out\n");
+ ap_session_terminate(rpd->ses, TERM_IDLE_TIMEOUT, 0);
+ } else {
+ rpd->acct_rx_packets = stats.rx_packets;
+ rpd->acct_tx_packets = stats.tx_packets;
+ }
+}
+
static void ses_starting(struct ap_session *ses)
{
struct radius_pd_t *rpd = mempool_alloc(rpd_pool);
@@ -271,6 +294,11 @@ static void ses_acct_start(struct ap_session *ses)
rpd->session_timeout.expire = session_timeout;
triton_timer_add(ses->ctrl->ctx, &rpd->session_timeout, 0);
}
+
+ if (rpd->idle_timeout.period) {
+ rpd->idle_timeout.expire = idle_timeout;
+ triton_timer_add(ses->ctrl->ctx, &rpd->idle_timeout, 0);
+ }
}
static void ses_finishing(struct ap_session *ses)
{
@@ -303,6 +331,9 @@ static void ses_finished(struct ap_session *ses)
if (rpd->session_timeout.tpd)
triton_timer_del(&rpd->session_timeout);
+
+ if (rpd->idle_timeout.tpd)
+ triton_timer_del(&rpd->idle_timeout);
if (rpd->attr_class)
_free(rpd->attr_class);