net/bnxt: support meta flow actions to overrule destinations
authorAndrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Wed, 13 Oct 2021 17:34:44 +0000 (20:34 +0300)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 13 Oct 2021 20:59:26 +0000 (22:59 +0200)
Add support for actions PORT_REPRESENTOR and REPRESENTED_PORT
based on the existing support for action PORT_ID.

Signed-off-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
doc/guides/nics/features/bnxt.ini
drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c
drivers/net/bnxt/tf_ulp/ulp_rte_parser.c
drivers/net/bnxt/tf_ulp/ulp_rte_parser.h

index c095649..c0e8ecb 100644 (file)
@@ -85,6 +85,8 @@ of_set_vlan_vid      = Y
 pf                   = Y
 phy_port             = Y
 port_id              = Y
+port_representor     = Y
+represented_port     = Y
 rss                  = Y
 sample               = Y
 set_ipv4_dst         = Y
index d28dd2e..e9337ec 100644 (file)
@@ -67,7 +67,7 @@ struct bnxt_ulp_rte_act_info ulp_act_info[] = {
        },
        [RTE_FLOW_ACTION_TYPE_PORT_ID] = {
        .act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
-       .proto_act_func          = ulp_rte_port_id_act_handler
+       .proto_act_func          = ulp_rte_port_act_handler
        },
        [RTE_FLOW_ACTION_TYPE_METER] = {
        .act_type                = BNXT_ULP_ACT_TYPE_NOT_SUPPORTED,
@@ -212,7 +212,15 @@ struct bnxt_ulp_rte_act_info ulp_act_info[] = {
        [RTE_FLOW_ACTION_TYPE_SAMPLE] = {
        .act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
        .proto_act_func          = ulp_rte_sample_act_handler
-       }
+       },
+       [RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR] = {
+       .act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
+       .proto_act_func          = ulp_rte_port_act_handler
+       },
+       [RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT] = {
+       .act_type                = BNXT_ULP_ACT_TYPE_SUPPORTED,
+       .proto_act_func          = ulp_rte_port_act_handler
+       },
 };
 
 struct bnxt_ulp_rte_act_info ulp_vendor_act_info[] = {
index efda522..40da953 100644 (file)
@@ -496,10 +496,11 @@ ulp_rte_parser_implicit_act_port_process(struct ulp_rte_parser_params *params)
                return BNXT_TF_RC_SUCCESS;
        }
        port_id.id = ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_INCOMING_IF);
+       action_item.type = RTE_FLOW_ACTION_TYPE_PORT_ID;
        action_item.conf = &port_id;
 
        /* Update the action port based on incoming port */
-       ulp_rte_port_id_act_handler(&action_item, params);
+       ulp_rte_port_act_handler(&action_item, params);
 
        /* Reset the action port set bit */
        ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_ACT_PORT_IS_SET, 0);
