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 meter policy validate */ 94 int 95 rte_mtr_meter_policy_validate(uint16_t port_id, 96 struct rte_mtr_meter_policy_params *policy, 97 struct rte_mtr_error *error) 98 { 99 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 100 return RTE_MTR_FUNC(port_id, meter_policy_validate)(dev, 101 policy, error); 102 } 103 104 /* MTR meter policy add */ 105 int 106 rte_mtr_meter_policy_add(uint16_t port_id, 107 uint32_t policy_id, 108 struct rte_mtr_meter_policy_params *policy, 109 struct rte_mtr_error *error) 110 { 111 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 112 return RTE_MTR_FUNC(port_id, meter_policy_add)(dev, 113 policy_id, policy, error); 114 } 115 116 /** MTR meter policy delete */ 117 int 118 rte_mtr_meter_policy_delete(uint16_t port_id, 119 uint32_t policy_id, 120 struct rte_mtr_error *error) 121 { 122 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 123 return RTE_MTR_FUNC(port_id, meter_policy_delete)(dev, 124 policy_id, error); 125 } 126 127 /** MTR object create */ 128 int 129 rte_mtr_create(uint16_t port_id, 130 uint32_t mtr_id, 131 struct rte_mtr_params *params, 132 int shared, 133 struct rte_mtr_error *error) 134 { 135 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 136 return RTE_MTR_FUNC(port_id, create)(dev, 137 mtr_id, params, shared, error); 138 } 139 140 /** MTR object destroy */ 141 int 142 rte_mtr_destroy(uint16_t port_id, 143 uint32_t mtr_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, destroy)(dev, 148 mtr_id, error); 149 } 150 151 /** MTR object meter enable */ 152 int 153 rte_mtr_meter_enable(uint16_t port_id, 154 uint32_t mtr_id, 155 struct rte_mtr_error *error) 156 { 157 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 158 return RTE_MTR_FUNC(port_id, meter_enable)(dev, 159 mtr_id, error); 160 } 161 162 /** MTR object meter disable */ 163 int 164 rte_mtr_meter_disable(uint16_t port_id, 165 uint32_t mtr_id, 166 struct rte_mtr_error *error) 167 { 168 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 169 return RTE_MTR_FUNC(port_id, meter_disable)(dev, 170 mtr_id, error); 171 } 172 173 /** MTR object meter profile update */ 174 int 175 rte_mtr_meter_profile_update(uint16_t port_id, 176 uint32_t mtr_id, 177 uint32_t meter_profile_id, 178 struct rte_mtr_error *error) 179 { 180 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 181 return RTE_MTR_FUNC(port_id, meter_profile_update)(dev, 182 mtr_id, meter_profile_id, error); 183 } 184 185 /** MTR object meter policy update */ 186 int 187 rte_mtr_meter_policy_update(uint16_t port_id, 188 uint32_t mtr_id, 189 uint32_t meter_policy_id, 190 struct rte_mtr_error *error) 191 { 192 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 193 return RTE_MTR_FUNC(port_id, meter_policy_update)(dev, 194 mtr_id, meter_policy_id, error); 195 } 196 197 /** MTR object meter DSCP table update */ 198 int 199 rte_mtr_meter_dscp_table_update(uint16_t port_id, 200 uint32_t mtr_id, 201 enum rte_color *dscp_table, 202 struct rte_mtr_error *error) 203 { 204 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 205 return RTE_MTR_FUNC(port_id, meter_dscp_table_update)(dev, 206 mtr_id, dscp_table, error); 207 } 208 209 /** MTR object meter VLAN table update */ 210 int 211 rte_mtr_meter_vlan_table_update(uint16_t port_id, 212 uint32_t mtr_id, 213 enum rte_color *vlan_table, 214 struct rte_mtr_error *error) 215 { 216 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 217 return RTE_MTR_FUNC(port_id, meter_vlan_table_update)(dev, 218 mtr_id, vlan_table, error); 219 } 220 221 /** Set the input color protocol on MTR object */ 222 int 223 rte_mtr_color_in_protocol_set(uint16_t port_id, 224 uint32_t mtr_id, 225 enum rte_mtr_color_in_protocol proto, 226 uint32_t priority, 227 struct rte_mtr_error *error) 228 { 229 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 230 return RTE_MTR_FUNC(port_id, in_proto_set)(dev, 231 mtr_id, proto, priority, error); 232 } 233 234 /** Get input color protocols of MTR object */ 235 int 236 rte_mtr_color_in_protocol_get(uint16_t port_id, 237 uint32_t mtr_id, 238 uint64_t *proto_mask, 239 struct rte_mtr_error *error) 240 { 241 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 242 return RTE_MTR_FUNC(port_id, in_proto_get)(dev, 243 mtr_id, proto_mask, error); 244 } 245 246 /** Get input color protocol priority of MTR object */ 247 int 248 rte_mtr_color_in_protocol_priority_get(uint16_t port_id, 249 uint32_t mtr_id, 250 enum rte_mtr_color_in_protocol proto, 251 uint32_t *priority, 252 struct rte_mtr_error *error) 253 { 254 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 255 return RTE_MTR_FUNC(port_id, in_proto_prio_get)(dev, 256 mtr_id, proto, priority, error); 257 } 258 259 /** MTR object enabled stats update */ 260 int 261 rte_mtr_stats_update(uint16_t port_id, 262 uint32_t mtr_id, 263 uint64_t stats_mask, 264 struct rte_mtr_error *error) 265 { 266 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 267 return RTE_MTR_FUNC(port_id, stats_update)(dev, 268 mtr_id, stats_mask, error); 269 } 270 271 /** MTR object stats read */ 272 int 273 rte_mtr_stats_read(uint16_t port_id, 274 uint32_t mtr_id, 275 struct rte_mtr_stats *stats, 276 uint64_t *stats_mask, 277 int clear, 278 struct rte_mtr_error *error) 279 { 280 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 281 return RTE_MTR_FUNC(port_id, stats_read)(dev, 282 mtr_id, stats, stats_mask, clear, error); 283 } 284