mirror of https://github.com/F-Stack/f-stack.git
429 lines
9.1 KiB
C
429 lines
9.1 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright 2020 Mellanox Technologies, Ltd
|
|
*/
|
|
|
|
#ifndef RTE_PMD_MLX5_FLOW_OS_H_
|
|
#define RTE_PMD_MLX5_FLOW_OS_H_
|
|
|
|
#include "mlx5_flow.h"
|
|
#include "mlx5_malloc.h"
|
|
|
|
#if defined(HAVE_IBV_FLOW_DV_SUPPORT) || !defined(HAVE_INFINIBAND_VERBS_H)
|
|
extern const struct mlx5_flow_driver_ops mlx5_flow_dv_drv_ops;
|
|
#endif
|
|
|
|
/**
|
|
* Get OS enforced flow type. MLX5_FLOW_TYPE_MAX means "non enforced type".
|
|
*
|
|
* @return
|
|
* Flow type (MLX5_FLOW_TYPE_MAX)
|
|
*/
|
|
static inline enum mlx5_flow_drv_type
|
|
mlx5_flow_os_get_type(void)
|
|
{
|
|
return MLX5_FLOW_TYPE_DV;
|
|
}
|
|
|
|
/**
|
|
* Check if item type is supported.
|
|
*
|
|
* @param item
|
|
* Item type to check.
|
|
*
|
|
* @return
|
|
* True is this item type is supported, false if not supported.
|
|
*/
|
|
static inline bool
|
|
mlx5_flow_os_item_supported(int item)
|
|
{
|
|
switch (item) {
|
|
case RTE_FLOW_ITEM_TYPE_END:
|
|
case RTE_FLOW_ITEM_TYPE_VOID:
|
|
case RTE_FLOW_ITEM_TYPE_ETH:
|
|
case RTE_FLOW_ITEM_TYPE_IPV4:
|
|
case RTE_FLOW_ITEM_TYPE_UDP:
|
|
case RTE_FLOW_ITEM_TYPE_TCP:
|
|
case RTE_FLOW_ITEM_TYPE_IPV6:
|
|
case RTE_FLOW_ITEM_TYPE_VLAN:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check if action type is supported.
|
|
*
|
|
* @param action
|
|
* Action type to check.
|
|
*
|
|
* @return
|
|
* True is this action type is supported, false if not supported.
|
|
*/
|
|
static inline bool
|
|
mlx5_flow_os_action_supported(int action)
|
|
{
|
|
switch (action) {
|
|
case RTE_FLOW_ACTION_TYPE_END:
|
|
case RTE_FLOW_ACTION_TYPE_VOID:
|
|
case RTE_FLOW_ACTION_TYPE_QUEUE:
|
|
case RTE_FLOW_ACTION_TYPE_RSS:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Create flow table.
|
|
*
|
|
* @param[in] domain
|
|
* Pointer to relevant domain.
|
|
* @param[in] table_id
|
|
* Table ID.
|
|
* @param[out] table
|
|
* NULL (no table object required)
|
|
*
|
|
* @return
|
|
* 0 if table_id is 0, negative value otherwise and errno is set.
|
|
*/
|
|
static inline int
|
|
mlx5_flow_os_create_flow_tbl(void *domain, uint32_t table_id, void **table)
|
|
{
|
|
RTE_SET_USED(domain);
|
|
*table = NULL;
|
|
if (table_id) {
|
|
rte_errno = ENOTSUP;
|
|
return -rte_errno;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Destroy flow table.
|
|
*
|
|
* @param table
|
|
* Pointer to table to destroy.
|
|
*
|
|
* @return
|
|
* 0 on success (silently ignored).
|
|
*/
|
|
static inline int
|
|
mlx5_flow_os_destroy_flow_tbl(void *table)
|
|
{
|
|
RTE_SET_USED(table);
|
|
/* Silently ignore */
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Create flow action: packet reformat.
|
|
*
|
|
* @param[in] ctx
|
|
* Pointer to relevant device context.
|
|
* @param[in] domain
|
|
* Pointer to domain handler.
|
|
* @param[in] resource
|
|
* Pointer to action data resource.
|
|
* @param[out] action
|
|
* Pointer to a valid action on success, NULL otherwise.
|
|
*
|
|
*
|
|
* @return
|
|
* 0 on success, or negative value on failure and errno is set.
|
|
*/
|
|
static inline int
|
|
mlx5_flow_os_create_flow_action_packet_reformat(void *ctx, void *domain,
|
|
void *resource, void **action)
|
|
{
|
|
RTE_SET_USED(ctx);
|
|
RTE_SET_USED(domain);
|
|
RTE_SET_USED(resource);
|
|
RTE_SET_USED(action);
|
|
rte_errno = ENOTSUP;
|
|
return -rte_errno;
|
|
}
|
|
|
|
/**
|
|
* Create flow action: modify header.
|
|
*
|
|
* @param[in] ctx
|
|
* Pointer to relevant device context.
|
|
* @param[in] domain
|
|
* Pointer to domain handler.
|
|
* @param[in] resource
|
|
* Pointer to action data resource.
|
|
* @param[in] actions_len
|
|
* Total length of actions data in resource.
|
|
* @param[out] action
|
|
* Pointer to a valid action on success, NULL otherwise.
|
|
*
|
|
*
|
|
* @return
|
|
* 0 on success, or -1 on failure and errno is set.
|
|
*/
|
|
static inline int
|
|
mlx5_flow_os_create_flow_action_modify_header(void *ctx,
|
|
void *domain,
|
|
void *resource,
|
|
uint32_t actions_len,
|
|
void **action)
|
|
{
|
|
RTE_SET_USED(ctx);
|
|
RTE_SET_USED(domain);
|
|
RTE_SET_USED(resource);
|
|
RTE_SET_USED(actions_len);
|
|
RTE_SET_USED(action);
|
|
rte_errno = ENOTSUP;
|
|
return -rte_errno;
|
|
}
|
|
|
|
/**
|
|
* Create flow action: destination flow table.
|
|
*
|
|
* @param[in] tbl_obj
|
|
* Pointer to destination table object.
|
|
* @param[out] action
|
|
* Pointer to a valid action on success, NULL otherwise.
|
|
*
|
|
* @return
|
|
* 0 on success, or negative value on failure and errno is set.
|
|
*/
|
|
static inline int
|
|
mlx5_flow_os_create_flow_action_dest_flow_tbl(void *tbl_obj, void **action)
|
|
{
|
|
RTE_SET_USED(tbl_obj);
|
|
RTE_SET_USED(action);
|
|
rte_errno = ENOTSUP;
|
|
return -rte_errno;
|
|
}
|
|
|
|
/**
|
|
* Create flow action: destination port.
|
|
*
|
|
* @param[in] domain
|
|
* Pointer to domain handler.
|
|
* @param[in] port_id
|
|
* Destination port ID.
|
|
* @param[out] action
|
|
* Pointer to a valid action on success, NULL otherwise.
|
|
*
|
|
* @return
|
|
* 0 on success, or negative value on failure and errno is set.
|
|
*/
|
|
static inline int
|
|
mlx5_flow_os_create_flow_action_dest_port(void *domain, uint32_t port_id,
|
|
void **action)
|
|
{
|
|
RTE_SET_USED(domain);
|
|
RTE_SET_USED(port_id);
|
|
*action = NULL;
|
|
rte_errno = ENOTSUP;
|
|
return -rte_errno;
|
|
}
|
|
|
|
/**
|
|
* Create flow action: push vlan.
|
|
*
|
|
* @param[in] domain
|
|
* Pointer to domain handler.
|
|
* @param[in] vlan_tag
|
|
* VLAN tag value.
|
|
* @param[out] action
|
|
* Pointer to a valid action on success, NULL otherwise.
|
|
*
|
|
* @return
|
|
* 0 on success, or negative value on failure and errno is set.
|
|
*/
|
|
static inline int
|
|
mlx5_flow_os_create_flow_action_push_vlan(void *domain, rte_be32_t vlan_tag,
|
|
void **action)
|
|
{
|
|
RTE_SET_USED(domain);
|
|
RTE_SET_USED(vlan_tag);
|
|
*action = NULL;
|
|
rte_errno = ENOTSUP;
|
|
return -rte_errno;
|
|
}
|
|
|
|
/**
|
|
* Create flow action: count.
|
|
*
|
|
* @param[in] cnt_obj
|
|
* Pointer to DevX counter object.
|
|
* @param[in] offset
|
|
* Offset of counter in array.
|
|
* @param[out] action
|
|
* Pointer to a valid action on success, NULL otherwise.
|
|
*
|
|
* @return
|
|
* 0 on success, or negative value on failure and errno is set.
|
|
*/
|
|
static inline int
|
|
mlx5_flow_os_create_flow_action_count(void *cnt_obj, uint16_t offset,
|
|
void **action)
|
|
{
|
|
RTE_SET_USED(cnt_obj);
|
|
RTE_SET_USED(offset);
|
|
*action = NULL;
|
|
rte_errno = ENOTSUP;
|
|
return -rte_errno;
|
|
}
|
|
|
|
/**
|
|
* Create flow action: tag.
|
|
*
|
|
* @param[in] tag
|
|
* Tag value.
|
|
* @param[out] action
|
|
* Pointer to a valid action on success, NULL otherwise.
|
|
*
|
|
* @return
|
|
* 0 on success, or negative value on failure and errno is set.
|
|
*/
|
|
static inline int
|
|
mlx5_flow_os_create_flow_action_tag(uint32_t tag, void **action)
|
|
{
|
|
RTE_SET_USED(tag);
|
|
*action = NULL;
|
|
rte_errno = ENOTSUP;
|
|
return -rte_errno;
|
|
}
|
|
|
|
/**
|
|
* Create flow action: drop.
|
|
*
|
|
* @param[out] action
|
|
* Pointer to a valid action on success, NULL otherwise.
|
|
*
|
|
* @return
|
|
* 0 on success, or negative value on failure and errno is set.
|
|
*/
|
|
static inline int
|
|
mlx5_flow_os_create_flow_action_drop(void **action)
|
|
{
|
|
*action = NULL;
|
|
rte_errno = ENOTSUP;
|
|
return -rte_errno;
|
|
}
|
|
|
|
/**
|
|
* Create flow action: default miss.
|
|
*
|
|
* @param[out] action
|
|
* NULL action pointer.
|
|
*
|
|
* @return
|
|
* 0 as success.
|
|
*/
|
|
static inline int
|
|
mlx5_flow_os_create_flow_action_default_miss(void **action)
|
|
{
|
|
*action = 0;
|
|
/* Silently ignore */
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Create flow action: sampler
|
|
*
|
|
* @param[in] attr
|
|
* Pointer to sampler attribute
|
|
* @param[out] action
|
|
* Pointer to a valid action on success, NULL otherwise.
|
|
*
|
|
* @return
|
|
* 0 on success, or -1 on failure and errno is set.
|
|
*/
|
|
static inline int
|
|
mlx5_os_flow_dr_create_flow_action_sampler
|
|
(struct mlx5dv_dr_flow_sampler_attr *attr,
|
|
void **action)
|
|
{
|
|
RTE_SET_USED(attr);
|
|
*action = NULL;
|
|
rte_errno = ENOTSUP;
|
|
return -rte_errno;
|
|
}
|
|
|
|
/**
|
|
* Create flow action: dest_array
|
|
*
|
|
* @param[in] domain
|
|
* Pointer to relevant domain.
|
|
* @param[in] num_dest
|
|
* Number of destinations array.
|
|
* @param[in] dests
|
|
* Array of destination attributes.
|
|
* @param[out] action
|
|
* Pointer to a valid action on success, NULL otherwise.
|
|
*
|
|
* @return
|
|
* 0 on success, or -1 on failure and errno is set.
|
|
*/
|
|
static inline int
|
|
mlx5_os_flow_dr_create_flow_action_dest_array
|
|
(void *domain,
|
|
size_t num_dest,
|
|
struct mlx5dv_dr_action_dest_attr *dests[],
|
|
void **action)
|
|
{
|
|
RTE_SET_USED(domain);
|
|
RTE_SET_USED(num_dest);
|
|
RTE_SET_USED(dests);
|
|
*action = NULL;
|
|
rte_errno = ENOTSUP;
|
|
return -rte_errno;
|
|
}
|
|
|
|
/**
|
|
* OS stub for mlx5_flow_adjust_priority() API.
|
|
* Windows only supports flow priority 0 that cannot be adjusted.
|
|
*
|
|
* @param[in] dev
|
|
* Pointer to the Ethernet device structure.
|
|
* @param[in] priority
|
|
* The rule base priority.
|
|
* @param[in] subpriority
|
|
* The priority based on the items.
|
|
*
|
|
* @return
|
|
* 0
|
|
*/
|
|
static inline uint32_t
|
|
mlx5_os_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,
|
|
uint32_t subpriority)
|
|
{
|
|
RTE_SET_USED(dev);
|
|
RTE_SET_USED(priority);
|
|
RTE_SET_USED(subpriority);
|
|
return 0;
|
|
}
|
|
|
|
static inline int
|
|
mlx5_os_flow_dr_sync_domain(void *domain, uint32_t flags)
|
|
{
|
|
RTE_SET_USED(domain);
|
|
RTE_SET_USED(flags);
|
|
errno = ENOTSUP;
|
|
return errno;
|
|
}
|
|
|
|
int mlx5_flow_os_validate_flow_attributes(struct rte_eth_dev *dev,
|
|
const struct rte_flow_attr *attributes,
|
|
bool external,
|
|
struct rte_flow_error *error);
|
|
int mlx5_flow_os_create_flow_matcher(void *ctx,
|
|
void *attr,
|
|
void *table,
|
|
void **matcher);
|
|
int mlx5_flow_os_destroy_flow_matcher(void *matcher);
|
|
int mlx5_flow_os_create_flow_action_dest_devx_tir(struct mlx5_devx_obj *tir,
|
|
void **action);
|
|
int mlx5_flow_os_destroy_flow_action(void *action);
|
|
int mlx5_flow_os_create_flow(void *matcher, void *match_value,
|
|
size_t num_actions,
|
|
void *actions[], void **flow);
|
|
int mlx5_flow_os_destroy_flow(void *drv_flow_ptr);
|
|
#endif /* RTE_PMD_MLX5_FLOW_OS_H_ */
|