diff options
author | Rukun Mao <rmao@google.com> | 2023-08-11 00:17:06 +0000 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2023-10-11 14:01:33 +0000 |
commit | b7433b4c1499dbdbd7eac10a4ff2111fd4fdd6f4 (patch) | |
tree | 0395e2983232bd293021a6209aeab02b0946fd99 /src/mm-iface-modem.c | |
parent | 4fdda13c4eef051a6f3ffcddbf0c1fc9a67f1271 (diff) |
iface-modem: new logic to detect SIM swap with explicit IMSI/ICCID query
This improves SIM hot swap check process, and it can help avoid unnecessary
modem reprobe during suspend-resume without SIM inserted.
The changes in this CL implemented the new logic ONLY for MBIM, and the
new logic has not been implemented for QMI and AT yet. Thus, we keep the
legacy `mm_iface_modem_check_for_sim_swap()' till the new logic for QMI
and AT has been implemented.
Diffstat (limited to 'src/mm-iface-modem.c')
-rw-r--r-- | src/mm-iface-modem.c | 92 |
1 files changed, 74 insertions, 18 deletions
diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c index 54063c47..cf79fd10 100644 --- a/src/mm-iface-modem.c +++ b/src/mm-iface-modem.c @@ -141,6 +141,60 @@ mm_iface_modem_check_for_sim_swap_finish (MMIfaceModem *self, } static void +check_basic_sim_details_ready (MMIfaceModem *self, + GAsyncResult *res, + GTask *task) +{ + g_autoptr(MMBaseSim) sim = NULL; + GError *error = NULL; + const gchar *old_iccid = NULL; + const gchar *old_imsi = NULL; + g_autofree gchar *current_iccid = NULL; + g_autofree gchar *current_imsi = NULL; + gboolean sim_inserted; + + if (!MM_IFACE_MODEM_GET_INTERFACE (self)->check_basic_sim_details_finish ( + self, res, &sim_inserted, ¤t_iccid, ¤t_imsi, &error)) { + mm_obj_warn (self, "SIM details check failed: %s", error->message); + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + g_object_get (self, MM_IFACE_MODEM_SIM, &sim, NULL); + if (sim) { + old_iccid = mm_gdbus_sim_get_sim_identifier (MM_GDBUS_SIM (sim)); + old_imsi = mm_gdbus_sim_get_imsi (MM_GDBUS_SIM (sim)); + } + + if (!sim && !sim_inserted) { + mm_obj_info (self, "No SIM inserted before and after"); + } else if (sim && !sim_inserted) { + mm_obj_info (self, "SIM removed"); + mm_iface_modem_process_sim_event (self); + } else if (!sim && sim_inserted) { + mm_obj_info (self, "SIM inserted"); + mm_iface_modem_process_sim_event (self); + } else if ((g_strcmp0 (current_iccid, old_iccid) != 0) || + (g_strcmp0 (current_imsi, old_imsi) != 0)) { + mm_obj_info (self, "new SIM detected"); + mm_obj_info (self, "ICCID: %s -> %s", + mm_log_str_personal_info (old_iccid), + mm_log_str_personal_info (current_iccid)); + mm_obj_info (self, "IMSI: %s -> %s", + mm_log_str_personal_info (old_imsi), + mm_log_str_personal_info (current_imsi)); + mm_iface_modem_process_sim_event (self); + } else { + mm_obj_info (self, "SIM not changed. ICCID: %s, IMSI: %s", + mm_log_str_personal_info (current_iccid), + mm_log_str_personal_info (current_imsi)); + } + g_task_return_boolean (task, TRUE); + g_object_unref (task); +} + +static void explicit_check_for_sim_swap_ready (MMIfaceModem *self, GAsyncResult *res, GTask *task) @@ -159,8 +213,6 @@ explicit_check_for_sim_swap_ready (MMIfaceModem *self, void mm_iface_modem_check_for_sim_swap (MMIfaceModem *self, - const gchar *iccid, - const gchar *imsi, GAsyncReadyCallback callback, gpointer user_data) { @@ -168,21 +220,29 @@ mm_iface_modem_check_for_sim_swap (MMIfaceModem *self, task = g_task_new (self, NULL, callback, user_data); - if (!MM_IFACE_MODEM_GET_INTERFACE (self)->check_for_sim_swap || - !MM_IFACE_MODEM_GET_INTERFACE (self)->check_for_sim_swap_finish) { - mm_obj_info (self, "checking for SIM swap ignored: not implemented"); - g_task_return_boolean (task, TRUE); - g_object_unref (task); + if (MM_IFACE_MODEM_GET_INTERFACE (self)->check_basic_sim_details && + MM_IFACE_MODEM_GET_INTERFACE (self)->check_basic_sim_details_finish) { + mm_obj_info (self, "started checking for basic SIM details..."); + MM_IFACE_MODEM_GET_INTERFACE (self)->check_basic_sim_details ( + self, + (GAsyncReadyCallback)check_basic_sim_details_ready, + task); return; } - mm_obj_info (self, "started checking for SIM swap..."); - MM_IFACE_MODEM_GET_INTERFACE (self)->check_for_sim_swap ( - self, - iccid, - imsi, - (GAsyncReadyCallback)explicit_check_for_sim_swap_ready, - task); + if (MM_IFACE_MODEM_GET_INTERFACE (self)->check_for_sim_swap && + MM_IFACE_MODEM_GET_INTERFACE (self)->check_for_sim_swap_finish) { + mm_obj_info (self, "started checking for SIM swap..."); + MM_IFACE_MODEM_GET_INTERFACE (self)->check_for_sim_swap ( + self, + (GAsyncReadyCallback)explicit_check_for_sim_swap_ready, + task); + return; + } + + mm_obj_info (self, "checking for SIM swap ignored: not implemented"); + g_task_return_boolean (task, TRUE); + g_object_unref (task); } /*****************************************************************************/ @@ -4421,8 +4481,6 @@ interface_enabling_step (GTask *task) MM_IFACE_MODEM_GET_INTERFACE (self)->check_for_sim_swap_finish) { MM_IFACE_MODEM_GET_INTERFACE (self)->check_for_sim_swap ( self, - NULL, - NULL, (GAsyncReadyCallback)check_for_sim_swap_ready, task); return; @@ -4618,8 +4676,6 @@ interface_syncing_step (GTask *task) */ mm_iface_modem_check_for_sim_swap ( self, - NULL, - NULL, (GAsyncReadyCallback)sync_detect_sim_swap_ready, task); return; |