diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2014-08-13 20:04:03 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2014-08-13 20:04:03 +0200 |
commit | aedd635a4831a26b1b1090fc56501413f999ffc7 (patch) | |
tree | 3a0e6c5ff24d5fee5e3db52b9676f7c88895156e | |
parent | 46696114124d1a69cd3d90ba83abff36014a7326 (diff) | |
download | ModemManager-aedd635a4831a26b1b1090fc56501413f999ffc7.tar.gz |
bearer-qmi: allow forcing DHCP instead of static IP config
-rw-r--r-- | src/mm-bearer-qmi.c | 82 | ||||
-rw-r--r-- | src/mm-bearer-qmi.h | 2 |
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; |