xref: /dpdk/lib/ethdev/rte_mtr.c (revision 5f0d54f3)
199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
299a2dd95SBruce Richardson  * Copyright(c) 2017 Intel Corporation
399a2dd95SBruce Richardson  */
499a2dd95SBruce Richardson 
599a2dd95SBruce Richardson #include <stdint.h>
699a2dd95SBruce Richardson 
799a2dd95SBruce Richardson #include <rte_errno.h>
899a2dd95SBruce Richardson #include "rte_compat.h"
999a2dd95SBruce Richardson #include "rte_ethdev.h"
1099a2dd95SBruce Richardson #include "rte_mtr_driver.h"
1199a2dd95SBruce Richardson #include "rte_mtr.h"
1299a2dd95SBruce Richardson 
1399a2dd95SBruce Richardson /* Get generic traffic metering & policing operations structure from a port. */
1499a2dd95SBruce Richardson const struct rte_mtr_ops *
rte_mtr_ops_get(uint16_t port_id,struct rte_mtr_error * error)1599a2dd95SBruce Richardson rte_mtr_ops_get(uint16_t port_id, struct rte_mtr_error *error)
1699a2dd95SBruce Richardson {
1799a2dd95SBruce Richardson 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
1899a2dd95SBruce Richardson 	const struct rte_mtr_ops *ops;
1999a2dd95SBruce Richardson 
2099a2dd95SBruce Richardson 	if (!rte_eth_dev_is_valid_port(port_id)) {
2199a2dd95SBruce Richardson 		rte_mtr_error_set(error,
2299a2dd95SBruce Richardson 			ENODEV,
2399a2dd95SBruce Richardson 			RTE_MTR_ERROR_TYPE_UNSPECIFIED,
2499a2dd95SBruce Richardson 			NULL,
2599a2dd95SBruce Richardson 			rte_strerror(ENODEV));
2699a2dd95SBruce Richardson 		return NULL;
2799a2dd95SBruce Richardson 	}
2899a2dd95SBruce Richardson 
2999a2dd95SBruce Richardson 	if ((dev->dev_ops->mtr_ops_get == NULL) ||
3099a2dd95SBruce Richardson 		(dev->dev_ops->mtr_ops_get(dev, &ops) != 0) ||
3199a2dd95SBruce Richardson 		(ops == NULL)) {
3299a2dd95SBruce Richardson 		rte_mtr_error_set(error,
3399a2dd95SBruce Richardson 			ENOSYS,
3499a2dd95SBruce Richardson 			RTE_MTR_ERROR_TYPE_UNSPECIFIED,
3599a2dd95SBruce Richardson 			NULL,
3699a2dd95SBruce Richardson 			rte_strerror(ENOSYS));
3799a2dd95SBruce Richardson 		return NULL;
3899a2dd95SBruce Richardson 	}
3999a2dd95SBruce Richardson 
4099a2dd95SBruce Richardson 	return ops;
4199a2dd95SBruce Richardson }
4299a2dd95SBruce Richardson 
4399a2dd95SBruce Richardson #define RTE_MTR_FUNC(port_id, func)			\
4499a2dd95SBruce Richardson ({							\
4599a2dd95SBruce Richardson 	const struct rte_mtr_ops *ops =			\
4699a2dd95SBruce Richardson 		rte_mtr_ops_get(port_id, error);		\
4799a2dd95SBruce Richardson 	if (ops == NULL)					\
4899a2dd95SBruce Richardson 		return -rte_errno;			\
4999a2dd95SBruce Richardson 							\
5099a2dd95SBruce Richardson 	if (ops->func == NULL)				\
5199a2dd95SBruce Richardson 		return -rte_mtr_error_set(error,		\
5299a2dd95SBruce Richardson 			ENOSYS,				\
5399a2dd95SBruce Richardson 			RTE_MTR_ERROR_TYPE_UNSPECIFIED,	\
5499a2dd95SBruce Richardson 			NULL,				\
5599a2dd95SBruce Richardson 			rte_strerror(ENOSYS));		\
5699a2dd95SBruce Richardson 							\
5799a2dd95SBruce Richardson 	ops->func;					\
5899a2dd95SBruce Richardson })
5999a2dd95SBruce Richardson 
6099a2dd95SBruce Richardson /* MTR capabilities get */
6199a2dd95SBruce Richardson int
rte_mtr_capabilities_get(uint16_t port_id,struct rte_mtr_capabilities * cap,struct rte_mtr_error * error)6299a2dd95SBruce Richardson rte_mtr_capabilities_get(uint16_t port_id,
6399a2dd95SBruce Richardson 	struct rte_mtr_capabilities *cap,
6499a2dd95SBruce Richardson 	struct rte_mtr_error *error)
6599a2dd95SBruce Richardson {
6699a2dd95SBruce Richardson 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
6799a2dd95SBruce Richardson 	return RTE_MTR_FUNC(port_id, capabilities_get)(dev,
6899a2dd95SBruce Richardson 		cap, error);
6999a2dd95SBruce Richardson }
7099a2dd95SBruce Richardson 
7199a2dd95SBruce Richardson /* MTR meter profile add */
7299a2dd95SBruce Richardson 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)7399a2dd95SBruce Richardson rte_mtr_meter_profile_add(uint16_t port_id,
7499a2dd95SBruce Richardson 	uint32_t meter_profile_id,
7599a2dd95SBruce Richardson 	struct rte_mtr_meter_profile *profile,
7699a2dd95SBruce Richardson 	struct rte_mtr_error *error)
7799a2dd95SBruce Richardson {
7899a2dd95SBruce Richardson 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
7999a2dd95SBruce Richardson 	return RTE_MTR_FUNC(port_id, meter_profile_add)(dev,
8099a2dd95SBruce Richardson 		meter_profile_id, profile, error);
8199a2dd95SBruce Richardson }
8299a2dd95SBruce Richardson 
8399a2dd95SBruce Richardson /** MTR meter profile delete */
8499a2dd95SBruce Richardson int
rte_mtr_meter_profile_delete(uint16_t port_id,uint32_t meter_profile_id,struct rte_mtr_error * error)8599a2dd95SBruce Richardson rte_mtr_meter_profile_delete(uint16_t port_id,
8699a2dd95SBruce Richardson 	uint32_t meter_profile_id,
8799a2dd95SBruce Richardson 	struct rte_mtr_error *error)
8899a2dd95SBruce Richardson {
8999a2dd95SBruce Richardson 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
9099a2dd95SBruce Richardson 	return RTE_MTR_FUNC(port_id, meter_profile_delete)(dev,
9199a2dd95SBruce Richardson 		meter_profile_id, error);
9299a2dd95SBruce Richardson }
9399a2dd95SBruce Richardson 
94*5f0d54f3SLi Zhang /* MTR meter policy validate */
95*5f0d54f3SLi Zhang int
rte_mtr_meter_policy_validate(uint16_t port_id,struct rte_mtr_meter_policy_params * policy,struct rte_mtr_error * error)96*5f0d54f3SLi Zhang rte_mtr_meter_policy_validate(uint16_t port_id,
97*5f0d54f3SLi Zhang 	struct rte_mtr_meter_policy_params *policy,
98*5f0d54f3SLi Zhang 	struct rte_mtr_error *error)
99*5f0d54f3SLi Zhang {
100*5f0d54f3SLi Zhang 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
101*5f0d54f3SLi Zhang 	return RTE_MTR_FUNC(port_id, meter_policy_validate)(dev,
102*5f0d54f3SLi Zhang 		policy, error);
103*5f0d54f3SLi Zhang }
104*5f0d54f3SLi Zhang 
105*5f0d54f3SLi Zhang /* MTR meter policy add */
106*5f0d54f3SLi Zhang int
rte_mtr_meter_policy_add(uint16_t port_id,uint32_t policy_id,struct rte_mtr_meter_policy_params * policy,struct rte_mtr_error * error)107*5f0d54f3SLi Zhang rte_mtr_meter_policy_add(uint16_t port_id,
108*5f0d54f3SLi Zhang 	uint32_t policy_id,
109*5f0d54f3SLi Zhang 	struct rte_mtr_meter_policy_params *policy,
110*5f0d54f3SLi Zhang 	struct rte_mtr_error *error)
111*5f0d54f3SLi Zhang {
112*5f0d54f3SLi Zhang 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
113*5f0d54f3SLi Zhang 	return RTE_MTR_FUNC(port_id, meter_policy_add)(dev,
114*5f0d54f3SLi Zhang 		policy_id, policy, error);
115*5f0d54f3SLi Zhang }
116*5f0d54f3SLi Zhang 
117*5f0d54f3SLi Zhang /** MTR meter policy delete */
118*5f0d54f3SLi Zhang int
rte_mtr_meter_policy_delete(uint16_t port_id,uint32_t policy_id,struct rte_mtr_error * error)119*5f0d54f3SLi Zhang rte_mtr_meter_policy_delete(uint16_t port_id,
120*5f0d54f3SLi Zhang 	uint32_t policy_id,
121*5f0d54f3SLi Zhang 	struct rte_mtr_error *error)
122*5f0d54f3SLi Zhang {
123*5f0d54f3SLi Zhang 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
124*5f0d54f3SLi Zhang 	return RTE_MTR_FUNC(port_id, meter_policy_delete)(dev,
125*5f0d54f3SLi Zhang 		policy_id, error);
126*5f0d54f3SLi Zhang }
127*5f0d54f3SLi Zhang 
12899a2dd95SBruce Richardson /** MTR object create */
12999a2dd95SBruce Richardson int
rte_mtr_create(uint16_t port_id,uint32_t mtr_id,struct rte_mtr_params * params,int shared,struct rte_mtr_error * error)13099a2dd95SBruce Richardson rte_mtr_create(uint16_t port_id,
13199a2dd95SBruce Richardson 	uint32_t mtr_id,
13299a2dd95SBruce Richardson 	struct rte_mtr_params *params,
13399a2dd95SBruce Richardson 	int shared,
13499a2dd95SBruce Richardson 	struct rte_mtr_error *error)
13599a2dd95SBruce Richardson {
13699a2dd95SBruce Richardson 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
13799a2dd95SBruce Richardson 	return RTE_MTR_FUNC(port_id, create)(dev,
13899a2dd95SBruce Richardson 		mtr_id, params, shared, error);
13999a2dd95SBruce Richardson }
14099a2dd95SBruce Richardson 
14199a2dd95SBruce Richardson /** MTR object destroy */
14299a2dd95SBruce Richardson int
rte_mtr_destroy(uint16_t port_id,uint32_t mtr_id,struct rte_mtr_error * error)14399a2dd95SBruce Richardson rte_mtr_destroy(uint16_t port_id,
14499a2dd95SBruce Richardson 	uint32_t mtr_id,
14599a2dd95SBruce Richardson 	struct rte_mtr_error *error)
14699a2dd95SBruce Richardson {
14799a2dd95SBruce Richardson 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
14899a2dd95SBruce Richardson 	return RTE_MTR_FUNC(port_id, destroy)(dev,
14999a2dd95SBruce Richardson 		mtr_id, error);
15099a2dd95SBruce Richardson }
15199a2dd95SBruce Richardson 
15299a2dd95SBruce Richardson /** MTR object meter enable */
15399a2dd95SBruce Richardson int
rte_mtr_meter_enable(uint16_t port_id,uint32_t mtr_id,struct rte_mtr_error * error)15499a2dd95SBruce Richardson rte_mtr_meter_enable(uint16_t port_id,
15599a2dd95SBruce Richardson 	uint32_t mtr_id,
15699a2dd95SBruce Richardson 	struct rte_mtr_error *error)
15799a2dd95SBruce Richardson {
15899a2dd95SBruce Richardson 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
15999a2dd95SBruce Richardson 	return RTE_MTR_FUNC(port_id, meter_enable)(dev,
16099a2dd95SBruce Richardson 		mtr_id, error);
16199a2dd95SBruce Richardson }
16299a2dd95SBruce Richardson 
16399a2dd95SBruce Richardson /** MTR object meter disable */
16499a2dd95SBruce Richardson int
rte_mtr_meter_disable(uint16_t port_id,uint32_t mtr_id,struct rte_mtr_error * error)16599a2dd95SBruce Richardson rte_mtr_meter_disable(uint16_t port_id,
16699a2dd95SBruce Richardson 	uint32_t mtr_id,
16799a2dd95SBruce Richardson 	struct rte_mtr_error *error)
16899a2dd95SBruce Richardson {
16999a2dd95SBruce Richardson 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
17099a2dd95SBruce Richardson 	return RTE_MTR_FUNC(port_id, meter_disable)(dev,
17199a2dd95SBruce Richardson 		mtr_id, error);
17299a2dd95SBruce Richardson }
17399a2dd95SBruce Richardson 
17499a2dd95SBruce Richardson /** MTR object meter profile update */
17599a2dd95SBruce Richardson int
rte_mtr_meter_profile_update(uint16_t port_id,uint32_t mtr_id,uint32_t meter_profile_id,struct rte_mtr_error * error)17699a2dd95SBruce Richardson rte_mtr_meter_profile_update(uint16_t port_id,
17799a2dd95SBruce Richardson 	uint32_t mtr_id,
17899a2dd95SBruce Richardson 	uint32_t meter_profile_id,
17999a2dd95SBruce Richardson 	struct rte_mtr_error *error)
18099a2dd95SBruce Richardson {
18199a2dd95SBruce Richardson 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
18299a2dd95SBruce Richardson 	return RTE_MTR_FUNC(port_id, meter_profile_update)(dev,
18399a2dd95SBruce Richardson 		mtr_id, meter_profile_id, error);
18499a2dd95SBruce Richardson }
18599a2dd95SBruce Richardson 
186*5f0d54f3SLi Zhang /** MTR object meter policy update */
187*5f0d54f3SLi Zhang int
rte_mtr_meter_policy_update(uint16_t port_id,uint32_t mtr_id,uint32_t meter_policy_id,struct rte_mtr_error * error)188*5f0d54f3SLi Zhang rte_mtr_meter_policy_update(uint16_t port_id,
189*5f0d54f3SLi Zhang 	uint32_t mtr_id,
190*5f0d54f3SLi Zhang 	uint32_t meter_policy_id,
191*5f0d54f3SLi Zhang 	struct rte_mtr_error *error)
192*5f0d54f3SLi Zhang {
193*5f0d54f3SLi Zhang 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
194*5f0d54f3SLi Zhang 	return RTE_MTR_FUNC(port_id, meter_policy_update)(dev,
195*5f0d54f3SLi Zhang 		mtr_id, meter_policy_id, error);
196*5f0d54f3SLi Zhang }
197*5f0d54f3SLi Zhang 
19899a2dd95SBruce Richardson /** MTR object meter DSCP table update */
19999a2dd95SBruce Richardson 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)20099a2dd95SBruce Richardson rte_mtr_meter_dscp_table_update(uint16_t port_id,
20199a2dd95SBruce Richardson 	uint32_t mtr_id,
20299a2dd95SBruce Richardson 	enum rte_color *dscp_table,
20399a2dd95SBruce Richardson 	struct rte_mtr_error *error)
20499a2dd95SBruce Richardson {
20599a2dd95SBruce Richardson 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
20699a2dd95SBruce Richardson 	return RTE_MTR_FUNC(port_id, meter_dscp_table_update)(dev,
20799a2dd95SBruce Richardson 		mtr_id, dscp_table, error);
20899a2dd95SBruce Richardson }
20999a2dd95SBruce Richardson 
21099a2dd95SBruce Richardson /** MTR object enabled stats update */
21199a2dd95SBruce Richardson int
rte_mtr_stats_update(uint16_t port_id,uint32_t mtr_id,uint64_t stats_mask,struct rte_mtr_error * error)21299a2dd95SBruce Richardson rte_mtr_stats_update(uint16_t port_id,
21399a2dd95SBruce Richardson 	uint32_t mtr_id,
21499a2dd95SBruce Richardson 	uint64_t stats_mask,
21599a2dd95SBruce Richardson 	struct rte_mtr_error *error)
21699a2dd95SBruce Richardson {
21799a2dd95SBruce Richardson 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
21899a2dd95SBruce Richardson 	return RTE_MTR_FUNC(port_id, stats_update)(dev,
21999a2dd95SBruce Richardson 		mtr_id, stats_mask, error);
22099a2dd95SBruce Richardson }
22199a2dd95SBruce Richardson 
22299a2dd95SBruce Richardson /** MTR object stats read */
22399a2dd95SBruce Richardson 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)22499a2dd95SBruce Richardson rte_mtr_stats_read(uint16_t port_id,
22599a2dd95SBruce Richardson 	uint32_t mtr_id,
22699a2dd95SBruce Richardson 	struct rte_mtr_stats *stats,
22799a2dd95SBruce Richardson 	uint64_t *stats_mask,
22899a2dd95SBruce Richardson 	int clear,
22999a2dd95SBruce Richardson 	struct rte_mtr_error *error)
23099a2dd95SBruce Richardson {
23199a2dd95SBruce Richardson 	struct rte_eth_dev *dev = &rte_eth_devices[port_id];
23299a2dd95SBruce Richardson 	return RTE_MTR_FUNC(port_id, stats_read)(dev,
23399a2dd95SBruce Richardson 		mtr_id, stats, stats_mask, clear, error);
23499a2dd95SBruce Richardson }
235