|
@ -0,0 +1,79 @@ |
|
|
|
|
|
#!/bin/sh |
|
|
|
|
|
# based on static.sh |
|
|
|
|
|
# Copyright (C) 2020 Tong Zhang<ztong0001@gmail.com> |
|
|
|
|
|
# |
|
|
|
|
|
|
|
|
|
|
|
. /lib/nft-qos/core.sh |
|
|
|
|
|
|
|
|
|
|
|
qosdef_validate_mac() { |
|
|
|
|
|
uci_load_validate nft-qos default "$1" "$2" \ |
|
|
|
|
|
'limit_mac_enable:bool:0' |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
# append rule for mac qos |
|
|
|
|
|
qosdef_append_rule_mac() { # <section> <operator> |
|
|
|
|
|
local macaddr unit rate |
|
|
|
|
|
local operator=$2 |
|
|
|
|
|
|
|
|
|
|
|
config_get macaddr $1 macaddr |
|
|
|
|
|
if [ "$operator" = "saddr" ]; then |
|
|
|
|
|
config_get unit $1 urunit |
|
|
|
|
|
config_get rate $1 urate |
|
|
|
|
|
else |
|
|
|
|
|
config_get unit $1 drunit |
|
|
|
|
|
config_get rate $1 drate |
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
[ -z "$macaddr" ] && return |
|
|
|
|
|
|
|
|
|
|
|
qosdef_append_rule_mac_limit $macaddr $operator $unit $rate |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
# append chain for mac qos |
|
|
|
|
|
qosdef_append_chain_mac() { # <hook> <name> <section> |
|
|
|
|
|
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 |
|
|
|
|
|
config_foreach qosdef_append_rule_mac $config $operator |
|
|
|
|
|
qosdef_appendx "\t}\n" |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
qosdef_flush_mac() { |
|
|
|
|
|
if [ -n "$NFT_QOS_HAS_BRIDGE" ]; then |
|
|
|
|
|
qosdef_flush_table bridge nft-qos-mac |
|
|
|
|
|
else |
|
|
|
|
|
qosdef_flush_table "$NFT_QOS_INET_FAMILY" nft-qos-mac |
|
|
|
|
|
fi |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
# limit rate by mac address init |
|
|
|
|
|
qosdef_init_mac() { |
|
|
|
|
|
local hook_ul="prerouting" hook_dl="postrouting" |
|
|
|
|
|
|
|
|
|
|
|
[ "$2" = 0 ] || { |
|
|
|
|
|
logger -t nft-qos-mac "validation failed" |
|
|
|
|
|
return 1 |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
[ $limit_mac_enable -eq 0 ] && return 1 |
|
|
|
|
|
|
|
|
|
|
|
table_name=$NFT_QOS_INET_FAMILY |
|
|
|
|
|
if [ -z "$NFT_QOS_HAS_BRIDGE" ]; then |
|
|
|
|
|
hook_ul="postrouting" |
|
|
|
|
|
hook_dl="prerouting" |
|
|
|
|
|
else |
|
|
|
|
|
table_name="bridge" |
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
qosdef_appendx "table $table_name nft-qos-mac {\n" |
|
|
|
|
|
qosdef_append_chain_mac $hook_ul upload client |
|
|
|
|
|
qosdef_append_chain_mac $hook_dl download client |
|
|
|
|
|
qosdef_appendx "}\n" |
|
|
|
|
|
} |