summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2013-12-12 10:40:37 -0800
committerAleksander Morgado <aleksander@lanedo.com>2013-12-13 09:13:01 +0100
commit2eaaea2d73ec6eb9e4a3ae284eb895b838c1e306 (patch)
treea59125242272d14f1c3b3b141383279b3c865858
parentaf873f4041c29251df19216cc9411e6b3c0a783d (diff)
qmicli: add '--device-open-net' option
The device-open-net cmdline option allows you to specify network-mode and/or qos-header mode flags when opening the device. This has been found to be necessary on some cards/modes such as the MC7750 in LTE mode. Based on an original patch from: Tim Harvey <tharvey@gateworks.com>
-rw-r--r--src/qmicli/qmicli-helpers.c62
-rw-r--r--src/qmicli/qmicli-helpers.h3
-rw-r--r--src/qmicli/qmicli.c9
3 files changed, 73 insertions, 1 deletions
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 @@ qmicli_read_radio_interface_from_string (const gchar *str,
}
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_enable_disable_from_string (const gchar *str,
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 gboolean get_service_version_info_flag;
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 @@ static GOptionEntry main_entries[] = {
"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 @@ device_new_ready (GObject *unused,
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,