aboutsummaryrefslogtreecommitdiff
path: root/sys/net
diff options
context:
space:
mode:
authorBruce M Simpson <bms@FreeBSD.org>2014-04-10 18:43:02 +0000
committerBruce M Simpson <bms@FreeBSD.org>2014-04-10 18:43:02 +0000
commitd565e5f2063e066fd1677e3695f8f545b4a89b67 (patch)
treee0fdd08ec2dfdc87cfa5928c967a2216ab27623d /sys/net
parent606b39f1e009936fb997ab1e056693da74376dfe (diff)
downloadsrc-d565e5f2063e066fd1677e3695f8f545b4a89b67.tar.gz
src-d565e5f2063e066fd1677e3695f8f545b4a89b67.zip
In if_freemulti(), relax the paranoid KASSERT() on ifma->ifma_protospec.
This KASSERT() existed as a sanity check that upper layers in the network stack (e.g. inet, inet6) had released their reference to the underlying driver's multicast memberships (ifmultiaddr{}). However it assumes the lifecycle of the driver membership corresponds to the lifecycle of the network layer membership. In the submitter's case, ieee80211_ioctl_updatemulti() attempts to reprogram the (parent, physical) ifnet{} memberships in response to a change in membership on the (child, virtual) VAP ifnet, using a batched update mechanism. These updates happen independently from the network layer, causing a "false negative" assertion failure. There are possibly other use cases where this KASSERT() may be triggered by other networking stack activity (e.g. where a nesting relationship exists between multiple ifnet{} instances). This suggests that further review of FreeBSD's approach to nested ifnet relationships is needed. MFC after: 6 weeks Submitted by: adrian@
Notes
Notes: svn path=/head/; revision=264323
Diffstat (limited to 'sys/net')
-rw-r--r--sys/net/if.c2
1 files changed, 0 insertions, 2 deletions
diff --git a/sys/net/if.c b/sys/net/if.c
index cef3dd35f6a9..d3d6ac917f8e 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -2937,8 +2937,6 @@ if_freemulti(struct ifmultiaddr *ifma)
KASSERT(ifma->ifma_refcount == 0, ("if_freemulti: refcount %d",
ifma->ifma_refcount));
- KASSERT(ifma->ifma_protospec == NULL,
- ("if_freemulti: protospec not NULL"));
if (ifma->ifma_lladdr != NULL)
free(ifma->ifma_lladdr, M_IFMADDR);