|
|
- #!/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"
- }
|