summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSom_SP <somashekhar.puttagangaiah@intel.com>2021-10-01 19:36:19 +0530
committerAleksander Morgado <aleksander@aleksander.es>2021-10-12 22:27:12 +0200
commit8c781c81b1a18ba206dbc5df3595363f4f485c4c (patch)
tree80a897f4e1060c507e4bbd1a41dec4f94215d10f
parent01b81154b9e272ff06e1cfa1a75c7f6b91eb97da (diff)
ms-basic-connect: implement connect for mbim version 3
This command is an extension for the existing MBIM_CID_CONNECT defined in the MBIM specification revision 1.0. This extension adds 5G SA specific parameters.
-rw-r--r--build-aux/mbim-codegen/Struct.py27
-rw-r--r--data/mbim-service-ms-basic-connect-v3.json104
-rw-r--r--src/libmbim-glib/mbim-enums.h19
-rw-r--r--src/libmbim-glib/mbim-message-private.h8
-rw-r--r--src/libmbim-glib/mbim-message.c127
-rw-r--r--src/mbimcli/mbimcli-basic-connect.c222
-rw-r--r--src/mbimcli/mbimcli-helpers.h3
7 files changed, 444 insertions, 66 deletions
diff --git a/build-aux/mbim-codegen/Struct.py b/build-aux/mbim-codegen/Struct.py
index 3d70ad1..4fba85b 100644
--- a/build-aux/mbim-codegen/Struct.py
+++ b/build-aux/mbim-codegen/Struct.py
@@ -108,6 +108,9 @@ class Struct:
elif field['format'] == 'string':
inner_template = (
' * @${field_name_underscore}: a string.\n')
+ elif field['format'] == 'string-tlv':
+ inner_template = (
+ ' * @${field_name_underscore}: a string.\n')
elif field['format'] == 'string-array':
inner_template = (
' * @${field_name_underscore}: an array of strings.\n')
@@ -166,6 +169,9 @@ class Struct:
elif field['format'] == 'string':
inner_template = (
' gchar *${field_name_underscore};\n')
+ elif field['format'] == 'string-tlv':
+ inner_template = (
+ ' gchar *${field_name_underscore};\n')
elif field['format'] == 'string-array':
inner_template = (
' gchar **${field_name_underscore};\n')
@@ -245,6 +251,9 @@ class Struct:
elif field['format'] == 'string':
inner_template += (
' g_free (var->${field_name_underscore});\n')
+ elif field['format'] == 'string-tlv':
+ inner_template += (
+ ' g_free (var->${field_name_underscore});\n')
elif field['format'] == 'string-array':
inner_template += (
' g_strfreev (var->${field_name_underscore});\n')
@@ -420,6 +429,9 @@ class Struct:
elif field['format'] == 'string':
inner_template += (
' g_string_append_printf (str, "\'%s\'", self->${field_name_underscore});\n')
+ elif field['format'] == 'string-tlv':
+ inner_template += (
+ ' g_string_append_printf (str, "\'%s\'", self->${field_name_underscore});\n')
elif field['format'] == 'string-array':
translations['array_size_field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['array-size-field'])
@@ -489,7 +501,9 @@ class Struct:
'\n'
' g_assert (self != NULL);\n'
'\n'
- ' out = g_new0 (${name}, 1);\n')
+ ' out = g_new0 (${name}, 1);\n'
+ '\n')
+
for field in self.contents:
translations['field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['name'])
@@ -594,6 +608,13 @@ class Struct:
' if (!_mbim_message_read_string (self, relative_offset, offset, &out->${field_name_underscore}, error))\n'
' goto out;\n'
' offset += 8;\n')
+ elif field['format'] == 'string-tlv':
+ inner_template += (
+ '{\n'
+ ' guint32 size = 0;\n'
+ ' if (!_mbim_message_read_string_tlv (self, relative_offset, offset, &out->${field_name_underscore}, &size, error))\n'
+ ' goto out;\n'
+ ' offset += size + (size % 4);\n}')
elif field['format'] == 'string-array':
translations['array_size_field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['array-size-field'])
inner_template += (
@@ -665,7 +686,7 @@ class Struct:
for field in self.contents:
translations['field_name_underscore'] = utils.build_underscore_name_from_camelcase(field['name'])
inner_template = ''
- if field['format'] in ['ref-byte-array', 'ref-byte-array-no-offset', 'unsized-byte-array', 'byte-array', 'string']:
+ if field['format'] in ['ref-byte-array', 'ref-byte-array-no-offset', 'unsized-byte-array', 'byte-array', 'string', 'string-tlv']:
inner_template = (' g_free (out->${field_name_underscore});\n')
elif field['format'] == 'string-array':
inner_template = (' g_strfreev (out->${field_name_underscore});\n')
@@ -904,6 +925,8 @@ class Struct:
inner_template = (' _mbim_struct_builder_append_guint64 (builder, value->${field});\n')
elif field['format'] == 'string':
inner_template = (' _mbim_struct_builder_append_string (builder, value->${field});\n')
+ elif field['format'] == 'string-tlv':
+ inner_template = (' _mbim_struct_builder_append_string_tlv (builder, value->${field});\n')
elif field['format'] == 'string-array':
inner_template = (' _mbim_struct_builder_append_string_array (builder, value->${field}, value->${array_size_field});\n')
elif field['format'] == 'ipv4':
diff --git a/data/mbim-service-ms-basic-connect-v3.json b/data/mbim-service-ms-basic-connect-v3.json
index ed5b64e..06e2bf3 100644
--- a/data/mbim-service-ms-basic-connect-v3.json
+++ b/data/mbim-service-ms-basic-connect-v3.json
@@ -105,5 +105,107 @@
"public-format" : "MbimDataSubclass" },
{ "name" : "Tai",
"format" : "struct",
- "struct-type" : "MbimTai" } ] }
+ "struct-type" : "MbimTai" } ] },
+
+ // *********************************************************************************
+ { "name" : "MbimConnectAccessString",
+ "type" : "Struct",
+ "since" : "1.28",
+ "contents" : [ { "name" : "Type",
+ "format" : "guint16" },
+ { "name" : "Data",
+ "format" : "string-tlv" } ] },
+
+ { "name" : "MbimConnectUserName",
+ "type" : "Struct",
+ "since" : "1.28",
+ "contents" : [ { "name" : "Type",
+ "format" : "guint16" },
+ { "name" : "Data",
+ "format" : "string-tlv" } ] },
+
+ { "name" : "MbimConnectPassword",
+ "type" : "Struct",
+ "since" : "1.28",
+ "contents" : [ { "name" : "Type",
+ "format" : "guint16" },
+ { "name" : "Data",
+ "format" : "string-tlv" } ] },
+
+ { "name" : "Connect",
+ "service" : "Basic Connect V3",
+ "type" : "Command",
+ "since" : "1.28",
+ "set" : [ { "name" : "SessionId",
+ "format" : "guint32" },
+ { "name" : "ActivationCommand",
+ "format" : "guint32",
+ "public-format" : "MbimActivationCommand" },
+ { "name" : "Compression",
+ "format" : "guint32",
+ "public-format" : "MbimCompression" },
+ { "name" : "AuthProtocol",
+ "format" : "guint32",
+ "public-format" : "MbimAuthProtocol" },
+ { "name" : "IpType",
+ "format" : "guint32",
+ "public-format" : "MbimContextIpType" },
+ { "name" : "ContextType",
+ "format" : "uuid" },
+ { "name" : "MediaPreference",
+ "format" : "guint32",
+ "public-format" : "MbimAccessMediaType" },
+ { "name" : "AccessString",
+ "format" : "struct" ,
+ "struct-type" : "MbimConnectAccessString" },
+ { "name" : "UserName",
+ "format" : "struct" ,
+ "struct-type" : "MbimConnectUserName" },
+ { "name" : "Password",
+ "format" : "struct" ,
+ "struct-type" : "MbimConnectPassword" } ],
+ "query" : [ { "name" : "SessionId",
+ "format" : "guint32" } ],
+ "response" : [ { "name" : "SessionId",
+ "format" : "guint32" },
+ { "name" : "ActivationState",
+ "format" : "guint32",
+ "public-format" : "MbimActivationState" },
+ { "name" : "VoiceCallState",
+ "format" : "guint32",
+ "public-format" : "MbimVoiceCallState" },
+ { "name" : "IpType",
+ "format" : "guint32",
+ "public-format" : "MbimContextIpType" },
+ { "name" : "ContextType",
+ "format" : "uuid" },
+ { "name" : "NwError",
+ "format" : "guint32" },
+ { "name" : "MediaPreference",
+ "format" : "guint32",
+ "public-format" : "MbimAccessMediaType" },
+ { "name" : "AccessString",
+ "format" : "struct" ,
+ "struct-type" : "MbimConnectAccessString" } ],
+ "notification" : [ { "name" : "SessionId",
+ "format" : "guint32" },
+ { "name" : "ActivationState",
+ "format" : "guint32",
+ "public-format" : "MbimActivationState" },
+ { "name" : "VoiceCallState",
+ "format" : "guint32",
+ "public-format" : "MbimVoiceCallState" },
+ { "name" : "IpType",
+ "format" : "guint32",
+ "public-format" : "MbimContextIpType" },
+ { "name" : "ContextType",
+ "format" : "uuid" },
+ { "name" : "NwError",
+ "format" : "guint32" },
+ { "name" : "MediaPreference",
+ "format" : "guint32",
+ "public-format" : "MbimAccessMediaType" },
+ { "name" : "AccessString",
+ "format" : "struct" ,
+ "struct-type" : "MbimConnectAccessString" } ] }
]
diff --git a/src/libmbim-glib/mbim-enums.h b/src/libmbim-glib/mbim-enums.h
index 3dce065..3efbbdc 100644
--- a/src/libmbim-glib/mbim-enums.h
+++ b/src/libmbim-glib/mbim-enums.h
@@ -374,6 +374,25 @@ typedef enum { /*< since=1.2 >*/
} MbimProviderState;
/*****************************************************************************/
+/* Connect V3' enums */
+
+/**
+ * MbimAccessMediaType:
+ * @MBIM_ACCESS_MEDIA_TYPE_UNKNOWN: Unknown.
+ * @MBIM_ACCESS_MEDIA_TYPE_3GPP: 3GPP.
+ * @MBIM_ACCESS_MEDIA_TYPE_3GPP_PREFERRED: 3GPP Preferred.
+ *
+ * Nw BlackList State.
+ *
+ * Since: 1.28
+ */
+typedef enum { /*< since=1.28 >*/
+ MBIM_ACCESS_MEDIA_TYPE_UNKNOWN = 0,
+ MBIM_ACCESS_MEDIA_TYPE_3GPP = 1,
+ MBIM_ACCESS_MEDIA_TYPE_3GPP_PREFERRED = 2
+} MbimAccessMediaType;
+
+/*****************************************************************************/
/* 'Visible Providers' enums */
/**
diff --git a/src/libmbim-glib/mbim-message-private.h b/src/libmbim-glib/mbim-message-private.h
index 6fba27b..c17046f 100644
--- a/src/libmbim-glib/mbim-message-private.h
+++ b/src/libmbim-glib/mbim-message-private.h
@@ -196,6 +196,8 @@ void _mbim_struct_builder_append_ipv6 (MbimStructBuilder
void _mbim_struct_builder_append_ipv6_array (MbimStructBuilder *builder,
const MbimIPv6 *values,
guint32 n_values);
+void _mbim_struct_builder_append_string_tlv (MbimStructBuilder *builder,
+ const gchar *values);
/*****************************************************************************/
/* Message builder */
@@ -315,6 +317,12 @@ gboolean _mbim_message_read_ipv6_array (const MbimMessage *self,
guint32 relative_offset_array_start,
MbimIPv6 **array,
GError **error);
+gboolean _mbim_message_read_string_tlv (const MbimMessage *self,
+ guint32 struct_start_offset,
+ guint32 relative_offset,
+ gchar **str,
+ guint32 *tpv_size,
+ GError **error);
G_END_DECLS
diff --git a/src/libmbim-glib/mbim-message.c b/src/libmbim-glib/mbim-message.c
index 3439dae..7bd23ac 100644
--- a/src/libmbim-glib/mbim-message.c
+++ b/src/libmbim-glib/mbim-message.c
@@ -374,6 +374,78 @@ _mbim_message_read_string (const MbimMessage *self,
}
gboolean
+_mbim_message_read_string_tlv (const MbimMessage *self,
+ guint32 struct_start_offset,
+ guint32 relative_offset,
+ gchar **str,
+ guint32 *tpv_size,
+ GError **error)
+{
+ guint32 required_size;
+ guint32 size = 0;
+ guint32 information_buffer_offset;
+ gunichar2 *utf16d = NULL;
+ const gunichar2 *utf16 = NULL;
+
+ information_buffer_offset = _mbim_message_get_information_buffer_offset (self);
+ required_size = information_buffer_offset + relative_offset;
+
+ if (self->len < required_size) {
+ g_set_error (error, MBIM_CORE_ERROR, MBIM_CORE_ERROR_INVALID_MESSAGE,
+ "cannot read string offset and size (%u < %u)",
+ self->len, required_size);
+ return FALSE;
+ }
+
+ size = GUINT32_FROM_LE (G_STRUCT_MEMBER (
+ guint32,
+ self->data,
+ (information_buffer_offset + relative_offset)));
+
+ if (!size) {
+ *str = NULL;
+ *tpv_size = 4;
+ return TRUE;
+ } else {
+ *tpv_size = size+4;
+ }
+ required_size = information_buffer_offset + struct_start_offset + size;
+
+ if (self->len < required_size) {
+ g_set_error (error, MBIM_CORE_ERROR, MBIM_CORE_ERROR_INVALID_MESSAGE,
+ "cannot read string data (%u bytes) (%u < %u)",
+ size, self->len, required_size);
+ return FALSE;
+ }
+
+ utf16 = (const gunichar2 *) G_STRUCT_MEMBER_P (self->data, (information_buffer_offset + relative_offset+4 ));
+
+ /* For BE systems, convert from LE to BE */
+ if (G_BYTE_ORDER == G_BIG_ENDIAN) {
+ guint i;
+
+ utf16d = (gunichar2 *) g_malloc (size);
+ for (i = 0; i < (size / 2); i++)
+ utf16d[i] = GUINT16_FROM_LE (utf16[i]);
+ }
+
+ *str = g_utf16_to_utf8 (utf16d ? utf16d : utf16,
+ size / 2,
+ NULL,
+ NULL,
+ error);
+
+ g_free (utf16d);
+
+ if (!(*str)) {
+ g_prefix_error (error, "Error converting string to UTF-8: ");
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+gboolean
_mbim_message_read_string_array (const MbimMessage *self,
guint32 array_size,
guint32 struct_start_offset,
@@ -1092,6 +1164,61 @@ _mbim_struct_builder_append_string (MbimStructBuilder *builder,
}
void
+_mbim_struct_builder_append_string_tlv (MbimStructBuilder *builder,
+ const gchar *value)
+{
+ guint8 reserved = 0;
+ guint8 padding = 0;
+ guint32 length;
+ gunichar2 *utf16 = NULL;
+ guint32 utf16_bytes = 0;
+ GError *error = NULL;
+
+ /* Add the reserved value */
+ g_byte_array_append (builder->fixed_buffer, (guint8 *)&reserved, sizeof (reserved));
+
+ /* Convert the string from UTF-8 to UTF-16HE */
+ if (value && value[0]) {
+ glong items_written = 0;
+ utf16 = g_utf8_to_utf16 (value,
+ -1,
+ NULL, /* bytes */
+ &items_written, /* gunichar2 */
+ &error);
+
+ if (!utf16) {
+ g_warning ("Error converting string: %s", error->message);
+ g_error_free (error);
+ return;
+ }
+ utf16_bytes = items_written * 2;
+
+ /* Add the padding value */
+ padding = utf16_bytes % 4;
+ g_byte_array_append (builder->fixed_buffer, (guint8 *)&padding, sizeof (padding));
+ g_debug ("padding:%d", padding);
+ }
+
+ /* Add the length value */
+ length = GUINT32_TO_LE (utf16_bytes);
+ g_byte_array_append (builder->fixed_buffer, (guint8 *)&length, sizeof (length));
+
+ /* And finally, the string itself to the variable buffer */
+ if (utf16_bytes) {
+ /* For BE systems, convert from BE to LE */
+ if (G_BYTE_ORDER == G_BIG_ENDIAN) {
+ guint i;
+
+ for (i = 0; i < (utf16_bytes / 2); i++)
+ utf16[i] = GUINT16_TO_LE (utf16[i]);
+ }
+ g_byte_array_append (builder->variable_buffer, (const guint8 *)utf16, (guint)utf16_bytes);
+ bytearray_apply_padding (builder->variable_buffer, &utf16_bytes);
+ }
+ g_free (utf16);
+}
+
+void
_mbim_struct_builder_append_string_array (MbimStructBuilder *builder,
const gchar *const *values,
guint32 n_values)
diff --git a/src/mbimcli/mbimcli-basic-connect.c b/src/mbimcli/mbimcli-basic-connect.c
index b9e925e..0116411 100644
--- a/src/mbimcli/mbimcli-basic-connect.c
+++ b/src/mbimcli/mbimcli-basic-connect.c
@@ -880,14 +880,16 @@ connect_ready (MbimDevice *device,
GAsyncResult *res,
gpointer user_data)
{
- g_autoptr(MbimMessage) response = NULL;
- g_autoptr(GError) error = NULL;
- guint32 session_id;
- MbimActivationState activation_state;
- MbimVoiceCallState voice_call_state;
- MbimContextIpType ip_type;
- const MbimUuid *context_type;
- guint32 nw_error;
+ g_autoptr(MbimMessage) response = NULL;
+ g_autoptr(GError) error = NULL;
+ guint32 session_id;
+ MbimActivationState activation_state;
+ MbimVoiceCallState voice_call_state;
+ MbimContextIpType ip_type;
+ MbimAccessMediaType media_type;
+ MbimConnectAccessString *access_string;
+ const MbimUuid *context_type;
+ guint32 nw_error;
response = mbim_device_command_finish (device, res, &error);
if (!response || !mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error)) {
@@ -896,18 +898,36 @@ connect_ready (MbimDevice *device,
return;
}
- if (!mbim_message_connect_response_parse (
- response,
- &session_id,
- &activation_state,
- &voice_call_state,
- &ip_type,
- &context_type,
- &nw_error,
- &error)) {
- g_printerr ("error: couldn't parse response message: %s\n", error->message);
- shutdown (FALSE);
- return;
+ if (mbim_device_check_ms_mbimex_version (device, 3, 0)) {
+ if (!mbim_message_ms_basic_connect_v3_connect_response_parse (
+ response,
+ &session_id,
+ &activation_state,
+ &voice_call_state,
+ &ip_type,
+ &context_type,
+ &nw_error,
+ &media_type,
+ &access_string,
+ &error)) {
+ g_printerr ("error: couldn't parse response message: %s\n", error->message);
+ shutdown (FALSE);
+ return;
+ }
+ } else {
+ if (!mbim_message_connect_response_parse (
+ response,
+ &session_id,
+ &activation_state,
+ &voice_call_state,
+ &ip_type,
+ &context_type,
+ &nw_error,
+ &error)) {
+ g_printerr ("error: couldn't parse response message: %s\n", error->message);
+ shutdown (FALSE);
+ return;
+ }
}
switch (GPOINTER_TO_UINT (user_data)) {
@@ -938,6 +958,13 @@ connect_ready (MbimDevice *device,
VALIDATE_UNKNOWN (mbim_context_type_get_string (mbim_uuid_to_context_type (context_type))),
VALIDATE_UNKNOWN (mbim_nw_error_get_string (nw_error)));
+ if (mbim_device_check_ms_mbimex_version (device, 3, 0)) {
+ g_print ("\tAccess media type: '%s'\n"
+ "\t Access string: '%s'\n",
+ VALIDATE_UNKNOWN (mbim_access_media_type_get_string (media_type)),
+ access_string->data);
+ }
+
if (GPOINTER_TO_UINT (user_data) == CONNECT) {
ip_configuration_query (device, NULL, session_id);
return;
@@ -1033,14 +1060,15 @@ connect_session_id_parse (const gchar *str,
}
typedef struct {
- guint32 session_id;
- gchar *access_string;
- MbimAuthProtocol auth_protocol;
- gchar *username;
- gchar *password;
- MbimContextIpType ip_type;
- MbimCompression compression;
- MbimContextType context_type;
+ guint32 session_id;
+ gchar *access_string;
+ MbimAuthProtocol auth_protocol;
+ gchar *username;
+ gchar *password;
+ MbimContextIpType ip_type;
+ MbimCompression compression;
+ MbimContextType context_type;
+ MbimAccessMediaType media_type;
} ConnectActivateProperties;
static void
@@ -1110,6 +1138,12 @@ connect_activate_properties_handle (const gchar *key,
"unknown context-type: '%s'", value);
return FALSE;
}
+ } else if (g_ascii_strcasecmp (key, "media-type") == 0) {
+ if (!mbimcli_read_access_media_type_from_string (value, &props->media_type)) {
+ g_set_error (error, MBIM_CORE_ERROR, MBIM_CORE_ERROR_INVALID_ARGS,
+ "unknown media-type: '%s'", value);
+ return FALSE;
+ }
} else {
g_set_error (error, MBIM_CORE_ERROR, MBIM_CORE_ERROR_FAILED,
"unrecognized option '%s'", key);
@@ -1121,7 +1155,8 @@ connect_activate_properties_handle (const gchar *key,
static gboolean
set_connect_activate_parse (const gchar *str,
- ConnectActivateProperties *props)
+ ConnectActivateProperties *props,
+ MbimDevice *device)
{
g_auto(GStrv) split = NULL;
g_autoptr(GError) error = NULL;
@@ -1142,10 +1177,17 @@ set_connect_activate_parse (const gchar *str,
g_printerr ("warning: positional input arguments format is deprecated, use key-value format instead\n");
split = g_strsplit (str, ",", -1);
- if (g_strv_length (split) > 4) {
- g_printerr ("error: couldn't parse input string, too many arguments\n");
- return FALSE;
- }
+ if (mbim_device_check_ms_mbimex_version (device, 3, 0)) {
+ if (g_strv_length (split) > 5) {
+ g_printerr ("error: couldn't parse input string, too many arguments\n");
+ return FALSE;
+ }
+ } else {
+ if (g_strv_length (split) > 4) {
+ g_printerr ("error: couldn't parse input string, too many arguments\n");
+ return FALSE;
+ }
+ }
if (g_strv_length (split) > 0) {
/* APN */
@@ -1163,6 +1205,14 @@ set_connect_activate_parse (const gchar *str,
/* Password */
props->password = g_strdup (split[3]);
}
+ if (mbim_device_check_ms_mbimex_version (device, 3, 0)) {
+ if (split[4]) {
+ if (!mbimcli_read_access_media_type_from_string (split[4], &props->media_type)) {
+ g_printerr ("error: couldn't parse input string, unknown media type '%s'\n", split[4]);
+ return FALSE;
+ }
+ }
+ }
}
}
@@ -2147,13 +2197,18 @@ mbimcli_basic_connect_run (MbimDevice *device,
return;
}
- request = mbim_message_connect_query_new (session_id,
- MBIM_ACTIVATION_STATE_UNKNOWN,
- MBIM_VOICE_CALL_STATE_NONE,
- MBIM_CONTEXT_IP_TYPE_DEFAULT,
- mbim_uuid_from_context_type (MBIM_CONTEXT_TYPE_INTERNET),
- 0,
- &error);
+ if (mbim_device_check_ms_mbimex_version (device, 3, 0)) {
+ request = mbim_message_ms_basic_connect_v3_connect_query_new (session_id,
+ &error);
+ } else {
+ request = mbim_message_connect_query_new (session_id,
+ MBIM_ACTIVATION_STATE_UNKNOWN,
+ MBIM_VOICE_CALL_STATE_NONE,
+ MBIM_CONTEXT_IP_TYPE_DEFAULT,
+ mbim_uuid_from_context_type (MBIM_CONTEXT_TYPE_INTERNET),
+ 0,
+ &error);
+ }
if (!request) {
g_printerr ("error: couldn't create request: %s\n", error->message);
shutdown (FALSE);
@@ -2180,23 +2235,51 @@ mbimcli_basic_connect_run (MbimDevice *device,
.ip_type = MBIM_CONTEXT_IP_TYPE_DEFAULT,
.compression = MBIM_COMPRESSION_NONE,
.context_type = MBIM_CONTEXT_TYPE_INTERNET,
- };
+ .media_type = MBIM_ACCESS_MEDIA_TYPE_UNKNOWN,
+ };
+ MbimConnectAccessString *access_string_v3 = NULL;
+ MbimConnectUserName *username_v3 = NULL;
+ MbimConnectPassword *password_v3 = NULL;
- if (!set_connect_activate_parse (set_connect_activate_str, &props)) {
+ if (!set_connect_activate_parse (set_connect_activate_str, &props, device)) {
shutdown (FALSE);
return;
}
- request = mbim_message_connect_set_new (props.session_id,
- MBIM_ACTIVATION_COMMAND_ACTIVATE,
- props.access_string,
- props.username,
- props.password,
- props.compression,
- props.auth_protocol,
- props.ip_type,
- mbim_uuid_from_context_type (props.context_type),
- &error);
+ if (mbim_device_check_ms_mbimex_version (device, 3, 0)) {
+ access_string_v3 = g_new0 (MbimConnectAccessString, 1);
+ username_v3 = g_new0 (MbimConnectUserName, 1);
+ password_v3 = g_new0 (MbimConnectPassword, 1);
+ access_string_v3->type = 10;
+ username_v3->type = 10;
+ password_v3->type = 10;
+ access_string_v3->data = props.access_string;
+ username_v3->data = props.username;
+ password_v3->data = props.password;
+ g_debug ("acstr %s, username %s, password %s, media %s, auth %s", access_string_v3->data, username_v3->data, password_v3->data, mbim_access_media_type_get_string(props.media_type), mbim_auth_protocol_get_string(props.auth_protocol));
+ request = mbim_message_ms_basic_connect_v3_connect_set_new (props.session_id,
+ MBIM_ACTIVATION_COMMAND_ACTIVATE,
+ props.compression,
+ props.auth_protocol,
+ props.ip_type,
+ mbim_uuid_from_context_type (props.context_type),
+ props.media_type,
+ access_string_v3,
+ username_v3,
+ password_v3,
+ &error);
+ } else {
+ request = mbim_message_connect_set_new (props.session_id,
+ MBIM_ACTIVATION_COMMAND_ACTIVATE,
+ props.access_string,
+ props.username,
+ props.password,
+ props.compression,
+ props.auth_protocol,
+ props.ip_type,
+ mbim_uuid_from_context_type (props.context_type),
+ &error);
+ }
if (!request) {
g_printerr ("error: couldn't create request: %s\n", error->message);
@@ -2237,16 +2320,31 @@ mbimcli_basic_connect_run (MbimDevice *device,
return;
}
- request = mbim_message_connect_set_new (session_id,
- MBIM_ACTIVATION_COMMAND_DEACTIVATE,
- NULL,
- NULL,
- NULL,
- MBIM_COMPRESSION_NONE,
- MBIM_AUTH_PROTOCOL_NONE,
- MBIM_CONTEXT_IP_TYPE_DEFAULT,
- mbim_uuid_from_context_type (MBIM_CONTEXT_TYPE_INTERNET),
- &error);
+ if (mbim_device_check_ms_mbimex_version (device, 3, 0)) {
+ request = mbim_message_ms_basic_connect_v3_connect_set_new (session_id,
+ MBIM_ACTIVATION_COMMAND_DEACTIVATE,
+ MBIM_COMPRESSION_NONE,
+ MBIM_AUTH_PROTOCOL_NONE,
+ MBIM_CONTEXT_IP_TYPE_DEFAULT,
+ mbim_uuid_from_context_type (MBIM_CONTEXT_TYPE_INTERNET),
+ MBIM_ACCESS_MEDIA_TYPE_UNKNOWN,
+ NULL,
+ NULL,
+ NULL,
+ &error);
+ } else {
+ request = mbim_message_connect_set_new (session_id,
+ MBIM_ACTIVATION_COMMAND_DEACTIVATE,
+ NULL,
+ NULL,
+ NULL,
+ MBIM_COMPRESSION_NONE,
+ MBIM_AUTH_PROTOCOL_NONE,
+ MBIM_CONTEXT_IP_TYPE_DEFAULT,
+ mbim_uuid_from_context_type (MBIM_CONTEXT_TYPE_INTERNET),
+ &error);
+ }
+
if (!request) {
g_printerr ("error: couldn't create request: %s\n", error->message);
shutdown (FALSE);
diff --git a/src/mbimcli/mbimcli-helpers.h b/src/mbimcli/mbimcli-helpers.h
index 925d4eb..8158c31 100644
--- a/src/mbimcli/mbimcli-helpers.h
+++ b/src/mbimcli/mbimcli-helpers.h
@@ -58,7 +58,8 @@ gboolean mbimcli_parse_sar_config_state_array (const gchar *str,
MBIMCLI_ENUM_LIST_ITEM (MbimMicoMode, mico_mode, "mico mode") \
MBIMCLI_ENUM_LIST_ITEM (MbimDrxCycle, drx_cycle, "drx cycle") \
MBIMCLI_ENUM_LIST_ITEM (MbimLadnInfo, ladn_info, "ladn info") \
- MBIMCLI_ENUM_LIST_ITEM (MbimDefaultPduActivationHint, default_pdu_activation_hint, "default pdu activation hint")
+ MBIMCLI_ENUM_LIST_ITEM (MbimDefaultPduActivationHint, default_pdu_activation_hint, "default pdu activation hint") \
+ MBIMCLI_ENUM_LIST_ITEM (MbimAccessMediaType, access_media_type, "access media type")
#define MBIMCLI_ENUM_LIST_ITEM(TYPE,TYPE_UNDERSCORE,DESCR) \
gboolean mbimcli_read_## TYPE_UNDERSCORE ##_from_string (const gchar *str, TYPE *out);