feat: support split SSID per band in PnP setup (#378)#938
Conversation
When the router ships with per-band SSIDs (split mode), the PnP setup now shows a separate WiFi name/password card per band instead of a single field that only reflected the first radio. - Add PnpWiFiSettings/PnpWiFiRadio model and replace getDefaultWiFiNameAndPassphrase() with getDefaultWiFiSettings(), which reads all radios from getRadioInfo and derives split vs unified mode. - PersonalWiFiStep renders per-band cards in split mode and validates all bands; unified mode keeps the existing single-field UI. - save() applies per-band ssid/passphrase in split mode and re-applies the authoritative per-band security from getRadioInfo so the network is not downgraded to open (which previously wiped the passphrase). - Pin the horizontal stepper's Back/Next controls below the scrollable content (PrivacyGUI-Widgets v1.2.9) so they stay visible with the taller multi-band content. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Qodo reviews are paused for this user.Troubleshooting steps vary by plan Learn more → On a Teams plan? Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center? |
Code ReviewOverall the split/unified mode branching is clean and the security re-application from A few notes:
Otherwise LGTM 👍 |
PeterJhongLinksys
left a comment
There was a problem hiding this comment.
Looks good to me
…FiSettings
Unifies the PnP save path with the WiFi settings page (wirelessap service).
Build SetRadioSettings from the current getRadioInfo, overriding only ssid and
wpaPersonalSettings.passphrase per band while preserving mode/channel/
channelWidth/broadcastSSID/security straight from the device.
This removes the SetSimpleWiFiSettings security-downgrade workaround entirely:
security is no longer re-derived (getSimpleWiFiSettings could report 'None'),
it is carried over untouched, so no band can be downgraded to open. Verified on
unconfigured hardware that SetRadioSettings is accepted before setDeviceMode
{Master}; transaction ordering is unchanged.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The WiFi-ready screen previously only showed the primary (2.4GHz) credential, which was misleading on split-SSID routers where each band has a different SSID/password. - Split mode: render one compact horizontal card per band (QR + band name + SSID + password + print/download), headline shows "Your network is ready" (new loc string pnpNetworkReady) instead of a single band's SSID. - Unified mode: unchanged (large QR + password card, headline shows the SSID). - Pin the "Done" button at the bottom using the same bounded-height + scroll pattern as the stepper, content-aligned and without a divider, so it matches the Back/Next footer on the other PnP steps. - Add split-SSID "WiFi ready" localization test case. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Translate the "Your network is ready" string (used on the PnP WiFi-ready screen in split-SSID mode) into all 25 supported locales. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Update — scope expanded beyond the initial split-SSID displaySince the original PR, the following changes were added based on testing and review. Full commit list:
2. SetRadioSettings migration (
|
* fix: extract inline scripts to external JS for CSP compliance (#927) Move inline <script> blocks from index.html to early-bootstrap.js, enabling removal of 'unsafe-inline' from script-src CSP directive. Closes #926 Ref: linksys/LinksysWRT#352 Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> * fix: replace parentheses with dash in language display names for RTL compatibility (#934) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> * feat: support split SSID per band in PnP setup (#378) (#938) * feat: support split SSID in PnP personalize WiFi step (#378) When the router ships with per-band SSIDs (split mode), the PnP setup now shows a separate WiFi name/password card per band instead of a single field that only reflected the first radio. - Add PnpWiFiSettings/PnpWiFiRadio model and replace getDefaultWiFiNameAndPassphrase() with getDefaultWiFiSettings(), which reads all radios from getRadioInfo and derives split vs unified mode. - PersonalWiFiStep renders per-band cards in split mode and validates all bands; unified mode keeps the existing single-field UI. - save() applies per-band ssid/passphrase in split mode and re-applies the authoritative per-band security from getRadioInfo so the network is not downgraded to open (which previously wiped the passphrase). - Pin the horizontal stepper's Back/Next controls below the scrollable content (PrivacyGUI-Widgets v1.2.9) so they stay visible with the taller multi-band content. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor: PnP WiFi write uses SetRadioSettings instead of SetSimpleWiFiSettings Unifies the PnP save path with the WiFi settings page (wirelessap service). Build SetRadioSettings from the current getRadioInfo, overriding only ssid and wpaPersonalSettings.passphrase per band while preserving mode/channel/ channelWidth/broadcastSSID/security straight from the device. This removes the SetSimpleWiFiSettings security-downgrade workaround entirely: security is no longer re-derived (getSimpleWiFiSettings could report 'None'), it is carried over untouched, so no band can be downgraded to open. Verified on unconfigured hardware that SetRadioSettings is accepted before setDeviceMode {Master}; transaction ordering is unchanged. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat: show per-band WiFi on PnP "ready" screen for split SSID The WiFi-ready screen previously only showed the primary (2.4GHz) credential, which was misleading on split-SSID routers where each band has a different SSID/password. - Split mode: render one compact horizontal card per band (QR + band name + SSID + password + print/download), headline shows "Your network is ready" (new loc string pnpNetworkReady) instead of a single band's SSID. - Unified mode: unchanged (large QR + password card, headline shows the SSID). - Pin the "Done" button at the bottom using the same bounded-height + scroll pattern as the stepper, content-aligned and without a divider, so it matches the Back/Next footer on the other PnP steps. - Add split-SSID "WiFi ready" localization test case. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * i18n: add pnpNetworkReady translations for all locales Translate the "Your network is ready" string (used on the PnP WiFi-ready screen in split-SSID mode) into all 25 supported locales. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> * chore: bump version to 1.2.14 (#944) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Summary
Adds split-SSID support to the PnP "Personalize your WiFi" step. The setup now detects whether the router uses unified or split SSIDs and renders accordingly:
Related
Changes
PnpWiFiSettings/PnpWiFiRadio(lib/page/instant_setup/data/pnp_wifi_settings.dart).primaryRadioprioritizes 2.4 GHz, falls back to first radio.pnp_provider.dart: replacedgetDefaultWiFiNameAndPassphrase()withgetDefaultWiFiSettings(), reading all radios fromgetRadioInfoand deriving split vs unified mode.save(): applies per-band ssid/passphrase in split mode; always re-applies the authoritative per-bandsecurityfromgetRadioInfo(sincegetSimpleWiFiSettingscan reportsecurity: "None", which would downgrade the network to open and wipe the passphrase).isWiFiChangeddiffs each band's edited values against current router values to avoid redundant writes.PersonalWiFiStep: per-bandTextEditingControllers created/disposed by mode; all bands validated before enabling Next.pnp_setup_view.dart,pnp_admin_view.dart) usegetDefaultWiFiSettings().primaryRadio.v1.2.9): Back/Next controls pinned below the scrollable content so they stay visible with the taller multi-band content.Testing
GetRadioInfo3returns the 5 GHz SSID for 6 GHz). Values written viaSetSimpleWiFiSettingsare correct.flutter analyzeclean (only pre-existing warnings); PnP localization tests pass.🤖 Generated with Claude Code