a0ddc2b5f47f1b91a4ce004966695c7f231bd808
[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_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
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__ */