const char *newstate, *oldstate;
unsigned char bssid[ETH_ALEN];
unsigned int bssid_len;
- enum supplicant_state state;
+ enum supplicant_state state, prevstate;
dbus_error_init(&error);
DBG("state %s ==> %s", oldstate, newstate);
- connman_info("%s %s", task->ifname, newstate);
+ connman_info("%s %s%s", task->ifname, newstate,
+ task->scanning == TRUE ? " (scanning)" : "");
state = string2state(newstate);
if (state == WPA_INVALID)
task->scanning = FALSE;
}
+ prevstate = task->state;
task->state = state;
if (task->network == NULL)
switch (task->state) {
case WPA_COMPLETED:
+ switch (prevstate) {
+ case WPA_ASSOCIATED:
+ case WPA_GROUP_HANDSHAKE:
+ break;
+ default:
+ goto badstate;
+ }
+
/* reset scan trigger and schedule background scan */
connman_device_schedule_scan(task->device);
break;
case WPA_ASSOCIATING:
- connman_network_set_associating(task->network, TRUE);
+ switch (prevstate) {
+ case WPA_COMPLETED:
+ break;
+ case WPA_SCANNING:
+ connman_network_set_associating(task->network, TRUE);
+ break;
+ default:
+ goto badstate;
+ }
break;
case WPA_INACTIVE:
+ switch (prevstate) {
+ case WPA_SCANNING:
+ case WPA_DISCONNECTED:
+ break;
+ default:
+ goto badstate;
+ }
+
connman_network_set_connected(task->network, FALSE);
if (task->disconnecting == TRUE) {
connman_network_set_associating(task->network, FALSE);
break;
}
+
+ return;
+
+badstate:
+ connman_error("%s invalid state change %s -> %s", task->ifname,
+ oldstate, newstate);
}
static DBusHandlerResult supplicant_filter(DBusConnection *conn,