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