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