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)'
I started on this, but didn't get to a point where it could
pass traffic to another machine running hostap.
Perhaps it would be easier to do software WEP.
incomplete diff:
Index: bwfm.c
===================================================================
RCS file: /cvs/src/sys/dev/ic/bwfm.c,v
retrieving revision 1.106
diff -u -p -r1.106 bwfm.c
--- bwfm.c 30 Dec 2022 16:49:34 -0000 1.106
+++ bwfm.c 8 Mar 2023 14:42:57 -0000
@@ -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
@@ -2041,10 +2042,14 @@ 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);
}
+
bwfm_fwvar_var_set_int(sc, "auth", BWFM_AUTH_OPEN);
bwfm_fwvar_var_set_int(sc, "mfp", BWFM_MFP_NONE);
@@ -2839,13 +2844,13 @@ bwfm_set_key_cb(struct bwfm_softc *sc, v
uint32_t wsec, wsec_enable;
int ext_key = 0;
+
sc->sc_key_tasks--;
if ((k->k_flags & IEEE80211_KEY_GROUP) == 0 &&
k->k_cipher != IEEE80211_CIPHER_WEP40 &&
k->k_cipher != IEEE80211_CIPHER_WEP104)
ext_key = 1;
-
memset(&key, 0, sizeof(key));
if (ext_key && !IEEE80211_IS_MULTICAST(ni->ni_macaddr))
memcpy(key.ea, ni->ni_macaddr, sizeof(key.ea));
@@ -2889,7 +2894,8 @@ bwfm_set_key_cb(struct bwfm_softc *sc, v
if (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;
+ if (cmd->ni != NULL)
+ cmd->ni->ni_port_valid = 1;
ieee80211_set_link_state(ic, LINK_STATE_UP);
}
}