From 0e9e6035cf076cb139c756ac4411a5180d857575 Mon Sep 17 00:00:00 2001 From: DmitriyEshenko Date: Sun, 25 Aug 2019 22:56:26 +0300 Subject: shaper: adding default rate-limit --- accel-pppd/accel-ppp.conf | 1 + accel-pppd/accel-ppp.conf.5 | 3 +++ accel-pppd/shaper/shaper.c | 36 +++++++++++++++++++++++++++++++++--- 3 files changed, 37 insertions(+), 3 deletions(-) (limited to 'accel-pppd') diff --git a/accel-pppd/accel-ppp.conf b/accel-pppd/accel-ppp.conf index 530c341..02db127 100644 --- a/accel-pppd/accel-ppp.conf +++ b/accel-pppd/accel-ppp.conf @@ -264,6 +264,7 @@ down-limiter=tbf #leaf-qdisc=fq_codel [limit PACKETS] [flows NUMBER] [target TIME] [interval TIME] [quantum BYTES] [[no]ecn] #rate-multiplier=1 #fwmark=1 +#rate-limit=2048/1024 verbose=1 [cli] diff --git a/accel-pppd/accel-ppp.conf.5 b/accel-pppd/accel-ppp.conf.5 index 52cd1e6..65b0037 100644 --- a/accel-pppd/accel-ppp.conf.5 +++ b/accel-pppd/accel-ppp.conf.5 @@ -1102,6 +1102,9 @@ fq_codel [ limit PACKETS ] [flows NUMBER ] [ target TIME ] [ interval TIME ] [qu .TP .BI "rate-multiplier=" n Due to accel-ppp operates with rates in kilobit basis if you send rates in different basis then you can use this option to bring your values to kilobits. +.TP +.BI "rate-limit=" download_speed/upload_speed +Specifies, should accel-ppp set default rate-limit for clients. Clients rate-limit will be overwritten by RADIUS filter attributes or chap-secrets rate-limit params. .SH [cli] .br Configuration of the command line interface. diff --git a/accel-pppd/shaper/shaper.c b/accel-pppd/shaper/shaper.c index 304a129..13f75c0 100644 --- a/accel-pppd/shaper/shaper.c +++ b/accel-pppd/shaper/shaper.c @@ -64,6 +64,9 @@ int conf_lq_arg6; static int temp_down_speed; static int temp_up_speed; +static int dflt_down_speed; +static int dflt_up_speed; + static pthread_rwlock_t shaper_lock = PTHREAD_RWLOCK_INITIALIZER; static LIST_HEAD(shaper_list); @@ -515,9 +518,7 @@ static void ev_ppp_pre_up(struct ap_session *ses) up_speed = temp_up_speed; down_burst = 0; up_burst = 0; - } else { - if (!pd->cur_tr) - return; + } else if (pd->cur_tr){ pd->down_speed = pd->cur_tr->down_speed; pd->up_speed = pd->cur_tr->up_speed; down_speed = pd->cur_tr->down_speed; @@ -525,6 +526,15 @@ static void ev_ppp_pre_up(struct ap_session *ses) down_burst = pd->cur_tr->down_burst; up_burst = pd->cur_tr->up_burst; } + else if (dflt_down_speed || dflt_up_speed){ + pd->down_speed = dflt_down_speed; + pd->up_speed = dflt_up_speed; + down_speed = dflt_down_speed; + up_speed = dflt_up_speed; + down_burst = 0; + up_burst = 0; + } + else return; if (!pd->idx) pd->idx = alloc_idx(ses->ifindex); @@ -873,6 +883,22 @@ static struct time_range_t *parse_range(time_t t, const char *val) return r; } +static int parse_dflt_shaper(const char *opt, int *down_speed, int *up_speed) +{ + char *endptr; + + *down_speed = strtol(opt, &endptr, 10); + + if (*endptr != '/'){ + *up_speed = *down_speed; + return 0; + } + + opt = endptr + 1; + *up_speed = strtol(opt, &endptr, 10); + return 0; +} + static void load_time_ranges(void) { struct conf_sect_t *s = conf_get_section("shaper"); @@ -1101,6 +1127,10 @@ static void load_config(void) else conf_fwmark = 0; + opt = conf_get_opt("shaper", "rate-limit"); + if (opt) + parse_dflt_shaper(opt, &dflt_down_speed, &dflt_up_speed); + triton_context_call(&shaper_ctx, (triton_event_func)load_time_ranges, NULL); } -- cgit v1.2.3