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