aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dan@ioncontrol.co>2025-05-16 09:52:04 -0500
committerDan Williams <dan@ioncontrol.co>2025-05-16 09:52:04 -0500
commitec218e7052b7fd85302d1f5c9b01086ef3e562d9 (patch)
tree5f7a8abb71562c448593c9a593cea015b60849db
parenta4421095f8464eaf678824a15a8e382a8b653ce5 (diff)
parent07805265946c154aefe6726f3a049de09ff8dd2f (diff)
Merge request !1346 from 'disconnect-request'
bearer: add new "disconnect-request" logic https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/merge_requests/1346
-rw-r--r--cli/mmcli-bearer.c3
-rw-r--r--cli/mmcli-output.c1
-rw-r--r--cli/mmcli-output.h1
-rw-r--r--docs/reference/libmm-glib/libmm-glib-sections.txt3
-rw-r--r--introspection/org.freedesktop.ModemManager1.Bearer.xml10
-rw-r--r--libmm-glib/mm-bearer.c21
-rw-r--r--libmm-glib/mm-bearer.h2
-rw-r--r--src/mm-base-bearer.c16
-rw-r--r--src/mm-dispatcher-connection.c37
-rw-r--r--src/mm-dispatcher-connection.h8
10 files changed, 83 insertions, 19 deletions
diff --git a/cli/mmcli-bearer.c b/cli/mmcli-bearer.c
index 1789f3f9..04da6110 100644
--- a/cli/mmcli-bearer.c
+++ b/cli/mmcli-bearer.c
@@ -138,6 +138,7 @@ print_bearer_info (MMBearer *bearer)
g_autoptr(MMBearerProperties) properties = NULL;
g_autoptr(MMBearerStats) stats = NULL;
g_autoptr(GError) connection_error = NULL;
+ gboolean disconnect_request = FALSE;
gint profile_id;
gchar *profile_id_str;
@@ -147,6 +148,7 @@ print_bearer_info (MMBearer *bearer)
stats = mm_bearer_get_stats (bearer);
profile_id = mm_bearer_get_profile_id (bearer);
connection_error = mm_bearer_get_connection_error (bearer);
+ disconnect_request = mm_bearer_get_disconnect_request (bearer);
profile_id_str = (profile_id != MM_3GPP_PROFILE_ID_UNKNOWN) ? g_strdup_printf ("%d", profile_id) : NULL;
@@ -156,6 +158,7 @@ print_bearer_info (MMBearer *bearer)
mmcli_output_string (MMC_F_BEARER_STATUS_CONNECTED, mm_bearer_get_connected (bearer) ? "yes" : "no");
mmcli_output_string_take (MMC_F_BEARER_STATUS_CONNECTION_ERROR_NAME, connection_error ? g_dbus_error_encode_gerror (connection_error) : NULL);
mmcli_output_string (MMC_F_BEARER_STATUS_CONNECTION_ERROR_MESSAGE, connection_error ? connection_error->message : NULL);
+ mmcli_output_string (MMC_F_BEARER_STATUS_DISCONNECT_REQUEST, disconnect_request ? "yes" : "no");
mmcli_output_string (MMC_F_BEARER_STATUS_SUSPENDED, mm_bearer_get_suspended (bearer) ? "yes" : "no");
mmcli_output_string (MMC_F_BEARER_STATUS_MULTIPLEXED, mm_bearer_get_multiplexed (bearer) ? "yes" : "no");
mmcli_output_string (MMC_F_BEARER_STATUS_INTERFACE, mm_bearer_get_interface (bearer));
diff --git a/cli/mmcli-output.c b/cli/mmcli-output.c
index 8aaa3581..1efd0119 100644
--- a/cli/mmcli-output.c
+++ b/cli/mmcli-output.c
@@ -242,6 +242,7 @@ static FieldInfo field_infos[] = {
[MMC_F_BEARER_STATUS_CONNECTED] = { "bearer.status.connected", "connected", MMC_S_BEARER_STATUS, },
[MMC_F_BEARER_STATUS_CONNECTION_ERROR_NAME] = { "bearer.status.connection-error.name", "connection error name", MMC_S_BEARER_STATUS, },
[MMC_F_BEARER_STATUS_CONNECTION_ERROR_MESSAGE] = { "bearer.status.connection-error.message", "connection error message", MMC_S_BEARER_STATUS, },
+ [MMC_F_BEARER_STATUS_DISCONNECT_REQUEST] = { "bearer.status.disconnect-request", "disconnect request", MMC_S_BEARER_STATUS, },
[MMC_F_BEARER_STATUS_SUSPENDED] = { "bearer.status.suspended", "suspended", MMC_S_BEARER_STATUS, },
[MMC_F_BEARER_STATUS_MULTIPLEXED] = { "bearer.status.multiplexed", "multiplexed", MMC_S_BEARER_STATUS, },
[MMC_F_BEARER_STATUS_INTERFACE] = { "bearer.status.interface", "interface", MMC_S_BEARER_STATUS, },
diff --git a/cli/mmcli-output.h b/cli/mmcli-output.h
index e7627653..4aecdfa0 100644
--- a/cli/mmcli-output.h
+++ b/cli/mmcli-output.h
@@ -260,6 +260,7 @@ typedef enum {
MMC_F_BEARER_STATUS_CONNECTED,
MMC_F_BEARER_STATUS_CONNECTION_ERROR_NAME,
MMC_F_BEARER_STATUS_CONNECTION_ERROR_MESSAGE,
+ MMC_F_BEARER_STATUS_DISCONNECT_REQUEST,
MMC_F_BEARER_STATUS_SUSPENDED,
MMC_F_BEARER_STATUS_MULTIPLEXED,
MMC_F_BEARER_STATUS_INTERFACE,
diff --git a/docs/reference/libmm-glib/libmm-glib-sections.txt b/docs/reference/libmm-glib/libmm-glib-sections.txt
index a013b37e..2bed1a5e 100644
--- a/docs/reference/libmm-glib/libmm-glib-sections.txt
+++ b/docs/reference/libmm-glib/libmm-glib-sections.txt
@@ -1448,6 +1448,7 @@ mm_bearer_dup_path
mm_bearer_get_interface
mm_bearer_dup_interface
mm_bearer_get_connected
+mm_bearer_get_disconnect_request
mm_bearer_get_suspended
mm_bearer_get_multiplexed
mm_bearer_get_ip_timeout
@@ -2345,6 +2346,7 @@ mm_gdbus_bearer_dup_properties
mm_gdbus_bearer_get_connected
mm_gdbus_bearer_get_connection_error
mm_gdbus_bearer_dup_connection_error
+mm_gdbus_bearer_get_disconnect_request
mm_gdbus_bearer_get_suspended
mm_gdbus_bearer_get_multiplexed
mm_gdbus_bearer_get_bearer_type
@@ -2363,6 +2365,7 @@ mm_gdbus_bearer_call_disconnect_sync
mm_gdbus_bearer_interface_info
mm_gdbus_bearer_set_connected
mm_gdbus_bearer_set_connection_error
+mm_gdbus_bearer_set_disconnect_request
mm_gdbus_bearer_set_interface
mm_gdbus_bearer_set_ip4_config
mm_gdbus_bearer_set_ip6_config
diff --git a/introspection/org.freedesktop.ModemManager1.Bearer.xml b/introspection/org.freedesktop.ModemManager1.Bearer.xml
index 512e4003..1aa77d3e 100644
--- a/introspection/org.freedesktop.ModemManager1.Bearer.xml
+++ b/introspection/org.freedesktop.ModemManager1.Bearer.xml
@@ -116,6 +116,16 @@
<property name="ConnectionError" type="(ss)" access="read" />
<!--
+ DisconnectRequest:
+
+ Indicates that the bearer is no longer useable and the connection
+ manager should terminate it as soon as possible.
+
+ Since: 1.26
+ -->
+ <property name="DisconnectRequest" type="b" access="read" />
+
+ <!--
Suspended:
In some devices, packet data service will be suspended while the device
diff --git a/libmm-glib/mm-bearer.c b/libmm-glib/mm-bearer.c
index ddcfa053..ea643faa 100644
--- a/libmm-glib/mm-bearer.c
+++ b/libmm-glib/mm-bearer.c
@@ -518,6 +518,27 @@ PROPERTY_ERROR_DEFINE_FAILABLE (connection_error,
/*****************************************************************************/
/**
+ * mm_bearer_get_disconnect_request:
+ * @self: A #MMBearer.
+ *
+ * Gets whether a disconnect request is pending for this bearer
+ *
+ * Returns: %TRUE if the #MMBearer is waiting for disconnection,
+ * #FALSE otherwise.
+ *
+ * Since: 1.26
+ */
+gboolean
+mm_bearer_get_disconnect_request (MMBearer *self)
+{
+ g_return_val_if_fail (MM_IS_BEARER (self), FALSE);
+
+ return mm_gdbus_bearer_get_disconnect_request (MM_GDBUS_BEARER (self));
+}
+
+/*****************************************************************************/
+
+/**
* mm_bearer_connect_finish:
* @self: A #MMBearer.
* @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to
diff --git a/libmm-glib/mm-bearer.h b/libmm-glib/mm-bearer.h
index c1a32cd3..0be220de 100644
--- a/libmm-glib/mm-bearer.h
+++ b/libmm-glib/mm-bearer.h
@@ -76,6 +76,8 @@ gchar *mm_bearer_dup_interface (MMBearer *self);
gboolean mm_bearer_get_connected (MMBearer *self);
+gboolean mm_bearer_get_disconnect_request (MMBearer *self);
+
gboolean mm_bearer_get_reload_stats_supported (MMBearer *self);
gboolean mm_bearer_get_suspended (MMBearer *self);
diff --git a/src/mm-base-bearer.c b/src/mm-base-bearer.c
index c2ab84cf..f9b86884 100644
--- a/src/mm-base-bearer.c
+++ b/src/mm-base-bearer.c
@@ -472,7 +472,7 @@ dispatcher_connection_run_ready (MMDispatcherConnection *dispatcher,
static void
bearer_run_dispatcher_scripts (MMBaseBearer *self,
- gboolean connected)
+ MMDispatcherConnectionEvent event)
{
MMDispatcherConnection *dispatcher;
const gchar *interface;
@@ -486,7 +486,7 @@ bearer_run_dispatcher_scripts (MMBaseBearer *self,
g_dbus_object_get_object_path (G_DBUS_OBJECT (self->priv->modem)),
self->priv->path,
interface,
- connected,
+ event,
NULL, /* cancellable */
(GAsyncReadyCallback)dispatcher_connection_run_ready,
g_object_ref (self));
@@ -500,6 +500,7 @@ bearer_reset_interface_status (MMBaseBearer *self)
mm_gdbus_bearer_set_profile_id (MM_GDBUS_BEARER (self), MM_3GPP_PROFILE_ID_UNKNOWN);
mm_gdbus_bearer_set_multiplexed (MM_GDBUS_BEARER (self), FALSE);
mm_gdbus_bearer_set_connected (MM_GDBUS_BEARER (self), FALSE);
+ mm_gdbus_bearer_set_disconnect_request (MM_GDBUS_BEARER (self), FALSE);
mm_gdbus_bearer_set_suspended (MM_GDBUS_BEARER (self), FALSE);
mm_gdbus_bearer_set_interface (MM_GDBUS_BEARER (self), NULL);
mm_gdbus_bearer_set_ip4_config (
@@ -531,7 +532,7 @@ bearer_update_status (MMBaseBearer *self,
g_autoptr(GString) report = NULL;
/* Report disconnection via dispatcher scripts, before resetting the interface */
- bearer_run_dispatcher_scripts (self, FALSE);
+ bearer_run_dispatcher_scripts (self, MM_DISPATCHER_CONNECTION_EVENT_DISCONNECTED);
bearer_reset_interface_status (self);
/* Cleanup flag to ignore disconnection reports */
@@ -599,7 +600,7 @@ bearer_update_status_connected (MMBaseBearer *self,
connection_monitor_start (self);
/* Run dispatcher scripts */
- bearer_run_dispatcher_scripts (self, TRUE);
+ bearer_run_dispatcher_scripts (self, MM_DISPATCHER_CONNECTION_EVENT_CONNECTED);
}
/*****************************************************************************/
@@ -1491,11 +1492,14 @@ mm_base_bearer_disconnect_force (MMBaseBearer *self)
return;
if (self->priv->ignore_disconnection_reports) {
- mm_obj_dbg (self, "disconnection should be forced but it's explicitly ignored");
+ mm_obj_msg (self, "disconnection should be forced, but we can't. Request disconnection instead.");
+ mm_gdbus_bearer_set_disconnect_request (MM_GDBUS_BEARER(self), TRUE);
+ bearer_run_dispatcher_scripts (self,
+ MM_DISPATCHER_CONNECTION_EVENT_DISCONNECT_REQUEST);
return;
}
- mm_obj_dbg (self, "forcing disconnection");
+ mm_obj_msg (self, "forcing disconnection");
/* If currently connecting, try to cancel that operation. */
if (self->priv->status == MM_BEARER_STATUS_CONNECTING) {
diff --git a/src/mm-dispatcher-connection.c b/src/mm-dispatcher-connection.c
index 7f370a59..4cfc055c 100644
--- a/src/mm-dispatcher-connection.c
+++ b/src/mm-dispatcher-connection.c
@@ -31,8 +31,6 @@
#endif
#define OPERATION_DESCRIPTION "connection status report"
-#define CONNECTED_STRING "connected"
-#define DISCONNECTED_STRING "disconnected"
/* Maximum time a connection dispatcher command is allowed to run before
* us killing it */
@@ -51,15 +49,30 @@ G_DEFINE_TYPE (MMDispatcherConnection, mm_dispatcher_connection, MM_TYPE_DISPATC
/*****************************************************************************/
typedef struct {
- gchar *modem_dbus_path;
- gchar *bearer_dbus_path;
- gchar *data_port;
- gboolean connected;
- GList *dispatcher_scripts;
- GFile *current;
- guint n_failures;
+ gchar *modem_dbus_path;
+ gchar *bearer_dbus_path;
+ gchar *data_port;
+ MMDispatcherConnectionEvent event;
+ GList *dispatcher_scripts;
+ GFile *current;
+ guint n_failures;
} ConnectionRunContext;
+static gchar *
+mm_dispatcher_connection_event_to_string (MMDispatcherConnectionEvent event)
+{
+ switch (event) {
+ case MM_DISPATCHER_CONNECTION_EVENT_CONNECTED:
+ return g_strdup ("connected");
+ case MM_DISPATCHER_CONNECTION_EVENT_DISCONNECTED:
+ return g_strdup ("disconnected");
+ case MM_DISPATCHER_CONNECTION_EVENT_DISCONNECT_REQUEST:
+ return g_strdup ("disconnect-request");
+ default:
+ return NULL;
+ }
+}
+
static void
connection_run_context_free (ConnectionRunContext *ctx)
{
@@ -137,7 +150,7 @@ connection_run_next (GTask *task)
g_ptr_array_add (aux, g_strdup (ctx->modem_dbus_path));
g_ptr_array_add (aux, g_strdup (ctx->bearer_dbus_path));
g_ptr_array_add (aux, g_strdup (ctx->data_port));
- g_ptr_array_add (aux, g_strdup (ctx->connected ? CONNECTED_STRING : DISCONNECTED_STRING));
+ g_ptr_array_add (aux, mm_dispatcher_connection_event_to_string (ctx->event));
g_ptr_array_add (aux, NULL);
argv = (GStrv) g_ptr_array_free (aux, FALSE);
@@ -168,7 +181,7 @@ mm_dispatcher_connection_run (MMDispatcherConnection *self,
const gchar *modem_dbus_path,
const gchar *bearer_dbus_path,
const gchar *data_port,
- gboolean connected,
+ MMDispatcherConnectionEvent event,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data)
@@ -187,7 +200,7 @@ mm_dispatcher_connection_run (MMDispatcherConnection *self,
ctx->modem_dbus_path = g_strdup (modem_dbus_path);
ctx->bearer_dbus_path = g_strdup (bearer_dbus_path);
ctx->data_port = g_strdup (data_port);
- ctx->connected = connected;
+ ctx->event = event;
g_task_set_task_data (task, ctx, (GDestroyNotify)connection_run_context_free);
/* Iterate over all enabled dirs and collect all dispatcher script paths */
diff --git a/src/mm-dispatcher-connection.h b/src/mm-dispatcher-connection.h
index dfa21701..1f8911c1 100644
--- a/src/mm-dispatcher-connection.h
+++ b/src/mm-dispatcher-connection.h
@@ -32,13 +32,19 @@ typedef struct _MMDispatcherConnection MMDispatcherConnection;
typedef struct _MMDispatcherConnectionClass MMDispatcherConnectionClass;
typedef struct _MMDispatcherConnectionPrivate MMDispatcherConnectionPrivate;
+typedef enum { /*< underscore_name=mm_dispatcher_connection_event >*/
+ MM_DISPATCHER_CONNECTION_EVENT_CONNECTED,
+ MM_DISPATCHER_CONNECTION_EVENT_DISCONNECTED,
+ MM_DISPATCHER_CONNECTION_EVENT_DISCONNECT_REQUEST,
+} MMDispatcherConnectionEvent;
+
GType mm_dispatcher_connection_get_type (void);
MMDispatcherConnection *mm_dispatcher_connection_get (void);
void mm_dispatcher_connection_run (MMDispatcherConnection *self,
const gchar *modem_dbus_path,
const gchar *bearer_dbus_path,
const gchar *data_port,
- gboolean connected,
+ MMDispatcherConnectionEvent event,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data);