From 11ba859da3e5439426c1991820146f8219d99bd8 Mon Sep 17 00:00:00 2001 From: Som_SP Date: Sat, 25 Sep 2021 22:25:14 +0530 Subject: MBIMEx 3.0: implement "packet service v3" for SA This command is an extension for the existing MBIM_CID_PACKET_SERVICE defined in the MBIM specification revision 2.0. --- data/mbim-service-ms-basic-connect-v3.json | 59 ++++++++++++++++++- src/mbimcli/mbimcli-basic-connect.c | 93 +++++++++++++++++++++++------- 2 files changed, 131 insertions(+), 21 deletions(-) diff --git a/data/mbim-service-ms-basic-connect-v3.json b/data/mbim-service-ms-basic-connect-v3.json index 8fb3417..90e276f 100644 --- a/data/mbim-service-ms-basic-connect-v3.json +++ b/data/mbim-service-ms-basic-connect-v3.json @@ -46,5 +46,62 @@ "format" : "guint32" }, { "name" : "TelephoneNumbers", "format" : "string-array", - "array-size-field" : "TelephoneNumbersCount" } ] } + "array-size-field" : "TelephoneNumbersCount" } ] }, + + // ********************************************************************************* + { "name" : "MbimTAI", + "type" : "Struct", + "since" : "1.28", + "contents" : [ { "name" : "Plmn", + "format" : "guint32" }, + { "name" : "Tac", + "format" : "guint32" } ] }, + + { "name" : "Packet Service", + "type" : "Command", + "since" : "1.28", + // set same as in v1 + // query same as in v1 + "response" : [ { "name" : "NwError", + "format" : "guint32" }, + { "name" : "PacketServiceState", + "format" : "guint32", + "public-format" : "MbimPacketServiceState" }, + { "name" : "HighestAvailableDataClass", + "format" : "guint32", + "public-format" : "MbimDataClassV2" }, + { "name" : "UplinkSpeed", + "format" : "guint64" }, + { "name" : "DownlinkSpeed", + "format" : "guint64" }, + { "name" : "FrequencyRange", + "format" : "guint32", + "public-format" : "MbimFrequencyRange" }, + { "name" : "DataSubclass", + "format" : "guint32", + "public-format" : "MbimDataSubclass" }, + { "name" : "TAI", + "format" : "struct", + "struct-type" : "MbimTAI" } ], + "notification" : [ { "name" : "NwError", + "format" : "guint32" }, + { "name" : "PacketServiceState", + "format" : "guint32", + "public-format" : "MbimPacketServiceState" }, + { "name" : "HighestAvailableDataClass", + "format" : "guint32", + "public-format" : "MbimDataClassV2" }, + { "name" : "UplinkSpeed", + "format" : "guint64" }, + { "name" : "DownlinkSpeed", + "format" : "guint64" }, + { "name" : "FrequencyRange", + "format" : "guint32", + "public-format" : "MbimFrequencyRange" }, + { "name" : "DataSubclass", + "format" : "guint32", + "public-format" : "MbimDataSubclass" }, + { "name" : "TAI", + "format" : "struct", + "struct-type" : "MbimTAI" } ] } ] diff --git a/src/mbimcli/mbimcli-basic-connect.c b/src/mbimcli/mbimcli-basic-connect.c index 88f8e35..1e6105b 100644 --- a/src/mbimcli/mbimcli-basic-connect.c +++ b/src/mbimcli/mbimcli-basic-connect.c @@ -1575,10 +1575,12 @@ packet_service_ready (MbimDevice *device, guint32 nw_error; MbimPacketServiceState packet_service_state; MbimDataClass highest_available_data_class; - g_autofree gchar *highest_available_data_class_str = NULL; + MbimDataClassV2 highest_available_data_class_v2; guint64 uplink_speed; guint64 downlink_speed; MbimFrequencyRange frequency_range; + MbimDataSubclass data_subclass; + MbimTAI *tai = NULL; response = mbim_device_command_finish (device, res, &error); if (!response || !mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error)) { @@ -1587,8 +1589,26 @@ packet_service_ready (MbimDevice *device, return; } + /* MBIMEx 3.0 support */ + if (mbim_device_check_ms_mbimex_version (device, 3, 0)) { + if (!mbim_message_ms_basic_connect_v3_packet_service_response_parse (response, + &nw_error, + &packet_service_state, + &highest_available_data_class_v2, + &uplink_speed, + &downlink_speed, + &frequency_range, + &data_subclass, + &tai, + &error)) { + g_printerr ("error: couldn't parse response message: %s\n", error->message); + shutdown (FALSE); + return; + } + g_debug ("Successfully parsed response as MBIM 3.0 Packet Service"); + } /* MBIMEx 2.0 support */ - if (mbim_device_check_ms_mbimex_version (device, 2, 0)) { + else if (mbim_device_check_ms_mbimex_version (device, 2, 0)) { if (!mbim_message_ms_basic_connect_v2_packet_service_response_parse (response, &nw_error, &packet_service_state, @@ -1632,27 +1652,60 @@ packet_service_ready (MbimDevice *device, break; } - highest_available_data_class_str = mbim_data_class_build_string_from_mask (highest_available_data_class); - - g_print ("[%s] Packet service status:\n" - "\t Network error: '%s'\n" - "\t Packet service state: '%s'\n" - "\tAvailable data classes: '%s'\n" - "\t Uplink speed: '%" G_GUINT64_FORMAT " bps'\n" - "\t Downlink speed: '%" G_GUINT64_FORMAT " bps'\n", - mbim_device_get_path_display (device), - VALIDATE_UNKNOWN (mbim_nw_error_get_string (nw_error)), - VALIDATE_UNKNOWN (mbim_packet_service_state_get_string (packet_service_state)), - VALIDATE_UNKNOWN (highest_available_data_class_str), - uplink_speed, - downlink_speed); - - if (mbim_device_check_ms_mbimex_version (device, 2, 0)) { + if (mbim_device_check_ms_mbimex_version (device, 3, 0)) { g_autofree gchar *frequency_range_str = NULL; + g_autofree gchar *data_subclass_str = NULL; + g_autofree gchar *highest_available_data_class_str = NULL; + data_subclass_str = mbim_data_subclass_build_string_from_mask (data_subclass); frequency_range_str = mbim_frequency_range_build_string_from_mask (frequency_range); - g_print ("\t Frequency range: '%s'\n", - VALIDATE_UNKNOWN (frequency_range_str)); + highest_available_data_class_str = mbim_data_class_v2_build_string_from_mask (highest_available_data_class_v2); + + g_print ("[%s] Packet service status:\n" + "\t Network error: '%s'\n" + "\t Packet service state: '%s'\n" + "\tAvailable data classes: '%s'\n" + "\t Uplink speed: '%" G_GUINT64_FORMAT " bps'\n" + "\t Downlink speed: '%" G_GUINT64_FORMAT " bps'\n" + "\t Frequency range: '%s'\n" + "\t Data sub class: '%s'\n" + "\t TAI PLMN: '%d'\n" + "\t TAI TAC: '%d'\n", + mbim_device_get_path_display (device), + VALIDATE_UNKNOWN (mbim_nw_error_get_string (nw_error)), + VALIDATE_UNKNOWN (mbim_packet_service_state_get_string (packet_service_state)), + VALIDATE_UNKNOWN (highest_available_data_class_str), + uplink_speed, + downlink_speed, + VALIDATE_UNKNOWN (frequency_range_str), + VALIDATE_UNKNOWN (data_subclass_str), + tai->plmn, + tai->tac); + } + else { + g_autofree gchar *highest_available_data_class_str = NULL; + + highest_available_data_class_str = mbim_data_class_build_string_from_mask (highest_available_data_class); + g_print ("[%s] Packet service status:\n" + "\t Network error: '%s'\n" + "\t Packet service state: '%s'\n" + "\tAvailable data classes: '%s'\n" + "\t Uplink speed: '%" G_GUINT64_FORMAT " bps'\n" + "\t Downlink speed: '%" G_GUINT64_FORMAT " bps'\n", + mbim_device_get_path_display (device), + VALIDATE_UNKNOWN (mbim_nw_error_get_string (nw_error)), + VALIDATE_UNKNOWN (mbim_packet_service_state_get_string (packet_service_state)), + VALIDATE_UNKNOWN (highest_available_data_class_str), + uplink_speed, + downlink_speed); + + if (mbim_device_check_ms_mbimex_version (device, 2, 0)) { + g_autofree gchar *frequency_range_str = NULL; + + frequency_range_str = mbim_frequency_range_build_string_from_mask (frequency_range); + g_print ("\t Frequency range: '%s'\n", + VALIDATE_UNKNOWN (frequency_range_str)); + } } shutdown (TRUE); -- cgit v1.2.3