]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ipv6: Retire UDP-Lite.
authorKuniyuki Iwashima <kuniyu@google.com>
Wed, 11 Mar 2026 05:19:49 +0000 (05:19 +0000)
committerJakub Kicinski <kuba@kernel.org>
Sat, 14 Mar 2026 01:57:44 +0000 (18:57 -0700)
As announced in commit be28c14ac8bb ("udplite: Print deprecation
notice."), it's time to deprecate UDP-Lite.

As a first step, let's drop support for IPv6 UDP-Lite sockets.

We will remove the remaining dead code gradually.

Along with the removal of udplite.c, most of the functions exposed
via udp_impl.h are made static.

The prototypes of udpv6_sendmsg() and udpv6_recvmsg() are moved
to udp.h, but only udpv6_recvmsg() has INDIRECT_CALLABLE_DECLARE()
because udpv6_sendmsg() is exported for rxrpc since commit ed472b0c8783
("rxrpc: Call udp_sendmsg() directly").

Also, udpv6_recvmsg() needs INDIRECT_CALLABLE_SCOPE for
CONFIG_MITIGATION_RETPOLINE=n.

Note that udplite.h is included temporarily for udplite_csum().

Signed-off-by: Kuniyuki Iwashima <kuniyu@google.com>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Link: https://patch.msgid.link/20260311052020.1213705-3-kuniyu@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/ipv6.h
include/net/transp_v6.h
include/net/udp.h
net/ipv6/Makefile
net/ipv6/af_inet6.c
net/ipv6/proc.c
net/ipv6/udp.c
net/ipv6/udp_impl.h [deleted file]
net/ipv6/udplite.c [deleted file]
net/rxrpc/output.c

index 1c0ce51512753bbc2ee5705475f6a99882a8b429..0958cc5c6ec381dd069ba52de6eb8e98fabb4652 100644 (file)
@@ -1179,8 +1179,6 @@ int tcp6_proc_init(struct net *net);
 void tcp6_proc_exit(struct net *net);
 int udp6_proc_init(struct net *net);
 void udp6_proc_exit(struct net *net);
-int udplite6_proc_init(void);
-void udplite6_proc_exit(void);
 int ipv6_misc_proc_init(void);
 void ipv6_misc_proc_exit(void);
 int snmp6_register_dev(struct inet6_dev *idev);
index 1a97e3f32029a7d92ece8a472bce59062915c43c..c0a421fe0c2a0655761bffdaba5caee8273e38cd 100644 (file)
@@ -8,7 +8,6 @@
 /* IPv6 transport protocols */
 extern struct proto rawv6_prot;
 extern struct proto udpv6_prot;
-extern struct proto udplitev6_prot;
 extern struct proto tcpv6_prot;
 extern struct proto pingv6_prot;
 
@@ -28,8 +27,6 @@ int rawv6_init(void);
 void rawv6_exit(void);
 int udpv6_init(void);
 void udpv6_exit(void);
-int udplitev6_init(void);
-void udplitev6_exit(void);
 int tcpv6_init(void);
 void tcpv6_exit(void);
 
index f51a51c0e4685dbecb611ff37f2c16de75692d8f..05f63e9e00a76844eec87b3db5c4b0065470fa8e 100644 (file)
@@ -282,6 +282,10 @@ typedef struct sock *(*udp_lookup_t)(const struct sk_buff *skb, __be16 sport,
 void udp_v6_early_demux(struct sk_buff *skb);
 INDIRECT_CALLABLE_DECLARE(int udpv6_rcv(struct sk_buff *));
 
+int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len);
+INDIRECT_CALLABLE_DECLARE(int udpv6_recvmsg(struct sock *sk, struct msghdr *msg,
+                                           size_t len, int flags));
+
 struct sk_buff *__udp_gso_segment(struct sk_buff *gso_skb,
                                  netdev_features_t features, bool is_ipv6);
 
index 0492f1a0b4918ada8c56cf649fbec04c7114863a..2c9ce2ccbde17b9aaa0acf62e1b86885e55ab95d 100644 (file)
@@ -7,7 +7,7 @@ obj-$(CONFIG_IPV6) += ipv6.o
 
 ipv6-y :=      af_inet6.o anycast.o ip6_output.o ip6_input.o addrconf.o \
                addrlabel.o \
-               route.o ip6_fib.o ipv6_sockglue.o ndisc.o udp.o udplite.o \
+               route.o ip6_fib.o ipv6_sockglue.o ndisc.o udp.o \
                raw.o icmp.o mcast.o reassembly.o tcp_ipv6.o ping.o \
                exthdrs.o datagram.o ip6_flowlabel.o inet6_connection_sock.o \
                udp_offload.o seg6.o fib6_notifier.o rpl.o ioam6.o
index 03c175cbbdb6274bf1b0a7f4fb692916f59bc7a9..61f7bc88526a16d2feb79a702f8fed9f351c2204 100644 (file)
@@ -43,7 +43,6 @@
 #include <net/ip.h>
 #include <net/ipv6.h>
 #include <net/udp.h>
-#include <net/udplite.h>
 #include <net/tcp.h>
 #include <net/ping.h>
 #include <net/protocol.h>
@@ -636,8 +635,6 @@ int inet6_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 EXPORT_SYMBOL_GPL(inet6_compat_ioctl);
 #endif /* CONFIG_COMPAT */
 
-INDIRECT_CALLABLE_DECLARE(int udpv6_sendmsg(struct sock *, struct msghdr *,
-                                           size_t));
 int inet6_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
 {
        struct sock *sk = sock->sk;
@@ -652,8 +649,6 @@ int inet6_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
                               sk, msg, size);
 }
 
