#!/bin/sh # based on static.sh # Copyright (C) 2020 Tong Zhang # . /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() { #
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() { #
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" }