diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2021-03-04 15:59:24 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2021-03-04 18:03:28 +0100 |
commit | 5d176a1e61df603b74434dce9050f7a9d3139f13 (patch) | |
tree | 96b04256d2b9bfd99d41dfc514a59a39dd408edd /src | |
parent | b509229d5747434be06e17af26c33fd8072a55f9 (diff) |
base-modem: explicitly say if NET or TTY data ports are supported
A modem that creates exclusively bearer objects that work with NET
ports (e.g. all QMI or MBIM modems) must not add any TTY port in the
list of data ports.
A modem that creates exclusively bearer objects that work with TTY
ports (e.g. the generic modem) must not add any NET port in the
list of data ports.
A modem that may use both TTY and NET ports should add all in the list
of data ports.
Fixes https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/324
Fixes https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/329
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-base-modem.c | 71 | ||||
-rw-r--r-- | src/mm-base-modem.h | 20 | ||||
-rw-r--r-- | src/mm-broadband-modem-mbim.c | 3 | ||||
-rw-r--r-- | src/mm-broadband-modem-qmi.c | 3 | ||||
-rw-r--r-- | src/mm-broadband-modem.c | 3 |
5 files changed, 82 insertions, 18 deletions
diff --git a/src/mm-base-modem.c b/src/mm-base-modem.c index 72b9b849..ab41667b 100644 --- a/src/mm-base-modem.c +++ b/src/mm-base-modem.c @@ -56,6 +56,8 @@ enum { PROP_PRODUCT_ID, PROP_CONNECTION, PROP_REPROBE, + PROP_DATA_NET_SUPPORTED, + PROP_DATA_TTY_SUPPORTED, PROP_LAST }; @@ -92,7 +94,10 @@ struct _MMBaseModemPrivate { MMPortSerialAt *primary; MMPortSerialAt *secondary; MMPortSerialQcdm *qcdm; - GList *data; + + GList *data; + gboolean data_net_supported; + gboolean data_tty_supported; /* GPS-enabled modems will have an AT port for control, and a raw serial * port to receive all GPS traces */ @@ -1167,16 +1172,36 @@ mm_base_modem_organize_ports (MMBaseModem *self, self->priv->gps_control = (gps_control ? g_object_ref (gps_control) : NULL); self->priv->gps = (gps ? g_object_ref (gps) : NULL); - /* Build the final list of data ports, NET ports preferred */ + /* Append net ports to the final list of data ports, but only if the modem + * supports them */ if (data_net) { - g_list_foreach (data_net, (GFunc)g_object_ref, NULL); - self->priv->data = g_list_concat (self->priv->data, data_net); + if (self->priv->data_net_supported) { + g_list_foreach (data_net, (GFunc)g_object_ref, NULL); + self->priv->data = g_list_concat (self->priv->data, data_net); + } else + mm_obj_dbg (self, "net ports available but ignored"); } - if (data_at_primary) - self->priv->data = g_list_append (self->priv->data, g_object_ref (data_at_primary)); - if (data_at) { - g_list_foreach (data_at, (GFunc)g_object_ref, NULL); - self->priv->data = g_list_concat (self->priv->data, data_at); + + /* Append tty ports to the final list of data ports, but only if the modem + * supports them */ + if (data_at_primary || data_at) { + if (self->priv->data_tty_supported) { + if (data_at_primary) + self->priv->data = g_list_append (self->priv->data, g_object_ref (data_at_primary)); + if (data_at) { + g_list_foreach (data_at, (GFunc)g_object_ref, NULL); + self->priv->data = g_list_concat (self->priv->data, data_at); + } + } else + mm_obj_dbg (self, "at data ports available but ignored"); + } + + /* Fail if we haven't added any single data port; this is probably a plugin + * misconfiguration */ + if (!self->priv->data) { + g_set_error_literal (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, + "Failed to find a data port in the modem"); + return FALSE; } #if defined WITH_QMI @@ -1483,6 +1508,12 @@ set_property (GObject *object, g_clear_object (&self->priv->connection); self->priv->connection = g_value_dup_object (value); break; + case PROP_DATA_NET_SUPPORTED: + self->priv->data_net_supported = g_value_get_boolean (value); + break; + case PROP_DATA_TTY_SUPPORTED: + self->priv->data_tty_supported = g_value_get_boolean (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1525,6 +1556,12 @@ get_property (GObject *object, case PROP_CONNECTION: g_value_set_object (value, self->priv->connection); break; + case PROP_DATA_NET_SUPPORTED: + g_value_set_boolean (value, self->priv->data_net_supported); + break; + case PROP_DATA_TTY_SUPPORTED: + g_value_set_boolean (value, self->priv->data_tty_supported); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1683,4 +1720,20 @@ mm_base_modem_class_init (MMBaseModemClass *klass) FALSE, G_PARAM_READWRITE); g_object_class_install_property (object_class, PROP_REPROBE, properties[PROP_REPROBE]); + + properties[PROP_DATA_NET_SUPPORTED] = + g_param_spec_boolean (MM_BASE_MODEM_DATA_NET_SUPPORTED, + "Data NET supported", + "Whether the modem supports connection via a NET port.", + FALSE, + G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_DATA_NET_SUPPORTED, properties[PROP_DATA_NET_SUPPORTED]); + + properties[PROP_DATA_TTY_SUPPORTED] = + g_param_spec_boolean (MM_BASE_MODEM_DATA_TTY_SUPPORTED, + "Data TTY supported", + "Whether the modem supports connection via a TTY port.", + FALSE, + G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_DATA_TTY_SUPPORTED, properties[PROP_DATA_TTY_SUPPORTED]); } diff --git a/src/mm-base-modem.h b/src/mm-base-modem.h index 11c3993c..7b70ad34 100644 --- a/src/mm-base-modem.h +++ b/src/mm-base-modem.h @@ -54,15 +54,17 @@ typedef struct _MMBaseModem MMBaseModem; typedef struct _MMBaseModemClass MMBaseModemClass; typedef struct _MMBaseModemPrivate MMBaseModemPrivate; -#define MM_BASE_MODEM_CONNECTION "base-modem-connection" -#define MM_BASE_MODEM_MAX_TIMEOUTS "base-modem-max-timeouts" -#define MM_BASE_MODEM_VALID "base-modem-valid" -#define MM_BASE_MODEM_DEVICE "base-modem-device" -#define MM_BASE_MODEM_DRIVERS "base-modem-drivers" -#define MM_BASE_MODEM_PLUGIN "base-modem-plugin" -#define MM_BASE_MODEM_VENDOR_ID "base-modem-vendor-id" -#define MM_BASE_MODEM_PRODUCT_ID "base-modem-product-id" -#define MM_BASE_MODEM_REPROBE "base-modem-reprobe" +#define MM_BASE_MODEM_CONNECTION "base-modem-connection" +#define MM_BASE_MODEM_MAX_TIMEOUTS "base-modem-max-timeouts" +#define MM_BASE_MODEM_VALID "base-modem-valid" +#define MM_BASE_MODEM_DEVICE "base-modem-device" +#define MM_BASE_MODEM_DRIVERS "base-modem-drivers" +#define MM_BASE_MODEM_PLUGIN "base-modem-plugin" +#define MM_BASE_MODEM_VENDOR_ID "base-modem-vendor-id" +#define MM_BASE_MODEM_PRODUCT_ID "base-modem-product-id" +#define MM_BASE_MODEM_REPROBE "base-modem-reprobe" +#define MM_BASE_MODEM_DATA_NET_SUPPORTED "base-modem-data-net-supported" +#define MM_BASE_MODEM_DATA_TTY_SUPPORTED "base-modem-data-tty-supported" struct _MMBaseModem { MmGdbusObjectSkeleton parent; diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c index 4ee5b226..c810f331 100644 --- a/src/mm-broadband-modem-mbim.c +++ b/src/mm-broadband-modem-mbim.c @@ -5572,6 +5572,9 @@ mm_broadband_modem_mbim_new (const gchar *device, MM_BASE_MODEM_PLUGIN, plugin, MM_BASE_MODEM_VENDOR_ID, vendor_id, MM_BASE_MODEM_PRODUCT_ID, product_id, + /* MBIM bearer supports NET only */ + MM_BASE_MODEM_DATA_NET_SUPPORTED, TRUE, + MM_BASE_MODEM_DATA_TTY_SUPPORTED, FALSE, MM_IFACE_MODEM_SIM_HOT_SWAP_SUPPORTED, TRUE, MM_IFACE_MODEM_SIM_HOT_SWAP_CONFIGURED, FALSE, MM_IFACE_MODEM_PERIODIC_SIGNAL_CHECK_DISABLED, TRUE, diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c index d193f07d..71607f50 100644 --- a/src/mm-broadband-modem-qmi.c +++ b/src/mm-broadband-modem-qmi.c @@ -10084,6 +10084,9 @@ mm_broadband_modem_qmi_new (const gchar *device, MM_BASE_MODEM_PLUGIN, plugin, MM_BASE_MODEM_VENDOR_ID, vendor_id, MM_BASE_MODEM_PRODUCT_ID, product_id, + /* QMI bearer supports NET only */ + MM_BASE_MODEM_DATA_NET_SUPPORTED, TRUE, + MM_BASE_MODEM_DATA_TTY_SUPPORTED, FALSE, NULL); } diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index a25883ac..66320c63 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -11962,6 +11962,9 @@ mm_broadband_modem_new (const gchar *device, MM_BASE_MODEM_PLUGIN, plugin, MM_BASE_MODEM_VENDOR_ID, vendor_id, MM_BASE_MODEM_PRODUCT_ID, product_id, + /* Generic bearer supports TTY only */ + MM_BASE_MODEM_DATA_NET_SUPPORTED, FALSE, + MM_BASE_MODEM_DATA_TTY_SUPPORTED, TRUE, NULL); } |