Add the corresponding data structure and logics, to support
the offload of VLAN item.
Signed-off-by: Chaoyong He <chaoyong.he@corigine.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@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(+)
@@ -29,6 +29,7 @@ Usage doc = Y
[rte_flow items]
eth = Y
port_id = Y
+vlan = Y
[rte_flow actions]
count = Y
@@ -108,6 +108,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:
@@ -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
@@ -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. */