Received: by 2002:a25:7ec1:0:0:0:0:0 with SMTP id z184csp6024779ybc; Wed, 27 Nov 2019 13:36:28 -0800 (PST) X-Google-Smtp-Source: APXvYqzV45dwmB6WCkNt877VOr9iXpDRPlAr9SeI1FJ4o1tN3NOU6Yls2k8zlzNtU6eoTRQVm8ls X-Received: by 2002:a50:9f65:: with SMTP id b92mr34414485edf.63.1574890588865; Wed, 27 Nov 2019 13:36:28 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1574890588; cv=none; d=google.com; s=arc-20160816; b=ZyU5nLY4qYi/cyRozMTb8KjS3dZlXeL1xs10AkFthDndWSd9D8T3BzYiP/FUxP6ivs D9bHTbZim4jcoI43TD6KqL31kf2BKdLi4jN92yytiJqiI4wS+d5U3BZmQjE+caKAVDlq WbgATydLPax5CVqPcmQXnh2FDxDVp+CkEVrTQvni8NyaX+aAL8HGPSRBlVCt/pWbfnqd ukyPpUkEx7HCjA2xt8lht8Bnj2CpvFuUJerighi40yZbWErubfpisKo5PnQdNfcouFaR UNkA6LVeE6DgX1al7EeZ8WnnpuTpWnW3uVUOUy/FW1XSCvvteV0YQfTixlkqAT2otKIS F2sw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=j+umuTtosD1DGE+A1YeR/7RmIyz5HZwjPJT0kR+ivzo=; b=Hs1ZmaquQ5ogzGJeDvulMymajXzPuEAOH8EQEGlwR9ld20kTrVcCes1JG00YW46e+A it8KyGOQRHSrsrnYCOIjOL+p9EXSn7Mz0d3GfqN4wiFJvRqnQ15QdjhMbmJMyJUlfKZ2 XeNXWWaETBQla/9Ddh8hq7McioorsJASU+gb5dB6VA7g9kR4akO7L8avBKiZTR45BhJZ wEsaDtei/pxzGZcxyfo/vA7fu5Dnr/GE7H7jcV4d4SE6cEQfa6+bFI+KVw7HN5bEkTdY 7jIW5vj431wcS2fOm6jQAeG59uUBvmKtGMGBplKx/CfUDL7fWdkO3eXRt7VllX2/ll+a OGYg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=X6lfIAHB; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h5si12505444edd.401.2019.11.27.13.36.04; Wed, 27 Nov 2019 13:36:28 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=X6lfIAHB; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727768AbfK0UwN (ORCPT + 99 others); Wed, 27 Nov 2019 15:52:13 -0500 Received: from mail.kernel.org ([198.145.29.99]:39388 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730570AbfK0UwG (ORCPT ); Wed, 27 Nov 2019 15:52:06 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 011C42184C; Wed, 27 Nov 2019 20:52:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1574887926; bh=J8nLv1zzZihBjk9Qf7MzVMFSXvKTV4N1SPSE8aD/4sA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=X6lfIAHBL/H5IlRIPS/SOlGnTs6WGPWJrVlYKmyFEfwRr47WzEdG2rJYBviosYluP NT+Fab0tC7n3eanm6gJeiee32Ha7arHPuo6JaJV6XxNNXjVNZ87Pf5f6B0vpBnAwFn gZpfzxZaqC2hBpJkbOIkSyDrLcTuWQ5NBA+rQwUA= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Mike Manning , David Ahern , "David S. Miller" , Sasha Levin Subject: [PATCH 4.14 149/211] vrf: mark skb for multicast or link-local as enslaved to VRF Date: Wed, 27 Nov 2019 21:31:22 +0100 Message-Id: <20191127203108.083769323@linuxfoundation.org> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191127203049.431810767@linuxfoundation.org> References: <20191127203049.431810767@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Mike Manning [ Upstream commit 6f12fa775530195a501fb090d092c637f32d0cc5 ] The skb for packets that are multicast or to a link-local address are not marked as being enslaved to a VRF, if they are received on a socket bound to the VRF. This is needed for ND and it is preferable for the kernel not to have to deal with the additional use-cases if ll or mcast packets are handled as enslaved. However, this does not allow service instances listening on unbound and bound to VRF sockets to distinguish the VRF used, if packets are sent as multicast or to a link-local address. The fix is for the VRF driver to also mark these skb as being enslaved to the VRF. Signed-off-by: Mike Manning Reviewed-by: David Ahern Tested-by: David Ahern Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- drivers/net/vrf.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c index 03e4fcdfeab73..e0cea5c05f0e2 100644 --- a/drivers/net/vrf.c +++ b/drivers/net/vrf.c @@ -996,24 +996,23 @@ static struct sk_buff *vrf_ip6_rcv(struct net_device *vrf_dev, struct sk_buff *skb) { int orig_iif = skb->skb_iif; - bool need_strict; + bool need_strict = rt6_need_strict(&ipv6_hdr(skb)->daddr); + bool is_ndisc = ipv6_ndisc_frame(skb); - /* loopback traffic; do not push through packet taps again. - * Reset pkt_type for upper layers to process skb + /* loopback, multicast & non-ND link-local traffic; do not push through + * packet taps again. Reset pkt_type for upper layers to process skb */ - if (skb->pkt_type == PACKET_LOOPBACK) { + if (skb->pkt_type == PACKET_LOOPBACK || (need_strict && !is_ndisc)) { skb->dev = vrf_dev; skb->skb_iif = vrf_dev->ifindex; IP6CB(skb)->flags |= IP6SKB_L3SLAVE; - skb->pkt_type = PACKET_HOST; + if (skb->pkt_type == PACKET_LOOPBACK) + skb->pkt_type = PACKET_HOST; goto out; } - /* if packet is NDISC or addressed to multicast or link-local - * then keep the ingress interface - */ - need_strict = rt6_need_strict(&ipv6_hdr(skb)->daddr); - if (!ipv6_ndisc_frame(skb) && !need_strict) { + /* if packet is NDISC then keep the ingress interface */ + if (!is_ndisc) { vrf_rx_stats(vrf_dev, skb->len); skb->dev = vrf_dev; skb->skb_iif = vrf_dev->ifindex; -- 2.20.1