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 calculated 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" and "rte_vlan_hdr" structures for header
size calculation.

Fixes: 3e77031be855 ("app/testpmd: add MPLSoGRE encapsulation")
Fixes: a1191d39cb57 ("app/testpmd: add MPLSoUDP encapsulation")
Cc: or...@nvidia.com
Cc: sta...@dpdk.org

Signed-off-by: Michael Baum <michae...@nvidia.com>
---

v2:
- Fix typo in commit log.
- Using "sizeof(struct rte_*_hdr)" instead of "*_LEN" macros.

 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 9309607f11..58939ec321 100644
--- a/app/test-pmd/cmdline_flow.c
+++ b/app/test-pmd/cmdline_flow.c
@@ -8245,15 +8245,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, &eth, sizeof(eth));
-       header += sizeof(eth);
+       memcpy(header, &eth.hdr, sizeof(struct rte_ether_hdr));
+       header += sizeof(struct rte_ether_hdr);
        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, sizeof(struct rte_vlan_hdr));
+               header += sizeof(struct rte_vlan_hdr);
        }
        action_encap_data->conf.size = header -
                action_encap_data->data;
@@ -8301,11 +8301,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, &eth, sizeof(eth));
-       header += sizeof(eth);
+       memcpy(header, &eth.hdr, sizeof(struct rte_ether_hdr));
+       header += sizeof(struct rte_ether_hdr);
        if (l2_decap_conf.select_vlan) {
-               memcpy(header, &vlan, sizeof(vlan));
-               header += sizeof(vlan);
+               memcpy(header, &vlan.hdr, sizeof(struct rte_vlan_hdr));
+               header += sizeof(struct rte_vlan_hdr);
        }
        action_decap_data->conf.size = header -
                action_decap_data->data;
@@ -8385,15 +8385,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, &eth, sizeof(eth));
-       header += sizeof(eth);
+       memcpy(header, &eth.hdr, sizeof(struct rte_ether_hdr));
+       header += sizeof(struct rte_ether_hdr);
        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, sizeof(struct rte_vlan_hdr));
+               header += sizeof(struct rte_vlan_hdr);
        }
        if (mplsogre_encap_conf.select_ipv4) {
                memcpy(header, &ipv4, sizeof(ipv4));
@@ -8480,15 +8480,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, &eth, sizeof(eth));
-       header += sizeof(eth);
+       memcpy(header, &eth.hdr, sizeof(struct rte_ether_hdr));
+       header += sizeof(struct rte_ether_hdr);
        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, sizeof(struct rte_vlan_hdr));
+               header += sizeof(struct rte_vlan_hdr);
        }
        if (mplsogre_encap_conf.select_ipv4) {
                memcpy(header, &ipv4, sizeof(ipv4));
@@ -8579,15 +8579,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, &eth, sizeof(eth));
-       header += sizeof(eth);
+       memcpy(header, &eth.hdr, sizeof(struct rte_ether_hdr));
+       header += sizeof(struct rte_ether_hdr);
        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, sizeof(struct rte_vlan_hdr));
+               header += sizeof(struct rte_vlan_hdr);
        }
        if (mplsoudp_encap_conf.select_ipv4) {
                memcpy(header, &ipv4, sizeof(ipv4));
@@ -8676,15 +8676,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, &eth, sizeof(eth));
-       header += sizeof(eth);
+       memcpy(header, &eth.hdr, sizeof(struct rte_ether_hdr));
+       header += sizeof(struct rte_ether_hdr);
        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, sizeof(struct rte_vlan_hdr));
+               header += sizeof(struct rte_vlan_hdr);
        }
        if (mplsoudp_encap_conf.select_ipv4) {
                memcpy(header, &ipv4, sizeof(ipv4));
-- 
2.25.1

Reply via email to