summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2015-12-29 01:25:00 +0100
committerAleksander Morgado <aleksander@aleksander.es>2016-01-24 17:23:46 +0100
commitcf66d1bcbfa3c124a30302c9bb9a76957c9e4b75 (patch)
treed0d651649524d60fd27d994ed479aea5f2c00363
parentf8ba106a20d678e50619c5bf3f1a9e3c61b3463f (diff)
downloadModemManager-cf66d1bcbfa3c124a30302c9bb9a76957c9e4b75.tar.gz
bearer-qmi: use static IP if LLP is raw-ip
When using raw-ip we'll default to request static IP setup for now, so that we don't rely on the DHCP client supporting raw-ip interfaces.
-rw-r--r--src/mm-broadband-modem-qmi.c9
-rw-r--r--src/mm-port-qmi.c25
-rw-r--r--src/mm-port-qmi.h2
3 files changed, 31 insertions, 5 deletions
diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c
index 0dd88519c..f738ba1cb 100644
--- a/src/mm-broadband-modem-qmi.c
+++ b/src/mm-broadband-modem-qmi.c
@@ -311,6 +311,13 @@ 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),
@@ -320,7 +327,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, TRUE);
+ bearer = mm_bearer_qmi_new (MM_BROADBAND_MODEM_QMI (self), properties, force_dhcp);
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);
diff --git a/src/mm-port-qmi.c b/src/mm-port-qmi.c
index fa723dbb5..33519ee79 100644
--- a/src/mm-port-qmi.c
+++ b/src/mm-port-qmi.c
@@ -36,6 +36,7 @@ struct _MMPortQmiPrivate {
gboolean opening;
QmiDevice *qmi_device;
GList *services;
+ gboolean llp_is_raw_ip;
};
/*****************************************************************************/
@@ -163,6 +164,14 @@ mm_port_qmi_allocate_client (MMPortQmi *self,
/*****************************************************************************/
+gboolean
+mm_port_qmi_llp_is_raw_ip (MMPortQmi *self)
+{
+ return self->priv->llp_is_raw_ip;
+}
+
+/*****************************************************************************/
+
typedef enum {
PORT_OPEN_STEP_FIRST,
PORT_OPEN_STEP_CHECK_OPENING,
@@ -421,10 +430,18 @@ port_open_context_step (PortOpenContext *ctx)
mm_dbg ("Checking data format: kernel %s, device %s",
qmi_device_expected_data_format_get_string (ctx->kernel_data_format),
qmi_wda_link_layer_protocol_get_string (ctx->llp));
- if ((ctx->kernel_data_format == QMI_DEVICE_EXPECTED_DATA_FORMAT_802_3 &&
- ctx->llp == QMI_WDA_LINK_LAYER_PROTOCOL_802_3) ||
- (ctx->kernel_data_format == QMI_DEVICE_EXPECTED_DATA_FORMAT_RAW_IP &&
- ctx->llp == QMI_WDA_LINK_LAYER_PROTOCOL_RAW_IP)) {
+
+ if (ctx->kernel_data_format == QMI_DEVICE_EXPECTED_DATA_FORMAT_802_3 &&
+ ctx->llp == QMI_WDA_LINK_LAYER_PROTOCOL_802_3) {
+ ctx->self->priv->llp_is_raw_ip = FALSE;
+ ctx->step = PORT_OPEN_STEP_LAST;
+ port_open_context_step (ctx);
+ return;
+ }
+
+ if (ctx->kernel_data_format == QMI_DEVICE_EXPECTED_DATA_FORMAT_RAW_IP &&
+ ctx->llp == QMI_WDA_LINK_LAYER_PROTOCOL_RAW_IP) {
+ ctx->self->priv->llp_is_raw_ip = TRUE;
ctx->step = PORT_OPEN_STEP_LAST;
port_open_context_step (ctx);
return;
diff --git a/src/mm-port-qmi.h b/src/mm-port-qmi.h
index 9c38b0c59..2724140a6 100644
--- a/src/mm-port-qmi.h
+++ b/src/mm-port-qmi.h
@@ -82,4 +82,6 @@ QmiClient *mm_port_qmi_get_client (MMPortQmi *self,
QmiService service,
MMPortQmiFlag flag);
+gboolean mm_port_qmi_llp_is_raw_ip (MMPortQmi *self);
+
#endif /* MM_PORT_QMI_H */