提交 03737001 编写于 作者: G Gregory Greenman 提交者: Johannes Berg

mac80211: add api to set CSA counter in mac80211

Sometimes the most updated CSA counter values are known only
to the device. Add an API to pass this data to mac80211.
Signed-off-by: NGregory Greenman <gregory.greenman@intel.com>
Signed-off-by: NLuca Coelho <luciano.coelho@intel.com>
Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
上级 a403f3bf
...@@ -4449,6 +4449,19 @@ static inline struct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw, ...@@ -4449,6 +4449,19 @@ static inline struct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw,
*/ */
u8 ieee80211_csa_update_counter(struct ieee80211_vif *vif); u8 ieee80211_csa_update_counter(struct ieee80211_vif *vif);
/**
* ieee80211_csa_set_counter - request mac80211 to set csa counter
* @vif: &struct ieee80211_vif pointer from the add_interface callback.
* @counter: the new value for the counter
*
* The csa counter can be changed by the device, this API should be
* used by the device driver to update csa counter in mac80211.
*
* It should never be used together with ieee80211_csa_update_counter(),
* as it will cause a race condition around the counter value.
*/
void ieee80211_csa_set_counter(struct ieee80211_vif *vif, u8 counter);
/** /**
* ieee80211_csa_finish - notify mac80211 about channel switch * ieee80211_csa_finish - notify mac80211 about channel switch
* @vif: &struct ieee80211_vif pointer from the add_interface callback. * @vif: &struct ieee80211_vif pointer from the add_interface callback.
......
...@@ -4084,6 +4084,31 @@ u8 ieee80211_csa_update_counter(struct ieee80211_vif *vif) ...@@ -4084,6 +4084,31 @@ u8 ieee80211_csa_update_counter(struct ieee80211_vif *vif)
} }
EXPORT_SYMBOL(ieee80211_csa_update_counter); EXPORT_SYMBOL(ieee80211_csa_update_counter);
void ieee80211_csa_set_counter(struct ieee80211_vif *vif, u8 counter)
{
struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
struct beacon_data *beacon = NULL;
rcu_read_lock();
if (sdata->vif.type == NL80211_IFTYPE_AP)
beacon = rcu_dereference(sdata->u.ap.beacon);
else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
beacon = rcu_dereference(sdata->u.ibss.presp);
else if (ieee80211_vif_is_mesh(&sdata->vif))
beacon = rcu_dereference(sdata->u.mesh.beacon);
if (!beacon)
goto unlock;
if (counter < beacon->csa_current_counter)
beacon->csa_current_counter = counter;
unlock:
rcu_read_unlock();
}
EXPORT_SYMBOL(ieee80211_csa_set_counter);
bool ieee80211_csa_is_complete(struct ieee80211_vif *vif) bool ieee80211_csa_is_complete(struct ieee80211_vif *vif)
{ {
struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册