From 2eaaea2d73ec6eb9e4a3ae284eb895b838c1e306 Mon Sep 17 00:00:00 2001 From: Aleksander Morgado Date: Thu, 12 Dec 2013 10:40:37 -0800 Subject: 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 --- src/qmicli/qmicli-helpers.c | 62 +++++++++++++++++++++++++++++++++++++++++++++ src/qmicli/qmicli-helpers.h | 3 ++- src/qmicli/qmicli.c | 9 +++++++ 3 files changed, 73 insertions(+), 1 deletion(-) (limited to 'src/qmicli') diff --git a/src/qmicli/qmicli-helpers.c b/src/qmicli/qmicli-helpers.c index 10f654cc..b57ac68d 100644 --- a/src/qmicli/qmicli-helpers.c +++ b/src/qmicli/qmicli-helpers.c @@ -284,6 +284,68 @@ qmicli_read_radio_interface_from_string (const gchar *str, return !!enum_value; } +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 d33f4424..22ff3302 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 dc63c41f..949a4a07 100644 --- a/src/qmicli/qmicli.c +++ b/src/qmicli/qmicli.c @@ -32,6 +32,7 @@ #include #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, -- cgit v1.2.1