3 # Copyright (C) 2018 rosysong@rosinson.com
8 qosdef_validate_dynamic
() {
9 uci_load_validate nft-qos default
"$1" "$2" \
10 'limit_enable:bool:0' \
11 'limit_type:maxlength(8)' \
12 'dynamic_bw_up:uinteger:100' \
13 'dynamic_bw_down:uinteger:100'
16 # return average rate for dhcp leases
17 qosdef_dynamic_rate
() { # <bandwidth>
20 [ ! -e /tmp
/dhcp.leases
-a \
21 ! -e /var
/dhcp6.leases
] && return
23 [ -e /tmp
/dhcp.leases
] && \
24 c
=$
(wc -l < /tmp
/dhcp.leases
2>/dev
/null
)
25 [ -e /var
/dhcp6.leases
] && \
26 c6
=$
(wc -l < /var
/dhcp6.leases
2>/dev
/null
)
27 [ $c -eq 0 -a $c6 -eq 0 ] && \
28 { echo 12500; return; }
30 echo $
(($1 / ($c + $c6)))
33 qosdef_append_chain_dym
() { # <hook> <name> <bandwidth>
36 local hook
=$1 name
=$2 bandwidth
=$3
38 config_get cidr default
'dynamic_cidr'
39 config_get cidr6 default
'dynamic_cidr6'
41 [ -z "$cidr" -a -z "$cidr6" ] && return
44 download
) operator
=daddr
;;
45 upload
) operator
=saddr
;;
48 rate
=$
(qosdef_dynamic_rate
$bandwidth)
50 qosdef_appendx
"\tchain $name {\n"
51 qosdef_append_chain_def filter
$hook 0 accept
52 qosdef_append_rule_limit_whitelist
$name
54 qosdef_append_rule_ip_limit
$cidr $operator kbytes
$rate
56 qosdef_append_rule_ip_limit
$cidr6 $operator kbytes
$rate
57 qosdef_appendx
"\t}\n"
60 qosdef_flush_dynamic
() {
61 qosdef_flush_table
"$NFT_QOS_INET_FAMILY" nft-qos-dynamic
65 qosdef_init_dynamic
() {
66 local hook_ul
="prerouting" hook_dl
="postrouting"
69 logger
-t nft-qos-dynamic
"validation failed"
73 [ $limit_enable -eq 0 -o \
74 "$limit_type" = "static" ] && return 1
76 # Transfer mbits/s to mbytes/s
77 # e.g. 100,000 kbits == 12,500 kbytes
78 dynamic_bw_up
=$
(($dynamic_bw_up * 1000 / 8))
79 dynamic_bw_down
=$
(($dynamic_bw_down * 1000 / 8))
81 [ -z "$NFT_QOS_HAS_BRIDGE" ] && {
86 qosdef_appendx
"table $NFT_QOS_INET_FAMILY nft-qos-dynamic {\n"
87 qosdef_append_chain_dym
$hook_ul upload
$dynamic_bw_up
88 qosdef_append_chain_dym
$hook_dl download
$dynamic_bw_down