I am trying to load balance incoming network packets across multiple
consumer threads.  Each thread should grab a batch of packets at a time.
If I set the batch size (burst_sz) to 1, everything works.  But if the
batch size is greater than 1, I get a seg fault.   This makes me think that
I am doing something really stupid here.  What am I missing?

// step 1: each thread captures 'burst_sz' packets at a time
burst_sz = 32;

// step 2: a packet buffer that serves all threads.  each thread

// has its own space within the buffer.

pfring_zc_pkt_buff **buffers;

// step 3: create the packet buffers for each thread
buff_count = num_threads * burst_sz;
buffers = calloc(buff_count, sizeof(pfring_zc_pkt_buff *));
for (i = 0; i < buff_count; i++) {
    buffers[i] = pfring_zc_get_packet_handle(zc);

// step 4: each thread has an 'id' [0....n).
// each thread needs enough space to capture 'burst_sz' packets
// 'id * burst_sz' gives me the location of a thread's space within the
buffer
pfring_zc_pkt_buff *pkts = buffers[id * burst_sz]

// step 5: grab some packets from the wire
num_pkts = pfring_zc_recv_pkt_burst(..., &pkts, burst_sz, ...);


Here is a snippet of what I get out of GDB.  I don't have a copy of PF_RING
with symbols, so this may not be very useful.

(gdb) bt full
#0  0x00000000004187fd in __pfring_zc_spsc_recv_pkt_burst ()
...


Many Thanks!   Hopefully I am just doing something stupid with buffer.



-- 
Nick Allen <[email protected]>
_______________________________________________
Ntop-misc mailing list
[email protected]
http://listgateway.unipi.it/mailman/listinfo/ntop-misc

Reply via email to