diff options
author | som <somashekhar.puttagangaiah@intel.com> | 2023-04-03 21:58:25 +0530 |
---|---|---|
committer | Aleksander Morgado <aleksandermj@chromium.org> | 2023-04-27 09:57:28 +0000 |
commit | 39b3dcc0c1fa571a19ebe37af58c7f8e10397296 (patch) | |
tree | ea797644e69e3988d5a61b11fb5424900a952c78 | |
parent | 4f916f48e6ba3fed821ece87f3e8242e69d950f1 (diff) | |
download | libmbim-39b3dcc0c1fa571a19ebe37af58c7f8e10397296.tar.gz |
google: new service to support carrier-lock operations
This new service is added for the Google Chromebook usecase where the
device may be locked to a particular carrier. This CID is used to send
lock data to unlock the device as appropriate.
Co-author: Bestha, Lakshminarayana
-rw-r--r-- | data/mbim-service-google.json | 31 | ||||
-rw-r--r-- | docs/reference/libmbim-glib/libmbim-glib-common.sections | 21 | ||||
-rw-r--r-- | docs/reference/libmbim-glib/libmbim-glib-docs.xml | 5 | ||||
-rw-r--r-- | src/libmbim-glib/generated/meson.build | 1 | ||||
-rw-r--r-- | src/libmbim-glib/libmbim-glib.h | 1 | ||||
-rw-r--r-- | src/libmbim-glib/mbim-cid.c | 15 | ||||
-rw-r--r-- | src/libmbim-glib/mbim-cid.h | 14 | ||||
-rw-r--r-- | src/libmbim-glib/mbim-enums.h | 51 | ||||
-rw-r--r-- | src/libmbim-glib/mbim-errors.h | 18 | ||||
-rw-r--r-- | src/libmbim-glib/mbim-message.c | 4 | ||||
-rw-r--r-- | src/libmbim-glib/mbim-uuid.c | 13 | ||||
-rw-r--r-- | src/libmbim-glib/mbim-uuid.h | 14 | ||||
-rw-r--r-- | src/libmbim-glib/test/test-message-builder.c | 67 | ||||
-rw-r--r-- | src/libmbim-glib/test/test-message-parser.c | 108 | ||||
-rw-r--r-- | src/mbimcli/mbimcli-google.c | 230 | ||||
-rw-r--r-- | src/mbimcli/mbimcli.c | 9 | ||||
-rw-r--r-- | src/mbimcli/mbimcli.h | 4 | ||||
-rw-r--r-- | src/mbimcli/meson.build | 1 |
18 files changed, 604 insertions, 3 deletions
diff --git a/data/mbim-service-google.json b/data/mbim-service-google.json new file mode 100644 index 0000000..364c0dc --- /dev/null +++ b/data/mbim-service-google.json @@ -0,0 +1,31 @@ +[ + // ********************************************************************************* + { "type" : "Service", + "name" : "Google" }, + + // ********************************************************************************* + { "name" : "Carrier Lock", + "type" : "Command", + "since" : "1.30", + "set" : [ { "name" : "Data", + "format" : "ref-byte-array-no-offset" } ], + "query" : [], + "response" : [ { "name" : "CarrierLockStatus", + "format" : "guint32", + "public-format" : "MbimCarrierLockStatus" }, + { "name" : "CarrierLockModemState", + "format" : "guint32", + "public-format" : "MbimCarrierLockModemState" }, + { "name" : "CarrierLockCause", + "format" : "guint32", + "public-format" : "MbimCarrierLockCause" } ], + "notification" : [ { "name" : "CarrierLockStatus", + "format" : "guint32", + "public-format" : "MbimCarrierLockStatus" }, + { "name" : "CarrierLockModemState", + "format" : "guint32", + "public-format" : "MbimCarrierLockModemState" }, + { "name" : "CarrierLockCause", + "format" : "guint32", + "public-format" : "MbimCarrierLockCause" } ] } +] diff --git a/docs/reference/libmbim-glib/libmbim-glib-common.sections b/docs/reference/libmbim-glib/libmbim-glib-common.sections index 8de81d4..50653dc 100644 --- a/docs/reference/libmbim-glib/libmbim-glib-common.sections +++ b/docs/reference/libmbim-glib/libmbim-glib-common.sections @@ -35,6 +35,7 @@ MBIM_UUID_INTEL_THERMAL_RF MBIM_UUID_MS_VOICE_EXTENSIONS MBIM_UUID_INTEL_MUTUAL_AUTHENTICATION MBIM_UUID_INTEL_TOOLS +MBIM_UUID_GOOGLE <SUBSECTION Methods> mbim_service_get_string mbim_service_lookup_name @@ -79,6 +80,7 @@ MbimCidIntelThermalRf MbimCidMsVoiceExtensions MbimCidIntelMutualAuthentication MbimCidIntelTools +MbimCidGoogle <SUBSECTION Methods> mbim_cid_can_set mbim_cid_can_query @@ -106,6 +108,7 @@ mbim_cid_intel_thermal_rf_get_string mbim_cid_ms_voice_extensions_get_string mbim_cid_intel_mutual_authentication_get_string mbim_cid_intel_tools_get_string +mbim_cid_google_get_string <SUBSECTION Private> mbim_cid_atds_build_string_from_mask mbim_cid_basic_connect_build_string_from_mask @@ -129,6 +132,7 @@ mbim_cid_intel_thermal_rf_build_string_from_mask mbim_cid_ms_voice_extensions_build_string_from_mask mbim_cid_intel_mutual_authentication_build_string_from_mask mbim_cid_intel_tools_build_string_from_mask +mbim_cid_google_build_string_from_mask <SUBSECTION Standard> MBIM_TYPE_CID_ATDS MBIM_TYPE_CID_AUTH @@ -152,6 +156,7 @@ MBIM_TYPE_CID_INTEL_THERMAL_RF MBIM_TYPE_CID_MS_VOICE_EXTENSIONS MBIM_TYPE_CID_INTEL_MUTUAL_AUTHENTICATION MBIM_TYPE_CID_INTEL_TOOLS +MBIM_TYPE_CID_GOOGLE mbim_cid_atds_get_type mbim_cid_auth_get_type mbim_cid_basic_connect_get_type @@ -174,6 +179,7 @@ mbim_cid_intel_thermal_rf_get_type mbim_cid_ms_voice_extensions_get_type mbim_cid_intel_mutual_authentication_get_type mbim_cid_intel_tools_get_type +mbim_cid_google_get_type </SECTION> <SECTION> @@ -428,6 +434,9 @@ MbimUiccFileAccessibility MbimUiccFileType MbimUiccFileStructure MbimTraceCommand +MbimCarrierLockStatus +MbimCarrierLockModemState +MbimCarrierLockCause <SUBSECTION Methods> mbim_device_type_get_string mbim_cellular_class_build_string_from_mask @@ -524,6 +533,9 @@ mbim_uicc_file_accessibility_get_string mbim_uicc_file_type_get_string mbim_uicc_file_structure_get_string mbim_trace_command_get_string +mbim_carrier_lock_status_get_string +mbim_carrier_lock_modem_state_get_string +mbim_carrier_lock_cause_get_string <SUBSECTION Private> mbim_device_type_build_string_from_mask mbim_cellular_class_get_string @@ -621,6 +633,9 @@ mbim_uicc_file_accessibility_build_string_from_mask mbim_uicc_file_type_build_string_from_mask mbim_uicc_file_structure_build_string_from_mask mbim_trace_command_build_string_from_mask +mbim_carrier_lock_status_build_string_from_mask +mbim_carrier_lock_modem_state_build_string_from_mask +mbim_carrier_lock_cause_build_string_from_mask <SUBSECTION Standard> MBIM_TYPE_ACTIVATION_COMMAND MBIM_TYPE_ACTIVATION_STATE @@ -722,6 +737,9 @@ MBIM_TYPE_UICC_FILE_ACCESSIBILITY MBIM_TYPE_UICC_FILE_TYPE MBIM_TYPE_UICC_FILE_STRUCTURE MBIM_TYPE_TRACE_COMMAND +MBIM_TYPE_CARRIER_LOCK_STATUS +MBIM_TYPE_CARRIER_LOCK_MODEM_STATE +MBIM_TYPE_CARRIER_LOCK_CAUSE mbim_activation_command_get_type mbim_activation_state_get_type mbim_auth_protocol_get_type @@ -822,6 +840,9 @@ mbim_uicc_file_accessibility_get_type mbim_uicc_file_type_get_type mbim_uicc_file_structure_get_type mbim_trace_command_get_type +mbim_carrier_lock_status_get_type +mbim_carrier_lock_modem_state_get_type +mbim_carrier_lock_cause_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 6008052..84d322f 100644 --- a/docs/reference/libmbim-glib/libmbim-glib-docs.xml +++ b/docs/reference/libmbim-glib/libmbim-glib-docs.xml @@ -115,6 +115,11 @@ </chapter> <chapter> + <title>Google-defined Services</title> + <xi:include href="xml/mbim-google.xml"/> + </chapter> + + <chapter> <title>libmbim-defined Services</title> <xi:include href="xml/mbim-proxy-control.xml"/> </chapter> diff --git a/src/libmbim-glib/generated/meson.build b/src/libmbim-glib/generated/meson.build index cd13cb6..79c8561 100644 --- a/src/libmbim-glib/generated/meson.build +++ b/src/libmbim-glib/generated/meson.build @@ -110,6 +110,7 @@ services_data = [ ['ussd'], ['intel-mutual-authentication'], ['intel-tools'], + ['google'], ] foreach service_data: services_data diff --git a/src/libmbim-glib/libmbim-glib.h b/src/libmbim-glib/libmbim-glib.h index 6b963c8..bf2c07b 100644 --- a/src/libmbim-glib/libmbim-glib.h +++ b/src/libmbim-glib/libmbim-glib.h @@ -48,6 +48,7 @@ #include "mbim-ms-voice-extensions.h" #include "mbim-intel-mutual-authentication.h" #include "mbim-intel-tools.h" +#include "mbim-google.h" /* backwards compatibility */ #include "mbim-compat.h" diff --git a/src/libmbim-glib/mbim-cid.c b/src/libmbim-glib/mbim-cid.c index fec3515..cb8ee6e 100644 --- a/src/libmbim-glib/mbim-cid.c +++ b/src/libmbim-glib/mbim-cid.c @@ -248,6 +248,13 @@ static const CidConfig cid_intel_tools_config [MBIM_CID_INTEL_TOOLS_LAST] = { { SET , QUERY , NO_NOTIFY }, /* MBIM_CID_INTEL_TOOLS_TRACE_CONFIG */ }; +/* Note: index of the array is CID-1 */ +#define MBIM_CID_GOOGLE_LAST MBIM_CID_GOOGLE_CARRIER_LOCK +static const CidConfig cid_google_config [MBIM_CID_GOOGLE_LAST] = { + { SET, QUERY, NOTIFY }, /* MBIM_CID_GOOGLE_CARRIER_LOCK */ +}; + + gboolean mbim_cid_can_set (MbimService service, guint cid) @@ -303,6 +310,8 @@ mbim_cid_can_set (MbimService service, return cid_intel_mutual_authentication_config[cid - 1].set; case MBIM_SERVICE_INTEL_TOOLS: return cid_intel_tools_config[cid - 1].set; + case MBIM_SERVICE_GOOGLE: + return cid_google_config[cid - 1].set; case MBIM_SERVICE_INVALID: case MBIM_SERVICE_LAST: default: @@ -366,6 +375,8 @@ mbim_cid_can_query (MbimService service, return cid_intel_mutual_authentication_config[cid - 1].query; case MBIM_SERVICE_INTEL_TOOLS: return cid_intel_tools_config[cid - 1].query; + case MBIM_SERVICE_GOOGLE: + return cid_google_config[cid - 1].query; case MBIM_SERVICE_INVALID: case MBIM_SERVICE_LAST: default: @@ -429,6 +440,8 @@ mbim_cid_can_notify (MbimService service, return cid_intel_mutual_authentication_config[cid - 1].notify; case MBIM_SERVICE_INTEL_TOOLS: return cid_intel_tools_config[cid - 1].notify; + case MBIM_SERVICE_GOOGLE: + return cid_google_config[cid - 1].notify; case MBIM_SERVICE_INVALID: case MBIM_SERVICE_LAST: default: @@ -493,6 +506,8 @@ mbim_cid_get_printable (MbimService service, return mbim_cid_intel_mutual_authentication_get_string (cid); case MBIM_SERVICE_INTEL_TOOLS: return mbim_cid_intel_tools_get_string (cid); + case MBIM_SERVICE_GOOGLE: + return mbim_cid_google_get_string (cid); case MBIM_SERVICE_LAST: default: g_assert_not_reached (); diff --git a/src/libmbim-glib/mbim-cid.h b/src/libmbim-glib/mbim-cid.h index 5d20a76..0666be0 100644 --- a/src/libmbim-glib/mbim-cid.h +++ b/src/libmbim-glib/mbim-cid.h @@ -472,6 +472,20 @@ typedef enum { /*< since=1.30 >*/ } MbimCidIntelTools; /** + * MbimCidGoogle: + * @MBIM_CID_GOOGLE_UNKNOWN: Unknown command. + * @MBIM_CID_GOOGLE_CARRIER_LOCK: Carrier lock. + * + * MBIM commands in the %MBIM_SERVICE_GOOGLE service. + * + * Since: 1.30 + */ +typedef enum { /*< since=1.30 >*/ + MBIM_CID_GOOGLE_UNKNOWN = 0, + MBIM_CID_GOOGLE_CARRIER_LOCK = 1, +} MbimCidGoogle; + +/** * mbim_cid_can_set: * @service: a #MbimService. * @cid: a command ID. diff --git a/src/libmbim-glib/mbim-enums.h b/src/libmbim-glib/mbim-enums.h index cb9193d..f96de0c 100644 --- a/src/libmbim-glib/mbim-enums.h +++ b/src/libmbim-glib/mbim-enums.h @@ -2035,6 +2035,57 @@ typedef enum { /*< since=1.28 >*/ MBIM_TRACE_COMMAND_FLASH_INTERVAL = 3, } MbimTraceCommand; +/*****************************************************************************/ +/* 'Google Carrier Lock' enums */ + +/** + * MbimCarrierLockStatus: + * @MBIM_CARRIER_LOCK_STATUS_NOT_APPLIED: Carrier lock not applied. + * @MBIM_CARRIER_LOCK_STATUS_APPLIED: Carrier lock applied. + * + * Status of carrier lock. + * + * Since: 1.30 + */ +typedef enum { /*< since=1.30 >*/ + MBIM_CARRIER_LOCK_STATUS_NOT_APPLIED = 0, + MBIM_CARRIER_LOCK_STATUS_APPLIED = 1, +} MbimCarrierLockStatus; + +/** + * MbimCarrierLockModemState: + * @MBIM_CARRIER_LOCK_MODEM_STATE_DEREGISTERED: Modem deregistered. + * @MBIM_CARRIER_LOCK_MODEM_STATE_DEREGISTRATION_IN_PROGRESS: Modem de-registration in progress. + * @MBIM_CARRIER_LOCK_MODEM_STATE_REGISTRATION_IN_PROGRESS: Modem registration state in progress. + * @MBIM_CARRIER_LOCK_MODEM_STATE_REGISTERED: Modem registered. + * + * State of modem after a carrier lock state update. + * + * Since: 1.30 + */ +typedef enum { /*< since=1.30 >*/ + MBIM_CARRIER_LOCK_MODEM_STATE_DEREGISTERED = 0, + MBIM_CARRIER_LOCK_MODEM_STATE_DEREGISTRATION_IN_PROGRESS = 1, + MBIM_CARRIER_LOCK_MODEM_STATE_REGISTRATION_IN_PROGRESS = 2, + MBIM_CARRIER_LOCK_MODEM_STATE_REGISTERED = 3, +} MbimCarrierLockModemState; + +/** + * MbimCarrierLockCause: + * @MBIM_CARRIER_LOCK_CAUSE_NOT_APPLICABLE: Cause not applicable. + * @MBIM_CARRIER_LOCK_CAUSE_SIM_LOCK_POLICY_MISMATCH: Sim lock policy mismatch. + * @MBIM_CARRIER_LOCK_CAUSE_SIM_LOCK_POLICY_MATCHED: Sim lock policy matched. + * + * Carrier lock cause. + * + * Since: 1.30 + */ +typedef enum { /*< since=1.30 >*/ + MBIM_CARRIER_LOCK_CAUSE_NOT_APPLICABLE = 0, + MBIM_CARRIER_LOCK_CAUSE_SIM_LOCK_POLICY_MISMATCH = 1, + MBIM_CARRIER_LOCK_CAUSE_SIM_LOCK_POLICY_MATCHED = 2, +} MbimCarrierLockCause; + G_END_DECLS #endif /* _LIBMBIM_GLIB_MBIM_ENUMS_H_ */ diff --git a/src/libmbim-glib/mbim-errors.h b/src/libmbim-glib/mbim-errors.h index 19e1793..7f8fc23 100644 --- a/src/libmbim-glib/mbim-errors.h +++ b/src/libmbim-glib/mbim-errors.h @@ -4,6 +4,7 @@ * libmbim-glib -- GLib/GIO based library to control MBIM devices * * Copyright (C) 2013 - 2014 Aleksander Morgado <aleksander@aleksander.es> + * Copyright (C) 2022 Intel Corporation */ #ifndef _LIBMBIM_GLIB_MBIM_ERRORS_H_ @@ -129,6 +130,13 @@ typedef enum { /*< since=1.0 >*/ * @MBIM_STATUS_ERROR_SMS_LANG_NOT_SUPPORTED: Language not supported in SMS. * @MBIM_STATUS_ERROR_SMS_ENCODING_NOT_SUPPORTED: Encoding not supported in SMS. * @MBIM_STATUS_ERROR_SMS_FORMAT_NOT_SUPPORTED: Format not supported in SMS. + * @MBIM_STATUS_ERROR_INVALID_SIGNATURE: Invalid signature. Defined by Google for the carrier lock operation. Since 1.30. + * @MBIM_STATUS_ERROR_INVALID_IMEI: Invalid IMEI. Defined by Google for the carrier lock operation. Since 1.30. + * @MBIM_STATUS_ERROR_INVALID_TIMESTAMP: Invalid timestamp. Defined by Google for the carrier lock operation. Since 1.30. + * @MBIM_STATUS_ERROR_NETWORK_LIST_TOO_LARGE: List of networks too large. Defined by Google for the carrier lock operation. Since 1.30. + * @MBIM_STATUS_ERROR_SIGNATURE_ALGORITHM_NOT_SUPPORTED: Signature algorithm not supported. Defined by Google for the carrier lock operation. Since 1.30. + * @MBIM_STATUS_ERROR_FEATURE_NOT_SUPPORTED: Feature not supported. Defined by Google for the carrier lock operation. Since 1.30. + * @MBIM_STATUS_ERROR_DECODE_OR_PARSING_ERROR: Decode or parsing error. Defined by Google for the carrier lock operation. Since 1.30. * * Status of the MBIM request. * @@ -178,7 +186,15 @@ typedef enum { /*< since=1.0 >*/ MBIM_STATUS_ERROR_SMS_NETWORK_TIMEOUT = 101, /*< nick=SmsNetworkTimeout >*/ MBIM_STATUS_ERROR_SMS_LANG_NOT_SUPPORTED = 102, /*< nick=SmsLangNotSupported >*/ MBIM_STATUS_ERROR_SMS_ENCODING_NOT_SUPPORTED = 103, /*< nick=SmsEncodingNotSupported >*/ - MBIM_STATUS_ERROR_SMS_FORMAT_NOT_SUPPORTED = 104 /*< nick=SmsFormatNotSupported >*/ + MBIM_STATUS_ERROR_SMS_FORMAT_NOT_SUPPORTED = 104, /*< nick=SmsFormatNotSupported >*/ + /* google defined error for carrier lock */ + MBIM_STATUS_ERROR_INVALID_SIGNATURE = 0x91000001, /*< nick=InvalidSignature >*/ + MBIM_STATUS_ERROR_INVALID_IMEI = 0x91000002, /*< nick=InvalidImei >*/ + MBIM_STATUS_ERROR_INVALID_TIMESTAMP = 0x91000003, /*< nick=InvalidTimeStamp >*/ + MBIM_STATUS_ERROR_NETWORK_LIST_TOO_LARGE = 0x91000004, /*< nick=NetworkListTooLarge >*/ + MBIM_STATUS_ERROR_SIGNATURE_ALGORITHM_NOT_SUPPORTED = 0x91000005, /*< nick=SignatureAlgorithmNotSupported >*/ + MBIM_STATUS_ERROR_FEATURE_NOT_SUPPORTED = 0x91000006, /*< nick=FeatureNotSupported >*/ + MBIM_STATUS_ERROR_DECODE_OR_PARSING_ERROR = 0x91000007, /*< nick=DecodeOrParsingError >*/ } MbimStatusError; #endif /* _LIBMBIM_GLIB_MBIM_ERRORS_H_ */ diff --git a/src/libmbim-glib/mbim-message.c b/src/libmbim-glib/mbim-message.c index 6a362ac..edd9e55 100644 --- a/src/libmbim-glib/mbim-message.c +++ b/src/libmbim-glib/mbim-message.c @@ -42,6 +42,7 @@ #include "mbim-ms-voice-extensions.h" #include "mbim-intel-mutual-authentication.h" #include "mbim-intel-tools.h" +#include "mbim-google.h" /*****************************************************************************/ @@ -2210,6 +2211,9 @@ mbim_message_get_printable_full (const MbimMessage *self, case MBIM_SERVICE_INTEL_TOOLS: fields_printable = __mbim_message_intel_tools_get_printable_fields (self, line_prefix, &inner_error); break; + case MBIM_SERVICE_GOOGLE: + fields_printable = __mbim_message_google_get_printable_fields (self, line_prefix, &inner_error); + break; case MBIM_SERVICE_INVALID: case MBIM_SERVICE_LAST: g_assert_not_reached (); diff --git a/src/libmbim-glib/mbim-uuid.c b/src/libmbim-glib/mbim-uuid.c index 4c5aac9..d212831 100644 --- a/src/libmbim-glib/mbim-uuid.c +++ b/src/libmbim-glib/mbim-uuid.c @@ -273,6 +273,14 @@ static const MbimUuid uuid_intel_tools = { .e = { 0x97, 0xf2, 0x0f, 0x99, 0x4a, 0xbb } }; +static const MbimUuid uuid_google = { + .a = { 0x3e, 0x1e, 0x92, 0xcf }, + .b = { 0xc5, 0x3d }, + .c = { 0x4f, 0x14 }, + .d = { 0x85, 0xd0 }, + .e = { 0xa8, 0x6a, 0xd9, 0xe1, 0x22, 0x45 } +}; + static GList *mbim_custom_service_list = NULL; typedef struct { @@ -412,6 +420,8 @@ mbim_uuid_from_service (MbimService service) return &uuid_intel_mutual_authentication; case MBIM_SERVICE_INTEL_TOOLS: return &uuid_intel_tools; + case MBIM_SERVICE_GOOGLE: + return &uuid_google; case MBIM_SERVICE_LAST: g_assert_not_reached (); default: @@ -494,6 +504,9 @@ mbim_uuid_to_service (const MbimUuid *uuid) if (mbim_uuid_cmp (uuid, &uuid_intel_tools)) return MBIM_SERVICE_INTEL_TOOLS; + if (mbim_uuid_cmp (uuid, &uuid_google)) + return MBIM_SERVICE_GOOGLE; + 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 7bcf321..dfc26e1 100644 --- a/src/libmbim-glib/mbim-uuid.h +++ b/src/libmbim-glib/mbim-uuid.h @@ -116,6 +116,7 @@ gboolean mbim_uuid_from_printable (const gchar *str, * @MBIM_SERVICE_MS_VOICE_EXTENSIONS: Microsoft Voice extensions service. Since 1.28. * @MBIM_SERVICE_INTEL_MUTUAL_AUTHENTICATION: Intel mutual authentication commands. Since 1.30. * @MBIM_SERVICE_INTEL_TOOLS: Intel tools service. Since 1.30. + * @MBIM_SERVICE_GOOGLE: Google specific service. Since 1.30 * @MBIM_SERVICE_LAST: Internal value. * * Enumeration of the generic MBIM services. @@ -146,6 +147,7 @@ typedef enum { /*< since=1.0 >*/ MBIM_SERVICE_MS_VOICE_EXTENSIONS = 20, MBIM_SERVICE_INTEL_MUTUAL_AUTHENTICATION = 21, MBIM_SERVICE_INTEL_TOOLS = 22, + MBIM_SERVICE_GOOGLE = 23, #if defined LIBMBIM_GLIB_COMPILATION MBIM_SERVICE_LAST /*< skip >*/ #endif @@ -371,7 +373,6 @@ typedef enum { /*< since=1.0 >*/ */ #define MBIM_UUID_INTEL_THERMAL_RF mbim_uuid_from_service (MBIM_SERVICE_INTEL_THERMAL_RF) - /** * MBIM_UUID_MS_VOICE_EXTENSIONS: * @@ -406,6 +407,17 @@ typedef enum { /*< since=1.0 >*/ #define MBIM_UUID_INTEL_TOOLS mbim_uuid_from_service (MBIM_SERVICE_INTEL_TOOLS) /** + * MBIM_UUID_GOOGLE: + * + * Get the UUID of the %MBIM_SERVICE_GOOGLE service. + * + * Returns: (transfer none): a #MbimUuid. + * + * Since: 1.30 + */ +#define MBIM_UUID_GOOGLE mbim_uuid_from_service (MBIM_SERVICE_GOOGLE) + +/** * mbim_service_lookup_name: * @service: a MbimService or custom service. * diff --git a/src/libmbim-glib/test/test-message-builder.c b/src/libmbim-glib/test/test-message-builder.c index ad16abd..bfd51d4 100644 --- a/src/libmbim-glib/test/test-message-builder.c +++ b/src/libmbim-glib/test/test-message-builder.c @@ -2,6 +2,7 @@ /* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Copyright (C) 2013 - 2014 Aleksander Morgado <aleksander@aleksander.es> + * Copyright (C) 2023 Intel Corporation */ #include <config.h> @@ -19,6 +20,7 @@ #include "mbim-dss.h" #include "mbim-ms-host-shutdown.h" #include "mbim-ms-basic-connect-extensions.h" +#include "mbim-google.h" static void test_message_trace (const guint8 *computed, @@ -1771,6 +1773,70 @@ test_ms_basic_connect_v3_connect_set (void) mbim_message_unref (message); } +static void +test_google_carrier_lock_set (void) +{ + g_autoptr(GError) error = NULL; + g_autoptr(MbimMessage) message = NULL; + + const guint8 expected_message [] = { + /* header */ + 0x03, 0x00, 0x00, 0x00, /* type */ + 0x40, 0x00, 0x00, 0x00, /* length */ + 0x01, 0x00, 0x00, 0x00, /* transaction id */ + /* fragment header */ + 0x01, 0x00, 0x00, 0x00, /* total */ + 0x00, 0x00, 0x00, 0x00, /* current */ + /* command_message */ + 0x3E, 0x1E, 0x92, 0xCF, /* service id */ + 0xC5, 0x3D, 0x4F, 0x14, + 0x85, 0xD0, 0xA8, 0x6A, + 0xD9, 0xE1, 0x22, 0x45, + 0x01, 0x00, 0x00, 0x00, /* command id */ + 0x01, 0x00, 0x00, 0x00, /* command type */ + 0x10, 0x00, 0x00, 0x00, /* buffer length */ + /* information buffer */ + 0x0A, 0x00, 0x00, 0x00, /* data buffer */ + 0x56, 0x24, 0x46, 0x95, + 0xAB, 0xCD, 0x25, 0x59, + 0x14, 0x35, 0x00, 0x00, + }; + + const guint8 data [] = { + 0x56, 0x24, 0x46, 0x95, + 0xAB, 0xCD, 0x25, 0x59, + 0x14, 0x35, + }; + message = mbim_message_google_carrier_lock_set_new ( + sizeof (data), + data, + &error); + + g_assert_no_error (error); + g_assert (message != NULL); + g_assert (mbim_message_validate (message, &error)); + + mbim_message_set_transaction_id (message, 1); + + test_message_trace ((const guint8 *)((GByteArray *)message)->data, + ((GByteArray *)message)->len, + expected_message, + sizeof (expected_message)); + + g_assert_cmpuint (mbim_message_get_transaction_id (message), ==, 1); + g_assert_cmpuint (mbim_message_get_message_type (message), ==, MBIM_MESSAGE_TYPE_COMMAND); + g_assert_cmpuint (mbim_message_get_message_length (message), ==, sizeof (expected_message)); + + g_assert_cmpuint (mbim_message_command_get_service (message), ==, MBIM_SERVICE_GOOGLE); + g_assert_cmpuint (mbim_message_command_get_cid (message), ==, MBIM_CID_GOOGLE_CARRIER_LOCK); + g_assert_cmpuint (mbim_message_command_get_command_type (message), ==, MBIM_MESSAGE_COMMAND_TYPE_SET); + + g_assert_cmpuint (((GByteArray *)message)->len, ==, sizeof (expected_message)); + g_assert (memcmp (((GByteArray *)message)->data, expected_message, sizeof (expected_message)) == 0); + + test_message_printable (message, 1, 0); +} + int main (int argc, char **argv) { g_test_init (&argc, &argv, NULL); @@ -1798,6 +1864,7 @@ int main (int argc, char **argv) g_test_add_func (PREFIX "/ms-basic-connect-extensions/registration-parameters/set/1-unnamed-tlv", test_ms_basic_connect_extensions_registration_parameters_set_1_unnamed_tlv); g_test_add_func (PREFIX "/ms-basic-connect-extensions/registration-parameters/set/3-unnamed-tlvs", test_ms_basic_connect_extensions_registration_parameters_set_3_unnamed_tlvs); g_test_add_func (PREFIX "/ms-basic-connect-v3/connect/set", test_ms_basic_connect_v3_connect_set); + g_test_add_func (PREFIX "/google/carrier-lock/set", test_google_carrier_lock_set); #undef PREFIX diff --git a/src/libmbim-glib/test/test-message-parser.c b/src/libmbim-glib/test/test-message-parser.c index e13d94f..e30aecd 100644 --- a/src/libmbim-glib/test/test-message-parser.c +++ b/src/libmbim-glib/test/test-message-parser.c @@ -15,6 +15,7 @@ #include "mbim-ms-firmware-id.h" #include "mbim-ms-basic-connect-extensions.h" #include "mbim-ms-uicc-low-level-access.h" +#include "mbim-google.h" #include "mbim-message.h" #include "mbim-tlv.h" #include "mbim-cid.h" @@ -2141,7 +2142,7 @@ test_ms_basic_connect_extensions_base_stations (void) g_autoptr(MbimMessage) response = NULL; gboolean result; MbimDataClass system_type; - g_autoptr(MbimCellInfoServingGsm) gsm_serving_cell = NULL; + g_autoptr(MbimCellInfoServingGsm) gsm_serving_cell = NULL; g_autoptr(MbimCellInfoServingUmts) umts_serving_cell = NULL; g_autoptr(MbimCellInfoServingTdscdma) tdscdma_serving_cell = NULL; g_autoptr(MbimCellInfoServingLte) lte_serving_cell = NULL; @@ -3392,6 +3393,109 @@ test_ms_uicc_low_level_access_application_list (void) g_assert (memcmp (applications[0]->pin_key_references, expected_pin_key_references, sizeof (expected_pin_key_references)) == 0); } +static void +test_google_carrier_lock (void) +{ + g_autoptr(GError) error = NULL; + g_autoptr(MbimMessage) response = NULL; + gboolean result; + MbimCarrierLockStatus carrier_lock_status; + MbimCarrierLockModemState modem_state; + MbimCarrierLockCause carrier_lock_cause; + + const guint8 buffer [] = { + /* header */ + 0x03, 0x00, 0x00, 0x80, /* type */ + 0x3C, 0x00, 0x00, 0x00, /* length */ + 0x03, 0x00, 0x00, 0x00, /* transaction id */ + /* fragment header */ + 0x01, 0x00, 0x00, 0x00, /* total */ + 0x00, 0x00, 0x00, 0x00, /* current */ + /* command_done message */ + 0x3E, 0x1E, 0x92, 0xCF, /* service id */ + 0xC5, 0x3D, 0x4F, 0x14, + 0x85, 0xD0, 0xA8, 0x6A, + 0xD9, 0xE1, 0x22, 0x45, + 0x01, 0x00, 0x00, 0x00, /* command id */ + 0x00, 0x00, 0x00, 0x00, /* status code */ + 0x0C, 0x00, 0x00, 0x00, /* buffer length */ + /* information buffer */ + 0x01, 0x00, 0x00, 0x00, /* carrier lock status*/ + 0x00, 0x00, 0x00, 0x00, /* modem state */ + 0x00, 0x00, 0x00, 0x00, /* carrier lock cause */ + }; + + response = mbim_message_new (buffer, sizeof (buffer)); + g_assert (mbim_message_validate (response, &error)); + g_assert_no_error (error); + + test_message_printable (response, 1, 0); + + result = mbim_message_google_carrier_lock_response_parse ( + response, + &carrier_lock_status, + &modem_state, + &carrier_lock_cause, + &error); + g_assert_no_error (error); + g_assert (result); + + g_assert_cmpuint (carrier_lock_status, ==, MBIM_CARRIER_LOCK_STATUS_APPLIED); + g_assert_cmpuint (modem_state, ==, MBIM_CARRIER_LOCK_MODEM_STATE_DEREGISTERED); + g_assert_cmpuint (carrier_lock_cause, ==, MBIM_CARRIER_LOCK_CAUSE_NOT_APPLICABLE); +} + +static void +test_google_carrier_lock_notification (void) +{ + g_autoptr(GError) error = NULL; + g_autoptr(MbimMessage) response = NULL; + gboolean result; + MbimCarrierLockStatus carrier_lock_status; + MbimCarrierLockModemState modem_state; + MbimCarrierLockCause carrier_lock_cause; + + const guint8 buffer [] = { + /* header */ + 0x07, 0x00, 0x00, 0x80, /* type */ + 0x38, 0x00, 0x00, 0x00, /* length */ + 0x03, 0x00, 0x00, 0x00, /* transaction id */ + /* fragment header */ + 0x01, 0x00, 0x00, 0x00, /* total */ + 0x00, 0x00, 0x00, 0x00, /* current */ + /* command_done message */ + 0x3E, 0x1E, 0x92, 0xCF, /* service id */ + 0xC5, 0x3D, 0x4F, 0x14, + 0x85, 0xD0, 0xA8, 0x6A, + 0xD9, 0xE1, 0x22, 0x45, + 0x01, 0x00, 0x00, 0x00, /* command id */ + 0x0C, 0x00, 0x00, 0x00, /* buffer length */ + /* information buffer */ + 0x01, 0x00, 0x00, 0x00, /* carrier lock status */ + 0x00, 0x00, 0x00, 0x00, /* modem state */ + 0x00, 0x00, 0x00, 0x00, /* carrier lock cause */ + }; + + response = mbim_message_new (buffer, sizeof (buffer)); + g_assert (mbim_message_validate (response, &error)); + g_assert_no_error (error); + + test_message_printable (response, 1, 0); + + result = mbim_message_google_carrier_lock_notification_parse ( + response, + &carrier_lock_status, + &modem_state, + &carrier_lock_cause, + &error); + g_assert_no_error (error); + g_assert (result); + + g_assert_cmpuint (carrier_lock_status, ==, MBIM_CARRIER_LOCK_STATUS_APPLIED); + g_assert_cmpuint (modem_state, ==, MBIM_CARRIER_LOCK_MODEM_STATE_DEREGISTERED); + g_assert_cmpuint (carrier_lock_cause, ==, MBIM_CARRIER_LOCK_CAUSE_NOT_APPLICABLE); +} + int main (int argc, char **argv) { g_test_init (&argc, &argv, NULL); @@ -3434,6 +3538,8 @@ int main (int argc, char **argv) g_test_add_func (PREFIX "/basic-connect-extensions/wake-reason/command/payload", test_ms_basic_connect_extensions_wake_reason_command_payload); g_test_add_func (PREFIX "/basic-connect-extensions/wake-reason/packet", test_ms_basic_connect_extensions_wake_reason_packet); g_test_add_func (PREFIX "/ms-uicc-low-level-access/application-list", test_ms_uicc_low_level_access_application_list); + g_test_add_func (PREFIX "/google/carrier-lock-response", test_google_carrier_lock); + g_test_add_func (PREFIX "/google/carrier-lock-notify", test_google_carrier_lock_notification); #undef PREFIX diff --git a/src/mbimcli/mbimcli-google.c b/src/mbimcli/mbimcli-google.c new file mode 100644 index 0000000..69948d6 --- /dev/null +++ b/src/mbimcli/mbimcli-google.c @@ -0,0 +1,230 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * mbimcli -- Command line interface to control MBIM devices + * + * Copyright (C) 2023 Intel Corporation + */ + +#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" +#include "mbimcli-helpers.h" + +/* Context */ +typedef struct { + MbimDevice *device; + GCancellable *cancellable; +} Context; +static Context *ctx; + +/* Options */ +static gchar *set_carrier_lock_str; +static gboolean query_carrier_lock_flag; + +static GOptionEntry entries[] = { + { "google-set-carrier-lock", 0, 0, G_OPTION_ARG_STRING, &set_carrier_lock_str, + "Set Google Carrier Lock", + "[(Data)]" + }, + { "google-query-carrier-lock", 0, 0, G_OPTION_ARG_NONE, &query_carrier_lock_flag, + "Query Google Carrier Lock", + NULL + }, + { NULL } +}; + +GOptionGroup * +mbimcli_google_get_option_group (void) +{ + GOptionGroup *group; + + group = g_option_group_new ("google", + "Google options:", + "Show Google Service options", + NULL, + NULL); + g_option_group_add_entries (group, entries); + + return group; +} + +gboolean +mbimcli_google_options_enabled (void) +{ + static guint n_actions = 0; + static gboolean checked = FALSE; + + if (checked) + return !!n_actions; + + n_actions = (!!set_carrier_lock_str + + query_carrier_lock_flag); + + if (n_actions > 1) { + g_printerr ("error: too many google 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 +set_carrier_lock_ready (MbimDevice *device, + GAsyncResult *res) +{ + g_autoptr(MbimMessage) response = NULL; + g_autoptr(GError) error = 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); + shutdown (FALSE); + return; + } + + g_print ("[%s] Successfully set carrier lock: \n", + mbim_device_get_path_display (device)); + + shutdown (TRUE); +} + +static void +query_carrier_lock_ready (MbimDevice *device, + GAsyncResult *res) +{ + g_autoptr(MbimMessage) response = NULL; + g_autoptr(GError) error = NULL; + const gchar *carrier_lock_status_str; + const gchar *carrier_lock_modem_state_str; + const gchar *carrier_lock_cause_str; + MbimCarrierLockStatus carrier_lock_status; + MbimCarrierLockModemState carrier_lock_modem_state; + MbimCarrierLockCause carrier_lock_cause; + + 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); + shutdown (FALSE); + return; + } + + if (!mbim_message_google_carrier_lock_response_parse ( + response, + &carrier_lock_status, + &carrier_lock_modem_state, + &carrier_lock_cause, + &error)) { + g_printerr ("error: couldn't parse response message: %s\n", error->message); + return; + } + + carrier_lock_status_str = mbim_carrier_lock_status_get_string (carrier_lock_status); + carrier_lock_modem_state_str = mbim_carrier_lock_modem_state_get_string (carrier_lock_modem_state); + carrier_lock_cause_str = mbim_carrier_lock_cause_get_string (carrier_lock_cause); + + g_print ("[%s] Successfully queried carrier lock: \n" + "\t Carrier lock status: '%s'\n" + "\tCarrier lock modem state: '%s'\n" + "\t Carrier lock cause: '%s'\n", + mbim_device_get_path_display (device), + VALIDATE_UNKNOWN (carrier_lock_status_str), + VALIDATE_UNKNOWN (carrier_lock_modem_state_str), + VALIDATE_UNKNOWN (carrier_lock_cause_str)); + + shutdown (TRUE); +} + +void +mbimcli_google_run (MbimDevice *device, + GCancellable *cancellable) +{ + g_autoptr(MbimMessage) request = NULL; + g_autoptr(GError) error = NULL; + + /* Initialize context */ + ctx = g_slice_new (Context); + ctx->device = g_object_ref (device); + ctx->cancellable = cancellable ? g_object_ref (cancellable) : NULL; + + /* Request to set carrier lock */ + if (set_carrier_lock_str) { + gsize data_size = 0; + g_autofree guint8 *data = NULL; + + data = mbimcli_read_buffer_from_string (set_carrier_lock_str, -1, &data_size, &error); + if (!data) { + g_printerr ("Failed to read data: %s\n", error->message); + shutdown (FALSE); + return; + } + + g_debug ("Asynchronously setting carrier lock..."); + request = mbim_message_google_carrier_lock_set_new ((guint32)data_size, data, &error); + if (!request) { + g_printerr ("error: couldn't create request: %s\n", error->message); + shutdown (FALSE); + return; + } + + mbim_device_command (ctx->device, + request, + 10, + ctx->cancellable, + (GAsyncReadyCallback)set_carrier_lock_ready, + NULL); + return; + } + + /* Query carrier lock information */ + if (query_carrier_lock_flag) { + request = mbim_message_google_carrier_lock_query_new (&error); + if (!request) { + g_printerr ("error: couldn't create request: %s\n", error->message); + shutdown (FALSE); + return; + } + + mbim_device_command (ctx->device, + request, + 10, + ctx->cancellable, + (GAsyncReadyCallback)query_carrier_lock_ready, + NULL); + return; + } + + g_warn_if_reached (); +} diff --git a/src/mbimcli/mbimcli.c b/src/mbimcli/mbimcli.c index afd2c4d..e2e929e 100644 --- a/src/mbimcli/mbimcli.c +++ b/src/mbimcli/mbimcli.c @@ -315,6 +315,9 @@ device_open_ready (MbimDevice *dev, case MBIM_SERVICE_INTEL_MUTUAL_AUTHENTICATION: mbimcli_intel_mutual_authentication_run (dev, cancellable); return; + case MBIM_SERVICE_GOOGLE: + mbimcli_google_run (dev, cancellable); + return; case MBIM_SERVICE_SMS: case MBIM_SERVICE_USSD: case MBIM_SERVICE_STK: @@ -464,6 +467,11 @@ parse_actions (void) actions_enabled++; } + if (mbimcli_google_options_enabled ()) { + service = MBIM_SERVICE_GOOGLE; + actions_enabled++; + } + /* Noop */ if (noop_flag) actions_enabled++; @@ -514,6 +522,7 @@ int main (int argc, char **argv) g_option_context_add_group (context, mbimcli_ms_uicc_low_level_access_get_option_group ()); g_option_context_add_group (context, mbimcli_intel_mutual_authentication_get_option_group ()); g_option_context_add_group (context, mbimcli_intel_tools_get_option_group ()); + g_option_context_add_group (context, mbimcli_google_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", error->message); diff --git a/src/mbimcli/mbimcli.h b/src/mbimcli/mbimcli.h index 0989106..7bd23b6 100644 --- a/src/mbimcli/mbimcli.h +++ b/src/mbimcli/mbimcli.h @@ -33,6 +33,7 @@ GOptionGroup *mbimcli_ms_voice_extensions_get_option_group (void); GOptionGroup *mbimcli_ms_uicc_low_level_access_get_option_group (void); GOptionGroup *mbimcli_intel_mutual_authentication_get_option_group (void); GOptionGroup *mbimcli_intel_tools_get_option_group (void); +GOptionGroup *mbimcli_google_get_option_group (void); gboolean mbimcli_basic_connect_options_enabled (void); gboolean mbimcli_phonebook_options_enabled (void); @@ -49,6 +50,7 @@ gboolean mbimcli_ms_voice_extensions_options_enabled (void); gboolean mbimcli_ms_uicc_low_level_access_options_enabled (void); gboolean mbimcli_intel_mutual_authentication_options_enabled (void); gboolean mbimcli_intel_tools_options_enabled (void); +gboolean mbimcli_google_options_enabled (void); void mbimcli_basic_connect_run (MbimDevice *device, GCancellable *cancellable); @@ -80,6 +82,8 @@ void mbimcli_intel_mutual_authentication_run (MbimDevice *device, GCancellable *cancellable); void mbimcli_intel_tools_run (MbimDevice *device, GCancellable *cancellable); +void mbimcli_google_run (MbimDevice *device, + GCancellable *cancellable); /* link management */ diff --git a/src/mbimcli/meson.build b/src/mbimcli/meson.build index ae659cb..9dc8cc3 100644 --- a/src/mbimcli/meson.build +++ b/src/mbimcli/meson.build @@ -10,6 +10,7 @@ mbimcli_sources = files( 'mbimcli-intel-thermal-rf.c', 'mbimcli-ms-basic-connect-extensions.c', 'mbimcli-ms-firmware-id.c', + 'mbimcli-google.c', 'mbimcli-ms-host-shutdown.c', 'mbimcli-ms-sar.c', 'mbimcli-ms-uicc-low-level-access.c', |