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);
+       }
 }
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to