From: Michael Baum <michaelba@nvidia.com>
To: <dev@dpdk.org>
Cc: Aman Singh <aman.deep.singh@intel.com>,
Yuying Zhang <yuying.zhang@intel.com>,
Ferruh Yigit <ferruh.yigit@amd.com>,
"Thomas Monjalon" <thomas@monjalon.net>, <orika@nvidia.com>,
<stable@dpdk.org>
Subject: [PATCH] app/testpmd: fix wrong encap/decap size calculation
Date: Thu, 16 Mar 2023 19:16:54 +0200 [thread overview]
Message-ID: <20230316171654.1827514-1-michaelba@nvidia.com> (raw)
Testpmd app has some functions to create either encap or decap buffer
for some special cases:
- "l2_encap" and "l2_decap"
- "mplsogre_encap" and "mplsogre_decap"
- "mplsoudp_encap" and "mplsoudp_decap"
The functions use both "rte_flow_item_eth" and "rte_flow_item_vlan"
structures to represent the headers and copy them into "raw_encap"
action. The size of either "raw_encap" or "raw_decap" is capculated as
sum of headers size.
However, the both "rte_flow_item_eth" and "rte_flow_item_vlan" contain
more fields than original headers, so using them cause bad size
calculation.
This patch uses "RTE_ETHER_HDR_LEN" and "RTE_VLAN_HLEN" macros in size
calculation.
Fixes: 3e77031be855 ("app/testpmd: add MPLSoGRE encapsulation")
Fixes: a1191d39cb57 ("app/testpmd: add MPLSoUDP encapsulation")
Cc: orika@nvidia.com
Cc: stable@dpdk.org
Signed-off-by: Michael Baum <michaelba@nvidia.com>
---
app/test-pmd/cmdline_flow.c | 48 ++++++++++++++++++-------------------
1 file changed, 24 insertions(+), 24 deletions(-)
diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c
index 63a0b36622..fff0cb3d57 100644
--- a/app/test-pmd/cmdline_flow.c
+++ b/app/test-pmd/cmdline_flow.c
@@ -7988,15 +7988,15 @@ parse_vc_action_l2_encap(struct context *ctx, const struct token *token,
l2_encap_conf.eth_dst, RTE_ETHER_ADDR_LEN);
memcpy(eth.hdr.src_addr.addr_bytes,
l2_encap_conf.eth_src, RTE_ETHER_ADDR_LEN);
- memcpy(header, ð, sizeof(eth));
- header += sizeof(eth);
+ memcpy(header, ð.hdr, RTE_ETHER_HDR_LEN);
+ header += RTE_ETHER_HDR_LEN;
if (l2_encap_conf.select_vlan) {
if (l2_encap_conf.select_ipv4)
vlan.hdr.eth_proto = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4);
else
vlan.hdr.eth_proto = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV6);
- memcpy(header, &vlan, sizeof(vlan));
- header += sizeof(vlan);
+ memcpy(header, &vlan.hdr, RTE_VLAN_HLEN);
+ header += RTE_VLAN_HLEN;
}
action_encap_data->conf.size = header -
action_encap_data->data;
@@ -8044,11 +8044,11 @@ parse_vc_action_l2_decap(struct context *ctx, const struct token *token,
header = action_decap_data->data;
if (l2_decap_conf.select_vlan)
eth.hdr.ether_type = rte_cpu_to_be_16(RTE_ETHER_TYPE_VLAN);
- memcpy(header, ð, sizeof(eth));
- header += sizeof(eth);
+ memcpy(header, ð.hdr, RTE_ETHER_HDR_LEN);
+ header += RTE_ETHER_HDR_LEN;
if (l2_decap_conf.select_vlan) {
- memcpy(header, &vlan, sizeof(vlan));
- header += sizeof(vlan);
+ memcpy(header, &vlan.hdr, RTE_VLAN_HLEN);
+ header += RTE_VLAN_HLEN;
}
action_decap_data->conf.size = header -
action_decap_data->data;
@@ -8128,15 +8128,15 @@ parse_vc_action_mplsogre_encap(struct context *ctx, const struct token *token,
mplsogre_encap_conf.eth_dst, RTE_ETHER_ADDR_LEN);
memcpy(eth.hdr.src_addr.addr_bytes,
mplsogre_encap_conf.eth_src, RTE_ETHER_ADDR_LEN);
- memcpy(header, ð, sizeof(eth));
- header += sizeof(eth);
+ memcpy(header, ð.hdr, RTE_ETHER_HDR_LEN);
+ header += RTE_ETHER_HDR_LEN;
if (mplsogre_encap_conf.select_vlan) {
if (mplsogre_encap_conf.select_ipv4)
vlan.hdr.eth_proto = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4);
else
vlan.hdr.eth_proto = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV6);
- memcpy(header, &vlan, sizeof(vlan));
- header += sizeof(vlan);
+ memcpy(header, &vlan.hdr, RTE_VLAN_HLEN);
+ header += RTE_VLAN_HLEN;
}
if (mplsogre_encap_conf.select_ipv4) {
memcpy(header, &ipv4, sizeof(ipv4));
@@ -8223,15 +8223,15 @@ parse_vc_action_mplsogre_decap(struct context *ctx, const struct token *token,
mplsogre_encap_conf.eth_dst, RTE_ETHER_ADDR_LEN);
memcpy(eth.hdr.src_addr.addr_bytes,
mplsogre_encap_conf.eth_src, RTE_ETHER_ADDR_LEN);
- memcpy(header, ð, sizeof(eth));
- header += sizeof(eth);
+ memcpy(header, ð.hdr, RTE_ETHER_HDR_LEN);
+ header += RTE_ETHER_HDR_LEN;
if (mplsogre_encap_conf.select_vlan) {
if (mplsogre_encap_conf.select_ipv4)
vlan.hdr.eth_proto = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4);
else
vlan.hdr.eth_proto = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV6);
- memcpy(header, &vlan, sizeof(vlan));
- header += sizeof(vlan);
+ memcpy(header, &vlan.hdr, RTE_VLAN_HLEN);
+ header += RTE_VLAN_HLEN;
}
if (mplsogre_encap_conf.select_ipv4) {
memcpy(header, &ipv4, sizeof(ipv4));
@@ -8322,15 +8322,15 @@ parse_vc_action_mplsoudp_encap(struct context *ctx, const struct token *token,
mplsoudp_encap_conf.eth_dst, RTE_ETHER_ADDR_LEN);
memcpy(eth.hdr.src_addr.addr_bytes,
mplsoudp_encap_conf.eth_src, RTE_ETHER_ADDR_LEN);
- memcpy(header, ð, sizeof(eth));
- header += sizeof(eth);
+ memcpy(header, ð.hdr, RTE_ETHER_HDR_LEN);
+ header += RTE_ETHER_HDR_LEN;
if (mplsoudp_encap_conf.select_vlan) {
if (mplsoudp_encap_conf.select_ipv4)
vlan.hdr.eth_proto = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4);
else
vlan.hdr.eth_proto = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV6);
- memcpy(header, &vlan, sizeof(vlan));
- header += sizeof(vlan);
+ memcpy(header, &vlan.hdr, RTE_VLAN_HLEN);
+ header += RTE_VLAN_HLEN;
}
if (mplsoudp_encap_conf.select_ipv4) {
memcpy(header, &ipv4, sizeof(ipv4));
@@ -8419,15 +8419,15 @@ parse_vc_action_mplsoudp_decap(struct context *ctx, const struct token *token,
mplsoudp_encap_conf.eth_dst, RTE_ETHER_ADDR_LEN);
memcpy(eth.hdr.src_addr.addr_bytes,
mplsoudp_encap_conf.eth_src, RTE_ETHER_ADDR_LEN);
- memcpy(header, ð, sizeof(eth));
- header += sizeof(eth);
+ memcpy(header, ð.hdr, RTE_ETHER_HDR_LEN);
+ header += RTE_ETHER_HDR_LEN;
if (mplsoudp_encap_conf.select_vlan) {
if (mplsoudp_encap_conf.select_ipv4)
vlan.hdr.eth_proto = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4);
else
vlan.hdr.eth_proto = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV6);
- memcpy(header, &vlan, sizeof(vlan));
- header += sizeof(vlan);
+ memcpy(header, &vlan.hdr, RTE_VLAN_HLEN);
+ header += RTE_VLAN_HLEN;
}
if (mplsoudp_encap_conf.select_ipv4) {
memcpy(header, &ipv4, sizeof(ipv4));
--
2.25.1
next reply other threads:[~2023-03-16 17:17 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-16 17:16 Michael Baum [this message]
2023-03-16 17:26 ` Thomas Monjalon
2023-03-16 18:24 ` [PATCH v2] " Michael Baum
2023-03-23 10:34 ` Ori Kam
2023-03-23 11:09 ` Ferruh Yigit
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230316171654.1827514-1-michaelba@nvidia.com \
--to=michaelba@nvidia.com \
--cc=aman.deep.singh@intel.com \
--cc=dev@dpdk.org \
--cc=ferruh.yigit@amd.com \
--cc=orika@nvidia.com \
--cc=stable@dpdk.org \
--cc=thomas@monjalon.net \
--cc=yuying.zhang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).