net/mlx5: support VLAN flow item
Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com> Acked-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
This commit is contained in:
parent
2097d0d1e2
commit
12475fb203
@ -56,6 +56,11 @@ mlx5_flow_create_eth(const struct rte_flow_item *item,
|
||||
const void *default_mask,
|
||||
void *data);
|
||||
|
||||
static int
|
||||
mlx5_flow_create_vlan(const struct rte_flow_item *item,
|
||||
const void *default_mask,
|
||||
void *data);
|
||||
|
||||
static int
|
||||
mlx5_flow_create_ipv4(const struct rte_flow_item *item,
|
||||
const void *default_mask,
|
||||
@ -136,7 +141,8 @@ static const struct mlx5_flow_items mlx5_flow_items[] = {
|
||||
.items = ITEMS(RTE_FLOW_ITEM_TYPE_ETH),
|
||||
},
|
||||
[RTE_FLOW_ITEM_TYPE_ETH] = {
|
||||
.items = ITEMS(RTE_FLOW_ITEM_TYPE_IPV4,
|
||||
.items = ITEMS(RTE_FLOW_ITEM_TYPE_VLAN,
|
||||
RTE_FLOW_ITEM_TYPE_IPV4,
|
||||
RTE_FLOW_ITEM_TYPE_IPV6),
|
||||
.actions = valid_actions,
|
||||
.mask = &(const struct rte_flow_item_eth){
|
||||
@ -147,6 +153,17 @@ static const struct mlx5_flow_items mlx5_flow_items[] = {
|
||||
.convert = mlx5_flow_create_eth,
|
||||
.dst_sz = sizeof(struct ibv_exp_flow_spec_eth),
|
||||
},
|
||||
[RTE_FLOW_ITEM_TYPE_VLAN] = {
|
||||
.items = ITEMS(RTE_FLOW_ITEM_TYPE_IPV4,
|
||||
RTE_FLOW_ITEM_TYPE_IPV6),
|
||||
.actions = valid_actions,
|
||||
.mask = &(const struct rte_flow_item_vlan){
|
||||
.tci = -1,
|
||||
},
|
||||
.mask_sz = sizeof(struct rte_flow_item_vlan),
|
||||
.convert = mlx5_flow_create_vlan,
|
||||
.dst_sz = 0,
|
||||
},
|
||||
[RTE_FLOW_ITEM_TYPE_IPV4] = {
|
||||
.items = ITEMS(RTE_FLOW_ITEM_TYPE_UDP,
|
||||
RTE_FLOW_ITEM_TYPE_TCP),
|
||||
@ -355,6 +372,17 @@ priv_flow_validate(struct priv *priv,
|
||||
|
||||
if (items->type == RTE_FLOW_ITEM_TYPE_VOID)
|
||||
continue;
|
||||
/* Handle special situation for VLAN. */
|
||||
if (items->type == RTE_FLOW_ITEM_TYPE_VLAN) {
|
||||
if (((const struct rte_flow_item_vlan *)items)->tci >
|
||||
ETHER_MAX_VLAN_ID) {
|
||||
rte_flow_error_set(error, ENOTSUP,
|
||||
RTE_FLOW_ERROR_TYPE_ITEM,
|
||||
items,
|
||||
"wrong VLAN id value");
|
||||
return -rte_errno;
|
||||
}
|
||||
}
|
||||
for (i = 0;
|
||||
cur_item->items &&
|
||||
cur_item->items[i] != RTE_FLOW_ITEM_TYPE_END;
|
||||
@ -480,6 +508,38 @@ mlx5_flow_create_eth(const struct rte_flow_item *item,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert VLAN item to Verbs specification.
|
||||
*
|
||||
* @param item[in]
|
||||
* Item specification.
|
||||
* @param default_mask[in]
|
||||
* Default bit-masks to use when item->mask is not provided.
|
||||
* @param data[in, out]
|
||||
* User structure.
|
||||
*/
|
||||
static int
|
||||
mlx5_flow_create_vlan(const struct rte_flow_item *item,
|
||||
const void *default_mask,
|
||||
void *data)
|
||||
{
|
||||
const struct rte_flow_item_vlan *spec = item->spec;
|
||||
const struct rte_flow_item_vlan *mask = item->mask;
|
||||
struct mlx5_flow *flow = (struct mlx5_flow *)data;
|
||||
struct ibv_exp_flow_spec_eth *eth;
|
||||
const unsigned int eth_size = sizeof(struct ibv_exp_flow_spec_eth);
|
||||
|
||||
eth = (void *)((uintptr_t)flow->ibv_attr + flow->offset - eth_size);
|
||||
if (!spec)
|
||||
return 0;
|
||||
if (!mask)
|
||||
mask = default_mask;
|
||||
eth->val.vlan_tag = spec->tci;
|
||||
eth->mask.vlan_tag = mask->tci;
|
||||
eth->val.vlan_tag &= eth->mask.vlan_tag;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert IPv4 item to Verbs specification.
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user