icera: allow specifying at modem/bearer level whether we want DHCP or STATIC
This commit is contained in:
@@ -35,7 +35,17 @@
|
|||||||
|
|
||||||
G_DEFINE_TYPE (MMBroadbandBearerIcera, mm_broadband_bearer_icera, MM_TYPE_BROADBAND_BEARER);
|
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 {
|
struct _MMBroadbandBearerIceraPrivate {
|
||||||
|
MMBearerIpMethod default_ip_method;
|
||||||
|
|
||||||
/* Connection related */
|
/* Connection related */
|
||||||
gpointer connect_pending;
|
gpointer connect_pending;
|
||||||
guint connect_pending_id;
|
guint connect_pending_id;
|
||||||
@@ -82,7 +92,7 @@ get_ip_config_3gpp_context_new (MMBroadbandBearerIcera *self,
|
|||||||
static void
|
static void
|
||||||
get_ip_config_context_complete_and_free (GetIpConfig3gppContext *ctx)
|
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->result);
|
||||||
g_object_unref (ctx->primary);
|
g_object_unref (ctx->primary);
|
||||||
g_object_unref (ctx->modem);
|
g_object_unref (ctx->modem);
|
||||||
@@ -216,23 +226,45 @@ get_ip_config_3gpp (MMBroadbandBearer *self,
|
|||||||
GAsyncReadyCallback callback,
|
GAsyncReadyCallback callback,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
gchar *command;
|
GetIpConfig3gppContext *ctx;
|
||||||
|
|
||||||
command = g_strdup_printf ("%%IPDPADDR=%d", cid);
|
ctx = get_ip_config_3gpp_context_new (MM_BROADBAND_BEARER_ICERA (self),
|
||||||
mm_base_modem_at_command_full (MM_BASE_MODEM (modem),
|
MM_BASE_MODEM (modem),
|
||||||
primary,
|
primary,
|
||||||
command,
|
cid,
|
||||||
3,
|
callback,
|
||||||
FALSE,
|
user_data);
|
||||||
NULL, /* cancellable */
|
|
||||||
(GAsyncReadyCallback)ip_config_ready,
|
if (ctx->self->priv->default_ip_method == MM_BEARER_IP_METHOD_STATIC) {
|
||||||
get_ip_config_3gpp_context_new (MM_BROADBAND_BEARER_ICERA (self),
|
gchar *command;
|
||||||
MM_BASE_MODEM (modem),
|
|
||||||
primary,
|
command = g_strdup_printf ("%%IPDPADDR=%d", cid);
|
||||||
cid,
|
mm_base_modem_at_command_full (MM_BASE_MODEM (modem),
|
||||||
callback,
|
primary,
|
||||||
user_data));
|
command,
|
||||||
g_free (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
|
void
|
||||||
mm_broadband_bearer_icera_new (MMBroadbandModem *modem,
|
mm_broadband_bearer_icera_new (MMBroadbandModem *modem,
|
||||||
|
MMBearerIpMethod ip_method,
|
||||||
MMBearerProperties *config,
|
MMBearerProperties *config,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GAsyncReadyCallback callback,
|
GAsyncReadyCallback callback,
|
||||||
@@ -900,9 +933,45 @@ mm_broadband_bearer_icera_new (MMBroadbandModem *modem,
|
|||||||
user_data,
|
user_data,
|
||||||
MM_BEARER_MODEM, modem,
|
MM_BEARER_MODEM, modem,
|
||||||
MM_BEARER_CONFIG, config,
|
MM_BEARER_CONFIG, config,
|
||||||
|
MM_BROADBAND_BEARER_ICERA_DEFAULT_IP_METHOD, ip_method,
|
||||||
NULL);
|
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
|
static void
|
||||||
mm_broadband_bearer_icera_init (MMBroadbandBearerIcera *self)
|
mm_broadband_bearer_icera_init (MMBroadbandBearerIcera *self)
|
||||||
{
|
{
|
||||||
@@ -910,6 +979,9 @@ mm_broadband_bearer_icera_init (MMBroadbandBearerIcera *self)
|
|||||||
self->priv = G_TYPE_INSTANCE_GET_PRIVATE ((self),
|
self->priv = G_TYPE_INSTANCE_GET_PRIVATE ((self),
|
||||||
MM_TYPE_BROADBAND_BEARER_ICERA,
|
MM_TYPE_BROADBAND_BEARER_ICERA,
|
||||||
MMBroadbandBearerIceraPrivate);
|
MMBroadbandBearerIceraPrivate);
|
||||||
|
|
||||||
|
/* Defaults */
|
||||||
|
self->priv->default_ip_method = MM_BEARER_IP_METHOD_STATIC;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -920,10 +992,21 @@ mm_broadband_bearer_icera_class_init (MMBroadbandBearerIceraClass *klass)
|
|||||||
|
|
||||||
g_type_class_add_private (object_class, sizeof (MMBroadbandBearerIceraPrivate));
|
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 = dial_3gpp;
|
||||||
broadband_bearer_class->dial_3gpp_finish = dial_3gpp_finish;
|
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 = get_ip_config_3gpp;
|
||||||
broadband_bearer_class->get_ip_config_3gpp_finish = get_ip_config_3gpp_finish;
|
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 = disconnect_3gpp;
|
||||||
broadband_bearer_class->disconnect_3gpp_finish = disconnect_3gpp_finish;
|
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]);
|
||||||
}
|
}
|
||||||
|
@@ -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_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_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 {
|
typedef enum {
|
||||||
MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_UNKNOWN,
|
MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_UNKNOWN,
|
||||||
MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_CONNECTED,
|
MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_CONNECTED,
|
||||||
@@ -57,6 +59,7 @@ GType mm_broadband_bearer_icera_get_type (void);
|
|||||||
|
|
||||||
/* Default bearer creation implementation */
|
/* Default bearer creation implementation */
|
||||||
void mm_broadband_bearer_icera_new (MMBroadbandModem *modem,
|
void mm_broadband_bearer_icera_new (MMBroadbandModem *modem,
|
||||||
|
MMBearerIpMethod ip_method,
|
||||||
MMBearerProperties *config,
|
MMBearerProperties *config,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GAsyncReadyCallback callback,
|
GAsyncReadyCallback callback,
|
||||||
|
@@ -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_3GPP, iface_modem_3gpp_init)
|
||||||
G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_TIME, iface_modem_time_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 {
|
struct _MMBroadbandModemIceraPrivate {
|
||||||
|
MMBearerIpMethod default_ip_method;
|
||||||
|
|
||||||
GRegex *nwstate_regex;
|
GRegex *nwstate_regex;
|
||||||
GRegex *pacsp_regex;
|
GRegex *pacsp_regex;
|
||||||
GRegex *ipdpact_regex;
|
GRegex *ipdpact_regex;
|
||||||
@@ -735,6 +745,7 @@ modem_create_bearer (MMIfaceModem *self,
|
|||||||
{
|
{
|
||||||
mm_broadband_bearer_icera_new (
|
mm_broadband_bearer_icera_new (
|
||||||
MM_BROADBAND_MODEM (self),
|
MM_BROADBAND_MODEM (self),
|
||||||
|
MM_BROADBAND_MODEM_ICERA (self)->priv->default_ip_method,
|
||||||
properties,
|
properties,
|
||||||
NULL, /* cancellable */
|
NULL, /* cancellable */
|
||||||
(GAsyncReadyCallback)broadband_bearer_icera_new_ready,
|
(GAsyncReadyCallback)broadband_bearer_icera_new_ready,
|
||||||
@@ -1486,6 +1497,42 @@ mm_broadband_modem_icera_new (const gchar *device,
|
|||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
static void
|
||||||
mm_broadband_modem_icera_init (MMBroadbandModemIcera *self)
|
mm_broadband_modem_icera_init (MMBroadbandModemIcera *self)
|
||||||
{
|
{
|
||||||
@@ -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",
|
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);
|
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;
|
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));
|
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;
|
object_class->finalize = finalize;
|
||||||
broadband_modem_class->setup_ports = setup_ports;
|
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]);
|
||||||
}
|
}
|
||||||
|
@@ -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_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_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 _MMBroadbandModemIcera MMBroadbandModemIcera;
|
||||||
typedef struct _MMBroadbandModemIceraClass MMBroadbandModemIceraClass;
|
typedef struct _MMBroadbandModemIceraClass MMBroadbandModemIceraClass;
|
||||||
typedef struct _MMBroadbandModemIceraPrivate MMBroadbandModemIceraPrivate;
|
typedef struct _MMBroadbandModemIceraPrivate MMBroadbandModemIceraPrivate;
|
||||||
|
@@ -631,6 +631,7 @@ mm_iface_icera_modem_create_bearer (MMIfaceModem *self,
|
|||||||
mm_iface_icera_modem_create_bearer);
|
mm_iface_icera_modem_create_bearer);
|
||||||
|
|
||||||
mm_broadband_bearer_icera_new (MM_BROADBAND_MODEM (self),
|
mm_broadband_bearer_icera_new (MM_BROADBAND_MODEM (self),
|
||||||
|
MM_BEARER_IP_METHOD_STATIC,
|
||||||
properties,
|
properties,
|
||||||
NULL, /* cancellable */
|
NULL, /* cancellable */
|
||||||
(GAsyncReadyCallback)broadband_bearer_icera_new_ready,
|
(GAsyncReadyCallback)broadband_bearer_icera_new_ready,
|
||||||
|
Reference in New Issue
Block a user