ethdev: add pre-defined meter policy API
[dpdk.git] / lib / ethdev / rte_mtr_driver.h
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 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_meter_policy_validate_t)(struct rte_eth_dev *dev,
45         struct rte_mtr_meter_policy_params *policy,
46         struct rte_mtr_error *error);
47 /**< @internal MTR meter policy validate */
48
49 typedef int (*rte_mtr_meter_policy_add_t)(struct rte_eth_dev *dev,
50         uint32_t policy_id,
51         struct rte_mtr_meter_policy_params *policy,
52         struct rte_mtr_error *error);
53 /**< @internal MTR meter policy add */
54
55 typedef int (*rte_mtr_meter_policy_delete_t)(struct rte_eth_dev *dev,
56         uint32_t policy_id,
57         struct rte_mtr_error *error);
58 /**< @internal MTR meter policy delete */
59
60 typedef int (*rte_mtr_create_t)(struct rte_eth_dev *dev,
61         uint32_t mtr_id,
62         struct rte_mtr_params *params,
63         int shared,
64         struct rte_mtr_error *error);
65 /**< @internal MTR object create */
66
67 typedef int (*rte_mtr_destroy_t)(struct rte_eth_dev *dev,
68         uint32_t mtr_id,
69         struct rte_mtr_error *error);
70 /**< @internal MTR object destroy */
71
72 typedef int (*rte_mtr_meter_enable_t)(struct rte_eth_dev *dev,
73         uint32_t mtr_id,
74         struct rte_mtr_error *error);
75 /**< @internal MTR object meter enable */
76
77 typedef int (*rte_mtr_meter_disable_t)(struct rte_eth_dev *dev,
78         uint32_t mtr_id,
79         struct rte_mtr_error *error);
80 /**< @internal MTR object meter disable */
81
82 typedef int (*rte_mtr_meter_profile_update_t)(struct rte_eth_dev *dev,
83         uint32_t mtr_id,
84         uint32_t meter_profile_id,
85         struct rte_mtr_error *error);
86 /**< @internal MTR object meter profile update */
87
88 typedef int (*rte_mtr_meter_policy_update_t)(struct rte_eth_dev *dev,
89         uint32_t mtr_id,
90         uint32_t meter_policy_id,
91         struct rte_mtr_error *error);
92 /**< @internal MTR object meter policy update */
93
94 typedef int (*rte_mtr_meter_dscp_table_update_t)(struct rte_eth_dev *dev,
95         uint32_t mtr_id,
96         enum rte_color *dscp_table,
97         struct rte_mtr_error *error);
98 /**< @internal MTR object meter DSCP table update */
99
100 typedef int (*rte_mtr_stats_update_t)(struct rte_eth_dev *dev,
101         uint32_t mtr_id,
102         uint64_t stats_mask,
103         struct rte_mtr_error *error);
104 /**< @internal MTR object enabled stats update */
105
106 typedef int (*rte_mtr_stats_read_t)(struct rte_eth_dev *dev,
107         uint32_t mtr_id,
108         struct rte_mtr_stats *stats,
109         uint64_t *stats_mask,
110         int clear,
111         struct rte_mtr_error *error);
112 /**< @internal MTR object stats read */
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
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__ */