libwd/0034-uadk-support-digest-message-carrying-long-data-infor.patch
2023-09-28 09:15:32 +08:00

98 lines
3.6 KiB
Diff

From b9e157a5c0283668b1abcd15af6c455dc08d1ab3 Mon Sep 17 00:00:00 2001
From: Wenkai Lin <linwenkai6@hisilicon.com>
Date: Fri, 22 Sep 2023 13:53:15 +0800
Subject: [PATCH 34/38] uadk: support digest message carrying long data
information
Currently, we use 0 and 1 to fill the has_next filed of digest request,
0 indicates that there is no next packet, 1 indicates there are next packets,
we use WD_DIGEST_END and WD_DIGEST_DOING to mark those messages.
In another scenario, when user calculates on data flow A, after partial data is calculated,
the result may be copied to data flow B so that flow B can calculate different data.
However, flow B uses a new session, there's no information required for continuing calculation.
Therefore, messages with this information need to be delivered to uadk, so we use
WD_DIGEST_STREAM_END and WD_DIGEST_STREAM_DOING to mark those messages,
long_data_len is also added to messages to store the length of the processed data.
After uadk set long data length and msg_state for the session,
it will also change the status of has_next, change WD_DIGEST_STREAM_END
to WD_DIGEST_END, WD_DIGEST_STREAM_DOING to WD_DIGEST_DOING.
Signed-off-by: Wenkai Lin <linwenkai6@hisilicon.com>
---
include/wd_digest.h | 19 ++++++++++++++++++-
wd_digest.c | 10 ++++++++++
2 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/include/wd_digest.h b/include/wd_digest.h
index 9abbe16..7539866 100644
--- a/include/wd_digest.h
+++ b/include/wd_digest.h
@@ -78,6 +78,20 @@ enum wd_digest_mode {
WD_DIGEST_MODE_MAX,
};
+/**
+ * wd_digest_msg_state - Message state of digest
+ * @WD_DIGEST_END: Final message or single block message
+ * @WD_DIGEST_DOING: First message or middle message
+ * @WD_DIGEST_STREAM_END: Final message carrying long data information
+ * @WD_DIGEST_STREAM_DOING: Middle message carrying long data information
+ */
+enum wd_digest_msg_state {
+ WD_DIGEST_END = 0x0,
+ WD_DIGEST_DOING,
+ WD_DIGEST_STREAM_END,
+ WD_DIGEST_STREAM_DOING,
+};
+
/**
* wd_digest_sess_setup - Parameters which is used to allocate a digest session
* @alg: digest algorithm type, denoted by enum wd_digest_type
@@ -100,9 +114,11 @@ typedef void *wd_digest_cb_t(void *cb_param);
* @out_buf_bytes: actual output buffer size
* @iv: input iv data addrss for AES_GMAC
* @iv_bytes: input iv data size
- * @has_next: is there next data block
+ * @has_next: message state, all types are defined in enum wd_digest_msg_state.
* @cb: callback function for async mode
* @cb_param: pointer of callback parameter
+ * @long_data_len: total length of data has been processed, it is only needed by
+ * the data flow switched to another session for processing.
*
* Note: If there is a alg selected in session, alg below will be ignore
* otherwise, alg here will be used. Same as mode below.
@@ -125,6 +141,7 @@ struct wd_digest_req {
__u8 data_fmt;
wd_digest_cb_t *cb;
void *cb_param;
+ __u64 long_data_len;
};
struct wd_cb_tag {
diff --git a/wd_digest.c b/wd_digest.c
index fd26cc8..69c4b28 100644
--- a/wd_digest.c
+++ b/wd_digest.c
@@ -531,6 +531,16 @@ static void fill_request_msg(struct wd_digest_msg *msg,
{
memcpy(&msg->req, req, sizeof(struct wd_digest_req));
+ if (unlikely(req->has_next == WD_DIGEST_STREAM_END)) {
+ sess->long_data_len = req->long_data_len;
+ sess->msg_state = WD_DIGEST_DOING;
+ req->has_next = WD_DIGEST_END;
+ } else if (unlikely(req->has_next == WD_DIGEST_STREAM_DOING)) {
+ sess->long_data_len = req->long_data_len;
+ sess->msg_state = WD_DIGEST_DOING;
+ req->has_next = WD_DIGEST_DOING;
+ }
+
msg->alg_type = WD_DIGEST;
msg->alg = sess->alg;
msg->mode = sess->mode;
--
2.25.1