I've been chasing this one for a while now and I'm out of ideas, so I'm hoping
someone here has run into it before.
The short version: on my wifiwave2 CAPsMAN setup any wireless client only gets
about 150 Mbit down from the internet. But that same client, over the same wifi,
does 320-500 Mbit to a machine on my LAN. And a wired PC on the same switch as
the AP gets 500-850 Mbit to the internet. So the wifi radio itself is clearly
fine, the wired/switch/router path is fine, but wifi + internet together tops out
around 150.
My setup:
- Controller is a hAP ax S (wifi-mediatek), RouterOS 7.23.2
- Plus one more hAP ax S and two wAP ax (wifi-qcom), all on 7.23.2
- The slowness happens on both the mediatek and the qcom APs, so it doesn't look
chipset specific - Routing, DHCP and NAT are all done by a separate box (a FRITZ 7590 with its
wifi turned off). The MikroTiks are pure bridges, no routing on them at all - CAPsMAN is local forwarding (datapath bridge = the bridge). I double checked
with the interface counters: during a client download the controller's ethernet
carries basically nothing, so the traffic really does go AP -> switch -> router
directly, it is not tunneled back to the controller - 1 Gbit fibre. Sanitized export is attached
The numbers, all taken on the same client at the same moment:
- wifi client to a LAN host (iperf3, ~2ms RTT): 320-500 Mbit
- wifi client to the internet (iperf3 to a public server, and plain curl): ~150,
bouncing anywhere between 60 and 290 - wired PC on the same switch to the internet: 500-850
- wired PC straight into the router: ~810
What I can actually see going wrong: during a slow wifi-to-internet download the
TCP connection keeps hitting retransmit timeouts. nstat shows 7 TCPTimeouts and a
few TCPLostRetransmit in a 12 second transfer, but zero out-of-order packets, and
ssthresh stays high with basically no real retransmits. So it isn't congestion and
it isn't reordering, the flow just stalls. On the LAN transfer I actually see about
2% out-of-order but it recovers instantly (2ms RTT) and runs at full speed. The
stalls only bite once the RTT is internet-sized. Ping during the download shows 0%
loss, latency just climbs a bit (some bufferbloat), and there are no scan or roam
events happening during the transfer.
The reason I'm posting rather than just trying things is that I've already ruled
out most of the usual suspects:
- Channel width: went from 80 to 160 MHz, PHY rate doubled to 1441 Mbit, internet
throughput stayed at 150 - Channel/interference: tried ch36 and a clean DFS ch52, identical result
- RouterOS version: was on 7.20.6, upgraded to 7.23.2, no change
- AP CPU: about 38% peak under load (2 cores)
- Wired path, switch, and the switch-to-router uplink: a wired client behind the
same switch gets 500-850, so none of that is the limit - Router and WAN: wired straight in gets 810
- CAPsMAN forwarding mode: it's local, and the controller carries 0 bytes of
client traffic during a download - MTU: 1500 end to end, DF pings pass, MSS negotiates 1448, no black hole
- WMM/DSCP: LAN throughput is ~400 at every DSCP value I tested, so it isn't
aggregation being disabled per priority - RTT on its own: I added 50ms of netem delay on the LAN path and throughput did
NOT drop, so it's genuinely the stalls and not just RTT sensitivity - Client hardware: same behaviour on a Realtek laptop and a Galaxy S24FE
- Client side TCP tuning: BBR vs cubic made no difference, a 32MB receive window
made no difference - IGMP snooping: off on all bridges
- Multicast flooding is negligible, no leftover queues, use-ip-firewall is no
For context this was a FRITZ mesh before and it did 500-900 to the internet over
wifi, so the line and the WAN can clearly do it, something about the MikroTik wifi
specifically brought this on.
So my actual question: what in wifiwave2 would make a client's downstream TCP
stall/time out only on the higher-RTT internet flows, while handing out full speed
on the low-RTT LAN flows? Is there a known airtime scheduling, power save or
aggregation behaviour at play here, or some setting I should be looking at?

