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 "ethdev_trace.h"
9 #include "rte_ethdev.h"
10 #include "rte_mtr_driver.h"
11 #include "rte_mtr.h"
12
13 /* Get generic traffic metering & policing operations structure from a port. */
14 const struct rte_mtr_ops *
rte_mtr_ops_get(uint16_t port_id,struct rte_mtr_error * error)15 rte_mtr_ops_get(uint16_t port_id, struct rte_mtr_error *error)
16 {
17 struct rte_eth_dev *dev = &rte_eth_devices[port_id];
18 const struct rte_mtr_ops *ops;
19
20 if (!rte_eth_dev_is_valid_port(port_id)) {
21 rte_mtr_error_set(error,
22 ENODEV,
23 RTE_MTR_ERROR_TYPE_UNSPECIFIED,
24 NULL,
25 rte_strerror(ENODEV));
26 return NULL;
27 }
28
29 if ((dev->dev_ops->mtr_ops_get == NULL) ||
30 (dev->dev_ops->mtr_ops_get(dev, &ops) != 0) ||
31 (ops == NULL)) {
32 rte_mtr_error_set(error,
33 ENOSYS,
34 RTE_MTR_ERROR_TYPE_UNSPECIFIED,
35 NULL,
36 rte_strerror(ENOSYS));
37 return NULL;
38 }
39
40 return ops;
41 }
42
43 #define RTE_MTR_FUNC(port_id, func) \
44 __extension__ ({ \
45 const struct rte_mtr_ops *ops = \
46 rte_mtr_ops_get(port_id, error); \
47 if (ops == NULL) \
48 return -rte_errno; \
49 \
50 if (ops->func == NULL) \
51 return -rte_mtr_error_set(error, \
52 ENOSYS, \
53 RTE_MTR_ERROR_TYPE_UNSPECIFIED, \
54 NULL, \
55 rte_strerror(ENOSYS)); \
56 \
57 ops->func; \
58 })
59
60 #define RTE_MTR_HNDL_FUNC(port_id, func) \
61 __extension__ ({ \
62 const struct rte_mtr_ops *ops = \
63 rte_mtr_ops_get(port_id, error); \
64 if (ops == NULL) \
65 return NULL; \
66 \
67 if (ops->func == NULL) { \
68 rte_mtr_error_set(error, \
69 ENOSYS, \
70 RTE_MTR_ERROR_TYPE_UNSPECIFIED, \
71 NULL, \
72 rte_strerror(ENOSYS)); \
73 return NULL; \
74 } \
75 \
76 ops->func; \
77 })
78
79 /* MTR capabilities get */
80 int
rte_mtr_capabilities_get(uint16_t port_id,struct rte_mtr_capabilities * cap,struct rte_mtr_error * error)81 rte_mtr_capabilities_get(uint16_t port_id,
82 struct rte_mtr_capabilities *cap,
83 struct rte_mtr_error *error)
84 {
85 struct rte_eth_dev *dev = &rte_eth_devices[port_id];
86 int ret;
87 ret = RTE_MTR_FUNC(port_id, capabilities_get)(dev,
88 cap, error);
89
90 rte_mtr_trace_capabilities_get(port_id, cap, ret);
91
92 return ret;
93 }
94
95 /* MTR meter profile add */
96 int
rte_mtr_meter_profile_add(uint16_t port_id,uint32_t meter_profile_id,struct rte_mtr_meter_profile * profile,struct rte_mtr_error * error)97 rte_mtr_meter_profile_add(uint16_t port_id,
98 uint32_t meter_profile_id,
99 struct rte_mtr_meter_profile *profile,
100 struct rte_mtr_error *error)
101 {
102 struct rte_eth_dev *dev = &rte_eth_devices[port_id];
103 int ret;
104 ret = RTE_MTR_FUNC(port_id, meter_profile_add)(dev,
105 meter_profile_id, profile, error);
106
107 rte_mtr_trace_meter_profile_add(port_id, meter_profile_id, profile,
108 ret);
109
110 return ret;
111 }
112
113 /** MTR meter profile delete */
114 int
rte_mtr_meter_profile_delete(uint16_t port_id,uint32_t meter_profile_id,struct rte_mtr_error * error)115 rte_mtr_meter_profile_delete(uint16_t port_id,
116 uint32_t meter_profile_id,
117 struct rte_mtr_error *error)
118 {
119 struct rte_eth_dev *dev = &rte_eth_devices[port_id];
120 int ret;
121 ret = RTE_MTR_FUNC(port_id, meter_profile_delete)(dev,
122 meter_profile_id, error);
123
124 rte_mtr_trace_meter_profile_delete(port_id, meter_profile_id, ret);
125
126 return ret;
127 }
128
129 /** MTR meter profile get */
130 struct rte_flow_meter_profile *
rte_mtr_meter_profile_get(uint16_t port_id,uint32_t meter_profile_id,struct rte_mtr_error * error)131 rte_mtr_meter_profile_get(uint16_t port_id,
132 uint32_t meter_profile_id,
133 struct rte_mtr_error *error)
134 {
135 struct rte_eth_dev *dev = &rte_eth_devices[port_id];
136 struct rte_flow_meter_profile *ret;
137 ret = RTE_MTR_HNDL_FUNC(port_id, meter_profile_get)(dev,
138 meter_profile_id, error);
139
140 rte_mtr_trace_meter_profile_get(port_id, meter_profile_id, ret);
141
142 return ret;
143 }
144
145 /* MTR meter policy validate */
146 int
rte_mtr_meter_policy_validate(uint16_t port_id,struct rte_mtr_meter_policy_params * policy,struct rte_mtr_error * error)147 rte_mtr_meter_policy_validate(uint16_t port_id,
148 struct rte_mtr_meter_policy_params *policy,
149 struct rte_mtr_error *error)
150 {
151 struct rte_eth_dev *dev = &rte_eth_devices[port_id];
152 int ret;
153 ret = RTE_MTR_FUNC(port_id, meter_policy_validate)(dev,
154 policy, error);
155
156 rte_mtr_trace_meter_policy_validate(port_id, policy, ret);
157
158 return ret;
159 }
160
161 /* MTR meter policy add */
162 int
rte_mtr_meter_policy_add(uint16_t port_id,uint32_t policy_id,struct rte_mtr_meter_policy_params * policy,struct rte_mtr_error * error)163 rte_mtr_meter_policy_add(uint16_t port_id,
164 uint32_t policy_id,
165 struct rte_mtr_meter_policy_params *policy,
166 struct rte_mtr_error *error)
167 {
168 struct rte_eth_dev *dev = &rte_eth_devices[port_id];
169 int ret;
170 ret = RTE_MTR_FUNC(port_id, meter_policy_add)(dev,
171 policy_id, policy, error);
172
173 rte_mtr_trace_meter_policy_add(port_id, policy_id, policy, ret);
174
175 return ret;
176 }
177
178 /** MTR meter policy delete */
179 int
rte_mtr_meter_policy_delete(uint16_t port_id,uint32_t policy_id,struct rte_mtr_error * error)180 rte_mtr_meter_policy_delete(uint16_t port_id,
181 uint32_t policy_id,
182 struct rte_mtr_error *error)
183 {
184 struct rte_eth_dev *dev = &rte_eth_devices[port_id];
185 int ret;
186 ret = RTE_MTR_FUNC(port_id, meter_policy_delete)(dev,
187 policy_id, error);
188
189 rte_mtr_trace_meter_policy_delete(port_id, policy_id, ret);
190
191 return ret;
192 }
193
194 /** MTR meter policy get */
195 struct rte_flow_meter_policy *
rte_mtr_meter_policy_get(uint16_t port_id,uint32_t policy_id,struct rte_mtr_error * error)196 rte_mtr_meter_policy_get(uint16_t port_id,
197 uint32_t policy_id,
198 struct rte_mtr_error *error)
199 {
200 struct rte_eth_dev *dev = &rte_eth_devices[port_id];
201 struct rte_flow_meter_policy *ret;
202 ret = RTE_MTR_HNDL_FUNC(port_id, meter_policy_get)(dev,
203 policy_id, error);
204
205 rte_mtr_trace_meter_policy_get(port_id, policy_id, ret);
206
207 return ret;
208 }
209
210 /** MTR object create */
211 int
rte_mtr_create(uint16_t port_id,uint32_t mtr_id,struct rte_mtr_params * params,int shared,struct rte_mtr_error * error)212 rte_mtr_create(uint16_t port_id,
213 uint32_t mtr_id,
214 struct rte_mtr_params *params,
215 int shared,
216 struct rte_mtr_error *error)
217 {
218 struct rte_eth_dev *dev = &rte_eth_devices[port_id];
219 int ret;
220 ret = RTE_MTR_FUNC(port_id, create)(dev,
221 mtr_id, params, shared, error);
222
223 rte_mtr_trace_create(port_id, mtr_id, params, shared, ret);
224
225 return ret;
226 }
227
228 /** MTR object destroy */
229 int
rte_mtr_destroy(uint16_t port_id,uint32_t mtr_id,struct rte_mtr_error * error)230 rte_mtr_destroy(uint16_t port_id,
231 uint32_t mtr_id,
232 struct rte_mtr_error *error)
233 {
234 struct rte_eth_dev *dev = &rte_eth_devices[port_id];
235 int ret;
236 ret = RTE_MTR_FUNC(port_id, destroy)(dev,
237 mtr_id, error);
238
239 rte_mtr_trace_destroy(port_id, mtr_id, ret);
240
241 return ret;
242 }
243
244 /** MTR object meter enable */
245 int
rte_mtr_meter_enable(uint16_t port_id,uint32_t mtr_id,struct rte_mtr_error * error)246 rte_mtr_meter_enable(uint16_t port_id,
247 uint32_t mtr_id,
248 struct rte_mtr_error *error)
249 {
250 struct rte_eth_dev *dev = &rte_eth_devices[port_id];
251 int ret;
252 ret = RTE_MTR_FUNC(port_id, meter_enable)(dev,
253 mtr_id, error);
254
255 rte_mtr_trace_meter_enable(port_id, mtr_id, ret);
256
257 return ret;
258 }
259
260 /** MTR object meter disable */
261 int
rte_mtr_meter_disable(uint16_t port_id,uint32_t mtr_id,struct rte_mtr_error * error)262 rte_mtr_meter_disable(uint16_t port_id,
263 uint32_t mtr_id,
264 struct rte_mtr_error *error)
265 {
266 struct rte_eth_dev *dev = &rte_eth_devices[port_id];
267 int ret;
268 ret = RTE_MTR_FUNC(port_id, meter_disable)(dev,
269 mtr_id, error);
270
271 rte_mtr_trace_meter_disable(port_id, mtr_id, ret);
272
273 return ret;
274 }
275
276 /** MTR object meter profile update */
277 int
rte_mtr_meter_profile_update(uint16_t port_id,uint32_t mtr_id,uint32_t meter_profile_id,struct rte_mtr_error * error)278 rte_mtr_meter_profile_update(uint16_t port_id,
279 uint32_t mtr_id,
280 uint32_t meter_profile_id,
281 struct rte_mtr_error *error)
282 {
283 struct rte_eth_dev *dev = &rte_eth_devices[port_id];
284 int ret;
285 ret = RTE_MTR_FUNC(port_id, meter_profile_update)(dev,
286 mtr_id, meter_profile_id, error);
287
288 rte_mtr_trace_meter_profile_update(port_id, mtr_id, meter_profile_id, ret);
289
290 return ret;
291 }
292
293 /** MTR object meter policy update */
294 int
rte_mtr_meter_policy_update(uint16_t port_id,uint32_t mtr_id,uint32_t meter_policy_id,struct rte_mtr_error * error)295 rte_mtr_meter_policy_update(uint16_t port_id,
296 uint32_t mtr_id,
297 uint32_t meter_policy_id,
298 struct rte_mtr_error *error)
299 {
300 struct rte_eth_dev *dev = &rte_eth_devices[port_id];
301 int ret;
302 ret = RTE_MTR_FUNC(port_id, meter_policy_update)(dev,
303 mtr_id, meter_policy_id, error);
304
305 rte_mtr_trace_meter_policy_update(port_id, mtr_id, meter_policy_id, ret);
306
307 return ret;
308 }
309
310 /** MTR object meter DSCP table update */
311 int
rte_mtr_meter_dscp_table_update(uint16_t port_id,uint32_t mtr_id,enum rte_mtr_color_in_protocol proto,enum rte_color * dscp_table,struct rte_mtr_error * error)312 rte_mtr_meter_dscp_table_update(uint16_t port_id,
313 uint32_t mtr_id, enum rte_mtr_color_in_protocol proto,
314 enum rte_color *dscp_table,
315 struct rte_mtr_error *error)
316 {
317 struct rte_eth_dev *dev = &rte_eth_devices[port_id];
318 int ret;
319 ret = RTE_MTR_FUNC(port_id, meter_dscp_table_update)(dev,
320 mtr_id, proto, dscp_table, error);
321
322 rte_mtr_trace_meter_dscp_table_update(port_id, mtr_id, dscp_table, ret);
323
324 return ret;
325 }
326
327 /** MTR object meter VLAN table update */
328 int
rte_mtr_meter_vlan_table_update(uint16_t port_id,uint32_t mtr_id,enum rte_mtr_color_in_protocol proto,enum rte_color * vlan_table,struct rte_mtr_error * error)329 rte_mtr_meter_vlan_table_update(uint16_t port_id,
330 uint32_t mtr_id, enum rte_mtr_color_in_protocol proto,
331 enum rte_color *vlan_table,
332 struct rte_mtr_error *error)
333 {
334 struct rte_eth_dev *dev = &rte_eth_devices[port_id];
335 int ret;
336 ret = RTE_MTR_FUNC(port_id, meter_vlan_table_update)(dev,
337 mtr_id, proto, vlan_table, error);
338
339 rte_mtr_trace_meter_vlan_table_update(port_id, mtr_id, vlan_table, ret);
340
341 return ret;
342 }
343
344 /** Set the input color protocol on MTR object */
345 int
rte_mtr_color_in_protocol_set(uint16_t port_id,uint32_t mtr_id,enum rte_mtr_color_in_protocol proto,uint32_t priority,struct rte_mtr_error * error)346 rte_mtr_color_in_protocol_set(uint16_t port_id,
347 uint32_t mtr_id,
348 enum rte_mtr_color_in_protocol proto,
349 uint32_t priority,
350 struct rte_mtr_error *error)
351 {
352 struct rte_eth_dev *dev = &rte_eth_devices[port_id];
353 int ret;
354 ret = RTE_MTR_FUNC(port_id, in_proto_set)(dev,
355 mtr_id, proto, priority, error);
356
357 rte_mtr_trace_color_in_protocol_set(port_id, mtr_id, proto, priority, ret);
358
359 return ret;
360 }
361
362 /** Get input color protocols of MTR object */
363 int
rte_mtr_color_in_protocol_get(uint16_t port_id,uint32_t mtr_id,uint64_t * proto_mask,struct rte_mtr_error * error)364 rte_mtr_color_in_protocol_get(uint16_t port_id,
365 uint32_t mtr_id,
366 uint64_t *proto_mask,
367 struct rte_mtr_error *error)
368 {
369 struct rte_eth_dev *dev = &rte_eth_devices[port_id];
370 int ret;
371 ret = RTE_MTR_FUNC(port_id, in_proto_get)(dev,
372 mtr_id, proto_mask, error);
373
374 rte_mtr_trace_color_in_protocol_get(port_id, mtr_id, ret);
375
376 return ret;
377 }
378
379 /** Get input color protocol priority of MTR object */
380 int
rte_mtr_color_in_protocol_priority_get(uint16_t port_id,uint32_t mtr_id,enum rte_mtr_color_in_protocol proto,uint32_t * priority,struct rte_mtr_error * error)381 rte_mtr_color_in_protocol_priority_get(uint16_t port_id,
382 uint32_t mtr_id,
383 enum rte_mtr_color_in_protocol proto,
384 uint32_t *priority,
385 struct rte_mtr_error *error)
386 {
387 struct rte_eth_dev *dev = &rte_eth_devices[port_id];
388 int ret;
389 ret = RTE_MTR_FUNC(port_id, in_proto_prio_get)(dev,
390 mtr_id, proto, priority, error);
391
392 rte_mtr_trace_color_in_protocol_priority_get(port_id, mtr_id, proto, ret);
393
394 return ret;
395 }
396
397 /** MTR object enabled stats update */
398 int
rte_mtr_stats_update(uint16_t port_id,uint32_t mtr_id,uint64_t stats_mask,struct rte_mtr_error * error)399 rte_mtr_stats_update(uint16_t port_id,
400 uint32_t mtr_id,
401 uint64_t stats_mask,
402 struct rte_mtr_error *error)
403 {
404 struct rte_eth_dev *dev = &rte_eth_devices[port_id];
405 int ret;
406 ret = RTE_MTR_FUNC(port_id, stats_update)(dev,
407 mtr_id, stats_mask, error);
408
409 rte_mtr_trace_stats_update(port_id, mtr_id, stats_mask, ret);
410
411 return ret;
412 }
413
414 /** MTR object stats read */
415 int
rte_mtr_stats_read(uint16_t port_id,uint32_t mtr_id,struct rte_mtr_stats * stats,uint64_t * stats_mask,int clear,struct rte_mtr_error * error)416 rte_mtr_stats_read(uint16_t port_id,
417 uint32_t mtr_id,
418 struct rte_mtr_stats *stats,
419 uint64_t *stats_mask,
420 int clear,
421 struct rte_mtr_error *error)
422 {
423 struct rte_eth_dev *dev = &rte_eth_devices[port_id];
424 int ret;
425 ret = RTE_MTR_FUNC(port_id, stats_read)(dev,
426 mtr_id, stats, stats_mask, clear, error);
427
428 rte_mtr_trace_stats_read(port_id, mtr_id, stats, *stats_mask, clear,
429 ret);
430
431 return ret;
432 }
433