Tim's blah blah blah

Improving wifi roaming without mesh routers

(Updated: )

Although I’ve managed to get WiFi connection in most corners of my house, I still had limited signal in my garden (‘for one of those days you can squint your eyes in the sun trying to read the screen’, a friend joked). Although this situation rarely happens, I still like to fix things in theory sometimes :p.

Mesh vs roaming

Commercial mesh routers offer two useful features:

  1. They create a mesh network (i.e. p2p) between the access points, which serves as a (WiFi) backbone for the network. The advantage is that you don’t need a cable between them. Strictly speaking, you only have a mesh with 3 or more points (as mesh implies multiple routing possibilities), although some commercial options sell with 2 access points, in which it’s simply a point to point WiFi connection.
  2. They allow clients to roam easily between access points, such that you only need to set up SSID/password once and this configuration is repeated. Although there are commercial ‘mesh’ solutions, in my case I could easily pull a cable between the two locations and therefore didn’t need the wireless backbone mesh routers typically offer. Instead, my idea was to use two OpenWRT devices (one routing, one dumb), create a wired connection between them, and roam between them with my phone.

Encouraging roaming at home

In theory, roaming could be solved on the hardware level by having a set of antennas, each emitting the same data (or actually radio waves) to one client. The client would then work with the strongest signal and never know which antenna it was talking to. These antennas could be smart and detect which of them detects most client signal and then broadcast only there. While in theory this could work, as far as I know this is not how mesh routers implement this (citation needed).

If the above option doesn’t work, roaming has to be achieved on a software level, which is much more tricky. In the end, it’s a client’s decision to (dis)connect to/from an AP. Even if the AP forcibly disconnects a client to encourage it to roam to a next station, the client can still decide to reconnect. As a user, this ‘feels’ like the client is ‘stuck’ to an AP which is getting out of range. The criterium to disconnect and seek again is set per client/OS, e.g. iOS disconnects at -70 dB. See for example this or this article.

Having said that, there are some tricks that can help with roaming. Apple has a nice article about roaming standards.

  1. 802.11r: fast BSS transition speeds up handover between APs - available in OpenWRT
  2. 802.11k: radio resource managemen, give clients a list of nearby APs
  3. 802.11v: Wireless Network Management, provides network information to the client to improve roaming

Choosing a router firmware

There is a wide range of router firmwares, for which the hierarchy is roughly as follows:

  1. OpenWRT: mother of all firmwares, limited hardware support because of strict opensource policy but extremely configurable
  2. DD-WRT (by Brainslayer): active project, however smaller community and seems to rely a lot on one person with a rather ominous name
    1. Kong: recompile of DD-WRT, has a few additional features, active project minor delta from main branch, even smaller community
    2. Tomato (by Shabby): inactive since 2017-04
      1. Asuswrt - official fork of tomato adopted by ASUS.
        1. Asuswrt-Merlin (=XWRT =Cross-WRT?), fork of AsusWRT
          1. XVortex — active, no vlan support, fork of AsusWRT-Merlin

I strongly prefer OpenWRT because of it’s very active development, broad user base, and fairly good documentation. The only caveat is that they support less hardware because they require open source drivers. TP-link is generally well supported (e.g. Archer C7, WDR3600), Netgear (e.g. R7000) less so.

I also tried DD-WRT which has much wider hardware support out of the box, lots of features as well, but presented more monolithically, if it’s not included by default it’s difficult to do. Also, ‘documentation’ is spread over forum posts which are oftentimes conflicting with each other. I never got VLANs working on DD-WRT which was two clicks in OpenWRT, for example.


I use an Archer C7 v2 as main router (tip: Ziggo sells these cheaply as ‘WiFi booster’, which can be unlocked by flashing the firmware), and an WDR3600 as my secondary router.

Implementing roaming

Once you have two or more routers with OpenWRT newer than 2018, enabling roaming is very simple:

Install full wpad

  1. Go to System -> Software
  2. Install wpad package (to replace wpad-mini)


  1. Go to Network -> Wireless
  2. Choose an interface, go to Interface
  3. Configuration -> Wireless Security
  4. Enable 802.11r:
    1. choose a unique NAS ID per AP (or leave empty)
    2. the same Mobility Domain fo all APs
    3. enable FT over DS,
    4. generate PSK locally To verify, you should see FT-PSK, on Mac this can be checked using the airport utility.
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -s