[PATCH v7 06/10] mbimmodem: sim: add support for querying ICCID

Muhammad Asif <[email protected]> Fri, 28 Nov 2025 22:36:52 +0500
Newsgroups dev.linux.lists.ofono
Message-ID <[email protected]>
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.
---
 drivers/mbimmodem/sim.c | 45 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 45 insertions(+)

diff --git a/drivers/mbimmodem/sim.c b/drivers/mbimmodem/sim.c
index 9df34121..15b5c91c 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=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