About Wi-Fi roaming, I'd like to share my experience. I hope it will be useful to all of you.
I've been "googling" a lot about wi-fi roaming. What I wanted was a seamless switch from one AP to another one. 802.11 extensions k, v and r are supposed to help, mas not every client implements them. It seems that Android and Windows uses just some of them. I've read that iOS devices seem to take better use, but I can't confirm since I don't own one. I tried a OpenWrt build with the complete wpad package, so I could use some of these extensions. After some tests, it was not that good.
There were people claiming that a good solution was to disable low transfer rates. This seems to be incorrect and could lead to a worse scenario.
A really good solution is to reduce transmission power on each AP. When signal becomes very weak, clients will search for a better AP and make the switch. But only in this very weak signal situation. This is why you need to reduce transmission power. You can use an app (such has Android Wifi Analyzer) to monitor signal strength while you walk around. Adjust power as needed.
Even with all this, some clients may still get attached to a low signal (but still useful) AP and refuse to switch. To help with that, I used the wifi-disconnect-low-signal script on all APs, which disconnects clients when signal is not good, forcing them to switch AP. It works great.
Now the recipe: First of all, I adjusted transmission power in each AP so that I get a lower limit of -70dBm at the furthest places. Then I configured wifi-disconnect-low-signal SNR limits to 35 (connect) and -30 (stay). It is important to make sure that when the scripts disconnects a client, there will be a strong AP nearby. Otherwise, the client will be disconnect again, resulting in a bad experience. Try and error is needed until you get a good balance. For this, I opened two SSH sessions on each AP: on the first session I run wifi-disconnect-low-signal in verbose mode (-v -v); on the second session I watched OpenWrt system log (logread -f). Then I slowly walked around, while monitoring it all. This way I could watch when I was disconnected from one AP and connected to another one, verifying if it occurred at the right time/place.
Since then I've been able to walk around and still get a stable SSH connection and a stable VoIP conversation.