summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2017-04-18 15:47:25 -0500
committerDan Williams <dcbw@redhat.com>2017-06-27 11:44:46 -0500
commit7ab5c713e4689eabcb88f8e0055f476170de3a66 (patch)
tree244519229ab54d45e1e79e5528fd00d655272692
parent895d9847e461cb03d9772a2a60f863f4265d1506 (diff)
downloadlibmbim-dcbw/atds.tar.gz
atds: add AT&T Device Service implemenatationdcbw/atds
See https://code.wireshark.org/review/gitweb?p=wireshark.git;a=blob;f=epan/dissectors/packet-mbim.c
-rw-r--r--data/Makefile.am3
-rw-r--r--data/mbim-service-atds.json147
-rw-r--r--docs/reference/libmbim-glib/Makefile.am3
-rw-r--r--docs/reference/libmbim-glib/libmbim-glib-common.sections17
-rw-r--r--docs/reference/libmbim-glib/libmbim-glib-docs.xml1
-rw-r--r--src/libmbim-glib/generated/Makefile.am18
-rw-r--r--src/libmbim-glib/libmbim-glib.h1
-rw-r--r--src/libmbim-glib/mbim-cid.c18
-rw-r--r--src/libmbim-glib/mbim-cid.h20
-rw-r--r--src/libmbim-glib/mbim-enums.h36
-rw-r--r--src/libmbim-glib/mbim-uuid.c13
-rw-r--r--src/libmbim-glib/mbim-uuid.h11
-rw-r--r--src/mbimcli/Makefile.am3
-rw-r--r--src/mbimcli/mbimcli-atds.c336
-rw-r--r--src/mbimcli/mbimcli.c8
-rw-r--r--src/mbimcli/mbimcli.h4
16 files changed, 633 insertions, 6 deletions
diff --git a/data/Makefile.am b/data/Makefile.am
index 8c8891a..e70ec6e 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -11,4 +11,5 @@ EXTRA_DIST = \
mbim-service-ms-firmware-id.json \
mbim-service-ms-host-shutdown.json \
mbim-service-proxy-control.json \
- mbim-service-qmi.json
+ mbim-service-qmi.json \
+ mbim-service-atds.json
diff --git a/data/mbim-service-atds.json b/data/mbim-service-atds.json
new file mode 100644
index 0000000..095d912
--- /dev/null
+++ b/data/mbim-service-atds.json
@@ -0,0 +1,147 @@
+[
+ // *********************************************************************************
+ { "type" : "Service",
+ "name" : "ATT Device Service" },
+
+ // *********************************************************************************
+ { "name" : "Signal",
+ "service" : "ATDS",
+ "type" : "Command",
+ "query" : [],
+ "response" : [
+ // 0-31: dBm = -113 + (2*rssi)
+ // 99: unknown/undetectable
+ { "name" : "Rssi",
+ "format" : "guint32" },
+
+ // 0: BER < 0.2%
+ // 1: 0.2% < BER < 0.4%
+ // 2: 0.4% < BER < 0.8%
+ // 3: 0.8% < BER < 1.6%
+ // 4: 1.6% < BER < 3.2%
+ // 5: 3.2% < BER < 6.4%
+ // 6: 6.4% < BER < 12.8%
+ // 7: 12.8% < BER
+ // 99: unknown/undetectable
+ { "name" : "ErrorRate",
+ "format" : "guint32" },
+
+ // 0: -120 or less dBm
+ // <96: dBm = -120+rscp
+ // 96: -24 or greater dBm
+ // 255: unknown/undetectable
+ { "name" : "Rscp",
+ "format" : "guint32" },
+
+ // 0: -24 or less dBm
+ // <49: dBm = -24 + ((float)ecno/2)
+ // 49: 0.5 or greater dBm
+ // 255: unknown/undetectable
+ { "name" : "Ecno",
+ "format" : "guint32" },
+
+ // 0: -19.5 or less dBm
+ // <34: dBm = -19.5 + ((float)rsrq/2)
+ // 34: -2.5 or greater dBm
+ // 255: unknown/undetectable
+ { "name" : "Rsrq",
+ "format" : "guint32" },
+
+ // 0: -140 or less dBm
+ // <97: dBm = -140 + rsrp
+ // 97: -43 or greater dBm
+ // 255: unknown/undetectable
+ { "name" : "Rsrp",
+ "format" : "guint32" },
+
+ // 0: -5 or less dB
+ // <35: dB = -5 + rssnr
+ // 35: 30 or greater dB
+ // 255: unknown/undetectable
+ { "name" : "Rssnr",
+ "format" : "guint32" } ] },
+
+ // *********************************************************************************
+ { "name" : "Location",
+ "service" : "ATDS",
+ "type" : "Command",
+ "query" : [],
+ "response" : [ { "name" : "Lac",
+ "format" : "guint32" },
+ { "name" : "Tac",
+ "format" : "guint32" },
+ { "name" : "CellId",
+ "format" : "guint32" } ] },
+
+ // *********************************************************************************
+ { "name" : "MbimAtdsProvider",
+ "type" : "Struct",
+ "contents" : [ { "name" : "ProviderId",
+ "format" : "string" },
+ { "name" : "ProviderState",
+ "format" : "guint32",
+ "public-format" : "MbimProviderState" },
+ { "name" : "ProviderName",
+ "format" : "string" },
+ { "name" : "PlmnMode",
+ "format" : "guint32",
+ "public-format" : "MbimAtdsProviderPlmnMode" },
+ { "name" : "Rssi",
+ "format" : "guint32" },
+ { "name" : "ErrorRate",
+ "format" : "guint32" } ] },
+
+ { "name" : "Operators",
+ "service" : "ATDS",
+ "type" : "Command",
+ "query" : [],
+ "response" : [ { "name" : "ProvidersCount",
+ "format" : "guint32" },
+ { "name" : "Providers",
+ "format" : "ref-struct-array" ,
+ "struct-type" : "MbimAtdsProvider",
+ "array-size-field" : "ProvidersCount" } ] },
+
+ // *********************************************************************************
+ { "name" : "RAT",
+ "service" : "ATDS",
+ "type" : "Command",
+ "set" : [ { "name" : "Mode",
+ "format" : "guint32",
+ "public-format" : "MbimAtdsRatMode" } ],
+ "query" : [],
+ "response" : [ { "name" : "Mode",
+ "format" : "guint32",
+ "public-format" : "MbimAtdsRatMode" } ] },
+
+ // *********************************************************************************
+ { "name" : "Register State",
+ "service" : "ATDS",
+ "type" : "Command",
+ "query" : [],
+ "response" : [ { "name" : "NwError",
+ "format" : "guint32",
+ "public-format" : "MbimNwError" },
+ { "name" : "RegisterState",
+ "format" : "guint32",
+ "public-format" : "MbimRegisterState" },
+ { "name" : "RegisterMode",
+ "format" : "guint32",
+ "public-format" : "MbimRegisterMode" },
+ { "name" : "AvailableDataClasses",
+ "format" : "guint32",
+ "public-format" : "MbimDataClass" },
+ { "name" : "CurrentCellularClass",
+ "format" : "guint32",
+ "public-format" : "MbimCellularClass" },
+ { "name" : "ProviderId",
+ "format" : "string" },
+ { "name" : "ProviderName",
+ "format" : "string" },
+ { "name" : "RoamingText",
+ "format" : "string" },
+ { "name" : "RegistrationFlag",
+ "format" : "guint32",
+ "public-format" : "MbimRegistrationFlag" } ] }
+
+]
diff --git a/docs/reference/libmbim-glib/Makefile.am b/docs/reference/libmbim-glib/Makefile.am
index 8c5328c..0e219ca 100644
--- a/docs/reference/libmbim-glib/Makefile.am
+++ b/docs/reference/libmbim-glib/Makefile.am
@@ -17,7 +17,8 @@ ALL_SECTIONS = \
$(top_builddir)/src/libmbim-glib/generated/mbim-dss.sections \
$(top_builddir)/src/libmbim-glib/generated/mbim-ms-firmware-id.sections \
$(top_builddir)/src/libmbim-glib/generated/mbim-ms-host-shutdown.sections \
- $(top_builddir)/src/libmbim-glib/generated/mbim-qmi.sections
+ $(top_builddir)/src/libmbim-glib/generated/mbim-qmi.sections \
+ $(top_builddir)/src/libmbim-glib/generated/mbim-atds.sections
$(DOC_MODULE)-sections.mstamp: $(ALL_SECTIONS)
$(AM_V_GEN) \
diff --git a/docs/reference/libmbim-glib/libmbim-glib-common.sections b/docs/reference/libmbim-glib/libmbim-glib-common.sections
index ddc754a..a4c3120 100644
--- a/docs/reference/libmbim-glib/libmbim-glib-common.sections
+++ b/docs/reference/libmbim-glib/libmbim-glib-common.sections
@@ -13,6 +13,7 @@ MbimService
MbimContextType
MbimUuid
MBIM_UUID_INVALID
+MBIM_UUID_ATDS
MBIM_UUID_BASIC_CONNECT
MBIM_UUID_SMS
MBIM_UUID_USSD
@@ -46,6 +47,7 @@ mbim_context_type_build_string_from_mask
<SECTION>
<FILE>mbim-cid</FILE>
+MbimCidAtds
MbimCidBasicConnect
MbimCidSms
MbimCidUssd
@@ -62,6 +64,7 @@ mbim_cid_can_set
mbim_cid_can_query
mbim_cid_can_notify
mbim_cid_get_printable
+mbim_cid_atds_get_string
mbim_cid_basic_connect_get_string
mbim_cid_sms_get_string
mbim_cid_ussd_get_string
@@ -74,6 +77,7 @@ mbim_cid_ms_host_shutdown_get_string
mbim_cid_proxy_control_get_string
mbim_cid_qmi_get_string
<SUBSECTION Private>
+mbim_cid_atds_build_string_from_mask
mbim_cid_basic_connect_build_string_from_mask
mbim_cid_sms_build_string_from_mask
mbim_cid_ussd_build_string_from_mask
@@ -86,6 +90,7 @@ mbim_cid_ms_host_shutdown_build_string_from_mask
mbim_cid_proxy_control_build_string_from_mask
mbim_cid_qmi_build_string_from_mask
<SUBSECTION Standard>
+MBIM_TYPE_CID_ATDS
MBIM_TYPE_CID_AUTH
MBIM_TYPE_CID_BASIC_CONNECT
MBIM_TYPE_CID_DSS
@@ -97,6 +102,7 @@ MBIM_TYPE_CID_MS_FIRMWARE_ID
MBIM_TYPE_CID_MS_HOST_SHUTDOWN
MBIM_TYPE_CID_PROXY_CONTROL
MBIM_TYPE_CID_QMI
+mbim_cid_atds_get_type
mbim_cid_auth_get_type
mbim_cid_basic_connect_get_type
mbim_cid_dss_get_type
@@ -245,6 +251,9 @@ mbim_proxy_get_type
<SECTION>
<FILE>mbim-enums</FILE>
+MbimAtdsProvider
+MbimAtdsProviderPlmnMode
+MbimAtdsRatMode
MbimDeviceType
MbimCellularClass
MbimVoiceClass
@@ -343,6 +352,8 @@ mbim_stk_pac_type_get_string
mbim_network_idle_hint_state_get_string
mbim_emergency_mode_state_get_string
mbim_dss_link_state_get_string
+mbim_atds_provider_plmn_mode_get_string
+mbim_atds_rat_mode_get_string
<SUBSECTION Private>
mbim_device_type_build_string_from_mask
mbim_cellular_class_get_string
@@ -394,9 +405,13 @@ mbim_stk_pac_type_build_string_from_mask
mbim_network_idle_hint_state_build_string_from_mask
mbim_emergency_mode_state_build_string_from_mask
mbim_dss_link_state_build_string_from_mask
+mbim_atds_provider_plmn_mode_build_string_from_mask
+mbim_atds_rat_mode_build_string_from_mask
<SUBSECTION Standard>
MBIM_TYPE_ACTIVATION_COMMAND
MBIM_TYPE_ACTIVATION_STATE
+MBIM_TYPE_ATDS_PROVIDER_PLMN_MODE
+MBIM_TYPE_ATDS_RAT_MODE
MBIM_TYPE_AUTH_PROTOCOL
MBIM_TYPE_CELLULAR_CLASS
MBIM_TYPE_COMPRESSION
@@ -501,6 +516,8 @@ mbim_stk_pac_type_get_type
mbim_network_idle_hint_state_get_type
mbim_emergency_mode_state_get_type
mbim_dss_link_state_get_type
+mbim_atds_provider_plmn_mode_get_type
+mbim_atds_rat_mode_get_type
</SECTION>
<SECTION>
diff --git a/docs/reference/libmbim-glib/libmbim-glib-docs.xml b/docs/reference/libmbim-glib/libmbim-glib-docs.xml
index 81bad35..8ad35c2 100644
--- a/docs/reference/libmbim-glib/libmbim-glib-docs.xml
+++ b/docs/reference/libmbim-glib/libmbim-glib-docs.xml
@@ -70,6 +70,7 @@
<xi:include href="xml/mbim-ms-firmware-id.xml"/>
<xi:include href="xml/mbim-ms-host-shutdown.xml"/>
<xi:include href="xml/mbim-qmi.xml"/>
+ <xi:include href="xml/mbim-att-device-service.xml"/>
</chapter>
<chapter>
diff --git a/src/libmbim-glib/generated/Makefile.am b/src/libmbim-glib/generated/Makefile.am
index c8b153a..b0722a0 100644
--- a/src/libmbim-glib/generated/Makefile.am
+++ b/src/libmbim-glib/generated/Makefile.am
@@ -13,7 +13,8 @@ GENERATED_H = \
mbim-ms-firmware-id.h \
mbim-ms-host-shutdown.h \
mbim-proxy-control.h \
- mbim-qmi.h
+ mbim-qmi.h \
+ mbim-atds.h
GENERATED_C = \
mbim-error-types.c \
@@ -29,7 +30,8 @@ GENERATED_C = \
mbim-ms-firmware-id.c \
mbim-ms-host-shutdown.c \
mbim-proxy-control.c \
- mbim-qmi.c
+ mbim-qmi.c \
+ mbim-atds.c
GENERATED_SECTIONS = \
mbim-basic-connect.sections \
@@ -42,7 +44,8 @@ GENERATED_SECTIONS = \
mbim-ms-firmware-id.sections \
mbim-ms-host-shutdown.sections \
mbim-proxy-control.sections \
- mbim-qmi.sections
+ mbim-qmi.sections \
+ mbim-atds.sections
# Error types
mbim-error-types.h: $(top_srcdir)/src/libmbim-glib/mbim-errors.h $(top_srcdir)/build-aux/templates/mbim-error-types-template.h
@@ -182,6 +185,15 @@ mbim-qmi.h mbim-qmi.c mbim-qmi.sections: $(top_srcdir)/data/mbim-service-qmi.jso
--input $(top_srcdir)/data/mbim-service-qmi.json \
--output mbim-qmi
+# ATT Device service
+mbim-atds.h mbim-atds.c mbim-atds.sections: $(top_srcdir)/data/mbim-service-atds.json $(top_srcdir)/build-aux/mbim-codegen/*.py $(top_srcdir)/build-aux/mbim-codegen/mbim-codegen
+ $(AM_V_GEN) \
+ rm -f mbim-atds.h && \
+ rm -f mbim-atds.c && \
+ $(top_srcdir)/build-aux/mbim-codegen/mbim-codegen \
+ --input $(top_srcdir)/data/mbim-service-atds.json \
+ --output mbim-atds
+
BUILT_SOURCES = $(GENERATED_H) $(GENERATED_C)
nodist_libmbim_glib_generated_la_SOURCES = \
diff --git a/src/libmbim-glib/libmbim-glib.h b/src/libmbim-glib/libmbim-glib.h
index 88d0be8..1b82de5 100644
--- a/src/libmbim-glib/libmbim-glib.h
+++ b/src/libmbim-glib/libmbim-glib.h
@@ -49,6 +49,7 @@
#include "mbim-ms-firmware-id.h"
#include "mbim-ms-host-shutdown.h"
#include "mbim-qmi.h"
+#include "mbim-atds.h"
/* backwards compatibility */
#include "mbim-compat.h"
diff --git a/src/libmbim-glib/mbim-cid.c b/src/libmbim-glib/mbim-cid.c
index 8b47c5e..4f3cc7c 100644
--- a/src/libmbim-glib/mbim-cid.c
+++ b/src/libmbim-glib/mbim-cid.c
@@ -147,6 +147,16 @@ static const CidConfig cid_qmi_config [MBIM_CID_QMI_LAST] = {
{ SET, NO_QUERY, NO_NOTIFY }, /* MBIM_CID_QMI_MSG */
};
+/* Note: index of the array is CID-1 */
+#define MBIM_CID_ATDS_LAST MBIM_CID_ATDS_REGISTER_STATE
+static const CidConfig cid_atds_config [MBIM_CID_ATDS_LAST] = {
+ { NO_SET, QUERY, NO_NOTIFY }, /* MBIM_CID_ATDS_SIGNAL */
+ { NO_SET, QUERY, NO_NOTIFY }, /* MBIM_CID_ATDS_LOCATION */
+ { SET, QUERY, NO_NOTIFY }, /* MBIM_CID_ATDS_OPERATORS */
+ { SET, QUERY, NO_NOTIFY }, /* MBIM_CID_ATDS_RAT */
+ { NO_SET, QUERY, NO_NOTIFY }, /* MBIM_CID_ATDS_REGISTER_STATE */
+};
+
/**
* mbim_cid_can_set:
* @service: a #MbimService.
@@ -189,6 +199,8 @@ mbim_cid_can_set (MbimService service,
return cid_proxy_control_config[cid - 1].set;
case MBIM_SERVICE_QMI:
return cid_qmi_config[cid - 1].set;
+ case MBIM_SERVICE_ATDS:
+ return cid_atds_config[cid - 1].set;
default:
g_assert_not_reached ();
return FALSE;
@@ -237,6 +249,8 @@ mbim_cid_can_query (MbimService service,
return cid_proxy_control_config[cid - 1].query;
case MBIM_SERVICE_QMI:
return cid_qmi_config[cid - 1].query;
+ case MBIM_SERVICE_ATDS:
+ return cid_atds_config[cid - 1].query;
default:
g_assert_not_reached ();
return FALSE;
@@ -285,6 +299,8 @@ mbim_cid_can_notify (MbimService service,
return cid_proxy_control_config[cid - 1].notify;
case MBIM_SERVICE_QMI:
return cid_qmi_config[cid - 1].notify;
+ case MBIM_SERVICE_ATDS:
+ return cid_atds_config[cid - 1].notify;
default:
g_assert_not_reached ();
return FALSE;
@@ -336,6 +352,8 @@ mbim_cid_get_printable (MbimService service,
return mbim_cid_proxy_control_get_string (cid);
case MBIM_SERVICE_QMI:
return mbim_cid_qmi_get_string (cid);
+ case MBIM_SERVICE_ATDS:
+ return mbim_cid_atds_get_string (cid);
default:
g_assert_not_reached ();
return NULL;
diff --git a/src/libmbim-glib/mbim-cid.h b/src/libmbim-glib/mbim-cid.h
index da837a4..d85d201 100644
--- a/src/libmbim-glib/mbim-cid.h
+++ b/src/libmbim-glib/mbim-cid.h
@@ -231,6 +231,26 @@ typedef enum {
MBIM_CID_QMI_MSG = 1
} MbimCidQmi;
+/**
+ * MbimCidAtds:
+ * @MBIM_CID_ATDS_UNKNOWN: Unknown command.
+ * @MBIM_CID_ATDS_SIGNAL: Radio signal information.
+ * @MBIM_CID_ATDS_LOCATION: Cell location information.
+ * @MBIM_CID_ATDS_OPERATORS: Operator selection.
+ * @MBIM_CID_ATDS_RAT: Radio Access Technology selection.
+ * @MBIM_CID_ATDS_REGISTER_STATE: Registration state.
+ *
+ * MBIM commands in the %MBIM_SERVICE_ATDS service.
+ */
+typedef enum {
+ MBIM_CID_ATDS_UNKNOWN = 0,
+ MBIM_CID_ATDS_SIGNAL = 1,
+ MBIM_CID_ATDS_LOCATION = 2,
+ MBIM_CID_ATDS_OPERATORS = 3,
+ MBIM_CID_ATDS_RAT = 4,
+ MBIM_CID_ATDS_REGISTER_STATE = 9,
+} MbimCidAtds;
+
/* Command helpers */
gboolean mbim_cid_can_set (MbimService service,
diff --git a/src/libmbim-glib/mbim-enums.h b/src/libmbim-glib/mbim-enums.h
index 43eef6a..d3d4fbc 100644
--- a/src/libmbim-glib/mbim-enums.h
+++ b/src/libmbim-glib/mbim-enums.h
@@ -964,6 +964,42 @@ typedef enum {
MBIM_DSS_LINK_STATE_ACTIVATE = 1
} MbimDssLinkState;
+/*****************************************************************************/
+/* 'ATDS RAT' enums */
+
+/**
+ * MbimAtdsRatMode:
+ * @MBIM_ATDS_RAT_MODE_AUTOMATIC: Automatic.
+ * @MBIM_ATDS_RAT_MODE_2G_ONLY: 2G only.
+ * @MBIM_ATDS_RAT_MODE_3G_ONLY: 3G only.
+ * @MBIM_ATDS_RAT_MODE_4G_ONLY: 4G only.
+ *
+ * RAT mode preferences.
+ */
+typedef enum {
+ MBIM_ATDS_RAT_MODE_AUTOMATIC = 0,
+ MBIM_ATDS_RAT_MODE_2G_ONLY = 1,
+ MBIM_ATDS_RAT_MODE_3G_ONLY = 2,
+ MBIM_ATDS_RAT_MODE_4G_ONLY = 3,
+} MbimAtdsRatMode;
+
+/*****************************************************************************/
+/* 'ATDS Operators' enums */
+
+/**
+ * MbimAtdsProviderPlmnMode:
+ * @MBIM_ATDS_PROVIDER_PLMN_MODE_GSM: GSM.
+ * @MBIM_ATDS_PROVIDER_PLMN_MODE_UTRAN: UTRAN (UMTS).
+ * @MBIM_ATDS_PROVIDER_PLMN_MODE_LTE: LTE.
+ *
+ * Provider PLMN mode.
+ */
+typedef enum {
+ MBIM_ATDS_PROVIDER_PLMN_MODE_GSM = 0,
+ MBIM_ATDS_PROVIDER_PLMN_MODE_UTRAN = 6,
+ MBIM_ATDS_PROVIDER_PLMN_MODE_LTE = 7,
+} MbimAtdsProviderPlmnMode;
+
G_END_DECLS
#endif /* _LIBMBIM_GLIB_MBIM_ENUMS_H_ */
diff --git a/src/libmbim-glib/mbim-uuid.c b/src/libmbim-glib/mbim-uuid.c
index 72eed89..4cb9a20 100644
--- a/src/libmbim-glib/mbim-uuid.c
+++ b/src/libmbim-glib/mbim-uuid.c
@@ -236,6 +236,14 @@ static const MbimUuid uuid_qmi = {
.e = { 0xc7, 0xe2 , 0x4f, 0xb0, 0xf0, 0xd3 }
};
+static const MbimUuid uuid_atds = {
+ .a = { 0x59, 0x67, 0xbd, 0xcc },
+ .b = { 0x7f, 0xd2 },
+ .c = { 0x49, 0xa2 },
+ .d = { 0x9f, 0x5c },
+ .e = { 0xb2, 0xe7, 0x0e, 0x52, 0x7d, 0xb3 }
+};
+
static GList *mbim_custom_service_list = NULL;
typedef struct {
@@ -403,6 +411,8 @@ mbim_uuid_from_service (MbimService service)
return &uuid_proxy_control;
case MBIM_SERVICE_QMI:
return &uuid_qmi;
+ case MBIM_SERVICE_ATDS:
+ return &uuid_atds;
default:
for (l = mbim_custom_service_list; l != NULL; l = l->next) {
if (service == ((MbimCustomService *)l->data)->service_id)
@@ -458,6 +468,9 @@ mbim_uuid_to_service (const MbimUuid *uuid)
if (mbim_uuid_cmp (uuid, &uuid_qmi))
return MBIM_SERVICE_QMI;
+ if (mbim_uuid_cmp (uuid, &uuid_atds))
+ return MBIM_SERVICE_ATDS;
+
for (l = mbim_custom_service_list; l != NULL; l = l->next) {
if (mbim_uuid_cmp (&((MbimCustomService *)l->data)->uuid, uuid))
return ((MbimCustomService *)l->data)->service_id;
diff --git a/src/libmbim-glib/mbim-uuid.h b/src/libmbim-glib/mbim-uuid.h
index eeb9e11..9a19ebe 100644
--- a/src/libmbim-glib/mbim-uuid.h
+++ b/src/libmbim-glib/mbim-uuid.h
@@ -72,6 +72,7 @@ gboolean mbim_uuid_from_printable (const gchar *str,
* @MBIM_SERVICE_MS_HOST_SHUTDOWN: Microsoft Host Shutdown service.
* @MBIM_SERVICE_PROXY_CONTROL: Proxy Control service.
* @MBIM_SERVICE_QMI: QMI-over-MBIM service.
+ * @MBIM_SERVICE_ATDS: ATT Device service.
*
* Enumeration of the generic MBIM services.
*/
@@ -88,6 +89,7 @@ typedef enum {
MBIM_SERVICE_MS_HOST_SHUTDOWN = 9,
MBIM_SERVICE_PROXY_CONTROL = 10,
MBIM_SERVICE_QMI = 11,
+ MBIM_SERVICE_ATDS = 12,
#if defined LIBMBIM_GLIB_COMPILATION
MBIM_SERVICE_LAST /*< skip >*/
#endif
@@ -201,6 +203,15 @@ typedef enum {
*/
#define MBIM_UUID_QMI mbim_uuid_from_service (MBIM_SERVICE_QMI)
+/**
+ * MBIM_UUID_ATDS:
+ *
+ * Get the UUID of the %MBIM_SERVICE_ATDS service.
+ *
+ * Returns: (transfer none): a #MbimUuid.
+ */
+#define MBIM_UUID_ATDS mbim_uuid_from_service (MBIM_SERVICE_ATDS)
+
const gchar *mbim_service_lookup_name (guint service);
guint mbim_register_custom_service (const MbimUuid *uuid,
diff --git a/src/mbimcli/Makefile.am b/src/mbimcli/Makefile.am
index 4d77ebd..8e41a8a 100644
--- a/src/mbimcli/Makefile.am
+++ b/src/mbimcli/Makefile.am
@@ -16,7 +16,8 @@ mbimcli_SOURCES = \
mbimcli-phonebook.c \
mbimcli-dss.c \
mbimcli-ms-firmware-id.c \
- mbimcli-ms-host-shutdown.c
+ mbimcli-ms-host-shutdown.c \
+ mbimcli-atds.c
mbimcli_LDADD = \
$(MBIMCLI_LIBS) \
diff --git a/src/mbimcli/mbimcli-atds.c b/src/mbimcli/mbimcli-atds.c
new file mode 100644
index 0000000..fb1e947
--- /dev/null
+++ b/src/mbimcli/mbimcli-atds.c
@@ -0,0 +1,336 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * mbimcli -- Command line interface to control MBIM devices
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Copyright (C) 2017 Red Hat, Inc.
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <locale.h>
+#include <string.h>
+
+#include <glib.h>
+#include <gio/gio.h>
+
+#include <libmbim-glib.h>
+
+#include "mbimcli.h"
+
+/* Context */
+typedef struct {
+ MbimDevice *device;
+ GCancellable *cancellable;
+} Context;
+static Context *ctx;
+
+/* Options */
+static gboolean query_signal_flag;
+static gboolean query_location_flag;
+
+static GOptionEntry entries[] = {
+ { "atds-signal", 0, 0, G_OPTION_ARG_NONE, &query_signal_flag,
+ "Query signal info",
+ NULL
+ },
+ { "atds-location", 0, 0, G_OPTION_ARG_NONE, &query_location_flag,
+ "Query cell location",
+ NULL
+ },
+ { NULL }
+};
+
+GOptionGroup *
+mbimcli_atds_get_option_group (void)
+{
+ GOptionGroup *group;
+
+ group = g_option_group_new ("atds",
+ "AT&T Device Service options",
+ "Show AT&T Device Service options",
+ NULL,
+ NULL);
+ g_option_group_add_entries (group, entries);
+
+ return group;
+}
+
+gboolean
+mbimcli_atds_options_enabled (void)
+{
+ static guint n_actions = 0;
+ static gboolean checked = FALSE;
+
+ if (checked)
+ return !!n_actions;
+
+ n_actions = (query_signal_flag +
+ query_location_flag);
+
+ if (n_actions > 1) {
+ g_printerr ("error: too many AT&T Device Service actions requested\n");
+ exit (EXIT_FAILURE);
+ }
+
+ checked = TRUE;
+ return !!n_actions;
+}
+
+static void
+context_free (Context *context)
+{
+ if (!context)
+ return;
+
+ if (context->cancellable)
+ g_object_unref (context->cancellable);
+ if (context->device)
+ g_object_unref (context->device);
+ g_slice_free (Context, context);
+}
+
+static void
+shutdown (gboolean operation_status)
+{
+ /* Cleanup context and finish async operation */
+ context_free (ctx);
+ mbimcli_async_operation_done (operation_status);
+}
+
+static void
+query_signal_ready (MbimDevice *device,
+ GAsyncResult *res)
+{
+ MbimMessage *response;
+ GError *error = NULL;
+ guint32 rssi = 0, error_rate = 0, rscp = 0, ecno = 0, rsrq = 0, rsrp = 0, rssnr = 0;
+ gchar *rssi_str = NULL;
+ gchar *error_rate_str = NULL;
+ gchar *rscp_str = NULL;
+ gchar *ecno_str = NULL;
+ gchar *rsrq_str = NULL;
+ gchar *rsrp_str = NULL;
+ gchar *rssnr_str = NULL;
+
+ response = mbim_device_command_finish (device, res, &error);
+ if (!response || !mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error)) {
+ g_printerr ("error: operation failed: %s\n", error->message);
+ g_error_free (error);
+ if (response)
+ mbim_message_unref (response);
+ shutdown (FALSE);
+ return;
+ }
+
+ if (!mbim_message_atds_signal_response_parse (
+ response,
+ &rssi,
+ &error_rate,
+ &rscp,
+ &ecno,
+ &rsrq,
+ &rsrp,
+ &rssnr,
+ &error)) {
+ g_printerr ("error: couldn't parse response message: %s\n", error->message);
+ g_error_free (error);
+ shutdown (FALSE);
+ return;
+ }
+
+ if (rssi <= 31)
+ rssi_str = g_strdup_printf ("%d dBm", -113 + (2 * rssi));
+
+ switch (error_rate) {
+ case 0:
+ error_rate_str = g_strdup_printf ("< 0.2%%");
+ break;
+ case 1:
+ error_rate_str = g_strdup_printf ("0.2%% - 0.39%%");
+ break;
+ case 2:
+ error_rate_str = g_strdup_printf ("0.4%% - 0.79%%");
+ break;
+ case 3:
+ error_rate_str = g_strdup_printf ("0.8%% - 1.59%%");
+ break;
+ case 4:
+ error_rate_str = g_strdup_printf ("1.6%% - 3.19%%");
+ break;
+ case 5:
+ error_rate_str = g_strdup_printf ("3.2%% - 6.39%%");
+ break;
+ case 6:
+ error_rate_str = g_strdup_printf ("6.4%% - 12.79%%");
+ break;
+ case 7:
+ error_rate_str = g_strdup_printf ("> 12.8%%");
+ break;
+ }
+
+ if (rscp == 0)
+ rscp_str = g_strdup_printf ("< -120 dBm");
+ else if (rscp < 96)
+ rscp_str = g_strdup_printf ("%d dBm", -120 + rscp);
+ else if (rscp == 96)
+ rscp_str = g_strdup_printf (">= -24 dBm");
+
+ if (ecno == 0)
+ ecno_str = g_strdup_printf ("< -24 dBm");
+ else if (ecno < 49)
+ ecno_str = g_strdup_printf ("%.2f dBm", -24.0 + ((float) ecno / 2));
+ else if (ecno == 49)
+ ecno_str = g_strdup_printf (">= 0.5 dBm");
+
+ if (rsrq == 0)
+ rsrq_str = g_strdup_printf ("< -19.5 dBm");
+ else if (rsrq < 34)
+ rsrq_str = g_strdup_printf ("%.2f dBm", -19.5 + ((float) rsrq / 2));
+ else if (rsrq == 34)
+ rsrq_str = g_strdup_printf (">= -2.5 dBm");
+
+ if (rsrp == 0)
+ rsrp_str = g_strdup_printf ("< -140 dBm");
+ else if (rsrp < 97)
+ rsrp_str = g_strdup_printf ("%d dBm", -140 + rsrp);
+ else if (rsrp == 97)
+ rsrp_str = g_strdup_printf (">= -43 dBm");
+
+ if (rssnr == 0)
+ rssnr_str = g_strdup_printf ("< -5 dB");
+ else if (rssnr < 97)
+ rssnr_str = g_strdup_printf ("%d dB", -5 + rssnr);
+ else if (rsrp == 97)
+ rssnr_str = g_strdup_printf (">= 30 dB");
+
+ g_print ("[%s] Signal info retrieved:\n"
+ "\t RSSI: %s\n"
+ "\t BER: %s\n"
+ "\t RSCP: %s\n"
+ "\t Ec/No: %s\n"
+ "\t RSRQ: %s\n"
+ "\t RSRP: %s\n"
+ "\t RSSNR: %s\n",
+ mbim_device_get_path_display (device),
+ VALIDATE_UNKNOWN (rssi_str),
+ VALIDATE_UNKNOWN (error_rate_str),
+ VALIDATE_UNKNOWN (rscp_str),
+ VALIDATE_UNKNOWN (ecno_str),
+ VALIDATE_UNKNOWN (rsrq_str),
+ VALIDATE_UNKNOWN (rsrp_str),
+ VALIDATE_UNKNOWN (rssnr_str));
+
+ g_free (rssi_str);
+ g_free (error_rate_str);
+ g_free (rscp_str);
+ g_free (ecno_str);
+ g_free (rsrq_str);
+ g_free (rsrp_str);
+ g_free (rssnr_str);
+
+ mbim_message_unref (response);
+ shutdown (TRUE);
+}
+
+static void
+query_location_ready (MbimDevice *device,
+ GAsyncResult *res)
+{
+ MbimMessage *response;
+ GError *error = NULL;
+ guint32 lac = 0, tac = 0, cellid = 0;
+
+ response = mbim_device_command_finish (device, res, &error);
+ if (!response || !mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error)) {
+ g_printerr ("error: operation failed: %s\n", error->message);
+ g_error_free (error);
+ if (response)
+ mbim_message_unref (response);
+ shutdown (FALSE);
+ return;
+ }
+
+ if (!mbim_message_atds_location_response_parse (
+ response,
+ &lac,
+ &tac,
+ &cellid,
+ &error)) {
+ g_printerr ("error: couldn't parse response message: %s\n", error->message);
+ g_error_free (error);
+ shutdown (FALSE);
+ return;
+ }
+
+ g_print ("[%s] Cell location retrieved:\n"
+ "\t LAC: %04x\n"
+ "\t TAC: %04x\n"
+ "\t Cell ID: %04x\n",
+ mbim_device_get_path_display (device),
+ lac,
+ tac,
+ cellid);
+
+ mbim_message_unref (response);
+ shutdown (TRUE);
+}
+
+void
+mbimcli_atds_run (MbimDevice *device,
+ GCancellable *cancellable)
+{
+ /* Initialize context */
+ ctx = g_slice_new (Context);
+ ctx->device = g_object_ref (device);
+ if (cancellable)
+ ctx->cancellable = g_object_ref (cancellable);
+
+ /* Request to get signal info? */
+ if (query_signal_flag) {
+ MbimMessage *request;
+
+ g_debug ("Asynchronously querying signal info...");
+ request = (mbim_message_atds_signal_query_new (NULL));
+ mbim_device_command (ctx->device,
+ request,
+ 10,
+ ctx->cancellable,
+ (GAsyncReadyCallback)query_signal_ready,
+ NULL);
+ mbim_message_unref (request);
+ return;
+ }
+
+ /* Request to get cell location? */
+ if (query_location_flag) {
+ MbimMessage *request;
+
+ g_debug ("Asynchronously querying cell location...");
+ request = (mbim_message_atds_location_query_new (NULL));
+ mbim_device_command (ctx->device,
+ request,
+ 10,
+ ctx->cancellable,
+ (GAsyncReadyCallback)query_location_ready,
+ NULL);
+ mbim_message_unref (request);
+ return;
+ }
+
+ g_warn_if_reached ();
+}
diff --git a/src/mbimcli/mbimcli.c b/src/mbimcli/mbimcli.c
index 76183fd..27bb634 100644
--- a/src/mbimcli/mbimcli.c
+++ b/src/mbimcli/mbimcli.c
@@ -272,6 +272,9 @@ device_open_ready (MbimDevice *dev,
case MBIM_SERVICE_MS_HOST_SHUTDOWN:
mbimcli_ms_host_shutdown_run (dev, cancellable);
return;
+ case MBIM_SERVICE_ATDS:
+ mbimcli_atds_run (dev, cancellable);
+ return;
default:
g_assert_not_reached ();
}
@@ -343,6 +346,9 @@ parse_actions (void)
} else if (mbimcli_ms_host_shutdown_options_enabled ()) {
service = MBIM_SERVICE_MS_HOST_SHUTDOWN;
actions_enabled++;
+ } else if (mbimcli_atds_options_enabled ()) {
+ service = MBIM_SERVICE_ATDS;
+ actions_enabled++;
}
/* Noop */
@@ -384,6 +390,8 @@ int main (int argc, char **argv)
mbimcli_ms_firmware_id_get_option_group ());
g_option_context_add_group (context,
mbimcli_ms_host_shutdown_get_option_group ());
+ g_option_context_add_group (context,
+ mbimcli_atds_get_option_group ());
g_option_context_add_main_entries (context, main_entries, NULL);
if (!g_option_context_parse (context, &argc, &argv, &error)) {
g_printerr ("error: %s\n",
diff --git a/src/mbimcli/mbimcli.h b/src/mbimcli/mbimcli.h
index e242d1a..02a1b78 100644
--- a/src/mbimcli/mbimcli.h
+++ b/src/mbimcli/mbimcli.h
@@ -34,12 +34,14 @@ GOptionGroup *mbimcli_phonebook_get_option_group (void);
GOptionGroup *mbimcli_dss_get_option_group (void);
GOptionGroup *mbimcli_ms_firmware_id_get_option_group (void);
GOptionGroup *mbimcli_ms_host_shutdown_get_option_group (void);
+GOptionGroup *mbimcli_atds_get_option_group (void);
gboolean mbimcli_basic_connect_options_enabled (void);
gboolean mbimcli_phonebook_options_enabled (void);
gboolean mbimcli_dss_options_enabled (void);
gboolean mbimcli_ms_firmware_id_options_enabled (void);
gboolean mbimcli_ms_host_shutdown_options_enabled (void);
+gboolean mbimcli_atds_options_enabled (void);
void mbimcli_basic_connect_run (MbimDevice *device,
GCancellable *cancellable);
@@ -51,5 +53,7 @@ void mbimcli_ms_firmware_id_run (MbimDevice *device,
GCancellable *cancellable);
void mbimcli_ms_host_shutdown_run (MbimDevice *device,
GCancellable *cancellable);
+void mbimcli_atds_run (MbimDevice *device,
+ GCancellable *cancellable);
#endif /* __MBIMCLI_H__ */