mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-16 17:09:24 +01:00
netdev: handle disconnect event during a connection
If a disconnect arrives at any point during the 4-way handshake or key setting this would result in netdev sending a disconnect event to station. If this is a reassociation this case is unhandled in station and causes a hang as it expects any connection failure to be handled via the reassociation callback, not a random disconnect event. To handle this case we can utilize netdev_disconnected() along with the new NETDEV_RESULT_DISCONNECTED result to ensure the connect callback gets called if it exists (indicating a pending connection) Below are logs showing the "Unexpected disconnect event" which prevents IWD from cleaning up its state and ultimately results in a hang: Jul 16 18:16:13: src/station.c:station_transition_reassociate() Jul 16 18:16:13: event: state, old: connected, new: roaming Jul 16 18:16:13: src/wiphy.c:wiphy_radio_work_done() Work item 65 done Jul 16 18:16:13: src/wiphy.c:wiphy_radio_work_next() Starting work item 66 Jul 16 18:16:13: src/netdev.c:netdev_mlme_notify() MLME notification Del Station(20) Jul 16 18:16:13: src/netdev.c:netdev_link_notify() event 16 on ifindex 6 Jul 16 18:16:13: src/netdev.c:netdev_mlme_notify() MLME notification Deauthenticate(39) Jul 16 18:16:13: src/netdev.c:netdev_deauthenticate_event() Jul 16 18:16:13: src/netdev.c:netdev_mlme_notify() MLME notification New Station(19) Jul 16 18:16:13: src/station.c:station_netdev_event() Associating Jul 16 18:16:13: src/netdev.c:netdev_mlme_notify() MLME notification Authenticate(37) Jul 16 18:16:13: src/netdev.c:netdev_authenticate_event() Jul 16 18:16:13: src/netdev.c:netdev_mlme_notify() MLME notification Associate(38) Jul 16 18:16:13: src/netdev.c:netdev_associate_event() Jul 16 18:16:13: src/netdev.c:netdev_link_notify() event 16 on ifindex 6 Jul 16 18:16:13: src/netdev.c:netdev_mlme_notify() MLME notification Connect(46) Jul 16 18:16:13: src/netdev.c:netdev_connect_event() Jul 16 18:16:13: src/netdev.c:netdev_connect_event() aborting and ignore_connect_event not set, proceed Jul 16 18:16:13: src/netdev.c:netdev_connect_event() expect_connect_failure not set, proceed Jul 16 18:16:13: src/netdev.c:parse_request_ies() Jul 16 18:16:13: src/netdev.c:netdev_connect_event() Request / Response IEs parsed Jul 16 18:16:13: src/netdev.c:netdev_get_oci() Jul 16 18:16:13: src/netdev.c:netdev_link_notify() event 16 on ifindex 6 Jul 16 18:16:13: src/netdev.c:netdev_link_notify() event 16 on ifindex 6 Jul 16 18:16:13: src/netdev.c:netdev_link_notify() event 16 on ifindex 6 Jul 16 18:16:13: src/netdev.c:netdev_get_oci_cb() Obtained OCI: freq: 5220, width: 3, center1: 5210, center2: 0 Jul 16 18:16:13: src/eapol.c:eapol_start() Jul 16 18:16:13: src/netdev.c:netdev_unicast_notify() Unicast notification Control Port Frame(129) Jul 16 18:16:13: src/netdev.c:netdev_control_port_frame_event() Jul 16 18:16:13: src/eapol.c:eapol_handle_ptk_1_of_4() ifindex=6 Jul 16 18:16:13: src/netdev.c:netdev_mlme_notify() MLME notification Control Port TX Status(139) Jul 16 18:16:14: src/netdev.c:netdev_mlme_notify() MLME notification Notify CQM(64) Jul 16 18:16:14: src/netdev.c:netdev_cqm_event() Signal change event (above=1 signal=-60) Jul 16 18:16:17: src/netdev.c:netdev_link_notify() event 16 on ifindex 6 Jul 16 18:16:17: src/netdev.c:netdev_mlme_notify() MLME notification Del Station(20) Jul 16 18:16:17: src/netdev.c:netdev_mlme_notify() MLME notification Deauthenticate(39) Jul 16 18:16:17: src/netdev.c:netdev_deauthenticate_event() Jul 16 18:16:17: src/netdev.c:netdev_mlme_notify() MLME notification Disconnect(48) Jul 16 18:16:17: src/netdev.c:netdev_disconnect_event() Jul 16 18:16:17: Received Deauthentication event, reason: 15, from_ap: true Jul 16 18:16:17: src/wiphy.c:wiphy_radio_work_done() Work item 66 done Jul 16 18:16:17: src/station.c:station_disconnect_event() 6 Jul 16 18:16:17: Unexpected disconnect event Jul 16 18:16:17: src/netdev.c:netdev_link_notify() event 16 on ifindex 6 Jul 16 18:16:17: src/wiphy.c:wiphy_reg_notify() Notification of command Reg Change(36) Jul 16 18:16:17: src/wiphy.c:wiphy_update_reg_domain() New reg domain country code for (global) is XX
This commit is contained in:
parent
22f238706c
commit
556f90ec28
19
src/netdev.c
19
src/netdev.c
@ -1243,8 +1243,7 @@ static void netdev_disconnect_event(struct l_genl_msg *msg,
|
|||||||
const void *data;
|
const void *data;
|
||||||
uint16_t reason_code = 0;
|
uint16_t reason_code = 0;
|
||||||
bool disconnect_by_ap = false;
|
bool disconnect_by_ap = false;
|
||||||
netdev_event_func_t event_filter;
|
enum netdev_event event;
|
||||||
void *event_data;
|
|
||||||
|
|
||||||
l_debug("");
|
l_debug("");
|
||||||
|
|
||||||
@ -1282,19 +1281,11 @@ static void netdev_disconnect_event(struct l_genl_msg *msg,
|
|||||||
l_info("Received Deauthentication event, reason: %hu, from_ap: %s",
|
l_info("Received Deauthentication event, reason: %hu, from_ap: %s",
|
||||||
reason_code, disconnect_by_ap ? "true" : "false");
|
reason_code, disconnect_by_ap ? "true" : "false");
|
||||||
|
|
||||||
event_filter = netdev->event_filter;
|
event = disconnect_by_ap ? NETDEV_EVENT_DISCONNECT_BY_AP :
|
||||||
event_data = netdev->user_data;
|
NETDEV_EVENT_DISCONNECT_BY_SME;
|
||||||
netdev_connect_free(netdev);
|
|
||||||
|
|
||||||
if (!event_filter)
|
netdev_disconnected(netdev, NETDEV_RESULT_DISCONNECTED,
|
||||||
return;
|
event, reason_code);
|
||||||
|
|
||||||
if (disconnect_by_ap)
|
|
||||||
event_filter(netdev, NETDEV_EVENT_DISCONNECT_BY_AP,
|
|
||||||
&reason_code, event_data);
|
|
||||||
else
|
|
||||||
event_filter(netdev, NETDEV_EVENT_DISCONNECT_BY_SME,
|
|
||||||
&reason_code, event_data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void netdev_cmd_disconnect_cb(struct l_genl_msg *msg, void *user_data)
|
static void netdev_cmd_disconnect_cb(struct l_genl_msg *msg, void *user_data)
|
||||||
|
Loading…
Reference in New Issue
Block a user