/* * Remove the key (no locking, for internal use). */ static int _ieee80211_crypto_delkey(struct ieee80211vap *vap, struct ieee80211_key *key) { KASSERT(key->wk_cipher != NULL, ("No cipher!")); IEEE80211_DPRINTF(vap, IEEE80211_MSG_CRYPTO, "%s: %s keyix %u flags 0x%x rsc %ju tsc %ju len %u\n", __func__, key->wk_cipher->ic_name, key->wk_keyix, key->wk_flags, key->wk_keyrsc[IEEE80211_NONQOS_TID], key->wk_keytsc, key->wk_keylen); if (key->wk_flags & IEEE80211_KEY_DEVKEY) { /* * Remove hardware entry. */ /* XXX key cache */ if (!dev_key_delete(vap, key)) { IEEE80211_DPRINTF(vap, IEEE80211_MSG_CRYPTO, "%s: driver did not delete key index %u\n", __func__, key->wk_keyix); vap->iv_stats.is_crypto_delkey++; /* XXX recovery? */ } } cipher_detach(key); memset(key, 0, sizeof(*key)); ieee80211_crypto_resetkey(vap, key, IEEE80211_KEYIX_NONE); return 1; }
/* * Remove the key (no locking, for internal use). */ static int _ieee80211_crypto_delkey(struct ieee80211com *ic, struct ieee80211_key *key) { u_int16_t keyix; KASSERT(key->wk_cipher != NULL, ("No cipher!")); keyix = key->wk_keyix; if (keyix != IEEE80211_KEYIX_NONE) { /* * Remove hardware entry. */ /* XXX key cache */ if (!dev_key_delete(ic, key)) { IEEE80211_DPRINTF(ic, IEEE80211_MSG_CRYPTO, ("%s: driver did not delete key index %u\n", __func__, keyix)); ic->ic_stats.is_crypto_delkey++; /* XXX recovery? */ } } cipher_detach(key); memset(key, 0, sizeof(*key)); key->wk_cipher = &ieee80211_cipher_none; key->wk_private = cipher_attach(ic, key); /* NB: cannot depend on key index to decide this */ if (&ic->ic_nw_keys[0] <= key && key < &ic->ic_nw_keys[IEEE80211_WEP_NKID]) key->wk_keyix = keyix; /* preserve shared key state */ else key->wk_keyix = IEEE80211_KEYIX_NONE; return 1; }