From cc8f2bada5635768d425e2fa2bafb095acda8ca9 Mon Sep 17 00:00:00 2001 From: Dmitry Kozlov Date: Fri, 27 Jan 2023 11:05:26 +0300 Subject: radius: implemented accounting delay option (acct-delay-start) --- accel-pppd/accel-ppp.conf | 1 + accel-pppd/accel-ppp.conf.5 | 3 +++ accel-pppd/radius/acct.c | 27 +++++++++++++++++++++++++-- accel-pppd/radius/radius.c | 11 +++++++++++ accel-pppd/radius/radius_p.h | 1 + 5 files changed, 41 insertions(+), 2 deletions(-) diff --git a/accel-pppd/accel-ppp.conf b/accel-pppd/accel-ppp.conf index d5c69bf8..1b14b9b0 100644 --- a/accel-pppd/accel-ppp.conf +++ b/accel-pppd/accel-ppp.conf @@ -217,6 +217,7 @@ verbose=1 #max-try=3 #acct-timeout=120 #acct-delay-time=0 +#acct-delay-start=0 #acct-on=0 #acct-interim-interval=0 #acct-interim-jitter=0 diff --git a/accel-pppd/accel-ppp.conf.5 b/accel-pppd/accel-ppp.conf.5 index f951325c..09c4597e 100644 --- a/accel-pppd/accel-ppp.conf.5 +++ b/accel-pppd/accel-ppp.conf.5 @@ -933,6 +933,9 @@ Specifies timeout of accounting interim update. .BI "acct-delay-time=" 0|1 Specifies whether radius client should include Acct-Delay-Time attribute to accounting requests (default 0). .TP +.BI "acct-delay-start=" n +Specifies delay to send accounting start packet (defaul 0). +.TP .BI "acct-on=" 0|1 Specifies whether radius client should send Account-Request with Acct-Status-Type=Accounting-On on startup and Acct-Status-Type=Accounting-Off on shutdown. .TP diff --git a/accel-pppd/radius/acct.c b/accel-pppd/radius/acct.c index d8488592..1cbd9296 100644 --- a/accel-pppd/radius/acct.c +++ b/accel-pppd/radius/acct.c @@ -214,7 +214,7 @@ static int rad_acct_before_send(struct rad_req_t *req) clock_gettime(CLOCK_MONOTONIC, &ts); - rad_packet_change_int(req->pack, NULL, "Acct-Delay-Time", ts.tv_sec - req->ts); + rad_packet_change_int(req->pack, NULL, "Acct-Delay-Time", ts.tv_sec - req->ts + conf_acct_delay_start); req_set_RA(req, req->serv->secret); return 0; @@ -300,7 +300,7 @@ static void rad_acct_start_timeout(struct triton_timer_t *t) ap_session_terminate(req->rpd->ses, TERM_NAS_ERROR, 0); } -int rad_acct_start(struct radius_pd_t *rpd) +static int __rad_acct_start(struct radius_pd_t *rpd) { struct rad_req_t *req = rad_req_alloc(rpd, CODE_ACCOUNTING_REQUEST, rpd->ses->username, 0); @@ -335,6 +335,29 @@ out_err: return -1; } +static void rad_acct_start_delay(struct triton_timer_t *t) +{ + struct radius_pd_t *rpd = container_of(t, typeof(*rpd), acct_interim_timer); + + triton_timer_del(&rpd->acct_interim_timer); + + if (__rad_acct_start(rpd)) + ap_session_terminate(rpd->ses, TERM_NAS_ERROR, 0); +} + +int rad_acct_start(struct radius_pd_t *rpd) +{ + if (conf_acct_delay_start) { + log_ppp_debug("radius: acct delay start %i\n", conf_acct_delay_start); + rpd->acct_interim_timer.expire = rad_acct_start_delay; + rpd->acct_interim_timer.expire_tv.tv_sec = conf_acct_delay_start; + triton_timer_add(rpd->ses->ctrl->ctx, &rpd->acct_interim_timer, 0); + return 0; + } + + return __rad_acct_start(rpd); +} + static void rad_acct_stop_sent(struct rad_req_t *req, int res) { if (res) { diff --git a/accel-pppd/radius/radius.c b/accel-pppd/radius/radius.c index 786faa56..2406ba04 100644 --- a/accel-pppd/radius/radius.c +++ b/accel-pppd/radius/radius.c @@ -57,6 +57,8 @@ static int conf_strip_realm; const char *conf_attr_tunnel_type; +int conf_acct_delay_start; + static LIST_HEAD(sessions); static pthread_rwlock_t sessions_lock = PTHREAD_RWLOCK_INITIALIZER; @@ -697,6 +699,9 @@ static void ses_finishing(struct ap_session *ses) if (rpd->acct_started || rpd->acct_req) rad_acct_stop(rpd); + + if (rpd->acct_interim_timer.tpd) + triton_timer_del(&rpd->acct_interim_timer); } static void ses_finished(struct ap_session *ses) @@ -1075,6 +1080,12 @@ static int load_config(void) if (opt) conf_nas_port_id_in_req = atoi(opt); + opt = conf_get_opt("radius", "acct-delay-start"); + if (opt) + conf_acct_delay_start = atoi(opt); + else + conf_acct_delay_start = 0; + return 0; } diff --git a/accel-pppd/radius/radius_p.h b/accel-pppd/radius/radius_p.h index 988f154f..cd9a0ab4 100644 --- a/accel-pppd/radius/radius_p.h +++ b/accel-pppd/radius/radius_p.h @@ -193,6 +193,7 @@ extern int conf_acct_interim_interval; extern int conf_acct_interim_jitter; extern int conf_accounting; extern const char *conf_attr_tunnel_type; +extern int conf_acct_delay_start; int rad_check_nas_pack(struct rad_packet_t *pack); struct radius_pd_t *rad_find_session(const char *sessionid, const char *username, const char *port_id, int port, in_addr_t ipaddr, const char *csid); -- cgit v1.2.3