#!/bin/sh # We have 200000kbit bandwidth and want to reduce a couple of MACs to 3000kbit to keep our cable bill # from going over. This script uses MAC addresses (instead of IP addresses), so it works with IPv6 # streams as well. The filtered device is the bridged "local" network (not the WAN). If you have more # or fewer devices, you will need to add filters and target classes for them. You can share target # classes if you want devices to share bandwidth. Bandwidth below 1 mbit/sec is likely to make a # streaming device fail. High definition and high movement media streams may look quite bad at # 3 Mbit/sec where low movement channels like news will look just fine. BW0=200000kbit ;# Bandwidth of actual connection. Default tagged users will share this BW=3000kbit ;# Bandwidth to give ROKU users. MAC_ROKU1=C8:3A:6B:27:F9:B0 MAC_ROKU2=94:E9:79:4A:F1:88 DEV=br-lan TC=$(which tc) TCF="${TC} filter add dev $DEV parent 1: protocol ip prio 5 u32 match u16 0x0800 0xFFFF at -2" filter_mac() { M0=$(echo $1 | cut -d : -f 1)$(echo $1 | cut -d : -f 2) M1=$(echo $1 | cut -d : -f 3)$(echo $1 | cut -d : -f 4) M2=$(echo $1 | cut -d : -f 5)$(echo $1 | cut -d : -f 6) $TCF match u16 0x${M2} 0xFFFF at -4 match u32 0x${M0}${M1} 0xFFFFFFFF at -8 flowid $2 $TCF match u32 0x${M1}${M2} 0xFFFFFFFF at -12 match u16 0x${M0} 0xFFFF at -14 flowid $2 } insmod sch_htb 2> /dev/null $TC qdisc add dev $DEV root handle 1: htb default 0xA $TC class add dev $DEV parent 1: classid 1:1 htb rate ${BW0} $TC class add dev $DEV parent 1:1 classid 1:10 htb rate ${BW0} $TC class add dev $DEV parent 1:1 classid 1:20 htb rate ${BW} $TC class add dev $DEV parent 1:1 classid 1:21 htb rate ${BW} filter_mac $MAC_ROKU1 1:20 ;# Filter ROKU1 to 1:20 filter_mac $MAC_ROKU2 1:21 ;# Filter ROKU2 to 1:21 $TCF flowid 1:10 ;# Filter everyone else to 1:10