[LARTC] Shaping the sum of incoming and outgoing traffic

Andy Furniss andy.furniss@dsl.pipex.com
Thu, 06 Jan 2005 13:51:05 +0000


Jan Rovner wrote:
> Hello,
> 
> does anyone have a working solution for the shaping both incoming and
> outgoing traffic in such
> way, that for a given client the *sum* of incoming and outgoing traffic
> is somehow defined?
> 
> My ISP does the same thing, it gives me just a line of a defined rate,
> no matter the traffic
> direction (i.e. here is your line, the clock speed is 1024kbps, do what
> you want).
> 
> I'm a litte bit familiar with HTB, my download shaping works fine.
> However, I would like shape
> both incoming+outgoing traffic in a way that the sum of actual outgoing
> and incoming rates 
> of all my clients would be always below the ISP's line speed in order to
> shaping get working.
> 
> In other words, I would like to split the ISP's line into a bunch of
> hierarchical "virtual" lines
> with traffic borrowing etc. like HTB does for download, but with defined
> *total* rates (i.e. dear
> customer, here is your 128kbps line, do what you want).
> 
> What can I do with HTB is to shape incoming and traffic separately
> (somehow to virtually split 
> the line for upload/download with limited speeds), but this is not the
> way I would like it to be, since 
> would like to get the line used as effective as possible.
> 
> Maybe something like IMQ would work, but unfortunately I have found no
> example for
> that solution.
> 
> Any ideas?
> 
> Jan Rovner

I did this as a proof of concept a while ago, but never finished it. It 
works but I didn't prioritise empty acks so testing both ways with TCP 
will fall apart - but then it does on a full duplex connection. Remember 
it's a test and I can't even remember the detail so you will need to 
modify alot - INPUT/OUTPUT etc for real world.

Andy.


#set -x
IPTABLES=/usr/local/sbin/iptables
MODPROBE=/sbin/modprobe
IP=/usr/sbin/ip
TC=/usr/sbin/tc

$IPTABLES -t mangle -D INPUT -i eth0 -j MARK --set-mark 1  &> /dev/null
$IPTABLES -t mangle -D OUTPUT -o eth0 -j MARK --set-mark 2  &> /dev/null

$IPTABLES -t mangle -D POSTROUTING -m mark --mark 1 -j IMQ --todev 0 &> 
/dev/null
$IPTABLES -t mangle -D POSTROUTING -m mark --mark 2 -j IMQ --todev 0 &> 
/dev/null
$IP link set imq0 down &> /dev/null
$MODPROBE -r imq &> /dev/null

if [ "$1" = "stop" ]
then
         echo "stopping"
         exit
fi

$MODPROBE imq numdevs=1

$IPTABLES -t mangle -I INPUT -i eth0 -j MARK --set-mark 1
$IPTABLES -t mangle -I OUTPUT -o eth0 -j MARK --set-mark 2

$IPTABLES -t mangle -I POSTROUTING -m mark --mark 1 -j IMQ --todev 0
$IPTABLES -t mangle -I POSTROUTING -m mark --mark 2 -j IMQ --todev 0
$IP link set imq0 up

$TC qdisc add dev imq0 root handle 1:0 htb default 0

$TC class add dev imq0 parent 1:0 classid 1:1 htb rate 128kbit ceil 
128kbit burst 2k

#### down ####
$TC class add dev imq0 parent 1:1 classid 1:10 htb rate 64kbit ceil 128kbit
$TC filter add dev imq0 parent 1:0 prio 1  protocol ip handle 1 fw 
flowid 1:10

#### up ####
$TC class add dev imq0 parent 1:1 classid 1:20 htb rate 64kbit ceil 128kbit
$TC filter add dev imq0 parent 1:0 prio 1  protocol ip handle 2 fw 
flowid 1:20