diff options
author | sam <sam@FreeBSD.org> | 2003-12-28 03:56:00 +0000 |
---|---|---|
committer | sam <sam@FreeBSD.org> | 2003-12-28 03:56:00 +0000 |
commit | c165a87f8dfc070bceb68d9c3ff183ec2135e060 (patch) | |
tree | f663da0db11fcecb5ff2d3e93732492fb4d7bd29 /sys/dev/ath | |
parent | 853a4ae85d691a2f3500efc16c2eab14e3c117b0 (diff) | |
download | FreeBSD-src-c165a87f8dfc070bceb68d9c3ff183ec2135e060.zip FreeBSD-src-c165a87f8dfc070bceb68d9c3ff183ec2135e060.tar.gz |
o eliminate widespread on-stack mbuf use for bpf by introducing
a new bpf_mtap2 routine that does the right thing for an mbuf
and a variable-length chunk of data that should be prepended.
o while we're sweeping the drivers, use u_int32_t uniformly when
when prepending the address family (several places were assuming
sizeof(int) was 4)
o return M_ASSERTVALID to BPF_MTAP* now that all stack-allocated
mbufs have been eliminated; this may better be moved to the bpf
routines
Reviewed by: arch@ and several others
Diffstat (limited to 'sys/dev/ath')
-rw-r--r-- | sys/dev/ath/if_ath.c | 47 |
1 files changed, 12 insertions, 35 deletions
diff --git a/sys/dev/ath/if_ath.c b/sys/dev/ath/if_ath.c index 55467db..3a7313d 100644 --- a/sys/dev/ath/if_ath.c +++ b/sys/dev/ath/if_ath.c @@ -777,20 +777,10 @@ ath_start(struct ifnet *ifp) bpf_mtap(ic->ic_rawbpf, m); if (sc->sc_drvbpf) { - struct mbuf *mb; - - MGETHDR(mb, M_DONTWAIT, m->m_type); - if (mb != NULL) { - sc->sc_tx_th.wt_rate = - ni->ni_rates.rs_rates[ni->ni_txrate]; - - mb->m_next = m; - mb->m_data = (caddr_t)&sc->sc_tx_th; - mb->m_len = sizeof(sc->sc_tx_th); - mb->m_pkthdr.len += mb->m_len; - bpf_mtap(sc->sc_drvbpf, mb); - m_free(mb); - } + sc->sc_tx_th.wt_rate = + ni->ni_rates.rs_rates[ni->ni_txrate]; + bpf_mtap2(sc->sc_drvbpf, + &sc->sc_tx_th, sizeof(sc->sc_tx_th), m); } if (ath_tx_start(sc, ni, bf, m)) { @@ -1711,27 +1701,14 @@ ath_rx_proc(void *arg, int npending) m->m_pkthdr.len = m->m_len = len; if (sc->sc_drvbpf) { - struct mbuf *mb; - - /* XXX pre-allocate space when setting up recv's */ - MGETHDR(mb, M_DONTWAIT, m->m_type); - if (mb != NULL) { - sc->sc_rx_th.wr_rate = - sc->sc_hwmap[ds->ds_rxstat.rs_rate]; - sc->sc_rx_th.wr_antsignal = - ds->ds_rxstat.rs_rssi; - sc->sc_rx_th.wr_antenna = - ds->ds_rxstat.rs_antenna; - /* XXX TSF */ - - (void) m_dup_pkthdr(mb, m, M_DONTWAIT); - mb->m_next = m; - mb->m_data = (caddr_t)&sc->sc_rx_th; - mb->m_len = sizeof(sc->sc_rx_th); - mb->m_pkthdr.len += mb->m_len; - bpf_mtap(sc->sc_drvbpf, mb); - m_free(mb); - } + sc->sc_rx_th.wr_rate = + sc->sc_hwmap[ds->ds_rxstat.rs_rate]; + sc->sc_rx_th.wr_antsignal = ds->ds_rxstat.rs_rssi; + sc->sc_rx_th.wr_antenna = ds->ds_rxstat.rs_antenna; + /* XXX TSF */ + + bpf_mtap2(sc->sc_drvbpf, + &sc->sc_rx_th, sizeof(sc->sc_rx_th), m); } m_adj(m, -IEEE80211_CRC_LEN); |