-INDIRECT_CALLABLE_DECLARE(int udpv6_recvmsg(struct sock *, struct msghdr *,
-                                           size_t, int));
 int inet6_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
                  int flags)
 {
@@ -1080,13 +1075,9 @@ static int __init inet6_init(void)
        if (err)
                goto out_unregister_tcp_proto;
 
-       err = proto_register(&udplitev6_prot, 1);
-       if (err)
-               goto out_unregister_udp_proto;
-
        err = proto_register(&rawv6_prot, 1);
        if (err)
-               goto out_unregister_udplite_proto;
+               goto out_unregister_udp_proto;
 
        err = proto_register(&pingv6_prot, 1);
        if (err)
@@ -1137,8 +1128,6 @@ static int __init inet6_init(void)
        err = -ENOMEM;
        if (raw6_proc_init())
                goto proc_raw6_fail;
-       if (udplite6_proc_init())
-               goto proc_udplite6_fail;
        if (ipv6_misc_proc_init())
                goto proc_misc6_fail;
        if (if6_proc_init())
@@ -1174,10 +1163,6 @@ static int __init inet6_init(void)
        if (err)
                goto udpv6_fail;
 
-       err = udplitev6_init();
-       if (err)
-               goto udplitev6_fail;
-
        err = udpv6_offload_init();
        if (err)
                goto udpv6_offload_fail;
@@ -1248,8 +1233,6 @@ ipv6_packet_fail:
 tcpv6_fail:
        udpv6_offload_exit();
 udpv6_offload_fail:
-       udplitev6_exit();
-udplitev6_fail:
        udpv6_exit();
 udpv6_fail:
        ipv6_frag_exit();
@@ -1271,8 +1254,6 @@ ip6_route_fail:
 proc_if6_fail:
        ipv6_misc_proc_exit();
 proc_misc6_fail:
-       udplite6_proc_exit();
-proc_udplite6_fail:
        raw6_proc_exit();
 proc_raw6_fail:
 #endif
@@ -1296,8 +1277,6 @@ out_unregister_ping_proto:
        proto_unregister(&pingv6_prot);
 out_unregister_raw_proto:
        proto_unregister(&rawv6_prot);
-out_unregister_udplite_proto:
-       proto_unregister(&udplitev6_prot);
 out_unregister_udp_proto:
        proto_unregister(&udpv6_prot);
 out_unregister_tcp_proto:
index 73296f38c25205438ac886583b5a71c6dc38b7d5..21bfc73152f0aa3fee18572adf37f1ed520a7942 100644 (file)
@@ -39,8 +39,6 @@ static int sockstat6_seq_show(struct seq_file *seq, void *v)
                       sock_prot_inuse_get(net, &tcpv6_prot));
        seq_printf(seq, "UDP6: inuse %d\n",
                       sock_prot_inuse_get(net, &udpv6_prot));
