]> git.droids-corp.org - dpdk.git/commitdiff
net/mlx5: fix matching for UDP tunnels with Verbs
authorRaslan Darawsheh <rasland@mellanox.com>
Wed, 6 May 2020 06:57:56 +0000 (09:57 +0300)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 11 May 2020 20:27:39 +0000 (22:27 +0200)
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>
drivers/net/mlx5/mlx5_flow_verbs.c

index 4659f0a7f7c834f75403bcffa6711933fcaf993b..c403f72be3d431f5e2f8cec4e556a7f7f09a0881 100644 (file)
@@ -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);
 }