net/octeontx2: support port representor flow action
authorAndrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Wed, 13 Oct 2021 17:34:47 +0000 (20:34 +0300)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 13 Oct 2021 20:59:26 +0000 (22:59 +0200)
Action PORT_ID implementation assumes ingress only. Its semantics
suggests that support for equal action PORT_REPRESENTOR be added.

Signed-off-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
doc/guides/nics/features/octeontx2.ini
doc/guides/nics/octeontx2.rst
drivers/net/octeontx2/otx2_flow_parse.c

index fa32bc7..e027798 100644 (file)
@@ -91,6 +91,7 @@ of_set_vlan_pcp      = Y
 of_set_vlan_vid      = Y
 pf                   = Y
 port_id              = Y
+port_representor     = Y
 queue                = Y
 rss                  = Y
 security             = Y
index e35c811..eae32f0 100644 (file)
@@ -403,10 +403,13 @@ Actions:
    +----+-----------------------------------------+
    | 12 | RTE_FLOW_ACTION_TYPE_PORT_ID            |
    +----+-----------------------------------------+
+   | 13 | RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR   |
+   +----+-----------------------------------------+
 
 .. note::
 
-   ``RTE_FLOW_ACTION_TYPE_PORT_ID`` is only supported between PF and its VFs.
+   ``RTE_FLOW_ACTION_TYPE_PORT_ID``, ``RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR``
+   are only supported between PF and its VFs.
 
 .. _table_octeontx2_supported_egress_action_types:
 
index 30a232f..79b92fd 100644 (file)
@@ -900,7 +900,6 @@ otx2_flow_parse_actions(struct rte_eth_dev *dev,
 {
        struct otx2_eth_dev *hw = dev->data->dev_private;
        struct otx2_npc_flow_info *npc = &hw->npc_flow;
-       const struct rte_flow_action_port_id *port_act;
        const struct rte_flow_action_mark *act_mark;
        const struct rte_flow_action_queue *act_q;
        const struct rte_flow_action_vf *vf_act;
@@ -977,9 +976,18 @@ otx2_flow_parse_actions(struct rte_eth_dev *dev,
                        break;
 
                case RTE_FLOW_ACTION_TYPE_PORT_ID:
-                       port_act = (const struct rte_flow_action_port_id *)
-                               actions->conf;
-                       port_id = port_act->id;
+               case RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR:
+                       if (actions->type == RTE_FLOW_ACTION_TYPE_PORT_ID) {
+                               const struct rte_flow_action_port_id *port_act;
+
+                               port_act = actions->conf;
+                               port_id = port_act->id;
+                       } else {
+                               const struct rte_flow_action_ethdev *ethdev_act;
+
+                               ethdev_act = actions->conf;
+                               port_id = ethdev_act->port_id;
+                       }
                        if (rte_eth_dev_get_name_by_port(port_id, if_name)) {
                                errmsg = "Name not found for output port id";
                                errcode = EINVAL;