Date: Tue, 28 Dec 2004 06:27:43 GMT From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 67782 for review Message-ID: <200412280627.iBS6Rh4G095249@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=67782 Change 67782 by sam@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), \
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200412280627.iBS6Rh4G095249>