I'm fairly impressed with MikroTik's support for Wi-Fi roaming (802.11r — plus 802.11k and 802.11v) in their newer RouterOS releases with wifi-qcom-ac and wifi-qcom packages. Here are some anecdotal tips that might help, although YMMV.
First, it's important to understand that wireless client devices still decide which access points they'll associate with (or not). Some devices make questionable decisions. There's only so much you can do to persuade poorly behaving clients to roam across access points in a sensible way. For example, for a while I had a "smart" TV that frequently associated with the "wrong" access point. On that access point I added a MAC address-based block, to shove away the not-so-smart TV and prod it to associate with the better access point. That worked, but eventually I shifted the TV from a wireless to a wired connection. Another strategy to deal with older and less capable Wi-Fi clients (such as "IoT" devices) is to shift them to a separate, isolated, "legacy" Wi-Fi network — preferably with a separate radio if you can spare one.
In RouterOS you have to set up CAPsMAN if you want 802.11r (and k/v) to work across different physical access points. CAPsMAN configuration is odd in certain respects, so be sure to read the documentation carefully before you set it up. For example, when you run CAPsMAN on Access Point #1, you don't actually include AP1's own radios in any CAPsMAN-related configuration. In other words, CAPsMAN is used to manage
remote radios. The local, on-device radios are effectively already within the CAPsMAN "group."
On each of the radios in the "group" I found there are a couple critical settings to make roaming work well:
- connect-priority: 0/1
This setting seems to allow the client to connect immediately to a new access point and assumes the client should be immediately dropped from the "old" access point.
- ft: yes
This parameter should be obvious: it's the one that enables any 802.11r.
- ft-over-ds: no
No is the default. Some Apple devices reportedly have trouble if this setting is enabled. I didn't have trouble when I tried it, but I also didn't observe any benefits. So I'm keeping the default.
These security-related settings work well with my devices, but YMMV.
- management-protection: required
All my wireless devices seem to be new enough to support management frame protection. You can skip this parameter if you're only using WPA3 since "required" is then the default.
- disable-pmkid: yes
This parameter is especially (but not only) important when you're using 802.11r.
- group-key-update: 1h
Makes some attacks a little tougher.
I keep going back and forth on whether WPA2 is still enabled. On the guest/IoT network I'll probably need to keep WPA2 enabled for a while longer. But I don't think I have any non-WPA3 devices any more on the main network. Some rainy day I'll try disabling WPA2 on the main network.
Channel selection (and width) is "interesting" in this urban jungle named Singapore. I've recently settled on some limited, controlled automatic channel (re)selection that occurs every night in the early morning hours.
Good luck!