diff options
Diffstat (limited to 'net/mac80211/sta_info.c')
| -rw-r--r-- | net/mac80211/sta_info.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index 12971b71d0fa..2880f2ae99ab 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c | |||
| @@ -66,6 +66,7 @@ | |||
| 66 | 66 | ||
| 67 | static const struct rhashtable_params sta_rht_params = { | 67 | static const struct rhashtable_params sta_rht_params = { |
| 68 | .nelem_hint = 3, /* start small */ | 68 | .nelem_hint = 3, /* start small */ |
| 69 | .automatic_shrinking = true, | ||
| 69 | .head_offset = offsetof(struct sta_info, hash_node), | 70 | .head_offset = offsetof(struct sta_info, hash_node), |
| 70 | .key_offset = offsetof(struct sta_info, sta.addr), | 71 | .key_offset = offsetof(struct sta_info, sta.addr), |
| 71 | .key_len = ETH_ALEN, | 72 | .key_len = ETH_ALEN, |
| @@ -157,8 +158,24 @@ struct sta_info *sta_info_get(struct ieee80211_sub_if_data *sdata, | |||
| 157 | const u8 *addr) | 158 | const u8 *addr) |
| 158 | { | 159 | { |
| 159 | struct ieee80211_local *local = sdata->local; | 160 | struct ieee80211_local *local = sdata->local; |
| 161 | struct sta_info *sta; | ||
| 162 | struct rhash_head *tmp; | ||
| 163 | const struct bucket_table *tbl; | ||
| 164 | |||
| 165 | rcu_read_lock(); | ||
| 166 | tbl = rht_dereference_rcu(local->sta_hash.tbl, &local->sta_hash); | ||
| 160 | 167 | ||
| 161 | return rhashtable_lookup_fast(&local->sta_hash, addr, sta_rht_params); | 168 | for_each_sta_info(local, tbl, addr, sta, tmp) { |
| 169 | if (sta->sdata == sdata) { | ||
| 170 | rcu_read_unlock(); | ||
| 171 | /* this is safe as the caller must already hold | ||
| 172 | * another rcu read section or the mutex | ||
| 173 | */ | ||
| 174 | return sta; | ||
| 175 | } | ||
| 176 | } | ||
| 177 | rcu_read_unlock(); | ||
| 178 | return NULL; | ||
| 162 | } | 179 | } |
| 163 | 180 | ||
| 164 | /* | 181 | /* |
