Dear kernel networking gurus, 
  

I am trying to understand why tcpdump does not work properly for vlan packets 
on linux. Here is the existing behavior, observed with:
  - kernel 2.6.16,   
- e1000 driver  
- libpcap 0.9.6  
- tcpdump 3.9.6 
  

The e1000 driver has two modes when handling vlan frames:  
(A) Default mode, when   
- on rx, the mac includes vlan headers   
- on tx, the mac expects tx frames to include vlan headers.   
(B) Vlan hw accelerated mode, when:  
- on rx, the mac does not include vlan headers, and instead passes vlan tag 
information in the status field of the ring buffer
  - on tx, the mac expects no vlan headers, and instead expects vlan tag 
information to be passed in the status field of the ring buffer
  

If no vlan interfaces are used, the e1000 driver configures the mac in default 
mode (A). The system will only receive vlan traffic, and not transmit any. 
Tcpdump then gets the entire rx vlan buffers, and displays them correctly.
  

Suppose now that at least one vlan interface is used - say eth0 is the main 
physical interface, and eth0.2 is an interface created on vlan id 2. The e1000 
driver then switches to vlan hw accelerated mode (B). Furthermore, even if set 
promiscuous, the e1000 will filter out any rx vlan frames of id other than 2, 
which breaks tcpdump (bug 1).
  

Suppose in our scenario with eth0 and eth0.2 we're running tcpdump on eth0 - 
which uses a packet socket. The rx vlan frames with id 2 are then assigned by 
the driver to eth0.2, and are therefore not passed to the packet socket and to 
tcpdump (bug 2). The tx vlan frames on eth0.2 are passed to the packet socket 
without any vlan information, and tcpdump does not display the vlan header (bug 
3)
  

In conclusion, here is the buglist:  
1). If set promiscuous, the e1000 should disable any vlan rx filtering, so that 
it can receive vlan frames of other vlan id's. Other ethernet drivers probably 
need fixed as well.
  2). The packet layer should change the rx skb device from the vlan 'fake' 
device (eth0.2) to the corresponding physical device (eth0), so when we run 
tcpdump on eth0 we see all vlan-tagged and non-vlan-tagged frames
  3). The packet socket layer should insert the vlan tag header before passing 
frames to the upper layer, so tcpdump can display them.
  

Open issue:  
4). What is the expected behavior when running 'tcpdump -I eth0.2'? Perhaps the 
packet socket should silently display all frames on eth0, so running 'tcpdump 
-i eth0' is equivalent to 'tcpdump -i eth0.2'

  

Thoughts? Comments? Please cc [EMAIL PROTECTED], I am not subscribed. 
  

Andrei Radulescu-Banu  
Brix Networks 





      
____________________________________________________________________________________
Luggage? GPS? Comic books? 
Check out fitting gifts for grads at Yahoo! Search
http://search.yahoo.com/search?fr=oni_on_mail&p=graduation+gifts&cs=bz
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to