feat(openwrt): declarative wireless scope + move 5GHz to DFS ch100 #100

Merged
kblack0610 merged 1 commit from feat/openwrt-declarative-wireless into master 2026-07-08 03:52:56 +00:00
Owner

What

Adds a wireless scope to the declarative OpenWrt manager (infrastructure/openwrt/), mirroring the existing dns/firewall subsystems, and moves the 5GHz radio to clean spectrum.

Why

Investigating whether smart plugs were hurting WiFi surfaced the real issue: the single AP (ASUS TUF-AX6000) had its 5GHz on ch36/HE80, whose 80MHz block overlaps a 14-AP neighbor on ch44. A scan found the DFS band completely empty. The router was also on the world regdomain (country 00), which is a misconfig and blocks DFS AP transmit.

Changes

  • wireless.yaml (new) — per-radio channel/htmode/country, keyed by band.
  • openwrt.shwireless wired into bootstrap/validate/diff/sync/export/status/restore. Applies via wifi reload.
  • README.md — scope + secret caveat, DFS/regdomain note (ch149/HE40 fallback), device→band routing table.

Scope guarantee

Manages only wifi-device radio sections — never wifi-iface (SSIDs/keys/PSKs stay out of git).

Intent applied

  • 2.4GHz: keep ch6/HE20 (least-congested of {1,6,11}); set country=US.
  • 5GHz: ch36→100 (DFS/UNII-2C, empty); country=US unlocks DFS transmit.

Verification

  • openwrt validate → 0 errors.
  • openwrt diff wireless → shows exactly: 2g.country -> US, 5g.channel 36 -> 100, 5g.country -> US.
  • Post-merge: openwrt sync wireless, confirm iwinfo phy1-ap0 info reports ch100 after DFS CAC, watch logread for radar events.
## What Adds a `wireless` scope to the declarative OpenWrt manager (`infrastructure/openwrt/`), mirroring the existing dns/firewall subsystems, and moves the 5GHz radio to clean spectrum. ## Why Investigating whether smart plugs were hurting WiFi surfaced the real issue: the single AP (ASUS TUF-AX6000) had its 5GHz on ch36/HE80, whose 80MHz block overlaps a 14-AP neighbor on ch44. A scan found the DFS band completely empty. The router was also on the world regdomain (`country 00`), which is a misconfig and blocks DFS AP transmit. ## Changes - **`wireless.yaml`** (new) — per-radio `channel`/`htmode`/`country`, keyed by band. - **`openwrt.sh`** — `wireless` wired into bootstrap/validate/diff/sync/export/status/restore. Applies via `wifi reload`. - **`README.md`** — scope + secret caveat, DFS/regdomain note (ch149/HE40 fallback), device→band routing table. ## Scope guarantee Manages only `wifi-device` radio sections — **never** `wifi-iface` (SSIDs/keys/PSKs stay out of git). ## Intent applied - 2.4GHz: keep ch6/HE20 (least-congested of {1,6,11}); set `country=US`. - 5GHz: ch36→**100** (DFS/UNII-2C, empty); `country=US` unlocks DFS transmit. ## Verification - `openwrt validate` → 0 errors. - `openwrt diff wireless` → shows exactly: `2g.country -> US`, `5g.channel 36 -> 100`, `5g.country -> US`. - Post-merge: `openwrt sync wireless`, confirm `iwinfo phy1-ap0 info` reports ch100 after DFS CAC, watch `logread` for radar events.
Extend the declarative OpenWrt manager with a `wireless` subsystem, mirroring
the existing dns/firewall pattern: bootstrap/validate/diff/sync/export/status/
restore all learn a `wireless` scope backed by a new `wireless.yaml`.

Scope is deliberately narrow — per-radio channel/htmode/country only, keyed by
band and resolved to the wifi-device section by its own `band`. It never touches
wifi-iface sections, so SSIDs/keys/PSKs stay out of git.

Wireless intent:
- 2.4GHz: keep ch6/HE20 (least-congested of {1,6,11} by scan); set country=US.
- 5GHz: move ch36→100 (DFS/UNII-2C, scanned empty; off the congested 36-48
  block that overlapped a 14-AP neighbor). country=US unlocks DFS AP transmit
  (world domain forbids it via no-IR).

README documents the scope, the DFS/regdomain caveat + ch149/HE40 fallback, and
a device→band routing table (5GHz for phones/laptops, 2.4GHz reserved for IoT).

Applied via `openwrt sync wireless` (wifi reload; DFS adds ~60s CAC).
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
kblack0610/home-config!100
No description provided.