Date: Sun, 3 Mar 2013 09:09:36 +0000 (UTC) From: Adrian Chadd <adrian@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r247696 - user/adrian/net80211_tx/sys/net80211 Message-ID: <201303030909.r2399acv065267@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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++;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201303030909.r2399acv065267>