2020-06-28 14:06:52 +00:00
|
|
|
/* 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_
|
|
|
|
|
2020-06-28 14:06:53 +00:00
|
|
|
#include "mlx5_flow.h"
|
|
|
|
|
|
|
|
#ifdef HAVE_IBV_FLOW_DV_SUPPORT
|
|
|
|
extern const struct mlx5_flow_driver_ops mlx5_flow_dv_drv_ops;
|
net/mlx5: introduce hardware steering operation
The Connect-X steering is a lookup hardware mechanism that accesses flow
tables, matches packets to the rules, and performs specified actions.
Historically, mlx5 PMD implements several software engines to manage
steering hardware facility:
- FW Steering - Verbs/Direct Verbs, uses FW calls to manage flows
- SW Steering - DevX/mlx5dv, uses WQEs to access table memory directly
However, there are still some disadvantages:
- performance is limited, we should invoke firmware either to
manage the entire flow, or to handle some internal steering objects
- organizing and preparing flow infrastructure (actions, matchers,
groups, etc.) on the flow inserting is sure to cause slow flow
insertion
- security, exposing the low-level steering entries directly to the
userspace may cause security risks
A new hardware WQE based steering operation with codename "HW Steering"
is going to be introduced to get rid of the security risks. And it will
take advantage of the recently new introduced async queue-based rte_flow
APIs to prepare everything in advance to achieve high insertion rate.
In this new HW steering engine, the original SW steering rte_flow API
will not be supported in the first implementation, only the new async
queue-based flow operations is going to be supported. A new steering
mode parameter for dv_flow_en will be introduced and user will be
able to engage the new steering engine.
This commit adds the basic driver operation.
Signed-off-by: Suanming Mou <suanmingm@nvidia.com>
Acked-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
2022-02-24 13:40:38 +00:00
|
|
|
extern const struct mlx5_flow_driver_ops mlx5_flow_hw_drv_ops;
|
2020-06-28 14:06:53 +00:00
|
|
|
#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_MAX;
|
|
|
|
}
|
|
|
|
|
2020-06-28 14:06:52 +00:00
|
|
|
/**
|
|
|
|
* 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 __rte_unused)
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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 __rte_unused)
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2020-06-28 14:06:54 +00:00
|
|
|
/**
|
|
|
|
* Create flow rule.
|
|
|
|
*
|
|
|
|
* @param[in] matcher
|
|
|
|
* Pointer to match mask structure.
|
|
|
|
* @param[in] match_value
|
|
|
|
* Pointer to match value structure.
|
|
|
|
* @param[in] num_actions
|
|
|
|
* Number of actions in flow rule.
|
|
|
|
* @param[in] actions
|
|
|
|
* Pointer to array of flow rule actions.
|
|
|
|
* @param[out] flow
|
|
|
|
* Pointer to a valid flow rule object on success, NULL otherwise.
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* 0 on success, or -1 on failure and errno is set.
|
|
|
|
*/
|
|
|
|
static inline int
|
|
|
|
mlx5_flow_os_create_flow(void *matcher, void *match_value,
|
|
|
|
size_t num_actions, void *actions[], void **flow)
|
|
|
|
{
|
|
|
|
*flow = mlx5_glue->dv_create_flow(matcher, match_value,
|
|
|
|
num_actions, actions);
|
|
|
|
return (*flow) ? 0 : -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Destroy flow rule.
|
|
|
|
*
|
|
|
|
* @param[in] drv_flow_ptr
|
|
|
|
* Pointer to flow rule object.
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* 0 on success, or the value of errno on failure.
|
|
|
|
*/
|
|
|
|
static inline int
|
|
|
|
mlx5_flow_os_destroy_flow(void *drv_flow_ptr)
|
|
|
|
{
|
|
|
|
return mlx5_glue->dv_destroy_flow(drv_flow_ptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create flow table.
|
|
|
|
*
|
|
|
|
* @param[in] domain
|
|
|
|
* Pointer to relevant domain.
|
|
|
|
* @param[in] table_id
|
|
|
|
* Table ID.
|
|
|
|
* @param[out] table
|
|
|
|
* Pointer to a valid flow table object on success, NULL otherwise.
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* 0 on success, or -1 on failure and errno is set.
|
|
|
|
*/
|
|
|
|
static inline int
|
|
|
|
mlx5_flow_os_create_flow_tbl(void *domain, uint32_t table_id, void **table)
|
|
|
|
{
|
|
|
|
*table = mlx5_glue->dr_create_flow_tbl(domain, table_id);
|
|
|
|
return (*table) ? 0 : -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Destroy flow table.
|
|
|
|
*
|
|
|
|
* @param[in] table
|
|
|
|
* Pointer to table object to destroy.
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* 0 on success, or the value of errno on failure.
|
|
|
|
*/
|
|
|
|
static inline int
|
|
|
|
mlx5_flow_os_destroy_flow_tbl(void *table)
|
|
|
|
{
|
|
|
|
return mlx5_glue->dr_destroy_flow_tbl(table);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create flow matcher in a flow table.
|
|
|
|
*
|
|
|
|
* @param[in] ctx
|
|
|
|
* Pointer to relevant device context.
|
|
|
|
* @param[in] attr
|
|
|
|
* Pointer to relevant attributes.
|
|
|
|
* @param[in] table
|
|
|
|
* Pointer to table object.
|
|
|
|
* @param[out] matcher
|
|
|
|
* Pointer to a valid flow matcher object on success, NULL otherwise.
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* 0 on success, or -1 on failure and errno is set.
|
|
|
|
*/
|
|
|
|
static inline int
|
|
|
|
mlx5_flow_os_create_flow_matcher(void *ctx, void *attr, void *table,
|
|
|
|
void **matcher)
|
|
|
|
{
|
|
|
|
*matcher = mlx5_glue->dv_create_flow_matcher(ctx, attr, table);
|
|
|
|
return (*matcher) ? 0 : -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Destroy flow matcher.
|
|
|
|
*
|
|
|
|
* @param[in] matcher
|
|
|
|
* Pointer to matcher object to destroy.
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* 0 on success, or the value of errno on failure.
|
|
|
|
*/
|
|
|
|
static inline int
|
|
|
|
mlx5_flow_os_destroy_flow_matcher(void *matcher)
|
|
|
|
{
|
|
|
|
return mlx5_glue->dv_destroy_flow_matcher(matcher);
|
|
|
|
}
|
|
|
|
|
2020-06-28 14:06:55 +00:00
|
|
|
/**
|
|
|
|
* 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 -1 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)
|
|
|
|
{
|
|
|
|
struct mlx5_flow_dv_encap_decap_resource *res =
|
|
|
|
(struct mlx5_flow_dv_encap_decap_resource *)resource;
|
|
|
|
|
|
|
|
*action = mlx5_glue->dv_create_flow_action_packet_reformat
|
|
|
|
(ctx, res->reformat_type, res->ft_type,
|
|
|
|
domain, res->flags, res->size,
|
|
|
|
(res->size ? res->buf : NULL));
|
|
|
|
return (*action) ? 0 : -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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)
|
|
|
|
{
|
|
|
|
struct mlx5_flow_dv_modify_hdr_resource *res =
|
|
|
|
(struct mlx5_flow_dv_modify_hdr_resource *)resource;
|
|
|
|
|
|
|
|
*action = mlx5_glue->dv_create_flow_action_modify_header
|
2021-07-13 08:44:40 +00:00
|
|
|
(ctx, res->ft_type, domain, res->root ?
|
|
|
|
MLX5DV_DR_ACTION_FLAGS_ROOT_LEVEL : 0,
|
2020-06-28 14:06:55 +00:00
|
|
|
actions_len, (uint64_t *)res->actions);
|
|
|
|
return (*action) ? 0 : -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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 -1 on failure and errno is set.
|
|
|
|
*/
|
|
|
|
static inline int
|
|
|
|
mlx5_flow_os_create_flow_action_dest_flow_tbl(void *tbl_obj, void **action)
|
|
|
|
{
|
|
|
|
*action = mlx5_glue->dr_create_flow_action_dest_flow_tbl(tbl_obj);
|
|
|
|
return (*action) ? 0 : -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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 -1 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)
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* Depending on rdma_core version the glue routine calls
|
|
|
|
* either mlx5dv_dr_action_create_dest_ib_port(domain, dev_port)
|
|
|
|
* or mlx5dv_dr_action_create_dest_vport(domain, vport_id).
|
|
|
|
*/
|
|
|
|
*action = mlx5_glue->dr_create_flow_action_dest_port(domain, port_id);
|
|
|
|
return (*action) ? 0 : -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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 -1 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)
|
|
|
|
{
|
|
|
|
*action = mlx5_glue->dr_create_flow_action_push_vlan(domain, vlan_tag);
|
|
|
|
return (*action) ? 0 : -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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 -1 on failure and errno is set.
|
|
|
|
*/
|
|
|
|
static inline int
|
|
|
|
mlx5_flow_os_create_flow_action_count(void *cnt_obj, uint16_t offset,
|
|
|
|
void **action)
|
|
|
|
{
|
|
|
|
*action = mlx5_glue->dv_create_flow_action_counter(cnt_obj, offset);
|
|
|
|
return (*action) ? 0 : -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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 -1 on failure and errno is set.
|
|
|
|
*/
|
|
|
|
static inline int
|
|
|
|
mlx5_flow_os_create_flow_action_tag(uint32_t tag, void **action)
|
|
|
|
{
|
|
|
|
*action = mlx5_glue->dv_create_flow_action_tag(tag);
|
|
|
|
return (*action) ? 0 : -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create flow action: drop.
|
|
|
|
*
|
|
|
|
* @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_drop(void **action)
|
|
|
|
{
|
|
|
|
*action = mlx5_glue->dr_create_flow_action_drop();
|
|
|
|
return (*action) ? 0 : -1;
|
|
|
|
}
|
|
|
|
|
2020-12-28 12:32:49 +00:00
|
|
|
/**
|
|
|
|
* Create flow action: default miss.
|
|
|
|
*
|
|
|
|
* @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_default_miss(void **action)
|
|
|
|
{
|
|
|
|
*action = mlx5_glue->dr_create_flow_action_default_miss();
|
|
|
|
return (*action) ? 0 : -1;
|
|
|
|
}
|
|
|
|
|
2022-10-19 18:40:04 +00:00
|
|
|
/**
|
|
|
|
* Create flow action: send_to_kernel.
|
|
|
|
*
|
|
|
|
* @param[in] tbl
|
|
|
|
* Pointer to destination root table.
|
|
|
|
* @param[in] priority
|
|
|
|
* Priority to which traffic will arrive.
|
|
|
|
* @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_send_to_kernel(void *tbl, uint16_t priority,
|
|
|
|
void **action)
|
|
|
|
{
|
|
|
|
*action = mlx5_glue->dr_create_flow_action_send_to_kernel(tbl,
|
|
|
|
priority);
|
|
|
|
return (*action) ? 0 : -1;
|
|
|
|
}
|
|
|
|
|
2020-12-28 12:32:50 +00:00
|
|
|
/**
|
|
|
|
* Create flow action: dest_devx_tir
|
|
|
|
*
|
|
|
|
* @param[in] tir
|
|
|
|
* Pointer to DevX tir object
|
|
|
|
* @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_dest_devx_tir(struct mlx5_devx_obj *tir,
|
|
|
|
void **action)
|
|
|
|
{
|
|
|
|
#ifdef HAVE_IBV_FLOW_DV_SUPPORT
|
|
|
|
*action = mlx5_glue->dv_create_flow_action_dest_devx_tir(tir->obj);
|
|
|
|
return (*action) ? 0 : -1;
|
|
|
|
#else
|
|
|
|
/* If no DV support - skip the operation and return success */
|
|
|
|
RTE_SET_USED(tir);
|
|
|
|
*action = 0;
|
|
|
|
return 0;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2021-01-03 12:15:49 +00:00
|
|
|
/**
|
|
|
|
* 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)
|
|
|
|
{
|
|
|
|
*action = mlx5_glue->dr_create_flow_action_sampler(attr);
|
|
|
|
return (*action) ? 0 : -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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)
|
|
|
|
{
|
|
|
|
*action = mlx5_glue->dr_create_flow_action_dest_array(
|
|
|
|
domain, num_dest, dests);
|
|
|
|
return (*action) ? 0 : -1;
|
|
|
|
}
|
|
|
|
|
2020-06-28 14:06:55 +00:00
|
|
|
/**
|
|
|
|
* Destroy flow action.
|
|
|
|
*
|
|
|
|
* @param[in] action
|
|
|
|
* Pointer to action object to destroy.
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* 0 on success, or the value of errno on failure.
|
|
|
|
*/
|
|
|
|
static inline int
|
|
|
|
mlx5_flow_os_destroy_flow_action(void *action)
|
|
|
|
{
|
|
|
|
return mlx5_glue->destroy_flow_action(action);
|
|
|
|
}
|
|
|
|
|
2020-12-28 12:32:48 +00:00
|
|
|
/**
|
|
|
|
* OS wrapper over Verbs API.
|
|
|
|
* Adjust flow priority based on the highest layer and the request priority.
|
|
|
|
*
|
|
|
|
* @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
|
|
|
|
* The new priority.
|
|
|
|
*/
|
|
|
|
static inline uint32_t
|
|
|
|
mlx5_os_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,
|
|
|
|
uint32_t subpriority)
|
|
|
|
{
|
|
|
|
return mlx5_flow_adjust_priority(dev, priority, subpriority);
|
|
|
|
}
|
2020-12-28 12:33:00 +00:00
|
|
|
|
|
|
|
static inline int
|
|
|
|
mlx5_os_flow_dr_sync_domain(void *domain, uint32_t flags)
|
|
|
|
{
|
|
|
|
return mlx5_glue->dr_sync_domain(domain, flags);
|
|
|
|
}
|
2022-06-02 13:03:08 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Validate ESP item.
|
|
|
|
*
|
|
|
|
* @param[in] item
|
|
|
|
* Item specification.
|
|
|
|
* @param[in] item_flags
|
|
|
|
* Bit-fields that holds the items detected until now.
|
|
|
|
* @param[in] target_protocol
|
|
|
|
* The next protocol in the previous item.
|
|
|
|
* @param[out] error
|
|
|
|
* Pointer to error structure.
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* 0 on success, a negative errno value otherwise and rte_errno is set.
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
mlx5_flow_os_validate_item_esp(const struct rte_flow_item *item,
|
|
|
|
uint64_t item_flags,
|
|
|
|
uint8_t target_protocol,
|
|
|
|
struct rte_flow_error *error);
|
|
|
|
|
2020-06-28 14:06:52 +00:00
|
|
|
#endif /* RTE_PMD_MLX5_FLOW_OS_H_ */
|