#!/bin/sh
|
|
#
|
|
# Copyright (C) 2018 rosysong@rosinson.com
|
|
#
|
|
|
|
. /lib/functions/network.sh
|
|
. /lib/nft-qos/core.sh
|
|
|
|
P1=""; P2=""; P3=""; P4=""; P5=""; P6="";
|
|
P7=""; P8=""; P9=""; P10=""; P11="";
|
|
|
|
qosdef_validate_priority() {
|
|
uci_load_validate nft-qos default "$1" "$2" \
|
|
'priority_enable:bool:0' \
|
|
'priority_netdev:maxlength(8)'
|
|
}
|
|
|
|
_qosdef_handle_protox() { # <priority> <rule>
|
|
case "$1" in
|
|
-400) P1="$P1""$2";;
|
|
-300) P2="$P2""$2";;
|
|
-225) P3="$P3""$2";;
|
|
-200) P4="$P4""$2";;
|
|
-150) P5="$P5""$2";;
|
|
-100) P6="$P6""$2";;
|
|
0) P7="$P7""$2";;
|
|
50) P8="$P8""$2";;
|
|
100) P9="$P9""$2";;
|
|
225) P10="$P10""$2";;
|
|
300) P11="$P11""$2";;
|
|
esac
|
|
}
|
|
|
|
qosdef_handle_protox() { # <section>
|
|
local proto prio srv
|
|
|
|
config_get proto $1 'protocol'
|
|
config_get prio $1 'priority'
|
|
config_get srv $1 'service'
|
|
|
|
[ -z "$proto" -o \
|
|
-z "$prio" -o \
|
|
-z "$srv" ] && return
|
|
|
|
_qosdef_handle_protox $prio \
|
|
"\t\t$proto dport { $srv } accept\n"
|
|
}
|
|
|
|
qosdef_append_rule_protox() { # <section>
|
|
config_foreach qosdef_handle_protox $1
|
|
qosdef_appendx \
|
|
"${P1}${P2}${P3}${P4}${P5}${P6}${P7}${P8}${P9}${P10}${P11}"
|
|
}
|
|
|
|
qosdef_append_chain_priority() { # <name> <section> <device>
|
|
local name=$1 device=$3
|
|
|
|
qosdef_appendx "\tchain $name {\n"
|
|
qosdef_append_chain_ingress filter $device 0 accept
|
|
qosdef_append_rule_protox $2
|
|
qosdef_appendx "\t}\n"
|
|
}
|
|
|
|
qosdef_remove_priority() {
|
|
qosdef_remove_table netdev nft-qos-priority
|
|
}
|
|
|
|
# init traffic priority
|
|
qosdef_init_priority() {
|
|
local ifname="br-lan"
|
|
|
|
[ "$2" = 0 ] || {
|
|
logger -t nft-qos-priority "validation failed"
|
|
return 1
|
|
}
|
|
|
|
[ $priority_enable -eq 0 ] && return 1
|
|
|
|
case "$priority_netdev" in
|
|
lan) [ "$(uci_get network.lan.type)" != "bridge" ] && {
|
|
network_get_device ifname "$priority_netdev" || \
|
|
ifname="$(uci_get network.lan.ifname)"
|
|
}
|
|
;;
|
|
wan*) network_get_device ifname "$priority_netdev" || \
|
|
ifname="$(uci_get network.$priority_netdev.ifname)"
|
|
;;
|
|
esac
|
|
|
|
qosdef_appendx "table netdev nft-qos-priority {\n"
|
|
qosdef_append_chain_priority filter priority $ifname
|
|
qosdef_appendx "}\n"
|
|
}
|