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. 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); 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. 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;