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