Reviewed-on: #5 Co-authored-by: Finn <fwaggoner@nmfpgt.de> Co-committed-by: Finn <fwaggoner@nmfpgt.de>
94 lines
3.0 KiB
Markdown
94 lines
3.0 KiB
Markdown
# openUF — C
|
|
|
|
Daemon that makes an OpenWrt router appear as a **UniFi U6 InWall** to the UniFi Network controller.
|
|
|
|
## Implemented Features
|
|
|
|
| Feature | Description | Implementation |
|
|
| --- | --- | --- |
|
|
| **L2 Discovery** | UDP broadcast + multicast every 10s | `announce.c` → port 10001 |
|
|
| **Adoption** | AES-128-CBC handshake with the controller | `inform.c` → `handle_response()` |
|
|
| **WiFi Config** | Creates WiFi networks from the controller via UCI | `wlan.c` → `wlan_apply_config()` |
|
|
| **Band Steering** | 802.11k/v Neighbor Reports + BSS Transition | `wlan.c` → `apply_vap()` |
|
|
| **Fast Roaming** | 802.11r FT with mobility_domain derived from MAC | `wlan.c` → `apply_vap()` |
|
|
| **WPA3 / PMF** | SAE, SAE-mixed, 802.11w 0/1/2 | `wlan.c` → `sec_to_uci()` |
|
|
| **WiFi Clients** | MAC, signal, bitrate, bytes per VAP | `clients.c` → `iw station dump` |
|
|
| **Wired Clients** | MACs from bridge FDB | `clients.c` → `bridge fdb` |
|
|
| **CPU / RAM** | Real-time usage | `sysinfo.c` → `/proc/stat` + `/proc/meminfo` |
|
|
| **Interfaces** | Speed, duplex, rx/tx counters | `sysinfo.c` → `/proc/net/dev` |
|
|
| **Channel / RF** | Channel utilization, noise, tx_power | `sysinfo.c` → `iw survey dump` |
|
|
| **LLDP Send** | Custom frames via AF_PACKET raw socket | `lldp.c` → `lldp_send_frame()` |
|
|
| **LLDP Read** | Neighbors for UniFi topology | `lldp.c` → `lldpctl -f json` |
|
|
|
|
## Quick Installation
|
|
|
|
```sh
|
|
# On the OpenWrt device:
|
|
opkg update
|
|
opkg install gcc make libmbedtls-dev libuci-dev libjson-c-dev
|
|
|
|
# Compile and install
|
|
make -f Makefile.standalone install
|
|
|
|
# Configure
|
|
vi /etc/openuf/openuf.conf # adjust controller_ip and lan_if
|
|
|
|
# Start
|
|
/etc/init.d/openuf start
|
|
/etc/init.d/openuf enable # start on boot
|
|
|
|
```
|
|
|
|
## Configuration
|
|
|
|
```ini
|
|
controller_ip = 192.168.1.1 # UniFi controller IP
|
|
lan_if = br-lan # LAN interface (for MAC and IP)
|
|
ufmodel = u6-inwall # emulated model
|
|
inform_interval = 10 # seconds between informs
|
|
enable_announce = 1
|
|
enable_inform = 1
|
|
|
|
```
|
|
|
|
## U6 InWall Model
|
|
|
|
A **U6 IW** is emulated because it has 5 GbE ports, which covers most OpenWrt routers. The model reports:
|
|
|
|
* 5 ethernet ports (eth0-eth4)
|
|
* 2.4 GHz WiFi 6 Radio (HE/802.11ax)
|
|
* 5 GHz WiFi 6 Radio (HE/802.11ax)
|
|
|
|
## LLDP
|
|
|
|
For visual topology in UniFi:
|
|
|
|
```sh
|
|
opkg install lldpd
|
|
/etc/init.d/lldpd start
|
|
/etc/init.d/lldpd enable
|
|
|
|
```
|
|
|
|
openuf sends its own LLDP frames even without lldpd (raw socket).
|
|
With lldpd installed, it also reports upstream neighbors (switches).
|
|
|
|
## Adoption
|
|
|
|
The process is automatic:
|
|
|
|
1. The AP appears as "Pending" in UniFi.
|
|
2. Click on "Adopt" → the controller sends a new key.
|
|
3. The AP applies the key and becomes "Connected".
|
|
4. The controller pushes the WiFi configuration (SSIDs, channels, etc.).
|
|
5. Make sure your WiFi Name doesn't have characters like " - " cause of bad JSON! Grrr
|
|
|
|
To reset: `rm /etc/openuf/state.json && reboot`
|
|
|
|
## Dependencies
|
|
|
|
```sh
|
|
opkg install libmbedtls libuci libjson-c
|
|
opkg install lldpd # optional, for topology
|
|
|
|
``` |