[03/10] net/nfp: refactor the insert metadata logic of NFD3

Message ID 20230607015709.336420-4-chaoyong.he@corigine.com (mailing list archive)
State Accepted, archived
Delegated to: Ferruh Yigit
Headers
Series support rte_flow for flower firmware with NFDk |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Chaoyong He June 7, 2023, 1:57 a.m. UTC
  Extract the insert metadata logic of NFD3 into a single function to
simplify the logics.

Add the data structure aims to hold all the different function pointers
which related to different NFD version.

Also add a register function to initialize the function pointers.

Signed-off-by: Chaoyong He <chaoyong.he@corigine.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@corigine.com>
---
 drivers/net/nfp/flower/nfp_flower.c           | 26 ++++++++
 drivers/net/nfp/flower/nfp_flower.h           | 16 ++++-
 drivers/net/nfp/flower/nfp_flower_cmsg.c      | 63 ++++++++++---------
 .../net/nfp/flower/nfp_flower_representor.c   | 10 +--
 drivers/net/nfp/nfd3/nfp_nfd3.h               |  2 +
 drivers/net/nfp/nfd3/nfp_nfd3_dp.c            | 16 +++++
 6 files changed, 97 insertions(+), 36 deletions(-)
  

Patch

diff --git a/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c
index afb4e5b344..3636c347bb 100644
--- a/drivers/net/nfp/flower/nfp_flower.c
+++ b/drivers/net/nfp/flower/nfp_flower.c
@@ -1058,6 +1058,30 @@  nfp_flower_enable_services(struct nfp_app_fw_flower *app_fw_flower)
 	return 0;
 }
 
+static void
+nfp_flower_pkt_add_metadata_register(struct nfp_app_fw_flower *app_fw_flower)
+{
+	struct nfp_flower_nfd_func *nfd_func;
+
+	nfd_func = &app_fw_flower->nfd_func;
+
+	nfd_func->pkt_add_metadata_t = nfp_flower_nfd3_pkt_add_metadata;
+}
+
+uint32_t
+nfp_flower_pkt_add_metadata(struct nfp_app_fw_flower *app_fw_flower,
+		struct rte_mbuf *mbuf,
+		uint32_t port_id)
+{
+	return app_fw_flower->nfd_func.pkt_add_metadata_t(mbuf, port_id);
+}
+
+static void
+nfp_flower_nfd_func_register(struct nfp_app_fw_flower *app_fw_flower)
+{
+	nfp_flower_pkt_add_metadata_register(app_fw_flower);
+}
+
 int
 nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev)
 {
@@ -1135,6 +1159,8 @@  nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev)
 		goto pf_cpp_area_cleanup;
 	}
 
+	nfp_flower_nfd_func_register(app_fw_flower);
+
 	/* The ctrl vNIC struct comes directly after the PF one */
 	app_fw_flower->ctrl_hw = pf_hw + 1;
 	ctrl_hw = app_fw_flower->ctrl_hw;
diff --git a/drivers/net/nfp/flower/nfp_flower.h b/drivers/net/nfp/flower/nfp_flower.h
index 0ce5f7bd9e..3bc5924b71 100644
--- a/drivers/net/nfp/flower/nfp_flower.h
+++ b/drivers/net/nfp/flower/nfp_flower.h
@@ -29,11 +29,20 @@ 
  * to the correct packet data offset after metadata has
  * been added
  */
-#define FLOWER_PKT_DATA_OFFSET 8
+#define FLOWER_PKT_DATA_OFFSET (NFP_NET_META_HEADER_SIZE + NFP_NET_META_FIELD_SIZE)
 
 #define MAX_FLOWER_PHYPORTS 8
 #define MAX_FLOWER_VFS 64
 
+struct nfp_app_fw_flower;
+
+/* The function pointers for different NFD version */
+struct nfp_flower_nfd_func {
+	/** Function used to add metadata into pkt. */
+	uint32_t (*pkt_add_metadata_t)(struct rte_mbuf *mbuf,
+		uint32_t port_id);
+};
+
 /* The flower application's private structure */
 struct nfp_app_fw_flower {
 	/* switch domain for this app */
@@ -77,6 +86,9 @@  struct nfp_app_fw_flower {
 
 	struct nfp_flow_priv *flow_priv;
 	struct nfp_mtr_priv *mtr_priv;
+
+	/* Function pointers for different NFD version */
+	struct nfp_flower_nfd_func nfd_func;
 };
 
 static inline bool
@@ -93,5 +105,7 @@  uint16_t nfp_flower_pf_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
 		uint16_t nb_pkts);
 int nfp_flower_pf_start(struct rte_eth_dev *dev);
 int nfp_flower_pf_stop(struct rte_eth_dev *dev);
