packages/net/nft-qos/files/lib/dynamic.sh
Jeffery To a0b51e9bd6 nft-qos: Update init script
This replaces the use of uci_validate_section() with
uci_load_validate(), which removes the need to declare local variables
for every config option.

This also adds a validate section to service_triggers(), and fixes some
variable name typos in qosdef_init_static().

Signed-off-by: Jeffery To <jeffery.to@gmail.com>
2019-02-12 16:31:59 +08:00

90 lines
2.1 KiB
Bash

#!/bin/sh
#
# Copyright (C) 2018 rosysong@rosinson.com
#
. /lib/nft-qos/core.sh
qosdef_validate_dynamic() {
uci_load_validate nft-qos default "$1" "$2" \
'limit_enable:bool:0' \
'limit_type:maxlength(8)' \
'dynamic_bw_up:uinteger:100' \
'dynamic_bw_down:uinteger:100'
}
# return average rate for dhcp leases
qosdef_dynamic_rate() { # <bandwidth>
local c=0 c6=0
[ ! -e /tmp/dhcp.leases -a \
! -e /var/dhcp6.leases ] && return
[ -e /tmp/dhcp.leases ] && \
c=$(wc -l < /tmp/dhcp.leases 2>/dev/null)
[ -e /var/dhcp6.leases ] && \
c6=$(wc -l < /var/dhcp6.leases 2>/dev/null)
[ $c -eq 0 -a $c6 -eq 0 ] && \
{ echo 12500; return; }
echo $(($1 / ($c + $c6)))
}
qosdef_append_chain_dym() { # <hook> <name> <bandwidth>
local cidr cidr6
local operator rate
local hook=$1 name=$2 bandwidth=$3
config_get cidr default 'dynamic_cidr'
config_get cidr6 default 'dynamic_cidr6'
[ -z "$cidr" -a -z "$cidr6" ] && return
case "$2" in
download) operator=daddr;;
upload) operator=saddr;;
esac
rate=$(qosdef_dynamic_rate $bandwidth)
qosdef_appendx "\tchain $name {\n"
qosdef_append_chain_def filter $hook 0 accept
qosdef_append_rule_limit_whitelist $name
[ -n "$cidr" ] && \
qosdef_append_rule_ip_limit $cidr $operator kbytes $rate
[ -n "$cidr6" ] && \
qosdef_append_rule_ip_limit $cidr6 $operator kbytes $rate
qosdef_appendx "\t}\n"
}
qosdef_flush_dynamic() {
qosdef_flush_table "$NFT_QOS_INET_FAMILY" nft-qos-dynamic
}
# init dynamic qos
qosdef_init_dynamic() {
local hook_ul="prerouting" hook_dl="postrouting"
[ "$2" = 0 ] || {
logger -t nft-qos-dynamic "validation failed"
return 1
}
[ $limit_enable -eq 0 -o \
"$limit_type" = "static" ] && return 1
# Transfer mbits/s to mbytes/s
# e.g. 100,000 kbits == 12,500 kbytes
dynamic_bw_up=$(($dynamic_bw_up * 1000 / 8))
dynamic_bw_down=$(($dynamic_bw_down * 1000 / 8))
[ -z "$NFT_QOS_HAS_BRIDGE" ] && {
hook_ul="postrouting"
hook_dl="prerouting"
}
qosdef_appendx "table $NFT_QOS_INET_FAMILY nft-qos-dynamic {\n"
qosdef_append_chain_dym $hook_ul upload $dynamic_bw_up
qosdef_append_chain_dym $hook_dl download $dynamic_bw_down
qosdef_appendx "}\n"
}