char *ifname;
struct connman_device *device;
struct connman_network *network;
+ struct connman_network *pending_network;
char *path;
char *netpath;
gboolean created;
gboolean noscan;
GSList *scan_results;
struct iw_range *range;
+ gboolean disconnecting;
};
static GSList *task_list = NULL;
connman_device_set_scanning(task->device, FALSE);
break;
case WPA_DISCONNECTED:
- /* carrier off */
- connman_network_set_connected(task->network, FALSE);
- connman_device_set_scanning(task->device, FALSE);
+ if (task->disconnecting == TRUE) {
+ connman_network_set_connected(task->network, FALSE);
+ connman_network_unref(task->network);
+ task->disconnecting = FALSE;
+
+ if (task->pending_network != NULL) {
+ task->network = task->pending_network;
+ task->pending_network = NULL;
+ task_connect(task);
+ }
+ } else {
+ /* carrier off */
+ connman_network_set_connected(task->network, FALSE);
+ connman_device_set_scanning(task->device, FALSE);
+ }
break;
case WPA_ASSOCIATING:
connman_network_set_associating(task->network, TRUE);
task->created = FALSE;
task->noscan = FALSE;
task->state = WPA_INVALID;
+ task->disconnecting = FALSE;
+ task->pending_network = NULL;
task_list = g_slist_append(task_list, task);
if (task == NULL)
return -ENODEV;
- task->network = connman_network_ref(network);
+ if (task->disconnecting == TRUE)
+ task->pending_network = connman_network_ref(network);
+ else {
+ task->network = connman_network_ref(network);
+ return task_connect(task);
+ }
- return task_connect(task);
+ return 0;
}
int supplicant_disconnect(struct connman_network *network)
if (task == NULL)
return -ENODEV;
+ if (task->disconnecting == TRUE)
+ return -EINPROGRESS;
+
disable_network(task);
remove_network(task);
- connman_network_set_connected(task->network, FALSE);
-
- connman_network_unref(task->network);
+ task->disconnecting = TRUE;
return 0;
}