All of lore.kernel.org
 help / color / mirror / Atom feed
From: Allain Legacy <allain.legacy@windriver.com>
To: <ferruh.yigit@intel.com>
Cc: <dev@dpdk.org>
Subject: [PATCH 11/16] net/avp: packet receive functions
Date: Fri, 24 Feb 2017 20:23:10 -0500	[thread overview]
Message-ID: <1487985795-136044-12-git-send-email-allain.legacy@windriver.com> (raw)
In-Reply-To: <1487985795-136044-1-git-send-email-allain.legacy@windriver.com>

Adds function required for receiving packets from the host application via
AVP device queues.  Both the simple and scattered functions are supported.

Signed-off-by: Allain Legacy <allain.legacy@windriver.com>
Signed-off-by: Matt Peters <matt.peters@windriver.com>
---
 drivers/net/avp/Makefile     |   1 +
 drivers/net/avp/avp_ethdev.c | 469 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 470 insertions(+)

diff --git a/drivers/net/avp/Makefile b/drivers/net/avp/Makefile
index 9cf0449..3013cd1 100644
--- a/drivers/net/avp/Makefile
+++ b/drivers/net/avp/Makefile
@@ -56,5 +56,6 @@ SRCS-$(CONFIG_RTE_LIBRTE_AVP_PMD) += avp_ethdev.c
 
 # this lib depends upon:
 DEPDIRS-$(CONFIG_RTE_LIBRTE_AVP_PMD) += lib/librte_eal lib/librte_ether
+DEPDIRS-$(CONFIG_RTE_LIBRTE_AVP_PMD) += lib/librte_mempool lib/librte_mbuf
 
 include $(RTE_SDK)/mk/rte.lib.mk
diff --git a/drivers/net/avp/avp_ethdev.c b/drivers/net/avp/avp_ethdev.c
index a4b6b42..36bb9c0 100644
--- a/drivers/net/avp/avp_ethdev.c
+++ b/drivers/net/avp/avp_ethdev.c
@@ -85,11 +85,19 @@ static int avp_dev_tx_queue_setup(struct rte_eth_dev *dev,
 				  unsigned int socket_id,
 				  const struct rte_eth_txconf *tx_conf);
 
+static uint16_t avp_recv_scattered_pkts(void *rx_queue,
+					struct rte_mbuf **rx_pkts,
+					uint16_t nb_pkts);
+
+static uint16_t avp_recv_pkts(void *rx_queue,
+			      struct rte_mbuf **rx_pkts,
+			      uint16_t nb_pkts);
 static void avp_dev_rx_queue_release(void *rxq);
 static void avp_dev_tx_queue_release(void *txq);
 #define AVP_DEV_TO_PCI(eth_dev) RTE_DEV_TO_PCI((eth_dev)->device)
 
 
+#define RTE_AVP_MAX_RX_BURST 64
 #define RTE_AVP_MAX_MAC_ADDRS 1
 #define RTE_AVP_MIN_RX_BUFSIZE ETHER_MIN_LEN
 
@@ -195,6 +203,18 @@ struct avp_adapter {
 	struct avp_dev avp;
 } __rte_cache_aligned;
 
+/**@{ AVP device statistics */
+#ifdef RTE_LIBRTE_AVP_STATS
+#define RTE_AVP_STATS_INC(queue, name) \
+	((queue)->name++)
+#define RTE_AVP_STATS_ADD(queue, name, value) \
+	((queue)->name += (value))
+#else
+#define RTE_AVP_STATS_INC(queue, name) do {} while (0)
+#define RTE_AVP_STATS_ADD(queue, name, value) do {} while (0)
+#endif
+/**@} */
+
 
 /* 32-bit MMIO register write */
 #define RTE_AVP_WRITE32(_value, _addr) ((*(uint32_t *)_addr) = (_value))
@@ -941,6 +961,7 @@ struct avp_queue {
 
 	pci_dev = AVP_DEV_TO_PCI(eth_dev);
 	eth_dev->dev_ops = &avp_eth_dev_ops;
+	eth_dev->rx_pkt_burst = &avp_recv_pkts;
 
 	if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
 		/*
@@ -949,6 +970,12 @@ struct avp_queue {
 		 * be mapped to the same virtual address so all pointers should
 		 * be valid.
 		 */
+		if (eth_dev->data->scattered_rx) {
+			PMD_DRV_LOG(NOTICE,
+				    "AVP device configured "
+				    "for chained mbufs\n");
+			eth_dev->rx_pkt_burst = avp_recv_scattered_pkts;
+		}
 		return 0;
 	}
 
