diff options
author | Dan Williams <dcbw@redhat.com> | 2017-04-18 15:47:25 -0500 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2017-06-28 09:14:59 -0500 |
commit | 1f86135579311bb22d391bde39024f8fb1d014b8 (patch) | |
tree | 70804f6d8d4478fe4983366c2f383ef62b9c2b8b | |
parent | e5b6807d6f2a8488878cd1cc1530f3b3fd92a2ec (diff) | |
download | libmbim-1f86135579311bb22d391bde39024f8fb1d014b8.tar.gz |
atds: add AT&T Device Service implementation
See https://code.wireshark.org/review/gitweb?p=wireshark.git;a=blob;f=epan/dissectors/packet-mbim.c
ATDS/Operators seems to be the same as BasicConnect/VisibleProviders except that
CellularClass has been replaced with a "Provider PLMN Mode".
ATDS/RegisterState seems to be exactly the same as BasicConnect/RegisterState if
the Wireshark dissector is to be believed.
Doesn't implement ATDS/SetProjectionTables yet.
-rw-r--r-- | data/Makefile.am | 3 | ||||
-rw-r--r-- | data/mbim-service-atds.json | 147 | ||||
-rw-r--r-- | docs/reference/libmbim-glib/Makefile.am | 3 | ||||
-rw-r--r-- | docs/reference/libmbim-glib/libmbim-glib-common.sections | 17 | ||||
-rw-r--r-- | docs/reference/libmbim-glib/libmbim-glib-docs.xml | 1 | ||||
-rw-r--r-- | src/libmbim-glib/generated/Makefile.am | 18 | ||||
-rw-r--r-- | src/libmbim-glib/libmbim-glib.h | 1 | ||||
-rw-r--r-- | src/libmbim-glib/mbim-cid.c | 18 | ||||
-rw-r--r-- | src/libmbim-glib/mbim-cid.h | 20 | ||||
-rw-r--r-- | src/libmbim-glib/mbim-enums.h | 36 | ||||
-rw-r--r-- | src/libmbim-glib/mbim-uuid.c | 13 | ||||
-rw-r--r-- | src/libmbim-glib/mbim-uuid.h | 11 | ||||
-rw-r--r-- | src/mbimcli/Makefile.am | 3 | ||||
-rw-r--r-- | src/mbimcli/mbimcli-atds.c | 336 | ||||
-rw-r--r-- | src/mbimcli/mbimcli.c | 8 | ||||
-rw-r--r-- | src/mbimcli/mbimcli.h | 4 |
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__ */ |