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;
}