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 <[email protected]>
Reviewed-by: Niklas Söderlund <[email protected]>
---
 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(-)

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
  *
-- 
2.39.1

Reply via email to