diff options
author | Sven Schwermer <sven.schwermer@disruptive-technologies.com> | 2022-01-05 20:41:28 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2022-01-11 09:31:32 +0000 |
commit | 382a7c2425ccb1c1e453c6d7939032c617cb79d1 (patch) | |
tree | 2426c2aacb89f83486a9e3e5d7f12d3d452d8ce3 | |
parent | c174fd29dc03eebc2de06f12ce17a521c7477be5 (diff) |
fibocom: Use ECM bearer if +GTRNDIS is available
Some modems might have a net port but don't support +GTRNDIS which is
used by the ECM bearer. That case will be caught by this additional
check.
-rw-r--r-- | plugins/fibocom/mm-broadband-modem-fibocom.c | 101 | ||||
-rw-r--r-- | plugins/fibocom/mm-broadband-modem-fibocom.h | 2 |
2 files changed, 88 insertions, 15 deletions
diff --git a/plugins/fibocom/mm-broadband-modem-fibocom.c b/plugins/fibocom/mm-broadband-modem-fibocom.c index d134e640..8292c18e 100644 --- a/plugins/fibocom/mm-broadband-modem-fibocom.c +++ b/plugins/fibocom/mm-broadband-modem-fibocom.c @@ -19,6 +19,7 @@ #include "mm-broadband-bearer-fibocom-ecm.h" #include "mm-broadband-modem.h" #include "mm-iface-modem.h" +#include "mm-base-modem-at.h" #include "mm-log.h" static void iface_modem_init (MMIfaceModem *iface); @@ -26,6 +27,16 @@ static void iface_modem_init (MMIfaceModem *iface); G_DEFINE_TYPE_EXTENDED (MMBroadbandModemFibocom, mm_broadband_modem_fibocom, MM_TYPE_BROADBAND_MODEM, 0, G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM, iface_modem_init)) +typedef enum { + FEATURE_SUPPORT_UNKNOWN, + FEATURE_NOT_SUPPORTED, + FEATURE_SUPPORTED, +} FeatureSupport; + +struct _MMBroadbandModemFibocomPrivate { + FeatureSupport gtrndis_support; +}; + /*****************************************************************************/ /* Create Bearer (Modem interface) */ @@ -70,32 +81,85 @@ broadband_bearer_new_ready (GObject *source, } static void -modem_create_bearer (MMIfaceModem *self, - MMBearerProperties *properties, - GAsyncReadyCallback callback, - gpointer user_data) +common_create_bearer (GTask *task) { - GTask *task; + MMBroadbandModemFibocom *self; - task = g_task_new (self, NULL, callback, user_data); + self = g_task_get_source_object (task); - /* If we get a NET port, create Fibocom ECM bearer */ - if (mm_base_modem_peek_best_data_port (MM_BASE_MODEM (self), MM_PORT_TYPE_NET)) { - mm_obj_dbg (self, "Creating Fibocom ECM bearer"); - mm_broadband_bearer_fibocom_ecm_new (MM_BROADBAND_MODEM_FIBOCOM (self), - properties, + switch (self->priv->gtrndis_support) { + case FEATURE_SUPPORTED: + mm_obj_dbg (self, "+GTRNDIS supported, creating Fibocom ECM bearer"); + mm_broadband_bearer_fibocom_ecm_new (self, + g_task_get_task_data (task), NULL, /* cancellable */ (GAsyncReadyCallback) broadband_bearer_fibocom_ecm_new_ready, task); - } else { - /* Otherwise, use generic broadband bearer for PPP */ - mm_obj_dbg (self, "Creating generic PPP bearer"); + return; + case FEATURE_NOT_SUPPORTED: + mm_obj_dbg (self, "+GTRNDIS not supported, creating generic PPP bearer"); mm_broadband_bearer_new (MM_BROADBAND_MODEM (self), - properties, + g_task_get_task_data (task), NULL, /* cancellable */ (GAsyncReadyCallback) broadband_bearer_new_ready, task); + return; + case FEATURE_SUPPORT_UNKNOWN: + default: + g_assert_not_reached (); + } +} + +static void +gtrndis_test_ready (MMBaseModem *_self, + GAsyncResult *res, + GTask *task) +{ + MMBroadbandModemFibocom *self = MM_BROADBAND_MODEM_FIBOCOM (_self); + + if (!mm_base_modem_at_command_finish (_self, res, NULL)) { + mm_obj_dbg (self, "+GTRNDIS unsupported"); + self->priv->gtrndis_support = FEATURE_NOT_SUPPORTED; + } else { + mm_obj_dbg (self, "+GTRNDIS supported"); + self->priv->gtrndis_support = FEATURE_SUPPORTED; + } + + /* Go on and create the bearer */ + common_create_bearer (task); +} + +static void +modem_create_bearer (MMIfaceModem *_self, + MMBearerProperties *properties, + GAsyncReadyCallback callback, + gpointer user_data) +{ + MMBroadbandModemFibocom *self = MM_BROADBAND_MODEM_FIBOCOM (_self); + GTask *task; + + task = g_task_new (self, NULL, callback, user_data); + g_task_set_task_data (task, g_object_ref (properties), g_object_unref); + + if (self->priv->gtrndis_support != FEATURE_SUPPORT_UNKNOWN) { + common_create_bearer (task); + return; } + + if (!mm_base_modem_peek_best_data_port (MM_BASE_MODEM (self), MM_PORT_TYPE_NET)) { + mm_obj_dbg (self, "skipping +GTRNDIS check as no data port is available"); + self->priv->gtrndis_support = FEATURE_NOT_SUPPORTED; + common_create_bearer (task); + return; + } + + mm_obj_dbg (self, "checking +GTRNDIS support..."); + mm_base_modem_at_command (MM_BASE_MODEM (self), + "+GTRNDIS=?", + 6, /* timeout [s] */ + TRUE, /* allow_cached */ + (GAsyncReadyCallback) gtrndis_test_ready, + task); } /*****************************************************************************/ @@ -121,6 +185,11 @@ mm_broadband_modem_fibocom_new (const gchar *device, static void mm_broadband_modem_fibocom_init (MMBroadbandModemFibocom *self) { + self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, + MM_TYPE_BROADBAND_MODEM_FIBOCOM, + MMBroadbandModemFibocomPrivate); + + self->priv->gtrndis_support = FEATURE_SUPPORT_UNKNOWN; } static void @@ -133,4 +202,6 @@ iface_modem_init (MMIfaceModem *iface) static void mm_broadband_modem_fibocom_class_init (MMBroadbandModemFibocomClass *klass) { + g_type_class_add_private (G_OBJECT_CLASS (klass), + sizeof (MMBroadbandModemFibocomPrivate)); } diff --git a/plugins/fibocom/mm-broadband-modem-fibocom.h b/plugins/fibocom/mm-broadband-modem-fibocom.h index 51a43e91..958841b7 100644 --- a/plugins/fibocom/mm-broadband-modem-fibocom.h +++ b/plugins/fibocom/mm-broadband-modem-fibocom.h @@ -27,9 +27,11 @@ typedef struct _MMBroadbandModemFibocom MMBroadbandModemFibocom; typedef struct _MMBroadbandModemFibocomClass MMBroadbandModemFibocomClass; +typedef struct _MMBroadbandModemFibocomPrivate MMBroadbandModemFibocomPrivate; struct _MMBroadbandModemFibocom { MMBroadbandModem parent; + MMBroadbandModemFibocomPrivate *priv; }; struct _MMBroadbandModemFibocomClass{ |