From: Adrien Mazarguil Date: Fri, 4 May 2018 15:17:44 +0000 (+0200) Subject: net/mlx4: fix UDP flow rule limitation enforcement X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=bf959ec58b5d9127f187e98de6d2d0976c111360;p=dpdk.git 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 --- diff --git a/drivers/net/mlx4/mlx4_flow.c b/drivers/net/mlx4/mlx4_flow.c index bebad074e1..3f754b4800 100644 --- a/drivers/net/mlx4/mlx4_flow.c +++ b/drivers/net/mlx4/mlx4_flow.c @@ -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; diff --git a/drivers/net/mlx4/mlx4_flow.h b/drivers/net/mlx4/mlx4_flow.h index 7b83d74b04..2c8dff3625 100644 --- a/drivers/net/mlx4/mlx4_flow.h +++ b/drivers/net/mlx4/mlx4_flow.h @@ -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. */ };