hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/net/ipv6/mcast.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * Multicast support for IPv6
34 * Linux INET6 implementation
....@@ -6,11 +7,6 @@
67 * Pedro Roque <roque@di.fc.ul.pt>
78 *
89 * Based on linux/ipv4/igmp.c and linux/ipv4/ip_sockglue.c
9
- *
10
- * This program is free software; you can redistribute it and/or
11
- * modify it under the terms of the GNU General Public License
12
- * as published by the Free Software Foundation; either version
13
- * 2 of the License, or (at your option) any later version.
1410 */
1511
1612 /* Changes:
....@@ -461,7 +457,8 @@
461457 return err;
462458 }
463459
464
-int ip6_mc_msfilter(struct sock *sk, struct group_filter *gsf)
460
+int ip6_mc_msfilter(struct sock *sk, struct group_filter *gsf,
461
+ struct sockaddr_storage *list)
465462 {
466463 const struct in6_addr *group;
467464 struct ipv6_mc_socklist *pmc;
....@@ -513,10 +510,10 @@
513510 goto done;
514511 }
515512 newpsl->sl_max = newpsl->sl_count = gsf->gf_numsrc;
516
- for (i = 0; i < newpsl->sl_count; ++i) {
513
+ for (i = 0; i < newpsl->sl_count; ++i, ++list) {
517514 struct sockaddr_in6 *psin6;
518515
519
- psin6 = (struct sockaddr_in6 *)&gsf->gf_slist[i];
516
+ psin6 = (struct sockaddr_in6 *)list;
520517 newpsl->sl_addr[i] = psin6->sin6_addr;
521518 }
522519 err = ip6_mc_add_src(idev, group, gsf->gf_fmode,
....@@ -551,7 +548,7 @@
551548 }
552549
553550 int ip6_mc_msfget(struct sock *sk, struct group_filter *gsf,
554
- struct group_filter __user *optval, int __user *optlen)
551
+ struct sockaddr_storage *p)
555552 {
556553 int err, i, count, copycount;
557554 const struct in6_addr *group;
....@@ -596,14 +593,10 @@
596593
597594 copycount = count < gsf->gf_numsrc ? count : gsf->gf_numsrc;
598595 gsf->gf_numsrc = count;
599
- if (put_user(GROUP_FILTER_SIZE(copycount), optlen) ||
600
- copy_to_user(optval, gsf, GROUP_FILTER_SIZE(0))) {
601
- return -EFAULT;
602
- }
603596 /* changes to psl require the socket lock, and a write lock
604597 * on pmc->sflock. We have the socket lock so reading here is safe.
605598 */
606
- for (i = 0; i < copycount; i++) {
599
+ for (i = 0; i < copycount; i++, p++) {
607600 struct sockaddr_in6 *psin6;
608601 struct sockaddr_storage ss;
609602
....@@ -611,7 +604,7 @@
611604 memset(&ss, 0, sizeof(ss));
612605 psin6->sin6_family = AF_INET6;
613606 psin6->sin6_addr = psl->sl_addr[i];
614
- if (copy_to_user(&optval->gf_slist[i], &ss, sizeof(ss)))
607
+ if (copy_to_user(p, &ss, sizeof(ss)))
615608 return -EFAULT;
616609 }
617610 return 0;
....@@ -636,7 +629,7 @@
636629 }
637630 if (!mc) {
638631 rcu_read_unlock();
639
- return true;
632
+ return np->mc_all;
640633 }
641634 read_lock(&mc->sflock);
642635 psl = mc->sflist;
....@@ -941,6 +934,7 @@
941934 {
942935 return __ipv6_dev_mc_inc(dev, addr, MCAST_EXCLUDE);
943936 }
937
+EXPORT_SYMBOL(ipv6_dev_mc_inc);
944938
945939 /*
946940 * device multicast group del
....@@ -988,6 +982,7 @@
988982
989983 return err;
990984 }
985
+EXPORT_SYMBOL(ipv6_dev_mc_dec);
991986
992987 /*
993988 * check if the interface/address pair is valid