bearer-qmi: allow forcing DHCP instead of static IP config

This commit is contained in:
Aleksander Morgado
2014-08-18 09:47:14 -05:00
committed by Dan Williams
parent 4669611412
commit b03e1cfd58
3 changed files with 117 additions and 44 deletions
+112 -42
View File
@@ -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 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 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);
}
/* 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);
}
/* 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);
}
if (dns_idx > 0)
mm_bearer_ip_config_set_dns (config, (const gchar **) &dns);
/* 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 (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 */
@@ -1318,6 +1341,42 @@ mm_bearer_qmi_init (MMBearerQmi *self)
MMBearerQmiPrivate);
}
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)
{
@@ -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]);
}
+4 -1
View File
@@ -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 */
+1 -1
View File
@@ -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);