DPDK patches and discussions
 help / color / mirror / Atom feed
From: Jianfeng Tan <jianfeng.tan@intel.com>
To: dev@dpdk.org
Subject: [dpdk-dev] [PATCH] examples/l3fwd: fix using packet type blindly
Date: Tue,  1 Mar 2016 09:23:36 +0800	[thread overview]
Message-ID: <1456795416-118189-1-git-send-email-jianfeng.tan@intel.com> (raw)
In-Reply-To: <1451544799-70776-1-git-send-email-jianfeng.tan@intel.com>

As a example to use ptype info, l3fwd needs firstly to use
rte_eth_dev_get_ptype_info() API to check if device and/or
its PMD driver will parse and fill the needed packet type;
if not, use the newly added option, --parse-ptype, to
analyze it in the callback softly.

As the mode of EXACT_MATCH uses the 5 tuples to caculate
hash, so we narrow down its scope to:
  a. ip packets with no extensions, and
  b. L4 payload should be either tcp or udp.

Note: this patch does not completely solve the issue, "cannot
run l3fwd on virtio or other devices", because hw_ip_checksum
may be not supported by the devices. Currently we can: option
1, remove this requirements; option 2, wait for virtio front
end (pmd) to support it.

Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
---
 doc/guides/rel_notes/release_16_04.rst  |  5 ++
 doc/guides/sample_app_ug/l3_forward.rst |  6 ++-
 examples/l3fwd/l3fwd.h                  | 12 +++++
 examples/l3fwd/l3fwd_em.c               | 94 +++++++++++++++++++++++++++++++++
 examples/l3fwd/l3fwd_lpm.c              | 57 ++++++++++++++++++++
 examples/l3fwd/main.c                   | 50 ++++++++++++++++++
 6 files changed, 223 insertions(+), 1 deletion(-)

diff --git a/doc/guides/rel_notes/release_16_04.rst b/doc/guides/rel_notes/release_16_04.rst
index 64e913d..4d6260e 100644
--- a/doc/guides/rel_notes/release_16_04.rst
+++ b/doc/guides/rel_notes/release_16_04.rst
@@ -68,6 +68,11 @@ This section should contain bug fixes added to the relevant sections. Sample for
   vhost-switch often fails to allocate mbuf when dequeue from vring because it
   wrongly calculates the number of mbufs needed.
 
+* **examples/l3fwd: Fixed using packet type blindly.**
+
+  l3fwd makes use of packet type information without even query if devices or PMDs
+  really set it. For those don't set ptypes, add an option to parse it softly.
+
 
 EAL
 ~~~
diff --git a/doc/guides/sample_app_ug/l3_forward.rst b/doc/guides/sample_app_ug/l3_forward.rst
index 4ce734b..e0c22e3 100644
--- a/doc/guides/sample_app_ug/l3_forward.rst
+++ b/doc/guides/sample_app_ug/l3_forward.rst
@@ -93,7 +93,7 @@ The application has a number of command line options:
 
 .. code-block:: console
 
-    ./build/l3fwd [EAL options] -- -p PORTMASK [-P]  --config(port,queue,lcore)[,(port,queue,lcore)] [--enable-jumbo [--max-pkt-len PKTLEN]]  [--no-numa][--hash-entry-num][--ipv6]
+    ./build/l3fwd [EAL options] -- -p PORTMASK [-P]  --config(port,queue,lcore)[,(port,queue,lcore)] [--enable-jumbo [--max-pkt-len PKTLEN]]  [--no-numa][--hash-entry-num][--ipv6] [--parse-ptype]
 
 where,
 
@@ -114,6 +114,8 @@ where,
 
 *   --ipv6: optional, set it if running ipv6 packets
 
+*   --parse-ptype: optional, set it if use software way to analyze packet type
+
 For example, consider a dual processor socket platform where cores 0-7 and 16-23 appear on socket 0, while cores 8-15 and 24-31 appear on socket 1.
 Let's say that the programmer wants to use memory from both NUMA nodes, the platform has only two ports, one connected to each NUMA node,
 and the programmer wants to use two cores from each processor socket to do the packet processing.
@@ -334,6 +336,8 @@ The key code snippet of simple_ipv4_fwd_4pkts() is shown below:
 
 The simple_ipv6_fwd_4pkts() function is similar to the simple_ipv4_fwd_4pkts() function.
 
+Known issue: IP packets with extensions or IP packets which are not TCP/UDP cannot work well with this mode.
+
 Packet Forwarding for LPM-based Lookups
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h
index da6d369..966c83b 100644
--- a/examples/l3fwd/l3fwd.h
+++ b/examples/l3fwd/l3fwd.h
@@ -198,6 +198,18 @@ void
 setup_hash(const int socketid);
 
 int
+em_check_ptype(int portid);
+
+int
+lpm_check_ptype(int portid);
+
+void
+em_parse_ptype(struct rte_mbuf *);
+
+void
+lpm_parse_ptype(struct rte_mbuf *);
+
+int
 em_main_loop(__attribute__((unused)) void *dummy);
 
 int
