#!/bin/sh # # 1st parameter MAX_CLIENTS # 2nd parameter BASE_PORT DEV=eth1 # Bandwidth values (in kbits) BANDWIDTH=3500 # The following must sum $BANDWIDTH or less VIDEO_BW=3000 CONTROL_BW=300 VIDEO_LEVEL_0_BW=1000 VIDEO_LEVEL_1_BW=800 VIDEO_LEVEL_2_BW=700 VIDEO_LEVEL_3_BW=500 #Buffer length in k VIDEO_BUFFER=15000 # Priorities to get the remaining bandwidth # 0 is max (can be repeated) PRIO_CONTROL=0 PRIO_VIDEO=1 PRIO_OTHER=3 INSMOD=/sbin/insmod # Load kernel modules grep -q ^sch_htb /proc/modules || $INSMOD /lib/modules/`uname -r`/sch_htb.o grep -q ^sch_sfq /proc/modules || $INSMOD /lib/modules/`uname -r`/sch_sfq.o grep -q ^cls_u32 /proc/modules || $INSMOD /lib/modules/`uname -r`/cls_u32.o echo "Vai comecar o script" # Clean existing qdiscs (redirects error output to /dev/null) tc qdisc del dev $DEV root 2> /dev/null tc qdisc del dev $DEV ingress 2> /dev/null echo "Passou pelo del" # Creates root qdisc with HTB policy. Default class for packets is 12 (less prio) tc qdisc add dev $DEV root handle 1: htb default 12 echo "Passou pelo cria qdisc root" # Creates a root class hanging from the root qdisc # This allows other sub-classes of this one to borrow the remaining bandwidth # If we prescind of this one and hang subclasses directly from the root qdisc # then the remaining bandwidth is lost (!) tc class add dev $DEV parent 1: classid 1:1 htb rate ${BANDWIDTH}kbit ceil ${BANDWIDTH}kbit echo "Passou pela primeira classe" # Now creates 3 classes: (1:10 = max prio) # 1:10 for Control packets # 1:11 for Video packets # 1:12 for other packets tc class add dev $DEV parent 1:1 classid 1:10 htb rate ${CONTROL_BW}kbit ceil ${BANDWIDTH}kbit prio $PRIO_CONTROL tc class add dev $DEV parent 1:1 classid 1:11 htb rate ${VIDEO_BW}kbit ceil ${BANDWIDTH}kbit prio $PRIO_VIDEO tc class add dev $DEV parent 1:1 classid 1:12 htb rate $(($BANDWIDTH - $VIDEO_BW - CONTROL_BW))kbit ceil ${BANDWIDTH}kbit prio $PRIO_OTHER echo "Passou por todas as classes" # Creates four sub-classes for Vídeo (level 0 (1:13), level 1 (1:14), level 2 (1:15) and level 3 (1:16)) tc class add dev $DEV parent 1:11 classid 1:13 htb rate ${VIDEO_LEVEL_0_BW}kbit ceil ${BANDWIDTH}kbit prio $PRIO_VIDEO tc class add dev $DEV parent 1:11 classid 1:14 htb rate ${VIDEO_LEVEL_1_BW}kbit ceil ${BANDWIDTH}kbit prio $PRIO_VIDEO tc class add dev $DEV parent 1:11 classid 1:15 htb rate ${VIDEO_LEVEL_2_BW}kbit ceil ${BANDWIDTH}kbit prio $PRIO_VIDEO tc class add dev $DEV parent 1:11 classid 1:16 htb rate ${VIDEO_LEVEL_3_BW}kbit ceil ${BANDWIDTH}kbit prio $PRIO_VIDEO echo "Passou pelas subclasses" # Now creates qdiscs to handle the packets of each class # Since all of them must treat equally concurrent connections we use sqf everywhere tc qdisc add dev $DEV parent 1:10 handle 10: sfq perturb 10 tc qdisc add dev $DEV parent 1:12 handle 12: sfq perturb 10 tc qdisc add dev $DEV parent 1:13 handle 13: sfq perturb 10 tc qdisc add dev $DEV parent 1:14 handle 14: sfq perturb 10 tc qdisc add dev $DEV parent 1:15 handle 15: sfq perturb 10 tc qdisc add dev $DEV parent 1:16 handle 16: sfq perturb 10 echo "Vai comecar os match" # Filters #tem que especificar primeiro se é um pacote transferido por tcp ou udp (no caso de pacotes de controle é usado tcp) #depois, a partir do vigésimo byte, que é o campo de opções do cabeçalho ip, deve-se ler os bytes mostrados #depois disso, passar o fluxo para a classe de pacotes de controle tc filter add dev $DEV parent 1: \ protocol ip prio $PRIO_CONTROL \ u32 match ip protocol 6 0xff \ match u32 00190000 00ff0000 at 0 \ flowid 1:10 echo "Passou pelo 1 match" #tem que especificar primeiro se é um pacote transferido por tcp ou udp (no caso de pacotes de vídeo é usado udp) #depois, a partir do vigésimo primeiro byte, que é o campo de opções do cabeçalho ip, deve-se ler os bytes mostrados #depois disso, passar o fluxo para a classe de pacotes de controle tc filter add dev $DEV protocol ip parent 1: prio $PRIO_VIDEO u32 \ match ip protocol 17 0xff \ match u32 001b0000 00ff0000 at 0 \ police rate ${VIDEO_LEVEL_0_BW}kbit buffer ${VIDEO_BUFFER}k drop \ flowid 1:13 echo "Passou pelo 2 match" tc filter add dev $DEV protocol ip parent 1: prio $PRIO_VIDEO u32 \ match ip protocol 17 0xff \ match u32 000b0000 00ff0000 at 0 \ police rate ${VIDEO_LEVEL_1_BW}kbit buffer ${VIDEO_BUFFER}k drop \ flowid 1:14 echo "Passou pelo 3 match" tc filter add dev $DEV protocol ip parent 1: prio $PRIO_VIDEO u32 \ match ip protocol 17 0xff \ match u32 00130000 00ff0000 at 0 \ police rate ${VIDEO_LEVEL_2_BW}kbit buffer ${VIDEO_BUFFER}k drop \ flowid 1:15 echo "Passou pelo 4 match" tc filter add dev $DEV protocol ip parent 1: prio $PRIO_VIDEO u32 \ match ip protocol 17 0xff \ match u32 00030000 00ff0000 at 0 \ police rate ${VIDEO_LEVEL_3_BW}kbit buffer ${VIDEO_BUFFER}k drop \ flowid 1:16 echo "Passou pelo 5 match"