Send connman mailing list submissions to
[email protected]
To subscribe or unsubscribe via the World Wide Web, visit
https://lists.01.org/mailman/listinfo/connman
or, via email, send a message with subject or body 'help' to
[email protected]
You can reach the person managing the list at
[email protected]
When replying, please edit your Subject line so it is more specific
than "Re: Contents of connman digest..."
Today's Topics:
1. [PATCH] service: Block wifi autoconnection when hidden
connection is in progress (Saurav Babu)
2. Re: [PATCH v1 0/7] Too many DBG() on default (Daniel Wagner)
----------------------------------------------------------------------
Message: 1
Date: Fri, 18 Nov 2016 14:50:08 +0530
From: Saurav Babu <[email protected]>
To: [email protected]
Cc: [email protected], Saurav Babu <[email protected]>
Subject: [PATCH] service: Block wifi autoconnection when hidden
connection is in progress
Message-ID:
<[email protected]>
Hi Patrik,
>> In the following scenario:
>> 1. Device is connected to AP in non hidden mode.
>> 2. Connection is initated to AP in hidden mode.
>> connman disconnects old service and tries to connect to new service.
>> But
>> for connecting hidden service it first scans the hidden AP and when
>> network is added for hidden AP then connection is tried. In the
>> meantime
>> normal AP got disconnected and was tried to autoconnect even before
>> hidden AP was scanned successfully.
>> This patch blocks auto connect when any service connection is in
>> progress and unblocks autoconnection after connection is started
>> or hidden wifi scan is completed and hidden AP is not found in the
>> scan list.
>> ---
>>
>> v3: Defer auto connect of services when one service is connecting
>> Allow auto connect of services when service connection fails with
>> error
>>
>>
>> src/connman.h | 2 ++
>> src/network.c | 4 ++++
>> src/service.c | 22 ++++++++++++++++++++--
>> 3 files changed, 26 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/connman.h b/src/connman.h
>> index ce3ef8d..945518b 100644
>> --- a/src/connman.h
>> +++ b/src/connman.h
>> @@ -796,6 +796,8 @@ void __connman_service_notify(struct
>> connman_service *service,
>> int __connman_service_counter_register(const char *counter);
>> void __connman_service_counter_unregister(const char *counter);
>>
>> +void __connman_service_enable_autoconnect(bool autoconnect);
>> +
>> #include <connman/peer.h>
>>
>> int __connman_peer_init(void);
>> diff --git a/src/network.c b/src/network.c
>> index 2e423bc..e24970d 100644
>> --- a/src/network.c
>> +++ b/src/network.c
>> @@ -1370,6 +1370,8 @@ void connman_network_clear_hidden(void
>> *user_data)
>>
>> DBG("user_data %p", user_data);
>>
>> + __connman_service_enable_autoconnect(true);
>> +
>> /*
>> * Hidden service does not have a connect timeout so
>> * we do not need to remove it. We can just return
>> @@ -1389,6 +1391,8 @@ int connman_network_connect_hidden(struct
>> connman_network *network,
>>
>> DBG("network %p service %p user_data %p", network, service,
>> user_data);
>>
>> + __connman_service_enable_autoconnect(true);
>> +
>> if (!service)
>> return -EINVAL;
>>
>> diff --git a/src/service.c b/src/service.c
>> index f6a76f6..316581a 100644
>> --- a/src/service.c
>> +++ b/src/service.c
>> @@ -48,6 +48,7 @@ static unsigned int autoconnect_timeout = 0;
>> static unsigned int vpn_autoconnect_timeout = 0;
>> static struct connman_service *current_default = NULL;
>> static bool services_dirty = false;
>> +static bool allow_autoconnect = true;
>>
>> struct connman_stats {
>> bool valid;
>> @@ -3849,6 +3850,9 @@ void __connman_service_auto_connect(enum
>> connman_service_connect_reason reason)
>> if (autoconnect_timeout != 0)
>> return;
>>
>> + if (!allow_autoconnect)
>> + return;
>> +
>> if (!__connman_session_policy_autoconnect(reason))
>> return;
>>
>> @@ -4025,6 +4029,8 @@ static DBusMessage
>> *connect_service(DBusConnection *conn,
>>
>> index = __connman_service_get_index(service);
>>
>> + allow_autoconnect = false;
>> +
>> for (list = service_list; list; list = list->next) {
>> struct connman_service *temp = list->data;
>>
>> @@ -4042,8 +4048,10 @@ static DBusMessage
>> *connect_service(DBusConnection *conn,
>> err = -EINPROGRESS;
>>
>> }
>> - if (err == -EINPROGRESS)
>> + if (err == -EINPROGRESS) {
>> + allow_autoconnect = true;
>> return __connman_error_operation_timeout(msg);
>> + }
>>
>> service->ignore = false;
>>
>> @@ -4060,8 +4068,10 @@ static DBusMessage
>> *connect_service(DBusConnection *conn,
>> service->pending = NULL;
>> }
>>
>> - if (err < 0)
>> + if (err < 0) {
>> + allow_autoconnect = true;
>> return __connman_error_failed(msg, -err);
>> + }
>>
>> return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
>> }
>> @@ -5231,6 +5241,9 @@ static void request_input_cb(struct
>> connman_service *service,
>> service_complete(service);
>> __connman_connection_update_gateway();
>> }
>> +
>> + if (!service->hidden)
>> + allow_autoconnect = true;
>> }
>>
>> static void downgrade_connected_services(void)
>> @@ -5921,6 +5934,11 @@ static void prepare_8021x(struct
>> connman_service *service)
>> service-
>> >phase2);
>> }
>>
>> +void __connman_service_enable_autoconnect(bool autoconnect)
>> +{
>> + allow_autoconnect = autoconnect;
>> +}
>> +
>> static int service_connect(struct connman_service *service)
>> {
>> int err;
> This enabling and disabling of autoconnect looks a bit complicated.
> When the previous service is being disconnected, does the disconnection
> go like this:
> - src/service.c, 6132, err = service_connect(service);
> - src/service.c, 6072, err = __connman_network_connect(service->network);
> - src/network.c, 1446, __connman_device_disconnect(network->device);
> - src/device.c, 645, __connman_network_disconnect(network);
Currently disconnection goes like this:
- src/service.c, 4093, if (__connman_service_get_index(temp) == index &&
__connman_service_disconnect(temp) == -EINPROGRESS)
- src/service.c, 6198, err = __connman_network_disconnect(service->network);
> So in this case it should be the plugin itself that needs to decide
> whether and when another network needs to be disconnected? That way it
> can keep the network connected until it finds the hidden network it is
> looking for?
> With that the call to __connman_network_disconnect() could then be
> removed, but needs to move into the plugins? Or only look out for
> hidden WiFis?
I agree it is a good approach to allow plugins to disconnect
network when connection is started. This will require to remove
both the disconnect call by src/service.c when connection
is started.
We can add a check in network_connect() function of
plugins/wifi.c like below:
if (wifi->connected)
g_supplicant_interface_disconnect(wifi->interface, disconnect_callback,
wifi);
In case of hidden WiFis also above change would disconnect current WiFi only
when hidden WiFi is scanned and its connection is initiated.
Thanks,
Saurav
------------------------------
Message: 2
Date: Fri, 18 Nov 2016 13:13:35 +0100
From: Daniel Wagner <[email protected]>
To: [email protected]
Subject: Re: [PATCH v1 0/7] Too many DBG() on default
Message-ID: <[email protected]>
Content-Type: text/plain; charset=windows-1252; format=flowed
Applied. If I killed one DBG too much we can add it again.
------------------------------
Subject: Digest Footer
_______________________________________________
connman mailing list
[email protected]
https://lists.01.org/mailman/listinfo/connman
------------------------------
End of connman Digest, Vol 13, Issue 27
***************************************