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.
This commit is contained in:
Sven Schwermer
2022-01-11 09:31:32 +00:00
committed by Aleksander Morgado
parent c174fd29dc
commit 382a7c2425
2 changed files with 91 additions and 18 deletions
+89 -18
View File
@@ -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,
common_create_bearer (GTask *task)
{
MMBroadbandModemFibocom *self;
self = g_task_get_source_object (task);
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);
return;
case FEATURE_NOT_SUPPORTED:
mm_obj_dbg (self, "+GTRNDIS not supported, creating generic PPP bearer");
mm_broadband_bearer_new (MM_BROADBAND_MODEM (self),
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)
{
GTask *task;
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 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,
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");
mm_broadband_bearer_new (MM_BROADBAND_MODEM (self),
properties,
NULL, /* cancellable */
(GAsyncReadyCallback) broadband_bearer_new_ready,
task);
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));
}
@@ -27,9 +27,11 @@
typedef struct _MMBroadbandModemFibocom MMBroadbandModemFibocom;
typedef struct _MMBroadbandModemFibocomClass MMBroadbandModemFibocomClass;
typedef struct _MMBroadbandModemFibocomPrivate MMBroadbandModemFibocomPrivate;
struct _MMBroadbandModemFibocom {
MMBroadbandModem parent;
MMBroadbandModemFibocomPrivate *priv;
};
struct _MMBroadbandModemFibocomClass{