From: James Prestwood <prestwoj@gmail.com>
To: iwd@lists.01.org
Subject: [PATCH v2 5/6] station: separate FT-over-DS stages
Date: Thu, 29 Apr 2021 12:41:02 -0700 [thread overview]
Message-ID: <20210429194103.207447-5-prestwoj@gmail.com> (raw)
In-Reply-To: <20210429194103.207447-1-prestwoj@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 3578 bytes --]
FT-over-DS was refactored to separate the FT action frame and
reassociation. From stations standpoint IWD needs to call
netdev_fast_transition_over_ds_action prior to actually roaming.
For now these two stages are being combined and the action
roam happens immediately after the action response callback.
---
src/station.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 52 insertions(+), 4 deletions(-)
diff --git a/src/station.c b/src/station.c
index c89b1901..6a308cfd 100644
--- a/src/station.c
+++ b/src/station.c
@@ -113,6 +113,7 @@ struct station {
bool ap_directed_roaming : 1;
bool scanning : 1;
bool autoconnect : 1;
+ bool ft_over_ds : 1;
};
struct anqp_entry {
@@ -1587,10 +1588,17 @@ static void station_roam_failed(struct station *station)
l_debug("%u", netdev_get_ifindex(station->netdev));
/*
- * If we attempted a reassociation or a fast transition, and ended up
- * here then we are now disconnected.
+ * If we attempted a reassociation or a fast transition (except DS),
+ * and ended up here then we are now disconnected. In the case of
+ * FT over DS we can remain connected to the AP even if the transition
+ * fails.
*/
if (station->state == STATION_STATE_ROAMING) {
+ if (station->ft_over_ds) {
+ station_enter_state(station, STATION_STATE_CONNECTED);
+ goto delayed_retry;
+ }
+
station_disassociated(station);
return;
}
@@ -1628,6 +1636,7 @@ delayed_retry:
station->preparing_roam = false;
station->roam_scan_full = false;
station->ap_directed_roaming = false;
+ station->ft_over_ds = false;
if (station->signal_low)
station_roam_timeout_rearm(station, roam_retry_interval);
@@ -1713,6 +1722,41 @@ static bool bss_match_bssid(const void *a, const void *b)
return !memcmp(bss->addr, bssid, sizeof(bss->addr));
}
+static void station_fast_transition_ds_cb(struct netdev *netdev,
+ uint16_t status, const uint8_t *bssid,
+ void *user_data)
+{
+ struct station *station = user_data;
+ struct scan_bss *bss;
+
+ if (status != 0)
+ goto failed;
+
+ /*
+ * TODO: In the future it may be desired to start sending out these
+ * FT-over-DS action frames at the time of connecting then be able to
+ * roam immediately when required. If this is being done we can simply
+ * bail out now as ft already caches the entires. But since this was
+ * initiated due to a need to roam, do so now.
+ */
+
+ /* Make sure we still have our BSS */
+ bss = l_queue_find(station->bss_list, bss_match_bssid, bssid);
+ if (!bss)
+ goto failed;
+
+ l_debug("Starting FT-over-DS roam");
+
+ if (netdev_fast_transition_over_ds(station->netdev, bss,
+ station_fast_transition_cb) < 0)
+ goto failed;
+
+ return;
+
+failed:
+ station_roam_failed(station);
+}
+
static void station_preauthenticate_cb(struct netdev *netdev,
enum netdev_result result,
const uint8_t *pmk, void *user_data)
@@ -1810,8 +1854,12 @@ static void station_transition_start(struct station *station,
/* FT-over-DS can be better suited for these situations */
if ((hs->mde[4] & 1) && (station->ap_directed_roaming ||
station->signal_low)) {
- if (netdev_fast_transition_over_ds(station->netdev, bss,
- station_fast_transition_cb) < 0) {
+ station->ft_over_ds = true;
+
+ if (netdev_fast_transition_over_ds_action(
+ station->netdev, bss,
+ station_fast_transition_ds_cb,
+ station) < 0) {
station_roam_failed(station);
return;
}
--
2.26.2
next prev parent reply other threads:[~2021-04-29 19:41 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-29 19:40 [PATCH v2 1/6] ft: create class for FT-over-DS targets James Prestwood
2021-04-29 19:40 ` [PATCH v2 2/6] ft: separate over-air from over-ds initializers James Prestwood
2021-04-29 19:41 ` [PATCH v2 3/6] netdev: separate over-air and over-ds netdev APIs James Prestwood
2021-04-29 19:41 ` [PATCH v2 4/6] ft: netdev: refactor FT-over-DS into two stages James Prestwood
2021-04-29 20:33 ` Denis Kenzior
2021-04-29 19:41 ` James Prestwood [this message]
2021-04-29 19:41 ` [PATCH v2 6/6] ft: netdev: add return value to tx_associate James Prestwood
2021-04-29 20:23 ` [PATCH v2 1/6] ft: create class for FT-over-DS targets Denis Kenzior
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=20210429194103.207447-5-prestwoj@gmail.com \
--to=prestwoj@gmail.com \
--cc=iwd@lists.01.org \
/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