[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