summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2014-08-13 20:04:03 +0200
committerAleksander Morgado <aleksander@aleksander.es>2014-08-13 20:04:03 +0200
commitaedd635a4831a26b1b1090fc56501413f999ffc7 (patch)
tree3a0e6c5ff24d5fee5e3db52b9676f7c88895156e
parent46696114124d1a69cd3d90ba83abff36014a7326 (diff)
downloadModemManager-aedd635a4831a26b1b1090fc56501413f999ffc7.tar.gz
bearer-qmi: allow forcing DHCP instead of static IP config
-rw-r--r--src/mm-bearer-qmi.c82
-rw-r--r--src/mm-bearer-qmi.h2
2 files changed, 77 insertions, 7 deletions
diff --git a/src/mm-bearer-qmi.c b/src/mm-bearer-qmi.c
index c25b9f743..9421c5f30 100644
--- a/src/mm-bearer-qmi.c
+++ b/src/mm-bearer-qmi.c
@@ -33,10 +33,18 @@
#include "mm-log.h"
#include "mm-modem-helpers.h"
-G_DEFINE_TYPE (MMBearerQmi, mm_bearer_qmi, MM_TYPE_BASE_BEARER);
+G_DEFINE_TYPE (MMBearerQmi, mm_bearer_qmi, MM_TYPE_BASE_BEARER)
#define GLOBAL_PACKET_DATA_HANDLE 0xFFFFFFFF
+enum {
+ PROP_0,
+ PROP_FORCE_DHCP,
+ PROP_LAST
+};
+
+static GParamSpec *properties[PROP_LAST];
+
struct _MMBearerQmiPrivate {
/* State kept while connected */
QmiClientWds *client_ipv4;
@@ -44,6 +52,7 @@ struct _MMBearerQmiPrivate {
MMPort *data;
guint32 packet_data_handle_ipv4;
guint32 packet_data_handle_ipv6;
+ gboolean force_dhcp;
};
/*****************************************************************************/
@@ -261,7 +270,9 @@ qmi_inet4_ntop (guint32 address, char *buf, const gsize buflen)
}
static MMBearerIpConfig *
-get_ipv4_config (QmiMessageWdsGetCurrentSettingsOutput *output, guint32 mtu)
+get_ipv4_config (MMBearerQmi *self,
+ QmiMessageWdsGetCurrentSettingsOutput *output,
+ guint32 mtu)
{
MMBearerIpConfig *config;
char buf[INET_ADDRSTRLEN];
@@ -291,7 +302,11 @@ get_ipv4_config (QmiMessageWdsGetCurrentSettingsOutput *output, guint32 mtu)
mm_dbg ("QMI IPv4 Settings:");
config = mm_bearer_ip_config_new ();
- mm_bearer_ip_config_set_method (config, MM_BEARER_IP_METHOD_STATIC);
+ if (self->priv->force_dhcp)
+ /* Force DHCP, but still set the static IPv4 config details if we get them */
+ mm_bearer_ip_config_set_method (config, MM_BEARER_IP_METHOD_DHCP);
+ else
+ mm_bearer_ip_config_set_method (config, MM_BEARER_IP_METHOD_STATIC);
/* IPv4 address */
qmi_inet4_ntop (addr, buf, sizeof (buf));
@@ -360,7 +375,9 @@ qmi_inet6_ntop (GArray *array, char *buf, const gsize buflen)
}
static MMBearerIpConfig *
-get_ipv6_config (QmiMessageWdsGetCurrentSettingsOutput *output, guint32 mtu)
+get_ipv6_config (MMBearerQmi *self,
+ QmiMessageWdsGetCurrentSettingsOutput *output,
+ guint32 mtu)
{
MMBearerIpConfig *config;
char buf[INET6_ADDRSTRLEN];
@@ -381,7 +398,11 @@ get_ipv6_config (QmiMessageWdsGetCurrentSettingsOutput *output, guint32 mtu)
mm_dbg ("QMI IPv6 Settings:");
config = mm_bearer_ip_config_new ();
- mm_bearer_ip_config_set_method (config, MM_BEARER_IP_METHOD_STATIC);
+ if (self->priv->force_dhcp)
+ /* Force DHCP, but still set the static IPv6 config details if we get them */
+ mm_bearer_ip_config_set_method (config, MM_BEARER_IP_METHOD_DHCP);
+ else
+ mm_bearer_ip_config_set_method (config, MM_BEARER_IP_METHOD_STATIC);
/* IPv6 address */
qmi_inet6_ntop (array, buf, sizeof (buf));
@@ -472,9 +493,9 @@ get_current_settings_ready (QmiClientWds *client,
}
if (ip_family == QMI_WDS_IP_FAMILY_IPV4)
- ctx->ipv4_config = get_ipv4_config (output, mtu);
+ ctx->ipv4_config = get_ipv4_config (ctx->self, output, mtu);
else if (ip_family == QMI_WDS_IP_FAMILY_IPV6)
- ctx->ipv6_config = get_ipv6_config (output, mtu);
+ ctx->ipv6_config = get_ipv6_config (ctx->self, output, mtu);
/* Domain names */
if (qmi_message_wds_get_current_settings_output_get_domain_name_list (output, &array, &error)) {
@@ -1319,6 +1340,42 @@ mm_bearer_qmi_init (MMBearerQmi *self)
}
static void
+set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ MMBearerQmi *self = MM_BEARER_QMI (object);
+
+ switch (prop_id) {
+ case PROP_FORCE_DHCP:
+ self->priv->force_dhcp = g_value_get_boolean (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)
+{
+ MMBearerQmi *self = MM_BEARER_QMI (object);
+
+ switch (prop_id) {
+ case PROP_FORCE_DHCP:
+ g_value_set_boolean (value, self->priv->force_dhcp);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
dispose (GObject *object)
{
MMBearerQmi *self = MM_BEARER_QMI (object);
@@ -1340,10 +1397,21 @@ mm_bearer_qmi_class_init (MMBearerQmiClass *klass)
/* Virtual methods */
object_class->dispose = dispose;
+ object_class->get_property = get_property;
+ object_class->set_property = set_property;
base_bearer_class->connect = _connect;
base_bearer_class->connect_finish = connect_finish;
base_bearer_class->disconnect = disconnect;
base_bearer_class->disconnect_finish = disconnect_finish;
base_bearer_class->report_connection_status = report_connection_status;
+
+ /* Properties */
+ properties[PROP_FORCE_DHCP] =
+ g_param_spec_boolean (MM_BEARER_QMI_FORCE_DHCP,
+ "Force DHCP",
+ "Never setup static IP config, always DHCP.",
+ FALSE,
+ G_PARAM_READWRITE);
+ g_object_class_install_property (object_class, PROP_FORCE_DHCP, properties[PROP_FORCE_DHCP]);
}
diff --git a/src/mm-bearer-qmi.h b/src/mm-bearer-qmi.h
index b29fed376..9171f73a8 100644
--- a/src/mm-bearer-qmi.h
+++ b/src/mm-bearer-qmi.h
@@ -38,6 +38,8 @@ typedef struct _MMBearerQmi MMBearerQmi;
typedef struct _MMBearerQmiClass MMBearerQmiClass;
typedef struct _MMBearerQmiPrivate MMBearerQmiPrivate;
+#define MM_BEARER_QMI_FORCE_DHCP "bearer-qmi-force-dhcp"
+
struct _MMBearerQmi {
MMBaseBearer parent;
MMBearerQmiPrivate *priv;