summaryrefslogtreecommitdiff
path: root/accel-pptpd/radius/radius.c
diff options
context:
space:
mode:
authorKozlov Dmitry <dima@server>2010-10-29 11:03:30 +0400
committerKozlov Dmitry <dima@server>2010-10-29 11:03:30 +0400
commit4e1a10190d4afba6a960666fa540a8983023b595 (patch)
tree914e71858ed1b817fcd91f6928845c2428bee618 /accel-pptpd/radius/radius.c
parent2b4c0b2f5ff2eca2c88fbf745365956e51338538 (diff)
parente1603a51f450ad7ee52fe89ef5d78b82845fdcc2 (diff)
downloadaccel-ppp-4e1a10190d4afba6a960666fa540a8983023b595.tar.gz
accel-ppp-4e1a10190d4afba6a960666fa540a8983023b595.zip
Merge branch 'master' of ssh://accel-pptp.git.sourceforge.net/gitroot/accel-pptp/accel-pptp
Diffstat (limited to 'accel-pptpd/radius/radius.c')
-rw-r--r--accel-pptpd/radius/radius.c49
1 files changed, 44 insertions, 5 deletions
diff --git a/accel-pptpd/radius/radius.c b/accel-pptpd/radius/radius.c
index f24724fa..a07df9a6 100644
--- a/accel-pptpd/radius/radius.c
+++ b/accel-pptpd/radius/radius.c
@@ -11,6 +11,7 @@
#include "ppp.h"
#include "pwdb.h"
#include "ipdb.h"
+#include "ppp_auth.h"
#include "radius_p.h"
#include "attr_defs.h"
@@ -45,9 +46,10 @@ static struct ipdb_t ipdb;
static mempool_t rpd_pool;
-void rad_proc_attrs(struct rad_req_t *req)
+int rad_proc_attrs(struct rad_req_t *req)
{
struct rad_attr_t *attr;
+ int res = 0;
list_for_each_entry(attr, &req->reply->attrs, entry) {
if (attr->vendor)
@@ -66,10 +68,31 @@ void rad_proc_attrs(struct rad_req_t *req)
req->rpd->acct_interim_interval = attr->val.integer;
break;
case Session_Timeout:
- req->rpd->session_timeout.expire_tv.tv_sec = attr->val.integer;
+ req->rpd->session_timeout.period = attr->val.integer * 1000;
+ break;
+ case Class:
+ if (!req->rpd->attr_class)
+ req->rpd->attr_class = _malloc(attr->len);
+ else if (req->rpd->attr_class_len != attr->len)
+ req->rpd->attr_class = _realloc(req->rpd->attr_class, attr->len);
+ memcpy(req->rpd->attr_class, attr->val.octets, attr->len);
+ req->rpd->attr_class_len = attr->len;
+ break;
+ case State:
+ if (!req->rpd->attr_state)
+ req->rpd->attr_state = _malloc(attr->len);
+ else if (req->rpd->attr_state_len != attr->len)
+ req->rpd->attr_state = _realloc(req->rpd->attr_state, attr->len);
+ memcpy(req->rpd->attr_state, attr->val.octets, attr->len);
+ req->rpd->attr_state_len = attr->len;
+ break;
+ case Termination_Action:
+ req->rpd->termination_action = attr->val.integer;
break;
}
}
+
+ return res;
}
static int check(struct pwdb_t *pwdb, struct ppp_t *ppp, const char *username, int type, va_list _args)
@@ -118,9 +141,16 @@ static struct ipdb_item_t *get_ip(struct ppp_t *ppp)
static void session_timeout(struct triton_timer_t *t)
{
struct radius_pd_t *rpd = container_of(t, typeof(*rpd), session_timeout);
-
log_ppp_msg("radius: session timed out\n");
- ppp_terminate(rpd->ppp, TERM_SESSION_TIMEOUT, 0);
+
+ if (rpd->ppp->stop_time)
+ return;
+
+ if (rpd->termination_action == Termination_Action_RADIUS_Request) {
+ if (ppp_auth_restart(rpd->ppp))
+ ppp_terminate(rpd->ppp, TERM_SESSION_TIMEOUT, 0);
+ } else
+ ppp_terminate(rpd->ppp, TERM_SESSION_TIMEOUT, 0);
}
static void ppp_starting(struct ppp_t *ppp)
@@ -147,7 +177,7 @@ static void ppp_acct_start(struct ppp_t *ppp)
return;
}
- if (rpd->session_timeout.expire_tv.tv_sec) {
+ if (rpd->session_timeout.period) {
rpd->session_timeout.expire = session_timeout;
triton_timer_add(ppp->ctrl->ctx, &rpd->session_timeout, 0);
}
@@ -168,6 +198,9 @@ static void ppp_finished(struct ppp_t *ppp)
pthread_mutex_unlock(&rpd->lock);
pthread_rwlock_unlock(&sessions_lock);
+ if (rpd->auth_req)
+ rad_req_free(rpd->auth_req);
+
if (rpd->acct_req)
rad_req_free(rpd->acct_req);
@@ -177,6 +210,12 @@ static void ppp_finished(struct ppp_t *ppp)
if (rpd->session_timeout.tpd)
triton_timer_del(&rpd->session_timeout);
+ if (rpd->attr_class)
+ _free(rpd->attr_class);
+
+ if (rpd->attr_state)
+ _free(rpd->attr_state);
+
list_del(&rpd->pd.entry);
mempool_free(rpd);