diff options
-rw-r--r-- | docs/reference/libmm-glib/libmm-glib-sections.txt | 3 | ||||
-rw-r--r-- | introspection/org.freedesktop.ModemManager1.Modem.xml | 20 | ||||
-rw-r--r-- | libmm-glib/mm-modem.c | 32 | ||||
-rw-r--r-- | libmm-glib/mm-modem.h | 3 | ||||
-rw-r--r-- | src/mm-bearer-list.c | 27 | ||||
-rw-r--r-- | src/mm-bearer-list.h | 13 | ||||
-rw-r--r-- | src/mm-broadband-modem.c | 18 | ||||
-rw-r--r-- | src/mm-iface-modem.c | 33 | ||||
-rw-r--r-- | src/mm-iface-modem.h | 5 |
9 files changed, 119 insertions, 35 deletions
diff --git a/docs/reference/libmm-glib/libmm-glib-sections.txt b/docs/reference/libmm-glib/libmm-glib-sections.txt index 92d25bc8..c9d9b0fd 100644 --- a/docs/reference/libmm-glib/libmm-glib-sections.txt +++ b/docs/reference/libmm-glib/libmm-glib-sections.txt @@ -162,6 +162,7 @@ mm_modem_peek_unlock_retries mm_modem_get_unlock_retries mm_modem_get_max_bearers mm_modem_get_max_active_bearers +mm_modem_get_max_active_multiplexed_bearers mm_modem_get_bearer_paths mm_modem_dup_bearer_paths mm_modem_get_own_numbers @@ -2105,6 +2106,7 @@ mm_gdbus_modem_dup_equipment_identifier mm_gdbus_modem_get_manufacturer mm_gdbus_modem_dup_manufacturer mm_gdbus_modem_get_max_active_bearers +mm_gdbus_modem_get_max_active_multiplexed_bearers mm_gdbus_modem_get_max_bearers mm_gdbus_modem_get_model mm_gdbus_modem_dup_model @@ -2193,6 +2195,7 @@ mm_gdbus_modem_set_drivers mm_gdbus_modem_set_equipment_identifier mm_gdbus_modem_set_manufacturer mm_gdbus_modem_set_max_active_bearers +mm_gdbus_modem_set_max_active_multiplexed_bearers mm_gdbus_modem_set_max_bearers mm_gdbus_modem_set_model mm_gdbus_modem_set_own_numbers diff --git a/introspection/org.freedesktop.ModemManager1.Modem.xml b/introspection/org.freedesktop.ModemManager1.Modem.xml index d75f86fc..6accaf29 100644 --- a/introspection/org.freedesktop.ModemManager1.Modem.xml +++ b/introspection/org.freedesktop.ModemManager1.Modem.xml @@ -351,15 +351,29 @@ The maximum number of active <link linkend="MM-BEARER-TYPE-DEFAULT:CAPS"><constant>MM_BEARER_TYPE_DEFAULT</constant></link> - bearers that may be explicitly enabled by the user. + bearers that may be explicitly enabled by the user without multiplexing support. POTS and CDMA2000-only devices support one active bearer, while GSM/UMTS - and LTE-capable devices (including LTE/CDMA devices) typically support - at least two active bearers. + and LTE/5GNR capable devices (including 3GPP+3GPP3 multimode devices) may support + one or more active bearers, depending on the amount of physical ports exposed + by the device. --> <property name="MaxActiveBearers" type="u" access="read" /> <!-- + MaxActiveMultiplexedBearers: + + The maximum number of active + <link linkend="MM-BEARER-TYPE-DEFAULT:CAPS"><constant>MM_BEARER_TYPE_DEFAULT</constant></link> + bearers that may be explicitly enabled by the user with multiplexing support + on one single network interface. + + If the modem doesn't support multiplexing of data sessiones, a value of 0 will + be reported. + --> + <property name="MaxActiveMultiplexedBearers" type="u" access="read" /> + + <!-- Manufacturer: The equipment manufacturer, as reported by the modem. diff --git a/libmm-glib/mm-modem.c b/libmm-glib/mm-modem.c index e3b29bb5..02e322dd 100644 --- a/libmm-glib/mm-modem.c +++ b/libmm-glib/mm-modem.c @@ -436,13 +436,15 @@ mm_modem_get_max_bearers (MMModem *self) * mm_modem_get_max_active_bearers: * @self: a #MMModem. * - * Gets the maximum number of active packet data bearers this #MMModem supports. + * Gets the maximum number of active packet data bearers this #MMModem supports + * without enabling multiplexing support. * * POTS and CDMA2000-only devices support one active bearer, while GSM/UMTS - * and LTE-capable devices (including LTE/CDMA devices) typically support - * at least two active bearers. + * and LTE/5GNR capable devices (including 3GPP+3GPP3 multimode devices) may support + * one or more active bearers, depending on the amount of physical ports exposed + * by the device. * - * Returns: the maximum number of defined packet data bearers. + * Returns: the maximum number of active packet data bearers. * * Since: 1.0 */ @@ -457,6 +459,28 @@ mm_modem_get_max_active_bearers (MMModem *self) /*****************************************************************************/ /** + * mm_modem_get_max_active_multiplexed_bearers: + * @self: a #MMModem. + * + * Gets the maximum number of active packet data bearers this #MMModem supports + * after enabling multiplexing support on one single network interface. + * + * Returns: the maximum number of active packet data bearers, or 0 if + * multiplexing is not supported. + * + * Since: 1.18 + */ +guint +mm_modem_get_max_active_multiplexed_bearers (MMModem *self) +{ + g_return_val_if_fail (MM_IS_MODEM (self), 0); + + return mm_gdbus_modem_get_max_active_multiplexed_bearers (MM_GDBUS_MODEM (self)); +} + +/*****************************************************************************/ + +/** * mm_modem_get_bearer_paths: * @self: A #MMModem. * diff --git a/libmm-glib/mm-modem.h b/libmm-glib/mm-modem.h index 589ddafa..ee1f7879 100644 --- a/libmm-glib/mm-modem.h +++ b/libmm-glib/mm-modem.h @@ -94,7 +94,8 @@ G_DEPRECATED guint mm_modem_get_max_bearers (MMModem *self); #endif /* MM_DISABLE_DEPRECATED */ -guint mm_modem_get_max_active_bearers (MMModem *self); +guint mm_modem_get_max_active_bearers (MMModem *self); +guint mm_modem_get_max_active_multiplexed_bearers (MMModem *self); const gchar * const *mm_modem_get_bearer_paths (MMModem *self); gchar **mm_modem_dup_bearer_paths (MMModem *self); diff --git a/src/mm-bearer-list.c b/src/mm-bearer-list.c index 8bf6ae05..b0694588 100644 --- a/src/mm-bearer-list.c +++ b/src/mm-bearer-list.c @@ -35,6 +35,7 @@ enum { PROP_0, PROP_NUM_BEARERS, PROP_MAX_ACTIVE_BEARERS, + PROP_MAX_ACTIVE_MULTIPLEXED_BEARERS, PROP_LAST }; @@ -45,6 +46,7 @@ struct _MMBearerListPrivate { GList *bearers; /* Max number of active bearers */ guint max_active_bearers; + guint max_active_multiplexed_bearers; }; /*****************************************************************************/ @@ -55,6 +57,12 @@ mm_bearer_list_get_max_active (MMBearerList *self) return self->priv->max_active_bearers; } +guint +mm_bearer_list_get_max_active_multiplexed (MMBearerList *self) +{ + return self->priv->max_active_multiplexed_bearers; +} + gboolean mm_bearer_list_add_bearer (MMBearerList *self, MMBaseBearer *bearer, @@ -238,11 +246,13 @@ mm_bearer_list_disconnect_all_bearers (MMBearerList *self, /*****************************************************************************/ MMBearerList * -mm_bearer_list_new (guint max_active_bearers) +mm_bearer_list_new (guint max_active_bearers, + guint max_active_multiplexed_bearers) { /* Create the object */ return g_object_new (MM_TYPE_BEARER_LIST, MM_BEARER_LIST_MAX_ACTIVE_BEARERS, max_active_bearers, + MM_BEARER_LIST_MAX_ACTIVE_MULTIPLEXED_BEARERS, max_active_multiplexed_bearers, NULL); } @@ -261,6 +271,9 @@ set_property (GObject *object, case PROP_MAX_ACTIVE_BEARERS: self->priv->max_active_bearers = g_value_get_uint (value); break; + case PROP_MAX_ACTIVE_MULTIPLEXED_BEARERS: + self->priv->max_active_multiplexed_bearers = g_value_get_uint (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -282,6 +295,9 @@ get_property (GObject *object, case PROP_MAX_ACTIVE_BEARERS: g_value_set_uint (value, self->priv->max_active_bearers); break; + case PROP_MAX_ACTIVE_MULTIPLEXED_BEARERS: + g_value_set_uint (value, self->priv->max_active_multiplexed_bearers); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -342,4 +358,13 @@ mm_bearer_list_class_init (MMBearerListClass *klass) G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); g_object_class_install_property (object_class, PROP_MAX_ACTIVE_BEARERS, properties[PROP_MAX_ACTIVE_BEARERS]); + properties[PROP_MAX_ACTIVE_MULTIPLEXED_BEARERS] = + g_param_spec_uint (MM_BEARER_LIST_MAX_ACTIVE_MULTIPLEXED_BEARERS, + "Max active multiplexed bearers", + "Maximum number of active multiplexed bearers the list can handle", + 1, + G_MAXUINT, + 1, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); + g_object_class_install_property (object_class, PROP_MAX_ACTIVE_MULTIPLEXED_BEARERS, properties[PROP_MAX_ACTIVE_MULTIPLEXED_BEARERS]); } diff --git a/src/mm-bearer-list.h b/src/mm-bearer-list.h index 1d8db726..72fe24ff 100644 --- a/src/mm-bearer-list.h +++ b/src/mm-bearer-list.h @@ -30,8 +30,9 @@ #define MM_IS_BEARER_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MM_TYPE_BEARER_LIST)) #define MM_BEARER_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MM_TYPE_BEARER_LIST, MMBearerListClass)) -#define MM_BEARER_LIST_NUM_BEARERS "num-bearers" -#define MM_BEARER_LIST_MAX_ACTIVE_BEARERS "max-active-bearers" +#define MM_BEARER_LIST_NUM_BEARERS "num-bearers" +#define MM_BEARER_LIST_MAX_ACTIVE_BEARERS "max-active-bearers" +#define MM_BEARER_LIST_MAX_ACTIVE_MULTIPLEXED_BEARERS "max-active-multiplexed-bearers" typedef struct _MMBearerList MMBearerList; typedef struct _MMBearerListClass MMBearerListClass; @@ -49,10 +50,12 @@ struct _MMBearerListClass { GType mm_bearer_list_get_type (void); G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMBearerList, g_object_unref) -MMBearerList *mm_bearer_list_new (guint max_active_bearers); +MMBearerList *mm_bearer_list_new (guint max_active_bearers, + guint max_active_multiplexed_bearers); -GStrv mm_bearer_list_get_paths (MMBearerList *self); -guint mm_bearer_list_get_max_active (MMBearerList *self); +GStrv mm_bearer_list_get_paths (MMBearerList *self); +guint mm_bearer_list_get_max_active (MMBearerList *self); +guint mm_bearer_list_get_max_active_multiplexed (MMBearerList *self); gboolean mm_bearer_list_add_bearer (MMBearerList *self, MMBaseBearer *bearer, diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index 66320c63..bcd56faa 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -418,6 +418,23 @@ modem_create_bearer (MMIfaceModem *self, } /*****************************************************************************/ +/* Create Bearer List (Modem interface) */ + +static MMBearerList * +modem_create_bearer_list (MMIfaceModem *self) +{ + guint n; + + /* The maximum number of available/connected modems is guessed from + * the size of the data ports list. */ + n = g_list_length (mm_base_modem_peek_data_ports (MM_BASE_MODEM (self))); + mm_obj_dbg (self, "allowed up to %u active bearers", n); + + /* by default, no multiplexing support */ + return mm_bearer_list_new (n, 0); +} + +/*****************************************************************************/ /* Create SIM (Modem interface) */ static MMBaseSim * @@ -12425,6 +12442,7 @@ iface_modem_init (MMIfaceModem *iface) iface->load_power_state_finish = modem_load_power_state_finish; iface->load_supported_ip_families = modem_load_supported_ip_families; iface->load_supported_ip_families_finish = modem_load_supported_ip_families_finish; + iface->create_bearer_list = modem_create_bearer_list; /* Enabling steps */ iface->modem_power_up = modem_power_up; diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c index 5ac3da9c..20580d8f 100644 --- a/src/mm-iface-modem.c +++ b/src/mm-iface-modem.c @@ -5083,47 +5083,38 @@ interface_initialization_step (GTask *task) /* fall-through */ case INITIALIZATION_STEP_BEARERS: { - MMBearerList *list = NULL; + g_autoptr(MMBearerList) list = NULL; /* Bearers setup is meant to be loaded only once during the whole - * lifetime of the modem. The list may have been created by the object - * implementing the interface; if so use it. */ + * lifetime of the modem, so check if it exists; and if it doesn't, + * create it right away. */ g_object_get (self, MM_IFACE_MODEM_BEARER_LIST, &list, NULL); if (!list) { - guint n; - - /* The maximum number of available/connected modems is guessed from - * the size of the data ports list. */ - n = g_list_length (mm_base_modem_peek_data_ports (MM_BASE_MODEM (self))); - mm_obj_dbg (self, "allowed up to %u active bearers", n); - - /* Create new default list */ - list = mm_bearer_list_new (n); + list = MM_IFACE_MODEM_GET_INTERFACE (self)->create_bearer_list (self); g_signal_connect (list, "notify::" MM_BEARER_LIST_NUM_BEARERS, G_CALLBACK (bearer_list_updated), self); - g_object_set (self, - MM_IFACE_MODEM_BEARER_LIST, list, - NULL); - } - if (mm_gdbus_modem_get_max_active_bearers (ctx->skeleton) == 0) mm_gdbus_modem_set_max_active_bearers ( ctx->skeleton, mm_bearer_list_get_max_active (list)); + mm_gdbus_modem_set_max_active_multiplexed_bearers ( + ctx->skeleton, + mm_bearer_list_get_max_active_multiplexed (list)); - /* MaxBearers set equal to MaxActiveBearers */ - if (mm_gdbus_modem_get_max_bearers (ctx->skeleton) == 0) + /* MaxBearers set equal to MaxActiveBearers */ mm_gdbus_modem_set_max_bearers ( ctx->skeleton, mm_gdbus_modem_get_max_active_bearers (ctx->skeleton)); - g_object_unref (list); - + g_object_set (self, + MM_IFACE_MODEM_BEARER_LIST, list, + NULL); + } ctx->step++; } /* fall-through */ diff --git a/src/mm-iface-modem.h b/src/mm-iface-modem.h index 66d43ac0..c649a49f 100644 --- a/src/mm-iface-modem.h +++ b/src/mm-iface-modem.h @@ -26,6 +26,7 @@ #include "mm-port-serial-at.h" #include "mm-base-bearer.h" #include "mm-base-sim.h" +#include "mm-bearer-list.h" #define MM_TYPE_IFACE_MODEM (mm_iface_modem_get_type ()) #define MM_IFACE_MODEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MM_TYPE_IFACE_MODEM, MMIfaceModem)) @@ -372,6 +373,10 @@ struct _MMIfaceModem { MMBaseBearer * (*create_bearer_finish) (MMIfaceModem *self, GAsyncResult *res, GError **error); + + /* Create new bearer list object */ + MMBearerList * (* create_bearer_list) (MMIfaceModem *self); + /* Setup SIM hot swap */ void (*setup_sim_hot_swap) (MMIfaceModem *self, GAsyncReadyCallback callback, |