wiphy: Use CMD_DISCONNECT, not CMD_DEAUTHENTICATE

CMD_DEAUTHENTICATE seems to carry only the management frame pdu
information.  CMD_DISCONNECT is carrying the information that is
actually needed by us:
> Event: Disconnect (0x30) len 28		1140.118545
    Wiphy: 0 (0x00000000)
    Interface Index: 3 (0x00000003)
    Reason Code: 2 (0x0002)
    Disconnect by AP: true
This commit is contained in:
Denis Kenzior 2015-04-08 15:04:22 -05:00
parent 313dcbb8ff
commit 0b48ba3a4a
1 changed files with 32 additions and 23 deletions

View File

@ -1181,49 +1181,55 @@ error:
static void mlme_deauthenticate_event(struct l_genl_msg *msg, static void mlme_deauthenticate_event(struct l_genl_msg *msg,
struct netdev *netdev) struct netdev *netdev)
{
l_debug("");
}
static void mlme_disconnect_event(struct l_genl_msg *msg,
struct netdev *netdev)
{ {
struct l_genl_attr attr; struct l_genl_attr attr;
uint16_t type, len; uint16_t type, len;
const void *data; const void *data;
struct l_dbus_message *reply; uint16_t reason_code = 0;
int err; bool disconnect_by_ap = false;
l_debug(""); l_debug("");
err = l_genl_msg_get_error(msg);
if (err < 0) {
l_error("authentication failed %s (%d)", strerror(-err), err);
goto error;
}
if (!l_genl_attr_init(&attr, msg)) { if (!l_genl_attr_init(&attr, msg)) {
l_debug("attr init failed"); l_error("attr init failed");
goto error; return;
} }
while (l_genl_attr_next(&attr, &type, &len, &data)) { while (l_genl_attr_next(&attr, &type, &len, &data)) {
switch (type) { switch (type) {
case NL80211_ATTR_TIMED_OUT: case NL80211_ATTR_REASON_CODE:
l_warn("deauthentication timed out"); if (len != sizeof(uint16_t))
goto error; l_warn("Invalid reason code attribute");
else
reason_code = *((uint16_t *) data);
break;
case NL80211_ATTR_DISCONNECTED_BY_AP:
disconnect_by_ap = true;
break;
} }
} }
l_info("Deauthentication completed"); l_info("Received Deauthentication event, reason: %hu, from_ap: %s",
netdev->connected_bss = NULL; reason_code, disconnect_by_ap ? "true" : "false");
if (!netdev->connect_pending) if (!disconnect_by_ap)
return; return;
reply = l_dbus_message_new_method_return(netdev->connect_pending); if (netdev->connect_pending) {
l_dbus_message_set_arguments(reply, ""); struct network *network = netdev->connected_bss->network;
dbus_pending_reply(&netdev->connect_pending, reply);
return; dbus_pending_reply(&netdev->connect_pending,
error:
dbus_pending_reply(&netdev->connect_pending,
dbus_error_failed(netdev->connect_pending)); dbus_error_failed(netdev->connect_pending));
}
netdev->connected_bss = NULL; netdev->connected_bss = NULL;
} }
@ -1979,6 +1985,9 @@ static void wiphy_mlme_notify(struct l_genl_msg *msg, void *user_data)
case NL80211_CMD_DEAUTHENTICATE: case NL80211_CMD_DEAUTHENTICATE:
mlme_deauthenticate_event(msg, netdev); mlme_deauthenticate_event(msg, netdev);
break; break;
case NL80211_CMD_DISCONNECT:
mlme_disconnect_event(msg, netdev);
break;
} }
} }