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.

Reply via email to