[dpdk-dev] Tcpdump

2016-10-27 Thread Dror Birkman
Hi,

I have a DPDK application that binds to an interface and processes packets.
For debugging purposes I want to run tcpdump on this interface.

IYO, what is my best option with hurting the performance of the application
too much?

TIA,
Dror


[dpdk-dev] pcap: memory leak in eth_pcap_rx_jumbo

2016-09-18 Thread Dror Birkman
Hi,

It seems there is a memory leak in eth_pcap_rx_jumbo() in
case rte_pktmbuf_alloc() fails on any segment that is not the initial
segment.

If someone can confirm it, I'll patch it.

TIA,
Dror


[dpdk-dev] [PATCH] pcap: fix memory leak in jumbo frames

2016-09-20 Thread Dror Birkman
If rte_pktmbuf_alloc() fails on any segment that is not the initial
segment, previously allocated mbufs are not freed.

Signed-off-by: Dror Birkman 
---
 drivers/net/pcap/rte_eth_pcap.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c
index b7a3b03..db19a66 100644
--- a/drivers/net/pcap/rte_eth_pcap.c
+++ b/drivers/net/pcap/rte_eth_pcap.c
@@ -229,8 +229,10 @@ eth_pcap_rx(void *queue,
if (unlikely(eth_pcap_rx_jumbo(pcap_q->mb_pool,
   mbuf,
   packet,
-  header.caplen) == -1))
+  header.caplen) == -1)) {
+   rte_pktmbuf_free(mbuf);
break;
+   }
}

mbuf->pkt_len = (uint16_t)header.caplen;
-- 
2.3.0



[dpdk-dev] [PATCH] pcap: fix memory leak in jumbo frames

2016-09-20 Thread Dror Birkman
Cool!
Adding fixline:

If rte_pktmbuf_alloc() fails on any segment that is not the initial
segment, previously allocated mbufs are not freed.

Fixes: 6db141c91e1f ("pcap: support jumbo frames")

Signed-off-by: Dror Birkman 
---
 drivers/net/pcap/rte_eth_pcap.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_
pcap.c
index b7a3b03..db19a66 100644
--- a/drivers/net/pcap/rte_eth_pcap.c
+++ b/drivers/net/pcap/rte_eth_pcap.c
@@ -229,8 +229,10 @@ eth_pcap_rx(void *queue,
if (unlikely(eth_pcap_rx_jumbo(pcap_q->mb_pool,
  mbuf,
  packet,
- header.caplen) == -1))
+ header.caplen) == -1)) {
+   rte_pktmbuf_free(mbuf);
break;
+   }
}

mbuf->pkt_len = (uint16_t)header.caplen;
--
2.3.0



On Tue, Sep 20, 2016 at 1:58 PM, Yuanhan Liu 
wrote:

> On Tue, Sep 20, 2016 at 01:39:23PM +0300, Dror Birkman wrote:
> > If rte_pktmbuf_alloc() fails on any segment that is not the initial
> > segment, previously allocated mbufs are not freed.
>
> You should put a "fixline" here.
>
> Besides that, I think it's a good candidate for stable branch. Thus,
> stable at dpdk.org cc'ed.
>
> --yliu
>


[dpdk-dev] [PATCH v2] pcap: fix memory leak in jumbo frames

2016-09-20 Thread Dror Birkman
If rte_pktmbuf_alloc() fails on any segment that is not the initial
segment, previously allocated mbufs are not freed.

Fixes: 6db141c91e1f ("pcap: support jumbo frames")

Cc: 
Signed-off-by: Dror Birkman 
---
 drivers/net/pcap/rte_eth_pcap.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c
index b7a3b03..db19a66 100644
--- a/drivers/net/pcap/rte_eth_pcap.c
+++ b/drivers/net/pcap/rte_eth_pcap.c
@@ -229,8 +229,10 @@ eth_pcap_rx(void *queue,
if (unlikely(eth_pcap_rx_jumbo(pcap_q->mb_pool,
   mbuf,
   packet,
-  header.caplen) == -1))
+  header.caplen) == -1)) {
+   rte_pktmbuf_free(mbuf);
break;
+   }
}

mbuf->pkt_len = (uint16_t)header.caplen;
-- 
2.3.0



[dpdk-dev] [PATCH] pcap: fix captured frame length

2016-01-28 Thread Dror Birkman
The actual captured length is header.caplen, whereas header.len is
the original length on the wire.

Signed-off-by: Dror Birkman 
---


Without this fix, if the captured length is smaller than the original
length on the wire, mbuf will contain incorrect data.


 drivers/net/pcap/rte_eth_pcap.c | 12 ++--
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c
index f9230eb..1d121f8 100644
--- a/drivers/net/pcap/rte_eth_pcap.c
+++ b/drivers/net/pcap/rte_eth_pcap.c
@@ -220,25 +220,25 @@ eth_pcap_rx(void *queue,
buf_size = 
(uint16_t)(rte_pktmbuf_data_room_size(pcap_q->mb_pool) -
RTE_PKTMBUF_HEADROOM);

-   if (header.len <= buf_size) {
+   if (header.caplen <= buf_size) {
/* pcap packet will fit in the mbuf, go ahead and copy 
*/
rte_memcpy(rte_pktmbuf_mtod(mbuf, void *), packet,
-   header.len);
-   mbuf->data_len = (uint16_t)header.len;
+   header.caplen);
+   mbuf->data_len = (uint16_t)header.caplen;
} else {
/* Try read jumbo frame into multi mbufs. */
if (unlikely(eth_pcap_rx_jumbo(pcap_q->mb_pool,
   mbuf,
   packet,
-  header.len) == -1))
+  header.caplen) == -1))
break;
}

