On Wed, Mar 15, 2023 at 01:36:47PM +0100, Stefan Sperling wrote: > On Wed, Mar 15, 2023 at 09:18:25AM +1100, Jonathan Gray wrote: > > On Tue, Mar 14, 2023 at 01:37:28PM +0100, Stefan Sperling wrote: > > > On Tue, Mar 14, 2023 at 12:19:10PM +0000, Klemens Nanni wrote: > > > > Here is an yet untested WEP removal diff based on 'grep WEP' in case we > > > > go > > > > this way rather than fixing WEP. > > > > > > Did you test wether adding the WEP capability flag to the driver is > > > sufficient? If you have a hostap-capable interface like athn(4) and > > > a bwfm(4) client it is trvial to create a test setup for this. Just > > > use static IPs on AP and client and try get to a ping through. > > > > > > I would encourage you to at least try to fix WEP instead of axing > > > things that would need to be reinstated once it's been fixed. > > > Maybe one day you will be traveling and depend on bwfm(4) to connect > > > to some WEP-only hotspot and then you will be happy to have fixed it ;) > > > > It isn't enough. > > > > panic'd without 'if (cmd->ni != NULL)' > > Yes, that is needed because intially net80211 sets all the WEP keys > while passing NULL for the 'ni' argument. > > > I started on this, but didn't get to a point where it could > > pass traffic to another machine running hostap. > > Huh. But your diff is in fact working for me...?!? > > Did you use athn(4) hostap to test this? I noticed mine comes up > in 'mode 11n' by default even if WEP is configured, which is a > misconfigured state because 11n requires WPA.
I think it was bwfm(4) on Raspberry Pi 3, hostap with rum(4). It would associate but not pass traffic. > > With your diff I can ping an athn(4) WEP hostap in 11g (not n) mode using > a USB bwfm device (vendor/product 0a5c:bd1e, Raspberry Pi 2 wifi dongle): > bwfm0 at uhub1 port 1 configuration 1 interface 0 "Broadcom Remote Download > Wireless Adapter" rev 2.00/0.01 addr 5 > > > Perhaps it would be easier to do software WEP. > > Software crypto is impossible on this device because it expects > Ethernet frames from the kernel, rather than 802.11 frames... :-/ > > We should probably avoid asking the device to do wpa and wep at the > same time. The old code was inherited from Linux as-is but not clearing > the other crypto mode flags when we change the mode seems wrong to me. > I have tweaked the driver accordingly, see below. Though this tweak doesn't > make a difference during testing, even while flipping between WEP and WPA. > Presumably the internal device state is always getting reset somehow before > we read it out and change it. > > If WEP still doesn't work on your device then we may need to set > the authmode to SHARED_KEY on some devices: > > bwfm_fwvar_var_set_int(sc, "auth", BWFM_AUTH_SHARED_KEY); >From what I remember changing the authmode resulted in associate failing. > > My device requires OPEN auth and does not work if SHARED_KEY is set. > But maybe this differs between device/firmware versions as hinted at > by the comments in my slightly tweaked diff below, based on yours. > > OK stsp@ for your diff if you want to commit it. > I can layer my cosmetic tweaks on top. It will be a day or two until I can set everything up again. If this works for you I think you should commit it. ok jsg@ > > diff d5650cee3563531d216bf9be18275aff4dec8349 > 9ed7f223411e76981d3f306085bf471975800ad3 > commit - d5650cee3563531d216bf9be18275aff4dec8349 > commit + 9ed7f223411e76981d3f306085bf471975800ad3 > blob - 56c8e2365b5aadb2f9f32bcc99a0a73f4b2ded0f > blob + f3ab1d1bb3bdf51986512481edb5d274a61dd9d9 > --- sys/dev/ic/bwfm.c > +++ sys/dev/ic/bwfm.c > @@ -199,6 +199,7 @@ bwfm_attach(struct bwfm_softc *sc) > ic->ic_state = IEEE80211_S_INIT; > > ic->ic_caps = > + IEEE80211_C_WEP | > #ifndef IEEE80211_STA_ONLY > IEEE80211_C_HOSTAP | /* Access Point */ > #endif > @@ -2001,8 +2002,7 @@ bwfm_connect(struct bwfm_softc *sc) > uint8_t *frm; > > /* > - * OPEN: Open or WPA/WPA2 on newer Chips/Firmware. > - * SHARED KEY: WEP. > + * OPEN: Open or WEP or WPA/WPA2 on newer Chips/Firmware. > * AUTO: Automatic, probably for older Chips/Firmware. > */ > if (ic->ic_flags & IEEE80211_F_RSNON) { > @@ -2041,6 +2041,9 @@ bwfm_connect(struct bwfm_softc *sc) > > bwfm_fwvar_var_set_int(sc, "wpa_auth", wpa); > bwfm_fwvar_var_set_int(sc, "wsec", wsec); > + } else if (ic->ic_flags & IEEE80211_F_WEPON) { > + bwfm_fwvar_var_set_int(sc, "wpa_auth", BWFM_WPA_AUTH_DISABLED); > + bwfm_fwvar_var_set_int(sc, "wsec", BWFM_WSEC_WEP); > } else { > bwfm_fwvar_var_set_int(sc, "wpa_auth", BWFM_WPA_AUTH_DISABLED); > bwfm_fwvar_var_set_int(sc, "wsec", BWFM_WSEC_NONE); > @@ -2083,8 +2086,7 @@ bwfm_hostap(struct bwfm_softc *sc) > struct bwfm_join_params join; > > /* > - * OPEN: Open or WPA/WPA2 on newer Chips/Firmware. > - * SHARED KEY: WEP. > + * OPEN: Open or WEP or WPA/WPA2 on newer Chips/Firmware. > * AUTO: Automatic, probably for older Chips/Firmware. > */ > if (ic->ic_flags & IEEE80211_F_RSNON) { > @@ -2883,10 +2885,12 @@ bwfm_set_key_cb(struct bwfm_softc *sc, void *arg) > > bwfm_fwvar_var_set_data(sc, "wsec_key", &key, sizeof(key)); > bwfm_fwvar_var_get_int(sc, "wsec", &wsec); > + wsec &= ~(BWFM_WSEC_WEP | BWFM_WSEC_TKIP | BWFM_WSEC_AES); > wsec |= wsec_enable; > bwfm_fwvar_var_set_int(sc, "wsec", wsec); > > - if (sc->sc_key_tasks == 0) { > + if (wsec_enable != BWFM_WSEC_WEP && cmd->ni != NULL && > + sc->sc_key_tasks == 0) { > DPRINTF(("%s: marking port %s valid\n", DEVNAME(sc), > ether_sprintf(cmd->ni->ni_macaddr))); > cmd->ni->ni_port_valid = 1; > > >