[dpdk-dev,1/2] net/mlx4: fix UDP flow rule limitation enforcement
Checks
Commit Message
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 | 9 +++++++++
drivers/net/mlx4/mlx4_flow.h | 1 +
2 files changed, 10 insertions(+)
Comments
Friday, May 4, 2018 6:18 PM, Adrien Mazarguil:
> Subject: [PATCH 1/2] net/mlx4: fix UDP flow rule limitation enforcement
>
> 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>
> ---
Series applied to next-net-mlx, thanks.
@@ -357,6 +357,9 @@ mlx4_flow_merge_ipv4(struct rte_flow *flow,
* 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;
@@ -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. */
};