Module Name:    src
Committed By:   ozaki-r
Date:           Tue May 29 04:38:29 UTC 2018

Modified Files:
        src/sys/netinet6: in6_var.h mld6.c nd6.c

Log Message:
Make a deletion of in6m in nd6_rtrequest atomic


To generate a diff of this commit:
cvs rdiff -u -r1.99 -r1.100 src/sys/netinet6/in6_var.h
cvs rdiff -u -r1.96 -r1.97 src/sys/netinet6/mld6.c
cvs rdiff -u -r1.248 -r1.249 src/sys/netinet6/nd6.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/netinet6/in6_var.h
diff -u src/sys/netinet6/in6_var.h:1.99 src/sys/netinet6/in6_var.h:1.100
--- src/sys/netinet6/in6_var.h:1.99	Tue May 29 04:36:47 2018
+++ src/sys/netinet6/in6_var.h	Tue May 29 04:38:29 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: in6_var.h,v 1.99 2018/05/29 04:36:47 ozaki-r Exp $	*/
+/*	$NetBSD: in6_var.h,v 1.100 2018/05/29 04:38:29 ozaki-r Exp $	*/
 /*	$KAME: in6_var.h,v 1.81 2002/06/08 11:16:51 itojun Exp $	*/
 
 /*
@@ -692,6 +692,8 @@ struct	in6_multi *in6_addmulti(struct in
 	int *, int);
 void	in6_delmulti(struct in6_multi *);
 void	in6_delmulti_locked(struct in6_multi *);
+void	in6_lookup_and_delete_multi(const struct in6_addr *,
+	    const struct ifnet *);
 struct in6_multi_mship *in6_joingroup(struct ifnet *, struct in6_addr *,
 	int *, int);
 int	in6_leavegroup(struct in6_multi_mship *);

Index: src/sys/netinet6/mld6.c
diff -u src/sys/netinet6/mld6.c:1.96 src/sys/netinet6/mld6.c:1.97
--- src/sys/netinet6/mld6.c:1.96	Tue May 29 04:37:58 2018
+++ src/sys/netinet6/mld6.c	Tue May 29 04:38:29 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: mld6.c,v 1.96 2018/05/29 04:37:58 ozaki-r Exp $	*/
+/*	$NetBSD: mld6.c,v 1.97 2018/05/29 04:38:29 ozaki-r Exp $	*/
 /*	$KAME: mld6.c,v 1.25 2001/01/16 14:14:18 itojun Exp $	*/
 
 /*
@@ -102,7 +102,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mld6.c,v 1.96 2018/05/29 04:37:58 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mld6.c,v 1.97 2018/05/29 04:38:29 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -861,6 +861,19 @@ in6_lookup_multi(const struct in6_addr *
 	return in6m;
 }
 
+void
+in6_lookup_and_delete_multi(const struct in6_addr *addr,
+    const struct ifnet *ifp)
+{
+	struct in6_multi *in6m;
+
+	rw_enter(&in6_multilock, RW_WRITER);
+	in6m = in6_lookup_multi(addr, ifp);
+	if (in6m != NULL)
+		in6_delmulti_locked(in6m);
+	rw_exit(&in6_multilock);
+}
+
 bool
 in6_multi_group(const struct in6_addr *addr, const struct ifnet *ifp)
 {

Index: src/sys/netinet6/nd6.c
diff -u src/sys/netinet6/nd6.c:1.248 src/sys/netinet6/nd6.c:1.249
--- src/sys/netinet6/nd6.c:1.248	Tue May  1 07:21:39 2018
+++ src/sys/netinet6/nd6.c	Tue May 29 04:38:29 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: nd6.c,v 1.248 2018/05/01 07:21:39 maxv Exp $	*/
+/*	$NetBSD: nd6.c,v 1.249 2018/05/29 04:38:29 ozaki-r Exp $	*/
 /*	$KAME: nd6.c,v 1.279 2002/06/08 11:16:51 itojun Exp $	*/
 
 /*
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nd6.c,v 1.248 2018/05/01 07:21:39 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nd6.c,v 1.249 2018/05/29 04:38:29 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_net_mpsafe.h"
@@ -1606,18 +1606,14 @@ nd6_rtrequest(int req, struct rtentry *r
 		if ((rt->rt_flags & RTF_ANNOUNCE) != 0 &&
 		    (ifp->if_flags & IFF_MULTICAST) != 0) {
 			struct in6_addr llsol;
-			struct in6_multi *in6m;
 
 			llsol = satocsin6(rt_getkey(rt))->sin6_addr;
 			llsol.s6_addr32[0] = htonl(0xff020000);
 			llsol.s6_addr32[1] = 0;
 			llsol.s6_addr32[2] = htonl(1);
 			llsol.s6_addr8[12] = 0xff;
-			if (in6_setscope(&llsol, ifp, NULL) == 0) {
-				in6m = in6_lookup_multi(&llsol, ifp);
-				if (in6m)
-					in6_delmulti(in6m);
-			}
+			if (in6_setscope(&llsol, ifp, NULL) == 0)
+				in6_lookup_and_delete_multi(&llsol, ifp);
 		}
 		break;
 	}

Reply via email to