aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven Schwermer <sven.schwermer@disruptive-technologies.com>2022-01-05 20:41:28 +0100
committerAleksander Morgado <aleksander@aleksander.es>2022-01-11 09:31:32 +0000
commit382a7c2425ccb1c1e453c6d7939032c617cb79d1 (patch)
tree2426c2aacb89f83486a9e3e5d7f12d3d452d8ce3
parentc174fd29dc03eebc2de06f12ce17a521c7477be5 (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.c101
-rw-r--r--plugins/fibocom/mm-broadband-modem-fibocom.h2
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{