From patchwork Tue Jan 8 18:51:32 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Borkmann X-Patchwork-Id: 210474 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 5C1912C0085 for ; Wed, 9 Jan 2013 05:51:52 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756975Ab3AHSvt (ORCPT ); Tue, 8 Jan 2013 13:51:49 -0500 Received: from mx1.redhat.com ([209.132.183.28]:39755 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756955Ab3AHSvs (ORCPT ); Tue, 8 Jan 2013 13:51:48 -0500 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r08IpkoX024814 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 8 Jan 2013 13:51:46 -0500 Received: from localhost (vpn1-4-216.ams2.redhat.com [10.36.4.216]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r08IpiEM003176; Tue, 8 Jan 2013 13:51:45 -0500 From: Daniel Borkmann To: David Miller Cc: netdev@vger.kernel.org, Daniel Borkmann , Eric Dumazet , Ani Sinha , Jiri Pirko Subject: [PATCH net 1/2] net: dev_queue_xmit_nit: fix skb->vlan_tci field value Date: Tue, 8 Jan 2013 19:51:32 +0100 Message-Id: <1357671093-9605-2-git-send-email-dborkman@redhat.com> In-Reply-To: <1357671093-9605-1-git-send-email-dborkman@redhat.com> References: <1357671093-9605-1-git-send-email-dborkman@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org VLAN packets that are locally injected through taps will loose their skb->vlan_tci value when they pass dev_hard_start_xmit and get looped back to a packet sniffer via dev_queue_xmit_nit. Besides others, this meta data is used in Linux socket filtering for VLANs. Tested with a VLAN ancillary ops filter. Patch is based on a previous version by Jiri Pirko. Cc: Eric Dumazet Cc: Ani Sinha Cc: Jiri Pirko Reported-by: Paul Pearce Signed-off-by: Daniel Borkmann Acked-by: Ani Sinha --- net/core/dev.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/net/core/dev.c b/net/core/dev.c index 515473e..723dcd0 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -1775,6 +1775,19 @@ static void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev) struct packet_type *ptype; struct sk_buff *skb2 = NULL; struct packet_type *pt_prev = NULL; + struct ethhdr *ehdr; + + /* Network taps could make use of skb->vlan_tci, which got wiped + * out. Hence, we need to reset it correctly. + */ + skb_reset_mac_header(skb); + ehdr = eth_hdr(skb); + + if (ehdr->h_proto == __constant_htons(ETH_P_8021Q)) { + skb2 = vlan_untag(skb); + if (likely(skb2)) + skb = skb2; + } rcu_read_lock(); list_for_each_entry_rcu(ptype, &ptype_all, list) {