diff options
author | Kozlov Dmitry <dima@server> | 2010-10-29 11:03:30 +0400 |
---|---|---|
committer | Kozlov Dmitry <dima@server> | 2010-10-29 11:03:30 +0400 |
commit | 4e1a10190d4afba6a960666fa540a8983023b595 (patch) | |
tree | 914e71858ed1b817fcd91f6928845c2428bee618 /accel-pptpd/radius/radius.c | |
parent | 2b4c0b2f5ff2eca2c88fbf745365956e51338538 (diff) | |
parent | e1603a51f450ad7ee52fe89ef5d78b82845fdcc2 (diff) | |
download | accel-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.c | 49 |
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); |