Received: by 2002:a25:7ec1:0:0:0:0:0 with SMTP id z184csp2342475ybc; Wed, 20 Nov 2019 12:38:13 -0800 (PST) X-Google-Smtp-Source: APXvYqweTwjH0at8NeWuXsqolEkFABXOAyTFJMIsGZnV5hbBfjOp+cVkO2Hmv52EQ3/i9gErAbbk X-Received: by 2002:a17:906:53c7:: with SMTP id p7mr7774557ejo.88.1574282293334; Wed, 20 Nov 2019 12:38:13 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1574282293; cv=none; d=google.com; s=arc-20160816; b=alWTbirQNdBjbd30ECmyyiqId8sjzX6/YUKMQk0mVr0X/Adady7D2p+/zTSp6NxP10 SMsxIuEoXruuyCOqvTAJ7MzPa54t4PtdsA933qYZn9MjuIEcmZ9V/Sy73QsCQWBsvdDj cl7J5bVV8h1vxWk6w5GT44aBtu5vsZAecSj/RVeUjGBXbSml3X7lSDENza9aKRKbydtu 9DmDmts3JKZzieycs9OWCpayphSSzqbnEqdOvxXyFJqvP9HFl1iY9eFOnZ46zZl28xl+ fN5ZqnINnpWTbr84mmVktkFBhmfjdjIN24Td6OSipXMmYTeJFPg2p9wCJ7cEGC7YhpLr QPMQ== 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 :message-id:date:subject:cc:to:from; bh=aDHE354ofG9GNal+aUwbAKlI/ulbj+y62lyaCwVlbn0=; b=TTkJsd4xifltVxJt/DvKLOPPzyEa2hAz0hayqyFtPtZBmeNpdFooZ96n8L9rOXfftv yrhUK53owUKIHFhIn98om1/rPsiO1chP5YVUnCYwA452eG0tZtHdKIBk3Rdp4zZ2JNEO cxXyJd7e457EH6Gm7U99huXDRUPz02xcVLdUNSK/MvsQcv7TijnyyZegviC/c1m4/k85 PTbP/Saig1A+EOzMKN58nygs1WVOKAAh3iZvVctIBzgNr9Jdq+0iR1yRxBGqt9jpsDGT pczGPgM/ktZbnHrTj+90qMhD/ZQdA46xzGYcMEVsIg+MPrByo0gv7rswXxPV28Dq7Iau 6H+A== ARC-Authentication-Results: i=1; mx.google.com; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=uniroma2.it Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q6si179782eja.282.2019.11.20.12.37.49; Wed, 20 Nov 2019 12:38:13 -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; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=uniroma2.it Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726784AbfKTUge (ORCPT + 99 others); Wed, 20 Nov 2019 15:36:34 -0500 Received: from smtp.uniroma2.it ([160.80.6.23]:48557 "EHLO smtp.uniroma2.it" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725819AbfKTUge (ORCPT ); Wed, 20 Nov 2019 15:36:34 -0500 Received: from localhost.localdomain ([160.80.103.126]) by smtp-2015.uniroma2.it (8.14.4/8.14.4/Debian-8) with ESMTP id xAKKZoCA014088 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT); Wed, 20 Nov 2019 21:35:51 +0100 From: Andrea Mayer To: "David S. Miller" , Sergei Shtylyov , Alexey Kuznetsov , Hideaki YOSHIFUJI , David Lebrun , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Andrea Mayer Subject: [net-next, v2] seg6: allow local packet processing for SRv6 End.DT6 behavior Date: Mon, 18 Nov 2019 23:25:58 +0100 Message-Id: <20191118222558.2973-1-andrea.mayer@uniroma2.it> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Virus-Scanned: clamav-milter 0.100.0 at smtp-2015 X-Virus-Status: Clean Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org End.DT6 behavior makes use of seg6_lookup_nexthop() function which drops all packets that are destined to be locally processed. However, DT* should be able to deliver decapsulated packets that are destined to local addresses. Function seg6_lookup_nexthop() is also used by DX6, so in order to maintain compatibility I created another routing helper function which is called seg6_lookup_any_nexthop(). This function is able to take into account both packets that have to be processed locally and the ones that are destined to be forwarded directly to another machine. Hence, seg6_lookup_any_nexthop() is used in DT6 rather than seg6_lookup_nexthop() to allow local delivery. Signed-off-by: Andrea Mayer --- net/ipv6/seg6_local.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/net/ipv6/seg6_local.c b/net/ipv6/seg6_local.c index e70567446f28..172a45462288 100644 --- a/net/ipv6/seg6_local.c +++ b/net/ipv6/seg6_local.c @@ -149,8 +149,9 @@ static void advance_nextseg(struct ipv6_sr_hdr *srh, struct in6_addr *daddr) *daddr = *addr; } -int seg6_lookup_nexthop(struct sk_buff *skb, struct in6_addr *nhaddr, - u32 tbl_id) +static int +seg6_lookup_any_nexthop(struct sk_buff *skb, struct in6_addr *nhaddr, + u32 tbl_id, bool local_delivery) { struct net *net = dev_net(skb->dev); struct ipv6hdr *hdr = ipv6_hdr(skb); @@ -158,6 +159,7 @@ int seg6_lookup_nexthop(struct sk_buff *skb, struct in6_addr *nhaddr, struct dst_entry *dst = NULL; struct rt6_info *rt; struct flowi6 fl6; + int dev_flags = 0; fl6.flowi6_iif = skb->dev->ifindex; fl6.daddr = nhaddr ? *nhaddr : hdr->daddr; @@ -182,7 +184,13 @@ int seg6_lookup_nexthop(struct sk_buff *skb, struct in6_addr *nhaddr, dst = &rt->dst; } - if (dst && dst->dev->flags & IFF_LOOPBACK && !dst->error) { + /* we want to discard traffic destined for local packet processing, + * if @local_delivery is set to false. + */ + if (!local_delivery) + dev_flags |= IFF_LOOPBACK; + + if (dst && (dst->dev->flags & dev_flags) && !dst->error) { dst_release(dst); dst = NULL; } @@ -199,6 +207,12 @@ int seg6_lookup_nexthop(struct sk_buff *skb, struct in6_addr *nhaddr, return dst->error; } +inline int seg6_lookup_nexthop(struct sk_buff *skb, + struct in6_addr *nhaddr, u32 tbl_id) +{ + return seg6_lookup_any_nexthop(skb, nhaddr, tbl_id, false); +} + /* regular endpoint function */ static int input_action_end(struct sk_buff *skb, struct seg6_local_lwt *slwt) { @@ -396,7 +410,7 @@ static int input_action_end_dt6(struct sk_buff *skb, skb_set_transport_header(skb, sizeof(struct ipv6hdr)); - seg6_lookup_nexthop(skb, NULL, slwt->table); + seg6_lookup_any_nexthop(skb, NULL, slwt->table, true); return dst_input(skb); -- 2.20.1