That does not solve the cases I wrote below. The filters I wrote are also 
difficult to translate to the syntax you suggested:
* (vlan 1 or vlan 2) and ip
* (vlan 1 or ether) and ip

I'm hoping to be free to implement the algorithm I suggested in the near 
future. Once I'll get around to it, you're gonna have a pull request that 
solves half the problem, as I suggested.

On Oct 28, 2013 12:20 AM, Gianluca Varenni <gianluca.vare...@riverbed.com> 
wrote:
>
> One consideration here: the behavior or the "vlan" keyword, although 
> extremely confusing and honestly brain damaged, has been there for multiple 
> years, and there are probably a number of tools relying on this confusing 
> behavior. Changing it might mean breaking some existing applications. 
>
> Earlier this year, I proposed a different syntax for the vlan keyword that 
> should be backwards compatible. You can find the conversation here: 
>
> http://article.gmane.org/gmane.network.tcpdump.devel/6177/match=varenni 
>
> What do you think? 
>
> Have a nice day 
> GV 
>
> -----Original Message----- 
> From: tcpdump-workers-boun...@lists.tcpdump.org 
> [mailto:tcpdump-workers-boun...@lists.tcpdump.org] On Behalf Of Shoham Peller 
> Sent: Saturday, October 26, 2013 2:40 PM 
> To: tcpdump-workers@lists.tcpdump.org 
> Subject: Re: [tcpdump-workers] [libpcap] OR'ing vlans impossible in tcpdump 
> filter (issue #158) 
>
> Thought about it, and this is not a complete solution. 
> It doesn't solve things like: 
> * (vlan 1 or vlan 2) and ip 
> * (vlan 1 or ether) and ip 
>
> So the solution isn't complete, but it sure does improve the current 
> situation. 
> So what do you say? Should we proceed to develop this logic? 
>
> Shoham Peller <shoham_pel...@yahoo.com> wrote: 
>
> >Hi Everyone, 
> > 
> > 
> > 
> >I'm happy to join the mailing list. 
> > 
> > 
> > 
> >There is a prolonged issue with libpcap and vlan filtering, explained 
> >in this ticket: 
> > 
> >https://github.com/the-tcpdump-group/libpcap/issues/158 
> > 
> > 
> > 
> >In short, filters containing ORs and one or more "VLAN" keywords, 
> >behave unexpectedly. 
> > 
> > 
> > 
> >This is explained very well in the comment in gencode.c:7857: 
> > 
> >/* 
> > 
> >* Check for a VLAN packet, and then change the offsets to point 
> > 
> >* to the type and data fields within the VLAN packet.  Just 
> > 
> >* increment the offsets, so that we can support a hierarchy, e.g. 
> > 
> >* "vlan 300 && vlan 200" to capture VLAN 200 encapsulated within 
> > 
> >* VLAN 100. 
> > 
> >* 
> > 
> >* XXX - this is a bit of a kludge.  If we were to split the 
> > 
> >* compiler into a parser that parses an expression and 
> > 
> >* generates an expression tree, and a code generator that 
> > 
> >* takes an expression tree (which could come from our 
> > 
> >* parser or from some other parser) and generates BPF code, 
> > 
> >* we could perhaps make the offsets parameters of routines 
> > 
> >* and, in the handler for an "AND" node, pass to subnodes 
> > 
> >* other than the VLAN node the adjusted offsets. 
> > 
> >* 
> > 
> >* This would mean that "vlan" would, instead of changing the 
> > 
> >* behavior of *all* tests after it, change only the behavior 
> > 
> >* of tests ANDed with it.  That would change the documented 
> > 
> >* semantics of "vlan", which might break some expressions. 
> > 
> >* However, it would mean that "(vlan and ip) or ip" would check 
> > 
> >* both for VLAN-encapsulated IP and IP-over-Ethernet, rather than 
> > 
> >* checking only for VLAN-encapsulated IP, so that could still 
> > 
> >* be considered worth doing; it wouldn't break expressions 
> > 
> >* that are of the form "vlan and ..." or "vlan N and ...", 
> > 
> >* which I suspect are the most common expressions involving 
> > 
> >* "vlan".  "vlan or ..." doesn't necessarily do what the user 
> > 
> >* would really want, now, as all the "or ..." tests would 
> > 
> >* be done assuming a VLAN, even though the "or" could be viewed 
> > 
> >* as meaning "or, if this isn't a VLAN packet...". 
> > 
> >*/ 
> > 
> > 
> > 
> >This comment, commited by  <https://github.com/yuguy> @yuguy in 2005 
> >explains this issue very well. yacc parsers the bpf from left to right 
> >without saving the state, and doesn't provide a tree of some kind, 
> >which would allow an easy solution. <https://github.com/yuguy> @yuguy 
> >says that OR'ing vlans in the current parsing methodology is impossible. 
> > 
> >But there might be a solution, if GCC used yacc in previous version to 
> >parse C code, a state *can* be saved. We simply want yacc to parse 
> >parenthesis, and using them to increment the offset, and with each 'OR' 
> >it encounters, resetting the offset to its last state. Let me explain: 
> > 
> >tcpdump -d 'vlan and (vlan or arp) or ip' 
> >would mean: 
> > 
> >1. filter vlan with the current offset (0) and increment offset ( = 4) 
> >2. open parenthesis. push the offset in a stack 3. filter vlan with the 
> >current offset (0) and increment offset ( = 8) 4. or. reset the offset 
> >to it's state in the last parenthesis from the offset stack ( = 4) 5. 
> >filter arp with the current offset (4) 6. close parenthesis. pop the 
> >offset's state 7. or. reset the offset to it's state in the last 
> >parenthesis from the offset stack ( = 0) 8. filter ip with the current 
> >offset (0) 
> > 
> >As it seems to me, this will solve the issue, and would allow OR'ing vlans. 
> > 
> >What do you say? 
> > 
> >Thanks in advance, 
> > 
> >Shoham Peller 
> > 
> >_______________________________________________ 
> >tcpdump-workers mailing list 
> >tcpdump-workers@lists.tcpdump.org 
> >https://lists.sandelman.ca/mailman/listinfo/tcpdump-workers 
> _______________________________________________ 
> tcpdump-workers mailing list 
> tcpdump-workers@lists.tcpdump.org 
> https://lists.sandelman.ca/mailman/listinfo/tcpdump-workers 
_______________________________________________
tcpdump-workers mailing list
tcpdump-workers@lists.tcpdump.org
https://lists.sandelman.ca/mailman/listinfo/tcpdump-workers

Reply via email to