Skip to content

Fast Roaming (802.11r/k/v)

Fast Roaming enables seamless client transitions between access points without authentication re-negotiation, critical for voice, video, and real-time applications.

RouterOS supports three fast roaming protocols:

ProtocolNamePurpose
802.11rFast BSS TransitionPre-authentication for fast handoff
802.11kRadio Resource MeasurementNeighbor reports for informed roaming
802.11vBSS Transition ManagementAP-initiated roaming suggestions

Without fast roaming:

  1. Client detects signal degradation
  2. Client scans for alternative APs
  3. Client authenticates with new AP (full 4-way handshake)
  4. Client reassociates and obtains IP
  5. Result: Noticeable delay, dropped calls, video stalls

With 802.11r:

  1. Client performs initial handshake with Mobility Domain
  2. APs share security keys via CAPsMAN
  3. Client gets “pre-authenticated” for neighboring APs
  4. Roaming happens in milliseconds without full re-authentication

All APs must be managed by the same RouterOS instance running CAPsMAN.

For 802.11r to work:

  • The mobility domain must be shared between APs
  • Key exchange happens between APs via CAPsMAN
  • Different controllers cannot share key material

What works:

  • Multiple APs managed by single CAPsMAN (all on same RouterOS)
  • All APs on same Controller using WifiWave2

What doesn’t work:

  • APs on different RouterOS instances
  • Mixed CAPsMAN controllers
  • Autonomous APs not managed centrally
  • WPA2 only (recommended): WPA3 causes roaming issues on many client devices
  • Same authentication: All APs must use identical security profile
  • PMF recommended: Protected Management Frames for stability
Featurewifi package (v7.13+)wireless package (legacy)
802.11rYesYes (limited)
802.11kYesNo
802.11vYesNo
CAPsMAN integrationYesYes

The wifi package (WifiWave2) is recommended for RouterOS 7.13+ and supports the full 802.11r/k/v stack.

/interface wifi security
add authentication-types=wpa2-psk \
encryption=ccmp \
ft=yes \
ft-over-ds=yes \
ft-mobility-domain=0x1234 \
name=fast-roam \
passphrase=MyPassword

Key properties:

PropertyDescriptionDefault
ftEnable 802.11r Fast BSS Transitionno
ft-over-dsEnable over-the-DS (recommended)no
ft-mobility-domain16-bit identifier (hex)—must match across all APs0xADC4
ft-nas-identifierPMK-R0 key holder IDInterface MAC
ft-r0-key-lifetimeLifetime of PMK-R0 key7 days
ft-preserve-vlanidPreserve client VLAN after roamingyes
/interface wifi configuration
add name=my-config \
ssid=MyNetwork \
steering.neighbor-group=my-neighbors \
steering.rrm=yes \
steering.wnm=yes \
steering.transition-threshold=-80 \
steering.transition-threshold-time=10s \
steering.transition-request-period=30s \
steering.transition-request-count=3 \
steering.transition-time=unlimited

802.11k (RRM) properties:

PropertyDescriptionDefault
rrmEnable 802.11k neighbour reportsyes

802.11v (Steering) properties:

