PERFORCE change 67782 for review
Sam Leffler
sam at FreeBSD.org
Mon Dec 27 22:27:45 PST 2004
http://perforce.freebsd.org/chv.cgi?CH=67782
Change 67782 by sam at sam_ebb on 2004/12/28 06:27:05
o add gross hack to handle radiotap capture of frames that
come in with hardware padding; should be replaced by a
flag in the radiotap header and more smarts in the apps
that decode radiotap data
o shorten some assertion strings by removing function names
Affected files ...
.. //depot/projects/wifi/sys/dev/ath/if_ath.c#47 edit
.. //depot/projects/wifi/sys/dev/ath/if_athvar.h#18 edit
Differences ...
==== //depot/projects/wifi/sys/dev/ath/if_ath.c#47 (text+ko) ====
@@ -1632,10 +1632,8 @@
{
struct ath_buf *bf = arg;
- KASSERT(nseg <= ATH_MAX_SCATTER,
- ("%s: too many DMA segments %u", __func__, nseg));
- KASSERT(error == 0,
- ("%s: error %u on bus_dma callback", __func__, error));
+ KASSERT(nseg <= ATH_MAX_SCATTER, ("too many DMA segments %u", nseg));
+ KASSERT(error == 0, ("error %u on bus_dma callback", error));
bf->bf_mapsize = mapsize;
bf->bf_nseg = nseg;
bcopy(seg, bf->bf_segs, nseg * sizeof (seg[0]));
@@ -2090,8 +2088,7 @@
ath_load_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
{
bus_addr_t *paddr = (bus_addr_t*) arg;
- KASSERT(error == 0,
- ("%s: error %u on bus_dma callback", __func__, error));
+ KASSERT(error == 0, ("error %u on bus_dma callback", error));
*paddr = segs->ds_addr;
}
@@ -2357,7 +2354,6 @@
sc->sc_stats.ast_rx_nombuf++;
return ENOMEM;
}
- KASSERT(m->m_next == NULL, ("m_next %p (1)", m->m_next));
bf->bf_m = m;
m->m_pkthdr.len = m->m_len = m->m_ext.ext_size;
@@ -2372,8 +2368,8 @@
sc->sc_stats.ast_rx_busdma++;
return error;
}
- KASSERT(bf->bf_nseg == 1, ("%s: multi-segment packet; nseg %u",
- __func__, bf->bf_nseg));
+ KASSERT(bf->bf_nseg == 1,
+ ("multi-segment packet; nseg %u", bf->bf_nseg));
}
bus_dmamap_sync(sc->sc_dmat, bf->bf_dmamap, BUS_DMASYNC_PREREAD);
@@ -2594,7 +2590,6 @@
goto rx_next;
}
rx_accept:
- KASSERT(m->m_next == NULL, ("m_next %p (3)", m->m_next));
/*
* Sync and unmap the frame. At this point we're
* committed to passing the mbuf somewhere so clear
@@ -2616,6 +2611,9 @@
sc->sc_stats.ast_ant_rx[ds->ds_rxstat.rs_antenna]++;
if (sc->sc_drvbpf) {
+ const void *data;
+ int hdrsize, hdrspace;
+
/*
* Discard anything shorter than an ack or cts.
*/
@@ -2633,8 +2631,33 @@
sc->sc_rx_th.wr_antenna = ds->ds_rxstat.rs_antenna;
/* XXX TSF */
- bpf_mtap2(sc->sc_drvbpf,
- &sc->sc_rx_th, sc->sc_rx_th_len, m);
+ /*
+ * Gag, deal with hardware padding of headers. This
+ * only happens for QoS frames. We copy the 802.11
+ * header out-of-line and supply it separately, then
+ * adjust the mbuf chain. It would be better if we
+ * could just flag the packet in the radiotap header
+ * and have applications DTRT.
+ */
+ if (len > sizeof(struct ieee80211_qosframe)) {
+ data = mtod(m, const void *);
+ hdrsize = ieee80211_anyhdrsize(data);
+ if (hdrsize & 3) {
+ bcopy(data, &sc->sc_rx_wh, hdrsize);
+ hdrspace = roundup(hdrsize,
+ sizeof(u_int32_t));
+ m->m_data += hdrspace;
+ m->m_len -= hdrspace;
+ bpf_mtap2(sc->sc_drvbpf, &sc->sc_rx,
+ sc->sc_rx_rt_len + hdrsize, m);
+ m->m_data -= hdrspace;
+ m->m_len += hdrspace;
+ } else
+ bpf_mtap2(sc->sc_drvbpf,
+ &sc->sc_rx, sc->sc_rx_rt_len, m);
+ } else
+ bpf_mtap2(sc->sc_drvbpf,
+ &sc->sc_rx, sc->sc_rx_rt_len, m);
}
/*
@@ -2986,8 +3009,7 @@
return error;
}
KASSERT(bf->bf_nseg == 1,
- ("ath_tx_start: packet not one segment; nseg %u",
- bf->bf_nseg));
+ ("packet not one segment; nseg %u", bf->bf_nseg));
} else if (bf->bf_nseg == 0) { /* null packet, discard */
sc->sc_stats.ast_tx_nodata++;
m_freem(m0);
@@ -4491,8 +4513,8 @@
sc->sc_tx_th.wt_ihdr.it_len = htole16(sc->sc_tx_th_len);
sc->sc_tx_th.wt_ihdr.it_present = htole32(ATH_TX_RADIOTAP_PRESENT);
- sc->sc_rx_th_len = roundup(sizeof(sc->sc_rx_th), sizeof(u_int32_t));
- sc->sc_rx_th.wr_ihdr.it_len = htole16(sc->sc_rx_th_len);
+ sc->sc_rx_rt_len = roundup(sizeof(sc->sc_rx_th), sizeof(u_int32_t));
+ sc->sc_rx_th.wr_ihdr.it_len = htole16(sc->sc_rx_rt_len);
sc->sc_rx_th.wr_ihdr.it_present = htole32(ATH_RX_RADIOTAP_PRESENT);
}
==== //depot/projects/wifi/sys/dev/ath/if_athvar.h#18 (text+ko) ====
@@ -199,10 +199,13 @@
} u_tx_rt;
int sc_tx_th_len;
union {
- struct ath_rx_radiotap_header th;
+ struct {
+ struct ath_rx_radiotap_header th;
+ struct ieee80211_qosframe wh;
+ } u;
u_int8_t pad[64];
} u_rx_rt;
- int sc_rx_th_len;
+ int sc_rx_rt_len;
struct task sc_fataltask; /* fatal int processing */
@@ -244,7 +247,9 @@
};
#define sc_if sc_arp.ac_if
#define sc_tx_th u_tx_rt.th
-#define sc_rx_th u_rx_rt.th
+#define sc_rx u_rx_rt.u
+#define sc_rx_th sc_rx.th
+#define sc_rx_wh sc_rx.wh
#define ATH_LOCK_INIT(_sc) \
mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \
More information about the p4-projects
mailing list