On Thu, Jan 16, 2014 at 01:43:22AM +0100, Stefan Sperling wrote: > I had almost forgotten that wifi hacking can be fun if it results > in something working. > > Tested between two laptops (hostap) and with Berlin's freifunk > network (ibss). Seems to work but I have no idea about long > term stability yet. Additional testing much appreciated.
Is nobody able to test this? > Index: sys/dev/usb/if_urtwn.c > =================================================================== > RCS file: /cvs/src/sys/dev/usb/if_urtwn.c,v > retrieving revision 1.32 > diff -u -p -r1.32 if_urtwn.c > --- sys/dev/usb/if_urtwn.c 30 Sep 2013 05:18:57 -0000 1.32 > +++ sys/dev/usb/if_urtwn.c 16 Jan 2014 00:26:03 -0000 > @@ -240,6 +240,10 @@ void urtwn_lc_calib(struct urtwn_softc > void urtwn_temp_calib(struct urtwn_softc *); > int urtwn_init(struct ifnet *); > void urtwn_stop(struct ifnet *); > +#ifndef IEEE80211_STA_ONLY > +void urtwn_newassoc(struct ieee80211com *, struct ieee80211_node *, > + int); > +#endif > > /* Aliases. */ > #define urtwn_bb_write urtwn_write_4 > @@ -332,6 +336,10 @@ urtwn_attach(struct device *parent, stru > /* Set device capabilities. */ > ic->ic_caps = > IEEE80211_C_MONITOR | /* Monitor mode supported. */ > +#ifndef IEEE80211_STA_ONLY > + IEEE80211_C_IBSS | /* IBSS mode supported */ > + IEEE80211_C_HOSTAP | /* HostAp mode supported */ > +#endif > IEEE80211_C_SHPREAMBLE | /* Short preamble supported. */ > IEEE80211_C_SHSLOT | /* Short slot time supported. */ > IEEE80211_C_WEP | /* WEP. */ > @@ -377,6 +385,9 @@ urtwn_attach(struct device *parent, stru > > if_attach(ifp); > ieee80211_ifattach(ifp); > +#ifndef IEEE80211_STA_ONLY > + ic->ic_newassoc = urtwn_newassoc; > +#endif > ic->ic_updateedca = urtwn_updateedca; > #ifdef notyet > ic->ic_set_key = urtwn_set_key; > @@ -1153,6 +1164,17 @@ urtwn_next_scan(void *arg) > usbd_ref_decr(sc->sc_udev); > } > > +#ifndef IEEE80211_STA_ONLY > +void > +urtwn_newassoc(struct ieee80211com *ic, struct ieee80211_node *ni, int isnew) > +{ > + DPRINTF(("new node %s\n", ether_sprintf(ni->ni_macaddr))); > + /* start with lowest Tx rate */ > + ni->ni_txrate = 0; > +} > +#endif > + > + > int > urtwn_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg) > { > @@ -1175,6 +1197,9 @@ urtwn_newstate_cb(struct urtwn_softc *sc > enum ieee80211_state ostate; > uint32_t reg; > int s; > +#ifndef IEEE80211_STA_ONLY > + u_int8_t msr; > +#endif > > s = splnet(); > ostate = ic->ic_state; > @@ -1270,6 +1295,8 @@ urtwn_newstate_cb(struct urtwn_softc *sc > } > ni = ic->ic_bss; > > + urtwn_set_chan(sc, ni->ni_chan, NULL); > + > /* Set media status to 'Associated'. */ > reg = urtwn_read_4(sc, R92C_CR); > reg = RW(reg, R92C_CR_NETTYPE, R92C_CR_NETTYPE_INFRA); > @@ -1298,6 +1325,33 @@ urtwn_newstate_cb(struct urtwn_softc *sc > urtwn_read_4(sc, R92C_RCR) | > R92C_RCR_CBSSID_DATA | R92C_RCR_CBSSID_BCN); > > +#ifndef IEEE80211_STA_ONLY > + if (ic->ic_opmode == IEEE80211_M_HOSTAP) { > + urtwn_write_2(sc, R92C_BCNTCFG, 0x000f); > + > + /* Allow Rx from any BSSID. */ > + urtwn_write_4(sc, R92C_RCR, > + urtwn_read_4(sc, R92C_RCR) & > + ~(R92C_RCR_CBSSID_DATA | R92C_RCR_CBSSID_BCN)); > + > + /* Reset TSF timer to zero. */ > + reg = urtwn_read_4(sc, R92C_TCR); > + reg &= ~0x01; > + urtwn_write_4(sc, R92C_TCR, reg); > + reg |= 0x01; > + urtwn_write_4(sc, R92C_TCR, reg); > + } > + > + msr = urtwn_read_1(sc, R92C_MSR); > + msr &= 0xfc; > + if (ic->ic_opmode == IEEE80211_M_HOSTAP) > + msr |= R92C_MSR_AP; > + else if (ic->ic_opmode == IEEE80211_M_IBSS) > + msr |= R92C_MSR_ADHOC; > + else > + msr |= R92C_MSR_INFRA; > + urtwn_write_1(sc, R92C_MSR, msr); > +#endif > /* Enable TSF synchronization. */ > urtwn_tsf_sync_enable(sc); > > @@ -3118,8 +3172,8 @@ urtwn_init(struct ifnet *ifp) > > /* Initialize beacon parameters. */ > urtwn_write_2(sc, R92C_TBTT_PROHIBIT, 0x6404); > - urtwn_write_1(sc, R92C_DRVERLYINT, 0x05); > - urtwn_write_1(sc, R92C_BCNDMATIM, 0x02); > + urtwn_write_1(sc, R92C_DRVERLYINT, R92C_DRIVER_EARLY_INT_TIME); /* ms */ > + urtwn_write_1(sc, R92C_BCNDMATIM, R92C_DMA_ATIME_INT_TIME); > urtwn_write_2(sc, R92C_BCNTCFG, 0x660f); > > /* Setup AMPDU aggregation. */ > Index: sys/dev/usb/if_urtwnreg.h > =================================================================== > RCS file: /cvs/src/sys/dev/usb/if_urtwnreg.h,v > retrieving revision 1.4 > diff -u -p -r1.4 if_urtwnreg.h > --- sys/dev/usb/if_urtwnreg.h 15 Apr 2013 09:23:01 -0000 1.4 > +++ sys/dev/usb/if_urtwnreg.h 16 Jan 2014 00:03:21 -0000 > @@ -82,6 +82,7 @@ > #define R92C_SYS_CFG 0x0f0 > /* MAC General Configuration. */ > #define R92C_CR 0x100 > +#define R92C_MSR 0x102 > #define R92C_PBP 0x104 > #define R92C_TRXDMA_CTRL 0x10c > #define R92C_TRXFF_BNDY 0x114 > @@ -187,6 +188,7 @@ > /* WMAC Configuration. */ > #define R92C_APSD_CTRL 0x600 > #define R92C_BWOPMODE 0x603 > +#define R92C_TCR 0x604 > #define R92C_RCR 0x608 > #define R92C_RX_DRVINFO_SZ 0x60f > #define R92C_MACID 0x610 > @@ -356,6 +358,12 @@ > #define R92C_CR_NETTYPE_INFRA 2 > #define R92C_CR_NETTYPE_AP 3 > > +/* Bits for R92C_MSR. */ > +#define R92C_MSR_NOLINK 0x00 > +#define R92C_MSR_ADHOC 0x01 > +#define R92C_MSR_INFRA 0x02 > +#define R92C_MSR_AP 0x03 > + > /* Bits for R92C_PBP. */ > #define R92C_PBP_PSRX_M 0x0f > #define R92C_PBP_PSRX_S 0 > @@ -454,6 +462,12 @@ > #define R92C_BCN_CTRL_TXBCN_RPT 0x04 > #define R92C_BCN_CTRL_EN_BCN 0x08 > #define R92C_BCN_CTRL_DIS_TSF_UDT0 0x10 > + > +/* Bits for R92C_DRVERLYINT */ > +#define R92C_DRIVER_EARLY_INT_TIME 0x05 > + > +/* Bits for R92C_BCNDMATIM */ > +#define R92C_DMA_ATIME_INT_TIME 0x02 > > /* Bits for R92C_APSD_CTRL. */ > #define R92C_APSD_CTRL_OFF 0x40 > Index: share/man/man4/urtwn.4 > =================================================================== > RCS file: /cvs/src/share/man/man4/urtwn.4,v > retrieving revision 1.26 > diff -u -p -r1.26 urtwn.4 > --- share/man/man4/urtwn.4 30 Sep 2013 05:18:56 -0000 1.26 > +++ share/man/man4/urtwn.4 16 Jan 2014 00:27:53 -0000 > @@ -50,6 +50,18 @@ Also known as > mode, this is used when associating with an access point, through > which all traffic passes. > This mode is the default. > +.It IBSS mode > +Also known as > +.Em IEEE ad-hoc > +mode or > +.Em peer-to-peer > +mode. > +This is the standardized method of operating without an access point. > +Stations associate with a service set. > +However, actual connections between stations are peer-to-peer. > +.It Host AP > +In this mode the driver acts as an access point (base station) > +for other cards. > .It monitor mode > In this mode the driver is able to receive packets without > associating with an access point.