Hi,

This is Tom. When I am using pf_ring for fast packet capture, I found two 
possible bugs. Please take a look together.

1, in skb_ring_handler() of kernel pf_ring.c file
            FlowSlot *theSlot = get_slot(pfr, pfr->slots_info->insert_idx);
               // race condition here.
            if((theSlot == NULL) || (theSlot->slot_state == 0 /* Not full */)) {
              /* We've found the ring where the packet can be stored */
              add_skb_to_ring(skb, pfr, &hdr,
                              is_ip_pkt, displ,
                              channel_id, num_rx_channels);
              rc = 1; /* Ring found: we've done our job */
              break;
            }

This part of code has problems under SMP. Since there is no lock 
ring_index_lock, the softirq may run into this part of code simultineously. One 
core is changing the insert_index, but the other core already read the slot, 
but find the slot_state is 1. I have got the packet loss and add a prink here.

The fix should remove this check. Since in add_skb_to_ring, there is write lock 
ring_index_lock inside for race condition.

2, in pfring_read() function of userland pfring.c file, line 1014
queuedPkts caculation when counter wrapping.
//64bits case
queuedPkts = 0xFFFFFFFFFFFFFFFF -+ ring->slots_info->tot_insert - 
ring->slots_info->tot_read;

Tot_insert and tot_read is not the insert_index and read_index. Its boundary is 
not ring->slots_info->tot_slots.

Though 64bits overflow may cost one hundreds of years, but the code should keep 
right.

Thanks,
Tom

_______________________________________________
Ntop-dev mailing list
[email protected]
http://listgateway.unipi.it/mailman/listinfo/ntop-dev

Reply via email to