aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/icera/mm-broadband-bearer-icera.c117
-rw-r--r--plugins/icera/mm-broadband-bearer-icera.h3
-rw-r--r--plugins/icera/mm-broadband-modem-icera.c59
-rw-r--r--plugins/icera/mm-broadband-modem-icera.h2
-rw-r--r--plugins/icera/mm-iface-icera.c1
5 files changed, 165 insertions, 17 deletions
diff --git a/plugins/icera/mm-broadband-bearer-icera.c b/plugins/icera/mm-broadband-bearer-icera.c
index 1eb590d8..b4e80828 100644
--- a/plugins/icera/mm-broadband-bearer-icera.c
+++ b/plugins/icera/mm-broadband-bearer-icera.c
@@ -35,7 +35,17 @@
G_DEFINE_TYPE (MMBroadbandBearerIcera, mm_broadband_bearer_icera, MM_TYPE_BROADBAND_BEARER);
+enum {
+ PROP_0,
+ PROP_DEFAULT_IP_METHOD,
+ PROP_LAST
+};
+
+static GParamSpec *properties[PROP_LAST];
+
struct _MMBroadbandBearerIceraPrivate {
+ MMBearerIpMethod default_ip_method;
+
/* Connection related */
gpointer connect_pending;
guint connect_pending_id;
@@ -82,7 +92,7 @@ get_ip_config_3gpp_context_new (MMBroadbandBearerIcera *self,
static void
get_ip_config_context_complete_and_free (GetIpConfig3gppContext *ctx)
{
- g_simple_async_result_complete (ctx->result);
+ g_simple_async_result_complete_in_idle (ctx->result);
g_object_unref (ctx->result);
g_object_unref (ctx->primary);
g_object_unref (ctx->modem);
@@ -216,23 +226,45 @@ get_ip_config_3gpp (MMBroadbandBearer *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
- gchar *command;
+ GetIpConfig3gppContext *ctx;
- command = g_strdup_printf ("%%IPDPADDR=%d", cid);
- mm_base_modem_at_command_full (MM_BASE_MODEM (modem),
- primary,
- command,
- 3,
- FALSE,
- NULL, /* cancellable */
- (GAsyncReadyCallback)ip_config_ready,
- get_ip_config_3gpp_context_new (MM_BROADBAND_BEARER_ICERA (self),
- MM_BASE_MODEM (modem),
- primary,
- cid,
- callback,
- user_data));
- g_free (command);
+ ctx = get_ip_config_3gpp_context_new (MM_BROADBAND_BEARER_ICERA (self),
+ MM_BASE_MODEM (modem),
+ primary,
+ cid,
+ callback,
+ user_data);
+
+ if (ctx->self->priv->default_ip_method == MM_BEARER_IP_METHOD_STATIC) {
+ gchar *command;
+
+ command = g_strdup_printf ("%%IPDPADDR=%d", cid);
+ mm_base_modem_at_command_full (MM_BASE_MODEM (modem),
+ primary,
+ command,
+ 3,
+ FALSE,
+ NULL, /* cancellable */
+ (GAsyncReadyCallback)ip_config_ready,
+ ctx);
+ g_free (command);
+ return;
+ }
+
+ /* Otherwise, DHCP */
+ if (ctx->self->priv->default_ip_method == MM_BEARER_IP_METHOD_DHCP) {
+ MMBearerIpConfig *ip_config;
+
+ ip_config = mm_bearer_ip_config_new ();
+ mm_bearer_ip_config_set_method (ip_config, MM_BEARER_IP_METHOD_DHCP);
+ g_simple_async_result_set_op_res_gpointer (ctx->result,
+ ip_config,
+ (GDestroyNotify)g_object_unref);
+ get_ip_config_context_complete_and_free (ctx);
+ return;
+ }
+
+ g_assert_not_reached ();
}
/*****************************************************************************/
@@ -887,6 +919,7 @@ mm_broadband_bearer_icera_new_finish (GAsyncResult *res,
void
mm_broadband_bearer_icera_new (MMBroadbandModem *modem,
+ MMBearerIpMethod ip_method,
MMBearerProperties *config,
GCancellable *cancellable,
GAsyncReadyCallback callback,
@@ -900,16 +933,55 @@ mm_broadband_bearer_icera_new (MMBroadbandModem *modem,
user_data,
MM_BEARER_MODEM, modem,
MM_BEARER_CONFIG, config,
+ MM_BROADBAND_BEARER_ICERA_DEFAULT_IP_METHOD, ip_method,
NULL);
}
static void
+set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ MMBroadbandBearerIcera *self = MM_BROADBAND_BEARER_ICERA (object);
+
+ switch (prop_id) {
+ case PROP_DEFAULT_IP_METHOD:
+ self->priv->default_ip_method = g_value_get_enum (value);
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ MMBroadbandBearerIcera *self = MM_BROADBAND_BEARER_ICERA (object);
+
+ switch (prop_id) {
+ case PROP_DEFAULT_IP_METHOD:
+ g_value_set_enum (value, self->priv->default_ip_method);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
mm_broadband_bearer_icera_init (MMBroadbandBearerIcera *self)
{
/* Initialize private data */
self->priv = G_TYPE_INSTANCE_GET_PRIVATE ((self),
MM_TYPE_BROADBAND_BEARER_ICERA,
MMBroadbandBearerIceraPrivate);
+
+ /* Defaults */
+ self->priv->default_ip_method = MM_BEARER_IP_METHOD_STATIC;
}
static void
@@ -920,10 +992,21 @@ mm_broadband_bearer_icera_class_init (MMBroadbandBearerIceraClass *klass)
g_type_class_add_private (object_class, sizeof (MMBroadbandBearerIceraPrivate));
+ object_class->get_property = get_property;
+ object_class->set_property = set_property;
broadband_bearer_class->dial_3gpp = dial_3gpp;
broadband_bearer_class->dial_3gpp_finish = dial_3gpp_finish;
broadband_bearer_class->get_ip_config_3gpp = get_ip_config_3gpp;
broadband_bearer_class->get_ip_config_3gpp_finish = get_ip_config_3gpp_finish;
broadband_bearer_class->disconnect_3gpp = disconnect_3gpp;
broadband_bearer_class->disconnect_3gpp_finish = disconnect_3gpp_finish;
+
+ properties[PROP_DEFAULT_IP_METHOD] =
+ g_param_spec_enum (MM_BASE_MODEM_DEVICE,
+ "Default IP method",
+ "Default IP Method (static or DHCP) to use.",
+ MM_TYPE_BEARER_IP_METHOD,
+ MM_BEARER_IP_METHOD_STATIC,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
+ g_object_class_install_property (object_class, PROP_DEFAULT_IP_METHOD, properties[PROP_DEFAULT_IP_METHOD]);
}
diff --git a/plugins/icera/mm-broadband-bearer-icera.h b/plugins/icera/mm-broadband-bearer-icera.h
index 5e938fab..058dbddb 100644
--- a/plugins/icera/mm-broadband-bearer-icera.h
+++ b/plugins/icera/mm-broadband-bearer-icera.h
@@ -33,6 +33,8 @@
#define MM_IS_BROADBAND_BEARER_ICERA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MM_TYPE_BROADBAND_BEARER_ICERA))
#define MM_BROADBAND_BEARER_ICERA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MM_TYPE_BROADBAND_BEARER_ICERA, MMBroadbandBearerIceraClass))
+#define MM_BROADBAND_BEARER_ICERA_DEFAULT_IP_METHOD "broadband-bearer-icera-default-ip-method"
+
typedef enum {
MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_UNKNOWN,
MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_CONNECTED,
@@ -57,6 +59,7 @@ GType mm_broadband_bearer_icera_get_type (void);
/* Default bearer creation implementation */
void mm_broadband_bearer_icera_new (MMBroadbandModem *modem,
+ MMBearerIpMethod ip_method,
MMBearerProperties *config,
GCancellable *cancellable,
GAsyncReadyCallback callback,
diff --git a/plugins/icera/mm-broadband-modem-icera.c b/plugins/icera/mm-broadband-modem-icera.c
index 0696bdff..b3eb5cda 100644
--- a/plugins/icera/mm-broadband-modem-icera.c
+++ b/plugins/icera/mm-broadband-modem-icera.c
@@ -47,7 +47,17 @@ G_DEFINE_TYPE_EXTENDED (MMBroadbandModemIcera, mm_broadband_modem_icera, MM_TYPE
G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_3GPP, iface_modem_3gpp_init)
G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_TIME, iface_modem_time_init));
+enum {
+ PROP_0,
+ PROP_DEFAULT_IP_METHOD,
+ PROP_LAST
+};
+
+static GParamSpec *properties[PROP_LAST];
+
struct _MMBroadbandModemIceraPrivate {
+ MMBearerIpMethod default_ip_method;
+
GRegex *nwstate_regex;
GRegex *pacsp_regex;
GRegex *ipdpact_regex;
@@ -735,6 +745,7 @@ modem_create_bearer (MMIfaceModem *self,
{
mm_broadband_bearer_icera_new (
MM_BROADBAND_MODEM (self),
+ MM_BROADBAND_MODEM_ICERA (self)->priv->default_ip_method,
properties,
NULL, /* cancellable */
(GAsyncReadyCallback)broadband_bearer_icera_new_ready,
@@ -1487,6 +1498,42 @@ mm_broadband_modem_icera_new (const gchar *device,
}
static void
+set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ MMBroadbandModemIcera *self = MM_BROADBAND_MODEM_ICERA (object);
+
+ switch (prop_id) {
+ case PROP_DEFAULT_IP_METHOD:
+ self->priv->default_ip_method = g_value_get_enum (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ MMBroadbandModemIcera *self = MM_BROADBAND_MODEM_ICERA (object);
+
+ switch (prop_id) {
+ case PROP_DEFAULT_IP_METHOD:
+ g_value_set_enum (value, self->priv->default_ip_method);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
mm_broadband_modem_icera_init (MMBroadbandModemIcera *self)
{
/* Initialize private data */
@@ -1501,6 +1548,7 @@ mm_broadband_modem_icera_init (MMBroadbandModemIcera *self)
self->priv->ipdpact_regex = g_regex_new ("\\r\\n%IPDPACT:\\s*(\\d+),\\s*(\\d+),\\s*(\\d+)\\r\\n",
G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
+ self->priv->default_ip_method = MM_BEARER_IP_METHOD_STATIC;
self->priv->last_act = MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN;
}
@@ -1572,6 +1620,17 @@ mm_broadband_modem_icera_class_init (MMBroadbandModemIceraClass *klass)
g_type_class_add_private (object_class, sizeof (MMBroadbandModemIceraPrivate));
+ object_class->get_property = get_property;
+ object_class->set_property = set_property;
object_class->finalize = finalize;
broadband_modem_class->setup_ports = setup_ports;
+
+ properties[PROP_DEFAULT_IP_METHOD] =
+ g_param_spec_enum (MM_BROADBAND_MODEM_ICERA_DEFAULT_IP_METHOD,
+ "Default IP method",
+ "Default IP Method (static or DHCP) to use.",
+ MM_TYPE_BEARER_IP_METHOD,
+ MM_BEARER_IP_METHOD_STATIC,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
+ g_object_class_install_property (object_class, PROP_DEFAULT_IP_METHOD, properties[PROP_DEFAULT_IP_METHOD]);
}
diff --git a/plugins/icera/mm-broadband-modem-icera.h b/plugins/icera/mm-broadband-modem-icera.h
index 98c59bbf..5c89cdbe 100644
--- a/plugins/icera/mm-broadband-modem-icera.h
+++ b/plugins/icera/mm-broadband-modem-icera.h
@@ -27,6 +27,8 @@
#define MM_IS_BROADBAND_MODEM_ICERA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MM_TYPE_BROADBAND_MODEM_ICERA))
#define MM_BROADBAND_MODEM_ICERA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MM_TYPE_BROADBAND_MODEM_ICERA, MMBroadbandModemIceraClass))
+#define MM_BROADBAND_MODEM_ICERA_DEFAULT_IP_METHOD "broadband-modem-icera-default-ip-method"
+
typedef struct _MMBroadbandModemIcera MMBroadbandModemIcera;
typedef struct _MMBroadbandModemIceraClass MMBroadbandModemIceraClass;
typedef struct _MMBroadbandModemIceraPrivate MMBroadbandModemIceraPrivate;
diff --git a/plugins/icera/mm-iface-icera.c b/plugins/icera/mm-iface-icera.c
index e530d79c..e25550e0 100644
--- a/plugins/icera/mm-iface-icera.c
+++ b/plugins/icera/mm-iface-icera.c
@@ -631,6 +631,7 @@ mm_iface_icera_modem_create_bearer (MMIfaceModem *self,
mm_iface_icera_modem_create_bearer);
mm_broadband_bearer_icera_new (MM_BROADBAND_MODEM (self),
+ MM_BEARER_IP_METHOD_STATIC,
properties,
NULL, /* cancellable */
(GAsyncReadyCallback)broadband_bearer_icera_new_ready,