mirror of
https://github.com/padavanonly/immortalwrt-mt798x.git
synced 2025-12-16 16:56:38 +00:00
188 lines
6.6 KiB
Bash
Executable File
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
|