On Sun, Jul 08, 2012 at 01:45:45AM +0300, Lazaros Koromilas wrote: > Hello all, > > I'm resending a diff that enables network cards running with > the wpi driver to enter promiscuous mode. I have changed > WPI_CMD_ASSOCIATE to WPI_CMD_ASSOCIATED to better designate its
You forgot to update a reference to this constant in a comment. Personally I'd prefer to leave the name alone to make the diff smaller. > purpose: alter options while in associated state. I'm running > with this for some time now without problems on a Thinkpad X60s. > > Can anyone test? Comments? I can test, but already have some questions after review, see below. > > Thanx! > Lazaros. > > > Index: if_wpi.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/if_wpi.c,v > retrieving revision 1.110 > diff -u -p -r1.110 if_wpi.c > --- if_wpi.c 2 Jun 2011 18:36:53 -0000 1.110 > +++ if_wpi.c 7 Jul 2012 18:01:54 -0000 > @@ -120,6 +120,7 @@ int wpi_ioctl(struct ifnet *, u_long, c > int wpi_cmd(struct wpi_softc *, int, const void *, int, int); > int wpi_mrr_setup(struct wpi_softc *); > void wpi_updateedca(struct ieee80211com *); > +void wpi_set_promisc(struct wpi_softc *, int); > void wpi_set_led(struct wpi_softc *, uint8_t, uint8_t, uint8_t); > int wpi_set_timing(struct wpi_softc *, struct ieee80211_node *); > void wpi_power_calibration(struct wpi_softc *); > @@ -2002,12 +2003,21 @@ wpi_ioctl(struct ifnet *ifp, u_long cmd, > /* FALLTHROUGH */ > case SIOCSIFFLAGS: > if (ifp->if_flags & IFF_UP) { > - if (!(ifp->if_flags & IFF_RUNNING)) > + if (ifp->if_flags & IFF_RUNNING) { > + if (ifp->if_flags & IFF_PROMISC && > + !(sc->sc_if_flags & IFF_PROMISC)) { > + wpi_set_promisc(sc, 1); > + } else if (!(ifp->if_flags & IFF_PROMISC) && > + sc->sc_if_flags & IFF_PROMISC) { > + wpi_set_promisc(sc, 0); > + } > + } else > error = wpi_init(ifp); > } else { > if (ifp->if_flags & IFF_RUNNING) > wpi_stop(ifp, 1); > } > + sc->sc_if_flags = ifp->if_flags; > break; > > case SIOCADDMULTI: > @@ -2206,6 +2216,26 @@ wpi_updateedca(struct ieee80211com *ic) > } > > void > +wpi_set_promisc(struct wpi_softc *sc, int turnon) > +{ > + struct wpi_assoc cmd; > + > + if (turnon) > + sc->rxon.filter |= htole32(WPI_FILTER_PROMISC | > + WPI_FILTER_CTL); > + else > + sc->rxon.filter &= ~htole32(WPI_FILTER_PROMISC | > + WPI_FILTER_CTL); > + > + memset(&cmd, 0, sizeof cmd); > + cmd.flags = sc->rxon.flags; > + cmd.filter = sc->rxon.filter; > + cmd.ofdm_mask = sc->rxon.ofdm_mask; > + cmd.cck_mask = sc->rxon.cck_mask; > + (void)wpi_cmd(sc, WPI_CMD_ASSOCIATED, &cmd, sizeof cmd, 1); The linux driver ("iwlegacy") doesn't run this command in async mode. Is there a reason why you're passing 1 for the last param, i.e. not waiting for a command-complete interrupt when sending WPI_CMD_ASSOCIATE? > +} > + > +void > wpi_set_led(struct wpi_softc *sc, uint8_t which, uint8_t off, uint8_t on) > { > struct wpi_cmd_led led; > @@ -3327,6 +3357,7 @@ wpi_init(struct ifnet *ifp) > > ifp->if_flags &= ~IFF_OACTIVE; > ifp->if_flags |= IFF_RUNNING; > + sc->sc_if_flags = ifp->if_flags; You don't need all of if_flags, just the IFF_PROMISC bit. Why not add a new flag to sc->sc_flags and use that instead? > > if (ic->ic_opmode != IEEE80211_M_MONITOR) > ieee80211_begin_scan(ifp); > Index: if_wpireg.h > =================================================================== > RCS file: /cvs/src/sys/dev/pci/if_wpireg.h,v > retrieving revision 1.27 > diff -u -p -r1.27 if_wpireg.h > --- if_wpireg.h 24 Oct 2009 20:17:17 -0000 1.27 > +++ if_wpireg.h 7 Jul 2012 18:01:54 -0000 > @@ -252,7 +252,7 @@ struct wpi_rx_desc { > struct wpi_tx_cmd { > uint8_t code; > #define WPI_CMD_RXON 16 > -#define WPI_CMD_ASSOCIATE 17 > +#define WPI_CMD_ASSOCIATED 17 > #define WPI_CMD_EDCA_PARAMS 19 > #define WPI_CMD_TIMING 20 > #define WPI_CMD_ADD_NODE 24 > Index: if_wpivar.h > =================================================================== > RCS file: /cvs/src/sys/dev/pci/if_wpivar.h,v > retrieving revision 1.23 > diff -u -p -r1.23 if_wpivar.h > --- if_wpivar.h 7 Sep 2010 16:21:45 -0000 1.23 > +++ if_wpivar.h 7 Jul 2012 18:01:54 -0000 > @@ -144,6 +144,8 @@ struct wpi_softc { > #define WPI_FLAG_HAS_5GHZ (1 << 0) > #define WPI_FLAG_BUSY (1 << 1) > > + int sc_if_flags; > + > /* Shared area. */ > struct wpi_dma_info shared_dma; > struct wpi_shared *shared;