aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2021-05-23 23:39:18 +0200
committerAleksander Morgado <aleksander@aleksander.es>2021-05-26 13:14:52 +0000
commita97bc9912fd20046da3987eec9a041985a8fc4f8 (patch)
tree0a77a363eb98c28f114348214e002d9ab3916316 /src
parent6fae479bd76db6c8cc69b3db2da3ef9707a3484c (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')
-rw-r--r--src/mm-bearer-qmi.c91
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
}