[dpdk-dev] [PATCH 06/12] pmd/i40e: add dev_ptype_info_get implementation

Jianfeng Tan jianfeng.tan at intel.com
Thu Dec 31 07:53:13 CET 2015


Signed-off-by: Jianfeng Tan <jianfeng.tan at intel.com>
---
 drivers/net/i40e/i40e_ethdev.c    |  1 +
 drivers/net/i40e/i40e_ethdev_vf.c |  1 +
 drivers/net/i40e/i40e_rxtx.c      | 69 ++++++++++++++++++++++++++++++++++++++-
 drivers/net/i40e/i40e_rxtx.h      |  2 ++
 4 files changed, 72 insertions(+), 1 deletion(-)

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index bf6220d..1f5251b 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -439,6 +439,7 @@ static const struct eth_dev_ops i40e_eth_dev_ops = {
 	.xstats_reset                 = i40e_dev_stats_reset,
 	.queue_stats_mapping_set      = i40e_dev_queue_stats_mapping_set,
 	.dev_infos_get                = i40e_dev_info_get,
+	.dev_ptype_info_get           = i40e_dev_ptype_info_get,
 	.vlan_filter_set              = i40e_vlan_filter_set,
 	.vlan_tpid_set                = i40e_vlan_tpid_set,
 	.vlan_offload_set             = i40e_vlan_offload_set,
diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
index 14d2a50..5d924de 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -196,6 +196,7 @@ static const struct eth_dev_ops i40evf_eth_dev_ops = {
 	.xstats_reset         = i40evf_dev_xstats_reset,
 	.dev_close            = i40evf_dev_close,
 	.dev_infos_get        = i40evf_dev_info_get,
+	.dev_ptype_info_get   = i40e_dev_ptype_info_get,
 	.vlan_filter_set      = i40evf_vlan_filter_set,
 	.vlan_offload_set     = i40evf_vlan_offload_set,
 	.vlan_pvid_set        = i40evf_vlan_pvid_set,
diff --git a/drivers/net/i40e/i40e_rxtx.c b/drivers/net/i40e/i40e_rxtx.c
index 39d94ec..bf4f504 100644
--- a/drivers/net/i40e/i40e_rxtx.c
+++ b/drivers/net/i40e/i40e_rxtx.c
@@ -194,7 +194,11 @@ i40e_get_iee15888_flags(struct rte_mbuf *mb, uint64_t qword)
 }
 #endif
 
-/* For each value it means, datasheet of hardware can tell more details */
+/*
+ * For each value it means, datasheet of hardware can tell more details
+ *
+ * @note: fix i40e_dev_ptype_info_get() if any change here.
+ */
 static inline uint32_t
 i40e_rxd_pkt_type_mapping(uint8_t ptype)
 {
@@ -2094,6 +2098,69 @@ i40e_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id)
 }
 
 int
+i40e_dev_ptype_info_get(struct rte_eth_dev *dev, uint32_t ptype_mask,
+		uint32_t ptypes[])
+{
+	int num = 0;
+
+	if ((dev->rx_pkt_burst == i40e_recv_pkts)
+			|| (dev->rx_pkt_burst == i40e_recv_scattered_pkts)
+#ifdef RTE_LIBRTE_I40E_RX_ALLOW_BULK_ALLOC
+			|| (dev->rx_pkt_burst == i40e_recv_pkts_bulk_alloc)
+#endif
+	   ) {
+		/* refers to i40e_rxd_pkt_type_mapping() */
+		if ((ptype_mask & RTE_PTYPE_L2_MASK) == RTE_PTYPE_L2_MASK) {
+			ptypes[num++] = RTE_PTYPE_L2_ETHER;
+			ptypes[num++] = RTE_PTYPE_L2_ETHER_TIMESYNC;
+			ptypes[num++] = RTE_PTYPE_L2_ETHER_LLDP;
+			ptypes[num++] = RTE_PTYPE_L2_ETHER_ARP;
+		}
+
+		if ((ptype_mask & RTE_PTYPE_L3_MASK) == RTE_PTYPE_L3_MASK) {
+			ptypes[num++] = RTE_PTYPE_L3_IPV4_EXT_UNKNOWN;
+			ptypes[num++] = RTE_PTYPE_L3_IPV6_EXT_UNKNOWN;
+		}
+
+		if ((ptype_mask & RTE_PTYPE_L4_MASK) == RTE_PTYPE_L4_MASK) {
+			ptypes[num++] = RTE_PTYPE_L4_FRAG;
+			ptypes[num++] = RTE_PTYPE_L4_ICMP;
+			ptypes[num++] = RTE_PTYPE_L4_NONFRAG;
+			ptypes[num++] = RTE_PTYPE_L4_SCTP;
+			ptypes[num++] = RTE_PTYPE_L4_TCP;
+			ptypes[num++] = RTE_PTYPE_L4_UDP;
+		}
+
+		if ((ptype_mask & RTE_PTYPE_TUNNEL_MASK) == RTE_PTYPE_TUNNEL_MASK) {
+			ptypes[num++] = RTE_PTYPE_TUNNEL_GRENAT;
+			ptypes[num++] = RTE_PTYPE_TUNNEL_IP;
+		}
+
+		if ((ptype_mask & RTE_PTYPE_INNER_L2_MASK) == RTE_PTYPE_INNER_L2_MASK) {
+			ptypes[num++] = RTE_PTYPE_INNER_L2_ETHER;
+			ptypes[num++] = RTE_PTYPE_INNER_L2_ETHER_VLAN;
+		}
+
+		if ((ptype_mask & RTE_PTYPE_INNER_L3_MASK) == RTE_PTYPE_INNER_L3_MASK) {
+			ptypes[num++] = RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN;
+			ptypes[num++] = RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN;
+		}
+
+		if ((ptype_mask & RTE_PTYPE_INNER_L4_MASK) == RTE_PTYPE_INNER_L4_MASK) {
+			ptypes[num++] = RTE_PTYPE_INNER_L4_FRAG;
+			ptypes[num++] = RTE_PTYPE_INNER_L4_ICMP;
+			ptypes[num++] = RTE_PTYPE_INNER_L4_NONFRAG;
+			ptypes[num++] = RTE_PTYPE_INNER_L4_SCTP;
+			ptypes[num++] = RTE_PTYPE_INNER_L4_TCP;
+			ptypes[num++] = RTE_PTYPE_INNER_L4_UDP;
+		}
+	} else
+		num = -ENOTSUP;
+
+	return num;
+}
+
+int
 i40e_dev_rx_queue_setup(struct rte_eth_dev *dev,
 			uint16_t queue_idx,
 			uint16_t nb_desc,
diff --git a/drivers/net/i40e/i40e_rxtx.h b/drivers/net/i40e/i40e_rxtx.h
index 5c2f5c2..5350b61 100644
--- a/drivers/net/i40e/i40e_rxtx.h
+++ b/drivers/net/i40e/i40e_rxtx.h
@@ -200,6 +200,8 @@ int i40e_dev_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id);
 int i40e_dev_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id);
 int i40e_dev_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id);
 int i40e_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id);
+int i40e_dev_ptype_info_get(struct rte_eth_dev *dev, uint32_t ptype_mask,
+		uint32_t ptypes[]);
 int i40e_dev_rx_queue_setup(struct rte_eth_dev *dev,
 			    uint16_t queue_idx,
 			    uint16_t nb_desc,
-- 
2.1.4



More information about the dev mailing list