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

Adrian Chadd adrian at FreeBSD.org
Sun Mar 3 09:09:37 UTC 2013


Author: adrian
Date: Sun Mar  3 09:09:35 2013
New Revision: 247696
URL: http://svnweb.freebsd.org/changeset/base/247696

Log:
  Migrate the call to parent->if_transmit() to a platform function -
  ieee80211_parent_transmit(ic, m).
  
  This allows me to enforce that the lock is being held when transmitting.

Modified:
  user/adrian/net80211_tx/sys/net80211/ieee80211_freebsd.c
  user/adrian/net80211_tx/sys/net80211/ieee80211_freebsd.h
  user/adrian/net80211_tx/sys/net80211/ieee80211_mesh.c
  user/adrian/net80211_tx/sys/net80211/ieee80211_output.c
  user/adrian/net80211_tx/sys/net80211/ieee80211_power.c
  user/adrian/net80211_tx/sys/net80211/ieee80211_superg.c
  user/adrian/net80211_tx/sys/net80211/ieee80211_wds.c

Modified: user/adrian/net80211_tx/sys/net80211/ieee80211_freebsd.c
==============================================================================
--- user/adrian/net80211_tx/sys/net80211/ieee80211_freebsd.c	Sun Mar  3 08:56:10 2013	(r247695)
+++ user/adrian/net80211_tx/sys/net80211/ieee80211_freebsd.c	Sun Mar  3 09:09:35 2013	(r247696)
@@ -504,6 +504,26 @@ ieee80211_process_callback(struct ieee80
 	}
 }
 
+/*
+ * Transmit a frame to the parent interface.
+ *
+ * TODO: if the transmission fails, make sure the parent node is freed
+ *   (the callers will first need modifying.)
+ */
+int
+ieee80211_parent_transmit(struct ieee80211com *ic,
+	struct mbuf *m)
+{
+	struct ifnet *parent = ic->ic_ifp;
+	/*
+	 * Assert the IC lock is held - this enforces the
+	 * processing -> queuing order is maintained
+	 */
+	IEEE80211_TX_LOCK_ASSERT(ic);
+
+	return (parent->if_transmit(parent, m));
+}
+
 #include <sys/libkern.h>
 
 void

Modified: user/adrian/net80211_tx/sys/net80211/ieee80211_freebsd.h
==============================================================================
--- user/adrian/net80211_tx/sys/net80211/ieee80211_freebsd.h	Sun Mar  3 08:56:10 2013	(r247695)
+++ user/adrian/net80211_tx/sys/net80211/ieee80211_freebsd.h	Sun Mar  3 09:09:35 2013	(r247696)
@@ -296,6 +296,9 @@ int	ieee80211_add_callback(struct mbuf *
 		void (*func)(struct ieee80211_node *, void *, int), void *arg);
 void	ieee80211_process_callback(struct ieee80211_node *, struct mbuf *, int);
 
+struct ieee80211com;
+int	ieee80211_parent_transmit(struct ieee80211com *, struct mbuf *);
+
 void	get_random_bytes(void *, size_t);
 
 struct ieee80211com;

