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 profile get. */
45 typedef struct rte_flow_meter_profile *
46 (*rte_mtr_meter_profile_get_t)(struct rte_eth_dev *dev,
47 uint32_t meter_profile_id,
48 struct rte_mtr_error *error);
49
50 /** @internal MTR meter policy validate. */
51 typedef int (*rte_mtr_meter_policy_validate_t)(struct rte_eth_dev *dev,
52 struct rte_mtr_meter_policy_params *policy,
53 struct rte_mtr_error *error);
54
55 /** @internal MTR meter policy add. */
56 typedef int (*rte_mtr_meter_policy_add_t)(struct rte_eth_dev *dev,
57 uint32_t policy_id,
58 struct rte_mtr_meter_policy_params *policy,
59 struct rte_mtr_error *error);
60
61 /** @internal MTR meter policy delete. */
62 typedef int (*rte_mtr_meter_policy_delete_t)(struct rte_eth_dev *dev,
63 uint32_t policy_id,
64 struct rte_mtr_error *error);
65
66 /** @internal MTR meter policy get. */
67 typedef struct rte_flow_meter_policy *
68 (*rte_mtr_meter_policy_get_t)(struct rte_eth_dev *dev,
69 uint32_t policy_id,
70 struct rte_mtr_error *error);
71
72
73 /** @internal MTR object create. */
74 typedef int (*rte_mtr_create_t)(struct rte_eth_dev *dev,
75 uint32_t mtr_id,
76 struct rte_mtr_params *params,
77 int shared,
78 struct rte_mtr_error *error);
79
80 /** @internal MTR object destroy. */
81 typedef int (*rte_mtr_destroy_t)(struct rte_eth_dev *dev,
82 uint32_t mtr_id,
83 struct rte_mtr_error *error);
84
85 /** @internal MTR object meter enable. */
86 typedef int (*rte_mtr_meter_enable_t)(struct rte_eth_dev *dev,
87 uint32_t mtr_id,
88 struct rte_mtr_error *error);
89
90 /** @internal MTR object meter disable. */
91 typedef int (*rte_mtr_meter_disable_t)(struct rte_eth_dev *dev,
92 uint32_t mtr_id,
93 struct rte_mtr_error *error);
94
95 /** @internal MTR object meter profile update. */
96 typedef int (*rte_mtr_meter_profile_update_t)(struct rte_eth_dev *dev,
97 uint32_t mtr_id,
98 uint32_t meter_profile_id,
99 struct rte_mtr_error *error);
100
101 /** @internal MTR object meter policy update. */
102 typedef int (*rte_mtr_meter_policy_update_t)(struct rte_eth_dev *dev,
103 uint32_t mtr_id,
104 uint32_t meter_policy_id,
105 struct rte_mtr_error *error);
106
107 /** @internal MTR object meter DSCP table update. */
108 typedef int (*rte_mtr_meter_dscp_table_update_t)(struct rte_eth_dev *dev,
109 uint32_t mtr_id, enum rte_mtr_color_in_protocol proto,
110 enum rte_color *dscp_table,
111 struct rte_mtr_error *error);
112
113 /** @internal mtr object meter vlan table update. */
114 typedef int (*rte_mtr_meter_vlan_table_update_t)(struct rte_eth_dev *dev,
115 uint32_t mtr_id, enum rte_mtr_color_in_protocol proto,
116 enum rte_color *vlan_table,
117 struct rte_mtr_error *error);
118
119 /** @internal Set the input color protocol on MTR object. */
120 typedef int (*rte_mtr_meter_color_in_proto_set_t)(struct rte_eth_dev *dev,
121 uint32_t mtr_id,
122 enum rte_mtr_color_in_protocol proto,
123 uint32_t priority,
124 struct rte_mtr_error *error);
125
126 /** @internal Get the input color protocols of MTR object. */
127 typedef int (*rte_mtr_meter_color_in_proto_get_t)(struct rte_eth_dev *dev,
128 uint32_t mtr_id,
129 uint64_t *proto_mask,
130 struct rte_mtr_error *error);
131
132 /** @internal Get the input color protocol priority of MTR object. */
133 typedef int (*rte_mtr_meter_color_in_proto_prio_get_t)(struct rte_eth_dev *dev,
134 uint32_t mtr_id,
135 enum rte_mtr_color_in_protocol proto,
136 uint32_t *priority,
137 struct rte_mtr_error *error);
138
139 /** @internal MTR object enabled stats update. */
140 typedef int (*rte_mtr_stats_update_t)(struct rte_eth_dev *dev,
141 uint32_t mtr_id,
142 uint64_t stats_mask,
143 struct rte_mtr_error *error);
144
145 /** @internal MTR object stats read. */
146 typedef int (*rte_mtr_stats_read_t)(struct rte_eth_dev *dev,
147 uint32_t mtr_id,
148 struct rte_mtr_stats *stats,
149 uint64_t *stats_mask,
150 int clear,
151 struct rte_mtr_error *error);
152
153 struct rte_mtr_ops {
154 /** MTR capabilities get */
155 rte_mtr_capabilities_get_t capabilities_get;
156
157 /** MTR meter profile add */
158 rte_mtr_meter_profile_add_t meter_profile_add;
159
160 /** MTR meter profile delete */
161 rte_mtr_meter_profile_delete_t meter_profile_delete;
162
163 /** MTR object create */
164 rte_mtr_create_t create;
165
166 /** MTR object destroy */
167 rte_mtr_destroy_t destroy;
168
169 /** MTR object meter enable */
170 rte_mtr_meter_enable_t meter_enable;
171
172 /** MTR object meter disable */
173 rte_mtr_meter_disable_t meter_disable;
174
175 /** MTR object meter profile update */
176 rte_mtr_meter_profile_update_t meter_profile_update;
177
178 /** MTR object meter DSCP table update */
179 rte_mtr_meter_dscp_table_update_t meter_dscp_table_update;
180
181 /** MTR object meter VLAN table update */
182 rte_mtr_meter_vlan_table_update_t meter_vlan_table_update;
183
184 /** Set the input color protocol on MTR object. */
185 rte_mtr_meter_color_in_proto_set_t in_proto_set;
186
187 /** Get the input color protocol of MTR object. */
188 rte_mtr_meter_color_in_proto_get_t in_proto_get;
189
190 /** Get the input color protocol priority of MTR object. */
191 rte_mtr_meter_color_in_proto_prio_get_t in_proto_prio_get;
192
193 /** MTR object enabled stats update */
194 rte_mtr_stats_update_t stats_update;
195
196 /** MTR object stats read */
197 rte_mtr_stats_read_t stats_read;
198
199 /** MTR meter policy validate */
200 rte_mtr_meter_policy_validate_t meter_policy_validate;
201
202 /** MTR meter policy add */
203 rte_mtr_meter_policy_add_t meter_policy_add;
204
205 /** MTR meter policy delete */
206 rte_mtr_meter_policy_delete_t meter_policy_delete;
207
208 /** MTR object meter policy update */
209 rte_mtr_meter_policy_update_t meter_policy_update;
210
211 /** MTR meter profile get */
212 rte_mtr_meter_profile_get_t meter_profile_get;
213
214 /** MTR meter policy get */
215 rte_mtr_meter_policy_get_t meter_policy_get;
216 };
217
218 /**
219 * Initialize generic error structure.
220 *
221 * This function also sets rte_errno to a given value.
222 *
223 * @param[out] error
224 * Pointer to error structure (may be NULL).
225 * @param[in] code
226 * Related error code (rte_errno).
227 * @param[in] type
228 * Cause field and error type.
229 * @param[in] cause
230 * Object responsible for the error.
231 * @param[in] message
232 * Human-readable error message.
233 *
234 * @return
235 * Error code.
236 */
237 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)238 rte_mtr_error_set(struct rte_mtr_error *error,
239 int code,
240 enum rte_mtr_error_type type,
241 const void *cause,
242 const char *message)
243 {
244 if (error) {
245 *error = (struct rte_mtr_error){
246 .type = type,
247 .cause = cause,
248 .message = message,
249 };
250 }
251 rte_errno = code;
252 return code;
253 }
254
255 /**
256 * Get generic traffic metering and policing operations structure from a port
257 *
258 * @param[in] port_id
259 * The port identifier of the Ethernet device.
260 * @param[out] error
261 * Error details
262 *
263 * @return
264 * The traffic metering and policing operations structure associated with
265 * port_id on success, NULL otherwise.
266 */
267 const struct rte_mtr_ops *
268 rte_mtr_ops_get(uint16_t port_id, struct rte_mtr_error *error);
269
270 #ifdef __cplusplus
271 }
272 #endif
273
274 #endif /* __INCLUDE_RTE_MTR_DRIVER_H__ */
275