From: Daniel Golle Date: Sat, 6 Nov 2021 02:02:00 +0000 (+0000) Subject: uim: add --uim-get-sim-state X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=6f956265167945267d676c99f123a8c822f0a77b;p=project%2Fuqmi.git uim: add --uim-get-sim-state Provide same output as --get-pin-status for SIM/modem which require using uim instead of dms command for that. For now only the first present SIM card with only the first application on the card is supported (which should cover the vast majority of cases and allows to remain compatible with --get-pin-status output) Suggested-by: Arjun AK Signed-off-by: Daniel Golle --- diff --git a/commands-dms.c b/commands-dms.c index 8cc7bc5..954daca 100644 --- a/commands-dms.c +++ b/commands-dms.c @@ -80,7 +80,7 @@ cmd_dms_get_capabilities_prepare(struct qmi_dev *qmi, struct qmi_request *req, s return QMI_CMD_REQUEST; } -static const char *get_pin_status(int status) +const char *get_pin_status(int status) { static const char *pin_status[] = { [QMI_DMS_UIM_PIN_STATUS_NOT_INITIALIZED] = "not_initialized", diff --git a/commands-dms.h b/commands-dms.h index 82ae592..eea8308 100644 --- a/commands-dms.h +++ b/commands-dms.h @@ -73,3 +73,4 @@ " mode_only_low_power)\n" \ " --fcc-auth: Set FCC authentication\n" \ +const char *get_pin_status(int status); diff --git a/commands-uim.c b/commands-uim.c index d99bce9..3bd8a74 100644 --- a/commands-uim.c +++ b/commands-uim.c @@ -54,3 +54,62 @@ cmd_uim_verify_pin2_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_set_uim_verify_pin_request(msg, &data); return QMI_CMD_REQUEST; } + +static void cmd_uim_get_sim_state_cb(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg) +{ + struct qmi_uim_get_card_status_response res; + void * const card_table = blobmsg_open_table(&status, NULL); + + qmi_parse_uim_get_card_status_response(msg, &res); + + for (int i = 0; i < res.data.card_status.cards_n; ++i) { + if (res.data.card_status.cards[i].card_state != QMI_UIM_CARD_STATE_PRESENT) + continue; + + uint8_t pin1_state = res.data.card_status.cards[i].upin_state; + uint8_t pin1_retries = res.data.card_status.cards[i].upin_retries; + uint8_t puk1_retries = res.data.card_status.cards[i].upuk_retries; + uint8_t pin2_state; + uint8_t pin2_retries; + uint8_t puk2_retries; + bool has_pin2 = false; + + for (int j = 0; j < res.data.card_status.cards[i].applications_n; ++j) { + if (res.data.card_status.cards[i].applications[j].type == QMI_UIM_CARD_APPLICATION_TYPE_UNKNOWN) + continue; + + if (!res.data.card_status.cards[i].applications[j].upin_replaces_pin1) { + pin1_state = res.data.card_status.cards[i].applications[j].pin1_state; + pin1_retries = res.data.card_status.cards[i].applications[j].pin1_retries; + puk1_retries = res.data.card_status.cards[i].applications[j].puk1_retries; + } + + pin2_state = res.data.card_status.cards[i].applications[j].pin2_state; + pin2_retries = res.data.card_status.cards[i].applications[j].pin2_retries; + puk2_retries = res.data.card_status.cards[i].applications[j].puk2_retries; + has_pin2 = true; + + break; /* handle first application only for now */ + } + + blobmsg_add_string(&status, "pin1_status", get_pin_status(pin1_state)); + blobmsg_add_u32(&status, "pin1_verify_tries", pin1_retries); + blobmsg_add_u32(&status, "pin1_unlock_tries", puk1_retries); + if (has_pin2) { + blobmsg_add_string(&status, "pin2_status", get_pin_status(pin2_state)); + blobmsg_add_u32(&status, "pin2_verify_tries", pin2_retries); + blobmsg_add_u32(&status, "pin2_unlock_tries", puk2_retries); + } + + break; /* handle only first preset SIM card for now */ + } + + blobmsg_close_table(&status, card_table); +} + +static enum qmi_cmd_result +cmd_uim_get_sim_state_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg) +{ + qmi_set_uim_get_card_status_request(msg); + return QMI_CMD_REQUEST; +} diff --git a/commands-uim.h b/commands-uim.h index 86ebae4..02a49b1 100644 --- a/commands-uim.h +++ b/commands-uim.h @@ -21,10 +21,12 @@ #define __uqmi_uim_commands \ __uqmi_command(uim_verify_pin1, uim-verify-pin1, required, QMI_SERVICE_UIM), \ - __uqmi_command(uim_verify_pin2, uim-verify-pin2, required, QMI_SERVICE_UIM) \ + __uqmi_command(uim_verify_pin2, uim-verify-pin2, required, QMI_SERVICE_UIM), \ + __uqmi_command(uim_get_sim_state, uim-get-sim-state, no, QMI_SERVICE_UIM) \ #define uim_helptext \ " --uim-verify-pin1 : Verify PIN1 (new devices)\n" \ " --uim-verify-pin2 : Verify PIN2 (new devices)\n" \ + " --uim-get-sim-state: Get current SIM state\n" \