On Tue, 2015-04-28 at 09:09 +0300, [email protected] wrote:
> From: Pasi Sjöholm <[email protected]>
>
> While wifi->state is G_SUPPLICANT_STATE_COMPLETED and gets changed into
> G_SUPPLICANT_STATE_4WAY_HANDSHAKE the connection is most probably roaming.
>
> However if for some reason the wifi->state changes into
> G_SUPPLICANT_STATE_DISCONNECTED after being G_SUPPLICANT_STATE_4WAY_HANDSHAKE
> the handle_4way_handshake_failure() is called from interface_state() it is
> required to check wifi->connected and force disconnect if true.
>
> If not the actual disconnection will be skipped unless
> retries > FAVORITE_MAXIMUM_RETRIES and wifi->connected will be set as false.
> Later on this will cause state-machine deadlock between network.c and wifi.c
> as network.c will still think that the network is connected and after wifi.c
> thinks it's not.
>
> In short: wifi->state will change into G_SUPPLICANT_STATE_SCANNING->
> G_SUPPLICANT_STATE_ASSOCIATING and connman_network_set_associating(network,
> true);
> gets called. Now the network.c is in both associating and connected. Finally
> when
> wifi->state goes through G_SUPPLICANT_STATE_4WAY_HANDSHAKE ->
> G_SUPPLICANT_STATE_COMPLETED the connman_network_set_connected(network, true);
> will be called but it will never call set_connected as it's already connected
> and
> service state will stay as "associating" until disconnected.
And applied, thanks for fixing this corner(?) case.
Patrik
_______________________________________________
connman mailing list
[email protected]
https://lists.connman.net/mailman/listinfo/connman