[PATCH v5 06/10] mbimmodem: sim: add support for querying ICCID This implements the required functions to query file info and read file info from the modem. Currently the other file IDs haven't been implemented, but they will be tackled later.

Muhammad Asif <[email protected]> Thu, 27 Nov 2025 22:49:40 +0500
Newsgroups dev.linux.lists.ofono
Message-ID <[email protected]>
---
 drivers/mbimmodem/sim.c | 45 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 45 insertions(+)

diff --git a/drivers/mbimmodem/sim.c b/drivers/mbimmodem/sim.c
index 1046c535..c74967d5 100644
--- a/drivers/mbimmodem/sim.c
+++ b/drivers/mbimmodem/sim.c
@@ -18,6 +18,9 @@
 #include <ofono/modem.h>
 #include <ofono/sim.h>
=20
+#include <glib.h>
+#include "simutil.h"
+
 #include "drivers/mbimmodem/mbim.h"
 #include "drivers/mbimmodem/mbim-message.h"
 #include "drivers/mbimmodem/mbimmodem.h"
@@ -76,6 +79,45 @@ static void mbim_read_imsi(struct ofono_sim *sim,
 =09CALLBACK_WITH_SUCCESS(cb, sd->imsi, user_data);
 }
=20
+static void mbim_read_file_info(struct ofono_sim *sim,
+=09=09=09=09=09int fileid, const unsigned char *path,
+=09=09=09=09=09unsigned int path_len,
+=09=09=09=09=09ofono_sim_file_info_cb_t cb, void *user_data)
+{
+=09unsigned char access[3] =3D {0x0f, 0xff, 0xff};
+
+=09switch (fileid) {
+=09case SIM_EF_ICCID_FILEID:
+=09=09CALLBACK_WITH_SUCCESS(cb, 10, 0, 0, access, 1, user_data);
+=09=09break;
+=09default:
+=09=09CALLBACK_WITH_FAILURE(cb, -1, -1, -1, NULL, 0, user_data);
+=09=09break;
+=09}
+}
+
+static void mbim_read_file_transparent(struct ofono_sim *sim,
+=09=09=09=09=09int fileid,=09int start, int length,
+=09=09=09=09=09const unsigned char *path, unsigned int path_len,
+=09=09=09=09=09ofono_sim_read_cb_t cb, void *user_data)
+{
+=09struct sim_data *sd =3D ofono_sim_get_data(sim);
+=09unsigned char iccid[10];
+=09int iccid_len, len =3D strlen(sd->imsi);
+
+=09sim_encode_bcd_number(sd->iccid, iccid);
+=09iccid_len =3D len / 2;
+
+=09switch (fileid) {
+=09case SIM_EF_ICCID_FILEID:
+=09=09CALLBACK_WITH_SUCCESS(cb, iccid, iccid_len, user_data);
+=09=09break;
+=09default:
+=09=09CALLBACK_WITH_FAILURE(cb, NULL, 0, user_data);
+=09=09break;
+=09}
+}
+
 static enum ofono_sim_password_type mbim_pin_type_to_sim_password(
 =09=09=09=09=09=09=09uint32_t pin_type)
 {
@@ -457,6 +499,7 @@ static void mbim_subscriber_ready_status_cb(struct mbim=
_message *message,
 =09sd->iccid =3D iccid;
 =09sd->imsi =3D imsi;
=20
+=09DBG("Got ICCID! %s", iccid);
 =09if (!mbim_device_register(sd->device, SIM_GROUP,
 =09=09=09=09=09mbim_uuid_basic_connect,
 =09=09=09=09=09MBIM_CID_SUBSCRIBER_READY_STATUS,
@@ -520,6 +563,8 @@ static void mbim_sim_remove(struct ofono_sim *sim)
 static const struct ofono_sim_driver driver =3D {
 =09.probe=09=09=09=3D mbim_sim_probe,
 =09.remove=09=09=09=3D mbim_sim_remove,
+=09.read_file_info=09=3D mbim_read_file_info,
+=09.read_file_transparent=09=3D mbim_read_file_transparent,
 =09.read_imsi=09=09=3D mbim_read_imsi,
 =09.query_passwd_state=09=3D mbim_pin_query,
 =09.query_pin_retries=09=3D mbim_pin_retries_query,
--=20
2.52.0