svn commit: r344994 - head/sys/dev/usb/wlan

Andriy Voskoboinyk avos at FreeBSD.org
Mon Mar 11 02:02:05 UTC 2019


Author: avos
Date: Mon Mar 11 02:02:04 2019
New Revision: 344994
URL: https://svnweb.freebsd.org/changeset/base/344994

Log:
  urtw(4): add promiscuous mode callback
  
  Also, pass control frames to the host while in MONITOR mode and / or
  when promiscuous mode is enabled.
  
  Tested with Netgear WG111 v3 (RTL8187B), STA / MONITOR modes.
  
  MFC after:	2 weeks

Modified:
  head/sys/dev/usb/wlan/if_urtw.c

Modified: head/sys/dev/usb/wlan/if_urtw.c
==============================================================================
--- head/sys/dev/usb/wlan/if_urtw.c	Mon Mar 11 01:45:26 2019	(r344993)
+++ head/sys/dev/usb/wlan/if_urtw.c	Mon Mar 11 02:02:04 2019	(r344994)
@@ -670,6 +670,7 @@ static void		urtw_scan_end(struct ieee80211com *);
 static void		urtw_getradiocaps(struct ieee80211com *, int, int *,
 			   struct ieee80211_channel[]);
 static void		urtw_set_channel(struct ieee80211com *);
+static void		urtw_update_promisc(struct ieee80211com *);
 static void		urtw_update_mcast(struct ieee80211com *);
 static int		urtw_tx_start(struct urtw_softc *,
 			    struct ieee80211_node *, struct mbuf *,
@@ -896,6 +897,7 @@ urtw_attach(device_t dev)
 	ic->ic_updateslot = urtw_updateslot;
 	ic->ic_vap_create = urtw_vap_create;
 	ic->ic_vap_delete = urtw_vap_delete;
+	ic->ic_update_promisc = urtw_update_promisc;
 	ic->ic_update_mcast = urtw_update_mcast;
 	ic->ic_parent = urtw_parent;
 	ic->ic_transmit = urtw_transmit;
@@ -1631,6 +1633,17 @@ fail:
 }
 
 static void
+urtw_update_promisc(struct ieee80211com *ic)
+{
+	struct urtw_softc *sc = ic->ic_softc;
+
+	URTW_LOCK(sc);
+	if (sc->sc_flags & URTW_RUNNING)
+		urtw_rx_setconf(sc);
+	URTW_UNLOCK(sc);
+}
+
+static void
 urtw_update_mcast(struct ieee80211com *ic)
 {
 
@@ -3873,7 +3886,6 @@ urtw_rx_setconf(struct urtw_softc *sc)
 	if (sc->sc_flags & URTW_RTL8187B) {
 		data = data | URTW_RX_FILTER_MNG | URTW_RX_FILTER_DATA |
 		    URTW_RX_FILTER_MCAST | URTW_RX_FILTER_BCAST |
-		    URTW_RX_FILTER_NICMAC | URTW_RX_CHECK_BSSID |
 		    URTW_RX_FIFO_THRESHOLD_NONE |
 		    URTW_MAX_RX_DMA_2048 |
 		    URTW_RX_AUTORESETPHY | URTW_RCR_ONLYERLPKT;
@@ -3888,19 +3900,21 @@ urtw_rx_setconf(struct urtw_softc *sc)
 		if (sc->sc_crcmon == 1 && ic->ic_opmode == IEEE80211_M_MONITOR)
 			data = data | URTW_RX_FILTER_CRCERR;
 
-		if (ic->ic_opmode == IEEE80211_M_MONITOR ||
-		    ic->ic_promisc > 0 || ic->ic_allmulti > 0) {
-			data = data | URTW_RX_FILTER_ALLMAC;
-		} else {
-			data = data | URTW_RX_FILTER_NICMAC;
-			data = data | URTW_RX_CHECK_BSSID;
-		}
-
 		data = data &~ URTW_RX_FIFO_THRESHOLD_MASK;
 		data = data | URTW_RX_FIFO_THRESHOLD_NONE |
 		    URTW_RX_AUTORESETPHY;
 		data = data &~ URTW_MAX_RX_DMA_MASK;
 		data = data | URTW_MAX_RX_DMA_2048 | URTW_RCR_ONLYERLPKT;
+	}
+
+	/* XXX allmulti should not be checked here... */
+	if (ic->ic_opmode == IEEE80211_M_MONITOR ||
+	    ic->ic_promisc > 0 || ic->ic_allmulti > 0) {
+		data = data | URTW_RX_FILTER_CTL;
+		data = data | URTW_RX_FILTER_ALLMAC;
+	} else {
+		data = data | URTW_RX_FILTER_NICMAC;
+		data = data | URTW_RX_CHECK_BSSID;
 	}
 
 	urtw_write32_m(sc, URTW_RX, data);


More information about the svn-src-all mailing list