immortalwrt-mt798x-padavanonly/package/mtk/applications/luci-app-eqos-mtk/root/usr/sbin/eqos
2024-09-10 01:20:48 +08:00

188 lines
6.6 KiB
Bash
Executable File

#!/bin/sh
dev=br-lan
hash_file="/tmp/hash_records.txt"
generate_index() {
local input="$1"
local hash_value=$(echo -n "$input" | md5sum | cut -d' ' -f1)
local decimal_value=$((0x${hash_value:0:8}))
local index=$((decimal_value % 31 + 1))
echo $index
}
find_available_index() {
local base_index=$(generate_index "$1")
local index=$base_index
while true; do
if grep -q "^$index$" "$hash_file"; then
index=$((index % 31 + 1))
if [[ $index -eq $base_index ]]; then
echo "All slots are full. Returning 0."
return 0
fi
else
echo $index >> "$hash_file"
echo $index
return 0
fi
done
}
stop_qos() {
tc qdisc del dev $dev root 2>/dev/null
tc qdisc del dev $dev ingress 2>/dev/null
tc qdisc del dev ${dev}-ifb root 2>/dev/null
ip link del dev ${dev}-ifb 2>/dev/null
}
start_qos() {
local dl=$1
local up=$2
rm /tmp/hash_records.txt
touch "$hash_file"
tc qdisc add dev $dev root handle 1: htb
tc class add dev $dev parent 1: classid 1:1 htb rate ${dl}mbit
ip link add dev ${dev}-ifb name ${dev}-ifb type ifb
ip link set dev ${dev}-ifb up
tc qdisc add dev ${dev}-ifb root handle 1: htb
tc class add dev ${dev}-ifb parent 1: classid 1:1 htb rate ${up}mbit
tc qdisc add dev $dev ingress
tc filter add dev $dev parent ffff: protocol ip u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev ${dev}-ifb
}
iptables_stop() {
iptables -t mangle -D FORWARD -j eqos
ip6tables -t mangle -D FORWARD -j eqos
ebtables -t nat -D POSTROUTING -j eqos -p ipv6
echo 0 > /sys/kernel/debug/hnat/qos_toggle
sed -i '/\/etc\/init.d\/eqos start/d' /etc/firewall.user
iptables -t mangle -D FORWARD -i br-lan -j DSCP --set-dscp 0
iptables -t mangle -D FORWARD -o br-lan -j DSCP --set-dscp 0
ip6tables -t mangle -D FORWARD -i br-lan -j DSCP --set-dscp 0
ip6tables -t mangle -D FORWARD -o br-lan -j DSCP --set-dscp 0
echo "10 0" > /sys/kernel/debug/hnat/hnat_setting
echo "11 30" >/sys/kernel/debug/hnat/hnat_setting
for i in $(seq 0 31); do
echo 0 0 0 0 0 4 4 > /sys/kernel/debug/hnat/qdma_txq$i
done
for i in $(seq 32 63); do
echo 1 0 0 0 0 4 4 > /sys/kernel/debug/hnat/qdma_txq$i
done
echo 0 wrr 10000000 > /sys/kernel/debug/hnat/qdma_sch0
echo 0 wrr 10000000 > /sys/kernel/debug/hnat/qdma_sch1
echo 0 wrr 10000000 > /sys/kernel/debug/hnat/qdma_sch2
echo 0 wrr 10000000 > /sys/kernel/debug/hnat/qdma_sch3
}
iptables_start_prepare() {
iptables -t mangle -D FORWARD -i br-lan -j DSCP --set-dscp 0
iptables -t mangle -D FORWARD -o br-lan -j DSCP --set-dscp 0
iptables -t mangle -A FORWARD -i br-lan -j DSCP --set-dscp 0
iptables -t mangle -A FORWARD -o br-lan -j DSCP --set-dscp 0
ip6tables -t mangle -D FORWARD -i br-lan -j DSCP --set-dscp 0
ip6tables -t mangle -D FORWARD -o br-lan -j DSCP --set-dscp 0
ip6tables -t mangle -A FORWARD -i br-lan -j DSCP --set-dscp 0
ip6tables -t mangle -A FORWARD -o br-lan -j DSCP --set-dscp 0
}
iptables_start_inital() {
iptables -t mangle -N eqos
iptables -t mangle -F eqos
iptables -t mangle -D FORWARD -j eqos
iptables -t mangle -A FORWARD -j eqos
echo 1 > /sys/kernel/debug/hnat/qos_toggle
echo 0 wrr 10000000 > /sys/kernel/debug/hnat/qdma_sch0
echo 0 wrr 10000000 > /sys/kernel/debug/hnat/qdma_sch1
echo 0 0 0 0 0 0 0 > /sys/kernel/debug/hnat/qdma_txq0
echo 1 0 0 0 0 0 0 > /sys/kernel/debug/hnat/qdma_txq32
echo "11 5" >/sys/kernel/debug/hnat/hnat_setting
uci -q set "turboacc.config.fastpath_mh_eth_hnat_bind_rate"="5"
uci -q commit "turboacc"
sed -i '/\/etc\/init.d\/eqos start/d' /etc/firewall.user
echo "/etc/init.d/eqos start" >> /etc/firewall.user
echo "10 1" > /sys/kernel/debug/hnat/hnat_setting
}
case "$1" in
"stop")
stop_qos
iptables_stop
;;
"start")
stop_qos
iptables_start_prepare
start_qos $2 $3
iptables_start_inital
echo 1 wrr $(($3*1000)) > /sys/kernel/debug/hnat/qdma_sch2
echo 1 wrr $(($2*1000)) > /sys/kernel/debug/hnat/qdma_sch3
;;
"add")
ip="$2"
dl="$3"
up="$4"
macaddr="$6"
cnt=$(tc class show dev $dev | wc -l)
interface="$7"
if [ -n "$ip" ]; then
id="$(find_available_index "$ip")"
elif [ -n "$macaddr" ]; then
id="$(find_available_index "$macaddr")"
fi
idpair=$((id+32))
if [ $id -lt 32 ]; then
iptables -t mangle -D eqos -s $ip -j DSCP --set-dscp ${id}
iptables -t mangle -D eqos -d $ip -j DSCP --set-dscp ${idpair}
ip6tables -t mangle -D eqos -m mac --mac-source $macaddr -j MARK --set-mark ${id}
ebtables -t nat -D eqos -p ipv6 -d $macaddr -j mark --mark-set ${idpair}
if [ $up -ne 0 ]; then
echo 2 0 0 1 ${up} 4 1 > /sys/kernel/debug/hnat/qdma_txq${id}
iptables -t mangle -A eqos -s $ip -j DSCP --set-dscp ${id}
ip6tables -t mangle -A eqos -m mac --mac-source $macaddr -j MARK --set-mark ${id}
fi
if [ $dl -ne 0 ]; then
echo 3 0 0 1 ${dl} 4 1 > /sys/kernel/debug/hnat/qdma_txq${idpair}
iptables -t mangle -A eqos -d $ip -j DSCP --set-dscp ${idpair}
ebtables -t nat -A eqos -p ipv6 -d $macaddr -j mark --mark-set ${idpair}
fi
else
iptables -t mangle -D eqos -s $ip -j MARK --set-mark 0x99
iptables -t mangle -D eqos -d $ip -j MARK --set-mark 0x99
if [ $up -ne 0 ]; then
iptables -t mangle -A eqos -s $ip -j MARK --set-mark 0x99
fi
if [ $dl -ne 0 ]; then
iptables -t mangle -A eqos -d $ip -j MARK --set-mark 0x99
fi
fi
if [ $id -gt 31 ]; then
tc class add dev $dev parent 1:1 classid 1:1$cnt htb rate ${dl}kbit ceil ${dl}kbit
tc filter add dev $dev parent 1:0 protocol ip u32 match ip dst $ip flowid 1:1$cnt
tc class add dev ${dev}-ifb parent 1:1 classid 1:1$cnt htb rate ${up}kbit ceil ${up}kbit
tc filter add dev ${dev}-ifb parent 1:0 protocol ip u32 match ip src $ip flowid 1:1$cnt
fi
if [ $interface ]; then
iptables -t mangle -D PREROUTING -s $ip -m conntrack --ctstate NEW -j MARK --set-mark 2"$interface"
iptables -t mangle -A PREROUTING -s $ip -m conntrack --ctstate NEW -j MARK --set-mark 2"$interface"
iptables -t mangle -D PREROUTING -i br-lan -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -i br-lan -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
fi
;;
*)
echo "Usage: $0 <command> [options]"
echo "Commands:"
echo " start dl_rate up_rate #Total bandwidth (Mbit/s)"
echo " stop"
echo " add ip dl_rate up_rate #Limiting the bandwidth of a single IP (kbit/s)"
echo "Example:"
echo " $0 start 30 20 # Total bandwidth: down 30Mbit/s up 20Mbit/s"
echo " $0 add 192.168.22.12 10 2 # down 10kbit/s up 2kbit/s"
;;
esac