Merge remote-tracking branch 'cros/upstream' into 'cros/master'
diff --git a/NEWS b/NEWS
index 9eeb493..9a11142 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,23 @@
+
+Overview of changes in libqmi 1.8.0
+----------------------------------------
+
+This version comes with one small API break:
+* Enum value QMI_SERVICE_RMTFS is not 0x14, but 14. I doubt anyone has been hit
+  by this issue, anyway.
+
+Additional changes include:
+* Support for sharing the QMI port through multiple processes with the new
+  'qmi-proxy' infrastructure.
+* api: added new known service ID enumeration values
+* wds: added "Get Profile List" request/response
+* wds: added "Get Profile Settings" request/response
+* wds: added "Get Default Settings" request/response
+* cli: add --wds-get-profile-list
+* cli: add --wds-get-default-settings
+* man: added qmi-network manpage, autogenerated from --help-all
+
+
 Overview of changes in libqmi 1.6.0
 ----------------------------------------
 
diff --git a/configure.ac b/configure.ac
index 343126d..e000561 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3,7 +3,7 @@
 
 dnl The QMI version number
 m4_define([qmi_major_version], [1])
-m4_define([qmi_minor_version], [7])
+m4_define([qmi_minor_version], [9])
 m4_define([qmi_micro_version], [0])
 m4_define([qmi_version],
           [qmi_major_version.qmi_minor_version.qmi_micro_version])
@@ -16,9 +16,9 @@
 dnl            with old code), increment a.
 dnl        If the interface has changed in an incompatible way (that is,
 dnl            functions have changed or been removed), then zero a.
-m4_define([qmi_glib_lt_current],  [1])
+m4_define([qmi_glib_lt_current],  [2])
 m4_define([qmi_glib_lt_revision], [0])
-m4_define([qmi_glib_lt_age],      [0])
+m4_define([qmi_glib_lt_age],      [1])
 
 
 AC_INIT([libqmi], [qmi_version], [libqmi-devel@lists.freedesktop.org])
diff --git a/docs/reference/libqmi-glib/libqmi-glib-common.sections b/docs/reference/libqmi-glib/libqmi-glib-common.sections
index b6d6d09..a5c54ed 100644
--- a/docs/reference/libqmi-glib/libqmi-glib-common.sections
+++ b/docs/reference/libqmi-glib/libqmi-glib-common.sections
@@ -44,6 +44,9 @@
 QMI_DEVICE_FILE
 QMI_DEVICE_SIGNAL_INDICATION
 QmiDevice
+QmiDeviceOpenFlags
+QmiDeviceReleaseClientFlags
+QmiDeviceServiceVersionInfo
 qmi_device_new
 qmi_device_new_finish
 qmi_device_get_file
@@ -51,22 +54,21 @@
 qmi_device_get_path
 qmi_device_get_path_display
 qmi_device_is_open
-QmiDeviceOpenFlags
 qmi_device_open
 qmi_device_open_finish
 qmi_device_close
 qmi_device_allocate_client
 qmi_device_allocate_client_finish
-QmiDeviceReleaseClientFlags
 qmi_device_release_client
 qmi_device_release_client_finish
 qmi_device_set_instance_id
 qmi_device_set_instance_id_finish
 qmi_device_command
 qmi_device_command_finish
-QmiDeviceServiceVersionInfo
 qmi_device_get_service_version_info
 qmi_device_get_service_version_info_finish
+qmi_device_open_flags_build_string_from_mask
+qmi_device_release_client_flags_build_string_from_mask
 <SUBSECTION Standard>
 QmiDeviceClass
 QMI_DEVICE
@@ -75,8 +77,15 @@
 QMI_IS_DEVICE
 QMI_IS_DEVICE_CLASS
 QMI_TYPE_DEVICE
+QMI_TYPE_DEVICE_OPEN_FLAGS
+QMI_TYPE_DEVICE_RELEASE_CLIENT_FLAGS
 QmiDevicePrivate
 qmi_device_get_type
+qmi_device_open_flags_get_type
+qmi_device_release_client_flags_get_type
+<SUBSECTION Private>
+qmi_device_open_flags_get_string
+qmi_device_release_client_flags_get_string
 </SECTION>
 
 <SECTION>
diff --git a/src/libqmi-glib/generated/Makefile.am b/src/libqmi-glib/generated/Makefile.am
index 72a2dab..13a8827 100644
--- a/src/libqmi-glib/generated/Makefile.am
+++ b/src/libqmi-glib/generated/Makefile.am
@@ -73,10 +73,11 @@
 	$(top_srcdir)/src/libqmi-glib/qmi-enums-pds.h \
 	$(top_srcdir)/src/libqmi-glib/qmi-enums-pbm.h \
 	$(top_srcdir)/src/libqmi-glib/qmi-enums-uim.h \
-	$(top_srcdir)/src/libqmi-glib/qmi-enums-oma.h
+	$(top_srcdir)/src/libqmi-glib/qmi-enums-oma.h \
+	$(top_srcdir)/src/libqmi-glib/qmi-device.h
 qmi-enum-types.h:  $(ENUMS) $(top_srcdir)/build-aux/templates/qmi-enum-types-template.h
 	$(AM_V_GEN) $(GLIB_MKENUMS) \
