* [PATCH 1/3] examples/ipsec-secgw: avoid error pkt prints in fast path
@ 2023-06-05 8:21 Nithin Dabilpuram
2023-06-05 8:21 ` [PATCH 2/3] examples/ipsec-secgw: skip Rx scatter for HW reassembly Nithin Dabilpuram
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Nithin Dabilpuram @ 2023-06-05 8:21 UTC (permalink / raw)
To: Radu Nicolau, Akhil Goyal; +Cc: jerinj, dev, Nithin Dabilpuram
Avoid printing errors due to bad packets in fast path as it
effects performance. Make them RTE_LOG_DP() instead.
Also print the actual ptype that is used to classify the pkt.
Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>
---
examples/ipsec-secgw/ipsec_worker.c | 2 +-
examples/ipsec-secgw/ipsec_worker.h | 5 +----
2 files changed, 2 insertions(+), 5 deletions(-)
diff --git a/examples/ipsec-secgw/ipsec_worker.c b/examples/ipsec-secgw/ipsec_worker.c
index 2f02946f86..58c80c73f0 100644
--- a/examples/ipsec-secgw/ipsec_worker.c
+++ b/examples/ipsec-secgw/ipsec_worker.c
@@ -578,7 +578,7 @@ process_ipsec_ev_outbound(struct ipsec_ctx *ctx, struct route_table *rt,
* Only plain IPv4 & IPv6 packets are allowed
* on protected port. Drop the rest.
*/
- RTE_LOG(ERR, IPSEC, "Unsupported packet type = %d\n", type);
+ RTE_LOG_DP(DEBUG, IPSEC, "Unsupported packet type = %d\n", type);
goto drop_pkt_and_exit;
}
diff --git a/examples/ipsec-secgw/ipsec_worker.h b/examples/ipsec-secgw/ipsec_worker.h
index d5a68d91fa..cf59b9b5ab 100644
--- a/examples/ipsec-secgw/ipsec_worker.h
+++ b/examples/ipsec-secgw/ipsec_worker.h
@@ -123,7 +123,6 @@ prepare_one_packet(struct rte_security_ctx *ctx, struct rte_mbuf *pkt,
struct ipsec_traffic *t)
{
uint32_t ptype = pkt->packet_type;
- const struct rte_ether_hdr *eth;
const struct rte_ipv4_hdr *iph4;
const struct rte_ipv6_hdr *iph6;
uint32_t tun_type, l3_type;
@@ -138,7 +137,6 @@ prepare_one_packet(struct rte_security_ctx *ctx, struct rte_mbuf *pkt,
tun_type = ptype & RTE_PTYPE_TUNNEL_MASK;
l3_type = ptype & RTE_PTYPE_L3_MASK;
- eth = rte_pktmbuf_mtod(pkt, const struct rte_ether_hdr *);
if (RTE_ETH_IS_IPV4_HDR(l3_type)) {
iph4 = (const struct rte_ipv4_hdr *)rte_pktmbuf_adj(pkt,
RTE_ETHER_HDR_LEN);
@@ -192,8 +190,7 @@ prepare_one_packet(struct rte_security_ctx *ctx, struct rte_mbuf *pkt,
tx_offload = l3len << RTE_MBUF_L2_LEN_BITS;
} else {
/* Unknown/Unsupported type, drop the packet */
- RTE_LOG(ERR, IPSEC, "Unsupported packet type 0x%x\n",
- rte_be_to_cpu_16(eth->ether_type));
+ RTE_LOG_DP(DEBUG, IPSEC, "Unsupported packet type 0x%x\n", ptype);
free_pkts(&pkt, 1);
return;
}
--
2.25.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 2/3] examples/ipsec-secgw: skip Rx scatter for HW reassembly
2023-06-05 8:21 [PATCH 1/3] examples/ipsec-secgw: avoid error pkt prints in fast path Nithin Dabilpuram
@ 2023-06-05 8:21 ` Nithin Dabilpuram
2023-06-05 8:21 ` [PATCH 3/3] app/test: test inline reassembly with multi seg Nithin Dabilpuram
2023-06-20 10:48 ` [PATCH 1/3] examples/ipsec-secgw: avoid error pkt prints in fast path Akhil Goyal
2 siblings, 0 replies; 4+ messages in thread
From: Nithin Dabilpuram @ 2023-06-05 8:21 UTC (permalink / raw)
To: Radu Nicolau, Akhil Goyal; +Cc: jerinj, dev, Nithin Dabilpuram
When HW reassembly is enabled, currently both Rx scatter and
Tx multi-segs ethdev offload flags are enabled. Tx multi-seg is
needed to Tx the reassembled pkt but Rx scatter is not needed as
reassembly should be self sufficient offload flag. Hence remove it
and only enable Tx multi-segs when HW reassembly is enabled.
Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>
---
examples/ipsec-secgw/sa.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/examples/ipsec-secgw/sa.c b/examples/ipsec-secgw/sa.c
index 5f5d2685f6..a25b4e2de7 100644
--- a/examples/ipsec-secgw/sa.c
+++ b/examples/ipsec-secgw/sa.c
@@ -1850,7 +1850,6 @@ sa_check_offloads(uint16_t port_id, uint64_t *rx_offloads,
&& rule->portid == port_id)
*rx_offloads |= RTE_ETH_RX_OFFLOAD_SECURITY;
if (IS_HW_REASSEMBLY_EN(rule->flags)) {
- *rx_offloads |= RTE_ETH_RX_OFFLOAD_SCATTER;
*tx_offloads |= RTE_ETH_TX_OFFLOAD_MULTI_SEGS;
*hw_reassembly = 1;
}
--
2.25.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 3/3] app/test: test inline reassembly with multi seg
2023-06-05 8:21 [PATCH 1/3] examples/ipsec-secgw: avoid error pkt prints in fast path Nithin Dabilpuram
2023-06-05 8:21 ` [PATCH 2/3] examples/ipsec-secgw: skip Rx scatter for HW reassembly Nithin Dabilpuram
@ 2023-06-05 8:21 ` Nithin Dabilpuram
2023-06-20 10:48 ` [PATCH 1/3] examples/ipsec-secgw: avoid error pkt prints in fast path Akhil Goyal
2 siblings, 0 replies; 4+ messages in thread
From: Nithin Dabilpuram @ 2023-06-05 8:21 UTC (permalink / raw)
To: Akhil Goyal; +Cc: jerinj, dev, Nithin Dabilpuram
Support testing inline reassembly with multi seg in
inline ipsec multi seg test command.
Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>
---
app/test/test_security_inline_proto.c | 17 ++++--
app/test/test_security_inline_proto_vectors.h | 53 ++++++++++++++++++-
2 files changed, 64 insertions(+), 6 deletions(-)
diff --git a/app/test/test_security_inline_proto.c b/app/test/test_security_inline_proto.c
index 79858e559f..7f6fa0ad8c 100644
--- a/app/test/test_security_inline_proto.c
+++ b/app/test/test_security_inline_proto.c
@@ -1624,6 +1624,8 @@ inline_ipsec_testsuite_setup(void)
* Without SG mode, default value is picked.
*/
plaintext_len = local_port_conf.rxmode.mtu - 256;
+ } else {
+ plaintext_len = 0;
}
return 0;
@@ -1934,6 +1936,7 @@ test_inline_ip_reassembly(const void *testdata)
const struct reassembly_vector *td = testdata;
struct ip_reassembly_test_packet full_pkt;
struct ip_reassembly_test_packet frags[MAX_FRAGS];
+ uint16_t extra_data, extra_data_sum = 0;
struct ipsec_test_flags flags = {0};
int i = 0;
@@ -1945,14 +1948,22 @@ test_inline_ip_reassembly(const void *testdata)
sizeof(struct ip_reassembly_test_packet));
reassembly_td.full_pkt = &full_pkt;
- test_vector_payload_populate(reassembly_td.full_pkt, true);
for (; i < reassembly_td.nb_frags; i++) {
memcpy(&frags[i], td->frags[i],
sizeof(struct ip_reassembly_test_packet));
reassembly_td.frags[i] = &frags[i];
+
+ /* Add extra data for multi-seg test on all fragments except last one */
+ extra_data = 0;
+ if (plaintext_len && reassembly_td.frags[i]->len < plaintext_len &&
+ (i != reassembly_td.nb_frags - 1))
+ extra_data = ((plaintext_len - reassembly_td.frags[i]->len) & ~0x7ULL);
+
test_vector_payload_populate(reassembly_td.frags[i],
- (i == 0) ? true : false);
+ (i == 0) ? true : false, extra_data, extra_data_sum);
+ extra_data_sum += extra_data;
}
+ test_vector_payload_populate(reassembly_td.full_pkt, true, extra_data_sum, 0);
return test_ipsec_with_reassembly(&reassembly_td, &flags);
}
@@ -2667,8 +2678,6 @@ test_ipsec_inline_proto_pkt_esn_antireplay4096(const void *test_data)
return test_ipsec_inline_proto_pkt_esn_antireplay(test_data, 4096);
}
-
-
static struct unit_test_suite inline_ipsec_testsuite = {
.suite_name = "Inline IPsec Ethernet Device Unit Test Suite",
.unit_test_cases = {
diff --git a/app/test/test_security_inline_proto_vectors.h b/app/test/test_security_inline_proto_vectors.h
index 003537e200..61a045b446 100644
--- a/app/test/test_security_inline_proto_vectors.h
+++ b/app/test/test_security_inline_proto_vectors.h
@@ -17,7 +17,7 @@ uint8_t dummy_ipv6_eth_hdr[] = {
0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0x86, 0xdd,
};
-#define MAX_FRAG_LEN 1500
+#define MAX_FRAG_LEN IPSEC_TEXT_MAX_LEN
#define MAX_FRAGS 6
#define MAX_PKT_LEN (MAX_FRAG_LEN * MAX_FRAGS)
@@ -468,9 +468,13 @@ struct ip_reassembly_test_packet pkt_ipv4_udp_p3_f5 = {
static inline void
test_vector_payload_populate(struct ip_reassembly_test_packet *pkt,
- bool first_frag)
+ bool first_frag, uint16_t extra_data, uint16_t extra_data_sum)
{
+ bool is_ipv6 = ((pkt->data[0] >> 4) == 0x6);
uint32_t i = pkt->l4_offset;
+ uint16_t len, off;
+ size_t ext_len = 0;
+ int proto;
/**
* For non-fragmented packets and first frag, skip 8 bytes from
@@ -479,6 +483,51 @@ test_vector_payload_populate(struct ip_reassembly_test_packet *pkt,
if (first_frag)
i += 8;
+ /* Fixup header and checksum */
+ if (extra_data || extra_data_sum) {
+ if (is_ipv6) {
+ struct rte_ipv6_hdr *hdr = (struct rte_ipv6_hdr *)pkt->data;
+ struct rte_ipv6_fragment_ext *frag_ext;
+ uint8_t *p = pkt->data;
+ uint16_t old_off;
+
+ len = rte_be_to_cpu_16(hdr->payload_len) + extra_data;
+ hdr->payload_len = rte_cpu_to_be_16(len);
+
+ /* Find frag extension header to add to frag offset */
+ if (extra_data_sum) {
+ proto = hdr->proto;
+ p += sizeof(struct rte_ipv6_hdr);
+ while (proto != IPPROTO_FRAGMENT &&
+ (proto = rte_ipv6_get_next_ext(p, proto, &ext_len) >= 0))
+ p += ext_len;
+
+ /* Found fragment header, update the frag offset */
+ if (proto == IPPROTO_FRAGMENT) {
+ frag_ext = (struct rte_ipv6_fragment_ext *)p;
+ old_off = rte_be_to_cpu_16(frag_ext->frag_data);
+ off = old_off & 0xFFF8;
+ off += extra_data_sum;
+ frag_ext->frag_data = rte_cpu_to_be_16(off |
+ (old_off & 0x7));
+ }
+ }
+ } else {
+ struct rte_ipv4_hdr *hdr = (struct rte_ipv4_hdr *)pkt->data;
+ uint16_t old_off = rte_be_to_cpu_16(hdr->fragment_offset);
+
+ len = rte_be_to_cpu_16(hdr->total_length) + extra_data;
+ off = old_off & 0x1FFF;
+ off += (extra_data_sum >> 3);
+
+ hdr->total_length = rte_cpu_to_be_16(len);
+ hdr->fragment_offset = rte_cpu_to_be_16(off | (old_off & 0xe000));
+ hdr->hdr_checksum = 0;
+ hdr->hdr_checksum = rte_ipv4_cksum(hdr);
+ }
+ pkt->len += extra_data;
+ }
+
for (; i < pkt->len; i++)
pkt->data[i] = 0x58;
}
--
2.25.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* RE: [PATCH 1/3] examples/ipsec-secgw: avoid error pkt prints in fast path
2023-06-05 8:21 [PATCH 1/3] examples/ipsec-secgw: avoid error pkt prints in fast path Nithin Dabilpuram
2023-06-05 8:21 ` [PATCH 2/3] examples/ipsec-secgw: skip Rx scatter for HW reassembly Nithin Dabilpuram
2023-06-05 8:21 ` [PATCH 3/3] app/test: test inline reassembly with multi seg Nithin Dabilpuram
@ 2023-06-20 10:48 ` Akhil Goyal
2 siblings, 0 replies; 4+ messages in thread
From: Akhil Goyal @ 2023-06-20 10:48 UTC (permalink / raw)
To: Nithin Kumar Dabilpuram, Radu Nicolau
Cc: Jerin Jacob Kollanukkaran, dev, Nithin Kumar Dabilpuram
> Subject: [PATCH 1/3] examples/ipsec-secgw: avoid error pkt prints in fast path
>
> Avoid printing errors due to bad packets in fast path as it
> effects performance. Make them RTE_LOG_DP() instead.
> Also print the actual ptype that is used to classify the pkt.
>
> Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>
Series
Acked-by: Akhil Goyal <gakhil@marvell.com>
Applied to dpdk-next-crypto
Thanks.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2023-06-20 10:48 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-05 8:21 [PATCH 1/3] examples/ipsec-secgw: avoid error pkt prints in fast path Nithin Dabilpuram
2023-06-05 8:21 ` [PATCH 2/3] examples/ipsec-secgw: skip Rx scatter for HW reassembly Nithin Dabilpuram
2023-06-05 8:21 ` [PATCH 3/3] app/test: test inline reassembly with multi seg Nithin Dabilpuram
2023-06-20 10:48 ` [PATCH 1/3] examples/ipsec-secgw: avoid error pkt prints in fast path 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).