From cbfa4b61925036c3d864904cab932919518ee547 Mon Sep 17 00:00:00 2001 From: Johannes Berg Date: Fri, 9 Nov 2007 01:57:29 +0100 Subject: [PATCH] --- yaml --- r: 78173 b: refs/heads/master c: dabeb344f54ab780d152714c18f1cb6b21c471a1 h: refs/heads/master i: 78171: 3ef6e97d86cdec6cbd6059bc512a98802dfe2b73 v: v3 --- [refs] | 2 +- trunk/include/net/mac80211.h | 16 ++++++++++++++++ trunk/net/mac80211/util.c | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 3d9836b73691..1eb0f2bdf7a2 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 9859a79023d71dd4e56c195a345abc4112abfd02 +refs/heads/master: dabeb344f54ab780d152714c18f1cb6b21c471a1 diff --git a/trunk/include/net/mac80211.h b/trunk/include/net/mac80211.h index 17b60391fcd6..1470e1b886f0 100644 --- a/trunk/include/net/mac80211.h +++ b/trunk/include/net/mac80211.h @@ -1406,4 +1406,20 @@ void ieee80211_wake_queues(struct ieee80211_hw *hw); */ void ieee80211_scan_completed(struct ieee80211_hw *hw); +/** + * ieee80211_iterate_active_interfaces - iterate active interfaces + * + * This function iterates over the interfaces associated with a given + * hardware that are currently active and calls the callback for them. + * Must be called under RTNL. + * + * @hw: the hardware struct of which the interfaces should be iterated over + * @iterator: the iterator function to call + * @data: first argument of the iterator function + */ +void ieee80211_iterate_active_interfaces(struct ieee80211_hw *hw, + void (*iterator)(void *data, u8 *mac, + int if_id), + void *data); + #endif /* MAC80211_H */ diff --git a/trunk/net/mac80211/util.c b/trunk/net/mac80211/util.c index 5a0564e1dbd6..88f262baaa5e 100644 --- a/trunk/net/mac80211/util.c +++ b/trunk/net/mac80211/util.c @@ -22,6 +22,7 @@ #include #include #include +#include #include "ieee80211_i.h" #include "ieee80211_rate.h" @@ -484,3 +485,35 @@ void ieee80211_wake_queues(struct ieee80211_hw *hw) ieee80211_wake_queue(hw, i); } EXPORT_SYMBOL(ieee80211_wake_queues); + +void ieee80211_iterate_active_interfaces(struct ieee80211_hw *hw, + void (*iterator)(void *data, u8 *mac, + int if_id), + void *data) +{ + struct ieee80211_local *local = hw_to_local(hw); + struct ieee80211_sub_if_data *sdata; + + ASSERT_RTNL(); + + /* we hold the RTNL here so can safely walk the list */ + list_for_each_entry(sdata, &local->interfaces, list) { + switch (sdata->type) { + case IEEE80211_IF_TYPE_INVALID: + case IEEE80211_IF_TYPE_MNTR: + case IEEE80211_IF_TYPE_VLAN: + continue; + case IEEE80211_IF_TYPE_AP: + case IEEE80211_IF_TYPE_STA: + case IEEE80211_IF_TYPE_IBSS: + case IEEE80211_IF_TYPE_WDS: + break; + } + if (sdata->dev == local->mdev) + continue; + if (netif_running(sdata->dev)) + iterator(data, sdata->dev->dev_addr, + sdata->dev->ifindex); + } +} +EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces);