1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2018 Intel Corporation
10 #include <rte_mtr_driver.h>
12 #include "rte_eth_softnic_internals.h"
15 softnic_mtr_init(struct pmd_internals *p)
17 /* Initialize meter profiles list */
18 TAILQ_INIT(&p->mtr.meter_profiles);
24 softnic_mtr_free(struct pmd_internals *p)
26 /* Remove meter profiles */
28 struct softnic_mtr_meter_profile *mp;
30 mp = TAILQ_FIRST(&p->mtr.meter_profiles);
34 TAILQ_REMOVE(&p->mtr.meter_profiles, mp, node);
39 struct softnic_mtr_meter_profile *
40 softnic_mtr_meter_profile_find(struct pmd_internals *p,
41 uint32_t meter_profile_id)
43 struct softnic_mtr_meter_profile_list *mpl = &p->mtr.meter_profiles;
44 struct softnic_mtr_meter_profile *mp;
46 TAILQ_FOREACH(mp, mpl, node)
47 if (meter_profile_id == mp->meter_profile_id)
54 meter_profile_check(struct rte_eth_dev *dev,
55 uint32_t meter_profile_id,
56 struct rte_mtr_meter_profile *profile,
57 struct rte_mtr_error *error)
59 struct pmd_internals *p = dev->data->dev_private;
60 struct softnic_mtr_meter_profile *mp;
62 /* Meter profile ID must be valid. */
63 if (meter_profile_id == UINT32_MAX)
64 return -rte_mtr_error_set(error,
66 RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
68 "Meter profile id not valid");
70 /* Meter profile must not exist. */
71 mp = softnic_mtr_meter_profile_find(p, meter_profile_id);
73 return -rte_mtr_error_set(error,
75 RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
77 "Meter prfile already exists");
79 /* Profile must not be NULL. */
81 return -rte_mtr_error_set(error,
83 RTE_MTR_ERROR_TYPE_METER_PROFILE,
87 /* Traffic metering algorithm : TRTCM_RFC2698 */
88 if (profile->alg != RTE_MTR_TRTCM_RFC2698)
89 return -rte_mtr_error_set(error,
91 RTE_MTR_ERROR_TYPE_METER_PROFILE,
93 "Metering alg not supported");
98 /* MTR meter profile add */
100 pmd_mtr_meter_profile_add(struct rte_eth_dev *dev,
101 uint32_t meter_profile_id,
102 struct rte_mtr_meter_profile *profile,
103 struct rte_mtr_error *error)
105 struct pmd_internals *p = dev->data->dev_private;
106 struct softnic_mtr_meter_profile_list *mpl = &p->mtr.meter_profiles;
107 struct softnic_mtr_meter_profile *mp;
110 /* Check input params */
111 status = meter_profile_check(dev, meter_profile_id, profile, error);
115 /* Memory allocation */
116 mp = calloc(1, sizeof(struct softnic_mtr_meter_profile));
118 return -rte_mtr_error_set(error,
120 RTE_MTR_ERROR_TYPE_UNSPECIFIED,
122 "Memory alloc failed");
125 mp->meter_profile_id = meter_profile_id;
126 memcpy(&mp->params, profile, sizeof(mp->params));
129 TAILQ_INSERT_TAIL(mpl, mp, node);
134 const struct rte_mtr_ops pmd_mtr_ops = {
135 .capabilities_get = NULL,
137 .meter_profile_add = pmd_mtr_meter_profile_add,
138 .meter_profile_delete = NULL,
142 .meter_enable = NULL,
143 .meter_disable = NULL,
145 .meter_profile_update = NULL,
146 .meter_dscp_table_update = NULL,
147 .policer_actions_update = NULL,
148 .stats_update = NULL,