From patchwork Tue Feb 20 08:13:16 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniele Palmas X-Patchwork-Id: 875428 X-Patchwork-Delegate: blogic@openwrt.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (helo) smtp.helo=arrakis.dune.hu (client-ip=78.24.191.176; helo=arrakis.dune.hu; envelope-from=openwrt-devel-bounces@lists.openwrt.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="SYibztG5"; dkim-atps=neutral Received: from arrakis.dune.hu (arrakis.dune.hu [78.24.191.176]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zltfl6QTRz9ryr for ; Tue, 20 Feb 2018 19:13:35 +1100 (AEDT) Received: from arrakis.dune.hu (localhost [127.0.0.1]) by arrakis.dune.hu (Postfix) with ESMTP id 4699FB90FCF; Tue, 20 Feb 2018 09:13:30 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on arrakis.dune.hu X-Spam-Level: X-Spam-Status: No, score=-0.5 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HK_RANDOM_FROM, T_DKIM_INVALID autolearn=no autolearn_force=no version=3.4.1 Received: from arrakis.dune.hu (localhost [127.0.0.1]) by arrakis.dune.hu (Postfix) with ESMTP; Tue, 20 Feb 2018 09:13:30 +0100 (CET) Received: from arrakis.dune.hu (localhost [127.0.0.1]) by arrakis.dune.hu (Postfix) with ESMTP id 03BADB90FAB for ; Tue, 20 Feb 2018 09:13:29 +0100 (CET) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 CL_IP_EQ_HELO_IP=-2 (check from: .gmail. - helo: .mail-wr0-f193.google. - helo-domain: .google.) FROM/MX_MATCHES_HELO(DOMAIN)=-2 RANDOM_SENDER=0.25; rate: -6.75 Received: from mail-wr0-f193.google.com (mail-wr0-f193.google.com [209.85.128.193]) by arrakis.dune.hu (Postfix) with ESMTPS for ; Tue, 20 Feb 2018 09:13:28 +0100 (CET) Received: by mail-wr0-f193.google.com with SMTP id z12so5919918wrg.4 for ; Tue, 20 Feb 2018 00:13:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=gju9qW4P4EyZnUp4bWBlKQ19NvbRHA0wgZ5Np6emG6s=; b=SYibztG5Zl/eABll57sBsFmcL0bDCBwLfh/pslbkyYJ1e8MnhdI+P2vhIGX48FrQYd ZtH/xwQGGBUfDcJfutBxAmP24ZpNfJuri5a+Y29jE2XI+/138SuTEV5b4RkEVXUafNpu CuOfoMhGaQu63ue0fFsURE19AT0vlU3tib9+9hqHuzaUe/N4ZOmEJQZL2tf/doNXueT7 uW5M/CLf5bBwAd/eC8Qn5CWu4BvcmJFXSddVQAUBJ6e5RZObsGqALhC2UajbFeYxmVTr UPglLyhTZVOS0MOzJn0LRXc2E6o4uzt3w4LENeDasCu9qaow2LeMfvHxL6MnMBTEXRzc cDyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=gju9qW4P4EyZnUp4bWBlKQ19NvbRHA0wgZ5Np6emG6s=; b=q5F8MfTGW+K08R7WB4Sh5rAHx5v1DG9u0SksG2iFjuwoevuB60pgVUPJ2olj7lZbCu C4IdRX5J5vOslWOzvwYuw2h16lQt3XVvrEP0IQYNvLMhEeQge/k9BfrWSRz7dUr6DZA6 Y0G46b6rwluyU2KVkenN9pnaBUdDig41HdWN8NUYgzh5HRx0FUyIsxynCBEFt4GYAQO7 k6MTTM7MzO9mU+92P/RxkX4O3lvwlIKPGwXaajxhrRK3n/kj7X5aHKAmCWAAwckShTh3 PbUZ7qab1L/U43LdjTs8pJX4gWsEoNkmbUJfCpP9QuHB/NvuLXHMMZAlSabllWEf0qbq mGUw== X-Gm-Message-State: APf1xPAuXfNgQav+XvWHUtPkcXus71kb7zBEzzp2X57Jsf8IMgQbJ3/a biFF0MfKs6+/GLDSnt8iv1guGQ== X-Google-Smtp-Source: AH8x227Cgrm4K4EnQ1nMT8BezRPpqlVE42jYSE48Z8ZGuN8qQz+hIKL9YBdEPGnz4DPauIvgj2qBJQ== X-Received: by 10.223.157.135 with SMTP id p7mr2946548wre.33.1519114407639; Tue, 20 Feb 2018 00:13:27 -0800 (PST) Received: from L2122.tmt.telital.com ([213.205.6.118]) by smtp.gmail.com with ESMTPSA id i6sm24527621wrc.46.2018.02.20.00.13.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 20 Feb 2018 00:13:27 -0800 (PST) From: Daniele Palmas To: openwrt-devel@lists.openwrt.org, John Crispin , Felix Fietkau Date: Tue, 20 Feb 2018 09:13:16 +0100 Message-Id: <1519114396-29338-1-git-send-email-dnlplm@gmail.com> X-Mailer: git-send-email 2.7.4 Subject: [OpenWrt-Devel] [PATCH v2 1/1] uqmi: uim: add support for Get Card Status request X-BeenThere: openwrt-devel@lists.openwrt.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: OpenWrt Development List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: openwrt-devel-bounces@lists.openwrt.org Sender: "openwrt-devel" This patch adds support for UIM Get Card Status request Signed-off-by: Daniele Palmas --- v2: modified sanity checks in order to reduce indenting commands-uim.c | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ commands-uim.h | 4 +- 2 files changed, 142 insertions(+), 1 deletion(-) diff --git a/commands-uim.c b/commands-uim.c index 859da68..e26e69c 100644 --- a/commands-uim.c +++ b/commands-uim.c @@ -54,3 +54,142 @@ 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_card_status_cb(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg) +{ + struct qmi_uim_get_card_status_response res; + static const char *app_type[] = { + [QMI_UIM_CARD_APPLICATION_TYPE_UNKNOWN] = "unknown", + [QMI_UIM_CARD_APPLICATION_TYPE_SIM] = "sim", + [QMI_UIM_CARD_APPLICATION_TYPE_USIM] = "usim", + [QMI_UIM_CARD_APPLICATION_TYPE_RUIM] = "ruim", + [QMI_UIM_CARD_APPLICATION_TYPE_CSIM] = "csim", + [QMI_UIM_CARD_APPLICATION_TYPE_ISIM] = "isim", + }; + static const char *card_state[] = { + [QMI_UIM_CARD_STATE_ABSENT] = "absent", + [QMI_UIM_CARD_STATE_PRESENT] = "present", + [QMI_UIM_CARD_STATE_ERROR] = "error", + }; + static const char *pin_state[] = { + [QMI_UIM_PIN_STATE_NOT_INITIALIZED] = "not initialized", + [QMI_UIM_PIN_STATE_ENABLED_NOT_VERIFIED] = "enabled not verified", + [QMI_UIM_PIN_STATE_ENABLED_VERIFIED] = "enabled verified", + [QMI_UIM_PIN_STATE_DISABLED] = "disabled", + [QMI_UIM_PIN_STATE_BLOCKED] = "blocked", + [QMI_UIM_PIN_STATE_PERMANENTLY_BLOCKED] = "permanently blocked", + }; + static const char *card_error[] = { + [QMI_UIM_CARD_ERROR_UNKNOWN] = "unknown", + [QMI_UIM_CARD_ERROR_POWER_DOWN] = "power down", + [QMI_UIM_CARD_ERROR_POLL] = "poll", + [QMI_UIM_CARD_ERROR_NO_ATR_RECEIVED] = "no atr received", + [QMI_UIM_CARD_ERROR_VOLTAGE_MISMATCH] = "voltage mismatch", + [QMI_UIM_CARD_ERROR_PARITY] = "parity", + [QMI_UIM_CARD_ERROR_POSSIBLY_REMOVED] = "possibly removed", + [QMI_UIM_CARD_ERROR_TECHNICAL] = "technical", + }; + static const char *app_state[] = { + [QMI_UIM_CARD_APPLICATION_STATE_UNKNOWN] = "unknown", + [QMI_UIM_CARD_APPLICATION_STATE_DETECTED] = "detected", + [QMI_UIM_CARD_APPLICATION_STATE_PIN1_OR_UPIN_PIN_REQUIRED] = "pin", + [QMI_UIM_CARD_APPLICATION_STATE_PUK1_OR_UPIN_PUK_REQUIRED] = "puk", + [QMI_UIM_CARD_APPLICATION_STATE_CHECK_PERSONALIZATION_STATE] = "perso", + [QMI_UIM_CARD_APPLICATION_STATE_PIN1_BLOCKED] = "pin1 blocked", + [QMI_UIM_CARD_APPLICATION_STATE_ILLEGAL] = "illegal", + [QMI_UIM_CARD_APPLICATION_STATE_READY] = "ready", + }; + void *c, *a, *card_info, *a_app, *app_info; + int i, j; + + qmi_parse_uim_get_card_status_response(msg, &res); + + if (!res.set.card_status || res.data.card_status.cards_n <= 0) + return; + + c = blobmsg_open_table(&status, NULL); + blobmsg_add_u32(&status, "num_slots", res.data.card_status.cards_n); + + if (res.data.card_status.index_gw_primary != 0xFFFF) + blobmsg_add_u32(&status, "index_gw_pri", res.data.card_status.index_gw_primary); + if (res.data.card_status.index_1x_primary != 0xFFFF) + blobmsg_add_u32(&status, "index_1x_pri", res.data.card_status.index_1x_primary); + if (res.data.card_status.index_gw_secondary_ != 0xFFFF) + blobmsg_add_u32(&status, "index_gw_sec", res.data.card_status.index_gw_secondary_); + if (res.data.card_status.index_1x_secondary != 0xFFFF) + blobmsg_add_u32(&status, "index_1x_sec", res.data.card_status.index_1x_secondary); + + a = blobmsg_open_array(&status, "card_info"); + + for (i = 0; i < res.data.card_status.cards_n; i++) { + card_info = blobmsg_open_table(&status, NULL); + + blobmsg_add_u32(&status, "app_n", res.data.card_status.cards[i].applications_n); + + if (res.data.card_status.cards[i].card_state > QMI_UIM_CARD_STATE_ERROR) + res.data.card_status.cards[i].card_state = QMI_UIM_CARD_STATE_ERROR; + else if (res.data.card_status.cards[i].card_state == QMI_UIM_CARD_STATE_ERROR) { + if (res.data.card_status.cards[i].error_code > QMI_UIM_CARD_ERROR_TECHNICAL) + res.data.card_status.cards[i].error_code = QMI_UIM_CARD_ERROR_UNKNOWN; + blobmsg_add_string(&status, "card_error", card_error[res.data.card_status.cards[i].error_code]); + } + + blobmsg_add_string(&status, "card_state", card_state[res.data.card_status.cards[i].card_state]); + + if (res.data.card_status.cards[i].upin_state > QMI_UIM_PIN_STATE_PERMANENTLY_BLOCKED) + res.data.card_status.cards[i].upin_state = QMI_UIM_PIN_STATE_PERMANENTLY_BLOCKED; + blobmsg_add_string(&status, "upin_state", pin_state[res.data.card_status.cards[i].upin_state]); + + if (res.data.card_status.cards[i].upin_state != QMI_UIM_PIN_STATE_NOT_INITIALIZED) { + blobmsg_add_u32(&status, "upin_retries", res.data.card_status.cards[i].upin_retries); + blobmsg_add_u32(&status, "upuk_retries", res.data.card_status.cards[i].upuk_retries); + } + + if (res.data.card_status.cards[i].applications_n > 0) { + a_app = blobmsg_open_array(&status, "app_info"); + + for (j = 0; j < res.data.card_status.cards[i].applications_n; j++) { + app_info = blobmsg_open_table(&status, NULL); + + if (res.data.card_status.cards[i].applications[j].type > QMI_UIM_CARD_APPLICATION_TYPE_ISIM) + res.data.card_status.cards[i].applications[j].type = QMI_UIM_CARD_APPLICATION_TYPE_UNKNOWN; + blobmsg_add_string(&status, "app_type", app_type[res.data.card_status.cards[i].applications[j].type]); + + if (res.data.card_status.cards[i].applications[j].state > QMI_UIM_CARD_APPLICATION_STATE_READY) + res.data.card_status.cards[i].applications[j].state = QMI_UIM_CARD_APPLICATION_STATE_UNKNOWN; + blobmsg_add_string(&status, "app_state", app_state[res.data.card_status.cards[i].applications[j].state]); + blobmsg_add_u8(&status, "upin", res.data.card_status.cards[i].applications[j].upin_replaces_pin1); + + if (res.data.card_status.cards[i].applications[j].upin_replaces_pin1 == 0) { + if (res.data.card_status.cards[i].applications[j].pin1_state > QMI_UIM_PIN_STATE_PERMANENTLY_BLOCKED) + res.data.card_status.cards[i].applications[j].pin1_state = QMI_UIM_PIN_STATE_PERMANENTLY_BLOCKED; + blobmsg_add_string(&status, "pin1_state", pin_state[res.data.card_status.cards[i].applications[j].pin1_state]); + blobmsg_add_u32(&status, "pin1_retries", res.data.card_status.cards[i].applications[j].pin1_retries); + blobmsg_add_u32(&status, "puk1_retries", res.data.card_status.cards[i].applications[j].puk1_retries); + if (res.data.card_status.cards[i].applications[j].pin2_state > QMI_UIM_PIN_STATE_PERMANENTLY_BLOCKED) + res.data.card_status.cards[i].applications[j].pin2_state = QMI_UIM_PIN_STATE_PERMANENTLY_BLOCKED; + blobmsg_add_string(&status, "pin2_state", pin_state[res.data.card_status.cards[i].applications[j].pin2_state]); + blobmsg_add_u32(&status, "pin2_retries", res.data.card_status.cards[i].applications[j].pin2_retries); + blobmsg_add_u32(&status, "puk2_retries", res.data.card_status.cards[i].applications[j].puk2_retries); + } + + blobmsg_close_table(&status, app_info); + } + + blobmsg_close_array(&status, a_app); + } + + blobmsg_close_table(&status, card_info); + } + + blobmsg_close_array(&status, a); + blobmsg_close_table(&status, c); +} + +static enum qmi_cmd_result +cmd_uim_get_card_status_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..b668263 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_card_status, uim-get-card-status, 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-card-status: Get Card Status\n" \