|
@@ -30,19 +30,20 @@
|
|
* keys and per-station keys. Since each station belongs to an interface,
|
|
* keys and per-station keys. Since each station belongs to an interface,
|
|
* each station key also belongs to that interface.
|
|
* each station key also belongs to that interface.
|
|
*
|
|
*
|
|
- * Hardware acceleration is done on a best-effort basis, for each key
|
|
|
|
- * that is eligible the hardware is asked to enable that key but if
|
|
|
|
- * it cannot do that they key is simply kept for software encryption.
|
|
|
|
- * There is currently no way of knowing this except by looking into
|
|
|
|
- * debugfs.
|
|
|
|
|
|
+ * Hardware acceleration is done on a best-effort basis for algorithms
|
|
|
|
+ * that are implemented in software, for each key the hardware is asked
|
|
|
|
+ * to enable that key for offloading but if it cannot do that the key is
|
|
|
|
+ * simply kept for software encryption (unless it is for an algorithm
|
|
|
|
+ * that isn't implemented in software).
|
|
|
|
+ * There is currently no way of knowing whether a key is handled in SW
|
|
|
|
+ * or HW except by looking into debugfs.
|
|
*
|
|
*
|
|
- * All key operations are protected internally.
|
|
|
|
- *
|
|
|
|
- * Within mac80211, key references are, just as STA structure references,
|
|
|
|
- * protected by RCU. Note, however, that some things are unprotected,
|
|
|
|
- * namely the key->sta dereferences within the hardware acceleration
|
|
|
|
- * functions. This means that sta_info_destroy() must remove the key
|
|
|
|
- * which waits for an RCU grace period.
|
|
|
|
|
|
+ * All key management is internally protected by a mutex. Within all
|
|
|
|
+ * other parts of mac80211, key references are, just as STA structure
|
|
|
|
+ * references, protected by RCU. Note, however, that some things are
|
|
|
|
+ * unprotected, namely the key->sta dereferences within the hardware
|
|
|
|
+ * acceleration functions. This means that sta_info_destroy() must
|
|
|
|
+ * remove the key which waits for an RCU grace period.
|
|
*/
|
|
*/
|
|
|
|
|
|
static const u8 bcast_addr[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
|
|
static const u8 bcast_addr[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
|
|
@@ -279,13 +280,8 @@ static void __ieee80211_key_replace(struct ieee80211_sub_if_data *sdata,
|
|
new->conf.keyidx);
|
|
new->conf.keyidx);
|
|
}
|
|
}
|
|
|
|
|
|
- if (old) {
|
|
|
|
- /*
|
|
|
|
- * We'll use an empty list to indicate that the key
|
|
|
|
- * has already been removed.
|
|
|
|
- */
|
|
|
|
- list_del_init(&old->list);
|
|
|
|
- }
|
|
|
|
|
|
+ if (old)
|
|
|
|
+ list_del(&old->list);
|
|
}
|
|
}
|
|
|
|
|
|
struct ieee80211_key *ieee80211_key_alloc(u32 cipher, int idx, size_t key_len,
|
|
struct ieee80211_key *ieee80211_key_alloc(u32 cipher, int idx, size_t key_len,
|
|
@@ -420,8 +416,8 @@ int ieee80211_key_link(struct ieee80211_key *key,
|
|
struct sta_info *ap;
|
|
struct sta_info *ap;
|
|
|
|
|
|
/*
|
|
/*
|
|
- * We're getting a sta pointer in,
|
|
|
|
- * so must be under RCU read lock.
|
|
|
|
|
|
+ * We're getting a sta pointer in, so must be under
|
|
|
|
+ * appropriate locking for sta_info_get().
|
|
*/
|
|
*/
|
|
|
|
|
|
/* same here, the AP could be using QoS */
|
|
/* same here, the AP could be using QoS */
|