aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/sta_info.h
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2009-11-25 11:46:18 -0500
committerJohn W. Linville <linville@tuxdriver.com>2009-12-21 18:38:51 -0500
commitabe60632f311d515b082b450504ee24006023951 (patch)
treea51fc3b135fa8a31cc0d7953be43502ecc6433c6 /net/mac80211/sta_info.h
parent15920d8afc87861672e16fa95ae2764b065d6dd3 (diff)
mac80211: make station management completely depend on vif
The station management currently uses the virtual interface, but you cannot add the same station to multiple virtual interfaces if you're communicating with it in multiple ways. This restriction should be lifted so that in the future we can, for instance, support bluetooth 3 with an access point that mac80211 is already associated to. We can do that by requiring all sta_info_get users to provide the virtual interface and making the RX code aware that an address may match more than one station struct. Thanks to the previous patches this one isn't all that large and except for the RX and TX status paths changes has low complexity. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/sta_info.h')
-rw-r--r--net/mac80211/sta_info.h29
1 files changed, 27 insertions, 2 deletions
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
index b4810f6aa94f..c8208236e896 100644
--- a/net/mac80211/sta_info.h
+++ b/net/mac80211/sta_info.h
@@ -403,9 +403,34 @@ static inline u32 get_sta_flags(struct sta_info *sta)
403#define STA_INFO_CLEANUP_INTERVAL (10 * HZ) 403#define STA_INFO_CLEANUP_INTERVAL (10 * HZ)
404 404
405/* 405/*
406 * Get a STA info, must have be under RCU read lock. 406 * Get a STA info, must be under RCU read lock.
407 */ 407 */
408struct sta_info *sta_info_get(struct ieee80211_local *local, const u8 *addr); 408struct sta_info *sta_info_get(struct ieee80211_sub_if_data *sdata,
409 const u8 *addr);
410
411static inline
412void for_each_sta_info_type_check(struct ieee80211_local *local,
413 const u8 *addr,
414 struct sta_info *sta,
415 struct sta_info *nxt)
416{
417}
418
419#define for_each_sta_info(local, _addr, sta, nxt) \
420 for ( /* initialise loop */ \
421 sta = rcu_dereference(local->sta_hash[STA_HASH(_addr)]),\
422 nxt = sta ? rcu_dereference(sta->hnext) : NULL; \
423 /* typecheck */ \
424 for_each_sta_info_type_check(local, (_addr), sta, nxt), \
425 /* continue condition */ \
426 sta; \
427 /* advance loop */ \
428 sta = nxt, \
429 nxt = sta ? rcu_dereference(sta->hnext) : NULL \
430 ) \
431 /* compare address and run code only if it matches */ \
432 if (memcmp(sta->sta.addr, (_addr), ETH_ALEN) == 0)
433
409/* 434/*
410 * Get STA info by index, BROKEN! 435 * Get STA info by index, BROKEN!
411 */ 436 */