diff options
author | Denis Kenzior <denkenz@gmail.com> | 2020-02-14 16:01:04 -0600 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2020-02-28 10:25:04 -0600 |
commit | 53ea9adfb5c550d3dbe8ec55ab51a3ec9340e862 (patch) | |
tree | 97ae43d040c7673d5b48b76de0b401f9a9a1e303 | |
parent | df64dd443e05d5451bd0a8f06db0010e34599e22 (diff) | |
download | iwd-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.c | 5 |
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) { |