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 "rte_ethdev_driver.h"
22 #include "rte_mtr.h"
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
28 typedef int (*rte_mtr_capabilities_get_t)(struct rte_eth_dev *dev,
29 	struct rte_mtr_capabilities *cap,
30 	struct rte_mtr_error *error);
31 /**< @internal MTR capabilities get */
32 
33 typedef int (*rte_mtr_meter_profile_add_t)(struct rte_eth_dev *dev,
34 	uint32_t meter_profile_id,
35 	struct rte_mtr_meter_profile *profile,
36 	struct rte_mtr_error *error);
37 /**< @internal MTR meter profile add */
38 
39 typedef int (*rte_mtr_meter_profile_delete_t)(struct rte_eth_dev *dev,
40 	uint32_t meter_profile_id,
41 	struct rte_mtr_error *error);
42 /**< @internal MTR meter profile delete */
43 
44 typedef int (*rte_mtr_create_t)(struct rte_eth_dev *dev,
45 	uint32_t mtr_id,
46 	struct rte_mtr_params *params,
47 	int shared,
48 	struct rte_mtr_error *error);
49 /**< @internal MTR object create */
50 
51 typedef int (*rte_mtr_destroy_t)(struct rte_eth_dev *dev,
52 	uint32_t mtr_id,
53 	struct rte_mtr_error *error);
54 /**< @internal MTR object destroy */
55 
56 typedef int (*rte_mtr_meter_enable_t)(struct rte_eth_dev *dev,
57 	uint32_t mtr_id,
58 	struct rte_mtr_error *error);
59 /**< @internal MTR object meter enable */
60 
61 typedef int (*rte_mtr_meter_disable_t)(struct rte_eth_dev *dev,
62 	uint32_t mtr_id,
63 	struct rte_mtr_error *error);
64 /**< @internal MTR object meter disable */
65 
66 typedef int (*rte_mtr_meter_profile_update_t)(struct rte_eth_dev *dev,
67 	uint32_t mtr_id,
68 	uint32_t meter_profile_id,
69 	struct rte_mtr_error *error);
70 /**< @internal MTR object meter profile update */
71 
72 typedef int (*rte_mtr_meter_dscp_table_update_t)(struct rte_eth_dev *dev,
73 	uint32_t mtr_id,
74 	enum rte_color *dscp_table,
75 	struct rte_mtr_error *error);
76 /**< @internal MTR object meter DSCP table update */
77 
78 typedef int (*rte_mtr_policer_actions_update_t)(struct rte_eth_dev *dev,
79 	uint32_t mtr_id,
80 	uint32_t action_mask,
81 	enum rte_mtr_policer_action *actions,
82 	struct rte_mtr_error *error);
83 /**< @internal MTR object policer action update*/
84 
85 typedef int (*rte_mtr_stats_update_t)(struct rte_eth_dev *dev,
86 	uint32_t mtr_id,
87 	uint64_t stats_mask,
88 	struct rte_mtr_error *error);
89 /**< @internal MTR object enabled stats update */
90 
91 typedef int (*rte_mtr_stats_read_t)(struct rte_eth_dev *dev,
92 	uint32_t mtr_id,
93 	struct rte_mtr_stats *stats,
94 	uint64_t *stats_mask,
95 	int clear,
96 	struct rte_mtr_error *error);
97 /**< @internal MTR object stats read */
98 
99 struct rte_mtr_ops {
100 	/** MTR capabilities get */
101 	rte_mtr_capabilities_get_t capabilities_get;
102 
103 	/** MTR meter profile add */
104 	rte_mtr_meter_profile_add_t meter_profile_add;
105 
106 	/** MTR meter profile delete */
107 	rte_mtr_meter_profile_delete_t meter_profile_delete;
108 
109 	/** MTR object create */
110 	rte_mtr_create_t create;
111 
112 	/** MTR object destroy */
113 	rte_mtr_destroy_t destroy;
114 
115 	/** MTR object meter enable */
116 	rte_mtr_meter_enable_t meter_enable;
117 
118 	/** MTR object meter disable */
119 	rte_mtr_meter_disable_t meter_disable;
120 
121 	/** MTR object meter profile update */
122 	rte_mtr_meter_profile_update_t meter_profile_update;
123 
124 	/** MTR object meter DSCP table update */
125 	rte_mtr_meter_dscp_table_update_t meter_dscp_table_update;
126 
127 	/** MTR object policer action update */
128 	rte_mtr_policer_actions_update_t policer_actions_update;
129 
130 	/** MTR object enabled stats update */
131 	rte_mtr_stats_update_t stats_update;
132 
133 	/** MTR object stats read */
134 	rte_mtr_stats_read_t stats_read;
135 };
136 
137 /**
138  * Initialize generic error structure.
139  *
140  * This function also sets rte_errno to a given value.
141  *
142  * @param[out] error
143  *   Pointer to error structure (may be NULL).
144  * @param[in] code
145  *   Related error code (rte_errno).
146  * @param[in] type
147  *   Cause field and error type.
148  * @param[in] cause
149  *   Object responsible for the error.
150  * @param[in] message
151  *   Human-readable error message.
152  *
153  * @return
154  *   Error code.
155  */
156 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)157 rte_mtr_error_set(struct rte_mtr_error *error,
158 		   int code,
159 		   enum rte_mtr_error_type type,
160 		   const void *cause,
161 		   const char *message)
162 {
163 	if (error) {
164 		*error = (struct rte_mtr_error){
165 			.type = type,
166 			.cause = cause,
167 			.message = message,
168 		};
169 	}
170 	rte_errno = code;
171 	return code;
172 }
173 
174 /**
175  * Get generic traffic metering and policing operations structure from a port
176  *
177  * @param[in] port_id
178  *   The port identifier of the Ethernet device.
179  * @param[out] error
180  *   Error details
181  *
182  * @return
183  *   The traffic metering and policing operations structure associated with
184  *   port_id on success, NULL otherwise.
185  */
186 const struct rte_mtr_ops *
187 rte_mtr_ops_get(uint16_t port_id, struct rte_mtr_error *error);
188 
189 #ifdef __cplusplus
190 }
191 #endif
192 
193 #endif /* __INCLUDE_RTE_MTR_DRIVER_H__ */
194