Skip site navigation (1)Skip section navigation (2)
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>