netdev: keep track of operational state

We should not attempt to call connect_failed if we're have become
operational.  E.g. successfully associated, ran eapol if necessary and
set operstate.
This commit is contained in:
Denis Kenzior 2016-09-22 15:55:07 -05:00
parent 2d87556b6b
commit 886ffc2edb
1 changed files with 11 additions and 2 deletions

View File

@ -75,6 +75,7 @@ struct netdev {
uint32_t next_watch_id;
bool connected : 1;
bool operational : 1;
bool eapol_active : 1;
bool rekey_offload_support : 1;
};
@ -280,6 +281,7 @@ static void netdev_connect_free(struct netdev *netdev)
netdev->eapol_active = false;
}
netdev->operational = false;
netdev->connected = false;
netdev->connect_cb = NULL;
netdev->event_filter = NULL;
@ -562,6 +564,8 @@ static void netdev_operstate_cb(bool success, void *user_data)
return;
}
netdev->operational = true;
if (netdev->connect_cb) {
netdev->connect_cb(netdev, NETDEV_RESULT_OK, netdev->user_data);
netdev->connect_cb = NULL;
@ -1205,8 +1209,13 @@ int netdev_disconnect(struct netdev *netdev,
if (netdev->disconnect_cmd_id)
return -EINPROGRESS;
netdev->result = NETDEV_RESULT_ABORTED;
netdev_connect_failed(NULL, netdev);
/* Only perform this if we haven't successfully fully associated yet */
if (!netdev->operational) {
netdev->result = NETDEV_RESULT_ABORTED;
netdev_connect_failed(NULL, netdev);
} else {
netdev_connect_free(netdev);
}
deauthenticate = netdev_build_cmd_deauthenticate(netdev,
MPDU_REASON_CODE_DEAUTH_LEAVING);