Modified: user/adrian/net80211_tx/sys/net80211/ieee80211_mesh.c
==============================================================================
--- user/adrian/net80211_tx/sys/net80211/ieee80211_mesh.c	Sun Mar  3 08:56:10 2013	(r247695)
+++ user/adrian/net80211_tx/sys/net80211/ieee80211_mesh.c	Sun Mar  3 09:09:35 2013	(r247696)
@@ -1041,7 +1041,6 @@ mesh_transmit_to_gate(struct ieee80211va
 {
 	struct ifnet *ifp = vap->iv_ifp;
 	struct ieee80211com *ic = vap->iv_ic;
-	struct ifnet *parent = ic->ic_ifp;
 	struct ieee80211_node *ni;
 	struct ether_header *eh;
 	int error;
@@ -1143,9 +1142,8 @@ mesh_transmit_to_gate(struct ieee80211va
 			return;
 		}
 	}
-	error = parent->if_transmit(parent, m);
+	error = ieee80211_parent_transmit(ic, m);
 	if (error != 0) {
-		m_freem(m);
 		ieee80211_free_node(ni);
 	} else {
 		ifp->if_opackets++;
@@ -1240,7 +1238,6 @@ mesh_forward(struct ieee80211vap *vap, s
 	struct ieee80211com *ic = vap->iv_ic;
 	struct ieee80211_mesh_state *ms = vap->iv_mesh;
 	struct ifnet *ifp = vap->iv_ifp;
-	struct ifnet *parent = ic->ic_ifp;
 	const struct ieee80211_frame *wh =
 	    mtod(m, const struct ieee80211_frame *);
 	struct mbuf *mcopy;
@@ -1320,7 +1317,7 @@ mesh_forward(struct ieee80211vap *vap, s
 
 	/* XXX do we know m_nextpkt is NULL? */
 	mcopy->m_pkthdr.rcvif = (void *) ni;
-	err = parent->if_transmit(parent, mcopy);
+	err = ieee80211_parent_transmit(ic, mcopy);
 	if (err != 0) {
 		/* NB: IFQ_HANDOFF reclaims mbuf */
 		ieee80211_free_node(ni);

Modified: user/adrian/net80211_tx/sys/net80211/ieee80211_output.c
==============================================================================
--- user/adrian/net80211_tx/sys/net80211/ieee80211_output.c	Sun Mar  3 08:56:10 2013	(r247695)
+++ user/adrian/net80211_tx/sys/net80211/ieee80211_output.c	Sun Mar  3 09:09:35 2013	(r247696)
@@ -126,7 +126,6 @@ ieee80211_start_pkt(struct ieee80211vap 
 	(vap->iv_opmode == IEEE80211_M_WDS && \
 	 (vap->iv_flags_ext & IEEE80211_FEXT_WDSLEGACY) == 0)
 	struct ieee80211com *ic = vap->iv_ic;
-	struct ifnet *parent = ic->ic_ifp;
 	struct ifnet *ifp = vap->iv_ifp;
 	struct ieee80211_node *ni;
 	struct ether_header *eh;
@@ -340,7 +339,7 @@ ieee80211_start_pkt(struct ieee80211vap 
 			return (ENOBUFS);
 		}
 	}
-	error = parent->if_transmit(parent, m);
+	error = ieee80211_parent_transmit(ic, m);
 
 	/*
 	 * Unlock at this point - no need to hold it across

Modified: user/adrian/net80211_tx/sys/net80211/ieee80211_power.c
==============================================================================
--- user/adrian/net80211_tx/sys/net80211/ieee80211_power.c	Sun Mar  3 08:56:10 2013	(r247695)
+++ user/adrian/net80211_tx/sys/net80211/ieee80211_power.c	Sun Mar  3 09:09:35 2013	(r247696)
@@ -413,6 +413,7 @@ static void
 pwrsave_flushq(struct ieee80211_node *ni)
 {
 	struct ieee80211_psq *psq = &ni->ni_psq;
+	struct ieee80211com *ic = ni->ni_ic;
 	struct ieee80211vap *vap = ni->ni_vap;
 	struct ieee80211_psq_head *qhead;
 	struct ifnet *parent, *ifp;
@@ -463,7 +464,7 @@ pwrsave_flushq(struct ieee80211_node *ni
 			 * For encaped frames, we need to free the node
 			 * reference upon failure.
 			 */
-			if (parent->if_transmit(parent, m) != 0)
+			if (ieee80211_parent_transmit(ic, m) != 0)
 				ieee80211_free_node(ni);
 		}
 	}

Modified: user/adrian/net80211_tx/sys/net80211/ieee80211_superg.c
==============================================================================
--- user/adrian/net80211_tx/sys/net80211/ieee80211_superg.c	Sun Mar  3 08:56:10 2013	(r247695)
+++ user/adrian/net80211_tx/sys/net80211/ieee80211_superg.c	Sun Mar  3 09:09:35 2013	(r247696)
@@ -501,6 +501,7 @@ static void
 ff_transmit(struct ieee80211_node *ni, struct mbuf *m)
 {
 	struct ieee80211vap *vap = ni->ni_vap;
+	struct ieee80211com *ic = ni->ni_ic;
 	int error;
 
 	IEEE80211_TX_LOCK_ASSERT(vap->iv_ic);
@@ -509,9 +510,8 @@ ff_transmit(struct ieee80211_node *ni, s
 	m = ieee80211_encap(vap, ni, m);
 	if (m != NULL) {
 		struct ifnet *ifp = vap->iv_ifp;
-		struct ifnet *parent = ni->ni_ic->ic_ifp;
 
-		error = parent->if_transmit(parent, m);
+		error = ieee80211_parent_transmit(ic, m);;
 		if (error != 0) {
 			/* NB: IFQ_HANDOFF reclaims mbuf */
 			ieee80211_free_node(ni);

Modified: user/adrian/net80211_tx/sys/net80211/ieee80211_wds.c
==============================================================================
--- user/adrian/net80211_tx/sys/net80211/ieee80211_wds.c	Sun Mar  3 08:56:10 2013	(r247695)
+++ user/adrian/net80211_tx/sys/net80211/ieee80211_wds.c	Sun Mar  3 09:09:35 2013	(r247696)
@@ -232,7 +232,6 @@ void
 ieee80211_dwds_mcast(struct ieee80211vap *vap0, struct mbuf *m)
 {
 	struct ieee80211com *ic = vap0->iv_ic;
-	struct ifnet *parent = ic->ic_ifp;
 	const struct ether_header *eh = mtod(m, const struct ether_header *);
 	struct ieee80211_node *ni;
 	struct ieee80211vap *vap;
@@ -296,7 +295,7 @@ ieee80211_dwds_mcast(struct ieee80211vap
 		mcopy->m_flags |= M_MCAST;
 		mcopy->m_pkthdr.rcvif = (void *) ni;
 
-		err = parent->if_transmit(parent, mcopy);
+		err = ieee80211_parent_transmit(ic, mcopy);
 		if (err) {
 			/* NB: IFQ_HANDOFF reclaims mbuf */
 			ifp->if_oerrors++;


More information about the svn-src-user mailing list