From owner-freebsd-wireless@freebsd.org Thu Sep 17 15:22:44 2015 Return-Path: Delivered-To: freebsd-wireless@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 4873D9CE624 for ; Thu, 17 Sep 2015 15:22:44 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-io0-x233.google.com (mail-io0-x233.google.com [IPv6:2607:f8b0:4001:c06::233]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 1308C1213; Thu, 17 Sep 2015 15:22:44 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: by iofb144 with SMTP id b144so25678825iof.1; Thu, 17 Sep 2015 08:22:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=NujILDstc25HsM1A/WyUaE+9rK6UDcGyjo3y4ASUK0Y=; b=Q13KioPaHrrU2XHSJ+cXqGzBhouT9JMOmX/BZU/wqxwE1MRemD0Yon4w+Q8tWIoAh/ 0sbzgGZhVY+aPsD5A9HcXb0cUbNT3HN8SNCwisTPbnsP9L0A76rQkHY1LlLCglhYD2Hd 3zSs1llIXHLTCeD5NvTEBLIuPTTCdg89eK2QzkRR5fC6/U/5d1YK2nPDolpPrQh66rYR DC0Kj7S9MLNDyKrSWhKRz5bQIoixQVEy6PwuZOmD0X36Z884NTlPx7hmuuYOJ2jj3OVn LTXu7J0EL6XY5N39NuQtq9rCTHl9YROD4wrvnGsYJ1sa+cjZmN+NYSeL3gVGNY9IOdZw mRuQ== MIME-Version: 1.0 X-Received: by 10.107.46.228 with SMTP id u97mr6974982iou.165.1442503363394; Thu, 17 Sep 2015 08:22:43 -0700 (PDT) Received: by 10.36.28.208 with HTTP; Thu, 17 Sep 2015 08:22:43 -0700 (PDT) In-Reply-To: <20150917151249.GA68201@ns.kevlo.org> References: <55F90187.10809@shrew.net> <55F906CB.9030007@shrew.net> <55F996FD.5060804@shrew.net> <55FA6022.8090609@shrew.net> <20150917151249.GA68201@ns.kevlo.org> Date: Thu, 17 Sep 2015 08:22:43 -0700 Message-ID: Subject: Re: urtwn and hostap From: Adrian Chadd To: Kevin Lo Cc: Matthew Grooms , "freebsd-wireless@freebsd.org" Content-Type: text/plain; charset=UTF-8 X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 17 Sep 2015 15:22:44 -0000 I think this patch is missing beacon updates - it just transmits the same beacon over and oveR? -a On 17 September 2015 at 08:12, Kevin Lo wrote: > On Thu, Sep 17, 2015 at 01:39:30AM -0500, Matthew Grooms wrote: >> Seems to behave better now and hostap appears to be working ... >> >> #ifconfig wlan0 create wlandev urtwn0 wlanmode hostap >> #ifconfig wlan0 list caps >> drivercaps=2181c401 >> >> #ifconfig wlan0 up ssid freebsdap mode 11g channel 1 >> #ifconfig bridge0 create up addm em0 addm wlan0 >> >> #ifconfig wlan0 >> wlan0: flags=8943 metric >> 0 mtu 1500 >> ether 00:c3:e1:16:11:32 >> nd6 options=29 >> media: IEEE 802.11 Wireless Ethernet autoselect mode 11g >> status: running >> ssid freebsdap channel 1 (2412 MHz 11g) bssid 00:c3:e1:16:11:32 >> country US authmode OPEN privacy OFF txpower 0 scanvalid 60 >> protmode CTS dtimperiod 1 -dfs >> groups: wlan >> >> #ifconfig bridge0 >> bridge0: flags=8843 metric 0 mtu >> 1500 >> ether 02:df:20:d2:42:00 >> nd6 options=1 >> groups: bridge >> id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15 >> maxage 20 holdcnt 6 proto rstp maxaddr 2000 timeout 1200 >> root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0 >> member: wlan0 flags=143 >> ifmaxaddr 0 port 3 priority 128 path cost 370370 >> member: em0 flags=143 >> ifmaxaddr 0 port 1 priority 128 path cost 20000 >> >> The speed leaves a lot to be desired. Throughput for the associated host >> is typically about 2Mbit down and 6Mbit up. I'm assume that's indicative >> of a problem. Occasionally I also see the this message on the console >> when I'm bringing the adapter up ... >> >> wlan0: ieee80211_new_state_locked: pending INIT -> SCAN transition lost >> >> If I down and up the adapter again, it seems to correct itself. Not sure >> what that's all about. I am passing the USB adapter through to a VM >> inside of ESXi to test the patch, so maybe that has something to do with >> these quirks. I'll try to run some tests with the adapter associated to >> a physical AP tomorrow to get a baseline. > > I knew OpenBSD had patches about hostap support for urtwn(4), but those > don't look quite right. I think that's why OpenBSD developers didn't > commit them. BTW, NetBSD adopted OpenBSD's patches, I tested it on NetBSD > about four months ago, the connection was not stable... > >> Thanks, >> >> -Matthew > > Kevin > >> On 9/16/2015 11:24 AM, Adrian Chadd wrote: >> > The only one to look at is ath(4). I've not fixed/hacked on any other >> > hostap chips. :) >> > >> > if_ath_beacon.c has the logic - it gets a reference when creating a >> > beacon frame. >> > >> > >> > >> > -adrian >> > >> > >> > On 16 September 2015 at 09:21, Matthew Grooms wrote: >> >> On 9/16/2015 10:58 AM, Adrian Chadd wrote: >> >>> I think the net80211 beacon create routine doesn't allocate a node >> >>> ref. Yeah, it doesn't. You have to do ieee80211_ref_node() after >> >>> calling becaon_create(), and deref it if the tx fails. The TX success >> >>> will free the node ref for you. >> >>> >> >> Got it. I'll take another look at one of the drivers that support hostap to >> >> make sure I'm following the same pattern. Thanks again for the feedback! >> >> >> >> -Matthew >> >> >> >> >> >>> -adrian >> >>> >> >>> >> >>> On 16 September 2015 at 04:27, Idwer Vollering wrote: >> >>>> 2015-09-16 8:06 GMT+02:00 Matthew Grooms : >> >>>> >> >>>>> It looks like my screenshot got scrubbed. Here is my hopefully faithful >> >>>>> transcription ... >> >>>>> >> >>>>> Fatal trap 9: general protection fault while in kernel mode >> >>>>> cpuid = 3; apic id = 03 >> >>>>> instruction pointer = 0x20:0xffffffff80a01105 >> >>>>> stack pointer = 0x28:0xfffffe0092fe86f0 >> >>>>> frame pointer = 0x28:0xfffffe0092fe8740 >> >>>>> code segment = base 0x0, limit 0xfffff, type 0x1b >> >>>>> = DPL 0, pres 1, long 1, def32 0, gran >> >>>>> 1 >> >>>>> processor eflags = interrupt enabled, resume, IOPL = 0 >> >>>>> current process = 716 (ifconfig) >> >>>>> [thread pid 716 tid 100082 ] >> >>>>> Stopped at __mtx_lock_flags+0x55: movq (%r13),%rax >> >>>>> db> bt >> >>>>> Tracing pid 716 tid 100082 td 0xffffff800512814d0 >> >>>>> __mtx_lock_flags() at __mtx_lock_flags+0x55/frame 0xfffffe0092fe8740 >> >>>>> ieee80211_free_node() at ieee80211_free_node()_0x38/frame >> >>>>> 0xfffffe0092fe8780 >> >>>>> ieee80211_node_vdetach() at ieee80211_node_vdetach()+0x2d/frame >> >>>>> 0xfffffe0092fe87a0 >> >>>>> ieee80211_vap_detach() at ieee80211_vap_detach()+0x35e/frame >> >>>>> 0xfffffe0092fe87d0 >> >>>>> urtwn_vap_delete() at urtwn_vap_delete()+0xe/frame 0xfffffe0092fe87f0 >> >>>>> if_clone_destroyif() at if_clone_destroyif()+0x1aa/frame >> >>>>> 0xfffffe0092fe8840 >> >>>>> if_clone_destroy() at if_clone_destroy()0x8e/frame 0xfffffe0092fe8860 >> >>>>> kern_ioctl() at kern_ioctl()+0x230/frame 0xfffffe0092fe88c0 >> >>>>> sys_ioctl() at sys_ioctl()+0x153/frame 0xfffffe0092fe89a0 >> >>>>> amd64_syscall() at amd64_syscall()+0x282/frame 0xfffffe0092fe8ab0 >> >>>>> Xfast_syscall() at Xfast_syscall()+0xfb/frame 0xfffffe0092fe8ab0 >> >>>>> -- syscall (54, FreeBSD ELF64, sys_ioctl), rip = 0x8011e8c8a, rsp = >> >>>>> 0x7fffffffe2f8, rbp = 0x7fffffffe310 -- >> >>>>> db> >> >>>> Assuming dumpdev="AUTO" is set in /etc/rc.conf, you should have >> >>>> entered 'dump' at the db> blinker :) >> >>>> >> >>>> The trap details are found in /var/crash/, run kgdb: "kgdb >> >>>> /boot/kernel/kernel /var/crash/vmcore.last", then run 'bt' and 'up' at >> >>>> its prompt. >> >>>> >> >>>>> -Matthew >> >>>>> _______________________________________________ >> >>>>> freebsd-wireless@freebsd.org mailing list >> >>>>> https://lists.freebsd.org/mailman/listinfo/freebsd-wireless >> >>>>> To unsubscribe, send any mail to >> >>>>> "freebsd-wireless-unsubscribe@freebsd.org" >> >>>> _______________________________________________ >> >>>> freebsd-wireless@freebsd.org mailing list >> >>>> https://lists.freebsd.org/mailman/listinfo/freebsd-wireless >> >>>> To unsubscribe, send any mail to >> >>>> "freebsd-wireless-unsubscribe@freebsd.org" >> >>> _______________________________________________ >> >>> freebsd-wireless@freebsd.org mailing list >> >>> https://lists.freebsd.org/mailman/listinfo/freebsd-wireless >> >>> To unsubscribe, send any mail to >> >>> "freebsd-wireless-unsubscribe@freebsd.org" >> >> >> >> _______________________________________________ >> >> freebsd-wireless@freebsd.org mailing list >> >> https://lists.freebsd.org/mailman/listinfo/freebsd-wireless >> >> To unsubscribe, send any mail to "freebsd-wireless-unsubscribe@freebsd.org" >> > >> Index: sys/dev/usb/wlan/if_urtwn.c >> =================================================================== >> --- sys/dev/usb/wlan/if_urtwn.c (revision 287342) >> +++ sys/dev/usb/wlan/if_urtwn.c (working copy) >> @@ -181,6 +181,8 @@ >> static struct mbuf * urtwn_rxeof(struct usb_xfer *, struct urtwn_data *, >> int *, int8_t *); >> static void urtwn_txeof(struct usb_xfer *, struct urtwn_data *); >> +int urtwn_txbcn(struct ieee80211vap *vap, >> + struct ieee80211_node *); >> static int urtwn_alloc_list(struct urtwn_softc *, >> struct urtwn_data[], int, int); >> static int urtwn_alloc_rx_list(struct urtwn_softc *); >> @@ -436,6 +438,10 @@ >> | IEEE80211_C_WPA /* 802.11i */ >> ; >> >> + if (sc->chip & URTWN_CHIP_88E) >> + ic->ic_caps |= >> + IEEE80211_C_HOSTAP; /* HostAp mode supported */ >> + >> bands = 0; >> setbit(&bands, IEEE80211_MODE_11B); >> setbit(&bands, IEEE80211_MODE_11G); >> @@ -857,6 +863,39 @@ >> sc->sc_txtimer = 0; >> } >> >> +/* >> + * Push a beacon frame into the chip and check if it was accepted. Beacon will >> + * be repeated by the chip every R92C_BCN_INTERVAL. >> + */ >> +int >> +urtwn_txbcn(struct ieee80211vap *vap, struct ieee80211_node *ni) >> +{ >> + struct ieee80211com *ic = ni->ni_ic; >> + struct urtwn_softc *sc = ic->ic_softc; >> + struct urtwn_data *bf; >> + struct mbuf *m; >> + >> + ieee80211_ref_node(ni); >> + m = ieee80211_beacon_alloc(ni, &URTWN_VAP(vap)->bo); >> + >> + bf = urtwn_getbuf(sc); >> + if (bf == NULL) { >> + ieee80211_free_node(ni); >> + m_freem(m); >> + return (ENOBUFS); >> + } >> + >> + if (urtwn_tx_start(sc, ni, m, bf) != 0) { >> + ieee80211_free_node(ni); >> + STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next); >> + return (EIO); >> + } >> + >> + sc->sc_txtimer = 5; >> + >> + return (0); >> +} >> + >> static void >> urtwn_bulk_tx_callback(struct usb_xfer *xfer, usb_error_t error) >> { >> @@ -1466,6 +1505,7 @@ >> struct ieee80211_node *ni; >> enum ieee80211_state ostate; >> uint32_t reg; >> + int error; >> >> ostate = vap->iv_state; >> DPRINTF("%s -> %s\n", ieee80211_state_name[ostate], >> @@ -1553,23 +1593,68 @@ >> } >> >> ni = ieee80211_ref_node(vap->iv_bss); >> - /* Set media status to 'Associated'. */ >> - reg = urtwn_read_4(sc, R92C_CR); >> - reg = RW(reg, R92C_CR_NETTYPE, R92C_CR_NETTYPE_INFRA); >> - urtwn_write_4(sc, R92C_CR, reg); >> >> - /* Set BSSID. */ >> - urtwn_write_4(sc, R92C_BSSID + 0, LE_READ_4(&ni->ni_bssid[0])); >> - urtwn_write_4(sc, R92C_BSSID + 4, LE_READ_2(&ni->ni_bssid[4])); >> + if (ic->ic_opmode == IEEE80211_M_STA) { >> + /* Set BSSID. */ >> + urtwn_write_4(sc, R92C_BSSID + 0, >> + LE_READ_4(&ni->ni_bssid[0])); >> + urtwn_write_4(sc, R92C_BSSID + 4, >> + LE_READ_2(&ni->ni_bssid[4])); >> >> - if (ic->ic_curmode == IEEE80211_MODE_11B) >> - urtwn_write_1(sc, R92C_INIRTS_RATE_SEL, 0); >> - else /* 802.11b/g */ >> - urtwn_write_1(sc, R92C_INIRTS_RATE_SEL, 3); >> + if (ic->ic_curmode == IEEE80211_MODE_11B) >> + urtwn_write_1(sc, R92C_INIRTS_RATE_SEL, 0); >> + else /* 802.11b/g */ >> + urtwn_write_1(sc, R92C_INIRTS_RATE_SEL, 3); >> >> - /* Enable Rx of data frames. */ >> - urtwn_write_2(sc, R92C_RXFLTMAP2, 0xffff); >> + /* Enable Rx of data frames. */ >> + urtwn_write_2(sc, R92C_RXFLTMAP2, 0xffff); >> >> + /* Allow Rx from our BSSID only. */ >> + urtwn_write_4(sc, R92C_RCR, urtwn_read_4(sc, R92C_RCR) | >> + R92C_RCR_CBSSID_DATA | R92C_RCR_CBSSID_BCN); >> + >> + /* Set media status to 'Associated'. */ >> + reg = urtwn_read_4(sc, R92C_CR); >> + reg = RW(reg, R92C_CR_NETTYPE, R92C_CR_NETTYPE_INFRA); >> + urtwn_write_4(sc, R92C_CR, reg); >> + } >> + >> + if (ic->ic_opmode == IEEE80211_M_HOSTAP) { >> + /* Set media status to 'AP'. */ >> + reg = urtwn_read_4(sc, R92C_CR); >> + reg = RW(reg, R92C_CR_NETTYPE, R92C_CR_NETTYPE_AP); >> + urtwn_write_4(sc, R92C_CR, reg); >> + >> + /* Set BSSID. */ >> + urtwn_write_4(sc, R92C_BSSID + 0, >> + LE_READ_4(&ni->ni_bssid[0])); >> + urtwn_write_4(sc, R92C_BSSID + 4, >> + LE_READ_2(&ni->ni_bssid[4])); >> + >> + /* >> + * If 3rd or 4th bits are set to zero chip will stop >> + * repeating beacon after first transmission for port0 >> + * and port1 respectively. This will cause STAs to >> + * disconnect after short period of time. >> + */ >> + reg = urtwn_read_1(sc, R92C_MBID_NUM); >> + reg |= 0x8; >> + reg |= 0x10; >> + urtwn_write_1(sc, R92C_MBID_NUM, reg); >> + >> + /* Invalidate cam entries */ >> + urtwn_cam_init(sc); >> + >> + /* Set chan/bw */ >> + urtwn_set_chan(sc, ic->ic_curchan, NULL); >> + >> + /* Push beacon frame into the chip */ >> + error = urtwn_txbcn(vap, ni); >> + if (error != 0) >> + printf("%s: unable to push beacon into the" >> + " chip\n", device_get_nameunit(sc->sc_dev)); >> + } >> + >> /* Flush all AC queues. */ >> urtwn_write_1(sc, R92C_TXPAUSE, 0); >> >> @@ -1576,11 +1661,6 @@ >> /* Set beacon interval. */ >> urtwn_write_2(sc, R92C_BCN_INTERVAL, ni->ni_intval); >> >> - /* Allow Rx from our BSSID only. */ >> - urtwn_write_4(sc, R92C_RCR, >> - urtwn_read_4(sc, R92C_RCR) | >> - R92C_RCR_CBSSID_DATA | R92C_RCR_CBSSID_BCN); >> - >> /* Enable TSF synchronization. */ >> urtwn_tsf_sync_enable(sc); >> >> @@ -1754,7 +1834,7 @@ >> struct ieee80211vap *vap = ni->ni_vap; >> struct usb_xfer *xfer; >> struct r92c_tx_desc *txd; >> - uint8_t raid, type; >> + uint8_t raid, type, subtype; >> uint16_t sum; >> int i, hasqos, xferlen; >> struct usb_xfer *urtwn_pipes[4] = { >> @@ -1771,6 +1851,7 @@ >> */ >> wh = mtod(m0, struct ieee80211_frame *); >> type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; >> + subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; >> >> if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) { >> k = ieee80211_crypto_encap(ni, m0); >> @@ -1819,7 +1900,7 @@ >> if (sc->chip & URTWN_CHIP_88E) { >> txd->txdw1 |= htole32( >> SM(R88E_TXDW1_MACID, URTWN_MACID_BSS) | >> - SM(R92C_TXDW1_QSEL, R92C_TXDW1_QSEL_BE) | >> + SM(R92C_TXDW1_QSEL, R88E_TXDW1_QSEL_BE) | >> SM(R92C_TXDW1_RAID, raid)); >> txd->txdw2 |= htole32(R88E_TXDW2_AGGBK); >> } else { >> @@ -1843,9 +1924,20 @@ >> /* Send data at OFDM54. */ >> txd->txdw5 |= htole32(SM(R92C_TXDW5_DATARATE, 11)); >> } else { >> + /* >> + * If beacon frame is pushed into wrong queue, the chip won't >> + * start repeating it. >> + */ >> + if (subtype == IEEE80211_FC0_SUBTYPE_BEACON && >> + sc->chip & URTWN_CHIP_88E) >> + txd->txdw1 |= htole32(SM(R92C_TXDW1_QSEL, >> + R88E_TXDW1_QSEL_MGNT)); >> + else >> + txd->txdw1 |= htole32(SM(R92C_TXDW1_QSEL, >> + R92C_TXDW1_QSEL_MGNT)); >> + >> txd->txdw1 |= htole32( >> SM(R92C_TXDW1_MACID, 0) | >> - SM(R92C_TXDW1_QSEL, R92C_TXDW1_QSEL_MGNT) | >> SM(R92C_TXDW1_RAID, R92C_RAID_11B)); >> >> /* Force CCK1. */ >> Index: sys/dev/usb/wlan/if_urtwnreg.h >> =================================================================== >> --- sys/dev/usb/wlan/if_urtwnreg.h (revision 287342) >> +++ sys/dev/usb/wlan/if_urtwnreg.h (working copy) >> @@ -1019,7 +1019,9 @@ >> #define R92C_TXDW1_QSEL_M 0x00001f00 >> #define R92C_TXDW1_QSEL_S 8 >> #define R92C_TXDW1_QSEL_BE 0x00 >> +#define R88E_TXDW1_QSEL_BE 0x03 >> #define R92C_TXDW1_QSEL_MGNT 0x12 >> +#define R88E_TXDW1_QSEL_MGNT 0x10 >> #define R92C_TXDW1_RAID_M 0x000f0000 >> #define R92C_TXDW1_RAID_S 16 >> #define R92C_TXDW1_CIPHER_M 0x00c00000 > >> _______________________________________________ >> freebsd-wireless@freebsd.org mailing list >> https://lists.freebsd.org/mailman/listinfo/freebsd-wireless >> To unsubscribe, send any mail to "freebsd-wireless-unsubscribe@freebsd.org" >