From nobody Fri Jan 2 04:02:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3C739CDB482 for ; Mon, 16 Oct 2023 07:15:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232114AbjJPHPs (ORCPT ); Mon, 16 Oct 2023 03:15:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35124 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229668AbjJPHPi (ORCPT ); Mon, 16 Oct 2023 03:15:38 -0400 Received: from mail-ej1-x62a.google.com (mail-ej1-x62a.google.com [IPv6:2a00:1450:4864:20::62a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F0900AD; Mon, 16 Oct 2023 00:15:35 -0700 (PDT) Received: by mail-ej1-x62a.google.com with SMTP id a640c23a62f3a-9bda758748eso382919066b.2; Mon, 16 Oct 2023 00:15:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1697440534; x=1698045334; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=2kiZfGk8qOY0ezcTTkcNb4cILnemak8jfZ8cGRnm5dM=; b=KBQBjtAzR4meidgcAjt3XCvVhyRivqcLUalZoEEiOmNpIT58Gaxypf45WpGP6+dWG8 vNHBPlw36tk8M6JryKMb21QKBMQ7G1a26CbEAQdS8YwIDAJW7SAtSnl4L6pRJfwe4sg8 2eLRLvs4VEfkA6TwsBKGidMDzgbTVDMbATYst8JbnNWcObv5tRzac/xiyLFD7O6AcbBm VkL/HBZ9qi1zJaHeoTQolDSlMGk4yOR2vM3MXZZSk1s1LmTmURJAm6nAFJ3KImjjbyEW UChH7ez4HiPAsHCOoGgJ4Uw2eRCNd0L9op99zw1bwXSJgAjGkXN0ya5e2taSx9Rdbp0q gyXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1697440534; x=1698045334; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=2kiZfGk8qOY0ezcTTkcNb4cILnemak8jfZ8cGRnm5dM=; b=nOD9s5iPw3yFPAE4biFvB9m3MEhdAKv4BTJ08j8IS9f6r+jQTlHNTyiUBATH6pqRTX nXpv74GpSe/tTaXi4uKOm6UJpSPpztp5cqB6g/SjNqbNTBgVSBXud7FxNuBuOvNxr9/h aGV04JTqngAiixSeZdgjxc7MJ+Z7KfjwFbRl+6OrX3/undKuz59ouI/ENPOd0Q/Zr+gC pJmO0G4L9qvI2YQbfKn2DMEd6OWw9j30+8XHQpX0tFWJU4y+gJ7Rw1MOhChTo5evy6Ba zVa3ti6LXwbRshV9NfPCQxJtJDbw7MUP4Old48H2LLcUwSyUcV5LOSCes1TJe9l5Woi/ wlpA== X-Gm-Message-State: AOJu0YxrsHz5eEQ0YwF66VX+QS4+SKAk3b4Lhj0BOk/elz9wtCOQEyY6 YvIHTnc274N/LkT3gkuV/CvTt6CpypA= X-Google-Smtp-Source: AGHT+IE60/Rl5IOSN/MTGSN+dJFax9CpjovMV6w93m20bl2Y2RC9NIQSoL3klwtwuEJiEmaIEWPTgA== X-Received: by 2002:a17:907:94ce:b0:9bf:b8f7:1fd3 with SMTP id dn14-20020a17090794ce00b009bfb8f71fd3mr3288318ejc.45.1697440534336; Mon, 16 Oct 2023 00:15:34 -0700 (PDT) Received: from tp.home.arpa (host-79-55-64-40.retail.telecomitalia.it. [79.55.64.40]) by smtp.gmail.com with ESMTPSA id jl25-20020a17090775d900b00992e265495csm3419471ejc.212.2023.10.16.00.15.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Oct 2023 00:15:34 -0700 (PDT) From: Beniamino Galvani To: netdev@vger.kernel.org Cc: "David S . Miller" , Jakub Kicinski , Paolo Abeni , David Ahern , Guillaume Nault , linux-kernel@vger.kernel.org Subject: [PATCH net-next v2 1/7] ipv4: rename and move ip_route_output_tunnel() Date: Mon, 16 Oct 2023 09:15:20 +0200 Message-Id: <20231016071526.2958108-2-b.galvani@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20231016071526.2958108-1-b.galvani@gmail.com> References: <20231016071526.2958108-1-b.galvani@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" At the moment ip_route_output_tunnel() is used only by bareudp. Ideally, other UDP tunnel implementations should use it, but to do so the function needs to accept new parameters that are specific for UDP tunnels, such as the ports. Prepare for these changes by renaming the function to udp_tunnel_dst_lookup() and move it to file net/ipv4/udp_tunnel_core.c. Suggested-by: Guillaume Nault Signed-off-by: Beniamino Galvani Reviewed-by: David Ahern --- drivers/net/bareudp.c | 8 +++---- include/net/route.h | 6 ----- include/net/udp_tunnel.h | 6 +++++ net/ipv4/route.c | 48 -------------------------------------- net/ipv4/udp_tunnel_core.c | 48 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 58 insertions(+), 58 deletions(-) diff --git a/drivers/net/bareudp.c b/drivers/net/bareudp.c index 683203f87ae2..63fc32fa1af5 100644 --- a/drivers/net/bareudp.c +++ b/drivers/net/bareudp.c @@ -306,8 +306,8 @@ static int bareudp_xmit_skb(struct sk_buff *skb, struct= net_device *dev, if (!sock) return -ESHUTDOWN; =20 - rt =3D ip_route_output_tunnel(skb, dev, bareudp->net, &saddr, info, - IPPROTO_UDP, use_cache); + rt =3D udp_tunnel_dst_lookup(skb, dev, bareudp->net, &saddr, info, + IPPROTO_UDP, use_cache); =20 if (IS_ERR(rt)) return PTR_ERR(rt); @@ -483,8 +483,8 @@ static int bareudp_fill_metadata_dst(struct net_device = *dev, struct rtable *rt; __be32 saddr; =20 - rt =3D ip_route_output_tunnel(skb, dev, bareudp->net, &saddr, - info, IPPROTO_UDP, use_cache); + rt =3D udp_tunnel_dst_lookup(skb, dev, bareudp->net, &saddr, + info, IPPROTO_UDP, use_cache); if (IS_ERR(rt)) return PTR_ERR(rt); =20 diff --git a/include/net/route.h b/include/net/route.h index 5c248a8e3d0e..980ab474eabd 100644 --- a/include/net/route.h +++ b/include/net/route.h @@ -136,12 +136,6 @@ static inline struct rtable *__ip_route_output_key(str= uct net *net, =20 struct rtable *ip_route_output_flow(struct net *, struct flowi4 *flp, const struct sock *sk); -struct rtable *ip_route_output_tunnel(struct sk_buff *skb, - struct net_device *dev, - struct net *net, __be32 *saddr, - const struct ip_tunnel_info *info, - u8 protocol, bool use_cache); - struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_orig); =20 diff --git a/include/net/udp_tunnel.h b/include/net/udp_tunnel.h index 21ba0a25f936..11e810ca5088 100644 --- a/include/net/udp_tunnel.h +++ b/include/net/udp_tunnel.h @@ -162,6 +162,12 @@ int udp_tunnel6_xmit_skb(struct dst_entry *dst, struct= sock *sk, =20 void udp_tunnel_sock_release(struct socket *sock); =20 +struct rtable *udp_tunnel_dst_lookup(struct sk_buff *skb, + struct net_device *dev, + struct net *net, __be32 *saddr, + const struct ip_tunnel_info *info, + u8 protocol, bool use_cache); + struct metadata_dst *udp_tun_rx_dst(struct sk_buff *skb, unsigned short fa= mily, __be16 flags, __be64 tunnel_id, int md_size); diff --git a/net/ipv4/route.c b/net/ipv4/route.c index e2bf4602b559..3290a4442b4a 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -2885,54 +2885,6 @@ struct rtable *ip_route_output_flow(struct net *net,= struct flowi4 *flp4, } EXPORT_SYMBOL_GPL(ip_route_output_flow); =20 -struct rtable *ip_route_output_tunnel(struct sk_buff *skb, - struct net_device *dev, - struct net *net, __be32 *saddr, - const struct ip_tunnel_info *info, - u8 protocol, bool use_cache) -{ -#ifdef CONFIG_DST_CACHE - struct dst_cache *dst_cache; -#endif - struct rtable *rt =3D NULL; - struct flowi4 fl4; - __u8 tos; - -#ifdef CONFIG_DST_CACHE - dst_cache =3D (struct dst_cache *)&info->dst_cache; - if (use_cache) { - rt =3D dst_cache_get_ip4(dst_cache, saddr); - if (rt) - return rt; - } -#endif - memset(&fl4, 0, sizeof(fl4)); - fl4.flowi4_mark =3D skb->mark; - fl4.flowi4_proto =3D protocol; - fl4.daddr =3D info->key.u.ipv4.dst; - fl4.saddr =3D info->key.u.ipv4.src; - tos =3D info->key.tos; - fl4.flowi4_tos =3D RT_TOS(tos); - - rt =3D ip_route_output_key(net, &fl4); - if (IS_ERR(rt)) { - netdev_dbg(dev, "no route to %pI4\n", &fl4.daddr); - return ERR_PTR(-ENETUNREACH); - } - if (rt->dst.dev =3D=3D dev) { /* is this necessary? */ - netdev_dbg(dev, "circular route to %pI4\n", &fl4.daddr); - ip_rt_put(rt); - return ERR_PTR(-ELOOP); - } -#ifdef CONFIG_DST_CACHE - if (use_cache) - dst_cache_set_ip4(dst_cache, &rt->dst, fl4.saddr); -#endif - *saddr =3D fl4.saddr; - return rt; -} -EXPORT_SYMBOL_GPL(ip_route_output_tunnel); - /* called with rcu_read_lock held */ static int rt_fill_info(struct net *net, __be32 dst, __be32 src, struct rtable *rt, u32 table_id, struct flowi4 *fl4, diff --git a/net/ipv4/udp_tunnel_core.c b/net/ipv4/udp_tunnel_core.c index 1e7e4aecdc48..96f93f92b6ce 100644 --- a/net/ipv4/udp_tunnel_core.c +++ b/net/ipv4/udp_tunnel_core.c @@ -204,4 +204,52 @@ struct metadata_dst *udp_tun_rx_dst(struct sk_buff *sk= b, unsigned short family, } EXPORT_SYMBOL_GPL(udp_tun_rx_dst); =20 +struct rtable *udp_tunnel_dst_lookup(struct sk_buff *skb, + struct net_device *dev, + struct net *net, __be32 *saddr, + const struct ip_tunnel_info *info, + u8 protocol, bool use_cache) +{ +#ifdef CONFIG_DST_CACHE + struct dst_cache *dst_cache; +#endif + struct rtable *rt =3D NULL; + struct flowi4 fl4; + __u8 tos; + +#ifdef CONFIG_DST_CACHE + dst_cache =3D (struct dst_cache *)&info->dst_cache; + if (use_cache) { + rt =3D dst_cache_get_ip4(dst_cache, saddr); + if (rt) + return rt; + } +#endif + memset(&fl4, 0, sizeof(fl4)); + fl4.flowi4_mark =3D skb->mark; + fl4.flowi4_proto =3D protocol; + fl4.daddr =3D info->key.u.ipv4.dst; + fl4.saddr =3D info->key.u.ipv4.src; + tos =3D info->key.tos; + fl4.flowi4_tos =3D RT_TOS(tos); + + rt =3D ip_route_output_key(net, &fl4); + if (IS_ERR(rt)) { + netdev_dbg(dev, "no route to %pI4\n", &fl4.daddr); + return ERR_PTR(-ENETUNREACH); + } + if (rt->dst.dev =3D=3D dev) { /* is this necessary? */ + netdev_dbg(dev, "circular route to %pI4\n", &fl4.daddr); + ip_rt_put(rt); + return ERR_PTR(-ELOOP); + } +#ifdef CONFIG_DST_CACHE + if (use_cache) + dst_cache_set_ip4(dst_cache, &rt->dst, fl4.saddr); +#endif + *saddr =3D fl4.saddr; + return rt; +} +EXPORT_SYMBOL_GPL(udp_tunnel_dst_lookup); + MODULE_LICENSE("GPL"); --=20 2.40.1 From nobody Fri Jan 2 04:02:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 77775CDB465 for ; Mon, 16 Oct 2023 07:15:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232141AbjJPHPp (ORCPT ); Mon, 16 Oct 2023 03:15:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35138 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231360AbjJPHPi (ORCPT ); Mon, 16 Oct 2023 03:15:38 -0400 Received: from mail-ej1-x62b.google.com (mail-ej1-x62b.google.com [IPv6:2a00:1450:4864:20::62b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 83091C5; Mon, 16 Oct 2023 00:15:36 -0700 (PDT) Received: by mail-ej1-x62b.google.com with SMTP id a640c23a62f3a-99bdeae1d0aso663224466b.1; Mon, 16 Oct 2023 00:15:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1697440535; x=1698045335; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=SmzPwfhHrT5qD+jCIe7+id9G3Mg11DsmsTmAf398zoQ=; b=b5whRmFCZHMHKG1q0M3r9zSzsFpsXl/rHTM+s42mSRAf9jmde91rjff2jGw+zKForp +n1IpB9UTlswvdg7qN/r934aD02d4pNc5A1i7pSdIEaLrg/KsuMjxTkWNW2+3odxu7hS yVIVn4MoOJHsG8tZoQX9gwVuzDWRG/RnTqBZfhMRfjOUDByZti0oy3I1RGN3i6Bitati wOLkT34hp6OI3Ua40GAsllfSpz4PRYkahckz5R7Ko+jvvqb991V/rayYBp/lyYs5IBrQ FQbZ+w8UHk00G68umrqjaUdr9gT+ldkAXL2pDJbV0/aZOXFNSmGhmpbNwAEePl3LCfUX ezpw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1697440535; x=1698045335; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=SmzPwfhHrT5qD+jCIe7+id9G3Mg11DsmsTmAf398zoQ=; b=wtnSDW1B0PAS1HlA4eW0Vz4mOVAj/V36ki++6HiMIBWDlyD8Zu4JxwnQ0qWX2sAvyT UsFc4tVpDZ37u6M1lgKys58EMVBDB1Pvvg1BlM0skzBYAD3MhUmlbnLi1viTypN8qXTX lzLgwyltW5p+WldY8+WGjw+i2iCNCMAwpiQUR47y/mN1FiKCMqwOYlSYEle0BmsarF6k rHK2h6mAv+bKT1Y6sgFA/+v7y41+9di5I1O0m/kwpipetmVRGpZoPZsrL9gnWQ8+Yt5E cynqupt1iSZg1mFTRFJpvMTAKO43kGQ/2uMVKqC3wlyh2yrR+YgWdF7ILhtqGaPSUObD WSag== X-Gm-Message-State: AOJu0YyKjJnWmoS2/MVjgMXlnzRerqlLs9z3IhUSK/0ddSwx8D7GE+2s tj32dwimAoQFKXBBLPiJuN8r33b2shU= X-Google-Smtp-Source: AGHT+IGtiL3iEYSsCE8EwG3lr1L2HPIlZb1Z6fRRxOMvhlkOECko7rhNIZgSQwlQHBL4MDnYK/VshQ== X-Received: by 2002:a17:907:9724:b0:9ae:50e3:7e40 with SMTP id jg36-20020a170907972400b009ae50e37e40mr35770353ejc.52.1697440535009; Mon, 16 Oct 2023 00:15:35 -0700 (PDT) Received: from tp.home.arpa (host-79-55-64-40.retail.telecomitalia.it. [79.55.64.40]) by smtp.gmail.com with ESMTPSA id jl25-20020a17090775d900b00992e265495csm3419471ejc.212.2023.10.16.00.15.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Oct 2023 00:15:34 -0700 (PDT) From: Beniamino Galvani To: netdev@vger.kernel.org Cc: "David S . Miller" , Jakub Kicinski , Paolo Abeni , David Ahern , Guillaume Nault , linux-kernel@vger.kernel.org Subject: [PATCH net-next v2 2/7] ipv4: remove "proto" argument from udp_tunnel_dst_lookup() Date: Mon, 16 Oct 2023 09:15:21 +0200 Message-Id: <20231016071526.2958108-3-b.galvani@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20231016071526.2958108-1-b.galvani@gmail.com> References: <20231016071526.2958108-1-b.galvani@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The function is now UDP-specific, the protocol is always IPPROTO_UDP. Suggested-by: Guillaume Nault Signed-off-by: Beniamino Galvani Reviewed-by: David Ahern --- drivers/net/bareudp.c | 4 ++-- include/net/udp_tunnel.h | 2 +- net/ipv4/udp_tunnel_core.c | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/net/bareudp.c b/drivers/net/bareudp.c index 63fc32fa1af5..6af67cac6bde 100644 --- a/drivers/net/bareudp.c +++ b/drivers/net/bareudp.c @@ -307,7 +307,7 @@ static int bareudp_xmit_skb(struct sk_buff *skb, struct= net_device *dev, return -ESHUTDOWN; =20 rt =3D udp_tunnel_dst_lookup(skb, dev, bareudp->net, &saddr, info, - IPPROTO_UDP, use_cache); + use_cache); =20 if (IS_ERR(rt)) return PTR_ERR(rt); @@ -484,7 +484,7 @@ static int bareudp_fill_metadata_dst(struct net_device = *dev, __be32 saddr; =20 rt =3D udp_tunnel_dst_lookup(skb, dev, bareudp->net, &saddr, - info, IPPROTO_UDP, use_cache); + info, use_cache); if (IS_ERR(rt)) return PTR_ERR(rt); =20 diff --git a/include/net/udp_tunnel.h b/include/net/udp_tunnel.h index 11e810ca5088..8f110dbd3784 100644 --- a/include/net/udp_tunnel.h +++ b/include/net/udp_tunnel.h @@ -166,7 +166,7 @@ struct rtable *udp_tunnel_dst_lookup(struct sk_buff *sk= b, struct net_device *dev, struct net *net, __be32 *saddr, const struct ip_tunnel_info *info, - u8 protocol, bool use_cache); + bool use_cache); =20 struct metadata_dst *udp_tun_rx_dst(struct sk_buff *skb, unsigned short fa= mily, __be16 flags, __be64 tunnel_id, diff --git a/net/ipv4/udp_tunnel_core.c b/net/ipv4/udp_tunnel_core.c index 96f93f92b6ce..9b0cfd72d5fd 100644 --- a/net/ipv4/udp_tunnel_core.c +++ b/net/ipv4/udp_tunnel_core.c @@ -208,7 +208,7 @@ struct rtable *udp_tunnel_dst_lookup(struct sk_buff *sk= b, struct net_device *dev, struct net *net, __be32 *saddr, const struct ip_tunnel_info *info, - u8 protocol, bool use_cache) + bool use_cache) { #ifdef CONFIG_DST_CACHE struct dst_cache *dst_cache; @@ -227,7 +227,7 @@ struct rtable *udp_tunnel_dst_lookup(struct sk_buff *sk= b, #endif memset(&fl4, 0, sizeof(fl4)); fl4.flowi4_mark =3D skb->mark; - fl4.flowi4_proto =3D protocol; + fl4.flowi4_proto =3D IPPROTO_UDP; fl4.daddr =3D info->key.u.ipv4.dst; fl4.saddr =3D info->key.u.ipv4.src; tos =3D info->key.tos; --=20 2.40.1 From nobody Fri Jan 2 04:02:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 756D8CDB465 for ; Mon, 16 Oct 2023 07:15:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232211AbjJPHPw (ORCPT ); Mon, 16 Oct 2023 03:15:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35144 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231876AbjJPHPi (ORCPT ); Mon, 16 Oct 2023 03:15:38 -0400 Received: from mail-ej1-x62c.google.com (mail-ej1-x62c.google.com [IPv6:2a00:1450:4864:20::62c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 36F0ADC; Mon, 16 Oct 2023 00:15:37 -0700 (PDT) Received: by mail-ej1-x62c.google.com with SMTP id a640c23a62f3a-9b95622c620so724937266b.0; Mon, 16 Oct 2023 00:15:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1697440535; x=1698045335; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Ac6XV9VFbfIO3SXyeEIuccANTPUbAeTZfeIr99C0LYQ=; b=HP91WgZFPNORsJaNhGPb0fuoN4IgTH2XTYycuBm8aF+OiwmJhvpz3Wb5QL4ZXj1lz9 x5BjCE9c4yKSbtll27Y5O8glsk1v3S5sL074fvzqA8mejXaKP9m7pPiqbm/qj41iTdwu g74gwvZoybXyQyXob0W+fQZdU8ikjXaBEYU56UW2IEkbJrLeNmAdg18JbzwvAw1n1+KW A0Q328cdGzi5T1QC//x3/O1fGxHPZuxo8/n5VDcAayNBb71UHCh9/IaV3/JF6Kq+Jd+P 2rX5Q8nRb5DALvb5MYXe2xdd+fo0bfiul1uU5Ub0IwjCpmCWslV13FUpoS/LCJE1RKOn I4Bg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1697440535; x=1698045335; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Ac6XV9VFbfIO3SXyeEIuccANTPUbAeTZfeIr99C0LYQ=; b=w93gGcOdS7Ep0oJMqSYTizjzrM1UHjO7Qe5hmIoCuAPjY03s/ZY3iZOhQFGAI63ivG HsnxHjXzKBknzKpfuVBA9hp6vt9l91Zf3T1aC1M86Qa3mqgqFygHD+C0W0MI9gIUP1Se 99JsRC5pSOZfuHyWkqA6ffBCnTz4zq8rSXYZe+oBjyf1INZzGluOQ+U1faFJgCn1bNvi iJD6dS9UyRYxLcaz0eKD+fcTmqQyVLLeLVX+Bs8qkTmYhcKBbuJDJFqlEfqyrcEulHPQ sIFUFHqGRfx2vJJ7YJSEBc50IiUU+kgb95Fmev3nMS4cMMpLzJsZQcLDK5Ecve89zYzg TPTw== X-Gm-Message-State: AOJu0YzsXWGZVwABQoob3ojOT9td0wONgOjCv5uQSAPY4Kh508hKz7Sr YWd2HoDL1/r0vtFCwg5ghKggoutg9e4= X-Google-Smtp-Source: AGHT+IE1WCYL6rU6JenKgmDevj200yR17KsP08PwSJfxfRw6ZgwEUF78zzn82C8+L9R3WlxS0+jkFg== X-Received: by 2002:a17:907:86ab:b0:9bf:2bf:65f3 with SMTP id qa43-20020a17090786ab00b009bf02bf65f3mr4317622ejc.7.1697440535659; Mon, 16 Oct 2023 00:15:35 -0700 (PDT) Received: from tp.home.arpa (host-79-55-64-40.retail.telecomitalia.it. [79.55.64.40]) by smtp.gmail.com with ESMTPSA id jl25-20020a17090775d900b00992e265495csm3419471ejc.212.2023.10.16.00.15.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Oct 2023 00:15:35 -0700 (PDT) From: Beniamino Galvani To: netdev@vger.kernel.org Cc: "David S . Miller" , Jakub Kicinski , Paolo Abeni , David Ahern , Guillaume Nault , linux-kernel@vger.kernel.org Subject: [PATCH net-next v2 3/7] ipv4: add new arguments to udp_tunnel_dst_lookup() Date: Mon, 16 Oct 2023 09:15:22 +0200 Message-Id: <20231016071526.2958108-4-b.galvani@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20231016071526.2958108-1-b.galvani@gmail.com> References: <20231016071526.2958108-1-b.galvani@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" We want to make the function more generic so that it can be used by other UDP tunnel implementations such as geneve and vxlan. To do that, add the following arguments: - source and destination UDP port; - ifindex of the output interface, needed by vxlan; - the tos, because in some cases it is not taken from struct ip_tunnel_info (for example, when it's inherited from the inner packet); - the dst cache, because not all tunnel types (e.g. vxlan) want to use the one from struct ip_tunnel_info. With these parameters, the function no longer needs the full struct ip_tunnel_info as argument and we can pass only the relevant part of it (struct ip_tunnel_key). Suggested-by: Guillaume Nault Signed-off-by: Beniamino Galvani Reviewed-by: David Ahern --- drivers/net/bareudp.c | 11 +++++++---- include/net/udp_tunnel.h | 8 +++++--- net/ipv4/udp_tunnel_core.c | 26 +++++++++++++------------- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/drivers/net/bareudp.c b/drivers/net/bareudp.c index 6af67cac6bde..47a9c2a5583c 100644 --- a/drivers/net/bareudp.c +++ b/drivers/net/bareudp.c @@ -306,8 +306,10 @@ static int bareudp_xmit_skb(struct sk_buff *skb, struc= t net_device *dev, if (!sock) return -ESHUTDOWN; =20 - rt =3D udp_tunnel_dst_lookup(skb, dev, bareudp->net, &saddr, info, - use_cache); + rt =3D udp_tunnel_dst_lookup(skb, dev, bareudp->net, 0, &saddr, &info->ke= y, + 0, 0, key->tos, + use_cache ? + (struct dst_cache *)&info->dst_cache : NULL); =20 if (IS_ERR(rt)) return PTR_ERR(rt); @@ -483,8 +485,9 @@ static int bareudp_fill_metadata_dst(struct net_device = *dev, struct rtable *rt; __be32 saddr; =20 - rt =3D udp_tunnel_dst_lookup(skb, dev, bareudp->net, &saddr, - info, use_cache); + rt =3D udp_tunnel_dst_lookup(skb, dev, bareudp->net, 0, &saddr, + &info->key, 0, 0, info->key.tos, + use_cache ? &info->dst_cache : NULL); if (IS_ERR(rt)) return PTR_ERR(rt); =20 diff --git a/include/net/udp_tunnel.h b/include/net/udp_tunnel.h index 8f110dbd3784..4d0578fab01a 100644 --- a/include/net/udp_tunnel.h +++ b/include/net/udp_tunnel.h @@ -164,9 +164,11 @@ void udp_tunnel_sock_release(struct socket *sock); =20 struct rtable *udp_tunnel_dst_lookup(struct sk_buff *skb, struct net_device *dev, - struct net *net, __be32 *saddr, - const struct ip_tunnel_info *info, - bool use_cache); + struct net *net, int oif, + __be32 *saddr, + const struct ip_tunnel_key *key, + __be16 sport, __be16 dport, u8 tos, + struct dst_cache *dst_cache); =20 struct metadata_dst *udp_tun_rx_dst(struct sk_buff *skb, unsigned short fa= mily, __be16 flags, __be64 tunnel_id, diff --git a/net/ipv4/udp_tunnel_core.c b/net/ipv4/udp_tunnel_core.c index 9b0cfd72d5fd..494685e82856 100644 --- a/net/ipv4/udp_tunnel_core.c +++ b/net/ipv4/udp_tunnel_core.c @@ -206,31 +206,31 @@ EXPORT_SYMBOL_GPL(udp_tun_rx_dst); =20 struct rtable *udp_tunnel_dst_lookup(struct sk_buff *skb, struct net_device *dev, - struct net *net, __be32 *saddr, - const struct ip_tunnel_info *info, - bool use_cache) + struct net *net, int oif, + __be32 *saddr, + const struct ip_tunnel_key *key, + __be16 sport, __be16 dport, u8 tos, + struct dst_cache *dst_cache) { -#ifdef CONFIG_DST_CACHE - struct dst_cache *dst_cache; -#endif struct rtable *rt =3D NULL; struct flowi4 fl4; - __u8 tos; =20 #ifdef CONFIG_DST_CACHE - dst_cache =3D (struct dst_cache *)&info->dst_cache; - if (use_cache) { + if (dst_cache) { rt =3D dst_cache_get_ip4(dst_cache, saddr); if (rt) return rt; } #endif + memset(&fl4, 0, sizeof(fl4)); fl4.flowi4_mark =3D skb->mark; fl4.flowi4_proto =3D IPPROTO_UDP; - fl4.daddr =3D info->key.u.ipv4.dst; - fl4.saddr =3D info->key.u.ipv4.src; - tos =3D info->key.tos; + fl4.flowi4_oif =3D oif; + fl4.daddr =3D key->u.ipv4.dst; + fl4.saddr =3D key->u.ipv4.src; + fl4.fl4_dport =3D dport; + fl4.fl4_sport =3D sport; fl4.flowi4_tos =3D RT_TOS(tos); =20 rt =3D ip_route_output_key(net, &fl4); @@ -244,7 +244,7 @@ struct rtable *udp_tunnel_dst_lookup(struct sk_buff *sk= b, return ERR_PTR(-ELOOP); } #ifdef CONFIG_DST_CACHE - if (use_cache) + if (dst_cache) dst_cache_set_ip4(dst_cache, &rt->dst, fl4.saddr); #endif *saddr =3D fl4.saddr; --=20 2.40.1 From nobody Fri Jan 2 04:02:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 28DC4CDB465 for ; Mon, 16 Oct 2023 07:15:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232237AbjJPHPz (ORCPT ); Mon, 16 Oct 2023 03:15:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35154 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232026AbjJPHPj (ORCPT ); Mon, 16 Oct 2023 03:15:39 -0400 Received: from mail-ej1-x629.google.com (mail-ej1-x629.google.com [IPv6:2a00:1450:4864:20::629]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EF4ECE3; Mon, 16 Oct 2023 00:15:37 -0700 (PDT) Received: by mail-ej1-x629.google.com with SMTP id a640c23a62f3a-9b64b98656bso648743166b.0; Mon, 16 Oct 2023 00:15:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1697440536; x=1698045336; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=9SXJ/teZkpiPlXm12c1rchEF2JTtWTmUCymdd9gFkMo=; b=Y+RH/DoLfByuwuFaOni30TpooegvzeJLreToniAOrlBs9tJIBfEM8MV+0skhN3iH3M hPnXLydgYi19q3yCBwmKHWOtHXkCNgMnmapjqExsvR3mHlTrhP/f65kqkXGFKSNM2Fps Q4Mf3jQ0JjX52+1DxNrJIBiVAWexVGsegihH2Ix9DWLmmxTOMTaCFL58J8FNMYv8k/Yb Sk2k7X5w4WftCfdRmxMxFWxsfSlFmpeqco8ZhVsiOmFiAijug/Jiz5f1nVS41Yrc22Mm X3CnEedmr4Uw7cqjZ1jv+BVZsKbbkqfzEKyGzm4IxtsLGlq8i+aVJF0RR9mmdBnecY+Y NOfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1697440536; x=1698045336; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=9SXJ/teZkpiPlXm12c1rchEF2JTtWTmUCymdd9gFkMo=; b=SAkvH9RYs1gUW0Q9mI9SPRl3E7nVGcpIaT5iOZmhR8m/s/Z0yk3tbJMI/DDGorIisy LkX0MxINn2cnyy4b2eQ/0iiERYuYDfESL+cDDSw+RwcrHwYcRcmem6/aJGE9DmgPYFCj 2XQvz5oWjdVTFDWYPpwvHZEiiBxXhi9I/JyV7FRbainUuWpmwEqAzuM5aUoCVgPWvnAc 2pJx44d8+nm/W4+ChAb7OS9dRhjlnzHoNKnK+76Pncr3ZZs/Xhuo9dsrax/VufskYetR SEe07Ho3Xk7BvziqNnWTo3NgCXlsaq/EI38Vi9oCsa9Gvh88rj+qZzZ74UpMSxdydO8a IVYQ== X-Gm-Message-State: AOJu0YzXqPf2o6umpAGqqXrbLL3YadquVKByr24ZNm9W/wShzRV73EQO /sZ0y43O5hebwG0zuG+E/0/sQ72bb1s= X-Google-Smtp-Source: AGHT+IF8aMTTdrbzUsZ86oDuz8S8Q8916kvXJ5I5fNtStoU9wppVSmKMKaqQam5al3zGfDKaLz83ZQ== X-Received: by 2002:a17:907:96a0:b0:9be:ddad:61db with SMTP id hd32-20020a17090796a000b009beddad61dbmr4496535ejc.56.1697440536359; Mon, 16 Oct 2023 00:15:36 -0700 (PDT) Received: from tp.home.arpa (host-79-55-64-40.retail.telecomitalia.it. [79.55.64.40]) by smtp.gmail.com with ESMTPSA id jl25-20020a17090775d900b00992e265495csm3419471ejc.212.2023.10.16.00.15.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Oct 2023 00:15:36 -0700 (PDT) From: Beniamino Galvani To: netdev@vger.kernel.org Cc: "David S . Miller" , Jakub Kicinski , Paolo Abeni , David Ahern , Guillaume Nault , linux-kernel@vger.kernel.org Subject: [PATCH net-next v2 4/7] ipv4: use tunnel flow flags for tunnel route lookups Date: Mon, 16 Oct 2023 09:15:23 +0200 Message-Id: <20231016071526.2958108-5-b.galvani@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20231016071526.2958108-1-b.galvani@gmail.com> References: <20231016071526.2958108-1-b.galvani@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Commit 451ef36bd229 ("ip_tunnels: Add new flow flags field to ip_tunnel_key") added a new field to struct ip_tunnel_key to control route lookups. Currently the flag is used by vxlan and geneve tunnels; use it also in udp_tunnel_dst_lookup() so that it affects all tunnel types relying on this function. Signed-off-by: Beniamino Galvani Reviewed-by: David Ahern --- net/ipv4/udp_tunnel_core.c | 1 + 1 file changed, 1 insertion(+) diff --git a/net/ipv4/udp_tunnel_core.c b/net/ipv4/udp_tunnel_core.c index 494685e82856..a87defb2b167 100644 --- a/net/ipv4/udp_tunnel_core.c +++ b/net/ipv4/udp_tunnel_core.c @@ -232,6 +232,7 @@ struct rtable *udp_tunnel_dst_lookup(struct sk_buff *sk= b, fl4.fl4_dport =3D dport; fl4.fl4_sport =3D sport; fl4.flowi4_tos =3D RT_TOS(tos); + fl4.flowi4_flags =3D key->flow_flags; =20 rt =3D ip_route_output_key(net, &fl4); if (IS_ERR(rt)) { --=20 2.40.1 From nobody Fri Jan 2 04:02:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5377DCDB465 for ; Mon, 16 Oct 2023 07:16:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232203AbjJPHQA (ORCPT ); Mon, 16 Oct 2023 03:16:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35168 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232056AbjJPHPk (ORCPT ); Mon, 16 Oct 2023 03:15:40 -0400 Received: from mail-ej1-x631.google.com (mail-ej1-x631.google.com [IPv6:2a00:1450:4864:20::631]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8B377E5; Mon, 16 Oct 2023 00:15:38 -0700 (PDT) Received: by mail-ej1-x631.google.com with SMTP id a640c23a62f3a-9ada2e6e75fso722564966b.2; Mon, 16 Oct 2023 00:15:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1697440537; x=1698045337; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=owZcEmAsFdnN8HKDvbp9Goa51e2ivCQAo3bw3SJCz0I=; b=fnhyCJklTryQU4A5dJoAxjSSoioIgt0Aot737rHCdxxdZpE5vTpDPmOewgKtkJoALJ IPwckp7DMElsWKa3F66gNpgwOVpCCjxOZTgd4B+5zQ2NGw9E2eR8qj7/FMkh9i5vyN3Y 8YBJQDvpRGZ+TfOm/X3bbzfnS5J9hJasbVD721XGiDIKNv9gAMhho97g509ZhotmTw1R WuIPX3jPPjEXVzVkoyYmFFYfPQy8nM7BZFNTNb9WNoXLLxLGsUdLLZiFZPtEsc1xubY0 O2w0VWygZfCmzxiECqI3ptxV1f2xabA8a04e3QEZHQ/qUJkImlC7M3rTa8nwTkcFLysm t9nw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1697440537; x=1698045337; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=owZcEmAsFdnN8HKDvbp9Goa51e2ivCQAo3bw3SJCz0I=; b=pzMR2Anconvl5kwYmTi8RPAxRFLWFbWHQtVmHiG/71fBHWr4n1RU7556/WJ3SpR7KD E61WpmMmZ04qGgcQT8lXip9ApNthLyiopZhv9Scaf4l6XU9AjfWiSRMqwTPXTWbh0442 DK/CKa/g7nhqbTg4WfF+FH1gUXz7Uqx56fi2k1bM8Z/9grVI3JbnPRqAp5S/o7ZscG+u MuOfOMzCFPdM9BayU3Q+b3BpCetGONwpXXdXODah/A1HxQKuIAHaYL40ODoA7njJyMfh aTwqPKDM6VhgnQy5PDmFzvtC1baFrWGk37Ul97r6HQFtdFpXglkSXbhnW+e+8LXuMiJA zCwA== X-Gm-Message-State: AOJu0YwueAGrRhnnIs8AAx5mh2yGNtTIzlHS/F5onrzgcnhp7tUnYHBP 54Pla8aiUi0dWHOl2OhtxOMDFfUXYvo= X-Google-Smtp-Source: AGHT+IG5Qn3LiKhL9xFhIaXfF9feMh2Mcf+f4abuSs5DsL9HORwkWWMopSfSn73tW0vGG17ONj13GA== X-Received: by 2002:a17:906:3051:b0:9a5:7759:19c0 with SMTP id d17-20020a170906305100b009a5775919c0mr28221306ejd.64.1697440536997; Mon, 16 Oct 2023 00:15:36 -0700 (PDT) Received: from tp.home.arpa (host-79-55-64-40.retail.telecomitalia.it. [79.55.64.40]) by smtp.gmail.com with ESMTPSA id jl25-20020a17090775d900b00992e265495csm3419471ejc.212.2023.10.16.00.15.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Oct 2023 00:15:36 -0700 (PDT) From: Beniamino Galvani To: netdev@vger.kernel.org Cc: "David S . Miller" , Jakub Kicinski , Paolo Abeni , David Ahern , Guillaume Nault , linux-kernel@vger.kernel.org Subject: [PATCH net-next v2 5/7] geneve: add dsfield helper function Date: Mon, 16 Oct 2023 09:15:24 +0200 Message-Id: <20231016071526.2958108-6-b.galvani@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20231016071526.2958108-1-b.galvani@gmail.com> References: <20231016071526.2958108-1-b.galvani@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add a helper function to compute the tos/dsfield. In this way, we can factor out some duplicate code. Also, the helper will be called from more places in the next commit. Suggested-by: Guillaume Nault Signed-off-by: Beniamino Galvani --- drivers/net/geneve.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c index 78f9d588f712..572c3e36b209 100644 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c @@ -784,6 +784,22 @@ static int geneve_build_skb(struct dst_entry *dst, str= uct sk_buff *skb, return err; } =20 +static u8 geneve_get_dsfield(struct sk_buff *skb, struct net_device *dev, + const struct ip_tunnel_info *info, + bool *use_cache) +{ + struct geneve_dev *geneve =3D netdev_priv(dev); + u8 dsfield; + + dsfield =3D info->key.tos; + if (dsfield =3D=3D 1 && !geneve->cfg.collect_md) { + dsfield =3D ip_tunnel_get_dsfield(ip_hdr(skb), skb); + *use_cache =3D false; + } + + return dsfield; +} + static struct rtable *geneve_get_v4_rt(struct sk_buff *skb, struct net_device *dev, struct geneve_sock *gs4, @@ -810,11 +826,7 @@ static struct rtable *geneve_get_v4_rt(struct sk_buff = *skb, fl4->fl4_sport =3D sport; fl4->flowi4_flags =3D info->key.flow_flags; =20 - tos =3D info->key.tos; - if ((tos =3D=3D 1) && !geneve->cfg.collect_md) { - tos =3D ip_tunnel_get_dsfield(ip_hdr(skb), skb); - use_cache =3D false; - } + tos =3D geneve_get_dsfield(skb, dev, info, &use_cache); fl4->flowi4_tos =3D RT_TOS(tos); if (full_tos) *full_tos =3D tos; @@ -865,12 +877,7 @@ static struct dst_entry *geneve_get_v6_dst(struct sk_b= uff *skb, fl6->fl6_dport =3D dport; fl6->fl6_sport =3D sport; =20 - prio =3D info->key.tos; - if ((prio =3D=3D 1) && !geneve->cfg.collect_md) { - prio =3D ip_tunnel_get_dsfield(ip_hdr(skb), skb); - use_cache =3D false; - } - + prio =3D geneve_get_dsfield(skb, dev, info, &use_cache); fl6->flowlabel =3D ip6_make_flowinfo(prio, info->key.label); dst_cache =3D (struct dst_cache *)&info->dst_cache; if (use_cache) { --=20 2.40.1 From nobody Fri Jan 2 04:02:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D8690CDB465 for ; Mon, 16 Oct 2023 07:16:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232278AbjJPHQE (ORCPT ); Mon, 16 Oct 2023 03:16:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35190 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232065AbjJPHPm (ORCPT ); Mon, 16 Oct 2023 03:15:42 -0400 Received: from mail-ej1-x632.google.com (mail-ej1-x632.google.com [IPv6:2a00:1450:4864:20::632]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 53021E1; Mon, 16 Oct 2023 00:15:39 -0700 (PDT) Received: by mail-ej1-x632.google.com with SMTP id a640c23a62f3a-991c786369cso662597966b.1; Mon, 16 Oct 2023 00:15:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1697440538; x=1698045338; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=n0AxUwpswyDtB5yjnz9mIbeKoD0NUiZwXlK+ltnPKKo=; b=SN9Z1figx/jFHm/7Z2h8TV3InwmvyDoGzN0yYug/mmPvTDsaslGrknHoxrNqQdVEkM ev9WvNb6CoEHwsqJOiOVzCG1sclwAq6dhFPSZ+wGFRLqqJfqPemUfwlKWqPCxn+Fdf2Q Fl5pBkYg5+nv9BRcd9ERuCA8lc81PGLRk7NbT7/lC69UWHj+YW0dP7lqiqSvKgqspSvD 939x8CzSANqf7ul3/YvVK65qj4BuzTIrCf3MzkAG3RWUsZTz+2evxBFwgcv16waQQ+jY Mnz6hxz62VYF2MEiJLfS15xQ6yABgDgS++XFveZQfM/8PdENbeYOyVhVcd5AuBq6p3uS MRfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1697440538; x=1698045338; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=n0AxUwpswyDtB5yjnz9mIbeKoD0NUiZwXlK+ltnPKKo=; b=G7GUl1VScSqCnZivAMC7P2ysqkvMxSeONbqeSfKbyo6vgJImfUDkhCFDAzIegiVteF kvt2kUFjZwzt+9ODnGRLyOte8JcR2WaQQvrGQvVmCqOcRVDfju5U3WvA5/Fli+72eH3j 8W5BreclH+2CWOsOgVOhBqfxPbQe3vLYHpy7gqkMZwQU/tLEz5RE4lG6A65nkVnrz9pI 3dYoOr8Frg4/r+VK8wYdmV3Qh8cfp58SXdWvgOVwNshM1qvgBXrfJdqyrYq9/BIF2Rke KyOJmzQXbYjGHsi20hC72Ucz1qf8cwrIAH7KEq7QvjEMqFEwG0bBEVCh4lBvxl9m/PEh iwfg== X-Gm-Message-State: AOJu0YyzGMQmmBTPT9HuNfPM7GX7quW2G3ngtXyWWuKPZk5HUosLgTtS izEY1NO9Lfqx6li+VYV3vvXJ6SWfbAE= X-Google-Smtp-Source: AGHT+IFh8D5mzTkkxqwh6377RoocEclrt8JX1EQjIOYAv/rntDjzzKqRtBsgg2RBTenf/ztoyg8MkQ== X-Received: by 2002:a17:907:9407:b0:9c4:b8c9:1bf2 with SMTP id dk7-20020a170907940700b009c4b8c91bf2mr494949ejc.60.1697440537712; Mon, 16 Oct 2023 00:15:37 -0700 (PDT) Received: from tp.home.arpa (host-79-55-64-40.retail.telecomitalia.it. [79.55.64.40]) by smtp.gmail.com with ESMTPSA id jl25-20020a17090775d900b00992e265495csm3419471ejc.212.2023.10.16.00.15.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Oct 2023 00:15:37 -0700 (PDT) From: Beniamino Galvani To: netdev@vger.kernel.org Cc: "David S . Miller" , Jakub Kicinski , Paolo Abeni , David Ahern , Guillaume Nault , linux-kernel@vger.kernel.org Subject: [PATCH net-next v2 6/7] geneve: use generic function for tunnel IPv4 route lookup Date: Mon, 16 Oct 2023 09:15:25 +0200 Message-Id: <20231016071526.2958108-7-b.galvani@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20231016071526.2958108-1-b.galvani@gmail.com> References: <20231016071526.2958108-1-b.galvani@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The route lookup can be done now via generic function udp_tunnel_dst_lookup() to replace the custom implementation in geneve_get_v4_rt(). Suggested-by: Guillaume Nault Signed-off-by: Beniamino Galvani --- drivers/net/geneve.c | 98 +++++++++++++++----------------------------- 1 file changed, 32 insertions(+), 66 deletions(-) diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c index 572c3e36b209..23041eeec121 100644 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c @@ -800,58 +800,6 @@ static u8 geneve_get_dsfield(struct sk_buff *skb, stru= ct net_device *dev, return dsfield; } =20 -static struct rtable *geneve_get_v4_rt(struct sk_buff *skb, - struct net_device *dev, - struct geneve_sock *gs4, - struct flowi4 *fl4, - const struct ip_tunnel_info *info, - __be16 dport, __be16 sport, - __u8 *full_tos) -{ - bool use_cache =3D ip_tunnel_dst_cache_usable(skb, info); - struct geneve_dev *geneve =3D netdev_priv(dev); - struct dst_cache *dst_cache; - struct rtable *rt =3D NULL; - __u8 tos; - - if (!gs4) - return ERR_PTR(-EIO); - - memset(fl4, 0, sizeof(*fl4)); - fl4->flowi4_mark =3D skb->mark; - fl4->flowi4_proto =3D IPPROTO_UDP; - fl4->daddr =3D info->key.u.ipv4.dst; - fl4->saddr =3D info->key.u.ipv4.src; - fl4->fl4_dport =3D dport; - fl4->fl4_sport =3D sport; - fl4->flowi4_flags =3D info->key.flow_flags; - - tos =3D geneve_get_dsfield(skb, dev, info, &use_cache); - fl4->flowi4_tos =3D RT_TOS(tos); - if (full_tos) - *full_tos =3D tos; - - dst_cache =3D (struct dst_cache *)&info->dst_cache; - if (use_cache) { - rt =3D dst_cache_get_ip4(dst_cache, &fl4->saddr); - if (rt) - return rt; - } - rt =3D ip_route_output_key(geneve->net, fl4); - if (IS_ERR(rt)) { - netdev_dbg(dev, "no route to %pI4\n", &fl4->daddr); - return ERR_PTR(-ENETUNREACH); - } - if (rt->dst.dev =3D=3D dev) { /* is this necessary? */ - netdev_dbg(dev, "circular route to %pI4\n", &fl4->daddr); - ip_rt_put(rt); - return ERR_PTR(-ELOOP); - } - if (use_cache) - dst_cache_set_ip4(dst_cache, &rt->dst, fl4->saddr); - return rt; -} - #if IS_ENABLED(CONFIG_IPV6) static struct dst_entry *geneve_get_v6_dst(struct sk_buff *skb, struct net_device *dev, @@ -911,19 +859,28 @@ static int geneve_xmit_skb(struct sk_buff *skb, struc= t net_device *dev, struct geneve_sock *gs4 =3D rcu_dereference(geneve->sock4); const struct ip_tunnel_key *key =3D &info->key; struct rtable *rt; - struct flowi4 fl4; - __u8 full_tos; + bool use_cache; __u8 tos, ttl; __be16 df =3D 0; + __be32 saddr; __be16 sport; int err; =20 if (!pskb_inet_may_pull(skb)) return -EINVAL; =20 + if (!gs4) + return -EIO; + + use_cache =3D ip_tunnel_dst_cache_usable(skb, info); + tos =3D geneve_get_dsfield(skb, dev, info, &use_cache); sport =3D udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true); - rt =3D geneve_get_v4_rt(skb, dev, gs4, &fl4, info, - geneve->cfg.info.key.tp_dst, sport, &full_tos); + + rt =3D udp_tunnel_dst_lookup(skb, dev, geneve->net, 0, &saddr, + &info->key, + sport, geneve->cfg.info.key.tp_dst, tos, + use_cache ? + (struct dst_cache *)&info->dst_cache : NULL); if (IS_ERR(rt)) return PTR_ERR(rt); =20 @@ -946,8 +903,8 @@ static int geneve_xmit_skb(struct sk_buff *skb, struct = net_device *dev, return -ENOMEM; } =20 - unclone->key.u.ipv4.dst =3D fl4.saddr; - unclone->key.u.ipv4.src =3D fl4.daddr; + unclone->key.u.ipv4.dst =3D saddr; + unclone->key.u.ipv4.src =3D info->key.u.ipv4.dst; } =20 if (!pskb_may_pull(skb, ETH_HLEN)) { @@ -961,13 +918,12 @@ static int geneve_xmit_skb(struct sk_buff *skb, struc= t net_device *dev, return -EMSGSIZE; } =20 + tos =3D ip_tunnel_ecn_encap(tos, ip_hdr(skb), skb); if (geneve->cfg.collect_md) { - tos =3D ip_tunnel_ecn_encap(key->tos, ip_hdr(skb), skb); ttl =3D key->ttl; =20 df =3D key->tun_flags & TUNNEL_DONT_FRAGMENT ? htons(IP_DF) : 0; } else { - tos =3D ip_tunnel_ecn_encap(full_tos, ip_hdr(skb), skb); if (geneve->cfg.ttl_inherit) ttl =3D ip_tunnel_get_ttl(ip_hdr(skb), skb); else @@ -995,7 +951,7 @@ static int geneve_xmit_skb(struct sk_buff *skb, struct = net_device *dev, if (unlikely(err)) return err; =20 - udp_tunnel_xmit_skb(rt, gs4->sock->sk, skb, fl4.saddr, fl4.daddr, + udp_tunnel_xmit_skb(rt, gs4->sock->sk, skb, saddr, info->key.u.ipv4.dst, tos, ttl, df, sport, geneve->cfg.info.key.tp_dst, !net_eq(geneve->net, dev_net(geneve->dev)), !(info->key.tun_flags & TUNNEL_CSUM)); @@ -1144,19 +1100,29 @@ static int geneve_fill_metadata_dst(struct net_devi= ce *dev, struct sk_buff *skb) =20 if (ip_tunnel_info_af(info) =3D=3D AF_INET) { struct rtable *rt; - struct flowi4 fl4; - struct geneve_sock *gs4 =3D rcu_dereference(geneve->sock4); + bool use_cache; + __be32 saddr; + u8 tos; + + if (!gs4) + return -EIO; + + use_cache =3D ip_tunnel_dst_cache_usable(skb, info); + tos =3D geneve_get_dsfield(skb, dev, info, &use_cache); sport =3D udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true); =20 - rt =3D geneve_get_v4_rt(skb, dev, gs4, &fl4, info, - geneve->cfg.info.key.tp_dst, sport, NULL); + rt =3D udp_tunnel_dst_lookup(skb, dev, geneve->net, 0, &saddr, + &info->key, + sport, geneve->cfg.info.key.tp_dst, + tos, + use_cache ? &info->dst_cache : NULL); if (IS_ERR(rt)) return PTR_ERR(rt); =20 ip_rt_put(rt); - info->key.u.ipv4.src =3D fl4.saddr; + info->key.u.ipv4.src =3D saddr; #if IS_ENABLED(CONFIG_IPV6) } else if (ip_tunnel_info_af(info) =3D=3D AF_INET6) { struct dst_entry *dst; --=20 2.40.1 From nobody Fri Jan 2 04:02:08 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3ACFECDB465 for ; Mon, 16 Oct 2023 07:16:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232425AbjJPHQI (ORCPT ); Mon, 16 Oct 2023 03:16:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35222 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231861AbjJPHPn (ORCPT ); Mon, 16 Oct 2023 03:15:43 -0400 Received: from mail-ej1-x633.google.com (mail-ej1-x633.google.com [IPv6:2a00:1450:4864:20::633]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 32130C5; Mon, 16 Oct 2023 00:15:40 -0700 (PDT) Received: by mail-ej1-x633.google.com with SMTP id a640c23a62f3a-9b95622c620so724950066b.0; Mon, 16 Oct 2023 00:15:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1697440538; x=1698045338; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=+piV4V+155N0PYjpX7WLcNDOIPRKVVrWUBBzKuXjFtg=; b=GiwSbH9nVLo4+lkj77+zqwWKvh2wFkcRklgSEmXSCHin1IEIWGkYMOnb2sd2aBsxOT re+r0vxLOYr8uFy6LzwPj7ywHBw0s7WGQ7uCCW4MPTg+K+HYX4KsoB22PUG+1UxUmXXg 6XZBvZvZPQnCp/Wgi+aX9EofCZnX+W9BL7p5NK5ZDiokyzzfbcju5FBXaWs3RqdpYjzg x58cO3jPdPTeO1R6LXwnTqGixezV/wh8Y6tELC9OZ9dFXkZy9h6UTjApC0VSHjffkS69 7NW8t+BGH6jljG9x4f+VOEi5j5c0EiHpl1aJnEkTger1vVC9x70Ko58oYzX/WKqSOg/q /CAA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1697440538; x=1698045338; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=+piV4V+155N0PYjpX7WLcNDOIPRKVVrWUBBzKuXjFtg=; b=fL72DRnC4isvtHGX6HYYj6pIxR0GZ8TMaR1ayRYDzhfAicbzDZ7O1qEJtDJqRFhWid 8mdowdxtlT8f91ZJ292opbJh/zZWX+rLcMLFuPTPvDweJtujqYUrRUaUxi/raCaiCS34 xCDn5QUl3yWg5o99xlf/Hl72JWCE49tO1hxO3p8toudQBkbXW44Mu/ggIJd1dSJbYL3P 6Z31a1VewodH1JIBoOkXKKLzZZdQVsHJvUVse9aTiVZXQC8nPfMuiTssGxQlRY7l+jZO +LbeWCR6qEo4hdP8Ocd/ulr5d70pQBanpicFZWdNmSPaoZxzxCQuqNDgagoXRljIoE52 s0EQ== X-Gm-Message-State: AOJu0YxDVinfGMvKabKHJpHwTQ4xGSBY1s6owm5BgvSUDUHOU1jt4fd7 bgOtphx9Wl9TjGIvDGd7YFPphevzjsI= X-Google-Smtp-Source: AGHT+IE0FBAmVG1OJuFZ+frDZkx36Un+ZacvONLv6wZR8MG89JwwI6ksIlfWXGTaPOQWf1pMs3SaJg== X-Received: by 2002:a17:906:1d4:b0:9bd:7f40:caa5 with SMTP id 20-20020a17090601d400b009bd7f40caa5mr11482508ejj.77.1697440538422; Mon, 16 Oct 2023 00:15:38 -0700 (PDT) Received: from tp.home.arpa (host-79-55-64-40.retail.telecomitalia.it. [79.55.64.40]) by smtp.gmail.com with ESMTPSA id jl25-20020a17090775d900b00992e265495csm3419471ejc.212.2023.10.16.00.15.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Oct 2023 00:15:38 -0700 (PDT) From: Beniamino Galvani To: netdev@vger.kernel.org Cc: "David S . Miller" , Jakub Kicinski , Paolo Abeni , David Ahern , Guillaume Nault , linux-kernel@vger.kernel.org Subject: [PATCH net-next v2 7/7] vxlan: use generic function for tunnel IPv4 route lookup Date: Mon, 16 Oct 2023 09:15:26 +0200 Message-Id: <20231016071526.2958108-8-b.galvani@gmail.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20231016071526.2958108-1-b.galvani@gmail.com> References: <20231016071526.2958108-1-b.galvani@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The route lookup can be done now via generic function udp_tunnel_dst_lookup() to replace the custom implementations in vxlan_get_route(). Note that this patch only touches IPv4, while IPv6 still uses vxlan6_get_route(). After IPv6 route lookup gets converted as well, vxlan_xmit_one() can be simplified by removing local variables that will be passed via "struct ip_tunnel_key", such as remote_ip, local_ip, flow_flags, label. Suggested-by: Guillaume Nault Signed-off-by: Beniamino Galvani --- drivers/net/vxlan/vxlan_core.c | 114 ++++++++++++--------------------- 1 file changed, 41 insertions(+), 73 deletions(-) diff --git a/drivers/net/vxlan/vxlan_core.c b/drivers/net/vxlan/vxlan_core.c index ece377b1b6bd..6f7d45e3cfa2 100644 --- a/drivers/net/vxlan/vxlan_core.c +++ b/drivers/net/vxlan/vxlan_core.c @@ -2215,57 +2215,6 @@ static int vxlan_build_skb(struct sk_buff *skb, stru= ct dst_entry *dst, return 0; } =20 -static struct rtable *vxlan_get_route(struct vxlan_dev *vxlan, struct net_= device *dev, - struct vxlan_sock *sock4, - struct sk_buff *skb, int oif, u8 tos, - __be32 daddr, __be32 *saddr, __be16 dport, __be16 sport, - __u8 flow_flags, struct dst_cache *dst_cache, - const struct ip_tunnel_info *info) -{ - bool use_cache =3D ip_tunnel_dst_cache_usable(skb, info); - struct rtable *rt =3D NULL; - struct flowi4 fl4; - - if (!sock4) - return ERR_PTR(-EIO); - - if (tos && !info) - use_cache =3D false; - if (use_cache) { - rt =3D dst_cache_get_ip4(dst_cache, saddr); - if (rt) - return rt; - } - - memset(&fl4, 0, sizeof(fl4)); - fl4.flowi4_oif =3D oif; - fl4.flowi4_tos =3D RT_TOS(tos); - fl4.flowi4_mark =3D skb->mark; - fl4.flowi4_proto =3D IPPROTO_UDP; - fl4.daddr =3D daddr; - fl4.saddr =3D *saddr; - fl4.fl4_dport =3D dport; - fl4.fl4_sport =3D sport; - fl4.flowi4_flags =3D flow_flags; - - rt =3D ip_route_output_key(vxlan->net, &fl4); - if (!IS_ERR(rt)) { - if (rt->dst.dev =3D=3D dev) { - netdev_dbg(dev, "circular route to %pI4\n", &daddr); - ip_rt_put(rt); - return ERR_PTR(-ELOOP); - } - - *saddr =3D fl4.saddr; - if (use_cache) - dst_cache_set_ip4(dst_cache, &rt->dst, fl4.saddr); - } else { - netdev_dbg(dev, "no route to %pI4\n", &daddr); - return ERR_PTR(-ENETUNREACH); - } - return rt; -} - #if IS_ENABLED(CONFIG_IPV6) static struct dst_entry *vxlan6_get_route(struct vxlan_dev *vxlan, struct net_device *dev, @@ -2418,30 +2367,38 @@ void vxlan_xmit_one(struct sk_buff *skb, struct net= _device *dev, { struct dst_cache *dst_cache; struct ip_tunnel_info *info; + struct ip_tunnel_key *pkey; + struct ip_tunnel_key key; struct vxlan_dev *vxlan =3D netdev_priv(dev); const struct iphdr *old_iph =3D ip_hdr(skb); union vxlan_addr *dst; - union vxlan_addr remote_ip, local_ip; + union vxlan_addr remote_ip; struct vxlan_metadata _md; struct vxlan_metadata *md =3D &_md; unsigned int pkt_len =3D skb->len; __be16 src_port =3D 0, dst_port; struct dst_entry *ndst =3D NULL; - __u8 tos, ttl, flow_flags =3D 0; + __u8 tos, ttl; int ifindex; int err; u32 flags =3D vxlan->cfg.flags; + bool use_cache; bool udp_sum =3D false; bool xnet =3D !net_eq(vxlan->net, dev_net(vxlan->dev)); __be32 vni =3D 0; #if IS_ENABLED(CONFIG_IPV6) + union vxlan_addr local_ip; __be32 label; #endif =20 info =3D skb_tunnel_info(skb); + use_cache =3D ip_tunnel_dst_cache_usable(skb, info); =20 if (rdst) { dst =3D &rdst->remote_ip; + memset(&key, 0, sizeof(key)); + pkey =3D &key; + if (vxlan_addr_any(dst)) { if (did_rsc) { /* short-circuited back to local bridge */ @@ -2455,7 +2412,15 @@ void vxlan_xmit_one(struct sk_buff *skb, struct net_= device *dev, dst_port =3D rdst->remote_port ? rdst->remote_port : vxlan->cfg.dst_port; vni =3D (rdst->remote_vni) ? : default_vni; ifindex =3D rdst->remote_ifindex; - local_ip =3D vxlan->cfg.saddr; + + if (dst->sa.sa_family =3D=3D AF_INET) { + key.u.ipv4.src =3D vxlan->cfg.saddr.sin.sin_addr.s_addr; + key.u.ipv4.dst =3D rdst->remote_ip.sin.sin_addr.s_addr; + } else { + key.u.ipv6.src =3D vxlan->cfg.saddr.sin6.sin6_addr; + key.u.ipv6.dst =3D rdst->remote_ip.sin6.sin6_addr; + } + dst_cache =3D &rdst->dst_cache; md->gbp =3D skb->mark; if (flags & VXLAN_F_TTL_INHERIT) { @@ -2469,12 +2434,15 @@ void vxlan_xmit_one(struct sk_buff *skb, struct net= _device *dev, tos =3D vxlan->cfg.tos; if (tos =3D=3D 1) tos =3D ip_tunnel_get_dsfield(old_iph, skb); + if (tos && !info) + use_cache =3D false; =20 if (dst->sa.sa_family =3D=3D AF_INET) udp_sum =3D !(flags & VXLAN_F_UDP_ZERO_CSUM_TX); else udp_sum =3D !(flags & VXLAN_F_UDP_ZERO_CSUM6_TX); #if IS_ENABLED(CONFIG_IPV6) + local_ip =3D vxlan->cfg.saddr; label =3D vxlan->cfg.label; #endif } else { @@ -2486,14 +2454,15 @@ void vxlan_xmit_one(struct sk_buff *skb, struct net= _device *dev, remote_ip.sa.sa_family =3D ip_tunnel_info_af(info); if (remote_ip.sa.sa_family =3D=3D AF_INET) { remote_ip.sin.sin_addr.s_addr =3D info->key.u.ipv4.dst; - local_ip.sin.sin_addr.s_addr =3D info->key.u.ipv4.src; } else { remote_ip.sin6.sin6_addr =3D info->key.u.ipv6.dst; +#if IS_ENABLED(CONFIG_IPV6) local_ip.sin6.sin6_addr =3D info->key.u.ipv6.src; +#endif } dst =3D &remote_ip; + pkey =3D &info->key; dst_port =3D info->key.tp_dst ? : vxlan->cfg.dst_port; - flow_flags =3D info->key.flow_flags; vni =3D tunnel_id_to_key32(info->key.tun_id); ifindex =3D 0; dst_cache =3D &info->dst_cache; @@ -2517,15 +2486,14 @@ void vxlan_xmit_one(struct sk_buff *skb, struct net= _device *dev, struct vxlan_sock *sock4 =3D rcu_dereference(vxlan->vn4_sock); struct rtable *rt; __be16 df =3D 0; + __be32 saddr; =20 if (!ifindex) ifindex =3D sock4->sock->sk->sk_bound_dev_if; =20 - rt =3D vxlan_get_route(vxlan, dev, sock4, skb, ifindex, tos, - dst->sin.sin_addr.s_addr, - &local_ip.sin.sin_addr.s_addr, - dst_port, src_port, flow_flags, - dst_cache, info); + rt =3D udp_tunnel_dst_lookup(skb, dev, vxlan->net, ifindex, + &saddr, pkey, src_port, dst_port, + tos, use_cache ? dst_cache : NULL); if (IS_ERR(rt)) { err =3D PTR_ERR(rt); goto tx_error; @@ -2561,16 +2529,13 @@ void vxlan_xmit_one(struct sk_buff *skb, struct net= _device *dev, } else if (err) { if (info) { struct ip_tunnel_info *unclone; - struct in_addr src, dst; =20 unclone =3D skb_tunnel_info_unclone(skb); if (unlikely(!unclone)) goto tx_error; =20 - src =3D remote_ip.sin.sin_addr; - dst =3D local_ip.sin.sin_addr; - unclone->key.u.ipv4.src =3D src.s_addr; - unclone->key.u.ipv4.dst =3D dst.s_addr; + unclone->key.u.ipv4.src =3D pkey->u.ipv4.dst; + unclone->key.u.ipv4.dst =3D saddr; } vxlan_encap_bypass(skb, vxlan, vxlan, vni, false); dst_release(ndst); @@ -2584,8 +2549,8 @@ void vxlan_xmit_one(struct sk_buff *skb, struct net_d= evice *dev, if (err < 0) goto tx_error; =20 - udp_tunnel_xmit_skb(rt, sock4->sock->sk, skb, local_ip.sin.sin_addr.s_ad= dr, - dst->sin.sin_addr.s_addr, tos, ttl, df, + udp_tunnel_xmit_skb(rt, sock4->sock->sk, skb, saddr, + pkey->u.ipv4.dst, tos, ttl, df, src_port, dst_port, xnet, !udp_sum); #if IS_ENABLED(CONFIG_IPV6) } else { @@ -3286,11 +3251,14 @@ static int vxlan_fill_metadata_dst(struct net_devic= e *dev, struct sk_buff *skb) struct vxlan_sock *sock4 =3D rcu_dereference(vxlan->vn4_sock); struct rtable *rt; =20 - rt =3D vxlan_get_route(vxlan, dev, sock4, skb, 0, info->key.tos, - info->key.u.ipv4.dst, - &info->key.u.ipv4.src, dport, sport, - info->key.flow_flags, &info->dst_cache, - info); + if (!sock4) + return -EIO; + + rt =3D udp_tunnel_dst_lookup(skb, dev, vxlan->net, 0, + &info->key.u.ipv4.src, + &info->key, + sport, dport, info->key.tos, + &info->dst_cache); if (IS_ERR(rt)) return PTR_ERR(rt); ip_rt_put(rt); --=20 2.40.1