@@ -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;
@@ -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_ */
@@ -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);
@@ -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;
@@ -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);
@@ -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
*