* [PATCH] qmi: sim: Implement query_facility_lock(LockedPins property)
@ 2024-11-17 11:04 Ivaylo Dimitrov
2024-11-18 16:43 ` Denis Kenzior
0 siblings, 1 reply; 3+ messages in thread
From: Ivaylo Dimitrov @ 2024-11-17 11:04 UTC (permalink / raw)
To: ofono; +Cc: denkenz, absicsz, merlijn, Ivaylo Dimitrov
---
drivers/qmimodem/sim.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 93 insertions(+)
diff --git a/drivers/qmimodem/sim.c b/drivers/qmimodem/sim.c
index 1fffae2..b1d8f22 100644
--- a/drivers/qmimodem/sim.c
+++ b/drivers/qmimodem/sim.c
@@ -41,6 +41,8 @@ struct sim_status {
uint8_t app_type;
uint8_t passwd_state;
int retries[OFONO_SIM_PASSWORD_INVALID];
+ uint8_t pin1_state;
+ uint8_t pin2_state;
};
struct sim_data {
@@ -52,6 +54,20 @@ struct sim_data {
struct l_timeout *retry_timer;
};
+struct query_locked_data {
+ enum ofono_sim_password_type passwd_type;
+};
+
+static inline void cb_user_data_unref(void *user_data)
+{
+ struct cb_data *cbd = user_data;
+
+ if (cbd->ref == 1 && cbd->user)
+ l_free(cbd->user);
+
+ cb_data_unref(user_data);
+}
+
static int create_fileid_data(uint8_t app_type, int fileid,
const unsigned char *path,
unsigned int path_len,
@@ -486,6 +502,9 @@ static bool get_card_status(const struct qmi_uim_slot_info *slot,
break;
}
+ sim_stat->pin1_state = info2->pin1_state;
+ sim_stat->pin2_state = info2->pin2_state;
+
sim_stat->retries[OFONO_SIM_PASSWORD_SIM_PIN] = info2->pin1_retries;
sim_stat->retries[OFONO_SIM_PASSWORD_SIM_PUK] = info2->puk1_retries;
@@ -752,6 +771,79 @@ error:
l_free(cbd);
}
+static void query_locked_cb(struct qmi_result *result, void *user_data)
+{
+ struct cb_data *cbd = user_data;
+ ofono_query_facility_lock_cb_t cb = cbd->cb;
+ struct query_locked_data *qld = cbd->user;
+ struct sim_status sim_stat;
+ uint8_t pin_state;
+ gboolean status;
+
+ DBG("");
+
+ if (handle_get_card_status_result(result, &sim_stat) !=
+ GET_CARD_STATUS_RESULT_OK) {
+ CALLBACK_WITH_FAILURE(cb, -1, cbd->data);
+ return;
+ }
+
+ if (qld->passwd_type == OFONO_SIM_PASSWORD_SIM_PIN)
+ pin_state = sim_stat.pin1_state;
+ else
+ pin_state = sim_stat.pin2_state;
+
+ switch (pin_state) {
+ case 1: /* Enabled and not verified */
+ case 2: /* Enabled and verified */
+ status = TRUE;
+ break;
+ case 0: /* Unknown */
+ case 3: /* Disabled */
+ case 4: /* Blocked */
+ case 5: /* Permanently blocked */
+ default:
+ status = FALSE;
+ break;
+ }
+
+ CALLBACK_WITH_SUCCESS(cb, status, cbd->data);
+}
+
+static void qmi_query_locked(struct ofono_sim *sim,
+ enum ofono_sim_password_type passwd_type,
+ ofono_query_facility_lock_cb_t cb, void *user_data)
+{
+ struct sim_data *data = ofono_sim_get_data(sim);
+ struct cb_data *cbd = cb_data_new(cb, user_data);
+ struct query_locked_data *qld;
+
+ DBG("");
+
+ switch (passwd_type) {
+ case OFONO_SIM_PASSWORD_SIM_PIN:
+ case OFONO_SIM_PASSWORD_SIM_PIN2:
+ break;
+ default:
+ CALLBACK_WITH_CME_ERROR(cb, 4, -1, cbd->data);
+ l_free(cbd);
+ return;
+ }
+
+ qld = l_new(struct query_locked_data, 1);
+ qld->passwd_type = passwd_type;
+ cbd->user = qld;
+
+ if (qmi_service_send(data->uim, QMI_UIM_GET_CARD_STATUS, NULL,
+ query_locked_cb, cbd, cb_user_data_unref) > 0)
+ return;
+
+ CALLBACK_WITH_FAILURE(cb, -1, cbd->data);
+
+ l_free(qld);
+ l_free(cbd);
+}
+
static void get_card_status_cb(struct qmi_result *result, void *user_data)
{
struct ofono_sim *sim = user_data;
@@ -894,6 +986,7 @@ static const struct ofono_sim_driver driver = {
.query_passwd_state = qmi_query_passwd_state,
.query_pin_retries = qmi_query_pin_retries,
.send_passwd = qmi_pin_send,
+ .query_facility_lock = qmi_query_locked,
};
OFONO_ATOM_DRIVER_BUILTIN(sim, qmimodem, &driver)
--
1.9.1
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH] qmi: sim: Implement query_facility_lock(LockedPins property)
2024-11-17 11:04 [PATCH] qmi: sim: Implement query_facility_lock(LockedPins property) Ivaylo Dimitrov
@ 2024-11-18 16:43 ` Denis Kenzior
2024-11-18 17:01 ` Ivaylo Dimitrov
0 siblings, 1 reply; 3+ messages in thread
From: Denis Kenzior @ 2024-11-18 16:43 UTC (permalink / raw)
To: Ivaylo Dimitrov, ofono; +Cc: absicsz, merlijn
Hi Ivo,
On 11/17/24 5:04 AM, Ivaylo Dimitrov wrote:
> ---
> drivers/qmimodem/sim.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 93 insertions(+)
>
> diff --git a/drivers/qmimodem/sim.c b/drivers/qmimodem/sim.c
> index 1fffae2..b1d8f22 100644
> --- a/drivers/qmimodem/sim.c
> +++ b/drivers/qmimodem/sim.c
> @@ -41,6 +41,8 @@ struct sim_status {
> uint8_t app_type;
> uint8_t passwd_state;
> int retries[OFONO_SIM_PASSWORD_INVALID];
> + uint8_t pin1_state;
> + uint8_t pin2_state;
> };
>
> struct sim_data {
> @@ -52,6 +54,20 @@ struct sim_data {
> struct l_timeout *retry_timer;
> };
>
> +struct query_locked_data {
> + enum ofono_sim_password_type passwd_type;
> +};
Why is this structure needed? Can't you simply stuff this into cb_data::user
using L_UINT_TO_PTR and L_PTR_TO_UINT?
> +
> +static inline void cb_user_data_unref(void *user_data)
> +{
> + struct cb_data *cbd = user_data;
> +
> + if (cbd->ref == 1 && cbd->user)
> + l_free(cbd->user);
> +
> + cb_data_unref(user_data);
> +}
> +
That way this could also be dropped
> static int create_fileid_data(uint8_t app_type, int fileid,
> const unsigned char *path,
> unsigned int path_len,
> @@ -486,6 +502,9 @@ static bool get_card_status(const struct qmi_uim_slot_info *slot,
> break;
> }
>
> + sim_stat->pin1_state = info2->pin1_state;
> + sim_stat->pin2_state = info2->pin2_state;
> +
> sim_stat->retries[OFONO_SIM_PASSWORD_SIM_PIN] = info2->pin1_retries;
> sim_stat->retries[OFONO_SIM_PASSWORD_SIM_PUK] = info2->puk1_retries;
>
> @@ -752,6 +771,79 @@ error:
> l_free(cbd);
> }
>
> +static void query_locked_cb(struct qmi_result *result, void *user_data)
> +{
> + struct cb_data *cbd = user_data;
> + ofono_query_facility_lock_cb_t cb = cbd->cb;
> + struct query_locked_data *qld = cbd->user;
> + struct sim_status sim_stat;
> + uint8_t pin_state;
> + gboolean status;
> +
> + DBG("");
> +
> + if (handle_get_card_status_result(result, &sim_stat) !=
> + GET_CARD_STATUS_RESULT_OK) {
> + CALLBACK_WITH_FAILURE(cb, -1, cbd->data);
> + return;
> + }
> +
> + if (qld->passwd_type == OFONO_SIM_PASSWORD_SIM_PIN)
> + pin_state = sim_stat.pin1_state;
> + else
> + pin_state = sim_stat.pin2_state;
> +
> + switch (pin_state) {
> + case 1: /* Enabled and not verified */
> + case 2: /* Enabled and verified */
> + status = TRUE;
> + break;
> + case 0: /* Unknown */
> + case 3: /* Disabled */
> + case 4: /* Blocked */
> + case 5: /* Permanently blocked */
> + default:
> + status = FALSE;
> + break;
> + }
> +
> + CALLBACK_WITH_SUCCESS(cb, status, cbd->data);
> +}
> +
> +static void qmi_query_locked(struct ofono_sim *sim,
> + enum ofono_sim_password_type passwd_type,
> + ofono_query_facility_lock_cb_t cb, void *user_data)
> +{
> + struct sim_data *data = ofono_sim_get_data(sim);
> + struct cb_data *cbd = cb_data_new(cb, user_data);
> + struct query_locked_data *qld;
> +
> + DBG("");
> +
> + switch (passwd_type) {
> + case OFONO_SIM_PASSWORD_SIM_PIN:
> + case OFONO_SIM_PASSWORD_SIM_PIN2:
> + break;
> + default:
> + CALLBACK_WITH_CME_ERROR(cb, 4, -1, cbd->data);
> + l_free(cbd);
> + return;
> + }
> +
> + qld = l_new(struct query_locked_data, 1);
> + qld->passwd_type = passwd_type;
> + cbd->user = qld;
> +
> + if (qmi_service_send(data->uim, QMI_UIM_GET_CARD_STATUS, NULL,
> + query_locked_cb, cbd, cb_user_data_unref) > 0)
> + return;
> +
> + CALLBACK_WITH_FAILURE(cb, -1, cbd->data);
> +
> + l_free(qld);
> + l_free(cbd);
> +}
> +
> static void get_card_status_cb(struct qmi_result *result, void *user_data)
> {
> struct ofono_sim *sim = user_data;
> @@ -894,6 +986,7 @@ static const struct ofono_sim_driver driver = {
> .query_passwd_state = qmi_query_passwd_state,
> .query_pin_retries = qmi_query_pin_retries,
> .send_passwd = qmi_pin_send,
> + .query_facility_lock = qmi_query_locked,
> };
>
> OFONO_ATOM_DRIVER_BUILTIN(sim, qmimodem, &driver)
Rest LGTM.
Regards,
-Denis
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH] qmi: sim: Implement query_facility_lock(LockedPins property)
2024-11-18 16:43 ` Denis Kenzior
@ 2024-11-18 17:01 ` Ivaylo Dimitrov
0 siblings, 0 replies; 3+ messages in thread
From: Ivaylo Dimitrov @ 2024-11-18 17:01 UTC (permalink / raw)
To: Denis Kenzior, ofono; +Cc: absicsz, merlijn
Hi Denis,
On 18.11.24 г. 18:43 ч., Denis Kenzior wrote:
> Hi Ivo,
>
> On 11/17/24 5:04 AM, Ivaylo Dimitrov wrote:
>> ---
>> drivers/qmimodem/sim.c | 93
>> ++++++++++++++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 93 insertions(+)
>>
>> diff --git a/drivers/qmimodem/sim.c b/drivers/qmimodem/sim.c
>> index 1fffae2..b1d8f22 100644
>> --- a/drivers/qmimodem/sim.c
>> +++ b/drivers/qmimodem/sim.c
>> @@ -41,6 +41,8 @@ struct sim_status {
>> uint8_t app_type;
>> uint8_t passwd_state;
>> int retries[OFONO_SIM_PASSWORD_INVALID];
>> + uint8_t pin1_state;
>> + uint8_t pin2_state;
>> };
>> struct sim_data {
>> @@ -52,6 +54,20 @@ struct sim_data {
>> struct l_timeout *retry_timer;
>> };
>> +struct query_locked_data {
>> + enum ofono_sim_password_type passwd_type;
>> +};
>
> Why is this structure needed? Can't you simply stuff this into
> cb_data::user using L_UINT_TO_PTR and L_PTR_TO_UINT?
>
I was wondering what is GUINT_TO_POINTER() replacement in ell, however...
>> +
>> +static inline void cb_user_data_unref(void *user_data)
>> +{
>> + struct cb_data *cbd = user_data;
>> +
>> + if (cbd->ref == 1 && cbd->user)
>> + l_free(cbd->user);
>> +
>> + cb_data_unref(user_data);
>> +}
>> +
>
> That way this could also be dropped
>
I introduced that for the future (sim pin change functionality),
however, looking now at the code, I wonder why I decided it will be needed.
Will drop and resend.
Thanks and regards,
Ivo
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2024-11-18 17:01 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-17 11:04 [PATCH] qmi: sim: Implement query_facility_lock(LockedPins property) Ivaylo Dimitrov
2024-11-18 16:43 ` Denis Kenzior
2024-11-18 17:01 ` Ivaylo Dimitrov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox