Module Name:    src
Committed By:   christos
Date:           Tue Jan 29 13:54:27 UTC 2013

Modified Files:
        src/sys/dev/usb: if_otus.c if_otusvar.h

Log Message:
1) Use ic_curchan consistently
2) Ignore frames shorter than sizeof(struct ieee80211_frame).
3) Remove useless/dead code accidentally committed.


To generate a diff of this commit:
cvs rdiff -u -r1.22 -r1.23 src/sys/dev/usb/if_otus.c
cvs rdiff -u -r1.5 -r1.6 src/sys/dev/usb/if_otusvar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/usb/if_otus.c
diff -u src/sys/dev/usb/if_otus.c:1.22 src/sys/dev/usb/if_otus.c:1.23
--- src/sys/dev/usb/if_otus.c:1.22	Tue Jan 22 07:40:42 2013
+++ src/sys/dev/usb/if_otus.c	Tue Jan 29 08:54:26 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_otus.c,v 1.22 2013/01/22 12:40:42 jmcneill Exp $	*/
+/*	$NetBSD: if_otus.c,v 1.23 2013/01/29 13:54:26 christos Exp $	*/
 /*	$OpenBSD: if_otus.c,v 1.18 2010/08/27 17:08:00 jsg Exp $	*/
 
 /*-
@@ -23,7 +23,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_otus.c,v 1.22 2013/01/22 12:40:42 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_otus.c,v 1.23 2013/01/29 13:54:26 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/sockio.h>
@@ -179,13 +179,6 @@ Static int	otus_init(struct ifnet *);
 Static void	otus_stop(struct ifnet *);
 Static void	otus_wait_async(struct otus_softc *);
 
-#if IEEE80211_INJECTION
-#define IS_INJECTED(m)	(((m)->m_flags & M_INJECT) != 0)
-
-static int	otus_output(struct ifnet *, struct mbuf *,
-    const struct sockaddr *, struct rtentry *);
-#endif /* IEEE80211_INJECTION */
-
 /* List of supported channels. */
 static const uint8_t ar_chans[] = {
 	1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
@@ -872,12 +865,6 @@ otus_attachhook(device_t arg)
 	ic->ic_delete_key = otus_delete_key;
 #endif /* notyet */
 
-#if IEEE80211_INJECTION
-	/* hook our packet injection output routine */
-	sc->sc_if_output = ifp->if_output;
-	ifp->if_output = otus_output;
-#endif
-
 	/* Override state transition machine. */
 	sc->sc_newstate = ic->ic_newstate;
 	ic->ic_newstate = otus_newstate;
@@ -1381,11 +1368,11 @@ otus_newstate_cb(struct otus_softc *sc, 
 
 	case IEEE80211_S_AUTH:
 	case IEEE80211_S_ASSOC:
-		otus_set_chan(sc, ni->ni_chan, 0);
+		otus_set_chan(sc, ic->ic_curchan, 0);
 		break;
 
 	case IEEE80211_S_RUN:
-		otus_set_chan(sc, ni->ni_chan, 1);
+		otus_set_chan(sc, ic->ic_curchan, 1);
 
 		switch (ic->ic_opmode) {
 		case IEEE80211_M_STA:
@@ -1774,12 +1761,16 @@ otus_sub_rxeof(struct otus_softc *sc, ui
 	}
 	/* Compute MPDU's length. */
 	mlen = len - AR_PLCP_HDR_LEN - sizeof(*tail);
-	/* Make sure there's room for an 802.11 header + FCS. */
-	if (__predict_false(mlen < IEEE80211_MIN_LEN)) {
+	mlen -= IEEE80211_CRC_LEN;	/* strip 802.11 FCS */
+	/* Make sure there's room for an 802.11 header. */
+	/*
+	 * XXX: This will drop most control packets.  Do we really
+	 * want this in IEEE80211_M_MONITOR mode?
+	 */
+	if (__predict_false(mlen < sizeof(*wh))) {
 		ifp->if_ierrors++;
 		return;
 	}
-	mlen -= IEEE80211_CRC_LEN;	/* strip 802.11 FCS */
 
 	/* Provide a 32-bit aligned protocol header to the stack. */
 	align = (ieee80211_has_qos(wh) ^ ieee80211_has_addr4(wh)) ? 2 : 0;
@@ -1809,8 +1800,8 @@ otus_sub_rxeof(struct otus_softc *sc, ui
 
 		tap = &sc->sc_rxtap;
 		tap->wr_flags = 0;
-		tap->wr_chan_freq = htole16(ic->ic_ibss_chan->ic_freq);
-		tap->wr_chan_flags = htole16(ic->ic_ibss_chan->ic_flags);
+		tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq);
+		tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags);
 		tap->wr_antsignal = tail->rssi;
 		tap->wr_rate = 2;	/* In case it can't be found below. */
 		switch (tail->status & AR_RX_STATUS_MT_MASK) {
@@ -1949,9 +1940,6 @@ Static int
 otus_tx(struct otus_softc *sc, struct mbuf *m, struct ieee80211_node *ni,
     struct otus_tx_data *data)
 {
-#if IEEE80211_INJECTION
-	struct ieee80211_bpf_params *params;
-#endif
 	struct ieee80211com *ic;
 	struct otus_node *on;
 	struct ieee80211_frame *wh;
@@ -1967,16 +1955,8 @@ otus_tx(struct otus_softc *sc, struct mb
 	ic = &sc->sc_ic;
 	on = (void *)ni;
 
-#if IEEE80211_INJECTION
-	params = ieee80211_bpf_params(m);
-#endif
-
 	wh = mtod(m, struct ieee80211_frame *);
-	if ((wh->i_fc[1] & IEEE80211_FC1_PROTECTED)
-#if IEEE80211_INJECTION
-	    && !IS_INJECTED(m)
-#endif
-		) {
+	if ((wh->i_fc[1] & IEEE80211_FC1_PROTECTED)) {
 		/* XXX: derived from upgt_tx_task() and ural_tx_data() */
 		k = ieee80211_crypto_encap(ic, ni, m);
 		if (k == NULL)
@@ -2042,38 +2022,6 @@ otus_tx(struct otus_softc *sc, struct mb
 		phyctl |= AR_TX_PHY_ANTMSK(sc->sc_txmask);
 	}
 
-#if IEEE80211_INJECTION
-	if (params) {
-		if (params->ibp_flags & IEEE80211_BPF_NOACK)
-			macctl |= AR_TX_MAC_NOACK;
-
-		if (params->ibp_flags & IEEE80211_BPF_CTS) {
-			macctl &= ~AR_TX_MAC_RTS;
-			macctl |= AR_TX_MAC_CTS;
-		}
-		else if (params->ibp_flags & IEEE80211_BPF_RTS) {
-			macctl &= ~AR_TX_MAC_CTS;
-			macctl |= AR_TX_MAC_RTS;
-		}
-		if (params->ibp_flags & IEEE80211_BPF_FCS) {
-//			otus_write(sc, AR_MAC_REG_FCS_SELECT, AR_MAC_FCS_SWFCS);
-		}
-#if 0	/* XXX: TODO */
-		if (params->ibp_flags & IEEE80211_BPF_SHORTPRE)
-		if (params->ibp_flags & IEEE80211_BPF_CRYPTO)
-		if (params->ibp_flags & IEEE80211_BPF_DATAPAD)
-
-#define	IEEE80211_BPF_SHORTPRE	0x01	/* tx with short preamble */
-#define	IEEE80211_BPF_NOACK	0x02	/* tx with no ack */
-#define	IEEE80211_BPF_CRYPTO	0x04	/* tx with h/w encryption */
-#define	IEEE80211_BPF_FCS	0x10	/* frame includes FCS */
-#define	IEEE80211_BPF_DATAPAD	0x20	/* frame includes data padding */
-#define	IEEE80211_BPF_RTS	0x40	/* tx with RTS/CTS */
-#define	IEEE80211_BPF_CTS	0x80	/* tx with CTS only */
-#endif	/* XXX: TODO */
-	}
-#endif	/* IEEE80211_INJECTION */
-
 	/* Update rate control stats for frames that are ACK'ed. */
 	if (!(macctl & AR_TX_MAC_NOACK))
 		on->amn.amn_txcnt++;
@@ -2088,9 +2036,11 @@ otus_tx(struct otus_softc *sc, struct mb
 		struct otus_tx_radiotap_header *tap = &sc->sc_txtap;
 
 		tap->wt_flags = 0;
+		if (wh->i_fc[1] & IEEE80211_FC1_WEP)
+			tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP;
 		tap->wt_rate = otus_rates[ridx].rate;
-		tap->wt_chan_freq = htole16(ic->ic_bss->ni_chan->ic_freq);
-		tap->wt_chan_flags = htole16(ic->ic_bss->ni_chan->ic_flags);
+		tap->wt_chan_freq = htole16(ic->ic_curchan->ic_freq);
+		tap->wt_chan_flags = htole16(ic->ic_curchan->ic_flags);
 
 		bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m);
 	}
@@ -2141,28 +2091,21 @@ otus_start(struct ifnet *ifp)
 		 * later.  Both must be done inside a single lock.
 		 */
 		mutex_enter(&sc->sc_tx_mtx);
-		if (data == NULL) {
+		if (data == NULL && !TAILQ_EMPTY(&sc->sc_tx_free_list)) {
 			data = TAILQ_FIRST(&sc->sc_tx_free_list);
-			if (data == NULL) {
-				mutex_exit(&sc->sc_tx_mtx);
-				/*
-				 * No data buffers are available.  Set
-				 * the IFF_OACTIVE bit and bail
-				 * immediately.  otus_txeof() will
-				 * release this bit when it releases a
-				 * buffer and restarts otus_start().
-				 */
-				ifp->if_flags |= IFF_OACTIVE;
-				DPRINTFN(DBG_TX, sc, "empty sc_tx_free_list\n");
-				return;
-			}
 			TAILQ_REMOVE(&sc->sc_tx_free_list, data, next);
 		}
+		mutex_exit(&sc->sc_tx_mtx);
+
+		if (data == NULL) {
+			ifp->if_flags |= IFF_OACTIVE;
+			DPRINTFN(DBG_TX, sc, "empty sc_tx_free_list\n");
+			return;
+		}
 
 		/* Send pending management frames first. */
 		IF_DEQUEUE(&ic->ic_mgtq, m);
 		if (m != NULL) {
-			mutex_exit(&sc->sc_tx_mtx);
 			ni = (void *)m->m_pkthdr.rcvif;
 			m->m_pkthdr.rcvif = NULL;
 			goto sendit;
@@ -2176,8 +2119,6 @@ otus_start(struct ifnet *ifp)
 		if (m == NULL)
 			break;
 
-		mutex_exit(&sc->sc_tx_mtx);
-
 		if (m->m_len < (int)sizeof(*eh) &&
 		    (m = m_pullup(m, sizeof(*eh))) == NULL) {
 			ifp->if_oerrors++;
@@ -2221,6 +2162,7 @@ otus_start(struct ifnet *ifp)
 	 * If here, we have a Tx buffer, but ran out of mbufs to
 	 * transmit.  Put the Tx buffer back to the free list.
 	 */
+	mutex_enter(&sc->sc_tx_mtx);
 	TAILQ_INSERT_TAIL(&sc->sc_tx_free_list, data, next);
 	mutex_exit(&sc->sc_tx_mtx);
 }
@@ -2246,25 +2188,6 @@ otus_watchdog(struct ifnet *ifp)
 		ifp->if_timer = 1;
 	}
 	ieee80211_watchdog(&sc->sc_ic);
-
-#if 0
-	/* XXX: should we be doing something like this? */
-	struct url_chain *c;
-	usbd_status stat;
-	int s;
-
-	ifp->if_oerrors++;
-	printf("%s: watchdog timeout\n", device_xname(sc->sc_dev));
-
-	s = splusb();
-	c = &sc->sc_cdata.url_tx_chain[0];
-	usbd_get_xfer_status(c->url_xfer, NULL, NULL, NULL, &stat);
-	url_txeof(c->url_xfer, c, stat);
-
-	if (IFQ_IS_EMPTY(&ifp->if_snd) == 0)
-		url_start(ifp);
-	splx(s);
-#endif
 }
 
 Static int
@@ -2346,7 +2269,7 @@ otus_ioctl(struct ifnet *ifp, u_long cmd
 			if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) ==
 			    (IFF_UP | IFF_RUNNING)) {
 				mutex_enter(&sc->sc_write_mtx);
-				otus_set_chan(sc, ic->ic_ibss_chan, 0);
+				otus_set_chan(sc, ic->ic_curchan, 0);
 				mutex_exit(&sc->sc_write_mtx);
 			}
 			error = 0;
@@ -3291,8 +3214,7 @@ otus_init(struct ifnet *ifp)
 	(void)otus_write_barrier(sc);
 
 	sc->sc_bb_reset = 1;	/* Force cold reset. */
-	ic->ic_bss->ni_chan = ic->ic_ibss_chan;
-	if ((error = otus_set_chan(sc, ic->ic_ibss_chan, 0)) != 0) {
+	if ((error = otus_set_chan(sc, ic->ic_curchan, 0)) != 0) {
 		mutex_exit(&sc->sc_write_mtx);
 		aprint_error_dev(sc->sc_dev, "could not set channel\n");
 		return error;
@@ -3345,27 +3267,3 @@ otus_stop(struct ifnet *ifp)
 	(void)otus_write_barrier(sc);
 	mutex_exit(&sc->sc_write_mtx);
 }
-
-#if IEEE80211_INJECTION
-static int
-otus_output(struct ifnet *ifp, struct mbuf *m,
-    const struct sockaddr *dst, struct rtentry *rt)
-{
-	struct otus_softc *sc;
-	struct ieee80211com *ic;
-
-	sc = ifp->if_softc;
-
-	DPRINTFN(DBG_FN, sc, "\n");
-
-	ic = &sc->sc_ic;
-
-	/*
-	 * Hand to the 802.3 code if not tagged as a raw 802.11 frame.
-	 */
-	if (dst->sa_family != AF_IEEE80211)
-		return sc->sc_if_output(ifp, m, dst, rt);
-
-	return ieee80211_output(ifp, m, dst, ic);
-}
-#endif /* IEEE80211_INJECTION */

Index: src/sys/dev/usb/if_otusvar.h
diff -u src/sys/dev/usb/if_otusvar.h:1.5 src/sys/dev/usb/if_otusvar.h:1.6
--- src/sys/dev/usb/if_otusvar.h:1.5	Mon Jan 21 11:48:23 2013
+++ src/sys/dev/usb/if_otusvar.h	Tue Jan 29 08:54:26 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_otusvar.h,v 1.5 2013/01/21 16:48:23 christos Exp $	*/
+/*	$NetBSD: if_otusvar.h,v 1.6 2013/01/29 13:54:26 christos Exp $	*/
 /*	$OpenBSD: if_otusreg.h,v 1.6 2009/04/06 18:17:01 damien Exp $	*/
 
 /*-
@@ -286,12 +286,6 @@ struct otus_softc {
 
 	uint8_t				sc_rx_error_msk;
 	int				sc_dying;
-
-#if IEEE80211_INJECTION	/* XXX: ljt */
-	int	(*sc_if_output)		/* ether output routine */
-		    (struct ifnet *, struct mbuf *, const struct sockaddr *,
-		    struct rtentry *);
-#endif
 };
 
 #endif /* _IF_OTUSVAR_H_ */

Reply via email to