Does anyone know how to get bandwidth shaping working properly?

I've been using rshaper, which works, but it seems a bit wasteful to be throwing away good bandwidth when not everyone is online, so I was looking for something a bit better.

This, I'm afraid to say fails miserably.
Code:
#!/bin/bash


#generate root class

tc qdisc add dev eth0 root handle 10: cbq bandwidth 10Mbit avpkt 1000




#generate root cable modem class

tc class add dev eth0 parent 10:0 classid 10:1 cbq bandwidth 10Mbit rate \
 *512kbit allot 1514 weight 50kbit prio 8 maxburst 20 avpkt 1000 bounded



#generate individual pc classes

tc class add dev eth0 parent 10:1 classid 10:100 cbq bandwidth 512kbit rate \
 *128kbit allot 1514 weight 13Kbit prio 5 maxburst 20 avpkt 1000

tc class add dev eth0 parent 10:1 classid 10:200 cbq bandwidth 512kbit rate \
 *128kbit allot 1514 weight 13Kbit prio 5 maxburst 20 avpkt 1000

tc class add dev eth0 parent 10:1 classid 10:300 cbq bandwidth 512kbit rate \
 *128kbit allot 1514 weight 13Kbit prio 5 maxburst 20 avpkt 1000 

tc class add dev eth0 parent 10:1 classid 10:400 cbq bandwidth 512kbit rate \
 *128kbit allot 1514 weight 13Kbit prio 5 maxburst 20 avpkt 1000 



# Tell the kernel how to maage the queues, in this case sfq

tc qdisc add dev eth0 parent 10:100 sfq quantum 1514b perturb 15
tc qdisc add dev eth0 parent 10:200 sfq quantum 1514b perturb 15
tc qdisc add dev eth0 parent 10:300 sfq quantum 1514b perturb 15
tc qdisc add dev eth0 parent 10:400 sfq quantum 1514b perturb 15



# Explain to the kernel which packets belong to which class

tc filter add dev eth0 parent 10:0 protocol ip prio 100 u32 match ip dst \
 *192.168.0.65 flowid 10:100

tc filter add dev eth0 parent 10:0 protocol ip prio 100 u32 match ip dst \
 *192.168.0.66 flowid 10:200

tc filter add dev eth0 parent 10:0 protocol ip prio 100 u32 match ip dst \
 *192.168.0.67 flowid 10:300

tc filter add dev eth0 parent 10:0 protocol ip prio 100 u32 match ip dst \
 *192.168.0.69 flowid 10:400