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