svn commit: r245098 - head/sys/net80211
Adrian Chadd
adrian at FreeBSD.org
Sun Jan 6 04:40:08 UTC 2013
Author: adrian
Date: Sun Jan 6 04:40:07 2013
New Revision: 245098
URL: http://svnweb.freebsd.org/changeset/base/245098
Log:
Handle ps-poll data frame if_transmit() failure.
If the data frame transmission failures, it may have a node reference
that needs cleaning up.
If the frame is marked as M_ENCAP then it should treat recvif as a node
reference and clear it.
Now - since the mbuf has been freed by calling if_transmit() (even on
failure), the mbuf has to be treated as invalid. Hence why the ifp is
used.
Modified:
head/sys/net80211/ieee80211_hostap.c
Modified: head/sys/net80211/ieee80211_hostap.c
==============================================================================
--- head/sys/net80211/ieee80211_hostap.c Sun Jan 6 04:38:31 2013 (r245097)
+++ head/sys/net80211/ieee80211_hostap.c Sun Jan 6 04:40:07 2013 (r245098)
@@ -2324,5 +2324,19 @@ ieee80211_recv_pspoll(struct ieee80211_n
ifp = vap->iv_ic->ic_ifp;
else
ifp = vap->iv_ifp;
- (void) ifp->if_transmit(ifp, m);
+
+ /*
+ * Free any node ref which this mbuf may have.
+ *
+ * Much like psq_mfree(), we assume that M_ENCAP nodes have
+ * node references.
+ */
+ if (ifp->if_transmit(ifp, m) != 0) {
+ /*
+ * XXX m is invalid (freed) at this point, determine M_ENCAP
+ * an alternate way.
+ */
+ if (ifp == vap->iv_ic->ic_ifp)
+ ieee80211_free_node(ni);
+ }
}
More information about the svn-src-head
mailing list