From mboxrd@z Thu Jan 1 00:00:00 1970 From: Stephen Hemminger Subject: Re: [tcpdump-workers] vlan tagged packets and libpcap breakage Date: Tue, 11 Dec 2012 15:12:31 -0800 Message-ID: <20121211151231.0272015b@nehalam.linuxnetplumber.net> References: <3246.1351717319@obiwan.sandelman.ca> <87mwyi9h1x.fsf@xmission.com> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Cc: "Eric W. Biederman" , Michael Richardson , netdev@vger.kernel.org, tcpdump-workers@lists.tcpdump.org, Francesco Ruggeri To: ani@aristanetworks.com Return-path: Received: from mail.vyatta.com ([76.74.103.46]:52534 "EHLO mail.vyatta.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754006Ab2LKXSB (ORCPT ); Tue, 11 Dec 2012 18:18:01 -0500 In-Reply-To: Sender: netdev-owner@vger.kernel.org List-ID: On Tue, 11 Dec 2012 14:36:33 -0800 (PST) Ani Sinha wrote: > > > > It is possible to test for the presence of support of the new vlan bpf > > extensions by attempting to load a filter that uses them. As only valid > > filters can be loaded, old kernels that do not support filtering of vlan > > tags will fail to load the a test filter with uses them. > > Unfortunately I do not see this. The sk_chk_filter() does not have a > default in the case statement and the check will not detect an unknown > instruction. It will fail when the filter is run and as far as I can see, > the packet will be dropped. Something like this might help? > > diff --git a/net/core/filter.c b/net/core/filter.c > index c23543c..96338aa 100644 > --- a/net/core/filter.c > +++ b/net/core/filter.c > @@ -548,6 +548,8 @@ int sk_chk_filter(struct sock_filter *filter, unsigned int flen) > return -EINVAL; > /* Some instructions need special checks */ > switch (code) { > + /* for unknown instruction, return EINVAL */ > + default : return -EINVAL; > case BPF_S_ALU_DIV_K: > /* check for division by zero */ > if (ftest->k == 0) Did you test this? I think it will blow up for some existing instructions like BPF_S_ALU_XOR_X or any of the other non-special instructions. Also it is not formatted correctly for the kernel programming style. ERROR: space prohibited before that ':' (ctx:WxW) #86: FILE: net/core/filter.c:552: + default : return -EINVAL; ^