-		--fhead "#ifndef __LIBQMI_GLIB_ENUM_TYPES_H__\n#define __LIBQMI_GLIB_ENUM_TYPES_H__\n#include \"qmi-enums.h\"\n#include \"qmi-enums-wds.h\"\n#include \"qmi-enums-dms.h\"\n#include \"qmi-enums-nas.h\"\n#include \"qmi-enums-wms.h\"\n#include \"qmi-enums-pds.h\"\n#include \"qmi-enums-pbm.h\"\n#include \"qmi-enums-uim.h\"\n#include \"qmi-enums-oma.h\"\n" \
+		--fhead "#ifndef __LIBQMI_GLIB_ENUM_TYPES_H__\n#define __LIBQMI_GLIB_ENUM_TYPES_H__\n#include \"qmi-enums.h\"\n#include \"qmi-enums-wds.h\"\n#include \"qmi-enums-dms.h\"\n#include \"qmi-enums-nas.h\"\n#include \"qmi-enums-wms.h\"\n#include \"qmi-enums-pds.h\"\n#include \"qmi-enums-pbm.h\"\n#include \"qmi-enums-uim.h\"\n#include \"qmi-enums-oma.h\"\n#include \"qmi-device.h\"\n" \
 		--template $(top_srcdir)/build-aux/templates/qmi-enum-types-template.h \
 		--ftail "#endif /* __LIBQMI_GLIB_ENUM_TYPES_H__ */\n" \
 		$(ENUMS) > $@
diff --git a/src/libqmi-glib/qmi-device.c b/src/libqmi-glib/qmi-device.c
index a1352aa..f744971 100644
--- a/src/libqmi-glib/qmi-device.c
+++ b/src/libqmi-glib/qmi-device.c
@@ -1018,12 +1018,23 @@
     ReleaseClientContext *ctx;
     QmiService service;
     guint8 cid;
+    gchar *flags_str;
 
     g_return_if_fail (QMI_IS_DEVICE (self));
     g_return_if_fail (QMI_IS_CLIENT (client));
 
+    cid = qmi_client_get_cid (client);
+    service = (guint8)qmi_client_get_service (client);
+
     /* The CTL client should not have been created out of the QmiDevice */
-    g_assert (qmi_client_get_service (client) != QMI_SERVICE_CTL);
+    g_return_if_fail (service != QMI_SERVICE_CTL);
+
+    flags_str = qmi_device_release_client_flags_build_string_from_mask (flags);
+    g_debug ("[%s] Releasing '%s' client with flags '%s'...",
+             self->priv->path_display,
+             qmi_service_get_string (service),
+             flags_str);
+    g_free (flags_str);
 
     /* NOTE! The operation must not take a reference to self, or we won't be
      * able to use it implicitly from our dispose() */
@@ -1035,9 +1046,6 @@
                                              user_data,
                                              qmi_device_release_client);
 
