diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2021-11-21 16:04:57 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2021-12-11 13:13:33 +0100 |
commit | 2cf8b7858e0e8c70fa64f2bf10e02968ee001ad3 (patch) | |
tree | 067c1de620250459db9784818b97692f9195c9e5 /src | |
parent | 3382e421ccc3ba02d5d78a8e86b179981c457d55 (diff) |
broadband-modem-mbim,bearer-mbim: support packet service from MBIMEx v3.0
Whenever MBIMEx v3.0 is enabled, the logic should create requests and
parse responses using the updated format.
Based on an initial implementation by Som_SP <somashekhar.puttagangaiah@intel.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-bearer-mbim.c | 28 | ||||
-rw-r--r-- | src/mm-broadband-modem-mbim.c | 59 | ||||
-rw-r--r-- | src/mm-modem-helpers-mbim.c | 21 | ||||
-rw-r--r-- | src/mm-modem-helpers-mbim.h | 3 |
4 files changed, 100 insertions, 11 deletions
diff --git a/src/mm-bearer-mbim.c b/src/mm-bearer-mbim.c index 0ff75801..4f5bba26 100644 --- a/src/mm-bearer-mbim.c +++ b/src/mm-bearer-mbim.c @@ -858,7 +858,9 @@ packet_service_set_ready (MbimDevice *device, g_autoptr(MbimMessage) response = NULL; guint32 nw_error; MbimPacketServiceState packet_service_state; - MbimDataClass data_class; + MbimDataClass data_class = 0; + MbimDataClassV3 data_class_v3 = 0; + MbimDataSubclass data_subclass = 0; guint64 uplink_speed = 0; guint64 downlink_speed = 0; MbimFrequencyRange frequency_range = MBIM_FREQUENCY_RANGE_UNKNOWN; @@ -872,7 +874,19 @@ packet_service_set_ready (MbimDevice *device, error->code == MBIM_STATUS_ERROR_FAILURE)) { g_autoptr(GError) inner_error = NULL; - if (mbim_device_check_ms_mbimex_version (device, 2, 0)) { + if (mbim_device_check_ms_mbimex_version (device, 3, 0)) { + mbim_message_ms_basic_connect_v3_packet_service_response_parse ( + response, + &nw_error, + &packet_service_state, + &data_class_v3, + &uplink_speed, + &downlink_speed, + &frequency_range, + &data_subclass, + NULL, /* tai */ + &inner_error); + } else if (mbim_device_check_ms_mbimex_version (device, 2, 0)) { mbim_message_ms_basic_connect_v2_packet_service_response_parse ( response, &nw_error, @@ -899,13 +913,21 @@ packet_service_set_ready (MbimDevice *device, error = mm_mobile_equipment_error_from_mbim_nw_error (nw_error, self); } else { g_autofree gchar *data_class_str = NULL; + g_autofree gchar *data_subclass_str = NULL; g_autofree gchar *frequency_range_str = NULL; - data_class_str = mbim_data_class_build_string_from_mask (data_class); + if (data_class_v3) { + data_class_str = mbim_data_class_v3_build_string_from_mask (data_class_v3); + data_subclass_str = mbim_data_subclass_build_string_from_mask (data_subclass); + } else + data_class_str = mbim_data_class_build_string_from_mask (data_class); + frequency_range_str = mbim_frequency_range_build_string_from_mask (frequency_range); mm_obj_dbg (self, "packet service update:"); mm_obj_dbg (self, " state: '%s'", mbim_packet_service_state_get_string (packet_service_state)); mm_obj_dbg (self, " data class: '%s'", data_class_str); + if (data_subclass_str) + mm_obj_dbg (self, " data subclass: '%s'", data_subclass_str); mm_obj_dbg (self, " uplink: '%" G_GUINT64_FORMAT "' bps", uplink_speed); mm_obj_dbg (self, " downlink: '%" G_GUINT64_FORMAT "' bps", downlink_speed); mm_obj_dbg (self, " frequency range: '%s'", frequency_range_str); diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c index 40e198c3..5efd06b8 100644 --- a/src/mm-broadband-modem-mbim.c +++ b/src/mm-broadband-modem-mbim.c @@ -4011,17 +4011,39 @@ basic_connect_notification_packet_service (MMBroadbandModemMbim *self, { guint32 nw_error; MbimPacketServiceState packet_service_state; - MbimDataClass data_class; + MbimDataClass data_class = 0; + MbimDataClassV3 data_class_v3 = 0; + MbimDataSubclass data_subclass = 0; guint64 uplink_speed; guint64 downlink_speed; MbimFrequencyRange frequency_range = MBIM_FREQUENCY_RANGE_UNKNOWN; g_autofree gchar *data_class_str = NULL; + g_autofree gchar *data_class_v3_str = NULL; + g_autofree gchar *data_subclass_str = NULL; g_autofree gchar *frequency_range_str = NULL; const gchar *nw_error_str; g_autoptr(GError) error = NULL; g_autoptr(MMBearerList) bearer_list = NULL; - if (mbim_device_check_ms_mbimex_version (device, 2, 0)) { + if (mbim_device_check_ms_mbimex_version (device, 3, 0)) { + if (!mbim_message_ms_basic_connect_v3_packet_service_notification_parse ( + notification, + &nw_error, + &packet_service_state, + &data_class_v3, + &uplink_speed, + &downlink_speed, + &frequency_range, + &data_subclass, + NULL, /* tai */ + &error)) { + mm_obj_warn (self, "failed processing MBIMEx v3.0 packet service indication: %s", error->message); + return; + } + mm_obj_dbg (self, "processed MBIMEx v3.0 packet service indication"); + data_class_v3_str = mbim_data_class_v3_build_string_from_mask (data_class_v3); + data_subclass_str = mbim_data_subclass_build_string_from_mask (data_subclass); + } else if (mbim_device_check_ms_mbimex_version (device, 2, 0)) { if (!mbim_message_ms_basic_connect_v2_packet_service_notification_parse ( notification, &nw_error, @@ -4034,7 +4056,8 @@ basic_connect_notification_packet_service (MMBroadbandModemMbim *self, mm_obj_warn (self, "failed processing MBIMEx v2.0 packet service indication: %s", error->message); return; } - mm_obj_dbg (self, "proccessed MBIMEx v2.0 packet service indication"); + mm_obj_dbg (self, "processed MBIMEx v2.0 packet service indication"); + data_class_str = mbim_data_class_build_string_from_mask (data_class); } else { if (!mbim_message_packet_service_notification_parse ( notification, @@ -4047,10 +4070,10 @@ basic_connect_notification_packet_service (MMBroadbandModemMbim *self, mm_obj_warn (self, "failed processing packet service indication: %s", error->message); return; } - mm_obj_dbg (self, "proccessed packet service indication"); + mm_obj_dbg (self, "processed packet service indication"); + data_class_str = mbim_data_class_build_string_from_mask (data_class); } - data_class_str = mbim_data_class_build_string_from_mask (data_class); frequency_range_str = mbim_frequency_range_build_string_from_mask (frequency_range); nw_error_str = mbim_nw_error_get_string (nw_error); @@ -4060,13 +4083,21 @@ basic_connect_notification_packet_service (MMBroadbandModemMbim *self, else mm_obj_dbg (self, " nw error: '0x%x'", nw_error); mm_obj_dbg (self, " state: '%s'", mbim_packet_service_state_get_string (packet_service_state)); - mm_obj_dbg (self, " data class: '%s'", data_class_str); + if (data_class_str) + mm_obj_dbg (self, " data class: '%s'", data_class_str); + else if (data_class_v3_str) + mm_obj_dbg (self, " data class: '%s'", data_class_v3_str); + if (data_subclass_str) + mm_obj_dbg (self, " data subclass: '%s'", data_subclass_str); mm_obj_dbg (self, " uplink: '%" G_GUINT64_FORMAT "' bps", uplink_speed); mm_obj_dbg (self, " downlink: '%" G_GUINT64_FORMAT "' bps", downlink_speed); mm_obj_dbg (self, " frequency range: '%s'", frequency_range_str); if (packet_service_state == MBIM_PACKET_SERVICE_STATE_ATTACHED) { - self->priv->highest_available_data_class = data_class; + if (data_class_v3) + self->priv->highest_available_data_class = mm_mbim_data_class_from_mbim_data_class_v3_and_subclass (data_class_v3, data_subclass); + else + self->priv->highest_available_data_class = data_class; } else if (packet_service_state == MBIM_PACKET_SERVICE_STATE_DETACHED) { self->priv->highest_available_data_class = 0; } @@ -7910,7 +7941,19 @@ packet_service_set_ready (MbimDevice *device, return; } - if (mbim_device_check_ms_mbimex_version (device, 2, 0)) { + if (mbim_device_check_ms_mbimex_version (device, 3, 0)) { + mbim_message_ms_basic_connect_v3_packet_service_response_parse ( + response, + NULL, /* &nw_error */ + &packet_service_state, + NULL, /* data_class_v3 */ + NULL, /* uplink_speed */ + NULL, /* downlink_speed */ + NULL, /* frequency_range */ + NULL, /* data_subclass */ + NULL, /* tai */ + &error); + } else if (mbim_device_check_ms_mbimex_version (device, 2, 0)) { mbim_message_ms_basic_connect_v2_packet_service_response_parse ( response, NULL, /* nw_error */ diff --git a/src/mm-modem-helpers-mbim.c b/src/mm-modem-helpers-mbim.c index c31310ae..f3747886 100644 --- a/src/mm-modem-helpers-mbim.c +++ b/src/mm-modem-helpers-mbim.c @@ -201,6 +201,27 @@ mm_mbim_data_class_from_modem_mode (MMModemMode modem_mode, return mask; } +MbimDataClass +mm_mbim_data_class_from_mbim_data_class_v3_and_subclass (MbimDataClassV3 data_class_v3, + MbimDataSubclass data_subclass) +{ + MbimDataClass data_class; + + data_class = data_class_v3 & ~(MBIM_DATA_CLASS_5G_NSA | MBIM_DATA_CLASS_5G_SA); + if (data_class_v3 & MBIM_DATA_CLASS_V3_5G) { + if (data_subclass & MBIM_DATA_SUBCLASS_5G_NR) + data_class |= MBIM_DATA_CLASS_5G_SA; + else if (data_subclass & (MBIM_DATA_SUBCLASS_5G_ENDC | + MBIM_DATA_SUBCLASS_5G_NEDC | + MBIM_DATA_SUBCLASS_5G_NGENDC)) + data_class |= (MBIM_DATA_CLASS_5G_NSA | MBIM_DATA_CLASS_LTE); + else if (data_subclass & MBIM_DATA_SUBCLASS_5G_ELTE) + data_class |= MBIM_DATA_CLASS_LTE; + } + + return data_class; +} + MMModemAccessTechnology mm_modem_access_technology_from_mbim_data_class (MbimDataClass data_class) { diff --git a/src/mm-modem-helpers-mbim.h b/src/mm-modem-helpers-mbim.h index 2c3d2bae..c950fb6d 100644 --- a/src/mm-modem-helpers-mbim.h +++ b/src/mm-modem-helpers-mbim.h @@ -35,6 +35,9 @@ MMModemLock mm_modem_lock_from_mbim_pin_type (MbimPinType pin_type); MMModem3gppRegistrationState mm_modem_3gpp_registration_state_from_mbim_register_state (MbimRegisterState state); +MbimDataClass mm_mbim_data_class_from_mbim_data_class_v3_and_subclass (MbimDataClassV3 data_class_v3, + MbimDataSubclass data_subclass); + MMModemMode mm_modem_mode_from_mbim_data_class (MbimDataClass data_class); MbimDataClass mm_mbim_data_class_from_modem_mode (MMModemMode modem_mode, |