-       seq_printf(seq, "UDPLITE6: inuse %d\n",
-                       sock_prot_inuse_get(net, &udplitev6_prot));
        seq_printf(seq, "RAW6: inuse %d\n",
                       sock_prot_inuse_get(net, &rawv6_prot));
        seq_printf(seq, "FRAG6: inuse %u memory %lu\n",
index 5fef1c22669799e7295642332166887a877530f7..aa859bb0527de07ff00f726fa9d0e0768d687533 100644 (file)
@@ -37,6 +37,7 @@
 #include <trace/events/udp.h>
 
 #include <net/addrconf.h>
+#include <net/aligned_data.h>
 #include <net/ndisc.h>
 #include <net/protocol.h>
 #include <net/transp_v6.h>
@@ -57,7 +58,7 @@
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
 #include <trace/events/skb.h>
-#include "udp_impl.h"
+#include <net/udplite.h>
 
 static void udpv6_destruct_sock(struct sock *sk)
 {
@@ -65,7 +66,7 @@ static void udpv6_destruct_sock(struct sock *sk)
        inet6_sock_destruct(sk);
 }
 
-int udpv6_init_sock(struct sock *sk)
+static int udpv6_init_sock(struct sock *sk)
 {
        int res = udp_lib_init_sock(sk);
 
@@ -95,7 +96,7 @@ u32 udp6_ehashfn(const struct net *net,
                               udp6_ehash_secret + net_hash_mix(net));
 }
 
-int udp_v6_get_port(struct sock *sk, unsigned short snum)
+static int udp_v6_get_port(struct sock *sk, unsigned short snum)
 {
        unsigned int hash2_nulladdr =
                ipv6_portaddr_hash(sock_net(sk), &in6addr_any, snum);
@@ -107,7 +108,7 @@ int udp_v6_get_port(struct sock *sk, unsigned short snum)
        return udp_lib_get_port(sk, snum, hash2_nulladdr);
 }
 
-void udp_v6_rehash(struct sock *sk)
+static void udp_v6_rehash(struct sock *sk)
 {
        u16 new_hash = ipv6_portaddr_hash(sock_net(sk),
                                          &sk->sk_v6_rcv_saddr,
@@ -464,6 +465,7 @@ static int udp6_skb_len(struct sk_buff *skb)
  *     return it, otherwise we block.
  */
 
+INDIRECT_CALLABLE_SCOPE
 int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
                  int flags)
 {
@@ -700,9 +702,9 @@ out:
        return sk;
 }
 
-int __udp6_lib_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
-                  u8 type, u8 code, int offset, __be32 info,
-                  struct udp_table *udptable)
+static int __udp6_lib_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
+                         u8 type, u8 code, int offset, __be32 info,
+                         struct udp_table *udptable)
 {
        struct ipv6_pinfo *np;
        const struct ipv6hdr *hdr = (const struct ipv6hdr *)skb->data;
@@ -1115,8 +1117,8 @@ static int udp6_csum_init(struct sk_buff *skb, struct udphdr *uh, int proto)
        return 0;
 }
 
-int __udp6_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
-                  int proto)
+static int __udp6_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
+                         int proto)
 {
        enum skb_drop_reason reason = SKB_DROP_REASON_NOT_SPECIFIED;
        const struct in6_addr *saddr, *daddr;
@@ -1854,7 +1856,7 @@ static void udpv6_splice_eof(struct socket *sock)
        release_sock(sk);
 }
 
