diff options
-rw-r--r-- | include/net/mac80211.h | 23 | ||||
-rw-r--r-- | net/mac80211/key.c | 33 |
2 files changed, 56 insertions, 0 deletions
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 2858b4d02f5f..4703c0f07ba4 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -2850,6 +2850,29 @@ void ieee80211_sta_block_awake(struct ieee80211_hw *hw, | |||
2850 | struct ieee80211_sta *pubsta, bool block); | 2850 | struct ieee80211_sta *pubsta, bool block); |
2851 | 2851 | ||
2852 | /** | 2852 | /** |
2853 | * ieee80211_iter_keys - iterate keys programmed into the device | ||
2854 | * @hw: pointer obtained from ieee80211_alloc_hw() | ||
2855 | * @vif: virtual interface to iterate, may be %NULL for all | ||
2856 | * @iter: iterator function that will be called for each key | ||
2857 | * @iter_data: custom data to pass to the iterator function | ||
2858 | * | ||
2859 | * This function can be used to iterate all the keys known to | ||
2860 | * mac80211, even those that weren't previously programmed into | ||
2861 | * the device. This is intended for use in WoWLAN if the device | ||
2862 | * needs reprogramming of the keys during suspend. Note that due | ||
2863 | * to locking reasons, it is also only safe to call this at few | ||
2864 | * spots since it must hold the RTNL and be able to sleep. | ||
2865 | */ | ||
2866 | void ieee80211_iter_keys(struct ieee80211_hw *hw, | ||
2867 | struct ieee80211_vif *vif, | ||
2868 | void (*iter)(struct ieee80211_hw *hw, | ||
2869 | struct ieee80211_vif *vif, | ||
2870 | struct ieee80211_sta *sta, | ||
2871 | struct ieee80211_key_conf *key, | ||
2872 | void *data), | ||
2873 | void *iter_data); | ||
2874 | |||
2875 | /** | ||
2853 | * ieee80211_ap_probereq_get - retrieve a Probe Request template | 2876 | * ieee80211_ap_probereq_get - retrieve a Probe Request template |
2854 | * @hw: pointer obtained from ieee80211_alloc_hw(). | 2877 | * @hw: pointer obtained from ieee80211_alloc_hw(). |
2855 | * @vif: &struct ieee80211_vif pointer from the add_interface callback. | 2878 | * @vif: &struct ieee80211_vif pointer from the add_interface callback. |
diff --git a/net/mac80211/key.c b/net/mac80211/key.c index 0af958c74342..fcab5fe726a1 100644 --- a/net/mac80211/key.c +++ b/net/mac80211/key.c | |||
@@ -551,6 +551,39 @@ void ieee80211_enable_keys(struct ieee80211_sub_if_data *sdata) | |||
551 | mutex_unlock(&sdata->local->key_mtx); | 551 | mutex_unlock(&sdata->local->key_mtx); |
552 | } | 552 | } |
553 | 553 | ||
554 | void ieee80211_iter_keys(struct ieee80211_hw *hw, | ||
555 | struct ieee80211_vif *vif, | ||
556 | void (*iter)(struct ieee80211_hw *hw, | ||
557 | struct ieee80211_vif *vif, | ||
558 | struct ieee80211_sta *sta, | ||
559 | struct ieee80211_key_conf *key, | ||
560 | void *data), | ||
561 | void *iter_data) | ||
562 | { | ||
563 | struct ieee80211_local *local = hw_to_local(hw); | ||
564 | struct ieee80211_key *key; | ||
565 | struct ieee80211_sub_if_data *sdata; | ||
566 | |||
567 | ASSERT_RTNL(); | ||
568 | |||
569 | mutex_lock(&local->key_mtx); | ||
570 | if (vif) { | ||
571 | sdata = vif_to_sdata(vif); | ||
572 | list_for_each_entry(key, &sdata->key_list, list) | ||
573 | iter(hw, &sdata->vif, | ||
574 | key->sta ? &key->sta->sta : NULL, | ||
575 | &key->conf, iter_data); | ||
576 | } else { | ||
577 | list_for_each_entry(sdata, &local->interfaces, list) | ||
578 | list_for_each_entry(key, &sdata->key_list, list) | ||
579 | iter(hw, &sdata->vif, | ||
580 | key->sta ? &key->sta->sta : NULL, | ||
581 | &key->conf, iter_data); | ||
582 | } | ||
583 | mutex_unlock(&local->key_mtx); | ||
584 | } | ||
585 | EXPORT_SYMBOL(ieee80211_iter_keys); | ||
586 | |||
554 | void ieee80211_disable_keys(struct ieee80211_sub_if_data *sdata) | 587 | void ieee80211_disable_keys(struct ieee80211_sub_if_data *sdata) |
555 | { | 588 | { |
556 | struct ieee80211_key *key; | 589 | struct ieee80211_key *key; |