[v4] net/mlx5: fix matching for UDP tunnels with verbs
Checks
Commit Message
When creating flow rule with zero specs it will cause
matching all UDP packets like following:
eth / ipv4 / udp / vxlan / end
Such rule will match all udp packets.
This change the behavior to match the dv flow engine
which will automatically set the match on relative
outer UDP port if the user didn't specify any.
Fixes: 84c406e74524 ("net/mlx5: add flow translate function")
Cc: stable@dpdk.org
Signed-off-by: Raslan Darawsheh <rasland@mellanox.com>
Acked-by: Matan Azrad <matan@mellanox.com>
---
v2: fixed checkpatch issues
v3: handled ITEM_VOID after udp item.
v4: removed extra unnecessary check for NULL
---
drivers/net/mlx5/mlx5_flow_verbs.c | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
Comments
Hi,
> -----Original Message-----
> From: Raslan Darawsheh <rasland@mellanox.com>
> Sent: Wednesday, May 6, 2020 9:58 AM
> To: Slava Ovsiienko <viacheslavo@mellanox.com>; Matan Azrad
> <matan@mellanox.com>
> Cc: dev@dpdk.org; Ori Kam <orika@mellanox.com>; stable@dpdk.org
> Subject: [PATCH v4] net/mlx5: fix matching for UDP tunnels with verbs
>
> When creating flow rule with zero specs it will cause
> matching all UDP packets like following:
> eth / ipv4 / udp / vxlan / end
> Such rule will match all udp packets.
>
> This change the behavior to match the dv flow engine
> which will automatically set the match on relative
> outer UDP port if the user didn't specify any.
>
> Fixes: 84c406e74524 ("net/mlx5: add flow translate function")
> Cc: stable@dpdk.org
>
> Signed-off-by: Raslan Darawsheh <rasland@mellanox.com>
> Acked-by: Matan Azrad <matan@mellanox.com>
> ---
> v2: fixed checkpatch issues
> v3: handled ITEM_VOID after udp item.
> v4: removed extra unnecessary check for NULL
> ---
>
> drivers/net/mlx5/mlx5_flow_verbs.c | 22 ++++++++++++++++++++++
> 1 file changed, 22 insertions(+)
>
> diff --git a/drivers/net/mlx5/mlx5_flow_verbs.c
> b/drivers/net/mlx5/mlx5_flow_verbs.c
> index 7efd97f54..24d4a7203 100644
> --- a/drivers/net/mlx5/mlx5_flow_verbs.c
> +++ b/drivers/net/mlx5/mlx5_flow_verbs.c
> @@ -680,6 +680,28 @@ flow_verbs_translate_item_udp(struct mlx5_flow
> *dev_flow,
> udp.val.src_port &= udp.mask.src_port;
> udp.val.dst_port &= udp.mask.dst_port;
> }
> + item++;
> + while (item->type == RTE_FLOW_ITEM_TYPE_VOID)
> + item++;
> + if (!(udp.val.dst_port & udp.mask.dst_port)) {
> + switch ((item)->type) {
> + case RTE_FLOW_ITEM_TYPE_VXLAN:
> + udp.val.dst_port = htons(MLX5_UDP_PORT_VXLAN);
> + udp.mask.dst_port = 0xffff;
> + break;
> + case RTE_FLOW_ITEM_TYPE_VXLAN_GPE:
> + udp.val.dst_port =
> htons(MLX5_UDP_PORT_VXLAN_GPE);
> + udp.mask.dst_port = 0xffff;
> + break;
> + case RTE_FLOW_ITEM_TYPE_MPLS:
> + udp.val.dst_port = htons(MLX5_UDP_PORT_MPLS);
> + udp.mask.dst_port = 0xffff;
> + break;
> + default:
> + break;
> + }
> + }
> +
> flow_verbs_spec_add(&dev_flow->verbs, &udp, size);
> }
>
> --
> 2.26.0
Patch applied to next-net-mlx,
Kindest regards,
Raslan Darawsheh
@@ -680,6 +680,28 @@ flow_verbs_translate_item_udp(struct mlx5_flow *dev_flow,
udp.val.src_port &= udp.mask.src_port;
udp.val.dst_port &= udp.mask.dst_port;
}
+ item++;
+ while (item->type == RTE_FLOW_ITEM_TYPE_VOID)
+ item++;
+ if (!(udp.val.dst_port & udp.mask.dst_port)) {
+ switch ((item)->type) {
+ case RTE_FLOW_ITEM_TYPE_VXLAN:
+ udp.val.dst_port = htons(MLX5_UDP_PORT_VXLAN);
+ udp.mask.dst_port = 0xffff;
+ break;
+ case RTE_FLOW_ITEM_TYPE_VXLAN_GPE:
+ udp.val.dst_port = htons(MLX5_UDP_PORT_VXLAN_GPE);
+ udp.mask.dst_port = 0xffff;
+ break;
+ case RTE_FLOW_ITEM_TYPE_MPLS:
+ udp.val.dst_port = htons(MLX5_UDP_PORT_MPLS);
+ udp.mask.dst_port = 0xffff;
+ break;
+ default:
+ break;
+ }
+ }
+
flow_verbs_spec_add(&dev_flow->verbs, &udp, size);
}