Files

uneighbord

uneighbord synchronizes hostapd 802.11k Neighbor Reports between local hostapd.* BSSes and other OpenWrt access points on the same LAN, over IPv6 link-local UDP multicast. Reports are only shared between BSSes with the same SSID, and installed through hostapd's ubus API.

Requirements

ucode, ucode-mod-ubus, ucode-mod-uloop, ucode-mod-socket, ucode-mod-uci, ucode-mod-log.

Build and install

make menuconfig                  # select Network -> uneighbord
make package/uneighbord/compile V=s

Install the resulting package, then:

/etc/init.d/uneighbord enable
/etc/init.d/uneighbord start

Configuration

config uneighbord 'main'
        option enabled '1'
        option network 'lan'

network is an OpenWrt logical network name (not a device name); its l3_device is used for multicast membership and scope.

How it works

Every 30 seconds each AP announces its local Neighbor Reports (from rrm_nr_get_own) as a small JSON packet to a fixed IPv6 multicast group on port 32027. For each local BSS, same-SSID reports from other local BSSes and remote peers are merged, excluding the BSS's own entry, and installed via rrm_nr_set. Remote peers are dropped after 90 seconds without a fresh announcement.

uneighbord assumes a trusted L2/backhaul network: announcements are unauthenticated, so any host able to reach the multicast group can influence the installed Neighbor Report list.

Debugging

ubus list 'hostapd.*'
ubus call hostapd.<interface> rrm_nr_list
logread -e uneighbord
ss -6 -u -a -n | grep 32027
ip -6 maddr show dev br-lan