DF-0692 / fix.diff
diff --git a/sys/netinet6/mld6_var.h b/sys/netinet6/mld6_var.h --- a/sys/netinet6/mld6_var.h +++ b/sys/netinet6/mld6_var.h @@ -51,6 +51,7 @@ void mld6_input(struct mbuf *, int); void mld6_start_listening(struct in6_multi *); void mld6_stop_listening(struct in6_multi *); +extern struct lwkt_token mld6_token; void mld6_fasttimeo(void); #endif /* _KERNEL */ diff --git a/sys/netinet6/mld6.c b/sys/netinet6/mld6.c --- a/sys/netinet6/mld6.c +++ b/sys/netinet6/mld6.c @@ -107,7 +107,7 @@ static void mld6_sendpkt(struct in6_multi *, int, const struct in6_addr *); -static struct lwkt_token mld6_token = LWKT_TOKEN_INITIALIZER(mp_token); +struct lwkt_token mld6_token = LWKT_TOKEN_INITIALIZER(mp_token); void diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c --- a/sys/netinet6/in6.c +++ b/sys/netinet6/in6.c @@ -1743,7 +1743,9 @@ in6m->in6m_ifp = ifp; in6m->in6m_ifma = ifma; ifma->ifma_protospec = in6m; + lwkt_gettoken(&mld6_token); LIST_INSERT_HEAD(&in6_multihead, in6m, in6m_entry); + lwkt_reltoken(&mld6_token); /* * Let MLD6 know that we have joined a new IP6 multicast @@ -1770,9 +1772,11 @@ * that we are leaving the multicast group. */ mld6_stop_listening(in6m); + lwkt_gettoken(&mld6_token); ifma->ifma_protospec = NULL; LIST_REMOVE(in6m, in6m_entry); kfree(in6m, M_IPMADDR); + lwkt_reltoken(&mld6_token); } /* XXX - should be separate API for when we have an ifma? */ if_delmulti(ifma->ifma_ifp, ifma->ifma_addr); |