blob: df50bc1d6cb1bfed765f057713a0aefbbc045e81 [file] [log] [blame]
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright (C) 2013 - 2014 Aleksander Morgado <aleksander@aleksander.es>
*/
#include <config.h>
#include <string.h>
#include "mbim-message.h"
#include "mbim-message-private.h"
#include "mbim-cid.h"
#include "mbim-enums.h"
#include "mbim-common.h"
#include "mbim-basic-connect.h"
#include "mbim-ussd.h"
#include "mbim-auth.h"
#include "mbim-stk.h"
#include "mbim-dss.h"
#include "mbim-ms-host-shutdown.h"
#include "mbim-ms-basic-connect-extensions.h"
static void
test_message_trace (const guint8 *computed,
guint32 computed_size,
const guint8 *expected,
guint32 expected_size)
{
gchar *message_str;
gchar *expected_str;
message_str = mbim_common_str_hex (computed, computed_size, ':');
expected_str = mbim_common_str_hex (expected, expected_size, ':');
/* Dump all message contents */
g_print ("\n"
"Message str:\n"
"'%s'\n"
"Expected str:\n"
"'%s'\n",
message_str,
expected_str);
/* If they are different, tell which are the different bytes */
if (computed_size != expected_size ||
memcmp (computed, expected, expected_size)) {
guint32 i;
for (i = 0; i < MIN (computed_size, expected_size); i++) {
if (computed[i] != expected[i])
g_print ("Byte [%u] is different (computed: 0x%02X vs expected: 0x%02x)\n", i, computed[i], expected[i]);
}
}
g_free (message_str);
g_free (expected_str);
}
static void
test_message_printable (MbimMessage *message,
guint8 mbimex_version_major,
guint8 mbimex_version_minor)
{
g_autofree gchar *printable = NULL;
printable = mbim_message_get_printable_full (message,
mbimex_version_major,
mbimex_version_minor,
"---- ",
FALSE,
NULL);
g_print ("\n"
"Message printable:\n"
"%s\n",
printable);
}
static void
test_basic_connect_pin_set_raw (void)
{
MbimMessage *message;
MbimMessageCommandBuilder *builder;
const guint8 expected_message [] = {
/* header */
0x03, 0x00, 0x00, 0x00, /* type */
0x50, 0x00, 0x00, 0x00, /* length */
0x01, 0x00, 0x00, 0x00, /* transaction id */
/* fragment header */
0x01, 0x00, 0x00, 0x00, /* total */
0x00, 0x00, 0x00, 0x00, /* current */
/* command_message */
0xa2, 0x89, 0xcc, 0x33, /* service id */
0xbc, 0xbb, 0x8b, 0x4f,
0xb6, 0xb0, 0x13, 0x3e,
0xc2, 0xaa, 0xe6, 0xdf,
0x04, 0x00, 0x00, 0x00, /* command id */
0x01, 0x00, 0x00, 0x00, /* command_type */
0x20, 0x00, 0x00, 0x00, /* buffer_length */
/* information buffer */
0x02, 0x00, 0x00, 0x00, /* pin type */
0x00, 0x00, 0x00, 0x00, /* pin operation */
0x18, 0x00, 0x00, 0x00, /* pin offset */
0x08, 0x00, 0x00, 0x00, /* pin size */
0x00, 0x00, 0x00, 0x00, /* new pin offset */
0x00, 0x00, 0x00, 0x00, /* new pin size */
0x31, 0x00, 0x31, 0x00, /* pin string */
0x31, 0x00, 0x31, 0x00
};
/* PIN set message */
builder = _mbim_message_command_builder_new (1,
MBIM_SERVICE_BASIC_CONNECT,
MBIM_CID_BASIC_CONNECT_PIN,
MBIM_MESSAGE_COMMAND_TYPE_SET);
_mbim_message_command_builder_append_guint32 (builder, (guint32)MBIM_PIN_TYPE_PIN1);
_mbim_message_command_builder_append_guint32 (builder, (guint32)MBIM_PIN_OPERATION_ENTER);
_mbim_message_command_builder_append_string (builder, "1111");
_mbim_message_command_builder_append_string (builder, "");
message = _mbim_message_command_builder_complete (builder);
g_assert (message != NULL);
test_message_trace ((const guint8 *)((GByteArray *)message)->data,
((GByteArray *)message)->len,
expected_message,
sizeof (expected_message));
g_assert_cmpuint (mbim_message_get_transaction_id (message), ==, 1);
g_assert_cmpuint (mbim_message_get_message_type (message), ==, MBIM_MESSAGE_TYPE_COMMAND);
g_assert_cmpuint (mbim_message_get_message_length (message), ==, sizeof (expected_message));
g_assert_cmpuint (mbim_message_command_get_service (message), ==, MBIM_SERVICE_BASIC_CONNECT);
g_assert_cmpuint (mbim_message_command_get_cid (message), ==, MBIM_CID_BASIC_CONNECT_PIN);
g_assert_cmpuint (mbim_message_command_get_command_type (message), ==, MBIM_MESSAGE_COMMAND_TYPE_SET);
g_assert_cmpuint (((GByteArray *)message)->len, ==, sizeof (expected_message));
g_assert (memcmp (((GByteArray *)message)->data, expected_message, sizeof (expected_message)) == 0);
test_message_printable (message, 1, 0);
mbim_message_unref (message);
}
static void
test_basic_connect_pin_set (void)
{
GError *error = NULL;
MbimMessage *message;
const guint8 expected_message [] = {
/* header */
0x03, 0x00, 0x00, 0x00, /* type */
0x50, 0x00, 0x00, 0x00, /* length */
0x01, 0x00, 0x00, 0x00, /* transaction id */
/* fragment header */
0x01, 0x00, 0x00, 0x00, /* total */
0x00, 0x00, 0x00, 0x00, /* current */
/* command_message */
0xa2, 0x89, 0xcc, 0x33, /* service id */
0xbc, 0xbb, 0x8b, 0x4f,
0xb6, 0xb0, 0x13, 0x3e,
0xc2, 0xaa, 0xe6, 0xdf,
0x04, 0x00, 0x00, 0x00, /* command id */
0x01, 0x00, 0x00, 0x00, /* command_type */
0x20, 0x00, 0x00, 0x00, /* buffer_length */
/* information buffer */
0x02, 0x00, 0x00, 0x00, /* pin type */
0x00, 0x00, 0x00, 0x00, /* pin operation */
0x18, 0x00, 0x00, 0x00, /* pin offset */
0x08, 0x00, 0x00, 0x00, /* pin size */
0x00, 0x00, 0x00, 0x00, /* new pin offset */
0x00, 0x00, 0x00, 0x00, /* new pin size */
0x31, 0x00, 0x31, 0x00, /* pin string */
0x31, 0x00, 0x31, 0x00
};
/* PIN set message */
message = mbim_message_pin_set_new (MBIM_PIN_TYPE_PIN1,
MBIM_PIN_OPERATION_ENTER,
"1111",
"",
&error);
g_assert_no_error (error);
g_assert (message != NULL);
mbim_message_set_transaction_id (message, 1);
test_message_trace ((const guint8 *)((GByteArray *)message)->data,
((GByteArray *)message)->len,
expected_message,
sizeof (expected_message));
g_assert_cmpuint (mbim_message_get_transaction_id (message), ==, 1);
g_assert_cmpuint (mbim_message_get_message_type (message), ==, MBIM_MESSAGE_TYPE_COMMAND);
g_assert_cmpuint (mbim_message_get_message_length (message), ==, sizeof (expected_message));
g_assert_cmpuint (mbim_message_command_get_service (message), ==, MBIM_SERVICE_BASIC_CONNECT);
g_assert_cmpuint (mbim_message_command_get_cid (message), ==, MBIM_CID_BASIC_CONNECT_PIN);
g_assert_cmpuint (mbim_message_command_get_command_type (message), ==, MBIM_MESSAGE_COMMAND_TYPE_SET);
g_assert_cmpuint (((GByteArray *)message)->len, ==, sizeof (expected_message));
g_assert (memcmp (((GByteArray *)message)->data, expected_message, sizeof (expected_message)) == 0);
test_message_printable (message, 1, 0);
mbim_message_unref (message);
}
static void
test_basic_connect_connect_set_raw (void)
{
MbimMessage *message;
MbimMessageCommandBuilder *builder;
const guint8 expected_message [] = {
/* header */
0x03, 0x00, 0x00, 0x00, /* type */
0x7C, 0x00, 0x00, 0x00, /* length */
0x01, 0x00, 0x00, 0x00, /* transaction id */
/* fragment header */
0x01, 0x00, 0x00, 0x00, /* total */
0x00, 0x00, 0x00, 0x00, /* current */
/* command_message */
0xA2, 0x89, 0xCC, 0x33, /* service id */
0xBC, 0xBB, 0x8B, 0x4F,
0xB6, 0xB0, 0x13, 0x3E,
0xC2, 0xAA, 0xE6, 0xDF,
0x0C, 0x00, 0x00, 0x00, /* command id */
0x01, 0x00, 0x00, 0x00, /* command_type */
0x4C, 0x00, 0x00, 0x00, /* buffer_length */
/* information buffer */
0x01, 0x00, 0x00, 0x00, /* session id */
0x01, 0x00, 0x00, 0x00, /* activation command */
0x3C, 0x00, 0x00, 0x00, /* access string offset */
0x10, 0x00, 0x00, 0x00, /* access string size */
0x00, 0x00, 0x00, 0x00, /* username offset */
0x00, 0x00, 0x00, 0x00, /* username size */
0x00, 0x00, 0x00, 0x00, /* password offset */
0x00, 0x00, 0x00, 0x00, /* password size */
0x00, 0x00, 0x00, 0x00, /* compression */
0x01, 0x00, 0x00, 0x00, /* auth protocol */
0x01, 0x00, 0x00, 0x00, /* ip type */
0x7E, 0x5E, 0x2A, 0x7E, /* context type */
0x4E, 0x6F, 0x72, 0x72,
0x73, 0x6B, 0x65, 0x6E,
0x7E, 0x5E, 0x2A, 0x7E,
/* data buffer */
0x69, 0x00, 0x6E, 0x00, /* access string */
0x74, 0x00, 0x65, 0x00,
0x72, 0x00, 0x6E, 0x00,
0x65, 0x00, 0x74, 0x00
};
/* CONNECT set message */
builder = _mbim_message_command_builder_new (1,
MBIM_SERVICE_BASIC_CONNECT,
MBIM_CID_BASIC_CONNECT_CONNECT,
MBIM_MESSAGE_COMMAND_TYPE_SET);
_mbim_message_command_builder_append_guint32 (builder, 0x01);
_mbim_message_command_builder_append_guint32 (builder, (guint32)MBIM_ACTIVATION_COMMAND_ACTIVATE);
_mbim_message_command_builder_append_string (builder, "internet");
_mbim_message_command_builder_append_string (builder, "");
_mbim_message_command_builder_append_string (builder, "");
_mbim_message_command_builder_append_guint32 (builder, (guint32)MBIM_COMPRESSION_NONE);
_mbim_message_command_builder_append_guint32 (builder, (guint32)MBIM_AUTH_PROTOCOL_PAP);
_mbim_message_command_builder_append_guint32 (builder, (guint32)MBIM_CONTEXT_IP_TYPE_IPV4);
_mbim_message_command_builder_append_uuid (builder, mbim_uuid_from_context_type (MBIM_CONTEXT_TYPE_INTERNET));
message = _mbim_message_command_builder_complete (builder);
g_assert (message != NULL);
test_message_trace ((const guint8 *)((GByteArray *)message)->data,
((GByteArray *)message)->len,
expected_message,
sizeof (expected_message));
g_assert_cmpuint (mbim_message_get_transaction_id (message), ==, 1);
g_assert_cmpuint (mbim_message_get_message_type (message), ==, MBIM_MESSAGE_TYPE_COMMAND);
g_assert_cmpuint (mbim_message_get_message_length (message), ==, sizeof (expected_message));
g_assert_cmpuint (mbim_message_command_get_service (message), ==, MBIM_SERVICE_BASIC_CONNECT);
g_assert_cmpuint (mbim_message_command_get_cid (message), ==, MBIM_CID_BASIC_CONNECT_CONNECT);
g_assert_cmpuint (mbim_message_command_get_command_type (message), ==, MBIM_MESSAGE_COMMAND_TYPE_SET);
g_assert_cmpuint (((GByteArray *)message)->len, ==, sizeof (expected_message));
g_assert (memcmp (((GByteArray *)message)->data, expected_message, sizeof (expected_message)) == 0);
test_message_printable (message, 1, 0);
mbim_message_unref (message);
}
static void
test_basic_connect_connect_set (void)
{
GError *error = NULL;
MbimMessage *message;
const guint8 expected_message [] = {
/* header */
0x03, 0x00, 0x00, 0x00, /* type */
0x7C, 0x00, 0x00, 0x00, /* length */
0x01, 0x00, 0x00, 0x00, /* transaction id */
/* fragment header */
0x01, 0x00, 0x00, 0x00, /* total */
0x00, 0x00, 0x00, 0x00, /* current */
/* command_message */
0xA2, 0x89, 0xCC, 0x33, /* service id */
0xBC, 0xBB, 0x8B, 0x4F,
0xB6, 0xB0, 0x13, 0x3E,
0xC2, 0xAA, 0xE6, 0xDF,
0x0C, 0x00, 0x00, 0x00, /* command id */
0x01, 0x00, 0x00, 0x00, /* command_type */
0x4C, 0x00, 0x00, 0x00, /* buffer_length */
/* information buffer */
0x01, 0x00, 0x00, 0x00, /* session id */
0x01, 0x00, 0x00, 0x00, /* activation command */
0x3C, 0x00, 0x00, 0x00, /* access string offset */
0x10, 0x00, 0x00, 0x00, /* access string size */
0x00, 0x00, 0x00, 0x00, /* username offset */
0x00, 0x00, 0x00, 0x00, /* username size */
0x00, 0x00, 0x00, 0x00, /* password offset */
0x00, 0x00, 0x00, 0x00, /* password size */
0x00, 0x00, 0x00, 0x00, /* compression */
0x01, 0x00, 0x00, 0x00, /* auth protocol */
0x01, 0x00, 0x00, 0x00, /* ip type */
0x7E, 0x5E, 0x2A, 0x7E, /* context type */
0x4E, 0x6F, 0x72, 0x72,
0x73, 0x6B, 0x65, 0x6E,
0x7E, 0x5E, 0x2A, 0x7E,
/* data buffer */
0x69, 0x00, 0x6E, 0x00, /* access string */
0x74, 0x00, 0x65, 0x00,
0x72, 0x00, 0x6E, 0x00,
0x65, 0x00, 0x74, 0x00
};
/* CONNECT set message */
message = (mbim_message_connect_set_new (
0x01,
MBIM_ACTIVATION_COMMAND_ACTIVATE,
"internet",
"",
"",
MBIM_COMPRESSION_NONE,
MBIM_AUTH_PROTOCOL_PAP,
MBIM_CONTEXT_IP_TYPE_IPV4,
mbim_uuid_from_context_type (MBIM_CONTEXT_TYPE_INTERNET),
&error));
g_assert_no_error (error);
g_assert (message != NULL);
mbim_message_set_transaction_id (message, 1);
test_message_trace ((const guint8 *)((GByteArray *)message)->data,
((GByteArray *)message)->len,
expected_message,
sizeof (expected_message));
g_assert_cmpuint (mbim_message_get_transaction_id (message), ==, 1);
g_assert_cmpuint (mbim_message_get_message_type (message), ==, MBIM_MESSAGE_TYPE_COMMAND);
g_assert_cmpuint (mbim_message_get_message_length (message), ==, sizeof (expected_message));
g_assert_cmpuint (mbim_message_command_get_service (message), ==, MBIM_SERVICE_BASIC_CONNECT);
g_assert_cmpuint (mbim_message_command_get_cid (message), ==, MBIM_CID_BASIC_CONNECT_CONNECT);
g_assert_cmpuint (mbim_message_command_get_command_type (message), ==, MBIM_MESSAGE_COMMAND_TYPE_SET);
g_assert_cmpuint (((GByteArray *)message)->len, ==, sizeof (expected_message));
g_assert (memcmp (((GByteArray *)message)->data, expected_message, sizeof (expected_message)) == 0);
test_message_printable (message, 1, 0);
mbim_message_unref (message);
}
static void
test_basic_connect_service_activation_set (void)
{
GError *error = NULL;
MbimMessage *message;
const guint8 buffer [] = {
0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07, 0x08
};
const guint8 expected_message [] = {
/* header */
0x03, 0x00, 0x00, 0x00, /* type */
0x38, 0x00, 0x00, 0x00, /* length */
0x01, 0x00, 0x00, 0x00, /* transaction id */
/* fragment header */
0x01, 0x00, 0x00, 0x00, /* total */
0x00, 0x00, 0x00, 0x00, /* current */
/* command_message */
0xA2, 0x89, 0xCC, 0x33, /* service id */
0xBC, 0xBB, 0x8B, 0x4F,
0xB6, 0xB0, 0x13, 0x3E,
0xC2, 0xAA, 0xE6, 0xDF,
0x0E, 0x00, 0x00, 0x00, /* command id */
0x01, 0x00, 0x00, 0x00, /* command_type */
0x08, 0x00, 0x00, 0x00, /* buffer_length */
/* information buffer */
0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07, 0x08 };
/* CONNECT set message */
message = (mbim_message_service_activation_set_new (
sizeof (buffer),
buffer,
&error));
g_assert_no_error (error);
g_assert (message != NULL);
mbim_message_set_transaction_id (message, 1);
test_message_trace ((const guint8 *)((GByteArray *)message)->data,
((GByteArray *)message)->len,
expected_message,
sizeof (expected_message));
g_assert_cmpuint (mbim_message_get_transaction_id (message), ==, 1);
g_assert_cmpuint (mbim_message_get_message_type (message), ==, MBIM_MESSAGE_TYPE_COMMAND);
g_assert_cmpuint (mbim_message_get_message_length (message), ==, sizeof (expected_message));
g_assert_cmpuint (mbim_message_command_get_service (message), ==, MBIM_SERVICE_BASIC_CONNECT);
g_assert_cmpuint (mbim_message_command_get_cid (message), ==, MBIM_CID_BASIC_CONNECT_SERVICE_ACTIVATION);
g_assert_cmpuint (mbim_message_command_get_command_type (message), ==, MBIM_MESSAGE_COMMAND_TYPE_SET);
g_assert_cmpuint (((GByteArray *)message)->len, ==, sizeof (expected_message));
g_assert (memcmp (((GByteArray *)message)->data, expected_message, sizeof (expected_message)) == 0);
test_message_printable (message, 1, 0);
mbim_message_unref (message);
}
static void
test_basic_connect_device_service_subscribe_list_set (void)
{
GError *error = NULL;
MbimEventEntry **entries;
MbimMessage *message;
const guint8 expected_message [] = {
/* header */
0x03, 0x00, 0x00, 0x00, /* type */
0x78, 0x00, 0x00, 0x00, /* length */
0x01, 0x00, 0x00, 0x00, /* transaction id */
/* fragment header */
0x01, 0x00, 0x00, 0x00, /* total */
0x00, 0x00, 0x00, 0x00, /* current */
/* command_message */
0xA2, 0x89, 0xCC, 0x33, /* service id */
0xBC, 0xBB, 0x8B, 0x4F,
0xB6, 0xB0, 0x13, 0x3E,
0xC2, 0xAA, 0xE6, 0xDF,
0x13, 0x00, 0x00, 0x00, /* command id */
0x01, 0x00, 0x00, 0x00, /* command_type */
0x48, 0x00, 0x00, 0x00, /* buffer_length */
/* information buffer */
0x02, 0x00, 0x00, 0x00, /* 0x00 Events count */
0x14, 0x00, 0x00, 0x00, /* 0x04 Event 1 offset */
0x1C, 0x00, 0x00, 0x00, /* 0x08 Event 1 length */
0x30, 0x00, 0x00, 0x00, /* 0x0C Event 2 offset */
0x18, 0x00, 0x00, 0x00, /* 0x10 Event 2 length */
/* data buffer, event 1 */
0xA2, 0x89, 0xCC, 0x33, /* 0x14 Event 1, service id */
0xBC, 0xBB, 0x8B, 0x4F,
0xB6, 0xB0, 0x13, 0x3E,
0xC2, 0xAA, 0xE6, 0xDF,
0x02, 0x00, 0x00, 0x00, /* 0x24 Event 1, cid count */
0x0B, 0x00, 0x00, 0x00, /* 0x28 Event 1, cid 1 */
0x09, 0x00, 0x00, 0x00, /* 0x2C Event 1, cid 2 */
/* data buffer, event 2 */
0x53, 0x3F, 0xBE, 0xEB, /* 0x30 Event 1, service id */
0x14, 0xFE, 0x44, 0x67,
0x9F, 0x90, 0x33, 0xA2,
0x23, 0xE5, 0x6C, 0x3F,
0x01, 0x00, 0x00, 0x00, /* 0x40 Event 2, cid count */
0x02, 0x00, 0x00, 0x00, /* 0x44 Event 2, cid 1 */
};
/* Device Service Subscribe List set message */
entries = g_new0 (MbimEventEntry *, 3);
entries[0] = g_new (MbimEventEntry, 1);
memcpy (&(entries[0]->device_service_id), MBIM_UUID_BASIC_CONNECT, sizeof (MbimUuid));
entries[0]->cids_count = 2;
entries[0]->cids = g_new0 (guint32, 2);
entries[0]->cids[0] = MBIM_CID_BASIC_CONNECT_SIGNAL_STATE;
entries[0]->cids[1] = MBIM_CID_BASIC_CONNECT_REGISTER_STATE;
entries[1] = g_new (MbimEventEntry, 1);
memcpy (&(entries[1]->device_service_id), MBIM_UUID_SMS, sizeof (MbimUuid));
entries[1]->cids_count = 1;
entries[1]->cids = g_new0 (guint32, 1);
entries[1]->cids[0] = MBIM_CID_SMS_READ;
message = (mbim_message_device_service_subscribe_list_set_new (
2,
(const MbimEventEntry *const *)entries,
&error));
mbim_event_entry_array_free (entries);
g_assert_no_error (error);
g_assert (message != NULL);
mbim_message_set_transaction_id (message, 1);
test_message_trace ((const guint8 *)((GByteArray *)message)->data,
((GByteArray *)message)->len,
expected_message,
sizeof (expected_message));
g_assert_cmpuint (mbim_message_get_transaction_id (message), ==, 1);
g_assert_cmpuint (mbim_message_get_message_type (message), ==, MBIM_MESSAGE_TYPE_COMMAND);
g_assert_cmpuint (mbim_message_get_message_length (message), ==, sizeof (expected_message));
g_assert_cmpuint (mbim_message_command_get_service (message), ==, MBIM_SERVICE_BASIC_CONNECT);
g_assert_cmpuint (mbim_message_command_get_cid (message), ==, MBIM_CID_BASIC_CONNECT_DEVICE_SERVICE_SUBSCRIBE_LIST);
g_assert_cmpuint (mbim_message_command_get_command_type (message), ==, MBIM_MESSAGE_COMMAND_TYPE_SET);
g_assert_cmpuint (((GByteArray *)message)->len, ==, sizeof (expected_message));
g_assert (memcmp (((GByteArray *)message)->data, expected_message, sizeof (expected_message)) == 0);
test_message_printable (message, 1, 0);
mbim_message_unref (message);
}
static void
test_ussd_set (void)
{
GError *error = NULL;
MbimMessage *message;
const guint8 expected_message [] = {
/* header */
0x03, 0x00, 0x00, 0x00, /* type */
0x50, 0x00, 0x00, 0x00, /* length */
0x01, 0x00, 0x00, 0x00, /* transaction id */
/* fragment header */
0x01, 0x00, 0x00, 0x00, /* total */
0x00, 0x00, 0x00, 0x00, /* current */
/* command_message */
0xE5, 0x50, 0xA0, 0xC8, /* service id */
0x5E, 0x82, 0x47, 0x9E,
0x82, 0xF7, 0x10, 0xAB,
0xF4, 0xC3, 0x35, 0x1F,
0x01, 0x00, 0x00, 0x00, /* command id */
0x01, 0x00, 0x00, 0x00, /* command_type */
0x20, 0x00, 0x00, 0x00, /* buffer_length */
/* information buffer */
0x01, 0x00, 0x00, 0x00, /* 0x00 Action */
0x01, 0x00, 0x00, 0x00, /* 0x04 Data coding scheme */
0x10, 0x00, 0x00, 0x00, /* 0x08 Payload offset */
0x10, 0x00, 0x00, 0x00, /* 0x0C Payload length */
/* data buffer, payload */
0x01, 0x02, 0x03, 0x04, /* 0x10 Payload */
0x05, 0x06, 0x07, 0x08,
0x09, 0x0A, 0x0B, 0x0C,
0x0D, 0x0E, 0x0F, 0x00
};
const guint8 payload [] = {
0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07, 0x08,
0x09, 0x0A, 0x0B, 0x0C,
0x0D, 0x0E, 0x0F, 0x00
};
/* USSD set message */
message = (mbim_message_ussd_set_new (
MBIM_USSD_ACTION_CONTINUE,
1, /* dcs */
sizeof (payload),
payload,
&error));
g_assert_no_error (error);
g_assert (message != NULL);
mbim_message_set_transaction_id (message, 1);
test_message_trace ((const guint8 *)((GByteArray *)message)->data,
((GByteArray *)message)->len,
expected_message,
sizeof (expected_message));
g_assert_cmpuint (mbim_message_get_transaction_id (message), ==, 1);
g_assert_cmpuint (mbim_message_get_message_type (message), ==, MBIM_MESSAGE_TYPE_COMMAND);
g_assert_cmpuint (mbim_message_get_message_length (message), ==, sizeof (expected_message));
g_assert_cmpuint (mbim_message_command_get_service (message), ==, MBIM_SERVICE_USSD);
g_assert_cmpuint (mbim_message_command_get_cid (message), ==, MBIM_CID_USSD);
g_assert_cmpuint (mbim_message_command_get_command_type (message), ==, MBIM_MESSAGE_COMMAND_TYPE_SET);
g_assert_cmpuint (((GByteArray *)message)->len, ==, sizeof (expected_message));
g_assert (memcmp (((GByteArray *)message)->data, expected_message, sizeof (expected_message)) == 0);
test_message_printable (message, 1, 0);
mbim_message_unref (message);
}
static void
test_auth_akap_query (void)
{
GError *error = NULL;
MbimMessage *message;
const guint8 expected_message [] = {
/* header */
0x03, 0x00, 0x00, 0x00, /* type */
0x60, 0x00, 0x00, 0x00, /* length */
0x01, 0x00, 0x00, 0x00, /* transaction id */
/* fragment header */
0x01, 0x00, 0x00, 0x00, /* total */
0x00, 0x00, 0x00, 0x00, /* current */
/* command_message */
0x1D, 0x2B, 0x5F, 0xF7, /* service id */
0x0A, 0xA1, 0x48, 0xB2,
0xAA, 0x52, 0x50, 0xF1,
0x57, 0x67, 0x17, 0x4E,
0x02, 0x00, 0x00, 0x00, /* command id */
0x00, 0x00, 0x00, 0x00, /* command_type */
0x30, 0x00, 0x00, 0x00, /* buffer_length */
/* information buffer */
0x00, 0x01, 0x02, 0x03, /* 0x00 Rand */
0x04, 0x05, 0x06, 0x07, /* 0x04 */
0x08, 0x09, 0x0A, 0x0B, /* 0x08 */
0x0C, 0x0D, 0x0E, 0x0F, /* 0x0C */
0xFF, 0xFE, 0xFD, 0xFC, /* 0x10 Autn */
0xFB, 0xFA, 0xF9, 0xF8, /* 0x14 */
0xF7, 0xF6, 0xF5, 0xF4, /* 0x18 */
0xF3, 0xF2, 0xF1, 0xF0, /* 0x1C */
0x28, 0x00, 0x00, 0x00, /* 0x20 Network name (offset) */
0x08, 0x00, 0x00, 0x00, /* 0x24 Network name (length) */
/* data buffer */
0x31, 0x00, 0x31, 0x00, /* 0x28 Network name */
0x31, 0x00, 0x31, 0x00
};
const guint8 rand [] = {
0x00, 0x01, 0x02, 0x03,
0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0A, 0x0B,
0x0C, 0x0D, 0x0E, 0x0F
};
const guint8 autn [] = {
0xFF, 0xFE, 0xFD, 0xFC,
0xFB, 0xFA, 0xF9, 0xF8,
0xF7, 0xF6, 0xF5, 0xF4,
0xF3, 0xF2, 0xF1, 0xF0
};
/* AKAP Auth message */
message = (mbim_message_auth_akap_query_new (
rand,
autn,
"1111",
&error));
g_assert_no_error (error);
g_assert (message != NULL);
mbim_message_set_transaction_id (message, 1);
test_message_trace ((const guint8 *)((GByteArray *)message)->data,
((GByteArray *)message)->len,
expected_message,
sizeof (expected_message));
g_assert_cmpuint (mbim_message_get_transaction_id (message), ==, 1);
g_assert_cmpuint (mbim_message_get_message_type (message), ==, MBIM_MESSAGE_TYPE_COMMAND);
g_assert_cmpuint (mbim_message_get_message_length (message), ==, sizeof (expected_message));
g_assert_cmpuint (mbim_message_command_get_service (message), ==, MBIM_SERVICE_AUTH);
g_assert_cmpuint (mbim_message_command_get_cid (message), ==, MBIM_CID_AUTH_AKAP);
g_assert_cmpuint (mbim_message_command_get_command_type (message), ==, MBIM_MESSAGE_COMMAND_TYPE_QUERY);
g_assert_cmpuint (((GByteArray *)message)->len, ==, sizeof (expected_message));
g_assert (memcmp (((GByteArray *)message)->data, expected_message, sizeof (expected_message)) == 0);
test_message_printable (message, 1, 0);
mbim_message_unref (message);
}
static void
test_stk_pac_set (void)
{
GError *error = NULL;
MbimMessage *message;
const guint8 expected_message [] = {
/* header */
0x03, 0x00, 0x00, 0x00, /* type */
0x50, 0x00, 0x00, 0x00, /* length */
0x01, 0x00, 0x00, 0x00, /* transaction id */
/* fragment header */
0x01, 0x00, 0x00, 0x00, /* total */
0x00, 0x00, 0x00, 0x00, /* current */
/* command_message */
0xD8, 0xF2, 0x01, 0x31, /* service id */
0xFC, 0xB5, 0x4E, 0x17,
0x86, 0x02, 0xD6, 0xED,
0x38, 0x16, 0x16, 0x4C,
0x01, 0x00, 0x00, 0x00, /* command id */
0x01, 0x00, 0x00, 0x00, /* command_type */
0x20, 0x00, 0x00, 0x00, /* buffer_length */
/* information buffer */
0x00, 0x01, 0x02, 0x03,
0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0A, 0x0B,
0x0C, 0x0D, 0x0E, 0x0F,
0xFF, 0xFE, 0xFD, 0xFC,
0xFB, 0xFA, 0xF9, 0xF8,
0xF7, 0xF6, 0xF5, 0xF4,
0xF3, 0xF2, 0xF1, 0xF0
};
const guint8 pac_host_control [] = {
0x00, 0x01, 0x02, 0x03,
0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0A, 0x0B,
0x0C, 0x0D, 0x0E, 0x0F,
0xFF, 0xFE, 0xFD, 0xFC,
0xFB, 0xFA, 0xF9, 0xF8,
0xF7, 0xF6, 0xF5, 0xF4,
0xF3, 0xF2, 0xF1, 0xF0
};
/* STK PAC set message */
message = (mbim_message_stk_pac_set_new (
pac_host_control,
&error));
g_assert_no_error (error);
g_assert (message != NULL);
mbim_message_set_transaction_id (message, 1);
test_message_trace ((const guint8 *)((GByteArray *)message)->data,
((GByteArray *)message)->len,
expected_message,
sizeof (expected_message));
g_assert_cmpuint (mbim_message_get_transaction_id (message), ==, 1);
g_assert_cmpuint (mbim_message_get_message_type (message), ==, MBIM_MESSAGE_TYPE_COMMAND);
g_assert_cmpuint (mbim_message_get_message_length (message), ==, sizeof (expected_message));
g_assert_cmpuint (mbim_message_command_get_service (message), ==, MBIM_SERVICE_STK);
g_assert_cmpuint (mbim_message_command_get_cid (message), ==, MBIM_CID_STK_PAC);
g_assert_cmpuint (mbim_message_command_get_command_type (message), ==, MBIM_MESSAGE_COMMAND_TYPE_SET);
g_assert_cmpuint (((GByteArray *)message)->len, ==, sizeof (expected_message));
g_assert (memcmp (((GByteArray *)message)->data, expected_message, sizeof (expected_message)) == 0);
test_message_printable (message, 1, 0);
mbim_message_unref (message);
}
static void
test_stk_terminal_response_set (void)
{
GError *error = NULL;
MbimMessage *message;
const guint8 expected_message [] = {
/* header */
0x03, 0x00, 0x00, 0x00, /* type */
0x50, 0x00, 0x00, 0x00, /* length */
0x01, 0x00, 0x00, 0x00, /* transaction id */
/* fragment header */
0x01, 0x00, 0x00, 0x00, /* total */
0x00, 0x00, 0x00, 0x00, /* current */
/* command_message */
0xD8, 0xF2, 0x01, 0x31, /* service id */
0xFC, 0xB5, 0x4E, 0x17,
0x86, 0x02, 0xD6, 0xED,
0x38, 0x16, 0x16, 0x4C,
0x02, 0x00, 0x00, 0x00, /* command id */
0x01, 0x00, 0x00, 0x00, /* command_type */
0x20, 0x00, 0x00, 0x00, /* buffer_length */
/* information buffer */
0x1C, 0x00, 0x00, 0x00, /* 0x00 Response length */
0x04, 0x05, 0x06, 0x07, /* 0x04 Response */
0x08, 0x09, 0x0A, 0x0B,
0x0C, 0x0D, 0x0E, 0x0F,
0xFF, 0xFE, 0xFD, 0xFC,
0xFB, 0xFA, 0xF9, 0xF8,
0xF7, 0xF6, 0xF5, 0xF4,
0xF3, 0xF2, 0xF1, 0xF0
};
const guint8 response [] = {
0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0A, 0x0B,
0x0C, 0x0D, 0x0E, 0x0F,
0xFF, 0xFE, 0xFD, 0xFC,
0xFB, 0xFA, 0xF9, 0xF8,
0xF7, 0xF6, 0xF5, 0xF4,
0xF3, 0xF2, 0xF1, 0xF0
};
/* STK Terminal Response set message */
message = (mbim_message_stk_terminal_response_set_new (
sizeof (response),
response,
&error));
g_assert_no_error (error);
g_assert (message != NULL);
mbim_message_set_transaction_id (message, 1);
test_message_trace ((const guint8 *)((GByteArray *)message)->data,
((GByteArray *)message)->len,
expected_message,
sizeof (expected_message));
g_assert_cmpuint (mbim_message_get_transaction_id (message), ==, 1);
g_assert_cmpuint (mbim_message_get_message_type (message), ==, MBIM_MESSAGE_TYPE_COMMAND);
g_assert_cmpuint (mbim_message_get_message_length (message), ==, sizeof (expected_message));
g_assert_cmpuint (mbim_message_command_get_service (message), ==, MBIM_SERVICE_STK);
g_assert_cmpuint (mbim_message_command_get_cid (message), ==, MBIM_CID_STK_TERMINAL_RESPONSE);
g_assert_cmpuint (mbim_message_command_get_command_type (message), ==, MBIM_MESSAGE_COMMAND_TYPE_SET);
g_assert_cmpuint (((GByteArray *)message)->len, ==, sizeof (expected_message));
g_assert (memcmp (((GByteArray *)message)->data, expected_message, sizeof (expected_message)) == 0);
test_message_printable (message, 1, 0);
mbim_message_unref (message);
}
static void
test_stk_envelope_set (void)
{
GError *error = NULL;
MbimMessage *message;
const guint8 expected_message [] = {
/* header */
0x03, 0x00, 0x00, 0x00, /* type */
0x58, 0x00, 0x00, 0x00, /* length */
0x01, 0x00, 0x00, 0x00, /* transaction id */
/* fragment header */
0x01, 0x00, 0x00, 0x00, /* total */
0x00, 0x00, 0x00, 0x00, /* current */
/* command_message */
0xD8, 0xF2, 0x01, 0x31, /* service id */
0xFC, 0xB5, 0x4E, 0x17,
0x86, 0x02, 0xD6, 0xED,
0x38, 0x16, 0x16, 0x4C,
0x03, 0x00, 0x00, 0x00, /* command id */
0x01, 0x00, 0x00, 0x00, /* command_type */
0x28, 0x00, 0x00, 0x00, /* buffer_length */
/* information buffer */
0x1C, 0x00, 0x00, 0x00,
0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0A, 0x0B,
0x0C, 0x0D, 0x0E, 0x0F,
0xFF, 0xFE, 0xFD, 0xFC,
0xFB, 0xFA, 0xF9, 0xF8,
0xF7, 0xF6, 0xF5, 0xF4,
0xF3, 0xF2, 0xF1, 0xF0,
0xFF, 0xFE, 0xFD, 0xFC,
0xFB, 0xFA, 0xF9, 0xF8
};
const guint8 databuffer [] = {
0x1C, 0x00, 0x00, 0x00,
0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0A, 0x0B,
0x0C, 0x0D, 0x0E, 0x0F,
0xFF, 0xFE, 0xFD, 0xFC,
0xFB, 0xFA, 0xF9, 0xF8,
0xF7, 0xF6, 0xF5, 0xF4,
0xF3, 0xF2, 0xF1, 0xF0,
0xFF, 0xFE, 0xFD, 0xFC,
0xFB, 0xFA, 0xF9, 0xF8
};
/* STK Envelop set message */
message = (mbim_message_stk_envelope_set_new (
sizeof (databuffer),
databuffer,
&error));
g_assert_no_error (error);
g_assert (message != NULL);
mbim_message_set_transaction_id (message, 1);
test_message_trace ((const guint8 *)((GByteArray *)message)->data,
((GByteArray *)message)->len,
expected_message,
sizeof (expected_message));
g_assert_cmpuint (mbim_message_get_transaction_id (message), ==, 1);
g_assert_cmpuint (mbim_message_get_message_type (message), ==, MBIM_MESSAGE_TYPE_COMMAND);
g_assert_cmpuint (mbim_message_get_message_length (message), ==, sizeof (expected_message));
g_assert_cmpuint (mbim_message_command_get_service (message), ==, MBIM_SERVICE_STK);
g_assert_cmpuint (mbim_message_command_get_cid (message), ==, MBIM_CID_STK_ENVELOPE);
g_assert_cmpuint (mbim_message_command_get_command_type (message), ==, MBIM_MESSAGE_COMMAND_TYPE_SET);
g_assert_cmpuint (((GByteArray *)message)->len, ==, sizeof (expected_message));
g_assert (memcmp (((GByteArray *)message)->data, expected_message, sizeof (expected_message)) == 0);
test_message_printable (message, 1, 0);
mbim_message_unref (message);
}
static void
test_basic_connect_ip_packet_filters_set_none (void)
{
GError *error = NULL;
MbimMessage *message;
const guint8 expected_message [] = {
/* header */
0x03, 0x00, 0x00, 0x00, /* type */
0x38, 0x00, 0x00, 0x00, /* length */
0x01, 0x00, 0x00, 0x00, /* transaction id */
/* fragment header */
0x01, 0x00, 0x00, 0x00, /* total */
0x00, 0x00, 0x00, 0x00, /* current */
/* command_message */
0xA2, 0x89, 0xCC, 0x33, /* service id */
0xBC, 0xBB, 0x8B, 0x4F,
0xB6, 0xB0, 0x13, 0x3E,
0xC2, 0xAA, 0xE6, 0xDF,
0x17, 0x00, 0x00, 0x00, /* command id */
0x01, 0x00, 0x00, 0x00, /* command_type */
0x08, 0x00, 0x00, 0x00, /* buffer_length */
/* information buffer */
0x01, 0x00, 0x00, 0x00, /* 0x00 session id */
0x00, 0x00, 0x00, 0x00 /* 0x04 packet filters count */
};
/* IP packet filters set message */
message = mbim_message_ip_packet_filters_set_new (1, 0, NULL, &error);
g_assert_no_error (error);
g_assert (message != NULL);
mbim_message_set_transaction_id (message, 1);
test_message_trace ((const guint8 *)((GByteArray *)message)->data,
((GByteArray *)message)->len,
expected_message,
sizeof (expected_message));
g_assert_cmpuint (mbim_message_get_transaction_id (message), ==, 1);
g_assert_cmpuint (mbim_message_get_message_type (message), ==, MBIM_MESSAGE_TYPE_COMMAND);
g_assert_cmpuint (mbim_message_get_message_length (message), ==, sizeof (expected_message));
g_assert_cmpuint (mbim_message_command_get_service (message), ==, MBIM_SERVICE_BASIC_CONNECT);
g_assert_cmpuint (mbim_message_command_get_cid (message), ==, MBIM_CID_BASIC_CONNECT_IP_PACKET_FILTERS);
g_assert_cmpuint (mbim_message_command_get_command_type (message), ==, MBIM_MESSAGE_COMMAND_TYPE_SET);
g_assert_cmpuint (((GByteArray *)message)->len, ==, sizeof (expected_message));
g_assert (memcmp (((GByteArray *)message)->data, expected_message, sizeof (expected_message)) == 0);
test_message_printable (message, 1, 0);
mbim_message_unref (message);
}
static void
test_basic_connect_ip_packet_filters_set_one (void)
{
GError *error = NULL;
MbimMessage *message;
MbimPacketFilter **filters;
const guint8 expected_message [] = {
/* header */
0x03, 0x00, 0x00, 0x00, /* type */
0x5C, 0x00, 0x00, 0x00, /* length */
0x01, 0x00, 0x00, 0x00, /* transaction id */
/* fragment header */
0x01, 0x00, 0x00, 0x00, /* total */
0x00, 0x00, 0x00, 0x00, /* current */
/* command_message */
0xA2, 0x89, 0xCC, 0x33, /* service id */
0xBC, 0xBB, 0x8B, 0x4F,
0xB6, 0xB0, 0x13, 0x3E,
0xC2, 0xAA, 0xE6, 0xDF,
0x17, 0x00, 0x00, 0x00, /* command id */
0x01, 0x00, 0x00, 0x00, /* command_type */
0x2C, 0x00, 0x00, 0x00, /* buffer_length */
/* information buffer */
0x01, 0x00, 0x00, 0x00, /* 0x00 session id */
0x01, 0x00, 0x00, 0x00, /* 0x04 packet filters count */
0x10, 0x00, 0x00, 0x00, /* 0x08 packet filter 1 offset */
0x1C, 0x00, 0x00, 0x00, /* 0x0C packet filter 1 length */
/* databuffer, packet filter 1 */
0x07, 0x00, 0x00, 0x00, /* 0x10 0x00 filter size */
0x0C, 0x00, 0x00, 0x00, /* 0x14 0x04 filter offset (from beginning of struct) */
0x14, 0x00, 0x00, 0x00, /* 0x18 0x08 mask offset (from beginning of struct) */
0x01, 0x02, 0x03, 0x04, /* 0x1C 0x0C filter (padding 1) */
0x05, 0x06, 0x07, 0x00,
0xF1, 0xF2, 0xF3, 0xF4, /* 0x24 0x14 mask (padding 1) */
0xF5, 0xF6, 0xF7, 0x00,
};
const guint8 filter[] = {
0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07,
};
const guint8 mask[] = {
0xF1, 0xF2, 0xF3, 0xF4,
0xF5, 0xF6, 0xF7,
};
filters = g_new0 (MbimPacketFilter *, 2);
filters[0] = g_new (MbimPacketFilter, 1);
filters[0]->filter_size = 7;
filters[0]->packet_filter = g_new (guint8, 7);
memcpy (filters[0]->packet_filter, filter, 7);
filters[0]->packet_mask = g_new (guint8, 7);
memcpy (filters[0]->packet_mask, mask, 7);
/* IP packet filters set message */
message = (mbim_message_ip_packet_filters_set_new (
1,
1,
(const MbimPacketFilter * const*)filters,
&error));
g_assert_no_error (error);
g_assert (message != NULL);
mbim_message_set_transaction_id (message, 1);
test_message_trace ((const guint8 *)((GByteArray *)message)->data,
((GByteArray *)message)->len,
expected_message,
sizeof (expected_message));
g_assert_cmpuint (mbim_message_get_transaction_id (message), ==, 1);
g_assert_cmpuint (mbim_message_get_message_type (message), ==, MBIM_MESSAGE_TYPE_COMMAND);
g_assert_cmpuint (mbim_message_get_message_length (message), ==, sizeof (expected_message));
g_assert_cmpuint (mbim_message_command_get_service (message), ==, MBIM_SERVICE_BASIC_CONNECT);
g_assert_cmpuint (mbim_message_command_get_cid (message), ==, MBIM_CID_BASIC_CONNECT_IP_PACKET_FILTERS);
g_assert_cmpuint (mbim_message_command_get_command_type (message), ==, MBIM_MESSAGE_COMMAND_TYPE_SET);
g_assert_cmpuint (((GByteArray *)message)->len, ==, sizeof (expected_message));
g_assert (memcmp (((GByteArray *)message)->data, expected_message, sizeof (expected_message)) == 0);
test_message_printable (message, 1, 0);
mbim_message_unref (message);
mbim_packet_filter_array_free (filters);
}
static void
test_basic_connect_ip_packet_filters_set_two (void)
{
GError *error = NULL;
MbimMessage *message;
MbimPacketFilter **filters;
const guint8 expected_message [] = {
/* header */
0x03, 0x00, 0x00, 0x00, /* type */
0x88, 0x00, 0x00, 0x00, /* length */
0x01, 0x00, 0x00, 0x00, /* transaction id */
/* fragment header */
0x01, 0x00, 0x00, 0x00, /* total */
0x00, 0x00, 0x00, 0x00, /* current */
/* command_message */
0xA2, 0x89, 0xCC, 0x33, /* service id */
0xBC, 0xBB, 0x8B, 0x4F,
0xB6, 0xB0, 0x13, 0x3E,
0xC2, 0xAA, 0xE6, 0xDF,
0x17, 0x00, 0x00, 0x00, /* command id */
0x01, 0x00, 0x00, 0x00, /* command_type */
0x58, 0x00, 0x00, 0x00, /* buffer_length */
/* information buffer */
0x01, 0x00, 0x00, 0x00, /* 0x00 session id */
0x02, 0x00, 0x00, 0x00, /* 0x04 packet filters count */
0x18, 0x00, 0x00, 0x00, /* 0x08 packet filter 1 offset */
0x1C, 0x00, 0x00, 0x00, /* 0x0C packet filter 1 length */
0x34, 0x00, 0x00, 0x00, /* 0x10 packet filter 2 offset */
0x24, 0x00, 0x00, 0x00, /* 0x14 packet filter 2 length */
/* databuffer, packet filter 2 */
0x08, 0x00, 0x00, 0x00, /* 0x18 0x00 filter size */
0x0C, 0x00, 0x00, 0x00, /* 0x1C 0x04 filter offset (from beginning of struct) */
0x14, 0x00, 0x00, 0x00, /* 0x20 0x08 mask offset (from beginning of struct) */
0x01, 0x02, 0x03, 0x04, /* 0x24 0x0C filter */
0x05, 0x06, 0x07, 0x08,
0xF1, 0xF2, 0xF3, 0xF4, /* 0x2C 0x14 mask */
0xF5, 0xF6, 0xF7, 0xF8,
/* databuffer, packet filter 2 */
0x0C, 0x00, 0x00, 0x00, /* 0x34 0x00 filter size */
0x0C, 0x00, 0x00, 0x00, /* 0x38 0x04 filter offset (from beginning of struct) */
0x18, 0x00, 0x00, 0x00, /* 0x3C 0x08 mask offset (from beginning of struct) */
0x01, 0x02, 0x03, 0x04, /* 0x40 0x0C filter */
0x05, 0x06, 0x07, 0x08,
0x05, 0x06, 0x07, 0x08,
0xF1, 0xF2, 0xF3, 0xF4, /* 0x4C 0x18 mask */
0xF5, 0xF6, 0xF7, 0xF8,
0xF5, 0xF6, 0xF7, 0xF8,
};
const guint8 filter1[] = {
0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07, 0x08,
};
const guint8 mask1[] = {
0xF1, 0xF2, 0xF3, 0xF4,
0xF5, 0xF6, 0xF7, 0xF8,
};
const guint8 filter2[] = {
0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07, 0x08,
0x05, 0x06, 0x07, 0x08,
};
const guint8 mask2[] = {
0xF1, 0xF2, 0xF3, 0xF4,
0xF5, 0xF6, 0xF7, 0xF8,
0xF5, 0xF6, 0xF7, 0xF8,
};
filters = g_new0 (MbimPacketFilter *, 3);
filters[0] = g_new (MbimPacketFilter, 1);
filters[0]->filter_size = 8;
filters[0]->packet_filter = g_new (guint8, 8);
memcpy (filters[0]->packet_filter, filter1, 8);
filters[0]->packet_mask = g_new (guint8, 8);
memcpy (filters[0]->packet_mask, mask1, 8);
filters[1] = g_new (MbimPacketFilter, 1);
filters[1]->filter_size = 12;
filters[1]->packet_filter = g_new (guint8, 12);
memcpy (filters[1]->packet_filter, filter2, 12);
filters[1]->packet_mask = g_new (guint8, 12);
memcpy (filters[1]->packet_mask, mask2, 12);
/* IP packet filters set message */
message = (mbim_message_ip_packet_filters_set_new (
1,
2,
(const MbimPacketFilter * const*)filters,
&error));
g_assert_no_error (error);
g_assert (message != NULL);
mbim_message_set_transaction_id (message, 1);
test_message_trace ((const guint8 *)((GByteArray *)message)->data,
((GByteArray *)message)->len,
expected_message,
sizeof (expected_message));
g_assert_cmpuint (mbim_message_get_transaction_id (message), ==, 1);
g_assert_cmpuint (mbim_message_get_message_type (message), ==, MBIM_MESSAGE_TYPE_COMMAND);
g_assert_cmpuint (mbim_message_get_message_length (message), ==, sizeof (expected_message));
g_assert_cmpuint (mbim_message_command_get_service (message), ==, MBIM_SERVICE_BASIC_CONNECT);
g_assert_cmpuint (mbim_message_command_get_cid (message), ==, MBIM_CID_BASIC_CONNECT_IP_PACKET_FILTERS);
g_assert_cmpuint (mbim_message_command_get_command_type (message), ==, MBIM_MESSAGE_COMMAND_TYPE_SET);
g_assert_cmpuint (((GByteArray *)message)->len, ==, sizeof (expected_message));
g_assert (memcmp (((GByteArray *)message)->data, expected_message, sizeof (expected_message)) == 0);
test_message_printable (message, 1, 0);
mbim_message_unref (message);
mbim_packet_filter_array_free (filters);
}
static void
test_dss_connect_set (void)
{
GError *error = NULL;
MbimMessage *message;
const guint8 expected_message [] = {
/* header */
0x03, 0x00, 0x00, 0x00, /* type */
0x48, 0x00, 0x00, 0x00, /* length */
0x01, 0x00, 0x00, 0x00, /* transaction id */
/* fragment header */
0x01, 0x00, 0x00, 0x00, /* total */
0x00, 0x00, 0x00, 0x00, /* current */
/* command_message */
0xC0, 0x8A, 0x26, 0xDD, /* service id */
0x77, 0x18, 0x43, 0x82,
0x84, 0x82, 0x6E, 0x0D,
0x58, 0x3C, 0x4D, 0x0E,
0x01, 0x00, 0x00, 0x00, /* command id */
0x01, 0x00, 0x00, 0x00, /* command_type */
0x18, 0x00, 0x00, 0x00, /* buffer_length */
/* information buffer */
0x01, 0x02, 0x03, 0x04, /* service id */
0xFF, 0xFF, 0xBB, 0xBB,
0xFF, 0xCC, 0xF0, 0xF1,
0xF2, 0xF3, 0xF4, 0xF5,
0xFF, 0x00, 0x00, 0x00, /* dss session id */
0x01, 0x00, 0x00, 0x00 /* dss link state */
};
static const MbimUuid another_uuid = {
.a = { 0x01, 0x02, 0x03, 0x04 },
.b = { 0xFF, 0xFF },
.c = { 0xBB, 0xBB },
.d = { 0xFF, 0xCC },
.e = { 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5 }
};
/* IP packet filters set message */
message = (mbim_message_dss_connect_set_new (
&another_uuid,
255,
MBIM_DSS_LINK_STATE_ACTIVATE,
&error));
g_assert_no_error (error);
g_assert (message != NULL);
mbim_message_set_transaction_id (message, 1);
test_message_trace ((const guint8 *)((GByteArray *)message)->data,
((GByteArray *)message)->len,
expected_message,
sizeof (expected_message));
g_assert_cmpuint (mbim_message_get_transaction_id (message), ==, 1);
g_assert_cmpuint (mbim_message_get_message_type (message), ==, MBIM_MESSAGE_TYPE_COMMAND);
g_assert_cmpuint (mbim_message_get_message_length (message), ==, sizeof (expected_message));
g_assert_cmpuint (mbim_message_command_get_service (message), ==, MBIM_SERVICE_DSS);
g_assert_cmpuint (mbim_message_command_get_cid (message), ==, MBIM_CID_DSS_CONNECT);
g_assert_cmpuint (mbim_message_command_get_command_type (message), ==, MBIM_MESSAGE_COMMAND_TYPE_SET);
g_assert_cmpuint (((GByteArray *)message)->len, ==, sizeof (expected_message));
g_assert (memcmp (((GByteArray *)message)->data, expected_message, sizeof (expected_message)) == 0);
test_message_printable (message, 1, 0);
mbim_message_unref (message);
}
static void
test_basic_connect_multicarrier_providers_set (void)
{
GError *error = NULL;
MbimMessage *message;
MbimProvider **providers;
const guint8 expected_message [] = {
/* header */
0x03, 0x00, 0x00, 0x00, /* type */
0xB4, 0x00, 0x00, 0x00, /* length */
0x01, 0x00, 0x00, 0x00, /* transaction id */
/* fragment header */
0x01, 0x00, 0x00, 0x00, /* total */
0x00, 0x00, 0x00, 0x00, /* current */
/* command_message */
0xA2, 0x89, 0xCC, 0x33, /* service id */
0xBC, 0xBB, 0x8B, 0x4F,
0xB6, 0xB0, 0x13, 0x3E,
0xC2, 0xAA, 0xE6, 0xDF,
0x18, 0x00, 0x00, 0x00, /* command id */
0x01, 0x00, 0x00, 0x00, /* command_type */
0x84, 0x00, 0x00, 0x00, /* buffer_length */
/* information buffer */
0x02, 0x00, 0x00, 0x00, /* 0x00 providers count */
0x14, 0x00, 0x00, 0x00, /* 0x04 provider 0 offset */
0x38, 0x00, 0x00, 0x00, /* 0x08 provider 0 length */
0x4C, 0x00, 0x00, 0x00, /* 0x0C provider 1 offset */
0x38, 0x00, 0x00, 0x00, /* 0x10 provider 1 length */
/* data buffer... struct provider 0 */
0x20, 0x00, 0x00, 0x00, /* 0x14 [0x00] id offset */
0x0A, 0x00, 0x00, 0x00, /* 0x18 [0x04] id length */
0x08, 0x00, 0x00, 0x00, /* 0x1C [0x08] state */
0x2C, 0x00, 0x00, 0x00, /* 0x20 [0x0C] name offset */
0x0C, 0x00, 0x00, 0x00, /* 0x24 [0x10] name length */
0x01, 0x00, 0x00, 0x00, /* 0x28 [0x14] cellular class */
0x0B, 0x00, 0x00, 0x00, /* 0x2C [0x18] rssi */
0x00, 0x00, 0x00, 0x00, /* 0x30 [0x1C] error rate */
0x32, 0x00, 0x31, 0x00, /* 0x34 [0x20] id string (10 bytes) */
0x34, 0x00, 0x30, 0x00,
0x33, 0x00, 0x00, 0x00,
0x4F, 0x00, 0x72, 0x00, /* 0x40 [0x2C] name string (12 bytes) */
0x61, 0x00, 0x6E, 0x00,
0x67, 0x00, 0x65, 0x00,
/* data buffer... struct provider 1 */
0x20, 0x00, 0x00, 0x00, /* 0x4C [0x00] id offset */
0x0A, 0x00, 0x00, 0x00, /* 0x50 [0x04] id length */
0x19, 0x00, 0x00, 0x00, /* 0x51 [0x08] state */
0x2C, 0x00, 0x00, 0x00, /* 0x54 [0x0C] name offset */
0x0C, 0x00, 0x00, 0x00, /* 0x58 [0x10] name length */
0x01, 0x00, 0x00, 0x00, /* 0x5C [0x14] cellular class */
0x0B, 0x00, 0x00, 0x00, /* 0x60 [0x18] rssi */
0x00, 0x00, 0x00, 0x00, /* 0x64 [0x1C] error rate */
0x32, 0x00, 0x31, 0x00, /* 0x68 [0x20] id string (10 bytes) */
0x34, 0x00, 0x30, 0x00,
0x33, 0x00, 0x00, 0x00,
0x4F, 0x00, 0x72, 0x00, /* 0x74 [0x2C] name string (12 bytes) */
0x61, 0x00, 0x6E, 0x00,
0x67, 0x00, 0x65, 0x00
};
providers = g_new0 (MbimProvider *, 3);
providers[0] = g_new0 (MbimProvider, 1);
providers[0]->provider_id = g_strdup ("21403");
providers[0]->provider_name = g_strdup ("Orange");
providers[0]->provider_state = MBIM_PROVIDER_STATE_VISIBLE;
providers[0]->cellular_class = MBIM_CELLULAR_CLASS_GSM;
providers[0]->rssi = 11;
providers[0]->error_rate = 0;
providers[1] = g_new0 (MbimProvider, 1);
providers[1]->provider_id = g_strdup ("21403");
providers[1]->provider_name = g_strdup ("Orange");
providers[1]->provider_state = (MBIM_PROVIDER_STATE_HOME |
MBIM_PROVIDER_STATE_VISIBLE |
MBIM_PROVIDER_STATE_REGISTERED);
providers[1]->cellular_class = MBIM_CELLULAR_CLASS_GSM;
providers[1]->rssi = 11;
providers[1]->error_rate = 0;
/* Multicarrier providers set message */
message = (mbim_message_multicarrier_providers_set_new (
2,
(const MbimProvider *const *)providers,
&error));
g_assert_no_error (error);
g_assert (message != NULL);
mbim_message_set_transaction_id (message, 1);
test_message_trace ((const guint8 *)((GByteArray *)message)->data,
((GByteArray *)message)->len,
expected_message,
sizeof (expected_message));
g_assert_cmpuint (mbim_message_get_transaction_id (message), ==, 1);
g_assert_cmpuint (mbim_message_get_message_type (message), ==, MBIM_MESSAGE_TYPE_COMMAND);
g_assert_cmpuint (mbim_message_get_message_length (message), ==, sizeof (expected_message));
g_assert_cmpuint (mbim_message_command_get_service (message), ==, MBIM_SERVICE_BASIC_CONNECT);
g_assert_cmpuint (mbim_message_command_get_cid (message), ==, MBIM_CID_BASIC_CONNECT_MULTICARRIER_PROVIDERS);
g_assert_cmpuint (mbim_message_command_get_command_type (message), ==, MBIM_MESSAGE_COMMAND_TYPE_SET);
g_assert_cmpuint (((GByteArray *)message)->len, ==, sizeof (expected_message));
g_assert (memcmp (((GByteArray *)message)->data, expected_message, sizeof (expected_message)) == 0);
test_message_printable (message, 1, 0);
mbim_message_unref (message);
mbim_provider_array_free (providers);
}
static void
test_ms_host_shutdown_notify_set (void)
{
GError *error = NULL;
MbimMessage *message;
const guint8 expected_message [] = {
/* header */
0x03, 0x00, 0x00, 0x00, /* type */
0x30, 0x00, 0x00, 0x00, /* length */
0x01, 0x00, 0x00, 0x00, /* transaction id */
/* fragment header */
0x01, 0x00, 0x00, 0x00, /* total */
0x00, 0x00, 0x00, 0x00, /* current */
/* command_message */
0x88, 0x3B, 0x7C, 0x26, /* service id */
0x98, 0x5F, 0x43, 0xFA,
0x98, 0x04, 0x27, 0xD7,
0xFB, 0x80, 0x95, 0x9C,
0x01, 0x00, 0x00, 0x00, /* command id */
0x01, 0x00, 0x00, 0x00, /* command_type */
0x00, 0x00, 0x00, 0x00, /* buffer_length */
/* information buffer */
};
/* MS Host Shutdown set message */
message = mbim_message_ms_host_shutdown_notify_set_new (&error);
g_assert_no_error (error);
g_assert (message != NULL);
mbim_message_set_transaction_id (message, 1);
test_message_trace ((const guint8 *)((GByteArray *)message)->data,
((GByteArray *)message)->len,
expected_message,
sizeof (expected_message));
g_assert_cmpuint (mbim_message_get_transaction_id (message), ==, 1);
g_assert_cmpuint (mbim_message_get_message_type (message), ==, MBIM_MESSAGE_TYPE_COMMAND);
g_assert_cmpuint (mbim_message_get_message_length (message), ==, sizeof (expected_message));
g_assert_cmpuint (mbim_message_command_get_service (message), ==, MBIM_SERVICE_MS_HOST_SHUTDOWN);
g_assert_cmpuint (mbim_message_command_get_cid (message), ==, MBIM_CID_MS_HOST_SHUTDOWN_NOTIFY);
g_assert_cmpuint (mbim_message_command_get_command_type (message), ==, MBIM_MESSAGE_COMMAND_TYPE_SET);
g_assert_cmpuint (((GByteArray *)message)->len, ==, sizeof (expected_message));
g_assert (memcmp (((GByteArray *)message)->data, expected_message, sizeof (expected_message)) == 0);
test_message_printable (message, 1, 0);
mbim_message_unref (message);
}
static void
test_ms_basic_connect_extensions_registration_parameters_set_0_unnamed_tlvs (void)
{
g_autoptr(GError) error = NULL;
g_autoptr(MbimMessage) message = NULL;
const guint8 expected_message [] = {
/* header */
0x03, 0x00, 0x00, 0x00, /* type */
0x44, 0x00, 0x00, 0x00, /* length */
0x01, 0x00, 0x00, 0x00, /* transaction id */
/* fragment header */
0x01, 0x00, 0x00, 0x00, /* total */
0x00, 0x00, 0x00, 0x00, /* current */
/* command_done_message */
0x3D, 0x01, 0xDC, 0xC5, /* service id */
0xFE, 0xF5, 0x4D, 0x05,
0x0D, 0x3A, 0xBE, 0xF7,
0x05, 0x8E, 0x9A, 0xAF,
0x11, 0x00, 0x00, 0x00, /* command id */
0x01, 0x00, 0x00, 0x00, /* command_type */
0x14, 0x00, 0x00, 0x00, /* buffer length */
/* information buffer */
0x00, 0x00, 0x00, 0x00, /* mico mode */
0x00, 0x00, 0x00, 0x00, /* drx cycle */
0x00, 0x00, 0x00, 0x00, /* ladn info */
0x01, 0x00, 0x00, 0x00, /* pdu hint */
0x01, 0x00, 0x00, 0x00, /* re register if needed */
/* no unnamed TLVs */
};
message = (mbim_message_ms_basic_connect_extensions_v3_registration_parameters_set_new (
MBIM_MICO_MODE_DISABLED,
MBIM_DRX_CYCLE_NOT_SPECIFIED,
MBIM_LADN_INFO_NOT_NEEDED,
MBIM_DEFAULT_PDU_ACTIVATION_HINT_LIKELY,
TRUE,
NULL, /* 0 unnamed ies */
&error));
g_assert_no_error (error);
g_assert (message != NULL);
mbim_message_set_transaction_id (message, 1);
test_message_trace ((const guint8 *)((GByteArray *)message)->data,
((GByteArray *)message)->len,
expected_message,
sizeof (expected_message));
g_assert_cmpuint (mbim_message_get_transaction_id (message), ==, 1);
g_assert_cmpuint (mbim_message_get_message_type (message), ==, MBIM_MESSAGE_TYPE_COMMAND);
g_assert_cmpuint (mbim_message_get_message_length (message), ==, sizeof (expected_message));
g_assert_cmpuint (mbim_message_command_get_service (message), ==, MBIM_SERVICE_MS_BASIC_CONNECT_EXTENSIONS);
g_assert_cmpuint (mbim_message_command_get_cid (message), ==, MBIM_CID_MS_BASIC_CONNECT_EXTENSIONS_REGISTRATION_PARAMETERS);
g_assert_cmpuint (mbim_message_command_get_command_type (message), ==, MBIM_MESSAGE_COMMAND_TYPE_SET);
g_assert_cmpuint (((GByteArray *)message)->len, ==, sizeof (expected_message));
g_assert (memcmp (((GByteArray *)message)->data, expected_message, sizeof (expected_message)) == 0);
test_message_printable (message, 3, 0);
}
static void
test_ms_basic_connect_extensions_registration_parameters_set_1_unnamed_tlv (void)
{
MbimTlv *tlv;
GList *tlv_list = NULL;
g_autoptr(GError) error = NULL;
g_autoptr(MbimMessage) message = NULL;
const guint8 expected_message [] = {
/* header */
0x03, 0x00, 0x00, 0x00, /* type */
0x58, 0x00, 0x00, 0x00, /* length */
0x01, 0x00, 0x00, 0x00, /* transaction id */
/* fragment header */
0x01, 0x00, 0x00, 0x00, /* total */
0x00, 0x00, 0x00, 0x00, /* current */
/* command_done_message */
0x3D, 0x01, 0xDC, 0xC5, /* service id */
0xFE, 0xF5, 0x4D, 0x05,
0x0D, 0x3A, 0xBE, 0xF7,
0x05, 0x8E, 0x9A, 0xAF,
0x11, 0x00, 0x00, 0x00, /* command id */
0x01, 0x00, 0x00, 0x00, /* command_type */
0x28, 0x00, 0x00, 0x00, /* buffer length */
/* information buffer */
0x00, 0x00, 0x00, 0x00, /* mico mode */
0x00, 0x00, 0x00, 0x00, /* drx cycle */
0x00, 0x00, 0x00, 0x00, /* ladn info */
0x01, 0x00, 0x00, 0x00, /* pdu hint */
0x01, 0x00, 0x00, 0x00, /* re register if needed */
/* First unnamed TLV */
0x0A, 0x00, 0x00, 0x00, /* TLV type MBIM_TLV_TYPE_WCHAR_STR, no padding */
0x0C, 0x00, 0x00, 0x00, /* TLV data length */
0x4F, 0x00, 0x72, 0x00, /* TLV data string */
0x61, 0x00, 0x6E, 0x00,
0x67, 0x00, 0x65, 0x00,
};
tlv = mbim_tlv_string_new ("Orange", &error);
g_assert_no_error (error);
g_assert (tlv);
tlv_list = g_list_append (tlv_list, tlv);
message = (mbim_message_ms_basic_connect_extensions_v3_registration_parameters_set_new (
MBIM_MICO_MODE_DISABLED,
MBIM_DRX_CYCLE_NOT_SPECIFIED,
MBIM_LADN_INFO_NOT_NEEDED,
MBIM_DEFAULT_PDU_ACTIVATION_HINT_LIKELY,
TRUE,
tlv_list,
&error));
g_assert_no_error (error);
g_assert (message != NULL);
mbim_message_set_transaction_id (message, 1);
test_message_trace ((const guint8 *)((GByteArray *)message)->data,
((GByteArray *)message)->len,
expected_message,
sizeof (expected_message));
g_assert_cmpuint (mbim_message_get_transaction_id (message), ==, 1);
g_assert_cmpuint (mbim_message_get_message_type (message), ==, MBIM_MESSAGE_TYPE_COMMAND);
g_assert_cmpuint (mbim_message_get_message_length (message), ==, sizeof (expected_message));
g_assert_cmpuint (mbim_message_command_get_service (message), ==, MBIM_SERVICE_MS_BASIC_CONNECT_EXTENSIONS);
g_assert_cmpuint (mbim_message_command_get_cid (message), ==, MBIM_CID_MS_BASIC_CONNECT_EXTENSIONS_REGISTRATION_PARAMETERS);
g_assert_cmpuint (mbim_message_command_get_command_type (message), ==, MBIM_MESSAGE_COMMAND_TYPE_SET);
g_assert_cmpuint (((GByteArray *)message)->len, ==, sizeof (expected_message));
g_assert (memcmp (((GByteArray *)message)->data, expected_message, sizeof (expected_message)) == 0);
g_list_free_full (tlv_list, (GDestroyNotify)mbim_tlv_unref);
test_message_printable (message, 3, 0);
}
static void
test_ms_basic_connect_extensions_registration_parameters_set_3_unnamed_tlvs (void)
{
MbimTlv *tlv;
GList *tlv_list = NULL;
g_autoptr(GError) error = NULL;
g_autoptr(MbimMessage) message = NULL;
const guint8 pco[] = {
0x01, 0x02, 0x03, 0x04,
0x05, 0x06, 0x07, 0x08,
0x09, 0x0A, 0x0B };
const guint8 expected_message [] = {
/* header */
0x03, 0x00, 0x00, 0x00, /* type */
0x80, 0x00, 0x00, 0x00, /* length */
0x01, 0x00, 0x00, 0x00, /* transaction id */
/* fragment header */
0x01, 0x00, 0x00, 0x00, /* total */
0x00, 0x00, 0x00, 0x00, /* current */
/* command_done_message */
0x3D, 0x01, 0xDC, 0xC5, /* service id */
0xFE, 0xF5, 0x4D, 0x05,
0x0D, 0x3A, 0xBE, 0xF7,
0x05, 0x8E, 0x9A, 0xAF,
0x11, 0x00, 0x00, 0x00, /* command id */
0x01, 0x00, 0x00, 0x00, /* command_type */
0x50, 0x00, 0x00, 0x00, /* buffer length */
/* information buffer */
0x00, 0x00, 0x00, 0x00, /* mico mode */
0x00, 0x00, 0x00, 0x00, /* drx cycle */
0x00, 0x00, 0x00, 0x00, /* ladn info */
0x01, 0x00, 0x00, 0x00, /* pdu hint */
0x01, 0x00, 0x00, 0x00, /* re register if needed */
/* First unnamed TLV */
0x0A, 0x00, 0x00, 0x02, /* TLV type MBIM_TLV_TYPE_WCHAR_STR, padding 2 */
0x0A, 0x00, 0x00, 0x00, /* TLV data length */
0x61, 0x00, 0x62, 0x00, /* TLV data string */
0x63, 0x00, 0x64, 0x00,
0x65, 0x00, 0x00, 0x00,
/* Second unnamed TLV */
0x0A, 0x00, 0x00, 0x00, /* TLV type MBIM_TLV_TYPE_WCHAR_STR, no padding */
0x0C, 0x00, 0x00, 0x00, /* TLV data length */
0x4F, 0x00, 0x72, 0x00, /* TLV data string */
0x61, 0x00, 0x6E, 0x00,
0x67, 0x00, 0x65, 0x00,
/* Third unnamed TLV */
0x0D, 0x00, 0x00, 0x01, /* TLV type MBIM_TLV_TYPE_PCO, padding 1 */
0x0B, 0x00, 0x00, 0x00, /* TLV data length */
0x01, 0x02, 0x03, 0x04, /* TLV data bytes */
0x05, 0x06, 0x07, 0x08,
0x09, 0x0A, 0x0B, 0x00,
};
tlv = mbim_tlv_string_new ("abcde", &error);
g_assert_no_error (error);
g_assert (tlv);
tlv_list = g_list_append (tlv_list, tlv);
tlv = mbim_tlv_string_new ("Orange", &error);
g_assert_no_error (error);
g_assert (tlv);
tlv_list = g_list_append (tlv_list, tlv);
tlv = mbim_tlv_new (MBIM_TLV_TYPE_PCO, pco, sizeof (pco));
g_assert (tlv);
tlv_list = g_list_append (tlv_list, tlv);
message = (mbim_message_ms_basic_connect_extensions_v3_registration_parameters_set_new (
MBIM_MICO_MODE_DISABLED,
MBIM_DRX_CYCLE_NOT_SPECIFIED,
MBIM_LADN_INFO_NOT_NEEDED,
MBIM_DEFAULT_PDU_ACTIVATION_HINT_LIKELY,
TRUE,
tlv_list,
&error));
g_assert_no_error (error);
g_assert (message != NULL);
mbim_message_set_transaction_id (message, 1);
test_message_trace ((const guint8 *)((GByteArray *)message)->data,
((GByteArray *)message)->len,
expected_message,
sizeof (expected_message));
g_assert_cmpuint (mbim_message_get_transaction_id (message), ==, 1);
g_assert_cmpuint (mbim_message_get_message_type (message), ==, MBIM_MESSAGE_TYPE_COMMAND);
g_assert_cmpuint (mbim_message_get_message_length (message), ==, sizeof (expected_message));
g_assert_cmpuint (mbim_message_command_get_service (message), ==, MBIM_SERVICE_MS_BASIC_CONNECT_EXTENSIONS);
g_assert_cmpuint (mbim_message_command_get_cid (message), ==, MBIM_CID_MS_BASIC_CONNECT_EXTENSIONS_REGISTRATION_PARAMETERS);
g_assert_cmpuint (mbim_message_command_get_command_type (message), ==, MBIM_MESSAGE_COMMAND_TYPE_SET);
g_assert_cmpuint (((GByteArray *)message)->len, ==, sizeof (expected_message));
g_assert (memcmp (((GByteArray *)message)->data, expected_message, sizeof (expected_message)) == 0);
g_list_free_full (tlv_list, (GDestroyNotify)mbim_tlv_unref);
test_message_printable (message, 3, 0);
}
static void
test_ms_basic_connect_v3_connect_set (void)
{
GError *error = NULL;
MbimMessage *message;
const guint8 expected_message [] = {
/* header */
0x03, 0x00, 0x00, 0x00, /* type */
0x80, 0x00, 0x00, 0x00, /* length */
0x01, 0x00, 0x00, 0x00, /* transaction id */
/* fragment header */
0x01, 0x00, 0x00, 0x00, /* total */
0x00, 0x00, 0x00, 0x00, /* current */
/* command_message */
0xA2, 0x89, 0xCC, 0x33, /* service id */
0xBC, 0xBB, 0x8B, 0x4F,
0xB6, 0xB0, 0x13, 0x3E,
0xC2, 0xAA, 0xE6, 0xDF,
0x0C, 0x00, 0x00, 0x00, /* command id */
0x01, 0x00, 0x00, 0x00, /* command_type */
0x50, 0x00, 0x00, 0x00, /* buffer_length */
/* information buffer */
0x01, 0x00, 0x00, 0x00, /* session id */
0x01, 0x00, 0x00, 0x00, /* activation command */
0x00, 0x00, 0x00, 0x00, /* compression */
0x01, 0x00, 0x00, 0x00, /* auth protocol */
0x01, 0x00, 0x00, 0x00, /* ip type */
0x7E, 0x5E, 0x2A, 0x7E, /* context type */
0x4E, 0x6F, 0x72, 0x72,
0x73, 0x6B, 0x65, 0x6E,
0x7E, 0x5E, 0x2A, 0x7E,
0x01, 0x00, 0x00, 0x00, /* media preference */
0x0A, 0x00, 0x00, 0x00, /* access string */
0x10, 0x00, 0x00, 0x00,
0x69, 0x00, 0x6E, 0x00,
0x74, 0x00, 0x65, 0x00,
0x72, 0x00, 0x6E, 0x00,
0x65, 0x00, 0x74, 0x00,
0x0A, 0x00, 0x00, 0x00, /* username */
0x00, 0x00, 0x00, 0x00,
0x0A, 0x00, 0x00, 0x00, /* password */
0x00, 0x00, 0x00, 0x00,
/* no unnamed TLVs */
};
/* CONNECT set message */
message = (mbim_message_ms_basic_connect_v3_connect_set_new (
0x01,
MBIM_ACTIVATION_COMMAND_ACTIVATE,
MBIM_COMPRESSION_NONE,
MBIM_AUTH_PROTOCOL_PAP,
MBIM_CONTEXT_IP_TYPE_IPV4,
mbim_uuid_from_context_type (MBIM_CONTEXT_TYPE_INTERNET),
MBIM_ACCESS_MEDIA_TYPE_3GPP,
"internet",
"",
"",
NULL, /* no unnamed ies */
&error));
g_assert_no_error (error);
g_assert (message != NULL);
mbim_message_set_transaction_id (message, 1);
test_message_trace ((const guint8 *)((GByteArray *)message)->data,
((GByteArray *)message)->len,
expected_message,
sizeof (expected_message));
g_assert_cmpuint (mbim_message_get_transaction_id (message), ==, 1);
g_assert_cmpuint (mbim_message_get_message_type (message), ==, MBIM_MESSAGE_TYPE_COMMAND);
g_assert_cmpuint (mbim_message_get_message_length (message), ==, sizeof (expected_message));
g_assert_cmpuint (mbim_message_command_get_service (message), ==, MBIM_SERVICE_BASIC_CONNECT);
g_assert_cmpuint (mbim_message_command_get_cid (message), ==, MBIM_CID_BASIC_CONNECT_CONNECT);
g_assert_cmpuint (mbim_message_command_get_command_type (message), ==, MBIM_MESSAGE_COMMAND_TYPE_SET);
g_assert_cmpuint (((GByteArray *)message)->len, ==, sizeof (expected_message));
g_assert (memcmp (((GByteArray *)message)->data, expected_message, sizeof (expected_message)) == 0);
test_message_printable (message, 3, 0);
mbim_message_unref (message);
}
int main (int argc, char **argv)
{
g_test_init (&argc, &argv, NULL);
#define PREFIX "/libmbim-glib/message/builder"
g_test_add_func (PREFIX "/basic-connect/pin/set/raw", test_basic_connect_pin_set_raw);
g_test_add_func (PREFIX "/basic-connect/pin/set", test_basic_connect_pin_set);
g_test_add_func (PREFIX "/basic-connect/connect/set/raw", test_basic_connect_connect_set_raw);
g_test_add_func (PREFIX "/basic-connect/connect/set", test_basic_connect_connect_set);
g_test_add_func (PREFIX "/basic-connect/service-activation/set", test_basic_connect_service_activation_set);
g_test_add_func (PREFIX "/basic-connect/device-service-subscribe-list/set", test_basic_connect_device_service_subscribe_list_set);
g_test_add_func (PREFIX "/ussd/set", test_ussd_set);
g_test_add_func (PREFIX "/auth/akap/query", test_auth_akap_query);
g_test_add_func (PREFIX "/stk/pac/set", test_stk_pac_set);
g_test_add_func (PREFIX "/stk/terminal-response/set", test_stk_terminal_response_set);
g_test_add_func (PREFIX "/stk/envelope/set", test_stk_envelope_set);
g_test_add_func (PREFIX "/basic-connect/ip-packet-filters/set/none", test_basic_connect_ip_packet_filters_set_none);
g_test_add_func (PREFIX "/basic-connect/ip-packet-filters/set/one", test_basic_connect_ip_packet_filters_set_one);
g_test_add_func (PREFIX "/basic-connect/ip-packet-filters/set/two", test_basic_connect_ip_packet_filters_set_two);
g_test_add_func (PREFIX "/dss/connect/set", test_dss_connect_set);
g_test_add_func (PREFIX "/basic-connect/multicarrier-providers/set", test_basic_connect_multicarrier_providers_set);
g_test_add_func (PREFIX "/ms-host-shutdown/notify/set", test_ms_host_shutdown_notify_set);
g_test_add_func (PREFIX "/ms-basic-connect-extensions/registration-parameters/set/0-unnamed-tlvs", test_ms_basic_connect_extensions_registration_parameters_set_0_unnamed_tlvs);
g_test_add_func (PREFIX "/ms-basic-connect-extensions/registration-parameters/set/1-unnamed-tlv", test_ms_basic_connect_extensions_registration_parameters_set_1_unnamed_tlv);
g_test_add_func (PREFIX "/ms-basic-connect-extensions/registration-parameters/set/3-unnamed-tlvs", test_ms_basic_connect_extensions_registration_parameters_set_3_unnamed_tlvs);
g_test_add_func (PREFIX "/ms-basic-connect-v3/connect/set", test_ms_basic_connect_v3_connect_set);
#undef PREFIX
return g_test_run ();
}