diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2014-08-13 20:04:03 +0200 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2014-08-18 09:47:14 -0500 |
commit | b03e1cfd582d433694ac9b4f13e9e2757da61348 (patch) | |
tree | 35597c2935920cc00164de1c9937c6e8757edc32 | |
parent | 46696114124d1a69cd3d90ba83abff36014a7326 (diff) | |
download | ModemManager-b03e1cfd582d433694ac9b4f13e9e2757da61348.tar.gz |
bearer-qmi: allow forcing DHCP instead of static IP config
-rw-r--r-- | src/mm-bearer-qmi.c | 154 | ||||
-rw-r--r-- | src/mm-bearer-qmi.h | 5 | ||||
-rw-r--r-- | src/mm-broadband-modem-qmi.c | 2 |
3 files changed, 117 insertions, 44 deletions
diff --git a/src/mm-bearer-qmi.c b/src/mm-bearer-qmi.c index c25b9f743..95ab4f791 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,46 +302,50 @@ 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) + 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)); - mm_bearer_ip_config_set_address (config, buf); - mm_bearer_ip_config_set_prefix (config, prefix); - mm_dbg (" Address: %s/%d", buf, prefix); - - /* IPv4 gateway address */ - if (qmi_message_wds_get_current_settings_output_get_ipv4_gateway_address (output, &addr, &error)) { + /* IPv4 address */ qmi_inet4_ntop (addr, buf, sizeof (buf)); - mm_bearer_ip_config_set_gateway (config, buf); - mm_dbg (" Gateway: %s", buf); - } else { - mm_dbg (" Gateway: failed (%s)", error->message); - g_clear_error (&error); - } + mm_bearer_ip_config_set_address (config, buf); + mm_bearer_ip_config_set_prefix (config, prefix); + mm_dbg (" Address: %s/%d", buf, prefix); + + /* IPv4 gateway address */ + if (qmi_message_wds_get_current_settings_output_get_ipv4_gateway_address (output, &addr, &error)) { + qmi_inet4_ntop (addr, buf, sizeof (buf)); + mm_bearer_ip_config_set_gateway (config, buf); + mm_dbg (" Gateway: %s", buf); + } else { + mm_dbg (" Gateway: failed (%s)", error->message); + g_clear_error (&error); + } - /* IPv4 DNS #1 */ - if (qmi_message_wds_get_current_settings_output_get_primary_ipv4_dns_address (output, &addr, &error)) { - qmi_inet4_ntop (addr, buf, sizeof (buf)); - dns[dns_idx++] = buf; - mm_dbg (" DNS #1: %s", buf); - } else { - mm_dbg (" DNS #1: failed (%s)", error->message); - g_clear_error (&error); - } + /* IPv4 DNS #1 */ + if (qmi_message_wds_get_current_settings_output_get_primary_ipv4_dns_address (output, &addr, &error)) { + qmi_inet4_ntop (addr, buf, sizeof (buf)); + dns[dns_idx++] = buf; + mm_dbg (" DNS #1: %s", buf); + } else { + mm_dbg (" DNS #1: failed (%s)", error->message); + g_clear_error (&error); + } - /* IPv6 DNS #2 */ - if (qmi_message_wds_get_current_settings_output_get_secondary_ipv4_dns_address (output, &addr, &error)) { - qmi_inet4_ntop (addr, buf2, sizeof (buf2)); - dns[dns_idx++] = buf2; - mm_dbg (" DNS #2: %s", buf2); - } else { - mm_dbg (" DNS #2: failed (%s)", error->message); - g_clear_error (&error); - } + /* IPv6 DNS #2 */ + if (qmi_message_wds_get_current_settings_output_get_secondary_ipv4_dns_address (output, &addr, &error)) { + qmi_inet4_ntop (addr, buf2, sizeof (buf2)); + dns[dns_idx++] = buf2; + mm_dbg (" DNS #2: %s", buf2); + } else { + mm_dbg (" DNS #2: failed (%s)", error->message); + g_clear_error (&error); + } - if (dns_idx > 0) - mm_bearer_ip_config_set_dns (config, (const gchar **) &dns); + if (dns_idx > 0) + mm_bearer_ip_config_set_dns (config, (const gchar **) &dns); + } if (mtu) { mm_bearer_ip_config_set_mtu (config, mtu); @@ -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)) { @@ -1291,7 +1312,8 @@ report_connection_status (MMBaseBearer *self, MMBaseBearer * mm_bearer_qmi_new (MMBroadbandModemQmi *modem, - MMBearerProperties *config) + MMBearerProperties *config, + gboolean force_dhcp) { MMBaseBearer *bearer; @@ -1301,6 +1323,7 @@ mm_bearer_qmi_new (MMBroadbandModemQmi *modem, bearer = g_object_new (MM_TYPE_BEARER_QMI, MM_BASE_BEARER_MODEM, modem, MM_BASE_BEARER_CONFIG, config, + MM_BEARER_QMI_FORCE_DHCP, force_dhcp, NULL); /* Only export valid bearers */ @@ -1319,6 +1342,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 +1399,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..b17f1d4bf 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; @@ -52,6 +54,7 @@ GType mm_bearer_qmi_get_type (void); /* QMI bearer creation implementation. * NOTE it is *not* a broadband bearer, so not async-initable */ MMBaseBearer *mm_bearer_qmi_new (MMBroadbandModemQmi *modem, - MMBearerProperties *config); + MMBearerProperties *config, + gboolean force_dhcp); #endif /* MM_BEARER_QMI_H */ diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c index 1092ba297..fa371fc26 100644 --- a/src/mm-broadband-modem-qmi.c +++ b/src/mm-broadband-modem-qmi.c @@ -318,7 +318,7 @@ modem_create_bearer (MMIfaceModem *self, /* We just create a MMBearerQmi */ mm_dbg ("Creating QMI bearer in QMI modem"); - bearer = mm_bearer_qmi_new (MM_BROADBAND_MODEM_QMI (self), properties); + bearer = mm_bearer_qmi_new (MM_BROADBAND_MODEM_QMI (self), properties, FALSE); g_simple_async_result_set_op_res_gpointer (result, bearer, g_object_unref); g_simple_async_result_complete_in_idle (result); g_object_unref (result); |