-void udpv6_destroy_sock(struct sock *sk)
+static void udpv6_destroy_sock(struct sock *sk)
 {
        struct udp_sock *up = udp_sk(sk);
        lock_sock(sk);
@@ -1882,8 +1884,8 @@ void udpv6_destroy_sock(struct sock *sk)
 /*
  *     Socket option code for UDP
  */
-int udpv6_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval,
-                    unsigned int optlen)
+static int udpv6_setsockopt(struct sock *sk, int level, int optname,
+                           sockptr_t optval, unsigned int optlen)
 {
        if (level == SOL_UDP  ||  level == SOL_UDPLITE || level == SOL_SOCKET)
                return udp_lib_setsockopt(sk, level, optname,
@@ -1892,8 +1894,8 @@ int udpv6_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval,
        return ipv6_setsockopt(sk, level, optname, optval, optlen);
 }
 
-int udpv6_getsockopt(struct sock *sk, int level, int optname,
-                    char __user *optval, int __user *optlen)
+static int udpv6_getsockopt(struct sock *sk, int level, int optname,
+                           char __user *optval, int __user *optlen)
 {
        if (level == SOL_UDP  ||  level == SOL_UDPLITE)
                return udp_lib_getsockopt(sk, level, optname, optval, optlen);
@@ -1918,7 +1920,7 @@ static int udp6_seq_show(struct seq_file *seq, void *v)
        return 0;
 }
 
-const struct seq_operations udp6_seq_ops = {
+static const struct seq_operations udp6_seq_ops = {
        .start          = udp_seq_start,
        .next           = udp_seq_next,
        .stop           = udp_seq_stop,
diff --git a/net/ipv6/udp_impl.h b/net/ipv6/udp_impl.h
deleted file mode 100644 (file)
index 525ea60..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef _UDP6_IMPL_H
-#define _UDP6_IMPL_H
-#include <net/aligned_data.h>
-#include <net/udp.h>
-#include <net/udplite.h>
-#include <net/protocol.h>
-#include <net/addrconf.h>
-#include <net/inet_common.h>
-#include <net/transp_v6.h>
-
-int __udp6_lib_rcv(struct sk_buff *, struct udp_table *, int);
-int __udp6_lib_err(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int,
-                  __be32, struct udp_table *);
-
-int udpv6_init_sock(struct sock *sk);
-int udp_v6_get_port(struct sock *sk, unsigned short snum);
-void udp_v6_rehash(struct sock *sk);
-
-int udpv6_getsockopt(struct sock *sk, int level, int optname,
-                    char __user *optval, int __user *optlen);
-int udpv6_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval,
-                    unsigned int optlen);
-int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len);
-int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int flags);
-void udpv6_destroy_sock(struct sock *sk);
-
-#ifdef CONFIG_PROC_FS
-extern const struct seq_operations udp6_seq_ops;
-#endif
-#endif /* _UDP6_IMPL_H */
diff --git a/net/ipv6/udplite.c b/net/ipv6/udplite.c
deleted file mode 100644 (file)
index e867721..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- *  UDPLITEv6   An implementation of the UDP-Lite protocol over IPv6.
- *              See also net/ipv4/udplite.c
- *
- *  Authors:    Gerrit Renker       <gerrit@erg.abdn.ac.uk>
- *
- *  Changes:
- *  Fixes:
- */
-#define pr_fmt(fmt) "UDPLite6: " fmt
-
-#include <linux/export.h>
-#include <linux/proc_fs.h>
-#include "udp_impl.h"
-
-static int udplitev6_sk_init(struct sock *sk)
-{
-       pr_warn_once("UDP-Lite is deprecated and scheduled to be removed in 2025, "
-                    "please contact the netdev mailing list\n");
-       return udpv6_init_sock(sk);
-}
-
-static int udplitev6_rcv(struct sk_buff *skb)
-{
-       return __udp6_lib_rcv(skb, &udplite_table, IPPROTO_UDPLITE);
-}
-
-static int udplitev6_err(struct sk_buff *skb,
-                         struct inet6_skb_parm *opt,
-                         u8 type, u8 code, int offset, __be32 info)
-{
-       return __udp6_lib_err(skb, opt, type, code, offset, info,
-                             &udplite_table);
-}
-
-static const struct inet6_protocol udplitev6_protocol = {
-       .handler        =       udplitev6_rcv,
-       .err_handler    =       udplitev6_err,
-       .flags          =       INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
-};
-
-struct proto udplitev6_prot = {
-       .name              = "UDPLITEv6",
-       .owner             = THIS_MODULE,
-       .close             = udp_lib_close,
-       .connect           = ip6_datagram_connect,
-       .disconnect        = udp_disconnect,
-       .ioctl             = udp_ioctl,
-       .init              = udplitev6_sk_init,
-       .destroy           = udpv6_destroy_sock,
-       .setsockopt        = udpv6_setsockopt,
-       .getsockopt        = udpv6_getsockopt,
-       .sendmsg           = udpv6_sendmsg,
-       .recvmsg           = udpv6_recvmsg,
-       .hash              = udp_lib_hash,
-       .unhash            = udp_lib_unhash,
-       .rehash            = udp_v6_rehash,
-       .get_port          = udp_v6_get_port,
-
-       .memory_allocated  = &net_aligned_data.udp_memory_allocated,
-       .per_cpu_fw_alloc  = &udp_memory_per_cpu_fw_alloc,
-
-       .sysctl_mem        = sysctl_udp_mem,
-       .sysctl_wmem_offset = offsetof(struct net, ipv4.sysctl_udp_wmem_min),
-       .sysctl_rmem_offset = offsetof(struct net, ipv4.sysctl_udp_rmem_min),
-       .obj_size          = sizeof(struct udp6_sock),
-       .ipv6_pinfo_offset = offsetof(struct udp6_sock, inet6),
-       .h.udp_table       = &udplite_table,
-};
-
-static struct inet_protosw udplite6_protosw = {
-       .type           = SOCK_DGRAM,
-       .protocol       = IPPROTO_UDPLITE,
-       .prot           = &udplitev6_prot,
-       .ops            = &inet6_dgram_ops,
-       .flags          = INET_PROTOSW_PERMANENT,
-};
-
-int __init udplitev6_init(void)
-{
-       int ret;
-
-       ret = inet6_add_protocol(&udplitev6_protocol, IPPROTO_UDPLITE);
-       if (ret)
-               goto out;
-
-       ret = inet6_register_protosw(&udplite6_protosw);
-       if (ret)
-               goto out_udplitev6_protocol;
-out:
-       return ret;
-
-out_udplitev6_protocol:
-       inet6_del_protocol(&udplitev6_protocol, IPPROTO_UDPLITE);
-       goto out;
-}
-
-void udplitev6_exit(void)
-{
-       inet6_unregister_protosw(&udplite6_protosw);
-       inet6_del_protocol(&udplitev6_protocol, IPPROTO_UDPLITE);
-}
-
-#ifdef CONFIG_PROC_FS
-static struct udp_seq_afinfo udplite6_seq_afinfo = {
-       .family         = AF_INET6,
-       .udp_table      = &udplite_table,
-};
-
-static int __net_init udplite6_proc_init_net(struct net *net)
-{
-       if (!proc_create_net_data("udplite6", 0444, net->proc_net,
-                       &udp6_seq_ops, sizeof(struct udp_iter_state),
-                       &udplite6_seq_afinfo))
-               return -ENOMEM;
-       return 0;
-}
-
-static void __net_exit udplite6_proc_exit_net(struct net *net)
-{
-       remove_proc_entry("udplite6", net->proc_net);
-}
-
-static struct pernet_operations udplite6_net_ops = {
-       .init = udplite6_proc_init_net,
-       .exit = udplite6_proc_exit_net,
-};
-
-int __init udplite6_proc_init(void)
-{
-       return register_pernet_subsys(&udplite6_net_ops);
-}
-
-void udplite6_proc_exit(void)
-{
-       unregister_pernet_subsys(&udplite6_net_ops);
-}
-#endif
index d70db367e358db2b00922b747ae14a471e899c1d..e5880116e0874ccdde52049c3376f38e37129718 100644 (file)
@@ -16,8 +16,6 @@
 #include <net/udp.h>
 #include "ar-internal.h"
 
-extern int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len);
-
 ssize_t do_udp_sendmsg(struct socket *socket, struct msghdr *msg, size_t len)
 {
        struct sockaddr *sa = msg->msg_name;