net/mlx4: fix UDP flow rule limitation enforcement
authorAdrien Mazarguil <adrien.mazarguil@6wind.com>
Fri, 4 May 2018 15:17:44 +0000 (17:17 +0200)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 14 May 2018 21:31:48 +0000 (22:31 +0100)
For some unknown reason, priorities do not have any effect on flow rules
that happen to match UDP destination ports. Those are always matched first
regardless.

This patch is a workaround that enforces this limitation at the PMD level;
such flow rules can only be created at the highest priority level for
correctness.

Fixes: a5171594fc3b ("net/mlx4: expose support for flow rule priorities")
Cc: stable@dpdk.org
Signed-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
drivers/net/mlx4/mlx4_flow.c
drivers/net/mlx4/mlx4_flow.h

index bebad07..3f754b4 100644 (file)
@@ -357,6 +357,9 @@ error:
  * Additional mlx4-specific constraints on supported fields:
  *
  * - No support for partial masks.
+ * - Due to HW/FW limitation, flow rule priority is not taken into account
+ *   when matching UDP destination ports, doing is therefore only supported
+ *   at the highest priority level (0).
  *
  * @param[in, out] flow
  *   Flow rule handle to update.
@@ -388,6 +391,11 @@ mlx4_flow_merge_udp(struct rte_flow *flow,
                msg = "mlx4 does not support matching partial UDP fields";
                goto error;
        }
+       if (mask && mask->hdr.dst_port && flow->priority) {
+               msg = "combining UDP destination port matching with a nonzero"
+                       " priority level is not supported";
+               goto error;
+       }
        if (!flow->ibv_attr)
                return 0;
        ++flow->ibv_attr->num_of_specs;
@@ -658,6 +666,7 @@ mlx4_flow_prepare(struct priv *priv,
 fill:
        overlap = 0;
        proc = mlx4_flow_proc_item_list;
+       flow->priority = attr->priority;
        /* Go over pattern. */
        for (item = pattern; item->type; ++item) {
                const struct mlx4_flow_proc_item *next = NULL;
index 7b83d74..2c8dff3 100644 (file)
@@ -42,6 +42,7 @@ struct rte_flow {
        uint32_t promisc:1; /**< This rule matches everything. */
        uint32_t allmulti:1; /**< This rule matches all multicast traffic. */
        uint32_t drop:1; /**< This rule drops packets. */
+       uint32_t priority; /**< Flow rule priority. */
        struct mlx4_rss *rss; /**< Rx target. */
 };