DPDK patches and discussions
 help / color / mirror / Atom feed
From: "Ananyev, Konstantin" <konstantin.ananyev@intel.com>
To: "Tan, Jianfeng" <jianfeng.tan@intel.com>, "dev@dpdk.org" <dev@dpdk.org>
Subject: Re: [dpdk-dev] [PATCH] examples/l3fwd: fix using packet type blindly
Date: Tue, 1 Mar 2016 13:51:31 +0000	[thread overview]
Message-ID: <2601191342CEEE43887BDE71AB97725836B0C99C@irsmsx105.ger.corp.intel.com> (raw)
In-Reply-To: <1456795416-118189-1-git-send-email-jianfeng.tan@intel.com>

Hi Jianfeng,

> -----Original Message-----
> From: Tan, Jianfeng
> Sent: Tuesday, March 01, 2016 1:24 AM
> To: dev@dpdk.org
> Cc: Zhang, Helin; Ananyev, Konstantin; nelio.laranjeiro@6wind.com; adrien.mazarguil@6wind.com; rahul.lakkireddy@chelsio.com;
> pmatilai@redhat.com; Tan, Jianfeng
> Subject: [PATCH] examples/l3fwd: fix using packet type blindly
> 
> 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;

Why return here?
You'll miss L4 ptype checks below.

> +
> +	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);

Just curious why l4? It looks like l3 :)

> +	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;

I think it needs to be something like:
If (hdr_len == sizeof(struct ipv4_hdr)) { 
        packet_type = RTE_PTYPE_L3_IPV4;
       if (ipv4_hdr->next_proto_id == IPPROTO_TCP)
	packet_type |= RTE_PTYPE_L4_TCP;
       else if ipv4_hdr->next_proto_id == IPPROTO_UDP)
                packet_type |= RTE_PTYPE_L4_TCP;
}

And then inside em forward check ptype to be sure that is IPV4 with no options and UDP/TCP packet.
Same for IPv6.

> +		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;

Might be safer:
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]);


No need to create callback chains.
That way you have extra call per packet.
Just 2 callbaclks: cb_lpm_parse_ptype & cb_em_parse_ptype,
and then register one depending on which mode are we in.
Would be simpler and faster, I believe.  

Konstantin

> +
> +	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

  reply	other threads:[~2016-03-01 13:51 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 ` [dpdk-dev] [PATCH] examples/l3fwd: fix using packet type blindly Jianfeng Tan
2016-03-01 13:51   ` Ananyev, Konstantin [this message]
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=2601191342CEEE43887BDE71AB97725836B0C99C@irsmsx105.ger.corp.intel.com \
    --to=konstantin.ananyev@intel.com \
    --cc=dev@dpdk.org \
    --cc=jianfeng.tan@intel.com \
    /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).