diff options
author | Som_SP <somashekhar.puttagangaiah@intel.com> | 2021-10-01 19:36:19 +0530 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2021-10-12 22:27:12 +0200 |
commit | 8c781c81b1a18ba206dbc5df3595363f4f485c4c (patch) | |
tree | 80a897f4e1060c507e4bbd1a41dec4f94215d10f | |
parent | 01b81154b9e272ff06e1cfa1a75c7f6b91eb97da (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.py | 27 | ||||
-rw-r--r-- | data/mbim-service-ms-basic-connect-v3.json | 104 | ||||
-rw-r--r-- | src/libmbim-glib/mbim-enums.h | 19 | ||||
-rw-r--r-- | src/libmbim-glib/mbim-message-private.h | 8 | ||||
-rw-r--r-- | src/libmbim-glib/mbim-message.c | 127 | ||||
-rw-r--r-- | src/mbimcli/mbimcli-basic-connect.c | 222 | ||||
-rw-r--r-- | src/mbimcli/mbimcli-helpers.h | 3 |
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); |