nl80211: improve station flags handling
It is currently not possible to modify station flags, but that capability would be very useful. This patch introduces a new nl80211 attribute that contains a set/mask for station flags, and updates the internal API (and mac80211) to mirror that. The new attribute is parsed before falling back to the old so that userspace can specify both (if it can) to work on all kernels. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: Jouni Malinen <jouni.malinen@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Šī revīzija ir iekļauta:

revīziju iesūtīja
John W. Linville

vecāks
0e46724a48
revīzija
eccb8e8f0c
@@ -629,35 +629,39 @@ static void sta_apply_parameters(struct ieee80211_local *local,
|
||||
int i, j;
|
||||
struct ieee80211_supported_band *sband;
|
||||
struct ieee80211_sub_if_data *sdata = sta->sdata;
|
||||
u32 mask, set;
|
||||
|
||||
sband = local->hw.wiphy->bands[local->oper_channel->band];
|
||||
|
||||
/*
|
||||
* FIXME: updating the flags is racy when this function is
|
||||
* called from ieee80211_change_station(), this will
|
||||
* be resolved in a future patch.
|
||||
*/
|
||||
spin_lock_bh(&sta->lock);
|
||||
mask = params->sta_flags_mask;
|
||||
set = params->sta_flags_set;
|
||||
|
||||
if (params->station_flags & STATION_FLAG_CHANGED) {
|
||||
spin_lock_bh(&sta->lock);
|
||||
if (mask & BIT(NL80211_STA_FLAG_AUTHORIZED)) {
|
||||
sta->flags &= ~WLAN_STA_AUTHORIZED;
|
||||
if (params->station_flags & STATION_FLAG_AUTHORIZED)
|
||||
if (set & BIT(NL80211_STA_FLAG_AUTHORIZED))
|
||||
sta->flags |= WLAN_STA_AUTHORIZED;
|
||||
|
||||
sta->flags &= ~WLAN_STA_SHORT_PREAMBLE;
|
||||
if (params->station_flags & STATION_FLAG_SHORT_PREAMBLE)
|
||||
sta->flags |= WLAN_STA_SHORT_PREAMBLE;
|
||||
|
||||
sta->flags &= ~WLAN_STA_WME;
|
||||
if (params->station_flags & STATION_FLAG_WME)
|
||||
sta->flags |= WLAN_STA_WME;
|
||||
|
||||
sta->flags &= ~WLAN_STA_MFP;
|
||||
if (params->station_flags & STATION_FLAG_MFP)
|
||||
sta->flags |= WLAN_STA_MFP;
|
||||
spin_unlock_bh(&sta->lock);
|
||||
}
|
||||
|
||||
if (mask & BIT(NL80211_STA_FLAG_SHORT_PREAMBLE)) {
|
||||
sta->flags &= ~WLAN_STA_SHORT_PREAMBLE;
|
||||
if (set & BIT(NL80211_STA_FLAG_SHORT_PREAMBLE))
|
||||
sta->flags |= WLAN_STA_SHORT_PREAMBLE;
|
||||
}
|
||||
|
||||
if (mask & BIT(NL80211_STA_FLAG_WME)) {
|
||||
sta->flags &= ~WLAN_STA_WME;
|
||||
if (set & BIT(NL80211_STA_FLAG_WME))
|
||||
sta->flags |= WLAN_STA_WME;
|
||||
}
|
||||
|
||||
if (mask & BIT(NL80211_STA_FLAG_MFP)) {
|
||||
sta->flags &= ~WLAN_STA_MFP;
|
||||
if (set & BIT(NL80211_STA_FLAG_MFP))
|
||||
sta->flags |= WLAN_STA_MFP;
|
||||
}
|
||||
spin_unlock_bh(&sta->lock);
|
||||
|
||||
/*
|
||||
* FIXME: updating the following information is racy when this
|
||||
* function is called from ieee80211_change_station().
|
||||
|
Atsaukties uz šo jaunā problēmā
Block a user