Hi,
On Fri, 2015-10-23 at 00:47 +0300, [email protected] wrote:
> From: Pasi Sjöholm <[email protected]>
>
> Due unknown reason sometimes device->scanning is not set to false after
> wifi scanning (connman 1.30 and wpa_supplicant 2.5).
> This is probably due callback-function not being called after wifi scan
> and therefore it needs to have a timer to prevent deadlock.
> ---
You probably have evidence that the callback is not called, right?
Please state that in the commit message.
What will happen if wpa_supplicant will call the callback after 16
seconds, i.e. after ConnMan has triggered scan_fail_timeout? Will there
be any artefacts if this happens?
Cheers,
Patrik
> plugins/wifi.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 49 insertions(+), 1 deletion(-)
>
> diff --git a/plugins/wifi.c b/plugins/wifi.c
> index dfe849f..35d4fe6 100644
> --- a/plugins/wifi.c
> +++ b/plugins/wifi.c
> @@ -61,6 +61,7 @@
>
> #define CLEANUP_TIMEOUT 8 /* in seconds */
> #define INACTIVE_TIMEOUT 12 /* in seconds */
> +#define SCAN_FAIL_TIMEOUT 15 /* in seconds */
> #define FAVORITE_MAXIMUM_RETRIES 2
>
> #define BGSCAN_DEFAULT "simple:30:-45:300"
> @@ -131,6 +132,7 @@ struct wifi_data {
> struct hidden_params *hidden;
> bool postpone_hidden;
> struct wifi_tethering_info *tethering_param;
> + unsigned int scan_fail_timeout;
> /**
> * autoscan "emulation".
> */
> @@ -817,9 +819,25 @@ static void reset_autoscan(struct connman_device *device)
> connman_device_unref(device);
> }
>
> +static gboolean scan_fail_timeout(gpointer data)
> +{
> + struct connman_device *device = data;
> + struct wifi_data *wifi = connman_device_get_data(device);
> +
> + DBG("");
> +
> + if (!wifi)
> + return FALSE;
> +
> + connman_device_set_scanning(device, CONNMAN_SERVICE_TYPE_WIFI, false);
> + wifi->scan_fail_timeout = 0;
> +
> + return FALSE;
> +}
> +
> static void stop_autoscan(struct connman_device *device)
> {
> - const struct wifi_data *wifi = connman_device_get_data(device);
> + struct wifi_data *wifi = connman_device_get_data(device);
>
> if (!wifi || !wifi->autoscan)
> return;
> @@ -827,6 +845,11 @@ static void stop_autoscan(struct connman_device *device)
> reset_autoscan(device);
>
> connman_device_set_scanning(device, CONNMAN_SERVICE_TYPE_WIFI, false);
> +
> + if (wifi->scan_fail_timeout) {
> + g_source_remove(wifi->scan_fail_timeout);
> + wifi->scan_fail_timeout = 0;
> + }
> }
>
> static void check_p2p_technology(void)
> @@ -876,6 +899,10 @@ static void wifi_remove(struct connman_device *device)
> if (wifi->p2p_connection_timeout)
> g_source_remove(wifi->p2p_connection_timeout);
>
> + if (wifi->scan_fail_timeout) {
> + g_source_remove(wifi->scan_fail_timeout);
> + }
> +
> remove_networks(device, wifi);
>
> connman_device_set_powered(device, false);
> @@ -1193,6 +1220,11 @@ static int throw_wifi_scan(struct connman_device
> *device,
> if (ret == 0) {
> connman_device_set_scanning(device,
> CONNMAN_SERVICE_TYPE_WIFI, true);
> +
> + wifi->scan_fail_timeout = g_timeout_add_seconds(
> + SCAN_FAIL_TIMEOUT,
> + scan_fail_timeout,
> + device);
> } else
> connman_device_unref(device);
>
> @@ -1262,6 +1294,11 @@ static void scan_callback(int result,
> GSupplicantInterface *interface,
> if (scanning) {
> connman_device_set_scanning(device,
> CONNMAN_SERVICE_TYPE_WIFI, false);
> +
> + if (wifi && wifi->scan_fail_timeout) {
> + g_source_remove(wifi->scan_fail_timeout);
> + wifi->scan_fail_timeout = 0;
> + }
> }
>
> if (result != -ENOLINK)
> @@ -1516,6 +1553,11 @@ static int wifi_disable(struct connman_device *device)
> connman_device_unref(wifi->device);
> }
>
> + if (wifi->scan_fail_timeout) {
> + g_source_remove(wifi->scan_fail_timeout);
> + wifi->scan_fail_timeout = 0;
> + }
> +
> /* In case of a user scan, device is still referenced */
> if (connman_device_get_scanning(device)) {
> connman_device_set_scanning(device,
> @@ -1864,6 +1906,12 @@ static int wifi_scan(enum connman_service_type type,
> if (ret == 0) {
> connman_device_set_scanning(device,
> CONNMAN_SERVICE_TYPE_WIFI, true);
> +
> + wifi->scan_fail_timeout = g_timeout_add_seconds(
> + SCAN_FAIL_TIMEOUT,
> + scan_fail_timeout,
> + device);
> +
> } else {
> g_supplicant_free_scan_params(scan_params);
> connman_device_unref(device);
_______________________________________________
connman mailing list
[email protected]
https://lists.connman.net/mailman/listinfo/connman