Skip to content

Commit

Permalink
cfg80211: allow AID/listen interval changes for unassociated station
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
Signed-off-by: Johannes Berg <[email protected]>
  • Loading branch information
AyalaBkr authored and jmberg-intel committed Nov 3, 2015
1 parent dcae9e0 commit e420842
Showing 1 changed file with 18 additions and 9 deletions.
27 changes: 18 additions & 9 deletions net/wireless/nl80211.c
Original file line number Diff line number Diff line change
Expand Up @@ -3968,10 +3968,13 @@ int cfg80211_check_station_change(struct wiphy *wiphy,
struct station_parameters *params,
enum cfg80211_station_type statype)
{
if (params->listen_interval != -1)
if (params->listen_interval != -1 &&
statype != CFG80211_STA_AP_CLIENT_UNASSOC)
return -EINVAL;

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;

/* When you run into this, adjust the code below for the new flag */
Expand Down Expand Up @@ -4245,13 +4248,22 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)

memset(&params, 0, sizeof(params));

params.listen_interval = -1;

if (!rdev->ops->change_station)
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])
return -EINVAL;
Expand All @@ -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]);
}

if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
return -EINVAL;

if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params))
return -EINVAL;

Expand Down

0 comments on commit e420842

Please sign in to comment.