|
|
- #!/bin/sh
- #
- # Copyright (C) 2018 rosysong@rosinson.com
- #
-
- # for uci_validate_section()
- . /lib/functions/procd.sh
-
- NFT_QOS_HAS_BRIDGE=
- NFT_QOS_INET_FAMILY=ip
- NFT_QOS_SCRIPT_TEXT=
- NFT_QOS_SCRIPT_FILE=/tmp/qos.nft
-
- qosdef_appendx() { # <string to be appended>
- NFT_QOS_SCRIPT_TEXT="$NFT_QOS_SCRIPT_TEXT""$1"
- }
-
- qosdef_append_chain_def() { # <type> <hook> <priority> <policy>
- qosdef_appendx "\t\ttype $1 hook $2 priority $3; policy $4;\n"
- }
-
- qosdef_append_chain_ingress() { # <type> <device> <priority> <policy>
- qosdef_appendx "\t\ttype $1 hook ingress device $2 priority $3; policy $4;\n"
- }
-
- # qosdef_append_rule_{MATCH}_{STATEMENT}
- qosdef_append_rule_ip_limit() { # <ipaddr> <operator> <unit> <rate>
- local ipaddr=$1
- local operator=$2
- local unit=$3
- local rate=$4
-
- qosdef_appendx \
- "\t\tip $operator $ipaddr limit rate over $rate $unit/second drop\n"
- }
-
- # qosdef_append_rule_{MATCH}_{STATEMENT}
- qosdef_append_rule_mac_limit() { # <macaddr> <operator> <unit> <rate>
- local macaddr=$1
- local operator=$2
- local unit=$3
- local rate=$4
-
- qosdef_appendx \
- "\t\tether $operator $macaddr limit rate over $rate $unit/second drop\n"
- }
-
- # qosdef_append_rule_{MATCH}_{POLICY}
- qosdef_append_rule_ip_policy() { # <operator> <ipaddr> <policy>
- qosdef_appendx "\t\tip $1 $2 $3\n"
- }
-
- _handle_limit_whitelist() { # <value> <chain>
- local ipaddr=$1
- local operator
-
- [ -z "$ipaddr" ] && return
-
- case "$2" in
- download) operator="daddr";;
- upload) operator="saddr";;
- esac
-
- qosdef_append_rule_ip_policy $operator $ipaddr accept
- }
-
- qosdef_append_rule_limit_whitelist() { # <chain>
- config_list_foreach default limit_whitelist _handle_limit_whitelist $1
- }
-
- qosdef_flush_table() { # <family> <table>
- nft flush table $1 $2 2>/dev/null
- }
-
- qosdef_remove_table() { # <family> <table>
- nft delete table $1 $2 2>/dev/null
- }
-
- qosdef_init_header() { # add header for nft script
- qosdef_appendx "#!/usr/sbin/nft -f\n"
- qosdef_appendx "# Copyright (C) 2018 rosysong@rosinson.com\n"
- qosdef_appendx "#\n\n"
- }
-
- qosdef_init_env() {
- # check interface type of lan
- local lt="$(uci_get "network.lan.type")"
- [ "$lt" = "bridge" ] && export NFT_QOS_HAS_BRIDGE="y"
-
- # check if ipv6 support
- [ -e /proc/sys/net/ipv6 ] && export NFT_QOS_INET_FAMILY="inet"
- }
-
- qosdef_clean_cache() {
- rm -f $NFT_QOS_SCRIPT_FILE
- }
-
- qosdef_init_done() {
- echo -e $NFT_QOS_SCRIPT_TEXT > $NFT_QOS_SCRIPT_FILE 2>/dev/null
- }
-
- qosdef_start() {
- nft -f $NFT_QOS_SCRIPT_FILE 2>/dev/null
- }
|