diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv4/devinet.c | 4 | ||||
-rw-r--r-- | net/ipv4/igmp.c | 41 | ||||
-rw-r--r-- | net/ipv4/ip_sockglue.c | 21 | ||||
-rw-r--r-- | net/ipv6/addrconf.c | 4 | ||||
-rw-r--r-- | net/ipv6/ipv6_sockglue.c | 21 | ||||
-rw-r--r-- | net/ipv6/mcast.c | 30 | ||||
-rw-r--r-- | net/netfilter/ipvs/ip_vs_sync.c | 2 | ||||
-rw-r--r-- | net/tipc/udp_media.c | 4 |
8 files changed, 47 insertions, 80 deletions
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 375dc71b9a64..975ee5e30c64 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c | |||
@@ -560,9 +560,9 @@ static int ip_mc_config(struct sock *sk, bool join, const struct in_ifaddr *ifa) | |||
560 | 560 | ||
561 | lock_sock(sk); | 561 | lock_sock(sk); |
562 | if (join) | 562 | if (join) |
563 | ret = __ip_mc_join_group(sk, &mreq); | 563 | ret = ip_mc_join_group(sk, &mreq); |
564 | else | 564 | else |
565 | ret = __ip_mc_leave_group(sk, &mreq); | 565 | ret = ip_mc_leave_group(sk, &mreq); |
566 | release_sock(sk); | 566 | release_sock(sk); |
567 | 567 | ||
568 | return ret; | 568 | return ret; |
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c index 5cb1ef4ce292..ad3f866085de 100644 --- a/net/ipv4/igmp.c +++ b/net/ipv4/igmp.c | |||
@@ -1850,7 +1850,10 @@ static void ip_mc_clear_src(struct ip_mc_list *pmc) | |||
1850 | pmc->sfcount[MCAST_EXCLUDE] = 1; | 1850 | pmc->sfcount[MCAST_EXCLUDE] = 1; |
1851 | } | 1851 | } |
1852 | 1852 | ||
1853 | int __ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr) | 1853 | /* Join a multicast group |
1854 | */ | ||
1855 | |||
1856 | int ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr) | ||
1854 | { | 1857 | { |
1855 | __be32 addr = imr->imr_multiaddr.s_addr; | 1858 | __be32 addr = imr->imr_multiaddr.s_addr; |
1856 | struct ip_mc_socklist *iml, *i; | 1859 | struct ip_mc_socklist *iml, *i; |
@@ -1898,20 +1901,6 @@ int __ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr) | |||
1898 | done: | 1901 | done: |
1899 | return err; | 1902 | return err; |
1900 | } | 1903 | } |
1901 | EXPORT_SYMBOL(__ip_mc_join_group); | ||
1902 | |||
1903 | /* Join a multicast group | ||
1904 | */ | ||
1905 | int ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr) | ||
1906 | { | ||
1907 | int ret; | ||
1908 | |||
1909 | rtnl_lock(); | ||
1910 | ret = __ip_mc_join_group(sk, imr); | ||
1911 | rtnl_unlock(); | ||
1912 | |||
1913 | return ret; | ||
1914 | } | ||
1915 | EXPORT_SYMBOL(ip_mc_join_group); | 1904 | EXPORT_SYMBOL(ip_mc_join_group); |
1916 | 1905 | ||
1917 | static int ip_mc_leave_src(struct sock *sk, struct ip_mc_socklist *iml, | 1906 | static int ip_mc_leave_src(struct sock *sk, struct ip_mc_socklist *iml, |
@@ -1934,7 +1923,7 @@ static int ip_mc_leave_src(struct sock *sk, struct ip_mc_socklist *iml, | |||
1934 | return err; | 1923 | return err; |
1935 | } | 1924 | } |
1936 | 1925 | ||
1937 | int __ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr) | 1926 | int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr) |
1938 | { | 1927 | { |
1939 | struct inet_sock *inet = inet_sk(sk); | 1928 | struct inet_sock *inet = inet_sk(sk); |
1940 | struct ip_mc_socklist *iml; | 1929 | struct ip_mc_socklist *iml; |
@@ -1979,18 +1968,6 @@ int __ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr) | |||
1979 | out: | 1968 | out: |
1980 | return ret; | 1969 | return ret; |
1981 | } | 1970 | } |
1982 | EXPORT_SYMBOL(__ip_mc_leave_group); | ||
1983 | |||
1984 | int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr) | ||
1985 | { | ||
1986 | int ret; | ||
1987 | |||
1988 | rtnl_lock(); | ||
1989 | ret = __ip_mc_leave_group(sk, imr); | ||
1990 | rtnl_unlock(); | ||
1991 | |||
1992 | return ret; | ||
1993 | } | ||
1994 | EXPORT_SYMBOL(ip_mc_leave_group); | 1971 | EXPORT_SYMBOL(ip_mc_leave_group); |
1995 | 1972 | ||
1996 | int ip_mc_source(int add, int omode, struct sock *sk, struct | 1973 | int ip_mc_source(int add, int omode, struct sock *sk, struct |
@@ -2010,7 +1987,7 @@ int ip_mc_source(int add, int omode, struct sock *sk, struct | |||
2010 | if (!ipv4_is_multicast(addr)) | 1987 | if (!ipv4_is_multicast(addr)) |
2011 | return -EINVAL; | 1988 | return -EINVAL; |
2012 | 1989 | ||
2013 | rtnl_lock(); | 1990 | ASSERT_RTNL(); |
2014 | 1991 | ||
2015 | imr.imr_multiaddr.s_addr = mreqs->imr_multiaddr; | 1992 | imr.imr_multiaddr.s_addr = mreqs->imr_multiaddr; |
2016 | imr.imr_address.s_addr = mreqs->imr_interface; | 1993 | imr.imr_address.s_addr = mreqs->imr_interface; |
@@ -2124,9 +2101,8 @@ int ip_mc_source(int add, int omode, struct sock *sk, struct | |||
2124 | ip_mc_add_src(in_dev, &mreqs->imr_multiaddr, omode, 1, | 2101 | ip_mc_add_src(in_dev, &mreqs->imr_multiaddr, omode, 1, |
2125 | &mreqs->imr_sourceaddr, 1); | 2102 | &mreqs->imr_sourceaddr, 1); |
2126 | done: | 2103 | done: |
2127 | rtnl_unlock(); | ||
2128 | if (leavegroup) | 2104 | if (leavegroup) |
2129 | return ip_mc_leave_group(sk, &imr); | 2105 | err = ip_mc_leave_group(sk, &imr); |
2130 | return err; | 2106 | return err; |
2131 | } | 2107 | } |
2132 | 2108 | ||
@@ -2148,7 +2124,7 @@ int ip_mc_msfilter(struct sock *sk, struct ip_msfilter *msf, int ifindex) | |||
2148 | msf->imsf_fmode != MCAST_EXCLUDE) | 2124 | msf->imsf_fmode != MCAST_EXCLUDE) |
2149 | return -EINVAL; | 2125 | return -EINVAL; |
2150 | 2126 | ||
2151 | rtnl_lock(); | 2127 | ASSERT_RTNL(); |
2152 | 2128 | ||
2153 | imr.imr_multiaddr.s_addr = msf->imsf_multiaddr; | 2129 | imr.imr_multiaddr.s_addr = msf->imsf_multiaddr; |
2154 | imr.imr_address.s_addr = msf->imsf_interface; | 2130 | imr.imr_address.s_addr = msf->imsf_interface; |
@@ -2210,7 +2186,6 @@ int ip_mc_msfilter(struct sock *sk, struct ip_msfilter *msf, int ifindex) | |||
2210 | pmc->sfmode = msf->imsf_fmode; | 2186 | pmc->sfmode = msf->imsf_fmode; |
2211 | err = 0; | 2187 | err = 0; |
2212 | done: | 2188 | done: |
2213 | rtnl_unlock(); | ||
2214 | if (leavegroup) | 2189 | if (leavegroup) |
2215 | err = ip_mc_leave_group(sk, &imr); | 2190 | err = ip_mc_leave_group(sk, &imr); |
2216 | return err; | 2191 | return err; |
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index 5171709199f4..f6a0d54b308a 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c | |||
@@ -541,9 +541,18 @@ static bool setsockopt_needs_rtnl(int optname) | |||
541 | switch (optname) { | 541 | switch (optname) { |
542 | case IP_ADD_MEMBERSHIP: | 542 | case IP_ADD_MEMBERSHIP: |
543 | case IP_ADD_SOURCE_MEMBERSHIP: | 543 | case IP_ADD_SOURCE_MEMBERSHIP: |
544 | case IP_BLOCK_SOURCE: | ||
544 | case IP_DROP_MEMBERSHIP: | 545 | case IP_DROP_MEMBERSHIP: |
546 | case IP_DROP_SOURCE_MEMBERSHIP: | ||
547 | case IP_MSFILTER: | ||
548 | case IP_UNBLOCK_SOURCE: | ||
549 | case MCAST_BLOCK_SOURCE: | ||
550 | case MCAST_MSFILTER: | ||
545 | case MCAST_JOIN_GROUP: | 551 | case MCAST_JOIN_GROUP: |
552 | case MCAST_JOIN_SOURCE_GROUP: | ||
546 | case MCAST_LEAVE_GROUP: | 553 | case MCAST_LEAVE_GROUP: |
554 | case MCAST_LEAVE_SOURCE_GROUP: | ||
555 | case MCAST_UNBLOCK_SOURCE: | ||
547 | return true; | 556 | return true; |
548 | } | 557 | } |
549 | return false; | 558 | return false; |
@@ -861,9 +870,9 @@ static int do_ip_setsockopt(struct sock *sk, int level, | |||
861 | } | 870 | } |
862 | 871 | ||
863 | if (optname == IP_ADD_MEMBERSHIP) | 872 | if (optname == IP_ADD_MEMBERSHIP) |
864 | err = __ip_mc_join_group(sk, &mreq); | 873 | err = ip_mc_join_group(sk, &mreq); |
865 | else | 874 | else |
866 | err = __ip_mc_leave_group(sk, &mreq); | 875 | err = ip_mc_leave_group(sk, &mreq); |
867 | break; | 876 | break; |
868 | } | 877 | } |
869 | case IP_MSFILTER: | 878 | case IP_MSFILTER: |
@@ -928,7 +937,7 @@ static int do_ip_setsockopt(struct sock *sk, int level, | |||
928 | mreq.imr_multiaddr.s_addr = mreqs.imr_multiaddr; | 937 | mreq.imr_multiaddr.s_addr = mreqs.imr_multiaddr; |
929 | mreq.imr_address.s_addr = mreqs.imr_interface; | 938 | mreq.imr_address.s_addr = mreqs.imr_interface; |
930 | mreq.imr_ifindex = 0; | 939 | mreq.imr_ifindex = 0; |
931 | err = __ip_mc_join_group(sk, &mreq); | 940 | err = ip_mc_join_group(sk, &mreq); |
932 | if (err && err != -EADDRINUSE) | 941 | if (err && err != -EADDRINUSE) |
933 | break; | 942 | break; |
934 | omode = MCAST_INCLUDE; | 943 | omode = MCAST_INCLUDE; |
@@ -960,9 +969,9 @@ static int do_ip_setsockopt(struct sock *sk, int level, | |||
960 | mreq.imr_ifindex = greq.gr_interface; | 969 | mreq.imr_ifindex = greq.gr_interface; |
961 | 970 | ||
962 | if (optname == MCAST_JOIN_GROUP) | 971 | if (optname == MCAST_JOIN_GROUP) |
963 | err = __ip_mc_join_group(sk, &mreq); | 972 | err = ip_mc_join_group(sk, &mreq); |
964 | else | 973 | else |
965 | err = __ip_mc_leave_group(sk, &mreq); | 974 | err = ip_mc_leave_group(sk, &mreq); |
966 | break; | 975 | break; |
967 | } | 976 | } |
968 | case MCAST_JOIN_SOURCE_GROUP: | 977 | case MCAST_JOIN_SOURCE_GROUP: |
@@ -1005,7 +1014,7 @@ static int do_ip_setsockopt(struct sock *sk, int level, | |||
1005 | mreq.imr_multiaddr = psin->sin_addr; | 1014 | mreq.imr_multiaddr = psin->sin_addr; |
1006 | mreq.imr_address.s_addr = 0; | 1015 | mreq.imr_address.s_addr = 0; |
1007 | mreq.imr_ifindex = greqs.gsr_interface; | 1016 | mreq.imr_ifindex = greqs.gsr_interface; |
1008 | err = __ip_mc_join_group(sk, &mreq); | 1017 | err = ip_mc_join_group(sk, &mreq); |
1009 | if (err && err != -EADDRINUSE) | 1018 | if (err && err != -EADDRINUSE) |
1010 | break; | 1019 | break; |
1011 | greqs.gsr_interface = mreq.imr_ifindex; | 1020 | greqs.gsr_interface = mreq.imr_ifindex; |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 88d2cf0cae52..158378e73f0a 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -2473,9 +2473,9 @@ static int ipv6_mc_config(struct sock *sk, bool join, | |||
2473 | 2473 | ||
2474 | lock_sock(sk); | 2474 | lock_sock(sk); |
2475 | if (join) | 2475 | if (join) |
2476 | ret = __ipv6_sock_mc_join(sk, ifindex, addr); | 2476 | ret = ipv6_sock_mc_join(sk, ifindex, addr); |
2477 | else | 2477 | else |
2478 | ret = __ipv6_sock_mc_drop(sk, ifindex, addr); | 2478 | ret = ipv6_sock_mc_drop(sk, ifindex, addr); |
2479 | release_sock(sk); | 2479 | release_sock(sk); |
2480 | 2480 | ||
2481 | return ret; | 2481 | return ret; |
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c index f2b731df8d77..cc5883791bac 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c | |||
@@ -124,6 +124,11 @@ static bool setsockopt_needs_rtnl(int optname) | |||
124 | case IPV6_DROP_MEMBERSHIP: | 124 | case IPV6_DROP_MEMBERSHIP: |
125 | case MCAST_JOIN_GROUP: | 125 | case MCAST_JOIN_GROUP: |
126 | case MCAST_LEAVE_GROUP: | 126 | case MCAST_LEAVE_GROUP: |
127 | case MCAST_JOIN_SOURCE_GROUP: | ||
128 | case MCAST_LEAVE_SOURCE_GROUP: | ||
129 | case MCAST_BLOCK_SOURCE: | ||
130 | case MCAST_UNBLOCK_SOURCE: | ||
131 | case MCAST_MSFILTER: | ||
127 | return true; | 132 | return true; |
128 | } | 133 | } |
129 | return false; | 134 | return false; |
@@ -597,9 +602,9 @@ done: | |||
597 | break; | 602 | break; |
598 | 603 | ||
599 | if (optname == IPV6_ADD_MEMBERSHIP) | 604 | if (optname == IPV6_ADD_MEMBERSHIP) |
600 | retv = __ipv6_sock_mc_join(sk, mreq.ipv6mr_ifindex, &mreq.ipv6mr_multiaddr); | 605 | retv = ipv6_sock_mc_join(sk, mreq.ipv6mr_ifindex, &mreq.ipv6mr_multiaddr); |
601 | else | 606 | else |
602 | retv = __ipv6_sock_mc_drop(sk, mreq.ipv6mr_ifindex, &mreq.ipv6mr_multiaddr); | 607 | retv = ipv6_sock_mc_drop(sk, mreq.ipv6mr_ifindex, &mreq.ipv6mr_multiaddr); |
603 | break; | 608 | break; |
604 | } | 609 | } |
605 | case IPV6_JOIN_ANYCAST: | 610 | case IPV6_JOIN_ANYCAST: |
@@ -638,11 +643,11 @@ done: | |||
638 | } | 643 | } |
639 | psin6 = (struct sockaddr_in6 *)&greq.gr_group; | 644 | psin6 = (struct sockaddr_in6 *)&greq.gr_group; |
640 | if (optname == MCAST_JOIN_GROUP) | 645 | if (optname == MCAST_JOIN_GROUP) |
641 | retv = __ipv6_sock_mc_join(sk, greq.gr_interface, | 646 | retv = ipv6_sock_mc_join(sk, greq.gr_interface, |
642 | &psin6->sin6_addr); | 647 | &psin6->sin6_addr); |
643 | else | 648 | else |
644 | retv = __ipv6_sock_mc_drop(sk, greq.gr_interface, | 649 | retv = ipv6_sock_mc_drop(sk, greq.gr_interface, |
645 | &psin6->sin6_addr); | 650 | &psin6->sin6_addr); |
646 | break; | 651 | break; |
647 | } | 652 | } |
648 | case MCAST_JOIN_SOURCE_GROUP: | 653 | case MCAST_JOIN_SOURCE_GROUP: |
@@ -674,8 +679,8 @@ done: | |||
674 | struct sockaddr_in6 *psin6; | 679 | struct sockaddr_in6 *psin6; |
675 | 680 | ||
676 | psin6 = (struct sockaddr_in6 *)&greqs.gsr_group; | 681 | psin6 = (struct sockaddr_in6 *)&greqs.gsr_group; |
677 | retv = __ipv6_sock_mc_join(sk, greqs.gsr_interface, | 682 | retv = ipv6_sock_mc_join(sk, greqs.gsr_interface, |
678 | &psin6->sin6_addr); | 683 | &psin6->sin6_addr); |
679 | /* prior join w/ different source is ok */ | 684 | /* prior join w/ different source is ok */ |
680 | if (retv && retv != -EADDRINUSE) | 685 | if (retv && retv != -EADDRINUSE) |
681 | break; | 686 | break; |
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c index 1dd1fedff9f4..cbb66fd3da6d 100644 --- a/net/ipv6/mcast.c +++ b/net/ipv6/mcast.c | |||
@@ -132,7 +132,7 @@ static int unsolicited_report_interval(struct inet6_dev *idev) | |||
132 | return iv > 0 ? iv : 1; | 132 | return iv > 0 ? iv : 1; |
133 | } | 133 | } |
134 | 134 | ||
135 | int __ipv6_sock_mc_join(struct sock *sk, int ifindex, const struct in6_addr *addr) | 135 | int ipv6_sock_mc_join(struct sock *sk, int ifindex, const struct in6_addr *addr) |
136 | { | 136 | { |
137 | struct net_device *dev = NULL; | 137 | struct net_device *dev = NULL; |
138 | struct ipv6_mc_socklist *mc_lst; | 138 | struct ipv6_mc_socklist *mc_lst; |
@@ -199,24 +199,12 @@ int __ipv6_sock_mc_join(struct sock *sk, int ifindex, const struct in6_addr *add | |||
199 | 199 | ||
200 | return 0; | 200 | return 0; |
201 | } | 201 | } |
202 | EXPORT_SYMBOL(__ipv6_sock_mc_join); | ||
203 | |||
204 | int ipv6_sock_mc_join(struct sock *sk, int ifindex, const struct in6_addr *addr) | ||
205 | { | ||
206 | int ret; | ||
207 | |||
208 | rtnl_lock(); | ||
209 | ret = __ipv6_sock_mc_join(sk, ifindex, addr); | ||
210 | rtnl_unlock(); | ||
211 | |||
212 | return ret; | ||
213 | } | ||
214 | EXPORT_SYMBOL(ipv6_sock_mc_join); | 202 | EXPORT_SYMBOL(ipv6_sock_mc_join); |
215 | 203 | ||
216 | /* | 204 | /* |
217 | * socket leave on multicast group | 205 | * socket leave on multicast group |
218 | */ | 206 | */ |
219 | int __ipv6_sock_mc_drop(struct sock *sk, int ifindex, const struct in6_addr *addr) | 207 | int ipv6_sock_mc_drop(struct sock *sk, int ifindex, const struct in6_addr *addr) |
220 | { | 208 | { |
221 | struct ipv6_pinfo *np = inet6_sk(sk); | 209 | struct ipv6_pinfo *np = inet6_sk(sk); |
222 | struct ipv6_mc_socklist *mc_lst; | 210 | struct ipv6_mc_socklist *mc_lst; |
@@ -255,18 +243,6 @@ int __ipv6_sock_mc_drop(struct sock *sk, int ifindex, const struct in6_addr *add | |||
255 | 243 | ||
256 | return -EADDRNOTAVAIL; | 244 | return -EADDRNOTAVAIL; |
257 | } | 245 | } |
258 | EXPORT_SYMBOL(__ipv6_sock_mc_drop); | ||
259 | |||
260 | int ipv6_sock_mc_drop(struct sock *sk, int ifindex, const struct in6_addr *addr) | ||
261 | { | ||
262 | int ret; | ||
263 | |||
264 | rtnl_lock(); | ||
265 | ret = __ipv6_sock_mc_drop(sk, ifindex, addr); | ||
266 | rtnl_unlock(); | ||
267 | |||
268 | return ret; | ||
269 | } | ||
270 | EXPORT_SYMBOL(ipv6_sock_mc_drop); | 246 | EXPORT_SYMBOL(ipv6_sock_mc_drop); |
271 | 247 | ||
272 | /* called with rcu_read_lock() */ | 248 | /* called with rcu_read_lock() */ |
@@ -460,7 +436,7 @@ done: | |||
460 | read_unlock_bh(&idev->lock); | 436 | read_unlock_bh(&idev->lock); |
461 | rcu_read_unlock(); | 437 | rcu_read_unlock(); |
462 | if (leavegroup) | 438 | if (leavegroup) |
463 | return ipv6_sock_mc_drop(sk, pgsr->gsr_interface, group); | 439 | err = ipv6_sock_mc_drop(sk, pgsr->gsr_interface, group); |
464 | return err; | 440 | return err; |
465 | } | 441 | } |
466 | 442 | ||
diff --git a/net/netfilter/ipvs/ip_vs_sync.c b/net/netfilter/ipvs/ip_vs_sync.c index 08d95559b6f7..19b9cce6c210 100644 --- a/net/netfilter/ipvs/ip_vs_sync.c +++ b/net/netfilter/ipvs/ip_vs_sync.c | |||
@@ -1405,9 +1405,11 @@ join_mcast_group(struct sock *sk, struct in_addr *addr, char *ifname) | |||
1405 | 1405 | ||
1406 | mreq.imr_ifindex = dev->ifindex; | 1406 | mreq.imr_ifindex = dev->ifindex; |
1407 | 1407 | ||
1408 | rtnl_lock(); | ||
1408 | lock_sock(sk); | 1409 | lock_sock(sk); |
1409 | ret = ip_mc_join_group(sk, &mreq); | 1410 | ret = ip_mc_join_group(sk, &mreq); |
1410 | release_sock(sk); | 1411 | release_sock(sk); |
1412 | rtnl_unlock(); | ||
1411 | 1413 | ||
1412 | return ret; | 1414 | return ret; |
1413 | } | 1415 | } |
diff --git a/net/tipc/udp_media.c b/net/tipc/udp_media.c index fc2fb11a354d..04836dd70c2b 100644 --- a/net/tipc/udp_media.c +++ b/net/tipc/udp_media.c | |||
@@ -246,11 +246,11 @@ static int enable_mcast(struct udp_bearer *ub, struct udp_media_addr *remote) | |||
246 | return 0; | 246 | return 0; |
247 | mreqn.imr_multiaddr = remote->ipv4; | 247 | mreqn.imr_multiaddr = remote->ipv4; |
248 | mreqn.imr_ifindex = ub->ifindex; | 248 | mreqn.imr_ifindex = ub->ifindex; |
249 | err = __ip_mc_join_group(sk, &mreqn); | 249 | err = ip_mc_join_group(sk, &mreqn); |
250 | } else { | 250 | } else { |
251 | if (!ipv6_addr_is_multicast(&remote->ipv6)) | 251 | if (!ipv6_addr_is_multicast(&remote->ipv6)) |
252 | return 0; | 252 | return 0; |
253 | err = __ipv6_sock_mc_join(sk, ub->ifindex, &remote->ipv6); | 253 | err = ipv6_sock_mc_join(sk, ub->ifindex, &remote->ipv6); |
254 | } | 254 | } |
255 | return err; | 255 | return err; |
256 | } | 256 | } |