diff options
-rw-r--r-- | src/mm-bearer-qmi.c | 97 | ||||
-rw-r--r-- | src/mm-bearer-qmi.h | 5 | ||||
-rw-r--r-- | src/mm-broadband-modem-qmi.c | 11 |
3 files changed, 28 insertions, 85 deletions
diff --git a/src/mm-bearer-qmi.c b/src/mm-bearer-qmi.c index e750bf240..1e507659a 100644 --- a/src/mm-bearer-qmi.c +++ b/src/mm-bearer-qmi.c @@ -38,14 +38,6 @@ 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; @@ -57,7 +49,6 @@ struct _MMBearerQmiPrivate { MMPort *data; guint32 packet_data_handle_ipv4; guint32 packet_data_handle_ipv6; - gboolean force_dhcp; }; /*****************************************************************************/ @@ -226,6 +217,7 @@ static void common_setup_cleanup_unsolicited_events (MMBearerQmi *self, typedef enum { CONNECT_STEP_FIRST, CONNECT_STEP_OPEN_QMI_PORT, + CONNECT_STEP_IP_METHOD, CONNECT_STEP_IPV4, CONNECT_STEP_WDS_CLIENT_IPV4, CONNECT_STEP_IP_FAMILY_IPV4, @@ -255,6 +247,8 @@ typedef struct { gboolean no_ip_family_preference; gboolean default_ip_family_set; + MMBearerIpMethod ip_method; + gboolean ipv4; gboolean running_ipv4; QmiClientWds *client_ipv4; @@ -464,6 +458,7 @@ qmi_inet4_ntop (guint32 address, char *buf, const gsize buflen) static MMBearerIpConfig * get_ipv4_config (MMBearerQmi *self, + MMBearerIpMethod ip_method, QmiMessageWdsGetCurrentSettingsOutput *output, guint32 mtu) { @@ -495,11 +490,7 @@ get_ipv4_config (MMBearerQmi *self, mm_info ("QMI IPv4 Settings:"); config = mm_bearer_ip_config_new (); - 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); + mm_bearer_ip_config_set_method (config, ip_method); /* IPv4 address */ qmi_inet4_ntop (addr, buf, sizeof (buf)); @@ -569,6 +560,7 @@ qmi_inet6_ntop (GArray *array, char *buf, const gsize buflen) static MMBearerIpConfig * get_ipv6_config (MMBearerQmi *self, + MMBearerIpMethod ip_method, QmiMessageWdsGetCurrentSettingsOutput *output, guint32 mtu) { @@ -591,11 +583,7 @@ get_ipv6_config (MMBearerQmi *self, mm_info ("QMI IPv6 Settings:"); config = mm_bearer_ip_config_new (); - 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); + mm_bearer_ip_config_set_method (config, ip_method); /* IPv6 address */ qmi_inet6_ntop (array, buf, sizeof (buf)); @@ -682,9 +670,9 @@ get_current_settings_ready (QmiClientWds *client, } if (ip_family == QMI_WDS_IP_FAMILY_IPV4) - ctx->ipv4_config = get_ipv4_config (ctx->self, output, mtu); + ctx->ipv4_config = get_ipv4_config (ctx->self, ctx->ip_method, output, mtu); else if (ip_family == QMI_WDS_IP_FAMILY_IPV6) - ctx->ipv6_config = get_ipv6_config (ctx->self, output, mtu); + ctx->ipv6_config = get_ipv6_config (ctx->self, ctx->ip_method, output, mtu); /* Domain names */ if (qmi_message_wds_get_current_settings_output_get_domain_name_list (output, &array, &error)) { @@ -922,6 +910,21 @@ connect_context_step (ConnectContext *ctx) /* If already open, just fall down */ ctx->step++; + case CONNECT_STEP_IP_METHOD: + /* Once the QMI port is open, we decide the IP method we're going + * to request. If the LLP is raw-ip, we force Static IP, because not + * all DHCP clients support the raw-ip interfaces; otherwise default + * to DHCP as always. */ + if (mm_port_qmi_llp_is_raw_ip (ctx->qmi)) + ctx->ip_method = MM_BEARER_IP_METHOD_STATIC; + else + ctx->ip_method = MM_BEARER_IP_METHOD_DHCP; + + mm_dbg ("Defaulting to use %s IP method", mm_bearer_ip_method_get_string (ctx->ip_method)); + + /* Just fall down */ + ctx->step++; + case CONNECT_STEP_IPV4: /* If no IPv4 setup needed, jump to IPv6 */ if (!ctx->ipv4) { @@ -1256,6 +1259,7 @@ _connect (MMBaseBearer *self, ctx->data = data; ctx->cancellable = g_object_ref (cancellable); ctx->step = CONNECT_STEP_FIRST; + ctx->ip_method = MM_BEARER_IP_METHOD_UNKNOWN; ctx->result = g_simple_async_result_new (G_OBJECT (self), callback, user_data, @@ -1600,8 +1604,7 @@ report_connection_status (MMBaseBearer *self, MMBaseBearer * mm_bearer_qmi_new (MMBroadbandModemQmi *modem, - MMBearerProperties *config, - gboolean force_dhcp) + MMBearerProperties *config) { MMBaseBearer *bearer; @@ -1611,7 +1614,6 @@ 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 */ @@ -1630,42 +1632,6 @@ 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); @@ -1700,8 +1666,6 @@ 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; @@ -1710,13 +1674,4 @@ mm_bearer_qmi_class_init (MMBearerQmiClass *klass) base_bearer_class->report_connection_status = report_connection_status; base_bearer_class->reload_stats = reload_stats; base_bearer_class->reload_stats_finish = reload_stats_finish; - - /* 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 b17f1d4bf..b29fed376 100644 --- a/src/mm-bearer-qmi.h +++ b/src/mm-bearer-qmi.h @@ -38,8 +38,6 @@ 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; @@ -54,7 +52,6 @@ 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, - gboolean force_dhcp); + MMBearerProperties *config); #endif /* MM_BEARER_QMI_H */ diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c index dd217941c..b57499c94 100644 --- a/src/mm-broadband-modem-qmi.c +++ b/src/mm-broadband-modem-qmi.c @@ -314,14 +314,6 @@ modem_create_bearer (MMIfaceModem *self, { MMBaseBearer *bearer; GSimpleAsyncResult *result; - MMPortQmi *port; - gboolean force_dhcp = TRUE; - - /* We use static IP setup when raw IP link layer protocol in use */ - port = mm_base_modem_peek_port_qmi (MM_BASE_MODEM (self)); - if (port && mm_port_qmi_llp_is_raw_ip (port)) - force_dhcp = FALSE; - /* Set a new ref to the bearer object as result */ result = g_simple_async_result_new (G_OBJECT (self), callback, @@ -329,8 +321,7 @@ modem_create_bearer (MMIfaceModem *self, modem_create_bearer); /* We just create a MMBearerQmi */ - mm_dbg ("Creating QMI bearer (%s) in QMI modem", force_dhcp ? "DHCP" : "Static IP"); - bearer = mm_bearer_qmi_new (MM_BROADBAND_MODEM_QMI (self), properties, force_dhcp); + bearer = mm_bearer_qmi_new (MM_BROADBAND_MODEM_QMI (self), properties); 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); |