xref: /dpdk/lib/ethdev/rte_mtr_driver.h (revision 204daeea0143ffaa6f5726bb277e8436950315a0)
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