test/crypto: add PDCP cases for scatter gather

Test cases for PDCP with scattered input and output
buffers are added for both inplace and out of place scenarios.
1. input SG - output non SG
2. input and output both SG and inplace buffers
3. input and output both SG with different segment sizes
4. input SG and output non-SG

Signed-off-by: Akhil Goyal <akhil.goyal@nxp.com>
Acked-by: Nipun Gupta <nipun.gupta@nxp.com>
This commit is contained in:
Akhil Goyal 2019-10-01 00:57:45 +05:30
parent 2d54b9ce12
commit 43220096d6
2 changed files with 360 additions and 0 deletions

View File

@ -7203,6 +7203,277 @@ test_pdcp_proto(int i, int oop,
return ret;
}
static int
test_pdcp_proto_SGL(int i, int oop,
enum rte_crypto_cipher_operation opc,
enum rte_crypto_auth_operation opa,
uint8_t *input_vec,
unsigned int input_vec_len,
uint8_t *output_vec,
unsigned int output_vec_len,
uint32_t fragsz,
uint32_t fragsz_oop)
{
struct crypto_testsuite_params *ts_params = &testsuite_params;
struct crypto_unittest_params *ut_params = &unittest_params;
uint8_t *plaintext;
struct rte_mbuf *buf, *buf_oop = NULL;
int ret = TEST_SUCCESS;
int to_trn = 0;
int to_trn_tbl[16];
int segs = 1;
unsigned int trn_data = 0;
if (fragsz > input_vec_len)
fragsz = input_vec_len;
uint16_t plaintext_len = fragsz;
uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
if (fragsz_oop > output_vec_len)
frag_size_oop = output_vec_len;
int ecx = 0;
if (input_vec_len % fragsz != 0) {
if (input_vec_len / fragsz + 1 > 16)
return 1;
} else if (input_vec_len / fragsz > 16)
return 1;
/* Out of place support */
if (oop) {
/*
* For out-op-place we need to alloc another mbuf
*/
ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
rte_pktmbuf_append(ut_params->obuf, frag_size_oop);
buf_oop = ut_params->obuf;
}
/* Generate test mbuf data */
ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
/* clear mbuf payload */
memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
rte_pktmbuf_tailroom(ut_params->ibuf));
plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
plaintext_len);
memcpy(plaintext, input_vec, plaintext_len);
trn_data += plaintext_len;
buf = ut_params->ibuf;
/*
* Loop until no more fragments
*/
while (trn_data < input_vec_len) {
++segs;
to_trn = (input_vec_len - trn_data < fragsz) ?
(input_vec_len - trn_data) : fragsz;
to_trn_tbl[ecx++] = to_trn;
buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
buf = buf->next;
memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
rte_pktmbuf_tailroom(buf));
/* OOP */
if (oop && !fragsz_oop) {
buf_oop->next =
rte_pktmbuf_alloc(ts_params->mbuf_pool);
buf_oop = buf_oop->next;
memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
0, rte_pktmbuf_tailroom(buf_oop));
rte_pktmbuf_append(buf_oop, to_trn);
}
plaintext = (uint8_t *)rte_pktmbuf_append(buf,
to_trn);
memcpy(plaintext, input_vec + trn_data, to_trn);
trn_data += to_trn;
}
ut_params->ibuf->nb_segs = segs;
segs = 1;
if (fragsz_oop && oop) {
to_trn = 0;
ecx = 0;
trn_data = frag_size_oop;
while (trn_data < output_vec_len) {
++segs;
to_trn =
(output_vec_len - trn_data <
frag_size_oop) ?
(output_vec_len - trn_data) :
frag_size_oop;
to_trn_tbl[ecx++] = to_trn;
buf_oop->next =
rte_pktmbuf_alloc(ts_params->mbuf_pool);
buf_oop = buf_oop->next;
memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
0, rte_pktmbuf_tailroom(buf_oop));
rte_pktmbuf_append(buf_oop, to_trn);
trn_data += to_trn;
}
ut_params->obuf->nb_segs = segs;
}
ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
/* Setup Cipher Parameters */
ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
ut_params->cipher_xform.cipher.op = opc;
ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
ut_params->cipher_xform.cipher.key.length =
pdcp_test_params[i].cipher_key_len;
ut_params->cipher_xform.cipher.iv.length = 0;
/* Setup HMAC Parameters if ICV header is required */
if (pdcp_test_params[i].auth_alg != 0) {
ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
ut_params->auth_xform.next = NULL;
ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
ut_params->auth_xform.auth.op = opa;
ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
ut_params->auth_xform.auth.key.length =
pdcp_test_params[i].auth_key_len;
ut_params->cipher_xform.next = &ut_params->auth_xform;
} else {
ut_params->cipher_xform.next = NULL;
}
struct rte_security_session_conf sess_conf = {
.action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
.protocol = RTE_SECURITY_PROTOCOL_PDCP,
{.pdcp = {
.bearer = pdcp_test_bearer[i],
.domain = pdcp_test_params[i].domain,
.pkt_dir = pdcp_test_packet_direction[i],
.sn_size = pdcp_test_data_sn_size[i],
.hfn = pdcp_test_hfn[i],
.hfn_threshold = pdcp_test_hfn_threshold[i],
} },
.crypto_xform = &ut_params->cipher_xform
};
struct rte_security_ctx *ctx = (struct rte_security_ctx *)
rte_cryptodev_get_sec_ctx(
ts_params->valid_devs[0]);
/* Create security session */
ut_params->sec_session = rte_security_session_create(ctx,
&sess_conf, ts_params->session_mpool);
if (!ut_params->sec_session) {
printf("TestCase %s()-%d line %d failed %s: ",
__func__, i, __LINE__, "Failed to allocate session");
ret = TEST_FAILED;
goto on_err;
}
/* Generate crypto op data structure */
ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
RTE_CRYPTO_OP_TYPE_SYMMETRIC);
if (!ut_params->op) {
printf("TestCase %s()-%d line %d failed %s: ",
__func__, i, __LINE__,
"Failed to allocate symmetric crypto operation struct");
ret = TEST_FAILED;
goto on_err;
}
rte_security_attach_session(ut_params->op, ut_params->sec_session);
/* set crypto operation source mbuf */
ut_params->op->sym->m_src = ut_params->ibuf;
if (oop)
ut_params->op->sym->m_dst = ut_params->obuf;
/* Process crypto operation */
if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
== NULL) {
printf("TestCase %s()-%d line %d failed %s: ",
__func__, i, __LINE__,
"failed to process sym crypto op");
ret = TEST_FAILED;
goto on_err;
}
if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
printf("TestCase %s()-%d line %d failed %s: ",
__func__, i, __LINE__, "crypto op processing failed");
ret = TEST_FAILED;
goto on_err;
}
/* Validate obuf */
uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
uint8_t *);
if (oop) {
ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
uint8_t *);
}
if (fragsz_oop)
fragsz = frag_size_oop;
if (memcmp(ciphertext, output_vec, fragsz)) {
printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
rte_hexdump(stdout, "encrypted", ciphertext, fragsz);
rte_hexdump(stdout, "reference", output_vec, fragsz);
ret = TEST_FAILED;
goto on_err;
}
buf = ut_params->op->sym->m_src->next;
if (oop)
buf = ut_params->op->sym->m_dst->next;
unsigned int off = fragsz;
ecx = 0;
while (buf) {
ciphertext = rte_pktmbuf_mtod(buf,
uint8_t *);
if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {
printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]);
rte_hexdump(stdout, "reference", output_vec + off,
to_trn_tbl[ecx]);
ret = TEST_FAILED;
goto on_err;
}
off += to_trn_tbl[ecx++];
buf = buf->next;
}
on_err:
rte_crypto_op_free(ut_params->op);
ut_params->op = NULL;
if (ut_params->sec_session)
rte_security_session_destroy(ctx, ut_params->sec_session);
ut_params->sec_session = NULL;
rte_pktmbuf_free(ut_params->ibuf);
ut_params->ibuf = NULL;
if (oop) {
rte_pktmbuf_free(ut_params->obuf);
ut_params->obuf = NULL;
}
return ret;
}
int
test_pdcp_proto_cplane_encap(int i)
{
@ -7276,6 +7547,71 @@ test_pdcp_proto_uplane_decap_with_int(int i)
pdcp_test_data_in_len[i]);
}
static int
test_PDCP_PROTO_SGL_in_place_32B(void)
{
/* i can be used for running any PDCP case
* In this case it is uplane 12-bit AES-SNOW DL encap
*/
int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;
return test_pdcp_proto_SGL(i, IN_PLACE,
RTE_CRYPTO_CIPHER_OP_ENCRYPT,
RTE_CRYPTO_AUTH_OP_GENERATE,
pdcp_test_data_in[i],
pdcp_test_data_in_len[i],
pdcp_test_data_out[i],
pdcp_test_data_in_len[i]+4,
32, 0);
}
static int
test_PDCP_PROTO_SGL_oop_32B_128B(void)
{
/* i can be used for running any PDCP case
* In this case it is uplane 18-bit NULL-NULL DL encap
*/
int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;
return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
RTE_CRYPTO_CIPHER_OP_ENCRYPT,
RTE_CRYPTO_AUTH_OP_GENERATE,
pdcp_test_data_in[i],
pdcp_test_data_in_len[i],
pdcp_test_data_out[i],
pdcp_test_data_in_len[i]+4,
32, 128);
}
static int
test_PDCP_PROTO_SGL_oop_32B_40B(void)
{
/* i can be used for running any PDCP case
* In this case it is uplane 18-bit AES DL encap
*/
int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET
+ DOWNLINK;
return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
RTE_CRYPTO_CIPHER_OP_ENCRYPT,
RTE_CRYPTO_AUTH_OP_GENERATE,
pdcp_test_data_in[i],
pdcp_test_data_in_len[i],
pdcp_test_data_out[i],
pdcp_test_data_in_len[i],
32, 40);
}
static int
test_PDCP_PROTO_SGL_oop_128B_32B(void)
{
/* i can be used for running any PDCP case
* In this case it is cplane 12-bit AES-ZUC DL encap
*/
int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;
return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
RTE_CRYPTO_CIPHER_OP_ENCRYPT,
RTE_CRYPTO_AUTH_OP_GENERATE,
pdcp_test_data_in[i],
pdcp_test_data_in_len[i],
pdcp_test_data_out[i],
pdcp_test_data_in_len[i]+4,
128, 32);
}
#endif
static int
@ -11702,6 +12038,15 @@ static struct unit_test_suite cryptodev_dpaa_sec_testsuite = {
TEST_CASE_ST(ut_setup, ut_teardown,
test_PDCP_PROTO_uplane_decap_all),
TEST_CASE_ST(ut_setup, ut_teardown,
test_PDCP_PROTO_SGL_in_place_32B),
TEST_CASE_ST(ut_setup, ut_teardown,
test_PDCP_PROTO_SGL_oop_32B_128B),
TEST_CASE_ST(ut_setup, ut_teardown,
test_PDCP_PROTO_SGL_oop_32B_40B),
TEST_CASE_ST(ut_setup, ut_teardown,
test_PDCP_PROTO_SGL_oop_128B_32B),
#endif
/** AES GCM Authenticated Encryption */
TEST_CASE_ST(ut_setup, ut_teardown,
@ -11820,6 +12165,15 @@ static struct unit_test_suite cryptodev_dpaa2_sec_testsuite = {
TEST_CASE_ST(ut_setup, ut_teardown,
test_PDCP_PROTO_uplane_decap_all),
TEST_CASE_ST(ut_setup, ut_teardown,
test_PDCP_PROTO_SGL_in_place_32B),
TEST_CASE_ST(ut_setup, ut_teardown,
test_PDCP_PROTO_SGL_oop_32B_128B),
TEST_CASE_ST(ut_setup, ut_teardown,
test_PDCP_PROTO_SGL_oop_32B_40B),
TEST_CASE_ST(ut_setup, ut_teardown,
test_PDCP_PROTO_SGL_oop_128B_32B),
#endif
/** AES GCM Authenticated Encryption */
TEST_CASE_ST(ut_setup, ut_teardown,

View File

@ -56,6 +56,12 @@ New Features
Also, make sure to start the actual text at the margin.
=========================================================
* **Updated NXP crypto PMDs for PDCP support.**
PDCP support is added to DPAA_SEC and DPAA2_SEC PMDs using rte_security APIs.
Support is added for all sequence number sizes for control and user plane.
Test application is updated for unit testing.
* **Updated the Intel QuickAssist Technology (QAT) compression PMD.**
Added stateful decompression support in the Intel QuickAssist Technology PMD.