-    cid = qmi_client_get_cid (client);
-    service = (guint8)qmi_client_get_service (client);
-
     /* Do not try to release an already released client */
     if (cid == QMI_CID_NONE) {
         g_simple_async_result_set_error (ctx->result,
@@ -1969,6 +1977,7 @@
                  gpointer user_data)
 {
     DeviceOpenContext *ctx;
+    gchar *flags_str;
 
     /* Raw IP and 802.3 are mutually exclusive */
     g_return_if_fail (!((flags & QMI_DEVICE_OPEN_FLAGS_NET_802_3) &&
@@ -1984,6 +1993,12 @@
 
     g_return_if_fail (QMI_IS_DEVICE (self));
 
+    flags_str = qmi_device_open_flags_build_string_from_mask (flags);
+    g_debug ("[%s] Opening device with flags '%s'...",
+             self->priv->path_display,
+             flags_str);
+    g_free (flags_str);
+
     ctx = g_slice_new (DeviceOpenContext);
     ctx->self = g_object_ref (self);
     ctx->result = g_simple_async_result_new (G_OBJECT (self),
diff --git a/src/qmicli/qmicli-helpers.c b/src/qmicli/qmicli-helpers.c
index 10f654c..b57ac68 100644
--- a/src/qmicli/qmicli-helpers.c
+++ b/src/qmicli/qmicli-helpers.c
@@ -285,6 +285,68 @@
 }
 
 gboolean
+qmicli_read_net_open_flags_from_string (const gchar *str,
+                                        QmiDeviceOpenFlags *out)
+{
+    GType type;
+    GFlagsClass *flags_class;
+    GFlagsValue *flags_value;
+    gboolean success = TRUE, set = FALSE;
+    char **items, **iter;
+
+    type = qmi_device_open_flags_get_type ();
+    flags_class = G_FLAGS_CLASS (g_type_class_ref (type));
+
+    items = g_strsplit_set (str, "|", 0);
+    for (iter = items; iter && *iter && success; iter++) {
+        if (!*iter[0])
+            continue;
+
+        flags_value = g_flags_get_value_by_nick (flags_class, *iter);
+        if (flags_value) {
+            *out |= (QmiDeviceOpenFlags)flags_value->value;
+            set = TRUE;
+        } else {
+            g_printerr ("error: invalid net open flags value given: '%s'\n", *iter);
+            success = FALSE;
+        }
+    }
+
+    if (!set)
+        g_printerr ("error: invalid net open flags input given: '%s'\n", str);
+
+    if (items)
+        g_strfreev (items);
+
+    if (*out & QMI_DEVICE_OPEN_FLAGS_NET_802_3 &&
+        *out & QMI_DEVICE_OPEN_FLAGS_NET_RAW_IP) {
+        g_printerr ("error: cannot give both 802.3 and raw-IP options\n");
+        success = FALSE;
+    }
+
+    if (*out & QMI_DEVICE_OPEN_FLAGS_NET_QOS_HEADER &&
+        *out & QMI_DEVICE_OPEN_FLAGS_NET_NO_QOS_HEADER) {
+        g_printerr ("error: cannot request both QoS and no-QoS headers\n");
+        success = FALSE;
+    }
+
+    if ((*out & (QMI_DEVICE_OPEN_FLAGS_NET_802_3 | QMI_DEVICE_OPEN_FLAGS_NET_RAW_IP)) &&
+        !(*out & (QMI_DEVICE_OPEN_FLAGS_NET_QOS_HEADER | QMI_DEVICE_OPEN_FLAGS_NET_NO_QOS_HEADER))) {
+        g_printerr ("error: missing QoS or no-QoS header request\n");
+        success = FALSE;
+    }
+
+    if ((*out & (QMI_DEVICE_OPEN_FLAGS_NET_QOS_HEADER | QMI_DEVICE_OPEN_FLAGS_NET_NO_QOS_HEADER)) &&
+        !(*out & (QMI_DEVICE_OPEN_FLAGS_NET_802_3 | QMI_DEVICE_OPEN_FLAGS_NET_RAW_IP))) {
+        g_printerr ("error: missing link protocol (802.3 or raw IP)\n");
+        success = FALSE;
+    }
+
+    g_type_class_unref (flags_class);
+    return success && set;
+}
+
+gboolean
 qmicli_read_uint_from_string (const gchar *str,
                               guint *out)
 {
diff --git a/src/qmicli/qmicli-helpers.h b/src/qmicli/qmicli-helpers.h
index d33f442..22ff330 100644
--- a/src/qmicli/qmicli-helpers.h
+++ b/src/qmicli/qmicli-helpers.h
@@ -42,9 +42,10 @@
 gboolean qmicli_read_firmware_id_from_string    (const gchar *str,
                                                  QmiDmsFirmwareImageType *out_type,
                                                  guint *out_index);
-
 gboolean qmicli_read_radio_interface_from_string (const gchar *str,
                                                   QmiNasRadioInterface *out);
+gboolean qmicli_read_net_open_flags_from_string (const gchar *str,
+                                                 QmiDeviceOpenFlags *out);
 
 gboolean qmicli_read_non_empty_string           (const gchar *str,
                                                  const gchar *description,
diff --git a/src/qmicli/qmicli.c b/src/qmicli/qmicli.c
index dc63c41..949a4a0 100644
--- a/src/qmicli/qmicli.c
+++ b/src/qmicli/qmicli.c
@@ -32,6 +32,7 @@
 #include <libqmi-glib.h>
 
 #include "qmicli.h"
+#include "qmicli-helpers.h"
 
 #define PROGRAM_NAME    "qmicli"
 #define PROGRAM_VERSION PACKAGE_VERSION
@@ -50,6 +51,7 @@
 static gchar *device_set_instance_id_str;
 static gboolean device_open_version_info_flag;
 static gboolean device_open_sync_flag;
+static gchar *device_open_net_str;
 static gboolean device_open_proxy_flag;
 static gchar *client_cid_str;
 static gboolean client_no_release_cid_flag;
@@ -82,6 +84,10 @@
       "Request to use the 'qmi-proxy' proxy",
       NULL
     },
+    { "device-open-net", 0, 0, G_OPTION_ARG_STRING, &device_open_net_str,
+      "Open device with specific link protocol and QoS flags",
+      "[net-802-3|net-raw-ip|net-qos-header|net-no-qos-header]"
+    },
     { "client-cid", 0, 0, G_OPTION_ARG_STRING, &client_cid_str,
       "Use the given CID, don't allocate a new one",
       "[CID]"
@@ -481,6 +487,9 @@
         open_flags |= QMI_DEVICE_OPEN_FLAGS_SYNC;
     if (device_open_proxy_flag)
         open_flags |= QMI_DEVICE_OPEN_FLAGS_PROXY;
+    if (device_open_net_str)
+        if (!qmicli_read_net_open_flags_from_string (device_open_net_str, &open_flags))
+            exit (EXIT_FAILURE);
 
     /* Open the device */
     qmi_device_open (device,