diff options
author | Johannes Berg <johannes.berg@intel.com> | 2012-01-20 07:55:21 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-02-06 14:48:24 -0500 |
commit | f09603a259ffef69ad4516a04eb06cd65ac522fe (patch) | |
tree | 3f826769c697eb15a76771e25291bbb54f9f58ab /net/mac80211/driver-ops.h | |
parent | 71ec375c75095002f36f083ceb32bbb8725734ae (diff) |
mac80211: add sta_state callback
(based on Eliad's patch)
Add a callback to notify the low-level driver whenever
the state of a station changes. The driver is only
notified when the station is actually in the mac80211
hash table, not for pre-insert state transitions.
To allow the driver to replace sta_add/remove calls
with this, call extra transitions with the NOTEXIST
state.
This callback can fail, so we need to be careful in
handling it when a station is inserted, particularly
in the IBSS case where we still keep the station entry
around for mac80211 purposes.
Signed-off-by: Eliad Peller <eliad@wizery.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/driver-ops.h')
-rw-r--r-- | net/mac80211/driver-ops.h | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h index b8673f6100df..4bd266ec5333 100644 --- a/net/mac80211/driver-ops.h +++ b/net/mac80211/driver-ops.h | |||
@@ -478,6 +478,28 @@ static inline void drv_sta_remove(struct ieee80211_local *local, | |||
478 | trace_drv_return_void(local); | 478 | trace_drv_return_void(local); |
479 | } | 479 | } |
480 | 480 | ||
481 | static inline __must_check | ||
482 | int drv_sta_state(struct ieee80211_local *local, | ||
483 | struct ieee80211_sub_if_data *sdata, | ||
484 | struct sta_info *sta, | ||
485 | enum ieee80211_sta_state old_state, | ||
486 | enum ieee80211_sta_state new_state) | ||
487 | { | ||
488 | int ret = 0; | ||
489 | |||
490 | might_sleep(); | ||
491 | |||
492 | sdata = get_bss_sdata(sdata); | ||
493 | check_sdata_in_driver(sdata); | ||
494 | |||
495 | trace_drv_sta_state(local, sdata, &sta->sta, old_state, new_state); | ||
496 | if (local->ops->sta_state) | ||
497 | ret = local->ops->sta_state(&local->hw, &sdata->vif, &sta->sta, | ||
498 | old_state, new_state); | ||
499 | trace_drv_return_int(local, ret); | ||
500 | return ret; | ||
501 | } | ||
502 | |||
481 | static inline int drv_conf_tx(struct ieee80211_local *local, | 503 | static inline int drv_conf_tx(struct ieee80211_local *local, |
482 | struct ieee80211_sub_if_data *sdata, u16 queue, | 504 | struct ieee80211_sub_if_data *sdata, u16 queue, |
483 | const struct ieee80211_tx_queue_params *params) | 505 | const struct ieee80211_tx_queue_params *params) |