netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* can multi app capture on same NIC?(use packet_mmap)
@ 2010-06-22  9:40 Jon Zhou
  2010-06-22 18:31 ` Paul LeoNerd Evans
  0 siblings, 1 reply; 2+ messages in thread
From: Jon Zhou @ 2010-06-22  9:40 UTC (permalink / raw)
  To: netdev@vger.kernel.org

Hi there

I'd like to know multi-app can work with packet_mmap (or traditional AF_PACKET system call)?
i.e.
app1 & app2 capture on the same NIC

will both of them receive the same packet? 

Or this situation will happen?

1.app1 start to receive a packet#1
2.app1 complete receiving, then set the packet_status->TP_STATUS_KERNEL
3.how about app2 at this time? Will it see packet_status=KERNEL, then packet#1 got lost?

I tried to find the relevant code in af_packet.c, seems it doesn't guarantee multi-app capture on same NIC?
Can someone help to point it out?


Thanks
jon 


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: can multi app capture on same NIC?(use packet_mmap)
  2010-06-22  9:40 can multi app capture on same NIC?(use packet_mmap) Jon Zhou
@ 2010-06-22 18:31 ` Paul LeoNerd Evans
  0 siblings, 0 replies; 2+ messages in thread
From: Paul LeoNerd Evans @ 2010-06-22 18:31 UTC (permalink / raw)
  To: Jon Zhou, netdev

[-- Attachment #1: Type: text/plain, Size: 1884 bytes --]

On Tue, Jun 22, 2010 at 02:40:13AM -0700, Jon Zhou wrote:
> I'd like to know multi-app can work with packet_mmap (or traditional AF_PACKET system call)?
> i.e.
> app1 & app2 capture on the same NIC
> 
> will both of them receive the same packet? 
> 
> Or this situation will happen?
> 
> 1.app1 start to receive a packet#1
> 2.app1 complete receiving, then set the packet_status->TP_STATUS_KERNEL
> 3.how about app2 at this time? Will it see packet_status=KERNEL, then packet#1 got lost?

Sure; each PF_PACKET socket gets its own memory buffer.

> I tried to find the relevant code in af_packet.c, seems it doesn't guarantee multi-app capture on same NIC?
> Can someone help to point it out?

That's because af_packet.c doesn't need to care. All the relevant code
is found in net/core/dev.c

PF_PACKET sockets get installed into the ptype_all list:

  void dev_add_pack(struct packet_type *pt)
  {
          int hash;

          spin_lock_bh(&ptype_lock);
          if (pt->type == htons(ETH_P_ALL))
                  list_add_rcu(&pt->list, &ptype_all);
  ...

Thereafter, every packet that's received is delivered, individually, to
every handler in that list:

  int netif_receive_skb(struct sk_buff *skb)
  {
  ...
          list_for_each_entry_rcu(ptype, &ptype_all, list) {
                  if (ptype->dev == null_or_orig || ptype->dev == skb->dev ||
                      ptype->dev == orig_dev) {
                          if (pt_prev)
                                  ret = deliver_skb(skb, pt_prev, orig_dev);
  ...

Finally, in net/packet/af_packet.c, each PF_PACKET socket gets a copy of
this skb anyway; look for the call to skb_copy_bits() in the function
tpacket_rcv()

Hope that helps,

-- 
Paul "LeoNerd" Evans

leonerd@leonerd.org.uk
ICQ# 4135350       |  Registered Linux# 179460
http://www.leonerd.org.uk/

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 190 bytes --]

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2010-06-22 18:31 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-06-22  9:40 can multi app capture on same NIC?(use packet_mmap) Jon Zhou
2010-06-22 18:31 ` Paul LeoNerd Evans

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).