hc
2024-05-10 748e4f3d702def1a4bff191e0cf93b6a05340f01
kernel/net/ipv6/af_inet6.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * PF_INET6 socket protocol family
34 * Linux INET6 implementation
....@@ -11,11 +12,6 @@
1112 * piggy, Karl Knutson : Socket protocol table
1213 * Hideaki YOSHIFUJI : sin6_scope_id support
1314 * Arnaldo Melo : check proc_net_create return, cleanups
14
- *
15
- * This program is free software; you can redistribute it and/or
16
- * modify it under the terms of the GNU General Public License
17
- * as published by the Free Software Foundation; either version
18
- * 2 of the License, or (at your option) any later version.
1915 */
2016
2117 #define pr_fmt(fmt) "IPv6: " fmt
....@@ -56,12 +52,16 @@
5652 #include <net/transp_v6.h>
5753 #include <net/ip6_route.h>
5854 #include <net/addrconf.h>
55
+#include <net/ipv6_stubs.h>
5956 #include <net/ndisc.h>
6057 #ifdef CONFIG_IPV6_TUNNEL
6158 #include <net/ip6_tunnel.h>
6259 #endif
6360 #include <net/calipso.h>
6461 #include <net/seg6.h>
62
+#include <net/rpl.h>
63
+#include <net/compat.h>
64
+#include <net/xfrm.h>
6565
6666 #include <linux/uaccess.h>
6767 #include <linux/mroute6.h>
....@@ -106,6 +106,13 @@
106106
107107 return (struct ipv6_pinfo *)(((u8 *)sk) + offset);
108108 }
109
+
110
+void inet6_sock_destruct(struct sock *sk)
111
+{
112
+ inet6_cleanup_sock(sk);
113
+ inet_sock_destruct(sk);
114
+}
115
+EXPORT_SYMBOL_GPL(inet6_sock_destruct);
109116
110117 static int inet6_create(struct net *net, struct socket *sock, int protocol,
111118 int kern)
....@@ -199,7 +206,7 @@
199206 inet->hdrincl = 1;
200207 }
201208
202
- sk->sk_destruct = inet_sock_destruct;
209
+ sk->sk_destruct = inet6_sock_destruct;
203210 sk->sk_family = PF_INET6;
204211 sk->sk_protocol = protocol;
205212
....@@ -209,8 +216,9 @@
209216 np->hop_limit = -1;
210217 np->mcast_hops = IPV6_DEFAULT_MCASTHOPS;
211218 np->mc_loop = 1;
219
+ np->mc_all = 1;
212220 np->pmtudisc = IPV6_PMTUDISC_WANT;
213
- np->repflow = net->ipv6.sysctl.flowlabel_reflect;
221
+ np->repflow = net->ipv6.sysctl.flowlabel_reflect & FLOWLABEL_REFLECT_ESTABLISHED;
214222 sk->sk_ipv6only = net->ipv6.sysctl.bindv6only;
215223
216224 /* Init the ipv4 part of the socket since we can have sockets
....@@ -224,7 +232,7 @@
224232 inet->mc_list = NULL;
225233 inet->rcv_tos = 0;
226234
227
- if (net->ipv4.sysctl_ip_no_pmtu_disc)
235
+ if (READ_ONCE(net->ipv4.sysctl_ip_no_pmtu_disc))
228236 inet->pmtudisc = IP_PMTUDISC_DONT;
229237 else
230238 inet->pmtudisc = IP_PMTUDISC_WANT;
....@@ -274,7 +282,7 @@
274282 }
275283
276284 static int __inet6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len,
277
- bool force_bind_address_no_port, bool with_lock)
285
+ u32 flags)
278286 {
279287 struct sockaddr_in6 *addr = (struct sockaddr_in6 *)uaddr;
280288 struct inet_sock *inet = inet_sk(sk);
....@@ -294,11 +302,13 @@
294302 return -EINVAL;
295303
296304 snum = ntohs(addr->sin6_port);
297
- if (snum && snum < inet_prot_sock(net) &&
305
+ if (snum && inet_is_local_unbindable_port(net, snum))
306
+ return -EPERM;
307
+ if (snum && inet_port_requires_bind_service(net, snum) &&
298308 !ns_capable(net->user_ns, CAP_NET_BIND_SERVICE))
299309 return -EACCES;
300310
301
- if (with_lock)
311
+ if (flags & BIND_WITH_LOCK)
302312 lock_sock(sk);
303313
304314 /* Check these errors (active socket, double bind). */
....@@ -401,18 +411,20 @@
401411
402412 /* Make sure we are allowed to bind here. */
403413 if (snum || !(inet->bind_address_no_port ||
404
- force_bind_address_no_port)) {
414
+ (flags & BIND_FORCE_ADDRESS_NO_PORT))) {
405415 if (sk->sk_prot->get_port(sk, snum)) {
406416 sk->sk_ipv6only = saved_ipv6only;
407417 inet_reset_saddr(sk);
408418 err = -EADDRINUSE;
409419 goto out;
410420 }
411
- err = BPF_CGROUP_RUN_PROG_INET6_POST_BIND(sk);
412
- if (err) {
413
- sk->sk_ipv6only = saved_ipv6only;
414
- inet_reset_saddr(sk);
415
- goto out;
421
+ if (!(flags & BIND_FROM_BPF)) {
422
+ err = BPF_CGROUP_RUN_PROG_INET6_POST_BIND(sk);
423
+ if (err) {
424
+ sk->sk_ipv6only = saved_ipv6only;
425
+ inet_reset_saddr(sk);
426
+ goto out;
427
+ }
416428 }
417429 }
418430
....@@ -424,7 +436,7 @@
424436 inet->inet_dport = 0;
425437 inet->inet_daddr = 0;
426438 out:
427
- if (with_lock)
439
+ if (flags & BIND_WITH_LOCK)
428440 release_sock(sk);
429441 return err;
430442 out_unlock:
....@@ -452,7 +464,7 @@
452464 if (err)
453465 return err;
454466
455
- return __inet6_bind(sk, uaddr, addr_len, false, true);
467
+ return __inet6_bind(sk, uaddr, addr_len, BIND_WITH_LOCK);
456468 }
457469 EXPORT_SYMBOL(inet6_bind);
458470
....@@ -482,12 +494,10 @@
482494 /* Release rx options */
483495
484496 skb = xchg(&np->pktoptions, NULL);
485
- if (skb)
486
- kfree_skb(skb);
497
+ kfree_skb(skb);
487498
488499 skb = xchg(&np->rxpmtu, NULL);
489
- if (skb)
490
- kfree_skb(skb);
500
+ kfree_skb(skb);
491501
492502 /* Free flowlabels */
493503 fl6_free_socklist(sk);
....@@ -502,12 +512,17 @@
502512 }
503513 EXPORT_SYMBOL_GPL(inet6_destroy_sock);
504514
515
+void inet6_cleanup_sock(struct sock *sk)
516
+{
517
+ inet6_destroy_sock(sk);
518
+}
519
+EXPORT_SYMBOL_GPL(inet6_cleanup_sock);
520
+
505521 /*
506522 * This does both peername and sockname.
507523 */
508
-
509524 int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
510
- int peer)
525
+ int peer)
511526 {
512527 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)uaddr;
513528 struct sock *sk = sock->sk;
....@@ -532,9 +547,13 @@
532547 sin->sin6_addr = np->saddr;
533548 else
534549 sin->sin6_addr = sk->sk_v6_rcv_saddr;
535
-
536550 sin->sin6_port = inet->inet_sport;
537551 }
552
+ if (cgroup_bpf_enabled)
553
+ BPF_CGROUP_RUN_SA_PROG_LOCK(sk, (struct sockaddr *)sin,
554
+ peer ? BPF_CGROUP_INET6_GETPEERNAME :
555
+ BPF_CGROUP_INET6_GETSOCKNAME,
556
+ NULL);
538557 sin->sin6_scope_id = ipv6_iface_scope_id(&sin->sin6_addr,
539558 sk->sk_bound_dev_if);
540559 return sizeof(*sin);
....@@ -543,27 +562,25 @@
543562
544563 int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
545564 {
565
+ void __user *argp = (void __user *)arg;
546566 struct sock *sk = sock->sk;
547567 struct net *net = sock_net(sk);
548568
549569 switch (cmd) {
550
- case SIOCGSTAMP:
551
- return sock_get_timestamp(sk, (struct timeval __user *)arg);
552
-
553
- case SIOCGSTAMPNS:
554
- return sock_get_timestampns(sk, (struct timespec __user *)arg);
555
-
556570 case SIOCADDRT:
557
- case SIOCDELRT:
571
+ case SIOCDELRT: {
572
+ struct in6_rtmsg rtmsg;
558573
559
- return ipv6_route_ioctl(net, cmd, (void __user *)arg);
560
-
574
+ if (copy_from_user(&rtmsg, argp, sizeof(rtmsg)))
575
+ return -EFAULT;
576
+ return ipv6_route_ioctl(net, cmd, &rtmsg);
577
+ }
561578 case SIOCSIFADDR:
562
- return addrconf_add_ifaddr(net, (void __user *) arg);
579
+ return addrconf_add_ifaddr(net, argp);
563580 case SIOCDIFADDR:
564
- return addrconf_del_ifaddr(net, (void __user *) arg);
581
+ return addrconf_del_ifaddr(net, argp);
565582 case SIOCSIFDSTADDR:
566
- return addrconf_set_dstaddr(net, (void __user *) arg);
583
+ return addrconf_set_dstaddr(net, argp);
567584 default:
568585 if (!sk->sk_prot->ioctl)
569586 return -ENOIOCTLCMD;
....@@ -573,6 +590,89 @@
573590 return 0;
574591 }
575592 EXPORT_SYMBOL(inet6_ioctl);
593
+
594
+#ifdef CONFIG_COMPAT
595
+struct compat_in6_rtmsg {
596
+ struct in6_addr rtmsg_dst;
597
+ struct in6_addr rtmsg_src;
598
+ struct in6_addr rtmsg_gateway;
599
+ u32 rtmsg_type;
600
+ u16 rtmsg_dst_len;
601
+ u16 rtmsg_src_len;
602
+ u32 rtmsg_metric;
603
+ u32 rtmsg_info;
604
+ u32 rtmsg_flags;
605
+ s32 rtmsg_ifindex;
606
+};
607
+
608
+static int inet6_compat_routing_ioctl(struct sock *sk, unsigned int cmd,
609
+ struct compat_in6_rtmsg __user *ur)
610
+{
611
+ struct in6_rtmsg rt;
612
+
613
+ if (copy_from_user(&rt.rtmsg_dst, &ur->rtmsg_dst,
614
+ 3 * sizeof(struct in6_addr)) ||
615
+ get_user(rt.rtmsg_type, &ur->rtmsg_type) ||
616
+ get_user(rt.rtmsg_dst_len, &ur->rtmsg_dst_len) ||
617
+ get_user(rt.rtmsg_src_len, &ur->rtmsg_src_len) ||
618
+ get_user(rt.rtmsg_metric, &ur->rtmsg_metric) ||
619
+ get_user(rt.rtmsg_info, &ur->rtmsg_info) ||
620
+ get_user(rt.rtmsg_flags, &ur->rtmsg_flags) ||
621
+ get_user(rt.rtmsg_ifindex, &ur->rtmsg_ifindex))
622
+ return -EFAULT;
623
+
624
+
625
+ return ipv6_route_ioctl(sock_net(sk), cmd, &rt);
626
+}
627
+
628
+int inet6_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
629
+{
630
+ void __user *argp = compat_ptr(arg);
631
+ struct sock *sk = sock->sk;
632
+
633
+ switch (cmd) {
634
+ case SIOCADDRT:
635
+ case SIOCDELRT:
636
+ return inet6_compat_routing_ioctl(sk, cmd, argp);
637
+ default:
638
+ return -ENOIOCTLCMD;
639
+ }
640
+}
641
+EXPORT_SYMBOL_GPL(inet6_compat_ioctl);
642
+#endif /* CONFIG_COMPAT */
643
+
644
+INDIRECT_CALLABLE_DECLARE(int udpv6_sendmsg(struct sock *, struct msghdr *,
645
+ size_t));
646
+int inet6_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
647
+{
648
+ struct sock *sk = sock->sk;
649
+
650
+ if (unlikely(inet_send_prepare(sk)))
651
+ return -EAGAIN;
652
+
653
+ return INDIRECT_CALL_2(sk->sk_prot->sendmsg, tcp_sendmsg, udpv6_sendmsg,
654
+ sk, msg, size);
655
+}
656
+
657
+INDIRECT_CALLABLE_DECLARE(int udpv6_recvmsg(struct sock *, struct msghdr *,
658
+ size_t, int, int, int *));
659
+int inet6_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
660
+ int flags)
661
+{
662
+ struct sock *sk = sock->sk;
663
+ int addr_len = 0;
664
+ int err;
665
+
666
+ if (likely(!(flags & MSG_ERRQUEUE)))
667
+ sock_rps_record_flow(sk);
668
+
669
+ err = INDIRECT_CALL_2(sk->sk_prot->recvmsg, tcp_recvmsg, udpv6_recvmsg,
670
+ sk, msg, size, flags & MSG_DONTWAIT,
671
+ flags & ~MSG_DONTWAIT, &addr_len);
672
+ if (err >= 0)
673
+ msg->msg_namelen = addr_len;
674
+ return err;
675
+}
576676
577677 const struct proto_ops inet6_stream_ops = {
578678 .family = PF_INET6,
....@@ -585,12 +685,13 @@
585685 .getname = inet6_getname,
586686 .poll = tcp_poll, /* ok */
587687 .ioctl = inet6_ioctl, /* must change */
688
+ .gettstamp = sock_gettstamp,
588689 .listen = inet_listen, /* ok */
589690 .shutdown = inet_shutdown, /* ok */
590691 .setsockopt = sock_common_setsockopt, /* ok */
591692 .getsockopt = sock_common_getsockopt, /* ok */
592
- .sendmsg = inet_sendmsg, /* ok */
593
- .recvmsg = inet_recvmsg, /* ok */
693
+ .sendmsg = inet6_sendmsg, /* retpoline's sake */
694
+ .recvmsg = inet6_recvmsg, /* retpoline's sake */
594695 #ifdef CONFIG_MMU
595696 .mmap = tcp_mmap,
596697 #endif
....@@ -601,8 +702,7 @@
601702 .read_sock = tcp_read_sock,
602703 .peek_len = tcp_peek_len,
603704 #ifdef CONFIG_COMPAT
604
- .compat_setsockopt = compat_sock_common_setsockopt,
605
- .compat_getsockopt = compat_sock_common_getsockopt,
705
+ .compat_ioctl = inet6_compat_ioctl,
606706 #endif
607707 .set_rcvlowat = tcp_set_rcvlowat,
608708 };
....@@ -618,18 +718,18 @@
618718 .getname = inet6_getname,
619719 .poll = udp_poll, /* ok */
620720 .ioctl = inet6_ioctl, /* must change */
721
+ .gettstamp = sock_gettstamp,
621722 .listen = sock_no_listen, /* ok */
622723 .shutdown = inet_shutdown, /* ok */
623724 .setsockopt = sock_common_setsockopt, /* ok */
624725 .getsockopt = sock_common_getsockopt, /* ok */
625
- .sendmsg = inet_sendmsg, /* ok */
626
- .recvmsg = inet_recvmsg, /* ok */
726
+ .sendmsg = inet6_sendmsg, /* retpoline's sake */
727
+ .recvmsg = inet6_recvmsg, /* retpoline's sake */
627728 .mmap = sock_no_mmap,
628729 .sendpage = sock_no_sendpage,
629730 .set_peek_off = sk_set_peek_off,
630731 #ifdef CONFIG_COMPAT
631
- .compat_setsockopt = compat_sock_common_setsockopt,
632
- .compat_getsockopt = compat_sock_common_getsockopt,
732
+ .compat_ioctl = inet6_compat_ioctl,
633733 #endif
634734 };
635735
....@@ -733,7 +833,7 @@
733833 fl6.fl6_dport = inet->inet_dport;
734834 fl6.fl6_sport = inet->inet_sport;
735835 fl6.flowi6_uid = sk->sk_uid;
736
- security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
836
+ security_sk_classify_flow(sk, flowi6_to_flowi_common(&fl6));
737837
738838 rcu_read_lock();
739839 final_p = fl6_update_dst(&fl6, rcu_dereference(np->opt),
....@@ -848,6 +948,17 @@
848948 net->ipv6.sysctl.bindv6only = 0;
849949 net->ipv6.sysctl.icmpv6_time = 1*HZ;
850950 net->ipv6.sysctl.icmpv6_echo_ignore_all = 0;
951
+ net->ipv6.sysctl.icmpv6_echo_ignore_multicast = 0;
952
+ net->ipv6.sysctl.icmpv6_echo_ignore_anycast = 0;
953
+
954
+ /* By default, rate limit error messages.
955
+ * Except for pmtu discovery, it would break it.
956
+ * proc_do_large_bitmap needs pointer to the bitmap.
957
+ */
958
+ bitmap_set(net->ipv6.sysctl.icmpv6_ratemask, 0, ICMPV6_ERRMSG_MAX + 1);
959
+ bitmap_clear(net->ipv6.sysctl.icmpv6_ratemask, ICMPV6_PKT_TOOBIG, 1);
960
+ net->ipv6.sysctl.icmpv6_ratemask_ptr = net->ipv6.sysctl.icmpv6_ratemask;
961
+
851962 net->ipv6.sysctl.flowlabel_consistency = 1;
852963 net->ipv6.sysctl.auto_flowlabels = IP6_DEFAULT_AUTO_FLOW_LABELS;
853964 net->ipv6.sysctl.idgen_retries = 3;
....@@ -901,22 +1012,41 @@
9011012 .exit = inet6_net_exit,
9021013 };
9031014
1015
+static int ipv6_route_input(struct sk_buff *skb)
1016
+{
1017
+ ip6_route_input(skb);
1018
+ return skb_dst(skb)->error;
1019
+}
1020
+
9041021 static const struct ipv6_stub ipv6_stub_impl = {
9051022 .ipv6_sock_mc_join = ipv6_sock_mc_join,
9061023 .ipv6_sock_mc_drop = ipv6_sock_mc_drop,
9071024 .ipv6_dst_lookup_flow = ip6_dst_lookup_flow,
1025
+ .ipv6_route_input = ipv6_route_input,
9081026 .fib6_get_table = fib6_get_table,
9091027 .fib6_table_lookup = fib6_table_lookup,
9101028 .fib6_lookup = fib6_lookup,
911
- .fib6_multipath_select = fib6_multipath_select,
1029
+ .fib6_select_path = fib6_select_path,
9121030 .ip6_mtu_from_fib6 = ip6_mtu_from_fib6,
1031
+ .fib6_nh_init = fib6_nh_init,
1032
+ .fib6_nh_release = fib6_nh_release,
1033
+ .fib6_update_sernum = fib6_update_sernum_stub,
1034
+ .fib6_rt_update = fib6_rt_update,
1035
+ .ip6_del_rt = ip6_del_rt,
9131036 .udpv6_encap_enable = udpv6_encap_enable,
9141037 .ndisc_send_na = ndisc_send_na,
1038
+#if IS_ENABLED(CONFIG_XFRM)
1039
+ .xfrm6_local_rxpmtu = xfrm6_local_rxpmtu,
1040
+ .xfrm6_udp_encap_rcv = xfrm6_udp_encap_rcv,
1041
+ .xfrm6_rcv_encap = xfrm6_rcv_encap,
1042
+#endif
9151043 .nd_tbl = &nd_tbl,
1044
+ .ipv6_fragment = ip6_fragment,
9161045 };
9171046
9181047 static const struct ipv6_bpf_stub ipv6_bpf_stub_impl = {
9191048 .inet6_bind = __inet6_bind,
1049
+ .udp6_lib_lookup = __udp6_lib_lookup,
9201050 };
9211051
9221052 static int __init inet6_init(void)
....@@ -1016,6 +1146,9 @@
10161146 err = ip6_flowlabel_init();
10171147 if (err)
10181148 goto ip6_flowlabel_fail;
1149
+ err = ipv6_anycast_init();
1150
+ if (err)
1151
+ goto ipv6_anycast_fail;
10191152 err = addrconf_init();
10201153 if (err)
10211154 goto addrconf_fail;
....@@ -1062,6 +1195,10 @@
10621195 if (err)
10631196 goto seg6_fail;
10641197
1198
+ err = rpl_init();
1199
+ if (err)
1200
+ goto rpl_fail;
1201
+
10651202 err = igmp6_late_init();
10661203 if (err)
10671204 goto igmp6_late_err;
....@@ -1084,6 +1221,8 @@
10841221 igmp6_late_cleanup();
10851222 #endif
10861223 igmp6_late_err:
1224
+ rpl_exit();
1225
+rpl_fail:
10871226 seg6_exit();
10881227 seg6_fail:
10891228 calipso_exit();
....@@ -1106,6 +1245,8 @@
11061245 ipv6_exthdrs_fail:
11071246 addrconf_cleanup();
11081247 addrconf_fail:
1248
+ ipv6_anycast_cleanup();
1249
+ipv6_anycast_fail:
11091250 ip6_flowlabel_cleanup();
11101251 ip6_flowlabel_fail:
11111252 ndisc_late_cleanup();