Received: by 2002:a05:6a10:6d10:0:0:0:0 with SMTP id gq16csp818005pxb; Tue, 12 Apr 2022 14:17:40 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxF+xFGhrNnfIzg5ZmSyH+4kig9XNNL/yQdC6wy6R4TIBjnHI+HUUs3TKOIPGrsVQ183SSi X-Received: by 2002:a17:90b:33c8:b0:1cb:afce:aaa7 with SMTP id lk8-20020a17090b33c800b001cbafceaaa7mr7140123pjb.86.1649798259863; Tue, 12 Apr 2022 14:17:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649798259; cv=none; d=google.com; s=arc-20160816; b=u3XZt0XrP1QCDEYe2b9cl4qtzyIDjj0L9uXzhQPi03yRNZctO4IspzjH1mFHIN+lqz xym+KwD03pPIkIeq+Q7SaqRu/JNtb4JPU/VyVly4pn4vJFoDm1SQNiigYuvj8+bS+TTk F0WjBshXseZGjIUrT9TYsTV0m6ALF0yfbQ0Oi8aae4uEY/vNlD0HYFElBFTpe+yUvfST OkHmW+PEf3fx94Ao9i36DBalO0l0swuy5rYa4Yg5Sf9M/rEmx+sQABPZHTJB0Ex1qDdK OImgnO+0vhw++sTx6lyk0Lfo4Tn3U3oggKvt+tBReYQnncFaFPVCDirP58V6vRqeBJ+h b4Dg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=Lx8yHGHm/jCYspcsZ3DP5IppKvzGtpfiXesQ55DTv9Y=; b=WVMNFAswy0YNAZPkyvm/xftDnxg6l+VUkMF4g/6Otyj1+fjhSO0xq6AUzCNtWYAf15 150smYlpBCzq1DqwG2/NrMhNQmhh73rJUnEE9SeRC+D6HgpWabgIM2v3zSfRzonmBfv+ 0vspkhBO1ofdiwB5d3UX/Z8TVTzBIyVomSxY98x5Dp/7gX7ECSzUXkZvTaUoDIClok76 8mousmwVQLwtA1nxz9qmyZ7uqaZ4FVFke8mjSWqoaDDAGDxiZ3pLg8fxXMgay0NjWLNl G9jIHRs80puqMJZyLhGYmvpzs/T2Ow0CBZxu0vuj+VdkfAJW2UDeKZyuXuC6jVVByLYV 0zEg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=HKG0fF5E; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id b5-20020a170902650500b00153dd942e08si12065146plk.407.2022.04.12.14.17.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Apr 2022 14:17:39 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=HKG0fF5E; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 85407F55FA; Tue, 12 Apr 2022 13:31:32 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353394AbiDLIJh (ORCPT + 99 others); Tue, 12 Apr 2022 04:09:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60466 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353673AbiDLHZv (ORCPT ); Tue, 12 Apr 2022 03:25:51 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CD1562613D; Tue, 12 Apr 2022 00:03:07 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 688F9615BB; Tue, 12 Apr 2022 07:03:07 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6F704C385A8; Tue, 12 Apr 2022 07:03:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1649746986; bh=KATIwZicvNr90IGaZXN1HDWS0h1x5A7R1dmMW/o73O4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HKG0fF5EWbBoAyp1kBr/l3zaDltuC2XMDrgrdvb8/inOTzmS/bk9DaXkng1Y7hqBL rMYDQ5q2uBIVTrUttVL5aHk8fFCdE0C5J5mt2rdiyR9Z68SGWWDjP2mPCiaprIucpd qDfDSASdvr7ToBGBM1OEcyegVL0BclGffSqQyv1A= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Eyal Birger , David Ahern , "David S. Miller" , Sasha Levin Subject: [PATCH 5.16 162/285] vrf: fix packet sniffing for traffic originating from ip tunnels Date: Tue, 12 Apr 2022 08:30:19 +0200 Message-Id: <20220412062948.346283747@linuxfoundation.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220412062943.670770901@linuxfoundation.org> References: <20220412062943.670770901@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Eyal Birger [ Upstream commit 012d69fbfcc739f846766c1da56ef8b493b803b5 ] in commit 048939088220 ("vrf: add mac header for tunneled packets when sniffer is attached") an Ethernet header was cooked for traffic originating from tunnel devices. However, the header is added based on whether the mac_header is unset and ignores cases where the device doesn't expose a mac header to upper layers, such as in ip tunnels like ipip and gre. Traffic originating from such devices still appears garbled when capturing on the vrf device. Fix by observing whether the original device exposes a header to upper layers, similar to the logic done in af_packet. In addition, skb->mac_len needs to be adjusted after adding the Ethernet header for the skb_push/pull() surrounding dev_queue_xmit_nit() to work on these packets. Fixes: 048939088220 ("vrf: add mac header for tunneled packets when sniffer is attached") Signed-off-by: Eyal Birger Reviewed-by: David Ahern Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/vrf.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c index b2242a082431..091dd7caf10c 100644 --- a/drivers/net/vrf.c +++ b/drivers/net/vrf.c @@ -1265,6 +1265,7 @@ static int vrf_prepare_mac_header(struct sk_buff *skb, eth = (struct ethhdr *)skb->data; skb_reset_mac_header(skb); + skb_reset_mac_len(skb); /* we set the ethernet destination and the source addresses to the * address of the VRF device. @@ -1294,9 +1295,9 @@ static int vrf_prepare_mac_header(struct sk_buff *skb, */ static int vrf_add_mac_header_if_unset(struct sk_buff *skb, struct net_device *vrf_dev, - u16 proto) + u16 proto, struct net_device *orig_dev) { - if (skb_mac_header_was_set(skb)) + if (skb_mac_header_was_set(skb) && dev_has_header(orig_dev)) return 0; return vrf_prepare_mac_header(skb, vrf_dev, proto); @@ -1402,6 +1403,8 @@ static struct sk_buff *vrf_ip6_rcv(struct net_device *vrf_dev, /* if packet is NDISC then keep the ingress interface */ if (!is_ndisc) { + struct net_device *orig_dev = skb->dev; + vrf_rx_stats(vrf_dev, skb->len); skb->dev = vrf_dev; skb->skb_iif = vrf_dev->ifindex; @@ -1410,7 +1413,8 @@ static struct sk_buff *vrf_ip6_rcv(struct net_device *vrf_dev, int err; err = vrf_add_mac_header_if_unset(skb, vrf_dev, - ETH_P_IPV6); + ETH_P_IPV6, + orig_dev); if (likely(!err)) { skb_push(skb, skb->mac_len); dev_queue_xmit_nit(skb, vrf_dev); @@ -1440,6 +1444,8 @@ static struct sk_buff *vrf_ip6_rcv(struct net_device *vrf_dev, static struct sk_buff *vrf_ip_rcv(struct net_device *vrf_dev, struct sk_buff *skb) { + struct net_device *orig_dev = skb->dev; + skb->dev = vrf_dev; skb->skb_iif = vrf_dev->ifindex; IPCB(skb)->flags |= IPSKB_L3SLAVE; @@ -1460,7 +1466,8 @@ static struct sk_buff *vrf_ip_rcv(struct net_device *vrf_dev, if (!list_empty(&vrf_dev->ptype_all)) { int err; - err = vrf_add_mac_header_if_unset(skb, vrf_dev, ETH_P_IP); + err = vrf_add_mac_header_if_unset(skb, vrf_dev, ETH_P_IP, + orig_dev); if (likely(!err)) { skb_push(skb, skb->mac_len); dev_queue_xmit_nit(skb, vrf_dev); -- 2.35.1