PF ALTQ CBQ rules

Mel fbsd.questions at rachie.is-a-geek.net
Fri Oct 12 15:49:33 PDT 2007


On Saturday 13 October 2007 00:17:32 Ovi wrote:
> Hello guys
>
> I have this example from OpenBSD:
>
> altq on $br1_if cbq bandwidth 20Mb qlimit 100 tbrsize 1000 queue { std1,
> customer_1 } queue customer_1 bandwidth 1Mb cbq(red,ecn) { customer_1_bulk,
> customer_1_ack } queue customer_1_ack priority 7
> queue customer_1_bulk priority 0
>
> I want to use CBQ on FreeBSD, with similar rules still I have the
> following problem:
> On a 20Mb internet line I have 100 users. I want to limit (cap)
> bandwidth per user at 1 Mb and to add queues for all 100 users.
> The problem is that on FreeBSD this rules are not working, instead I
> must use this:
>
> altq on $br1_if cbq bandwidth 20Mb qlimit 100 tbrsize 1000 queue { std1,
> customer_1 } queue customer_1 bandwidth 1Mb cbq(red,ecn) { customer_1_bulk,
> customer_1_ack } queue customer_1_ack bandwidth 800Kb priority 7
> queue customer_1_bulk bandwidth 128Kb priority 0
>
>
> This "bandwidth" option does not help me because I must not exceed 1 Mb.

This can't be done with cbq, because in cbq the sum of child queues must match 
the interface bandwidth or less. Use hfsc for this.
Also, you reserve 80% for ack and 20% for bulk, you might wanna reverse that.

> So my question is: how I do bandwidthupper limit with CBQ per user, like
> no more than 1 Mb, and add rules for 100 users?

See above.

A good resource on HFSC:
http://www.probsd.net/pf/index.php/HFSC

It would look something like this:
# Use interface bandwidth, so your interface doesn't get limited
altq on $br1_if bandwidth 100Mb hfsc(upperlimit 100Mb) queue { \
	NO_CUSTOMER, \
	CUSTOMERS
}
# Any traffic not assigned to a customer comes on the NO_CUSTOMER queue.
# Backlogged traffic consumes a maximum of 80Mbit
# There's always 55Mbit available.
# Realtime values may not exceed 75% of root queue
queue NO_CUSTOMER bandwidth 80Mb hfsc(realtime 55Mb default)

# Create a customers root queue, setting hard limits for any customers
# It ensures the entire internet connection is available at all times
# and also limits it to that ammount
queue CUSTOMERS bandwidth 20Mb hfsc(realtime 20Mb upperlimit 20Mb) { \
	customer_1, \
	customer_2, \
	..., \
}
# Assign 1% per customer (100 customers) for backlogged traffic.
# No realtime guarantees, let hfsc figure out how to spend the 20Mbit
# from the CUSTOMERS parent queue.
# No customer gets more then 1Mbit even if he's alone surfing the net.
queue customer_1 bandwidth 1% hfsc(linkshare 1% upperlimit 1Mb) \
	{ customer_1_bulk, customer_1_ack }
# default priority is 1
queue customer_1_bulk bandwidth 80% hfsc
queue customer_1_ack bandwidth 20% priority 2 hfsc

-- 
Mel


More information about the freebsd-questions mailing list