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