Sorry for the long silence, I wanted to come back with a proper measurement instead of another "it happened again". I've got one now, and it takes both the ethernet port and the second AP out of the picture completely.
Setup, updated: hAP ac^2 (RBD52G-5HacD2HnD), **RouterOS 7.23.3**, **legacy `wireless` package** (`/interface wireless`, not wifi-qcom-ac). `bridge1` holds ether2-ether5 plus wlan2.4 and wlan5G, both radios on the same SSID. `ageing-time=1m`. Full config at the bottom.
**lurker888:** I did both things you suggested. I updated — I was on 7.23.1, I'm now on **7.23.3**, and the episodes continued the same day. And I tried `hw=no` on ether3: **same black hole, same duration.** `disable-running-check=yes` is set on both radios too, also no change. Sorry for the run of negatives.
On hardware offload making FDB maintenance hard — I agree, and that's why I went looking for a case with no switch chip in it at all. I found one, below.
## It happens between the two radios of the same router
I switched the second AP off entirely and lived on the hAP alone for a day. The failure kept happening, and now the stale entry points at **the other radio of the same device**. My wife and I just walk around the flat: when 5 GHz gets weak the phone falls back to 2.4, and back again. Every one of those transitions is a chance to hit this.
I set up a probe sampling every 5 seconds: the wireless registration table (where the client actually is), the bridge host table (where the bridge thinks it is), and the **`.id` of the host entry**, so I can tell a refreshed entry from a re-created one. Here is a clean capture from this morning:
```
07:56:21 reg=wlan2.4 fdb=wlan2.4 id=*8EA aligned, fine
07:56:32 reg=wlan5G fdb=wlan2.4 id=*8EA client moves to 5 GHz
07:57:02 unreachable: 25 ARP requests to the gateway in 90 s, none answered
... 25 consecutive samples, always id=*8EA ...
07:58:31 reg=wlan5G fdb=wlan2.4 id=*8EA
07:58:41 reg=wlan5G fdb=- id=- entry finally disappears
08:01:01 back to normal
```
## The part I find hard to explain
That entry survived **2 minutes and 9 seconds** after the client had left wlan2.4, with `ageing-time=1m`. Same `.id` throughout, so it was never removed and re-created — it is one entry, kept alive.
And then it expired on its own. So ageing is not broken in general: **something was keeping that entry alive while the client was no longer on that port**, and when that stopped, the entry died normally one minute later.
Meanwhile the client was anything but silent — 25 unanswered ARP requests in 90 seconds, arriving on wlan5G.
## I measured the traffic on the stale port. There is none.
I caught another window today at 11:10 and sniffed both ports at once, filtered by the client's source MAC, **separating rx from tx** (`filter-direction`):
```
stale port wlan2.4: rx=0 tx=21 15 s each
real port wlan5G: rx=22 <- positive control
```
**Zero frames ingress on the port the bridge insists the client is on**, while the client is demonstrably transmitting on the other radio in the very same seconds. And the bridge host entry was not flagged `A` (AGED) at that moment either.
Three notes on method, because I got this wrong twice before posting and someone else might too:
- `/tool sniffer quick` is a live redrawing view. If you count output lines you are counting screen refreshes, not packets. The `NUM` column stays at 1 while the screen scrolls past a thousand times. Use the memory sniffer and `/tool sniffer packet print count-only`, which is a real number.
- **The direction filter matters.** Those `tx=21` frames on the stale port are the bridge flooding the client's own broadcasts *out* of the wrong port. Sniff without separating direction and you see the client's MAC on wlan2.4 and conclude it is still transmitting there. It isn't.
- Every run includes a positive control on the port where the client really is. If that reads zero, the instrument is not measuring and the interesting zero means nothing.
So the question narrows to something quite specific: **the entry is kept alive with no ingress on that port at all.** Not "refreshed by the wrong traffic" — refreshed by nothing I can see.
The wireless side, meanwhile, knows perfectly well where the client is: at that moment the registration table showed a single entry on wlan5G, `uptime=1m52s`, `last-activity=50ms`, live counters. No duplicate registration on the other radio — I checked, because a stale *registration* would have been an equally good story and it isn't what's happening. It even logs the move at the exact second:
```
wireless,info CLIENT@wlan2.4: connected, signal strength -73
wireless,info CLIENT@wlan5G: disconnected, registered to other interface
```
Since wireless interfaces are never hardware-offloaded here, mkx, I don't think the chip-FDB / software-FDB split can be the cause of this one — there is no switch chip involved in a wlan-to-wlan move. It may well be a real and separate problem on the ethernet side, I'm not dismissing it, but it can't explain this capture.
## Questions
1. **What keeps a bridge host entry alive when nothing at all is arriving on that port?** That's the crux. Ageing clearly works — the entry does die, eventually, one minute after the episode ends. So what is restarting its timer in the meantime?
2. RouterOS 7 doesn't seem to expose `age` on `/interface bridge host` any more — the properties I get are `.id`, `on-interface`, `bridge`, `dynamic`, `local`, `external`, plus the `A` (AGED) flag, which was not set during the episode. Is there a way to see how old an entry is, or what last refreshed it? I'm currently inferring it from `.id` stability, which is indirect.
3. Should the wireless `registered to other interface` event actively invalidate the host entry? Are there known cases where it doesn't?
4. Before anyone suggests it: yes, I know `wifi-qcom-ac` exists for this board. I tried it a while back and a good part of my house stopped connecting — five air conditioner modules, an ESP32, a Sonoff, a boiler controller, a robot vacuum. Several of them are associated at CCK rates (1, 2, 5.5, 11 Mbps) because they sit at -80 dBm or worse. I've read that the usual culprit is PMF / `management-protection`, which I have disabled on legacy. **I'm going to try it again anyway, next**, since it's the one big variable I haven't changed — I'll report back both on whether the black hole survives the switch and on which of my IoT devices fall off. If someone has actually got a fleet of cheap IoT running on wifi-qcom-ac and knows which settings did it, saying so now would save me a weekend.
One thing before someone spots it in the config: **wlan5G has `bridge-mode=disabled`**. As I understand it that only controls whether the AP accepts MikroTik station-bridge clients, and I have none — everything here is phones and IoT. Happy to be corrected if it means more than that.
One more observation that may or may not be related: during that episode the client sat at **-87 dBm @ 6 Mbps on 5 GHz while standing right next to the router**. That looks wrong on its own and I'm going to chase it separately — but if 5 GHz coverage is poor everywhere, the client keeps bouncing between the two radios, and every bounce is another chance to hit this. It would explain how *often* I see the bug, not the bug itself.
## Config
```
# RouterOS 7.23.3, model RBD52G-5HacD2HnD, package: wireless (legacy)
/interface bridge
add ageing-time=1m name=bridge1 port-cost-mode=short
/interface bridge port
add bridge=bridge1 interface=ether2 internal-path-cost=10 path-cost=10
add bridge=bridge1 hw=no interface=ether3 internal-path-cost=10 path-cost=10
add bridge=bridge1 interface=ether4 internal-path-cost=10 path-cost=10
add bridge=bridge1 interface=ether5 internal-path-cost=10 path-cost=10
add bridge=bridge1 interface=wlan2.4
add bridge=bridge1 interface=wlan5G
/interface bridge settings
# use-ip-firewall: no, allow-fast-path: yes, bridge-fast-path-active: yes
# bridge-fast-forward-packets: 0
/interface wireless
set [ find default-name=wlan1 ] band=2ghz-b/g/n country=italy \
disable-running-check=yes disabled=no frequency=ch11 mode=ap-bridge \\
name=wlan2.4 scan-list=ch1_6_11 ssid=MYSSID wps-mode=disabled
set [ find default-name=wlan2 ] band=5ghz-a/n/ac bridge-mode=disabled \
channel-width=20/40mhz-Ce country=italy disable-running-check=yes \\
disabled=no disconnect-timeout=15s distance=indoors installation=indoor \\
mode=ap-bridge name=wlan5G ssid=MYSSID wps-mode=disabled
/interface wireless security-profiles
set [ find default=yes ] authentication-types=wpa2-psk group-key-update=1h \
mode=dynamic-keys supplicant-identity=MikroTik
# unicast-ciphers=aes-ccm, group-ciphers=aes-ccm, management-protection=disabled
/interface wireless access-list
# a handful of MAC entries pinning IoT devices to wlan2.4, signal-range=-120..120
```
Happy to run any specific test — I have the registration table, the bridge host table and ARP reachability all sampled every minute, so I can catch these windows and time them properly. Just say what would help.