| 3956 | } |
| 3957 | |
| 3958 | static struct rte_flow * |
| 3959 | nfp_flow_create(struct rte_eth_dev *dev, |
| 3960 | const struct rte_flow_attr *attr, |
| 3961 | const struct rte_flow_item items[], |
| 3962 | const struct rte_flow_action actions[], |
| 3963 | struct rte_flow_error *error) |
| 3964 | { |
| 3965 | int ret; |
| 3966 | struct rte_flow *nfp_flow; |
| 3967 | struct nfp_flow_priv *priv; |
| 3968 | struct nfp_app_fw_flower *app_fw_flower; |
| 3969 | struct nfp_flower_representor *representor; |
| 3970 | |
| 3971 | representor = dev->data->dev_private; |
| 3972 | app_fw_flower = representor->app_fw_flower; |
| 3973 | priv = app_fw_flower->flow_priv; |
| 3974 | |
| 3975 | nfp_flow = nfp_flow_setup(representor, attr, items, actions, error, false); |
| 3976 | if (nfp_flow == NULL) { |
| 3977 | rte_flow_error_set(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, |
| 3978 | NULL, "This flow can not be offloaded."); |
| 3979 | return NULL; |
| 3980 | } |
| 3981 | |
| 3982 | /* Add the flow to hardware */ |
| 3983 | if (nfp_flow->install_flag) { |
| 3984 | ret = nfp_flower_cmsg_flow_add(app_fw_flower, nfp_flow); |
| 3985 | if (ret != 0) { |
| 3986 | rte_flow_error_set(error, EINVAL, |
| 3987 | RTE_FLOW_ERROR_TYPE_UNSPECIFIED, |
| 3988 | NULL, "Add flow to firmware failed."); |
| 3989 | goto flow_teardown; |
| 3990 | } |
| 3991 | } |
| 3992 | |
| 3993 | /* Add the flow to flow hash table */ |
| 3994 | ret = nfp_flow_table_add_merge(priv, nfp_flow); |
| 3995 | if (ret != 0) { |
| 3996 | rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, |
| 3997 | NULL, "Add flow to the flow table failed."); |
| 3998 | goto flow_teardown; |
| 3999 | } |
| 4000 | |
| 4001 | /* Update meter object ref count */ |
| 4002 | if (nfp_flow->mtr_id != NFP_MAX_MTR_CNT) { |
| 4003 | ret = nfp_mtr_update_ref_cnt(app_fw_flower->mtr_priv, |
| 4004 | nfp_flow->mtr_id, true); |
| 4005 | if (ret != 0) { |
| 4006 | rte_flow_error_set(error, EINVAL, |
| 4007 | RTE_FLOW_ERROR_TYPE_UNSPECIFIED, |
| 4008 | NULL, "Update meter ref_cnt failed."); |
| 4009 | goto flow_teardown; |
| 4010 | } |
| 4011 | } |
| 4012 | |
| 4013 | return nfp_flow; |
| 4014 | |
| 4015 | flow_teardown: |
nothing calls this directly
no test coverage detected