From f3aaa113e02f5b18550e0ebecd8de08fb2eb9cdb Mon Sep 17 00:00:00 2001 From: Dominique Martinet Date: Thu, 1 May 2025 14:28:04 +0900 Subject: dispatcher-connection: replace 'connected' boolean with a new enum The next commit will introduce a new dispatcher event. This commit should not change anything user-facing Signed-off-by: Dominique Martinet --- src/mm-base-bearer.c | 8 ++++---- src/mm-dispatcher-connection.c | 35 +++++++++++++++++++++++------------ src/mm-dispatcher-connection.h | 7 ++++++- 3 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/mm-base-bearer.c b/src/mm-base-bearer.c index c2ab84cf..2b72ec2f 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)); @@ -531,7 +531,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 +599,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); } /*****************************************************************************/ diff --git a/src/mm-dispatcher-connection.c b/src/mm-dispatcher-connection.c index 7f370a59..dec195d3 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,28 @@ 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"); + default: + return NULL; + } +} + static void connection_run_context_free (ConnectionRunContext *ctx) { @@ -137,7 +148,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 +179,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 +198,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..95a10c24 100644 --- a/src/mm-dispatcher-connection.h +++ b/src/mm-dispatcher-connection.h @@ -32,13 +32,18 @@ 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, +} 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); -- cgit v1.2.3-70-g09d2 From 2d29832f89fe6bffe52b6e4eb27d80f49eb7430a Mon Sep 17 00:00:00 2001 From: Dominique Martinet Date: Thu, 1 May 2025 14:32:17 +0900 Subject: dispatcher-connection: add new 'disconnect-request' event When bearer gets an event that should trigger a disconnection but we cannot disconnect (for example because we're waiting for pppd to close), we now trigger a new 'disconnect-request' event instead This was tested with the following hook: ``` $ cat /etc/ModemManager/connection.d/handle-disconnect-request.sh #!/bin/sh if [ "$4" != disconnect-request ]; then exit 0 fi iface=$(mmcli -b "$2" -K | awk '/bearer.status.interface/ { print $3 }') if pkill -f "pppd\>.*\<$iface\>"; then logger -t mm-disconnect-request "Killed $iface pppd" else logger -t mm-disconnect-request "No pppd found for $iface" fi ``` Signed-off-by: Dominique Martinet --- src/mm-base-bearer.c | 2 ++ src/mm-dispatcher-connection.c | 2 ++ src/mm-dispatcher-connection.h | 1 + 3 files changed, 5 insertions(+) diff --git a/src/mm-base-bearer.c b/src/mm-base-bearer.c index 2b72ec2f..f45a1ebe 100644 --- a/src/mm-base-bearer.c +++ b/src/mm-base-bearer.c @@ -1492,6 +1492,8 @@ mm_base_bearer_disconnect_force (MMBaseBearer *self) if (self->priv->ignore_disconnection_reports) { mm_obj_dbg (self, "disconnection should be forced but it's explicitly ignored"); + bearer_run_dispatcher_scripts (self, + MM_DISPATCHER_CONNECTION_EVENT_DISCONNECT_REQUEST); return; } diff --git a/src/mm-dispatcher-connection.c b/src/mm-dispatcher-connection.c index dec195d3..4cfc055c 100644 --- a/src/mm-dispatcher-connection.c +++ b/src/mm-dispatcher-connection.c @@ -66,6 +66,8 @@ mm_dispatcher_connection_event_to_string (MMDispatcherConnectionEvent event) 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; } diff --git a/src/mm-dispatcher-connection.h b/src/mm-dispatcher-connection.h index 95a10c24..1f8911c1 100644 --- a/src/mm-dispatcher-connection.h +++ b/src/mm-dispatcher-connection.h @@ -35,6 +35,7 @@ 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); -- cgit v1.2.3-70-g09d2 From dea8f27464fee9afb7d5cee20b2f6f58499c369b Mon Sep 17 00:00:00 2001 From: Dominique Martinet Date: Thu, 1 May 2025 14:55:22 +0900 Subject: api,bearer: new 'DisconnectRequest' property To report that the bearer has been killed from the modem side and the connection should be terminated. Signed-off-by: Dominique Martinet --- cli/mmcli-bearer.c | 3 +++ cli/mmcli-output.c | 1 + cli/mmcli-output.h | 1 + docs/reference/libmm-glib/libmm-glib-sections.txt | 3 +++ .../org.freedesktop.ModemManager1.Bearer.xml | 10 ++++++++++ libmm-glib/mm-bearer.c | 21 +++++++++++++++++++++ libmm-glib/mm-bearer.h | 2 ++ 7 files changed, 41 insertions(+) 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 @@ -115,6 +115,16 @@ --> + + +