-   mbuf->pkt_len = (uint16_t)header.len;
+   mbuf->pkt_len = (uint16_t)header.caplen;
mbuf->port = pcap_q->in_port;
bufs[num_rx] = mbuf;
num_rx++;
-   rx_bytes += header.len;
+   rx_bytes += header.caplen;
}
pcap_q->rx_pkts += num_rx;
pcap_q->rx_bytes += rx_bytes;
-- 
2.6.3



[dpdk-dev] [PATCH] pcap: fix captured frame length

2016-01-30 Thread Dror Birkman
Hi Nicolas,

Thanks.
I tried to test my application with a pcap file I had, but got weird
results, so I wrote back the rte_mbufs in pcap format and hex compared it
to my input pcap. Only then I noticed that my original pcap had frames that
were captured with a length smaller than the frame length.

I guess you can call it pure (bad) luck :)


Dror

On Thu, Jan 28, 2016 at 8:00 PM, Nicolas Pernas Maradei <
nicolas.pernas.maradei at emutex.com> wrote:

> Hi Dror,
>
> Good catch. What you are saying makes sense and it is also explained in
> pcap's documentation. Was your setup unusual though?
> This might sound like a silly question but I don't remember seeing that
> issue and I should have since your fix is correct.
>
> Nico.
>
> On 28/01/16 08:09, Dror Birkman wrote:
>
> The actual captured length is header.caplen, whereas header.len is
> the original length on the wire.
>
> Signed-off-by: Dror Birkman   lightcyber.com>
> ---
>
>
> Without this fix, if the captured length is smaller than the original
> length on the wire, mbuf will contain incorrect data.
>
>
>  drivers/net/pcap/rte_eth_pcap.c | 12 ++--
>  1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c
> index f9230eb..1d121f8 100644
> --- a/drivers/net/pcap/rte_eth_pcap.c
> +++ b/drivers/net/pcap/rte_eth_pcap.c
> @@ -220,25 +220,25 @@ eth_pcap_rx(void *queue,
>   buf_size = 
> (uint16_t)(rte_pktmbuf_data_room_size(pcap_q->mb_pool) -
>   RTE_PKTMBUF_HEADROOM);
>
> - if (header.len <= buf_size) {
> + if (header.caplen <= buf_size) {
>   /* pcap packet will fit in the mbuf, go ahead and copy 
> */
>   rte_memcpy(rte_pktmbuf_mtod(mbuf, void *), packet,
> - header.len);
> - mbuf->data_len = (uint16_t)header.len;
> + header.caplen);
> + mbuf->data_len = (uint16_t)header.caplen;
>   } else {
>   /* Try read jumbo frame into multi mbufs. */
>   if (unlikely(eth_pcap_rx_jumbo(pcap_q->mb_pool,
>  mbuf,
>  packet,
> -header.len) == -1))
> +header.caplen) == -1))
>   break;
>   }
>
> - mbuf->pkt_len = (uint16_t)header.len;
> + mbuf->pkt_len = (uint16_t)header.caplen;
>   mbuf->port = pcap_q->in_port;
>   bufs[num_rx] = mbuf;
>   num_rx++;
> - rx_bytes += header.len;
> + rx_bytes += header.caplen;
>   }
>   pcap_q->rx_pkts += num_rx;
>   pcap_q->rx_bytes += rx_bytes;
>
>
> - no title specified @page { } table { border-collapse:collapse;
> border-spacing:0; empty-cells:show } td, th { vertical-align:top;
> font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0;
> padding:0;} li { list-style: none; margin:0; padding:0;}  li span. { clear: both; line-height:0;
> width:0; height:0; margin:0; padding:0; } span.footnodeNumber {
> padding-right:1em; } span.annotation_style_by_filter { font-size:95%;
> font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0;
> } * { margin:0;} .P1_borderStart { font-size:12pt; line-height:120%;
> margin-top:0cm; font-family:Liberation Serif; writing-mode:page;
> margin-left:0.3cm; margin-right:0cm; text-indent:0cm;
> background-color:transparent; padding-bottom:0.247cm;
> border-bottom-style:none; } .P1 { font-size:12pt; line-height:120%;
> font-family:Liberation Serif; writing-mode:page; margin-left:0.3cm;
> margin-right:0cm; text-indent:0cm; background-color:transparent;
> padding-bottom:0.247cm; padding-top:0cm; border-top-style:none;
> border-bottom-style:none; } .P1_borderEnd { font-size:12pt;
> line-height:120%; margin-bottom:0.247cm; font-family:Liberation Serif;
> writing-mode:page; margin-left:0.3cm; margin-right:0cm; text-indent:0cm;
> background-color:transparent; padding-top:0cm; border-top-style:none;}
> .P2_borderStart { font-size:12pt; line-height:120%; margin-top:0cm;
> font-family:Liberation Serif; writing-mode:page; margin-left:0.3cm;
> margin-right:0cm; text-indent:0cm; background-color:transparent;
> padding-bottom:0.247cm; border-bottom-style:none; } .P2 { font-size:12pt;
> line-height:120%; font-family:Liberation Serif; writing-mode:page;
> margin-left:0.3cm; margin-right:0cm

[dpdk-dev] PCAP memory leak in freeing jumbo frames

2016-11-03 Thread Dror Birkman
Hi,

I have a huge memory leak when I release mbufs allocated
by eth_pcap_rx_jumbo().

I use rte_mempool_put_bulk() to release the mbufs.
To my horror I found out it puts back to the mempool only the head mbuf and
not its segments!

I know rte_pktmbuf_free() frees the mbuf and all it segments, but afaik it
is not thread safe.

What is the thread safe way to free mbufs (preferably in bulk) and their
segments?

TIA,
Dror