cfg80211: allow AID/listen interval changes for unassociated station
Currently, cfg80211 rejects updates of AID and listen interval parameters for existing entries. This information is known only at association stage and as a result it's impossible to update entries that were added unassociated. Fix this by allowing updates of these properies for stations that the driver (or mac80211) assigned unassociated state. This then fixes mac80211's use of NL80211_FEATURE_FULL_AP_CLIENT_STATE. Signed-off-by: Ayala Beker <ayala.beker@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
dcae9e0203
commit
e420842724
|
@ -3968,10 +3968,13 @@ int cfg80211_check_station_change(struct wiphy *wiphy,
|
||||||
struct station_parameters *params,
|
struct station_parameters *params,
|
||||||
enum cfg80211_station_type statype)
|
enum cfg80211_station_type statype)
|
||||||
{
|
{
|
||||||
if (params->listen_interval != -1)
|
if (params->listen_interval != -1 &&
|
||||||
|
statype != CFG80211_STA_AP_CLIENT_UNASSOC)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (params->aid &&
|
if (params->aid &&
|
||||||
!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)))
|
!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) &&
|
||||||
|
statype != CFG80211_STA_AP_CLIENT_UNASSOC)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/* When you run into this, adjust the code below for the new flag */
|
/* When you run into this, adjust the code below for the new flag */
|
||||||
|
@ -4245,13 +4248,22 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
|
||||||
|
|
||||||
memset(¶ms, 0, sizeof(params));
|
memset(¶ms, 0, sizeof(params));
|
||||||
|
|
||||||
params.listen_interval = -1;
|
|
||||||
|
|
||||||
if (!rdev->ops->change_station)
|
if (!rdev->ops->change_station)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
if (info->attrs[NL80211_ATTR_STA_AID])
|
/*
|
||||||
return -EINVAL;
|
* AID and listen_interval properties can be set only for unassociated
|
||||||
|
* station. Include these parameters here and will check them in
|
||||||
|
* cfg80211_check_station_change().
|
||||||
|
*/
|
||||||
|
if (info->attrs[NL80211_ATTR_PEER_AID])
|
||||||
|
params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]);
|
||||||
|
|
||||||
|
if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
|
||||||
|
params.listen_interval =
|
||||||
|
nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
|
||||||
|
else
|
||||||
|
params.listen_interval = -1;
|
||||||
|
|
||||||
if (!info->attrs[NL80211_ATTR_MAC])
|
if (!info->attrs[NL80211_ATTR_MAC])
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -4278,9 +4290,6 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
|
||||||
nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
|
nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms))
|
if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue