[PATCH] qmi: sms: Implement message ack
Ivaylo Dimitrov <[email protected]> Wed, 23 Jul 2025 09:04:37 +0300
| Newsgroups | dev.linux.lists.ofono |
|---|---|
| Message-ID | <[email protected]> |
A "transfer route" message may come with ack_required being set to require
ack, obey that.
---
drivers/qmimodem/sms.c | 44 ++++++++++++++++++++++++++++++++++++++++++
drivers/qmimodem/wms.h | 3 +++
2 files changed, 47 insertions(+)
diff --git a/drivers/qmimodem/sms.c b/drivers/qmimodem/sms.c
index 43fa9e39..39a4bb3f 100644
--- a/drivers/qmimodem/sms.c
+++ b/drivers/qmimodem/sms.c
@@ -571,6 +571,47 @@ static void get_msg_protocol(struct ofono_sms *sms)
get_msg_protocol_cb, sms, NULL);
}
+static void send_ack_cb(struct qmi_result *result, void *user_data)
+{
+ uint16_t err;
+
+ DBG("");
+
+ if (!qmi_result_set_error(result, &err))
+ return;
+
+ DBG("Err: protocol %d - %s",
+ err, qmi_result_get_error(result));
+}
+
+static void send_ack(struct sms_data *data,
+ const struct qmi_wms_result_message *message)
+{
+ struct __attribute__((__packed__)) {
+ uint32_t transaction_id;
+ uint8_t mode;
+ uint8_t success;
+ } ack;
+ struct qmi_param *param;
+
+ ack.transaction_id = message->transaction_id;
+ ack.success = 1;
+
+ if (message->msg_format == 0)
+ ack.mode = QMI_WMS_MESSAGE_MODE_CDMA;
+ else
+ ack.mode = QMI_WMS_MESSAGE_MODE_GSMWCDMA;
+
+ param = qmi_param_new();
+ qmi_param_append(param, 0x01, sizeof(ack), &ack);
+
+ if (qmi_service_send(data->wms, QMI_WMS_SEND_ACK, param,
+ send_ack_cb, NULL, NULL) > 0)
+ return;
+
+ qmi_param_free(param);
+}
+
static void event_notify(struct qmi_result *result, void *user_data)
{
struct ofono_sms *sms = user_data;
@@ -615,6 +656,9 @@ static void event_notify(struct qmi_result *result, void *user_data)
DBG("msg format %d PDU length %d",
message->msg_format, plen);
+ if (message->ack_required == QMI_WMS_ACK_REQUIRED)
+ send_ack(data, message);
+
ofono_sms_deliver_notify(sms, message->msg_data,
plen, plen);
}
diff --git a/drivers/qmimodem/wms.h b/drivers/qmimodem/wms.h
index 9d7165b5..f8d4f3f5 100644
--- a/drivers/qmimodem/wms.h
+++ b/drivers/qmimodem/wms.h
@@ -20,6 +20,7 @@
#define QMI_WMS_GET_SMSC_ADDR 52 /* Get SMSC address */
#define QMI_WMS_SET_SMSC_ADDR 53 /* Set SMSC address */
#define QMI_WMS_GET_MSG_LIST_MAX 54 /* Get maximum size of SMS storage */
+#define QMI_WMS_SEND_ACK 55 /* Send Ack */
#define QMI_WMS_GET_DOMAIN_PREF 64 /* Get domain preference */
#define QMI_WMS_SET_DOMAIN_PREF 65 /* Set domain preference */
@@ -32,6 +33,8 @@ struct qmi_wms_result_new_msg_notify {
uint32_t storage_index;
} __attribute__((__packed__));
+#define QMI_WMS_ACK_REQUIRED 0x00
+
#define QMI_WMS_RESULT_MESSAGE 0x11
struct qmi_wms_result_message {
uint8_t ack_required; /* bool */
--
2.25.1