Linux is using “tc” from the “iproute2” package to configure traffic shaping, generally described in the Linux Advanced Routing & Traffic Control HOWTO.
With the “cbq” scheduler, pipes with constant bit rates can be defined.
Define root qdisc with a bandwidth of 1000 MBit/s on eth1
| # tc qdisc add dev eth1 root handle 1: cbq avpkt 1000 bandwidth 1000Mbit | 
Define a class 1:1 with 1 MBit/s
| # tc class add dev eth1 parent 1: classid 1:1 cbq rate 1Mbit allot 1500 bounded | 
Define a class 1:2 with 50 MBit/s
| # tc class add dev eth1 parent 1: classid 1:2 cbq rate 50Mbit allot 1500 bounded | 
Define a class 1:3 with 10 MBit/s
| # tc class add dev eth1 parent 1: classid 1:3 cbq rate 10Mbit allot 1500 bounded | 
Define a class 1:4 with 200 kBit/s
| # tc class add dev eth1 parent 1: classid 1:4 cbq rate 200kbit allot 1500 bounded | 
Define a filter for IPv4 (protocol ip), TCP (match ip protocol 6 0xff) destination port 5001 (match ip dport 5001 0xffff) using class 1:2 from above
| # tc filter add dev eth1 parent 1: protocol ip u32 match ip protocol 6 0xff match ip dport 5001 0xffff flowid 1:1 | 
Define a filter for IPv6 (protocol ip), TCP (match ip6 protocol 6 0xff) destination port 5001 using class 1:2 from above
| # tc filter add dev eth1 parent 1: protocol ipv6 u32 match ip6 protocol 6 0xff match ip6 dport 5001 0xffff flowid 1:2 | 
Define a filter for IPv6 for packets having flow label 12345 (match ip6 flowlabel 12345 0x3ffff) using class 1:3 from above
| # tc filter add dev eth1 parent 1: protocol ipv6 u32 match ip6 flowlabel 12345 0x3ffff flowid 1:3 | 
Define a filter for IPv6 for packets having Linux iptables mark 32 (handle 32 fw) specified using class 1:4 from above
| # tc filter add dev eth1 parent 1: protocol ipv6 handle 32 fw flowid 1:4 | 
The last filter definition requires an entry in the ip6tables to mark a packet
| # ip6tables -A POSTROUTING -t mangle -p tcp --dport 5003 -j MARK --set-mark 32 | 
Start on server side each one one separate console:
| # iperf -V -s -p 5001 # iperf -V -s -p 5002 # iperf -V -s -p 5003 | 
Start on client side and compare results:
| # iperf -V -c SERVER-IPv4 -p 5001 (expected: 1 MBit/s) # iperf -V -c SERVER-IPv6 -p 5001 (expected: 50 MBit/s) # iperf -V -c SERVER-IPv4 -p 5002 (expected: >> 50 MBit/s && <= 1000 MBit/s) # iperf -V -c SERVER-IPv6 -p 5002 (expected: >> 50 MBit/s && <= 1000 MBit/s) # iperf -V -c SERVER-IPv4 -p 5003 (expected: >> 50 MBit/s && <= 1000 MBit/s) # iperf -V -c SERVER-IPv6 -p 5003 (expected: 200 kBit/s) | 
The rate result should be as defined in the classes (see above), the results on port 5002 should be very similar independend from used IP version.