Merge pull request #8361 from jandelgado/add_udptunnel_package
[feed/packages.git] / net / nft-qos / files / lib / priority.sh
1 #!/bin/sh
2 #
3 # Copyright (C) 2018 rosysong@rosinson.com
4 #
5
6 . /lib/functions/network.sh
7 . /lib/nft-qos/core.sh
8
9 P1=""; P2=""; P3=""; P4=""; P5=""; P6="";
10 P7=""; P8=""; P9=""; P10=""; P11="";
11
12 qosdef_validate_priority() {
13 uci_load_validate nft-qos default "$1" "$2" \
14 'priority_enable:bool:0' \
15 'priority_netdev:maxlength(8)'
16 }
17
18 _qosdef_handle_protox() { # <priority> <rule>
19 case "$1" in
20 -400) P1="$P1""$2";;
21 -300) P2="$P2""$2";;
22 -225) P3="$P3""$2";;
23 -200) P4="$P4""$2";;
24 -150) P5="$P5""$2";;
25 -100) P6="$P6""$2";;
26 0) P7="$P7""$2";;
27 50) P8="$P8""$2";;
28 100) P9="$P9""$2";;
29 225) P10="$P10""$2";;
30 300) P11="$P11""$2";;
31 esac
32 }
33
34 qosdef_handle_protox() { # <section>
35 local proto prio srv
36
37 config_get proto $1 'protocol'
38 config_get prio $1 'priority'
39 config_get srv $1 'service'
40
41 [ -z "$proto" -o \
42 -z "$prio" -o \
43 -z "$srv" ] && return
44
45 _qosdef_handle_protox $prio \
46 "\t\t$proto dport { $srv } accept\n"
47 }
48
49 qosdef_append_rule_protox() { # <section>
50 config_foreach qosdef_handle_protox $1
51 qosdef_appendx \
52 "${P1}${P2}${P3}${P4}${P5}${P6}${P7}${P8}${P9}${P10}${P11}"
53 }
54
55 qosdef_append_chain_priority() { # <name> <section> <device>
56 local name=$1 device=$3
57
58 qosdef_appendx "\tchain $name {\n"
59 qosdef_append_chain_ingress filter $device 0 accept
60 qosdef_append_rule_protox $2
61 qosdef_appendx "\t}\n"
62 }
63
64 qosdef_remove_priority() {
65 qosdef_remove_table netdev nft-qos-priority
66 }
67
68 # init traffic priority
69 qosdef_init_priority() {
70 local ifname="br-lan"
71
72 [ "$2" = 0 ] || {
73 logger -t nft-qos-priority "validation failed"
74 return 1
75 }
76
77 [ $priority_enable -eq 0 ] && return 1
78
79 case "$priority_netdev" in
80 lan) [ "$(uci_get network.lan.type)" != "bridge" ] && {
81 network_get_device ifname "$priority_netdev" || \
82 ifname="$(uci_get network.lan.ifname)"
83 }
84 ;;
85 wan*) network_get_device ifname "$priority_netdev" || \
86 ifname="$(uci_get network.$priority_netdev.ifname)"
87 ;;
88 esac
89
90 qosdef_appendx "table netdev nft-qos-priority {\n"
91 qosdef_append_chain_priority filter priority $ifname
92 qosdef_appendx "}\n"
93 }