Commit 89884459 authored by Johannes Berg's avatar Johannes Berg

wifi: mac80211: fix idle calculation with multi-link

The vif's idle state doesn't automatically go to true when
any link removes the channel context, it's only idle when
_all_ links no longer have a channel context. Fix that.
Reviewed-by: default avatarMiriam Rachel Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20240418105220.90df97557702.I05d2228ce85c203b9f2d6da8538cc16dce46752a@changeidSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 6a94cf99
...@@ -797,6 +797,7 @@ static int ieee80211_assign_link_chanctx(struct ieee80211_link_data *link, ...@@ -797,6 +797,7 @@ static int ieee80211_assign_link_chanctx(struct ieee80211_link_data *link,
struct ieee80211_local *local = sdata->local; struct ieee80211_local *local = sdata->local;
struct ieee80211_chanctx_conf *conf; struct ieee80211_chanctx_conf *conf;
struct ieee80211_chanctx *curr_ctx = NULL; struct ieee80211_chanctx *curr_ctx = NULL;
bool new_idle;
int ret = 0; int ret = 0;
if (WARN_ON(sdata->vif.type == NL80211_IFTYPE_NAN)) if (WARN_ON(sdata->vif.type == NL80211_IFTYPE_NAN))
...@@ -829,8 +830,6 @@ static int ieee80211_assign_link_chanctx(struct ieee80211_link_data *link, ...@@ -829,8 +830,6 @@ static int ieee80211_assign_link_chanctx(struct ieee80211_link_data *link,
out: out:
rcu_assign_pointer(link->conf->chanctx_conf, conf); rcu_assign_pointer(link->conf->chanctx_conf, conf);
sdata->vif.cfg.idle = !conf;
if (curr_ctx && ieee80211_chanctx_num_assigned(local, curr_ctx) > 0) { if (curr_ctx && ieee80211_chanctx_num_assigned(local, curr_ctx) > 0) {
ieee80211_recalc_chanctx_chantype(local, curr_ctx); ieee80211_recalc_chanctx_chantype(local, curr_ctx);
ieee80211_recalc_smps_chanctx(local, curr_ctx); ieee80211_recalc_smps_chanctx(local, curr_ctx);
...@@ -843,9 +842,27 @@ static int ieee80211_assign_link_chanctx(struct ieee80211_link_data *link, ...@@ -843,9 +842,27 @@ static int ieee80211_assign_link_chanctx(struct ieee80211_link_data *link,
ieee80211_recalc_chanctx_min_def(local, new_ctx, NULL); ieee80211_recalc_chanctx_min_def(local, new_ctx, NULL);
} }
if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE && if (conf) {
sdata->vif.type != NL80211_IFTYPE_MONITOR) new_idle = false;
ieee80211_vif_cfg_change_notify(sdata, BSS_CHANGED_IDLE); } else {
struct ieee80211_link_data *tmp;
new_idle = true;
for_each_sdata_link(local, tmp) {
if (rcu_access_pointer(tmp->conf->chanctx_conf)) {
new_idle = false;
break;
}
}
}
if (new_idle != sdata->vif.cfg.idle) {
sdata->vif.cfg.idle = new_idle;
if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE &&
sdata->vif.type != NL80211_IFTYPE_MONITOR)
ieee80211_vif_cfg_change_notify(sdata, BSS_CHANGED_IDLE);
}
ieee80211_check_fast_xmit_iface(sdata); ieee80211_check_fast_xmit_iface(sdata);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment