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 "ethdev_trace.h" 9 #include "rte_ethdev.h" 10 #include "rte_mtr_driver.h" 11 #include "rte_mtr.h" 12 13 /* Get generic traffic metering & policing operations structure from a port. */ 14 const struct rte_mtr_ops * 15 rte_mtr_ops_get(uint16_t port_id, struct rte_mtr_error *error) 16 { 17 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 18 const struct rte_mtr_ops *ops; 19 20 if (!rte_eth_dev_is_valid_port(port_id)) { 21 rte_mtr_error_set(error, 22 ENODEV, 23 RTE_MTR_ERROR_TYPE_UNSPECIFIED, 24 NULL, 25 rte_strerror(ENODEV)); 26 return NULL; 27 } 28 29 if ((dev->dev_ops->mtr_ops_get == NULL) || 30 (dev->dev_ops->mtr_ops_get(dev, &ops) != 0) || 31 (ops == NULL)) { 32 rte_mtr_error_set(error, 33 ENOSYS, 34 RTE_MTR_ERROR_TYPE_UNSPECIFIED, 35 NULL, 36 rte_strerror(ENOSYS)); 37 return NULL; 38 } 39 40 return ops; 41 } 42 43 #define RTE_MTR_FUNC(port_id, func) \ 44 ({ \ 45 const struct rte_mtr_ops *ops = \ 46 rte_mtr_ops_get(port_id, error); \ 47 if (ops == NULL) \ 48 return -rte_errno; \ 49 \ 50 if (ops->func == NULL) \ 51 return -rte_mtr_error_set(error, \ 52 ENOSYS, \ 53 RTE_MTR_ERROR_TYPE_UNSPECIFIED, \ 54 NULL, \ 55 rte_strerror(ENOSYS)); \ 56 \ 57 ops->func; \ 58 }) 59 60 #define RTE_MTR_HNDL_FUNC(port_id, func) \ 61 ({ \ 62 const struct rte_mtr_ops *ops = \ 63 rte_mtr_ops_get(port_id, error); \ 64 if (ops == NULL) \ 65 return NULL; \ 66 \ 67 if (ops->func == NULL) { \ 68 rte_mtr_error_set(error, \ 69 ENOSYS, \ 70 RTE_MTR_ERROR_TYPE_UNSPECIFIED, \ 71 NULL, \ 72 rte_strerror(ENOSYS)); \ 73 return NULL; \ 74 } \ 75 \ 76 ops->func; \ 77 }) 78 79 /* MTR capabilities get */ 80 int 81 rte_mtr_capabilities_get(uint16_t port_id, 82 struct rte_mtr_capabilities *cap, 83 struct rte_mtr_error *error) 84 { 85 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 86 int ret; 87 ret = RTE_MTR_FUNC(port_id, capabilities_get)(dev, 88 cap, error); 89 90 rte_mtr_trace_capabilities_get(port_id, cap, ret); 91 92 return ret; 93 } 94 95 /* MTR meter profile add */ 96 int 97 rte_mtr_meter_profile_add(uint16_t port_id, 98 uint32_t meter_profile_id, 99 struct rte_mtr_meter_profile *profile, 100 struct rte_mtr_error *error) 101 { 102 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 103 int ret; 104 ret = RTE_MTR_FUNC(port_id, meter_profile_add)(dev, 105 meter_profile_id, profile, error); 106 107 rte_mtr_trace_meter_profile_add(port_id, meter_profile_id, profile, 108 ret); 109 110 return ret; 111 } 112 113 /** MTR meter profile delete */ 114 int 115 rte_mtr_meter_profile_delete(uint16_t port_id, 116 uint32_t meter_profile_id, 117 struct rte_mtr_error *error) 118 { 119 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 120 int ret; 121 ret = RTE_MTR_FUNC(port_id, meter_profile_delete)(dev, 122 meter_profile_id, error); 123 124 rte_mtr_trace_meter_profile_delete(port_id, meter_profile_id, ret); 125 126 return ret; 127 } 128 129 /** MTR meter profile get */ 130 struct rte_flow_meter_profile * 131 rte_mtr_meter_profile_get(uint16_t port_id, 132 uint32_t meter_profile_id, 133 struct rte_mtr_error *error) 134 { 135 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 136 struct rte_flow_meter_profile *ret; 137 ret = RTE_MTR_HNDL_FUNC(port_id, meter_profile_get)(dev, 138 meter_profile_id, error); 139 140 rte_mtr_trace_meter_profile_get(port_id, meter_profile_id, ret); 141 142 return ret; 143 } 144 145 /* MTR meter policy validate */ 146 int 147 rte_mtr_meter_policy_validate(uint16_t port_id, 148 struct rte_mtr_meter_policy_params *policy, 149 struct rte_mtr_error *error) 150 { 151 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 152 int ret; 153 ret = RTE_MTR_FUNC(port_id, meter_policy_validate)(dev, 154 policy, error); 155 156 rte_mtr_trace_meter_policy_validate(port_id, policy, ret); 157 158 return ret; 159 } 160 161 /* MTR meter policy add */ 162 int 163 rte_mtr_meter_policy_add(uint16_t port_id, 164 uint32_t policy_id, 165 struct rte_mtr_meter_policy_params *policy, 166 struct rte_mtr_error *error) 167 { 168 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 169 int ret; 170 ret = RTE_MTR_FUNC(port_id, meter_policy_add)(dev, 171 policy_id, policy, error); 172 173 rte_mtr_trace_meter_policy_add(port_id, policy_id, policy, ret); 174 175 return ret; 176 } 177 178 /** MTR meter policy delete */ 179 int 180 rte_mtr_meter_policy_delete(uint16_t port_id, 181 uint32_t policy_id, 182 struct rte_mtr_error *error) 183 { 184 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 185 int ret; 186 ret = RTE_MTR_FUNC(port_id, meter_policy_delete)(dev, 187 policy_id, error); 188 189 rte_mtr_trace_meter_policy_delete(port_id, policy_id, ret); 190 191 return ret; 192 } 193 194 /** MTR meter policy get */ 195 struct rte_flow_meter_policy * 196 rte_mtr_meter_policy_get(uint16_t port_id, 197 uint32_t policy_id, 198 struct rte_mtr_error *error) 199 { 200 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 201 struct rte_flow_meter_policy *ret; 202 ret = RTE_MTR_HNDL_FUNC(port_id, meter_policy_get)(dev, 203 policy_id, error); 204 205 rte_mtr_trace_meter_policy_get(port_id, policy_id, ret); 206 207 return ret; 208 } 209 210 /** MTR object create */ 211 int 212 rte_mtr_create(uint16_t port_id, 213 uint32_t mtr_id, 214 struct rte_mtr_params *params, 215 int shared, 216 struct rte_mtr_error *error) 217 { 218 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 219 int ret; 220 ret = RTE_MTR_FUNC(port_id, create)(dev, 221 mtr_id, params, shared, error); 222 223 rte_mtr_trace_create(port_id, mtr_id, params, shared, ret); 224 225 return ret; 226 } 227 228 /** MTR object destroy */ 229 int 230 rte_mtr_destroy(uint16_t port_id, 231 uint32_t mtr_id, 232 struct rte_mtr_error *error) 233 { 234 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 235 int ret; 236 ret = RTE_MTR_FUNC(port_id, destroy)(dev, 237 mtr_id, error); 238 239 rte_mtr_trace_destroy(port_id, mtr_id, ret); 240 241 return ret; 242 } 243 244 /** MTR object meter enable */ 245 int 246 rte_mtr_meter_enable(uint16_t port_id, 247 uint32_t mtr_id, 248 struct rte_mtr_error *error) 249 { 250 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 251 int ret; 252 ret = RTE_MTR_FUNC(port_id, meter_enable)(dev, 253 mtr_id, error); 254 255 rte_mtr_trace_meter_enable(port_id, mtr_id, ret); 256 257 return ret; 258 } 259 260 /** MTR object meter disable */ 261 int 262 rte_mtr_meter_disable(uint16_t port_id, 263 uint32_t mtr_id, 264 struct rte_mtr_error *error) 265 { 266 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 267 int ret; 268 ret = RTE_MTR_FUNC(port_id, meter_disable)(dev, 269 mtr_id, error); 270 271 rte_mtr_trace_meter_disable(port_id, mtr_id, ret); 272 273 return ret; 274 } 275 276 /** MTR object meter profile update */ 277 int 278 rte_mtr_meter_profile_update(uint16_t port_id, 279 uint32_t mtr_id, 280 uint32_t meter_profile_id, 281 struct rte_mtr_error *error) 282 { 283 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 284 int ret; 285 ret = RTE_MTR_FUNC(port_id, meter_profile_update)(dev, 286 mtr_id, meter_profile_id, error); 287 288 rte_mtr_trace_meter_profile_update(port_id, mtr_id, meter_profile_id, ret); 289 290 return ret; 291 } 292 293 /** MTR object meter policy update */ 294 int 295 rte_mtr_meter_policy_update(uint16_t port_id, 296 uint32_t mtr_id, 297 uint32_t meter_policy_id, 298 struct rte_mtr_error *error) 299 { 300 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 301 int ret; 302 ret = RTE_MTR_FUNC(port_id, meter_policy_update)(dev, 303 mtr_id, meter_policy_id, error); 304 305 rte_mtr_trace_meter_policy_update(port_id, mtr_id, meter_policy_id, ret); 306 307 return ret; 308 } 309 310 /** MTR object meter DSCP table update */ 311 int 312 rte_mtr_meter_dscp_table_update(uint16_t port_id, 313 uint32_t mtr_id, enum rte_mtr_color_in_protocol proto, 314 enum rte_color *dscp_table, 315 struct rte_mtr_error *error) 316 { 317 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 318 int ret; 319 ret = RTE_MTR_FUNC(port_id, meter_dscp_table_update)(dev, 320 mtr_id, proto, dscp_table, error); 321 322 rte_mtr_trace_meter_dscp_table_update(port_id, mtr_id, dscp_table, ret); 323 324 return ret; 325 } 326 327 /** MTR object meter VLAN table update */ 328 int 329 rte_mtr_meter_vlan_table_update(uint16_t port_id, 330 uint32_t mtr_id, enum rte_mtr_color_in_protocol proto, 331 enum rte_color *vlan_table, 332 struct rte_mtr_error *error) 333 { 334 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 335 int ret; 336 ret = RTE_MTR_FUNC(port_id, meter_vlan_table_update)(dev, 337 mtr_id, proto, vlan_table, error); 338 339 rte_mtr_trace_meter_vlan_table_update(port_id, mtr_id, vlan_table, ret); 340 341 return ret; 342 } 343 344 /** Set the input color protocol on MTR object */ 345 int 346 rte_mtr_color_in_protocol_set(uint16_t port_id, 347 uint32_t mtr_id, 348 enum rte_mtr_color_in_protocol proto, 349 uint32_t priority, 350 struct rte_mtr_error *error) 351 { 352 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 353 int ret; 354 ret = RTE_MTR_FUNC(port_id, in_proto_set)(dev, 355 mtr_id, proto, priority, error); 356 357 rte_mtr_trace_color_in_protocol_set(port_id, mtr_id, proto, priority, ret); 358 359 return ret; 360 } 361 362 /** Get input color protocols of MTR object */ 363 int 364 rte_mtr_color_in_protocol_get(uint16_t port_id, 365 uint32_t mtr_id, 366 uint64_t *proto_mask, 367 struct rte_mtr_error *error) 368 { 369 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 370 int ret; 371 ret = RTE_MTR_FUNC(port_id, in_proto_get)(dev, 372 mtr_id, proto_mask, error); 373 374 rte_mtr_trace_color_in_protocol_get(port_id, mtr_id, ret); 375 376 return ret; 377 } 378 379 /** Get input color protocol priority of MTR object */ 380 int 381 rte_mtr_color_in_protocol_priority_get(uint16_t port_id, 382 uint32_t mtr_id, 383 enum rte_mtr_color_in_protocol proto, 384 uint32_t *priority, 385 struct rte_mtr_error *error) 386 { 387 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 388 int ret; 389 ret = RTE_MTR_FUNC(port_id, in_proto_prio_get)(dev, 390 mtr_id, proto, priority, error); 391 392 rte_mtr_trace_color_in_protocol_priority_get(port_id, mtr_id, proto, ret); 393 394 return ret; 395 } 396 397 /** MTR object enabled stats update */ 398 int 399 rte_mtr_stats_update(uint16_t port_id, 400 uint32_t mtr_id, 401 uint64_t stats_mask, 402 struct rte_mtr_error *error) 403 { 404 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 405 int ret; 406 ret = RTE_MTR_FUNC(port_id, stats_update)(dev, 407 mtr_id, stats_mask, error); 408 409 rte_mtr_trace_stats_update(port_id, mtr_id, stats_mask, ret); 410 411 return ret; 412 } 413 414 /** MTR object stats read */ 415 int 416 rte_mtr_stats_read(uint16_t port_id, 417 uint32_t mtr_id, 418 struct rte_mtr_stats *stats, 419 uint64_t *stats_mask, 420 int clear, 421 struct rte_mtr_error *error) 422 { 423 struct rte_eth_dev *dev = &rte_eth_devices[port_id]; 424 int ret; 425 ret = RTE_MTR_FUNC(port_id, stats_read)(dev, 426 mtr_id, stats, stats_mask, clear, error); 427 428 rte_mtr_trace_stats_read(port_id, mtr_id, stats, *stats_mask, clear, 429 ret); 430 431 return ret; 432 } 433