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