diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2021-11-29 00:04:39 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2021-12-24 12:41:27 +0000 |
commit | 296cce0bbbb9024c52ef81aa8d93e866030a0dde (patch) | |
tree | 112858134ab544e02218f3abf484baf54f9b4cbf | |
parent | 61675e155511148a26064bd7ad24bf9f90abf857 (diff) |
broadband-modem-mbim: implement 5GNR registration settings loading
-rw-r--r-- | src/mm-broadband-modem-mbim.c | 86 | ||||
-rw-r--r-- | src/mm-modem-helpers-mbim.c | 39 | ||||
-rw-r--r-- | src/mm-modem-helpers-mbim.h | 3 |
3 files changed, 127 insertions, 1 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c index 5efd06b8..3cdd1b49 100644 --- a/src/mm-broadband-modem-mbim.c +++ b/src/mm-broadband-modem-mbim.c @@ -10,7 +10,7 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details: * - * Copyright (C) 2013 Aleksander Morgado <aleksander@gnu.org> + * Copyright (C) 2013-2021 Aleksander Morgado <aleksander@aleksander.es> */ #include <config.h> @@ -118,6 +118,7 @@ struct _MMBroadbandModemMbimPrivate { gboolean is_profile_management_supported; gboolean is_pco_supported; gboolean is_lte_attach_info_supported; + gboolean is_nr5g_registration_settings_supported; gboolean is_ussd_supported; gboolean is_atds_location_supported; gboolean is_atds_signal_supported; @@ -2628,6 +2629,9 @@ query_device_services_ready (MbimDevice *device, } else if (device_services[i]->cids[j] == MBIM_CID_MS_BASIC_CONNECT_EXTENSIONS_SLOT_INFO_STATUS) { mm_obj_dbg (self, "Slot info status is supported"); self->priv->is_slot_info_status_supported = TRUE; + } else if (device_services[i]->cids[j] == MBIM_CID_MS_BASIC_CONNECT_EXTENSIONS_REGISTRATION_PARAMETERS) { + mm_obj_dbg (self, "5GNR registration settings are supported"); + self->priv->is_nr5g_registration_settings_supported = TRUE; } } continue; @@ -3627,6 +3631,84 @@ modem_3gpp_set_initial_eps_bearer_settings (MMIfaceModem3gpp *_self, } /*****************************************************************************/ +/* 5GNR registration settings loading */ + +static MMNr5gRegistrationSettings * +modem_3gpp_load_nr5g_registration_settings_finish (MMIfaceModem3gpp *self, + GAsyncResult *res, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (res), error); +} + +static void +registration_parameters_query_ready (MbimDevice *device, + GAsyncResult *res, + GTask *task) +{ + GError *error = NULL; + MMNr5gRegistrationSettings *settings; + MbimMicoMode mico_mode = MBIM_MICO_MODE_DEFAULT; + MbimDrxCycle drx_cycle = MBIM_DRX_CYCLE_NOT_SPECIFIED; + g_autoptr(MbimMessage) response = NULL; + + response = mbim_device_command_finish (device, res, &error); + if (!response || + !mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error) || + !mbim_message_ms_basic_connect_extensions_v3_registration_parameters_response_parse ( + response, + &mico_mode, + &drx_cycle, + NULL, /* ladn info */ + NULL, /* default pdu activation hint */ + NULL, /* reregister if needed */ + NULL, /* unnamed ies */ + &error)) { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + settings = mm_nr5g_registration_settings_new (); + mm_nr5g_registration_settings_set_mico_mode (settings, mm_modem_3gpp_mico_mode_from_mbim_mico_mode (mico_mode)); + mm_nr5g_registration_settings_set_drx_cycle (settings, mm_modem_3gpp_drx_cycle_from_mbim_drx_cycle (drx_cycle)); + + g_task_return_pointer (task, settings, (GDestroyNotify) g_object_unref); + g_object_unref (task); +} + +static void +modem_3gpp_load_nr5g_registration_settings (MMIfaceModem3gpp *_self, + GAsyncReadyCallback callback, + gpointer user_data) +{ + MMBroadbandModemMbim *self = MM_BROADBAND_MODEM_MBIM (_self); + GTask *task; + MbimDevice *device; + g_autoptr(MbimMessage) message = NULL; + + if (!peek_device (self, &device, callback, user_data)) + return; + + task = g_task_new (self, NULL, callback, user_data); + + if (!self->priv->is_nr5g_registration_settings_supported) { + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED, + "5GNR registration settings are unsupported"); + g_object_unref (task); + return; + } + + message = mbim_message_ms_basic_connect_extensions_v3_registration_parameters_query_new (NULL); + mbim_device_command (device, + message, + 10, + NULL, + (GAsyncReadyCallback)registration_parameters_query_ready, + task); +} + +/*****************************************************************************/ /* Common unsolicited events setup and cleanup */ static void @@ -8247,6 +8329,8 @@ iface_modem_3gpp_init (MMIfaceModem3gpp *iface) iface->load_initial_eps_bearer_finish = modem_3gpp_load_initial_eps_bearer_finish; iface->load_initial_eps_bearer_settings = modem_3gpp_load_initial_eps_bearer_settings; iface->load_initial_eps_bearer_settings_finish = modem_3gpp_load_initial_eps_bearer_settings_finish; + iface->load_nr5g_registration_settings = modem_3gpp_load_nr5g_registration_settings; + iface->load_nr5g_registration_settings_finish = modem_3gpp_load_nr5g_registration_settings_finish; iface->set_initial_eps_bearer_settings = modem_3gpp_set_initial_eps_bearer_settings; iface->set_initial_eps_bearer_settings_finish = modem_3gpp_set_initial_eps_bearer_settings_finish; iface->run_registration_checks = modem_3gpp_run_registration_checks; diff --git a/src/mm-modem-helpers-mbim.c b/src/mm-modem-helpers-mbim.c index f3747886..563537ac 100644 --- a/src/mm-modem-helpers-mbim.c +++ b/src/mm-modem-helpers-mbim.c @@ -690,6 +690,45 @@ mm_signal_snr_from_coded_value (guint coded_value, /*****************************************************************************/ +MMModem3gppMicoMode +mm_modem_3gpp_mico_mode_from_mbim_mico_mode (MbimMicoMode mico_mode) +{ + switch (mico_mode) { + case MBIM_MICO_MODE_DISABLED: + return MM_MODEM_3GPP_MICO_MODE_DISABLED; + case MBIM_MICO_MODE_ENABLED: + return MM_MODEM_3GPP_MICO_MODE_ENABLED; + case MBIM_MICO_MODE_UNSUPPORTED: + return MM_MODEM_3GPP_MICO_MODE_UNSUPPORTED; + case MBIM_MICO_MODE_DEFAULT: + /* default expected only in set requests */ + default: + return MM_MODEM_3GPP_MICO_MODE_UNKNOWN; + } +} + +MMModem3gppDrxCycle +mm_modem_3gpp_drx_cycle_from_mbim_drx_cycle (MbimDrxCycle drx_cycle) +{ + switch (drx_cycle) { + case MBIM_DRX_CYCLE_NOT_SUPPORTED: + return MM_MODEM_3GPP_DRX_CYCLE_UNSUPPORTED; + case MBIM_DRX_CYCLE_32: + return MM_MODEM_3GPP_DRX_CYCLE_32; + case MBIM_DRX_CYCLE_64: + return MM_MODEM_3GPP_DRX_CYCLE_64; + case MBIM_DRX_CYCLE_128: + return MM_MODEM_3GPP_DRX_CYCLE_128; + case MBIM_DRX_CYCLE_256: + return MM_MODEM_3GPP_DRX_CYCLE_256; + case MBIM_DRX_CYCLE_NOT_SPECIFIED: + default: + return MM_MODEM_3GPP_DRX_CYCLE_UNKNOWN; + } +} + +/*****************************************************************************/ + MMSmsState mm_sms_state_from_mbim_message_status (MbimSmsStatus status) { diff --git a/src/mm-modem-helpers-mbim.h b/src/mm-modem-helpers-mbim.h index c950fb6d..da5d45dd 100644 --- a/src/mm-modem-helpers-mbim.h +++ b/src/mm-modem-helpers-mbim.h @@ -84,6 +84,9 @@ gboolean mm_signal_snr_from_coded_value (guint coded_value, gdouble *out_snr, GError **error); +MMModem3gppMicoMode mm_modem_3gpp_mico_mode_from_mbim_mico_mode (MbimMicoMode mico_mode); +MMModem3gppDrxCycle mm_modem_3gpp_drx_cycle_from_mbim_drx_cycle (MbimDrxCycle drx_cycle); + /*****************************************************************************/ /* MBIM/SMS to MM translations */ |