Wednesday, November 01, 2017

pf and max bandwidth in nested queues (bug?)

Hello,

I have an OpenBSD 6.2 router, set up in a test rig so there's no traffic apart from my tests. It has vmx interfaces. $int_if is a vlan on one of them.

I have an issue where if a child queue has a different "max" from a parent queue, the bandwidth is throttled down to much less than either.

I have the following simple queue tree (eventually it will be bigger, this is just for testing):

queue inbound on $int_if bandwidth 100M
queue inbound_all parent inbound bandwidth 30M max 30M
queue inbound_std parent inbound_all bandwidth 20M max 30M default
pass on $int_if

This works, and an iperf test shunting data through the router from ext->int gets around 30Mb as expected.

If I change the inbound_all queue's max to a slightly higher number, this shouldn't have any effect at all - after all, the inbound_std queue is still "bandwidth 20M max 30M", and neither of these numbers exceed the parent:

queue inbound on $int_if bandwidth 100M
queue inbound_all parent inbound bandwidth 30M max 40M
^^^^^^^
queue inbound_std parent inbound_all bandwidth 20M max 30M default
pass on $int_if

However, when I do this, suddenly connections assigned to inbound_std only get around 2.3Mb.

``systat q'' shows all packets are going into the correct queue.

As an experiment, I put a "min" level on inbound_std:

queue inbound_std parent inbound_all bandwidth 20M min 10M max 30M default

Then connections get that minimum bandwidth (here, iperf reported around 10Mb), so it shows the queue *can* use more than 2.3Mb, but it still sticks to the min rather than using all available bandwidth.

This seems like a bug to me, although I'm hesitant to suggest it since I have a lot of respect for the OpenBSD team. Does anyone have a suggestion as to what's happening?

Thanks,

Oliver.

No comments:

Post a Comment