@@ -1032,6 +1059,36 @@ struct avp_queue {
 
 
 static int
+avp_dev_enable_scattered(struct rte_eth_dev *eth_dev,
+			 struct avp_dev *avp)
+{
+	unsigned max_rx_pkt_len = eth_dev->data->dev_conf.rxmode.max_rx_pkt_len;
+
+	if ((max_rx_pkt_len > avp->guest_mbuf_size) ||
+	    (max_rx_pkt_len > avp->host_mbuf_size)) {
+		/*
+		 * If the guest MTU is greater than either the host or guest
+		 * buffers then chained mbufs have to be enabled in the TX
+		 * direction.  It is assumed that the application will not need
+		 * to send packets larger than their max_rx_pkt_len (MRU).
+		 */
+		return 1;
+	}
+
+	if ((avp->max_rx_pkt_len > avp->guest_mbuf_size) ||
+	    (avp->max_rx_pkt_len > avp->host_mbuf_size)) {
+		/*
+		 * If the host MRU is greater than its own mbuf size or the
+		 * guest mbuf size then chained mbufs have to be enabled in the
+		 * RX direction.
+		 */
+		return 1;
+	}
+
+	return 0;
+}
+
+static int
 avp_dev_rx_queue_setup(struct rte_eth_dev *eth_dev,
 		       uint16_t rx_queue_id,
 		       uint16_t nb_rx_desc,
@@ -1059,6 +1116,16 @@ struct avp_queue {
 	avp->guest_mbuf_size = (uint16_t) (mbp_priv->mbuf_data_room_size);
 	avp->guest_mbuf_size -= RTE_PKTMBUF_HEADROOM;
 
+	if (avp_dev_enable_scattered(eth_dev, avp)) {
+		if (!eth_dev->data->scattered_rx) {
+			PMD_DRV_LOG(NOTICE,
+				    "AVP device configured "
+				    "for chained mbufs\n");
+			eth_dev->data->scattered_rx = 1;
+			eth_dev->rx_pkt_burst = avp_recv_scattered_pkts;
+		}
+	}
+
 	PMD_DRV_LOG(DEBUG, "AVP max_rx_pkt_len=(%u,%u) mbuf_size=(%u,%u)\n",
 		    avp->max_rx_pkt_len,
 		    eth_dev->data->dev_conf.rxmode.max_rx_pkt_len,
@@ -1131,6 +1198,408 @@ struct avp_queue {
 	return 0;
 }
 
+static inline int
+_avp_cmp_ether_addr(struct ether_addr *a, struct ether_addr *b)
+{
+	uint16_t *_a = (uint16_t *)&a->addr_bytes[0];
+	uint16_t *_b = (uint16_t *)&b->addr_bytes[0];
+	return (_a[0] ^ _b[0]) | (_a[1] ^ _b[1]) | (_a[2] ^ _b[2]);
+}
+
+static inline int
+_avp_mac_filter(struct avp_dev *avp, struct rte_mbuf *m)
+{
+	struct ether_hdr *eth = rte_pktmbuf_mtod(m, struct ether_hdr *);
+
+	if (likely(_avp_cmp_ether_addr(&avp->ethaddr, &eth->d_addr) == 0)) {
+		/* allow all packets destined to our address */
+		return 0;
+	}
+
+	if (likely(is_broadcast_ether_addr(&eth->d_addr))) {
+		/* allow all broadcast packets */
+		return 0;
+	}
+
+	if (likely(is_multicast_ether_addr(&eth->d_addr))) {
+		/* allow all multicast packets */
+		return 0;
+	}
+
+	if (avp->flags & RTE_AVP_F_PROMISC) {
+		/* allow all packets when in promiscuous mode */
+		return 0;
+	}
+
+	return -1;
+}
+
+#ifdef RTE_LIBRTE_AVP_DEBUG_BUFFERS
+static inline void
+__avp_dev_buffer_sanity_check(struct avp_dev *avp, struct rte_avp_desc *buf)
+{
+	struct rte_avp_desc *first_buf;
+	struct rte_avp_desc *pkt_buf;
+	unsigned pkt_len;
+	unsigned nb_segs;
+	void *pkt_data;
+	unsigned i;
+
+	first_buf = avp_dev_translate_buffer(avp, buf);
+
+	i = 0;
+	pkt_len = 0;
+	nb_segs = first_buf->nb_segs;
+	do {
+		/* Adjust pointers for guest addressing */
+		pkt_buf = avp_dev_translate_buffer(avp, buf);
+		if (pkt_buf == NULL) {
+			rte_panic("bad buffer: segment %u has an "
+				  "invalid address %p\n", i, buf);
+		}
+		pkt_data = avp_dev_translate_buffer(avp, pkt_buf->data);
+		if (pkt_data == NULL)
+			rte_panic("bad buffer: segment %u has a "
+				  "NULL data pointer\n", i);
+		if (pkt_buf->data_len == 0)
+			rte_panic("bad buffer: segment %u has "
+				  "0 data length\n", i);
+		pkt_len += pkt_buf->data_len;
+		nb_segs--;
+		i++;
+
+	} while (nb_segs && (buf = pkt_buf->next) != NULL);
+
+	if (nb_segs != 0) {
+		rte_panic("bad buffer: expected %u segments found %u\n",
+			  first_buf->nb_segs, (first_buf->nb_segs - nb_segs));
+	}
+	if (pkt_len != first_buf->pkt_len) {
+		rte_panic("bad buffer: expected length %u found %u\n",
+			  first_buf->pkt_len, pkt_len);
+	}
+}
+
+#define avp_dev_buffer_sanity_check(a, b) \
+	__avp_dev_buffer_sanity_check((a), (b))
+
+#else /* RTE_LIBRTE_AVP_DEBUG_BUFFERS */
+
+#define avp_dev_buffer_sanity_check(a, b) do {} while (0)
+
+#endif
+
+/*
+ * Copy a host buffer chain to a set of mbufs.	This function assumes that
+ * there exactly the required number of mbufs to copy all source bytes.
+ */
+static inline struct rte_mbuf *
+avp_dev_copy_from_buffers(struct avp_dev *avp,
+			  struct rte_avp_desc *buf,
+			  struct rte_mbuf **mbufs,
+			  unsigned count)
+{
+	struct rte_mbuf *m_previous = NULL;
+	struct rte_avp_desc *pkt_buf;
+	unsigned total_length = 0;
+	unsigned copy_length;
+	unsigned src_offset;
+	struct rte_mbuf *m;
+	uint16_t ol_flags;
+	uint16_t vlan_tci;
+	void *pkt_data;
+	unsigned i;
+
+	avp_dev_buffer_sanity_check(avp, buf);
+
+	/* setup the first source buffer */
+	pkt_buf = avp_dev_translate_buffer(avp, buf);
+	pkt_data = avp_dev_translate_buffer(avp, pkt_buf->data);
+	total_length = pkt_buf->pkt_len;
+	src_offset = 0;
+
+	if (pkt_buf->ol_flags & RTE_AVP_RX_VLAN_PKT) {
+		ol_flags = PKT_RX_VLAN_PKT;
+		vlan_tci = pkt_buf->vlan_tci;
+	} else {
+		ol_flags = 0;
+		vlan_tci = 0;
+	}
+
+	for (i = 0; (i < count) && (buf != NULL); i++) {
+		/* fill each destination buffer */
+		m = mbufs[i];
+
+		if (m_previous != NULL)
+			m_previous->next = m;
+
+		m_previous = m;
+
+		do {
+			/*
+			 * Copy as many source buffers as will fit in the
+			 * destination buffer.
+			 */
+			copy_length = RTE_MIN((avp->guest_mbuf_size -
+					       rte_pktmbuf_data_len(m)),
+					      (pkt_buf->data_len -
+					       src_offset));
+			rte_memcpy(RTE_PTR_ADD(rte_pktmbuf_mtod(m, void *),
+					       rte_pktmbuf_data_len(m)),
+				   RTE_PTR_ADD(pkt_data, src_offset),
+				   copy_length);
+			rte_pktmbuf_data_len(m) += copy_length;
+			src_offset += copy_length;
+
+			if (likely(src_offset == pkt_buf->data_len)) {
+				/* need a new source buffer */
+				buf = pkt_buf->next;
+				if (buf != NULL) {
+					pkt_buf = avp_dev_translate_buffer(
+						avp, buf);
+					pkt_data = avp_dev_translate_buffer(
+						avp, pkt_buf->data);
+					src_offset = 0;
+				}
+			}
+
+			if (unlikely(rte_pktmbuf_data_len(m) ==
+				     avp->guest_mbuf_size)) {
+				/* need a new destination mbuf */
+				break;
+			}
+
+		} while (buf != NULL);
+	}
+
+	m = mbufs[0];
+	m->ol_flags = ol_flags;
+	m->nb_segs = count;
+	rte_pktmbuf_pkt_len(m) = total_length;
+	m->vlan_tci = vlan_tci;
+
+	__rte_mbuf_sanity_check(m, 1);
+
+	return m;
+}
+
+static uint16_t
+avp_recv_scattered_pkts(void *rx_queue,
+			struct rte_mbuf **rx_pkts,
+			uint16_t nb_pkts)
+{
+	struct avp_queue *rxq = (struct avp_queue *)rx_queue;
+	struct rte_avp_desc *avp_bufs[RTE_AVP_MAX_RX_BURST];
+	struct rte_mbuf *mbufs[RTE_AVP_MAX_MBUF_SEGMENTS];
+	struct avp_dev *avp = rxq->avp;
+	struct rte_avp_desc *pkt_buf;
+	struct rte_avp_fifo *free_q;
+	struct rte_avp_fifo *rx_q;
+	struct rte_avp_desc *buf;
+	unsigned count, avail, n;
+	unsigned guest_mbuf_size;
+	struct rte_mbuf *m;
+	unsigned required;
+	unsigned buf_len;
+	unsigned port_id;
+	unsigned i;
+
+	if (unlikely(avp->flags & RTE_AVP_F_DETACHED)) {
+		/* VM live migration in progress */
+		return 0;
+	}
+
+	guest_mbuf_size = avp->guest_mbuf_size;
+	port_id = avp->port_id;
+	rx_q = avp->rx_q[rxq->queue_id];
+	free_q = avp->free_q[rxq->queue_id];
+
+	/* setup next queue to service */
+	rxq->queue_id = (rxq->queue_id < rxq->queue_limit) ?
+		(rxq->queue_id + 1) : rxq->queue_base;
+
+	/* determine how many slots are available in the free queue */
+	count = avp_fifo_free_count(free_q);
+
+	/* determine how many packets are available in the rx queue */
+	avail = avp_fifo_count(rx_q);
+
+	/* determine how many packets can be received */
+	count = RTE_MIN(count, avail);
+	count = RTE_MIN(count, nb_pkts);
+	count = RTE_MIN(count, (unsigned)RTE_AVP_MAX_RX_BURST);
+
+	if (unlikely(count == 0)) {
+		/* no free buffers, or no buffers on the rx queue */
+		return 0;
+	}
+
+	/* retrieve pending packets */
+	n = avp_fifo_get(rx_q, (void **)&avp_bufs, count);
+	PMD_RX_LOG(DEBUG, "Receving %u packets from Rx queue at %p\n",
+		   count, rx_q);
+
+	count = 0;
+	for (i = 0; i < n; i++) {
+
+		/* prefetch next entry while processing current one */
+		if (i+1 < n) {
+			pkt_buf = avp_dev_translate_buffer(avp, avp_bufs[i+1]);
+			rte_prefetch0(pkt_buf);
+		}
+		buf = avp_bufs[i];
+
+		/* Peek into the first buffer to determine the total length */
+		pkt_buf = avp_dev_translate_buffer(avp, buf);
+		buf_len = pkt_buf->pkt_len;
+
+		/* Allocate enough mbufs to receive the entire packet */
+		required = (buf_len + guest_mbuf_size - 1) / guest_mbuf_size;
+		if (rte_pktmbuf_alloc_bulk(avp->pool, mbufs, required)) {
+			rxq->dev_data->rx_mbuf_alloc_failed++;
+			continue;
+		}
+
+		/* Copy the data from the buffers to our mbufs */
+		m = avp_dev_copy_from_buffers(avp, buf, mbufs, required);
+
+		/* finalize mbuf */
+		m->port = port_id;
+
+		if (_avp_mac_filter(avp, m) != 0) {
+			/* silently discard packets not destined to our MAC */
+			rte_pktmbuf_free(m);
+			continue;
+		}
+
+		/* return new mbuf to caller */
+		rx_pkts[count++] = m;
+		RTE_AVP_STATS_ADD(rxq, bytes, buf_len);
+	}
+
+	RTE_AVP_STATS_ADD(rxq, packets, count);
+
+	/* return the buffers to the free queue */
+	avp_fifo_put(free_q, (void **)&avp_bufs[0], n);
+
+	return count;
+}
+
+
+static uint16_t
+avp_recv_pkts(void *rx_queue,
+	      struct rte_mbuf **rx_pkts,
+	      uint16_t nb_pkts)
+{
+	struct avp_queue *rxq = (struct avp_queue *)rx_queue;
+	struct rte_avp_desc *avp_bufs[RTE_AVP_MAX_RX_BURST];
+	struct avp_dev *avp = rxq->avp;
+	struct rte_avp_desc *pkt_buf;
+	struct rte_avp_fifo *free_q;
+	struct rte_avp_fifo *rx_q;
+	unsigned count, avail, n;
+	struct rte_mbuf *m;
+	unsigned pkt_len;
+	char *pkt_data;
+	unsigned i;
+
+	if (unlikely(avp->flags & RTE_AVP_F_DETACHED)) {
+		/* VM live migration in progress */
+		return 0;
+	}
+
+	rx_q = avp->rx_q[rxq->queue_id];
+	free_q = avp->free_q[rxq->queue_id];
+
+	/* setup next queue to service */
+	rxq->queue_id = (rxq->queue_id < rxq->queue_limit) ?
+		(rxq->queue_id + 1) : rxq->queue_base;
+
+	/* determine how many slots are available in the free queue */
+	count = avp_fifo_free_count(free_q);
+
+	/* determine how many packets are available in the rx queue */
+	avail = avp_fifo_count(rx_q);
+
+	/* determine how many packets can be received */
+	count = RTE_MIN(count, avail);
+	count = RTE_MIN(count, nb_pkts);
+	count = RTE_MIN(count, (unsigned)RTE_AVP_MAX_RX_BURST);
+
+	if (unlikely(count == 0)) {
+		/* no free buffers, or no buffers on the rx queue */
+		return 0;
+	}
+
+	/* retrieve pending packets */
+	n = avp_fifo_get(rx_q, (void **)&avp_bufs, count);
+	PMD_RX_LOG(DEBUG, "Receving %u packets from Rx queue at %p\n",
+		   count, rx_q);
+
+	count = 0;
+	for (i = 0; i < n; i++) {
+
+		/* prefetch next entry while processing current one */
+		if (i < n-1) {
+			pkt_buf = avp_dev_translate_buffer(avp, avp_bufs[i+1]);
+			rte_prefetch0(pkt_buf);
+		}
+
+		/* Adjust host pointers for guest addressing */
+		pkt_buf = avp_dev_translate_buffer(avp, avp_bufs[i]);
+		pkt_data = avp_dev_translate_buffer(avp, pkt_buf->data);
+		pkt_len = pkt_buf->pkt_len;
+
+		if (unlikely((pkt_len > avp->guest_mbuf_size) ||
+			     (pkt_buf->nb_segs > 1))) {
+			/*
+			 * application should be using the scattered receive
+			 * function
+			 */
+			RTE_AVP_STATS_INC(rxq, errors);
+			continue;
+		}
+
+		/* process each packet to be transmitted */
+		m = rte_pktmbuf_alloc(avp->pool);
+		if (unlikely(m == NULL)) {
+			rxq->dev_data->rx_mbuf_alloc_failed++;
+			continue;
+		}
+
+		/* copy data out of the host buffer to our buffer */
+		m->data_off = RTE_PKTMBUF_HEADROOM;
+		rte_memcpy(rte_pktmbuf_mtod(m, void *), pkt_data, pkt_len);
+
+		/* initialize the local mbuf */
+		rte_pktmbuf_data_len(m) = pkt_len;
+		rte_pktmbuf_pkt_len(m) = pkt_len;
+		m->port = avp->port_id;
+
+		if (pkt_buf->ol_flags & RTE_AVP_RX_VLAN_PKT) {
+			m->ol_flags = PKT_RX_VLAN_PKT;
+			m->vlan_tci = pkt_buf->vlan_tci;
+		}
+
+		if (_avp_mac_filter(avp, m) != 0) {
+			/* silently discard packets not destined to our MAC */
+			rte_pktmbuf_free(m);
+			continue;
+		}
+
+		/* return new mbuf to caller */
+		rx_pkts[count++] = m;
+		RTE_AVP_STATS_ADD(rxq, bytes, pkt_len);
+	}
+
+	RTE_AVP_STATS_ADD(rxq, packets, count);
+
+	/* return the buffers to the free queue */
+	avp_fifo_put(free_q, (void **)&avp_bufs[0], n);
+
+	return count;
+}
+
 static void
 avp_dev_rx_queue_release(void *rx_queue)
 {
-- 
1.8.3.1

  parent reply	other threads:[~2017-02-25  1:23 UTC|newest]

Thread overview: 172+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-25  1:22 [PATCH 00/16] Wind River Systems AVP PMD Allain Legacy
2017-02-25  1:23 ` [PATCH 01/16] config: adds attributes for the " Allain Legacy
2017-02-25  1:23 ` [PATCH 02/16] net/avp: public header files Allain Legacy
2017-02-25  1:23 ` [PATCH 03/16] maintainers: claim responsibility for AVP PMD Allain Legacy
2017-02-25  1:23 ` [PATCH 04/16] net/avp: add PMD version map file Allain Legacy
2017-02-25  1:23 ` [PATCH 05/16] net/avp: debug log macros Allain Legacy
2017-02-25  1:23 ` [PATCH 06/16] drivers/net: adds driver makefiles for AVP PMD Allain Legacy
2017-02-25  1:23 ` [PATCH 07/16] net/avp: driver registration Allain Legacy
2017-02-25  1:23 ` [PATCH 08/16] net/avp: device initialization Allain Legacy
2017-02-25  1:23 ` [PATCH 09/16] net/avp: device configuration Allain Legacy
2017-02-25  1:23 ` [PATCH 10/16] net/avp: queue setup and release Allain Legacy
2017-02-25  1:23 ` Allain Legacy [this message]
2017-02-25  1:23 ` [PATCH 12/16] net/avp: packet transmit functions Allain Legacy
2017-02-25  1:23 ` [PATCH 13/16] net/avp: device statistics operations Allain Legacy
2017-02-25  1:23 ` [PATCH 14/16] net/avp: device promiscuous functions Allain Legacy
2017-02-25  1:23 ` [PATCH 15/16] net/avp: device start and stop operations Allain Legacy
2017-02-25  1:23 ` [PATCH 16/16] doc: adds information related to the AVP PMD Allain Legacy
2017-02-26 19:08 ` [PATCH v2 00/16] Wind River Systems " Allain Legacy
2017-02-26 19:08   ` [PATCH v2 01/15] config: adds attributes for the " Allain Legacy
2017-02-26 19:08   ` [PATCH v2 02/15] net/avp: public header files Allain Legacy
2017-02-28 11:49     ` Jerin Jacob
2017-03-01 13:25       ` Legacy, Allain
2017-02-26 19:08   ` [PATCH v2 03/15] maintainers: claim responsibility for AVP PMD Allain Legacy
2017-02-26 19:08   ` [PATCH v2 04/15] net/avp: add PMD version map file Allain Legacy
2017-02-26 19:08   ` [PATCH v2 05/15] net/avp: debug log macros Allain Legacy
2017-02-26 19:08   ` [PATCH v2 06/15] drivers/net: adds driver makefiles for AVP PMD Allain Legacy
2017-02-26 19:08   ` [PATCH v2 07/15] net/avp: driver registration Allain Legacy
2017-02-27 16:47     ` Stephen Hemminger
2017-02-27 17:10       ` Legacy, Allain
2017-02-27 16:53     ` Stephen Hemminger
2017-02-27 17:09       ` Legacy, Allain
2017-02-26 19:08   ` [PATCH v2 08/15] net/avp: device initialization Allain Legacy
2017-02-28 11:57     ` Jerin Jacob
2017-03-01 13:29       ` Legacy, Allain
2017-02-26 19:08   ` [PATCH v2 09/15] net/avp: device configuration Allain Legacy
2017-02-26 19:08   ` [PATCH v2 10/15] net/avp: queue setup and release Allain Legacy
2017-02-26 19:08   ` [PATCH v2 11/15] net/avp: packet receive functions Allain Legacy
2017-02-27 16:46     ` Stephen Hemminger
2017-02-27 17:06       ` Legacy, Allain
2017-02-28 10:27         ` Bruce Richardson
2017-03-01 13:23           ` Legacy, Allain
2017-03-01 14:14             ` Thomas Monjalon
2017-03-01 14:54               ` Legacy, Allain
2017-03-01 15:10               ` Stephen Hemminger
2017-03-01 15:40                 ` Legacy, Allain
2017-02-26 19:09   ` [PATCH v2 12/15] net/avp: packet transmit functions Allain Legacy
2017-02-26 22:18     ` Legacy, Allain
2017-02-26 19:09   ` [PATCH v2 13/15] net/avp: device promiscuous functions Allain Legacy
2017-02-26 19:09   ` [PATCH v2 14/15] net/avp: device start and stop operations Allain Legacy
2017-02-26 19:09   ` [PATCH v2 15/15] doc: adds information related to the AVP PMD Allain Legacy
2017-02-27 17:04     ` Mcnamara, John
2017-02-27 17:07       ` Legacy, Allain
2017-02-27  8:54   ` [PATCH v2 00/16] Wind River Systems " Vincent JARDIN
2017-02-27 12:15     ` Legacy, Allain
2017-02-27 15:17       ` Wiles, Keith
2017-03-02  0:19   ` [PATCH v3 " Allain Legacy
2017-03-02  0:19     ` [PATCH v3 01/16] config: adds attributes for the " Allain Legacy
2017-03-02  0:19     ` [PATCH v3 02/16] net/avp: public header files Allain Legacy
2017-03-03 14:37       ` Chas Williams
2017-03-03 15:35         ` Legacy, Allain
2017-03-02  0:19     ` [PATCH v3 03/16] maintainers: claim responsibility for AVP PMD Allain Legacy
2017-03-02  0:19     ` [PATCH v3 04/16] net/avp: add PMD version map file Allain Legacy
2017-03-02  0:19     ` [PATCH v3 05/16] net/avp: debug log macros Allain Legacy
2017-03-02  0:19     ` [PATCH v3 06/16] drivers/net: adds driver makefiles for AVP PMD Allain Legacy
2017-03-02  0:19     ` [PATCH v3 07/16] net/avp: driver registration Allain Legacy
2017-03-02  0:20     ` [PATCH v3 08/16] net/avp: device initialization Allain Legacy
2017-03-03 15:04       ` Chas Williams
2017-03-09 14:03         ` Legacy, Allain
2017-03-09 14:48         ` Legacy, Allain
2017-03-02  0:20     ` [PATCH v3 09/16] net/avp: device configuration Allain Legacy
2017-03-02  0:20     ` [PATCH v3 10/16] net/avp: queue setup and release Allain Legacy
2017-03-02  0:20     ` [PATCH v3 11/16] net/avp: packet receive functions Allain Legacy
2017-03-02  0:20     ` [PATCH v3 12/16] net/avp: packet transmit functions Allain Legacy
2017-03-02  0:20     ` [PATCH v3 13/16] net/avp: device statistics operations Allain Legacy
2017-03-02  0:35       ` Stephen Hemminger
2017-03-09 13:48         ` Legacy, Allain
2017-03-02  0:20     ` [PATCH v3 14/16] net/avp: device promiscuous functions Allain Legacy
2017-03-02  0:20     ` [PATCH v3 15/16] net/avp: device start and stop operations Allain Legacy
2017-03-02  0:37       ` Stephen Hemminger
2017-03-09 13:49         ` Legacy, Allain
2017-03-02  0:20     ` [PATCH v3 16/16] doc: adds information related to the AVP PMD Allain Legacy
2017-03-03 16:21       ` Vincent JARDIN
2017-03-13 19:17         ` Legacy, Allain
2017-03-13 19:16     ` [PATCH v4 00/17] Wind River Systems " Allain Legacy
2017-03-13 19:16       ` [PATCH v4 01/17] config: adds attributes for the " Allain Legacy
2017-03-13 19:16       ` [PATCH v4 02/17] net/avp: public header files Allain Legacy
2017-03-13 19:16       ` [PATCH v4 03/17] maintainers: claim responsibility for AVP PMD Allain Legacy
2017-03-13 19:16       ` [PATCH v4 04/17] net/avp: add PMD version map file Allain Legacy
2017-03-16 14:52         ` Ferruh Yigit
2017-03-16 15:33           ` Legacy, Allain
2017-03-13 19:16       ` [PATCH v4 05/17] net/avp: debug log macros Allain Legacy
2017-03-13 19:16       ` [PATCH v4 06/17] drivers/net: adds driver makefiles for AVP PMD Allain Legacy
2017-03-13 19:16       ` [PATCH v4 07/17] net/avp: driver registration Allain Legacy
2017-03-16 14:53         ` Ferruh Yigit
2017-03-16 15:37           ` Legacy, Allain
2017-03-13 19:16       ` [PATCH v4 08/17] net/avp: device initialization Allain Legacy
2017-03-13 19:16       ` [PATCH v4 09/17] net/avp: device configuration Allain Legacy
2017-03-13 19:16       ` [PATCH v4 10/17] net/avp: queue setup and release Allain Legacy
2017-03-13 19:16       ` [PATCH v4 11/17] net/avp: packet receive functions Allain Legacy
2017-03-13 19:16       ` [PATCH v4 12/17] net/avp: packet transmit functions Allain Legacy
2017-03-13 19:16       ` [PATCH v4 13/17] net/avp: device statistics operations Allain Legacy
2017-03-13 19:16       ` [PATCH v4 14/17] net/avp: device promiscuous functions Allain Legacy
2017-03-13 19:16       ` [PATCH v4 15/17] net/avp: device start and stop operations Allain Legacy
2017-03-13 19:16       ` [PATCH v4 16/17] net/avp: migration interrupt handling Allain Legacy
2017-03-13 19:16       ` [PATCH v4 17/17] doc: adds information related to the AVP PMD Allain Legacy
2017-03-16 14:53         ` Ferruh Yigit
2017-03-16 15:37           ` Legacy, Allain
2017-03-14 17:37       ` [PATCH v4 00/17] Wind River Systems AVP PMD vs virtio? Vincent JARDIN
2017-03-15  4:10         ` O'Driscoll, Tim
2017-03-15 10:55           ` Thomas Monjalon
2017-03-15 14:02             ` Vincent JARDIN
2017-03-16  3:18               ` O'Driscoll, Tim
2017-03-16  8:52                 ` Francois Ozog
2017-03-16  9:51                   ` Wiles, Keith
2017-03-16 10:32                 ` Chas Williams
2017-03-16 18:09                   ` Francois Ozog
2017-03-15 11:29           ` Ferruh Yigit
2017-03-15 14:08             ` Vincent JARDIN
2017-03-15 18:18               ` Ferruh Yigit
2017-03-15 14:02           ` Vincent JARDIN
2017-03-15 14:02           ` Vincent JARDIN
2017-03-15 20:19             ` Wiles, Keith
2017-03-16 23:17           ` Stephen Hemminger
2017-03-16 23:41             ` [PATCH v4 00/17] Wind River Systems AVP PMD vs virtio? - ivshmem is back Vincent JARDIN
2017-03-17  0:08               ` Wiles, Keith
2017-03-17  0:15                 ` O'Driscoll, Tim
2017-03-17  0:11               ` Wiles, Keith
2017-03-17  0:14                 ` Stephen Hemminger
2017-03-17  0:31                 ` Vincent JARDIN
2017-03-17  0:53                   ` Wiles, Keith
2017-03-17  8:48                     ` Thomas Monjalon
2017-03-17 10:15                       ` Legacy, Allain
2017-03-17 13:52                       ` Michael S. Tsirkin
2017-03-20 22:30                         ` Hobywan Kenoby
2017-03-21 11:06                           ` Thomas Monjalon
     [not found]                       ` <20170317093320.GA11116@stefanha-x1.localdomain>
2017-03-30  8:55                         ` Markus Armbruster
2017-03-23 11:23       ` [PATCH v5 00/14] Wind River Systems AVP PMD Allain Legacy
2017-03-23 11:24         ` [PATCH v5 01/14] drivers/net: adds AVP PMD base files Allain Legacy
2017-03-23 11:24         ` [PATCH v5 02/14] net/avp: public header files Allain Legacy
2017-03-23 11:24         ` [PATCH v5 03/14] net/avp: debug log macros Allain Legacy
2017-03-23 11:24         ` [PATCH v5 04/14] net/avp: driver registration Allain Legacy
2017-03-23 11:24         ` [PATCH v5 05/14] net/avp: device initialization Allain Legacy
2017-03-23 11:24         ` [PATCH v5 06/14] net/avp: device configuration Allain Legacy
2017-03-23 11:24         ` [PATCH v5 07/14] net/avp: queue setup and release Allain Legacy
2017-03-23 11:24         ` [PATCH v5 08/14] net/avp: packet receive functions Allain Legacy
2017-03-23 11:24         ` [PATCH v5 09/14] net/avp: packet transmit functions Allain Legacy
2017-03-23 11:24         ` [PATCH v5 10/14] net/avp: device statistics operations Allain Legacy
2017-03-23 11:24         ` [PATCH v5 11/14] net/avp: device promiscuous functions Allain Legacy
2017-03-23 11:24         ` [PATCH v5 12/14] net/avp: device start and stop operations Allain Legacy
2017-03-23 11:24         ` [PATCH v5 13/14] net/avp: migration interrupt handling Allain Legacy
2017-03-23 11:24         ` [PATCH v5 14/14] doc: adds information related to the AVP PMD Allain Legacy
2017-03-23 14:18         ` [PATCH v5 00/14] Wind River Systems " Ferruh Yigit
2017-03-23 18:28           ` Legacy, Allain
2017-03-23 20:35             ` Vincent Jardin
2017-03-28 11:53         ` [PATCH v6 " Allain Legacy
2017-03-28 11:53           ` [PATCH v6 01/14] drivers/net: adds AVP PMD base files Allain Legacy
2017-03-28 11:53           ` [PATCH v6 02/14] net/avp: public header files Allain Legacy
2017-03-28 11:53           ` [PATCH v6 03/14] net/avp: debug log macros Allain Legacy
2017-03-28 11:53           ` [PATCH v6 04/14] net/avp: driver registration Allain Legacy
2017-03-28 11:54           ` [PATCH v6 05/14] net/avp: device initialization Allain Legacy
2017-03-28 11:54           ` [PATCH v6 06/14] net/avp: device configuration Allain Legacy
2017-03-29 10:28             ` Ferruh Yigit
2017-03-28 11:54           ` [PATCH v6 07/14] net/avp: queue setup and release Allain Legacy
2017-03-28 11:54           ` [PATCH v6 08/14] net/avp: packet receive functions Allain Legacy
2017-03-28 11:54           ` [PATCH v6 09/14] net/avp: packet transmit functions Allain Legacy
2017-03-28 11:54           ` [PATCH v6 10/14] net/avp: device statistics operations Allain Legacy
2017-03-28 11:54           ` [PATCH v6 11/14] net/avp: device promiscuous functions Allain Legacy
2017-03-28 11:54           ` [PATCH v6 12/14] net/avp: device start and stop operations Allain Legacy
2017-03-28 11:54           ` [PATCH v6 13/14] net/avp: migration interrupt handling Allain Legacy
2017-03-28 11:54           ` [PATCH v6 14/14] doc: adds information related to the AVP PMD Allain Legacy
2017-03-29 10:44           ` [PATCH v6 00/14] Wind River Systems " Vincent JARDIN
2017-03-29 11:05             ` Ferruh Yigit

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=1487985795-136044-12-git-send-email-allain.legacy@windriver.com \
    --to=allain.legacy@windriver.com \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.