xref: /dpdk/lib/ethdev/rte_mtr.c (revision 7af3e7aaf9141e78858a38c0d6e32b46a196c08f)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2017 Intel Corporation
3  */
4 
5 #include <stdint.h>
6 
7 #include <rte_errno.h>
8 #include "rte_ethdev.h"
9 #include "rte_mtr_driver.h"
10 #include "rte_mtr.h"
11 
12 /* Get generic traffic metering & policing operations structure from a port. */
13 const struct rte_mtr_ops *
14 rte_mtr_ops_get(uint16_t port_id, struct rte_mtr_error *error)
15 {
16 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
17 	const struct rte_mtr_ops *ops;
18 
19 	if (!rte_eth_dev_is_valid_port(port_id)) {
20 		rte_mtr_error_set(error,
21 			ENODEV,
22 			RTE_MTR_ERROR_TYPE_UNSPECIFIED,
23 			NULL,
24 			rte_strerror(ENODEV));
25 		return NULL;
26 	}
27 
28 	if ((dev->dev_ops->mtr_ops_get == NULL) ||
29 		(dev->dev_ops->mtr_ops_get(dev, &ops) != 0) ||
30 		(ops == NULL)) {
31 		rte_mtr_error_set(error,
32 			ENOSYS,
33 			RTE_MTR_ERROR_TYPE_UNSPECIFIED,
34 			NULL,
35 			rte_strerror(ENOSYS));
36 		return NULL;
37 	}
38 
39 	return ops;
40 }
41 
42 #define RTE_MTR_FUNC(port_id, func)			\
43 ({							\
44 	const struct rte_mtr_ops *ops =			\
45 		rte_mtr_ops_get(port_id, error);		\
46 	if (ops == NULL)					\
47 		return -rte_errno;			\
48 							\
49 	if (ops->func == NULL)				\
50 		return -rte_mtr_error_set(error,		\
51 			ENOSYS,				\
52 			RTE_MTR_ERROR_TYPE_UNSPECIFIED,	\
53 			NULL,				\
54 			rte_strerror(ENOSYS));		\
55 							\
56 	ops->func;					\
57 })
58 
59 /* MTR capabilities get */
60 int
61 rte_mtr_capabilities_get(uint16_t port_id,
62 	struct rte_mtr_capabilities *cap,
63 	struct rte_mtr_error *error)
64 {
65 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
66 	return RTE_MTR_FUNC(port_id, capabilities_get)(dev,
67 		cap, error);
68 }
69 
70 /* MTR meter profile add */
71 int
72 rte_mtr_meter_profile_add(uint16_t port_id,
73 	uint32_t meter_profile_id,
74 	struct rte_mtr_meter_profile *profile,
75 	struct rte_mtr_error *error)
76 {
77 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
78 	return RTE_MTR_FUNC(port_id, meter_profile_add)(dev,
79 		meter_profile_id, profile, error);
80 }
81 
82 /** MTR meter profile delete */
83 int
84 rte_mtr_meter_profile_delete(uint16_t port_id,
85 	uint32_t meter_profile_id,
86 	struct rte_mtr_error *error)
87 {
88 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
89 	return RTE_MTR_FUNC(port_id, meter_profile_delete)(dev,
90 		meter_profile_id, error);
91 }
92 
93 /* MTR meter policy validate */
94 int
95 rte_mtr_meter_policy_validate(uint16_t port_id,
96 	struct rte_mtr_meter_policy_params *policy,
97 	struct rte_mtr_error *error)
98 {
99 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
100 	return RTE_MTR_FUNC(port_id, meter_policy_validate)(dev,
101 		policy, error);
102 }
103 
104 /* MTR meter policy add */
105 int
106 rte_mtr_meter_policy_add(uint16_t port_id,
107 	uint32_t policy_id,
108 	struct rte_mtr_meter_policy_params *policy,
109 	struct rte_mtr_error *error)
110 {
111 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
112 	return RTE_MTR_FUNC(port_id, meter_policy_add)(dev,
113 		policy_id, policy, error);
114 }
115 
116 /** MTR meter policy delete */
117 int
118 rte_mtr_meter_policy_delete(uint16_t port_id,
119 	uint32_t policy_id,
120 	struct rte_mtr_error *error)
121 {
122 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
123 	return RTE_MTR_FUNC(port_id, meter_policy_delete)(dev,
124 		policy_id, error);
125 }
126 
127 /** MTR object create */
128 int
129 rte_mtr_create(uint16_t port_id,
130 	uint32_t mtr_id,
131 	struct rte_mtr_params *params,
132 	int shared,
133 	struct rte_mtr_error *error)
134 {
135 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
136 	return RTE_MTR_FUNC(port_id, create)(dev,
137 		mtr_id, params, shared, error);
138 }
139 
140 /** MTR object destroy */
141 int
142 rte_mtr_destroy(uint16_t port_id,
143 	uint32_t mtr_id,
144 	struct rte_mtr_error *error)
145 {
146 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
147 	return RTE_MTR_FUNC(port_id, destroy)(dev,
148 		mtr_id, error);
149 }
150 
151 /** MTR object meter enable */
152 int
153 rte_mtr_meter_enable(uint16_t port_id,
154 	uint32_t mtr_id,
155 	struct rte_mtr_error *error)
156 {
157 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
158 	return RTE_MTR_FUNC(port_id, meter_enable)(dev,
159 		mtr_id, error);
160 }
161 
162 /** MTR object meter disable */
163 int
164 rte_mtr_meter_disable(uint16_t port_id,
165 	uint32_t mtr_id,
166 	struct rte_mtr_error *error)
167 {
168 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
169 	return RTE_MTR_FUNC(port_id, meter_disable)(dev,
170 		mtr_id, error);
171 }
172 
173 /** MTR object meter profile update */
174 int
175 rte_mtr_meter_profile_update(uint16_t port_id,
176 	uint32_t mtr_id,
177 	uint32_t meter_profile_id,
178 	struct rte_mtr_error *error)
179 {
180 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
181 	return RTE_MTR_FUNC(port_id, meter_profile_update)(dev,
182 		mtr_id, meter_profile_id, error);
183 }
184 
185 /** MTR object meter policy update */
186 int
187 rte_mtr_meter_policy_update(uint16_t port_id,
188 	uint32_t mtr_id,
189 	uint32_t meter_policy_id,
190 	struct rte_mtr_error *error)
191 {
192 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
193 	return RTE_MTR_FUNC(port_id, meter_policy_update)(dev,
194 		mtr_id, meter_policy_id, error);
195 }
196 
197 /** MTR object meter DSCP table update */
198 int
199 rte_mtr_meter_dscp_table_update(uint16_t port_id,
200 	uint32_t mtr_id,
201 	enum rte_color *dscp_table,
202 	struct rte_mtr_error *error)
203 {
204 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
205 	return RTE_MTR_FUNC(port_id, meter_dscp_table_update)(dev,
206 		mtr_id, dscp_table, error);
207 }
208 
209 /** MTR object meter VLAN table update */
210 int
211 rte_mtr_meter_vlan_table_update(uint16_t port_id,
212 	uint32_t mtr_id,
213 	enum rte_color *vlan_table,
214 	struct rte_mtr_error *error)
215 {
216 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
217 	return RTE_MTR_FUNC(port_id, meter_vlan_table_update)(dev,
218 		mtr_id, vlan_table, error);
219 }
220 
221 /** Set the input color protocol on MTR object */
222 int
223 rte_mtr_color_in_protocol_set(uint16_t port_id,
224 	uint32_t mtr_id,
225 	enum rte_mtr_color_in_protocol proto,
226 	uint32_t priority,
227 	struct rte_mtr_error *error)
228 {
229 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
230 	return RTE_MTR_FUNC(port_id, in_proto_set)(dev,
231 		mtr_id, proto, priority, error);
232 }
233 
234 /** Get input color protocols of MTR object */
235 int
236 rte_mtr_color_in_protocol_get(uint16_t port_id,
237 	uint32_t mtr_id,
238 	uint64_t *proto_mask,
239 	struct rte_mtr_error *error)
240 {
241 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
242 	return RTE_MTR_FUNC(port_id, in_proto_get)(dev,
243 		mtr_id, proto_mask, error);
244 }
245 
246 /** Get input color protocol priority of MTR object */
247 int
248 rte_mtr_color_in_protocol_priority_get(uint16_t port_id,
249 	uint32_t mtr_id,
250 	enum rte_mtr_color_in_protocol proto,
251 	uint32_t *priority,
252 	struct rte_mtr_error *error)
253 {
254 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
255 	return RTE_MTR_FUNC(port_id, in_proto_prio_get)(dev,
256 		mtr_id, proto, priority, error);
257 }
258 
259 /** MTR object enabled stats update */
260 int
261 rte_mtr_stats_update(uint16_t port_id,
262 	uint32_t mtr_id,
263 	uint64_t stats_mask,
264 	struct rte_mtr_error *error)
265 {
266 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
267 	return RTE_MTR_FUNC(port_id, stats_update)(dev,
268 		mtr_id, stats_mask, error);
269 }
270 
271 /** MTR object stats read */
272 int
273 rte_mtr_stats_read(uint16_t port_id,
274 	uint32_t mtr_id,
275 	struct rte_mtr_stats *stats,
276 	uint64_t *stats_mask,
277 	int clear,
278 	struct rte_mtr_error *error)
279 {
280 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
281 	return RTE_MTR_FUNC(port_id, stats_read)(dev,
282 		mtr_id, stats, stats_mask, clear, error);
283 }
284