diff --git a/examples/l3fwd/l3fwd_em.c b/examples/l3fwd/l3fwd_em.c
index f6a65d8..1061baf 100644
--- a/examples/l3fwd/l3fwd_em.c
+++ b/examples/l3fwd/l3fwd_em.c
@@ -42,6 +42,7 @@
 #include <errno.h>
 #include <getopt.h>
 #include <stdbool.h>
+#include <netinet/in.h>
 
 #include <rte_debug.h>
 #include <rte_ether.h>
@@ -508,6 +509,99 @@ populate_ipv6_many_flow_into_table(const struct rte_hash *h,
 	printf("Hash: Adding 0x%x keys\n", nr_flow);
 }
 
+/* Requirements:
+ * 1. IP packets without extension;
+ * 2. L4 payload should be either TCP or UDP.
+ */
+int
+em_check_ptype(int portid)
+{
+	int i, ret;
+	int ptype_l3_ipv4_ext = 0;
+	int ptype_l3_ipv6_ext = 0;
+	int ptype_l4_tcp = 0;
+	int ptype_l4_udp = 0;
+
+	ret = rte_eth_dev_get_ptype_info(portid,
+					 RTE_PTYPE_L3_MASK | RTE_PTYPE_L4_MASK,
+					 NULL, 0);
+	if (ret <= 0)
+		return 0;
+
+	uint32_t ptypes[ret];
+
+	ret = rte_eth_dev_get_ptype_info(portid,
+					 RTE_PTYPE_L3_MASK | RTE_PTYPE_L4_MASK,
+					 ptypes, ret);
+	for (i = 0; i < ret; ++i) {
+		switch (ptypes[i]) {
+		case RTE_PTYPE_L3_IPV4_EXT:
+			ptype_l3_ipv4_ext = 1;
+			break;
+		case RTE_PTYPE_L3_IPV6_EXT:
+			ptype_l3_ipv6_ext = 1;
+			break;
+		case RTE_PTYPE_L4_TCP:
+			ptype_l4_tcp = 1;
+			break;
+		case RTE_PTYPE_L4_UDP:
+			ptype_l4_udp = 1;
+			break;
+		}
+	}
+
+	if (ptype_l3_ipv4_ext == 0)
+		printf("port %d cannot parse RTE_PTYPE_L3_IPV4_EXT\n", portid);
+	if (ptype_l3_ipv6_ext == 0)
+		printf("port %d cannot parse RTE_PTYPE_L3_IPV6_EXT\n", portid);
+	if (ptype_l3_ipv4_ext && ptype_l3_ipv6_ext)
+		return 1;
+
+	if (ptype_l4_tcp == 0)
+		printf("port %d cannot parse RTE_PTYPE_L4_TCP\n", portid);
+	if (ptype_l4_udp == 0)
+		printf("port %d cannot parse RTE_PTYPE_L4_UDP\n", portid);
+	if (ptype_l4_tcp || ptype_l4_udp)
+		return 1;
+
+	return 0;
+}
+
+void
+em_parse_ptype(struct rte_mbuf *m)
+{
+	struct ether_hdr *eth_hdr;
+	uint32_t packet_type = 0;
+	uint16_t ethertype;
+	void *l4;
+	int hdr_len;
+	struct ipv4_hdr *ipv4_hdr;
+	struct ipv6_hdr *ipv6_hdr;
+
+	eth_hdr = rte_pktmbuf_mtod(m, struct ether_hdr *);
+	ethertype = rte_be_to_cpu_16(eth_hdr->ether_type);
+	l4 = (uint8_t *)eth_hdr + sizeof(struct ether_hdr);
+	switch (ethertype) {
+	case ETHER_TYPE_IPv4:
+		ipv4_hdr = (struct ipv4_hdr *)l4;
+		hdr_len = (ipv4_hdr->version_ihl & IPV4_HDR_IHL_MASK) *
+			  IPV4_IHL_MULTIPLIER;
+		if (hdr_len == sizeof(struct ipv4_hdr) &&
+		    (ipv4_hdr->next_proto_id == IPPROTO_TCP ||
+		     ipv4_hdr->next_proto_id == IPPROTO_UDP))
+			packet_type |= RTE_PTYPE_L3_IPV4;
+		break;
+	case ETHER_TYPE_IPv6:
+		ipv6_hdr = (struct ipv6_hdr *)l4;
+		if (ipv6_hdr->proto == IPPROTO_TCP ||
+		    ipv6_hdr->proto == IPPROTO_UDP)
+			packet_type |= RTE_PTYPE_L3_IPV6;
+		break;
+	}
+
+	m->packet_type |= packet_type;
+}
+
 /* main processing loop */
 int
 em_main_loop(__attribute__((unused)) void *dummy)
