aboutsummaryrefslogtreecommitdiff
path: root/net/nft-qos/files/lib/dynamic.sh
blob: 207daca3f67408bb82f8c0d0f68b8e74b1c89ad6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#!/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"
}