#!/bin/sh
|
|
#
|
|
# Copyright (C) 2018 rosysong@rosinson.com
|
|
#
|
|
|
|
. /lib/nft-qos/core.sh
|
|
|
|
qosdef_validate_static() {
|
|
uci_load_validate nft-qos default "$1" "$2" \
|
|
'limit_enable:bool:0' \
|
|
'limit_type:maxlength(8)' \
|
|
'static_unit_dl:string:kbytes' \
|
|
'static_unit_ul:string:kbytes' \
|
|
'static_rate_dl:uinteger:50' \
|
|
'static_rate_ul:uinteger:50'
|
|
}
|
|
|
|
# append rule for static qos
|
|
qosdef_append_rule_sta() { # <section> <operator> <default-unit> <default-rate>
|
|
local ipaddr unit rate
|
|
local operator=$2
|
|
|
|
config_get ipaddr $1 ipaddr
|
|
config_get unit $1 unit $3
|
|
config_get rate $1 rate $4
|
|
|
|
[ -z "$ipaddr" ] && return
|
|
|
|
qosdef_append_rule_ip_limit $ipaddr $operator $unit $rate
|
|
}
|
|
|
|
# append chain for static qos
|
|
qosdef_append_chain_sta() { # <hook> <name> <section> <unit> <rate>
|
|
local hook=$1 name=$2
|
|
local config=$3 operator
|
|
|
|
case "$name" in
|
|
download) operator="daddr";;
|
|
upload) operator="saddr";;
|
|
esac
|
|
|
|
qosdef_appendx "\tchain $name {\n"
|
|
qosdef_append_chain_def filter $hook 0 accept
|
|
qosdef_append_rule_limit_whitelist $name
|
|
config_foreach qosdef_append_rule_sta $config $operator $4 $5
|
|
qosdef_appendx "\t}\n"
|
|
}
|
|
|
|
qosdef_flush_static() {
|
|
qosdef_flush_table "$NFT_QOS_INET_FAMILY" nft-qos-static
|
|
}
|
|
|
|
# static limit rate init
|
|
qosdef_init_static() {
|
|
local hook_ul="prerouting" hook_dl="postrouting"
|
|
|
|
[ "$2" = 0 ] || {
|
|
logger -t nft-qos-static "validation failed"
|
|
return 1
|
|
}
|
|
|
|
[ $limit_enable -eq 0 -o \
|
|
$limit_type = "dynamic" ] && return 1
|
|
|
|
[ -z "$NFT_QOS_HAS_BRIDGE" ] && {
|
|
hook_ul="postrouting"
|
|
hook_dl="prerouting"
|
|
}
|
|
|
|
qosdef_appendx "table $NFT_QOS_INET_FAMILY nft-qos-static {\n"
|
|
qosdef_append_chain_sta $hook_ul upload upload $static_unit_ul $static_rate_ul
|
|
qosdef_append_chain_sta $hook_dl download download $static_unit_dl $static_rate_dl
|
|
qosdef_appendx "}\n"
|
|
}
|