cfe3aeb170
We had some inconsistencies between functions prototypes and actual definitions. Let's avoid this by only adding the experimental tag to the prototypes. Tests with gcc and clang show it is enough. git grep -l __rte_experimental |grep \.c$ |while read file; do sed -i -e '/^__rte_experimental$/d' $file; sed -i -e 's/ *__rte_experimental//' $file; sed -i -e 's/__rte_experimental *//' $file; done Signed-off-by: David Marchand <david.marchand@redhat.com> Acked-by: Adrien Mazarguil <adrien.mazarguil@6wind.com> Acked-by: Neil Horman <nhorman@tuxdriver.com>
202 lines
4.7 KiB
C
202 lines
4.7 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright(c) 2017 Intel Corporation
|
|
*/
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <rte_errno.h>
|
|
#include "rte_compat.h"
|
|
#include "rte_ethdev.h"
|
|
#include "rte_mtr_driver.h"
|
|
#include "rte_mtr.h"
|
|
|
|
/* Get generic traffic metering & policing operations structure from a port. */
|
|
const struct rte_mtr_ops *
|
|
rte_mtr_ops_get(uint16_t port_id, struct rte_mtr_error *error)
|
|
{
|
|
struct rte_eth_dev *dev = &rte_eth_devices[port_id];
|
|
const struct rte_mtr_ops *ops;
|
|
|
|
if (!rte_eth_dev_is_valid_port(port_id)) {
|
|
rte_mtr_error_set(error,
|
|
ENODEV,
|
|
RTE_MTR_ERROR_TYPE_UNSPECIFIED,
|
|
NULL,
|
|
rte_strerror(ENODEV));
|
|
return NULL;
|
|
}
|
|
|
|
if ((dev->dev_ops->mtr_ops_get == NULL) ||
|
|
(dev->dev_ops->mtr_ops_get(dev, &ops) != 0) ||
|
|
(ops == NULL)) {
|
|
rte_mtr_error_set(error,
|
|
ENOSYS,
|
|
RTE_MTR_ERROR_TYPE_UNSPECIFIED,
|
|
NULL,
|
|
rte_strerror(ENOSYS));
|
|
return NULL;
|
|
}
|
|
|
|
return ops;
|
|
}
|
|
|
|
#define RTE_MTR_FUNC(port_id, func) \
|
|
({ \
|
|
const struct rte_mtr_ops *ops = \
|
|
rte_mtr_ops_get(port_id, error); \
|
|
if (ops == NULL) \
|
|
return -rte_errno; \
|
|
\
|
|
if (ops->func == NULL) \
|
|
return -rte_mtr_error_set(error, \
|
|
ENOSYS, \
|
|
RTE_MTR_ERROR_TYPE_UNSPECIFIED, \
|
|
NULL, \
|
|
rte_strerror(ENOSYS)); \
|
|
\
|
|
ops->func; \
|
|
})
|
|
|
|
/* MTR capabilities get */
|
|
int
|
|
rte_mtr_capabilities_get(uint16_t port_id,
|
|
struct rte_mtr_capabilities *cap,
|
|
struct rte_mtr_error *error)
|
|
{
|
|
struct rte_eth_dev *dev = &rte_eth_devices[port_id];
|
|
return RTE_MTR_FUNC(port_id, capabilities_get)(dev,
|
|
cap, error);
|
|
}
|
|
|
|
/* MTR meter profile add */
|
|
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)
|
|
{
|
|
struct rte_eth_dev *dev = &rte_eth_devices[port_id];
|
|
return RTE_MTR_FUNC(port_id, meter_profile_add)(dev,
|
|
meter_profile_id, profile, error);
|
|
}
|
|
|
|
/** MTR meter profile delete */
|
|
int
|
|
rte_mtr_meter_profile_delete(uint16_t port_id,
|
|
uint32_t meter_profile_id,
|
|
struct rte_mtr_error *error)
|
|
{
|
|
struct rte_eth_dev *dev = &rte_eth_devices[port_id];
|
|
return RTE_MTR_FUNC(port_id, meter_profile_delete)(dev,
|
|
meter_profile_id, error);
|
|
}
|
|
|
|
/** MTR object create */
|
|
int
|
|
rte_mtr_create(uint16_t port_id,
|
|
uint32_t mtr_id,
|
|
struct rte_mtr_params *params,
|
|
int shared,
|
|
struct rte_mtr_error *error)
|
|
{
|
|
struct rte_eth_dev *dev = &rte_eth_devices[port_id];
|
|
return RTE_MTR_FUNC(port_id, create)(dev,
|
|
mtr_id, params, shared, error);
|
|
}
|
|
|
|
/** MTR object destroy */
|
|
int
|
|
rte_mtr_destroy(uint16_t port_id,
|
|
uint32_t mtr_id,
|
|
struct rte_mtr_error *error)
|
|
{
|
|
struct rte_eth_dev *dev = &rte_eth_devices[port_id];
|
|
return RTE_MTR_FUNC(port_id, destroy)(dev,
|
|
mtr_id, error);
|
|
}
|
|
|
|
/** MTR object meter enable */
|
|
int
|
|
rte_mtr_meter_enable(uint16_t port_id,
|
|
uint32_t mtr_id,
|
|
struct rte_mtr_error *error)
|
|
{
|
|
struct rte_eth_dev *dev = &rte_eth_devices[port_id];
|
|
return RTE_MTR_FUNC(port_id, meter_enable)(dev,
|
|
mtr_id, error);
|
|
}
|
|
|
|
/** MTR object meter disable */
|
|
int
|
|
rte_mtr_meter_disable(uint16_t port_id,
|
|
uint32_t mtr_id,
|
|
struct rte_mtr_error *error)
|
|
{
|
|
struct rte_eth_dev *dev = &rte_eth_devices[port_id];
|
|
return RTE_MTR_FUNC(port_id, meter_disable)(dev,
|
|
mtr_id, error);
|
|
}
|
|
|
|
/** MTR object meter profile update */
|
|
int
|
|
rte_mtr_meter_profile_update(uint16_t port_id,
|
|
uint32_t mtr_id,
|
|
uint32_t meter_profile_id,
|
|
struct rte_mtr_error *error)
|
|
{
|
|
struct rte_eth_dev *dev = &rte_eth_devices[port_id];
|
|
return RTE_MTR_FUNC(port_id, meter_profile_update)(dev,
|
|
mtr_id, meter_profile_id, error);
|
|
}
|
|
|
|
/** MTR object meter DSCP table update */
|
|
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)
|
|
{
|
|
struct rte_eth_dev *dev = &rte_eth_devices[port_id];
|
|
return RTE_MTR_FUNC(port_id, meter_dscp_table_update)(dev,
|
|
mtr_id, dscp_table, error);
|
|
}
|
|
|
|
/** MTR object policer action update */
|
|
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)
|
|
{
|
|
struct rte_eth_dev *dev = &rte_eth_devices[port_id];
|
|
return RTE_MTR_FUNC(port_id, policer_actions_update)(dev,
|
|
mtr_id, action_mask, actions, error);
|
|
}
|
|
|
|
/** MTR object enabled stats update */
|
|
int
|
|
rte_mtr_stats_update(uint16_t port_id,
|
|
uint32_t mtr_id,
|
|
uint64_t stats_mask,
|
|
struct rte_mtr_error *error)
|
|
{
|
|
struct rte_eth_dev *dev = &rte_eth_devices[port_id];
|
|
return RTE_MTR_FUNC(port_id, stats_update)(dev,
|
|
mtr_id, stats_mask, error);
|
|
}
|
|
|
|
/** MTR object stats read */
|
|
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)
|
|
{
|
|
struct rte_eth_dev *dev = &rte_eth_devices[port_id];
|
|
return RTE_MTR_FUNC(port_id, stats_read)(dev,
|
|
mtr_id, stats, stats_mask, clear, error);
|
|
}
|