mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2025-01-03 10:32:33 +01:00
netdev: Work around CMD_CONNECT behavior on mwifiex
This commit is contained in:
parent
337f5e062e
commit
1fe5070666
44
src/netdev.c
44
src/netdev.c
@ -1961,6 +1961,25 @@ static void parse_request_ies(struct netdev *netdev, const uint8_t *ies,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void netdev_driver_connected(struct netdev *netdev)
|
||||||
|
{
|
||||||
|
netdev->connected = true;
|
||||||
|
|
||||||
|
if (netdev->event_filter)
|
||||||
|
netdev->event_filter(netdev, NETDEV_EVENT_ASSOCIATING, NULL,
|
||||||
|
netdev->user_data);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We register the eapol state machine here, in case the PAE
|
||||||
|
* socket receives EAPoL packets before the nl80211 socket
|
||||||
|
* receives the connected event. The logical sequence of
|
||||||
|
* events can be reversed (e.g. connect_event, then PAE data)
|
||||||
|
* due to scheduling
|
||||||
|
*/
|
||||||
|
if (netdev->sm)
|
||||||
|
eapol_register(netdev->sm);
|
||||||
|
}
|
||||||
|
|
||||||
static void netdev_connect_event(struct l_genl_msg *msg, struct netdev *netdev)
|
static void netdev_connect_event(struct l_genl_msg *msg, struct netdev *netdev)
|
||||||
{
|
{
|
||||||
struct l_genl_attr attr;
|
struct l_genl_attr attr;
|
||||||
@ -1981,6 +2000,10 @@ static void netdev_connect_event(struct l_genl_msg *msg, struct netdev *netdev)
|
|||||||
if (netdev->ignore_connect_event)
|
if (netdev->ignore_connect_event)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* Work around mwifiex which sends a Connect Event prior to the Ack */
|
||||||
|
if (netdev->connect_cmd_id)
|
||||||
|
netdev_driver_connected(netdev);
|
||||||
|
|
||||||
if (!netdev->connected) {
|
if (!netdev->connected) {
|
||||||
l_warn("Unexpected connection related event -- "
|
l_warn("Unexpected connection related event -- "
|
||||||
"is another supplicant running?");
|
"is another supplicant running?");
|
||||||
@ -2440,25 +2463,14 @@ static void netdev_cmd_connect_cb(struct l_genl_msg *msg, void *user_data)
|
|||||||
|
|
||||||
netdev->connect_cmd_id = 0;
|
netdev->connect_cmd_id = 0;
|
||||||
|
|
||||||
/* Wait for connect event */
|
|
||||||
if (l_genl_msg_get_error(msg) >= 0) {
|
if (l_genl_msg_get_error(msg) >= 0) {
|
||||||
netdev->connected = true;
|
|
||||||
|
|
||||||
if (netdev->event_filter)
|
|
||||||
netdev->event_filter(netdev,
|
|
||||||
NETDEV_EVENT_ASSOCIATING,
|
|
||||||
NULL,
|
|
||||||
netdev->user_data);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We register the eapol state machine here, in case the PAE
|
* connected should be false if the connect event hasn't come
|
||||||
* socket receives EAPoL packets before the nl80211 socket
|
* in yet. i.e. the CMD_CONNECT ack arrived first (typical).
|
||||||
* receives the connected event. The logical sequence of
|
* Mark the connection as 'connected'
|
||||||
* events can be reversed (e.g. connect_event, then PAE data)
|
|
||||||
* due to scheduling
|
|
||||||
*/
|
*/
|
||||||
if (netdev->sm)
|
if (!netdev->connected)
|
||||||
eapol_register(netdev->sm);
|
netdev_driver_connected(netdev);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user