Add the corresponding data structure and logics, to support the offload of VLAN item.
Signed-off-by: Chaoyong He <chaoyong...@corigine.com> Reviewed-by: Niklas Söderlund <niklas.soderl...@corigine.com> --- doc/guides/nics/features/nfp.ini | 1 + doc/guides/rel_notes/release_22_11.rst | 1 + drivers/net/nfp/nfp_flow.c | 46 ++++++++++++++++++++++++++++++++++ drivers/net/nfp/nfp_flow.h | 2 ++ 4 files changed, 50 insertions(+) diff --git a/doc/guides/nics/features/nfp.ini b/doc/guides/nics/features/nfp.ini index 194fe64..f0ecae2 100644 --- a/doc/guides/nics/features/nfp.ini +++ b/doc/guides/nics/features/nfp.ini @@ -29,6 +29,7 @@ Usage doc = Y [rte_flow items] eth = Y port_id = Y +vlan = Y [rte_flow actions] count = Y diff --git a/doc/guides/rel_notes/release_22_11.rst b/doc/guides/rel_notes/release_22_11.rst index ac0223f..9160cc6 100644 --- a/doc/guides/rel_notes/release_22_11.rst +++ b/doc/guides/rel_notes/release_22_11.rst @@ -154,6 +154,7 @@ New Features Add the support of rte_flow pattern items as follow: * Ethernet + * Single VLAN Add the support of rte_flow actions as follow: diff --git a/drivers/net/nfp/nfp_flow.c b/drivers/net/nfp/nfp_flow.c index ec021f0..b063b96 100644 --- a/drivers/net/nfp/nfp_flow.c +++ b/drivers/net/nfp/nfp_flow.c @@ -530,6 +530,10 @@ struct nfp_mask_id_entry { ethdev->data->dev_private; key_ls->port = rte_cpu_to_be_32(representor->port_id); break; + case RTE_FLOW_ITEM_TYPE_VLAN: + PMD_DRV_LOG(DEBUG, "RTE_FLOW_ITEM_TYPE_VLAN detected"); + key_ls->vlan = NFP_FLOWER_MASK_VLAN_CFI; + break; default: PMD_DRV_LOG(ERR, "Item type %d not supported.", item->type); return -ENOTSUP; @@ -641,12 +645,42 @@ struct nfp_mask_id_entry { return 0; } +static int +nfp_flow_merge_vlan(struct rte_flow *nfp_flow, + __rte_unused char **mbuf_off, + const struct rte_flow_item *item, + const struct nfp_flow_item_proc *proc, + bool is_mask) +{ + struct nfp_flower_meta_tci *meta_tci; + const struct rte_flow_item_vlan *spec; + const struct rte_flow_item_vlan *mask; + + spec = item->spec; + if (spec == NULL) { + PMD_DRV_LOG(DEBUG, "nfp flow merge vlan: no item->spec!"); + return 0; + } + + mask = item->mask ? item->mask : proc->mask_default; + if (is_mask) { + meta_tci = (struct nfp_flower_meta_tci *)nfp_flow->payload.mask_data; + meta_tci->tci |= mask->tci; + } else { + meta_tci = (struct nfp_flower_meta_tci *)nfp_flow->payload.unmasked_data; + meta_tci->tci |= spec->tci; + } + + return 0; +} + /* Graph of supported items and associated process function */ static const struct nfp_flow_item_proc nfp_flow_item_proc_list[] = { [RTE_FLOW_ITEM_TYPE_END] = { .next_item = NEXT_ITEM(RTE_FLOW_ITEM_TYPE_ETH), }, [RTE_FLOW_ITEM_TYPE_ETH] = { + .next_item = NEXT_ITEM(RTE_FLOW_ITEM_TYPE_VLAN), .mask_support = &(const struct rte_flow_item_eth){ .hdr = { .dst_addr.addr_bytes = "\xff\xff\xff\xff\xff\xff", @@ -659,6 +693,18 @@ struct nfp_mask_id_entry { .mask_sz = sizeof(struct rte_flow_item_eth), .merge = nfp_flow_merge_eth, }, + [RTE_FLOW_ITEM_TYPE_VLAN] = { + .mask_support = &(const struct rte_flow_item_vlan){ + .hdr = { + .vlan_tci = RTE_BE16(0xefff), + .eth_proto = RTE_BE16(0xffff), + }, + .has_more_vlan = 1, + }, + .mask_default = &rte_flow_item_vlan_mask, + .mask_sz = sizeof(struct rte_flow_item_vlan), + .merge = nfp_flow_merge_vlan, + }, }; static int diff --git a/drivers/net/nfp/nfp_flow.h b/drivers/net/nfp/nfp_flow.h index f1fbada..f6bd3e4 100644 --- a/drivers/net/nfp/nfp_flow.h +++ b/drivers/net/nfp/nfp_flow.h @@ -25,6 +25,8 @@ #define NFP_FL_META_FLAG_MANAGE_MASK (1 << 7) +#define NFP_FLOWER_MASK_VLAN_CFI (1 << 12) + #define NFP_MASK_TABLE_ENTRIES 1024 /* The maximum action list size (in bytes) supported by the NFP. */ -- 1.8.3.1