[v3,6/7] test/event: add asymmetric cases for crypto adapter

Message ID 20220421143720.1583062-7-gakhil@marvell.com (mailing list archive)
State Superseded, archived
Delegated to: akhil goyal
Headers
Series Add new cryptodev op for event metadata |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Akhil Goyal April 21, 2022, 2:37 p.m. UTC
  Test app is updated to add cases for asymmetric crypto
sessions for event crypto adapter.

Signed-off-by: Akhil Goyal <gakhil@marvell.com>
---
 app/test/test_event_crypto_adapter.c | 491 ++++++++++++++++++++++++++-
 1 file changed, 485 insertions(+), 6 deletions(-)
  

Comments

Fan Zhang April 27, 2022, 3:39 p.m. UTC | #1
> -----Original Message-----
> From: Akhil Goyal <gakhil@marvell.com>
> Sent: Thursday, April 21, 2022 3:37 PM
> To: dev@dpdk.org
> Cc: anoobj@marvell.com; jerinj@marvell.com; Gujjar, Abhinandan S
> <abhinandan.gujjar@intel.com>; Jayatheerthan, Jay
> <jay.jayatheerthan@intel.com>; Vangati, Narender
> <narender.vangati@intel.com>; vfialko@marvell.com; Akhil Goyal
> <gakhil@marvell.com>
> Subject: [PATCH v3 6/7] test/event: add asymmetric cases for crypto adapter
> 
> Test app is updated to add cases for asymmetric crypto
> sessions for event crypto adapter.
> 
> Signed-off-by: Akhil Goyal <gakhil@marvell.com>
> ---
Acked-by: Fan Zhang <roy.fan.zhang@intel.com>
  
Gujjar, Abhinandan S April 28, 2022, 3:14 p.m. UTC | #2
This is failing with asym changes. Please look into this.

root@xdp-dev:/home/intel/abhi/dpdk-next-eventdev/abhi# ./app/test/dpdk-test
EAL: Detected CPU lcores: 96
EAL: Detected NUMA nodes: 2
EAL: Detected static linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Probe PCI driver: net_ice (8086:1593) device: 0000:18:00.0 (socket 0)
ice_load_pkg_type(): Active package is: 1.3.26.0, ICE OS Default Package (single VLAN mode)
EAL: Probe PCI driver: net_ice (8086:1593) device: 0000:18:00.1 (socket 0)
ice_load_pkg_type(): Active package is: 1.3.26.0, ICE OS Default Package (single VLAN mode)
TELEMETRY: No legacy callbacks, legacy socket not created
APP: HPET is not enabled, using TSC as default timer
RTE>>event_crypto_adapter_autotest
 + ------------------------------------------------------- +
 + Test Suite : Event crypto adapter test suite
CRYPTODEV: Creating cryptodev crypto_null

CRYPTODEV: Initialisation parameters - name: crypto_null,socket id: 0, max queue pairs: 8
CRYPTODEV: elt_size 0 is expanded to 208

CRYPTODEV: Could not set max private session size

EAL: Test assert configure_cryptodev line 1028 failed: asym session mempool allocation failed

EAL: Test assert testsuite_setup line 1361 failed: cryptodev initialization failed

 + ------------------------------------------------------- +
 + Test Suite Summary : Event crypto adapter test suite
 + ------------------------------------------------------- +
 + Tests Total :       11
 + Tests Skipped :      0
 + Tests Executed :     0
 + Tests Unsupported:   0
 + Tests Passed :       0
 + Tests Failed :      11
 + ------------------------------------------------------- +
Test Failed


