> -----Original Message-----
> From: dev <ovs-dev-boun...@openvswitch.org> On Behalf Of Eli Britstein
> Sent: Wednesday, June 23, 2021 4:53 PM
> To: d...@openvswitch.org; Ilya Maximets <i.maxim...@ovn.org>
> Cc: Eli Britstein <el...@nvidia.com>; Ivan Malov <ivan.ma...@oktetlabs.ru>; 
> Majd
> Dibbiny <m...@nvidia.com>
> Subject: [ovs-dev] [PATCH V7 13/13] netdev-dpdk-offload: Add vxlan pattern
> matching function.
> 
> For VXLAN offload, matches should be done on outer header for tunnel
> properties as well as inner packet matches. Add a function for parsing
> VXLAN tunnel matches.
> 
> Signed-off-by: Eli Britstein <el...@nvidia.com>
> Reviewed-by: Gaetan Rivet <gaet...@nvidia.com>
> Acked-by: Sriharsha Basavapatna <sriharsha.basavapa...@broadcom.com>
> Tested-by: Emma Finn <emma.f...@intel.com>
> Tested-by: Marko Kovacevic <marko.kovace...@intel.com>
> Signed-off-by: Ilya Maximets <i.maxim...@ovn.org>
> ---
>  NEWS                      |   2 +
>  lib/netdev-offload-dpdk.c | 155 +++++++++++++++++++++++++++++++++++++-
>  2 files changed, 156 insertions(+), 1 deletion(-)
> 
> diff --git a/NEWS b/NEWS
> index 6f8e62f7f..10b3ab053 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -19,6 +19,8 @@ Post-v2.15.0
>       * New debug appctl command 'dpdk/get-malloc-stats'.
>       * Add hardware offload support for tunnel pop action (experimental).
>         Available only if DPDK experimantal APIs enabled during the build.
> +     * Add hardware offload support for VXLAN flows (experimental).
> +       Available only if DPDK experimantal APIs enabled during the build.
>     - ovsdb-tool:
>       * New option '--election-timer' to the 'create-cluster' command to set 
> the
>         leader election timer during cluster creation.
> diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c
> index 6220394de..6bd5b6c9f 100644
> --- a/lib/netdev-offload-dpdk.c
> +++ b/lib/netdev-offload-dpdk.c
> @@ -372,6 +372,20 @@ dump_flow_pattern(struct ds *s,
>                                ipv6_mask->hdr.hop_limits);
>          }
>          ds_put_cstr(s, "/ ");
> +    } else if (item->type == RTE_FLOW_ITEM_TYPE_VXLAN) {
> +        const struct rte_flow_item_vxlan *vxlan_spec = item->spec;
> +        const struct rte_flow_item_vxlan *vxlan_mask = item->mask;
> +
> +        ds_put_cstr(s, "vxlan ");
> +        if (vxlan_spec) {
> +            if (!vxlan_mask) {
> +                vxlan_mask = &rte_flow_item_vxlan_mask;
> +            }
> +            DUMP_PATTERN_ITEM(vxlan_mask->vni, "vni", "%"PRIu32,
> +                              ntohl(*(ovs_be32 *) vxlan_spec->vni) >> 8,
> +                              ntohl(*(ovs_be32 *) vxlan_mask->vni) >> 8);
> +        }
> +        ds_put_cstr(s, "/ ");
>      } else {
>          ds_put_format(s, "unknown rte flow pattern (%d)\n", item->type);
>      }
> @@ -865,15 +879,154 @@ out:
>      return ret;
>  }

Hi All,

Is there a build failure in OVS master branch since this has been merged?
It seems the above casts (ovs_be32 *) are causing issues with increasing 
alignment?

>From DPDK's struct rte_flow_item_vxlan, the vni is a "uint8_t vni[3];"

The VNI is not a 32-bit value, so is not required to be aligned on 32-bits. The 
cast here
technically requires the alignment of the casted pointer to be 32-bit/4 byte, 
which is
not guaranteed to be true. I think the compiler rightly flags a cast alignment 
issue?

Casting through a (void *) might solve, or else using some of the BE/LE 
conversion
and alignment helpers in byte-order.h and unaligned.h could perhaps work?

My testing as follows below. Regards, -Harry


Configure:
./configure CFLAGS="-O3 -g -msse4.2 -mpopcnt -Wall -Wextra" --with-dpdk=static 
--enable-Werror

Compiler, from Ubuntu 21.04:
gcc (Ubuntu 10.3.0-1ubuntu1) 10.3.0

Build Failure:
lib/netdev-offload-dpdk.c: In function 'dump_flow_pattern':
lib/netdev-offload-dpdk.c:385:38: error: cast increases required alignment of 
target type [-Werror=cast-align]
  385 |                               ntohl(*(ovs_be32 *) vxlan_spec->vni) >> 8,
      |                                      ^
lib/netdev-offload-dpdk.c:189:48: note: in definition of macro 
'DUMP_PATTERN_ITEM'
  189 |         ds_put_format(s, field " is " fmt " ", spec_pri); \
      |                                                ^~~~~~~~
lib/netdev-offload-dpdk.c:385:38: error: cast increases required alignment of 
target type [-Werror=cast-align]
  385 |                               ntohl(*(ovs_be32 *) vxlan_spec->vni) >> 8,
      |                                      ^
lib/netdev-offload-dpdk.c:192:23: note: in definition of macro 
'DUMP_PATTERN_ITEM'
  192 |                       spec_pri, mask_pri); \
      |                       ^~~~~~~~
lib/netdev-offload-dpdk.c:386:38: error: cast increases required alignment of 
target type [-Werror=cast-align]
  386 |                               ntohl(*(ovs_be32 *) vxlan_mask->vni) >> 
8);
      |                                      ^
lib/netdev-offload-dpdk.c:192:33: note: in definition of macro 
'DUMP_PATTERN_ITEM'
  192 |                       spec_pri, mask_pri); \
      |                                 ^~~~~~~~
In file included from /usr/include/netinet/ip6.h:22,
                 from lib/netdev-offload-dpdk.c:20:
lib/netdev-offload-dpdk.c: In function 'dump_vxlan_encap':
lib/netdev-offload-dpdk.c:421:30: error: cast increases required alignment of 
target type [-Werror=cast-align]
  421 |                       ntohl(*(ovs_be32 *) vxlan->vni) >> 8);
      |                              ^
lib/netdev-offload-dpdk.c: In function 'dump_flow_action':
lib/netdev-offload-dpdk.c:572:30: error: cast increases required alignment of 
target type [-Werror=cast-align]
  572 |             ipv6_format_addr((struct in6_addr *) &set_ipv6->ipv6_addr, 
s);
      |                              ^
lib/netdev-offload-dpdk.c: In function 'parse_vxlan_match':
lib/netdev-offload-dpdk.c:1002:24: error: cast increases required alignment of 
target type [-Werror=cast-align]
 1002 |     put_unaligned_be32((ovs_be32 *) vx_spec->vni,
      |                        ^
lib/netdev-offload-dpdk.c:1004:24: error: cast increases required alignment of 
target type [-Werror=cast-align]
 1004 |     put_unaligned_be32((ovs_be32 *) vx_mask->vni,
      |                        ^
cc1: all warnings being treated as errors
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to