From patchwork Thu Dec 6 21:22:08 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ani Sinha X-Patchwork-Id: 204324 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 6050B2C0123 for ; Fri, 7 Dec 2012 08:22:13 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1423129Ab2LFVWK (ORCPT ); Thu, 6 Dec 2012 16:22:10 -0500 Received: from mail-vc0-f174.google.com ([209.85.220.174]:34762 "EHLO mail-vc0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1422673Ab2LFVWJ (ORCPT ); Thu, 6 Dec 2012 16:22:09 -0500 Received: by mail-vc0-f174.google.com with SMTP id d16so6475184vcd.19 for ; Thu, 06 Dec 2012 13:22:08 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:x-gm-message-state; bh=GAJdHV3Ac7jXG5VJvLvxincgbXVkL68gTu9JgO1EBhc=; b=V7MB9+JA554htua+3+9OOAzsjEVpAGj96gk8IYX9ZdeI2MiAAIJ3XnWnMIyYLJ5Fw+ jIcNd1ANSQn7FVbhowkKVkNuZJp0Eta/s9lRtPFTNgqTlUAy2Kdjrds4LYTJZyNPq/ml FgPxjSqVzQxX7BpIDs9ZsM/w2NkFGMM03VuleOBPsUv8/kOLajPNiIPjiNjoA2PUc0sn +8TyELWGYJX6e6uz5y2zv+FTfnH6XZ+So6xNWVqIYf0EUsU+/OptG8l9KJ1ToyZrCXEJ Nk9k5dIiQGLfc6jDF8cp7uE9kXnLjc8dUFALMSGs++fdikr7qMg5/bjhK57x6+HY+UME 6DgQ== MIME-Version: 1.0 Received: by 10.220.107.5 with SMTP id z5mr2415352vco.22.1354828928439; Thu, 06 Dec 2012 13:22:08 -0800 (PST) Received: by 10.58.249.240 with HTTP; Thu, 6 Dec 2012 13:22:08 -0800 (PST) In-Reply-To: <87obivu7n7.fsf@xmission.com> References: <3246.1351717319@obiwan.sandelman.ca> <87mwyi9h1x.fsf@xmission.com> <12918.1353190488@obiwan.sandelman.ca> <87obivu7n7.fsf@xmission.com> Date: Thu, 6 Dec 2012 13:22:08 -0800 Message-ID: Subject: Re: [tcpdump-workers] vlan tagged packets and libpcap breakage From: Ani Sinha To: "Eric W. Biederman" Cc: Michael Richardson , tcpdump-workers@lists.tcpdump.org, netdev@vger.kernel.org, Francesco Ruggeri X-Gm-Message-State: ALoCoQkJOhxXRlmmUg2W/yhQtzrl0KYhY6+Hotp/X21Wz4eVvV23h3y1GlgvW3+c72F9G4/12Gt4 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org On Sat, Nov 17, 2012 at 3:33 PM, Eric W. Biederman wrote: > the vlan header in packets as we receive them. > > The code is correct except for the case of packets in vlan 0. Currently > the packet reconstruction is ambiguous. The most recent kernels have > a TP_STATUS_VLAN_VALID flag that can be checked to see if the packet was > in vlan 0 or if there was no vlan at all. libpcap probably should be > taught how to handle TP_STATUS_VLAN_VALID so that it can get the vlan 0 > handling correct. > May be this? len = packet_len > iov.iov_len ? iov.iov_len : packet_len; @@ -3565,7 +3555,11 @@ pcap_read_linux_mmap(pcap_t *handle, int } #ifdef HAVE_TPACKET2 - if (handle->md.tp_version == TPACKET_V2 && h.h2->tp_vlan_tci && +#if defined(TP_STATUS_VLAN_VALID) + if (handle->md.tp_version == TPACKET_V2 && (h.h2->tp_vlan_tci & TP_STATUS_VLAN_VALID) && +#else + if (handle->md.tp_version == TPACKET_V2 && h.h2->tp_vlan_tci && +#endif handle->md.vlan_offset != -1 && tp_snaplen >= (unsigned int) handle->md.vlan_offset) { struct vlan_tag *tag; --- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Index: libpcap-1.1.1/pcap-linux.c =================================================================== --- libpcap-1.1.1.orig/pcap-linux.c +++ libpcap-1.1.1/pcap-linux.c @@ -132,6 +132,7 @@ static const char rcsid[] _U_ = #include #include #include +#include #include #include #include @@ -1486,7 +1487,13 @@ pcap_read_packet(pcap_t *handle, pcap_ha continue; aux = (struct tpacket_auxdata *)CMSG_DATA(cmsg); - if (aux->tp_vlan_tci == 0) +#if defined(TP_STATUS_VLAN_VALID) + if (!(aux->tp_vlan_tci & TP_STATUS_VLAN_VALID)) +#else + if (aux->tp_vlan_tci == 0) /* this is ambigious but without the + TP_STATUS_VLAN_VALID flag, there is + nothing that we can do */ +#endif continue;