> -----Original Message-----
> From: Akhil Goyal <gakhil@marvell.com>
> Sent: Thursday, April 21, 2022 8:07 PM
> To: dev@dpdk.org
> Cc: anoobj@marvell.com; jerinj@marvell.com; Gujjar, Abhinandan S
> <abhinandan.gujjar@intel.com>; Jayatheerthan, Jay
> <jay.jayatheerthan@intel.com>; Vangati, Narender
> <narender.vangati@intel.com>; vfialko@marvell.com; Akhil Goyal
> <gakhil@marvell.com>
> Subject: [PATCH v3 6/7] test/event: add asymmetric cases for crypto adapter
> 
> Test app is updated to add cases for asymmetric crypto sessions for event
> crypto adapter.
> 
> Signed-off-by: Akhil Goyal <gakhil@marvell.com>
> ---
>  app/test/test_event_crypto_adapter.c | 491 ++++++++++++++++++++++++++-
>  1 file changed, 485 insertions(+), 6 deletions(-)
> 
> diff --git a/app/test/test_event_crypto_adapter.c
> b/app/test/test_event_crypto_adapter.c
> index 9904206735..eecfc22057 100644
> --- a/app/test/test_event_crypto_adapter.c
> +++ b/app/test/test_event_crypto_adapter.c
> @@ -6,6 +6,7 @@
>  #include "test.h"
>  #include <string.h>
>  #include <rte_common.h>
> +#include <rte_malloc.h>
>  #include <rte_mempool.h>
>  #include <rte_mbuf.h>
>  #include <rte_cryptodev.h>
> @@ -67,12 +68,97 @@ static const uint8_t text_64B[] = {
>  	0x31, 0xbf, 0xe9, 0xa1, 0x97, 0x5c, 0x2b, 0xd6,
>  	0x57, 0xa5, 0x9f, 0xab, 0xbd, 0xb0, 0x9b, 0x9c  };
> +#define DATA_SIZE		512
> +struct modex_test_data {
> +	enum rte_crypto_asym_xform_type xform_type;
> +	struct {
> +		uint8_t data[DATA_SIZE];
> +		uint16_t len;
> +	} base;
> +	struct {
> +		uint8_t data[DATA_SIZE];
> +		uint16_t len;
> +	} exponent;
> +	struct {
> +		uint8_t data[DATA_SIZE];
> +		uint16_t len;
> +	} modulus;
> +	struct {
> +		uint8_t data[DATA_SIZE];
> +		uint16_t len;
> +	} reminder;
> +	uint16_t result_len;
> +};
> +
> +static struct
> +modex_test_data modex_test_case = {
> +	.xform_type = RTE_CRYPTO_ASYM_XFORM_MODEX,
> +	.base = {
> +		.data = {
> +			0xF8, 0xBA, 0x1A, 0x55, 0xD0, 0x2F, 0x85,
> +			0xAE, 0x96, 0x7B, 0xB6, 0x2F, 0xB6, 0xCD,
> +			0xA8, 0xEB, 0x7E, 0x78, 0xA0, 0x50
> +		},
> +		.len = 20,
> +	},
> +	.exponent = {
> +		.data = {
> +			0x01, 0x00, 0x01
> +		},
> +		.len = 3,
> +	},
> +	.reminder = {
> +		.data = {
> +			0x2C, 0x60, 0x75, 0x45, 0x98, 0x9D, 0xE0, 0x72,
> +			0xA0, 0x9D, 0x3A, 0x9E, 0x03, 0x38, 0x73, 0x3C,
> +			0x31, 0x83, 0x04, 0xFE, 0x75, 0x43, 0xE6, 0x17,
> +			0x5C, 0x01, 0x29, 0x51, 0x69, 0x33, 0x62, 0x2D,
> +			0x78, 0xBE, 0xAE, 0xC4, 0xBC, 0xDE, 0x7E, 0x2C,
> +			0x77, 0x84, 0xF2, 0xC5, 0x14, 0xB5, 0x2F, 0xF7,
> +			0xC5, 0x94, 0xEF, 0x86, 0x75, 0x75, 0xB5, 0x11,
> +			0xE5, 0x0E, 0x0A, 0x29, 0x76, 0xE2, 0xEA, 0x32,
> +			0x0E, 0x43, 0x77, 0x7E, 0x2C, 0x27, 0xAC, 0x3B,
> +			0x86, 0xA5, 0xDB, 0xC9, 0x48, 0x40, 0xE8, 0x99,
> +			0x9A, 0x0A, 0x3D, 0xD6, 0x74, 0xFA, 0x2E, 0x2E,
> +			0x5B, 0xAF, 0x8C, 0x99, 0x44, 0x2A, 0x67, 0x38,
> +			0x27, 0x41, 0x59, 0x9D, 0xB8, 0x51, 0xC9, 0xF7,
> +			0x43, 0x61, 0x31, 0x6E, 0xF1, 0x25, 0x38, 0x7F,
> +			0xAE, 0xC6, 0xD0, 0xBB, 0x29, 0x76, 0x3F, 0x46,
> +			0x2E, 0x1B, 0xE4, 0x67, 0x71, 0xE3, 0x87, 0x5A
> +		},
> +		.len = 128,
> +	},
> +	.modulus = {
> +		.data = {
> +			0xb3, 0xa1, 0xaf, 0xb7, 0x13, 0x08, 0x00, 0x0a,
> +			0x35, 0xdc, 0x2b, 0x20, 0x8d, 0xa1, 0xb5, 0xce,
> +			0x47, 0x8a, 0xc3, 0x80, 0xf4, 0x7d, 0x4a, 0xa2,
> +			0x62, 0xfd, 0x61, 0x7f, 0xb5, 0xa8, 0xde, 0x0a,
> +			0x17, 0x97, 0xa0, 0xbf, 0xdf, 0x56, 0x5a, 0x3d,
> +			0x51, 0x56, 0x4f, 0x70, 0x70, 0x3f, 0x63, 0x6a,
> +			0x44, 0x5b, 0xad, 0x84, 0x0d, 0x3f, 0x27, 0x6e,
> +			0x3b, 0x34, 0x91, 0x60, 0x14, 0xb9, 0xaa, 0x72,
> +			0xfd, 0xa3, 0x64, 0xd2, 0x03, 0xa7, 0x53, 0x87,
> +			0x9e, 0x88, 0x0b, 0xc1, 0x14, 0x93, 0x1a, 0x62,
> +			0xff, 0xb1, 0x5d, 0x74, 0xcd, 0x59, 0x63, 0x18,
> +			0x11, 0x3d, 0x4f, 0xba, 0x75, 0xd4, 0x33, 0x4e,
> +			0x23, 0x6b, 0x7b, 0x57, 0x44, 0xe1, 0xd3, 0x03,
> +			0x13, 0xa6, 0xf0, 0x8b, 0x60, 0xb0, 0x9e, 0xee,
> +			0x75, 0x08, 0x9d, 0x71, 0x63, 0x13, 0xcb, 0xa6,
> +			0x81, 0x92, 0x14, 0x03, 0x22, 0x2d, 0xde, 0x55
> +		},
> +		.len = 128,
> +	},
> +	.result_len = 128,
> +};
> 
>  struct event_crypto_adapter_test_params {
>  	struct rte_mempool *mbuf_pool;
>  	struct rte_mempool *op_mpool;
> +	struct rte_mempool *asym_op_mpool;
>  	struct rte_mempool *session_mpool;
>  	struct rte_mempool *session_priv_mpool;
> +	struct rte_mempool *asym_sess_mpool;
>  	struct rte_cryptodev_config *config;
>  	uint8_t crypto_event_port_id;
>  	uint8_t internal_port_op_fwd;
> @@ -134,11 +220,24 @@ send_recv_ev(struct rte_event *ev)
>  		rte_pause();
> 
>  	op = recv_ev.event_ptr;
> +	if (op->type == RTE_CRYPTO_OP_TYPE_SYMMETRIC) {
>  #if PKT_TRACE
> -	struct rte_mbuf *m = op->sym->m_src;
> -	rte_pktmbuf_dump(stdout, m, rte_pktmbuf_pkt_len(m));
> +		struct rte_mbuf *m = op->sym->m_src;
> +		rte_pktmbuf_dump(stdout, m, rte_pktmbuf_pkt_len(m));
>  #endif
> -	rte_pktmbuf_free(op->sym->m_src);
> +		rte_pktmbuf_free(op->sym->m_src);
> +	} else {
> +		uint8_t *data_expected = NULL, *data_received = NULL;
> +		uint32_t data_size;
> +
> +		data_expected = modex_test_case.reminder.data;
> +		data_received = op->asym->modex.result.data;
> +		data_size = op->asym->modex.result.length;
> +		ret = memcmp(data_expected, data_received, data_size);
> +		TEST_ASSERT_EQUAL(ret, 0,
> +				"Data mismatch for asym crypto adapter\n");
> +		rte_free(op->asym->modex.result.data);
> +	}
>  	rte_crypto_op_free(op);
> 
>  	return TEST_SUCCESS;
> @@ -348,6 +447,170 @@ test_session_with_op_forward_mode(void)
>  	return TEST_SUCCESS;
>  }
> 
> +static int
> +test_asym_op_forward_mode(uint8_t session_less) {
> +	const struct rte_cryptodev_asymmetric_xform_capability *capability;
> +	struct rte_cryptodev_asym_capability_idx cap_idx;
> +	struct rte_crypto_asym_xform xform_tc;
> +	union rte_event_crypto_metadata m_data;
> +	struct rte_cryptodev_info dev_info;
> +	struct rte_crypto_asym_op *asym_op;
> +	struct rte_crypto_op *op;
> +	uint8_t input[4096] = {0};
> +	uint8_t *result = NULL;
> +	struct rte_event ev;
> +	void *sess = NULL;
> +	uint32_t cap;
> +	int ret;
> +
> +	memset(&m_data, 0, sizeof(m_data));
> +
> +	rte_cryptodev_info_get(TEST_CDEV_ID, &dev_info);
> +	if (session_less && !(dev_info.feature_flags &
> +				RTE_CRYPTODEV_FF_ASYM_SESSIONLESS)) {
> +		RTE_LOG(INFO, USER1,
> +			"Device doesn't support Asym sessionless ops. Test
> Skipped\n");
> +		return TEST_SKIPPED;
> +	}
> +	/* Setup Cipher Parameters */
> +	xform_tc.next = NULL;
> +	xform_tc.xform_type = RTE_CRYPTO_ASYM_XFORM_MODEX;
> +	cap_idx.type = xform_tc.xform_type;
> +	capability = rte_cryptodev_asym_capability_get(TEST_CDEV_ID,
> +&cap_idx);
> +
> +	if (capability == NULL) {
> +		RTE_LOG(INFO, USER1,
> +			"Device doesn't support MODEX. Test Skipped\n");
> +		return TEST_SKIPPED;
> +	}
> +
> +	op = rte_crypto_op_alloc(params.asym_op_mpool,
> +			RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
> +	TEST_ASSERT_NOT_NULL(op,
> +		"Failed to allocate asymmetric crypto operation struct\n");
> +
> +	asym_op = op->asym;
> +
> +	result = rte_zmalloc(NULL, modex_test_case.result_len, 0);
> +	xform_tc.modex.modulus.data = modex_test_case.modulus.data;
> +	xform_tc.modex.modulus.length = modex_test_case.modulus.len;
> +	xform_tc.modex.exponent.data = modex_test_case.exponent.data;
> +	xform_tc.modex.exponent.length = modex_test_case.exponent.len;
> +	memcpy(input, modex_test_case.base.data,
> +		modex_test_case.base.len);
> +	asym_op->modex.base.data = input;
> +	asym_op->modex.base.length = modex_test_case.base.len;
> +	asym_op->modex.result.data = result;
> +	asym_op->modex.result.length = modex_test_case.result_len;
> +	if (rte_cryptodev_asym_xform_capability_check_modlen(capability,
> +			xform_tc.modex.modulus.length)) {
> +		RTE_LOG(INFO, USER1,
> +			"line %u FAILED: %s", __LINE__,
> +			"Invalid MODULUS length specified");
> +		return TEST_FAILED;
> +	}
> +
> +	if (!session_less) {
> +		/* Create Crypto session*/
> +		ret = rte_cryptodev_asym_session_create(TEST_CDEV_ID,
> +				&xform_tc, params.asym_sess_mpool, &sess);
> +		TEST_ASSERT_SUCCESS(ret, "Failed to init session\n");
> +
> +		ret = rte_event_crypto_adapter_caps_get(evdev,
> TEST_CDEV_ID,
> +							&cap);
> +		TEST_ASSERT_SUCCESS(ret, "Failed to get adapter
> capabilities\n");
> +
> +		if (cap &
> RTE_EVENT_CRYPTO_ADAPTER_CAP_SESSION_PRIVATE_DATA) {
> +			/* Fill in private user data information */
> +			m_data.request_info.cdev_id = request_info.cdev_id;
> +			m_data.request_info.queue_pair_id =
> +				request_info.queue_pair_id;
> +			m_data.response_info.event = response_info.event;
> +
> 	rte_cryptodev_session_event_mdata_set(TEST_CDEV_ID,
> +					sess,
> RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
> +					RTE_CRYPTO_OP_WITH_SESSION,
> +					&m_data, sizeof(m_data));
> +		}
> +
> +		rte_crypto_op_attach_asym_session(op, sess);
> +	} else {
> +		op->sess_type = RTE_CRYPTO_OP_SESSIONLESS;
> +		asym_op->xform = &xform_tc;
> +		op->private_data_offset = (sizeof(struct rte_crypto_op) +
> +				sizeof(struct rte_crypto_asym_op) +
> +				DEFAULT_NUM_XFORMS *
> +				sizeof(struct rte_crypto_asym_xform));
> +		/* Fill in private data information */
> +		m_data.request_info.cdev_id = request_info.cdev_id;
> +		m_data.request_info.queue_pair_id =
> request_info.queue_pair_id;
> +		m_data.response_info.event = response_info.event;
> +		rte_memcpy((uint8_t *)op + op->private_data_offset,
> +				&m_data, sizeof(m_data));
> +	}
> +	/* Fill in event info and update event_ptr with rte_crypto_op */
> +	memset(&ev, 0, sizeof(ev));
> +	ev.queue_id = TEST_CRYPTO_EV_QUEUE_ID;
> +	ev.sched_type = RTE_SCHED_TYPE_ATOMIC;
> +	ev.flow_id = 0xAABB;
> +	ev.event_ptr = op;
> +
> +	ret = send_recv_ev(&ev);
> +	TEST_ASSERT_SUCCESS(ret, "Failed to send/receive event to "
> +				"crypto adapter\n");
> +
> +	test_crypto_adapter_stats();
> +
> +	return TEST_SUCCESS;
> +}
> +
> +
> +static int
> +test_asym_sessionless_with_op_forward_mode(void)
> +{
> +	uint32_t cap;
> +	int ret;
> +
> +	ret = rte_event_crypto_adapter_caps_get(evdev, TEST_CDEV_ID,
> &cap);
> +	TEST_ASSERT_SUCCESS(ret, "Failed to get adapter capabilities\n");
> +
> +	if (!(cap &
> RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD) &&
> +	    !(cap &
> RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW))
> +		map_adapter_service_core();
> +	else {
> +		if (!(cap &
> RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD))
> +			return TEST_SKIPPED;
> +	}
> +
> +
> 	TEST_ASSERT_SUCCESS(rte_event_crypto_adapter_start(TEST_ADAPTE
> R_ID),
> +				"Failed to start event crypto adapter");
> +
> +	return test_asym_op_forward_mode(1);
> +}
> +
> +static int
> +test_asym_session_with_op_forward_mode(void)
> +{
> +	uint32_t cap;
> +	int ret;
> +
> +	ret = rte_event_crypto_adapter_caps_get(evdev, TEST_CDEV_ID,
> &cap);
> +	TEST_ASSERT_SUCCESS(ret, "Failed to get adapter capabilities\n");
> +
> +	if (!(cap &
> RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD) &&
> +	    !(cap &
> RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW))
> +		map_adapter_service_core();
> +	else {
> +		if (!(cap &
> RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD))
> +			return TEST_SKIPPED;
> +	}
> +
> +
> 	TEST_ASSERT_SUCCESS(rte_event_crypto_adapter_start(TEST_ADAPTE
> R_ID
> +				), "Failed to start event crypto adapter");
> +
> +	return test_asym_op_forward_mode(0);
> +}
> +
>  static int
>  send_op_recv_ev(struct rte_crypto_op *op)  { @@ -365,11 +628,24 @@
> send_op_recv_ev(struct rte_crypto_op *op)
>  		rte_pause();
> 
>  	recv_op = ev.event_ptr;
> +	if (recv_op->type == RTE_CRYPTO_OP_TYPE_SYMMETRIC) {
>  #if PKT_TRACE
> -	struct rte_mbuf *m = recv_op->sym->m_src;
> -	rte_pktmbuf_dump(stdout, m, rte_pktmbuf_pkt_len(m));
> +		struct rte_mbuf *m = recv_op->sym->m_src;
> +		rte_pktmbuf_dump(stdout, m, rte_pktmbuf_pkt_len(m));
>  #endif
> -	rte_pktmbuf_free(recv_op->sym->m_src);
> +		rte_pktmbuf_free(recv_op->sym->m_src);
> +	} else {
> +		uint8_t *data_expected = NULL, *data_received = NULL;
> +		uint32_t data_size;
> +
> +		data_expected = modex_test_case.reminder.data;
> +		data_received = op->asym->modex.result.data;
> +		data_size = op->asym->modex.result.length;
> +		ret = memcmp(data_expected, data_received, data_size);
> +		TEST_ASSERT_EQUAL(ret, 0,
> +				"Data mismatch for asym crypto adapter\n");
> +		rte_free(op->asym->modex.result.data);
> +	}
>  	rte_crypto_op_free(recv_op);
> 
>  	return TEST_SUCCESS;
> @@ -505,6 +781,156 @@ test_session_with_op_new_mode(void)
>  	return TEST_SUCCESS;
>  }
> 
> +static int
> +test_asym_op_new_mode(uint8_t session_less) {
> +	const struct rte_cryptodev_asymmetric_xform_capability *capability;
> +	struct rte_cryptodev_asym_capability_idx cap_idx;
> +	struct rte_crypto_asym_xform xform_tc;
> +	union rte_event_crypto_metadata m_data;
> +	struct rte_cryptodev_info dev_info;
> +	struct rte_crypto_asym_op *asym_op;
> +	struct rte_crypto_op *op;
> +	uint8_t input[4096] = {0};
> +	uint8_t *result = NULL;
> +	void *sess = NULL;
> +	uint32_t cap;
> +	int ret;
> +
> +	memset(&m_data, 0, sizeof(m_data));
> +
> +	rte_cryptodev_info_get(TEST_CDEV_ID, &dev_info);
> +	if (session_less && !(dev_info.feature_flags &
> +				RTE_CRYPTODEV_FF_ASYM_SESSIONLESS)) {
> +		RTE_LOG(INFO, USER1,
> +			"Device doesn't support Asym sessionless ops. Test
> Skipped\n");
> +		return TEST_SKIPPED;
> +	}
> +	/* Setup Cipher Parameters */
> +	xform_tc.next = NULL;
> +	xform_tc.xform_type = RTE_CRYPTO_ASYM_XFORM_MODEX;
> +	cap_idx.type = xform_tc.xform_type;
> +	capability = rte_cryptodev_asym_capability_get(TEST_CDEV_ID,
> +&cap_idx);
> +
> +	if (capability == NULL) {
> +		RTE_LOG(INFO, USER1,
> +			"Device doesn't support MODEX. Test Skipped\n");
> +		return TEST_SKIPPED;
> +	}
> +
> +	op = rte_crypto_op_alloc(params.asym_op_mpool,
> +			RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
> +	TEST_ASSERT_NOT_NULL(op, "Failed to allocate asym crypto_op!\n");
> +
> +	asym_op = op->asym;
> +
> +	result = rte_zmalloc(NULL, modex_test_case.result_len, 0);
> +	xform_tc.modex.modulus.data = modex_test_case.modulus.data;
> +	xform_tc.modex.modulus.length = modex_test_case.modulus.len;
> +	xform_tc.modex.exponent.data = modex_test_case.exponent.data;
> +	xform_tc.modex.exponent.length = modex_test_case.exponent.len;
> +	memcpy(input, modex_test_case.base.data,
> +		modex_test_case.base.len);
> +	asym_op->modex.base.data = input;
> +	asym_op->modex.base.length = modex_test_case.base.len;
> +	asym_op->modex.result.data = result;
> +	asym_op->modex.result.length = modex_test_case.result_len;
> +	if (rte_cryptodev_asym_xform_capability_check_modlen(capability,
> +			xform_tc.modex.modulus.length)) {
> +		RTE_LOG(INFO, USER1,
> +			"line %u FAILED: %s", __LINE__,
> +			"Invalid MODULUS length specified");
> +		return TEST_FAILED;
> +	}
> +
> +	if (!session_less) {
> +		ret = rte_cryptodev_asym_session_create(TEST_CDEV_ID,
> +				&xform_tc, params.asym_sess_mpool, &sess);
> +		TEST_ASSERT_NOT_NULL(sess, "Session creation failed\n");
> +		TEST_ASSERT_SUCCESS(ret, "Failed to init session\n");
> +
> +		ret = rte_event_crypto_adapter_caps_get(evdev,
> TEST_CDEV_ID,
> +							&cap);
> +		TEST_ASSERT_SUCCESS(ret, "Failed to get adapter
> capabilities\n");
> +
> +		if (cap &
> RTE_EVENT_CRYPTO_ADAPTER_CAP_SESSION_PRIVATE_DATA) {
> +			/* Fill in private user data information */
> +			m_data.response_info.event = response_info.event;
> +
> 	rte_cryptodev_session_event_mdata_set(TEST_CDEV_ID,
> +					sess,
> RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
> +					RTE_CRYPTO_OP_WITH_SESSION,
> +					&m_data, sizeof(m_data));
> +		}
> +
> +		rte_crypto_op_attach_asym_session(op, sess);
> +	} else {
> +		op->sess_type = RTE_CRYPTO_OP_SESSIONLESS;
> +		asym_op->xform = &xform_tc;
> +		op->private_data_offset = (sizeof(struct rte_crypto_op) +
> +				sizeof(struct rte_crypto_asym_op) +
> +				DEFAULT_NUM_XFORMS *
> +				sizeof(struct rte_crypto_asym_xform));
> +		/* Fill in private data information */
> +		m_data.response_info.event = response_info.event;
> +		rte_memcpy((uint8_t *)op + op->private_data_offset,
> +				&m_data, sizeof(m_data));
> +	}
> +
> +	ret = send_op_recv_ev(op);
> +	TEST_ASSERT_SUCCESS(ret, "Failed to enqueue op to cryptodev\n");
> +
> +	test_crypto_adapter_stats();
> +
> +	return TEST_SUCCESS;
> +}
> +
> +static int
> +test_asym_sessionless_with_op_new_mode(void)
> +{
> +	uint32_t cap;
> +	int ret;
> +
> +	ret = rte_event_crypto_adapter_caps_get(evdev, TEST_CDEV_ID,
> &cap);
> +	TEST_ASSERT_SUCCESS(ret, "Failed to get adapter capabilities\n");
> +
> +	if (!(cap &
> RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD) &&
> +	    !(cap &
> RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW))
> +		map_adapter_service_core();
> +	else {
> +		if (!(cap &
> RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW))
> +			return TEST_SKIPPED;
> +	}
> +
> +	/* start the event crypto adapter */
> +
> 	TEST_ASSERT_SUCCESS(rte_event_crypto_adapter_start(TEST_ADAPTE
> R_ID),
> +				"Failed to start event crypto adapter");
> +
> +	return test_asym_op_new_mode(1);
> +}
> +
> +static int
> +test_asym_session_with_op_new_mode(void)
> +{
> +	uint32_t cap;
> +	int ret;
> +
> +	ret = rte_event_crypto_adapter_caps_get(evdev, TEST_CDEV_ID,
> &cap);
> +	TEST_ASSERT_SUCCESS(ret, "Failed to get adapter capabilities\n");
> +
> +	if (!(cap &
> RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD) &&
> +	    !(cap &
> RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW))
> +		map_adapter_service_core();
> +	else {
> +		if (!(cap &
> RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW))
> +			return TEST_SKIPPED;
> +	}
> +
> +
> 	TEST_ASSERT_SUCCESS(rte_event_crypto_adapter_start(TEST_ADAPTE
> R_ID),
> +				"Failed to start event crypto adapter");
> +
> +	return test_asym_op_new_mode(0);
> +}
> +
>  static int
>  configure_cryptodev(void)
>  {
> @@ -537,6 +963,19 @@ configure_cryptodev(void)
>  		RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
>  		return TEST_FAILED;
>  	}
> +	params.asym_op_mpool = rte_crypto_op_pool_create(
> +			"EVENT_CRYPTO_ASYM_OP_POOL",
> +			RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
> +			NUM_MBUFS, MBUF_CACHE_SIZE,
> +			(DEFAULT_NUM_XFORMS *
> +			sizeof(struct rte_crypto_asym_xform)) +
> +			sizeof(union rte_event_crypto_metadata),
> +			rte_socket_id());
> +	if (params.asym_op_mpool == NULL) {
> +		RTE_LOG(ERR, USER1, "Can't create
> CRYPTO_ASYM_OP_POOL\n");
> +		return TEST_FAILED;
> +	}
> +
> 
>  	/* Create a NULL crypto device */
>  	nb_devs = rte_cryptodev_device_count_by_driver(
> @@ -581,6 +1020,15 @@ configure_cryptodev(void)
>  	TEST_ASSERT_NOT_NULL(params.session_priv_mpool,
>  			"session mempool allocation failed\n");
> 
> +	params.asym_sess_mpool = rte_cryptodev_asym_session_pool_create(
> +			"CRYPTO_AD_ASYM_SESS_MP",
> +			MAX_NB_SESSIONS, 0,
> +			sizeof(union rte_event_crypto_metadata),
> +			SOCKET_ID_ANY);
> +	TEST_ASSERT_NOT_NULL(params.asym_sess_mpool,
> +			"asym session mempool allocation failed\n");
> +
> +
>  	rte_cryptodev_info_get(TEST_CDEV_ID, &info);
>  	conf.nb_queue_pairs = info.max_nb_queue_pairs;
>  	conf.socket_id = SOCKET_ID_ANY;
> @@ -960,6 +1408,21 @@ crypto_teardown(void)
>  		params.session_priv_mpool = NULL;
>  	}
> 
> +	/* Free asym session mempool */
> +	if (params.asym_sess_mpool != NULL) {
> +		RTE_LOG(DEBUG, USER1, "CRYPTO_AD_ASYM_SESS_MP count
> %u\n",
> +		rte_mempool_avail_count(params.asym_sess_mpool));
> +		rte_mempool_free(params.asym_sess_mpool);
> +		params.asym_sess_mpool = NULL;
> +	}
> +	/* Free asym ops mempool */
> +	if (params.asym_op_mpool != NULL) {
> +		RTE_LOG(DEBUG, USER1, "EVENT_CRYPTO_ASYM_OP_POOL
> count %u\n",
> +		rte_mempool_avail_count(params.asym_op_mpool));
> +		rte_mempool_free(params.asym_op_mpool);
> +		params.asym_op_mpool = NULL;
> +	}
> +
>  	/* Free ops mempool */
>  	if (params.op_mpool != NULL) {
>  		RTE_LOG(DEBUG, USER1, "EVENT_CRYPTO_SYM_OP_POOL
> count %u\n", @@ -1016,6 +1479,22 @@ static struct unit_test_suite
> functional_testsuite = {
>  				test_crypto_adapter_stop,
>  				test_sessionless_with_op_new_mode),
> 
> +		TEST_CASE_ST(test_crypto_adapter_conf_op_forward_mode,
> +				test_crypto_adapter_stop,
> +				test_asym_session_with_op_forward_mode),
> +
> +		TEST_CASE_ST(test_crypto_adapter_conf_op_forward_mode,
> +				test_crypto_adapter_stop,
> +
> 	test_asym_sessionless_with_op_forward_mode),
> +
> +		TEST_CASE_ST(test_crypto_adapter_conf_op_new_mode,
> +				test_crypto_adapter_stop,
> +				test_asym_session_with_op_new_mode),
> +
> +		TEST_CASE_ST(test_crypto_adapter_conf_op_new_mode,
> +				test_crypto_adapter_stop,
> +				test_asym_sessionless_with_op_new_mode),
> +
>  		TEST_CASES_END() /**< NULL terminate unit test array */
>  	}
>  };
> --
> 2.25.1
  
Akhil Goyal April 29, 2022, 12:23 p.m. UTC | #3
Hi Abhinandan,

> This is failing with asym changes. Please look into this.

Thanks for pointing this out. It is failing as null crypto does not support asym
And asym_session_create would need an op from driver which is NULL for null crypto

Please check if below change is working for you.

diff --git a/app/test/test_event_crypto_adapter.c b/app/test/test_event_crypto_adapter.c
index eecfc22057..2ecc7e2cea 100644
--- a/app/test/test_event_crypto_adapter.c
+++ b/app/test/test_event_crypto_adapter.c
@@ -934,13 +934,16 @@ test_asym_session_with_op_new_mode(void)
 static int
 configure_cryptodev(void)
 {
+       const struct rte_cryptodev_capabilities *capability;
        struct rte_cryptodev_qp_conf qp_conf;
        struct rte_cryptodev_config conf;
        struct rte_cryptodev_info info;
        unsigned int session_size;
+       unsigned int i = 0;
        uint8_t nb_devs;
        int ret;

+
        params.mbuf_pool = rte_pktmbuf_pool_create(
                        "CRYPTO_ADAPTER_MBUFPOOL",
                        NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
@@ -963,19 +966,6 @@ configure_cryptodev(void)
                RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
                return TEST_FAILED;
        }
-       params.asym_op_mpool = rte_crypto_op_pool_create(
-                       "EVENT_CRYPTO_ASYM_OP_POOL",
-                       RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
-                       NUM_MBUFS, MBUF_CACHE_SIZE,
-                       (DEFAULT_NUM_XFORMS *
-                       sizeof(struct rte_crypto_asym_xform)) +
-                       sizeof(union rte_event_crypto_metadata),
-                       rte_socket_id());
-       if (params.asym_op_mpool == NULL) {
-               RTE_LOG(ERR, USER1, "Can't create CRYPTO_ASYM_OP_POOL\n");
-               return TEST_FAILED;
-       }
-

        /* Create a NULL crypto device */
        nb_devs = rte_cryptodev_device_count_by_driver(
@@ -1020,16 +1010,34 @@ configure_cryptodev(void)
        TEST_ASSERT_NOT_NULL(params.session_priv_mpool,
                        "session mempool allocation failed\n");

-       params.asym_sess_mpool = rte_cryptodev_asym_session_pool_create(
-                       "CRYPTO_AD_ASYM_SESS_MP",
-                       MAX_NB_SESSIONS, 0,
-                       sizeof(union rte_event_crypto_metadata),
-                       SOCKET_ID_ANY);
-       TEST_ASSERT_NOT_NULL(params.asym_sess_mpool,
-                       "asym session mempool allocation failed\n");
-
-
        rte_cryptodev_info_get(TEST_CDEV_ID, &info);
+
+       while ((capability = &info.capabilities[i++])->op !=
+                       RTE_CRYPTO_OP_TYPE_UNDEFINED) {
+               if (capability->op == RTE_CRYPTO_OP_TYPE_ASYMMETRIC) {
+                       params.asym_op_mpool = rte_crypto_op_pool_create(
+                               "EVENT_CRYPTO_ASYM_OP_POOL",
+                               RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
+                               NUM_MBUFS, MBUF_CACHE_SIZE,
+                               (DEFAULT_NUM_XFORMS *
+                               sizeof(struct rte_crypto_asym_xform)) +
+                               sizeof(union rte_event_crypto_metadata),
+                               rte_socket_id());
+                       TEST_ASSERT_NOT_NULL(params.asym_op_mpool,
+                                       "Can't create CRYPTO_ASYM_OP_POOL\n");
+
+                       params.asym_sess_mpool =
+                               rte_cryptodev_asym_session_pool_create(
+                                       "CRYPTO_AD_ASYM_SESS_MP",
+                                       MAX_NB_SESSIONS, 0,
+                                       sizeof(union rte_event_crypto_metadata),
+                                       SOCKET_ID_ANY);
+                       TEST_ASSERT_NOT_NULL(params.asym_sess_mpool,
+                               "asym session mempool allocation failed\n");
+                       break;
+               }
+       }
+
        conf.nb_queue_pairs = info.max_nb_queue_pairs;
        conf.socket_id = SOCKET_ID_ANY;
        conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;


> 
> root@xdp-dev:/home/intel/abhi/dpdk-next-eventdev/abhi# ./app/test/dpdk-
> test
> EAL: Detected CPU lcores: 96
> EAL: Detected NUMA nodes: 2
> EAL: Detected static linkage of DPDK
> EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
> EAL: Selected IOVA mode 'PA'
> EAL: VFIO support initialized
> EAL: Probe PCI driver: net_ice (8086:1593) device: 0000:18:00.0 (socket 0)
> ice_load_pkg_type(): Active package is: 1.3.26.0, ICE OS Default Package (single
> VLAN mode)
> EAL: Probe PCI driver: net_ice (8086:1593) device: 0000:18:00.1 (socket 0)
> ice_load_pkg_type(): Active package is: 1.3.26.0, ICE OS Default Package (single
> VLAN mode)
> TELEMETRY: No legacy callbacks, legacy socket not created
> APP: HPET is not enabled, using TSC as default timer
> RTE>>event_crypto_adapter_autotest
>  + ------------------------------------------------------- +
>  + Test Suite : Event crypto adapter test suite
> CRYPTODEV: Creating cryptodev crypto_null
> 
> CRYPTODEV: Initialisation parameters - name: crypto_null,socket id: 0, max
> queue pairs: 8
> CRYPTODEV: elt_size 0 is expanded to 208
> 
> CRYPTODEV: Could not set max private session size
> 
> EAL: Test assert configure_cryptodev line 1028 failed: asym session mempool
> allocation failed
> 
> EAL: Test assert testsuite_setup line 1361 failed: cryptodev initialization failed
> 
>  + ------------------------------------------------------- +
>  + Test Suite Summary : Event crypto adapter test suite
>  + ------------------------------------------------------- +
>  + Tests Total :       11
>  + Tests Skipped :      0
>  + Tests Executed :     0
>  + Tests Unsupported:   0
>  + Tests Passed :       0
>  + Tests Failed :      11
>  + ------------------------------------------------------- +
> Test Failed
  
Gujjar, Abhinandan S May 1, 2022, 12:45 p.m. UTC | #4
> -----Original Message-----
> From: Akhil Goyal <gakhil@marvell.com>
> Sent: Friday, April 29, 2022 5:53 PM
> To: Gujjar, Abhinandan S <abhinandan.gujjar@intel.com>; dev@dpdk.org
> Cc: Anoob Joseph <anoobj@marvell.com>; Jerin Jacob Kollanukkaran
> <jerinj@marvell.com>; Jayatheerthan, Jay <jay.jayatheerthan@intel.com>;
> Vangati, Narender <narender.vangati@intel.com>; Volodymyr Fialko
> <vfialko@marvell.com>
> Subject: RE: [PATCH v3 6/7] test/event: add asymmetric cases for crypto
> adapter
> 
> Hi Abhinandan,
> 
> > This is failing with asym changes. Please look into this.
> 
> Thanks for pointing this out. It is failing as null crypto does not support asym
> And asym_session_create would need an op from driver which is NULL for null
> crypto
> 
> Please check if below change is working for you.
I could not apply this patch cleanly. I see that you are skipping the asym test for NULL PMD.
Can I use openssl or any open source PMD to test this feature? If yes, please provide the command line.
> 
> diff --git a/app/test/test_event_crypto_adapter.c
> b/app/test/test_event_crypto_adapter.c
> index eecfc22057..2ecc7e2cea 100644
> --- a/app/test/test_event_crypto_adapter.c
> +++ b/app/test/test_event_crypto_adapter.c
> @@ -934,13 +934,16 @@ test_asym_session_with_op_new_mode(void)
>  static int
>  configure_cryptodev(void)
>  {
> +       const struct rte_cryptodev_capabilities *capability;
>         struct rte_cryptodev_qp_conf qp_conf;
>         struct rte_cryptodev_config conf;
>         struct rte_cryptodev_info info;
>         unsigned int session_size;
> +       unsigned int i = 0;
>         uint8_t nb_devs;
>         int ret;
> 
> +
>         params.mbuf_pool = rte_pktmbuf_pool_create(
>                         "CRYPTO_ADAPTER_MBUFPOOL",
>                         NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE, @@ -963,19
> +966,6 @@ configure_cryptodev(void)
>                 RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
>                 return TEST_FAILED;
>         }
> -       params.asym_op_mpool = rte_crypto_op_pool_create(
> -                       "EVENT_CRYPTO_ASYM_OP_POOL",
> -                       RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
> -                       NUM_MBUFS, MBUF_CACHE_SIZE,
> -                       (DEFAULT_NUM_XFORMS *
> -                       sizeof(struct rte_crypto_asym_xform)) +
> -                       sizeof(union rte_event_crypto_metadata),
> -                       rte_socket_id());
> -       if (params.asym_op_mpool == NULL) {
> -               RTE_LOG(ERR, USER1, "Can't create CRYPTO_ASYM_OP_POOL\n");
> -               return TEST_FAILED;
> -       }
> -
> 
>         /* Create a NULL crypto device */
>         nb_devs = rte_cryptodev_device_count_by_driver(
> @@ -1020,16 +1010,34 @@ configure_cryptodev(void)
>         TEST_ASSERT_NOT_NULL(params.session_priv_mpool,
>                         "session mempool allocation failed\n");
> 
> -       params.asym_sess_mpool = rte_cryptodev_asym_session_pool_create(
> -                       "CRYPTO_AD_ASYM_SESS_MP",
> -                       MAX_NB_SESSIONS, 0,
> -                       sizeof(union rte_event_crypto_metadata),
> -                       SOCKET_ID_ANY);
> -       TEST_ASSERT_NOT_NULL(params.asym_sess_mpool,
> -                       "asym session mempool allocation failed\n");
> -
> -
>         rte_cryptodev_info_get(TEST_CDEV_ID, &info);
> +
> +       while ((capability = &info.capabilities[i++])->op !=
> +                       RTE_CRYPTO_OP_TYPE_UNDEFINED) {
> +               if (capability->op == RTE_CRYPTO_OP_TYPE_ASYMMETRIC) {
> +                       params.asym_op_mpool = rte_crypto_op_pool_create(
> +                               "EVENT_CRYPTO_ASYM_OP_POOL",
> +                               RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
> +                               NUM_MBUFS, MBUF_CACHE_SIZE,
> +                               (DEFAULT_NUM_XFORMS *
> +                               sizeof(struct rte_crypto_asym_xform)) +
> +                               sizeof(union rte_event_crypto_metadata),
> +                               rte_socket_id());
> +                       TEST_ASSERT_NOT_NULL(params.asym_op_mpool,
> +                                       "Can't create
> + CRYPTO_ASYM_OP_POOL\n");
> +
> +                       params.asym_sess_mpool =
> +                               rte_cryptodev_asym_session_pool_create(
> +                                       "CRYPTO_AD_ASYM_SESS_MP",
> +                                       MAX_NB_SESSIONS, 0,
> +                                       sizeof(union rte_event_crypto_metadata),
> +                                       SOCKET_ID_ANY);
> +                       TEST_ASSERT_NOT_NULL(params.asym_sess_mpool,
> +                               "asym session mempool allocation failed\n");
> +                       break;
> +               }
> +       }
> +
>         conf.nb_queue_pairs = info.max_nb_queue_pairs;
>         conf.socket_id = SOCKET_ID_ANY;
>         conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
> 
> 
> >
> > root@xdp-dev:/home/intel/abhi/dpdk-next-eventdev/abhi#
> > ./app/test/dpdk- test
> > EAL: Detected CPU lcores: 96
> > EAL: Detected NUMA nodes: 2
> > EAL: Detected static linkage of DPDK
> > EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
> > EAL: Selected IOVA mode 'PA'
> > EAL: VFIO support initialized
> > EAL: Probe PCI driver: net_ice (8086:1593) device: 0000:18:00.0
> > (socket 0)
> > ice_load_pkg_type(): Active package is: 1.3.26.0, ICE OS Default
> > Package (single VLAN mode)
> > EAL: Probe PCI driver: net_ice (8086:1593) device: 0000:18:00.1
> > (socket 0)
> > ice_load_pkg_type(): Active package is: 1.3.26.0, ICE OS Default
> > Package (single VLAN mode)
> > TELEMETRY: No legacy callbacks, legacy socket not created
> > APP: HPET is not enabled, using TSC as default timer
> > RTE>>event_crypto_adapter_autotest
> >  + ------------------------------------------------------- +  + Test
> > Suite : Event crypto adapter test suite
> > CRYPTODEV: Creating cryptodev crypto_null
> >
> > CRYPTODEV: Initialisation parameters - name: crypto_null,socket id: 0,
> > max queue pairs: 8
> > CRYPTODEV: elt_size 0 is expanded to 208
> >
> > CRYPTODEV: Could not set max private session size
> >
> > EAL: Test assert configure_cryptodev line 1028 failed: asym session
> > mempool allocation failed
> >
> > EAL: Test assert testsuite_setup line 1361 failed: cryptodev
> > initialization failed
> >
> >  + ------------------------------------------------------- +  + Test
> > Suite Summary : Event crypto adapter test suite  +
> > ------------------------------------------------------- +
> >  + Tests Total :       11
> >  + Tests Skipped :      0
> >  + Tests Executed :     0
> >  + Tests Unsupported:   0
> >  + Tests Passed :       0
> >  + Tests Failed :      11
> >  + ------------------------------------------------------- + Test
> > Failed
  
Akhil Goyal May 1, 2022, 6:36 p.m. UTC | #5
Hi Abhinandan,
> >
> > > This is failing with asym changes. Please look into this.
> >
> > Thanks for pointing this out. It is failing as null crypto does not support asym
> > And asym_session_create would need an op from driver which is NULL for null
> > crypto
> >
> > Please check if below change is working for you.
> I could not apply this patch cleanly. I see that you are skipping the asym test for
> NULL PMD.
> Can I use openssl or any open source PMD to test this feature? If yes, please
> provide the command line.

The patch is not skipping specifically null pmd.
It is not creating asym session and asym op mempools for devices which do not
Support asym sessions.

OpenSSL can be used as it support asym ops(vdev can be passed as command line arg),
But the test will not execute, as it would not support event crypto adapter.
This patch can be tested with PMD which support ASYM crypto adapter and no other
PMD support that as of now.

> >
> > diff --git a/app/test/test_event_crypto_adapter.c
> > b/app/test/test_event_crypto_adapter.c
> > index eecfc22057..2ecc7e2cea 100644
> > --- a/app/test/test_event_crypto_adapter.c
> > +++ b/app/test/test_event_crypto_adapter.c
> > @@ -934,13 +934,16 @@ test_asym_session_with_op_new_mode(void)
> >  static int
> >  configure_cryptodev(void)
> >  {
> > +       const struct rte_cryptodev_capabilities *capability;
> >         struct rte_cryptodev_qp_conf qp_conf;
> >         struct rte_cryptodev_config conf;
> >         struct rte_cryptodev_info info;
> >         unsigned int session_size;
> > +       unsigned int i = 0;
> >         uint8_t nb_devs;
> >         int ret;
> >
> > +
> >         params.mbuf_pool = rte_pktmbuf_pool_create(
> >                         "CRYPTO_ADAPTER_MBUFPOOL",
> >                         NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE, @@ -963,19
> > +966,6 @@ configure_cryptodev(void)
> >                 RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
> >                 return TEST_FAILED;
> >         }
> > -       params.asym_op_mpool = rte_crypto_op_pool_create(
> > -                       "EVENT_CRYPTO_ASYM_OP_POOL",
> > -                       RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
> > -                       NUM_MBUFS, MBUF_CACHE_SIZE,
> > -                       (DEFAULT_NUM_XFORMS *
> > -                       sizeof(struct rte_crypto_asym_xform)) +
> > -                       sizeof(union rte_event_crypto_metadata),
> > -                       rte_socket_id());
> > -       if (params.asym_op_mpool == NULL) {
> > -               RTE_LOG(ERR, USER1, "Can't create CRYPTO_ASYM_OP_POOL\n");
> > -               return TEST_FAILED;
> > -       }
> > -
> >
> >         /* Create a NULL crypto device */
> >         nb_devs = rte_cryptodev_device_count_by_driver(
> > @@ -1020,16 +1010,34 @@ configure_cryptodev(void)
> >         TEST_ASSERT_NOT_NULL(params.session_priv_mpool,
> >                         "session mempool allocation failed\n");
> >
> > -       params.asym_sess_mpool = rte_cryptodev_asym_session_pool_create(
> > -                       "CRYPTO_AD_ASYM_SESS_MP",
> > -                       MAX_NB_SESSIONS, 0,
> > -                       sizeof(union rte_event_crypto_metadata),
> > -                       SOCKET_ID_ANY);
> > -       TEST_ASSERT_NOT_NULL(params.asym_sess_mpool,
> > -                       "asym session mempool allocation failed\n");
> > -
> > -
> >         rte_cryptodev_info_get(TEST_CDEV_ID, &info);
> > +
> > +       while ((capability = &info.capabilities[i++])->op !=
> > +                       RTE_CRYPTO_OP_TYPE_UNDEFINED) {
> > +               if (capability->op == RTE_CRYPTO_OP_TYPE_ASYMMETRIC) {
> > +                       params.asym_op_mpool = rte_crypto_op_pool_create(
> > +                               "EVENT_CRYPTO_ASYM_OP_POOL",
> > +                               RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
> > +                               NUM_MBUFS, MBUF_CACHE_SIZE,
> > +                               (DEFAULT_NUM_XFORMS *
> > +                               sizeof(struct rte_crypto_asym_xform)) +
> > +                               sizeof(union rte_event_crypto_metadata),
> > +                               rte_socket_id());
> > +                       TEST_ASSERT_NOT_NULL(params.asym_op_mpool,
> > +                                       "Can't create
> > + CRYPTO_ASYM_OP_POOL\n");
> > +
> > +                       params.asym_sess_mpool =
> > +                               rte_cryptodev_asym_session_pool_create(
> > +                                       "CRYPTO_AD_ASYM_SESS_MP",
> > +                                       MAX_NB_SESSIONS, 0,
> > +                                       sizeof(union rte_event_crypto_metadata),
> > +                                       SOCKET_ID_ANY);
> > +                       TEST_ASSERT_NOT_NULL(params.asym_sess_mpool,
> > +                               "asym session mempool allocation failed\n");
> > +                       break;
> > +               }
> > +       }
> > +
> >         conf.nb_queue_pairs = info.max_nb_queue_pairs;
> >         conf.socket_id = SOCKET_ID_ANY;
> >         conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
> >
> >
  

Patch

diff --git a/app/test/test_event_crypto_adapter.c b/app/test/test_event_crypto_adapter.c
index 9904206735..eecfc22057 100644
--- a/app/test/test_event_crypto_adapter.c
+++ b/app/test/test_event_crypto_adapter.c
@@ -6,6 +6,7 @@ 
 #include "test.h"
 #include <string.h>
 #include <rte_common.h>
+#include <rte_malloc.h>
 #include <rte_mempool.h>
 #include <rte_mbuf.h>
 #include <rte_cryptodev.h>
@@ -67,12 +68,97 @@  static const uint8_t text_64B[] = {
 	0x31, 0xbf, 0xe9, 0xa1, 0x97, 0x5c, 0x2b, 0xd6,
 	0x57, 0xa5, 0x9f, 0xab, 0xbd, 0xb0, 0x9b, 0x9c
 };
+#define DATA_SIZE		512
+struct modex_test_data {
+	enum rte_crypto_asym_xform_type xform_type;
+	struct {
+		uint8_t data[DATA_SIZE];
+		uint16_t len;
+	} base;
+	struct {
+		uint8_t data[DATA_SIZE];
+		uint16_t len;
+	} exponent;
+	struct {
+		uint8_t data[DATA_SIZE];
+		uint16_t len;
+	} modulus;
+	struct {
+		uint8_t data[DATA_SIZE];
+		uint16_t len;
+	} reminder;
+	uint16_t result_len;
+};
+
+static struct
+modex_test_data modex_test_case = {
+	.xform_type = RTE_CRYPTO_ASYM_XFORM_MODEX,
+	.base = {
+		.data = {
+			0xF8, 0xBA, 0x1A, 0x55, 0xD0, 0x2F, 0x85,
+			0xAE, 0x96, 0x7B, 0xB6, 0x2F, 0xB6, 0xCD,
+			0xA8, 0xEB, 0x7E, 0x78, 0xA0, 0x50
+		},
+		.len = 20,
+	},
+	.exponent = {
+		.data = {
+			0x01, 0x00, 0x01
+		},
+		.len = 3,
+	},
+	.reminder = {
+		.data = {
+			0x2C, 0x60, 0x75, 0x45, 0x98, 0x9D, 0xE0, 0x72,
+			0xA0, 0x9D, 0x3A, 0x9E, 0x03, 0x38, 0x73, 0x3C,
+			0x31, 0x83, 0x04, 0xFE, 0x75, 0x43, 0xE6, 0x17,
+			0x5C, 0x01, 0x29, 0x51, 0x69, 0x33, 0x62, 0x2D,
+			0x78, 0xBE, 0xAE, 0xC4, 0xBC, 0xDE, 0x7E, 0x2C,
+			0x77, 0x84, 0xF2, 0xC5, 0x14, 0xB5, 0x2F, 0xF7,
+			0xC5, 0x94, 0xEF, 0x86, 0x75, 0x75, 0xB5, 0x11,
+			0xE5, 0x0E, 0x0A, 0x29, 0x76, 0xE2, 0xEA, 0x32,
+			0x0E, 0x43, 0x77, 0x7E, 0x2C, 0x27, 0xAC, 0x3B,
+			0x86, 0xA5, 0xDB, 0xC9, 0x48, 0x40, 0xE8, 0x99,
+			0x9A, 0x0A, 0x3D, 0xD6, 0x74, 0xFA, 0x2E, 0x2E,
+			0x5B, 0xAF, 0x8C, 0x99, 0x44, 0x2A, 0x67, 0x38,
+			0x27, 0x41, 0x59, 0x9D, 0xB8, 0x51, 0xC9, 0xF7,
+			0x43, 0x61, 0x31, 0x6E, 0xF1, 0x25, 0x38, 0x7F,
+			0xAE, 0xC6, 0xD0, 0xBB, 0x29, 0x76, 0x3F, 0x46,
+			0x2E, 0x1B, 0xE4, 0x67, 0x71, 0xE3, 0x87, 0x5A
+		},
+		.len = 128,
+	},
+	.modulus = {
+		.data = {
+			0xb3, 0xa1, 0xaf, 0xb7, 0x13, 0x08, 0x00, 0x0a,
+			0x35, 0xdc, 0x2b, 0x20, 0x8d, 0xa1, 0xb5, 0xce,
+			0x47, 0x8a, 0xc3, 0x80, 0xf4, 0x7d, 0x4a, 0xa2,
+			0x62, 0xfd, 0x61, 0x7f, 0xb5, 0xa8, 0xde, 0x0a,
+			0x17, 0x97, 0xa0, 0xbf, 0xdf, 0x56, 0x5a, 0x3d,
+			0x51, 0x56, 0x4f, 0x70, 0x70, 0x3f, 0x63, 0x6a,
+			0x44, 0x5b, 0xad, 0x84, 0x0d, 0x3f, 0x27, 0x6e,
+			0x3b, 0x34, 0x91, 0x60, 0x14, 0xb9, 0xaa, 0x72,
+			0xfd, 0xa3, 0x64, 0xd2, 0x03, 0xa7, 0x53, 0x87,
+			0x9e, 0x88, 0x0b, 0xc1, 0x14, 0x93, 0x1a, 0x62,
+			0xff, 0xb1, 0x5d, 0x74, 0xcd, 0x59, 0x63, 0x18,
+			0x11, 0x3d, 0x4f, 0xba, 0x75, 0xd4, 0x33, 0x4e,
+			0x23, 0x6b, 0x7b, 0x57, 0x44, 0xe1, 0xd3, 0x03,
+			0x13, 0xa6, 0xf0, 0x8b, 0x60, 0xb0, 0x9e, 0xee,
+			0x75, 0x08, 0x9d, 0x71, 0x63, 0x13, 0xcb, 0xa6,
+			0x81, 0x92, 0x14, 0x03, 0x22, 0x2d, 0xde, 0x55
+		},
+		.len = 128,
+	},
+	.result_len = 128,
+};
 
 struct event_crypto_adapter_test_params {
 	struct rte_mempool *mbuf_pool;
 	struct rte_mempool *op_mpool;
+	struct rte_mempool *asym_op_mpool;
 	struct rte_mempool *session_mpool;
 	struct rte_mempool *session_priv_mpool;
+	struct rte_mempool *asym_sess_mpool;
 	struct rte_cryptodev_config *config;
 	uint8_t crypto_event_port_id;
 	uint8_t internal_port_op_fwd;
@@ -134,11 +220,24 @@  send_recv_ev(struct rte_event *ev)
 		rte_pause();
 
 	op = recv_ev.event_ptr;
+	if (op->type == RTE_CRYPTO_OP_TYPE_SYMMETRIC) {
 #if PKT_TRACE
-	struct rte_mbuf *m = op->sym->m_src;
-	rte_pktmbuf_dump(stdout, m, rte_pktmbuf_pkt_len(m));
+		struct rte_mbuf *m = op->sym->m_src;
+		rte_pktmbuf_dump(stdout, m, rte_pktmbuf_pkt_len(m));
 #endif
-	rte_pktmbuf_free(op->sym->m_src);
+		rte_pktmbuf_free(op->sym->m_src);
+	} else {
+		uint8_t *data_expected = NULL, *data_received = NULL;
+		uint32_t data_size;
+
+		data_expected = modex_test_case.reminder.data;
+		data_received = op->asym->modex.result.data;
+		data_size = op->asym->modex.result.length;
+		ret = memcmp(data_expected, data_received, data_size);
+		TEST_ASSERT_EQUAL(ret, 0,
+				"Data mismatch for asym crypto adapter\n");
+		rte_free(op->asym->modex.result.data);
+	}
 	rte_crypto_op_free(op);
 
 	return TEST_SUCCESS;
@@ -348,6 +447,170 @@  test_session_with_op_forward_mode(void)
 	return TEST_SUCCESS;
 }
 
+static int
+test_asym_op_forward_mode(uint8_t session_less)
+{
+	const struct rte_cryptodev_asymmetric_xform_capability *capability;
+	struct rte_cryptodev_asym_capability_idx cap_idx;
+	struct rte_crypto_asym_xform xform_tc;
+	union rte_event_crypto_metadata m_data;
+	struct rte_cryptodev_info dev_info;
+	struct rte_crypto_asym_op *asym_op;
+	struct rte_crypto_op *op;
+	uint8_t input[4096] = {0};
+	uint8_t *result = NULL;
+	struct rte_event ev;
+	void *sess = NULL;
+	uint32_t cap;
+	int ret;
+
+	memset(&m_data, 0, sizeof(m_data));
+
+	rte_cryptodev_info_get(TEST_CDEV_ID, &dev_info);
+	if (session_less && !(dev_info.feature_flags &
+				RTE_CRYPTODEV_FF_ASYM_SESSIONLESS)) {
+		RTE_LOG(INFO, USER1,
+			"Device doesn't support Asym sessionless ops. Test Skipped\n");
+		return TEST_SKIPPED;
+	}
+	/* Setup Cipher Parameters */
+	xform_tc.next = NULL;
+	xform_tc.xform_type = RTE_CRYPTO_ASYM_XFORM_MODEX;
+	cap_idx.type = xform_tc.xform_type;
+	capability = rte_cryptodev_asym_capability_get(TEST_CDEV_ID, &cap_idx);
+
+	if (capability == NULL) {
+		RTE_LOG(INFO, USER1,
+			"Device doesn't support MODEX. Test Skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	op = rte_crypto_op_alloc(params.asym_op_mpool,
+			RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
+	TEST_ASSERT_NOT_NULL(op,
+		"Failed to allocate asymmetric crypto operation struct\n");
+
+	asym_op = op->asym;
+
+	result = rte_zmalloc(NULL, modex_test_case.result_len, 0);
+	xform_tc.modex.modulus.data = modex_test_case.modulus.data;
+	xform_tc.modex.modulus.length = modex_test_case.modulus.len;
+	xform_tc.modex.exponent.data = modex_test_case.exponent.data;
+	xform_tc.modex.exponent.length = modex_test_case.exponent.len;
+	memcpy(input, modex_test_case.base.data,
+		modex_test_case.base.len);
+	asym_op->modex.base.data = input;
+	asym_op->modex.base.length = modex_test_case.base.len;
+	asym_op->modex.result.data = result;
+	asym_op->modex.result.length = modex_test_case.result_len;
+	if (rte_cryptodev_asym_xform_capability_check_modlen(capability,
+			xform_tc.modex.modulus.length)) {
+		RTE_LOG(INFO, USER1,
+			"line %u FAILED: %s", __LINE__,
+			"Invalid MODULUS length specified");
+		return TEST_FAILED;
+	}
+
+	if (!session_less) {
+		/* Create Crypto session*/
+		ret = rte_cryptodev_asym_session_create(TEST_CDEV_ID,
+				&xform_tc, params.asym_sess_mpool, &sess);
+		TEST_ASSERT_SUCCESS(ret, "Failed to init session\n");
+
+		ret = rte_event_crypto_adapter_caps_get(evdev, TEST_CDEV_ID,
+							&cap);
+		TEST_ASSERT_SUCCESS(ret, "Failed to get adapter capabilities\n");
+
+		if (cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_SESSION_PRIVATE_DATA) {
+			/* Fill in private user data information */
+			m_data.request_info.cdev_id = request_info.cdev_id;
+			m_data.request_info.queue_pair_id =
+				request_info.queue_pair_id;
+			m_data.response_info.event = response_info.event;
+			rte_cryptodev_session_event_mdata_set(TEST_CDEV_ID,
+					sess, RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
+					RTE_CRYPTO_OP_WITH_SESSION,
+					&m_data, sizeof(m_data));
+		}
+
+		rte_crypto_op_attach_asym_session(op, sess);
+	} else {
+		op->sess_type = RTE_CRYPTO_OP_SESSIONLESS;
+		asym_op->xform = &xform_tc;
+		op->private_data_offset = (sizeof(struct rte_crypto_op) +
+				sizeof(struct rte_crypto_asym_op) +
+				DEFAULT_NUM_XFORMS *
+				sizeof(struct rte_crypto_asym_xform));
+		/* Fill in private data information */
+		m_data.request_info.cdev_id = request_info.cdev_id;
+		m_data.request_info.queue_pair_id = request_info.queue_pair_id;
+		m_data.response_info.event = response_info.event;
+		rte_memcpy((uint8_t *)op + op->private_data_offset,
+				&m_data, sizeof(m_data));
+	}
+	/* Fill in event info and update event_ptr with rte_crypto_op */
+	memset(&ev, 0, sizeof(ev));
+	ev.queue_id = TEST_CRYPTO_EV_QUEUE_ID;
+	ev.sched_type = RTE_SCHED_TYPE_ATOMIC;
+	ev.flow_id = 0xAABB;
+	ev.event_ptr = op;
+
+	ret = send_recv_ev(&ev);
+	TEST_ASSERT_SUCCESS(ret, "Failed to send/receive event to "
+				"crypto adapter\n");
+
+	test_crypto_adapter_stats();
+
+	return TEST_SUCCESS;
+}
+
+
+static int
+test_asym_sessionless_with_op_forward_mode(void)
+{
+	uint32_t cap;
+	int ret;
+
+	ret = rte_event_crypto_adapter_caps_get(evdev, TEST_CDEV_ID, &cap);
+	TEST_ASSERT_SUCCESS(ret, "Failed to get adapter capabilities\n");
+
+	if (!(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD) &&
+	    !(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW))
+		map_adapter_service_core();
+	else {
+		if (!(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD))
+			return TEST_SKIPPED;
+	}
+
+	TEST_ASSERT_SUCCESS(rte_event_crypto_adapter_start(TEST_ADAPTER_ID),
+				"Failed to start event crypto adapter");
+
+	return test_asym_op_forward_mode(1);
+}
+
+static int
+test_asym_session_with_op_forward_mode(void)
+{
+	uint32_t cap;
+	int ret;
+
+	ret = rte_event_crypto_adapter_caps_get(evdev, TEST_CDEV_ID, &cap);
+	TEST_ASSERT_SUCCESS(ret, "Failed to get adapter capabilities\n");
+
+	if (!(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD) &&
+	    !(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW))
+		map_adapter_service_core();
+	else {
+		if (!(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD))
+			return TEST_SKIPPED;
+	}
+
+	TEST_ASSERT_SUCCESS(rte_event_crypto_adapter_start(TEST_ADAPTER_ID
+				), "Failed to start event crypto adapter");
+
+	return test_asym_op_forward_mode(0);
+}
+
 static int
 send_op_recv_ev(struct rte_crypto_op *op)
 {
@@ -365,11 +628,24 @@  send_op_recv_ev(struct rte_crypto_op *op)
 		rte_pause();
 
 	recv_op = ev.event_ptr;
+	if (recv_op->type == RTE_CRYPTO_OP_TYPE_SYMMETRIC) {
 #if PKT_TRACE
-	struct rte_mbuf *m = recv_op->sym->m_src;
-	rte_pktmbuf_dump(stdout, m, rte_pktmbuf_pkt_len(m));
+		struct rte_mbuf *m = recv_op->sym->m_src;
+		rte_pktmbuf_dump(stdout, m, rte_pktmbuf_pkt_len(m));
 #endif
-	rte_pktmbuf_free(recv_op->sym->m_src);
+		rte_pktmbuf_free(recv_op->sym->m_src);
+	} else {
+		uint8_t *data_expected = NULL, *data_received = NULL;
+		uint32_t data_size;
+
+		data_expected = modex_test_case.reminder.data;
+		data_received = op->asym->modex.result.data;
+		data_size = op->asym->modex.result.length;
+		ret = memcmp(data_expected, data_received, data_size);
+		TEST_ASSERT_EQUAL(ret, 0,
+				"Data mismatch for asym crypto adapter\n");
+		rte_free(op->asym->modex.result.data);
+	}
 	rte_crypto_op_free(recv_op);
 
 	return TEST_SUCCESS;
@@ -505,6 +781,156 @@  test_session_with_op_new_mode(void)
 	return TEST_SUCCESS;
 }
 
+static int
+test_asym_op_new_mode(uint8_t session_less)
+{
+	const struct rte_cryptodev_asymmetric_xform_capability *capability;
+	struct rte_cryptodev_asym_capability_idx cap_idx;
+	struct rte_crypto_asym_xform xform_tc;
+	union rte_event_crypto_metadata m_data;
+	struct rte_cryptodev_info dev_info;
+	struct rte_crypto_asym_op *asym_op;
+	struct rte_crypto_op *op;
+	uint8_t input[4096] = {0};
+	uint8_t *result = NULL;
+	void *sess = NULL;
+	uint32_t cap;
+	int ret;
+
+	memset(&m_data, 0, sizeof(m_data));
+
+	rte_cryptodev_info_get(TEST_CDEV_ID, &dev_info);
+	if (session_less && !(dev_info.feature_flags &
+				RTE_CRYPTODEV_FF_ASYM_SESSIONLESS)) {
+		RTE_LOG(INFO, USER1,
+			"Device doesn't support Asym sessionless ops. Test Skipped\n");
+		return TEST_SKIPPED;
+	}
+	/* Setup Cipher Parameters */
+	xform_tc.next = NULL;
+	xform_tc.xform_type = RTE_CRYPTO_ASYM_XFORM_MODEX;
+	cap_idx.type = xform_tc.xform_type;
+	capability = rte_cryptodev_asym_capability_get(TEST_CDEV_ID, &cap_idx);
+
+	if (capability == NULL) {
+		RTE_LOG(INFO, USER1,
+			"Device doesn't support MODEX. Test Skipped\n");
+		return TEST_SKIPPED;
+	}
+
+	op = rte_crypto_op_alloc(params.asym_op_mpool,
+			RTE_CRYPTO_OP_TYPE_ASYMMETRIC);
+	TEST_ASSERT_NOT_NULL(op, "Failed to allocate asym crypto_op!\n");
+
+	asym_op = op->asym;
+
+	result = rte_zmalloc(NULL, modex_test_case.result_len, 0);
+	xform_tc.modex.modulus.data = modex_test_case.modulus.data;
+	xform_tc.modex.modulus.length = modex_test_case.modulus.len;
+	xform_tc.modex.exponent.data = modex_test_case.exponent.data;
+	xform_tc.modex.exponent.length = modex_test_case.exponent.len;
+	memcpy(input, modex_test_case.base.data,
+		modex_test_case.base.len);
+	asym_op->modex.base.data = input;
+	asym_op->modex.base.length = modex_test_case.base.len;
+	asym_op->modex.result.data = result;
+	asym_op->modex.result.length = modex_test_case.result_len;
+	if (rte_cryptodev_asym_xform_capability_check_modlen(capability,
+			xform_tc.modex.modulus.length)) {
+		RTE_LOG(INFO, USER1,
+			"line %u FAILED: %s", __LINE__,
+			"Invalid MODULUS length specified");
+		return TEST_FAILED;
+	}
+
+	if (!session_less) {
+		ret = rte_cryptodev_asym_session_create(TEST_CDEV_ID,
+				&xform_tc, params.asym_sess_mpool, &sess);
+		TEST_ASSERT_NOT_NULL(sess, "Session creation failed\n");
+		TEST_ASSERT_SUCCESS(ret, "Failed to init session\n");
+
+		ret = rte_event_crypto_adapter_caps_get(evdev, TEST_CDEV_ID,
+							&cap);
+		TEST_ASSERT_SUCCESS(ret, "Failed to get adapter capabilities\n");
+
+		if (cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_SESSION_PRIVATE_DATA) {
+			/* Fill in private user data information */
+			m_data.response_info.event = response_info.event;
+			rte_cryptodev_session_event_mdata_set(TEST_CDEV_ID,
+					sess, RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
+					RTE_CRYPTO_OP_WITH_SESSION,
+					&m_data, sizeof(m_data));
+		}
+
+		rte_crypto_op_attach_asym_session(op, sess);
+	} else {
+		op->sess_type = RTE_CRYPTO_OP_SESSIONLESS;
+		asym_op->xform = &xform_tc;
+		op->private_data_offset = (sizeof(struct rte_crypto_op) +
+				sizeof(struct rte_crypto_asym_op) +
+				DEFAULT_NUM_XFORMS *
+				sizeof(struct rte_crypto_asym_xform));
+		/* Fill in private data information */
+		m_data.response_info.event = response_info.event;
+		rte_memcpy((uint8_t *)op + op->private_data_offset,
+				&m_data, sizeof(m_data));
+	}
+
+	ret = send_op_recv_ev(op);
+	TEST_ASSERT_SUCCESS(ret, "Failed to enqueue op to cryptodev\n");
+
+	test_crypto_adapter_stats();
+
+	return TEST_SUCCESS;
+}
+
+static int
+test_asym_sessionless_with_op_new_mode(void)
+{
+	uint32_t cap;
+	int ret;
+
+	ret = rte_event_crypto_adapter_caps_get(evdev, TEST_CDEV_ID, &cap);
+	TEST_ASSERT_SUCCESS(ret, "Failed to get adapter capabilities\n");
+
+	if (!(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD) &&
+	    !(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW))
+		map_adapter_service_core();
+	else {
+		if (!(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW))
+			return TEST_SKIPPED;
+	}
+
+	/* start the event crypto adapter */
+	TEST_ASSERT_SUCCESS(rte_event_crypto_adapter_start(TEST_ADAPTER_ID),
+				"Failed to start event crypto adapter");
+
+	return test_asym_op_new_mode(1);
+}
+
+static int
+test_asym_session_with_op_new_mode(void)
+{
+	uint32_t cap;
+	int ret;
+
+	ret = rte_event_crypto_adapter_caps_get(evdev, TEST_CDEV_ID, &cap);
+	TEST_ASSERT_SUCCESS(ret, "Failed to get adapter capabilities\n");
+
+	if (!(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD) &&
+	    !(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW))
+		map_adapter_service_core();
+	else {
+		if (!(cap & RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_NEW))
+			return TEST_SKIPPED;
+	}
+
+	TEST_ASSERT_SUCCESS(rte_event_crypto_adapter_start(TEST_ADAPTER_ID),
+				"Failed to start event crypto adapter");
+
+	return test_asym_op_new_mode(0);
+}
+
 static int
 configure_cryptodev(void)
 {
@@ -537,6 +963,19 @@  configure_cryptodev(void)
 		RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
 		return TEST_FAILED;
 	}
+	params.asym_op_mpool = rte_crypto_op_pool_create(
+			"EVENT_CRYPTO_ASYM_OP_POOL",
+			RTE_CRYPTO_OP_TYPE_ASYMMETRIC,
+			NUM_MBUFS, MBUF_CACHE_SIZE,
+			(DEFAULT_NUM_XFORMS *
+			sizeof(struct rte_crypto_asym_xform)) +
+			sizeof(union rte_event_crypto_metadata),
+			rte_socket_id());
+	if (params.asym_op_mpool == NULL) {
+		RTE_LOG(ERR, USER1, "Can't create CRYPTO_ASYM_OP_POOL\n");
+		return TEST_FAILED;
+	}
+
 
 	/* Create a NULL crypto device */
 	nb_devs = rte_cryptodev_device_count_by_driver(
@@ -581,6 +1020,15 @@  configure_cryptodev(void)
 	TEST_ASSERT_NOT_NULL(params.session_priv_mpool,
 			"session mempool allocation failed\n");
 
+	params.asym_sess_mpool = rte_cryptodev_asym_session_pool_create(
+			"CRYPTO_AD_ASYM_SESS_MP",
+			MAX_NB_SESSIONS, 0,
+			sizeof(union rte_event_crypto_metadata),
+			SOCKET_ID_ANY);
+	TEST_ASSERT_NOT_NULL(params.asym_sess_mpool,
+			"asym session mempool allocation failed\n");
+
+
 	rte_cryptodev_info_get(TEST_CDEV_ID, &info);
 	conf.nb_queue_pairs = info.max_nb_queue_pairs;
 	conf.socket_id = SOCKET_ID_ANY;
@@ -960,6 +1408,21 @@  crypto_teardown(void)
 		params.session_priv_mpool = NULL;
 	}
 
+	/* Free asym session mempool */
+	if (params.asym_sess_mpool != NULL) {
+		RTE_LOG(DEBUG, USER1, "CRYPTO_AD_ASYM_SESS_MP count %u\n",
+		rte_mempool_avail_count(params.asym_sess_mpool));
+		rte_mempool_free(params.asym_sess_mpool);
+		params.asym_sess_mpool = NULL;
+	}
+	/* Free asym ops mempool */
+	if (params.asym_op_mpool != NULL) {
+		RTE_LOG(DEBUG, USER1, "EVENT_CRYPTO_ASYM_OP_POOL count %u\n",
+		rte_mempool_avail_count(params.asym_op_mpool));
+		rte_mempool_free(params.asym_op_mpool);
+		params.asym_op_mpool = NULL;
+	}
+
 	/* Free ops mempool */
 	if (params.op_mpool != NULL) {
 		RTE_LOG(DEBUG, USER1, "EVENT_CRYPTO_SYM_OP_POOL count %u\n",
@@ -1016,6 +1479,22 @@  static struct unit_test_suite functional_testsuite = {
 				test_crypto_adapter_stop,
 				test_sessionless_with_op_new_mode),
 
+		TEST_CASE_ST(test_crypto_adapter_conf_op_forward_mode,
+				test_crypto_adapter_stop,
+				test_asym_session_with_op_forward_mode),
+
+		TEST_CASE_ST(test_crypto_adapter_conf_op_forward_mode,
+				test_crypto_adapter_stop,
+				test_asym_sessionless_with_op_forward_mode),
+
+		TEST_CASE_ST(test_crypto_adapter_conf_op_new_mode,
+				test_crypto_adapter_stop,
+				test_asym_session_with_op_new_mode),
+
+		TEST_CASE_ST(test_crypto_adapter_conf_op_new_mode,
+				test_crypto_adapter_stop,
+				test_asym_sessionless_with_op_new_mode),
+
 		TEST_CASES_END() /**< NULL terminate unit test array */
 	}
 };