X-Git-Url: http://git.ipfire.org/?p=ipfire-2.x.git;a=blobdiff_plain;f=config%2Fqos%2Fmakeqosscripts.pl;h=aadd959ec068fd0cd548323b0691d8e141013eeb;hp=334bebe95a7931d48cc9e85eddf9ff9b71bf9bb3;hb=5b117ef49aaad5f39a81938783b2cfe05fc5d91c;hpb=b684b13b2b8123d5e4a85641b869447f446ef5d8 diff --git a/config/qos/makeqosscripts.pl b/config/qos/makeqosscripts.pl index 334bebe95a..aadd959ec0 100644 --- a/config/qos/makeqosscripts.pl +++ b/config/qos/makeqosscripts.pl @@ -1,15 +1,27 @@ #!/usr/bin/perl -# -# IPFire Scripts -# -# This code is distributed under the terms of the GPL -# -# (c) The IPFire Team -# +############################################################################### +# # +# IPFire.org - A linux based firewall # +# Copyright (C) 2007-2013 IPFire Team # +# # +# This program is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see . # +# # +############################################################################### use strict; # enable only the following on debugging purpose -use warnings; +# use warnings; require '/var/ipfire/general-functions.pl'; require "${General::swroot}/lang.pl"; @@ -26,14 +38,17 @@ my $classentry = ""; my $subclassentry = ""; my $l7ruleentry = ""; my $portruleentry = ""; +my $tosruleentry = ""; my @tmp = (); my @classes = (); my @subclasses = (); my @l7rules = (); my @portrules = (); +my @tosrules = (); my @tmpline = (); my @classline = (); my @subclassline = (); +my @tosruleline = (); my @l7ruleline = (); my @portruleline = (); my @proto = (); @@ -42,6 +57,8 @@ my $classfile = "/var/ipfire/qos/classes"; my $subclassfile = "/var/ipfire/qos/subclasses"; my $level7file = "/var/ipfire/qos/level7config"; my $portfile = "/var/ipfire/qos/portconfig"; +my $tosfile = "/var/ipfire/qos/tosconfig"; +my $fqcodel_options = "limit 800 quantum 500"; &General::readhash("${General::swroot}/ethernet/settings", \%netsettings); @@ -54,10 +71,11 @@ $qossettings{'DEF_INC_SPD'} = ''; $qossettings{'DEFCLASS_INC'} = ''; $qossettings{'DEFCLASS_OUT'} = ''; $qossettings{'ACK'} = ''; -$qossettings{'MTU'} = '1492'; $qossettings{'RED_DEV'} = `cat /var/ipfire/red/iface`; $qossettings{'IMQ_DEV'} = 'imq0'; +$qossettings{'TOS'} = ''; $qossettings{'VALID'} = 'yes'; +$qossettings{'IMQ_MODE'} = 'PREROUTING'; &General::readhash("${General::swroot}/qos/settings", \%qossettings); @@ -73,6 +91,9 @@ close FILE; open( FILE, "< $portfile" ) or die "Unable to read $portfile"; @portrules = ; close FILE; +open( FILE, "< $tosfile" ) or die "Unable to read $tosfile"; +@tosrules = ; +close FILE; ############################################################################################################################ ############################################################################################################################ @@ -90,27 +111,48 @@ print < /dev/null - iptables -t mangle -L QOS-INC -v -x 2> /dev/null + case "\$2" in + qdisc) + echo "[qdisc]" + tc -s qdisc show dev $qossettings{'RED_DEV'} + tc -s qdisc show dev $qossettings{'IMQ_DEV'} + exit 0 + ;; + class) + echo "[class]" + tc -s class show dev $qossettings{'RED_DEV'} + tc -s class show dev $qossettings{'IMQ_DEV'} + exit 0 + ;; + filter) + echo "[filter]" + tc -s filter show dev $qossettings{'RED_DEV'} + tc -s filter show dev $qossettings{'IMQ_DEV'} + exit 0 + ;; + iptables) + echo "[iptables]" + iptables -t mangle -n -L QOS-OUT -v -x 2> /dev/null + iptables -t mangle -n -L QOS-INC -v -x 2> /dev/null + iptables -t mangle -n -L QOS-TOS -v -x 2> /dev/null + exit 0 + ;; + esac + \$0 \$1 qdisc + \$0 \$1 class + \$0 \$1 filter + \$0 \$1 iptables exit 0 ;; start) - ### FIRST CLEAR EVERYTHING - \$0 clear - ### ### $qossettings{'RED_DEV'} ### @@ -118,11 +160,8 @@ case "\$1" in ### INIT KERNEL modprobe sch_htb - ### SET QUEUE LENGTH & MTU - has just to be tested!!! IMPORTANT - ip link set dev $qossettings{'RED_DEV'} qlen $qossettings{'QLENGTH'} - ip link set dev $qossettings{'RED_DEV'} mtu $qossettings{'MTU'} - ### ADD HTB QDISC FOR $qossettings{'RED_DEV'} + tc qdisc del dev $qossettings{'RED_DEV'} root >/dev/null 2>&1 tc qdisc add dev $qossettings{'RED_DEV'} root handle 1: htb default $qossettings{'DEFCLASS_OUT'} ### MAIN RATE LIMIT @@ -143,7 +182,7 @@ foreach $classentry (sort @classes) $qossettings{'BURST'} = $classline[5]; $qossettings{'CBURST'} = $classline[6]; print "\ttc class add dev $qossettings{'DEVICE'} parent 1:1 classid 1:$qossettings{'CLASS'} htb rate $qossettings{'RATE'}kbit ceil $qossettings{'CEIL'}kbit prio $qossettings{'PRIO'} "; - if ($qossettings{'BURST'} > 0) { + if (($qossettings{'BURST'} ne '') && ($qossettings{'BURST'} ne 0)) { print "burst $qossettings{'BURST'}k "; } if (($qossettings{'CBURST'} ne '') && ($qossettings{'CBURST'} ne 0)) { @@ -154,22 +193,24 @@ foreach $classentry (sort @classes) } foreach $subclassentry (sort @subclasses) { @subclassline = split( /\;/, $subclassentry ); - $qossettings{'DEVICE'} = $subclassline[0]; - $qossettings{'CLASS'} = $subclassline[1]; - $qossettings{'SCLASS'} = $subclassline[2]; - $qossettings{'SPRIO'} = $subclassline[3]; - $qossettings{'SRATE'} = $subclassline[4]; - $qossettings{'SCEIL'} = $subclassline[5]; - $qossettings{'SBURST'} = $subclassline[6]; - $qossettings{'SCBURST'} = $subclassline[7]; - print "\ttc class add dev $qossettings{'DEVICE'} parent 1:$qossettings{'CLASS'} classid 1:$qossettings{'SCLASS'} htb rate $qossettings{'SRATE'}kbit ceil $qossettings{'SCEIL'}kbit prio $qossettings{'SPRIO'} "; - if ($qossettings{'SBURST'} > 0) { - print "burst $qossettings{'SBURST'}k "; - } - if (($qossettings{'SCBURST'} ne '') && ($qossettings{'SCBURST'} ne 0)) { - print "cburst $qossettings{'CBURST'}k"; + if ($qossettings{'RED_DEV'} eq $subclassline[0]) { + $qossettings{'DEVICE'} = $subclassline[0]; + $qossettings{'CLASS'} = $subclassline[1]; + $qossettings{'SCLASS'} = $subclassline[2]; + $qossettings{'SPRIO'} = $subclassline[3]; + $qossettings{'SRATE'} = $subclassline[4]; + $qossettings{'SCEIL'} = $subclassline[5]; + $qossettings{'SBURST'} = $subclassline[6]; + $qossettings{'SCBURST'} = $subclassline[7]; + print "\ttc class add dev $qossettings{'DEVICE'} parent 1:$qossettings{'CLASS'} classid 1:$qossettings{'SCLASS'} htb rate $qossettings{'SRATE'}kbit ceil $qossettings{'SCEIL'}kbit prio $qossettings{'SPRIO'} "; + if ($qossettings{'SBURST'} > 0) { + print "burst $qossettings{'SBURST'}k "; + } + if (($qossettings{'SCBURST'} ne '') && ($qossettings{'SCBURST'} ne 0)) { + print "cburst $qossettings{'CBURST'}k"; + } + print "\n"; } - print "\n"; } print "\n\t### ATTACH QDISC TO LEAF CLASSES\n"; @@ -179,7 +220,7 @@ foreach $classentry (sort @classes) if ($qossettings{'RED_DEV'} eq $classline[0]) { $qossettings{'DEVICE'} = $classline[0]; $qossettings{'CLASS'} = $classline[1]; - print "\ttc qdisc add dev $qossettings{'DEVICE'} parent 1:$qossettings{'CLASS'} handle $qossettings{'CLASS'}: sfq perturb $qossettings{'SFQ_PERTUB'}\n"; + print "\ttc qdisc add dev $qossettings{'DEVICE'} parent 1:$qossettings{'CLASS'} handle $qossettings{'CLASS'}: fq_codel $fqcodel_options\n"; } } foreach $subclassentry (sort @subclasses) { @@ -187,7 +228,7 @@ foreach $subclassentry (sort @subclasses) { if ($qossettings{'RED_DEV'} eq $subclassline[0]) { $qossettings{'DEVICE'} = $subclassline[0]; $qossettings{'SCLASS'} = $subclassline[2]; - print "\ttc qdisc add dev $qossettings{'DEVICE'} parent 1:$qossettings{'SCLASS'} handle $qossettings{'SCLASS'}: sfq perturb $qossettings{'SFQ_PERTUB'}\n"; + print "\ttc qdisc add dev $qossettings{'DEVICE'} parent 1:$qossettings{'SCLASS'} handle $qossettings{'SCLASS'}: fq_codel $fqcodel_options\n"; } } print "\n\t### FILTER TRAFFIC INTO CLASSES\n"; @@ -206,78 +247,69 @@ foreach $subclassentry (sort @subclasses) { $qossettings{'DEVICE'} = $subclassline[0]; $qossettings{'CLASS'} = $subclassline[1]; $qossettings{'SCLASS'} = $subclassline[2]; - print "\ttc filter add dev $qossettings{'DEVICE'} parent 1:$qossettings{'CLASS'} prio 0 protocol ip handle $qossettings{'SCLASS'} fw flowid 1:$qossettings{'SCLASS'}\n"; + print "\ttc filter add dev $qossettings{'DEVICE'} parent 1:0 prio 0 protocol ip handle $qossettings{'SCLASS'} fw flowid 1:$qossettings{'SCLASS'}\n"; } } print </dev/null 2>&1 tc qdisc add dev $qossettings{'IMQ_DEV'} root handle 2: htb default $qossettings{'DEFCLASS_INC'} ### MAIN RATE LIMIT @@ -373,10 +436,10 @@ foreach $classentry (sort @classes) $qossettings{'BURST'} = $classline[5]; $qossettings{'CBURST'} = $classline[6]; print "\ttc class add dev $qossettings{'DEVICE'} parent 2:1 classid 2:$qossettings{'CLASS'} htb rate $qossettings{'RATE'}kbit ceil $qossettings{'CEIL'}kbit prio $qossettings{'PRIO'} "; - if ($qossettings{'BURST'} > 0) { + if (($qossettings{'BURST'} ne '') && ($qossettings{'BURST'} ne 0)) { print "burst $qossettings{'BURST'}k "; } - if (($qossettings{'CBURST'} ne '') || ($qossettings{'CBURST'} ne 0)) { + if (($qossettings{'CBURST'} ne '') && ($qossettings{'CBURST'} ne 0)) { print "cburst $qossettings{'CBURST'}k"; } print "\n"; @@ -397,7 +460,7 @@ foreach $subclassentry (sort @subclasses) { if ($qossettings{'SBURST'} > 0) { print "burst $qossettings{'SBURST'}k "; } - if (($qossettings{'SCBURST'} ne '') || ($qossettings{'SCBURST'} ne 0)) { + if (($qossettings{'SCBURST'} ne '') && ($qossettings{'SCBURST'} ne 0)) { print "cburst $qossettings{'CBURST'}k"; } print "\n"; @@ -411,7 +474,7 @@ foreach $classentry (sort @classes) if ($qossettings{'IMQ_DEV'} eq $classline[0]) { $qossettings{'DEVICE'} = $classline[0]; $qossettings{'CLASS'} = $classline[1]; - print "\ttc qdisc add dev $qossettings{'DEVICE'} parent 2:$qossettings{'CLASS'} handle $qossettings{'CLASS'}: sfq perturb $qossettings{'SFQ_PERTUB'}\n"; + print "\ttc qdisc add dev $qossettings{'DEVICE'} parent 2:$qossettings{'CLASS'} handle $qossettings{'CLASS'}: fq_codel $fqcodel_options\n"; } } foreach $subclassentry (sort @subclasses) { @@ -419,7 +482,7 @@ foreach $subclassentry (sort @subclasses) { if ($qossettings{'IMQ_DEV'} eq $subclassline[0]) { $qossettings{'DEVICE'} = $subclassline[0]; $qossettings{'SCLASS'} = $subclassline[2]; - print "\ttc qdisc add dev $qossettings{'DEVICE'} parent 2:$qossettings{'SCLASS'} handle $qossettings{'SCLASS'}: sfq perturb $qossettings{'SFQ_PERTUB'}\n"; + print "\ttc qdisc add dev $qossettings{'DEVICE'} parent 2:$qossettings{'SCLASS'} handle $qossettings{'SCLASS'}: fq_codel $fqcodel_options\n"; } } print "\n\t### FILTER TRAFFIC INTO CLASSES\n"; @@ -438,48 +501,57 @@ foreach $subclassentry (sort @subclasses) { $qossettings{'DEVICE'} = $subclassline[0]; $qossettings{'CLASS'} = $subclassline[1]; $qossettings{'SCLASS'} = $subclassline[2]; - print "\ttc filter add dev $qossettings{'DEVICE'} parent 2:$qossettings{'CLASS'} prio 0 protocol ip handle $qossettings{'SCLASS'} fw flowid 2:$qossettings{'SCLASS'}\n"; + print "\ttc filter add dev $qossettings{'DEVICE'} parent 2:0 prio 0 protocol ip handle $qossettings{'SCLASS'} fw flowid 2:$qossettings{'SCLASS'}\n"; } } + +if ( $qossettings{'IMQ_MODE'} eq 'POSTROUTING' ) +{ print </dev/null 2>&1) & + ( sleep 10 && /usr/local/bin/qosd $qossettings{'IMQ_DEV'} >/dev/null 2>&1) & + + for i in \$(ls \$RRDLOG/class_*.rrd); do + rrdtool update \$i \$(date +%s): + done echo "Quality of Service was successfully started!" exit 0 ;; - clear) + clear|stop) ### RESET EVERYTHING TO A KNOWN STATE + killall qosd >/dev/null 2>&1 + (sleep 3 && killall -9 qosd &>/dev/null) & # DELETE QDISCS - tc qdisc del dev $qossettings{'RED_DEV'} root - tc qdisc del dev $qossettings{'IMQ_DEV'} root - # REMOVE & FLUSH CHAINS - iptables -t mangle --delete POSTROUTING -o $qossettings{'RED_DEV'} -j QOS-OUT - iptables -t mangle --flush QOS-OUT - iptables -t mangle --delete-chain QOS-OUT - iptables -t mangle --delete PREROUTING -i $qossettings{'IMQ_DEV'} -j QOS-INC - iptables -t mangle --flush QOS-INC - iptables -t mangle --delete-chain QOS-INC + tc qdisc del dev $qossettings{'RED_DEV'} root >/dev/null 2>&1 + tc qdisc add root dev $qossettings{'RED_DEV'} fq_codel >/dev/null 2>&1 + tc qdisc del dev $qossettings{'IMQ_DEV'} root >/dev/null 2>&1 + tc qdisc add root dev $qossettings{'IMQ_DEV'} fq_codel >/dev/null 2>&1 # STOP IMQ-DEVICE - ip link set $qossettings{'IMQ_DEV'} down - iptables -t mangle --delete PREROUTING -i $qossettings{'RED_DEV'} -j IMQ --todev 0 - rmmod imq - rmmod sch_htb - ## rmmod ipt_IMQ # Doesn't work :( + ip link set $qossettings{'IMQ_DEV'} down >/dev/null 2>&1 + iptables -t mangle --delete POSTROUTING -i $qossettings{'RED_DEV'} -p ah -j RETURN >/dev/null 2>&1 + iptables -t mangle --delete POSTROUTING -i $qossettings{'RED_DEV'} -p esp -j RETURN >/dev/null 2>&1 + iptables -t mangle --delete POSTROUTING -i $qossettings{'RED_DEV'} -p ip -j RETURN >/dev/null 2>&1 + iptables -t mangle --delete PREROUTING -i $qossettings{'RED_DEV'} -p ah -j RETURN >/dev/null 2>&1 + iptables -t mangle --delete PREROUTING -i $qossettings{'RED_DEV'} -p esp -j RETURN >/dev/null 2>&1 + iptables -t mangle --delete PREROUTING -i $qossettings{'RED_DEV'} -p ip -j RETURN >/dev/null 2>&1 + iptables -t mangle --delete POSTROUTING -m mark ! --mark 0 ! -o $qossettings{'RED_DEV'} -j IMQ --todev 0 >/dev/null 2>&1 + iptables -t mangle --delete PREROUTING -i $qossettings{'RED_DEV'} -j IMQ --todev 0 >/dev/null 2>&1 + # rmmod imq # this crash on 2.6.25.xx + # REMOVE & FLUSH CHAINS + iptables -t mangle --delete POSTROUTING -o $qossettings{'RED_DEV'} -j QOS-OUT >/dev/null 2>&1 + iptables -t mangle --delete POSTROUTING -o $qossettings{'RED_DEV'} -j QOS-TOS >/dev/null 2>&1 + iptables -t mangle --flush QOS-OUT >/dev/null 2>&1 + iptables -t mangle --delete-chain QOS-OUT >/dev/null 2>&1 + iptables -t mangle --delete FORWARD -i $qossettings{'RED_DEV'} -j QOS-INC >/dev/null 2>&1 + iptables -t mangle --delete FORWARD -i $qossettings{'RED_DEV'} -j QOS-TOS >/dev/null 2>&1 + iptables -t mangle --delete PREROUTING -i $qossettings{'RED_DEV'} -j QOS-INC >/dev/null 2>&1 + iptables -t mangle --delete PREROUTING -i $qossettings{'RED_DEV'} -j QOS-TOS >/dev/null 2>&1 + iptables -t mangle --flush QOS-INC >/dev/null 2>&1 + iptables -t mangle --delete-chain QOS-INC >/dev/null 2>&1 + iptables -t mangle --flush QOS-TOS >/dev/null 2>&1 + iptables -t mangle --delete-chain QOS-TOS >/dev/null 2>&1 + # remove l7-filter + iptables -t mangle --delete PREROUTING -m layer7 --l7proto unset + + rmmod sch_htb >/dev/null 2>&1 + + for i in \$(ls \$RRDLOG/class_*.rrd); do + rrdtool update \$i \$(date +%s): + done + echo "Quality of Service was successfully cleared!" ;; - gen) + gen|generate) echo -n "Generateing the QoS-Scripts..." /usr/bin/perl /var/ipfire/qos/bin/makeqosscripts.pl > /var/ipfire/qos/bin/qos.sh echo ".Done!" exit 0 ;; + restart) + ### FIRST CLEAR EVERYTHING + \$0 clear + + ### THEN START + \$0 start + ;; esac ### EOF END @@ -574,4 +745,3 @@ END ############################################################################################################################ ############################################################################################################################ -