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