+uint32_t nfp_flower_pkt_add_metadata(struct nfp_app_fw_flower *app_fw_flower,
+		struct rte_mbuf *mbuf, uint32_t port_id);
 
 #endif /* _NFP_FLOWER_H_ */
diff --git a/drivers/net/nfp/flower/nfp_flower_cmsg.c b/drivers/net/nfp/flower/nfp_flower_cmsg.c
index 430dd9c316..00f94c7492 100644
--- a/drivers/net/nfp/flower/nfp_flower_cmsg.c
+++ b/drivers/net/nfp/flower/nfp_flower_cmsg.c
@@ -12,28 +12,19 @@ 
 #include "nfp_flower_representor.h"
 
 static void *
-nfp_flower_cmsg_init(struct rte_mbuf *m,
+nfp_flower_cmsg_init(struct nfp_app_fw_flower *app_fw_flower,
+		struct rte_mbuf *m,
 		enum nfp_flower_cmsg_type type,
 		uint32_t size)
 {
 	char *pkt;
-	uint32_t data;
 	uint32_t new_size = size;
 	struct nfp_flower_cmsg_hdr *hdr;
 
 	pkt = rte_pktmbuf_mtod(m, char *);
 	PMD_DRV_LOG(DEBUG, "flower_cmsg_init using pkt at %p", pkt);
 
-	data = rte_cpu_to_be_32(NFP_NET_META_PORTID);
-	rte_memcpy(pkt, &data, 4);
-	pkt += 4;
-	new_size += 4;
-
-	/* First the metadata as flower requires it */
-	data = rte_cpu_to_be_32(NFP_META_PORT_ID_CTRL);
-	rte_memcpy(pkt, &data, 4);
-	pkt += 4;
-	new_size += 4;
+	new_size += nfp_flower_pkt_add_metadata(app_fw_flower, m, NFP_META_PORT_ID_CTRL);
 
 	/* Now the ctrl header */
 	hdr = (struct nfp_flower_cmsg_hdr *)pkt;
@@ -51,14 +42,17 @@  nfp_flower_cmsg_init(struct rte_mbuf *m,
 }
 
 static void
-nfp_flower_cmsg_mac_repr_init(struct rte_mbuf *mbuf, int num_ports)
+nfp_flower_cmsg_mac_repr_init(struct rte_mbuf *mbuf,
+		struct nfp_app_fw_flower *app_fw_flower)
 {
 	uint32_t size;
+	uint8_t num_ports;
 	struct nfp_flower_cmsg_mac_repr *msg;
 	enum nfp_flower_cmsg_type type = NFP_FLOWER_CMSG_TYPE_MAC_REPR;
 
+	num_ports = app_fw_flower->num_phyport_reprs;
 	size = sizeof(*msg) + (num_ports * sizeof(msg->ports[0]));
-	msg = nfp_flower_cmsg_init(mbuf, type, size);
+	msg = nfp_flower_cmsg_init(app_fw_flower, mbuf, type, size);
 	memset(msg->reserved, 0, sizeof(msg->reserved));
 	msg->num_ports = num_ports;
 }
@@ -96,7 +90,7 @@  nfp_flower_cmsg_mac_repr(struct nfp_app_fw_flower *app_fw_flower)
 		return -ENOMEM;
 	}
 
-	nfp_flower_cmsg_mac_repr_init(mbuf, app_fw_flower->num_phyport_reprs);
+	nfp_flower_cmsg_mac_repr_init(mbuf, app_fw_flower);
 
 	/* Fill in the mac repr cmsg */
 	nfp_eth_table = app_fw_flower->pf_hw->pf_dev->nfp_eth_table;
@@ -133,7 +127,8 @@  nfp_flower_cmsg_repr_reify(struct nfp_app_fw_flower *app_fw_flower,
 		return -ENOMEM;
 	}
 
-	msg = nfp_flower_cmsg_init(mbuf, NFP_FLOWER_CMSG_TYPE_PORT_REIFY, sizeof(*msg));
+	msg = nfp_flower_cmsg_init(app_fw_flower, mbuf,
+			NFP_FLOWER_CMSG_TYPE_PORT_REIFY, sizeof(*msg));
 	msg->portnum  = rte_cpu_to_be_32(repr->port_id);
 	msg->reserved = 0;
 	msg->info     = rte_cpu_to_be_16(1);
@@ -162,7 +157,8 @@  nfp_flower_cmsg_port_mod(struct nfp_app_fw_flower *app_fw_flower,
 		return -ENOMEM;
 	}
 
-	msg = nfp_flower_cmsg_init(mbuf, NFP_FLOWER_CMSG_TYPE_PORT_MOD, sizeof(*msg));
+	msg = nfp_flower_cmsg_init(app_fw_flower, mbuf,
+			NFP_FLOWER_CMSG_TYPE_PORT_MOD, sizeof(*msg));
 	msg->portnum  = rte_cpu_to_be_32(port_id);
 	msg->reserved = 0;
 	msg->info     = carrier_ok;
@@ -199,7 +195,8 @@  nfp_flower_cmsg_flow_delete(struct nfp_app_fw_flower *app_fw_flower,
 	msg_len = (nfp_flow_meta->key_len + nfp_flow_meta->mask_len +
 			nfp_flow_meta->act_len) << NFP_FL_LW_SIZ;
 	msg_len += sizeof(struct nfp_fl_rule_metadata);
-	msg = nfp_flower_cmsg_init(mbuf, NFP_FLOWER_CMSG_TYPE_FLOW_DEL, msg_len);
+	msg = nfp_flower_cmsg_init(app_fw_flower, mbuf,
+			NFP_FLOWER_CMSG_TYPE_FLOW_DEL, msg_len);
 	rte_memcpy(msg, flow->payload.meta, msg_len);
 
 	cnt = nfp_flower_ctrl_vnic_xmit(app_fw_flower, mbuf);
@@ -233,7 +230,8 @@  nfp_flower_cmsg_flow_add(struct nfp_app_fw_flower *app_fw_flower,
 	msg_len = (nfp_flow_meta->key_len + nfp_flow_meta->mask_len +
 			nfp_flow_meta->act_len) << NFP_FL_LW_SIZ;
 	msg_len += sizeof(struct nfp_fl_rule_metadata);
-	msg = nfp_flower_cmsg_init(mbuf, NFP_FLOWER_CMSG_TYPE_FLOW_ADD, msg_len);
+	msg = nfp_flower_cmsg_init(app_fw_flower, mbuf,
+			NFP_FLOWER_CMSG_TYPE_FLOW_ADD, msg_len);
 	rte_memcpy(msg, flow->payload.meta, msg_len);
 
 	cnt = nfp_flower_ctrl_vnic_xmit(app_fw_flower, mbuf);
@@ -264,7 +262,8 @@  nfp_flower_cmsg_tun_neigh_v4_rule(struct nfp_app_fw_flower *app_fw_flower,
 	msg_len = sizeof(struct nfp_flower_cmsg_tun_neigh_v4);
 	if (!nfp_flower_support_decap_v2(app_fw_flower))
 		msg_len -= sizeof(struct nfp_flower_tun_neigh_ext);
-	msg = nfp_flower_cmsg_init(mbuf, NFP_FLOWER_CMSG_TYPE_TUN_NEIGH, msg_len);
+	msg = nfp_flower_cmsg_init(app_fw_flower, mbuf,
+			NFP_FLOWER_CMSG_TYPE_TUN_NEIGH, msg_len);
 	memcpy(msg, payload, msg_len);
 
 	cnt = nfp_flower_ctrl_vnic_xmit(app_fw_flower, mbuf);
@@ -295,7 +294,8 @@  nfp_flower_cmsg_tun_neigh_v6_rule(struct nfp_app_fw_flower *app_fw_flower,
 	msg_len = sizeof(struct nfp_flower_cmsg_tun_neigh_v6);
 	if (!nfp_flower_support_decap_v2(app_fw_flower))
 		msg_len -= sizeof(struct nfp_flower_tun_neigh_ext);
-	msg = nfp_flower_cmsg_init(mbuf, NFP_FLOWER_CMSG_TYPE_TUN_NEIGH_V6, msg_len);
+	msg = nfp_flower_cmsg_init(app_fw_flower, mbuf,
+			NFP_FLOWER_CMSG_TYPE_TUN_NEIGH_V6, msg_len);
 	memcpy(msg, payload, msg_len);
 
 	cnt = nfp_flower_ctrl_vnic_xmit(app_fw_flower, mbuf);
@@ -324,7 +324,8 @@  nfp_flower_cmsg_tun_off_v4(struct nfp_app_fw_flower *app_fw_flower)
 		return -ENOMEM;
 	}
 
-	msg = nfp_flower_cmsg_init(mbuf, NFP_FLOWER_CMSG_TYPE_TUN_IPS, sizeof(*msg));
+	msg = nfp_flower_cmsg_init(app_fw_flower, mbuf,
+			NFP_FLOWER_CMSG_TYPE_TUN_IPS, sizeof(*msg));
 
 	priv = app_fw_flower->flow_priv;
 	rte_spinlock_lock(&priv->ipv4_off_lock);
@@ -366,7 +367,8 @@  nfp_flower_cmsg_tun_off_v6(struct nfp_app_fw_flower *app_fw_flower)
 		return -ENOMEM;
 	}
 
-	msg = nfp_flower_cmsg_init(mbuf, NFP_FLOWER_CMSG_TYPE_TUN_IPS_V6, sizeof(*msg));
+	msg = nfp_flower_cmsg_init(app_fw_flower, mbuf,
+			NFP_FLOWER_CMSG_TYPE_TUN_IPS_V6, sizeof(*msg));
 
 	priv = app_fw_flower->flow_priv;
 	rte_spinlock_lock(&priv->ipv6_off_lock);
@@ -409,7 +411,8 @@  nfp_flower_cmsg_pre_tunnel_rule(struct nfp_app_fw_flower *app_fw_flower,
 		return -ENOMEM;
 	}
 
-	msg = nfp_flower_cmsg_init(mbuf, NFP_FLOWER_CMSG_TYPE_PRE_TUN_RULE, sizeof(*msg));
+	msg = nfp_flower_cmsg_init(app_fw_flower, mbuf,
+			NFP_FLOWER_CMSG_TYPE_PRE_TUN_RULE, sizeof(*msg));
 
 	meta_tci = (struct nfp_flower_meta_tci *)((char *)nfp_flow_meta +
 			sizeof(struct nfp_fl_rule_metadata));
@@ -450,7 +453,8 @@  nfp_flower_cmsg_tun_mac_rule(struct nfp_app_fw_flower *app_fw_flower,
 		return -ENOMEM;
 	}
 
-	msg = nfp_flower_cmsg_init(mbuf, NFP_FLOWER_CMSG_TYPE_TUN_MAC, sizeof(*msg));
+	msg = nfp_flower_cmsg_init(app_fw_flower, mbuf,
+			NFP_FLOWER_CMSG_TYPE_TUN_MAC, sizeof(*msg));
 
 	msg->count = rte_cpu_to_be_16(1);
 	msg->index = rte_cpu_to_be_16(mac_idx);
@@ -484,7 +488,8 @@  nfp_flower_cmsg_qos_add(struct nfp_app_fw_flower *app_fw_flower,
 	}
 
 	len = sizeof(struct nfp_profile_conf);
-	msg = nfp_flower_cmsg_init(mbuf, NFP_FLOWER_CMSG_TYPE_QOS_MOD, len);
+	msg = nfp_flower_cmsg_init(app_fw_flower, mbuf,
+			NFP_FLOWER_CMSG_TYPE_QOS_MOD, len);
 	rte_memcpy(msg, conf, len);
 
 	cnt = nfp_flower_ctrl_vnic_xmit(app_fw_flower, mbuf);
@@ -513,7 +518,8 @@  nfp_flower_cmsg_qos_delete(struct nfp_app_fw_flower *app_fw_flower,
 	}
 
 	len = sizeof(struct nfp_profile_conf);
-	msg = nfp_flower_cmsg_init(mbuf, NFP_FLOWER_CMSG_TYPE_QOS_DEL, len);
+	msg = nfp_flower_cmsg_init(app_fw_flower, mbuf,
+			NFP_FLOWER_CMSG_TYPE_QOS_DEL, len);
 	rte_memcpy(msg, conf, len);
 
 	cnt = nfp_flower_ctrl_vnic_xmit(app_fw_flower, mbuf);
@@ -542,7 +548,8 @@  nfp_flower_cmsg_qos_stats(struct nfp_app_fw_flower *app_fw_flower,
 	}
 
 	len = sizeof(struct nfp_cfg_head);
-	msg = nfp_flower_cmsg_init(mbuf, NFP_FLOWER_CMSG_TYPE_QOS_STATS, len);
+	msg = nfp_flower_cmsg_init(app_fw_flower, mbuf,
+			NFP_FLOWER_CMSG_TYPE_QOS_STATS, len);
 	rte_memcpy(msg, head, len);
 
 	cnt = nfp_flower_ctrl_vnic_xmit(app_fw_flower, mbuf);
diff --git a/drivers/net/nfp/flower/nfp_flower_representor.c b/drivers/net/nfp/flower/nfp_flower_representor.c
index 607625d204..eb318f66df 100644
--- a/drivers/net/nfp/flower/nfp_flower_representor.c
+++ b/drivers/net/nfp/flower/nfp_flower_representor.c
@@ -465,7 +465,6 @@  nfp_flower_repr_tx_burst(void *tx_queue,
 {
 	uint16_t i;
 	uint16_t sent;
-	char *meta_offset;
 	void *pf_tx_queue;
 	struct nfp_net_txq *txq;
 	struct nfp_net_hw *pf_hw;
@@ -483,12 +482,9 @@  nfp_flower_repr_tx_burst(void *tx_queue,
 	repr_dev = &rte_eth_devices[txq->port_id];
 	repr = repr_dev->data->dev_private;
 
-	for (i = 0; i < nb_pkts; i++) {
-		meta_offset = rte_pktmbuf_prepend(tx_pkts[i], FLOWER_PKT_DATA_OFFSET);
-		*(uint32_t *)meta_offset = rte_cpu_to_be_32(NFP_NET_META_PORTID);
-		meta_offset += 4;
-		*(uint32_t *)meta_offset = rte_cpu_to_be_32(repr->port_id);
-	}
+	for (i = 0; i < nb_pkts; i++)
+		nfp_flower_pkt_add_metadata(repr->app_fw_flower,
+				tx_pkts[i], repr->port_id);
 
 	/* This points to the PF vNIC that owns this representor */
 	pf_hw = txq->hw;
diff --git a/drivers/net/nfp/nfd3/nfp_nfd3.h b/drivers/net/nfp/nfd3/nfp_nfd3.h
index e772bc4711..5bf89868fc 100644
--- a/drivers/net/nfp/nfd3/nfp_nfd3.h
+++ b/drivers/net/nfp/nfd3/nfp_nfd3.h
@@ -153,6 +153,8 @@  nfp_net_nfd3_tx_cksum(struct nfp_net_txq *txq,
 		txd->flags |= NFD3_DESC_TX_CSUM;
 }
 
+uint32_t nfp_flower_nfd3_pkt_add_metadata(struct rte_mbuf *mbuf,
+		uint32_t port_id);
 uint16_t nfp_net_nfd3_xmit_pkts(void *tx_queue,
 		struct rte_mbuf **tx_pkts,
 		uint16_t nb_pkts);
diff --git a/drivers/net/nfp/nfd3/nfp_nfd3_dp.c b/drivers/net/nfp/nfd3/nfp_nfd3_dp.c
index 1a960fbe63..2ad098a699 100644
--- a/drivers/net/nfp/nfd3/nfp_nfd3_dp.c
+++ b/drivers/net/nfp/nfd3/nfp_nfd3_dp.c
@@ -10,8 +10,24 @@ 
 #include "../nfp_logs.h"
 #include "../nfp_common.h"
 #include "../nfp_rxtx.h"
+#include "../flower/nfp_flower.h"
+#include "../flower/nfp_flower_cmsg.h"
 #include "nfp_nfd3.h"
 
+uint32_t
+nfp_flower_nfd3_pkt_add_metadata(struct rte_mbuf *mbuf,
+		uint32_t port_id)
+{
+	char *meta_offset;
+
+	meta_offset = rte_pktmbuf_prepend(mbuf, FLOWER_PKT_DATA_OFFSET);
+	*(rte_be32_t *)meta_offset = rte_cpu_to_be_32(NFP_NET_META_PORTID);
+	meta_offset += NFP_NET_META_HEADER_SIZE;
+	*(rte_be32_t *)meta_offset = rte_cpu_to_be_32(port_id);
+
+	return FLOWER_PKT_DATA_OFFSET;
+}
+
 /*
  * nfp_net_nfd3_tx_vlan() - Set vlan info in the nfd3 tx desc
  *