rendered paste body#!/bin/bash
# -------------- HTB Sharper 1.7.3 "rc.htb" -------------
# All rights reserved for B@roo 2000-2005
# Poprawki Gervys79
# ---------------------------------------------------------
#set -x
# Ladowanie konfiguracji
if [ ! -e ${0%rc.htb}rc.fire_conf ]; then
exit 1
fi
START_FILE="rc.htb"
source ${0%rc.htb}rc.fire_conf
if [ ! "$QOS_ENABLE" == "htb" ]; then
echo -n "HTB QoS fuction is disable."
exit 1
fi
# -------- Ladowanie modulow i usuwanie kolejek ------------
ip link set imq0 up
ip link set imq1 up
stop()
{
tc qdisc del root dev imq1 2> /dev/null
tc qdisc del root dev imq0 2> /dev/null
}
# ----------------- Przeliczenia klas ----------------------
start()
{
if [ "$NAT_ENABLE" == "MASQUERADE" ]; then
INTERNET_IP=`ifconfig $INTERNET_ETH | grep "inet addr:" | awk '{print $2}' | cut -d ":" -f 2`
fi
DOWNLOAD_ALL_UL=$[$DOWNLOAD*99/100]
DOWNLOAD_ALL=$[$DOWNLOAD*98/100]
DOWNLOAD_PRIO=`echo $QOS_PRIO_BAND | cut -d':' -f1`
DOWNLOAD_CRIT=`echo $QOS_CRIT_BAND | cut -d':' -f1`
if [ ! `echo $QOS_CRIT_BAND | cut -d':' -f3` == "hard" ]; then
DOWNLOAD_CRIT_UL=$DOWNLOAD_ALL_UL
DOWNLOAD_NORMAL=$[$DOWNLOAD_ALL-$DOWNLOAD_CRIT]
DOWNLOAD_NORMAL_UL=$DOWNLOAD_ALL_UL
else
DOWNLOAD_CRIT_UL=$DOWNLOAD_ALL_UL
DOWNLOAD_NORMAL=$[$DOWNLOAD_ALL-$DOWNLOAD_CRIT]
DOWNLOAD_NORMAL_UL=$[$DOWNLOAD_ALL_UL-$DOWNLOAD_CRIT]
fi
if [ "$DOWNLOAD_CRIT" -ge "$[$DOWNLOAD_ALL/2]" ]; then
DOWNLOAD_CRIT_M1=$[$DOWNLOAD_ALL*75/100]
else
DOWNLOAD_CRIT_M1=$[2*$DOWNLOAD_CRIT*85/100]
fi
UPLOAD_ALL_UL=$[$UPLOAD*99/100]
UPLOAD_ALL=$[$UPLOAD*98/100]
UPLOAD_PRIO=`echo $QOS_PRIO_BAND | cut -d':' -f2`
UPLOAD_CRIT=`echo $QOS_CRIT_BAND | cut -d':' -f2`
if [ ! `echo $QOS_CRIT_BAND | cut -d':' -f3` == "hard" ]; then
UPLOAD_CRIT_UL=$UPLOAD_ALL_UL
UPLOAD_NORMAL=$[$UPLOAD_ALL-$UPLOAD_CRIT]
UPLOAD_NORMAL_UL=$UPLOAD_ALL_UL
else
UPLOAD_CRIT_UL=$UPLOAD_ALL_UL
UPLOAD_NORMAL=$[$UPLOAD_ALL-$UPLOAD_CRIT]
UPLOAD_NORMAL_UL=$[$UPLOAD_ALL_UL-$UPLOAD_CRIT]
fi
if [ "$UPLOAD_CRIT" -ge "$[$UPLOAD_ALL/2]" ]; then
UPLOAD_CRIT_M1=$[$UPLOAD_ALL*75/100]
else
UPLOAD_CRIT_M1=$[2*$UPLOAD_CRIT*85/100]
fi
DOWNLOAD_ROUTER=`echo $QOS_ROUTER_BAND | cut -d':' -f1`
UPLOAD_ROUTER=`echo $QOS_ROUTER_BAND | cut -d':' -f3`
if [ ! `echo $QOS_ROUTER_BAND | cut -d':' -f2` == "auto" ]; then
DOWNLOAD_ROUTER_UL=`echo $QOS_ROUTER_BAND | cut -d':' -f2`
else
DOWNLOAD_ROUTER_UL=$DOWNLOAD_NORMAL_UL
fi
if [ ! `echo $QOS_ROUTER_BAND | cut -d':' -f4` == "auto" ]; then
UPLOAD_ROUTER_UL=`echo $QOS_ROUTER_BAND | cut -d':' -f4`
else
UPLOAD_ROUTER_UL=$UPLOAD_NORMAL_UL
fi
USERS_COUNT_DOWN=0
RATE_COUNT_DOWN=0
USERS_COUNT_UP=0
RATE_COUNT_UP=0
if [ ! "$P2P_LIMIT" == "" ]; then
USERS_COUNT_DOWN=1
USERS_COUNT_UP=1
fi
for i in $QOS_ALLOW
do
if [ ! `echo $i | cut -d':' -f2` == "auto" ]; then
TMP=`echo $i | cut -d':' -f2`
RATE_COUNT_DOWN=$[$RATE_COUNT_DOWN+$TMP]
else
USERS_COUNT_DOWN=$[$USERS_COUNT_DOWN+1]
fi
if [ ! `echo $i | cut -d':' -f4` == "auto" ]; then
TMP=`echo $i | cut -d':' -f4`
RATE_COUNT_UP=$[$RATE_COUNT_UP+$TMP]
else
USERS_COUNT_UP=$[$USERS_COUNT_UP+1]
fi
done
if [ ! "$USERS_COUNT_DOWN" == "0" ]; then
DOWNLOAD_USER_RATE=$[($DOWNLOAD_NORMAL-$DOWNLOAD_PRIO-$DOWNLOAD_ROUTER-$RATE_COUNT_DOWN)/$USERS_COUNT_DOWN]
fi
if [ ! "$USERS_COUNT_UP" == "0" ]; then
UPLOAD_USER_RATE=$[($UPLOAD_NORMAL-$UPLOAD_PRIO-$UPLOAD_ROUTER-$RATE_COUNT_UP)/$USERS_COUNT_UP]
fi
# P2P
if [ "$P2P_TYPE" == "advanced" ]; then
if [ ! "$P2P_LIMIT" == "" ]; then
DOWNLOAD_ALL_P2P=`echo $P2P_LIMIT | cut -d':' -f1`
UPLOAD_ALL_P2P=`echo $P2P_LIMIT | cut -d':' -f2`
RATE_COUNT_DOWN_P2P=0
USERS_COUNT_DOWN_P2P=0
RATE_COUNT_UP_P2P=0
USERS_COUNT_UP_P2P=0
else
echo "Warning: you must define P2P_LIMIT value in advanced mode"
fi
fi
if [ "$P2P_TYPE" == "advanced" ]; then
if [ ! "$P2P_LIMIT" == "" ]; then
for i in $P2P_USER_LIMIT
do
if [ ! `echo $i | cut -d':' -f2` == "auto" ]; then
TMP=`echo $i | cut -d':' -f2`
RATE_COUNT_DOWN_P2P=$[$RATE_COUNT_DOWN_P2P+$TMP]
else
USERS_COUNT_DOWN_P2P=$[$USERS_COUNT_DOWN_P2P+1]
fi
if [ ! `echo $i | cut -d':' -f4` == "auto" ]; then
TMP=`echo $i | cut -d':' -f4`
RATE_COUNT_UP_P2P=$[$RATE_COUNT_UP_P2P+$TMP]
else
USERS_COUNT_UP_P2P=$[$USERS_COUNT_UP_P2P+1]
fi
done
if [ ! "$USERS_COUNT_DOWN_P2P" == "0" ]; then
DOWNLOAD_USER_RATE_P2P=$[($DOWNLOAD_ALL_P2P-$RATE_COUNT_DOWN_P2P)/$USERS_COUNT_DOWN_P2P]
fi
if [ ! "$USERS_COUNT_UP_P2P" == "0" ]; then
UPLOAD_USER_RATE_P2P=$[($UPLOAD_ALL_P2P-$RATE_COUNT_UP_P2P)/$USERS_COUNT_UP_P2P]
fi
fi
fi
# ------------ Tworzenie kolejek - odbieranie ---------------
### Tworzenie korzenia kolejek
tc qdisc add dev imq0 root handle 1:0 htb default 100 r2q 4
tc class add dev imq0 parent 1:0 classid 1:1 htb rate ${DOWNLOAD_ALL}kbit ceil ${DOWNLOAD_ALL_UL}kbit
### Ruch krytyczny
tc class add dev imq0 parent 1:1 classid 1:2 htb rate ${DOWNLOAD_CRIT_M1}kbit ceil ${DOWNLOAD_CRIT_UL}kbit
tc qdisc add dev imq0 parent 1:2 sfq perturb 5
tc filter add dev imq0 parent 1:0 protocol ip prio 2 handle 0x2 fw flowid 1:2
### Ruch normalny
tc class add dev imq0 parent 1:1 classid 1:5 htb rate ${DOWNLOAD_NORMAL}kbit ceil ${DOWNLOAD_NORMAL_UL}kbit
# Ruch priorytetowy
tc class add dev imq0 parent 1:5 classid 1:10 htb rate ${DOWNLOAD_PRIO}kbit ceil ${DOWNLOAD_NORMAL_UL}kbit
tc qdisc add dev imq0 parent 1:10 sfq perturb 5
tc filter add dev imq0 parent 1:0 protocol ip prio 3 u32 match ip protocol 17 0xff match ip sport 53 0xffff flowid 1:10 # DNS
# Ruch routera
tc class add dev imq0 parent 1:5 classid 1:20 htb rate ${DOWNLOAD_ROUTER}kbit ceil ${DOWNLOAD_ROUTER_UL}kbit
tc qdisc add dev imq0 parent 1:20 sfq perturb 10
tc filter add dev imq0 parent 1:0 protocol ip prio 4 u32 match ip dst $INTERNET_IP flowid 1:20
# Ruch P2P
if [ "$P2P_TYPE" == "normal" ]; then
if [ ! "$P2P_LIMIT" == "" ]; then
DOWNLOAD_P2P=`echo $P2P_LIMIT | cut -d':' -f1`
tc class add dev imq0 parent 1:5 classid 1:30 htb rate ${DOWNLOAD_USER_RATE}kbit ceil ${DOWNLOAD_P2P}kbit
tc qdisc add dev imq0 parent 1:30 esfq perturb 10 hash dst
tc filter add dev imq0 parent 1:0 protocol ip prio 1 handle 0x30 fw flowid 1:30
fi
fi
# Ruch normalny userow
if [ "$P2P_TYPE" == "normal" ]; then
MARK=100
else
MARK=50
MARK2=500
fi
for i in $QOS_ALLOW
do
DOWN_NORMAL=$DOWNLOAD_USER_RATE
DOWN_CEIL=$DOWNLOAD_NORMAL_UL
ADDRESS=`echo $i | cut -d':' -f1`
if [ ! `echo $i | cut -d':' -f2` == "auto" ]; then
DOWN_NORMAL=`echo $i | cut -d':' -f2`
fi
if [ ! `echo $i | cut -d':' -f3` == "auto" ]; then
DOWN_CEIL=`echo $i | cut -d':' -f3`
DL="ceil ${DOWN_CEIL}kbit"
else
DL="ceil ${DOWN_CEIL}kbit"
fi
if [ $DOWN_NORMAL -ge $DOWN_CEIL ]; then
DOWN_NORMAL=$DOWN_CEIL
fi
if [ "$P2P_TYPE" == "normal" ]; then
tc class add dev imq0 parent 1:5 classid 1:${MARK} htb rate ${DOWN_NORMAL}kbit $DL
if [ "$QOS_ALLOW_METHOD" == "esfq" ]; then
tc qdisc add dev imq0 parent 1:${MARK} esfq perturb 10 hash dst
elif [ "$QOS_ALLOW_METHOD" == "sfq" ]; then
tc qdisc add dev imq0 parent 1:${MARK} sfq perturb 10
else
tc qdisc add dev imq0 parent 1:${MARK} sfq perturb 10
fi
tc filter add dev imq0 parent 1:0 protocol ip prio 5 u32 match ip dst $ADDRESS flowid 1:${MARK}
MARK=$[$MARK+1]
elif [ "$P2P_TYPE" == "advanced" ]; then
tc class add dev imq0 parent 1:5 classid 1:${MARK} htb rate ${DOWN_NORMAL}kbit $DL
if [ "$QOS_ALLOW_METHOD" == "esfq" ]; then
tc qdisc add dev imq0 parent 1:${MARK} esfq perturb 10 hash dst
elif [ "$QOS_ALLOW_METHOD" == "sfq" ]; then
tc qdisc add dev imq0 parent 1:${MARK} sfq perturb 10
else
tc qdisc add dev imq0 parent 1:${MARK} sfq perturb 10
fi
tc class add dev imq0 parent 1:${MARK} classid 1:${MARK2} htb rate ${DOWN_NORMAL}kbit $DL
if [ "$QOS_ALLOW_METHOD" == "esfq" ]; then
tc qdisc add dev imq0 parent 1:${MARK2} esfq perturb 10 hash dst
elif [ "$QOS_ALLOW_METHOD" == "sfq" ]; then
tc qdisc add dev imq0 parent 1:${MARK2} sfq perturb 10
else
tc qdisc add dev imq0 parent 1:${MARK2} sfq perturb 10
fi
tc filter add dev imq0 parent 1:0 protocol ip prio 5 u32 match ip dst $ADDRESS flowid 1:${MARK2}
MARK=$[$MARK+1]
MARK2=$[$MARK2+2]
fi
done
# Ruch p2p userow
if [ "$P2P_TYPE" == "advanced" ]; then
MARK=50
MARK2=501
for i in $P2P_USER_LIMIT
do
DOWN_NORMAL_P2P=$DOWNLOAD_USER_RATE_P2P
DOWN_CEIL_P2P=`echo $P2P_LIMIT | cut -d':' -f1`
if [ ! `echo $i | cut -d':' -f2` == "auto" ]; then
DOWN_NORMAL_P2P=`echo $i | cut -d':' -f2`
fi
if [ ! `echo $i | cut -d':' -f3` == "auto" ]; then
DOWN_CEIL_P2P=`echo $i | cut -d':' -f3`
DL_P2P="ceil ${DOWN_CEIL_P2P}kbit"
else
DL_P2P="ceil ${DOWN_CEIL_P2P}kbit"
fi
if [ $DOWN_NORMAL_P2P -ge $DOWN_CEIL_P2P ]; then
DOWN_NORMAL_P2P=$DOWN_CEIL_P2P
fi
tc class add dev imq0 parent 1:${MARK} classid 1:${MARK2} htb rate ${DOWN_NORMAL_P2P}kbit $DL_P2P
tc qdisc add dev imq0 parent 1:${MARK2} esfq perturb 10 hash dst
tc filter add dev imq0 parent 1:0 protocol ip prio 1 handle 0x${MARK2} fw flowid 1:${MARK2}
MARK=$[$MARK+1]
MARK2=$[$MARK2+2]
done
# ------------- Tworzenie kolejek - wysylanie ----------------
### Tworzenie korzenia kolejek
if [ "$P2P_TYPE" == "normal" ]; then
tc qdisc add dev imq1 root handle 1:0 htb default 100 r2q 4
else
tc qdisc add dev imq1 root handle 1:0 htb default 50 r2q 4
fi
tc class add dev imq1 parent 1:0 classid 1:1 htb rate ${UPLOAD_ALL}kbit ceil ${UPLOAD_ALL_UL}kbit
### Ruch krytyczny
tc class add dev imq1 parent 1:1 classid 1:2 htb rate ${UPLOAD_CRIT_M1}kbit ceil ${UPLOAD_CRIT_UL}kbit
tc qdisc add dev imq1 parent 1:2 sfq perturb 5
tc filter add dev imq1 parent 1:0 protocol ip prio 2 handle 0x2 fw flowid 1:2
### Ruch normalny
tc class add dev imq1 parent 1:1 classid 1:5 htb rate ${UPLOAD_NORMAL}kbit ceil ${UPLOAD_NORMAL_UL}kbit
# Ruch priorytetowy
tc class add dev imq1 parent 1:5 classid 1:10 htb rate ${UPLOAD_PRIO}kbit ceil ${UPLOAD_NORMAL_UL}kbit
tc qdisc add dev imq1 parent 1:10 sfq perturb 5
tc filter add dev imq1 parent 1:0 protocol ip prio 3 u32 match ip protocol 17 0xff match ip dport 53 0xffff flowid 1:10 # DNS
tc filter add dev imq1 parent 1:0 protocol ip prio 3 u32 match ip protocol 6 0xff \
match u8 0x05 0x0f at 0 match u16 0x0000 0xffc0 at 2 match u8 0x10 0xff at 33 flowid 1:10 # ACK
# Ruch routera
tc class add dev imq1 parent 1:5 classid 1:20 htb rate ${UPLOAD_ROUTER}kbit ceil ${UPLOAD_ROUTER_UL}kbit
tc qdisc add dev imq1 parent 1:20 sfq perturb 10
tc filter add dev imq1 parent 1:0 protocol ip prio 4 handle 0x20 fw flowid 1:20
# Ruch P2P
if [ "$P2P_TYPE" == "normal" ]; then
if [ ! "$P2P_LIMIT" == "" ]; then
UPLOAD_P2P=`echo $P2P_LIMIT | cut -d':' -f2`
tc class add dev imq1 parent 1:5 classid 1:30 htb rate ${UPLOAD_USER_RATE}kbit ceil ${UPLOAD_P2P}kbit
tc qdisc add dev imq1 parent 1:30 esfq perturb 10 hash src
tc filter add dev imq1 parent 1:0 protocol ip prio 1 handle 0x30 fw flowid 1:30
fi
fi
# Ruch normalny userow
if [ "$P2P_TYPE" == "normal" ]; then
MARK=100
else
MARK=50
MARK2=500
MARK3=100
fi
for i in $QOS_ALLOW
do
UP_NORMAL=$UPLOAD_USER_RATE
UP_CEIL=$UPLOAD_NORMAL_UL
if [ ! `echo $i | cut -d':' -f4` == "auto" ]; then
UP_NORMAL=`echo $i | cut -d':' -f4`
fi
if [ ! `echo $i | cut -d':' -f5` == "auto" ]; then
UP_CEIL=`echo $i | cut -d':' -f5`
UL="ceil ${UP_CEIL}kbit"
else
UL="ceil ${UP_CEIL}kbit"
fi
if [ $UP_NORMAL -ge $UP_CEIL ]; then
UP_NORMAL=$UP_CEIL
fi
if [ "$P2P_TYPE" == "normal" ]; then
tc class add dev imq1 parent 1:5 classid 1:${MARK} htb rate ${UP_NORMAL}kbit $UL
if [ "$QOS_ALLOW_METHOD" == "esfq" ]; then
tc qdisc add dev imq1 parent 1:${MARK} esfq perturb 10 hash src
elif [ "$QOS_ALLOW_METHOD" == "sfq" ]; then
tc qdisc add dev imq1 parent 1:${MARK} sfq perturb 10
else
tc qdisc add dev imq1 parent 1:${MARK} sfq perturb 10
fi
tc filter add dev imq1 parent 1:0 protocol ip prio 5 handle 0x${MARK} fw flowid 1:${MARK}
MARK=$[$MARK+1]
elif [ "$P2P_TYPE" == "advanced" ]; then
tc class add dev imq1 parent 1:5 classid 1:${MARK} htb rate ${UP_NORMAL}kbit $UL
if [ "$QOS_ALLOW_METHOD" == "esfq" ]; then
tc qdisc add dev imq1 parent 1:${MARK} esfq perturb 10 hash src
elif [ "$QOS_ALLOW_METHOD" == "sfq" ]; then
tc qdisc add dev imq1 parent 1:${MARK} sfq perturb 10
else
tc qdisc add dev imq1 parent 1:${MARK} sfq perturb 10
fi
tc class add dev imq1 parent 1:${MARK} classid 1:${MARK2} htb rate ${UP_NORMAL}kbit $UL
if [ "$QOS_ALLOW_METHOD" == "esfq" ]; then
tc qdisc add dev imq1 parent 1:${MARK2} esfq perturb 10 hash src
elif [ "$QOS_ALLOW_METHOD" == "sfq" ]; then
tc qdisc add dev imq1 parent 1:${MARK2} sfq perturb 10
else
tc qdisc add dev imq1 parent 1:${MARK2} sfq perturb 10
fi
tc filter add dev imq1 parent 1:0 protocol ip prio 5 handle 0x${MARK3} fw flowid 1:${MARK2}
MARK=$[$MARK+1]
MARK2=$[$MARK2+2]
MARK3=$[$MARK3+1]
fi
done
# Ruch p2p userow
if [ "$P2P_TYPE" == "advanced" ]; then
MARK=50
MARK2=501
for i in $P2P_USER_LIMIT
do
UP_NORMAL_P2P=$UPLOAD_USER_RATE_P2P
UP_CEIL_P2P=`echo $P2P_LIMIT | cut -d':' -f2`
if [ ! `echo $i | cut -d':' -f4` == "auto" ]; then
UP_NORMAL_P2P=`echo $i | cut -d':' -f4`
fi
if [ ! `echo $i | cut -d':' -f5` == "auto" ]; then
UP_CEIL_P2P=`echo $i | cut -d':' -f5`
UL_P2P="ceil ${UP_CEIL_P2P}kbit"
else
UL_P2P="ceil ${UP_CEIL_P2P}kbit"
fi
if [ $UP_NORMAL_P2P -ge $UP_CEIL_P2P ]; then
UP_NORMAL_P2P=$UP_CEIL_P2P
fi
tc class add dev imq1 parent 1:${MARK} classid 1:${MARK2} htb rate ${UP_NORMAL_P2P}kbit $UL_P2P
tc qdisc add dev imq1 parent 1:${MARK2} esfq perturb 10 hash src
tc filter add dev imq1 parent 1:0 protocol ip prio 1 handle 0x${MARK2} fw flowid 1:${MARK2}
MARK=$[$MARK+1]
MARK2=$[$MARK2+2]
done
fi
fi
}
# -------------------- { start | stop } ----------------------
case "$1" in
'start')
echo "Starting HTB Sharper 1.7.3 STABLE ... - All rights reserved for B@roo 2000-2005"
echo " Poprawki Gervys79"
echo " HTB"
echo "--------------------------------------------------------------------------------"
stop
start
;;
'stop')
echo "Stopping HTB Sharper 1.7.3 STABLE ... - All rights reserved for B@roo 2000-2005"
echo " Poprawki Gervys79"
echo "--------------------------------------------------------------------------------"
stop
;;
*)
echo -e "\n Usage: rc.htb { start | stop }"
;;
esac