Date: Sun, 3 Mar 2013 10:02:09 +0000 (UTC) From: Adrian Chadd <adrian@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r247706 - user/adrian/net80211_tx/sys/net80211 Message-ID: <201303031002.r23A29Ja082513@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: adrian Date: Sun Mar 3 10:02:08 2013 New Revision: 247706 URL: http://svnweb.freebsd.org/changeset/base/247706 Log: Migrate the vap if_transmit calls to ieee80211_vap_transmit(). * Do a mechanical conversion of vap ifp -> ieee80211_vap_transmit(). * Tidy up the hostap pspoll receive code - have it call either ieee80211_parent_transmit() or ieee80211_vap_transmit() as appropriate. * Tidy up the hwmp discover code to send via ieee80211_vap_transmit() as we shouldn't ever see encapsulated frames here. Tested: * AR5416, STA mode TODO: * Lots, lots more hostap testing! 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_hostap.c user/adrian/net80211_tx/sys/net80211/ieee80211_hwmp.c user/adrian/net80211_tx/sys/net80211/ieee80211_power.c Modified: user/adrian/net80211_tx/sys/net80211/ieee80211_freebsd.c ============================================================================== --- user/adrian/net80211_tx/sys/net80211/ieee80211_freebsd.c Sun Mar 3 09:47:47 2013 (r247705) +++ user/adrian/net80211_tx/sys/net80211/ieee80211_freebsd.c Sun Mar 3 10:02:08 2013 (r247706) @@ -516,7 +516,7 @@ ieee80211_parent_transmit(struct ieee802 { struct ifnet *parent = ic->ic_ifp; /* - * Assert the IC lock is held - this enforces the + * Assert the IC TX lock is held - this enforces the * processing -> queuing order is maintained */ IEEE80211_TX_LOCK_ASSERT(ic); @@ -524,6 +524,24 @@ ieee80211_parent_transmit(struct ieee802 return (parent->if_transmit(parent, m)); } +/* + * Transmit a frame to the VAP interface. + */ +int +ieee80211_vap_transmit(struct ieee80211vap *vap, struct mbuf *m) +{ + struct ifnet *ifp = vap->iv_ifp; + + /* + * When transmitting via the VAP, we shouldn't hold + * any IC TX lock as the VAP TX path will acquire it. + */ + IEEE80211_TX_UNLOCK_ASSERT(vap->iv_ic); + + return (ifp->if_transmit(ifp, 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 09:47:47 2013 (r247705) +++ user/adrian/net80211_tx/sys/net80211/ieee80211_freebsd.h Sun Mar 3 10:02:08 2013 (r247706) @@ -298,11 +298,10 @@ void ieee80211_process_callback(struct i struct ieee80211com; int ieee80211_parent_transmit(struct ieee80211com *, struct mbuf *); +int ieee80211_vap_transmit(struct ieee80211vap *, struct mbuf *); void get_random_bytes(void *, size_t); -struct ieee80211com; - void ieee80211_sysctl_attach(struct ieee80211com *); void ieee80211_sysctl_detach(struct ieee80211com *); void ieee80211_sysctl_vattach(struct ieee80211vap *); Modified: user/adrian/net80211_tx/sys/net80211/ieee80211_hostap.c ============================================================================== --- user/adrian/net80211_tx/sys/net80211/ieee80211_hostap.c Sun Mar 3 09:47:47 2013 (r247705) +++ user/adrian/net80211_tx/sys/net80211/ieee80211_hostap.c Sun Mar 3 10:02:08 2013 (r247706) @@ -412,7 +412,7 @@ hostap_deliver_data(struct ieee80211vap if (mcopy != NULL) { int len, err; len = mcopy->m_pkthdr.len; - err = ifp->if_transmit(ifp, mcopy); + err = ieee80211_vap_transmit(vap, mcopy); if (err) { /* NB: IFQ_HANDOFF reclaims mcopy */ } else { @@ -2255,8 +2255,8 @@ void ieee80211_recv_pspoll(struct ieee80211_node *ni, struct mbuf *m0) { struct ieee80211vap *vap = ni->ni_vap; + struct ieee80211com *ic = vap->iv_ic; struct ieee80211_frame_min *wh; - struct ifnet *ifp; struct mbuf *m; uint16_t aid; int qlen; @@ -2320,23 +2320,15 @@ ieee80211_recv_pspoll(struct ieee80211_n } m->m_flags |= M_PWR_SAV; /* bypass PS handling */ - if (m->m_flags & M_ENCAP) - ifp = vap->iv_ic->ic_ifp; - else - ifp = vap->iv_ifp; - /* - * Free any node ref which this mbuf may have. - * - * Much like psq_mfree(), we assume that M_ENCAP nodes have - * node references. + * Do the right thing; if it's an encap'ed frame then + * call ieee80211_parent_transmit() (and free the ref) else + * call ieee80211_vap_transmit(). */ - 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) + if (m->m_flags & M_ENCAP) { + if (ieee80211_parent_transmit(ic, m) != 0) ieee80211_free_node(ni); + } else { + (void) ieee80211_vap_transmit(vap, m); } } Modified: user/adrian/net80211_tx/sys/net80211/ieee80211_hwmp.c ============================================================================== --- user/adrian/net80211_tx/sys/net80211/ieee80211_hwmp.c Sun Mar 3 09:47:47 2013 (r247705) +++ user/adrian/net80211_tx/sys/net80211/ieee80211_hwmp.c Sun Mar 3 10:02:08 2013 (r247706) @@ -1277,12 +1277,9 @@ hwmp_recv_prep(struct ieee80211vap *vap, struct ieee80211_mesh_route *rtext = NULL; struct ieee80211_hwmp_route *hr; struct ieee80211com *ic = vap->iv_ic; - struct ifnet *ifp = vap->iv_ifp; struct mbuf *m, *next; uint32_t metric = 0; const uint8_t *addr; - int is_encap; - struct ieee80211_node *ni_encap; IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, "received PREP, orig %6D, targ %6D", prep->prep_origaddr, ":", @@ -1456,22 +1453,21 @@ hwmp_recv_prep(struct ieee80211vap *vap, m = ieee80211_ageq_remove(&ic->ic_stageq, (struct ieee80211_node *)(uintptr_t) ieee80211_mac_hash(ic, addr)); /* either dest or ext_dest */ + + /* + * All frames in the stageq here should be non-M_ENCAP; or things + * will get very unhappy. + */ for (; m != NULL; m = next) { - is_encap = !! (m->m_flags & M_ENCAP); - ni_encap = (struct ieee80211_node *) m->m_pkthdr.rcvif; next = m->m_nextpkt; m->m_nextpkt = NULL; IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni, "flush queued frame %p len %d", m, m->m_pkthdr.len); - /* * If the mbuf has M_ENCAP set, ensure we free it. * Note that after if_transmit() is called, m is invalid. */ - if (ifp->if_transmit(ifp, m) != 0) { - if (is_encap) - ieee80211_free_node(ni_encap); - } + (void) ieee80211_vap_transmit(vap, m); } #undef IS_PROXY #undef PROXIED_BY_US Modified: user/adrian/net80211_tx/sys/net80211/ieee80211_power.c ============================================================================== --- user/adrian/net80211_tx/sys/net80211/ieee80211_power.c Sun Mar 3 09:47:47 2013 (r247705) +++ user/adrian/net80211_tx/sys/net80211/ieee80211_power.c Sun Mar 3 10:02:08 2013 (r247706) @@ -476,7 +476,7 @@ pwrsave_flushq(struct ieee80211_node *ni ifp_q = m->m_nextpkt; KASSERT((!(m->m_flags & M_ENCAP)), ("%s: vapq with M_ENCAP frame!\n", __func__)); - (void) ifp->if_transmit(ifp, m); + (void) ieee80211_vap_transmit(vap, m); } } }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201303031002.r23A29Ja082513>