From: Danylo Vodopianov <dvo-...@napatech.com> rte_flow_ops was extended with action update feature.
Signed-off-by: Danylo Vodopianov <dvo-...@napatech.com> --- drivers/net/ntnic/ntnic_filter/ntnic_filter.c | 66 +++++++++++++++++++ drivers/net/ntnic/ntnic_mod_reg.h | 10 +++ 2 files changed, 76 insertions(+) diff --git a/drivers/net/ntnic/ntnic_filter/ntnic_filter.c b/drivers/net/ntnic/ntnic_filter/ntnic_filter.c index 6d65ffd38f..8edaccb65c 100644 --- a/drivers/net/ntnic/ntnic_filter/ntnic_filter.c +++ b/drivers/net/ntnic/ntnic_filter/ntnic_filter.c @@ -9,6 +9,7 @@ #include "ntnic_mod_reg.h" #include "ntos_system.h" #include "ntos_drv.h" +#include "rte_flow.h" #define MAX_RTE_FLOWS 8192 @@ -703,6 +704,70 @@ static int eth_flow_flush(struct rte_eth_dev *eth_dev, struct rte_flow_error *er return res; } +static int eth_flow_actions_update(struct rte_eth_dev *eth_dev, + struct rte_flow *flow, + const struct rte_flow_action actions[], + struct rte_flow_error *error) +{ + const struct flow_filter_ops *flow_filter_ops = get_flow_filter_ops(); + + if (flow_filter_ops == NULL) { + NT_LOG(ERR, FILTER, "flow_filter module uninitialized"); + return -1; + } + + struct pmd_internals *internals = (struct pmd_internals *)eth_dev->data->dev_private; + + static struct rte_flow_error flow_error = { .type = RTE_FLOW_ERROR_TYPE_NONE, + .message = "none" }; + int res = -1; + + if (internals->flw_dev) { + struct pmd_internals *dev_private = + (struct pmd_internals *)eth_dev->data->dev_private; + struct fpga_info_s *fpga_info = &dev_private->p_drv->ntdrv.adapter_info.fpga_info; + struct cnv_action_s action = { 0 }; + + if (fpga_info->profile == FPGA_INFO_PROFILE_INLINE) { + uint32_t queue_offset = 0; + + if (dev_private->type == PORT_TYPE_OVERRIDE && + dev_private->vpq_nb_vq > 0) { + /* + * The queues coming from the main PMD will always start from 0 + * When the port is a the VF/vDPA port the queues must be changed + * to match the queues allocated for VF/vDPA. + */ + queue_offset = dev_private->vpq[0].id; + } + + if (create_action_elements_inline(&action, actions, MAX_ACTIONS, + queue_offset) != 0) { + rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION, NULL, + "Error in actions"); + return -1; + } + } + + if (is_flow_handle_typecast(flow)) { + res = flow_filter_ops->flow_actions_update(internals->flw_dev, + (void *)flow, + action.flow_actions, + &flow_error); + + } else { + res = flow_filter_ops->flow_actions_update(internals->flw_dev, + flow->flw_hdl, + action.flow_actions, + &flow_error); + } + } + + convert_error(error, &flow_error); + + return res; +} + static int eth_flow_dev_dump(struct rte_eth_dev *eth_dev, struct rte_flow *flow, FILE *file, @@ -941,6 +1006,7 @@ static const struct rte_flow_ops dev_flow_ops = { .create = eth_flow_create, .destroy = eth_flow_destroy, .flush = eth_flow_flush, + .actions_update = eth_flow_actions_update, .dev_dump = eth_flow_dev_dump, .get_aged_flows = eth_flow_get_aged_flows, .info_get = eth_flow_info_get, diff --git a/drivers/net/ntnic/ntnic_mod_reg.h b/drivers/net/ntnic/ntnic_mod_reg.h index 3fbbee6490..563e62ebce 100644 --- a/drivers/net/ntnic/ntnic_mod_reg.h +++ b/drivers/net/ntnic/ntnic_mod_reg.h @@ -292,6 +292,11 @@ struct profile_inline_ops { uint16_t caller_id, struct rte_flow_error *error); + int (*flow_actions_update_profile_inline)(struct flow_eth_dev *dev, + struct flow_handle *flow, + const struct rte_flow_action action[], + struct rte_flow_error *error); + int (*flow_dev_dump_profile_inline)(struct flow_eth_dev *dev, struct flow_handle *flow, uint16_t caller_id, @@ -401,6 +406,11 @@ struct flow_filter_ops { int (*flow_flush)(struct flow_eth_dev *dev, uint16_t caller_id, struct rte_flow_error *error); + int (*flow_actions_update)(struct flow_eth_dev *dev, + struct flow_handle *flow, + const struct rte_flow_action action[], + struct rte_flow_error *error); + int (*flow_get_flm_stats)(struct flow_nic_dev *ndev, uint64_t *data, uint64_t size); /* -- 2.45.0