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:
committed by
Aleksander Morgado
parent
c174fd29dc
commit
382a7c2425
@@ -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{
|
||||
|
||||
Reference in New Issue
Block a user