My OpenWRT QoS Router Setup
OpenWRT is a Linux variant that runs on Linksys WRT54G routers and others. It's not trivial to install and use it, but if you want a challenge it is good nerdy fun to get a full Linux install on a consumer router. Go to openwrt.org for all the gory details.
Because you are working at a low level with OpenWRT, you can do incredibly powerful things. For instance, my QoS script allows me to set three priority classes for each host, with each host on the network separate from others. In other words, you can share your internet connection with neighbors, you can all run VoIP services, and still have good performance and no dropped calls. If you have seen a router that can do that out of the box, let me know and I'll post it here, because I doubt it exists.
I haven't had time to try the newer versions of OpenWRT, and because it can be tricky to get everything working right, I created a tarball archive of everything that went into mine. It is based on the February 2005 stable build, so it is out of date and won't work on WRT54G models newer than version 2.2, but it works great for me and has been incredibly stable.
I put together my own script for handling QoS using tc and iptables. It allows per-host bandwidth settings along with classification, so multiple hosts can all use time-sensitive protocols such as VoIP. It is written to be clear and modular, but if you don't understand how tc and iptables work, it may be difficult to use. The place to learn about tc and iptables is the Linux Advanced Routing & Traffic Control HOWTO.
The script runs on the /bin/sh shell that comes with OpenWRT, which is a little different from bash. The main file is rc.qos, which defines the parameters for each host. rc.qos.lan-host is called from rc.qos for each host, and it sets up the classes for each host, and then calls rc.qos.iptables to set up the iptables classification rules for that host. These scripts are released into the public domain.