diff --git a/examples/l3fwd/l3fwd_lpm.c b/examples/l3fwd/l3fwd_lpm.c
index e0ed3c4..981227a 100644
--- a/examples/l3fwd/l3fwd_lpm.c
+++ b/examples/l3fwd/l3fwd_lpm.c
@@ -280,6 +280,63 @@ setup_lpm(const int socketid)
 	}
 }
 
+int
+lpm_check_ptype(int portid)
+{
+	int i, ret;
+	int ptype_l3_ipv4 = 0, ptype_l3_ipv6 = 0;
+
+	ret = rte_eth_dev_get_ptype_info(portid, RTE_PTYPE_L3_MASK, NULL, 0);
+	if (ret <= 0)
+		return 0;
+
+	uint32_t ptypes[ret];
+
+	ret = rte_eth_dev_get_ptype_info(portid, RTE_PTYPE_L3_MASK,
+					 ptypes, ret);
+	for (i = 0; i < ret; ++i) {
+		if (ptypes[i] & RTE_PTYPE_L3_IPV4)
+			ptype_l3_ipv4 = 1;
+		if (ptypes[i] & RTE_PTYPE_L3_IPV6)
+			ptype_l3_ipv6 = 1;
+	}
+
+	if (ptype_l3_ipv4 == 0)
+		printf("port %d cannot parse RTE_PTYPE_L3_IPV4\n", portid);
+
+	if (ptype_l3_ipv6 == 0)
+		printf("port %d cannot parse RTE_PTYPE_L3_IPV6\n", portid);
+
+	if (ptype_l3_ipv4 && ptype_l3_ipv6)
+		return 1;
+
+	return 0;
+
+}
+
+void
+lpm_parse_ptype(struct rte_mbuf *m)
+{
+	struct ether_hdr *eth_hdr;
+	uint32_t packet_type = 0;
+	uint16_t ethertype;
+
+	eth_hdr = rte_pktmbuf_mtod(m, struct ether_hdr *);
+	ethertype = rte_be_to_cpu_16(eth_hdr->ether_type);
+	switch (ethertype) {
+	case ETHER_TYPE_IPv4:
+		packet_type |= RTE_PTYPE_L3_IPV4_EXT_UNKNOWN;
+		break;
+	case ETHER_TYPE_IPv6:
+		packet_type |= RTE_PTYPE_L3_IPV6_EXT_UNKNOWN;
+		break;
+	default:
+		break;
+	}
+
+	m->packet_type |= packet_type;
+}
+
 /* Return ipv4/ipv6 lpm fwd lookup struct. */
 void *
 lpm_get_ipv4_l3fwd_lookup_struct(const int socketid)
diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
index 0e33039..8889828 100644
--- a/examples/l3fwd/main.c
+++ b/examples/l3fwd/main.c
@@ -103,6 +103,8 @@ static int l3fwd_lpm_on;
 static int l3fwd_em_on;
 
 static int numa_on = 1; /**< NUMA is enabled by default. */
+static int parse_ptype; /**< Parse packet type using rx callback, and */
+			/**< disabled by default */
 
 /* Global variables. */
 
