aboutsummaryrefslogtreecommitdiff
path: root/plugins/fibocom/mm-broadband-modem-fibocom.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/fibocom/mm-broadband-modem-fibocom.c')
-rw-r--r--plugins/fibocom/mm-broadband-modem-fibocom.c78
1 files changed, 77 insertions, 1 deletions
diff --git a/plugins/fibocom/mm-broadband-modem-fibocom.c b/plugins/fibocom/mm-broadband-modem-fibocom.c
index 900e6e42..d134e640 100644
--- a/plugins/fibocom/mm-broadband-modem-fibocom.c
+++ b/plugins/fibocom/mm-broadband-modem-fibocom.c
@@ -16,8 +16,10 @@
#include <config.h>
#include "mm-broadband-modem-fibocom.h"
+#include "mm-broadband-bearer-fibocom-ecm.h"
#include "mm-broadband-modem.h"
#include "mm-iface-modem.h"
+#include "mm-log.h"
static void iface_modem_init (MMIfaceModem *iface);
@@ -25,6 +27,78 @@ G_DEFINE_TYPE_EXTENDED (MMBroadbandModemFibocom, mm_broadband_modem_fibocom, MM_
G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM, iface_modem_init))
/*****************************************************************************/
+/* Create Bearer (Modem interface) */
+
+static MMBaseBearer *
+modem_create_bearer_finish (MMIfaceModem *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ return g_task_propagate_pointer (G_TASK (res), error);
+}
+
+static void
+broadband_bearer_fibocom_ecm_new_ready (GObject *source,
+ GAsyncResult *res,
+ GTask *task)
+{
+ MMBaseBearer *bearer = NULL;
+ GError *error = NULL;
+
+ bearer = mm_broadband_bearer_fibocom_ecm_new_finish (res, &error);
+ if (!bearer)
+ g_task_return_error (task, error);
+ else
+ g_task_return_pointer (task, bearer, g_object_unref);
+ g_object_unref (task);
+}
+
+static void
+broadband_bearer_new_ready (GObject *source,
+ GAsyncResult *res,
+ GTask *task)
+{
+ MMBaseBearer *bearer = NULL;
+ GError *error = NULL;
+
+ bearer = mm_broadband_bearer_new_finish (res, &error);
+ if (!bearer)
+ g_task_return_error (task, error);
+ else
+ g_task_return_pointer (task, bearer, g_object_unref);
+ g_object_unref (task);
+}
+
+static void
+modem_create_bearer (MMIfaceModem *self,
+ MMBearerProperties *properties,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GTask *task;
+
+ task = g_task_new (self, NULL, callback, user_data);
+
+ /* 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);
+ }
+}
+
+/*****************************************************************************/
MMBroadbandModemFibocom *
mm_broadband_modem_fibocom_new (const gchar *device,
@@ -39,7 +113,7 @@ mm_broadband_modem_fibocom_new (const gchar *device,
MM_BASE_MODEM_PLUGIN, plugin,
MM_BASE_MODEM_VENDOR_ID, vendor_id,
MM_BASE_MODEM_PRODUCT_ID, product_id,
- MM_BASE_MODEM_DATA_NET_SUPPORTED, FALSE,
+ MM_BASE_MODEM_DATA_NET_SUPPORTED, TRUE,
MM_BASE_MODEM_DATA_TTY_SUPPORTED, TRUE,
NULL);
}
@@ -52,6 +126,8 @@ mm_broadband_modem_fibocom_init (MMBroadbandModemFibocom *self)
static void
iface_modem_init (MMIfaceModem *iface)
{
+ iface->create_bearer = modem_create_bearer;
+ iface->create_bearer_finish = modem_create_bearer_finish;
}
static void