aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/mcast.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv6/mcast.c')
-rw-r--r--net/ipv6/mcast.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c
index 6e871afbb2c7..3b114e3fa2f8 100644
--- a/net/ipv6/mcast.c
+++ b/net/ipv6/mcast.c
@@ -28,7 +28,6 @@
28 * - MLDv2 support 28 * - MLDv2 support
29 */ 29 */
30 30
31#include <linux/config.h>
32#include <linux/module.h> 31#include <linux/module.h>
33#include <linux/errno.h> 32#include <linux/errno.h>
34#include <linux/types.h> 33#include <linux/types.h>
@@ -172,7 +171,7 @@ static int ip6_mc_leave_src(struct sock *sk, struct ipv6_mc_socklist *iml,
172 171
173#define IPV6_MLD_MAX_MSF 64 172#define IPV6_MLD_MAX_MSF 64
174 173
175int sysctl_mld_max_msf = IPV6_MLD_MAX_MSF; 174int sysctl_mld_max_msf __read_mostly = IPV6_MLD_MAX_MSF;
176 175
177/* 176/*
178 * socket join on multicast group 177 * socket join on multicast group
@@ -269,13 +268,14 @@ int ipv6_sock_mc_drop(struct sock *sk, int ifindex, struct in6_addr *addr)
269 if ((dev = dev_get_by_index(mc_lst->ifindex)) != NULL) { 268 if ((dev = dev_get_by_index(mc_lst->ifindex)) != NULL) {
270 struct inet6_dev *idev = in6_dev_get(dev); 269 struct inet6_dev *idev = in6_dev_get(dev);
271 270
271 (void) ip6_mc_leave_src(sk, mc_lst, idev);
272 if (idev) { 272 if (idev) {
273 (void) ip6_mc_leave_src(sk,mc_lst,idev);
274 __ipv6_dev_mc_dec(idev, &mc_lst->addr); 273 __ipv6_dev_mc_dec(idev, &mc_lst->addr);
275 in6_dev_put(idev); 274 in6_dev_put(idev);
276 } 275 }
277 dev_put(dev); 276 dev_put(dev);
278 } 277 } else
278 (void) ip6_mc_leave_src(sk, mc_lst, NULL);
279 sock_kfree_s(sk, mc_lst, sizeof(*mc_lst)); 279 sock_kfree_s(sk, mc_lst, sizeof(*mc_lst));
280 return 0; 280 return 0;
281 } 281 }
@@ -335,13 +335,14 @@ void ipv6_sock_mc_close(struct sock *sk)
335 if (dev) { 335 if (dev) {
336 struct inet6_dev *idev = in6_dev_get(dev); 336 struct inet6_dev *idev = in6_dev_get(dev);
337 337
338 (void) ip6_mc_leave_src(sk, mc_lst, idev);
338 if (idev) { 339 if (idev) {
339 (void) ip6_mc_leave_src(sk, mc_lst, idev);
340 __ipv6_dev_mc_dec(idev, &mc_lst->addr); 340 __ipv6_dev_mc_dec(idev, &mc_lst->addr);
341 in6_dev_put(idev); 341 in6_dev_put(idev);
342 } 342 }
343 dev_put(dev); 343 dev_put(dev);
344 } 344 } else
345 (void) ip6_mc_leave_src(sk, mc_lst, NULL);
345 346
346 sock_kfree_s(sk, mc_lst, sizeof(*mc_lst)); 347 sock_kfree_s(sk, mc_lst, sizeof(*mc_lst));
347 348