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