xref: /dpdk/lib/ethdev/rte_mtr_driver.h (revision 42a8fc7daa46256d150278fc9a7a846e27945a0c)
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 meter vlan table update. */
101 typedef int (*rte_mtr_meter_vlan_table_update_t)(struct rte_eth_dev *dev,
102 	uint32_t mtr_id,
103 	enum rte_color *vlan_table,
104 	struct rte_mtr_error *error);
105 
106 /** @internal Set the input color protocol on MTR object. */
107 typedef int (*rte_mtr_meter_color_in_proto_set_t)(struct rte_eth_dev *dev,
108 	uint32_t mtr_id,
109 	enum rte_mtr_color_in_protocol proto,
110 	uint32_t priority,
111 	struct rte_mtr_error *error);
112 
113 /** @internal Get the input color protocols of MTR object. */
114 typedef int (*rte_mtr_meter_color_in_proto_get_t)(struct rte_eth_dev *dev,
115 	uint32_t mtr_id,
116 	uint64_t *proto_mask,
117 	struct rte_mtr_error *error);
118 
119 /** @internal Get the input color protocol priority of MTR object. */
120 typedef int (*rte_mtr_meter_color_in_proto_prio_get_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 MTR object enabled stats update. */
127 typedef int (*rte_mtr_stats_update_t)(struct rte_eth_dev *dev,
128 	uint32_t mtr_id,
129 	uint64_t stats_mask,
130 	struct rte_mtr_error *error);
131 
132 /** @internal MTR object stats read. */
133 typedef int (*rte_mtr_stats_read_t)(struct rte_eth_dev *dev,
134 	uint32_t mtr_id,
135 	struct rte_mtr_stats *stats,
136 	uint64_t *stats_mask,
137 	int clear,
138 	struct rte_mtr_error *error);
139 
140 struct rte_mtr_ops {
141 	/** MTR capabilities get */
142 	rte_mtr_capabilities_get_t capabilities_get;
143 
144 	/** MTR meter profile add */
145 	rte_mtr_meter_profile_add_t meter_profile_add;
146 
147 	/** MTR meter profile delete */
148 	rte_mtr_meter_profile_delete_t meter_profile_delete;
149 
150 	/** MTR object create */
151 	rte_mtr_create_t create;
152 
153 	/** MTR object destroy */
154 	rte_mtr_destroy_t destroy;
155 
156 	/** MTR object meter enable */
157 	rte_mtr_meter_enable_t meter_enable;
158 
159 	/** MTR object meter disable */
160 	rte_mtr_meter_disable_t meter_disable;
161 
162 	/** MTR object meter profile update */
163 	rte_mtr_meter_profile_update_t meter_profile_update;
164 
165 	/** MTR object meter DSCP table update */
166 	rte_mtr_meter_dscp_table_update_t meter_dscp_table_update;
167 
168 	/** MTR object meter VLAN table update */
169 	rte_mtr_meter_vlan_table_update_t meter_vlan_table_update;
170 
171 	/** Set the input color protocol on MTR object. */
172 	rte_mtr_meter_color_in_proto_set_t in_proto_set;
173 
174 	/** Get the input color protocol of MTR object. */
175 	rte_mtr_meter_color_in_proto_get_t in_proto_get;
176 
177 	/** Get the input color protocol priority of MTR object. */
178 	rte_mtr_meter_color_in_proto_prio_get_t in_proto_prio_get;
179 
180 	/** MTR object enabled stats update */
181 	rte_mtr_stats_update_t stats_update;
182 
183 	/** MTR object stats read */
184 	rte_mtr_stats_read_t stats_read;
185 
186 	/** MTR meter policy validate */
187 	rte_mtr_meter_policy_validate_t meter_policy_validate;
188 
189 	/** MTR meter policy add */
190 	rte_mtr_meter_policy_add_t meter_policy_add;
191 
192 	/** MTR meter policy delete */
193 	rte_mtr_meter_policy_delete_t meter_policy_delete;
194 
195 	/** MTR object meter policy update */
196 	rte_mtr_meter_policy_update_t meter_policy_update;
197 };
198 
199 /**
200  * Initialize generic error structure.
201  *
202  * This function also sets rte_errno to a given value.
203  *
204  * @param[out] error
205  *   Pointer to error structure (may be NULL).
206  * @param[in] code
207  *   Related error code (rte_errno).
208  * @param[in] type
209  *   Cause field and error type.
210  * @param[in] cause
211  *   Object responsible for the error.
212  * @param[in] message
213  *   Human-readable error message.
214  *
215  * @return
216  *   Error code.
217  */
218 static inline int
219 rte_mtr_error_set(struct rte_mtr_error *error,
220 		   int code,
221 		   enum rte_mtr_error_type type,
222 		   const void *cause,
223 		   const char *message)
224 {
225 	if (error) {
226 		*error = (struct rte_mtr_error){
227 			.type = type,
228 			.cause = cause,
229 			.message = message,
230 		};
231 	}
232 	rte_errno = code;
233 	return code;
234 }
235 
236 /**
237  * Get generic traffic metering and policing operations structure from a port
238  *
239  * @param[in] port_id
240  *   The port identifier of the Ethernet device.
241  * @param[out] error
242  *   Error details
243  *
244  * @return
245  *   The traffic metering and policing operations structure associated with
246  *   port_id on success, NULL otherwise.
247  */
248 const struct rte_mtr_ops *
249 rte_mtr_ops_get(uint16_t port_id, struct rte_mtr_error *error);
250 
251 #ifdef __cplusplus
252 }
253 #endif
254 
255 #endif /* __INCLUDE_RTE_MTR_DRIVER_H__ */
256