@@ -172,6 +174,8 @@ static struct rte_mempool * pktmbuf_pool[NB_SOCKETS];
 
 struct l3fwd_lkp_mode {
 	void  (*setup)(int);
+	int   (*check_ptype)(int);
+	void  (*parse_ptype)(struct rte_mbuf *);
 	int   (*main_loop)(void *);
 	void* (*get_ipv4_lookup_struct)(int);
 	void* (*get_ipv6_lookup_struct)(int);
@@ -181,6 +185,8 @@ static struct l3fwd_lkp_mode l3fwd_lkp;
 
 static struct l3fwd_lkp_mode l3fwd_em_lkp = {
 	.setup                  = setup_hash,
+	.check_ptype		= em_check_ptype,
+	.parse_ptype		= em_parse_ptype,
 	.main_loop              = em_main_loop,
 	.get_ipv4_lookup_struct = em_get_ipv4_l3fwd_lookup_struct,
 	.get_ipv6_lookup_struct = em_get_ipv6_l3fwd_lookup_struct,
@@ -188,6 +194,8 @@ static struct l3fwd_lkp_mode l3fwd_em_lkp = {
 
 static struct l3fwd_lkp_mode l3fwd_lpm_lkp = {
 	.setup                  = setup_lpm,
+	.check_ptype		= lpm_check_ptype,
+	.parse_ptype		= lpm_parse_ptype,
 	.main_loop              = lpm_main_loop,
 	.get_ipv4_lookup_struct = lpm_get_ipv4_l3fwd_lookup_struct,
 	.get_ipv6_lookup_struct = lpm_get_ipv6_l3fwd_lookup_struct,
@@ -209,6 +217,22 @@ setup_l3fwd_lookup_tables(void)
 		l3fwd_lkp = l3fwd_lpm_lkp;
 }
 
+static uint16_t
+cb_parse_packet_type(uint8_t port __rte_unused,
+		     uint16_t queue __rte_unused,
+		     struct rte_mbuf *pkts[],
+		     uint16_t nb_pkts,
+		     uint16_t max_pkts __rte_unused,
+		     void *user_param __rte_unused)
+{
+	unsigned i;
+
+	for (i = 0; i < nb_pkts; ++i)
+		l3fwd_lkp.parse_ptype(pkts[i]);
+
+	return nb_pkts;
+}
+
 static int
 check_lcore_params(void)
 {
@@ -456,6 +480,7 @@ parse_eth_dest(const char *optarg)
 #define CMD_LINE_OPT_IPV6 "ipv6"
 #define CMD_LINE_OPT_ENABLE_JUMBO "enable-jumbo"
 #define CMD_LINE_OPT_HASH_ENTRY_NUM "hash-entry-num"
+#define CMD_LINE_OPT_PARSE_PTYPE "parse-ptype"
 
 /*
  * This expression is used to calculate the number of mbufs needed
@@ -486,6 +511,7 @@ parse_args(int argc, char **argv)
 		{CMD_LINE_OPT_IPV6, 0, 0, 0},
 		{CMD_LINE_OPT_ENABLE_JUMBO, 0, 0, 0},
 		{CMD_LINE_OPT_HASH_ENTRY_NUM, 1, 0, 0},
+		{CMD_LINE_OPT_PARSE_PTYPE, 0, 0, 0},
 		{NULL, 0, 0, 0}
 	};
 
@@ -612,6 +638,14 @@ parse_args(int argc, char **argv)
 					return -1;
 				}
 			}
+
+			if (!strncmp(lgopts[option_index].name,
+				     CMD_LINE_OPT_PARSE_PTYPE,
+				     sizeof(CMD_LINE_OPT_PARSE_PTYPE))) {
+				printf("soft parse-ptype is enabled\n");
+				parse_ptype = 1;
+			}
+
 			break;
 
 		default:
@@ -938,6 +972,22 @@ main(int argc, char **argv)
 				rte_exit(EXIT_FAILURE,
 				"rte_eth_rx_queue_setup: err=%d, port=%d\n",
 				ret, portid);
+
+			ret = l3fwd_lkp.check_ptype(portid);
+			if (ret)
+				continue;
+			if (!parse_ptype)
+				rte_exit(EXIT_FAILURE,
+					 "port %d cannot parse packet type, please add --%s\n",
+					 portid, CMD_LINE_OPT_PARSE_PTYPE);
+
+			if (rte_eth_add_rx_callback(portid, queueid,
+						    cb_parse_packet_type,
+						    NULL))
+				continue;
+			rte_exit(EXIT_FAILURE,
+				 "Failed to add rx callback: port=%d\n",
+				 portid);
 		}
 	}
 
-- 
2.1.4

  parent reply	other threads:[~2016-03-01  8:24 UTC|newest]

Thread overview: 202+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-31  6:53 [dpdk-dev] [PATCH 00/12] Add API to get packet type info Jianfeng Tan
2015-12-31  6:53 ` [dpdk-dev] [PATCH 01/12] ethdev: add API to query what/if packet type is set Jianfeng Tan
2016-01-04 11:38   ` Adrien Mazarguil
2016-01-04 14:36     ` Ananyev, Konstantin
2016-01-05 16:14       ` Nélio Laranjeiro
2016-01-05 16:50         ` Ananyev, Konstantin
2016-01-06 10:00           ` Adrien Mazarguil
2016-01-06 14:29             ` Ananyev, Konstantin
2016-01-06 15:44               ` Adrien Mazarguil
2016-01-06 16:44                 ` Ananyev, Konstantin
2016-01-06 17:22                   ` Adrien Mazarguil
2016-01-07 10:24                     ` Ananyev, Konstantin
2016-01-07 13:32                       ` Adrien Mazarguil
2016-01-11  7:39                         ` Tan, Jianfeng
2016-01-11 10:26                           ` Ananyev, Konstantin
2015-12-31  6:53 ` [dpdk-dev] [PATCH 02/12] pmd/cxgbe: add dev_ptype_info_get implementation Jianfeng Tan
2016-01-06  7:11   ` Rahul Lakkireddy
2016-01-06  8:23     ` Tan, Jianfeng
2015-12-31  6:53 ` [dpdk-dev] [PATCH 03/12] pmd/e1000: " Jianfeng Tan
2015-12-31  6:53 ` [dpdk-dev] [PATCH 04/12] pmd/enic: " Jianfeng Tan
2015-12-31  6:53 ` [dpdk-dev] [PATCH 05/12] pmd/fm10k: " Jianfeng Tan
2015-12-31  6:53 ` [dpdk-dev] [PATCH 06/12] pmd/i40e: " Jianfeng Tan
2015-12-31  6:53 ` [dpdk-dev] [PATCH 07/12] pmd/ixgbe: " Jianfeng Tan
2016-01-04 18:12   ` Ananyev, Konstantin
2016-01-05  1:25     ` Tan, Jianfeng
2015-12-31  6:53 ` [dpdk-dev] [PATCH 08/12] pmd/mlx4: " Jianfeng Tan
2016-01-04 11:11   ` Adrien Mazarguil
2016-01-05  3:08     ` Tan, Jianfeng
2016-01-05 16:18       ` Adrien Mazarguil
2016-01-11  5:07         ` Tan, Jianfeng
2015-12-31  6:53 ` [dpdk-dev] [PATCH 09/12] pmd/mlx5: " Jianfeng Tan
2015-12-31  6:53 ` [dpdk-dev] [PATCH 10/12] pmd/nfp: " Jianfeng Tan
2015-12-31  6:53 ` [dpdk-dev] [PATCH 11/12] pmd/vmxnet3: " Jianfeng Tan
2015-12-31  6:53 ` [dpdk-dev] [PATCH 12/12] examples/l3fwd: add option to parse ptype Jianfeng Tan
2016-01-04 18:32   ` Ananyev, Konstantin
2016-01-05  2:44     ` Tan, Jianfeng
2016-01-05 16:49       ` Ananyev, Konstantin
2016-01-07  1:20         ` Tan, Jianfeng
2016-01-07  9:44           ` Ananyev, Konstantin
2016-01-13  1:52 ` [dpdk-dev] [PATCH 00/12] Add API to get packet type info Qiu, Michael
2016-01-15  5:45 ` [dpdk-dev] [PATCH v2 " Jianfeng Tan
2016-01-15  5:45   ` [dpdk-dev] [PATCH v2 01/12] ethdev: add API to query packet type filling info Jianfeng Tan
2016-01-15 13:58     ` Adrien Mazarguil
2016-01-15 15:11       ` Ananyev, Konstantin
2016-01-15 15:33         ` Adrien Mazarguil
2016-01-15 15:03     ` Ananyev, Konstantin
2016-02-25  6:53       ` Tan, Jianfeng
2016-02-25 11:17         ` Ananyev, Konstantin
2016-02-25 14:57           ` Tan, Jianfeng
2016-01-15  5:45   ` [dpdk-dev] [PATCH v2 02/12] pmd/cxgbe: add dev_ptype_info_get implementation Jianfeng Tan
2016-01-15  5:45   ` [dpdk-dev] [PATCH v2 03/12] pmd/e1000: " Jianfeng Tan
2016-01-15  5:45   ` [dpdk-dev] [PATCH v2 04/12] pmd/enic: " Jianfeng Tan
2016-01-15  5:45   ` [dpdk-dev] [PATCH v2 05/12] pmd/fm10k: " Jianfeng Tan
2016-01-15  5:45   ` [dpdk-dev] [PATCH v2 06/12] pmd/i40e: " Jianfeng Tan
2016-01-15  5:45   ` [dpdk-dev] [PATCH v2 07/12] pmd/ixgbe: " Jianfeng Tan
2016-01-15 14:50     ` Ananyev, Konstantin
2016-02-25  6:43       ` Tan, Jianfeng
2016-02-25 11:10         ` Ananyev, Konstantin
2016-01-15  5:45   ` [dpdk-dev] [PATCH v2 08/12] pmd/mlx4: " Jianfeng Tan
2016-01-15  5:45   ` [dpdk-dev] [PATCH v2 09/12] pmd/mlx5: " Jianfeng Tan
2016-01-15  5:45   ` [dpdk-dev] [PATCH v2 10/12] pmd/nfp: " Jianfeng Tan
2016-01-15  5:45   ` [dpdk-dev] [PATCH v2 11/12] pmd/vmxnet3: " Jianfeng Tan
2016-01-15  5:45   ` [dpdk-dev] [PATCH v2 12/12] examples/l3fwd: add option to parse ptype Jianfeng Tan
2016-01-15 14:47     ` Ananyev, Konstantin
2016-02-25 10:41       ` Tan, Jianfeng
2016-02-25 10:57         ` Ananyev, Konstantin
2016-02-23 17:31   ` [dpdk-dev] [PATCH v2 00/12] Add API to get packet type info Bruce Richardson
2016-02-25  7:53 ` [dpdk-dev] [PATCH v3 " Jianfeng Tan
2016-02-25  7:53   ` [dpdk-dev] [PATCH v3 01/12] ethdev: add API to query packet type filling info Jianfeng Tan
2016-02-25 15:46     ` Ananyev, Konstantin
2016-02-25 16:36       ` Tan, Jianfeng
2016-02-25 17:16         ` Ananyev, Konstantin
2016-02-26  1:42           ` Tan, Jianfeng
2016-02-25  7:53   ` [dpdk-dev] [PATCH v3 02/12] pmd/cxgbe: add dev_ptype_info_get implementation Jianfeng Tan
2016-02-25  7:53   ` [dpdk-dev] [PATCH v3 03/12] pmd/e1000: " Jianfeng Tan
2016-02-25  7:53   ` [dpdk-dev] [PATCH v3 04/12] pmd/enic: " Jianfeng Tan
2016-02-25  7:53   ` [dpdk-dev] [PATCH v3 05/12] pmd/fm10k: " Jianfeng Tan
2016-02-25  7:53   ` [dpdk-dev] [PATCH v3 06/12] pmd/i40e: " Jianfeng Tan
2016-02-25  7:53   ` [dpdk-dev] [PATCH v3 07/12] pmd/ixgbe: " Jianfeng Tan
2016-02-25  7:53   ` [dpdk-dev] [PATCH v3 08/12] pmd/mlx4: " Jianfeng Tan
2016-02-25  7:53   ` [dpdk-dev] [PATCH v3 09/12] pmd/mlx5: " Jianfeng Tan
2016-02-25  7:54   ` [dpdk-dev] [PATCH v3 10/12] pmd/nfp: " Jianfeng Tan
2016-02-25  7:54   ` [dpdk-dev] [PATCH v3 11/12] pmd/vmxnet3: " Jianfeng Tan
2016-02-25  7:54   ` [dpdk-dev] [PATCH v3 12/12] examples/l3fwd: add option to parse ptype Jianfeng Tan
2016-02-26  0:04 ` [dpdk-dev] [PATCH v4 00/12] Add API to get packet type info Jianfeng Tan
2016-02-26  0:04   ` [dpdk-dev] [PATCH v4 01/12] ethdev: add API to query packet type filling info Jianfeng Tan
2016-02-26  0:09 ` [dpdk-dev] [PATCH v4 00/12] Add API to get packet type info Jianfeng Tan
2016-02-26  0:09   ` [dpdk-dev] [PATCH v4 01/12] ethdev: add API to query packet type filling info Jianfeng Tan
2016-02-26  0:09   ` [dpdk-dev] [PATCH v4 02/12] pmd/cxgbe: add dev_ptype_info_get implementation Jianfeng Tan
2016-02-26  0:09   ` [dpdk-dev] [PATCH v4 03/12] pmd/e1000: " Jianfeng Tan
2016-02-26  0:09   ` [dpdk-dev] [PATCH v4 04/12] pmd/enic: " Jianfeng Tan
2016-02-26  0:09   ` [dpdk-dev] [PATCH v4 05/12] pmd/fm10k: " Jianfeng Tan
2016-03-02 20:11     ` Chen, Jing D
2016-03-03  6:03       ` Tan, Jianfeng
2016-03-03 15:47         ` Ananyev, Konstantin
2016-02-26  0:09   ` [dpdk-dev] [PATCH v4 06/12] pmd/i40e: " Jianfeng Tan
2016-02-26  0:09   ` [dpdk-dev] [PATCH v4 07/12] pmd/ixgbe: " Jianfeng Tan
2016-02-26  0:09   ` [dpdk-dev] [PATCH v4 08/12] pmd/mlx4: " Jianfeng Tan
2016-02-26  0:09   ` [dpdk-dev] [PATCH v4 09/12] pmd/mlx5: " Jianfeng Tan
2016-02-26  8:26     ` Adrien Mazarguil
2016-02-26  8:36       ` Tan, Jianfeng
2016-02-26  0:09   ` [dpdk-dev] [PATCH v4 10/12] pmd/nfp: " Jianfeng Tan
2016-02-26  0:09   ` [dpdk-dev] [PATCH v4 11/12] pmd/vmxnet3: " Jianfeng Tan
2016-02-26  0:09   ` [dpdk-dev] [PATCH v4 12/12] examples/l3fwd: add option to parse ptype Jianfeng Tan
2016-02-26 13:14     ` Ananyev, Konstantin
2016-02-26 14:21       ` Tan, Jianfeng
2016-02-26 14:27         ` Ananyev, Konstantin
2016-02-26  7:34 ` [dpdk-dev] [PATCH v5 00/11] Add API to get packet type info Jianfeng Tan
2016-02-26  7:34   ` [dpdk-dev] [PATCH v5 01/11] ethdev: add API to query packet type filling info Jianfeng Tan
2016-02-29 11:34     ` Panu Matilainen
2016-02-29 16:41       ` Tan, Jianfeng
2016-03-01  6:29         ` Panu Matilainen
2016-03-01  7:59           ` Thomas Monjalon
2016-03-01  8:00           ` Tan, Jianfeng
2016-02-26  7:34   ` [dpdk-dev] [PATCH v5 02/11] pmd/cxgbe: add dev_ptype_info_get implementation Jianfeng Tan
2016-02-26  7:34   ` [dpdk-dev] [PATCH v5 03/11] pmd/e1000: " Jianfeng Tan
2016-02-26  7:34   ` [dpdk-dev] [PATCH v5 04/11] pmd/enic: " Jianfeng Tan
2016-02-26  7:34   ` [dpdk-dev] [PATCH v5 05/11] pmd/fm10k: " Jianfeng Tan
2016-02-26  7:34   ` [dpdk-dev] [PATCH v5 06/11] pmd/i40e: " Jianfeng Tan
2016-02-26  7:34   ` [dpdk-dev] [PATCH v5 07/11] pmd/ixgbe: " Jianfeng Tan
2016-02-26  7:34   ` [dpdk-dev] [PATCH v5 08/11] pmd/mlx4: " Jianfeng Tan
2016-02-26  7:34   ` [dpdk-dev] [PATCH v5 09/11] pmd/mlx5: " Jianfeng Tan
2016-02-26  7:34   ` [dpdk-dev] [PATCH v5 10/11] pmd/nfp: " Jianfeng Tan
2016-02-26  7:34   ` [dpdk-dev] [PATCH v5 11/11] pmd/vmxnet3: " Jianfeng Tan
2016-02-29 16:54   ` [dpdk-dev] [PATCH v5 00/11] Add API to get packet type info Ananyev, Konstantin
2016-02-29 17:01     ` Adrien Mazarguil
2016-02-29 20:30 ` [dpdk-dev] [PATCH v6 " Jianfeng Tan
2016-02-29 20:30   ` [dpdk-dev] [PATCH v6 01/11] ethdev: add API to query packet type filling info Jianfeng Tan
2016-02-29 20:30   ` [dpdk-dev] [PATCH v6 02/11] pmd/cxgbe: add dev_ptype_info_get implementation Jianfeng Tan
2016-02-29 20:30   ` [dpdk-dev] [PATCH v6 03/11] pmd/e1000: " Jianfeng Tan
2016-02-29 20:30   ` [dpdk-dev] [PATCH v6 04/11] pmd/enic: " Jianfeng Tan
2016-02-29 20:30   ` [dpdk-dev] [PATCH v6 05/11] pmd/fm10k: " Jianfeng Tan
2016-02-29 20:30   ` [dpdk-dev] [PATCH v6 06/11] pmd/i40e: " Jianfeng Tan
2016-02-29 20:30   ` [dpdk-dev] [PATCH v6 07/11] pmd/ixgbe: " Jianfeng Tan
2016-02-29 20:30   ` [dpdk-dev] [PATCH v6 08/11] pmd/mlx4: " Jianfeng Tan
2016-02-29 20:30   ` [dpdk-dev] [PATCH v6 09/11] pmd/mlx5: " Jianfeng Tan
2016-02-29 20:30   ` [dpdk-dev] [PATCH v6 10/11] pmd/nfp: " Jianfeng Tan
2016-02-29 20:30   ` [dpdk-dev] [PATCH v6 11/11] pmd/vmxnet3: " Jianfeng Tan
2016-03-01  1:23 ` Jianfeng Tan [this message]
2016-03-01 13:51   ` [dpdk-dev] [PATCH] examples/l3fwd: fix using packet type blindly Ananyev, Konstantin
2016-03-01 14:17     ` Tan, Jianfeng
2016-03-01 14:30       ` Ananyev, Konstantin
2016-03-04  8:38   ` [dpdk-dev] [PATCH v2] " Jianfeng Tan
2016-03-07 18:51     ` Ananyev, Konstantin
2016-03-08 17:11       ` Tan, Jianfeng
2016-03-10  5:50   ` [dpdk-dev] [PATCH v3 0/2] " Jianfeng Tan
2016-03-10  5:50     ` [dpdk-dev] [PATCH v3 1/2] " Jianfeng Tan
2016-03-10  5:50     ` [dpdk-dev] [PATCH v3 2/2] config: enable vector driver by default Jianfeng Tan
2016-03-10 14:26     ` [dpdk-dev] [PATCH v3 0/2] examples/l3fwd: fix using packet type blindly Ananyev, Konstantin
2016-03-25  0:47   ` [dpdk-dev] [PATCH v4 0/3] packet type Jianfeng Tan
2016-03-25  0:47     ` [dpdk-dev] [PATCH v4 1/3] ethdev: refine API to query supported packet types Jianfeng Tan
2016-03-25  3:15       ` [dpdk-dev] [PATCH 0/2] ethdev: refine new API to query supported ptypes Jianfeng Tan
2016-03-25  3:15         ` [dpdk-dev] [PATCH 1/2] " Jianfeng Tan
2016-03-25  3:15         ` [dpdk-dev] [PATCH 2/2] doc: update which PMDs can parse packet type Jianfeng Tan
2016-03-25 14:21           ` Bruce Richardson
2016-03-25 16:10             ` Tan, Jianfeng
2016-04-01 15:55               ` Thomas Monjalon
2016-03-25 10:57         ` [dpdk-dev] [PATCH 0/2] ethdev: refine new API to query supported ptypes Ananyev, Konstantin
2016-04-06  3:51         ` [dpdk-dev] [PATCH v2] " Jianfeng Tan
2016-04-06 14:32           ` Thomas Monjalon
2016-03-25 10:01       ` [dpdk-dev] [PATCH v4 1/3] ethdev: refine API to query supported packet types Tan, Jianfeng
2016-03-25 10:13       ` Bruce Richardson
2016-03-25  0:47     ` [dpdk-dev] [PATCH v4 2/3] examples/l3fwd: fix using packet type blindly Jianfeng Tan
2016-03-25 18:24       ` Thomas Monjalon
2016-03-25  0:47     ` [dpdk-dev] [PATCH v4 3/3] config: enable vector driver by default Jianfeng Tan
2016-03-25 18:34     ` [dpdk-dev] [PATCH v4 0/3] packet type Thomas Monjalon
2016-03-09 19:31 ` [dpdk-dev] [PATCH v7 00/11] Add API to get packet type info Jianfeng Tan
2016-03-09 19:31   ` [dpdk-dev] [PATCH v7 01/11] ethdev: add API to query packet type filling info Jianfeng Tan
2016-03-10 14:28     ` Bruce Richardson
2016-03-14  9:44     ` Thomas Monjalon
2016-03-14  9:48       ` Bruce Richardson
2016-03-09 19:31   ` [dpdk-dev] [PATCH v7 02/11] pmd/cxgbe: add dev_ptype_info_get implementation Jianfeng Tan
2016-03-09 19:31   ` [dpdk-dev] [PATCH v7 03/11] pmd/e1000: " Jianfeng Tan
2016-03-09 19:31   ` [dpdk-dev] [PATCH v7 04/11] pmd/enic: " Jianfeng Tan
2016-03-10 14:50     ` Bruce Richardson
2016-03-10 14:51       ` Bruce Richardson
2016-03-10 18:23         ` Tan, Jianfeng
2016-03-09 19:31   ` [dpdk-dev] [PATCH v7 05/11] pmd/fm10k: " Jianfeng Tan
2016-03-09 19:31   ` [dpdk-dev] [PATCH v7 06/11] pmd/i40e: " Jianfeng Tan
2016-03-09 19:31   ` [dpdk-dev] [PATCH v7 07/11] pmd/ixgbe: " Jianfeng Tan
2016-03-09 19:31   ` [dpdk-dev] [PATCH v7 08/11] pmd/mlx4: " Jianfeng Tan
2016-03-09 19:31   ` [dpdk-dev] [PATCH v7 09/11] pmd/mlx5: " Jianfeng Tan
2016-03-09 19:31   ` [dpdk-dev] [PATCH v7 10/11] pmd/nfp: " Jianfeng Tan
2016-03-09 19:31   ` [dpdk-dev] [PATCH v7 11/11] pmd/vmxnet3: " Jianfeng Tan
2016-03-10 14:55   ` [dpdk-dev] [PATCH v7 00/11] Add API to get packet type info Bruce Richardson
2016-03-14  7:42 ` [dpdk-dev] [PATCH v8 00/11] Add API to get supported packet types Jianfeng Tan
2016-03-14  7:42   ` [dpdk-dev] [PATCH v8 01/11] ethdev: add API to query " Jianfeng Tan
2016-03-14 17:14     ` Ferruh Yigit
2016-03-14 20:50       ` [dpdk-dev] [PATCH v9 " Jianfeng Tan
2016-03-18  9:17         ` Tan, Jianfeng
2016-03-15  1:42       ` [dpdk-dev] [PATCH v8 " Tan, Jianfeng
2016-03-14  7:42   ` [dpdk-dev] [PATCH v8 02/11] cxgbe: add dev_supported_ptypes_get implementation Jianfeng Tan
2016-03-14  7:42   ` [dpdk-dev] [PATCH v8 03/11] e1000: " Jianfeng Tan
2016-03-14  7:42   ` [dpdk-dev] [PATCH v8 04/11] enic: " Jianfeng Tan
2016-03-14  7:42   ` [dpdk-dev] [PATCH v8 05/11] fm10k: " Jianfeng Tan
2016-03-14  7:42   ` [dpdk-dev] [PATCH v8 06/11] i40e: " Jianfeng Tan
2016-03-14  7:42   ` [dpdk-dev] [PATCH v8 07/11] ixgbe: " Jianfeng Tan
2016-03-14  7:42   ` [dpdk-dev] [PATCH v8 08/11] mlx4: " Jianfeng Tan
2016-03-14  7:42   ` [dpdk-dev] [PATCH v8 09/11] mlx5: " Jianfeng Tan
2016-03-14  7:42   ` [dpdk-dev] [PATCH v8 10/11] nfp: " Jianfeng Tan
2016-03-14  7:42   ` [dpdk-dev] [PATCH v8 11/11] vmxnet3: " Jianfeng Tan
2016-03-18 16:21   ` [dpdk-dev] [PATCH v8 00/11] Add API to get supported packet types Bruce Richardson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1456795416-118189-1-git-send-email-jianfeng.tan@intel.com \
    --to=jianfeng.tan@intel.com \
    --cc=dev@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).