DPDK patches and discussions
 help / color / mirror / Atom feed
* [PATCH] app/test: add support to run multi-seg inline IPsec test
@ 2022-10-20  6:46 Nithin Dabilpuram
  2022-10-20  8:14 ` [PATCH v2] " Nithin Dabilpuram
  0 siblings, 1 reply; 3+ messages in thread
From: Nithin Dabilpuram @ 2022-10-20  6:46 UTC (permalink / raw)
  To: Akhil Goyal, Fan Zhang; +Cc: jerinj, dev, Nithin Dabilpuram

Add support to run multi-seg inline ipsec test using
new test comman `inline_ipsec_sg_autotest`

Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>
---
 app/test/test_cryptodev_security_ipsec.c |  97 ++++++++++++++++-
 app/test/test_cryptodev_security_ipsec.h |   6 +-
 app/test/test_security_inline_proto.c    | 133 +++++++++++++++++++++--
 3 files changed, 218 insertions(+), 18 deletions(-)

diff --git a/app/test/test_cryptodev_security_ipsec.c b/app/test/test_cryptodev_security_ipsec.c
index cb77b39dbb..f7569aba1b 100644
--- a/app/test/test_cryptodev_security_ipsec.c
+++ b/app/test/test_cryptodev_security_ipsec.c
@@ -445,6 +445,65 @@ test_ipsec_td_prepare(const struct crypto_param *param1,
 			}
 		}
 
+		/* Adjust the data to requested length */
+		if (flags->plaintext_len && flags->ipv6) {
+			struct rte_ipv6_hdr *ip6 = (struct rte_ipv6_hdr *)td->input_text.data;
+			struct rte_tcp_hdr *tcp;
+			int64_t payload_len;
+			uint8_t *data;
+			int64_t i;
+
+			payload_len = RTE_MIN(flags->plaintext_len, IPSEC_TEXT_MAX_LEN);
+			payload_len -= sizeof(struct rte_ipv6_hdr);
+			payload_len -= sizeof(struct rte_tcp_hdr);
+			if (payload_len <= 16)
+				payload_len = 16;
+
+			/* IPv6 */
+			ip6->proto = IPPROTO_TCP;
+			ip6->payload_len = sizeof(*tcp) + payload_len;
+			ip6->payload_len = rte_cpu_to_be_16(ip6->payload_len);
+
+			/* TCP */
+			tcp = (struct rte_tcp_hdr *)(ip6 + 1);
+			data = (uint8_t *)(tcp + 1);
+			for (i = 0; i < payload_len; i++)
+				data[i] = i;
+			tcp->cksum = 0;
+			tcp->cksum = rte_ipv6_udptcp_cksum(ip6, tcp);
+			td->input_text.len = payload_len + sizeof(struct rte_ipv6_hdr) +
+				sizeof(struct rte_tcp_hdr);
+		} else if (flags->plaintext_len) {
+			struct rte_ipv4_hdr *ip = (struct rte_ipv4_hdr *)td->input_text.data;
+			struct rte_tcp_hdr *tcp;
+			int64_t payload_len;
+			uint8_t *data;
+			int64_t i;
+
+			payload_len = RTE_MIN(flags->plaintext_len, IPSEC_TEXT_MAX_LEN);
+			payload_len -= sizeof(struct rte_ipv4_hdr);
+			payload_len -= sizeof(struct rte_tcp_hdr);
+			if (payload_len <= 8)
+				payload_len = 8;
+
+			/* IPv4 */
+			ip->next_proto_id = IPPROTO_TCP;
+			ip->total_length = sizeof(*ip) + sizeof(*tcp) + payload_len;
+			ip->total_length = rte_cpu_to_be_16(ip->total_length);
+			ip->hdr_checksum = 0;
+			ip->hdr_checksum = rte_ipv4_cksum(ip);
+
+			/* TCP */
+			tcp = (struct rte_tcp_hdr *)(ip + 1);
+			data = (uint8_t *)(tcp + 1);
+			for (i = 0; i < payload_len; i++)
+				data[i] = i;
+			tcp->cksum = 0;
+			tcp->cksum = rte_ipv4_udptcp_cksum(ip, tcp);
+			td->input_text.len = payload_len + sizeof(struct rte_ipv4_hdr) +
+				sizeof(struct rte_tcp_hdr);
+		}
+
 		if (flags->ah) {
 			td->ipsec_xform.proto =
 					RTE_SECURITY_IPSEC_SA_PROTO_AH;
@@ -662,13 +721,23 @@ static int
 test_ipsec_l4_csum_verify(struct rte_mbuf *m)
 {
 	uint16_t actual_cksum = 0, expected_cksum = 0;
+	uint32_t len = rte_pktmbuf_pkt_len(m);
+	uint8_t data_arr[IPSEC_TEXT_MAX_LEN];
 	struct rte_ipv4_hdr *ipv4;
 	struct rte_ipv6_hdr *ipv6;
+	uint8_t *data = data_arr;
 	struct rte_tcp_hdr *tcp;
 	struct rte_udp_hdr *udp;
+	const uint8_t *ptr;
 	void *ip, *l4;
 
-	ip = rte_pktmbuf_mtod(m, void *);
+	ptr = rte_pktmbuf_read(m, 0, len, data_arr);
+	if (!ptr)
+		return -EINVAL;
+	else if (ptr != data_arr)
+		data = rte_pktmbuf_mtod_offset(m, uint8_t *, 0);
+
+	ip = (struct rte_ipv4_hdr *)data;
 
 	if (is_ipv4(ip)) {
 		ipv4 = ip;
@@ -748,9 +817,11 @@ static int
 test_ipsec_td_verify(struct rte_mbuf *m, const struct ipsec_test_data *td,
 		     bool silent, const struct ipsec_test_flags *flags)
 {
-	uint8_t *output_text = rte_pktmbuf_mtod(m, uint8_t *);
 	uint32_t skip, len = rte_pktmbuf_pkt_len(m);
-	uint8_t td_output_text[4096];
+	uint8_t td_output_text[IPSEC_TEXT_MAX_LEN];
+	uint8_t data_arr[IPSEC_TEXT_MAX_LEN];
+	uint8_t *output_text = data_arr;
+	const uint8_t *ptr;
 	int ret;
 
 	/* For tests with status as error for test success, skip verification */
@@ -761,6 +832,12 @@ test_ipsec_td_verify(struct rte_mbuf *m, const struct ipsec_test_data *td,
 	     td->ar_packet))
 		return TEST_SUCCESS;
 
+	ptr = rte_pktmbuf_read(m, 0, len, data_arr);
+	if (!ptr)
+		return -EINVAL;
+	else if (ptr != data_arr)
+		output_text = rte_pktmbuf_mtod_offset(m, uint8_t *, 0);
+
 	if (td->ipsec_xform.direction == RTE_SECURITY_IPSEC_SA_DIR_EGRESS &&
 	   flags->udp_encap) {
 		const struct rte_ipv4_hdr *iph4;
@@ -868,10 +945,20 @@ test_ipsec_res_d_prepare(struct rte_mbuf *m, const struct ipsec_test_data *td,
 {
 	uint8_t *output_text = rte_pktmbuf_mtod(m, uint8_t *);
 	uint32_t len = rte_pktmbuf_pkt_len(m);
+	struct rte_mbuf *next = m;
+	uint32_t off = 0;
 
 	memcpy(res_d, td, sizeof(*res_d));
-	memcpy(res_d->input_text.data, output_text, len);
-	res_d->input_text.len = len;
+
+	while (next && off < len) {
+		output_text = rte_pktmbuf_mtod(next, uint8_t *);
+		if (off + next->data_len > sizeof(res_d->input_text.data))
+			break;
+		memcpy(&res_d->input_text.data[off], output_text, next->data_len);
+		off += next->data_len;
+		next = next->next;
+	}
+	res_d->input_text.len = off;
 
 	res_d->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
 	if (res_d->aead) {
diff --git a/app/test/test_cryptodev_security_ipsec.h b/app/test/test_cryptodev_security_ipsec.h
index 67b783e637..cc0bf14777 100644
--- a/app/test/test_cryptodev_security_ipsec.h
+++ b/app/test/test_cryptodev_security_ipsec.h
@@ -9,6 +9,7 @@
 #include <rte_security.h>
 
 #define IPSEC_TEST_PACKETS_MAX 32
+#define IPSEC_TEXT_MAX_LEN 16384u
 
 struct ipsec_test_data {
 	struct {
@@ -19,12 +20,12 @@ struct ipsec_test_data {
 	} auth_key;
 
 	struct {
-		uint8_t data[1024];
+		uint8_t data[IPSEC_TEXT_MAX_LEN];
 		unsigned int len;
 	} input_text;
 
 	struct {
-		uint8_t data[1024];
+		uint8_t data[IPSEC_TEXT_MAX_LEN];
 		unsigned int len;
 	} output_text;
 
@@ -106,6 +107,7 @@ struct ipsec_test_flags {
 	enum flabel_flags flabel;
 	bool dec_ttl_or_hop_limit;
 	bool ah;
+	uint32_t plaintext_len;
 };
 
 struct crypto_param {
diff --git a/app/test/test_security_inline_proto.c b/app/test/test_security_inline_proto.c
index 19297d3628..1ffbe76083 100644
--- a/app/test/test_security_inline_proto.c
+++ b/app/test/test_security_inline_proto.c
@@ -106,6 +106,8 @@ static uint16_t port_id;
 static uint8_t eventdev_id;
 static uint8_t rx_adapter_id;
 static uint8_t tx_adapter_id;
+static uint16_t plaintext_len;
+static bool sg_mode;
 
 static bool event_mode_enabled;
 
@@ -399,20 +401,26 @@ copy_buf_to_pkt_segs(const uint8_t *buf, unsigned int len,
 	void *seg_buf;
 
 	seg = pkt;
-	while (offset >= seg->data_len) {
-		offset -= seg->data_len;
+	while (offset >= rte_pktmbuf_tailroom(seg)) {
+		offset -= rte_pktmbuf_tailroom(seg);
 		seg = seg->next;
 	}
-	copy_len = seg->data_len - offset;
+	copy_len = seg->buf_len - seg->data_off - offset;
 	seg_buf = rte_pktmbuf_mtod_offset(seg, char *, offset);
 	while (len > copy_len) {
 		rte_memcpy(seg_buf, buf + copied, (size_t) copy_len);
 		len -= copy_len;
 		copied += copy_len;
+		seg->data_len += copy_len;
+
 		seg = seg->next;
+		copy_len = seg->buf_len - seg->data_off;
 		seg_buf = rte_pktmbuf_mtod(seg, void *);
 	}
 	rte_memcpy(seg_buf, buf + copied, (size_t) len);
+	seg->data_len = len;
+
+	pkt->pkt_len += copied + len;
 }
 
 static bool
@@ -431,7 +439,8 @@ is_outer_ipv4(struct ipsec_test_data *td)
 static inline struct rte_mbuf *
 init_packet(struct rte_mempool *mp, const uint8_t *data, unsigned int len, bool outer_ipv4)
 {
-	struct rte_mbuf *pkt;
+	struct rte_mbuf *pkt, *tail;
+	uint16_t space;
 
 	pkt = rte_pktmbuf_alloc(mp);
 	if (pkt == NULL)
@@ -448,11 +457,31 @@ init_packet(struct rte_mempool *mp, const uint8_t *data, unsigned int len, bool
 	}
 	pkt->l2_len = RTE_ETHER_HDR_LEN;
 
-	if (pkt->buf_len > (len + RTE_ETHER_HDR_LEN))
+	space = rte_pktmbuf_tailroom(pkt);
+	tail = pkt;
+	/* Error if SG mode is not enabled */
+	if (!sg_mode && space < len) {
+		rte_pktmbuf_free(pkt);
+		return NULL;
+	}
+	/* Extra room for expansion */
+	while (space < len) {
+		tail->next = rte_pktmbuf_alloc(mp);
+		if (!tail->next)
+			goto error;
+		tail = tail->next;
+		space += rte_pktmbuf_tailroom(tail);
+		pkt->nb_segs++;
+	}
+
+	if (pkt->buf_len > len + RTE_ETHER_HDR_LEN)
 		rte_memcpy(rte_pktmbuf_append(pkt, len), data, len);
 	else
 		copy_buf_to_pkt_segs(data, len, pkt, RTE_ETHER_HDR_LEN);
 	return pkt;
+error:
+	rte_pktmbuf_free(pkt);
+	return NULL;
 }
 
 static int
@@ -466,7 +495,7 @@ init_mempools(unsigned int nb_mbuf)
 	if (mbufpool == NULL) {
 		snprintf(s, sizeof(s), "mbuf_pool");
 		mbufpool = rte_pktmbuf_pool_create(s, nb_mbuf,
-				MEMPOOL_CACHE_SIZE, 0,
+				MEMPOOL_CACHE_SIZE, RTE_CACHE_LINE_SIZE,
 				RTE_MBUF_DEFAULT_BUF_SIZE, SOCKET_ID_ANY);
 		if (mbufpool == NULL) {
 			printf("Cannot init mbuf pool\n");
@@ -1468,6 +1497,8 @@ ut_teardown_inline_ipsec(void)
 static int
 inline_ipsec_testsuite_setup(void)
 {
+	struct rte_eth_conf local_port_conf;
+	struct rte_eth_dev_info dev_info;
 	uint16_t nb_rxd;
 	uint16_t nb_txd;
 	uint16_t nb_ports;
@@ -1510,9 +1541,25 @@ inline_ipsec_testsuite_setup(void)
 
 	/* configuring port 0 for the test is enough */
 	port_id = 0;
+	if (rte_eth_dev_info_get(0, &dev_info)) {
+		printf("Failed to get devinfo");
+		return -1;
+	}
+
+	memcpy(&local_port_conf, &port_conf, sizeof(port_conf));
+	/* Add Multi seg flags */
+	if (sg_mode) {
+		uint16_t max_data_room = RTE_MBUF_DEFAULT_DATAROOM *
+			dev_info.rx_desc_lim.nb_seg_max;
+
+		local_port_conf.rxmode.offloads |= RTE_ETH_RX_OFFLOAD_SCATTER;
+		local_port_conf.txmode.offloads |= RTE_ETH_TX_OFFLOAD_MULTI_SEGS;
+		local_port_conf.rxmode.mtu = RTE_MIN(dev_info.max_mtu, max_data_room - 256);
+	}
+
 	/* port configure */
 	ret = rte_eth_dev_configure(port_id, nb_rx_queue,
-				    nb_tx_queue, &port_conf);
+				    nb_tx_queue, &local_port_conf);
 	if (ret < 0) {
 		printf("Cannot configure device: err=%d, port=%d\n",
 			 ret, port_id);
@@ -1546,6 +1593,15 @@ inline_ipsec_testsuite_setup(void)
 	}
 	test_ipsec_alg_list_populate();
 
+	/* Change the plaintext size for tests without Known vectors */
+	if (sg_mode) {
+		/* Leave space of 256B as ESP packet would be bigger and we
+		 * expect packets to be received back on same interface.
+		 * Without SG mode, default value is picked.
+		 */
+		plaintext_len = local_port_conf.rxmode.mtu - 256;
+	}
+
 	return 0;
 }
 
@@ -1922,6 +1978,7 @@ test_ipsec_inline_proto_display_list(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.display_alg = true;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -1934,6 +1991,7 @@ test_ipsec_inline_proto_udp_encap(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.udp_encap = true;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -1947,6 +2005,7 @@ test_ipsec_inline_proto_udp_ports_verify(const void *data __rte_unused)
 
 	flags.udp_encap = true;
 	flags.udp_ports_verify = true;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -1959,6 +2018,7 @@ test_ipsec_inline_proto_err_icv_corrupt(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.icv_corrupt = true;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -1971,6 +2031,7 @@ test_ipsec_inline_proto_tunnel_dst_addr_verify(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -1983,6 +2044,7 @@ test_ipsec_inline_proto_tunnel_src_dst_addr_verify(const void *data __rte_unused
 	memset(&flags, 0, sizeof(flags));
 
 	flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -1995,6 +2057,7 @@ test_ipsec_inline_proto_inner_ip_csum(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.ip_csum = true;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2007,6 +2070,7 @@ test_ipsec_inline_proto_inner_l4_csum(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.l4_csum = true;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2020,6 +2084,7 @@ test_ipsec_inline_proto_tunnel_v4_in_v4(const void *data __rte_unused)
 
 	flags.ipv6 = false;
 	flags.tunnel_ipv6 = false;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2033,6 +2098,7 @@ test_ipsec_inline_proto_tunnel_v6_in_v6(const void *data __rte_unused)
 
 	flags.ipv6 = true;
 	flags.tunnel_ipv6 = true;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2046,6 +2112,7 @@ test_ipsec_inline_proto_tunnel_v4_in_v6(const void *data __rte_unused)
 
 	flags.ipv6 = false;
 	flags.tunnel_ipv6 = true;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2059,6 +2126,7 @@ test_ipsec_inline_proto_tunnel_v6_in_v4(const void *data __rte_unused)
 
 	flags.ipv6 = true;
 	flags.tunnel_ipv6 = false;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2072,6 +2140,7 @@ test_ipsec_inline_proto_transport_v4(const void *data __rte_unused)
 
 	flags.ipv6 = false;
 	flags.transport = true;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2082,6 +2151,7 @@ test_ipsec_inline_proto_transport_l4_csum(const void *data __rte_unused)
 	struct ipsec_test_flags flags = {
 		.l4_csum = true,
 		.transport = true,
+		.plaintext_len = plaintext_len,
 	};
 
 	return test_ipsec_inline_proto_all(&flags);
@@ -2095,6 +2165,7 @@ test_ipsec_inline_proto_stats(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.stats_success = true;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2107,6 +2178,7 @@ test_ipsec_inline_proto_pkt_fragment(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.fragment = true;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 
@@ -2120,6 +2192,7 @@ test_ipsec_inline_proto_copy_df_inner_0(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.df = TEST_IPSEC_COPY_DF_INNER_0;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2132,6 +2205,7 @@ test_ipsec_inline_proto_copy_df_inner_1(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.df = TEST_IPSEC_COPY_DF_INNER_1;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2144,6 +2218,7 @@ test_ipsec_inline_proto_set_df_0_inner_1(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.df = TEST_IPSEC_SET_DF_0_INNER_1;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2156,6 +2231,7 @@ test_ipsec_inline_proto_set_df_1_inner_0(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.df = TEST_IPSEC_SET_DF_1_INNER_0;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2168,6 +2244,7 @@ test_ipsec_inline_proto_ipv4_copy_dscp_inner_0(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_0;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2180,6 +2257,7 @@ test_ipsec_inline_proto_ipv4_copy_dscp_inner_1(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_1;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2192,6 +2270,7 @@ test_ipsec_inline_proto_ipv4_set_dscp_0_inner_1(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.dscp = TEST_IPSEC_SET_DSCP_0_INNER_1;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2204,6 +2283,7 @@ test_ipsec_inline_proto_ipv4_set_dscp_1_inner_0(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.dscp = TEST_IPSEC_SET_DSCP_1_INNER_0;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2218,6 +2298,7 @@ test_ipsec_inline_proto_ipv6_copy_dscp_inner_0(const void *data __rte_unused)
 	flags.ipv6 = true;
 	flags.tunnel_ipv6 = true;
 	flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_0;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2232,6 +2313,7 @@ test_ipsec_inline_proto_ipv6_copy_dscp_inner_1(const void *data __rte_unused)
 	flags.ipv6 = true;
 	flags.tunnel_ipv6 = true;
 	flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_1;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2246,6 +2328,7 @@ test_ipsec_inline_proto_ipv6_set_dscp_0_inner_1(const void *data __rte_unused)
 	flags.ipv6 = true;
 	flags.tunnel_ipv6 = true;
 	flags.dscp = TEST_IPSEC_SET_DSCP_0_INNER_1;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2260,6 +2343,7 @@ test_ipsec_inline_proto_ipv6_set_dscp_1_inner_0(const void *data __rte_unused)
 	flags.ipv6 = true;
 	flags.tunnel_ipv6 = true;
 	flags.dscp = TEST_IPSEC_SET_DSCP_1_INNER_0;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2324,7 +2408,8 @@ static int
 test_ipsec_inline_proto_ipv4_ttl_decrement(const void *data __rte_unused)
 {
 	struct ipsec_test_flags flags = {
-		.dec_ttl_or_hop_limit = true
+		.dec_ttl_or_hop_limit = true,
+		.plaintext_len = plaintext_len,
 	};
 
 	return test_ipsec_inline_proto_all(&flags);
@@ -2335,7 +2420,8 @@ test_ipsec_inline_proto_ipv6_hop_limit_decrement(const void *data __rte_unused)
 {
 	struct ipsec_test_flags flags = {
 		.ipv6 = true,
-		.dec_ttl_or_hop_limit = true
+		.dec_ttl_or_hop_limit = true,
+		.plaintext_len = plaintext_len,
 	};
 
 	return test_ipsec_inline_proto_all(&flags);
@@ -2349,6 +2435,7 @@ test_ipsec_inline_proto_iv_gen(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.iv_gen = true;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2357,7 +2444,8 @@ static int
 test_ipsec_inline_proto_sa_pkt_soft_expiry(const void *data __rte_unused)
 {
 	struct ipsec_test_flags flags = {
-		.sa_expiry_pkts_soft = true
+		.sa_expiry_pkts_soft = true,
+		.plaintext_len = plaintext_len,
 	};
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2365,7 +2453,8 @@ static int
 test_ipsec_inline_proto_sa_byte_soft_expiry(const void *data __rte_unused)
 {
 	struct ipsec_test_flags flags = {
-		.sa_expiry_bytes_soft = true
+		.sa_expiry_bytes_soft = true,
+		.plaintext_len = plaintext_len,
 	};
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2398,6 +2487,7 @@ test_ipsec_inline_proto_known_vec_fragmented(const void *test_data)
 
 	memset(&flags, 0, sizeof(flags));
 	flags.fragment = true;
+	flags.plaintext_len = plaintext_len;
 
 	memcpy(&td_outb, test_data, sizeof(td_outb));
 
@@ -2420,6 +2510,7 @@ test_ipsec_inline_pkt_replay(const void *test_data, const uint64_t esn[],
 
 	memset(&flags, 0, sizeof(flags));
 	flags.antireplay = true;
+	flags.plaintext_len = plaintext_len;
 
 	for (i = 0; i < nb_pkts; i++) {
 		memcpy(&td_outb[i], test_data, sizeof(td_outb[0]));
@@ -2894,6 +2985,25 @@ test_inline_ipsec(void)
 	return unit_test_suite_runner(&inline_ipsec_testsuite);
 }
 
+
+static int
+test_inline_ipsec_sg(void)
+{
+	int rc;
+
+	inline_ipsec_testsuite.setup = inline_ipsec_testsuite_setup;
+	inline_ipsec_testsuite.teardown = inline_ipsec_testsuite_teardown;
+
+	sg_mode = true;
+	/* Run the tests */
+	rc = unit_test_suite_runner(&inline_ipsec_testsuite);
+	sg_mode = false;
+
+	port_conf.rxmode.offloads &= ~RTE_ETH_RX_OFFLOAD_SCATTER;
+	port_conf.txmode.offloads &= ~RTE_ETH_TX_OFFLOAD_MULTI_SEGS;
+	return rc;
+}
+
 static int
 test_event_inline_ipsec(void)
 {
@@ -2905,4 +3015,5 @@ test_event_inline_ipsec(void)
 #endif /* !RTE_EXEC_ENV_WINDOWS */
 
 REGISTER_TEST_COMMAND(inline_ipsec_autotest, test_inline_ipsec);
+REGISTER_TEST_COMMAND(inline_ipsec_sg_autotest, test_inline_ipsec_sg);
 REGISTER_TEST_COMMAND(event_inline_ipsec_autotest, test_event_inline_ipsec);
-- 
2.25.1


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH v2] app/test: add support to run multi-seg inline IPsec test
  2022-10-20  6:46 [PATCH] app/test: add support to run multi-seg inline IPsec test Nithin Dabilpuram
@ 2022-10-20  8:14 ` Nithin Dabilpuram
  2022-10-27 10:07   ` Akhil Goyal
  0 siblings, 1 reply; 3+ messages in thread
From: Nithin Dabilpuram @ 2022-10-20  8:14 UTC (permalink / raw)
  To: Akhil Goyal, Fan Zhang; +Cc: jerinj, dev, Nithin Dabilpuram

Add support to run multi-seg inline ipsec test using
new test command `inline_ipsec_sg_autotest`

Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>
---
v2:
- Fixed commit message and Windows compilation issue.

 app/test/test_cryptodev_security_ipsec.c |  97 +++++++++++++++-
 app/test/test_cryptodev_security_ipsec.h |   6 +-
 app/test/test_security_inline_proto.c    | 140 +++++++++++++++++++++--
 3 files changed, 225 insertions(+), 18 deletions(-)

diff --git a/app/test/test_cryptodev_security_ipsec.c b/app/test/test_cryptodev_security_ipsec.c
index cb77b39dbb..f7569aba1b 100644
--- a/app/test/test_cryptodev_security_ipsec.c
+++ b/app/test/test_cryptodev_security_ipsec.c
@@ -445,6 +445,65 @@ test_ipsec_td_prepare(const struct crypto_param *param1,
 			}
 		}
 
+		/* Adjust the data to requested length */
+		if (flags->plaintext_len && flags->ipv6) {
+			struct rte_ipv6_hdr *ip6 = (struct rte_ipv6_hdr *)td->input_text.data;
+			struct rte_tcp_hdr *tcp;
+			int64_t payload_len;
+			uint8_t *data;
+			int64_t i;
+
+			payload_len = RTE_MIN(flags->plaintext_len, IPSEC_TEXT_MAX_LEN);
+			payload_len -= sizeof(struct rte_ipv6_hdr);
+			payload_len -= sizeof(struct rte_tcp_hdr);
+			if (payload_len <= 16)
+				payload_len = 16;
+
+			/* IPv6 */
+			ip6->proto = IPPROTO_TCP;
+			ip6->payload_len = sizeof(*tcp) + payload_len;
+			ip6->payload_len = rte_cpu_to_be_16(ip6->payload_len);
+
+			/* TCP */
+			tcp = (struct rte_tcp_hdr *)(ip6 + 1);
+			data = (uint8_t *)(tcp + 1);
+			for (i = 0; i < payload_len; i++)
+				data[i] = i;
+			tcp->cksum = 0;
+			tcp->cksum = rte_ipv6_udptcp_cksum(ip6, tcp);
+			td->input_text.len = payload_len + sizeof(struct rte_ipv6_hdr) +
+				sizeof(struct rte_tcp_hdr);
+		} else if (flags->plaintext_len) {
+			struct rte_ipv4_hdr *ip = (struct rte_ipv4_hdr *)td->input_text.data;
+			struct rte_tcp_hdr *tcp;
+			int64_t payload_len;
+			uint8_t *data;
+			int64_t i;
+
+			payload_len = RTE_MIN(flags->plaintext_len, IPSEC_TEXT_MAX_LEN);
+			payload_len -= sizeof(struct rte_ipv4_hdr);
+			payload_len -= sizeof(struct rte_tcp_hdr);
+			if (payload_len <= 8)
+				payload_len = 8;
+
+			/* IPv4 */
+			ip->next_proto_id = IPPROTO_TCP;
+			ip->total_length = sizeof(*ip) + sizeof(*tcp) + payload_len;
+			ip->total_length = rte_cpu_to_be_16(ip->total_length);
+			ip->hdr_checksum = 0;
+			ip->hdr_checksum = rte_ipv4_cksum(ip);
+
+			/* TCP */
+			tcp = (struct rte_tcp_hdr *)(ip + 1);
+			data = (uint8_t *)(tcp + 1);
+			for (i = 0; i < payload_len; i++)
+				data[i] = i;
+			tcp->cksum = 0;
+			tcp->cksum = rte_ipv4_udptcp_cksum(ip, tcp);
+			td->input_text.len = payload_len + sizeof(struct rte_ipv4_hdr) +
+				sizeof(struct rte_tcp_hdr);
+		}
+
 		if (flags->ah) {
 			td->ipsec_xform.proto =
 					RTE_SECURITY_IPSEC_SA_PROTO_AH;
@@ -662,13 +721,23 @@ static int
 test_ipsec_l4_csum_verify(struct rte_mbuf *m)
 {
 	uint16_t actual_cksum = 0, expected_cksum = 0;
+	uint32_t len = rte_pktmbuf_pkt_len(m);
+	uint8_t data_arr[IPSEC_TEXT_MAX_LEN];
 	struct rte_ipv4_hdr *ipv4;
 	struct rte_ipv6_hdr *ipv6;
+	uint8_t *data = data_arr;
 	struct rte_tcp_hdr *tcp;
 	struct rte_udp_hdr *udp;
+	const uint8_t *ptr;
 	void *ip, *l4;
 
-	ip = rte_pktmbuf_mtod(m, void *);
+	ptr = rte_pktmbuf_read(m, 0, len, data_arr);
+	if (!ptr)
+		return -EINVAL;
+	else if (ptr != data_arr)
+		data = rte_pktmbuf_mtod_offset(m, uint8_t *, 0);
+
+	ip = (struct rte_ipv4_hdr *)data;
 
 	if (is_ipv4(ip)) {
 		ipv4 = ip;
@@ -748,9 +817,11 @@ static int
 test_ipsec_td_verify(struct rte_mbuf *m, const struct ipsec_test_data *td,
 		     bool silent, const struct ipsec_test_flags *flags)
 {
-	uint8_t *output_text = rte_pktmbuf_mtod(m, uint8_t *);
 	uint32_t skip, len = rte_pktmbuf_pkt_len(m);
-	uint8_t td_output_text[4096];
+	uint8_t td_output_text[IPSEC_TEXT_MAX_LEN];
+	uint8_t data_arr[IPSEC_TEXT_MAX_LEN];
+	uint8_t *output_text = data_arr;
+	const uint8_t *ptr;
 	int ret;
 
 	/* For tests with status as error for test success, skip verification */
@@ -761,6 +832,12 @@ test_ipsec_td_verify(struct rte_mbuf *m, const struct ipsec_test_data *td,
 	     td->ar_packet))
 		return TEST_SUCCESS;
 
+	ptr = rte_pktmbuf_read(m, 0, len, data_arr);
+	if (!ptr)
+		return -EINVAL;
+	else if (ptr != data_arr)
+		output_text = rte_pktmbuf_mtod_offset(m, uint8_t *, 0);
+
 	if (td->ipsec_xform.direction == RTE_SECURITY_IPSEC_SA_DIR_EGRESS &&
 	   flags->udp_encap) {
 		const struct rte_ipv4_hdr *iph4;
@@ -868,10 +945,20 @@ test_ipsec_res_d_prepare(struct rte_mbuf *m, const struct ipsec_test_data *td,
 {
 	uint8_t *output_text = rte_pktmbuf_mtod(m, uint8_t *);
 	uint32_t len = rte_pktmbuf_pkt_len(m);
+	struct rte_mbuf *next = m;
+	uint32_t off = 0;
 
 	memcpy(res_d, td, sizeof(*res_d));
-	memcpy(res_d->input_text.data, output_text, len);
-	res_d->input_text.len = len;
+
+	while (next && off < len) {
+		output_text = rte_pktmbuf_mtod(next, uint8_t *);
+		if (off + next->data_len > sizeof(res_d->input_text.data))
+			break;
+		memcpy(&res_d->input_text.data[off], output_text, next->data_len);
+		off += next->data_len;
+		next = next->next;
+	}
+	res_d->input_text.len = off;
 
 	res_d->ipsec_xform.direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS;
 	if (res_d->aead) {
diff --git a/app/test/test_cryptodev_security_ipsec.h b/app/test/test_cryptodev_security_ipsec.h
index 67b783e637..cc0bf14777 100644
--- a/app/test/test_cryptodev_security_ipsec.h
+++ b/app/test/test_cryptodev_security_ipsec.h
@@ -9,6 +9,7 @@
 #include <rte_security.h>
 
 #define IPSEC_TEST_PACKETS_MAX 32
+#define IPSEC_TEXT_MAX_LEN 16384u
 
 struct ipsec_test_data {
 	struct {
@@ -19,12 +20,12 @@ struct ipsec_test_data {
 	} auth_key;
 
 	struct {
-		uint8_t data[1024];
+		uint8_t data[IPSEC_TEXT_MAX_LEN];
 		unsigned int len;
 	} input_text;
 
 	struct {
-		uint8_t data[1024];
+		uint8_t data[IPSEC_TEXT_MAX_LEN];
 		unsigned int len;
 	} output_text;
 
@@ -106,6 +107,7 @@ struct ipsec_test_flags {
 	enum flabel_flags flabel;
 	bool dec_ttl_or_hop_limit;
 	bool ah;
+	uint32_t plaintext_len;
 };
 
 struct crypto_param {
diff --git a/app/test/test_security_inline_proto.c b/app/test/test_security_inline_proto.c
index 19297d3628..009458f08a 100644
--- a/app/test/test_security_inline_proto.c
+++ b/app/test/test_security_inline_proto.c
@@ -28,6 +28,13 @@ test_event_inline_ipsec(void)
 	return TEST_SKIPPED;
 }
 
+static int
+test_inline_ipsec_sg(void)
+{
+	printf("Inline ipsec SG not supported on Windows, skipping test\n");
+	return TEST_SKIPPED;
+}
+
 #else
 
 #include <rte_eventdev.h>
@@ -106,6 +113,8 @@ static uint16_t port_id;
 static uint8_t eventdev_id;
 static uint8_t rx_adapter_id;
 static uint8_t tx_adapter_id;
+static uint16_t plaintext_len;
+static bool sg_mode;
 
 static bool event_mode_enabled;
 
@@ -399,20 +408,26 @@ copy_buf_to_pkt_segs(const uint8_t *buf, unsigned int len,
 	void *seg_buf;
 
 	seg = pkt;
-	while (offset >= seg->data_len) {
-		offset -= seg->data_len;
+	while (offset >= rte_pktmbuf_tailroom(seg)) {
+		offset -= rte_pktmbuf_tailroom(seg);
 		seg = seg->next;
 	}
-	copy_len = seg->data_len - offset;
+	copy_len = seg->buf_len - seg->data_off - offset;
 	seg_buf = rte_pktmbuf_mtod_offset(seg, char *, offset);
 	while (len > copy_len) {
 		rte_memcpy(seg_buf, buf + copied, (size_t) copy_len);
 		len -= copy_len;
 		copied += copy_len;
+		seg->data_len += copy_len;
+
 		seg = seg->next;
+		copy_len = seg->buf_len - seg->data_off;
 		seg_buf = rte_pktmbuf_mtod(seg, void *);
 	}
 	rte_memcpy(seg_buf, buf + copied, (size_t) len);
+	seg->data_len = len;
+
+	pkt->pkt_len += copied + len;
 }
 
 static bool
@@ -431,7 +446,8 @@ is_outer_ipv4(struct ipsec_test_data *td)
 static inline struct rte_mbuf *
 init_packet(struct rte_mempool *mp, const uint8_t *data, unsigned int len, bool outer_ipv4)
 {
-	struct rte_mbuf *pkt;
+	struct rte_mbuf *pkt, *tail;
+	uint16_t space;
 
 	pkt = rte_pktmbuf_alloc(mp);
 	if (pkt == NULL)
@@ -448,11 +464,31 @@ init_packet(struct rte_mempool *mp, const uint8_t *data, unsigned int len, bool
 	}
 	pkt->l2_len = RTE_ETHER_HDR_LEN;
 
-	if (pkt->buf_len > (len + RTE_ETHER_HDR_LEN))
+	space = rte_pktmbuf_tailroom(pkt);
+	tail = pkt;
+	/* Error if SG mode is not enabled */
+	if (!sg_mode && space < len) {
+		rte_pktmbuf_free(pkt);
+		return NULL;
+	}
+	/* Extra room for expansion */
+	while (space < len) {
+		tail->next = rte_pktmbuf_alloc(mp);
+		if (!tail->next)
+			goto error;
+		tail = tail->next;
+		space += rte_pktmbuf_tailroom(tail);
+		pkt->nb_segs++;
+	}
+
+	if (pkt->buf_len > len + RTE_ETHER_HDR_LEN)
 		rte_memcpy(rte_pktmbuf_append(pkt, len), data, len);
 	else
 		copy_buf_to_pkt_segs(data, len, pkt, RTE_ETHER_HDR_LEN);
 	return pkt;
+error:
+	rte_pktmbuf_free(pkt);
+	return NULL;
 }
 
 static int
@@ -466,7 +502,7 @@ init_mempools(unsigned int nb_mbuf)
 	if (mbufpool == NULL) {
 		snprintf(s, sizeof(s), "mbuf_pool");
 		mbufpool = rte_pktmbuf_pool_create(s, nb_mbuf,
-				MEMPOOL_CACHE_SIZE, 0,
+				MEMPOOL_CACHE_SIZE, RTE_CACHE_LINE_SIZE,
 				RTE_MBUF_DEFAULT_BUF_SIZE, SOCKET_ID_ANY);
 		if (mbufpool == NULL) {
 			printf("Cannot init mbuf pool\n");
@@ -1468,6 +1504,8 @@ ut_teardown_inline_ipsec(void)
 static int
 inline_ipsec_testsuite_setup(void)
 {
+	struct rte_eth_conf local_port_conf;
+	struct rte_eth_dev_info dev_info;
 	uint16_t nb_rxd;
 	uint16_t nb_txd;
 	uint16_t nb_ports;
@@ -1510,9 +1548,25 @@ inline_ipsec_testsuite_setup(void)
 
 	/* configuring port 0 for the test is enough */
 	port_id = 0;
+	if (rte_eth_dev_info_get(0, &dev_info)) {
+		printf("Failed to get devinfo");
+		return -1;
+	}
+
+	memcpy(&local_port_conf, &port_conf, sizeof(port_conf));
+	/* Add Multi seg flags */
+	if (sg_mode) {
+		uint16_t max_data_room = RTE_MBUF_DEFAULT_DATAROOM *
+			dev_info.rx_desc_lim.nb_seg_max;
+
+		local_port_conf.rxmode.offloads |= RTE_ETH_RX_OFFLOAD_SCATTER;
+		local_port_conf.txmode.offloads |= RTE_ETH_TX_OFFLOAD_MULTI_SEGS;
+		local_port_conf.rxmode.mtu = RTE_MIN(dev_info.max_mtu, max_data_room - 256);
+	}
+
 	/* port configure */
 	ret = rte_eth_dev_configure(port_id, nb_rx_queue,
-				    nb_tx_queue, &port_conf);
+				    nb_tx_queue, &local_port_conf);
 	if (ret < 0) {
 		printf("Cannot configure device: err=%d, port=%d\n",
 			 ret, port_id);
@@ -1546,6 +1600,15 @@ inline_ipsec_testsuite_setup(void)
 	}
 	test_ipsec_alg_list_populate();
 
+	/* Change the plaintext size for tests without Known vectors */
+	if (sg_mode) {
+		/* Leave space of 256B as ESP packet would be bigger and we
+		 * expect packets to be received back on same interface.
+		 * Without SG mode, default value is picked.
+		 */
+		plaintext_len = local_port_conf.rxmode.mtu - 256;
+	}
+
 	return 0;
 }
 
@@ -1922,6 +1985,7 @@ test_ipsec_inline_proto_display_list(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.display_alg = true;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -1934,6 +1998,7 @@ test_ipsec_inline_proto_udp_encap(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.udp_encap = true;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -1947,6 +2012,7 @@ test_ipsec_inline_proto_udp_ports_verify(const void *data __rte_unused)
 
 	flags.udp_encap = true;
 	flags.udp_ports_verify = true;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -1959,6 +2025,7 @@ test_ipsec_inline_proto_err_icv_corrupt(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.icv_corrupt = true;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -1971,6 +2038,7 @@ test_ipsec_inline_proto_tunnel_dst_addr_verify(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -1983,6 +2051,7 @@ test_ipsec_inline_proto_tunnel_src_dst_addr_verify(const void *data __rte_unused
 	memset(&flags, 0, sizeof(flags));
 
 	flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -1995,6 +2064,7 @@ test_ipsec_inline_proto_inner_ip_csum(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.ip_csum = true;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2007,6 +2077,7 @@ test_ipsec_inline_proto_inner_l4_csum(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.l4_csum = true;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2020,6 +2091,7 @@ test_ipsec_inline_proto_tunnel_v4_in_v4(const void *data __rte_unused)
 
 	flags.ipv6 = false;
 	flags.tunnel_ipv6 = false;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2033,6 +2105,7 @@ test_ipsec_inline_proto_tunnel_v6_in_v6(const void *data __rte_unused)
 
 	flags.ipv6 = true;
 	flags.tunnel_ipv6 = true;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2046,6 +2119,7 @@ test_ipsec_inline_proto_tunnel_v4_in_v6(const void *data __rte_unused)
 
 	flags.ipv6 = false;
 	flags.tunnel_ipv6 = true;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2059,6 +2133,7 @@ test_ipsec_inline_proto_tunnel_v6_in_v4(const void *data __rte_unused)
 
 	flags.ipv6 = true;
 	flags.tunnel_ipv6 = false;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2072,6 +2147,7 @@ test_ipsec_inline_proto_transport_v4(const void *data __rte_unused)
 
 	flags.ipv6 = false;
 	flags.transport = true;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2082,6 +2158,7 @@ test_ipsec_inline_proto_transport_l4_csum(const void *data __rte_unused)
 	struct ipsec_test_flags flags = {
 		.l4_csum = true,
 		.transport = true,
+		.plaintext_len = plaintext_len,
 	};
 
 	return test_ipsec_inline_proto_all(&flags);
@@ -2095,6 +2172,7 @@ test_ipsec_inline_proto_stats(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.stats_success = true;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2107,6 +2185,7 @@ test_ipsec_inline_proto_pkt_fragment(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.fragment = true;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 
@@ -2120,6 +2199,7 @@ test_ipsec_inline_proto_copy_df_inner_0(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.df = TEST_IPSEC_COPY_DF_INNER_0;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2132,6 +2212,7 @@ test_ipsec_inline_proto_copy_df_inner_1(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.df = TEST_IPSEC_COPY_DF_INNER_1;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2144,6 +2225,7 @@ test_ipsec_inline_proto_set_df_0_inner_1(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.df = TEST_IPSEC_SET_DF_0_INNER_1;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2156,6 +2238,7 @@ test_ipsec_inline_proto_set_df_1_inner_0(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.df = TEST_IPSEC_SET_DF_1_INNER_0;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2168,6 +2251,7 @@ test_ipsec_inline_proto_ipv4_copy_dscp_inner_0(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_0;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2180,6 +2264,7 @@ test_ipsec_inline_proto_ipv4_copy_dscp_inner_1(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_1;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2192,6 +2277,7 @@ test_ipsec_inline_proto_ipv4_set_dscp_0_inner_1(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.dscp = TEST_IPSEC_SET_DSCP_0_INNER_1;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2204,6 +2290,7 @@ test_ipsec_inline_proto_ipv4_set_dscp_1_inner_0(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.dscp = TEST_IPSEC_SET_DSCP_1_INNER_0;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2218,6 +2305,7 @@ test_ipsec_inline_proto_ipv6_copy_dscp_inner_0(const void *data __rte_unused)
 	flags.ipv6 = true;
 	flags.tunnel_ipv6 = true;
 	flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_0;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2232,6 +2320,7 @@ test_ipsec_inline_proto_ipv6_copy_dscp_inner_1(const void *data __rte_unused)
 	flags.ipv6 = true;
 	flags.tunnel_ipv6 = true;
 	flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_1;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2246,6 +2335,7 @@ test_ipsec_inline_proto_ipv6_set_dscp_0_inner_1(const void *data __rte_unused)
 	flags.ipv6 = true;
 	flags.tunnel_ipv6 = true;
 	flags.dscp = TEST_IPSEC_SET_DSCP_0_INNER_1;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2260,6 +2350,7 @@ test_ipsec_inline_proto_ipv6_set_dscp_1_inner_0(const void *data __rte_unused)
 	flags.ipv6 = true;
 	flags.tunnel_ipv6 = true;
 	flags.dscp = TEST_IPSEC_SET_DSCP_1_INNER_0;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2324,7 +2415,8 @@ static int
 test_ipsec_inline_proto_ipv4_ttl_decrement(const void *data __rte_unused)
 {
 	struct ipsec_test_flags flags = {
-		.dec_ttl_or_hop_limit = true
+		.dec_ttl_or_hop_limit = true,
+		.plaintext_len = plaintext_len,
 	};
 
 	return test_ipsec_inline_proto_all(&flags);
@@ -2335,7 +2427,8 @@ test_ipsec_inline_proto_ipv6_hop_limit_decrement(const void *data __rte_unused)
 {
 	struct ipsec_test_flags flags = {
 		.ipv6 = true,
-		.dec_ttl_or_hop_limit = true
+		.dec_ttl_or_hop_limit = true,
+		.plaintext_len = plaintext_len,
 	};
 
 	return test_ipsec_inline_proto_all(&flags);
@@ -2349,6 +2442,7 @@ test_ipsec_inline_proto_iv_gen(const void *data __rte_unused)
 	memset(&flags, 0, sizeof(flags));
 
 	flags.iv_gen = true;
+	flags.plaintext_len = plaintext_len;
 
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2357,7 +2451,8 @@ static int
 test_ipsec_inline_proto_sa_pkt_soft_expiry(const void *data __rte_unused)
 {
 	struct ipsec_test_flags flags = {
-		.sa_expiry_pkts_soft = true
+		.sa_expiry_pkts_soft = true,
+		.plaintext_len = plaintext_len,
 	};
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2365,7 +2460,8 @@ static int
 test_ipsec_inline_proto_sa_byte_soft_expiry(const void *data __rte_unused)
 {
 	struct ipsec_test_flags flags = {
-		.sa_expiry_bytes_soft = true
+		.sa_expiry_bytes_soft = true,
+		.plaintext_len = plaintext_len,
 	};
 	return test_ipsec_inline_proto_all(&flags);
 }
@@ -2398,6 +2494,7 @@ test_ipsec_inline_proto_known_vec_fragmented(const void *test_data)
 
 	memset(&flags, 0, sizeof(flags));
 	flags.fragment = true;
+	flags.plaintext_len = plaintext_len;
 
 	memcpy(&td_outb, test_data, sizeof(td_outb));
 
@@ -2420,6 +2517,7 @@ test_ipsec_inline_pkt_replay(const void *test_data, const uint64_t esn[],
 
 	memset(&flags, 0, sizeof(flags));
 	flags.antireplay = true;
+	flags.plaintext_len = plaintext_len;
 
 	for (i = 0; i < nb_pkts; i++) {
 		memcpy(&td_outb[i], test_data, sizeof(td_outb[0]));
@@ -2894,6 +2992,25 @@ test_inline_ipsec(void)
 	return unit_test_suite_runner(&inline_ipsec_testsuite);
 }
 
+
+static int
+test_inline_ipsec_sg(void)
+{
+	int rc;
+
+	inline_ipsec_testsuite.setup = inline_ipsec_testsuite_setup;
+	inline_ipsec_testsuite.teardown = inline_ipsec_testsuite_teardown;
+
+	sg_mode = true;
+	/* Run the tests */
+	rc = unit_test_suite_runner(&inline_ipsec_testsuite);
+	sg_mode = false;
+
+	port_conf.rxmode.offloads &= ~RTE_ETH_RX_OFFLOAD_SCATTER;
+	port_conf.txmode.offloads &= ~RTE_ETH_TX_OFFLOAD_MULTI_SEGS;
+	return rc;
+}
+
 static int
 test_event_inline_ipsec(void)
 {
@@ -2905,4 +3022,5 @@ test_event_inline_ipsec(void)
 #endif /* !RTE_EXEC_ENV_WINDOWS */
 
 REGISTER_TEST_COMMAND(inline_ipsec_autotest, test_inline_ipsec);
+REGISTER_TEST_COMMAND(inline_ipsec_sg_autotest, test_inline_ipsec_sg);
 REGISTER_TEST_COMMAND(event_inline_ipsec_autotest, test_event_inline_ipsec);
-- 
2.25.1


^ permalink raw reply	[flat|nested] 3+ messages in thread

* RE: [PATCH v2] app/test: add support to run multi-seg inline IPsec test
  2022-10-20  8:14 ` [PATCH v2] " Nithin Dabilpuram
@ 2022-10-27 10:07   ` Akhil Goyal
  0 siblings, 0 replies; 3+ messages in thread
From: Akhil Goyal @ 2022-10-27 10:07 UTC (permalink / raw)
  To: Nithin Kumar Dabilpuram, Fan Zhang
  Cc: Jerin Jacob Kollanukkaran, dev, Nithin Kumar Dabilpuram

> Subject: [PATCH v2] app/test: add support to run multi-seg inline IPsec test
> 
> Add support to run multi-seg inline ipsec test using
> new test command `inline_ipsec_sg_autotest`
> 
> Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>
> ---
Acked-by: Akhil Goyal <gakhil@marvell.com>

Applied to dpdk-next-crypto

Thanks.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2022-10-27 10:07 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-10-20  6:46 [PATCH] app/test: add support to run multi-seg inline IPsec test Nithin Dabilpuram
2022-10-20  8:14 ` [PATCH v2] " Nithin Dabilpuram
2022-10-27 10:07   ` Akhil Goyal

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).