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

