From 439d38167ff0f7d54dc36ed9790a0f4f3d6a098a Mon Sep 17 00:00:00 2001 From: Alexander Egorenkov Date: Fri, 12 Mar 2010 23:32:11 +0100 Subject: [PATCH] Do not use VAPs in key set/delete callbacks, pass only opmode --- rt2870.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/rt2870.c b/rt2870.c index 66b3579..4bac740 100644 --- a/rt2870.c +++ b/rt2870.c @@ -82,12 +82,14 @@ struct rt2870_cmd_argv_keyset { + enum ieee80211_opmode opmode; struct ieee80211_key key; uint8_t staid; }; struct rt2870_cmd_argv_keydelete { + enum ieee80211_opmode opmode; struct ieee80211_key key; }; @@ -2105,6 +2107,8 @@ static int rt2870_vap_key_set(struct ieee80211vap *vap, ifp = ic->ic_ifp; sc = ifp->if_softc; + cmd_argv.opmode = vap->iv_opmode; + memcpy(&cmd_argv.key, k, sizeof(struct ieee80211_key)); if (!(k->wk_flags & IEEE80211_KEY_GROUP)) @@ -2138,6 +2142,8 @@ static int rt2870_vap_key_delete(struct ieee80211vap *vap, ifp = ic->ic_ifp; sc = ifp->if_softc; + cmd_argv.opmode = vap->iv_opmode; + memcpy(&cmd_argv.key, k, sizeof(struct ieee80211_key)); rt2870_do_async(sc, rt2870_vap_key_delete_cb, @@ -2901,8 +2907,8 @@ static void rt2870_vap_key_set_cb(struct rt2870_softc *sc, void *arg) { struct ieee80211com *ic; struct ifnet *ifp; - struct ieee80211vap *vap; struct ieee80211_key *k; + enum ieee80211_opmode opmode; struct rt2870_cmd_argv_keyset *cmd_argv; uint16_t key_base, keymode_base; uint8_t mode, vapid, wcid, iv[8]; @@ -2910,9 +2916,9 @@ static void rt2870_vap_key_set_cb(struct rt2870_softc *sc, void *arg) ifp = sc->ifp; ic = ifp->if_l2com; - vap = TAILQ_FIRST(&ic->ic_vaps); cmd_argv = arg; k = &cmd_argv->key; + opmode = cmd_argv->opmode; switch (k->wk_cipher->ic_cipher) { @@ -2991,7 +2997,7 @@ static void rt2870_vap_key_set_cb(struct rt2870_softc *sc, void *arg) { rt2870_io_mac_write_multi(sc, key_base, k->wk_key, 16); - if (vap->iv_opmode != IEEE80211_M_HOSTAP) + if (opmode != IEEE80211_M_HOSTAP) { rt2870_io_mac_write_multi(sc, key_base + 16, &k->wk_key[16], 8); rt2870_io_mac_write_multi(sc, key_base + 24, &k->wk_key[24], 8); @@ -3027,7 +3033,7 @@ static void rt2870_vap_key_set_cb(struct rt2870_softc *sc, void *arg) { rt2870_io_mac_write_multi(sc, key_base, k->wk_key, 16); - if (vap->iv_opmode != IEEE80211_M_HOSTAP) + if (opmode != IEEE80211_M_HOSTAP) { rt2870_io_mac_write_multi(sc, key_base + 16, &k->wk_key[16], 8); rt2870_io_mac_write_multi(sc, key_base + 24, &k->wk_key[24], 8); @@ -3050,7 +3056,7 @@ static void rt2870_vap_key_set_cb(struct rt2870_softc *sc, void *arg) rt2870_io_mac_write(sc, keymode_base, tmp); - if (vap->iv_opmode == IEEE80211_M_HOSTAP) + if (opmode == IEEE80211_M_HOSTAP) { if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_WEP) { @@ -3106,17 +3112,17 @@ static void rt2870_vap_key_delete_cb(struct rt2870_softc *sc, void *arg) { struct ieee80211com *ic; struct ifnet *ifp; - struct ieee80211vap *vap; struct ieee80211_key *k; + enum ieee80211_opmode opmode; struct rt2870_cmd_argv_keydelete *cmd_argv; uint8_t vapid, wcid; uint32_t tmp; ifp = sc->ifp; ic = ifp->if_l2com; - vap = TAILQ_FIRST(&ic->ic_vaps); cmd_argv = arg; k = &cmd_argv->key; + opmode = cmd_argv->opmode; RT2870_DPRINTF(sc, RT2870_DEBUG_KEY, "%s: VAP key delete: keyix=%d, keylen=%d, macaddr=%s, group=%d\n", @@ -3139,7 +3145,7 @@ static void rt2870_vap_key_delete_cb(struct rt2870_softc *sc, void *arg) rt2870_io_mac_write(sc, RT2870_REG_SKEY_MODE(vapid), tmp); - if (vap->iv_opmode == IEEE80211_M_HOSTAP) + if (opmode == IEEE80211_M_HOSTAP) { tmp = ((vapid & RT2870_REG_VAP_MASK) << RT2870_REG_VAP_SHIFT) | (RT2870_REG_CIPHER_MODE_NONE << RT2870_REG_CIPHER_MODE_SHIFT); -- 2.11.4.GIT