PropertyDescriptionDefault
wnmEnable 802.11v BSS transition requestsyes
neighbor-groupDefine static neighbor group(dynamic)
transition-thresholdRSSI threshold (dBm) for marking candidate-80
transition-threshold-timeTime below threshold before marking candidate10s
transition-request-periodInterval between transition requests30s
transition-request-countNumber of requests to send3
transition-timeTime before forcing disconnectunlimited
# CAPsMAN Controller
/interface wifi capsman
set enabled=yes interfaces=LANBridge
# Security with 802.11r
/interface wifi security
add authentication-types=wpa2-psk \
encryption=ccmp \
ft=yes \
ft-over-ds=yes \
ft-mobility-domain=0x1 \
name=fast-roam \
passphrase=MyPass123
# Channel configurations
/interface wifi channel
add frequency=2412,2437,2462 name=2G-channels width=20mhz
add frequency=5180,5260,5500 name=5G-channels width=20/40/80mhz skip-dfs-channels=all
# Configuration with 802.11k/v enabled
/interface wifi configuration
add channel=2G-channels country=US datapath.bridge=LANBridge \
manager=capsman name=2G-config security=fast-roam ssid=MyNetwork-2G \
steering.rrm=yes steering.wnm=yes
add channel=5G-channels country=US datapath.bridge=LANBridge \
manager=capsman name=5G-config security=fast-roam ssid=MyNetwork-5G \
steering.rrm=yes steering.wnm=yes
# Provisioning rules
/interface wifi provisioning
add action=create-enabled master-configuration=2G-config \
supported-bands=2ghz-n,2ghz-ac,2ghz-ax
add action=create-enabled master-configuration=5G-config \
supported-bands=5ghz-n,5ghz-ac,5ghz-ax

The legacy wireless package has limited 802.11r support:

/interface wireless security-profiles
set default ft=yes ft-mode=ds \
ft-mobility-domain=1234

Limitations:

  • Only 802.11r (no 802.11k/v)
  • Only WPA2-PSK or WPA2-EAP
  • No support for WPA3
Device Type802.11r802.11k802.11v
Google Pixel (4A, 6A, 7A)GoodGoodGood
Linux laptops (ThinkPad)ExcellentGoodGood
Windows laptops (Intel WiFi)GoodGoodVaries
iOS devicesGoodGoodVaries

WPA3 Roaming Problems:

Many Android devices have poor roaming support with WPA3:

  • Many Android devices (Xiaomi, Samsung, Huawei) don’t roam well with WPA3
  • Android 13 particularly problematic
  • Some iOS versions require manual reconnection
  • Linux generally works fine

Recommendation: Use WPA2-only for reliable roaming:

/interface wifi security
set authentication-types=wpa2-psk
# Remove wpa3-psk

“fastroaming stuff has very random implementation on clients side”

Client manufacturers implement roaming differently:

  • Some devices ignore 802.11v requests entirely
  • Roaming thresholds vary by device
  • Some devices roam proactively, others wait until signal is very weak
  1. Verify 802.11r enabled in security profile
  2. Ensure all APs use same mobility domain
  3. Check client device supports 802.11r
  4. Try WPA2-only if having WPA3 issues
  5. Verify overlapping coverage exists
  6. Check logs for roaming events

Do not kick off clients with weak signal, remove such wifiwave2 access-list rule if you have one

# Remove any aggressive signal-based rejection
/interface wifi access-list remove [find action=reject]
# Only reject very weak signals (below -90 dBm)
/interface wifi access-list add action=accept signal-range=-90..0
# Or allow all - let client decide
/interface wifi access-list add action=accept signal-range=-120..0

Successful roaming:

<mac>@AP1 roamed to <mac>@AP2, signal strength -66

Without fast roaming:

<mac>@AP1 disconnected, connection lost, signal strength -92
<mac>@AP2 connected, signal strength -75
/system logging add topics=wifi,debug
/interface wifi registration-table print
/interface wifi steering status
RouterOSPackage802.11r802.11k802.11v
6.xwirelessYes (limited)NoNo
7.0-7.12wifiYesYes (solicited)Yes (solicited)
7.13+wifiYesYesYes
7.21beta2+wifiYesYesYes (unsolicited)
  1. Use single CAPsMAN: Manage all APs from one RouterOS instance
  2. WPA2 for roaming: Disable WPA3 until client support improves
  3. Same security profile: Ensure identical settings across all APs
  4. Remove weak-signal kick: Don’t kick clients with weak signal
  5. Overlap coverage: Ensure APs have overlapping coverage areas
  6. Enable all three protocols: Use 802.11r/k/v together for best results