From 16a8dfffd13b84e34260104912a16e33b8f06862 Mon Sep 17 00:00:00 2001 From: Howard Enos Date: Tue, 16 Jun 2026 21:34:18 -0700 Subject: [PATCH] unifi-wifi: fix apply-wlan wlan_bands 6e->6g; add 5GHz + 6GHz phases to Cascades runbook - apply-wlan.sh: wlan_bands token was "6e" but this controller stores "6g" (verified live on Cascades Guest SSID) -> setting 6 GHz membership would have failed. Fixed band values + option names (5g6g/6g/all). - Cascades 2.4 runbook: folded in Phase 5 (5 GHz: width 80->40 on 76 radios; channel plan with the DFS decision flagged -- DFS empirically clean here, so including clean-DFS gives ~20 channels vs ~5 non-DFS-only for 77 APs) and Phase 6 (6 GHz: root cause = production SSID CSCNet not on 6 GHz [bands 2g,5g only]; add 6g + enable bss-transition; band-steering already on). Per Howard. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../skills/unifi-wifi/scripts/apply-wlan.sh | 13 ++--- .../2026-06-16-2.4ghz-remediation-runbook.md | 50 +++++++++++++++++-- 2 files changed, 53 insertions(+), 10 deletions(-) diff --git a/.claude/skills/unifi-wifi/scripts/apply-wlan.sh b/.claude/skills/unifi-wifi/scripts/apply-wlan.sh index bd5ddda..3672ab0 100644 --- a/.claude/skills/unifi-wifi/scripts/apply-wlan.sh +++ b/.claude/skills/unifi-wifi/scripts/apply-wlan.sh @@ -10,7 +10,7 @@ # minrate auto|off| -> minrate_setting_preference + minrate__enabled/_data_rate_kbps # kill 1-11Mbps legacy basic rates: set 2.4 floor to 12 or 24. e.g. minrate ng 12 # bandsteer -> no2ghz_oui (keep 5GHz-capable client OUIs off 2.4 = band steering) -# bands -> wlan_bands (force the SSID onto specific bands; 5g = strongest steer) +# bands -> wlan_bands (force the SSID onto specific bands; 5g = strongest steer; 6g = this controller's 6GHz token) # steer -> roaming_assistant_na_enabled (5GHz sticky-client kicker) # bsstm -> bss_transition (802.11v; assists band/AP steering + roaming) # (modern UniFi has no classic 'bandsteering_mode' field; the above are its replacements, confirmed 2026-06-16) @@ -42,14 +42,15 @@ case "$ACT" in case "$SVAL" in on) FIELDS="{\"roaming_assistant_na_enabled\":true}";; off) FIELDS="{\"roaming_assistant_na_enabled\":false}";; *) echo "steer: on|off"; exit 1;; esac ;; bandsteer) SVAL="${1:?bandsteer }"; shift # keep 5GHz-capable client OUIs OFF 2.4 (the band-steering toggle) case "$SVAL" in on) FIELDS="{\"no2ghz_oui\":true}";; off) FIELDS="{\"no2ghz_oui\":false}";; *) echo "bandsteer: on|off"; exit 1;; esac ;; - bands) SVAL="${1:?bands }"; shift # per-WLAN band membership (force SSID onto bands) + bands) SVAL="${1:?bands }"; shift # per-WLAN band membership (force SSID onto bands) + # NOTE: this controller stores 6 GHz as "6g" (verified live on Cascades Guest SSID), NOT "6e". case "$SVAL" in both) FIELDS="{\"wlan_bands\":[\"2g\",\"5g\"]}";; 5g) FIELDS="{\"wlan_bands\":[\"5g\"]}";; - 5g6e) FIELDS="{\"wlan_bands\":[\"5g\",\"6e\"]}";; - 6e) FIELDS="{\"wlan_bands\":[\"6e\"]}";; - all) FIELDS="{\"wlan_bands\":[\"2g\",\"5g\",\"6e\"]}";; - *) echo "bands: both|5g|5g6e|6e|all"; exit 1;; esac ;; + 5g6g) FIELDS="{\"wlan_bands\":[\"5g\",\"6g\"]}";; + 6g) FIELDS="{\"wlan_bands\":[\"6g\"]}";; + all) FIELDS="{\"wlan_bands\":[\"2g\",\"5g\",\"6g\"]}";; + *) echo "bands: both|5g|5g6g|6g|all"; exit 1;; esac ;; bsstm) SVAL="${1:?bsstm }"; shift # 802.11v BSS Transition Management (assists steering/roaming) case "$SVAL" in on) FIELDS="{\"bss_transition\":true}";; off) FIELDS="{\"bss_transition\":false}";; *) echo "bsstm: on|off"; exit 1;; esac ;; wlan) SVAL="${1:?wlan }"; shift # enable/disable the whole SSID diff --git a/clients/cascades-tucson/reports/2026-06-16-2.4ghz-remediation-runbook.md b/clients/cascades-tucson/reports/2026-06-16-2.4ghz-remediation-runbook.md index 12f9ef2..7c46127 100644 --- a/clients/cascades-tucson/reports/2026-06-16-2.4ghz-remediation-runbook.md +++ b/clients/cascades-tucson/reports/2026-06-16-2.4ghz-remediation-runbook.md @@ -95,15 +95,57 @@ in a covered area; no user complaints. If a dead spot appears → re-enable that --- +## Phase 5 — 5 GHz tuning (NEXT phase, after the 2.4 power-down settles) +Both changes are reversible and coverage-safe (width/channel don't change coverage). Per zone, dry-run +(omit `--apply`) then apply; Floors 5 & 6 excluded per scope. + +**5a. Width 80 -> 40 MHz** (currently 80 MHz on 76/77). 40 MHz doubles the non-overlapping channels -> +better spatial reuse in this AP density. (Halves peak per-client rate, but the density win dominates.) +``` +for z in "Floor 3" "Floor 1" "Floor 2" "Floor 4"; do \ + bash .claude/skills/unifi-wifi/scripts/apply-radio.sh cascades na width 40 --zone "$z" --apply; done +# rollback: na width 80 +``` + +**5b. Channel plan — DECISION NEEDED (non-DFS vs include clean-DFS):** +- DFS reality here: `dfs-check.sh` found **ZERO radar events fleet-wide** -> DFS channels are empirically CLEAN. +- Tradeoff at 40 MHz: **non-DFS-only** = ~5 usable channels (36-48 + 149-165) for 77 APs -> heavy co-channel. + **Including the clean DFS channels** (52-144) gives ~20 channels -> far better reuse, tiny resilience risk + (a radar hit would force a vacate, but none seen near Davis-Monthan in the logs). +- RECOMMENDATION: use a plan that INCLUDES clean DFS for channel diversity. Choose non-DFS-only only if you + want maximum resilience and will accept more co-channel overlap. (55/77 are on DFS today.) +``` +SURVEY=.claude/tmp/cascades-survey.json; SURVEY_JSON=$SURVEY bash .../survey-collect.sh cascades +SURVEY_JSON=$SURVEY bash .../channel-plan.sh cascades na # dry-run; review, then apply per zone w/ validation +``` + +## Phase 6 — 6 GHz adoption + steering (the untapped clean band) +**Root cause 6 GHz is empty (1 client):** the production SSID **CSCNet is NOT broadcasting on 6 GHz** +(`wlan_bands=["2g","5g"]`); only Guest is. So step 1 is enabling the band, then assisting steering. +``` +# 6a. add 6 GHz to CSCNet (keeps 2.4/5 for legacy): +bash .claude/skills/unifi-wifi/scripts/apply-wlan.sh cascades bands all --wlan CSCNet --apply # -> [2g,5g,6g] +# 6b. enable 802.11v BSS-transition on CSCNet (Guest already has it; assists up-band steering + roaming): +bash .claude/skills/unifi-wifi/scripts/apply-wlan.sh cascades bsstm on --wlan CSCNet --apply +``` +Band-steering (`no2ghz_oui`) is already ON for CSCNet. After 6a/6b, 6E/7-capable clients gravitate to the +clean 6 GHz, offloading 5 GHz. Validate: `live-stats` client mix shifts toward 6e; confirm no SSID-visibility +loss for legacy devices (none expected — 2.4/5 stay on). 6 GHz has shorter range, fine with 77 APs. +(CSC ENT is legacy/being deprecated — leave as-is or add 6g too.) +> NOTE: this controller's 6 GHz token is `6g` (not `6e`); apply-wlan.sh fixed accordingly 2026-06-16. + +--- + ## NOT doing tonight (explicit — so nothing is ambiguous) - **Power-DOWN instead of disable** (redundant but high-client, keep serving): `3rd Floor Atrium, 318, 303, 4th Floor Atrium, 406-408, Dining Room` — already set Low in Phase 1; leave ON. (505 was here but Floor 5 is now EXCLUDED — Howard 2026-06-16 — so 505/517 and Floor 6's 615/608/622 are left fully alone.) - **HOLD (leave fully on):** `Memcare TV room` (memory-care area); all **MESH-PROTECTED** APs. -- **Companion 2.4 levers deferred to a later night** (isolate cause/effect): min-data-rate raise - (1→12 Mbps), band-steering (`apply-wlan bandsteer`), 2.4 min-RSSI on the 6 OFF APs - (615,608,505,517,622,salon). These are the next big airtime levers once disables are validated. -- **5 GHz / DFS / channel-plan:** separate effort (see full audit). +- **Remaining 2.4 levers deferred** (isolate cause/effect; do after disables validate): min-data-rate raise + (1→12 Mbps) and 2.4 min-RSSI on the OFF APs that aren't on excluded floors. (Band-steering `no2ghz_oui` + is already ON for CSCNet/CSC ENT/Guest.) +- **5 GHz tuning + 6 GHz adoption are now Phase 5 & Phase 6** above (folded in per Howard 2026-06-16) — + the next phase after the 2.4 power-down settles. ---