PERFORCE change 36361 for review

Sam Leffler sam at FreeBSD.org
Mon Aug 18 10:42:22 PDT 2003


http://perforce.freebsd.org/chv.cgi?CH=36361

Change 36361 by sam at sam_ebb on 2003/08/18 10:26:55

	o correct packet length calculation for beacon frames (was too short
	  but didn't matter since it was only used to choose between inline
	  mbuf and cluster)
	o add a KASSERT to verify the beacon packet length is correct
	o don't discard control frames when in monitor mode; they'll get
	  tossed in the 802.11 layer anyway and doing this allows listeners
	  to see them
	o add a statistic to count control frames discarded in the driver
	o move the rx too short statistic to be near the control frames 
	  discarded statistic (requires recompile of athstats)

Affected files ...

.. //depot/projects/netperf/sys/dev/ath/if_ath.c#8 edit
.. //depot/projects/netperf/sys/dev/ath/if_athioctl.h#3 edit

Differences ...

==== //depot/projects/netperf/sys/dev/ath/if_ath.c#8 (text+ko) ====

@@ -996,7 +996,8 @@
 	 * with this alignment (perhaps should assert).
 	 */
 	rs = &ni->ni_rates;
-	pktlen = 8 + 2 + 2+ 2+ni->ni_esslen + 2+rs->rs_nrates + 6;
+	pktlen = sizeof (struct ieee80211_frame)
+	       + 8 + 2 + 2 + 2+ni->ni_esslen + 2+rs->rs_nrates + 6;
 	if (rs->rs_nrates > IEEE80211_RATE_SIZE)
 		pktlen += 2;
 	if (pktlen <= MHLEN)
@@ -1067,6 +1068,9 @@
 	}
 	frm = ieee80211_add_xrates(frm, rs);
 	m->m_pkthdr.len = m->m_len = frm - mtod(m, u_int8_t *);
+	KASSERT(m->m_pkthdr.len <= pktlen,
+		("beacon bigger than expected, len %u calculated %u",
+		m->m_pkthdr.len, pktlen));
 
 	DPRINTF2(("ath_beacon_alloc: m %p len %u\n", m, m->m_len));
 	error = bus_dmamap_load_mbuf(sc->sc_dmat, bf->bf_dmamap, m,
@@ -1086,7 +1090,6 @@
 
 	ds->ds_link = 0;
 	ds->ds_data = bf->bf_segs[0].ds_addr;
-	/* XXX verify mbuf data area covers this roundup */
 	/*
 	 * Calculate rate code.
 	 * XXX everything at min xmit rate
@@ -1110,6 +1113,7 @@
 		, 0				/* rts/cts duration */
 	);
 	/* NB: beacon's BufLen must be a multiple of 4 bytes */
+	/* XXX verify mbuf data area covers this roundup */
 	ath_hal_filltxdesc(ah, ds
 		, roundup(bf->bf_segs[0].ds_len, 4)	/* buffer length */
 		, AH_TRUE				/* first segment */
@@ -1128,12 +1132,13 @@
 	struct ath_hal *ah = sc->sc_ah;
 
 	DPRINTF2(("%s: pending %u\n", __func__, pending));
-	if (ic->ic_opmode == IEEE80211_M_STA || bf == NULL || bf->bf_m == NULL) {
+	if (ic->ic_opmode == IEEE80211_M_STA ||
+	    bf == NULL || bf->bf_m == NULL) {
 		DPRINTF(("%s: ic_flags=%x bf=%p bf_m=%p\n",
 			__func__, ic->ic_flags, bf, bf ? bf->bf_m : NULL));
 		return;
 	}
-	/* update beacon to reflect PS poll state */
+	/* TODO: update beacon to reflect PS poll state */
 	if (!ath_hal_stoptxdma(ah, sc->sc_bhalq)) {
 		DPRINTF(("%s: beacon queue %u did not stop?",
 			__func__, sc->sc_bhalq));
@@ -1522,6 +1527,7 @@
 		len = ds->ds_rxstat.rs_datalen;
 		if (len < sizeof(struct ieee80211_frame)) {
 			DPRINTF(("ath_rx_proc: short packet %d\n", len));
+			sc->sc_stats.ast_rx_tooshort++;
 			goto rx_next;
 		}
 
@@ -1530,11 +1536,13 @@
 
 		wh = mtod(m, struct ieee80211_frame *);
 		if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) ==
-		    IEEE80211_FC0_TYPE_CTL) {
+		    IEEE80211_FC0_TYPE_CTL &&
+		    ic->ic_opmode != IEEE80211_M_MONITOR) {
 			/*
-			 * Ignore control frame received in promisc mode.
+			 * Discard control frame when not in monitor mode.
 			 */
 			DPRINTF(("ath_rx_proc: control frame\n"));
+			sc->sc_stats.ast_rx_ctl++;
 			goto rx_next;
 		}
 

==== //depot/projects/netperf/sys/dev/ath/if_athioctl.h#3 (text+ko) ====

@@ -73,12 +73,13 @@
 	u_int32_t	ast_rx_nombuf;	/* rx setup failed 'cuz no mbuf */
 	u_int32_t	ast_rx_busdma;	/* rx setup failed for dma resrcs */
 	u_int32_t	ast_rx_orn;	/* rx failed 'cuz of desc overrun */
-	u_int32_t	ast_rx_tooshort;/* rx failed 'cuz frame too short */
 	u_int32_t	ast_rx_crcerr;	/* rx failed 'cuz of bad CRC */
 	u_int32_t	ast_rx_fifoerr;	/* rx failed 'cuz of FIFO overrun */
 	u_int32_t	ast_rx_badcrypt;/* rx failed 'cuz decryption */
 	u_int32_t	ast_rx_phyerr;	/* rx failed 'cuz of PHY err */
 	u_int32_t	ast_rx_phy[32];	/* rx PHY error per-code counts */
+	u_int32_t	ast_rx_tooshort;/* rx discarded 'cuz frame too short */
+	u_int32_t	ast_rx_ctl;	/* rx discarded 'cuz ctl frame */
 	u_int32_t	ast_be_nombuf;	/* beacon setup failed 'cuz no mbuf */
 	u_int32_t	ast_per_cal;	/* periodic calibration calls */
 	u_int32_t	ast_per_calfail;/* periodic calibration failed */


More information about the p4-projects mailing list