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

Reply via email to