From patchwork Mon Sep 22 11:06:21 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Mietus X-Patchwork-Id: 4434 Return-Path: Delivered-To: patchwork@openvpn.net Received: by 2002:a05:7000:c08a:b0:72f:f16c:e055 with SMTP id jr10csp113471mab; Mon, 22 Sep 2025 04:08:11 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUuVHLka2trBYFYIG7aLY8Hh786ZMNZ2JokoCvl/slZ8197YLBmaPY5S3QaHMLKQqaRy/zKLIUsS3k=@openvpn.net X-Google-Smtp-Source: AGHT+IHB/XGkHk4Zdx8iEIU6CuzsPARYE/slwY2jOA/QnPAqxrEiNp0pAS8yeJj90fjFI+3nusXg X-Received: by 2002:a05:6870:d88d:b0:31d:8edc:3d1a with SMTP id 586e51a60fabf-33bb38a30ebmr6068905fac.7.1758539290886; Mon, 22 Sep 2025 04:08:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1758539290; cv=none; d=google.com; s=arc-20240605; b=iG0cuorEDJUihnQ8Oa083TghpO9CQoWS6Zcd2ttXDB56mX+RAXEUBmfvedg0r1hrRP 245xgX3my9hvZhZV7XuYtyX8pRvfpNY+YISzS2VP0iCEmRCm8Gmg1PeuBWclu8EvHQ4B wk8bes8Ovt3Ntwoed75203zQonJJ6ZOg+fMN0Iu2bpJmBeXznUl7XRlk2G8E/gCz631l 7ea32NQo9vrdSLx8cgfyVNO/anopYS7NviXM7ZUPuxyTRih9Hz8DCnnwcmPyX91uVPd8 CQy9JLAk5w606q6M4t0nhAqR5ITBoE9V02TV/UbJIrDnjTsP6sMsbsz3QAWjIJbw/hVd q7tw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=errors-to:content-transfer-encoding:cc:reply-to:from:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:dkim-signature:dkim-signature:dkim-signature:dkim-signature; bh=fcYvj51ZdyG3Kd0rYtpHhuqeKsV+/qwGbXga1+w5kbg=; fh=6EbcJF2Br7Ckqvxmbzy/aBW5ZDkZ8Oeawieh63Sh7bg=; b=TQI1a0Rb502o1trqP7tQBovgypA5lcdK2RwCUGRRp9YXJvxk5QH+TEElpVPye+F7ha UjfldYNMQyoSHw31uIrXBHzfUtMIjbbwf3f4FjqoQdYQh+qtsgMkIMEJiYxtqJwO7ewr Ka1IpR7M7aNw8Q88ox/4S2auSA+FZjEwWuxEj9KTHE07G6AmlBc2lmTXRkKDehx8Geju O6Qbw+IggjP+vw9sTuC25kJhfJui0zfz6aFLHF39DvKuqOpVc2L1iPP0nN18uogbI0FY gXwDz18kjP2XlBA7RMf/DXr1pPJpxLd4PgoTy39+vv9qIDgWMhi1lqDlKZvJM9ctdqrg Hg5A==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@lists.sourceforge.net header.s=beta header.b=dCwIgHVR; dkim=neutral (body hash did not verify) header.i=@sourceforge.net header.s=x header.b=e6QKZR8x; dkim=neutral (body hash did not verify) header.i=@sf.net header.s=x header.b=gljc3Zx+; dkim=neutral (body hash did not verify) header.i=@yahoo.com header.s=s2048 header.b=NKLP5tE7; spf=pass (google.com: domain of openvpn-devel-bounces@lists.sourceforge.net designates 216.105.38.7 as permitted sender) smtp.mailfrom=openvpn-devel-bounces@lists.sourceforge.net; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=lists.sourceforge.net Received: from lists.sourceforge.net (lists.sourceforge.net. [216.105.38.7]) by mx.google.com with ESMTPS id 586e51a60fabf-336e6799e0esi3976280fac.257.2025.09.22.04.08.10 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 22 Sep 2025 04:08:10 -0700 (PDT) Received-SPF: pass (google.com: domain of openvpn-devel-bounces@lists.sourceforge.net designates 216.105.38.7 as permitted sender) client-ip=216.105.38.7; Authentication-Results: mx.google.com; dkim=pass header.i=@lists.sourceforge.net header.s=beta header.b=dCwIgHVR; dkim=neutral (body hash did not verify) header.i=@sourceforge.net header.s=x header.b=e6QKZR8x; dkim=neutral (body hash did not verify) header.i=@sf.net header.s=x header.b=gljc3Zx+; dkim=neutral (body hash did not verify) header.i=@yahoo.com header.s=s2048 header.b=NKLP5tE7; spf=pass (google.com: domain of openvpn-devel-bounces@lists.sourceforge.net designates 216.105.38.7 as permitted sender) smtp.mailfrom=openvpn-devel-bounces@lists.sourceforge.net; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=lists.sourceforge.net DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.sourceforge.net; s=beta; h=Content-Transfer-Encoding:Content-Type:Cc: Reply-To:From:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:Subject:MIME-Version:References:In-Reply-To: Message-ID:Date:To:Sender:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=fcYvj51ZdyG3Kd0rYtpHhuqeKsV+/qwGbXga1+w5kbg=; b=dCwIgHVRqD/RWQBMc/H8zucZj4 aJQZyAw9MuFyEHiIuLpufeq16N2MFtQN8aETHAnlA/v2qwo4HnV11GMu1rZIq+iGHk2Ja45wp9c8M h5iOJDIxqjJbhPtfo/jNCCiOpvIafPDU0OeZ0Od4Km7BPTENZBB67c/glrqOcQ7H0s2w=; Received: from [127.0.0.1] (helo=sfs-ml-1.v29.lw.sourceforge.com) by sfs-ml-1.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1v0eOu-0004GW-OF; Mon, 22 Sep 2025 11:08:08 +0000 Received: from [172.30.29.66] (helo=mx.sourceforge.net) by sfs-ml-1.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1v0eOr-0004GK-G7 for openvpn-devel@lists.sourceforge.net; Mon, 22 Sep 2025 11:08:05 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=Content-Transfer-Encoding:MIME-Version:References: In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=F/CrqXPhav1we8hfen578C8Cgg6tKMJWqu5+DcM9bjU=; b=e6QKZR8xLxGPrY5eNqMSb+6eLj hP3PD4GAk1nFaDPlbafgNBkLzKjf2Oy4scaFLKHffhzXcoLMmQ+nfHPOFYL7MN/EfcRFpl1LZcwBK h4TsJFWSSOI/c5JfdnaO+zB9XroqiDAtp1NC8pVBC7LNFne6cYBO6yYOQr1TbQPjwOc4=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-ID: Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=F/CrqXPhav1we8hfen578C8Cgg6tKMJWqu5+DcM9bjU=; b=gljc3Zx+li7e5LHAYi+Cze8snz PV7CrUQStMbJ1ehIBjOKvAUCLh4xNv21qDviuF+TndT3C0rNtiaoBOHo0/BkVPLErNQpZlM2XSRwV KM8/pLWTCaEPLMpoyNvCN1X/eNwVJZ7/uypMP+ABy5umkKnB8R3+CI45r1TMOx91OvHY=; Received: from sonic308-56.consmr.mail.ne1.yahoo.com ([66.163.187.31]) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.95) id 1v0eOq-00052a-OS for openvpn-devel@lists.sourceforge.net; Mon, 22 Sep 2025 11:08:05 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1758539274; bh=F/CrqXPhav1we8hfen578C8Cgg6tKMJWqu5+DcM9bjU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=NKLP5tE7E4/uKAWrNk00OhkAUNjlZqMTb/tP/Mh7X6nQOoWdsmL5Gpw50q0ykqfo6dFKh18FaUE18lXolIuhWD6ZBnX+gZXea2/vnXcA4Td2MVqTcAP5TUlCj+RshdeDVmTTQ51JUHN8GvErrrG5Q0MjLX+eYYh2sXRY2HL5aA2GcR26jYjNqufJh7LTJ1EGMaYGr5OElX3XdsOLgg1t/BGyc46p6sITWfVpItZ0xs6bN1X1j849DQkWPx2QWDNH0xW6t4TGJzwBjBVlHK3eYQdAjp8RALLPu02gpXGzBOSDy1AIj5fCV93lGkO2qGHVzt5FgZJ+n8N6ul5zEviv8A== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1758539274; bh=wS/e+rPwaFZBchui4b2q9F+CMEqovYeKy4noCBk+vU4=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=MbhdDmsAb8Wb92ZUfG1XjMkYYTa/UEH1GQx+NasCLSoaqWTtq+Qx167ittig9VjhvtY/ofo1WJe47V2b9t/V4HVR9JnVAbGAmoPHspKzg5seuRn4ZC5RsLUhrYlOE8pNQ32/N74P4hJtpQQZLmCsJlE8JYNgxoyJXkLxmCkOrYXnmj/yop0Lfuj7S4qKMoa8aWVoZWUV4wb6zthmxmjnP5oIZBxEC1U2s46yvk+ZwYHK95dTRTqchGBjnD2P8zjf5dktZbyW9x3DRsSTrHcuknvg4NGpcrvquiNTfTJWhHfs6sSsXMOJpBvg3F2NLvJfShVRtk3Zr6Te4EFL00dp9w== X-YMail-OSG: X52VvukVM1kDIdEIlckeH3xnZ5yKNdZ2hkGgdBkcfU8E2HL41K13U.8SaHASK8O pmkoWfocFvIj7U_yIhhILXTjPa1ff5GdAQZxmfROH29yqhlSJ0FdqzoN52meNEacdJ9GxRfgVbaB qVLnW_1n4jG8rDuPw1zaLrkDHjNpzOVbEN8hknV7vlBYKEtG9K922CPztSXFlt4Q7druI5LAMCQr MGlLiRmp12EaJFaMGPJbfxu_FVZUW44.tEJKhPaErhTDl_i.WJ3RoG5dpCddhvIC5utKjSLlLE6V AHuYspu28zYwYnFo6iWoqxlGQVr1NFpFq7DpIxvv.ZNjjIV0cmFJ.EhqMY0aqWg0H8r.z.uHneBW q3iKi5eqlBa8SZ9PE0s_EF735WnWIZRkaNzukqo2ukcipD3B39xd2pkAaCRXriL3GKnEKt0.ki8m ZJfWiwU0F1WfdFljYIdHFhCyPobIvvQybHEG4_P2pp9mgAanXioHipBJT9BhO9QFowRuYdr8Cxwu Qe.BKEVpqAxp6_SGtVaztCUGLBJrEdQQKlRt6xXm1a3H0bDN1utdQ68yTQRKHWysyRUO_5WHihar xawpSaxliX2aGL4273082Rmv2r_3ja4HkTt.HHV7MEoVN42NrDEjFI2Njrz0KdBSBXP38a5kTjxC 3nQ1hxbUf_VzdGpYSqd2IE9LtGK0nn4.iqjDyx.uLa6AnFCdcIQ4UT8J3deymzuh2WGqPZRtiCP2 o23hZhzT23cS61gVlg6ZaRQZzWsllkLmp8KQmsQDoZPuchYsc2xIETkcslY0npVb_vmca8euzGM9 afMk7cQB_PCX4dKM8vB3XP4vMV19LTYxKW4Yc5tkIo0uWtRdA5PbTwtUefmc7qMJzQd9s2XnfDR9 AzD8tNDZaDK0gW1FRJ_26de05HIkbI_iDzbekHbdONBL29pisUeI2MXt67iK9WddrqSg3ZpTNIsk eZLOJkqItzG2CeHHz0yhh0Qn8RpjXP7gyggj9lubJSOc5H3XJwOuA1cRk3.KVSQht2RNVeGt3aX1 Ie1HO2JnZEhHw7ShRnMidfCEY4GEfU.46plYDtykxmGacg5KFZYKn2ciE15d9ffeRj1.2Ecxvrd6 4gEQguXRutcgBZZ2MxGCyXNPqUyfR8jIfR7qc4mty4bqPq2A_EUBB.xSPAUx1ld.uSbJXRzkX66u 4UVCIizzPBFW.rMV92ZMa.QaIeLCiMkTA7KGGf5h7LvJkb3scAiT53roytd_PxgJZI41cqPrzcYy O5E7_FWYHe8UK1kC6n307wJqHdjxRi1dmtXkxPOz2X1z83LTEZdfvK.riI.WlCZ7oL3TleS6XeHq ZDvP5JRQbFlqezbxBcpqBFjTKbbYw7ndt1lV8U2Bzv9FeGsW8oo14BhahfMuR_SlGm5ta85CUlLb EM6C.Ep3_KY.Q96_o6mS.9KP2_1zT0WRzXjZ601hYbjxOO5G0oD6pg2mjC1c0E4EGpCdVtoA1Z_N F3LXe0LDrrR9mLOYgfW0vs0SPBwwT_g_no0ekCQIGwfgzZRlZljxjWEQ713z1qKBsKOCeGd.fpE6 RUv0fzl1_il2QQ4JYM905F73GISpIIyRNSRWptgOlWhOuaSkwA.0JpfGtLPQRWi_KfBAX.578lJy KrRWEp96E59nRle5sK8b8_jnX3I8ZeAH7wpno2Fhi9g8T2Ba4thcgKpwBxbxXSnfVcFKMnaes1ul jrBPT9GnWRdwE.Qfqt0YKDQIV05W6ddmdR5lFw_5_pNV7n6h8XYSIZlwrimnybS0fc3y7IaBpuu. XZNrdjWjWCsVJO9bUPPS0rm.fDE3vmBv.h3WvQKnVkZLgNQWiZZSEf80Ay3TP3B08muJevTKi.HG rvDiOatvI_rwSbUwydyTKgntP1abwVOZqmydducLD7_ppdW.kSByxntJVrBt_rLNnV3XUEu62ahr 2U2ndh4Zk05Y.lQSIjws8otJ1uah3wxT72RnQql39XVbuaLhg8e4UY05WzqdK03TNXyJoz7Y98WK i6IXAVmaTjW1NijRBrmXCyHcz7P2SW6kG6HGC2O2VMAVMGF2H4Oxjk8685aB4HzNtz6DJ5afHsHC M3ENKnsr5uMeIBE4tJOiR.mFpmVWG2DXqJXkJuyhqk_MUM1_Npagk.o7y568.vFL7wtP57lxXwoj mSKKCsHOHluaHg9IikWxqbiLFxAhcqF.SH9Cjv0tnq.WvJw-- X-Sonic-MF: X-Sonic-ID: 0f9b02dc-6fd8-4eb9-aa3c-3c63d1b058ab Received: from sonic.gate.mail.ne1.yahoo.com by sonic308.consmr.mail.ne1.yahoo.com with HTTP; Mon, 22 Sep 2025 11:07:54 +0000 Received: by hermes--production-ir2-74585cff4f-4sjhz (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID ca5bfbd718d89396be3325d48d68935b; Mon, 22 Sep 2025 11:07:29 +0000 (UTC) To: netdev@vger.kernel.org, sd@queasysnail.net, antonio@openvpn.net Date: Mon, 22 Sep 2025 13:06:21 +0200 Message-ID: <20250922110622.10368-3-mmietus97@yahoo.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250922110622.10368-1-mmietus97@yahoo.com> References: <20250922110622.10368-1-mmietus97@yahoo.com> MIME-Version: 1.0 Content-Length: 9443 X-Spam-Score: 0.1 (/) X-Spam-Report: Spam detection software, running on the system "sfi-spamd-2.hosts.colo.sdot.me", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: In cases where udp_tunnel{,6}_xmit_skb is called inside a RCU read-side critical section, we can avoid referencing the dst_entry. Implement noref variants for udp_tunnel{,6}_xmit_skb and iptunnel_xmit to be used in noref flows. Content analysis details: (0.1 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider [mmietus97(at)yahoo.com] 0.2 FREEMAIL_ENVFROM_END_DIGIT Envelope-from freemail username ends in digit [mmietus97(at)yahoo.com] 0.0 RCVD_IN_MSPIKE_H2 RBL: Average reputation (+2) [66.163.187.31 listed in wl.mailspike.net] X-Headers-End: 1v0eOq-00052a-OS Subject: [Openvpn-devel] [PATCH net-next v3 2/3] net: tunnel: implement noref flows in udp_tunnel{, 6}_xmit_skb X-BeenThere: openvpn-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Marek Mietus via Openvpn-devel From: Marek Mietus Reply-To: Marek Mietus Cc: openvpn-devel@lists.sourceforge.net Errors-To: openvpn-devel-bounces@lists.sourceforge.net X-getmail-retrieved-from-mailbox: Inbox X-GMAIL-THRID: =?utf-8?q?1843962095660115492?= X-GMAIL-MSGID: =?utf-8?q?1843962095660115492?= In cases where udp_tunnel{,6}_xmit_skb is called inside a RCU read-side critical section, we can avoid referencing the dst_entry. Implement noref variants for udp_tunnel{,6}_xmit_skb and iptunnel_xmit to be used in noref flows. Signed-off-by: Marek Mietus --- include/net/ip_tunnels.h | 3 +++ include/net/udp_tunnel.h | 13 ++++++++++ net/ipv4/ip_tunnel_core.c | 34 +++++++++++++++++++------ net/ipv4/udp_tunnel_core.c | 29 +++++++++++++++++++--- net/ipv6/ip6_udp_tunnel.c | 51 ++++++++++++++++++++++++++++++-------- 5 files changed, 109 insertions(+), 21 deletions(-) diff --git a/include/net/ip_tunnels.h b/include/net/ip_tunnels.h index 8cf1380f3656..6dcea237bf21 100644 --- a/include/net/ip_tunnels.h +++ b/include/net/ip_tunnels.h @@ -604,6 +604,9 @@ static inline int iptunnel_pull_header(struct sk_buff *skb, int hdr_len, void iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb, __be32 src, __be32 dst, u8 proto, u8 tos, u8 ttl, __be16 df, bool xnet, u16 ipcb_flags); +void iptunnel_xmit_noref(struct sock *sk, struct rtable *rt, struct sk_buff *skb, + __be32 src, __be32 dst, u8 proto, + u8 tos, u8 ttl, __be16 df, bool xnet, u16 ipcb_flags); struct metadata_dst *iptunnel_metadata_reply(struct metadata_dst *md, gfp_t flags); int skb_tunnel_check_pmtu(struct sk_buff *skb, struct dst_entry *encap_dst, diff --git a/include/net/udp_tunnel.h b/include/net/udp_tunnel.h index 9acef2fbd2fd..b35e0267e318 100644 --- a/include/net/udp_tunnel.h +++ b/include/net/udp_tunnel.h @@ -135,6 +135,10 @@ void udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df, __be16 src_port, __be16 dst_port, bool xnet, bool nocheck, u16 ipcb_flags); +void udp_tunnel_xmit_skb_noref(struct rtable *rt, struct sock *sk, struct sk_buff *skb, + __be32 src, __be32 dst, __u8 tos, __u8 ttl, + __be16 df, __be16 src_port, __be16 dst_port, + bool xnet, bool nocheck, u16 ipcb_flags); void udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sock *sk, struct sk_buff *skb, @@ -145,6 +149,15 @@ void udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sock *sk, __be16 src_port, __be16 dst_port, bool nocheck, u16 ip6cb_flags); +void udp_tunnel6_xmit_skb_noref(struct dst_entry *dst, + struct sock *sk, struct sk_buff *skb, + struct net_device *dev, + const struct in6_addr *saddr, + const struct in6_addr *daddr, + __u8 prio, __u8 ttl, __be32 label, + __be16 src_port, __be16 dst_port, + bool nocheck, u16 ip6cb_flags); + void udp_tunnel_sock_release(struct socket *sock); struct rtable *udp_tunnel_dst_lookup(struct sk_buff *skb, diff --git a/net/ipv4/ip_tunnel_core.c b/net/ipv4/ip_tunnel_core.c index cc9915543637..8b03fb380397 100644 --- a/net/ipv4/ip_tunnel_core.c +++ b/net/ipv4/ip_tunnel_core.c @@ -47,10 +47,10 @@ const struct ip6_tnl_encap_ops __rcu * ip6tun_encaps[MAX_IPTUN_ENCAP_OPS] __read_mostly; EXPORT_SYMBOL(ip6tun_encaps); -void iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb, - __be32 src, __be32 dst, __u8 proto, - __u8 tos, __u8 ttl, __be16 df, bool xnet, - u16 ipcb_flags) +static void __iptunnel_xmit(struct sock *sk, struct rtable *rt, + struct sk_buff *skb, __be32 src, __be32 dst, + __u8 proto, __u8 tos, __u8 ttl, __be16 df, + u16 ipcb_flags) { int pkt_len = skb->len - skb_inner_network_offset(skb); struct net *net = dev_net(rt->dst.dev); @@ -58,10 +58,7 @@ void iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb, struct iphdr *iph; int err; - skb_scrub_packet(skb, xnet); - skb_clear_hash_if_not_l4(skb); - skb_dst_set(skb, &rt->dst); memset(IPCB(skb), 0, sizeof(*IPCB(skb))); IPCB(skb)->flags = ipcb_flags; @@ -89,8 +86,31 @@ void iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb, iptunnel_xmit_stats(dev, pkt_len); } } + +void iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb, + __be32 src, __be32 dst, __u8 proto, + __u8 tos, __u8 ttl, __be16 df, bool xnet, + u16 ipcb_flags) +{ + skb_scrub_packet(skb, xnet); + skb_dst_set(skb, &rt->dst); + + __iptunnel_xmit(sk, rt, skb, src, dst, proto, tos, ttl, df, ipcb_flags); +} EXPORT_SYMBOL_GPL(iptunnel_xmit); +void iptunnel_xmit_noref(struct sock *sk, struct rtable *rt, struct sk_buff *skb, + __be32 src, __be32 dst, __u8 proto, + __u8 tos, __u8 ttl, __be16 df, bool xnet, + u16 ipcb_flags) +{ + skb_scrub_packet(skb, xnet); + skb_dst_set_noref(skb, &rt->dst); + + __iptunnel_xmit(sk, rt, skb, src, dst, proto, tos, ttl, df, ipcb_flags); +} +EXPORT_SYMBOL_GPL(iptunnel_xmit_noref); + int __iptunnel_pull_header(struct sk_buff *skb, int hdr_len, __be16 inner_proto, bool raw_proto, bool xnet) { diff --git a/net/ipv4/udp_tunnel_core.c b/net/ipv4/udp_tunnel_core.c index fce945f23069..c0e9007cf081 100644 --- a/net/ipv4/udp_tunnel_core.c +++ b/net/ipv4/udp_tunnel_core.c @@ -170,10 +170,9 @@ void udp_tunnel_notify_del_rx_port(struct socket *sock, unsigned short type) } EXPORT_SYMBOL_GPL(udp_tunnel_notify_del_rx_port); -void udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb, - __be32 src, __be32 dst, __u8 tos, __u8 ttl, - __be16 df, __be16 src_port, __be16 dst_port, - bool xnet, bool nocheck, u16 ipcb_flags) +static void udp_tunnel_add_hdr(struct sk_buff *skb, __be32 src, + __be32 dst, __be16 src_port, + __be16 dst_port, bool nocheck) { struct udphdr *uh; @@ -188,12 +187,34 @@ void udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); udp_set_csum(nocheck, skb, src, dst, skb->len); +} + +void udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, + struct sk_buff *skb, __be32 src, __be32 dst, + __u8 tos, __u8 ttl, __be16 df, __be16 src_port, + __be16 dst_port, bool xnet, bool nocheck, + u16 ipcb_flags) +{ + udp_tunnel_add_hdr(skb, src, dst, src_port, dst_port, nocheck); iptunnel_xmit(sk, rt, skb, src, dst, IPPROTO_UDP, tos, ttl, df, xnet, ipcb_flags); } EXPORT_SYMBOL_GPL(udp_tunnel_xmit_skb); +void udp_tunnel_xmit_skb_noref(struct rtable *rt, struct sock *sk, + struct sk_buff *skb, __be32 src, __be32 dst, + __u8 tos, __u8 ttl, __be16 df, __be16 src_port, + __be16 dst_port, bool xnet, bool nocheck, + u16 ipcb_flags) +{ + udp_tunnel_add_hdr(skb, src, dst, src_port, dst_port, nocheck); + + iptunnel_xmit_noref(sk, rt, skb, src, dst, IPPROTO_UDP, tos, ttl, df, + xnet, ipcb_flags); +} +EXPORT_SYMBOL_GPL(udp_tunnel_xmit_skb_noref); + void udp_tunnel_sock_release(struct socket *sock) { rcu_assign_sk_user_data(sock->sk, NULL); diff --git a/net/ipv6/ip6_udp_tunnel.c b/net/ipv6/ip6_udp_tunnel.c index 0ff547a4bff7..d262d0a0a178 100644 --- a/net/ipv6/ip6_udp_tunnel.c +++ b/net/ipv6/ip6_udp_tunnel.c @@ -74,14 +74,16 @@ int udp_sock_create6(struct net *net, struct udp_port_cfg *cfg, } EXPORT_SYMBOL_GPL(udp_sock_create6); -void udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sock *sk, - struct sk_buff *skb, - struct net_device *dev, - const struct in6_addr *saddr, - const struct in6_addr *daddr, - __u8 prio, __u8 ttl, __be32 label, - __be16 src_port, __be16 dst_port, bool nocheck, - u16 ip6cb_flags) +static void __udp_tunnel6_xmit_skb(struct dst_entry *dst, + struct sock *sk, + struct sk_buff *skb, + struct net_device *dev, + const struct in6_addr *saddr, + const struct in6_addr *daddr, + __u8 prio, __u8 ttl, __be32 label, + __be16 src_port, __be16 dst_port, + bool nocheck, + u16 ip6cb_flags) { struct udphdr *uh; struct ipv6hdr *ip6h; @@ -95,8 +97,6 @@ void udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sock *sk, uh->len = htons(skb->len); - skb_dst_set(skb, dst); - udp6_set_csum(nocheck, skb, saddr, daddr, skb->len); __skb_push(skb, sizeof(*ip6h)); @@ -111,8 +111,39 @@ void udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sock *sk, ip6tunnel_xmit(sk, skb, dev, ip6cb_flags); } + +void udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sock *sk, + struct sk_buff *skb, + struct net_device *dev, + const struct in6_addr *saddr, + const struct in6_addr *daddr, + __u8 prio, __u8 ttl, __be32 label, + __be16 src_port, __be16 dst_port, bool nocheck, + u16 ip6cb_flags) +{ + skb_dst_set(skb, dst); + __udp_tunnel6_xmit_skb(dst, sk, skb, dev, saddr, daddr, + prio, ttl, label, src_port, dst_port, + nocheck, ip6cb_flags); +} EXPORT_SYMBOL_GPL(udp_tunnel6_xmit_skb); +void udp_tunnel6_xmit_skb_noref(struct dst_entry *dst, + struct sock *sk, struct sk_buff *skb, + struct net_device *dev, + const struct in6_addr *saddr, + const struct in6_addr *daddr, + __u8 prio, __u8 ttl, __be32 label, + __be16 src_port, __be16 dst_port, + bool nocheck, u16 ip6cb_flags) +{ + skb_dst_set_noref(skb, dst); + __udp_tunnel6_xmit_skb(dst, sk, skb, dev, saddr, daddr, + prio, ttl, label, src_port, dst_port, + nocheck, ip6cb_flags); +} +EXPORT_SYMBOL_GPL(udp_tunnel6_xmit_skb_noref); + /** * udp_tunnel6_dst_lookup - perform route lookup on UDP tunnel * @skb: Packet for which lookup is done