xref: /f-stack/dpdk/lib/librte_ethdev/rte_mtr.c (revision 4418919f)
1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2d30ea906Sjfb8856606  * Copyright(c) 2017 Intel Corporation
3d30ea906Sjfb8856606  */
4d30ea906Sjfb8856606 
5d30ea906Sjfb8856606 #include <stdint.h>
6d30ea906Sjfb8856606 
7d30ea906Sjfb8856606 #include <rte_errno.h>
8d30ea906Sjfb8856606 #include "rte_compat.h"
9d30ea906Sjfb8856606 #include "rte_ethdev.h"
10d30ea906Sjfb8856606 #include "rte_mtr_driver.h"
11d30ea906Sjfb8856606 #include "rte_mtr.h"
12d30ea906Sjfb8856606 
13d30ea906Sjfb8856606 /* Get generic traffic metering & policing operations structure from a port. */
14d30ea906Sjfb8856606 const struct rte_mtr_ops *
rte_mtr_ops_get(uint16_t port_id,struct rte_mtr_error * error)15d30ea906Sjfb8856606 rte_mtr_ops_get(uint16_t port_id, struct rte_mtr_error *error)
16d30ea906Sjfb8856606 {
17d30ea906Sjfb8856606 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
18d30ea906Sjfb8856606 	const struct rte_mtr_ops *ops;
19d30ea906Sjfb8856606 
20d30ea906Sjfb8856606 	if (!rte_eth_dev_is_valid_port(port_id)) {
21d30ea906Sjfb8856606 		rte_mtr_error_set(error,
22d30ea906Sjfb8856606 			ENODEV,
23d30ea906Sjfb8856606 			RTE_MTR_ERROR_TYPE_UNSPECIFIED,
24d30ea906Sjfb8856606 			NULL,
25d30ea906Sjfb8856606 			rte_strerror(ENODEV));
26d30ea906Sjfb8856606 		return NULL;
27d30ea906Sjfb8856606 	}
28d30ea906Sjfb8856606 
29d30ea906Sjfb8856606 	if ((dev->dev_ops->mtr_ops_get == NULL) ||
30d30ea906Sjfb8856606 		(dev->dev_ops->mtr_ops_get(dev, &ops) != 0) ||
31d30ea906Sjfb8856606 		(ops == NULL)) {
32d30ea906Sjfb8856606 		rte_mtr_error_set(error,
33d30ea906Sjfb8856606 			ENOSYS,
34d30ea906Sjfb8856606 			RTE_MTR_ERROR_TYPE_UNSPECIFIED,
35d30ea906Sjfb8856606 			NULL,
36d30ea906Sjfb8856606 			rte_strerror(ENOSYS));
37d30ea906Sjfb8856606 		return NULL;
38d30ea906Sjfb8856606 	}
39d30ea906Sjfb8856606 
40d30ea906Sjfb8856606 	return ops;
41d30ea906Sjfb8856606 }
42d30ea906Sjfb8856606 
43d30ea906Sjfb8856606 #define RTE_MTR_FUNC(port_id, func)			\
44d30ea906Sjfb8856606 ({							\
45d30ea906Sjfb8856606 	const struct rte_mtr_ops *ops =			\
46d30ea906Sjfb8856606 		rte_mtr_ops_get(port_id, error);		\
47d30ea906Sjfb8856606 	if (ops == NULL)					\
48d30ea906Sjfb8856606 		return -rte_errno;			\
49d30ea906Sjfb8856606 							\
50d30ea906Sjfb8856606 	if (ops->func == NULL)				\
51d30ea906Sjfb8856606 		return -rte_mtr_error_set(error,		\
52d30ea906Sjfb8856606 			ENOSYS,				\
53d30ea906Sjfb8856606 			RTE_MTR_ERROR_TYPE_UNSPECIFIED,	\
54d30ea906Sjfb8856606 			NULL,				\
55d30ea906Sjfb8856606 			rte_strerror(ENOSYS));		\
56d30ea906Sjfb8856606 							\
57d30ea906Sjfb8856606 	ops->func;					\
58d30ea906Sjfb8856606 })
59d30ea906Sjfb8856606 
60d30ea906Sjfb8856606 /* MTR capabilities get */
61*4418919fSjohnjiang int
rte_mtr_capabilities_get(uint16_t port_id,struct rte_mtr_capabilities * cap,struct rte_mtr_error * error)62d30ea906Sjfb8856606 rte_mtr_capabilities_get(uint16_t port_id,
63d30ea906Sjfb8856606 	struct rte_mtr_capabilities *cap,
64d30ea906Sjfb8856606 	struct rte_mtr_error *error)
65d30ea906Sjfb8856606 {
66d30ea906Sjfb8856606 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
67d30ea906Sjfb8856606 	return RTE_MTR_FUNC(port_id, capabilities_get)(dev,
68d30ea906Sjfb8856606 		cap, error);
69d30ea906Sjfb8856606 }
70d30ea906Sjfb8856606 
71d30ea906Sjfb8856606 /* MTR meter profile add */
72*4418919fSjohnjiang int
rte_mtr_meter_profile_add(uint16_t port_id,uint32_t meter_profile_id,struct rte_mtr_meter_profile * profile,struct rte_mtr_error * error)73d30ea906Sjfb8856606 rte_mtr_meter_profile_add(uint16_t port_id,
74d30ea906Sjfb8856606 	uint32_t meter_profile_id,
75d30ea906Sjfb8856606 	struct rte_mtr_meter_profile *profile,
76d30ea906Sjfb8856606 	struct rte_mtr_error *error)
77d30ea906Sjfb8856606 {
78d30ea906Sjfb8856606 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
79d30ea906Sjfb8856606 	return RTE_MTR_FUNC(port_id, meter_profile_add)(dev,
80d30ea906Sjfb8856606 		meter_profile_id, profile, error);
81d30ea906Sjfb8856606 }
82d30ea906Sjfb8856606 
83d30ea906Sjfb8856606 /** MTR meter profile delete */
84*4418919fSjohnjiang int
rte_mtr_meter_profile_delete(uint16_t port_id,uint32_t meter_profile_id,struct rte_mtr_error * error)85d30ea906Sjfb8856606 rte_mtr_meter_profile_delete(uint16_t port_id,
86d30ea906Sjfb8856606 	uint32_t meter_profile_id,
87d30ea906Sjfb8856606 	struct rte_mtr_error *error)
88d30ea906Sjfb8856606 {
89d30ea906Sjfb8856606 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
90d30ea906Sjfb8856606 	return RTE_MTR_FUNC(port_id, meter_profile_delete)(dev,
91d30ea906Sjfb8856606 		meter_profile_id, error);
92d30ea906Sjfb8856606 }
93d30ea906Sjfb8856606 
94d30ea906Sjfb8856606 /** MTR object create */
95*4418919fSjohnjiang int
rte_mtr_create(uint16_t port_id,uint32_t mtr_id,struct rte_mtr_params * params,int shared,struct rte_mtr_error * error)96d30ea906Sjfb8856606 rte_mtr_create(uint16_t port_id,
97d30ea906Sjfb8856606 	uint32_t mtr_id,
98d30ea906Sjfb8856606 	struct rte_mtr_params *params,
99d30ea906Sjfb8856606 	int shared,
100d30ea906Sjfb8856606 	struct rte_mtr_error *error)
101d30ea906Sjfb8856606 {
102d30ea906Sjfb8856606 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
103d30ea906Sjfb8856606 	return RTE_MTR_FUNC(port_id, create)(dev,
104d30ea906Sjfb8856606 		mtr_id, params, shared, error);
105d30ea906Sjfb8856606 }
106d30ea906Sjfb8856606 
107d30ea906Sjfb8856606 /** MTR object destroy */
108*4418919fSjohnjiang int
rte_mtr_destroy(uint16_t port_id,uint32_t mtr_id,struct rte_mtr_error * error)109d30ea906Sjfb8856606 rte_mtr_destroy(uint16_t port_id,
110d30ea906Sjfb8856606 	uint32_t mtr_id,
111d30ea906Sjfb8856606 	struct rte_mtr_error *error)
112d30ea906Sjfb8856606 {
113d30ea906Sjfb8856606 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
114d30ea906Sjfb8856606 	return RTE_MTR_FUNC(port_id, destroy)(dev,
115d30ea906Sjfb8856606 		mtr_id, error);
116d30ea906Sjfb8856606 }
117d30ea906Sjfb8856606 
118d30ea906Sjfb8856606 /** MTR object meter enable */
119*4418919fSjohnjiang int
rte_mtr_meter_enable(uint16_t port_id,uint32_t mtr_id,struct rte_mtr_error * error)120d30ea906Sjfb8856606 rte_mtr_meter_enable(uint16_t port_id,
121d30ea906Sjfb8856606 	uint32_t mtr_id,
122d30ea906Sjfb8856606 	struct rte_mtr_error *error)
123d30ea906Sjfb8856606 {
124d30ea906Sjfb8856606 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
125d30ea906Sjfb8856606 	return RTE_MTR_FUNC(port_id, meter_enable)(dev,
126d30ea906Sjfb8856606 		mtr_id, error);
127d30ea906Sjfb8856606 }
128d30ea906Sjfb8856606 
129d30ea906Sjfb8856606 /** MTR object meter disable */
130*4418919fSjohnjiang int
rte_mtr_meter_disable(uint16_t port_id,uint32_t mtr_id,struct rte_mtr_error * error)131d30ea906Sjfb8856606 rte_mtr_meter_disable(uint16_t port_id,
132d30ea906Sjfb8856606 	uint32_t mtr_id,
133d30ea906Sjfb8856606 	struct rte_mtr_error *error)
134d30ea906Sjfb8856606 {
135d30ea906Sjfb8856606 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
136d30ea906Sjfb8856606 	return RTE_MTR_FUNC(port_id, meter_disable)(dev,
137d30ea906Sjfb8856606 		mtr_id, error);
138d30ea906Sjfb8856606 }
139d30ea906Sjfb8856606 
140d30ea906Sjfb8856606 /** MTR object meter profile update */
141*4418919fSjohnjiang int
rte_mtr_meter_profile_update(uint16_t port_id,uint32_t mtr_id,uint32_t meter_profile_id,struct rte_mtr_error * error)142d30ea906Sjfb8856606 rte_mtr_meter_profile_update(uint16_t port_id,
143d30ea906Sjfb8856606 	uint32_t mtr_id,
144d30ea906Sjfb8856606 	uint32_t meter_profile_id,
145d30ea906Sjfb8856606 	struct rte_mtr_error *error)
146d30ea906Sjfb8856606 {
147d30ea906Sjfb8856606 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
148d30ea906Sjfb8856606 	return RTE_MTR_FUNC(port_id, meter_profile_update)(dev,
149d30ea906Sjfb8856606 		mtr_id, meter_profile_id, error);
150d30ea906Sjfb8856606 }
151d30ea906Sjfb8856606 
152d30ea906Sjfb8856606 /** MTR object meter DSCP table update */
153*4418919fSjohnjiang int
rte_mtr_meter_dscp_table_update(uint16_t port_id,uint32_t mtr_id,enum rte_color * dscp_table,struct rte_mtr_error * error)154d30ea906Sjfb8856606 rte_mtr_meter_dscp_table_update(uint16_t port_id,
155d30ea906Sjfb8856606 	uint32_t mtr_id,
156*4418919fSjohnjiang 	enum rte_color *dscp_table,
157d30ea906Sjfb8856606 	struct rte_mtr_error *error)
158d30ea906Sjfb8856606 {
159d30ea906Sjfb8856606 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
160d30ea906Sjfb8856606 	return RTE_MTR_FUNC(port_id, meter_dscp_table_update)(dev,
161d30ea906Sjfb8856606 		mtr_id, dscp_table, error);
162d30ea906Sjfb8856606 }
163d30ea906Sjfb8856606 
164d30ea906Sjfb8856606 /** MTR object policer action update */
165*4418919fSjohnjiang int
rte_mtr_policer_actions_update(uint16_t port_id,uint32_t mtr_id,uint32_t action_mask,enum rte_mtr_policer_action * actions,struct rte_mtr_error * error)166d30ea906Sjfb8856606 rte_mtr_policer_actions_update(uint16_t port_id,
167d30ea906Sjfb8856606 	uint32_t mtr_id,
168d30ea906Sjfb8856606 	uint32_t action_mask,
169d30ea906Sjfb8856606 	enum rte_mtr_policer_action *actions,
170d30ea906Sjfb8856606 	struct rte_mtr_error *error)
171d30ea906Sjfb8856606 {
172d30ea906Sjfb8856606 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
173d30ea906Sjfb8856606 	return RTE_MTR_FUNC(port_id, policer_actions_update)(dev,
174d30ea906Sjfb8856606 		mtr_id, action_mask, actions, error);
175d30ea906Sjfb8856606 }
176d30ea906Sjfb8856606 
177d30ea906Sjfb8856606 /** MTR object enabled stats update */
178*4418919fSjohnjiang int
rte_mtr_stats_update(uint16_t port_id,uint32_t mtr_id,uint64_t stats_mask,struct rte_mtr_error * error)179d30ea906Sjfb8856606 rte_mtr_stats_update(uint16_t port_id,
180d30ea906Sjfb8856606 	uint32_t mtr_id,
181d30ea906Sjfb8856606 	uint64_t stats_mask,
182d30ea906Sjfb8856606 	struct rte_mtr_error *error)
183d30ea906Sjfb8856606 {
184d30ea906Sjfb8856606 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
185d30ea906Sjfb8856606 	return RTE_MTR_FUNC(port_id, stats_update)(dev,
186d30ea906Sjfb8856606 		mtr_id, stats_mask, error);
187d30ea906Sjfb8856606 }
188d30ea906Sjfb8856606 
189d30ea906Sjfb8856606 /** MTR object stats read */
190*4418919fSjohnjiang int
rte_mtr_stats_read(uint16_t port_id,uint32_t mtr_id,struct rte_mtr_stats * stats,uint64_t * stats_mask,int clear,struct rte_mtr_error * error)191d30ea906Sjfb8856606 rte_mtr_stats_read(uint16_t port_id,
192d30ea906Sjfb8856606 	uint32_t mtr_id,
193d30ea906Sjfb8856606 	struct rte_mtr_stats *stats,
194d30ea906Sjfb8856606 	uint64_t *stats_mask,
195d30ea906Sjfb8856606 	int clear,
196d30ea906Sjfb8856606 	struct rte_mtr_error *error)
197d30ea906Sjfb8856606 {
198d30ea906Sjfb8856606 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
199d30ea906Sjfb8856606 	return RTE_MTR_FUNC(port_id, stats_read)(dev,
200d30ea906Sjfb8856606 		mtr_id, stats, stats_mask, clear, error);
201d30ea906Sjfb8856606 }
202