libwd/0048-uadk_tool-Optimize-sec-s-no-sva-benchmark-code.patch
2023-11-23 10:41:04 +08:00

1184 lines
32 KiB
Diff

From 134ccab1f3ae6f3bd6eb7e0848d8042cf8fb7c7b Mon Sep 17 00:00:00 2001
From: Longfang Liu <liulongfang@huawei.com>
Date: Fri, 10 Nov 2023 11:52:17 +0800
Subject: [PATCH 48/85] uadk_tool: Optimize sec's no-sva benchmark code
Update the performance test code of sec's no-sva mode, and optimize
the performance test code of sec's no-sva mode by splitting
sub-functions.
Signed-off-by: Longfang Liu <liulongfang@huawei.com>
---
uadk_tool/benchmark/sec_wd_benchmark.c | 972 +++++++++++++++----------
1 file changed, 598 insertions(+), 374 deletions(-)
diff --git a/uadk_tool/benchmark/sec_wd_benchmark.c b/uadk_tool/benchmark/sec_wd_benchmark.c
index d2da73b..038d3ab 100644
--- a/uadk_tool/benchmark/sec_wd_benchmark.c
+++ b/uadk_tool/benchmark/sec_wd_benchmark.c
@@ -23,6 +23,9 @@ typedef struct wd_thread_res {
u32 ivsize;
u32 optype;
u32 td_id;
+ bool is_union;
+ u32 dalg;
+ u32 dmode;
} thread_data;
struct thread_bd_res {
@@ -67,8 +70,11 @@ static int sec_wd_param_parse(thread_data *tddata, struct acc_option *options)
{
u32 algtype = options->algtype;
u32 optype = options->optype;
+ bool is_union = false;
u8 keysize = 0;
u8 ivsize = 0;
+ u8 dmode;
+ u8 dalg;
u8 mode;
u8 alg;
@@ -271,6 +277,33 @@ static int sec_wd_param_parse(thread_data *tddata, struct acc_option *options)
mode = WCRYPTO_CIPHER_GCM;
alg = WCRYPTO_CIPHER_AES;
break;
+ case AES_128_CBC_SHA256_HMAC:
+ keysize = 16;
+ ivsize = 16;
+ mode = WCRYPTO_CIPHER_CBC;
+ alg = WCRYPTO_CIPHER_AES;
+ is_union = true;
+ dalg = WCRYPTO_SHA256;
+ dmode = WCRYPTO_DIGEST_HMAC;
+ break;
+ case AES_192_CBC_SHA256_HMAC:
+ keysize = 24;
+ ivsize = 16;
+ mode = WCRYPTO_CIPHER_CBC;
+ alg = WCRYPTO_CIPHER_AES;
+ is_union = true;
+ dalg = WCRYPTO_SHA256;
+ dmode = WCRYPTO_DIGEST_HMAC;
+ break;
+ case AES_256_CBC_SHA256_HMAC:
+ keysize = 32;
+ ivsize = 16;
+ mode = WCRYPTO_CIPHER_CBC;
+ alg = WCRYPTO_CIPHER_AES;
+ is_union = true;
+ dalg = WCRYPTO_SHA256;
+ dmode = WCRYPTO_DIGEST_HMAC;
+ break;
case SM4_128_CCM:
keysize = 16;
ivsize = 16;
@@ -335,8 +368,11 @@ static int sec_wd_param_parse(thread_data *tddata, struct acc_option *options)
tddata->alg = alg;
tddata->mode = mode;
+ tddata->dalg = dalg;
+ tddata->dmode = dmode;
tddata->ivsize = ivsize;
tddata->keysize = keysize;
+ tddata->is_union = is_union;
tddata->optype = options->optype;
tddata->subtype = options->subtype;
@@ -527,8 +563,8 @@ void *sec_wd_poll(void *data)
while (last_time) {
recv = wd_poll_ctx(g_thread_queue.bd_res[id].queue, expt);
/*
- * async mode poll easy to 100% with small package.
- * SEC_TST_PRT("poll %d recv: %u!\n", i, recv);
+ * warpdrive async mode poll easy to 100% with small package.
+ * SEC_TST_PRT("warpdrive poll %d recv: %u!\n", i, recv);
*/
if (unlikely(recv < 0)) {
SEC_TST_PRT("poll ret: %u!\n", recv);
@@ -547,15 +583,11 @@ recv_error:
return NULL;
}
-static void *sec_wd_async_run(void *arg)
+static void *sec_wd_cipher_async(void *arg)
{
thread_data *pdata = (thread_data *)arg;
struct wcrypto_cipher_ctx_setup cipher_setup = {0};
- struct wcrypto_aead_ctx_setup aead_setup = {0};
- struct wcrypto_digest_ctx_setup digest_setup = {0};
struct wcrypto_cipher_op_data copdata;
- struct wcrypto_aead_op_data aopdata;
- struct wcrypto_digest_op_data dopdata;
struct wcrypto_async_tag *tag = NULL;
char priv_key[MAX_IVK_LENTH];
struct thread_bd_res *bd_res;
@@ -566,7 +598,6 @@ static void *sec_wd_async_run(void *arg)
void **res_iv;
u32 count = 0;
int try_cnt = 0;
- u32 authsize;
int ret, i = 0;
void *pool;
@@ -588,246 +619,431 @@ static void *sec_wd_async_run(void *arg)
}
tag->thread_id = pdata->td_id;
- switch(pdata->subtype) {
- case CIPHER_TYPE:
- cipher_setup.alg = pdata->alg;
- cipher_setup.mode = pdata->mode;
- cipher_setup.cb = (void *)cipher_async_cb;
- cipher_setup.br.alloc = (void *)wd_alloc_blk;
- cipher_setup.br.free = (void *)wd_free_blk;
- cipher_setup.br.iova_map = (void *)wd_blk_iova_map;
- cipher_setup.br.iova_unmap = (void *)wd_blk_iova_unmap;
- cipher_setup.br.get_bufsize = (void *)wd_blksize;
- cipher_setup.br.usr = pool;
-
- ctx = wcrypto_create_cipher_ctx(queue, &cipher_setup);
- if (!ctx) {
- SEC_TST_PRT("wd create cipher ctx fail!\n");
- return NULL;
- }
- tag->ctx = ctx;
+ cipher_setup.alg = pdata->alg;
+ cipher_setup.mode = pdata->mode;
+ cipher_setup.cb = (void *)cipher_async_cb;
+ cipher_setup.br.alloc = (void *)wd_alloc_blk;
+ cipher_setup.br.free = (void *)wd_free_blk;
+ cipher_setup.br.iova_map = (void *)wd_blk_iova_map;
+ cipher_setup.br.iova_unmap = (void *)wd_blk_iova_unmap;
+ cipher_setup.br.get_bufsize = (void *)wd_blksize;
+ cipher_setup.br.usr = pool;
+
+ ctx = wcrypto_create_cipher_ctx(queue, &cipher_setup);
+ if (!ctx) {
+ SEC_TST_PRT("wd create cipher ctx fail!\n");
+ return NULL;
+ }
+ tag->ctx = ctx;
- ret = wcrypto_set_cipher_key(ctx, (__u8*)priv_key, (__u16)pdata->keysize);
- if (ret) {
- SEC_TST_PRT("wd cipher set key fail!\n");
- wcrypto_del_cipher_ctx(ctx);
- return NULL;
+ ret = wcrypto_set_cipher_key(ctx, (__u8*)priv_key, (__u16)pdata->keysize);
+ if (ret) {
+ SEC_TST_PRT("wd cipher set key fail!\n");
+ wcrypto_del_cipher_ctx(ctx);
+ return NULL;
+ }
+
+ if (queue->capa.priv.direction == 0)
+ copdata.op_type = WCRYPTO_CIPHER_ENCRYPTION;
+ else
+ copdata.op_type = WCRYPTO_CIPHER_DECRYPTION;
+
+ copdata.in_bytes = g_pktlen;
+ copdata.out_bytes = g_pktlen;
+ copdata.iv_bytes = pdata->ivsize;
+ copdata.priv = NULL;
+
+ tag->cnt = 0;
+ copdata.in = res_in[0];
+ copdata.out = res_out[0];
+ copdata.iv = res_iv[0];
+ usleep(SEND_USLEEP);
+ while(1) {
+ if (get_run_state() == 0)
+ break;
+
+ ret = wcrypto_do_cipher(ctx, &copdata, (void *)tag);
+ if (ret == -WD_EBUSY) {
+ usleep(SEND_USLEEP * try_cnt);
+ try_cnt++;
+ if (try_cnt > MAX_TRY_CNT) {
+ SEC_TST_PRT("Test cipher send fail %d times!\n", MAX_TRY_CNT);
+ try_cnt = 0;
+ }
+ continue;
}
- if (queue->capa.priv.direction == 0)
- copdata.op_type = WCRYPTO_CIPHER_ENCRYPTION;
- else
- copdata.op_type = WCRYPTO_CIPHER_DECRYPTION;
+ count++;
+ i = count % MAX_POOL_LENTH;
+ tag->cnt = i;
+ try_cnt = 0;
+ copdata.in = res_in[i];
+ copdata.out = res_out[i];
+ copdata.iv = res_iv[i];
+ }
- copdata.in_bytes = g_pktlen;
- copdata.out_bytes = g_pktlen;
- copdata.iv_bytes = pdata->ivsize;
- copdata.priv = NULL;
+ add_send_complete();
- tag->cnt = 0;
- copdata.in = res_in[0];
- copdata.out = res_out[0];
- copdata.iv = res_iv[0];
+ while (1) {
+ if (get_recv_time() > 0) // wait Async mode finish recv
+ break;
usleep(SEND_USLEEP);
- while(1) {
- if (get_run_state() == 0)
- break;
-
- ret = wcrypto_do_cipher(ctx, &copdata, (void *)tag);
- if (ret == -WD_EBUSY) {
- usleep(SEND_USLEEP * try_cnt);
- try_cnt++;
- if (try_cnt > MAX_TRY_CNT) {
- SEC_TST_PRT("Test cipher send fail %d times!\n", MAX_TRY_CNT);
- try_cnt = 0;
- }
- continue;
- }
+ }
- count++;
- i = count % MAX_POOL_LENTH;
- tag->cnt = i;
- try_cnt = 0;
- copdata.in = res_in[i];
- copdata.out = res_out[i];
- copdata.iv = res_iv[i];
- }
+ wcrypto_del_cipher_ctx(ctx);
- break;
- case AEAD_TYPE: // just ccm and gcm
- aead_setup.calg = pdata->alg;
- aead_setup.cmode = pdata->mode;
- aead_setup.cb = (void *)aead_async_cb;
- aead_setup.br.alloc = (void *)wd_alloc_blk;
- aead_setup.br.free = (void *)wd_free_blk;
- aead_setup.br.iova_map = (void *)wd_blk_iova_map;
- aead_setup.br.iova_unmap = (void *)wd_blk_iova_unmap;
- aead_setup.br.get_bufsize = (void *)wd_blksize;
- aead_setup.br.usr = pool;
-
- ctx = wcrypto_create_aead_ctx(queue, &aead_setup);
- if (!ctx) {
- SEC_TST_PRT("wd create aead ctx fail!\n");
- return NULL;
- }
- tag->ctx = ctx;
+ return NULL;
+}
- ret = wcrypto_set_aead_ckey(ctx, (__u8*)priv_key, (__u16)pdata->keysize);
- if (ret) {
- SEC_TST_PRT("wd aead set key fail!\n");
- wcrypto_del_aead_ctx(ctx);
- return NULL;
- }
+static void *sec_wd_aead_async(void *arg)
+{
+ thread_data *pdata = (thread_data *)arg;
+ struct wcrypto_aead_ctx_setup aead_setup = {0};
+ struct wcrypto_aead_op_data aopdata;
+ struct wcrypto_async_tag *tag = NULL;
+ char priv_key[MAX_IVK_LENTH];
+ char priv_hash[MAX_IVK_LENTH];
+ struct thread_bd_res *bd_res;
+ struct wd_queue *queue;
+ void *ctx = NULL;
+ void **res_in;
+ void **res_out;
+ void **res_iv;
+ u32 count = 0;
+ int try_cnt = 0;
+ u32 authsize;
+ int ret, i = 0;
+ void *pool;
+
+ if (pdata->td_id > g_thread_num)
+ return NULL;
+
+ bd_res = &g_thread_queue.bd_res[pdata->td_id];
+ queue = bd_res->queue;
+ pool = bd_res->pool;
+ res_in = bd_res->in;
+ res_out = bd_res->out;
+ res_iv = bd_res->iv;
- authsize = 16; //set defaut size
- ret = wcrypto_aead_setauthsize(ctx, authsize);
+ memset(priv_key, DEF_IVK_DATA, MAX_IVK_LENTH);
+ memset(priv_hash, DEF_IVK_DATA, MAX_IVK_LENTH);
+ tag = malloc(sizeof(struct wcrypto_async_tag)); // set the user tag
+ if (!tag) {
+ SEC_TST_PRT("wcrypto async alloc tag fail!\n");
+ return NULL;
+ }
+ tag->thread_id = pdata->td_id;
+
+ aead_setup.calg = pdata->alg;
+ aead_setup.cmode = pdata->mode;
+ aead_setup.cb = (void *)aead_async_cb;
+ aead_setup.br.alloc = (void *)wd_alloc_blk;
+ aead_setup.br.free = (void *)wd_free_blk;
+ aead_setup.br.iova_map = (void *)wd_blk_iova_map;
+ aead_setup.br.iova_unmap = (void *)wd_blk_iova_unmap;
+ aead_setup.br.get_bufsize = (void *)wd_blksize;
+ aead_setup.br.usr = pool;
+ if (pdata->is_union) {
+ aead_setup.dalg = pdata->dalg;
+ aead_setup.dmode = pdata->dmode;
+ }
+
+ ctx = wcrypto_create_aead_ctx(queue, &aead_setup);
+ if (!ctx) {
+ SEC_TST_PRT("wd create aead ctx fail!\n");
+ return NULL;
+ }
+ tag->ctx = ctx;
+
+ ret = wcrypto_set_aead_ckey(ctx, (__u8*)priv_key, (__u16)pdata->keysize);
+ if (ret) {
+ SEC_TST_PRT("wd aead set key fail!\n");
+ wcrypto_del_aead_ctx(ctx);
+ return NULL;
+ }
+
+ if (pdata->is_union) {
+ ret = wcrypto_set_aead_akey(ctx, (__u8 *)priv_hash, HASH_ZISE);
if (ret) {
- SEC_TST_PRT("set authsize fail!\n");
+ SEC_TST_PRT("set akey fail!\n");
wcrypto_del_aead_ctx(ctx);
return NULL;
}
+ }
- if (queue->capa.priv.direction == 0) {
- aopdata.op_type = WCRYPTO_CIPHER_ENCRYPTION_DIGEST;
- aopdata.out_bytes = g_pktlen + 32; // aad + plen + authsize;
- } else {
- aopdata.op_type = WCRYPTO_CIPHER_DECRYPTION_DIGEST;
- aopdata.out_bytes = g_pktlen + 16; // aad + plen;
+ authsize = 16; //set defaut size
+ ret = wcrypto_aead_setauthsize(ctx, authsize);
+ if (ret) {
+ SEC_TST_PRT("set authsize fail!\n");
+ wcrypto_del_aead_ctx(ctx);
+ return NULL;
+ }
+
+ if (queue->capa.priv.direction == 0) {
+ aopdata.op_type = WCRYPTO_CIPHER_ENCRYPTION_DIGEST;
+ aopdata.out_bytes = g_pktlen + 32; // aad + plen + authsize;
+ } else {
+ aopdata.op_type = WCRYPTO_CIPHER_DECRYPTION_DIGEST;
+ aopdata.out_bytes = g_pktlen + 16; // aad + plen;
+ }
+
+ aopdata.assoc_size = 16;
+ aopdata.in_bytes = g_pktlen;
+ aopdata.out_bytes = g_pktlen;
+ aopdata.iv_bytes = pdata->ivsize;
+ aopdata.priv = NULL;
+ aopdata.out_buf_bytes = g_pktlen * 2;
+
+ tag->cnt = 0;
+ aopdata.in = res_in[0];
+ aopdata.out = res_out[0];
+ aopdata.iv = res_iv[0];
+ usleep(SEND_USLEEP);
+ while(1) {
+ if (get_run_state() == 0)
+ break;
+
+ ret = wcrypto_do_aead(ctx, &aopdata, (void *)tag);
+ if (ret == -WD_EBUSY) {
+ usleep(SEND_USLEEP * try_cnt);
+ try_cnt++;
+ if (try_cnt > MAX_TRY_CNT) {
+ SEC_TST_PRT("Test aead send fail %d times!\n", MAX_TRY_CNT);
+ try_cnt = 0;
+ }
+ continue;
}
- aopdata.assoc_size = 16;
- aopdata.in_bytes = g_pktlen;
- aopdata.out_bytes = g_pktlen;
- aopdata.iv_bytes = pdata->ivsize;
- aopdata.priv = NULL;
- aopdata.out_buf_bytes = g_pktlen * 2;
-
- tag->cnt = 0;
- aopdata.in = res_in[0];
- aopdata.out = res_out[0];
- aopdata.iv = res_iv[0];
+ count++;
+ i = count % MAX_POOL_LENTH;
+ tag->cnt = i;
+ try_cnt = 0;
+ aopdata.in = res_in[i];
+ aopdata.out = res_out[i];
+ aopdata.iv = res_iv[i];
+ }
+
+ add_send_complete();
+
+ while (1) {
+ if (get_recv_time() > 0) // wait Async mode finish recv
+ break;
usleep(SEND_USLEEP);
- while(1) {
- if (get_run_state() == 0)
- break;
-
- ret = wcrypto_do_aead(ctx, &aopdata, (void *)tag);
- if (ret == -WD_EBUSY) {
- usleep(SEND_USLEEP * try_cnt);
- try_cnt++;
- if (try_cnt > MAX_TRY_CNT) {
- SEC_TST_PRT("Test aead send fail %d times!\n", MAX_TRY_CNT);
- try_cnt = 0;
- }
- continue;
- }
+ }
- count++;
- i = count % MAX_POOL_LENTH;
- tag->cnt = i;
- try_cnt = 0;
- aopdata.in = res_in[i];
- aopdata.out = res_out[i];
- aopdata.iv = res_iv[i];
- }
+ wcrypto_del_aead_ctx(ctx);
- break;
- case DIGEST_TYPE:
- digest_setup.alg = pdata->alg;
- digest_setup.mode = pdata->mode;
- digest_setup.cb = (void *)digest_async_cb;
- digest_setup.br.alloc = (void *)wd_alloc_blk;
- digest_setup.br.free = (void *)wd_free_blk;
- digest_setup.br.iova_map = (void *)wd_blk_iova_map;
- digest_setup.br.iova_unmap = (void *)wd_blk_iova_unmap;
- digest_setup.br.get_bufsize = (void *)wd_blksize;
- digest_setup.br.usr = pool;
-
- ctx = wcrypto_create_digest_ctx(queue, &digest_setup);
- if (!ctx) {
- SEC_TST_PRT("wd create digest ctx fail!\n");
+ return NULL;
+}
+
+static void *sec_wd_digest_async(void *arg)
+{
+ thread_data *pdata = (thread_data *)arg;
+ struct wcrypto_digest_ctx_setup digest_setup = {0};
+ struct wcrypto_digest_op_data dopdata;
+ struct wcrypto_async_tag *tag = NULL;
+ char priv_key[MAX_IVK_LENTH];
+ struct thread_bd_res *bd_res;
+ struct wd_queue *queue;
+ void *ctx = NULL;
+ void **res_in;
+ void **res_out;
+ u32 count = 0;
+ int try_cnt = 0;
+ int ret, i = 0;
+ void *pool;
+
+ if (pdata->td_id > g_thread_num)
+ return NULL;
+
+ bd_res = &g_thread_queue.bd_res[pdata->td_id];
+ queue = bd_res->queue;
+ pool = bd_res->pool;
+ res_in = bd_res->in;
+ res_out = bd_res->out;
+
+ memset(priv_key, DEF_IVK_DATA, MAX_IVK_LENTH);
+ tag = malloc(sizeof(struct wcrypto_async_tag)); // set the user tag
+ if (!tag) {
+ SEC_TST_PRT("wcrypto async alloc tag fail!\n");
+ return NULL;
+ }
+ tag->thread_id = pdata->td_id;
+
+ digest_setup.alg = pdata->alg;
+ digest_setup.mode = pdata->mode;
+ digest_setup.cb = (void *)digest_async_cb;
+ digest_setup.br.alloc = (void *)wd_alloc_blk;
+ digest_setup.br.free = (void *)wd_free_blk;
+ digest_setup.br.iova_map = (void *)wd_blk_iova_map;
+ digest_setup.br.iova_unmap = (void *)wd_blk_iova_unmap;
+ digest_setup.br.get_bufsize = (void *)wd_blksize;
+ digest_setup.br.usr = pool;
+
+ ctx = wcrypto_create_digest_ctx(queue, &digest_setup);
+ if (!ctx) {
+ SEC_TST_PRT("wd create digest ctx fail!\n");
+ return NULL;
+ }
+ tag->ctx = ctx;
+
+ if (digest_setup.mode == WCRYPTO_DIGEST_HMAC) {
+ ret = wcrypto_set_digest_key(ctx, (__u8*)priv_key,
+ (__u16)pdata->keysize);
+ if (ret) {
+ SEC_TST_PRT("wd digest set key fail!\n");
+ wcrypto_del_digest_ctx(ctx);
return NULL;
}
- tag->ctx = ctx;
-
- if (digest_setup.mode == WCRYPTO_DIGEST_HMAC) {
- ret = wcrypto_set_digest_key(ctx, (__u8*)priv_key,
- (__u16)pdata->keysize);
- if (ret) {
- SEC_TST_PRT("wd digest set key fail!\n");
- wcrypto_del_digest_ctx(ctx);
- return NULL;
- }
- }
+ }
- dopdata.in_bytes = g_pktlen;
- dopdata.out_bytes = 16;
- dopdata.has_next = 0;
- dopdata.priv = NULL;
+ dopdata.in_bytes = g_pktlen;
+ dopdata.out_bytes = 16;
+ dopdata.has_next = 0;
+ dopdata.priv = NULL;
- tag->cnt = 0;
- dopdata.in = res_in[0];
- dopdata.out = res_out[0];
- usleep(SEND_USLEEP);
- while(1) {
- if (get_run_state() == 0)
- break;
-
- ret = wcrypto_do_digest(ctx, &dopdata, (void *)tag);
- if (ret == -WD_EBUSY) {
- usleep(SEND_USLEEP * try_cnt);
- try_cnt++;
- if (try_cnt > MAX_TRY_CNT) {
- SEC_TST_PRT("Test digest send fail %d times!\n", MAX_TRY_CNT);
- try_cnt = 0;
- }
- continue;
- }
+ tag->cnt = 0;
+ dopdata.in = res_in[0];
+ dopdata.out = res_out[0];
+ usleep(SEND_USLEEP);
+ while(1) {
+ if (get_run_state() == 0)
+ break;
- count++;
- i = count % MAX_POOL_LENTH;
- tag->cnt = i;
- try_cnt = 0;
- dopdata.in = res_in[i];
- dopdata.out = res_out[i];
+ ret = wcrypto_do_digest(ctx, &dopdata, (void *)tag);
+ if (ret == -WD_EBUSY) {
+ usleep(SEND_USLEEP * try_cnt);
+ try_cnt++;
+ if (try_cnt > MAX_TRY_CNT) {
+ SEC_TST_PRT("Test digest send fail %d times!\n", MAX_TRY_CNT);
+ try_cnt = 0;
+ }
+ continue;
}
- break;
+ count++;
+ i = count % MAX_POOL_LENTH;
+ tag->cnt = i;
+ try_cnt = 0;
+ dopdata.in = res_in[i];
+ dopdata.out = res_out[i];
}
add_send_complete();
while (1) {
- if (get_recv_time() > 0) // wait Async mode finish recv
+ if (get_recv_time() > 0) // wait async mode finish recv
break;
usleep(SEND_USLEEP);
}
- switch(pdata->subtype) {
- case CIPHER_TYPE:
+ wcrypto_del_digest_ctx(ctx);
+
+ return NULL;
+}
+
+static void *sec_wd_cipher_sync(void *arg)
+{
+ thread_data *pdata = (thread_data *)arg;
+ struct wcrypto_cipher_ctx_setup cipher_setup = {0};
+ struct wcrypto_cipher_op_data copdata;
+ char priv_key[MAX_IVK_LENTH];
+ struct thread_bd_res *bd_res;
+ struct wd_queue *queue;
+ void *ctx = NULL;
+ void *tag = NULL;
+ void **res_in;
+ void **res_out;
+ void **res_iv;
+ u32 count = 0;
+ int try_cnt = 0;
+ int ret, i = 0;
+ void *pool;
+
+ if (pdata->td_id > g_thread_num)
+ return NULL;
+
+ bd_res = &g_thread_queue.bd_res[pdata->td_id];
+ queue = bd_res->queue;
+ pool = bd_res->pool;
+ res_in = bd_res->in;
+ res_out = bd_res->out;
+ res_iv = bd_res->iv;
+
+ memset(priv_key, DEF_IVK_DATA, MAX_IVK_LENTH);
+
+ cipher_setup.alg = pdata->alg;
+ cipher_setup.mode = pdata->mode;
+ cipher_setup.br.alloc = (void *)wd_alloc_blk;
+ cipher_setup.br.free = (void *)wd_free_blk;
+ cipher_setup.br.iova_map = (void *)wd_blk_iova_map;
+ cipher_setup.br.iova_unmap = (void *)wd_blk_iova_unmap;
+ cipher_setup.br.get_bufsize = (void *)wd_blksize;
+ cipher_setup.br.usr = pool;
+
+ ctx = wcrypto_create_cipher_ctx(queue, &cipher_setup);
+ if (!ctx) {
+ SEC_TST_PRT("wd create cipher ctx fail!\n");
+ return NULL;
+ }
+
+ ret = wcrypto_set_cipher_key(ctx, (__u8*)priv_key, (__u16)pdata->keysize);
+ if (ret) {
+ SEC_TST_PRT("wd cipher set key fail!\n");
wcrypto_del_cipher_ctx(ctx);
- break;
- case AEAD_TYPE:
- wcrypto_del_aead_ctx(ctx);
- break;
- case DIGEST_TYPE:
- wcrypto_del_digest_ctx(ctx);
- break;
+ return NULL;
}
+ if (queue->capa.priv.direction == 0)
+ copdata.op_type = WCRYPTO_CIPHER_ENCRYPTION;
+ else
+ copdata.op_type = WCRYPTO_CIPHER_DECRYPTION;
+
+ copdata.in_bytes = g_pktlen;
+ copdata.out_bytes = g_pktlen;
+ copdata.iv_bytes = pdata->ivsize;
+ copdata.priv = NULL;
+
+ copdata.in = res_in[0];
+ copdata.out = res_out[0];
+ copdata.iv = res_iv[0];
+ usleep(SEND_USLEEP);
+ while(1) {
+ if (get_run_state() == 0)
+ break;
+
+ ret = wcrypto_do_cipher(ctx, &copdata, tag);
+ if (ret == -WD_EBUSY) {
+ usleep(SEND_USLEEP * try_cnt);
+ try_cnt++;
+ if (try_cnt > MAX_TRY_CNT) {
+ SEC_TST_PRT("Test cipher send fail %d times!\n", MAX_TRY_CNT);
+ try_cnt = 0;
+ }
+ continue;
+ }
+
+ count++;
+ try_cnt = 0;
+ i = count % MAX_POOL_LENTH;
+ copdata.in = res_in[i];
+ copdata.out = res_out[i];
+ copdata.iv = res_iv[i];
+ }
+ wcrypto_del_cipher_ctx(ctx);
+
+ add_recv_data(count, g_pktlen);
+
return NULL;
}
-static void *sec_wd_sync_run(void *arg)
+static void *sec_wd_aead_sync(void *arg)
{
thread_data *pdata = (thread_data *)arg;
- struct wcrypto_cipher_ctx_setup cipher_setup = {0};
struct wcrypto_aead_ctx_setup aead_setup = {0};
- struct wcrypto_digest_ctx_setup digest_setup = {0};
- struct wcrypto_cipher_op_data copdata;
struct wcrypto_aead_op_data aopdata;
- struct wcrypto_digest_op_data dopdata;
char priv_key[MAX_IVK_LENTH];
+ char priv_hash[MAX_IVK_LENTH];
struct thread_bd_res *bd_res;
struct wd_queue *queue;
void *ctx = NULL;
@@ -852,203 +1068,182 @@ static void *sec_wd_sync_run(void *arg)
res_iv = bd_res->iv;
memset(priv_key, DEF_IVK_DATA, MAX_IVK_LENTH);
+ memset(priv_hash, DEF_IVK_DATA, MAX_IVK_LENTH);
+
+ aead_setup.calg = pdata->alg;
+ aead_setup.cmode = pdata->mode;
+ aead_setup.br.alloc = (void *)wd_alloc_blk;
+ aead_setup.br.free = (void *)wd_free_blk;
+ aead_setup.br.iova_map = (void *)wd_blk_iova_map;
+ aead_setup.br.iova_unmap = (void *)wd_blk_iova_unmap;
+ aead_setup.br.get_bufsize = (void *)wd_blksize;
+ aead_setup.br.usr = pool;
+ if (pdata->is_union) {
+ aead_setup.dalg = pdata->dalg;
+ aead_setup.dmode = pdata->dmode;
+ }
- switch(pdata->subtype) {
- case CIPHER_TYPE:
- cipher_setup.alg = pdata->alg;
- cipher_setup.mode = pdata->mode;
- cipher_setup.br.alloc = (void *)wd_alloc_blk;
- cipher_setup.br.free = (void *)wd_free_blk;
- cipher_setup.br.iova_map = (void *)wd_blk_iova_map;
- cipher_setup.br.iova_unmap = (void *)wd_blk_iova_unmap;
- cipher_setup.br.get_bufsize = (void *)wd_blksize;
- cipher_setup.br.usr = pool;
-
- ctx = wcrypto_create_cipher_ctx(queue, &cipher_setup);
- if (!ctx) {
- SEC_TST_PRT("wd create cipher ctx fail!\n");
- return NULL;
- }
+ ctx = wcrypto_create_aead_ctx(queue, &aead_setup);
+ if (!ctx) {
+ SEC_TST_PRT("wd create aead ctx fail!\n");
+ return NULL;
+ }
+
+ ret = wcrypto_set_aead_ckey(ctx, (__u8*)priv_key, (__u16)pdata->keysize);
+ if (ret) {
+ SEC_TST_PRT("wd aead set key fail!\n");
+ wcrypto_del_aead_ctx(ctx);
+ return NULL;
+ }
- ret = wcrypto_set_cipher_key(ctx, (__u8*)priv_key, (__u16)pdata->keysize);
+ if (pdata->is_union) {
+ ret = wcrypto_set_aead_akey(ctx, (__u8 *)priv_hash, HASH_ZISE);
if (ret) {
- SEC_TST_PRT("wd cipher set key fail!\n");
- wcrypto_del_cipher_ctx(ctx);
+ SEC_TST_PRT("set akey fail!\n");
+ wcrypto_del_aead_ctx(ctx);
return NULL;
}
+ }
+
+ authsize = 16; //set defaut size
+ ret = wcrypto_aead_setauthsize(ctx, authsize);
+ if (ret) {
+ SEC_TST_PRT("set authsize fail!\n");
+ wcrypto_del_aead_ctx(ctx);
+ return NULL;
+ }
- if (queue->capa.priv.direction == 0)
- copdata.op_type = WCRYPTO_CIPHER_ENCRYPTION;
- else
- copdata.op_type = WCRYPTO_CIPHER_DECRYPTION;
+ if (queue->capa.priv.direction == 0) {
+ aopdata.op_type = WCRYPTO_CIPHER_ENCRYPTION_DIGEST;
+ aopdata.out_bytes = g_pktlen + 32; // aad + plen + authsize;
+ } else {
+ aopdata.op_type = WCRYPTO_CIPHER_DECRYPTION_DIGEST;
+ aopdata.out_bytes = g_pktlen + 16; // aad + plen;
+ }
- copdata.in_bytes = g_pktlen;
- copdata.out_bytes = g_pktlen;
- copdata.iv_bytes = pdata->ivsize;
- copdata.priv = NULL;
+ aopdata.assoc_size = 16;
+ aopdata.in_bytes = g_pktlen;
+ aopdata.out_bytes = g_pktlen;
+ aopdata.iv_bytes = pdata->ivsize;
+ aopdata.priv = NULL;
+ aopdata.out_buf_bytes = g_pktlen * 2;
+
+ aopdata.in = res_in[0];
+ aopdata.out = res_out[0];
+ aopdata.iv = res_iv[0];
+ usleep(SEND_USLEEP);
+ while(1) {
+ if (get_run_state() == 0)
+ break;
- copdata.in = res_in[0];
- copdata.out = res_out[0];
- copdata.iv = res_iv[0];
- usleep(SEND_USLEEP);
- while(1) {
- if (get_run_state() == 0)
- break;
-
- ret = wcrypto_do_cipher(ctx, &copdata, tag);
- if (ret == -WD_EBUSY) {
- usleep(SEND_USLEEP * try_cnt);
- try_cnt++;
- if (try_cnt > MAX_TRY_CNT) {
- SEC_TST_PRT("Test cipher send fail %d times!\n", MAX_TRY_CNT);
- try_cnt = 0;
- }
- continue;
+ ret = wcrypto_do_aead(ctx, &aopdata, tag);
+ if (ret == -WD_EBUSY) {
+ usleep(SEND_USLEEP * try_cnt);
+ try_cnt++;
+ if (try_cnt > MAX_TRY_CNT) {
+ SEC_TST_PRT("Test aead send fail %d times!\n", MAX_TRY_CNT);
+ try_cnt = 0;
}
-
- count++;
- try_cnt = 0;
- i = count % MAX_POOL_LENTH;
- copdata.in = res_in[i];
- copdata.out = res_out[i];
- copdata.iv = res_iv[i];
+ continue;
}
- wcrypto_del_cipher_ctx(ctx);
- break;
- case AEAD_TYPE: // just ccm and gcm
- aead_setup.calg = pdata->alg;
- aead_setup.cmode = pdata->mode;
- aead_setup.br.alloc = (void *)wd_alloc_blk;
- aead_setup.br.free = (void *)wd_free_blk;
- aead_setup.br.iova_map = (void *)wd_blk_iova_map;
- aead_setup.br.iova_unmap = (void *)wd_blk_iova_unmap;
- aead_setup.br.get_bufsize = (void *)wd_blksize;
- aead_setup.br.usr = pool;
-
- ctx = wcrypto_create_aead_ctx(queue, &aead_setup);
- if (!ctx) {
- SEC_TST_PRT("wd create aead ctx fail!\n");
- return NULL;
- }
+ count++;
+ try_cnt = 0;
+ i = count % MAX_POOL_LENTH;
+ aopdata.in = res_in[i];
+ aopdata.out = res_out[i];
+ aopdata.iv = res_iv[i];
+ }
+ wcrypto_del_aead_ctx(ctx);
- ret = wcrypto_set_aead_ckey(ctx, (__u8*)priv_key, (__u16)pdata->keysize);
- if (ret) {
- SEC_TST_PRT("wd aead set key fail!\n");
- wcrypto_del_aead_ctx(ctx);
- return NULL;
- }
+ add_recv_data(count, g_pktlen);
- authsize = 16; //set defaut size
- ret = wcrypto_aead_setauthsize(ctx, authsize);
- if (ret) {
- SEC_TST_PRT("set authsize fail!\n");
- wcrypto_del_aead_ctx(ctx);
- return NULL;
- }
+ return NULL;
+}
- if (queue->capa.priv.direction == 0) {
- aopdata.op_type = WCRYPTO_CIPHER_ENCRYPTION_DIGEST;
- aopdata.out_bytes = g_pktlen + 32; // aad + plen + authsize;
- } else {
- aopdata.op_type = WCRYPTO_CIPHER_DECRYPTION_DIGEST;
- aopdata.out_bytes = g_pktlen + 16; // aad + plen;
- }
+static void *sec_wd_digest_sync(void *arg)
+{
+ thread_data *pdata = (thread_data *)arg;
+ struct wcrypto_digest_ctx_setup digest_setup = {0};
+ struct wcrypto_digest_op_data dopdata;
+ char priv_key[MAX_IVK_LENTH];
+ struct thread_bd_res *bd_res;
+ struct wd_queue *queue;
+ void *ctx = NULL;
+ void *tag = NULL;
+ void **res_in;
+ void **res_out;
+ u32 count = 0;
+ int try_cnt = 0;
+ int ret, i = 0;
+ void *pool;
- aopdata.assoc_size = 16;
- aopdata.in_bytes = g_pktlen;
- aopdata.out_bytes = g_pktlen;
- aopdata.iv_bytes = pdata->ivsize;
- aopdata.priv = NULL;
- aopdata.out_buf_bytes = g_pktlen * 2;
+ if (pdata->td_id > g_thread_num)
+ return NULL;
- aopdata.in = res_in[0];
- aopdata.out = res_out[0];
- aopdata.iv = res_iv[0];
- usleep(SEND_USLEEP);
- while(1) {
- if (get_run_state() == 0)
- break;
-
- ret = wcrypto_do_aead(ctx, &aopdata, tag);
- if (ret == -WD_EBUSY) {
- usleep(SEND_USLEEP * try_cnt);
- try_cnt++;
- if (try_cnt > MAX_TRY_CNT) {
- SEC_TST_PRT("Test aead send fail %d times!\n", MAX_TRY_CNT);
- try_cnt = 0;
- }
- continue;
- }
+ bd_res = &g_thread_queue.bd_res[pdata->td_id];
+ queue = bd_res->queue;
+ pool = bd_res->pool;
+ res_in = bd_res->in;
+ res_out = bd_res->out;
- count++;
- try_cnt = 0;
- i = count % MAX_POOL_LENTH;
- aopdata.in = res_in[i];
- aopdata.out = res_out[i];
- aopdata.iv = res_iv[i];
- }
- wcrypto_del_aead_ctx(ctx);
+ memset(priv_key, DEF_IVK_DATA, MAX_IVK_LENTH);
- break;
- case DIGEST_TYPE:
- digest_setup.alg = pdata->alg;
- digest_setup.mode = pdata->mode;
- digest_setup.br.alloc = (void *)wd_alloc_blk;
- digest_setup.br.free = (void *)wd_free_blk;
- digest_setup.br.iova_map = (void *)wd_blk_iova_map;
- digest_setup.br.iova_unmap = (void *)wd_blk_iova_unmap;
- digest_setup.br.get_bufsize = (void *)wd_blksize;
- digest_setup.br.usr = pool;
-
- ctx = wcrypto_create_digest_ctx(queue, &digest_setup);
- if (!ctx) {
- SEC_TST_PRT("wd create digest ctx fail!\n");
+ digest_setup.alg = pdata->alg;
+ digest_setup.mode = pdata->mode;
+ digest_setup.br.alloc = (void *)wd_alloc_blk;
+ digest_setup.br.free = (void *)wd_free_blk;
+ digest_setup.br.iova_map = (void *)wd_blk_iova_map;
+ digest_setup.br.iova_unmap = (void *)wd_blk_iova_unmap;
+ digest_setup.br.get_bufsize = (void *)wd_blksize;
+ digest_setup.br.usr = pool;
+
+ ctx = wcrypto_create_digest_ctx(queue, &digest_setup);
+ if (!ctx) {
+ SEC_TST_PRT("wd create digest ctx fail!\n");
+ return NULL;
+ }
+
+ if (digest_setup.mode == WCRYPTO_DIGEST_HMAC) {
+ ret = wcrypto_set_digest_key(ctx, (__u8*)priv_key,
+ (__u16)pdata->keysize);
+ if (ret) {
+ SEC_TST_PRT("wd digest set key fail!\n");
+ wcrypto_del_digest_ctx(ctx);
return NULL;
}
+ }
- if (digest_setup.mode == WCRYPTO_DIGEST_HMAC) {
- ret = wcrypto_set_digest_key(ctx, (__u8*)priv_key,
- (__u16)pdata->keysize);
- if (ret) {
- SEC_TST_PRT("wd digest set key fail!\n");
- wcrypto_del_digest_ctx(ctx);
- return NULL;
- }
- }
+ dopdata.in_bytes = g_pktlen;
+ dopdata.out_bytes = 16;
+ dopdata.has_next = 0;
+ dopdata.priv = NULL;
- dopdata.in_bytes = g_pktlen;
- dopdata.out_bytes = 16;
- dopdata.has_next = 0;
- dopdata.priv = NULL;
+ dopdata.in = res_in[0];
+ dopdata.out = res_out[0];
+ usleep(SEND_USLEEP);
+ while(1) {
+ if (get_run_state() == 0)
+ break;
- dopdata.in = res_in[0];
- dopdata.out = res_out[0];
- usleep(SEND_USLEEP);
- while(1) {
- if (get_run_state() == 0)
- break;
-
- ret = wcrypto_do_digest(ctx, &dopdata, (void *)tag);
- if (ret == -WD_EBUSY) {
- usleep(SEND_USLEEP * try_cnt);
- try_cnt++;
- if (try_cnt > MAX_TRY_CNT) {
- SEC_TST_PRT("Test digest send fail %d times!\n", MAX_TRY_CNT);
- try_cnt = 0;
- }
- continue;
+ ret = wcrypto_do_digest(ctx, &dopdata, (void *)tag);
+ if (ret == -WD_EBUSY) {
+ usleep(SEND_USLEEP * try_cnt);
+ try_cnt++;
+ if (try_cnt > MAX_TRY_CNT) {
+ SEC_TST_PRT("Test digest send fail %d times!\n", MAX_TRY_CNT);
+ try_cnt = 0;
}
-
- count++;
- try_cnt = 0;
- i = count % MAX_POOL_LENTH;
- dopdata.in = res_in[i];
- dopdata.out = res_out[i];
+ continue;
}
- wcrypto_del_digest_ctx(ctx);
- break;
+
+ count++;
+ try_cnt = 0;
+ i = count % MAX_POOL_LENTH;
+ dopdata.in = res_in[i];
+ dopdata.out = res_out[i];
}
+ wcrypto_del_digest_ctx(ctx);
add_recv_data(count, g_pktlen);
@@ -1057,6 +1252,8 @@ static void *sec_wd_sync_run(void *arg)
int sec_wd_sync_threads(struct acc_option *options)
{
+ typedef void *(*sec_sync_run)(void *arg);
+ sec_sync_run wd_sec_sync_run = NULL;
thread_data threads_args[THREADS_NUM];
thread_data threads_option;
pthread_t tdid[THREADS_NUM];
@@ -1067,6 +1264,18 @@ int sec_wd_sync_threads(struct acc_option *options)
if (ret)
return ret;
+ switch (options->subtype) {
+ case CIPHER_TYPE:
+ wd_sec_sync_run = sec_wd_cipher_sync;
+ break;
+ case AEAD_TYPE:
+ wd_sec_sync_run = sec_wd_aead_sync;
+ break;
+ case DIGEST_TYPE:
+ wd_sec_sync_run = sec_wd_digest_sync;
+ break;
+ }
+
for (i = 0; i < g_thread_num; i++) {
threads_args[i].subtype = threads_option.subtype;
threads_args[i].alg = threads_option.alg;
@@ -1075,7 +1284,7 @@ int sec_wd_sync_threads(struct acc_option *options)
threads_args[i].ivsize = threads_option.ivsize;
threads_args[i].optype = threads_option.optype;
threads_args[i].td_id = i;
- ret = pthread_create(&tdid[i], NULL, sec_wd_sync_run, &threads_args[i]);
+ ret = pthread_create(&tdid[i], NULL, wd_sec_sync_run, &threads_args[i]);
if (ret) {
SEC_TST_PRT("Create sync thread fail!\n");
goto sync_error;
@@ -1098,6 +1307,8 @@ sync_error:
int sec_wd_async_threads(struct acc_option *options)
{
+ typedef void *(*sec_async_run)(void *arg);
+ sec_async_run wd_sec_async_run = NULL;
thread_data threads_args[THREADS_NUM];
thread_data threads_option;
pthread_t tdid[THREADS_NUM];
@@ -1120,6 +1331,18 @@ int sec_wd_async_threads(struct acc_option *options)
}
}
+ switch (options->subtype) {
+ case CIPHER_TYPE:
+ wd_sec_async_run = sec_wd_cipher_async;
+ break;
+ case AEAD_TYPE:
+ wd_sec_async_run = sec_wd_aead_async;
+ break;
+ case DIGEST_TYPE:
+ wd_sec_async_run = sec_wd_digest_async;
+ break;
+ }
+
for (i = 0; i < g_thread_num; i++) {
threads_args[i].subtype = threads_option.subtype;
threads_args[i].alg = threads_option.alg;
@@ -1128,7 +1351,7 @@ int sec_wd_async_threads(struct acc_option *options)
threads_args[i].ivsize = threads_option.ivsize;
threads_args[i].optype = threads_option.optype;
threads_args[i].td_id = i;
- ret = pthread_create(&tdid[i], NULL, sec_wd_async_run, &threads_args[i]);
+ ret = pthread_create(&tdid[i], NULL, wd_sec_async_run, &threads_args[i]);
if (ret) {
SEC_TST_PRT("Create async thread fail!\n");
goto async_error;
@@ -1186,3 +1409,4 @@ int sec_wd_benchmark(struct acc_option *options)
return 0;
}
+
--
2.25.1