diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2012-07-20 19:35:06 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-08-06 20:07:27 +0200 |
commit | fa8bcb0a7f9a84822ea2f196c1165a93e8380c11 (patch) | |
tree | bc222f3faa8432b6b24d4297f4b5265cad709fc8 | |
parent | ef4de86b4281c16229729d724c2aedc2b8248fe5 (diff) |
icera: allow specifying at modem/bearer level whether we want DHCP or STATIC
-rw-r--r-- | plugins/icera/mm-broadband-bearer-icera.c | 117 | ||||
-rw-r--r-- | plugins/icera/mm-broadband-bearer-icera.h | 3 | ||||
-rw-r--r-- | plugins/icera/mm-broadband-modem-icera.c | 59 | ||||
-rw-r--r-- | plugins/icera/mm-broadband-modem-icera.h | 2 | ||||
-rw-r--r-- | plugins/icera/mm-iface-icera.c | 1 |
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, |