According to DPDK documentation, not specifying a
fate action in a flow rule results in undefined
behaviour. Define right behaviour in the driver.

Fixes: 0839236d0391 ("net/sfc: support flow action drop in transfer rules")
Cc: sta...@dpdk.org

Signed-off-by: Ivan Malov <ivan.ma...@arknetworks.am>
Reviewed-by: Viacheslav Galaktionov <viacheslav.galaktio...@arknetworks.am>
Reviewed-by: Andy Moreton <amore...@xilinx.com>
---
 drivers/net/sfc/sfc_mae.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c
index c254562696..3daeed81b9 100644
--- a/drivers/net/sfc/sfc_mae.c
+++ b/drivers/net/sfc/sfc_mae.c
@@ -3910,6 +3910,21 @@ sfc_mae_rule_parse_actions(struct sfc_adapter *sa,
                SFC_ASSERT(B_FALSE);
        }
 
+       /*
+        * A DPDK flow entry must specify a fate action, which the parser
+        * converts into a DELIVER action in a libefx action set. An
+        * attempt to replace the action in the action set should
+        * fail. If it succeeds then report an error, as the
+        * parsed flow entry did not contain a fate action.
+        */
+       rc = efx_mae_action_set_populate_drop(ctx.spec);
+       if (rc == 0) {
+               rc = rte_flow_error_set(error, EINVAL,
+                                       RTE_FLOW_ERROR_TYPE_ACTION, NULL,
+                                       "no fate action found");
+               goto fail_check_fate_action;
+       }
+
        spec_mae->action_set = sfc_mae_action_set_attach(sa, &ctx);
        if (spec_mae->action_set != NULL) {
                sfc_mae_mac_addr_del(sa, ctx.src_mac);
@@ -3926,6 +3941,7 @@ sfc_mae_rule_parse_actions(struct sfc_adapter *sa,
        return 0;
 
 fail_action_set_add:
+fail_check_fate_action:
 fail_workaround_tunnel_delivery:
 fail_nb_count:
        sfc_mae_encap_header_del(sa, ctx.encap_header);
-- 
2.17.1

Reply via email to