diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2021-05-23 23:39:18 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2021-05-26 13:14:52 +0000 |
commit | a97bc9912fd20046da3987eec9a041985a8fc4f8 (patch) | |
tree | 0a77a363eb98c28f114348214e002d9ab3916316 /src/mm-bearer-qmi.c | |
parent | 6fae479bd76db6c8cc69b3db2da3ef9707a3484c (diff) |
bearer-qmi: implement reload_connection_status() for the sync operation
The original load_connection_status() method would return an
UNSUPPORTED error if connection monitoring wasn't required (which is
the default in most QMI modems).
The new reload_connection_status() method requires the check to always
be done unconditionally.
We take most of the original logic in the load_connection_status() for
the new reload_connection_status(), and we add the UNSUPPORTED error
logic exclusively in the new load_connection_status().
Diffstat (limited to 'src/mm-bearer-qmi.c')
-rw-r--r-- | src/mm-bearer-qmi.c | 91 |
1 files changed, 71 insertions, 20 deletions
diff --git a/src/mm-bearer-qmi.c b/src/mm-bearer-qmi.c index b006869a..86959765 100644 --- a/src/mm-bearer-qmi.c +++ b/src/mm-bearer-qmi.c @@ -229,7 +229,7 @@ reload_stats (MMBaseBearer *self, } /*****************************************************************************/ -/* Connection status polling */ +/* Connection status check */ typedef enum { CONNECTION_STATUS_CONTEXT_STEP_FIRST, @@ -243,9 +243,9 @@ typedef struct { } ConnectionStatusContext; static MMBearerConnectionStatus -load_connection_status_finish (MMBaseBearer *self, - GAsyncResult *res, - GError **error) +reload_connection_status_finish (MMBaseBearer *self, + GAsyncResult *res, + GError **error) { gint val; @@ -315,21 +315,6 @@ connection_status_context_step (GTask *task) switch (ctx->step) { case CONNECTION_STATUS_CONTEXT_STEP_FIRST: - /* Connection status polling is an optional feature that must be - * enabled explicitly via udev tags. If not set, out as unsupported. - * Note that when connected via a muxed link, the udev tag should be - * checked on the master interface (lower device) */ - if ((self->priv->data && - !mm_kernel_device_get_global_property_as_boolean (mm_port_peek_kernel_device (self->priv->data), - "ID_MM_QMI_CONNECTION_STATUS_POLLING_ENABLE")) || - (self->priv->link && - !mm_kernel_device_get_global_property_as_boolean (mm_kernel_device_peek_lower_device (mm_port_peek_kernel_device (self->priv->link)), - "ID_MM_QMI_CONNECTION_STATUS_POLLING_ENABLE"))) { - g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED, - "Connection status polling not required"); - g_object_unref (task); - return; - } /* If no clients ready on start, assume disconnected */ if (!self->priv->client_ipv4 && !self->priv->client_ipv6) { g_task_return_int (task, MM_BEARER_CONNECTION_STATUS_DISCONNECTED); @@ -377,7 +362,7 @@ connection_status_context_step (GTask *task) } static void -load_connection_status (MMBaseBearer *self, +reload_connection_status (MMBaseBearer *self, GAsyncReadyCallback callback, gpointer user_data) { @@ -394,6 +379,68 @@ load_connection_status (MMBaseBearer *self, } /*****************************************************************************/ +/* Connection status polling */ + +static MMBearerConnectionStatus +load_connection_status_finish (MMBaseBearer *self, + GAsyncResult *res, + GError **error) +{ + gint val; + + val = g_task_propagate_int (G_TASK (res), error); + if (val < 0) + return MM_BEARER_CONNECTION_STATUS_UNKNOWN; + + return (MMBearerConnectionStatus) val; +} + +static void +reload_connection_status_ready (MMBaseBearer *self, + GAsyncResult *res, + GTask *task) +{ + MMBearerConnectionStatus status; + GError *error = NULL; + + status = reload_connection_status_finish (self, res, &error); + if (status == MM_BEARER_CONNECTION_STATUS_UNKNOWN) + g_task_return_error (task, error); + else + g_task_return_int (task, MM_BEARER_CONNECTION_STATUS_CONNECTED); + g_object_unref (task); +} + +static void +load_connection_status (MMBaseBearer *_self, + GAsyncReadyCallback callback, + gpointer user_data) +{ + MMBearerQmi *self = MM_BEARER_QMI (_self); + GTask *task; + + task = g_task_new (self, NULL, callback, user_data); + + /* Connection status polling is an optional feature that must be + * enabled explicitly via udev tags. If not set, out as unsupported. + * Note that when connected via a muxed link, the udev tag should be + * checked on the master interface (lower device) */ + if ((self->priv->data && + !mm_kernel_device_get_global_property_as_boolean (mm_port_peek_kernel_device (self->priv->data), + "ID_MM_QMI_CONNECTION_STATUS_POLLING_ENABLE")) || + (self->priv->link && + !mm_kernel_device_get_global_property_as_boolean (mm_kernel_device_peek_lower_device (mm_port_peek_kernel_device (self->priv->link)), + "ID_MM_QMI_CONNECTION_STATUS_POLLING_ENABLE"))) { + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED, + "Connection status polling not required"); + g_object_unref (task); + return; + } + + reload_connection_status (_self, (GAsyncReadyCallback)reload_connection_status_ready, task); +} + +/*****************************************************************************/ /* Connect */ #define WAIT_LINK_PORT_TIMEOUT_MS 2500 @@ -2623,4 +2670,8 @@ mm_bearer_qmi_class_init (MMBearerQmiClass *klass) base_bearer_class->reload_stats_finish = reload_stats_finish; base_bearer_class->load_connection_status = load_connection_status; base_bearer_class->load_connection_status_finish = load_connection_status_finish; +#if defined WITH_SYSTEMD_SUSPEND_RESUME + base_bearer_class->reload_connection_status = reload_connection_status; + base_bearer_class->reload_connection_status_finish = reload_connection_status_finish; +#endif } |