Re: [PATCH 05/45] service: Explicit VPN connect timeout, ignore in VPN agent wait
Denis Kenzior <[email protected]> Fri, 1 Aug 2025 14:31:05 -0500
| Newsgroups | dev.linux.lists.connman |
|---|---|
| Message-ID | <[email protected]> |
Hi Jussi,
On 7/11/25 9:26 AM, Jussi Laakkonen wrote:
> Ignore the connect timeout autostarting when connecting a VPN service
> because initially the VPN is in association state in which the VPN is
> waiting for the VPN agent. Separate the starting of connect timeout into
> its own function __connman_service_start_connect_timeout() so provider.c
> can call it when it enters configuration state.
>
> When a VPN is waiting for user input it should not be affected by
> connect timeout as the connection is not yet attempted. This may happen
> if VPN resumes to association state when requiring the VPN agent for
> other, e.g., encrypted private key input after credential input.
> ---
> src/connman.h | 2 ++
> src/service.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++-----
> 2 files changed, 49 insertions(+), 5 deletions(-)
>
> diff --git a/src/connman.h b/src/connman.h
> index 7ebda7af..1a8952e4 100644
> --- a/src/connman.h
> +++ b/src/connman.h
> @@ -788,6 +788,8 @@ int __connman_service_connect(struct connman_service *service,
> int __connman_service_disconnect(struct connman_service *service);
> void __connman_service_set_active_session(bool enable, GSList *list);
> void __connman_service_auto_connect(enum connman_service_connect_reason reason);
> +void __connman_service_start_connect_timeout(struct connman_service *service,
> + bool restart);
> bool __connman_service_remove(struct connman_service *service);
> void __connman_service_set_hidden_data(struct connman_service *service,
> gpointer user_data);
> diff --git a/src/service.c b/src/service.c
> index f73f42eb..9fd8fdb1 100644
> --- a/src/service.c
> +++ b/src/service.c
> @@ -7322,8 +7322,27 @@ static gboolean connect_timeout(gpointer user_data)
>
> if (service->network)
> __connman_network_disconnect(service->network);
> - else if (service->provider)
> + else if (service->provider) {
> + /*
> + * Remove timeout when the VPN is waiting for user input in
> + * association state. By default the VPN agent timeout is
> + * 300s whereas default connection timeout is 120s. Provider
> + * will start connect timeout for the service when it enters
> + * configuration state.
> + */
> + const char *statestr = connman_provider_get_string(
> + service->provider, "State");
> + if (!g_strcmp0(statestr, "association")) {
> + DBG("VPN provider %p is waiting for VPN agent, "
> + "stop connect timeout",
> + service->provider);
> + return G_SOURCE_REMOVE;
> + }
> +
I'm a bit confused why this entire block is needed? If the service is a VPN,
then the timeout isn't even started, and thus connect_timeout() shouldn't even
be called?
> connman_provider_disconnect(service->provider);
> + }
> +
> +
>
> __connman_stats_service_unregister(service);
>
> @@ -7351,7 +7370,27 @@ static gboolean connect_timeout(gpointer user_data)
> CONNMAN_SERVICE_CONNECT_REASON_USER)
> do_auto_connect(service, CONNMAN_SERVICE_CONNECT_REASON_AUTO);
>
> - return FALSE;
> + return G_SOURCE_REMOVE;
> +}
> +
> +void __connman_service_start_connect_timeout(struct connman_service *service,
> + bool restart)
> +{
> + DBG("");
> +
> + if (!service)
> + return;
> +
> + if (!restart && service->timeout)
> + return;
> +
> + if (restart && service->timeout) {
> + DBG("cancel running connect timeout");
> + g_source_remove(service->timeout);
> + }
> +
> + service->timeout = g_timeout_add_seconds(CONNECT_TIMEOUT,
> + connect_timeout, service);
> }
Given the above, I question the need for this function?
>
> static DBusMessage *connect_service(DBusConnection *conn,
> @@ -9975,9 +10014,12 @@ int __connman_service_connect(struct connman_service *service,
> return 0;
>
> if (err == -EINPROGRESS) {
> - if (service->timeout == 0)
> - service->timeout = g_timeout_add_seconds(
> - CONNECT_TIMEOUT, connect_timeout, service);
> + /*
> + * VPN will start connect timeout when it enters CONFIGURATION
> + * state.
> + */
> + if (service->type != CONNMAN_SERVICE_TYPE_VPN)
> + __connman_service_start_connect_timeout(service, false);
>
> return -EINPROGRESS;
> }
Regards,
-Denis