Merge pull request #8361 from jandelgado/add_udptunnel_package
[feed/packages.git] / net / nft-qos / files / lib / dynamic.sh
1 #!/bin/sh
2 #
3 # Copyright (C) 2018 rosysong@rosinson.com
4 #
5
6 . /lib/nft-qos/core.sh
7
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'
14 }
15
16 # return average rate for dhcp leases
17 qosdef_dynamic_rate() { # <bandwidth>
18 local c=0 c6=0
19
20 [ ! -e /tmp/dhcp.leases -a \
21 ! -e /var/dhcp6.leases ] && return
22
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; }
29
30 echo $(($1 / ($c + $c6)))
31 }
32
33 qosdef_append_chain_dym() { # <hook> <name> <bandwidth>
34 local cidr cidr6
35 local operator rate
36 local hook=$1 name=$2 bandwidth=$3
37
38 config_get cidr default 'dynamic_cidr'
39 config_get cidr6 default 'dynamic_cidr6'
40
41 [ -z "$cidr" -a -z "$cidr6" ] && return
42
43 case "$2" in
44 download) operator=daddr;;
45 upload) operator=saddr;;
46 esac
47
48 rate=$(qosdef_dynamic_rate $bandwidth)
49
50 qosdef_appendx "\tchain $name {\n"
51 qosdef_append_chain_def filter $hook 0 accept
52 qosdef_append_rule_limit_whitelist $name
53 [ -n "$cidr" ] && \
54 qosdef_append_rule_ip_limit $cidr $operator kbytes $rate
55 [ -n "$cidr6" ] && \
56 qosdef_append_rule_ip_limit $cidr6 $operator kbytes $rate
57 qosdef_appendx "\t}\n"
58 }
59
60 qosdef_flush_dynamic() {
61 qosdef_flush_table "$NFT_QOS_INET_FAMILY" nft-qos-dynamic
62 }
63
64 # init dynamic qos
65 qosdef_init_dynamic() {
66 local hook_ul="prerouting" hook_dl="postrouting"
67
68 [ "$2" = 0 ] || {
69 logger -t nft-qos-dynamic "validation failed"
70 return 1
71 }
72
73 [ $limit_enable -eq 0 -o \
74 "$limit_type" = "static" ] && return 1
75
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))
80
81 [ -z "$NFT_QOS_HAS_BRIDGE" ] && {
82 hook_ul="postrouting"
83 hook_dl="prerouting"
84 }
85
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
89 qosdef_appendx "}\n"
90 }