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 <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 *
15 : 0 : rte_mtr_ops_get(uint16_t port_id, struct rte_mtr_error *error)
16 : : {
17 : 0 : struct rte_eth_dev *dev = &rte_eth_devices[port_id];
18 : : const struct rte_mtr_ops *ops;
19 : :
20 [ # # ]: 0 : if (!rte_eth_dev_is_valid_port(port_id)) {
21 : 0 : rte_mtr_error_set(error,
22 : : ENODEV,
23 : : RTE_MTR_ERROR_TYPE_UNSPECIFIED,
24 : : NULL,
25 : : rte_strerror(ENODEV));
26 : 0 : return NULL;
27 : : }
28 : :
29 [ # # # # ]: 0 : if ((dev->dev_ops->mtr_ops_get == NULL) ||
30 : 0 : (dev->dev_ops->mtr_ops_get(dev, &ops) != 0) ||
31 [ # # ]: 0 : (ops == NULL)) {
32 : 0 : rte_mtr_error_set(error,
33 : : ENOSYS,
34 : : RTE_MTR_ERROR_TYPE_UNSPECIFIED,
35 : : NULL,
36 : : rte_strerror(ENOSYS));
37 : 0 : 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
81 : 0 : rte_mtr_capabilities_get(uint16_t port_id,
82 : : struct rte_mtr_capabilities *cap,
83 : : struct rte_mtr_error *error)
84 : : {
85 : 0 : struct rte_eth_dev *dev = &rte_eth_devices[port_id];
86 : : int ret;
87 [ # # # # ]: 0 : ret = RTE_MTR_FUNC(port_id, capabilities_get)(dev,
88 : : cap, error);
89 : :
90 : 0 : rte_mtr_trace_capabilities_get(port_id, cap, ret);
91 : :
92 : 0 : return ret;
93 : : }
94 : :
95 : : /* MTR meter profile add */
96 : : int
97 : 0 : 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 : 0 : struct rte_eth_dev *dev = &rte_eth_devices[port_id];
103 : : int ret;
104 [ # # # # ]: 0 : ret = RTE_MTR_FUNC(port_id, meter_profile_add)(dev,
105 : : meter_profile_id, profile, error);
106 : :
107 : 0 : rte_mtr_trace_meter_profile_add(port_id, meter_profile_id, profile,
108 : : ret);
109 : :
110 : 0 : return ret;
111 : : }
112 : :
113 : : /** MTR meter profile delete */
114 : : int
115 : 0 : rte_mtr_meter_profile_delete(uint16_t port_id,
116 : : uint32_t meter_profile_id,
117 : : struct rte_mtr_error *error)
118 : : {
119 : 0 : struct rte_eth_dev *dev = &rte_eth_devices[port_id];
120 : : int ret;
121 [ # # # # ]: 0 : ret = RTE_MTR_FUNC(port_id, meter_profile_delete)(dev,
122 : : meter_profile_id, error);
123 : :
124 : 0 : rte_mtr_trace_meter_profile_delete(port_id, meter_profile_id, ret);
125 : :
126 : 0 : return ret;
127 : : }
128 : :
129 : : /** MTR meter profile get */
130 : : struct rte_flow_meter_profile *
131 : 0 : rte_mtr_meter_profile_get(uint16_t port_id,
132 : : uint32_t meter_profile_id,
133 : : struct rte_mtr_error *error)
134 : : {
135 : 0 : struct rte_eth_dev *dev = &rte_eth_devices[port_id];
136 : : struct rte_flow_meter_profile *ret;
137 [ # # # # ]: 0 : ret = RTE_MTR_HNDL_FUNC(port_id, meter_profile_get)(dev,
138 : : meter_profile_id, error);
139 : :
140 : 0 : rte_mtr_trace_meter_profile_get(port_id, meter_profile_id, ret);
141 : :
142 : 0 : return ret;
143 : : }
144 : :
145 : : /* MTR meter policy validate */
146 : : int
147 : 0 : 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 : 0 : struct rte_eth_dev *dev = &rte_eth_devices[port_id];
152 : : int ret;
153 [ # # # # ]: 0 : ret = RTE_MTR_FUNC(port_id, meter_policy_validate)(dev,
154 : : policy, error);
155 : :
156 : 0 : rte_mtr_trace_meter_policy_validate(port_id, policy, ret);
157 : :
158 : 0 : return ret;
159 : : }
160 : :
161 : : /* MTR meter policy add */
162 : : int
163 : 0 : 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 : 0 : struct rte_eth_dev *dev = &rte_eth_devices[port_id];
169 : : int ret;
170 [ # # # # ]: 0 : ret = RTE_MTR_FUNC(port_id, meter_policy_add)(dev,
171 : : policy_id, policy, error);
172 : :
173 : 0 : rte_mtr_trace_meter_policy_add(port_id, policy_id, policy, ret);
174 : :
175 : 0 : return ret;
176 : : }
177 : :
178 : : /** MTR meter policy delete */
179 : : int
180 : 0 : rte_mtr_meter_policy_delete(uint16_t port_id,
181 : : uint32_t policy_id,
182 : : struct rte_mtr_error *error)
183 : : {
184 : 0 : struct rte_eth_dev *dev = &rte_eth_devices[port_id];
185 : : int ret;
186 [ # # # # ]: 0 : 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 : 0 : return ret;
192 : : }
193 : :
194 : : /** MTR meter policy get */
195 : : struct rte_flow_meter_policy *
196 : 0 : rte_mtr_meter_policy_get(uint16_t port_id,
197 : : uint32_t policy_id,
198 : : struct rte_mtr_error *error)
199 : : {
200 : 0 : struct rte_eth_dev *dev = &rte_eth_devices[port_id];
201 : : struct rte_flow_meter_policy *ret;
202 [ # # # # ]: 0 : ret = RTE_MTR_HNDL_FUNC(port_id, meter_policy_get)(dev,
203 : : policy_id, error);
204 : :
205 : 0 : rte_mtr_trace_meter_policy_get(port_id, policy_id, ret);
206 : :
207 : 0 : return ret;
208 : : }
209 : :
210 : : /** MTR object create */
211 : : int
212 : 0 : 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 : 0 : struct rte_eth_dev *dev = &rte_eth_devices[port_id];
219 : : int ret;
220 [ # # # # ]: 0 : 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 : 0 : return ret;
226 : : }
227 : :
228 : : /** MTR object destroy */
229 : : int
230 : 0 : rte_mtr_destroy(uint16_t port_id,
231 : : uint32_t mtr_id,
232 : : struct rte_mtr_error *error)
233 : : {
234 : 0 : struct rte_eth_dev *dev = &rte_eth_devices[port_id];
235 : : int ret;
236 [ # # # # ]: 0 : 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 : 0 : return ret;
242 : : }
243 : :
244 : : /** MTR object meter enable */
245 : : int
246 : 0 : rte_mtr_meter_enable(uint16_t port_id,
247 : : uint32_t mtr_id,
248 : : struct rte_mtr_error *error)
249 : : {
250 : 0 : struct rte_eth_dev *dev = &rte_eth_devices[port_id];
251 : : int ret;
252 [ # # # # ]: 0 : ret = RTE_MTR_FUNC(port_id, meter_enable)(dev,
253 : : mtr_id, error);
254 : :
255 : 0 : rte_mtr_trace_meter_enable(port_id, mtr_id, ret);
256 : :
257 : 0 : return ret;
258 : : }
259 : :
260 : : /** MTR object meter disable */
261 : : int
262 : 0 : rte_mtr_meter_disable(uint16_t port_id,
263 : : uint32_t mtr_id,
264 : : struct rte_mtr_error *error)
265 : : {
266 : 0 : struct rte_eth_dev *dev = &rte_eth_devices[port_id];
267 : : int ret;
268 [ # # # # ]: 0 : ret = RTE_MTR_FUNC(port_id, meter_disable)(dev,
269 : : mtr_id, error);
270 : :
271 : 0 : rte_mtr_trace_meter_disable(port_id, mtr_id, ret);
272 : :
273 : 0 : return ret;
274 : : }
275 : :
276 : : /** MTR object meter profile update */
277 : : int
278 : 0 : 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 : 0 : struct rte_eth_dev *dev = &rte_eth_devices[port_id];
284 : : int ret;
285 [ # # # # ]: 0 : ret = RTE_MTR_FUNC(port_id, meter_profile_update)(dev,
286 : : mtr_id, meter_profile_id, error);
287 : :
288 : 0 : rte_mtr_trace_meter_profile_update(port_id, mtr_id, meter_profile_id, ret);
289 : :
290 : 0 : return ret;
291 : : }
292 : :
293 : : /** MTR object meter policy update */
294 : : int
295 : 0 : 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 : 0 : struct rte_eth_dev *dev = &rte_eth_devices[port_id];
301 : : int ret;
302 [ # # # # ]: 0 : ret = RTE_MTR_FUNC(port_id, meter_policy_update)(dev,
303 : : mtr_id, meter_policy_id, error);
304 : :
305 : 0 : rte_mtr_trace_meter_policy_update(port_id, mtr_id, meter_policy_id, ret);
306 : :
307 : 0 : return ret;
308 : : }
309 : :
310 : : /** MTR object meter DSCP table update */
311 : : int
312 : 0 : 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 : 0 : struct rte_eth_dev *dev = &rte_eth_devices[port_id];
318 : : int ret;
319 [ # # # # ]: 0 : ret = RTE_MTR_FUNC(port_id, meter_dscp_table_update)(dev,
320 : : mtr_id, proto, dscp_table, error);
321 : :
322 : 0 : rte_mtr_trace_meter_dscp_table_update(port_id, mtr_id, dscp_table, ret);
323 : :
324 : 0 : return ret;
325 : : }
326 : :
327 : : /** MTR object meter VLAN table update */
328 : : int
329 : 0 : 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 : 0 : struct rte_eth_dev *dev = &rte_eth_devices[port_id];
335 : : int ret;
336 [ # # # # ]: 0 : ret = RTE_MTR_FUNC(port_id, meter_vlan_table_update)(dev,
337 : : mtr_id, proto, vlan_table, error);
338 : :
339 : 0 : rte_mtr_trace_meter_vlan_table_update(port_id, mtr_id, vlan_table, ret);
340 : :
341 : 0 : return ret;
342 : : }
343 : :
344 : : /** Set the input color protocol on MTR object */
345 : : int
346 : 0 : 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 : 0 : struct rte_eth_dev *dev = &rte_eth_devices[port_id];
353 : : int ret;
354 [ # # # # ]: 0 : ret = RTE_MTR_FUNC(port_id, in_proto_set)(dev,
355 : : mtr_id, proto, priority, error);
356 : :
357 : 0 : rte_mtr_trace_color_in_protocol_set(port_id, mtr_id, proto, priority, ret);
358 : :
359 : 0 : return ret;
360 : : }
361 : :
362 : : /** Get input color protocols of MTR object */
363 : : int
364 : 0 : 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 : 0 : struct rte_eth_dev *dev = &rte_eth_devices[port_id];
370 : : int ret;
371 [ # # # # ]: 0 : ret = RTE_MTR_FUNC(port_id, in_proto_get)(dev,
372 : : mtr_id, proto_mask, error);
373 : :
374 : 0 : rte_mtr_trace_color_in_protocol_get(port_id, mtr_id, ret);
375 : :
376 : 0 : return ret;
377 : : }
378 : :
379 : : /** Get input color protocol priority of MTR object */
380 : : int
381 : 0 : 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 : 0 : struct rte_eth_dev *dev = &rte_eth_devices[port_id];
388 : : int ret;
389 [ # # # # ]: 0 : ret = RTE_MTR_FUNC(port_id, in_proto_prio_get)(dev,
390 : : mtr_id, proto, priority, error);
391 : :
392 : 0 : rte_mtr_trace_color_in_protocol_priority_get(port_id, mtr_id, proto, ret);
393 : :
394 : 0 : return ret;
395 : : }
396 : :
397 : : /** MTR object enabled stats update */
398 : : int
399 : 0 : 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 : 0 : struct rte_eth_dev *dev = &rte_eth_devices[port_id];
405 : : int ret;
406 [ # # # # ]: 0 : ret = RTE_MTR_FUNC(port_id, stats_update)(dev,
407 : : mtr_id, stats_mask, error);
408 : :
409 : 0 : rte_mtr_trace_stats_update(port_id, mtr_id, stats_mask, ret);
410 : :
411 : 0 : return ret;
412 : : }
413 : :
414 : : /** MTR object stats read */
415 : : int
416 : 0 : 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 : 0 : struct rte_eth_dev *dev = &rte_eth_devices[port_id];
424 : : int ret;
425 [ # # # # ]: 0 : ret = RTE_MTR_FUNC(port_id, stats_read)(dev,
426 : : mtr_id, stats, stats_mask, clear, error);
427 : :
428 [ # # ]: 0 : rte_mtr_trace_stats_read(port_id, mtr_id, stats, *stats_mask, clear,
429 : : ret);
430 : :
431 : 0 : return ret;
432 : : }
|