svn commit: r251199 - user/adrian/net80211_tx/sys/net80211

Adrian Chadd adrian at FreeBSD.org
Fri May 31 21:54:53 UTC 2013


Author: adrian
Date: Fri May 31 21:54:52 2013
New Revision: 251199
URL: http://svnweb.freebsd.org/changeset/base/251199

Log:
  Disable the deferred raw transmit path until I figure out why it
  isn't working.
  
  It works when using ath(4), but not when using iwn(4).  I'll dig deeper
  into it soon but I'd like to bring over some other changes before
  I do that.

Modified:
  user/adrian/net80211_tx/sys/net80211/ieee80211_output.c

Modified: user/adrian/net80211_tx/sys/net80211/ieee80211_output.c
==============================================================================
--- user/adrian/net80211_tx/sys/net80211/ieee80211_output.c	Fri May 31 21:43:17 2013	(r251198)
+++ user/adrian/net80211_tx/sys/net80211/ieee80211_output.c	Fri May 31 21:54:52 2013	(r251199)
@@ -493,10 +493,32 @@ ieee80211_vap_tx_task(void *arg, int npe
 	 * need a lock to ensure they were dispatched in the correct order
 	 */
 	for (;;) {
+		struct ieee80211_tx_info *txinfo;
+		struct ieee80211_bpf_params *params;
+		struct ieee80211_node *ni;
+
 		IFQ_DEQUEUE(&ifp->if_snd, m);
 		if (m == NULL)
 			break;
-		(void) ieee80211_vap_start_pkt(vap, m);
+
+		ni = (struct ieee80211_node *) m->m_pkthdr.rcvif;
+
+		/* Fetch TX info from the mbuf if it has it */
+		if (m->m_flags & M_TXINFO)
+			txinfo = ieee80211_get_txinfo(m);
+		else
+			txinfo = NULL;
+
+		/* Raw packet? or normal data packet? */
+		if (txinfo != NULL && txinfo->is_raw_tx) {
+			params = NULL;
+			if (txinfo->has_tx_params) {
+				params = &txinfo->bpf_params;
+			}
+			(void) (ic->ic_raw_xmit(ni, m, params));
+		} else {
+			(void) ieee80211_vap_start_pkt(vap, m);
+		}
 		/* mbuf is consumed here */
 	}
 }
@@ -509,8 +531,51 @@ ieee80211_raw_output(struct ieee80211vap
     struct mbuf *m, const struct ieee80211_bpf_params *params)
 {
 	struct ieee80211com *ic = vap->iv_ic;
+#if 0
+	struct ifnet *ifp = vap->iv_ifp;
+	struct ieee80211_tx_info txinfo;
+
+	/*
+	 * Queue the given mbuf into the VAP queue.
+	 *
+	 * Dispatch to the hardware will occur in the VAP transimt
+	 * thread.
+	 */
+	bzero(&txinfo, sizeof(txinfo));
 
+	txinfo.is_raw_tx = 1;
+
+	if (params != NULL) {
+		txinfo.has_tx_params = 1;
+		memcpy(&txinfo.bpf_params, params, sizeof(*params));
+	}
+
+	if (! ieee80211_add_txinfo(m, &txinfo)) {
+		m_freem(m);
+		return (ENOBUFS);	/* XXX correct? */
+	}
+
+	IF_LOCK(&ifp->if_snd);
+
+	/* Enforce queue limits */
+	if (_IF_QFULL(&ifp->if_snd)) {
+		IF_UNLOCK(&ifp->if_snd);
+		m_free(m);
+		return (ENOBUFS);       /* XXX errno? */
+	}
+
+	/* XXX sanitize TX mbuf flags? */
+	m->m_flags |= M_TXINFO;
+	_IF_ENQUEUE(&ifp->if_snd, m);
+	IF_UNLOCK(&ifp->if_snd);
+
+	/* Schedule the deferred TX task */
+	ieee80211_runtask(ic, &vap->iv_tx_task);
+
+	return (0);
+#else
 	return (ic->ic_raw_xmit(ni, m, params));
+#endif
 }
 
 /*


More information about the svn-src-user mailing list