aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2020-02-14 16:01:04 -0600
committerDenis Kenzior <denkenz@gmail.com>2020-02-28 10:25:04 -0600
commit53ea9adfb5c550d3dbe8ec55ab51a3ec9340e862 (patch)
tree97ae43d040c7673d5b48b76de0b401f9a9a1e303
parentdf64dd443e05d5451bd0a8f06db0010e34599e22 (diff)
downloadiwd-53ea9adfb5c550d3dbe8ec55ab51a3ec9340e862.tar.gz
netdev: Fix disconnect event coming out of order
mac80211 drivers seem to send the disconnect event which is triggered by CMD_DISCONNECT prior to the CMD_DISCONNECT response. However, some drivers, namely brcmfmac, send the response first and then send the disconnect event. This confused iwd when a connection was immediately triggered after a disconnection (network switch operation). Fix this by making sure that connected variable isn't set until the connect event is actually processed, and ignore disconnect events which come after CMD_DISCONNECT has alredy succeeded.
-rw-r--r--src/netdev.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/netdev.c b/src/netdev.c
index 1dd1428f9..ed633e356 100644
--- a/src/netdev.c
+++ b/src/netdev.c
@@ -2055,6 +2055,8 @@ static void netdev_cmd_connect_cb(struct l_genl_msg *msg, void *user_data)
/* Wait for connect event */
if (l_genl_msg_get_error(msg) >= 0) {
+ netdev->connected = true;
+
if (netdev->event_filter)
netdev->event_filter(netdev,
NETDEV_EVENT_ASSOCIATING,
@@ -2397,7 +2399,6 @@ static int netdev_connect_common(struct netdev *netdev,
netdev->event_filter = event_filter;
netdev->connect_cb = cb;
netdev->user_data = user_data;
- netdev->connected = true;
netdev->handshake = hs;
netdev->sm = sm;
netdev->frequency = bss->frequency;
@@ -2432,7 +2433,7 @@ int netdev_connect(struct netdev *netdev, struct scan_bss *bss,
netdev->type != NL80211_IFTYPE_P2P_CLIENT)
return -ENOTSUP;
- if (netdev->connected)
+ if (netdev->connected || netdev->connect_cmd_id)
return -EISCONN;
switch (hs->akm_suite) {