@@ -2163,7 +2164,8 @@ ulp_rte_count_act_handler(const struct rte_flow_action *action_item,
 /* Function to handle the parsing of action ports. */
 static int32_t
 ulp_rte_parser_act_port_set(struct ulp_rte_parser_params *param,
-                           uint32_t ifindex)
+                           uint32_t ifindex,
+                           enum bnxt_ulp_direction_type act_dir)
 {
        enum bnxt_ulp_direction_type dir;
        uint16_t pid_s;
@@ -2173,8 +2175,13 @@ ulp_rte_parser_act_port_set(struct ulp_rte_parser_params *param,
        uint32_t vnic_type;
 
        /* Get the direction */
-       dir = ULP_COMP_FLD_IDX_RD(param, BNXT_ULP_CF_IDX_DIRECTION);
-       if (dir == BNXT_ULP_DIR_EGRESS) {
+       /* If action implicitly specifies direction, use the specification. */
+       dir = (act_dir == BNXT_ULP_DIR_INVALID) ?
+               ULP_COMP_FLD_IDX_RD(param, BNXT_ULP_CF_IDX_DIRECTION) :
+               act_dir;
+       port_type = ULP_COMP_FLD_IDX_RD(param, BNXT_ULP_CF_IDX_ACT_PORT_TYPE);
+       if (dir == BNXT_ULP_DIR_EGRESS &&
+           port_type != BNXT_ULP_INTF_TYPE_VF_REP) {
                /* For egress direction, fill vport */
                if (ulp_port_db_vport_get(param->ulp_ctx, ifindex, &pid_s))
                        return BNXT_TF_RC_ERROR;
@@ -2185,9 +2192,17 @@ ulp_rte_parser_act_port_set(struct ulp_rte_parser_params *param,
                       &pid, BNXT_ULP_ACT_PROP_SZ_VPORT);
        } else {
                /* For ingress direction, fill vnic */
-               port_type = ULP_COMP_FLD_IDX_RD(param,
-                                               BNXT_ULP_CF_IDX_ACT_PORT_TYPE);
-               if (port_type == BNXT_ULP_INTF_TYPE_VF_REP)
+               /*
+                * Action               Destination
+                * ------------------------------------
+                * PORT_REPRESENTOR     Driver Function
+                * ------------------------------------
+                * REPRESENTED_PORT     VF
+                * ------------------------------------
+                * PORT_ID              VF
+                */
+               if (act_dir != BNXT_ULP_DIR_INGRESS &&
+                   port_type == BNXT_ULP_INTF_TYPE_VF_REP)
                        vnic_type = BNXT_ULP_VF_FUNC_VNIC;
                else
                        vnic_type = BNXT_ULP_DRV_FUNC_VNIC;
@@ -2234,7 +2249,8 @@ ulp_rte_pf_act_handler(const struct rte_flow_action *action_item __rte_unused,
        }
        /* Update the action properties */
        ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_ACT_PORT_TYPE, intf_type);
-       return ulp_rte_parser_act_port_set(params, ifindex);
+       return ulp_rte_parser_act_port_set(params, ifindex,
+                                          BNXT_ULP_DIR_INVALID);
 }
 
 /* Function to handle the parsing of RTE Flow action VF. */
@@ -2285,31 +2301,59 @@ ulp_rte_vf_act_handler(const struct rte_flow_action *action_item,
 
        /* Update the action properties */
        ULP_COMP_FLD_IDX_WR(params, BNXT_ULP_CF_IDX_ACT_PORT_TYPE, intf_type);
-       return ulp_rte_parser_act_port_set(params, ifindex);
+       return ulp_rte_parser_act_port_set(params, ifindex,
+                                          BNXT_ULP_DIR_INVALID);
 }
 
-/* Function to handle the parsing of RTE Flow action port_id. */
+/* Parse actions PORT_ID, PORT_REPRESENTOR and REPRESENTED_PORT. */
 int32_t
-ulp_rte_port_id_act_handler(const struct rte_flow_action *act_item,
-                           struct ulp_rte_parser_params *param)
+ulp_rte_port_act_handler(const struct rte_flow_action *act_item,
+                        struct ulp_rte_parser_params *param)
 {
-       const struct rte_flow_action_port_id *port_id = act_item->conf;
+       uint32_t ethdev_id;
        uint32_t ifindex;
        enum bnxt_ulp_intf_type intf_type;
+       enum bnxt_ulp_direction_type act_dir;
 
-       if (!port_id) {
+       if (!act_item->conf) {
                BNXT_TF_DBG(ERR,
                            "ParseErr: Invalid Argument\n");
                return BNXT_TF_RC_PARSE_ERR;
        }
-       if (port_id->original) {
-               BNXT_TF_DBG(ERR,
-                           "ParseErr:Portid Original not supported\n");
-               return BNXT_TF_RC_PARSE_ERR;
+       switch (act_item->type) {
+       case RTE_FLOW_ACTION_TYPE_PORT_ID: {
+               const struct rte_flow_action_port_id *port_id = act_item->conf;
+
+               if (port_id->original) {
+                       BNXT_TF_DBG(ERR,
+                                   "ParseErr:Portid Original not supported\n");
+                       return BNXT_TF_RC_PARSE_ERR;
+               }
+               ethdev_id = port_id->id;
+               act_dir = BNXT_ULP_DIR_INVALID;
+               break;
+       }
+       case RTE_FLOW_ACTION_TYPE_PORT_REPRESENTOR: {
+               const struct rte_flow_action_ethdev *ethdev = act_item->conf;
+
+               ethdev_id = ethdev->port_id;
+               act_dir = BNXT_ULP_DIR_INGRESS;
+               break;
+       }
+       case RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT: {
+               const struct rte_flow_action_ethdev *ethdev = act_item->conf;
+
+               ethdev_id = ethdev->port_id;
+               act_dir = BNXT_ULP_DIR_EGRESS;
+               break;
+       }
+       default:
+               BNXT_TF_DBG(ERR, "Unknown port action\n");
+               return BNXT_TF_RC_ERROR;
        }
 
        /* Get the port db ifindex */
-       if (ulp_port_db_dev_port_to_ulp_index(param->ulp_ctx, port_id->id,
+       if (ulp_port_db_dev_port_to_ulp_index(param->ulp_ctx, ethdev_id,
                                              &ifindex)) {
                BNXT_TF_DBG(ERR, "Invalid port id\n");
                return BNXT_TF_RC_ERROR;
@@ -2324,7 +2368,7 @@ ulp_rte_port_id_act_handler(const struct rte_flow_action *act_item,
 
        /* Set the action port */
        ULP_COMP_FLD_IDX_WR(param, BNXT_ULP_CF_IDX_ACT_PORT_TYPE, intf_type);
-       return ulp_rte_parser_act_port_set(param, ifindex);
+       return ulp_rte_parser_act_port_set(param, ifindex, act_dir);
 }
 
 /* Function to handle the parsing of RTE Flow action phy_port. */
index 0acb939..e4225d0 100644 (file)
@@ -204,10 +204,10 @@ int32_t
 ulp_rte_vf_act_handler(const struct rte_flow_action *action_item,
                       struct ulp_rte_parser_params *params);
 
-/* Function to handle the parsing of RTE Flow action port_id. */
+/* Parse actions PORT_ID, PORT_REPRESENTOR and REPRESENTED_PORT. */
 int32_t
-ulp_rte_port_id_act_handler(const struct rte_flow_action *act_item,
-                           struct ulp_rte_parser_params *params);
+ulp_rte_port_act_handler(const struct rte_flow_action *act_item,
+                        struct ulp_rte_parser_params *params);
 
 /* Function to handle the parsing of RTE Flow action phy_port. */
 int32_t