aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet6
diff options
context:
space:
mode:
authorMatt Macy <mmacy@FreeBSD.org>2018-05-05 22:40:40 +0000
committerMatt Macy <mmacy@FreeBSD.org>2018-05-05 22:40:40 +0000
commit28c001002a3e0c772c47c00742e414677c5f8c8e (patch)
treee1bafd963f12fd686fd05672c034bd85ee9406d1 /sys/netinet6
parentb6f2c452cb879f88f392e0d48582e2239c6e51bb (diff)
Notes
Diffstat (limited to 'sys/netinet6')
-rw-r--r--sys/netinet6/in6_mcast.c13
-rw-r--r--sys/netinet6/in6_var.h3
2 files changed, 14 insertions, 2 deletions
diff --git a/sys/netinet6/in6_mcast.c b/sys/netinet6/in6_mcast.c
index fe8da6685770..023e3a751327 100644
--- a/sys/netinet6/in6_mcast.c
+++ b/sys/netinet6/in6_mcast.c
@@ -1585,13 +1585,20 @@ in6p_findmoptions(struct inpcb *inp)
* SMPng: NOTE: assumes INP write lock is held.
*/
void
-ip6_freemoptions(struct ip6_moptions *imo)
+ip6_freemoptions(struct ip6_moptions *imo, struct inpcbinfo *pcbinfo)
{
struct in6_mfilter *imf;
size_t idx, nmships;
+ int wlock;
if (imo == NULL)
return;
+ INP_INFO_LOCK_ASSERT(pcbinfo);
+ wlock = INP_INFO_WLOCKED(pcbinfo);
+ if (wlock)
+ INP_INFO_WUNLOCK(pcbinfo);
+ else
+ INP_INFO_RUNLOCK(pcbinfo);
nmships = imo->im6o_num_memberships;
for (idx = 0; idx < nmships; ++idx) {
@@ -1608,6 +1615,10 @@ ip6_freemoptions(struct ip6_moptions *imo)
free(imo->im6o_mfilters, M_IN6MFILTER);
free(imo->im6o_membership, M_IP6MOPTS);
free(imo, M_IP6MOPTS);
+ if (wlock)
+ INP_INFO_WLOCK(pcbinfo);
+ else
+ INP_INFO_RLOCK(pcbinfo);
}
/*
diff --git a/sys/netinet6/in6_var.h b/sys/netinet6/in6_var.h
index 6f1c6dbcdd02..7a98fc7c0c7c 100644
--- a/sys/netinet6/in6_var.h
+++ b/sys/netinet6/in6_var.h
@@ -807,6 +807,7 @@ in6m_rele_locked(struct in6_multi_head *inmh, struct in6_multi *inm)
struct ip6_moptions;
struct sockopt;
+struct inpcbinfo;
/* Multicast KPIs. */
int im6o_mc_filter(const struct ip6_moptions *, const struct ifnet *,
@@ -823,7 +824,7 @@ void in6m_print(const struct in6_multi *);
int in6m_record_source(struct in6_multi *, const struct in6_addr *);
void in6m_release_deferred(struct in6_multi *);
void in6m_release_list_deferred(struct in6_multi_head *);
-void ip6_freemoptions(struct ip6_moptions *);
+void ip6_freemoptions(struct ip6_moptions *, struct inpcbinfo *);
int ip6_getmoptions(struct inpcb *, struct sockopt *);
int ip6_setmoptions(struct inpcb *, struct sockopt *);