Skip to content

Add optional steering_ssid allow-list to scope DAWN per SSID - #268

Merged
PolynomialDivision merged 1 commit into
berlin-open-wireless-lab:masterfrom
lePaulo:feature/steering-ssid-allowlist
Jun 10, 2026
Merged

Add optional steering_ssid allow-list to scope DAWN per SSID#268
PolynomialDivision merged 1 commit into
berlin-open-wireless-lab:masterfrom
lePaulo:feature/steering-ssid-allowlist

Conversation

@lePaulo

@lePaulo lePaulo commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Motivation

There is currently no way to run DAWN on some SSIDs but not others. DAWN
subscribes to every hostapd BSS it discovers under hostapd_dir, and there
is no UCI option (nor an OpenWrt wireless option) to scope it. On APs that host
a mix of networks — e.g. a steered main/roaming SSID alongside a static IoT or
guest SSID that should be left completely alone — this is an all-or-nothing
choice today.

What this adds

An opt-in allow-list in the config hostapd section:

config hostapd
    option hostapd_dir '/var/run/hostapd'
    list steering_ssid 'MyMainNetwork'
    list steering_ssid 'MyRoamingNetwork'
  • With no steering_ssid entries the list is empty and behaviour is
    unchanged — DAWN manages every BSS, exactly as before. Fully backwards
    compatible.
  • With one or more entries, only BSSes whose SSID is listed are managed.

Implementation

Filtering happens at interface discovery in subscribe_to_new_interfaces().
A BSS whose SSID is not allowed is simply never subscribed, so DAWN neither
steers/kicks its clients nor shares their measurements with peer APs — the
interface is invisible to DAWN rather than partially handled.

  • The SSID is read with the existing get_ssid(ifname, ...) (iwinfo), which
    works at discovery time, so no extra subscription is needed to make the
    decision.
  • Fail-open: if the SSID cannot be read, the interface is managed as
    before, so the feature can never accidentally disable steering.
  • The check only runs for not-yet-subscribed interfaces, so steady-state
    overhead is nil; an excluded BSS is re-evaluated on each rescan, so it can be
    picked up later if its SSID changes.
  • The allow-list is loaded once via a new uci_get_dawn_steering_ssids()
    (mirroring uci_get_dawn_hostapd_dir()); dawn_ssid_is_managed() does the
    membership test.

Caveat

Like hostapd_dir, the config hostapd section is not covered by
ubus call dawn reload_config, so changes to steering_ssid take effect on
service restart. This is noted in CONFIGURE.md.

Docs

CONFIGURE.md (regenerated CONFIG-H row + prose) and the example
dawn-config are updated.

Testing

  • Cross-compiled for mediatek/filogic (aarch64_cortex-a53) against the
    OpenWrt 25.12.4 SDK — clean build under DAWN's -Wall -Werror --std=gnu99 -Wmissing-declarations.
  • Installed and runtime-tested on MT7981 hardware (OpenWrt 25.12.4): an
    excluded SSID's clients are no longer steered/kicked, while the listed SSID
    continues to be managed normally. Log confirms the skip:
    [SUBSCRIBING] Skipping <iface>: SSID '<other>' not in steering_ssid list.

🤖 Generated with Claude Code

DAWN manages every hostapd BSS it discovers under hostapd_dir; there is
no way to run it on some SSIDs but not others. Add an opt-in allow-list:
zero or more `list steering_ssid '<SSID>'` entries in the `config hostapd`
section restrict DAWN to the named SSIDs. With no entries the list is
empty and the historic manage-everything behaviour is preserved.

Filtering happens at interface discovery in subscribe_to_new_interfaces():
a BSS whose SSID is not allowed is never subscribed, so DAWN neither
steers/kicks its clients nor shares their measurements with peer APs.
SSID lookup fails open — if it cannot be read the interface is managed as
before. The check only runs for not-yet-subscribed interfaces, so steady
-state overhead is nil and an excluded BSS is re-evaluated on each rescan.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@PolynomialDivision

Copy link
Copy Markdown
Collaborator

Fine for me. But if we dont subscribe to each "ssid", we maybe loose some information how many clients are in total on a radio and similar. However, for now I dont think this is important.

@lePaulo

lePaulo commented Jun 10, 2026

Copy link
Copy Markdown
Contributor Author

Thanks! Agreed it's not critical for now — and good point to flag.

Small clarification on the metrics: channel utilization actually survives, since get_channel_utilization() reads the channel-wide survey (busy_time/active_time), which already includes the airtime of the other BSSes on the radio — so an unsubscribed SSID's load is still reflected there.

The one that does undercount is station_count, and only when an excluded SSID shares a radio with a managed one and use_station_count is enabled. If that ever matters, a natural follow-up would be a "subscribe for metrics but never steer" mode — happy to look at it in a later PR if you'd want that.

Since this is opt-in (empty steering_ssid = manage everything, as today), it doesn't change any existing deployment.

Cheers!

@PolynomialDivision
PolynomialDivision merged commit 806166b into berlin-open-wireless-lab:master Jun 10, 2026
1 check passed
@lePaulo

lePaulo commented Jun 10, 2026

Copy link
Copy Markdown
Contributor Author

@PolynomialDivision - thanks for merging. Can you close the following issue then please: #239

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants