1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2017 Intel Corporation
3 */
4
5 #ifndef __INCLUDE_RTE_MTR_DRIVER_H__
6 #define __INCLUDE_RTE_MTR_DRIVER_H__
7
8 /**
9 * @file
10 * RTE Generic Traffic Metering and Policing API (Driver Side)
11 *
12 * This file provides implementation helpers for internal use by PMDs, they
13 * are not intended to be exposed to applications and are not subject to ABI
14 * versioning.
15 */
16
17 #include <stdint.h>
18
19 #include <rte_errno.h>
20 #include "rte_ethdev.h"
21 #include "ethdev_driver.h"
22 #include "rte_mtr.h"
23
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27
28 /** @internal MTR capabilities get. */
29 typedef int (*rte_mtr_capabilities_get_t)(struct rte_eth_dev *dev,
30 struct rte_mtr_capabilities *cap,
31 struct rte_mtr_error *error);
32
33 /** @internal MTR meter profile add. */
34 typedef int (*rte_mtr_meter_profile_add_t)(struct rte_eth_dev *dev,
35 uint32_t meter_profile_id,
36 struct rte_mtr_meter_profile *profile,
37 struct rte_mtr_error *error);
38
39 /** @internal MTR meter profile delete. */
40 typedef int (*rte_mtr_meter_profile_delete_t)(struct rte_eth_dev *dev,
41 uint32_t meter_profile_id,
42 struct rte_mtr_error *error);
43
44 /** @internal MTR meter policy validate. */
45 typedef int (*rte_mtr_meter_policy_validate_t)(struct rte_eth_dev *dev,
46 struct rte_mtr_meter_policy_params *policy,
47 struct rte_mtr_error *error);
48
49 /** @internal MTR meter policy add. */
50 typedef int (*rte_mtr_meter_policy_add_t)(struct rte_eth_dev *dev,
51 uint32_t policy_id,
52 struct rte_mtr_meter_policy_params *policy,
53 struct rte_mtr_error *error);
54
55 /** @internal MTR meter policy delete. */
56 typedef int (*rte_mtr_meter_policy_delete_t)(struct rte_eth_dev *dev,
57 uint32_t policy_id,
58 struct rte_mtr_error *error);
59
60 /** @internal MTR object create. */
61 typedef int (*rte_mtr_create_t)(struct rte_eth_dev *dev,
62 uint32_t mtr_id,
63 struct rte_mtr_params *params,
64 int shared,
65 struct rte_mtr_error *error);
66
67 /** @internal MTR object destroy. */
68 typedef int (*rte_mtr_destroy_t)(struct rte_eth_dev *dev,
69 uint32_t mtr_id,
70 struct rte_mtr_error *error);
71
72 /** @internal MTR object meter enable. */
73 typedef int (*rte_mtr_meter_enable_t)(struct rte_eth_dev *dev,
74 uint32_t mtr_id,
75 struct rte_mtr_error *error);
76
77 /** @internal MTR object meter disable. */
78 typedef int (*rte_mtr_meter_disable_t)(struct rte_eth_dev *dev,
79 uint32_t mtr_id,
80 struct rte_mtr_error *error);
81
82 /** @internal MTR object meter profile update. */
83 typedef int (*rte_mtr_meter_profile_update_t)(struct rte_eth_dev *dev,
84 uint32_t mtr_id,
85 uint32_t meter_profile_id,
86 struct rte_mtr_error *error);
87
88 /** @internal MTR object meter policy update. */
89 typedef int (*rte_mtr_meter_policy_update_t)(struct rte_eth_dev *dev,
90 uint32_t mtr_id,
91 uint32_t meter_policy_id,
92 struct rte_mtr_error *error);
93
94 /** @internal MTR object meter DSCP table update. */
95 typedef int (*rte_mtr_meter_dscp_table_update_t)(struct rte_eth_dev *dev,
96 uint32_t mtr_id,
97 enum rte_color *dscp_table,
98 struct rte_mtr_error *error);
99
100 /** @internal MTR object enabled stats update. */
101 typedef int (*rte_mtr_stats_update_t)(struct rte_eth_dev *dev,
102 uint32_t mtr_id,
103 uint64_t stats_mask,
104 struct rte_mtr_error *error);
105
106 /** @internal MTR object stats read. */
107 typedef int (*rte_mtr_stats_read_t)(struct rte_eth_dev *dev,
108 uint32_t mtr_id,
109 struct rte_mtr_stats *stats,
110 uint64_t *stats_mask,
111 int clear,
112 struct rte_mtr_error *error);
113
114 struct rte_mtr_ops {
115 /** MTR capabilities get */
116 rte_mtr_capabilities_get_t capabilities_get;
117
118 /** MTR meter profile add */
119 rte_mtr_meter_profile_add_t meter_profile_add;
120
121 /** MTR meter profile delete */
122 rte_mtr_meter_profile_delete_t meter_profile_delete;
123
124 /** MTR object create */
125 rte_mtr_create_t create;
126
127 /** MTR object destroy */
128 rte_mtr_destroy_t destroy;
129
130 /** MTR object meter enable */
131 rte_mtr_meter_enable_t meter_enable;
132
133 /** MTR object meter disable */
134 rte_mtr_meter_disable_t meter_disable;
135
136 /** MTR object meter profile update */
137 rte_mtr_meter_profile_update_t meter_profile_update;
138
139 /** MTR object meter DSCP table update */
140 rte_mtr_meter_dscp_table_update_t meter_dscp_table_update;
141
142 /** MTR object enabled stats update */
143 rte_mtr_stats_update_t stats_update;
144
145 /** MTR object stats read */
146 rte_mtr_stats_read_t stats_read;
147
148 /** MTR meter policy validate */
149 rte_mtr_meter_policy_validate_t meter_policy_validate;
150
151 /** MTR meter policy add */
152 rte_mtr_meter_policy_add_t meter_policy_add;
153
154 /** MTR meter policy delete */
155 rte_mtr_meter_policy_delete_t meter_policy_delete;
156
157 /** MTR object meter policy update */
158 rte_mtr_meter_policy_update_t meter_policy_update;
159 };
160
161 /**
162 * Initialize generic error structure.
163 *
164 * This function also sets rte_errno to a given value.
165 *
166 * @param[out] error
167 * Pointer to error structure (may be NULL).
168 * @param[in] code
169 * Related error code (rte_errno).
170 * @param[in] type
171 * Cause field and error type.
172 * @param[in] cause
173 * Object responsible for the error.
174 * @param[in] message
175 * Human-readable error message.
176 *
177 * @return
178 * Error code.
179 */
180 static inline int
rte_mtr_error_set(struct rte_mtr_error * error,int code,enum rte_mtr_error_type type,const void * cause,const char * message)181 rte_mtr_error_set(struct rte_mtr_error *error,
182 int code,
183 enum rte_mtr_error_type type,
184 const void *cause,
185 const char *message)
186 {
187 if (error) {
188 *error = (struct rte_mtr_error){
189 .type = type,
190 .cause = cause,
191 .message = message,
192 };
193 }
194 rte_errno = code;
195 return code;
196 }
197
198 /**
199 * Get generic traffic metering and policing operations structure from a port
200 *
201 * @param[in] port_id
202 * The port identifier of the Ethernet device.
203 * @param[out] error
204 * Error details
205 *
206 * @return
207 * The traffic metering and policing operations structure associated with
208 * port_id on success, NULL otherwise.
209 */
210 const struct rte_mtr_ops *
211 rte_mtr_ops_get(uint16_t port_id, struct rte_mtr_error *error);
212
213 #ifdef __cplusplus
214 }
215 #endif
216
217 #endif /* __INCLUDE_RTE_MTR_DRIVER_H__ */
218