From 1565e3ada74ecac6e0493a25acff3f828ff03f93 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Mon, 5 Jan 2026 21:39:04 -0600 Subject: [PATCH 1/9] intel: XMM7360: convert message parsing g_assert()s to GErrors (#1034) We shouldn't be g_asserting (and thus crashing) on untrusted input code; should instead check validity and return an error that upper layers can reasonbly log and handle. Fixes: https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/1034 Signed-off-by: Dan Williams --- .../intel/mm-port-serial-xmmrpc-xmm7360.c | 251 ++++++++++++------ 1 file changed, 165 insertions(+), 86 deletions(-) diff --git a/src/plugins/intel/mm-port-serial-xmmrpc-xmm7360.c b/src/plugins/intel/mm-port-serial-xmmrpc-xmm7360.c index ad5aed4f..f90c5543 100644 --- a/src/plugins/intel/mm-port-serial-xmmrpc-xmm7360.c +++ b/src/plugins/intel/mm-port-serial-xmmrpc-xmm7360.c @@ -42,6 +42,8 @@ xmm7360_rpc_msg_arg_free (Xmm7360RpcMsgArg *arg) g_free (arg); } +G_DEFINE_AUTOPTR_CLEANUP_FUNC (Xmm7360RpcMsgArg, xmm7360_rpc_msg_arg_free) + void xmm7360_rpc_response_free (Xmm7360RpcResponse *response) { @@ -52,98 +54,157 @@ xmm7360_rpc_response_free (Xmm7360RpcResponse *response) } } -static gint -xmm7360_byte_array_read_asn_int (GByteArray *buf, gsize *offset, Xmm7360RpcMsgArg *arg) -{ - gint size; - gint bytes_read; - gint val; +#define PARSE_ERROR(fmt, ...) { \ + g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, fmt, __VA_ARGS__); \ +} - g_assert (buf->len > *offset + 2); +static gint +xmm7360_byte_array_read_asn_int (GByteArray *buf, + gsize offset, + gint *out_val, + Xmm7360RpcMsgArg *out_arg, + GError **error) +{ + const gsize orig_offset = offset; + gint size; + gint bytes_read; + gint val; + + if (buf->len <= offset + 2) { + PARSE_ERROR ("initial buffer size %u too small (need %zu)", + buf->len, offset + 2); + return -1; + } /* check ASN start byte and read int size */ - g_assert (buf->data[(*offset)++] == 0x02); - size = buf->data[(*offset)++]; + if (buf->data[offset] != 0x02) { + PARSE_ERROR ("unexpected ASN start byte 0x%02X (expected 0x02)", buf->data[offset]); + return -1; + } + offset++; + size = buf->data[offset++]; /* read actual value byte by byte */ - g_assert (buf->len >= *offset + size); + if (buf->len < offset + size) { + PARSE_ERROR ("buffer size %u too small (need %zu)", buf->len, offset + size); + return -1; + } val = 0; for (bytes_read = 0; bytes_read < size; bytes_read++) { val <<= 8; - val |= buf->data[(*offset)++]; + val |= buf->data[offset++]; } - if (arg != NULL) { + if (out_arg) { if (size == 0x01) { - arg->type = XMM7360_RPC_MSG_ARG_TYPE_BYTE; - arg->value.b = (gint8) val; + out_arg->type = XMM7360_RPC_MSG_ARG_TYPE_BYTE; + out_arg->value.b = (gint8) val; } else if (size == 0x02) { - arg->type = XMM7360_RPC_MSG_ARG_TYPE_SHORT; - arg->value.s = (gint16) val; + out_arg->type = XMM7360_RPC_MSG_ARG_TYPE_SHORT; + out_arg->value.s = (gint16) val; } else { - arg->type = XMM7360_RPC_MSG_ARG_TYPE_LONG; - arg->value.l = (gint32) val; + out_arg->type = XMM7360_RPC_MSG_ARG_TYPE_LONG; + out_arg->value.l = (gint32) val; } } - return val; + if (out_val) + *out_val = val; + + /* return bytes consumed by this function */ + return offset - orig_offset; } -static gchar * -xmm7360_byte_array_read_string (GByteArray *buf, gsize *offset, gsize *string_len) +static gint +xmm7360_byte_array_read_string (GByteArray *buf, + gsize offset, + Xmm7360RpcMsgArg *out_arg, + GError **error) { - guchar string_type; - gsize string_len_padded; - gsize pad_len; - gchar *result; + const gsize orig_offset = offset; + guchar string_type; + gint string_len_padded; + gint pad_len; + gint string_len; + gint consumed; - g_assert (buf->len > *offset + 2); + if (buf->len < offset + 2) { + PARSE_ERROR ("initial buffer size %u too small (need %zu)", + buf->len, offset + 2); + return -1; + } - string_type = buf->data[(*offset)++]; - g_assert (string_type == 0x55 || string_type == 0x56 || string_type == 0x57); + string_type = buf->data[offset++]; + if (string_type != 0x55 && string_type != 0x56 && string_type != 0x57) { + PARSE_ERROR ("unhandled string type 0x%02X", string_type); + return -1; + } - *string_len = buf->data[(*offset)++]; - if (*string_len & 0x80) { + string_len = buf->data[offset++]; + if (string_len & 0x80) { guchar bytelen; - guchar i; + guint8 i; - bytelen = *string_len & 0x0f; - *string_len = 0; - g_assert (bytelen <= 4); - g_assert (buf->len > *offset + bytelen); - for (i = 0; i < bytelen; i++) { - *string_len |= buf->data[(*offset)++] << (i * 8); + bytelen = string_len & 0x0f; + if (bytelen > 4) { + PARSE_ERROR ("unhandled string length size 0x%02X", bytelen); + return -1; + } else if (buf->len <= offset + bytelen) { + PARSE_ERROR ("string len buffer size %u too small (need %zu)", + buf->len, offset + bytelen); + return -1; } + + string_len = 0; + for (i = 0; i < bytelen; i++) + string_len |= buf->data[offset++] << (i * 8); } if (string_type == 0x56) { /* 0x56 contains 2-byte chars */ - *string_len <<= 1; + string_len <<= 1; } else if (string_type == 0x57) { /* 0x57 contains 4-byte chars */ - *string_len <<= 2; + string_len <<= 2; } - string_len_padded = (gsize) xmm7360_byte_array_read_asn_int (buf, offset, NULL); - pad_len = (gsize) xmm7360_byte_array_read_asn_int (buf, offset, NULL); + consumed = xmm7360_byte_array_read_asn_int (buf, offset, &string_len_padded, NULL, error); + if (consumed < 0) + return -1; + offset += consumed; + + consumed = xmm7360_byte_array_read_asn_int (buf, offset, &pad_len, NULL, error); + if (consumed < 0) + return -1; + offset += consumed; if (string_len_padded > 0) { - g_assert (string_len_padded == *string_len + pad_len); + if (string_len_padded != string_len + pad_len) { + PARSE_ERROR ("padded string len %u mismatch (expected %u)", + string_len_padded, string_len + pad_len); + return -1; + } } else { - string_len_padded = *string_len + pad_len; + string_len_padded = string_len + pad_len; } /* make sure the buffer is large enough */ - g_assert (buf->len >= *offset + string_len_padded); + if (buf->len < offset + string_len_padded) { + PARSE_ERROR ("padded string len buffer size %u too small (need %zu)", + buf->len, offset + string_len_padded); + return -1; + } /* copy the result */ - result = g_malloc (*string_len); - memcpy (result, &(buf->data[*offset]), *string_len); + if (out_arg) { + out_arg->type = XMM7360_RPC_MSG_ARG_TYPE_STRING; + /* Copy the bare string without padding */ + out_arg->value.string = g_memdup (buf->data + offset, string_len); + out_arg->size = string_len; + } - /* move pointer to the end of the string data */ - *offset += (*string_len + pad_len); - - return result; + /* return bytes consumed by this function */ + return offset + string_len_padded - orig_offset; } @@ -377,64 +438,64 @@ xmm7360_command_to_byte_array (Xmm7360RpcCallId callid, return buf; } -static int +static gboolean xmm7360_rpc_msg_body_unpack (GByteArray *buf, GPtrArray *args, GError **error) { - GError *inner_error = NULL; - gsize offset; - gchar *str_value; - Xmm7360RpcMsgArg *arg; + gsize offset; + gint consumed; g_assert (buf != NULL && args != NULL); offset = 0; while (offset < buf->len) { + g_autoptr(Xmm7360RpcMsgArg) arg = NULL; + arg = g_new0 (Xmm7360RpcMsgArg, 1); arg->size = 0; switch (buf->data[offset]) { case 0x02: - xmm7360_byte_array_read_asn_int (buf, &offset, arg); + consumed = xmm7360_byte_array_read_asn_int (buf, + offset, + NULL, + arg, + error); + if (consumed < 0) + return FALSE; + offset += consumed; break; case 0x55: case 0x56: case 0x57: arg->type = XMM7360_RPC_MSG_ARG_TYPE_STRING; - str_value = xmm7360_byte_array_read_string (buf, &offset, &arg->size); - if (str_value == NULL) { - inner_error = g_error_new (MM_CORE_ERROR, - MM_CORE_ERROR_FAILED, - "Parsing a string failed"); - goto out; - } - arg->value.string = str_value; + consumed = xmm7360_byte_array_read_string (buf, + offset, + arg, + error); + if (consumed < 0) + return FALSE; + offset += consumed; break; default: arg->type = XMM7360_RPC_MSG_ARG_TYPE_UNKNOWN; - inner_error = g_error_new (MM_CORE_ERROR, - MM_CORE_ERROR_FAILED, - "Unknown type 0x%x", - buf->data[offset]); - goto out; + PARSE_ERROR ("Unknown type 0x%x", buf->data[offset]); + return FALSE; } - g_ptr_array_add (args, arg); + g_ptr_array_add (args, g_steal_pointer (&arg)); } -out: - if (inner_error) { - g_propagate_error (error, inner_error); - return -1; - } - - return 0; + return TRUE; } static Xmm7360RpcResponse * parse_response_xmm7360 (GByteArray *buf) { - GError *error = NULL; + g_autoptr(GError) error = NULL; Xmm7360RpcResponse *response = NULL; gsize offset; Xmm7360RpcMsgArg *arg; + gint consumed; + gint asn_msg_len = 0; + gint unsol_id = 0; /* first 20 bytes are format header: * message size ( int32, 4) @@ -442,26 +503,44 @@ parse_response_xmm7360 (GByteArray *buf) * unsolicited message id (asn int, 6) * transmission id ( int32, 4) */ - g_assert (buf->len > 20); - - offset = 4; - if (*(gint32 *) buf->data != xmm7360_byte_array_read_asn_int (buf, &offset, NULL)) { - mm_obj_dbg (NULL, "error parsing RPC message: length mismatch"); + if (buf->len <= 20) { + mm_obj_dbg (NULL, "error parsing RPC message: message size %u too short", buf->len); goto err; } + offset = 4; + consumed = xmm7360_byte_array_read_asn_int (buf, offset, &asn_msg_len, NULL, &error); + if (consumed < 0) { + mm_obj_dbg (NULL, "error parsing RPC message: error reading ASN message size: %s", + error->message); + goto err; + } + offset += consumed; + if (*(gint32 *) buf->data != asn_msg_len) { + mm_obj_dbg (NULL, "error parsing RPC message: length mismatch (buf %d != asn %d)", + *(gint32 *) buf->data, asn_msg_len); + goto err; + } + + consumed = xmm7360_byte_array_read_asn_int (buf, offset, &unsol_id, NULL, &error); + if (consumed < 0) { + mm_obj_dbg (NULL, "error parsing RPC message: error reading unsolicited message id: %s", + error->message); + goto err; + } + offset += consumed; + /* initialize all fields of the response */ response = g_new0 (Xmm7360RpcResponse, 1); response->id = GINT32_FROM_BE (*(gint32 *) (buf->data + 16)); response->type = XMM7360_RPC_RESPONSE_TYPE_UNKNOWN; - response->unsol_id = xmm7360_byte_array_read_asn_int (buf, &offset, NULL); + response->unsol_id = unsol_id; response->body = g_byte_array_new (); response->content = g_ptr_array_new_with_free_func ((GDestroyNotify)xmm7360_rpc_msg_arg_free); g_byte_array_append (response->body, &buf->data[20], buf->len - 20); - if (xmm7360_rpc_msg_body_unpack (response->body, response->content, &error) != 0) { + if (!xmm7360_rpc_msg_body_unpack (response->body, response->content, &error)) { mm_obj_dbg (NULL, "error parsing RPC message: unpacking failed: %s", error->message); - g_error_free (error); goto err; } From 07dc7e7304d81c3127d5259c309e89f819ff4ef4 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Mon, 5 Jan 2026 21:50:48 -0600 Subject: [PATCH 2/9] intel: XMM7360: return a GError from parse_response_xmm7360() Signed-off-by: Dan Williams --- .../intel/mm-port-serial-xmmrpc-xmm7360.c | 79 +++++++++---------- 1 file changed, 37 insertions(+), 42 deletions(-) diff --git a/src/plugins/intel/mm-port-serial-xmmrpc-xmm7360.c b/src/plugins/intel/mm-port-serial-xmmrpc-xmm7360.c index f90c5543..b02ba389 100644 --- a/src/plugins/intel/mm-port-serial-xmmrpc-xmm7360.c +++ b/src/plugins/intel/mm-port-serial-xmmrpc-xmm7360.c @@ -487,15 +487,13 @@ xmm7360_rpc_msg_body_unpack (GByteArray *buf, GPtrArray *args, GError **error) } static Xmm7360RpcResponse * -parse_response_xmm7360 (GByteArray *buf) +parse_response_xmm7360 (GByteArray *buf, GError **error) { - g_autoptr(GError) error = NULL; - Xmm7360RpcResponse *response = NULL; - gsize offset; - Xmm7360RpcMsgArg *arg; - gint consumed; - gint asn_msg_len = 0; - gint unsol_id = 0; + g_autoptr(Xmm7360RpcResponse) response = NULL; + gsize offset; + gint consumed; + gint asn_msg_len = 0; + gint unsol_id = 0; /* first 20 bytes are format header: * message size ( int32, 4) @@ -504,30 +502,26 @@ parse_response_xmm7360 (GByteArray *buf) * transmission id ( int32, 4) */ if (buf->len <= 20) { - mm_obj_dbg (NULL, "error parsing RPC message: message size %u too short", buf->len); - goto err; + PARSE_ERROR ("error parsing RPC message: message size %u too short", buf->len); + return NULL; } + /* Read and validate the ASN message size */ offset = 4; - consumed = xmm7360_byte_array_read_asn_int (buf, offset, &asn_msg_len, NULL, &error); - if (consumed < 0) { - mm_obj_dbg (NULL, "error parsing RPC message: error reading ASN message size: %s", - error->message); - goto err; - } + consumed = xmm7360_byte_array_read_asn_int (buf, offset, &asn_msg_len, NULL, error); + if (consumed < 0) + return NULL; offset += consumed; + /* Make sure the ASN message size and message size agree */ if (*(gint32 *) buf->data != asn_msg_len) { - mm_obj_dbg (NULL, "error parsing RPC message: length mismatch (buf %d != asn %d)", - *(gint32 *) buf->data, asn_msg_len); - goto err; + PARSE_ERROR ("error parsing RPC message: length mismatch (buf %d != asn %d)", + *(gint32 *) buf->data, asn_msg_len); + return NULL; } - consumed = xmm7360_byte_array_read_asn_int (buf, offset, &unsol_id, NULL, &error); - if (consumed < 0) { - mm_obj_dbg (NULL, "error parsing RPC message: error reading unsolicited message id: %s", - error->message); - goto err; - } + consumed = xmm7360_byte_array_read_asn_int (buf, offset, &unsol_id, NULL, error); + if (consumed < 0) + return NULL; offset += consumed; /* initialize all fields of the response */ @@ -539,10 +533,8 @@ parse_response_xmm7360 (GByteArray *buf) response->content = g_ptr_array_new_with_free_func ((GDestroyNotify)xmm7360_rpc_msg_arg_free); g_byte_array_append (response->body, &buf->data[20], buf->len - 20); - if (!xmm7360_rpc_msg_body_unpack (response->body, response->content, &error)) { - mm_obj_dbg (NULL, "error parsing RPC message: unpacking failed: %s", error->message); - goto err; - } + if (!xmm7360_rpc_msg_body_unpack (response->body, response->content, error)) + return NULL; if (response->id == 0x11000100) { response->type = XMM7360_RPC_RESPONSE_TYPE_RESPONSE; @@ -550,14 +542,17 @@ parse_response_xmm7360 (GByteArray *buf) if (response->unsol_id >= 0x7d0) { response->type = XMM7360_RPC_RESPONSE_TYPE_ASYNC_ACK; } else { + Xmm7360RpcMsgArg *arg; + response->type = XMM7360_RPC_RESPONSE_TYPE_RESPONSE; /* discard first element in content (equals transmission id) */ arg = (Xmm7360RpcMsgArg *) g_ptr_array_index (response->content, 0); if (arg->type != XMM7360_RPC_MSG_ARG_TYPE_LONG || (guint32) XMM7360_RPC_MSG_ARG_GET_INT (arg) != response->id) { - mm_obj_dbg (NULL, "error parsing RPC message: invalid start of async response body"); - goto err; + PARSE_ERROR ("error parsing RPC message: invalid start of async response body (type %u not LONG or ID mismatch)", + arg->type); + return NULL; } g_ptr_array_remove_index (response->content, 0); g_byte_array_remove_range (response->body, 0, 6); @@ -566,12 +561,7 @@ parse_response_xmm7360 (GByteArray *buf) response->type = XMM7360_RPC_RESPONSE_TYPE_UNSOLICITED; } - return response; - -err: - if (response) - xmm7360_rpc_response_free (response); - return NULL; + return g_steal_pointer (&response); } static MMPortSerialResponseType @@ -609,7 +599,11 @@ serial_command_ready (MMPortSerial *port, return; } - response = parse_response_xmm7360 (response_buffer); + response = parse_response_xmm7360 (response_buffer, &error); + if (!response) { + mm_obj_dbg (port, "%s", error->message); + g_clear_error (&error); + } if (response_buffer->len > 0) g_byte_array_remove_range (response_buffer, 0, response_buffer->len); g_byte_array_unref (response_buffer); @@ -728,13 +722,14 @@ mm_port_serial_xmmrpc_xmm7360_enable_unsolicited_msg_handler (MMPortSerialXmmrpc static void parse_unsolicited (MMPortSerial *port, GByteArray *response_buffer) { - MMPortSerialXmmrpcXmm7360 *self = MM_PORT_SERIAL_XMMRPC_XMM7360 (port); - g_autoptr(Xmm7360RpcResponse) response = NULL; + MMPortSerialXmmrpcXmm7360 *self = MM_PORT_SERIAL_XMMRPC_XMM7360 (port); + g_autoptr(Xmm7360RpcResponse) response = NULL; + g_autoptr(GError) error = NULL; GSList *iter; - response = parse_response_xmm7360 (response_buffer); - + response = parse_response_xmm7360 (response_buffer, &error); if (!response) { + mm_obj_dbg (port, "%s", error->message); return; } From 3f7b39075c379f31b009af7665890ef32f1591c8 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Mon, 5 Jan 2026 22:14:56 -0600 Subject: [PATCH 3/9] intel: XMM7360: move standalone protocol functions to their own file So we can unit-test all the parsing and building code more easily without having to link to a bunch of serial port stuff. Signed-off-by: Dan Williams --- .../intel/mm-port-serial-xmmrpc-xmm7360.c | 508 +--------------- .../intel/mm-port-serial-xmmrpc-xmm7360.h | 512 +--------------- .../intel/mm-xmmrpc-xmm7360-protocol.c | 535 +++++++++++++++++ .../intel/mm-xmmrpc-xmm7360-protocol.h | 549 ++++++++++++++++++ src/plugins/meson.build | 3 +- 5 files changed, 1089 insertions(+), 1018 deletions(-) create mode 100644 src/plugins/intel/mm-xmmrpc-xmm7360-protocol.c create mode 100644 src/plugins/intel/mm-xmmrpc-xmm7360-protocol.h diff --git a/src/plugins/intel/mm-port-serial-xmmrpc-xmm7360.c b/src/plugins/intel/mm-port-serial-xmmrpc-xmm7360.c index b02ba389..ddce64b5 100644 --- a/src/plugins/intel/mm-port-serial-xmmrpc-xmm7360.c +++ b/src/plugins/intel/mm-port-serial-xmmrpc-xmm7360.c @@ -33,255 +33,6 @@ struct _MMPortSerialXmmrpcXmm7360Private { guint unsolicited_msg_handlers_i; }; -static void -xmm7360_rpc_msg_arg_free (Xmm7360RpcMsgArg *arg) -{ - if (arg->type == XMM7360_RPC_MSG_ARG_TYPE_STRING) { - g_free ((gchar *) arg->value.string); - } - g_free (arg); -} - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (Xmm7360RpcMsgArg, xmm7360_rpc_msg_arg_free) - -void -xmm7360_rpc_response_free (Xmm7360RpcResponse *response) -{ - if (response) { - g_byte_array_free (response->body, TRUE); - g_ptr_array_free (response->content, TRUE); - g_free (response); - } -} - -#define PARSE_ERROR(fmt, ...) { \ - g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, fmt, __VA_ARGS__); \ -} - -static gint -xmm7360_byte_array_read_asn_int (GByteArray *buf, - gsize offset, - gint *out_val, - Xmm7360RpcMsgArg *out_arg, - GError **error) -{ - const gsize orig_offset = offset; - gint size; - gint bytes_read; - gint val; - - if (buf->len <= offset + 2) { - PARSE_ERROR ("initial buffer size %u too small (need %zu)", - buf->len, offset + 2); - return -1; - } - - /* check ASN start byte and read int size */ - if (buf->data[offset] != 0x02) { - PARSE_ERROR ("unexpected ASN start byte 0x%02X (expected 0x02)", buf->data[offset]); - return -1; - } - offset++; - size = buf->data[offset++]; - - /* read actual value byte by byte */ - if (buf->len < offset + size) { - PARSE_ERROR ("buffer size %u too small (need %zu)", buf->len, offset + size); - return -1; - } - val = 0; - for (bytes_read = 0; bytes_read < size; bytes_read++) { - val <<= 8; - val |= buf->data[offset++]; - } - - if (out_arg) { - if (size == 0x01) { - out_arg->type = XMM7360_RPC_MSG_ARG_TYPE_BYTE; - out_arg->value.b = (gint8) val; - } else if (size == 0x02) { - out_arg->type = XMM7360_RPC_MSG_ARG_TYPE_SHORT; - out_arg->value.s = (gint16) val; - } else { - out_arg->type = XMM7360_RPC_MSG_ARG_TYPE_LONG; - out_arg->value.l = (gint32) val; - } - } - - if (out_val) - *out_val = val; - - /* return bytes consumed by this function */ - return offset - orig_offset; -} - -static gint -xmm7360_byte_array_read_string (GByteArray *buf, - gsize offset, - Xmm7360RpcMsgArg *out_arg, - GError **error) -{ - const gsize orig_offset = offset; - guchar string_type; - gint string_len_padded; - gint pad_len; - gint string_len; - gint consumed; - - if (buf->len < offset + 2) { - PARSE_ERROR ("initial buffer size %u too small (need %zu)", - buf->len, offset + 2); - return -1; - } - - string_type = buf->data[offset++]; - if (string_type != 0x55 && string_type != 0x56 && string_type != 0x57) { - PARSE_ERROR ("unhandled string type 0x%02X", string_type); - return -1; - } - - string_len = buf->data[offset++]; - if (string_len & 0x80) { - guchar bytelen; - guint8 i; - - bytelen = string_len & 0x0f; - if (bytelen > 4) { - PARSE_ERROR ("unhandled string length size 0x%02X", bytelen); - return -1; - } else if (buf->len <= offset + bytelen) { - PARSE_ERROR ("string len buffer size %u too small (need %zu)", - buf->len, offset + bytelen); - return -1; - } - - string_len = 0; - for (i = 0; i < bytelen; i++) - string_len |= buf->data[offset++] << (i * 8); - } - - if (string_type == 0x56) { - /* 0x56 contains 2-byte chars */ - string_len <<= 1; - } else if (string_type == 0x57) { - /* 0x57 contains 4-byte chars */ - string_len <<= 2; - } - - consumed = xmm7360_byte_array_read_asn_int (buf, offset, &string_len_padded, NULL, error); - if (consumed < 0) - return -1; - offset += consumed; - - consumed = xmm7360_byte_array_read_asn_int (buf, offset, &pad_len, NULL, error); - if (consumed < 0) - return -1; - offset += consumed; - - if (string_len_padded > 0) { - if (string_len_padded != string_len + pad_len) { - PARSE_ERROR ("padded string len %u mismatch (expected %u)", - string_len_padded, string_len + pad_len); - return -1; - } - } else { - string_len_padded = string_len + pad_len; - } - - /* make sure the buffer is large enough */ - if (buf->len < offset + string_len_padded) { - PARSE_ERROR ("padded string len buffer size %u too small (need %zu)", - buf->len, offset + string_len_padded); - return -1; - } - - /* copy the result */ - if (out_arg) { - out_arg->type = XMM7360_RPC_MSG_ARG_TYPE_STRING; - /* Copy the bare string without padding */ - out_arg->value.string = g_memdup (buf->data + offset, string_len); - out_arg->size = string_len; - } - - /* return bytes consumed by this function */ - return offset + string_len_padded - orig_offset; -} - - -void -xmm7360_byte_array_append_asn_int4 (GByteArray *buf, gint32 value) -{ - gint32 value_be = GINT32_TO_BE (value); - g_byte_array_append (buf, (const guint8 *) "\x02\x04", 2); - g_byte_array_append (buf, (const guint8 *) &value_be, 4); -} - -static void -xmm7360_byte_array_append_uint8 (GByteArray *buf, gulong val) -{ - guint8 _val = (guint8) val; - g_byte_array_append (buf, &_val, 1); -} - -static void -xmm7360_byte_array_append_string (GByteArray *buf, - const guint8 *data, - gsize data_len, - guint data_len_padded) -{ - gsize i; - gsize pad_len; - - g_assert (data_len_padded >= data_len); - pad_len = data_len_padded - data_len; - - /* only support 1-byte element size */ - xmm7360_byte_array_append_uint8 (buf, 0x55); - - if (data_len < 0x80) { - xmm7360_byte_array_append_uint8 (buf, data_len); - } else { - guchar bytelen = 0x80; - /* write dummy first byte (updated later) */ - xmm7360_byte_array_append_uint8 (buf, bytelen); - for (i = data_len; i > 0; i >>= 8) { - bytelen++; - xmm7360_byte_array_append_uint8 (buf, i & 0xff); - } - /* update first byte */ - buf->data[buf->len - 1 - (bytelen & 0x7f)] = bytelen; - } - - xmm7360_byte_array_append_asn_int4 (buf, data_len_padded); - xmm7360_byte_array_append_asn_int4 (buf, pad_len); - g_byte_array_append (buf, data, data_len); - for (i = 0; i < pad_len; i++) { - xmm7360_byte_array_append_uint8 (buf, 0); - } -} - -static GString * -xmm7360_byte_array_hexlify (GByteArray *buf) { - GString *string; - gsize i; - - string = g_string_sized_new (2 * buf->len + 1); - for (i = 0; i < buf->len; i++) { - g_string_append_printf (string, "%02x", buf->data[i]); - } - g_string_append (string, ""); - - /* truncate very long strings to avoid overly verbose logs */ - if (string->len > 64) { - gsize string_len; - string_len = string->len; - g_string_truncate (string, 48); - g_string_append_printf (string, "... (%" G_GSIZE_FORMAT " chars)", string_len); - } - - return string; -} - static void xmm7360_byte_array_log (gpointer obj, const gchar *prefix, GByteArray *buf) { @@ -292,46 +43,6 @@ xmm7360_byte_array_log (gpointer obj, const gchar *prefix, GByteArray *buf) g_string_free (hexlified, TRUE); } -static GString * -xmm7360_rpc_args_to_string (GPtrArray *args) -{ - guint i; - GString *result; - Xmm7360RpcMsgArg *arg; - gint16 arg_value_short; - gint32 arg_value_long; - - result = g_string_new (""); - - for (i = 0; i < args->len; i++) { - arg = (Xmm7360RpcMsgArg *) g_ptr_array_index (args, i); - if (i > 0) { - g_string_append (result, " "); - } - switch (arg->type) { - case XMM7360_RPC_MSG_ARG_TYPE_BYTE: - g_string_append_printf (result, "B(0x%02x)", arg->value.b); - break; - case XMM7360_RPC_MSG_ARG_TYPE_SHORT: - arg_value_short = GINT16_TO_BE (arg->value.s); - g_string_append_printf (result, "S(0x%04x)", arg_value_short); - break; - case XMM7360_RPC_MSG_ARG_TYPE_LONG: - arg_value_long = GINT32_TO_BE (arg->value.l); - g_string_append_printf (result, "L(0x%08x)", arg_value_long); - break; - case XMM7360_RPC_MSG_ARG_TYPE_STRING: - g_string_append_printf (result, "STR(size=%" G_GSIZE_FORMAT ")", arg->size); - break; - case XMM7360_RPC_MSG_ARG_TYPE_UNKNOWN: - default: - g_assert_not_reached (); - } - } - - return result; -} - static void xmm7360_rpc_msg_args_log (gpointer obj, const gchar *prefix, GPtrArray *args) { @@ -349,221 +60,6 @@ xmm7360_rpc_msg_args_log (gpointer obj, const gchar *prefix, GPtrArray *args) g_string_free (args_string, TRUE); } -GByteArray * -xmm7360_rpc_args_to_byte_array (const Xmm7360RpcMsgArg *args) -{ - GByteArray *result; - gint16 arg_value_short; - gint32 arg_value_long; - - if (args == NULL) - return NULL; - - result = g_byte_array_new (); - for (; args->type != XMM7360_RPC_MSG_ARG_TYPE_UNKNOWN; args++) { - switch (args->type) { - case XMM7360_RPC_MSG_ARG_TYPE_BYTE: - g_byte_array_append (result, (guint8[]) { 0x02, 0x01 }, 2); - g_byte_array_append (result, (guint8 *) &(args->value.b), 1); - break; - case XMM7360_RPC_MSG_ARG_TYPE_SHORT: - arg_value_short = GINT16_TO_BE (args->value.s); - g_byte_array_append (result, (guint8[]) { 0x02, 0x02 }, 2); - g_byte_array_append (result, (guint8 *) &arg_value_short, 2); - break; - case XMM7360_RPC_MSG_ARG_TYPE_LONG: - arg_value_long = GINT32_TO_BE (args->value.l); - g_byte_array_append (result, (guint8[]) { 0x02, 0x04 }, 2); - g_byte_array_append (result, (guint8 *) &arg_value_long, 4); - break; - case XMM7360_RPC_MSG_ARG_TYPE_STRING: - xmm7360_byte_array_append_string (result, - (const guint8 *) args->value.string, - args->size, - args->size + args->pad); - break; - case XMM7360_RPC_MSG_ARG_TYPE_UNKNOWN: - default: - /* should be unreachable */ - return NULL; - } - } - return result; -} - -static GByteArray * -xmm7360_command_to_byte_array (Xmm7360RpcCallId callid, - gboolean is_async, - GByteArray *body) -{ - GByteArray *buf; - gint32 tid; - gint32 tid_word; - gint32 tid_word_be; - guint32 total_len; - - buf = g_byte_array_sized_new (22); - - if (body == NULL) { - body = g_byte_array_new (); - xmm7360_byte_array_append_asn_int4 (body, 0); - } else { - g_byte_array_ref (body); - } - - if (is_async) { - tid = 0x11000101; - } else { - tid = 0; - } - tid_word = 0x11000100 | tid; - - total_len = body->len + 16; - if (tid) { - total_len += 6; - } - g_byte_array_append (buf, (const guint8 *) &total_len, 4); - xmm7360_byte_array_append_asn_int4 (buf, total_len); - xmm7360_byte_array_append_asn_int4 (buf, callid); - tid_word_be = GINT32_TO_BE (tid_word); - g_byte_array_append (buf, (const guint8 *) &tid_word_be, 4); - if (tid) { - xmm7360_byte_array_append_asn_int4 (buf, tid); - } - - g_assert (total_len == buf->len + body->len - 4); - g_byte_array_append (buf, (const guint8 *) body->data, body->len); - g_byte_array_unref (body); - - return buf; -} - -static gboolean -xmm7360_rpc_msg_body_unpack (GByteArray *buf, GPtrArray *args, GError **error) -{ - gsize offset; - gint consumed; - - g_assert (buf != NULL && args != NULL); - - offset = 0; - while (offset < buf->len) { - g_autoptr(Xmm7360RpcMsgArg) arg = NULL; - - arg = g_new0 (Xmm7360RpcMsgArg, 1); - arg->size = 0; - switch (buf->data[offset]) { - case 0x02: - consumed = xmm7360_byte_array_read_asn_int (buf, - offset, - NULL, - arg, - error); - if (consumed < 0) - return FALSE; - offset += consumed; - break; - case 0x55: - case 0x56: - case 0x57: - arg->type = XMM7360_RPC_MSG_ARG_TYPE_STRING; - consumed = xmm7360_byte_array_read_string (buf, - offset, - arg, - error); - if (consumed < 0) - return FALSE; - offset += consumed; - break; - default: - arg->type = XMM7360_RPC_MSG_ARG_TYPE_UNKNOWN; - PARSE_ERROR ("Unknown type 0x%x", buf->data[offset]); - return FALSE; - } - g_ptr_array_add (args, g_steal_pointer (&arg)); - } - - return TRUE; -} - -static Xmm7360RpcResponse * -parse_response_xmm7360 (GByteArray *buf, GError **error) -{ - g_autoptr(Xmm7360RpcResponse) response = NULL; - gsize offset; - gint consumed; - gint asn_msg_len = 0; - gint unsol_id = 0; - - /* first 20 bytes are format header: - * message size ( int32, 4) - * message size (again!) (asn int, 6) - * unsolicited message id (asn int, 6) - * transmission id ( int32, 4) - */ - if (buf->len <= 20) { - PARSE_ERROR ("error parsing RPC message: message size %u too short", buf->len); - return NULL; - } - - /* Read and validate the ASN message size */ - offset = 4; - consumed = xmm7360_byte_array_read_asn_int (buf, offset, &asn_msg_len, NULL, error); - if (consumed < 0) - return NULL; - offset += consumed; - /* Make sure the ASN message size and message size agree */ - if (*(gint32 *) buf->data != asn_msg_len) { - PARSE_ERROR ("error parsing RPC message: length mismatch (buf %d != asn %d)", - *(gint32 *) buf->data, asn_msg_len); - return NULL; - } - - consumed = xmm7360_byte_array_read_asn_int (buf, offset, &unsol_id, NULL, error); - if (consumed < 0) - return NULL; - offset += consumed; - - /* initialize all fields of the response */ - response = g_new0 (Xmm7360RpcResponse, 1); - response->id = GINT32_FROM_BE (*(gint32 *) (buf->data + 16)); - response->type = XMM7360_RPC_RESPONSE_TYPE_UNKNOWN; - response->unsol_id = unsol_id; - response->body = g_byte_array_new (); - response->content = g_ptr_array_new_with_free_func ((GDestroyNotify)xmm7360_rpc_msg_arg_free); - - g_byte_array_append (response->body, &buf->data[20], buf->len - 20); - if (!xmm7360_rpc_msg_body_unpack (response->body, response->content, error)) - return NULL; - - if (response->id == 0x11000100) { - response->type = XMM7360_RPC_RESPONSE_TYPE_RESPONSE; - } else if ((response->id & 0xffffff00) == 0x11000100) { - if (response->unsol_id >= 0x7d0) { - response->type = XMM7360_RPC_RESPONSE_TYPE_ASYNC_ACK; - } else { - Xmm7360RpcMsgArg *arg; - - response->type = XMM7360_RPC_RESPONSE_TYPE_RESPONSE; - - /* discard first element in content (equals transmission id) */ - arg = (Xmm7360RpcMsgArg *) g_ptr_array_index (response->content, 0); - if (arg->type != XMM7360_RPC_MSG_ARG_TYPE_LONG - || (guint32) XMM7360_RPC_MSG_ARG_GET_INT (arg) != response->id) { - PARSE_ERROR ("error parsing RPC message: invalid start of async response body (type %u not LONG or ID mismatch)", - arg->type); - return NULL; - } - g_ptr_array_remove_index (response->content, 0); - g_byte_array_remove_range (response->body, 0, 6); - } - } else { - response->type = XMM7360_RPC_RESPONSE_TYPE_UNSOLICITED; - } - - return g_steal_pointer (&response); -} - static MMPortSerialResponseType parse_response (MMPortSerial *port, GByteArray *response_buffer, @@ -599,7 +95,7 @@ serial_command_ready (MMPortSerial *port, return; } - response = parse_response_xmm7360 (response_buffer, &error); + response = xmm7360_parse_response (response_buffer, &error); if (!response) { mm_obj_dbg (port, "%s", error->message); g_clear_error (&error); @@ -727,7 +223,7 @@ parse_unsolicited (MMPortSerial *port, GByteArray *response_buffer) g_autoptr(GError) error = NULL; GSList *iter; - response = parse_response_xmm7360 (response_buffer, &error); + response = xmm7360_parse_response (response_buffer, &error); if (!response) { mm_obj_dbg (port, "%s", error->message); return; diff --git a/src/plugins/intel/mm-port-serial-xmmrpc-xmm7360.h b/src/plugins/intel/mm-port-serial-xmmrpc-xmm7360.h index 59cc0dd6..31efaef2 100644 --- a/src/plugins/intel/mm-port-serial-xmmrpc-xmm7360.h +++ b/src/plugins/intel/mm-port-serial-xmmrpc-xmm7360.h @@ -23,509 +23,7 @@ #include #include "mm-port-serial.h" - -typedef enum { - XMM7360_RPC_CALL_UTA_MS_SIM_OPEN_REQ = 0x001, - XMM7360_RPC_CALL_UTA_MS_SIM_APDU_CMD_REQ = 0x002, - XMM7360_RPC_CALL_UTA_MS_SIM_APPLICATION_REQ = 0x004, - XMM7360_RPC_CALL_UTA_MS_SIM_DECODE_FCP = 0x006, - XMM7360_RPC_CALL_UTA_MS_SIM_PB_READ_ENTRY_REQ = 0x00d, - XMM7360_RPC_CALL_UTA_MS_SIM_GEN_PIN_REQ = 0x00f, - XMM7360_RPC_CALL_UTA_MS_SIM_MODIFY_LOCK_REQ = 0x011, - XMM7360_RPC_CALL_UTA_MS_SIM_TK_PROACTIVE_COMMAND_RSP = 0x016, - XMM7360_RPC_CALL_UTA_MS_SIM_TK_ENVELOPE_COMMAND_REQ = 0x017, - XMM7360_RPC_CALL_UTA_MS_SIM_TK_TERMINAL_PROFILE_READ_REQ = 0x019, - XMM7360_RPC_CALL_UTA_MS_SIM_TK_REGISTER_HANDLER = 0x01c, - XMM7360_RPC_CALL_UTA_MS_SIM_TK_DEREGISTER_HANDLER = 0x01d, - XMM7360_RPC_CALL_UTA_MS_CPS_SET_MODE_REQ = 0x01f, - XMM7360_RPC_CALL_UTA_MS_CPS_SET_STACK_MODE_CONFIGURATION = 0x020, - XMM7360_RPC_CALL_UTA_MS_CPS_SET_SIM_MODE_CONFIGURATION = 0x021, - XMM7360_RPC_CALL_UTA_MS_CPS_READ_IMEI = 0x023, - XMM7360_RPC_CALL_UTA_MS_CALL_CS_INIT = 0x024, - XMM7360_RPC_CALL_UTA_MS_CBS_INIT = 0x025, - XMM7360_RPC_CALL_UTA_MS_SS_INIT = 0x026, - XMM7360_RPC_CALL_UTA_MS_SS_SEND_USSD_REQ = 0x027, - XMM7360_RPC_CALL_UTA_MS_SS_RESPOND_USSD = 0x028, - XMM7360_RPC_CALL_UTA_MS_SS_ABORT = 0x029, - XMM7360_RPC_CALL_UTA_MS_SMS_INIT = 0x030, - XMM7360_RPC_CALL_UTA_MS_SMS_SEND_REQ = 0x031, - XMM7360_RPC_CALL_UTA_MS_SMS_SET_MEMORY_AVAILABLE_REQ = 0x034, - XMM7360_RPC_CALL_UTA_MS_SMS_INCOMING_SMS_ACK = 0x036, - XMM7360_RPC_CALL_UTA_MS_SMS_SIM_MSG_COUNT_REQ = 0x038, - XMM7360_RPC_CALL_UTA_MS_CALL_PS_INITIALIZE = 0x03a, - XMM7360_RPC_CALL_UTA_MS_CALL_PS_OBTAIN_PDP_CONTEXT_ID = 0x03b, - XMM7360_RPC_CALL_UTA_MS_CALL_PS_RELEASE_PDP_CONTEXT_ID = 0x03c, - XMM7360_RPC_CALL_UTA_MS_CALL_PS_DEFINE_PRIMARY_REQ = 0x03d, - XMM7360_RPC_CALL_UTA_MS_CALL_PS_UNDEFINE_PRIMARY_REQ = 0x03f, - XMM7360_RPC_CALL_UTA_MS_CALL_PS_GET_PRIMARY_REQ = 0x041, - XMM7360_RPC_CALL_UTA_MS_CALL_PS_SET_AUTHENTICATION_REQ = 0x043, - XMM7360_RPC_CALL_UTA_MS_CALL_PS_SET_DNS_REQ = 0x045, - XMM7360_RPC_CALL_UTA_MS_CALL_PS_GET_NEGOTIATED_DNS_REQ = 0x047, - XMM7360_RPC_CALL_UTA_MS_CALL_PS_GET_NEG_IP_ADDR_REQ = 0x049, - XMM7360_RPC_CALL_UTA_MS_CALL_PS_ACTIVATE_REQ = 0x04b, - XMM7360_RPC_CALL_UTA_MS_CALL_PS_DEACTIVATE_REQ = 0x04e, - XMM7360_RPC_CALL_UTA_MS_CALL_PS_CONNECT_REQ = 0x051, - XMM7360_RPC_CALL_UTA_MS_NET_OPEN = 0x053, - XMM7360_RPC_CALL_UTA_MS_NET_SET_RADIO_SIGNAL_REPORTING = 0x054, - XMM7360_RPC_CALL_UTA_MS_NET_SINGLE_SHOT_RADIO_SIGNAL_REPORTING_REQ = 0x055, - XMM7360_RPC_CALL_UTA_MS_NET_ATTACH_REQ = 0x05c, - XMM7360_RPC_CALL_UTA_MS_NET_PS_ATTACH_REQ = 0x05d, - XMM7360_RPC_CALL_UTA_MS_NET_PS_DETACH_REQ = 0x05e, - XMM7360_RPC_CALL_UTA_MS_NET_SCAN_REQ = 0x05f, - XMM7360_RPC_CALL_UTA_MS_NET_SCAN_ABORT = 0x060, - XMM7360_RPC_CALL_UTA_MS_NET_POWER_DOWN_REQ = 0x061, - XMM7360_RPC_CALL_UTA_MS_NET_EXT_SCAN_REQ = 0x062, - XMM7360_RPC_CALL_UTA_MS_NET_SET_FD_CONFIG_REQ = 0x06e, - XMM7360_RPC_CALL_UTA_MS_NET_GET_FD_CONFIG_REQ = 0x071, - XMM7360_RPC_CALL_UTA_MS_NET_CONFIGURE_NETWORK_MODE_REQ = 0x073, - XMM7360_RPC_CALL_UTA_MS_NET_RAT_MODE_STATUS_REQ = 0x076, - XMM7360_RPC_CALL_UTA_NVM_READ = 0x079, - XMM7360_RPC_CALL_UTA_NVM_WRITE = 0x07a, - XMM7360_RPC_CALL_UTA_NVM_WRITE_COMMIT = 0x07b, - XMM7360_RPC_CALL_UTA_SYS_GET_INFO = 0x07c, - XMM7360_RPC_CALL_UTA_RPC_PS_CONNECT_SETUP_REQ = 0x07d, - XMM7360_RPC_CALL_UTA_RPC_PS_CONNECT_TO_DATACHANNEL_REQ = 0x07e, - XMM7360_RPC_CALL_UTA_RPC_PS_CONNECT_RELEASE_REQ = 0x07f, - XMM7360_RPC_CALL_UTA_MS_NET_DC_SET_VOICE_DOMAIN_PREFERENCE_CONFIG_REQ = 0x080, - XMM7360_RPC_CALL_UTA_MS_CALL_CS_SETUP_VOICE_CALL_REQ = 0x082, - XMM7360_RPC_CALL_UTA_MS_CALL_CS_RELEASE_CALL_REQ = 0x088, - XMM7360_RPC_CALL_UTA_MS_CALL_CS_ACCEPT_CALL_REQ = 0x08d, - XMM7360_RPC_CALL_UTA_MS_CALL_CS_SWAP_CALLS_REQ = 0x090, - XMM7360_RPC_CALL_UTA_MS_CALL_CS_HOLD_CALL_REQ = 0x092, - XMM7360_RPC_CALL_UTA_MS_CALL_CS_RETRIEVE_CALL_REQ = 0x094, - XMM7360_RPC_CALL_UTA_MS_CALL_CS_SPLIT_MPTY_REQ = 0x096, - XMM7360_RPC_CALL_UTA_MS_CALL_CS_JOIN_CALLS_REQ = 0x098, - XMM7360_RPC_CALL_UTA_MS_CALL_CS_TRANSFER_CALLS_REQ = 0x09a, - XMM7360_RPC_CALL_UTA_MS_CALL_CS_START_DTMF_REQ = 0x09c, - XMM7360_RPC_CALL_UTA_MS_CALL_CS_STOP_DTMF_REQ = 0x09e, - XMM7360_RPC_CALL_UTA_MS_CALL_CS_SET_UUS1_INFO = 0x0a6, - XMM7360_RPC_CALL_UTA_MS_CALL_CS_SET_TTY_DEVICE_MODE = 0x0a7, - XMM7360_RPC_CALL_UTA_MS_CALL_CS_GET_TTY_DEVICE_MODE = 0x0a8, - XMM7360_RPC_CALL_UTA_MS_CALL_MULTIMEDIA_SETUP_CALL_REQ = 0x0ac, - XMM7360_RPC_CALL_UTA_MS_CALL_MULTIMEDIA_UPDATE_CALL_REQ = 0x0ad, - XMM7360_RPC_CALL_UTA_MS_CPS_SET_SIM_MODE_REQ = 0x0b0, - XMM7360_RPC_CALL_UTA_MS_SS_CALL_FORWARD_REQ = 0x0b2, - XMM7360_RPC_CALL_UTA_MS_SS_CALL_WAITING_REQ = 0x0b4, - XMM7360_RPC_CALL_UTA_MS_SS_CALL_BARRING_REQ = 0x0b6, - XMM7360_RPC_CALL_UTA_MS_SS_IDENTIFICATION_REQ = 0x0b8, - XMM7360_RPC_CALL_UTA_MS_SMS_SET_SEND_MORE_MESSAGES_STATUS = 0x0ba, - XMM7360_RPC_CALL_UTA_MS_SMS_DATA_DOWNLOAD_REQ = 0x0bb, - XMM7360_RPC_CALL_UTA_MS_SMS_DATA_DOWNLOAD_ACK = 0x0bd, - XMM7360_RPC_CALL_UTA_MS_CALL_PS_GET_NEG_QOS_REQ = 0x0be, - XMM7360_RPC_CALL_UTA_MS_CALL_PS_GET_TFT_REQ = 0x0c0, - XMM7360_RPC_CALL_UTA_MS_CALL_PS_SET_PCO_REQ = 0x0c2, - XMM7360_RPC_CALL_UTA_MS_CALL_PS_GET_NW_PCO_REQ = 0x0c4, - XMM7360_RPC_CALL_UTA_MS_CALL_PS_NW_ACTIVATE_ACCEPT_REQ = 0x0c7, - XMM7360_RPC_CALL_UTA_MS_CALL_PS_NW_ACTIVATE_REJECT_REQ = 0x0c9, - XMM7360_RPC_CALL_UTA_MS_CALL_PS_SET_DATA_PREF_REQ = 0x0cd, - XMM7360_RPC_CALL_UTA_MS_CBS_START_REQ = 0x0cf, - XMM7360_RPC_CALL_UTA_MS_CBS_STOP_REQ = 0x0d0, - XMM7360_RPC_CALL_UTA_MS_CBS_SET_MSG_FILTER = 0x0d3, - XMM7360_RPC_CALL_UTA_MS_CBS_GET_MSG_FILTER = 0x0d4, - XMM7360_RPC_CALL_UTA_MS_CBS_ETWS_CONFIG_REQ = 0x0d6, - XMM7360_RPC_CALL_UTA_MS_CBS_ETWS_START_REQ = 0x0d8, - XMM7360_RPC_CALL_UTA_MS_CBS_ETWS_STOP_REQ = 0x0da, - XMM7360_RPC_CALL_UTA_MS_CPS_NVM_WRITE = 0x0de, - XMM7360_RPC_CALL_UTA_MS_CPS_NVM_READ = 0x0df, - XMM7360_RPC_CALL_UTA_MS_NET_CONFIGURE_RX_DIVERSITY_DARP = 0x0e0, - XMM7360_RPC_CALL_UTA_MS_NET_LDR_GET_APN_PARAMETER_LIST = 0x0e2, - XMM7360_RPC_CALL_UTA_MS_NET_TIME_INFO_READ_REQ = 0x0e3, - XMM7360_RPC_CALL_UTA_MS_NET_SET_CSG_CONFIG_REQ = 0x0e6, - XMM7360_RPC_CALL_UTA_MS_NET_BAND_STATUS_REQ = 0x0e7, - XMM7360_RPC_CALL_UTA_MS_NET_GET_EXTENDED_RADIO_SIGNAL_INFO_REQ = 0x0ec, - XMM7360_RPC_CALL_UTA_MS_NET_DETACH_REQ = 0x0ef, - XMM7360_RPC_CALL_UTA_MS_NET_SELECT_GPRS_CLASS_REQ = 0x0f1, - XMM7360_RPC_CALL_UTA_MS_NET_GET_CSG_CONFIG_REQ = 0x0f3, - XMM7360_RPC_CALL_UTA_MS_NET_CS_SERVICE_NOTIFICATION_ACCEPT = 0x0f4, - XMM7360_RPC_CALL_UTA_MS_NET_SINGLE_SHOT_FD_REQ = 0x0f9, - XMM7360_RPC_CALL_UTA_MS_SIM_PB_LOCATION_REQ = 0x0fb, - XMM7360_RPC_CALL_UTA_MS_SIM_PB_READ_GAS_ENTRY_REQ = 0x0fd, - XMM7360_RPC_CALL_UTA_MS_SIM_PB_WRITE_ENTRY_REQ = 0x0ff, - XMM7360_RPC_CALL_UTA_MS_SIM_PB_GET_META_INFORMATION_REQ = 0x101, - XMM7360_RPC_CALL_UTA_MS_SIM_PB_USIM_PB_SELECT_REQ = 0x103, - XMM7360_RPC_CALL_UTA_MS_SIM_PB_GET_FREE_RECORDS_REQ = 0x105, - XMM7360_RPC_CALL_UTA_MS_SIM_CREATE_READ_BINARY_APDU = 0x10a, - XMM7360_RPC_CALL_UTA_MS_SIM_CREATE_UPDATE_BINARY_APDU = 0x10b, - XMM7360_RPC_CALL_UTA_MS_SIM_ANALYSE_READ_RESULT = 0x10c, - XMM7360_RPC_CALL_UTA_MS_SIM_SET_FDN_REQ = 0x10e, - XMM7360_RPC_CALL_SET_AP_SCREEN_STATE = 0x110, - XMM7360_RPC_CALL_UTA_IO_CTL = 0x111, - XMM7360_RPC_CALL_UTA_IDC_AP_MSG_SET_REQ = 0x114, - XMM7360_RPC_CALL_UTA_IDC_AP_MSG_GET_REQ = 0x115, - XMM7360_RPC_CALL_UTA_IDC_ENBLE_REQ = 0x116, - XMM7360_RPC_CALL_UTA_IDC_CWS_MSG_SET_REQ = 0x119, - XMM7360_RPC_CALL_UTA_IDC_CWS_MSG_GET_REQ = 0x11a, - XMM7360_RPC_CALL_UTA_IDC_SUBSCRIBE_INDICATIONS = 0x11c, - XMM7360_RPC_CALL_UTA_IDC_UNSUBSCRIBE_INDICATIONS = 0x11d, - XMM7360_RPC_CALL_UTA_BOOT_PREPARE_SHUTDOWN_REQ = 0x11f, - XMM7360_RPC_CALL_UTA_BOOT_SHUTDOWN_REQ = 0x120, - XMM7360_RPC_CALL_UTA_RF_MAX_TX_PWR_SET_2G = 0x121, - XMM7360_RPC_CALL_UTA_RF_MAX_TX_PWR_SET_3G = 0x122, - XMM7360_RPC_CALL_UTA_RF_MAX_TX_PWR_SET_4G = 0x123, - XMM7360_RPC_CALL_UTA_FREQ_INFO_ACTIVATE_REQ = 0x128, - XMM7360_RPC_CALL_UTA_FREQ_INFO_GET_FREQ_INFO_REQ = 0x129, - XMM7360_RPC_CALL_UTA_FREQ_INFO_DEACTIVATE_REQ = 0x12a, - XMM7360_RPC_CALL_UTA_FREQ_INFO_REGISTER_INDICATIONS = 0x12b, - XMM7360_RPC_CALL_UTA_FREQ_INFO_DEREGISTER_INDICATIONS = 0x12c, - XMM7360_RPC_CALL_UTA_MODE_SET_REQ = 0x12f, - XMM7360_RPC_CALL_UTA_NVM_FLUSH_SYNC = 0x130, - XMM7360_RPC_CALL_UTA_PROD_REGISTER_GTI_CALLBACK_FUNC = 0x132, - XMM7360_RPC_CALL_UTA_PROD_GTI_CMD_REQ = 0x133, - XMM7360_RPC_CALL_UTA_CELL_TIME_STAMP_REQ = 0x134, - XMM7360_RPC_CALL_UTA_MS_SS_LCS_INIT = 0x136, - XMM7360_RPC_CALL_UTA_MS_SS_LCS_MO_LOCATION_REQ = 0x137, - XMM7360_RPC_CALL_UTA_MS_SS_LCS_MTLR_NOTIFICATION_RSP = 0x139, - XMM7360_RPC_CALL_UTA_MS_CP_ASSISTANCE_DATA_INJECT_REQ = 0x13c, - XMM7360_RPC_CALL_UTA_MS_CP_RESET_ASSISTANCE_DATA = 0x13d, - XMM7360_RPC_CALL_UTA_MS_CP_POS_MEASUREMENT_REQ = 0x140, - XMM7360_RPC_CALL_UTA_MS_CP_POS_MEASUREMENT_ABORT_REQ = 0x142, - XMM7360_RPC_CALL_UTA_MS_CP_POS_ENABLE_MEASUREMENT_REPORT = 0x144, - XMM7360_RPC_CALL_UTA_MS_CP_POS_DISABLE_MEASUREMENT_REPORT = 0x145, - XMM7360_RPC_CALL_UTA_MS_SIM_TK_INIT = 0x146, - XMM7360_RPC_CALL_UTA_MS_SIM_TK_EXEC_SMS_PP_RSP = 0x148, - XMM7360_RPC_CALL_UTA_MS_SIM_TK_EXEC_SIM_INITIATED_CALL_RSP = 0x14a, - XMM7360_RPC_CALL_UTA_MS_SIM_TK_EXEC_SS_USSD_RSP = 0x14c, - XMM7360_RPC_CALL_UTA_MS_SIM_TK_EXEC_DTMF_RSP = 0x14e, - XMM7360_RPC_CALL_UTA_MS_SIM_TK_STOP_DTMF_REQ = 0x150, - XMM7360_RPC_CALL_UTA_MS_SIM_TK_REFRESH_CONFIRM_RSP = 0x152, - XMM7360_RPC_CALL_UTA_MS_SIM_TK_REFRESH_FCN_RSP = 0x154, - XMM7360_RPC_CALL_UTA_MS_SIM_TK_CONTROL_REQ = 0x155, - XMM7360_RPC_CALL_UTA_MS_SIM_TK_TERMINAL_PROFILE_DOWNLOAD_REQ = 0x157, - XMM7360_RPC_CALL_UTA_MS_3GPP2_SMS_SEND_REQ = 0x15a, - XMM7360_RPC_CALL_UTA_MS_3GPP2_SMS_SUBSCRIBE_INDICATIONS = 0x15c, - XMM7360_RPC_CALL_UTA_MS_3GPP2_SMS_UNSUBSCRIBE_INDICATIONS = 0x15d, - XMM7360_RPC_CALL_RPC_GET_REMOTE_VER_INFO = 0x15e, - XMM7360_RPC_CALL_UTA_MS_METRICS_REGISTER_HANDLER = 0x160, - XMM7360_RPC_CALL_UTA_MS_METRICS_DEREGISTER_HANDLER = 0x161, - XMM7360_RPC_CALL_UTA_MS_METRICS_SET_OPTIONS = 0x162, - XMM7360_RPC_CALL_UTA_MS_METRICS_TRIGGER = 0x163, - XMM7360_RPC_CALL_UTA_MS_EMBMS_INIT = 0x164, - XMM7360_RPC_CALL_UTA_MS_EMBMS_SET_SERVICE_REQ = 0x165, - XMM7360_RPC_CALL_UTA_MS_EMBMS_MBSFN_AREA_CONFIG_REQ = 0x166, - XMM7360_RPC_CALL_UTA_MS_EMBMS_SESSION_CONFIG_REQ = 0x167, - XMM7360_RPC_CALL_UTA_MS_EMBMS_SET_INTERESTED_TMGI_LIST_REQ = 0x168, - XMM7360_RPC_CALL_UTA_MS_EMBMS_SET_INTERESTED_SAI_FREQ_REQ = 0x169, - XMM7360_RPC_CALL_UTA_IMS_SUBSCRIBE_INDICATIONS = 0x176, - XMM7360_RPC_CALL_UTA_IMS_UNSUBSCRIBE_INDICATIONS = 0x177, - XMM7360_RPC_CALL_UTA_IMS_GET_FRAMEWORK_STATE = 0x178, - XMM7360_RPC_CALL_UTA_RTC_GET_DATETIME = 0x179, - XMM7360_RPC_CALL_UTA_MS_SIM_ANALYSE_SIM_APDU_RESULT = 0x17a, - XMM7360_RPC_CALL_UTA_MS_SIM_OPEN_CHANNEL_REQ = 0x17b, - XMM7360_RPC_CALL_UTA_MS_SIM_CLOSE_CHANNEL_REQ = 0x17d, - XMM7360_RPC_CALL_UTA_MS_SIM_SET_BDN_REQ = 0x17f, - XMM7360_RPC_CALL_UTA_MS_SET_SIM_STACK_MAPPING_REQ = 0x181, - XMM7360_RPC_CALL_UTA_MS_GET_SIM_STACK_MAPPING_REQ = 0x183, - XMM7360_RPC_CALL_UTA_MS_NET_SET_RADIO_SIGNAL_REPORTING_CONFIGURATION = 0x188, - XMM7360_RPC_CALL_UTA_PC_IE_ENUMERATIONEXT_TOUT = 0x189, - XMM7360_RPC_CALL_UTA_MS_SIM_TK_SET_TERMINAL_CAPABILITY_REQ = 0x18a, - XMM7360_RPC_CALL_UTA_MS_SIM_TK_READ_TERMINAL_CAPABILITY_REQ = 0x18c, - XMM7360_RPC_CALL_CSI_FCC_LOCK_QUERY_REQ = 0x18e, - XMM7360_RPC_CALL_CSI_FCC_LOCK_GEN_CHALLENGE_REQ = 0x190, - XMM7360_RPC_CALL_CSI_FCC_LOCK_VER_CHALLENGE_REQ = 0x192, - XMM7360_RPC_CALL_UTA_SENSOR_OPEN_REQ = 0x194, - XMM7360_RPC_CALL_UTA_SENSOR_CLOSE_EXT = 0x197, - XMM7360_RPC_CALL_UTA_SENSOR_START_EXT = 0x198, - XMM7360_RPC_CALL_UTA_SENSOR_SET_ALARM_PARAM_EXT = 0x199, - XMM7360_RPC_CALL_UTA_SENSOR_SET_SCHEDULER_PARAM_EXT = 0x19a, - XMM7360_RPC_CALL_CSI_SIO_IP_FILTER_CNTRL_SET_REQ = 0x19b, - XMM7360_RPC_CALL_UTA_MS_ACC_CURRENT_FREQ_INFO_REQ = 0x19d, - XMM7360_RPC_CALL_CSI_TRC_AT_CMND_REQ = 0x1a0, - XMM7360_RPC_CALL_UTA_MS_SIM_APDU_CMD_EXT_REQ = 0x1a2, - XMM7360_RPC_CALL_UTA_MS_NET_GET_PLMN_NAME_INFO_REQ = 0x1a4, - XMM7360_RPC_CALL_UTA_MS_NET_GET_COUNTRY_LIST_REQ = 0x1a7, - XMM7360_RPC_CALL_UTA_MS_NET_EXT_CONFIGURE_NETWORK_MODE_REQ = 0x1a9, - XMM7360_RPC_CALL_UTA_MS_NET_EXT_BAND_STATUS_REQ = 0x1ac, - XMM7360_RPC_CALL_UTA_MS_CALL_PS_ATTACH_APN_CONFIG_REQ = 0x1af, - XMM7360_RPC_CALL_CSI_MS_CALL_PS_INITIALIZE = 0x1b1, - XMM7360_RPC_CALL_UTA_AUDIO_ENABLE_SOURCE = 0x1b2, - XMM7360_RPC_CALL_UTA_AUDIO_DISABLE_SOURCE = 0x1b3, - XMM7360_RPC_CALL_UTA_AUDIO_CONFIGURE_DESTINATION_EXT = 0x1b4, - XMM7360_RPC_CALL_UTA_AUDIO_SET_DESTINATIONS_FOR_SOURCE = 0x1b5, - XMM7360_RPC_CALL_UTA_AUDIO_SET_VOLUME_FOR_SOURCE = 0x1b6, - XMM7360_RPC_CALL_UTA_AUDIO_SET_MUTE_FOR_SOURCE_EXT = 0x1b7, - XMM7360_RPC_CALL_UTA_AUDIO_SET_VOLUME_FOR_DESTINATION = 0x1b8, - XMM7360_RPC_CALL_UTA_AUDIO_SET_MUTE_FOR_DESTINATION_EXT = 0x1b9, - XMM7360_RPC_CALL_UTA_AUDIO_CONFIGURE_SOURCE_EXT = 0x1ba, - XMM7360_RPC_CALL_UTA_AUDIO_SET_DESTINATIONS_FOR_SOURCE_EXT = 0x1bb, - XMM7360_RPC_CALL_UTA_RPC_SCREEN_CONTROL_REQ = 0x1bc, - XMM7360_RPC_CALL_UTA_MS_CALL_PS_READ_CONTEXT_STATUS_REQ = 0x1bd, - XMM7360_RPC_CALL_CSI_MS_SIM_ACCESS_GET_SIM_STATE_INFO_REQ = 0x1bf, - XMM7360_RPC_CALL_CSI_MS_NET_GET_REGISTRATION_INFO_REQ = 0x1c1, - XMM7360_RPC_CALL_CSI_SIO_IP_FILTER_NEW_CNTRL_SET_REQ = 0x1c3, - XMM7360_RPC_CALL_CSI_MS_NET_LDR_GET_APN_PLMN_PARAMETER_LIST_REQ = 0x1c5, - XMM7360_RPC_CALL_RPC_GET_API_PARAM_CHANGED_BITMAP = 0x1c8, -} Xmm7360RpcCallId; - -typedef enum { - XMM7360_RPC_UNSOL_UTA_MS_SIM_APDU_CMD_RSP_CB = 0x003, - XMM7360_RPC_UNSOL_UTA_MS_SIM_APPLICATION_RSP_CB = 0x005, - XMM7360_RPC_UNSOL_UTA_MS_SIM_INFO_IND_CB = 0x007, - XMM7360_RPC_UNSOL_UTA_MS_SIM_INIT_IND_CB = 0x008, - XMM7360_RPC_UNSOL_UTA_MS_SIM_FULL_ACCESS_IND_CB = 0x009, - XMM7360_RPC_UNSOL_UTA_MS_SIM_ERROR_IND_CB = 0x00a, - XMM7360_RPC_UNSOL_UTA_MS_SIM_CARD_IND_CB = 0x00b, - XMM7360_RPC_UNSOL_UTA_MS_SIM_APPLICATION_IND_CB = 0x00c, - XMM7360_RPC_UNSOL_UTA_MS_SIM_PB_READ_ENTRY_RSP_CB = 0x00e, - XMM7360_RPC_UNSOL_UTA_MS_SIM_GEN_PIN_RSP_CB = 0x010, - XMM7360_RPC_UNSOL_UTA_MS_SIM_MODIFY_LOCK_RSP_CB = 0x012, - XMM7360_RPC_UNSOL_UTA_MS_SIM_LOCK_STATUS_IND_CB = 0x013, - XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_MO_SMS_CONTROL_INFO_IND_CB = 0x014, - XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_PROACTIVE_COMMAND_IND_CB = 0x015, - XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_ENVELOPE_RES_IND_CB = 0x018, - XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_TERMINAL_PROFILE_READ_RSP_CB = 0x01a, - XMM7360_RPC_UNSOL_UTA_SIM_TK_PROACTIVE_COMMAND_HANDLER_FUNC = 0x01b, - XMM7360_RPC_UNSOL_UTA_MS_CPS_SET_MODE_RSP = 0x01e, - XMM7360_RPC_UNSOL_UTA_MS_CPS_SET_MODE_IND_CB = 0x022, - XMM7360_RPC_UNSOL_UTA_MS_SS_NETWORK_ERROR_IND_CB = 0x02a, - XMM7360_RPC_UNSOL_UTA_MS_SS_NETWORK_REJECT_IND_CB = 0x02b, - XMM7360_RPC_UNSOL_UTA_MS_SS_NETWORK_GSM_CAUSE_IND_CB = 0x02c, - XMM7360_RPC_UNSOL_UTA_MS_SS_USSD_RSP_CB = 0x02d, - XMM7360_RPC_UNSOL_UTA_MS_SS_USSD_IND_CB = 0x02e, - XMM7360_RPC_UNSOL_UTA_MS_SS_END_IND_CB = 0x02f, - XMM7360_RPC_UNSOL_UTA_MS_SMS_INCOMING_IND_CB = 0x032, - XMM7360_RPC_UNSOL_UTA_MS_SMS_SEND_RSP_CB = 0x033, - XMM7360_RPC_UNSOL_UTA_MS_SMS_SET_MEMORY_AVAILABLE_RSP_CB = 0x035, - XMM7360_RPC_UNSOL_UTA_MS_SMS_SIM_MSG_CACHE_FINISHED_IND_CB = 0x037, - XMM7360_RPC_UNSOL_UTA_MS_SMS_SIM_MSG_COUNT_RSP_CB = 0x039, - XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_DEFINE_PRIMARY_RSP_CB = 0x03e, - XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_UNDEFINE_PRIMARY_RSP_CB = 0x040, - XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_GET_PRIMARY_RSP_CB = 0x042, - XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_SET_AUTHENTICATION_RSP_CB = 0x044, - XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_SET_DNS_RSP_CB = 0x046, - XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_GET_NEGOTIATED_DNS_RSP_CB = 0x048, - XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_GET_NEG_IP_ADDR_RSP_CB = 0x04a, - XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_ACTIVATE_RSP_CB = 0x04c, - XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_ACTIVATE_STATUS_IND_CB = 0x04d, - XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_DEACTIVATE_RSP_CB = 0x04f, - XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_DEACTIVATE_IND_CB = 0x050, - XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_CONNECT_RSP_CB = 0x052, - XMM7360_RPC_UNSOL_UTA_MS_NET_SINGLE_SHOT_RADIO_SIGNAL_REPORTING_RSP_CB = 0x056, - XMM7360_RPC_UNSOL_UTA_MS_NET_CELL_INFO_IND_CB = 0x057, - XMM7360_RPC_UNSOL_UTA_MS_NET_CONNECTION_INFO_IND_CB = 0x058, - XMM7360_RPC_UNSOL_UTA_MS_NET_HSPA_INFO_IND_CB = 0x059, - XMM7360_RPC_UNSOL_UTA_MS_NET_RADIO_SIGNAL_IND_CB = 0x05a, - XMM7360_RPC_UNSOL_UTA_MS_NET_CELL_CHANGE_IND_CB = 0x05b, - XMM7360_RPC_UNSOL_UTA_MS_NET_ATTACH_RSP_CB = 0x063, - XMM7360_RPC_UNSOL_UTA_MS_NET_PS_ATTACH_RSP_CB = 0x064, - XMM7360_RPC_UNSOL_UTA_MS_NET_PS_DETACH_RSP_CB = 0x065, - XMM7360_RPC_UNSOL_UTA_MS_NET_SCAN_RSP_CB = 0x066, - XMM7360_RPC_UNSOL_UTA_MS_NET_POWER_DOWN_RSP_CB = 0x067, - XMM7360_RPC_UNSOL_UTA_MS_NET_EXT_SCAN_RSP_CB = 0x068, - XMM7360_RPC_UNSOL_UTA_MS_NET_PS_ATTACH_IND_CB = 0x069, - XMM7360_RPC_UNSOL_UTA_MS_NET_PS_DETACH_IND_CB = 0x06a, - XMM7360_RPC_UNSOL_UTA_MS_NET_REGISTRATION_INFO_IND_CB = 0x06b, - XMM7360_RPC_UNSOL_UTA_MS_NET_IS_ATTACH_ALLOWED_IND_CB = 0x06c, - XMM7360_RPC_UNSOL_UTA_MS_NET_GPRS_CLASS_IND_CB = 0x06d, - XMM7360_RPC_UNSOL_UTA_MS_NET_SET_FD_CONFIG_RSP_CB = 0x06f, - XMM7360_RPC_UNSOL_UTA_MS_NET_FD_CONFIG_IND_CB = 0x070, - XMM7360_RPC_UNSOL_UTA_MS_NET_GET_FD_CONFIG_RSP_CB = 0x072, - XMM7360_RPC_UNSOL_UTA_MS_NET_CONFIGURE_NETWORK_MODE_RSP_CB = 0x074, - XMM7360_RPC_UNSOL_UTA_MS_NET_NETWORK_MODE_CHANGE_IND_CB = 0x075, - XMM7360_RPC_UNSOL_UTA_MS_NET_RAT_MODE_STATUS_RSP_CB = 0x077, - XMM7360_RPC_UNSOL_UTA_MS_NET_RAT_MODE_STATUS_IND_CB = 0x078, - XMM7360_RPC_UNSOL_UTA_MS_NET_DC_SET_VOICE_DOMAIN_PREFERENCE_CONFIG_RSP_CB = 0x081, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_SETUP_CALL_RSP_CB = 0x083, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_DIALING_IND_CB = 0x084, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_ALERTING_IND_CB = 0x085, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_CTM_INFO_IND_CB = 0x086, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_CONNECTED_IND_CB = 0x087, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_RELEASE_CALL_RSP_CB = 0x089, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_DISCONNECTING_IND_CB = 0x08a, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_DISCONNECTED_IND_CB = 0x08b, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_INCOMING_CALL_IND_CB = 0x08c, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_ACCEPT_CALL_RSP_CB = 0x08e, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_PROGRESS_IND_CB = 0x08f, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_SWAP_CALLS_RSP_CB = 0x091, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_HOLD_CALL_RSP_CB = 0x093, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_RETRIEVE_CALL_RSP_CB = 0x095, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_SPLIT_MPTY_RSP_CB = 0x097, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_JOIN_CALLS_RSP_CB = 0x099, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_TRANSFER_CALLS_RSP_CB = 0x09b, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_START_DTMF_RSP_CB = 0x09d, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_STOP_DTMF_RSP_CB = 0x09f, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_STOP_DTMF_EXT_RSP_CB = 0x0a0, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_NOTIFICATION_IND_CB = 0x0a1, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_CUG_INFO_IND_CB = 0x0a2, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_CALLING_NAME_INFO_IND_CB = 0x0a3, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_EMERGENCY_NUMBER_LIST_IND_CB = 0x0a4, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_CALL_STATUS_IND_CB = 0x0a5, - XMM7360_RPC_UNSOL_UTA_CALL_MULTIMEDIA_GET_MEDIA_PROFILES_INFO_RSP_CB = 0x0a9, - XMM7360_RPC_UNSOL_UTA_MS_CALL_MULTIMEDIA_SETUP_CALL_RSP_CB = 0x0aa, - XMM7360_RPC_UNSOL_UTA_MS_CALL_MULTIMEDIA_UPDATE_CALL_RSP_CB = 0x0ab, - XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_VOIMS_SRVCC_HO_STATUS_IND_CB = 0x0ae, - XMM7360_RPC_UNSOL_UTA_MS_CPS_SET_SIM_MODE_RSP = 0x0af, - XMM7360_RPC_UNSOL_UTA_MS_CPS_STARTUP_IND_CB = 0x0b1, - XMM7360_RPC_UNSOL_UTA_MS_SS_CALL_FORWARD_RSP_CB = 0x0b3, - XMM7360_RPC_UNSOL_UTA_MS_SS_CALL_WAITING_RSP_CB = 0x0b5, - XMM7360_RPC_UNSOL_UTA_MS_SS_CALL_BARRING_RSP_CB = 0x0b7, - XMM7360_RPC_UNSOL_UTA_MS_SS_IDENTIFICATION_RSP_CB = 0x0b9, - XMM7360_RPC_UNSOL_UTA_MS_SMS_DATA_DOWNLOAD_RSP_CB = 0x0bc, - XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_GET_NEG_QOS_RSP_CB = 0x0bf, - XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_GET_TFT_RSP_CB = 0x0c1, - XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_SET_PCO_RSP_CB = 0x0c3, - XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_GET_NW_PCO_RSP_CB = 0x0c5, - XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_NW_ACTIVATE_IND_CB = 0x0c6, - XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_NW_ACTIVATE_ACCEPT_RSP_CB = 0x0c8, - XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_MODIFY_IND_CB = 0x0ca, - XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_SUSPEND_IND_CB = 0x0cb, - XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_RESUME_IND_CB = 0x0cc, - XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_SET_DATA_PREF_RSP_CB = 0x0ce, - XMM7360_RPC_UNSOL_UTA_MS_CBS_START_RSP_CB = 0x0d1, - XMM7360_RPC_UNSOL_UTA_MS_CBS_STOP_RSP_CB = 0x0d2, - XMM7360_RPC_UNSOL_UTA_MS_CBS_NEW_MESSAGE_IND_CB = 0x0d5, - XMM7360_RPC_UNSOL_UTA_MS_CBS_ETWS_CONFIG_RSP_CB = 0x0d7, - XMM7360_RPC_UNSOL_UTA_MS_CBS_ETWS_START_RSP_CB = 0x0d9, - XMM7360_RPC_UNSOL_UTA_MS_CBS_ETWS_STOP_RSP_CB = 0x0db, - XMM7360_RPC_UNSOL_UTA_MS_CBS_ETWS_NOTIFY_PRIMARY_WARNING_IND = 0x0dc, - XMM7360_RPC_UNSOL_UTA_MS_CBS_ETWS_NOTIFY_SECONDARY_WARNING_IND = 0x0dd, - XMM7360_RPC_UNSOL_UTA_MS_NET_CONFIGURE_RX_DIVERSITY_DARP_IND_CB = 0x0e1, - XMM7360_RPC_UNSOL_UTA_MS_NET_TIME_INFO_READ_RSP_CB = 0x0e4, - XMM7360_RPC_UNSOL_UTA_MS_NET_TIME_INFO_IND_CB = 0x0e5, - XMM7360_RPC_UNSOL_UTA_MS_NET_BAND_STATUS_RSP_CB = 0x0e8, - XMM7360_RPC_UNSOL_UTA_MS_NET_BAND_STATUS_IND_CB = 0x0e9, - XMM7360_RPC_UNSOL_UTA_MS_NET_SET_CSG_CONFIG_RSP_CB = 0x0ea, - XMM7360_RPC_UNSOL_UTA_MS_NET_GET_CSG_CONFIG_RSP_CB = 0x0eb, - XMM7360_RPC_UNSOL_UTA_MS_NET_GET_EXTENDED_RADIO_SIGNAL_INFO_RSP_CB = 0x0ed, - XMM7360_RPC_UNSOL_UTA_MS_NET_NITZ_INFO_IND_CB = 0x0ee, - XMM7360_RPC_UNSOL_UTA_MS_NET_DETACH_RSP_CB = 0x0f0, - XMM7360_RPC_UNSOL_UTA_MS_NET_SELECT_GPRS_CLASS_RSP_CB = 0x0f2, - XMM7360_RPC_UNSOL_UTA_MS_NET_NETWORK_FEATURE_SUPPORT_INFO_IND_CB = 0x0f5, - XMM7360_RPC_UNSOL_UTA_MS_NET_EPS_NETWORK_FEATURE_SUPPORT_INFO_IND_CB = 0x0f6, - XMM7360_RPC_UNSOL_UTA_MS_NET_CS_SERVICE_NOTIFICATION_IND_CB = 0x0f7, - XMM7360_RPC_UNSOL_UTA_MS_NET_DUAL_SIM_SERVICE_IND_CB = 0x0f8, - XMM7360_RPC_UNSOL_UTA_MS_NET_SINGLE_SHOT_FD_RSP_CB = 0x0fa, - XMM7360_RPC_UNSOL_UTA_MS_SIM_PB_GET_LOCATION_RSP_CB = 0x0fc, - XMM7360_RPC_UNSOL_UTA_MS_SIM_PB_READ_GAS_ENTRY_RSP_CB = 0x0fe, - XMM7360_RPC_UNSOL_UTA_MS_SIM_PB_WRITE_ENTRY_RSP_CB = 0x100, - XMM7360_RPC_UNSOL_UTA_MS_SIM_PB_GET_META_INFORMATION_RSP_CB = 0x102, - XMM7360_RPC_UNSOL_UTA_MS_SIM_PB_USIM_PB_SELECT_RSP_CB = 0x104, - XMM7360_RPC_UNSOL_UTA_MS_SIM_PB_GET_FREE_RECORDS_RSP_CB = 0x106, - XMM7360_RPC_UNSOL_UTA_MS_SIM_PB_USIM_PB_READY_IND_CB = 0x107, - XMM7360_RPC_UNSOL_UTA_MS_SIM_PB_CACHE_LOAD_FINISHED_IND_CB = 0x108, - XMM7360_RPC_UNSOL_UTA_MS_SIM_PB_CACHE_LOAD_IND_CB = 0x109, - XMM7360_RPC_UNSOL_UTA_MS_SIM_GEN_PIN_IND_CB = 0x10d, - XMM7360_RPC_UNSOL_UTA_MS_SIM_FDN_STATE_IND_CB = 0x10f, - XMM7360_RPC_UNSOL_UTA_IDC_AP_MSG_SET_RSP_CB = 0x112, - XMM7360_RPC_UNSOL_UTA_IDC_AP_MSG_GET_RSP_CB = 0x113, - XMM7360_RPC_UNSOL_UTA_IDC_CWS_MSG_SET_RSP_CB = 0x117, - XMM7360_RPC_UNSOL_UTA_IDC_CWS_MSG_GET_RSP_CB = 0x118, - XMM7360_RPC_UNSOL_UTA_IDC_CWS_MSG_IND_CB = 0x11b, - XMM7360_RPC_UNSOL_UTA_BOOT_PREPARE_SHUTDOWN_RSP_CB = 0x11e, - XMM7360_RPC_UNSOL_UTA_FREQ_INFO_ACTIVATE_RSP_CB = 0x124, - XMM7360_RPC_UNSOL_UTA_FREQ_INFO_DEACTIVATE_RSP_CB = 0x125, - XMM7360_RPC_UNSOL_UTA_FREQ_INFO_GET_FREQ_INFO_RSP_CB = 0x126, - XMM7360_RPC_UNSOL_UTA_FREQ_INFO_INDICATION_CB = 0x127, - XMM7360_RPC_UNSOL_UTA_MODE_SET_RSP_CB = 0x12d, - XMM7360_RPC_UNSOL_UTA_MODE_STARTUP_IND_CB = 0x12e, - XMM7360_RPC_UNSOL_UTA_PROD_GTI_CMD_RSP_CB = 0x131, - XMM7360_RPC_UNSOL_UTA_CELL_TIME_STAMP_RSP_CB = 0x135, - XMM7360_RPC_UNSOL_UTA_MS_SS_LCS_MO_LOCATION_RSP_CB = 0x138, - XMM7360_RPC_UNSOL_UTA_MS_SS_LCS_CAPABILITIES_IND_CB = 0x13a, - XMM7360_RPC_UNSOL_UTA_MS_CP_ASSISTANCE_DATA_INJECT_RSP_CB = 0x13b, - XMM7360_RPC_UNSOL_UTA_MS_CP_ASSISTANCE_DATA_NEEDED_IND_CB = 0x13e, - XMM7360_RPC_UNSOL_UTA_MS_CP_POS_MEASUREMENT_RSP_CB = 0x13f, - XMM7360_RPC_UNSOL_UTA_MS_CP_POS_MEASUREMENT_ABORT_RSP_CB = 0x141, - XMM7360_RPC_UNSOL_UTA_MS_CP_POS_REPORT_MEASUREMENT_IND_CB = 0x143, - XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_EXEC_SMS_PP_IND_CB = 0x147, - XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_EXEC_SIM_INITIATED_CALL_IND_CB = 0x149, - XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_EXEC_SS_USSD_IND_CB = 0x14b, - XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_EXEC_DTMF_IND_CB = 0x14d, - XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_EXEC_DTMF_END_IND_CB = 0x14f, - XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_REFRESH_CONFIRM_IND_CB = 0x151, - XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_REFRESH_FCN_IND_CB = 0x153, - XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_CONTROL_RSP_CB = 0x156, - XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_TERMINAL_PROFILE_DOWNLOAD_RSP_CB = 0x158, - XMM7360_RPC_UNSOL_UTA_MS_3GPP2_SMS_SEND_RSP_CB = 0x159, - XMM7360_RPC_UNSOL_UTA_MS_3GPP2_SMS_INCOMING_IND_CB = 0x15b, - XMM7360_RPC_UNSOL_UTA_METRICS_HANDLER_FUNCTION = 0x15f, - XMM7360_RPC_UNSOL_UTA_MS_EMBMS_SET_SERVICE_RSP_CB = 0x16a, - XMM7360_RPC_UNSOL_UTA_MS_EMBMS_MBSFN_AREA_CONFIG_RSP_CB = 0x16b, - XMM7360_RPC_UNSOL_UTA_MS_EMBMS_SESSION_CONFIG_RSP_CB = 0x16c, - XMM7360_RPC_UNSOL_UTA_MS_EMBMS_SET_INTERESTED_TMGI_LIST_RSP_CB = 0x16d, - XMM7360_RPC_UNSOL_UTA_MS_EMBMS_SET_INTERESTED_SAI_FREQ_RSP_CB = 0x16e, - XMM7360_RPC_UNSOL_UTA_MS_EMBMS_SERVICE_IND_CB = 0x16f, - XMM7360_RPC_UNSOL_UTA_MS_EMBMS_MBSFN_AREA_IND_CB = 0x170, - XMM7360_RPC_UNSOL_UTA_MS_EMBMS_SERVICES_LIST_IND_CB = 0x171, - XMM7360_RPC_UNSOL_UTA_MS_EMBMS_SAI_LIST_IND_CB = 0x172, - XMM7360_RPC_UNSOL_UTA_MS_EMBMS_MPS_INFO_IND_CB = 0x173, - XMM7360_RPC_UNSOL_UTA_IMS_STATE_CHANGED_IND_CB = 0x174, - XMM7360_RPC_UNSOL_UTA_IMS_SERVICE_STATE_CHANGED_IND_CB = 0x175, - XMM7360_RPC_UNSOL_UTA_MS_SIM_OPEN_CHANNEL_RSP_CB = 0x17c, - XMM7360_RPC_UNSOL_UTA_MS_SIM_CLOSE_CHANNEL_RSP_CB = 0x17e, - XMM7360_RPC_UNSOL_UTA_MS_SIM_BDN_STATE_IND_CB = 0x180, - XMM7360_RPC_UNSOL_UTA_MS_SET_SIM_STACK_MAPPING_RSP_CB = 0x182, - XMM7360_RPC_UNSOL_UTA_MS_GET_SIM_STACK_MAPPING_RSP_CB = 0x184, - XMM7360_RPC_UNSOL_UTA_MS_SIM_MCC_MNC_IND_CB = 0x185, - XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_TERMINAL_RESPONSE_IND_CB = 0x186, - XMM7360_RPC_UNSOL_UTA_MS_NET_REGISTERED_PLMN_NAME_IND_CB = 0x187, - XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_SET_TERMINAL_CAPABILITY_RSP_CB = 0x18b, - XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_READ_TERMINAL_CAPABILITY_RSP_CB = 0x18d, - XMM7360_RPC_UNSOL_CSI_FCC_LOCK_QUERY_RSP_CB = 0x18f, - XMM7360_RPC_UNSOL_CSI_FCC_LOCK_GEN_CHALLENGE_RSP_CB = 0x191, - XMM7360_RPC_UNSOL_CSI_FCC_LOCK_VER_CHALLENGE_RSP_CB = 0x193, - XMM7360_RPC_UNSOL_UTA_SENSOR_OPEN_RSP_CB = 0x195, - XMM7360_RPC_UNSOL_UTA_SENSOR_MEAS_IND_CB = 0x196, - XMM7360_RPC_UNSOL_CSI_SIO_IP_FILTER_CNTRL_SET_RSP_CB = 0x19c, - XMM7360_RPC_UNSOL_CSI_SIO_IP_FILTER_NEW_CNTRL_SET_RSP_CB = 0x1c4, - XMM7360_RPC_UNSOL_UTA_MS_ACC_CURRENT_FREQ_INFO_RSP_CB = 0x19e, - XMM7360_RPC_UNSOL_UTA_MS_ACC_CURRENT_FREQ_INFO_IND_CB = 0x19f, - XMM7360_RPC_UNSOL_CSI_TRC_AT_CMND_RSP_CB = 0x1a1, - XMM7360_RPC_UNSOL_UTA_MS_SIM_APDU_CMD_EXT_RSP_CB = 0x1a3, - XMM7360_RPC_UNSOL_UTA_MS_NET_GET_PLMN_NAME_INFO_RSP_CB = 0x1a5, - XMM7360_RPC_UNSOL_UTA_MS_NET_SIB8_TIME_INFO_IND_CB = 0x1a6, - XMM7360_RPC_UNSOL_UTA_MS_NET_GET_COUNTRY_LIST_RSP_CB = 0x1a8, - XMM7360_RPC_UNSOL_UTA_MS_NET_EXT_CONFIGURE_NETWORK_MODE_RSP_CB = 0x1aa, - XMM7360_RPC_UNSOL_UTA_MS_NET_EXT_NETWORK_MODE_CHANGE_IND_CB = 0x1ab, - XMM7360_RPC_UNSOL_UTA_MS_NET_EXT_BAND_STATUS_RSP_CB = 0x1ad, - XMM7360_RPC_UNSOL_UTA_MS_NET_EXT_BAND_STATUS_IND_CB = 0x1ae, - XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_ATTACH_APN_CONFIG_RSP_CB = 0x1b0, - XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_READ_CONTEXT_STATUS_RSP_CB = 0x1be, - XMM7360_RPC_UNSOL_CSI_MS_SIM_ACCESS_GET_SIM_STATE_INFO_RSP_CB = 0x1c0, - XMM7360_RPC_UNSOL_CSI_MS_NET_GET_REGISTRATION_INFO_RSP_CB = 0x1c2, - XMM7360_RPC_UNSOL_CSI_MS_NET_LDR_GET_APN_PLMN_PARAMETER_LIST_RSP_CB = 0x1c6, - XMM7360_RPC_UNSOL_UTA_MS_NET_LDR_APN_PARAMETERS_CHANGE_IND_CB = 0x1c7, -} Xmm7360RpcUnsolId; - -typedef enum { - XMM7360_RPC_MSG_ARG_TYPE_BYTE, - XMM7360_RPC_MSG_ARG_TYPE_SHORT, - XMM7360_RPC_MSG_ARG_TYPE_LONG, - XMM7360_RPC_MSG_ARG_TYPE_STRING, - XMM7360_RPC_MSG_ARG_TYPE_UNKNOWN, -} Xmm7360RpcMsgArgType; - - -#define XMM7360_RPC_MSG_ARG_GET_INT(arg) \ - (arg->type == XMM7360_RPC_MSG_ARG_TYPE_BYTE ? arg->value.b \ - : arg->type == XMM7360_RPC_MSG_ARG_TYPE_SHORT ? arg->value.s \ - : arg->type == XMM7360_RPC_MSG_ARG_TYPE_LONG ? arg->value.l : -1) - -typedef struct { - Xmm7360RpcMsgArgType type; - union { - gint8 b; - gint16 s; - gint32 l; - const gchar *string; - } value; - gsize size; - gsize pad; -} Xmm7360RpcMsgArg; - -typedef enum { - XMM7360_RPC_RESPONSE_TYPE_RESPONSE, - XMM7360_RPC_RESPONSE_TYPE_ASYNC_ACK, - XMM7360_RPC_RESPONSE_TYPE_UNSOLICITED, - XMM7360_RPC_RESPONSE_TYPE_UNKNOWN, -} Xmm7360RpcResponseType; - -typedef struct { - guint32 id; - Xmm7360RpcResponseType type; - guint32 unsol_id; - GByteArray *body; - GPtrArray *content; /* contains (Xmm7360RpcMsgArgs *) */ -} Xmm7360RpcResponse; +#include "mm-xmmrpc-xmm7360-protocol.h" #define MM_TYPE_PORT_SERIAL_XMMRPC_XMM7360 (mm_port_serial_xmmrpc_xmm7360_get_type ()) #define MM_PORT_SERIAL_XMMRPC_XMM7360(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MM_TYPE_PORT_SERIAL_XMMRPC_XMM7360, MMPortSerialXmmrpcXmm7360)) @@ -566,14 +64,6 @@ void mm_port_serial_xmmrpc_xmm7360_command (MMPortSerialXmmrpcXmm7360 *self, GAsyncReadyCallback callback, gpointer user_data); -void xmm7360_byte_array_append_asn_int4 (GByteArray *array, gint32 value); - -void xmm7360_rpc_response_free (Xmm7360RpcResponse *msg); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (Xmm7360RpcResponse, xmm7360_rpc_response_free); - -GByteArray *xmm7360_rpc_args_to_byte_array (const Xmm7360RpcMsgArg *args); - Xmm7360RpcResponse *mm_port_serial_xmmrpc_xmm7360_command_finish (MMPortSerialXmmrpcXmm7360 *self, GAsyncResult *res, GError **error); diff --git a/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.c b/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.c new file mode 100644 index 00000000..8de12652 --- /dev/null +++ b/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.c @@ -0,0 +1,535 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * 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: + * + * Copyright (C) 2019 James Wah + * Copyright (C) 2020 Marinus Enzinger + * Copyright (C) 2023 Shane Parslow + * Copyright (C) 2024 Thomas Vogt + */ + +#include +#include +#include +#include + + +#include "mm-xmmrpc-xmm7360-protocol.h" +#include "mm-intel-enums-types.h" + +static void +xmm7360_rpc_msg_arg_free (Xmm7360RpcMsgArg *arg) +{ + if (arg->type == XMM7360_RPC_MSG_ARG_TYPE_STRING) { + g_free ((gchar *) arg->value.string); + } + g_free (arg); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (Xmm7360RpcMsgArg, xmm7360_rpc_msg_arg_free) + +void +xmm7360_rpc_response_free (Xmm7360RpcResponse *response) +{ + if (response) { + g_byte_array_free (response->body, TRUE); + g_ptr_array_free (response->content, TRUE); + g_free (response); + } +} + +#define PARSE_ERROR(fmt, ...) { \ + g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, fmt, __VA_ARGS__); \ +} + +static gint +xmm7360_byte_array_read_asn_int (GByteArray *buf, + gsize offset, + gint *out_val, + Xmm7360RpcMsgArg *out_arg, + GError **error) +{ + const gsize orig_offset = offset; + gint size; + gint bytes_read; + gint val; + + if (buf->len <= offset + 2) { + PARSE_ERROR ("initial buffer size %u too small (need %zu)", + buf->len, offset + 2); + return -1; + } + + /* check ASN start byte and read int size */ + if (buf->data[offset] != 0x02) { + PARSE_ERROR ("unexpected ASN start byte 0x%02X (expected 0x02)", buf->data[offset]); + return -1; + } + offset++; + size = buf->data[offset++]; + + /* read actual value byte by byte */ + if (buf->len < offset + size) { + PARSE_ERROR ("buffer size %u too small (need %zu)", buf->len, offset + size); + return -1; + } + val = 0; + for (bytes_read = 0; bytes_read < size; bytes_read++) { + val <<= 8; + val |= buf->data[offset++]; + } + + if (out_arg) { + if (size == 0x01) { + out_arg->type = XMM7360_RPC_MSG_ARG_TYPE_BYTE; + out_arg->value.b = (gint8) val; + } else if (size == 0x02) { + out_arg->type = XMM7360_RPC_MSG_ARG_TYPE_SHORT; + out_arg->value.s = (gint16) val; + } else { + out_arg->type = XMM7360_RPC_MSG_ARG_TYPE_LONG; + out_arg->value.l = (gint32) val; + } + } + + if (out_val) + *out_val = val; + + /* return bytes consumed by this function */ + return offset - orig_offset; +} + +static gint +xmm7360_byte_array_read_string (GByteArray *buf, + gsize offset, + Xmm7360RpcMsgArg *out_arg, + GError **error) +{ + const gsize orig_offset = offset; + guchar string_type; + gint string_len_padded; + gint pad_len; + gint string_len; + gint consumed; + + if (buf->len < offset + 2) { + PARSE_ERROR ("initial buffer size %u too small (need %zu)", + buf->len, offset + 2); + return -1; + } + + string_type = buf->data[offset++]; + if (string_type != 0x55 && string_type != 0x56 && string_type != 0x57) { + PARSE_ERROR ("unhandled string type 0x%02X", string_type); + return -1; + } + + string_len = buf->data[offset++]; + if (string_len & 0x80) { + guchar bytelen; + guint8 i; + + bytelen = string_len & 0x0f; + if (bytelen > 4) { + PARSE_ERROR ("unhandled string length size 0x%02X", bytelen); + return -1; + } else if (buf->len <= offset + bytelen) { + PARSE_ERROR ("string len buffer size %u too small (need %zu)", + buf->len, offset + bytelen); + return -1; + } + + string_len = 0; + for (i = 0; i < bytelen; i++) + string_len |= buf->data[offset++] << (i * 8); + } + + if (string_type == 0x56) { + /* 0x56 contains 2-byte chars */ + string_len <<= 1; + } else if (string_type == 0x57) { + /* 0x57 contains 4-byte chars */ + string_len <<= 2; + } + + consumed = xmm7360_byte_array_read_asn_int (buf, offset, &string_len_padded, NULL, error); + if (consumed < 0) + return -1; + offset += consumed; + + consumed = xmm7360_byte_array_read_asn_int (buf, offset, &pad_len, NULL, error); + if (consumed < 0) + return -1; + offset += consumed; + + if (string_len_padded > 0) { + if (string_len_padded != string_len + pad_len) { + PARSE_ERROR ("padded string len %u mismatch (expected %u)", + string_len_padded, string_len + pad_len); + return -1; + } + } else { + string_len_padded = string_len + pad_len; + } + + /* make sure the buffer is large enough */ + if (buf->len < offset + string_len_padded) { + PARSE_ERROR ("padded string len buffer size %u too small (need %zu)", + buf->len, offset + string_len_padded); + return -1; + } + + /* copy the result */ + if (out_arg) { + out_arg->type = XMM7360_RPC_MSG_ARG_TYPE_STRING; + /* Copy the bare string without padding */ + out_arg->value.string = g_memdup (buf->data + offset, string_len); + out_arg->size = string_len; + } + + /* return bytes consumed by this function */ + return offset + string_len_padded - orig_offset; +} + + +void +xmm7360_byte_array_append_asn_int4 (GByteArray *buf, gint32 value) +{ + gint32 value_be = GINT32_TO_BE (value); + g_byte_array_append (buf, (const guint8 *) "\x02\x04", 2); + g_byte_array_append (buf, (const guint8 *) &value_be, 4); +} + +static void +xmm7360_byte_array_append_uint8 (GByteArray *buf, gulong val) +{ + guint8 _val = (guint8) val; + g_byte_array_append (buf, &_val, 1); +} + +static void +xmm7360_byte_array_append_string (GByteArray *buf, + const guint8 *data, + gsize data_len, + guint data_len_padded) +{ + gsize i; + gsize pad_len; + + g_assert (data_len_padded >= data_len); + pad_len = data_len_padded - data_len; + + /* only support 1-byte element size */ + xmm7360_byte_array_append_uint8 (buf, 0x55); + + if (data_len < 0x80) { + xmm7360_byte_array_append_uint8 (buf, data_len); + } else { + guchar bytelen = 0x80; + /* write dummy first byte (updated later) */ + xmm7360_byte_array_append_uint8 (buf, bytelen); + for (i = data_len; i > 0; i >>= 8) { + bytelen++; + xmm7360_byte_array_append_uint8 (buf, i & 0xff); + } + /* update first byte */ + buf->data[buf->len - 1 - (bytelen & 0x7f)] = bytelen; + } + + xmm7360_byte_array_append_asn_int4 (buf, data_len_padded); + xmm7360_byte_array_append_asn_int4 (buf, pad_len); + g_byte_array_append (buf, data, data_len); + for (i = 0; i < pad_len; i++) { + xmm7360_byte_array_append_uint8 (buf, 0); + } +} + +GString * +xmm7360_byte_array_hexlify (GByteArray *buf) +{ + GString *string; + gsize i; + + string = g_string_sized_new (2 * buf->len + 1); + for (i = 0; i < buf->len; i++) { + g_string_append_printf (string, "%02x", buf->data[i]); + } + g_string_append (string, ""); + + /* truncate very long strings to avoid overly verbose logs */ + if (string->len > 64) { + gsize string_len; + string_len = string->len; + g_string_truncate (string, 48); + g_string_append_printf (string, "... (%" G_GSIZE_FORMAT " chars)", string_len); + } + + return string; +} + +GString * +xmm7360_rpc_args_to_string (GPtrArray *args) +{ + guint i; + GString *result; + Xmm7360RpcMsgArg *arg; + gint16 arg_value_short; + gint32 arg_value_long; + + result = g_string_new (""); + + for (i = 0; i < args->len; i++) { + arg = (Xmm7360RpcMsgArg *) g_ptr_array_index (args, i); + if (i > 0) { + g_string_append (result, " "); + } + switch (arg->type) { + case XMM7360_RPC_MSG_ARG_TYPE_BYTE: + g_string_append_printf (result, "B(0x%02x)", arg->value.b); + break; + case XMM7360_RPC_MSG_ARG_TYPE_SHORT: + arg_value_short = GINT16_TO_BE (arg->value.s); + g_string_append_printf (result, "S(0x%04x)", arg_value_short); + break; + case XMM7360_RPC_MSG_ARG_TYPE_LONG: + arg_value_long = GINT32_TO_BE (arg->value.l); + g_string_append_printf (result, "L(0x%08x)", arg_value_long); + break; + case XMM7360_RPC_MSG_ARG_TYPE_STRING: + g_string_append_printf (result, "STR(size=%" G_GSIZE_FORMAT ")", arg->size); + break; + case XMM7360_RPC_MSG_ARG_TYPE_UNKNOWN: + default: + g_assert_not_reached (); + } + } + + return result; +} + +GByteArray * +xmm7360_rpc_args_to_byte_array (const Xmm7360RpcMsgArg *args) +{ + GByteArray *result; + gint16 arg_value_short; + gint32 arg_value_long; + + if (args == NULL) + return NULL; + + result = g_byte_array_new (); + for (; args->type != XMM7360_RPC_MSG_ARG_TYPE_UNKNOWN; args++) { + switch (args->type) { + case XMM7360_RPC_MSG_ARG_TYPE_BYTE: + g_byte_array_append (result, (guint8[]) { 0x02, 0x01 }, 2); + g_byte_array_append (result, (guint8 *) &(args->value.b), 1); + break; + case XMM7360_RPC_MSG_ARG_TYPE_SHORT: + arg_value_short = GINT16_TO_BE (args->value.s); + g_byte_array_append (result, (guint8[]) { 0x02, 0x02 }, 2); + g_byte_array_append (result, (guint8 *) &arg_value_short, 2); + break; + case XMM7360_RPC_MSG_ARG_TYPE_LONG: + arg_value_long = GINT32_TO_BE (args->value.l); + g_byte_array_append (result, (guint8[]) { 0x02, 0x04 }, 2); + g_byte_array_append (result, (guint8 *) &arg_value_long, 4); + break; + case XMM7360_RPC_MSG_ARG_TYPE_STRING: + xmm7360_byte_array_append_string (result, + (const guint8 *) args->value.string, + args->size, + args->size + args->pad); + break; + case XMM7360_RPC_MSG_ARG_TYPE_UNKNOWN: + default: + /* should be unreachable */ + return NULL; + } + } + return result; +} + +GByteArray * +xmm7360_command_to_byte_array (Xmm7360RpcCallId callid, + gboolean is_async, + GByteArray *body) +{ + GByteArray *buf; + gint32 tid; + gint32 tid_word; + gint32 tid_word_be; + guint32 total_len; + + buf = g_byte_array_sized_new (22); + + if (body == NULL) { + body = g_byte_array_new (); + xmm7360_byte_array_append_asn_int4 (body, 0); + } else { + g_byte_array_ref (body); + } + + if (is_async) { + tid = 0x11000101; + } else { + tid = 0; + } + tid_word = 0x11000100 | tid; + + total_len = body->len + 16; + if (tid) { + total_len += 6; + } + g_byte_array_append (buf, (const guint8 *) &total_len, 4); + xmm7360_byte_array_append_asn_int4 (buf, total_len); + xmm7360_byte_array_append_asn_int4 (buf, callid); + tid_word_be = GINT32_TO_BE (tid_word); + g_byte_array_append (buf, (const guint8 *) &tid_word_be, 4); + if (tid) { + xmm7360_byte_array_append_asn_int4 (buf, tid); + } + + g_assert (total_len == buf->len + body->len - 4); + g_byte_array_append (buf, (const guint8 *) body->data, body->len); + g_byte_array_unref (body); + + return buf; +} + +static gboolean +xmm7360_rpc_msg_body_unpack (GByteArray *buf, GPtrArray *args, GError **error) +{ + gsize offset; + gint consumed; + + g_assert (buf != NULL && args != NULL); + + offset = 0; + while (offset < buf->len) { + g_autoptr(Xmm7360RpcMsgArg) arg = NULL; + + arg = g_new0 (Xmm7360RpcMsgArg, 1); + arg->size = 0; + switch (buf->data[offset]) { + case 0x02: + consumed = xmm7360_byte_array_read_asn_int (buf, + offset, + NULL, + arg, + error); + if (consumed < 0) + return FALSE; + offset += consumed; + break; + case 0x55: + case 0x56: + case 0x57: + arg->type = XMM7360_RPC_MSG_ARG_TYPE_STRING; + consumed = xmm7360_byte_array_read_string (buf, + offset, + arg, + error); + if (consumed < 0) + return FALSE; + offset += consumed; + break; + default: + arg->type = XMM7360_RPC_MSG_ARG_TYPE_UNKNOWN; + PARSE_ERROR ("Unknown type 0x%x", buf->data[offset]); + return FALSE; + } + g_ptr_array_add (args, g_steal_pointer (&arg)); + } + + return TRUE; +} + +Xmm7360RpcResponse * +xmm7360_parse_response (GByteArray *buf, GError **error) +{ + g_autoptr(Xmm7360RpcResponse) response = NULL; + gsize offset; + gint consumed; + gint asn_msg_len = 0; + gint unsol_id = 0; + + /* first 20 bytes are format header: + * message size ( int32, 4) + * message size (again!) (asn int, 6) + * unsolicited message id (asn int, 6) + * transmission id ( int32, 4) + */ + if (buf->len <= 20) { + PARSE_ERROR ("error parsing RPC message: message size %u too short", buf->len); + return NULL; + } + + /* Read and validate the ASN message size */ + offset = 4; + consumed = xmm7360_byte_array_read_asn_int (buf, offset, &asn_msg_len, NULL, error); + if (consumed < 0) { + g_prefix_error (error, "error parsing RPC message: error reading ASN message size: "); + return NULL; + } + offset += consumed; + /* Make sure the ASN message size and message size agree */ + if (*(gint32 *) buf->data != asn_msg_len) { + PARSE_ERROR ("error parsing RPC message: length mismatch (buf %d != asn %d)", + *(gint32 *) buf->data, asn_msg_len); + return NULL; + } + + consumed = xmm7360_byte_array_read_asn_int (buf, offset, &unsol_id, NULL, error); + if (consumed < 0) { + g_prefix_error (error, "error parsing RPC message: error reading unsolicited message id: "); + return NULL; + } + offset += consumed; + + /* initialize all fields of the response */ + response = g_new0 (Xmm7360RpcResponse, 1); + response->id = GINT32_FROM_BE (*(gint32 *) (buf->data + 16)); + response->type = XMM7360_RPC_RESPONSE_TYPE_UNKNOWN; + response->unsol_id = unsol_id; + response->body = g_byte_array_new (); + response->content = g_ptr_array_new_with_free_func ((GDestroyNotify)xmm7360_rpc_msg_arg_free); + + g_byte_array_append (response->body, &buf->data[20], buf->len - 20); + if (!xmm7360_rpc_msg_body_unpack (response->body, response->content, error)) + return NULL; + + if (response->id == 0x11000100) { + response->type = XMM7360_RPC_RESPONSE_TYPE_RESPONSE; + } else if ((response->id & 0xffffff00) == 0x11000100) { + if (response->unsol_id >= 0x7d0) { + response->type = XMM7360_RPC_RESPONSE_TYPE_ASYNC_ACK; + } else { + Xmm7360RpcMsgArg *arg; + + response->type = XMM7360_RPC_RESPONSE_TYPE_RESPONSE; + + /* discard first element in content (equals transmission id) */ + arg = (Xmm7360RpcMsgArg *) g_ptr_array_index (response->content, 0); + if (arg->type != XMM7360_RPC_MSG_ARG_TYPE_LONG + || (guint32) XMM7360_RPC_MSG_ARG_GET_INT (arg) != response->id) { + PARSE_ERROR ("error parsing RPC message: invalid start of async response body (type %u not LONG or ID mismatch)", + arg->type); + return NULL; + } + g_ptr_array_remove_index (response->content, 0); + g_byte_array_remove_range (response->body, 0, 6); + } + } else { + response->type = XMM7360_RPC_RESPONSE_TYPE_UNSOLICITED; + } + + return g_steal_pointer (&response); +} diff --git a/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.h b/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.h new file mode 100644 index 00000000..f2f34f6f --- /dev/null +++ b/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.h @@ -0,0 +1,549 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * 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: + * + * Copyright (C) 2019 James Wah + * Copyright (C) 2020 Marinus Enzinger + * Copyright (C) 2023 Shane Parslow + * Copyright (C) 2024 Thomas Vogt + */ + +#ifndef MM_XMMRPC_XMM7360_PROTOCOL_H +#define MM_XMMRPC_XMM7360_PROTOCOL_H + +#include + +typedef enum { + XMM7360_RPC_CALL_UTA_MS_SIM_OPEN_REQ = 0x001, + XMM7360_RPC_CALL_UTA_MS_SIM_APDU_CMD_REQ = 0x002, + XMM7360_RPC_CALL_UTA_MS_SIM_APPLICATION_REQ = 0x004, + XMM7360_RPC_CALL_UTA_MS_SIM_DECODE_FCP = 0x006, + XMM7360_RPC_CALL_UTA_MS_SIM_PB_READ_ENTRY_REQ = 0x00d, + XMM7360_RPC_CALL_UTA_MS_SIM_GEN_PIN_REQ = 0x00f, + XMM7360_RPC_CALL_UTA_MS_SIM_MODIFY_LOCK_REQ = 0x011, + XMM7360_RPC_CALL_UTA_MS_SIM_TK_PROACTIVE_COMMAND_RSP = 0x016, + XMM7360_RPC_CALL_UTA_MS_SIM_TK_ENVELOPE_COMMAND_REQ = 0x017, + XMM7360_RPC_CALL_UTA_MS_SIM_TK_TERMINAL_PROFILE_READ_REQ = 0x019, + XMM7360_RPC_CALL_UTA_MS_SIM_TK_REGISTER_HANDLER = 0x01c, + XMM7360_RPC_CALL_UTA_MS_SIM_TK_DEREGISTER_HANDLER = 0x01d, + XMM7360_RPC_CALL_UTA_MS_CPS_SET_MODE_REQ = 0x01f, + XMM7360_RPC_CALL_UTA_MS_CPS_SET_STACK_MODE_CONFIGURATION = 0x020, + XMM7360_RPC_CALL_UTA_MS_CPS_SET_SIM_MODE_CONFIGURATION = 0x021, + XMM7360_RPC_CALL_UTA_MS_CPS_READ_IMEI = 0x023, + XMM7360_RPC_CALL_UTA_MS_CALL_CS_INIT = 0x024, + XMM7360_RPC_CALL_UTA_MS_CBS_INIT = 0x025, + XMM7360_RPC_CALL_UTA_MS_SS_INIT = 0x026, + XMM7360_RPC_CALL_UTA_MS_SS_SEND_USSD_REQ = 0x027, + XMM7360_RPC_CALL_UTA_MS_SS_RESPOND_USSD = 0x028, + XMM7360_RPC_CALL_UTA_MS_SS_ABORT = 0x029, + XMM7360_RPC_CALL_UTA_MS_SMS_INIT = 0x030, + XMM7360_RPC_CALL_UTA_MS_SMS_SEND_REQ = 0x031, + XMM7360_RPC_CALL_UTA_MS_SMS_SET_MEMORY_AVAILABLE_REQ = 0x034, + XMM7360_RPC_CALL_UTA_MS_SMS_INCOMING_SMS_ACK = 0x036, + XMM7360_RPC_CALL_UTA_MS_SMS_SIM_MSG_COUNT_REQ = 0x038, + XMM7360_RPC_CALL_UTA_MS_CALL_PS_INITIALIZE = 0x03a, + XMM7360_RPC_CALL_UTA_MS_CALL_PS_OBTAIN_PDP_CONTEXT_ID = 0x03b, + XMM7360_RPC_CALL_UTA_MS_CALL_PS_RELEASE_PDP_CONTEXT_ID = 0x03c, + XMM7360_RPC_CALL_UTA_MS_CALL_PS_DEFINE_PRIMARY_REQ = 0x03d, + XMM7360_RPC_CALL_UTA_MS_CALL_PS_UNDEFINE_PRIMARY_REQ = 0x03f, + XMM7360_RPC_CALL_UTA_MS_CALL_PS_GET_PRIMARY_REQ = 0x041, + XMM7360_RPC_CALL_UTA_MS_CALL_PS_SET_AUTHENTICATION_REQ = 0x043, + XMM7360_RPC_CALL_UTA_MS_CALL_PS_SET_DNS_REQ = 0x045, + XMM7360_RPC_CALL_UTA_MS_CALL_PS_GET_NEGOTIATED_DNS_REQ = 0x047, + XMM7360_RPC_CALL_UTA_MS_CALL_PS_GET_NEG_IP_ADDR_REQ = 0x049, + XMM7360_RPC_CALL_UTA_MS_CALL_PS_ACTIVATE_REQ = 0x04b, + XMM7360_RPC_CALL_UTA_MS_CALL_PS_DEACTIVATE_REQ = 0x04e, + XMM7360_RPC_CALL_UTA_MS_CALL_PS_CONNECT_REQ = 0x051, + XMM7360_RPC_CALL_UTA_MS_NET_OPEN = 0x053, + XMM7360_RPC_CALL_UTA_MS_NET_SET_RADIO_SIGNAL_REPORTING = 0x054, + XMM7360_RPC_CALL_UTA_MS_NET_SINGLE_SHOT_RADIO_SIGNAL_REPORTING_REQ = 0x055, + XMM7360_RPC_CALL_UTA_MS_NET_ATTACH_REQ = 0x05c, + XMM7360_RPC_CALL_UTA_MS_NET_PS_ATTACH_REQ = 0x05d, + XMM7360_RPC_CALL_UTA_MS_NET_PS_DETACH_REQ = 0x05e, + XMM7360_RPC_CALL_UTA_MS_NET_SCAN_REQ = 0x05f, + XMM7360_RPC_CALL_UTA_MS_NET_SCAN_ABORT = 0x060, + XMM7360_RPC_CALL_UTA_MS_NET_POWER_DOWN_REQ = 0x061, + XMM7360_RPC_CALL_UTA_MS_NET_EXT_SCAN_REQ = 0x062, + XMM7360_RPC_CALL_UTA_MS_NET_SET_FD_CONFIG_REQ = 0x06e, + XMM7360_RPC_CALL_UTA_MS_NET_GET_FD_CONFIG_REQ = 0x071, + XMM7360_RPC_CALL_UTA_MS_NET_CONFIGURE_NETWORK_MODE_REQ = 0x073, + XMM7360_RPC_CALL_UTA_MS_NET_RAT_MODE_STATUS_REQ = 0x076, + XMM7360_RPC_CALL_UTA_NVM_READ = 0x079, + XMM7360_RPC_CALL_UTA_NVM_WRITE = 0x07a, + XMM7360_RPC_CALL_UTA_NVM_WRITE_COMMIT = 0x07b, + XMM7360_RPC_CALL_UTA_SYS_GET_INFO = 0x07c, + XMM7360_RPC_CALL_UTA_RPC_PS_CONNECT_SETUP_REQ = 0x07d, + XMM7360_RPC_CALL_UTA_RPC_PS_CONNECT_TO_DATACHANNEL_REQ = 0x07e, + XMM7360_RPC_CALL_UTA_RPC_PS_CONNECT_RELEASE_REQ = 0x07f, + XMM7360_RPC_CALL_UTA_MS_NET_DC_SET_VOICE_DOMAIN_PREFERENCE_CONFIG_REQ = 0x080, + XMM7360_RPC_CALL_UTA_MS_CALL_CS_SETUP_VOICE_CALL_REQ = 0x082, + XMM7360_RPC_CALL_UTA_MS_CALL_CS_RELEASE_CALL_REQ = 0x088, + XMM7360_RPC_CALL_UTA_MS_CALL_CS_ACCEPT_CALL_REQ = 0x08d, + XMM7360_RPC_CALL_UTA_MS_CALL_CS_SWAP_CALLS_REQ = 0x090, + XMM7360_RPC_CALL_UTA_MS_CALL_CS_HOLD_CALL_REQ = 0x092, + XMM7360_RPC_CALL_UTA_MS_CALL_CS_RETRIEVE_CALL_REQ = 0x094, + XMM7360_RPC_CALL_UTA_MS_CALL_CS_SPLIT_MPTY_REQ = 0x096, + XMM7360_RPC_CALL_UTA_MS_CALL_CS_JOIN_CALLS_REQ = 0x098, + XMM7360_RPC_CALL_UTA_MS_CALL_CS_TRANSFER_CALLS_REQ = 0x09a, + XMM7360_RPC_CALL_UTA_MS_CALL_CS_START_DTMF_REQ = 0x09c, + XMM7360_RPC_CALL_UTA_MS_CALL_CS_STOP_DTMF_REQ = 0x09e, + XMM7360_RPC_CALL_UTA_MS_CALL_CS_SET_UUS1_INFO = 0x0a6, + XMM7360_RPC_CALL_UTA_MS_CALL_CS_SET_TTY_DEVICE_MODE = 0x0a7, + XMM7360_RPC_CALL_UTA_MS_CALL_CS_GET_TTY_DEVICE_MODE = 0x0a8, + XMM7360_RPC_CALL_UTA_MS_CALL_MULTIMEDIA_SETUP_CALL_REQ = 0x0ac, + XMM7360_RPC_CALL_UTA_MS_CALL_MULTIMEDIA_UPDATE_CALL_REQ = 0x0ad, + XMM7360_RPC_CALL_UTA_MS_CPS_SET_SIM_MODE_REQ = 0x0b0, + XMM7360_RPC_CALL_UTA_MS_SS_CALL_FORWARD_REQ = 0x0b2, + XMM7360_RPC_CALL_UTA_MS_SS_CALL_WAITING_REQ = 0x0b4, + XMM7360_RPC_CALL_UTA_MS_SS_CALL_BARRING_REQ = 0x0b6, + XMM7360_RPC_CALL_UTA_MS_SS_IDENTIFICATION_REQ = 0x0b8, + XMM7360_RPC_CALL_UTA_MS_SMS_SET_SEND_MORE_MESSAGES_STATUS = 0x0ba, + XMM7360_RPC_CALL_UTA_MS_SMS_DATA_DOWNLOAD_REQ = 0x0bb, + XMM7360_RPC_CALL_UTA_MS_SMS_DATA_DOWNLOAD_ACK = 0x0bd, + XMM7360_RPC_CALL_UTA_MS_CALL_PS_GET_NEG_QOS_REQ = 0x0be, + XMM7360_RPC_CALL_UTA_MS_CALL_PS_GET_TFT_REQ = 0x0c0, + XMM7360_RPC_CALL_UTA_MS_CALL_PS_SET_PCO_REQ = 0x0c2, + XMM7360_RPC_CALL_UTA_MS_CALL_PS_GET_NW_PCO_REQ = 0x0c4, + XMM7360_RPC_CALL_UTA_MS_CALL_PS_NW_ACTIVATE_ACCEPT_REQ = 0x0c7, + XMM7360_RPC_CALL_UTA_MS_CALL_PS_NW_ACTIVATE_REJECT_REQ = 0x0c9, + XMM7360_RPC_CALL_UTA_MS_CALL_PS_SET_DATA_PREF_REQ = 0x0cd, + XMM7360_RPC_CALL_UTA_MS_CBS_START_REQ = 0x0cf, + XMM7360_RPC_CALL_UTA_MS_CBS_STOP_REQ = 0x0d0, + XMM7360_RPC_CALL_UTA_MS_CBS_SET_MSG_FILTER = 0x0d3, + XMM7360_RPC_CALL_UTA_MS_CBS_GET_MSG_FILTER = 0x0d4, + XMM7360_RPC_CALL_UTA_MS_CBS_ETWS_CONFIG_REQ = 0x0d6, + XMM7360_RPC_CALL_UTA_MS_CBS_ETWS_START_REQ = 0x0d8, + XMM7360_RPC_CALL_UTA_MS_CBS_ETWS_STOP_REQ = 0x0da, + XMM7360_RPC_CALL_UTA_MS_CPS_NVM_WRITE = 0x0de, + XMM7360_RPC_CALL_UTA_MS_CPS_NVM_READ = 0x0df, + XMM7360_RPC_CALL_UTA_MS_NET_CONFIGURE_RX_DIVERSITY_DARP = 0x0e0, + XMM7360_RPC_CALL_UTA_MS_NET_LDR_GET_APN_PARAMETER_LIST = 0x0e2, + XMM7360_RPC_CALL_UTA_MS_NET_TIME_INFO_READ_REQ = 0x0e3, + XMM7360_RPC_CALL_UTA_MS_NET_SET_CSG_CONFIG_REQ = 0x0e6, + XMM7360_RPC_CALL_UTA_MS_NET_BAND_STATUS_REQ = 0x0e7, + XMM7360_RPC_CALL_UTA_MS_NET_GET_EXTENDED_RADIO_SIGNAL_INFO_REQ = 0x0ec, + XMM7360_RPC_CALL_UTA_MS_NET_DETACH_REQ = 0x0ef, + XMM7360_RPC_CALL_UTA_MS_NET_SELECT_GPRS_CLASS_REQ = 0x0f1, + XMM7360_RPC_CALL_UTA_MS_NET_GET_CSG_CONFIG_REQ = 0x0f3, + XMM7360_RPC_CALL_UTA_MS_NET_CS_SERVICE_NOTIFICATION_ACCEPT = 0x0f4, + XMM7360_RPC_CALL_UTA_MS_NET_SINGLE_SHOT_FD_REQ = 0x0f9, + XMM7360_RPC_CALL_UTA_MS_SIM_PB_LOCATION_REQ = 0x0fb, + XMM7360_RPC_CALL_UTA_MS_SIM_PB_READ_GAS_ENTRY_REQ = 0x0fd, + XMM7360_RPC_CALL_UTA_MS_SIM_PB_WRITE_ENTRY_REQ = 0x0ff, + XMM7360_RPC_CALL_UTA_MS_SIM_PB_GET_META_INFORMATION_REQ = 0x101, + XMM7360_RPC_CALL_UTA_MS_SIM_PB_USIM_PB_SELECT_REQ = 0x103, + XMM7360_RPC_CALL_UTA_MS_SIM_PB_GET_FREE_RECORDS_REQ = 0x105, + XMM7360_RPC_CALL_UTA_MS_SIM_CREATE_READ_BINARY_APDU = 0x10a, + XMM7360_RPC_CALL_UTA_MS_SIM_CREATE_UPDATE_BINARY_APDU = 0x10b, + XMM7360_RPC_CALL_UTA_MS_SIM_ANALYSE_READ_RESULT = 0x10c, + XMM7360_RPC_CALL_UTA_MS_SIM_SET_FDN_REQ = 0x10e, + XMM7360_RPC_CALL_SET_AP_SCREEN_STATE = 0x110, + XMM7360_RPC_CALL_UTA_IO_CTL = 0x111, + XMM7360_RPC_CALL_UTA_IDC_AP_MSG_SET_REQ = 0x114, + XMM7360_RPC_CALL_UTA_IDC_AP_MSG_GET_REQ = 0x115, + XMM7360_RPC_CALL_UTA_IDC_ENBLE_REQ = 0x116, + XMM7360_RPC_CALL_UTA_IDC_CWS_MSG_SET_REQ = 0x119, + XMM7360_RPC_CALL_UTA_IDC_CWS_MSG_GET_REQ = 0x11a, + XMM7360_RPC_CALL_UTA_IDC_SUBSCRIBE_INDICATIONS = 0x11c, + XMM7360_RPC_CALL_UTA_IDC_UNSUBSCRIBE_INDICATIONS = 0x11d, + XMM7360_RPC_CALL_UTA_BOOT_PREPARE_SHUTDOWN_REQ = 0x11f, + XMM7360_RPC_CALL_UTA_BOOT_SHUTDOWN_REQ = 0x120, + XMM7360_RPC_CALL_UTA_RF_MAX_TX_PWR_SET_2G = 0x121, + XMM7360_RPC_CALL_UTA_RF_MAX_TX_PWR_SET_3G = 0x122, + XMM7360_RPC_CALL_UTA_RF_MAX_TX_PWR_SET_4G = 0x123, + XMM7360_RPC_CALL_UTA_FREQ_INFO_ACTIVATE_REQ = 0x128, + XMM7360_RPC_CALL_UTA_FREQ_INFO_GET_FREQ_INFO_REQ = 0x129, + XMM7360_RPC_CALL_UTA_FREQ_INFO_DEACTIVATE_REQ = 0x12a, + XMM7360_RPC_CALL_UTA_FREQ_INFO_REGISTER_INDICATIONS = 0x12b, + XMM7360_RPC_CALL_UTA_FREQ_INFO_DEREGISTER_INDICATIONS = 0x12c, + XMM7360_RPC_CALL_UTA_MODE_SET_REQ = 0x12f, + XMM7360_RPC_CALL_UTA_NVM_FLUSH_SYNC = 0x130, + XMM7360_RPC_CALL_UTA_PROD_REGISTER_GTI_CALLBACK_FUNC = 0x132, + XMM7360_RPC_CALL_UTA_PROD_GTI_CMD_REQ = 0x133, + XMM7360_RPC_CALL_UTA_CELL_TIME_STAMP_REQ = 0x134, + XMM7360_RPC_CALL_UTA_MS_SS_LCS_INIT = 0x136, + XMM7360_RPC_CALL_UTA_MS_SS_LCS_MO_LOCATION_REQ = 0x137, + XMM7360_RPC_CALL_UTA_MS_SS_LCS_MTLR_NOTIFICATION_RSP = 0x139, + XMM7360_RPC_CALL_UTA_MS_CP_ASSISTANCE_DATA_INJECT_REQ = 0x13c, + XMM7360_RPC_CALL_UTA_MS_CP_RESET_ASSISTANCE_DATA = 0x13d, + XMM7360_RPC_CALL_UTA_MS_CP_POS_MEASUREMENT_REQ = 0x140, + XMM7360_RPC_CALL_UTA_MS_CP_POS_MEASUREMENT_ABORT_REQ = 0x142, + XMM7360_RPC_CALL_UTA_MS_CP_POS_ENABLE_MEASUREMENT_REPORT = 0x144, + XMM7360_RPC_CALL_UTA_MS_CP_POS_DISABLE_MEASUREMENT_REPORT = 0x145, + XMM7360_RPC_CALL_UTA_MS_SIM_TK_INIT = 0x146, + XMM7360_RPC_CALL_UTA_MS_SIM_TK_EXEC_SMS_PP_RSP = 0x148, + XMM7360_RPC_CALL_UTA_MS_SIM_TK_EXEC_SIM_INITIATED_CALL_RSP = 0x14a, + XMM7360_RPC_CALL_UTA_MS_SIM_TK_EXEC_SS_USSD_RSP = 0x14c, + XMM7360_RPC_CALL_UTA_MS_SIM_TK_EXEC_DTMF_RSP = 0x14e, + XMM7360_RPC_CALL_UTA_MS_SIM_TK_STOP_DTMF_REQ = 0x150, + XMM7360_RPC_CALL_UTA_MS_SIM_TK_REFRESH_CONFIRM_RSP = 0x152, + XMM7360_RPC_CALL_UTA_MS_SIM_TK_REFRESH_FCN_RSP = 0x154, + XMM7360_RPC_CALL_UTA_MS_SIM_TK_CONTROL_REQ = 0x155, + XMM7360_RPC_CALL_UTA_MS_SIM_TK_TERMINAL_PROFILE_DOWNLOAD_REQ = 0x157, + XMM7360_RPC_CALL_UTA_MS_3GPP2_SMS_SEND_REQ = 0x15a, + XMM7360_RPC_CALL_UTA_MS_3GPP2_SMS_SUBSCRIBE_INDICATIONS = 0x15c, + XMM7360_RPC_CALL_UTA_MS_3GPP2_SMS_UNSUBSCRIBE_INDICATIONS = 0x15d, + XMM7360_RPC_CALL_RPC_GET_REMOTE_VER_INFO = 0x15e, + XMM7360_RPC_CALL_UTA_MS_METRICS_REGISTER_HANDLER = 0x160, + XMM7360_RPC_CALL_UTA_MS_METRICS_DEREGISTER_HANDLER = 0x161, + XMM7360_RPC_CALL_UTA_MS_METRICS_SET_OPTIONS = 0x162, + XMM7360_RPC_CALL_UTA_MS_METRICS_TRIGGER = 0x163, + XMM7360_RPC_CALL_UTA_MS_EMBMS_INIT = 0x164, + XMM7360_RPC_CALL_UTA_MS_EMBMS_SET_SERVICE_REQ = 0x165, + XMM7360_RPC_CALL_UTA_MS_EMBMS_MBSFN_AREA_CONFIG_REQ = 0x166, + XMM7360_RPC_CALL_UTA_MS_EMBMS_SESSION_CONFIG_REQ = 0x167, + XMM7360_RPC_CALL_UTA_MS_EMBMS_SET_INTERESTED_TMGI_LIST_REQ = 0x168, + XMM7360_RPC_CALL_UTA_MS_EMBMS_SET_INTERESTED_SAI_FREQ_REQ = 0x169, + XMM7360_RPC_CALL_UTA_IMS_SUBSCRIBE_INDICATIONS = 0x176, + XMM7360_RPC_CALL_UTA_IMS_UNSUBSCRIBE_INDICATIONS = 0x177, + XMM7360_RPC_CALL_UTA_IMS_GET_FRAMEWORK_STATE = 0x178, + XMM7360_RPC_CALL_UTA_RTC_GET_DATETIME = 0x179, + XMM7360_RPC_CALL_UTA_MS_SIM_ANALYSE_SIM_APDU_RESULT = 0x17a, + XMM7360_RPC_CALL_UTA_MS_SIM_OPEN_CHANNEL_REQ = 0x17b, + XMM7360_RPC_CALL_UTA_MS_SIM_CLOSE_CHANNEL_REQ = 0x17d, + XMM7360_RPC_CALL_UTA_MS_SIM_SET_BDN_REQ = 0x17f, + XMM7360_RPC_CALL_UTA_MS_SET_SIM_STACK_MAPPING_REQ = 0x181, + XMM7360_RPC_CALL_UTA_MS_GET_SIM_STACK_MAPPING_REQ = 0x183, + XMM7360_RPC_CALL_UTA_MS_NET_SET_RADIO_SIGNAL_REPORTING_CONFIGURATION = 0x188, + XMM7360_RPC_CALL_UTA_PC_IE_ENUMERATIONEXT_TOUT = 0x189, + XMM7360_RPC_CALL_UTA_MS_SIM_TK_SET_TERMINAL_CAPABILITY_REQ = 0x18a, + XMM7360_RPC_CALL_UTA_MS_SIM_TK_READ_TERMINAL_CAPABILITY_REQ = 0x18c, + XMM7360_RPC_CALL_CSI_FCC_LOCK_QUERY_REQ = 0x18e, + XMM7360_RPC_CALL_CSI_FCC_LOCK_GEN_CHALLENGE_REQ = 0x190, + XMM7360_RPC_CALL_CSI_FCC_LOCK_VER_CHALLENGE_REQ = 0x192, + XMM7360_RPC_CALL_UTA_SENSOR_OPEN_REQ = 0x194, + XMM7360_RPC_CALL_UTA_SENSOR_CLOSE_EXT = 0x197, + XMM7360_RPC_CALL_UTA_SENSOR_START_EXT = 0x198, + XMM7360_RPC_CALL_UTA_SENSOR_SET_ALARM_PARAM_EXT = 0x199, + XMM7360_RPC_CALL_UTA_SENSOR_SET_SCHEDULER_PARAM_EXT = 0x19a, + XMM7360_RPC_CALL_CSI_SIO_IP_FILTER_CNTRL_SET_REQ = 0x19b, + XMM7360_RPC_CALL_UTA_MS_ACC_CURRENT_FREQ_INFO_REQ = 0x19d, + XMM7360_RPC_CALL_CSI_TRC_AT_CMND_REQ = 0x1a0, + XMM7360_RPC_CALL_UTA_MS_SIM_APDU_CMD_EXT_REQ = 0x1a2, + XMM7360_RPC_CALL_UTA_MS_NET_GET_PLMN_NAME_INFO_REQ = 0x1a4, + XMM7360_RPC_CALL_UTA_MS_NET_GET_COUNTRY_LIST_REQ = 0x1a7, + XMM7360_RPC_CALL_UTA_MS_NET_EXT_CONFIGURE_NETWORK_MODE_REQ = 0x1a9, + XMM7360_RPC_CALL_UTA_MS_NET_EXT_BAND_STATUS_REQ = 0x1ac, + XMM7360_RPC_CALL_UTA_MS_CALL_PS_ATTACH_APN_CONFIG_REQ = 0x1af, + XMM7360_RPC_CALL_CSI_MS_CALL_PS_INITIALIZE = 0x1b1, + XMM7360_RPC_CALL_UTA_AUDIO_ENABLE_SOURCE = 0x1b2, + XMM7360_RPC_CALL_UTA_AUDIO_DISABLE_SOURCE = 0x1b3, + XMM7360_RPC_CALL_UTA_AUDIO_CONFIGURE_DESTINATION_EXT = 0x1b4, + XMM7360_RPC_CALL_UTA_AUDIO_SET_DESTINATIONS_FOR_SOURCE = 0x1b5, + XMM7360_RPC_CALL_UTA_AUDIO_SET_VOLUME_FOR_SOURCE = 0x1b6, + XMM7360_RPC_CALL_UTA_AUDIO_SET_MUTE_FOR_SOURCE_EXT = 0x1b7, + XMM7360_RPC_CALL_UTA_AUDIO_SET_VOLUME_FOR_DESTINATION = 0x1b8, + XMM7360_RPC_CALL_UTA_AUDIO_SET_MUTE_FOR_DESTINATION_EXT = 0x1b9, + XMM7360_RPC_CALL_UTA_AUDIO_CONFIGURE_SOURCE_EXT = 0x1ba, + XMM7360_RPC_CALL_UTA_AUDIO_SET_DESTINATIONS_FOR_SOURCE_EXT = 0x1bb, + XMM7360_RPC_CALL_UTA_RPC_SCREEN_CONTROL_REQ = 0x1bc, + XMM7360_RPC_CALL_UTA_MS_CALL_PS_READ_CONTEXT_STATUS_REQ = 0x1bd, + XMM7360_RPC_CALL_CSI_MS_SIM_ACCESS_GET_SIM_STATE_INFO_REQ = 0x1bf, + XMM7360_RPC_CALL_CSI_MS_NET_GET_REGISTRATION_INFO_REQ = 0x1c1, + XMM7360_RPC_CALL_CSI_SIO_IP_FILTER_NEW_CNTRL_SET_REQ = 0x1c3, + XMM7360_RPC_CALL_CSI_MS_NET_LDR_GET_APN_PLMN_PARAMETER_LIST_REQ = 0x1c5, + XMM7360_RPC_CALL_RPC_GET_API_PARAM_CHANGED_BITMAP = 0x1c8, +} Xmm7360RpcCallId; + +typedef enum { + XMM7360_RPC_UNSOL_UTA_MS_SIM_APDU_CMD_RSP_CB = 0x003, + XMM7360_RPC_UNSOL_UTA_MS_SIM_APPLICATION_RSP_CB = 0x005, + XMM7360_RPC_UNSOL_UTA_MS_SIM_INFO_IND_CB = 0x007, + XMM7360_RPC_UNSOL_UTA_MS_SIM_INIT_IND_CB = 0x008, + XMM7360_RPC_UNSOL_UTA_MS_SIM_FULL_ACCESS_IND_CB = 0x009, + XMM7360_RPC_UNSOL_UTA_MS_SIM_ERROR_IND_CB = 0x00a, + XMM7360_RPC_UNSOL_UTA_MS_SIM_CARD_IND_CB = 0x00b, + XMM7360_RPC_UNSOL_UTA_MS_SIM_APPLICATION_IND_CB = 0x00c, + XMM7360_RPC_UNSOL_UTA_MS_SIM_PB_READ_ENTRY_RSP_CB = 0x00e, + XMM7360_RPC_UNSOL_UTA_MS_SIM_GEN_PIN_RSP_CB = 0x010, + XMM7360_RPC_UNSOL_UTA_MS_SIM_MODIFY_LOCK_RSP_CB = 0x012, + XMM7360_RPC_UNSOL_UTA_MS_SIM_LOCK_STATUS_IND_CB = 0x013, + XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_MO_SMS_CONTROL_INFO_IND_CB = 0x014, + XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_PROACTIVE_COMMAND_IND_CB = 0x015, + XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_ENVELOPE_RES_IND_CB = 0x018, + XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_TERMINAL_PROFILE_READ_RSP_CB = 0x01a, + XMM7360_RPC_UNSOL_UTA_SIM_TK_PROACTIVE_COMMAND_HANDLER_FUNC = 0x01b, + XMM7360_RPC_UNSOL_UTA_MS_CPS_SET_MODE_RSP = 0x01e, + XMM7360_RPC_UNSOL_UTA_MS_CPS_SET_MODE_IND_CB = 0x022, + XMM7360_RPC_UNSOL_UTA_MS_SS_NETWORK_ERROR_IND_CB = 0x02a, + XMM7360_RPC_UNSOL_UTA_MS_SS_NETWORK_REJECT_IND_CB = 0x02b, + XMM7360_RPC_UNSOL_UTA_MS_SS_NETWORK_GSM_CAUSE_IND_CB = 0x02c, + XMM7360_RPC_UNSOL_UTA_MS_SS_USSD_RSP_CB = 0x02d, + XMM7360_RPC_UNSOL_UTA_MS_SS_USSD_IND_CB = 0x02e, + XMM7360_RPC_UNSOL_UTA_MS_SS_END_IND_CB = 0x02f, + XMM7360_RPC_UNSOL_UTA_MS_SMS_INCOMING_IND_CB = 0x032, + XMM7360_RPC_UNSOL_UTA_MS_SMS_SEND_RSP_CB = 0x033, + XMM7360_RPC_UNSOL_UTA_MS_SMS_SET_MEMORY_AVAILABLE_RSP_CB = 0x035, + XMM7360_RPC_UNSOL_UTA_MS_SMS_SIM_MSG_CACHE_FINISHED_IND_CB = 0x037, + XMM7360_RPC_UNSOL_UTA_MS_SMS_SIM_MSG_COUNT_RSP_CB = 0x039, + XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_DEFINE_PRIMARY_RSP_CB = 0x03e, + XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_UNDEFINE_PRIMARY_RSP_CB = 0x040, + XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_GET_PRIMARY_RSP_CB = 0x042, + XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_SET_AUTHENTICATION_RSP_CB = 0x044, + XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_SET_DNS_RSP_CB = 0x046, + XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_GET_NEGOTIATED_DNS_RSP_CB = 0x048, + XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_GET_NEG_IP_ADDR_RSP_CB = 0x04a, + XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_ACTIVATE_RSP_CB = 0x04c, + XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_ACTIVATE_STATUS_IND_CB = 0x04d, + XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_DEACTIVATE_RSP_CB = 0x04f, + XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_DEACTIVATE_IND_CB = 0x050, + XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_CONNECT_RSP_CB = 0x052, + XMM7360_RPC_UNSOL_UTA_MS_NET_SINGLE_SHOT_RADIO_SIGNAL_REPORTING_RSP_CB = 0x056, + XMM7360_RPC_UNSOL_UTA_MS_NET_CELL_INFO_IND_CB = 0x057, + XMM7360_RPC_UNSOL_UTA_MS_NET_CONNECTION_INFO_IND_CB = 0x058, + XMM7360_RPC_UNSOL_UTA_MS_NET_HSPA_INFO_IND_CB = 0x059, + XMM7360_RPC_UNSOL_UTA_MS_NET_RADIO_SIGNAL_IND_CB = 0x05a, + XMM7360_RPC_UNSOL_UTA_MS_NET_CELL_CHANGE_IND_CB = 0x05b, + XMM7360_RPC_UNSOL_UTA_MS_NET_ATTACH_RSP_CB = 0x063, + XMM7360_RPC_UNSOL_UTA_MS_NET_PS_ATTACH_RSP_CB = 0x064, + XMM7360_RPC_UNSOL_UTA_MS_NET_PS_DETACH_RSP_CB = 0x065, + XMM7360_RPC_UNSOL_UTA_MS_NET_SCAN_RSP_CB = 0x066, + XMM7360_RPC_UNSOL_UTA_MS_NET_POWER_DOWN_RSP_CB = 0x067, + XMM7360_RPC_UNSOL_UTA_MS_NET_EXT_SCAN_RSP_CB = 0x068, + XMM7360_RPC_UNSOL_UTA_MS_NET_PS_ATTACH_IND_CB = 0x069, + XMM7360_RPC_UNSOL_UTA_MS_NET_PS_DETACH_IND_CB = 0x06a, + XMM7360_RPC_UNSOL_UTA_MS_NET_REGISTRATION_INFO_IND_CB = 0x06b, + XMM7360_RPC_UNSOL_UTA_MS_NET_IS_ATTACH_ALLOWED_IND_CB = 0x06c, + XMM7360_RPC_UNSOL_UTA_MS_NET_GPRS_CLASS_IND_CB = 0x06d, + XMM7360_RPC_UNSOL_UTA_MS_NET_SET_FD_CONFIG_RSP_CB = 0x06f, + XMM7360_RPC_UNSOL_UTA_MS_NET_FD_CONFIG_IND_CB = 0x070, + XMM7360_RPC_UNSOL_UTA_MS_NET_GET_FD_CONFIG_RSP_CB = 0x072, + XMM7360_RPC_UNSOL_UTA_MS_NET_CONFIGURE_NETWORK_MODE_RSP_CB = 0x074, + XMM7360_RPC_UNSOL_UTA_MS_NET_NETWORK_MODE_CHANGE_IND_CB = 0x075, + XMM7360_RPC_UNSOL_UTA_MS_NET_RAT_MODE_STATUS_RSP_CB = 0x077, + XMM7360_RPC_UNSOL_UTA_MS_NET_RAT_MODE_STATUS_IND_CB = 0x078, + XMM7360_RPC_UNSOL_UTA_MS_NET_DC_SET_VOICE_DOMAIN_PREFERENCE_CONFIG_RSP_CB = 0x081, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_SETUP_CALL_RSP_CB = 0x083, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_DIALING_IND_CB = 0x084, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_ALERTING_IND_CB = 0x085, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_CTM_INFO_IND_CB = 0x086, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_CONNECTED_IND_CB = 0x087, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_RELEASE_CALL_RSP_CB = 0x089, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_DISCONNECTING_IND_CB = 0x08a, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_DISCONNECTED_IND_CB = 0x08b, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_INCOMING_CALL_IND_CB = 0x08c, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_ACCEPT_CALL_RSP_CB = 0x08e, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_PROGRESS_IND_CB = 0x08f, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_SWAP_CALLS_RSP_CB = 0x091, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_HOLD_CALL_RSP_CB = 0x093, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_RETRIEVE_CALL_RSP_CB = 0x095, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_SPLIT_MPTY_RSP_CB = 0x097, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_JOIN_CALLS_RSP_CB = 0x099, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_TRANSFER_CALLS_RSP_CB = 0x09b, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_START_DTMF_RSP_CB = 0x09d, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_STOP_DTMF_RSP_CB = 0x09f, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_STOP_DTMF_EXT_RSP_CB = 0x0a0, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_NOTIFICATION_IND_CB = 0x0a1, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_CUG_INFO_IND_CB = 0x0a2, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_CALLING_NAME_INFO_IND_CB = 0x0a3, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_EMERGENCY_NUMBER_LIST_IND_CB = 0x0a4, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_CALL_STATUS_IND_CB = 0x0a5, + XMM7360_RPC_UNSOL_UTA_CALL_MULTIMEDIA_GET_MEDIA_PROFILES_INFO_RSP_CB = 0x0a9, + XMM7360_RPC_UNSOL_UTA_MS_CALL_MULTIMEDIA_SETUP_CALL_RSP_CB = 0x0aa, + XMM7360_RPC_UNSOL_UTA_MS_CALL_MULTIMEDIA_UPDATE_CALL_RSP_CB = 0x0ab, + XMM7360_RPC_UNSOL_UTA_MS_CALL_CS_VOIMS_SRVCC_HO_STATUS_IND_CB = 0x0ae, + XMM7360_RPC_UNSOL_UTA_MS_CPS_SET_SIM_MODE_RSP = 0x0af, + XMM7360_RPC_UNSOL_UTA_MS_CPS_STARTUP_IND_CB = 0x0b1, + XMM7360_RPC_UNSOL_UTA_MS_SS_CALL_FORWARD_RSP_CB = 0x0b3, + XMM7360_RPC_UNSOL_UTA_MS_SS_CALL_WAITING_RSP_CB = 0x0b5, + XMM7360_RPC_UNSOL_UTA_MS_SS_CALL_BARRING_RSP_CB = 0x0b7, + XMM7360_RPC_UNSOL_UTA_MS_SS_IDENTIFICATION_RSP_CB = 0x0b9, + XMM7360_RPC_UNSOL_UTA_MS_SMS_DATA_DOWNLOAD_RSP_CB = 0x0bc, + XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_GET_NEG_QOS_RSP_CB = 0x0bf, + XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_GET_TFT_RSP_CB = 0x0c1, + XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_SET_PCO_RSP_CB = 0x0c3, + XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_GET_NW_PCO_RSP_CB = 0x0c5, + XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_NW_ACTIVATE_IND_CB = 0x0c6, + XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_NW_ACTIVATE_ACCEPT_RSP_CB = 0x0c8, + XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_MODIFY_IND_CB = 0x0ca, + XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_SUSPEND_IND_CB = 0x0cb, + XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_RESUME_IND_CB = 0x0cc, + XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_SET_DATA_PREF_RSP_CB = 0x0ce, + XMM7360_RPC_UNSOL_UTA_MS_CBS_START_RSP_CB = 0x0d1, + XMM7360_RPC_UNSOL_UTA_MS_CBS_STOP_RSP_CB = 0x0d2, + XMM7360_RPC_UNSOL_UTA_MS_CBS_NEW_MESSAGE_IND_CB = 0x0d5, + XMM7360_RPC_UNSOL_UTA_MS_CBS_ETWS_CONFIG_RSP_CB = 0x0d7, + XMM7360_RPC_UNSOL_UTA_MS_CBS_ETWS_START_RSP_CB = 0x0d9, + XMM7360_RPC_UNSOL_UTA_MS_CBS_ETWS_STOP_RSP_CB = 0x0db, + XMM7360_RPC_UNSOL_UTA_MS_CBS_ETWS_NOTIFY_PRIMARY_WARNING_IND = 0x0dc, + XMM7360_RPC_UNSOL_UTA_MS_CBS_ETWS_NOTIFY_SECONDARY_WARNING_IND = 0x0dd, + XMM7360_RPC_UNSOL_UTA_MS_NET_CONFIGURE_RX_DIVERSITY_DARP_IND_CB = 0x0e1, + XMM7360_RPC_UNSOL_UTA_MS_NET_TIME_INFO_READ_RSP_CB = 0x0e4, + XMM7360_RPC_UNSOL_UTA_MS_NET_TIME_INFO_IND_CB = 0x0e5, + XMM7360_RPC_UNSOL_UTA_MS_NET_BAND_STATUS_RSP_CB = 0x0e8, + XMM7360_RPC_UNSOL_UTA_MS_NET_BAND_STATUS_IND_CB = 0x0e9, + XMM7360_RPC_UNSOL_UTA_MS_NET_SET_CSG_CONFIG_RSP_CB = 0x0ea, + XMM7360_RPC_UNSOL_UTA_MS_NET_GET_CSG_CONFIG_RSP_CB = 0x0eb, + XMM7360_RPC_UNSOL_UTA_MS_NET_GET_EXTENDED_RADIO_SIGNAL_INFO_RSP_CB = 0x0ed, + XMM7360_RPC_UNSOL_UTA_MS_NET_NITZ_INFO_IND_CB = 0x0ee, + XMM7360_RPC_UNSOL_UTA_MS_NET_DETACH_RSP_CB = 0x0f0, + XMM7360_RPC_UNSOL_UTA_MS_NET_SELECT_GPRS_CLASS_RSP_CB = 0x0f2, + XMM7360_RPC_UNSOL_UTA_MS_NET_NETWORK_FEATURE_SUPPORT_INFO_IND_CB = 0x0f5, + XMM7360_RPC_UNSOL_UTA_MS_NET_EPS_NETWORK_FEATURE_SUPPORT_INFO_IND_CB = 0x0f6, + XMM7360_RPC_UNSOL_UTA_MS_NET_CS_SERVICE_NOTIFICATION_IND_CB = 0x0f7, + XMM7360_RPC_UNSOL_UTA_MS_NET_DUAL_SIM_SERVICE_IND_CB = 0x0f8, + XMM7360_RPC_UNSOL_UTA_MS_NET_SINGLE_SHOT_FD_RSP_CB = 0x0fa, + XMM7360_RPC_UNSOL_UTA_MS_SIM_PB_GET_LOCATION_RSP_CB = 0x0fc, + XMM7360_RPC_UNSOL_UTA_MS_SIM_PB_READ_GAS_ENTRY_RSP_CB = 0x0fe, + XMM7360_RPC_UNSOL_UTA_MS_SIM_PB_WRITE_ENTRY_RSP_CB = 0x100, + XMM7360_RPC_UNSOL_UTA_MS_SIM_PB_GET_META_INFORMATION_RSP_CB = 0x102, + XMM7360_RPC_UNSOL_UTA_MS_SIM_PB_USIM_PB_SELECT_RSP_CB = 0x104, + XMM7360_RPC_UNSOL_UTA_MS_SIM_PB_GET_FREE_RECORDS_RSP_CB = 0x106, + XMM7360_RPC_UNSOL_UTA_MS_SIM_PB_USIM_PB_READY_IND_CB = 0x107, + XMM7360_RPC_UNSOL_UTA_MS_SIM_PB_CACHE_LOAD_FINISHED_IND_CB = 0x108, + XMM7360_RPC_UNSOL_UTA_MS_SIM_PB_CACHE_LOAD_IND_CB = 0x109, + XMM7360_RPC_UNSOL_UTA_MS_SIM_GEN_PIN_IND_CB = 0x10d, + XMM7360_RPC_UNSOL_UTA_MS_SIM_FDN_STATE_IND_CB = 0x10f, + XMM7360_RPC_UNSOL_UTA_IDC_AP_MSG_SET_RSP_CB = 0x112, + XMM7360_RPC_UNSOL_UTA_IDC_AP_MSG_GET_RSP_CB = 0x113, + XMM7360_RPC_UNSOL_UTA_IDC_CWS_MSG_SET_RSP_CB = 0x117, + XMM7360_RPC_UNSOL_UTA_IDC_CWS_MSG_GET_RSP_CB = 0x118, + XMM7360_RPC_UNSOL_UTA_IDC_CWS_MSG_IND_CB = 0x11b, + XMM7360_RPC_UNSOL_UTA_BOOT_PREPARE_SHUTDOWN_RSP_CB = 0x11e, + XMM7360_RPC_UNSOL_UTA_FREQ_INFO_ACTIVATE_RSP_CB = 0x124, + XMM7360_RPC_UNSOL_UTA_FREQ_INFO_DEACTIVATE_RSP_CB = 0x125, + XMM7360_RPC_UNSOL_UTA_FREQ_INFO_GET_FREQ_INFO_RSP_CB = 0x126, + XMM7360_RPC_UNSOL_UTA_FREQ_INFO_INDICATION_CB = 0x127, + XMM7360_RPC_UNSOL_UTA_MODE_SET_RSP_CB = 0x12d, + XMM7360_RPC_UNSOL_UTA_MODE_STARTUP_IND_CB = 0x12e, + XMM7360_RPC_UNSOL_UTA_PROD_GTI_CMD_RSP_CB = 0x131, + XMM7360_RPC_UNSOL_UTA_CELL_TIME_STAMP_RSP_CB = 0x135, + XMM7360_RPC_UNSOL_UTA_MS_SS_LCS_MO_LOCATION_RSP_CB = 0x138, + XMM7360_RPC_UNSOL_UTA_MS_SS_LCS_CAPABILITIES_IND_CB = 0x13a, + XMM7360_RPC_UNSOL_UTA_MS_CP_ASSISTANCE_DATA_INJECT_RSP_CB = 0x13b, + XMM7360_RPC_UNSOL_UTA_MS_CP_ASSISTANCE_DATA_NEEDED_IND_CB = 0x13e, + XMM7360_RPC_UNSOL_UTA_MS_CP_POS_MEASUREMENT_RSP_CB = 0x13f, + XMM7360_RPC_UNSOL_UTA_MS_CP_POS_MEASUREMENT_ABORT_RSP_CB = 0x141, + XMM7360_RPC_UNSOL_UTA_MS_CP_POS_REPORT_MEASUREMENT_IND_CB = 0x143, + XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_EXEC_SMS_PP_IND_CB = 0x147, + XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_EXEC_SIM_INITIATED_CALL_IND_CB = 0x149, + XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_EXEC_SS_USSD_IND_CB = 0x14b, + XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_EXEC_DTMF_IND_CB = 0x14d, + XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_EXEC_DTMF_END_IND_CB = 0x14f, + XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_REFRESH_CONFIRM_IND_CB = 0x151, + XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_REFRESH_FCN_IND_CB = 0x153, + XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_CONTROL_RSP_CB = 0x156, + XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_TERMINAL_PROFILE_DOWNLOAD_RSP_CB = 0x158, + XMM7360_RPC_UNSOL_UTA_MS_3GPP2_SMS_SEND_RSP_CB = 0x159, + XMM7360_RPC_UNSOL_UTA_MS_3GPP2_SMS_INCOMING_IND_CB = 0x15b, + XMM7360_RPC_UNSOL_UTA_METRICS_HANDLER_FUNCTION = 0x15f, + XMM7360_RPC_UNSOL_UTA_MS_EMBMS_SET_SERVICE_RSP_CB = 0x16a, + XMM7360_RPC_UNSOL_UTA_MS_EMBMS_MBSFN_AREA_CONFIG_RSP_CB = 0x16b, + XMM7360_RPC_UNSOL_UTA_MS_EMBMS_SESSION_CONFIG_RSP_CB = 0x16c, + XMM7360_RPC_UNSOL_UTA_MS_EMBMS_SET_INTERESTED_TMGI_LIST_RSP_CB = 0x16d, + XMM7360_RPC_UNSOL_UTA_MS_EMBMS_SET_INTERESTED_SAI_FREQ_RSP_CB = 0x16e, + XMM7360_RPC_UNSOL_UTA_MS_EMBMS_SERVICE_IND_CB = 0x16f, + XMM7360_RPC_UNSOL_UTA_MS_EMBMS_MBSFN_AREA_IND_CB = 0x170, + XMM7360_RPC_UNSOL_UTA_MS_EMBMS_SERVICES_LIST_IND_CB = 0x171, + XMM7360_RPC_UNSOL_UTA_MS_EMBMS_SAI_LIST_IND_CB = 0x172, + XMM7360_RPC_UNSOL_UTA_MS_EMBMS_MPS_INFO_IND_CB = 0x173, + XMM7360_RPC_UNSOL_UTA_IMS_STATE_CHANGED_IND_CB = 0x174, + XMM7360_RPC_UNSOL_UTA_IMS_SERVICE_STATE_CHANGED_IND_CB = 0x175, + XMM7360_RPC_UNSOL_UTA_MS_SIM_OPEN_CHANNEL_RSP_CB = 0x17c, + XMM7360_RPC_UNSOL_UTA_MS_SIM_CLOSE_CHANNEL_RSP_CB = 0x17e, + XMM7360_RPC_UNSOL_UTA_MS_SIM_BDN_STATE_IND_CB = 0x180, + XMM7360_RPC_UNSOL_UTA_MS_SET_SIM_STACK_MAPPING_RSP_CB = 0x182, + XMM7360_RPC_UNSOL_UTA_MS_GET_SIM_STACK_MAPPING_RSP_CB = 0x184, + XMM7360_RPC_UNSOL_UTA_MS_SIM_MCC_MNC_IND_CB = 0x185, + XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_TERMINAL_RESPONSE_IND_CB = 0x186, + XMM7360_RPC_UNSOL_UTA_MS_NET_REGISTERED_PLMN_NAME_IND_CB = 0x187, + XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_SET_TERMINAL_CAPABILITY_RSP_CB = 0x18b, + XMM7360_RPC_UNSOL_UTA_MS_SIM_TK_READ_TERMINAL_CAPABILITY_RSP_CB = 0x18d, + XMM7360_RPC_UNSOL_CSI_FCC_LOCK_QUERY_RSP_CB = 0x18f, + XMM7360_RPC_UNSOL_CSI_FCC_LOCK_GEN_CHALLENGE_RSP_CB = 0x191, + XMM7360_RPC_UNSOL_CSI_FCC_LOCK_VER_CHALLENGE_RSP_CB = 0x193, + XMM7360_RPC_UNSOL_UTA_SENSOR_OPEN_RSP_CB = 0x195, + XMM7360_RPC_UNSOL_UTA_SENSOR_MEAS_IND_CB = 0x196, + XMM7360_RPC_UNSOL_CSI_SIO_IP_FILTER_CNTRL_SET_RSP_CB = 0x19c, + XMM7360_RPC_UNSOL_CSI_SIO_IP_FILTER_NEW_CNTRL_SET_RSP_CB = 0x1c4, + XMM7360_RPC_UNSOL_UTA_MS_ACC_CURRENT_FREQ_INFO_RSP_CB = 0x19e, + XMM7360_RPC_UNSOL_UTA_MS_ACC_CURRENT_FREQ_INFO_IND_CB = 0x19f, + XMM7360_RPC_UNSOL_CSI_TRC_AT_CMND_RSP_CB = 0x1a1, + XMM7360_RPC_UNSOL_UTA_MS_SIM_APDU_CMD_EXT_RSP_CB = 0x1a3, + XMM7360_RPC_UNSOL_UTA_MS_NET_GET_PLMN_NAME_INFO_RSP_CB = 0x1a5, + XMM7360_RPC_UNSOL_UTA_MS_NET_SIB8_TIME_INFO_IND_CB = 0x1a6, + XMM7360_RPC_UNSOL_UTA_MS_NET_GET_COUNTRY_LIST_RSP_CB = 0x1a8, + XMM7360_RPC_UNSOL_UTA_MS_NET_EXT_CONFIGURE_NETWORK_MODE_RSP_CB = 0x1aa, + XMM7360_RPC_UNSOL_UTA_MS_NET_EXT_NETWORK_MODE_CHANGE_IND_CB = 0x1ab, + XMM7360_RPC_UNSOL_UTA_MS_NET_EXT_BAND_STATUS_RSP_CB = 0x1ad, + XMM7360_RPC_UNSOL_UTA_MS_NET_EXT_BAND_STATUS_IND_CB = 0x1ae, + XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_ATTACH_APN_CONFIG_RSP_CB = 0x1b0, + XMM7360_RPC_UNSOL_UTA_MS_CALL_PS_READ_CONTEXT_STATUS_RSP_CB = 0x1be, + XMM7360_RPC_UNSOL_CSI_MS_SIM_ACCESS_GET_SIM_STATE_INFO_RSP_CB = 0x1c0, + XMM7360_RPC_UNSOL_CSI_MS_NET_GET_REGISTRATION_INFO_RSP_CB = 0x1c2, + XMM7360_RPC_UNSOL_CSI_MS_NET_LDR_GET_APN_PLMN_PARAMETER_LIST_RSP_CB = 0x1c6, + XMM7360_RPC_UNSOL_UTA_MS_NET_LDR_APN_PARAMETERS_CHANGE_IND_CB = 0x1c7, +} Xmm7360RpcUnsolId; + +typedef enum { + XMM7360_RPC_MSG_ARG_TYPE_BYTE, + XMM7360_RPC_MSG_ARG_TYPE_SHORT, + XMM7360_RPC_MSG_ARG_TYPE_LONG, + XMM7360_RPC_MSG_ARG_TYPE_STRING, + XMM7360_RPC_MSG_ARG_TYPE_UNKNOWN, +} Xmm7360RpcMsgArgType; + + +#define XMM7360_RPC_MSG_ARG_GET_INT(arg) \ + (arg->type == XMM7360_RPC_MSG_ARG_TYPE_BYTE ? arg->value.b \ + : arg->type == XMM7360_RPC_MSG_ARG_TYPE_SHORT ? arg->value.s \ + : arg->type == XMM7360_RPC_MSG_ARG_TYPE_LONG ? arg->value.l : -1) + +typedef struct { + Xmm7360RpcMsgArgType type; + union { + gint8 b; + gint16 s; + gint32 l; + const gchar *string; + } value; + gsize size; + gsize pad; +} Xmm7360RpcMsgArg; + +typedef enum { + XMM7360_RPC_RESPONSE_TYPE_RESPONSE, + XMM7360_RPC_RESPONSE_TYPE_ASYNC_ACK, + XMM7360_RPC_RESPONSE_TYPE_UNSOLICITED, + XMM7360_RPC_RESPONSE_TYPE_UNKNOWN, +} Xmm7360RpcResponseType; + +typedef struct { + guint32 id; + Xmm7360RpcResponseType type; + guint32 unsol_id; + GByteArray *body; + GPtrArray *content; /* contains (Xmm7360RpcMsgArgs *) */ +} Xmm7360RpcResponse; + +/*****************************************************************************/ + +void xmm7360_byte_array_append_asn_int4 (GByteArray *array, + gint32 value); + +void xmm7360_rpc_response_free (Xmm7360RpcResponse *msg); + +GByteArray * xmm7360_rpc_args_to_byte_array (const Xmm7360RpcMsgArg *args); + +Xmm7360RpcResponse *xmm7360_parse_response (GByteArray *buf, + GError **error); + +GByteArray * xmm7360_command_to_byte_array (Xmm7360RpcCallId callid, + gboolean is_async, + GByteArray *body); + +GString * xmm7360_rpc_args_to_string (GPtrArray *args); + +GString * xmm7360_byte_array_hexlify (GByteArray *buf); + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (Xmm7360RpcResponse, xmm7360_rpc_response_free); + +#endif /* MM_XMMRPC_XMM7360_PROTOCOL_H */ diff --git a/src/plugins/meson.build b/src/plugins/meson.build index c19dfd3b..8ad7a804 100644 --- a/src/plugins/meson.build +++ b/src/plugins/meson.build @@ -600,6 +600,7 @@ if plugins_options['intel'] 'intel/mm-broadband-modem-xmm7360.c', 'intel/mm-broadband-modem-xmm7360-rpc.c', 'intel/mm-port-serial-xmmrpc-xmm7360.c', + 'intel/mm-xmmrpc-xmm7360-protocol.c', 'intel/mm-bearer-xmm7360.c', 'intel/mm-sim-xmm7360.c', ) @@ -610,7 +611,7 @@ if plugins_options['intel'] common_c_args = '-DMM_MODULE_NAME="intel"' - headers = files('intel/mm-port-serial-xmmrpc-xmm7360.h') + headers = files('intel/mm-xmmrpc-xmm7360-protocol.h') enums_types = 'mm-intel-enums-types' From 4fead86d247f0a5c61d57d3155e0580f8c01d9b0 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Wed, 7 Jan 2026 22:57:25 -0600 Subject: [PATCH 4/9] intel: XMM7360: better handling of silly ASN int sizes xmm7360_byte_array_read_asn_int() would keep bit-shifting a gint into oblivion if the int's size was > 32-bit. It also didn't handle size 0 ints at all, and while size 24 ints would get stuffed into a 32-bit variable those probably aren't a thing and if they actually are they should get specifically handled. Signed-off-by: Dan Williams --- src/plugins/intel/mm-xmmrpc-xmm7360-protocol.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.c b/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.c index 8de12652..336987fe 100644 --- a/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.c +++ b/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.c @@ -75,6 +75,10 @@ xmm7360_byte_array_read_asn_int (GByteArray *buf, } offset++; size = buf->data[offset++]; + if (size > 4 || size == 3) { + PARSE_ERROR ("unhandled int size %d", size); + return -1; + } /* read actual value byte by byte */ if (buf->len < offset + size) { @@ -88,15 +92,20 @@ xmm7360_byte_array_read_asn_int (GByteArray *buf, } if (out_arg) { - if (size == 0x01) { + if (size == 0x00) { + out_arg->type = XMM7360_RPC_MSG_ARG_TYPE_UNKNOWN; + } else if (size == 0x01) { out_arg->type = XMM7360_RPC_MSG_ARG_TYPE_BYTE; out_arg->value.b = (gint8) val; } else if (size == 0x02) { out_arg->type = XMM7360_RPC_MSG_ARG_TYPE_SHORT; out_arg->value.s = (gint16) val; - } else { + } else if (size == 0x04) { out_arg->type = XMM7360_RPC_MSG_ARG_TYPE_LONG; out_arg->value.l = (gint32) val; + } else { + /* size is validated above */ + g_assert_not_reached (); } } From 64d8053413b8e7583a6176e9f3397aaa4135372f Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Wed, 7 Jan 2026 22:55:03 -0600 Subject: [PATCH 5/9] intel: XMM7360: move Xmm7360RpcMsgArgType UNKNOWN value first in enum That way UNKNOWN is the zero'd value instead of BYTE; it's easier to test for and less error-prone if not explicitly set to the right value. Signed-off-by: Dan Williams --- src/plugins/intel/mm-xmmrpc-xmm7360-protocol.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.h b/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.h index f2f34f6f..8531ba46 100644 --- a/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.h +++ b/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.h @@ -484,11 +484,11 @@ typedef enum { } Xmm7360RpcUnsolId; typedef enum { + XMM7360_RPC_MSG_ARG_TYPE_UNKNOWN, XMM7360_RPC_MSG_ARG_TYPE_BYTE, XMM7360_RPC_MSG_ARG_TYPE_SHORT, XMM7360_RPC_MSG_ARG_TYPE_LONG, XMM7360_RPC_MSG_ARG_TYPE_STRING, - XMM7360_RPC_MSG_ARG_TYPE_UNKNOWN, } Xmm7360RpcMsgArgType; From d6fe0722c9b37f7adbca8f1b4155ebada23a287b Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Wed, 7 Jan 2026 21:55:12 -0600 Subject: [PATCH 6/9] intel: XMM7360: add xmmrpc protocol test infrastructure Signed-off-by: Dan Williams --- .../intel/mm-xmmrpc-xmm7360-protocol.c | 15 +- .../intel/mm-xmmrpc-xmm7360-protocol.h | 23 ++ .../tests/test-xmmrpc-xmm7360-protocol.c | 341 ++++++++++++++++++ src/plugins/meson.build | 8 +- 4 files changed, 380 insertions(+), 7 deletions(-) create mode 100644 src/plugins/intel/tests/test-xmmrpc-xmm7360-protocol.c diff --git a/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.c b/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.c index 336987fe..e4440e0a 100644 --- a/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.c +++ b/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.c @@ -21,6 +21,9 @@ #include #include +#include +#define _LIBMM_INSIDE_MM +#include #include "mm-xmmrpc-xmm7360-protocol.h" #include "mm-intel-enums-types.h" @@ -50,7 +53,7 @@ xmm7360_rpc_response_free (Xmm7360RpcResponse *response) g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, fmt, __VA_ARGS__); \ } -static gint +gint xmm7360_byte_array_read_asn_int (GByteArray *buf, gsize offset, gint *out_val, @@ -64,7 +67,7 @@ xmm7360_byte_array_read_asn_int (GByteArray *buf, if (buf->len <= offset + 2) { PARSE_ERROR ("initial buffer size %u too small (need %zu)", - buf->len, offset + 2); + buf->len, offset + 2 + 1); return -1; } @@ -116,7 +119,7 @@ xmm7360_byte_array_read_asn_int (GByteArray *buf, return offset - orig_offset; } -static gint +gint xmm7360_byte_array_read_string (GByteArray *buf, gsize offset, Xmm7360RpcMsgArg *out_arg, @@ -217,14 +220,14 @@ xmm7360_byte_array_append_asn_int4 (GByteArray *buf, gint32 value) g_byte_array_append (buf, (const guint8 *) &value_be, 4); } -static void +void xmm7360_byte_array_append_uint8 (GByteArray *buf, gulong val) { guint8 _val = (guint8) val; g_byte_array_append (buf, &_val, 1); } -static void +void xmm7360_byte_array_append_string (GByteArray *buf, const guint8 *data, gsize data_len, @@ -413,7 +416,7 @@ xmm7360_command_to_byte_array (Xmm7360RpcCallId callid, return buf; } -static gboolean +gboolean xmm7360_rpc_msg_body_unpack (GByteArray *buf, GPtrArray *args, GError **error) { gsize offset; diff --git a/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.h b/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.h index 8531ba46..e02e2ea3 100644 --- a/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.h +++ b/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.h @@ -526,9 +526,28 @@ typedef struct { /*****************************************************************************/ +gint xmm7360_byte_array_read_asn_int (GByteArray *buf, + gsize offset, + gint *out_val, + Xmm7360RpcMsgArg *out_arg, + GError **error); + +gint xmm7360_byte_array_read_string (GByteArray *buf, + gsize offset, + Xmm7360RpcMsgArg *out_arg, + GError **error); + void xmm7360_byte_array_append_asn_int4 (GByteArray *array, gint32 value); +void xmm7360_byte_array_append_uint8 (GByteArray *buf, + gulong val); + +void xmm7360_byte_array_append_string (GByteArray *buf, + const guint8 *data, + gsize data_len, + guint data_len_padded); + void xmm7360_rpc_response_free (Xmm7360RpcResponse *msg); GByteArray * xmm7360_rpc_args_to_byte_array (const Xmm7360RpcMsgArg *args); @@ -544,6 +563,10 @@ GString * xmm7360_rpc_args_to_string (GPtrArray GString * xmm7360_byte_array_hexlify (GByteArray *buf); +gboolean xmm7360_rpc_msg_body_unpack (GByteArray *buf, + GPtrArray *args, + GError **error); + G_DEFINE_AUTOPTR_CLEANUP_FUNC (Xmm7360RpcResponse, xmm7360_rpc_response_free); #endif /* MM_XMMRPC_XMM7360_PROTOCOL_H */ diff --git a/src/plugins/intel/tests/test-xmmrpc-xmm7360-protocol.c b/src/plugins/intel/tests/test-xmmrpc-xmm7360-protocol.c new file mode 100644 index 00000000..2de796cf --- /dev/null +++ b/src/plugins/intel/tests/test-xmmrpc-xmm7360-protocol.c @@ -0,0 +1,341 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * 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: + * + * Copyright (C) 2018 Aleksander Morgado + */ + +#include +#include +#include + +#include +#define _LIBMM_INSIDE_MM +#include + +#include "mm-log-test.h" +#include "mm-modem-helpers.h" +#include "mm-xmmrpc-xmm7360-protocol.h" + +#define XMM_BUFFER(...) \ + .buffer = { __VA_ARGS__ }, \ + .buffer_size = sizeof((guint8[]){ __VA_ARGS__ }), + +#define XMM_STRING_BUFFER(str_type, str_len, ...) \ + .buffer = { str_type, \ + str_len, \ + 0x02, /* len_padded: ASN int start marker */ \ + 0x01, /* len_padded: ASN int size 1 */ \ + str_len * (str_type == 0x55 ? 1 : str_type == 0x56 ? 2 : str_type == 0x57 ? 4 : 0), /* len_padded: ASN int val */ \ + 0x02, /* pad_len: ASN int start marker */ \ + 0x01, /* pad_len: ASN int size 1 */ \ + 0x00, /* pad_len: ASN int val 0 */ \ + __VA_ARGS__ /* string data */ \ + }, \ + .buffer_size = sizeof((guint8[]){ __VA_ARGS__ }) + 8, + +#define XMM_EXPECTED_ARG_BUFFER(...) \ + .expected_arg_buf = { __VA_ARGS__ }, \ + .expected_arg_size = sizeof((guint8[]){ __VA_ARGS__ }), + +/*****************************************************************************/ + +typedef struct { + const gchar *detail; + const gsize offset; + const gint expected_consumed; + const gint expected_error; + const gchar *expected_error_string; + const guint8 buffer[255]; + const guint buffer_size; + const guint8 expected_arg_buf[255]; + const gsize expected_arg_size; +} ReadStrTest; + +static const ReadStrTest read_str_tests[] = { + { + .detail = "zero_buffer", + .expected_consumed = -1, + .expected_error = MM_CORE_ERROR_FAILED, + .expected_error_string = "initial buffer size 0 too small (need 2)", + }, + { + .detail = "1b_buffer", + .expected_consumed = -1, + .expected_error = MM_CORE_ERROR_FAILED, + .expected_error_string = "initial buffer size 1 too small (need 2)", + XMM_BUFFER( 0x02 ) + }, + { + .detail = "bad_string_type", + .expected_consumed = -1, + .expected_error = MM_CORE_ERROR_FAILED, + .expected_error_string = "unhandled string type 0x02", + XMM_BUFFER( 0x02, 0x04 ) + }, + { + .detail = "small_buffer_big_message", + .expected_consumed = -1, + .expected_error = MM_CORE_ERROR_FAILED, + .expected_error_string = "initial buffer size 3 too small (need 5)", + XMM_BUFFER( 0x55, 0x04, 0x02 ) + }, + { + .detail = "1b_string_2chars", + .expected_consumed = 10, + XMM_STRING_BUFFER( 0x55, 0x02, 'H', 'i' ) + XMM_EXPECTED_ARG_BUFFER( 'H', 'i' ) + }, + { + .detail = "1b_string_5chars", + .expected_consumed = 13, + XMM_STRING_BUFFER( 0x55, 0x05, 'H', 'e', 'l', 'l', 'o' ) + XMM_EXPECTED_ARG_BUFFER( 'H', 'e', 'l', 'l', 'o' ) + }, + { + .detail = "2b_string_2chars", + .expected_consumed = 12, + XMM_STRING_BUFFER( 0x56, 0x02, 0x00, 'H', 0x00, 'i' ) + XMM_EXPECTED_ARG_BUFFER( 0x00, 'H', 0x00, 'i' ) + }, + { + .detail = "4b_string_2chars", + .expected_consumed = 16, + XMM_STRING_BUFFER( 0x57, 0x02, 0x00, 0x01, 0x02, 'H', 0x00, 0x01, 0x02, 'i' ) + XMM_EXPECTED_ARG_BUFFER( 0x00, 0x01, 0x02, 'H', 0x00, 0x01, 0x02, 'i' ) + }, + { + .detail = "1b_string_zero_length", + .expected_consumed = 8, + XMM_STRING_BUFFER( 0x55, 0x00 ) + }, + { + .detail = "2b_string_zero_length", + .expected_consumed = 8, + XMM_STRING_BUFFER( 0x56, 0x00 ) + }, + { + .detail = "4b_string_zero_length", + .expected_consumed = 8, + XMM_STRING_BUFFER( 0x57, 0x00 ) + }, +}; + +static void +test_read_str (gconstpointer data) +{ + const ReadStrTest *test = data; + g_autoptr(GError) error = NULL; + gint consumed; + g_autoptr(GByteArray) buffer = NULL; + Xmm7360RpcMsgArg arg = { 0 }; + + buffer = g_byte_array_sized_new (sizeof (test->buffer_size)); + if (sizeof (test->buffer)) + g_byte_array_append (buffer, test->buffer, test->buffer_size); + + consumed = xmm7360_byte_array_read_string (buffer, test->offset, &arg, &error); + if (error) { + g_assert_error (error, MM_CORE_ERROR, test->expected_error); + g_assert_cmpstr (error->message, ==, test->expected_error_string); + g_assert_cmpint (consumed, <, 0); + g_assert_cmpint (test->expected_arg_size, ==, 0); + g_assert_cmpint (arg.size, ==, 0); + } else { + g_assert_no_error (error); + g_assert_cmpint (test->expected_error, ==, 0); + g_assert_false (!!test->expected_error_string); + g_assert_cmpint (consumed, ==, test->expected_consumed); + g_assert_cmpint (arg.type, ==, XMM7360_RPC_MSG_ARG_TYPE_STRING); + g_assert_cmpint (arg.size, ==, test->expected_arg_size); + g_assert_cmpmem (arg.value.string, arg.size, test->expected_arg_buf, test->expected_arg_size); + } +} + +/*****************************************************************************/ + +typedef struct { + const gchar *detail; + const gsize offset; + const gint expected_consumed; + const gint expected_error; + const gchar *expected_error_string; + const gint expected_val; + const guint8 buffer[255]; + const guint buffer_size; + const Xmm7360RpcMsgArg expected_arg; +} ReadAsnIntTest; + +static const ReadAsnIntTest read_asn_int_tests[] = { + { + .detail = "zero_buffer", + .expected_consumed = -1, + .expected_error = MM_CORE_ERROR_FAILED, + .expected_error_string = "initial buffer size 0 too small (need 3)", + }, + { + .detail = "1b_buffer", + .expected_consumed = -1, + .expected_error = MM_CORE_ERROR_FAILED, + .expected_error_string = "initial buffer size 1 too small (need 3)", + XMM_BUFFER( 0x02 ) + }, + { + .detail = "2b_buffer", + .expected_consumed = -1, + .expected_error = MM_CORE_ERROR_FAILED, + .expected_error_string = "initial buffer size 2 too small (need 3)", + XMM_BUFFER( 0x02, 0x01 ) + }, + { + .detail = "small_buffer_big_message", + .expected_consumed = -1, + .expected_error = MM_CORE_ERROR_FAILED, + .expected_error_string = "buffer size 3 too small (need 6)", + XMM_BUFFER( 0x02, 0x04, 0x02 ) + }, + { + .detail = "bad_start", + .expected_consumed = -1, + .expected_error = MM_CORE_ERROR_FAILED, + .expected_error_string = "unexpected ASN start byte 0x00 (expected 0x02)", + XMM_BUFFER( 0x00, 0x01, 0x01 ) + }, + { + .detail = "no_data", + .expected_consumed = 2, + .expected_val = 0, + XMM_BUFFER( 0x02, 0x00, 0x00 ) + .expected_arg = { + .type = XMM7360_RPC_MSG_ARG_TYPE_UNKNOWN, + }, + }, + { + .detail = "u8", + .expected_consumed = 3, + .expected_val = 1, + XMM_BUFFER( 0x02, 0x01, 0x01 ) + .expected_arg = { + .type = XMM7360_RPC_MSG_ARG_TYPE_BYTE, + .value.b = 0x01, + }, + }, + { + .detail = "u16", + .expected_consumed = 4, + .expected_val = 0x102, + XMM_BUFFER( 0x02, 0x02, 0x01, 0x02 ) + .expected_arg = { + .type = XMM7360_RPC_MSG_ARG_TYPE_SHORT, + .value.s = 0x102, + }, + }, + { + .detail = "u24_is_bad", + .expected_consumed = -1, + .expected_error = MM_CORE_ERROR_FAILED, + .expected_error_string = "unhandled int size 3", + XMM_BUFFER( 0x02, 0x03, 0x01, 0x02, 0x03 ) + }, + { + .detail = "u32", + .expected_consumed = 6, + .expected_val = 0x1020304, + XMM_BUFFER( 0x02, 0x04, 0x01, 0x02, 0x03, 0x04 ) + .expected_arg = { + .type = XMM7360_RPC_MSG_ARG_TYPE_LONG, + .value.l = 0x1020304, + }, + }, + { + .detail = "ubad", + .expected_consumed = -1, + .expected_error = MM_CORE_ERROR_FAILED, + .expected_error_string = "unhandled int size 6", + XMM_BUFFER( 0x02, 0x06, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 ) + }, +}; + +static void +test_read_asn_int (gconstpointer data) +{ + const ReadAsnIntTest *test = data; + g_autoptr(GError) error = NULL; + gint consumed; + g_autoptr(GByteArray) buffer = NULL; + gint val = 0; + Xmm7360RpcMsgArg arg = { 0 }; + + buffer = g_byte_array_sized_new (sizeof (test->buffer_size)); + if (sizeof (test->buffer)) + g_byte_array_append (buffer, test->buffer, test->buffer_size); + + consumed = xmm7360_byte_array_read_asn_int (buffer, test->offset, &val, &arg, &error); + if (error) { + g_assert_error (error, MM_CORE_ERROR, test->expected_error); + g_assert_cmpstr (error->message, ==, test->expected_error_string); + g_assert_cmpint (consumed, <, 0); + g_assert_cmpint (test->expected_arg.type, ==, 0); + } else { + g_assert_no_error (error); + g_assert_cmpint (test->expected_error, ==, 0); + g_assert_false (!!test->expected_error_string); + g_assert_cmpint (consumed, ==, test->expected_consumed); + g_assert_cmpint (val, ==, test->expected_val); + if (test->expected_arg.type != XMM7360_RPC_MSG_ARG_TYPE_UNKNOWN) { + g_assert_cmpint (arg.type, ==, test->expected_arg.type); + switch (arg.type) { + case XMM7360_RPC_MSG_ARG_TYPE_BYTE: + g_assert_cmpint (arg.value.b, ==, test->expected_arg.value.b); + break; + case XMM7360_RPC_MSG_ARG_TYPE_SHORT: + g_assert_cmpint (arg.value.s, ==, test->expected_arg.value.s); + break; + case XMM7360_RPC_MSG_ARG_TYPE_LONG: + g_assert_cmpint (arg.value.l, ==, test->expected_arg.value.l); + break; + case XMM7360_RPC_MSG_ARG_TYPE_STRING: + g_assert_cmpmem (arg.value.string, arg.size, test->expected_arg.value.string, test->expected_arg.size); + break; + case XMM7360_RPC_MSG_ARG_TYPE_UNKNOWN: + default: + g_assert_not_reached (); + } + } + } +} + +/*****************************************************************************/ + +int main (int argc, char **argv) +{ + guint i; + + setlocale (LC_ALL, ""); + + g_test_init (&argc, &argv, NULL); + + for (i = 0; i < G_N_ELEMENTS (read_asn_int_tests); i++) { + g_autofree gchar *path; + + path = g_strdup_printf ("/MM/xmmrpc/read_asn_int/%s", read_asn_int_tests[i].detail); + g_test_add_data_func (path, &read_asn_int_tests[i], test_read_asn_int); + } + + for (i = 0; i < G_N_ELEMENTS (read_str_tests); i++) { + g_autofree gchar *path; + + path = g_strdup_printf ("/MM/xmmrpc/read_str/%s", read_str_tests[i].detail); + g_test_add_data_func (path, &read_str_tests[i], test_read_str); + } + + return g_test_run (); +} diff --git a/src/plugins/meson.build b/src/plugins/meson.build index 8ad7a804..5a79bb16 100644 --- a/src/plugins/meson.build +++ b/src/plugins/meson.build @@ -635,16 +635,22 @@ if plugins_options['intel'] command: [ python, mm_mkenums, - '--fhead', '#include "mm-port-serial-xmmrpc-xmm7360.h"\n#ifndef __MM_XMM7360_ENUMS_TYPES_H__\n#define __MM_XMM7360_ENUMS_TYPES_H__\n', + '--fhead', '#include "mm-xmmrpc-xmm7360-protocol.h"\n#ifndef __MM_XMM7360_ENUMS_TYPES_H__\n#define __MM_XMM7360_ENUMS_TYPES_H__\n', '--template', files(templates_dir / enums_types + '.h.template'), '--ftail', '#endif /* __MM_XMM7360_ENUMS_TYPES_H__ */\n', '@INPUT@'], capture: true, ) + test_sources = files( + 'intel/mm-xmmrpc-xmm7360-protocol.c', + 'intel/tests/test-xmmrpc-xmm7360-protocol.c', + ) + plugins += {'plugin-intel': { 'plugin': true, 'module': {'sources': sources, 'include_directories': plugins_incs + [xmm_inc, intel_inc], 'c_args': common_c_args}, + 'test': {'sources': test_sources, 'include_directories': intel_inc, 'dependencies': libhelpers_dep}, }} endif From a486776a445bf39a51cb9f93d4c73601329c0c7b Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Fri, 9 Jan 2026 08:45:19 -0600 Subject: [PATCH 7/9] intel: XMM7360: better handle negative ASN integers from modem The original code for xmm7360_byte_array_read_asn_int() returned signed integers both from the function and from the returned Xmm7360RpcMsgArg, but didn't handle sign extension on the value returned from the function. That would lead to different values between the function return and the Xmm7360RpcMsgArg value, which seems wrong. Make those two correspond and add checks in various places that shouldn't ever see negative ints. Signed-off-by: Dan Williams --- .../intel/mm-xmmrpc-xmm7360-protocol.c | 68 +++++++++++++------ .../tests/test-xmmrpc-xmm7360-protocol.c | 61 +++++++++++++++++ 2 files changed, 108 insertions(+), 21 deletions(-) diff --git a/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.c b/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.c index e4440e0a..dcf16280 100644 --- a/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.c +++ b/src/plugins/intel/mm-xmmrpc-xmm7360-protocol.c @@ -61,9 +61,10 @@ xmm7360_byte_array_read_asn_int (GByteArray *buf, GError **error) { const gsize orig_offset = offset; - gint size; - gint bytes_read; - gint val; + gint size; + gint bytes_read; + gint val; + Xmm7360RpcMsgArg arg = { 0 }; if (buf->len <= offset + 2) { PARSE_ERROR ("initial buffer size %u too small (need %zu)", @@ -94,26 +95,37 @@ xmm7360_byte_array_read_asn_int (GByteArray *buf, val |= buf->data[offset++]; } - if (out_arg) { - if (size == 0x00) { - out_arg->type = XMM7360_RPC_MSG_ARG_TYPE_UNKNOWN; - } else if (size == 0x01) { - out_arg->type = XMM7360_RPC_MSG_ARG_TYPE_BYTE; - out_arg->value.b = (gint8) val; - } else if (size == 0x02) { - out_arg->type = XMM7360_RPC_MSG_ARG_TYPE_SHORT; - out_arg->value.s = (gint16) val; - } else if (size == 0x04) { - out_arg->type = XMM7360_RPC_MSG_ARG_TYPE_LONG; - out_arg->value.l = (gint32) val; - } else { - /* size is validated above */ - g_assert_not_reached (); - } + if (size == 0x00) { + arg.type = XMM7360_RPC_MSG_ARG_TYPE_UNKNOWN; + } else if (size == 0x01) { + arg.type = XMM7360_RPC_MSG_ARG_TYPE_BYTE; + arg.value.b = (gint8) val; + } else if (size == 0x02) { + arg.type = XMM7360_RPC_MSG_ARG_TYPE_SHORT; + arg.value.s = (gint16) val; + } else if (size == 0x04) { + arg.type = XMM7360_RPC_MSG_ARG_TYPE_LONG; + arg.value.l = (gint32) val; + } else { + /* size is validated above */ + g_assert_not_reached (); } - if (out_val) - *out_val = val; + if (out_arg) + *out_arg = arg; + + if (out_val) { + /* If the ASN int is negative, we must convert a int8/int16 + * value to the appropriate u32 value to avoid returning a + * positive 32-bit gint. + */ + if ((arg.type == XMM7360_RPC_MSG_ARG_TYPE_BYTE) && (arg.value.b < 0)) + *out_val = (arg.value.b << 24) >> 24; + else if ((arg.type == XMM7360_RPC_MSG_ARG_TYPE_SHORT) && (arg.value.s < 0)) + *out_val = (arg.value.s << 16) >> 16; + else + *out_val = arg.value.l; + } /* return bytes consumed by this function */ return offset - orig_offset; @@ -175,11 +187,19 @@ xmm7360_byte_array_read_string (GByteArray *buf, consumed = xmm7360_byte_array_read_asn_int (buf, offset, &string_len_padded, NULL, error); if (consumed < 0) return -1; + else if (string_len_padded < 0) { + PARSE_ERROR ("string length padded should be >= 0 (got %d)", string_len_padded); + return -1; + } offset += consumed; consumed = xmm7360_byte_array_read_asn_int (buf, offset, &pad_len, NULL, error); if (consumed < 0) return -1; + else if (pad_len < 0) { + PARSE_ERROR ("pad length should be >= 0 (got %d)", pad_len); + return -1; + } offset += consumed; if (string_len_padded > 0) { @@ -490,6 +510,9 @@ xmm7360_parse_response (GByteArray *buf, GError **error) if (consumed < 0) { g_prefix_error (error, "error parsing RPC message: error reading ASN message size: "); return NULL; + } else if (asn_msg_len < 0) { + PARSE_ERROR ("ASN message size should be >= 0 (got %d)", asn_msg_len); + return NULL; } offset += consumed; /* Make sure the ASN message size and message size agree */ @@ -503,6 +526,9 @@ xmm7360_parse_response (GByteArray *buf, GError **error) if (consumed < 0) { g_prefix_error (error, "error parsing RPC message: error reading unsolicited message id: "); return NULL; + } else if (unsol_id < 0) { + PARSE_ERROR ("Unsolicited message ID should be >= 0 (got %d)", unsol_id); + return NULL; } offset += consumed; diff --git a/src/plugins/intel/tests/test-xmmrpc-xmm7360-protocol.c b/src/plugins/intel/tests/test-xmmrpc-xmm7360-protocol.c index 2de796cf..9b1b8f87 100644 --- a/src/plugins/intel/tests/test-xmmrpc-xmm7360-protocol.c +++ b/src/plugins/intel/tests/test-xmmrpc-xmm7360-protocol.c @@ -262,6 +262,66 @@ static const ReadAsnIntTest read_asn_int_tests[] = { .expected_error_string = "unhandled int size 6", XMM_BUFFER( 0x02, 0x06, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 ) }, + { + .detail = "u8_negative_max", + .expected_consumed = 3, + .expected_val = -128, + XMM_BUFFER( 0x02, 0x01, 0x80 ) + .expected_arg = { + .type = XMM7360_RPC_MSG_ARG_TYPE_BYTE, + .value.b = -128, + }, + }, + { + .detail = "u16_negative_max", + .expected_consumed = 4, + .expected_val = -32768, + XMM_BUFFER( 0x02, 0x02, 0x80, 0x00 ) + .expected_arg = { + .type = XMM7360_RPC_MSG_ARG_TYPE_SHORT, + .value.s = -32768, + }, + }, + { + .detail = "u32_negative_max", + .expected_consumed = 6, + .expected_val = -2147483648, + XMM_BUFFER( 0x02, 0x04, 0x80, 0x00, 0x00, 0x00 ) + .expected_arg = { + .type = XMM7360_RPC_MSG_ARG_TYPE_LONG, + .value.l = -2147483648, + }, + }, + { + .detail = "u8_negative_min", + .expected_consumed = 3, + .expected_val = -1, + XMM_BUFFER( 0x02, 0x01, 0xFF ) + .expected_arg = { + .type = XMM7360_RPC_MSG_ARG_TYPE_BYTE, + .value.b = -1, + }, + }, + { + .detail = "u16_negative_min", + .expected_consumed = 4, + .expected_val = -1, + XMM_BUFFER( 0x02, 0x02, 0xFF, 0xFF ) + .expected_arg = { + .type = XMM7360_RPC_MSG_ARG_TYPE_SHORT, + .value.s = -1, + }, + }, + { + .detail = "u32_negative_min", + .expected_consumed = 6, + .expected_val = -1, + XMM_BUFFER( 0x02, 0x04, 0xFF, 0xFF, 0xFF, 0xFF ) + .expected_arg = { + .type = XMM7360_RPC_MSG_ARG_TYPE_LONG, + .value.l = -1, + }, + }, }; static void @@ -289,6 +349,7 @@ test_read_asn_int (gconstpointer data) g_assert_cmpint (test->expected_error, ==, 0); g_assert_false (!!test->expected_error_string); g_assert_cmpint (consumed, ==, test->expected_consumed); +g_message ("v = %d 0x%x\n", val, val); g_assert_cmpint (val, ==, test->expected_val); if (test->expected_arg.type != XMM7360_RPC_MSG_ARG_TYPE_UNKNOWN) { g_assert_cmpint (arg.type, ==, test->expected_arg.type); From fd98a809afa00cd6fc044fab852d8252c53997db Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Fri, 9 Jan 2026 11:56:28 -0600 Subject: [PATCH 8/9] sierra: enable XMM7160-based devices like Comneon HL7588 Signed-off-by: Dan Williams --- src/plugins/sierra/mm-plugin-sierra.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/sierra/mm-plugin-sierra.c b/src/plugins/sierra/mm-plugin-sierra.c index b25ebabb..7731f401 100644 --- a/src/plugins/sierra/mm-plugin-sierra.c +++ b/src/plugins/sierra/mm-plugin-sierra.c @@ -111,8 +111,8 @@ MM_PLUGIN_NAMED_CREATOR_SCOPE MMPlugin * mm_plugin_create_sierra (void) { static const gchar *subsystems[] = { "tty", "net", "usbmisc", NULL }; - static const guint16 vendor_ids[] = { 0x1199, 0 }; - static const gchar *drivers[] = { "qmi_wwan", "cdc_mbim", NULL }; + static const guint16 vendor_ids[] = { 0x1199, 0x1519, 0 }; + static const gchar *drivers[] = { "qmi_wwan", "cdc_mbim", "cdc_acm", "cdc_ncm", NULL }; return MM_PLUGIN ( g_object_new (MM_TYPE_PLUGIN_SIERRA, From a94dd40a2a849046510206480964a06b99118530 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Sun, 24 May 2026 07:47:38 -0500 Subject: [PATCH 9/9] intel: XMM7360: convert remaining asserts to error checks Return useful errors rather than asserting on unexpected responses. Signed-off-by: Dan Williams --- src/plugins/intel/mm-bearer-xmm7360.c | 21 ++++++++++++--- .../intel/mm-broadband-modem-xmm7360.c | 26 ++++++++++++++----- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/plugins/intel/mm-bearer-xmm7360.c b/src/plugins/intel/mm-bearer-xmm7360.c index 7ca3ad0e..e5d41444 100644 --- a/src/plugins/intel/mm-bearer-xmm7360.c +++ b/src/plugins/intel/mm-bearer-xmm7360.c @@ -274,12 +274,22 @@ get_dns_ready (MMBroadbandModemXmm7360 *modem, arg = (Xmm7360RpcMsgArg *) g_ptr_array_index (response->content, i + 1); if (XMM7360_RPC_MSG_ARG_GET_INT (arg) == 1) { arg = (Xmm7360RpcMsgArg *) g_ptr_array_index (response->content, i); - g_assert (arg->size >= 4); + if (arg->size < 4) { + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, + "Unexpected DNSv4 address format"); + g_object_unref (task); + return; + } g_ptr_array_add (ctx->dns, g_inet_address_new_from_bytes ((const guint8 *)arg->value.string, G_SOCKET_FAMILY_IPV4)); } else if (XMM7360_RPC_MSG_ARG_GET_INT (arg) == 2) { arg = (Xmm7360RpcMsgArg *) g_ptr_array_index (response->content, i); - g_assert (arg->size >= 16); + if (arg->size < 16) { + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, + "Unexpected DNSv6 address format"); + g_object_unref (task); + return; + } g_ptr_array_add (ctx->dns, g_inet_address_new_from_bytes ((const guint8 *)arg->value.string, G_SOCKET_FAMILY_IPV6)); } @@ -458,7 +468,12 @@ net_attach_command_ready (MMBroadbandModemXmm7360 *modem, /* status code */ arg = (Xmm7360RpcMsgArg *) g_ptr_array_index (response->content, 1); - g_assert (arg->type == XMM7360_RPC_MSG_ARG_TYPE_LONG); + if (arg->type != XMM7360_RPC_MSG_ARG_TYPE_LONG) { + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, + "Unexpected net attach command response"); + g_object_unref (task); + return; + } status = XMM7360_RPC_MSG_ARG_GET_INT (arg); if (status != (gint32)0xffffffff) { diff --git a/src/plugins/intel/mm-broadband-modem-xmm7360.c b/src/plugins/intel/mm-broadband-modem-xmm7360.c index 3f9260c9..fc366228 100644 --- a/src/plugins/intel/mm-broadband-modem-xmm7360.c +++ b/src/plugins/intel/mm-broadband-modem-xmm7360.c @@ -472,8 +472,7 @@ fcc_unlock_ready (MMBroadbandModem *self, return; } arg = (Xmm7360RpcMsgArg *) g_ptr_array_index (response->content, 0); - g_assert (arg->type == XMM7360_RPC_MSG_ARG_TYPE_LONG); - if (XMM7360_RPC_MSG_ARG_GET_INT (arg) != 1) { + if ((arg->type != XMM7360_RPC_MSG_ARG_TYPE_LONG) || (XMM7360_RPC_MSG_ARG_GET_INT (arg) != 1)) { g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, "Our answer to the FCC unlock challenge was not accepted"); g_object_unref (task); @@ -496,7 +495,7 @@ fcc_unlock_challenge_ready (MMBroadbandModem *self, Xmm7360RpcMsgArg *arg; gint32 fcc_challenge; GChecksum *checksum; - guchar salt[] = { 0x3d, 0xf8, 0xc7, 0x19 }; + const guchar salt[] = { 0x3d, 0xf8, 0xc7, 0x19 }; guint8 digest[32] = { 0 }; gsize digest_len = 32; g_autoptr(GByteArray) digest_response = NULL; @@ -512,7 +511,12 @@ fcc_unlock_challenge_ready (MMBroadbandModem *self, } arg = (Xmm7360RpcMsgArg *) g_ptr_array_index (response->content, 1); - g_assert (arg->type == XMM7360_RPC_MSG_ARG_TYPE_LONG); + if (arg->type != XMM7360_RPC_MSG_ARG_TYPE_LONG) { + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, + "Unexpected response to FCC unlock challenge request"); + g_object_unref (task); + return; + } fcc_challenge = XMM7360_RPC_MSG_ARG_GET_INT (arg); checksum = g_checksum_new (G_CHECKSUM_SHA256); @@ -566,7 +570,12 @@ fcc_lock_query_ready (MMBroadbandModem *self, /* second argument is fcc_state */ arg = (Xmm7360RpcMsgArg *) g_ptr_array_index (response->content, 1); - g_assert (arg->type == XMM7360_RPC_MSG_ARG_TYPE_LONG); + if (arg->type != XMM7360_RPC_MSG_ARG_TYPE_LONG) { + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, + "Unexpected FCC check fcc_state type"); + g_object_unref (task); + return; + } if (XMM7360_RPC_MSG_ARG_GET_INT (arg)) { /* no FCC unlock required: FCC state is != 0 */ g_task_return_boolean (task, FALSE); @@ -576,7 +585,12 @@ fcc_lock_query_ready (MMBroadbandModem *self, /* third argument is fcc_mode */ arg = (Xmm7360RpcMsgArg *) g_ptr_array_index (response->content, 2); - g_assert (arg->type == XMM7360_RPC_MSG_ARG_TYPE_LONG); + if (arg->type != XMM7360_RPC_MSG_ARG_TYPE_LONG) { + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, + "Unexpected FCC check fcc_mode type"); + g_object_unref (task); + return; + } if (!XMM7360_RPC_MSG_ARG_GET_INT (arg)) { /* no FCC unlock required: FCC mode is == 0 */ g_task_return_boolean (task, FALSE);