mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
ipv6: Retire UDP-Lite.
As announced in commitbe28c14ac8("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 commited472b0c87("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>
This commit is contained in:
parent
86a41d957b
commit
62554a51c5
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 @@ static int __init inet6_init(void)
|
|||
tcpv6_fail:
|
||||
udpv6_offload_exit();
|
||||
udpv6_offload_fail:
|
||||
udplitev6_exit();
|
||||
udplitev6_fail:
|
||||
udpv6_exit();
|
||||
udpv6_fail:
|
||||
ipv6_frag_exit();
|
||||
|
|
@ -1271,8 +1254,6 @@ static int __init inet6_init(void)
|
|||
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 @@ static int __init inet6_init(void)
|
|||
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:
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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,7 +702,7 @@ static struct sock *__udp6_lib_err_encap(struct net *net,
|
|||
return sk;
|
||||
}
|
||||
|
||||
int __udp6_lib_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
|
||||
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)
|
||||
{
|
||||
|
|
@ -1115,7 +1117,7 @@ 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,
|
||||
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;
|
||||
|
|
@ -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,7 +1894,7 @@ 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,
|
||||
static int udpv6_getsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int __user *optlen)
|
||||
{
|
||||
if (level == SOL_UDP || level == SOL_UDPLITE)
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
@ -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
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user