From: James Prestwood <prestwoj@gmail.com>
To: iwd@lists.linux.dev
Cc: James Prestwood <prestwoj@gmail.com>
Subject: [PATCH v2 10/13] station: do full passive scan if 6GHz is supported but disabled.
Date: Wed, 3 Aug 2022 14:36:41 -0700 [thread overview]
Message-ID: <20220803213644.277534-10-prestwoj@gmail.com> (raw)
In-Reply-To: <20220803213644.277534-1-prestwoj@gmail.com>
The kernel handles setting the regulatory domain by receiving beacons which
set the country IE. Presumably since most regulatory domains disallow 6GHz
the default (world) domain also disables it. This means until the country
is set, 6GHz is disabled.
This poses a problem for IWD's quick scanning since it only scans a few
frequencies and this likely isn't enough beacons for the firmware to update
the country, leaving 6Ghz inaccessable to the user without manual intervention
(e.g. iw scan passive, or periodic scans by IWD).
To try and work around this limitation the quick scan logic has been updated
to check if a 6GHz AP has been connected to before and if that frequency is
disabled (but supported). If this is the case IWD will opt for a full passive
scan rather than scanning a limited set of frequencies.
---
src/station.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 67 insertions(+)
diff --git a/src/station.c b/src/station.c
index 02f21c76..f002d7ef 100644
--- a/src/station.c
+++ b/src/station.c
@@ -112,6 +112,8 @@ struct station {
struct scan_freq_set *scan_freqs_order[3];
unsigned int dbus_scan_subset_idx;
+ uint32_t wiphy_watch;
+
bool preparing_roam : 1;
bool roam_scan_full : 1;
bool signal_low : 1;
@@ -119,6 +121,7 @@ struct station {
bool scanning : 1;
bool autoconnect : 1;
bool autoconnect_can_start : 1;
+ bool regdom_updating : 1;
};
struct anqp_entry {
@@ -1353,11 +1356,37 @@ static void station_quick_scan_destroy(void *userdata)
static int station_quick_scan_trigger(struct station *station)
{
struct scan_freq_set *known_freq_set;
+ bool known_6ghz;
+ const struct scan_freq_set *disabled = wiphy_get_disabled_freqs(
+ station->wiphy);
known_freq_set = known_networks_get_recent_frequencies(5);
if (!known_freq_set)
return -ENODATA;
+ if (station->regdom_updating) {
+ l_debug("regdom is updating, delaying quick scan");
+
+ scan_freq_set_free(known_freq_set);
+ return 0;
+ }
+
+ known_6ghz = scan_freq_set_get_bands(known_freq_set) & BAND_FREQ_6_GHZ;
+
+ /*
+ * This means IWD has previously connected to a 6GHz AP before, but now
+ * the regulatory domain disallows 6GHz likely caused by a reboot, the
+ * firmware going down, or a regulatory update. The only way to
+ * re-enable 6GHz is to get enough beacons via scanning for the firmware
+ * to set the regulatory domain. A quick scan is very unlikely to do
+ * this since its so limited, so return an error which will fall back to
+ * full autoconnect.
+ */
+ if ((scan_freq_set_get_bands(disabled) & BAND_FREQ_6_GHZ) &&
+ wiphy_country_is_unknown(station->wiphy) &&
+ known_6ghz)
+ return -EAGAIN;
+
if (!wiphy_constrain_freq_set(station->wiphy, known_freq_set)) {
scan_freq_set_free(known_freq_set);
return -ENOTSUP;
@@ -3977,6 +4006,37 @@ static void station_fill_scan_freq_subsets(struct station *station)
}
}
+static void station_wiphy_watch(struct wiphy *wiphy,
+ enum wiphy_state_watch_event event,
+ void *user_data)
+{
+ struct station *station = user_data;
+
+ switch (event) {
+ case WIPHY_STATE_WATCH_EVENT_REGDOM_STARTED:
+ station->regdom_updating = true;
+ return;
+ case WIPHY_STATE_WATCH_EVENT_REGDOM_DONE:
+ station->regdom_updating = false;
+
+ /*
+ * The only state that requires special handling is for
+ * quick scans since the previous quick scan was delayed until
+ * the regulatory domain updated. Try again in case 6Ghz is now
+ * unlocked (unlikely), or advance to full autoconnect.
+ */
+ if (station->state != STATION_STATE_AUTOCONNECT_QUICK)
+ return;
+
+ if (!station_quick_scan_trigger(station))
+ return;
+
+ station_enter_state(station, STATION_STATE_AUTOCONNECT_FULL);
+ default:
+ return;
+ }
+}
+
static struct station *station_create(struct netdev *netdev)
{
struct station *station;
@@ -3997,6 +4057,11 @@ static struct station *station_create(struct netdev *netdev)
station->wiphy = netdev_get_wiphy(netdev);
station->netdev = netdev;
+ station->wiphy_watch = wiphy_state_watch_add(station->wiphy,
+ station_wiphy_watch,
+ station, NULL);
+ station->regdom_updating = wiphy_regdom_is_updating(station->wiphy);
+
l_queue_push_head(station_list, station);
l_dbus_object_add_interface(dbus, netdev_get_path(netdev),
@@ -4106,6 +4171,8 @@ static void station_free(struct station *station)
if (station->scan_freqs_order[2])
scan_freq_set_free(station->scan_freqs_order[2]);
+ wiphy_state_watch_remove(station->wiphy, station->wiphy_watch);
+
l_free(station);
}
--
2.34.3
next prev parent reply other threads:[~2022-08-03 21:36 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-03 21:36 [PATCH v2 01/13] wiphy: fix runtime error from bit shift James Prestwood
2022-08-03 21:36 ` [PATCH v2 02/13] scan: track scanned frequencies for entire request James Prestwood
2022-08-03 21:36 ` [PATCH v2 03/13] nl80211util: add nl80211_parse_supported_frequencies James Prestwood
2022-08-04 15:27 ` Denis Kenzior
2022-08-03 21:36 ` [PATCH v2 04/13] wiphy: track self-managed flag James Prestwood
2022-08-03 21:36 ` [PATCH v2 05/13] wiphy: use nl80211_parse_supported_frequencies James Prestwood
2022-08-03 21:36 ` [PATCH v2 06/13] wiphy: add two regulatory domain state events James Prestwood
2022-08-04 15:31 ` Denis Kenzior
2022-08-03 21:36 ` [PATCH v2 07/13] wiphy: dump wiphy's on regulatory domain change James Prestwood
2022-08-03 21:36 ` [PATCH v2 08/13] wiphy: add wiphy_regdom_is_updating James Prestwood
2022-08-03 21:36 ` [PATCH v2 09/13] wiphy: add wiphy_country_is_unknown James Prestwood
2022-08-04 16:48 ` Denis Kenzior
2022-08-03 21:36 ` James Prestwood [this message]
2022-08-03 21:36 ` [PATCH v2 11/13] scan: split full scans by band to enable 6GHz James Prestwood
2022-08-03 21:36 ` [PATCH v2 12/13] scan: watch for regdom updates " James Prestwood
2022-08-03 21:36 ` [PATCH v2 13/13] wiphy: don't re-dump wiphy if the regdom didn't change James Prestwood
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220803213644.277534-10-prestwoj@gmail.com \
--to=prestwoj@gmail.com \
--cc=iwd@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox