wifi: mac80211: collect some CSA data into sub-structs
Collect the CSA data in ieee80211_link_data_managed and ieee80211_link_data into a csa sub-struct to clean up a bit and make adding new things more obvious. Reviewed-by: Miriam Rachel Korenblit <miriam.rachel.korenblit@intel.com> Link: https://msgid.link/20240506215543.29f954b1f576.I9a683a9647c33d4dd3011aade6677982428c1082@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
7ef8f6821d
commit
344d18cec2
@ -3633,10 +3633,10 @@ void ieee80211_csa_finish(struct ieee80211_vif *vif, unsigned int link_id)
|
||||
continue;
|
||||
|
||||
wiphy_work_queue(iter->local->hw.wiphy,
|
||||
&iter->deflink.csa_finalize_work);
|
||||
&iter->deflink.csa.finalize_work);
|
||||
}
|
||||
}
|
||||
wiphy_work_queue(local->hw.wiphy, &link_data->csa_finalize_work);
|
||||
wiphy_work_queue(local->hw.wiphy, &link_data->csa.finalize_work);
|
||||
|
||||
rcu_read_unlock();
|
||||
}
|
||||
@ -3723,7 +3723,7 @@ static int __ieee80211_csa_finalize(struct ieee80211_link_data *link_data)
|
||||
}
|
||||
|
||||
if (!cfg80211_chandef_identical(&link_conf->chanreq.oper,
|
||||
&link_data->csa_chanreq.oper))
|
||||
&link_data->csa.chanreq.oper))
|
||||
return -EINVAL;
|
||||
|
||||
link_conf->csa_active = false;
|
||||
@ -3744,7 +3744,7 @@ static int __ieee80211_csa_finalize(struct ieee80211_link_data *link_data)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
cfg80211_ch_switch_notify(sdata->dev, &link_data->csa_chanreq.oper,
|
||||
cfg80211_ch_switch_notify(sdata->dev, &link_data->csa.chanreq.oper,
|
||||
link_data->link_id);
|
||||
|
||||
return 0;
|
||||
@ -3765,7 +3765,7 @@ static void ieee80211_csa_finalize(struct ieee80211_link_data *link_data)
|
||||
void ieee80211_csa_finalize_work(struct wiphy *wiphy, struct wiphy_work *work)
|
||||
{
|
||||
struct ieee80211_link_data *link =
|
||||
container_of(work, struct ieee80211_link_data, csa_finalize_work);
|
||||
container_of(work, struct ieee80211_link_data, csa.finalize_work);
|
||||
struct ieee80211_sub_if_data *sdata = link->sdata;
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
|
||||
@ -4012,7 +4012,7 @@ __ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
|
||||
goto out;
|
||||
}
|
||||
|
||||
link_data->csa_chanreq = chanreq;
|
||||
link_data->csa.chanreq = chanreq;
|
||||
link_conf->csa_active = true;
|
||||
|
||||
if (params->block_tx &&
|
||||
@ -4023,12 +4023,12 @@ __ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
|
||||
}
|
||||
|
||||
cfg80211_ch_switch_started_notify(sdata->dev,
|
||||
&link_data->csa_chanreq.oper, 0,
|
||||
&link_data->csa.chanreq.oper, 0,
|
||||
params->count, params->block_tx);
|
||||
|
||||
if (changed) {
|
||||
ieee80211_link_info_change_notify(sdata, link_data, changed);
|
||||
drv_channel_switch_beacon(sdata, &link_data->csa_chanreq.oper);
|
||||
drv_channel_switch_beacon(sdata, &link_data->csa.chanreq.oper);
|
||||
} else {
|
||||
/* if the beacon didn't change, we can finalize immediately */
|
||||
ieee80211_csa_finalize(link_data);
|
||||
|
@ -1162,11 +1162,11 @@ ieee80211_link_chanctx_reservation_complete(struct ieee80211_link_data *link)
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
case NL80211_IFTYPE_OCB:
|
||||
wiphy_work_queue(sdata->local->hw.wiphy,
|
||||
&link->csa_finalize_work);
|
||||
&link->csa.finalize_work);
|
||||
break;
|
||||
case NL80211_IFTYPE_STATION:
|
||||
wiphy_delayed_work_queue(sdata->local->hw.wiphy,
|
||||
&link->u.mgd.chswitch_work, 0);
|
||||
&link->u.mgd.csa.switch_work, 0);
|
||||
break;
|
||||
case NL80211_IFTYPE_UNSPECIFIED:
|
||||
case NL80211_IFTYPE_AP_VLAN:
|
||||
|
@ -9,7 +9,7 @@
|
||||
* Copyright 2009, Johannes Berg <johannes@sipsolutions.net>
|
||||
* Copyright 2013-2014 Intel Mobile Communications GmbH
|
||||
* Copyright(c) 2016 Intel Deutschland GmbH
|
||||
* Copyright(c) 2018-2023 Intel Corporation
|
||||
* Copyright(c) 2018-2024 Intel Corporation
|
||||
*/
|
||||
|
||||
#include <linux/delay.h>
|
||||
@ -533,12 +533,12 @@ int ieee80211_ibss_finish_csa(struct ieee80211_sub_if_data *sdata, u64 *changed)
|
||||
IEEE80211_PRIVACY(ifibss->privacy));
|
||||
/* XXX: should not really modify cfg80211 data */
|
||||
if (cbss) {
|
||||
cbss->channel = sdata->deflink.csa_chanreq.oper.chan;
|
||||
cbss->channel = sdata->deflink.csa.chanreq.oper.chan;
|
||||
cfg80211_put_bss(sdata->local->hw.wiphy, cbss);
|
||||
}
|
||||
}
|
||||
|
||||
ifibss->chandef = sdata->deflink.csa_chanreq.oper;
|
||||
ifibss->chandef = sdata->deflink.csa.chanreq.oper;
|
||||
|
||||
/* generate the beacon */
|
||||
return ieee80211_ibss_csa_beacon(sdata, NULL, changed);
|
||||
|
@ -975,11 +975,13 @@ struct ieee80211_link_data_managed {
|
||||
bool disable_wmm_tracking;
|
||||
bool operating_11g_mode;
|
||||
|
||||
bool csa_waiting_bcn;
|
||||
bool csa_ignored_same_chan;
|
||||
bool csa_blocked_tx;
|
||||
unsigned long csa_time;
|
||||
struct wiphy_delayed_work chswitch_work;
|
||||
struct {
|
||||
struct wiphy_delayed_work switch_work;
|
||||
unsigned long time;
|
||||
bool waiting_bcn;
|
||||
bool ignored_same_chan;
|
||||
bool blocked_tx;
|
||||
} csa;
|
||||
|
||||
struct wiphy_work request_smps_work;
|
||||
/* used to reconfigure hardware SM PS */
|
||||
@ -1038,11 +1040,13 @@ struct ieee80211_link_data {
|
||||
struct ieee80211_key __rcu *default_mgmt_key;
|
||||
struct ieee80211_key __rcu *default_beacon_key;
|
||||
|
||||
struct wiphy_work csa_finalize_work;
|
||||
|
||||
bool operating_11g_mode;
|
||||
|
||||
struct ieee80211_chan_req csa_chanreq;
|
||||
struct {
|
||||
struct wiphy_work finalize_work;
|
||||
struct ieee80211_chan_req chanreq;
|
||||
} csa;
|
||||
|
||||
struct wiphy_work color_change_finalize_work;
|
||||
struct delayed_work color_collision_detect_work;
|
||||
|
@ -543,14 +543,14 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_do
|
||||
|
||||
sdata->vif.bss_conf.csa_active = false;
|
||||
if (sdata->vif.type == NL80211_IFTYPE_STATION)
|
||||
sdata->deflink.u.mgd.csa_waiting_bcn = false;
|
||||
sdata->deflink.u.mgd.csa.waiting_bcn = false;
|
||||
if (sdata->csa_blocked_queues) {
|
||||
ieee80211_wake_vif_queues(local, sdata,
|
||||
IEEE80211_QUEUE_STOP_REASON_CSA);
|
||||
sdata->csa_blocked_queues = false;
|
||||
}
|
||||
|
||||
wiphy_work_cancel(local->hw.wiphy, &sdata->deflink.csa_finalize_work);
|
||||
wiphy_work_cancel(local->hw.wiphy, &sdata->deflink.csa.finalize_work);
|
||||
wiphy_work_cancel(local->hw.wiphy,
|
||||
&sdata->deflink.color_change_finalize_work);
|
||||
wiphy_delayed_work_cancel(local->hw.wiphy,
|
||||
|
@ -37,7 +37,7 @@ void ieee80211_link_init(struct ieee80211_sub_if_data *sdata,
|
||||
link_conf->link_id = link_id;
|
||||
link_conf->vif = &sdata->vif;
|
||||
|
||||
wiphy_work_init(&link->csa_finalize_work,
|
||||
wiphy_work_init(&link->csa.finalize_work,
|
||||
ieee80211_csa_finalize_work);
|
||||
wiphy_work_init(&link->color_change_finalize_work,
|
||||
ieee80211_color_change_finalize_work);
|
||||
@ -72,7 +72,7 @@ void ieee80211_link_stop(struct ieee80211_link_data *link)
|
||||
|
||||
cancel_delayed_work_sync(&link->color_collision_detect_work);
|
||||
wiphy_work_cancel(link->sdata->local->hw.wiphy,
|
||||
&link->csa_finalize_work);
|
||||
&link->csa.finalize_work);
|
||||
ieee80211_link_release_channel(link);
|
||||
}
|
||||
|
||||
@ -366,8 +366,8 @@ static int _ieee80211_set_active_links(struct ieee80211_sub_if_data *sdata,
|
||||
*/
|
||||
if (link->conf->csa_active)
|
||||
wiphy_delayed_work_queue(local->hw.wiphy,
|
||||
&link->u.mgd.chswitch_work,
|
||||
link->u.mgd.csa_time -
|
||||
&link->u.mgd.csa.switch_work,
|
||||
link->u.mgd.csa.time -
|
||||
jiffies);
|
||||
}
|
||||
|
||||
|
@ -2057,12 +2057,12 @@ void ieee80211_send_4addr_nullfunc(struct ieee80211_local *local,
|
||||
}
|
||||
|
||||
/* spectrum management related things */
|
||||
static void ieee80211_chswitch_work(struct wiphy *wiphy,
|
||||
struct wiphy_work *work)
|
||||
static void ieee80211_csa_switch_work(struct wiphy *wiphy,
|
||||
struct wiphy_work *work)
|
||||
{
|
||||
struct ieee80211_link_data *link =
|
||||
container_of(work, struct ieee80211_link_data,
|
||||
u.mgd.chswitch_work.work);
|
||||
u.mgd.csa.switch_work.work);
|
||||
struct ieee80211_sub_if_data *sdata = link->sdata;
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
||||
@ -2085,8 +2085,8 @@ static void ieee80211_chswitch_work(struct wiphy *wiphy,
|
||||
* update cfg80211 directly.
|
||||
*/
|
||||
if (!ieee80211_vif_link_active(&sdata->vif, link->link_id)) {
|
||||
link->conf->chanreq = link->csa_chanreq;
|
||||
cfg80211_ch_switch_notify(sdata->dev, &link->csa_chanreq.oper,
|
||||
link->conf->chanreq = link->csa.chanreq;
|
||||
cfg80211_ch_switch_notify(sdata->dev, &link->csa.chanreq.oper,
|
||||
link->link_id);
|
||||
return;
|
||||
}
|
||||
@ -2119,7 +2119,7 @@ static void ieee80211_chswitch_work(struct wiphy *wiphy,
|
||||
}
|
||||
|
||||
if (!ieee80211_chanreq_identical(&link->conf->chanreq,
|
||||
&link->csa_chanreq)) {
|
||||
&link->csa.chanreq)) {
|
||||
link_info(link,
|
||||
"failed to finalize channel switch, disconnecting\n");
|
||||
wiphy_work_queue(sdata->local->hw.wiphy,
|
||||
@ -2127,7 +2127,7 @@ static void ieee80211_chswitch_work(struct wiphy *wiphy,
|
||||
return;
|
||||
}
|
||||
|
||||
link->u.mgd.csa_waiting_bcn = true;
|
||||
link->u.mgd.csa.waiting_bcn = true;
|
||||
|
||||
ieee80211_sta_reset_beacon_monitor(sdata);
|
||||
ieee80211_sta_reset_conn_monitor(sdata);
|
||||
@ -2151,8 +2151,8 @@ static void ieee80211_chswitch_post_beacon(struct ieee80211_link_data *link)
|
||||
}
|
||||
|
||||
link->conf->csa_active = false;
|
||||
link->u.mgd.csa_blocked_tx = false;
|
||||
link->u.mgd.csa_waiting_bcn = false;
|
||||
link->u.mgd.csa.blocked_tx = false;
|
||||
link->u.mgd.csa.waiting_bcn = false;
|
||||
|
||||
ret = drv_post_channel_switch(link);
|
||||
if (ret) {
|
||||
@ -2192,7 +2192,7 @@ void ieee80211_chswitch_done(struct ieee80211_vif *vif, bool success,
|
||||
}
|
||||
|
||||
wiphy_delayed_work_queue(sdata->local->hw.wiphy,
|
||||
&link->u.mgd.chswitch_work, 0);
|
||||
&link->u.mgd.csa.switch_work, 0);
|
||||
}
|
||||
|
||||
rcu_read_unlock();
|
||||
@ -2219,7 +2219,7 @@ ieee80211_sta_abort_chanswitch(struct ieee80211_link_data *link)
|
||||
}
|
||||
|
||||
link->conf->csa_active = false;
|
||||
link->u.mgd.csa_blocked_tx = false;
|
||||
link->u.mgd.csa.blocked_tx = false;
|
||||
|
||||
drv_abort_channel_switch(link);
|
||||
}
|
||||
@ -2324,7 +2324,7 @@ ieee80211_sta_other_link_csa_disappeared(struct ieee80211_link_data *link,
|
||||
* puncturing configuration, but we don't have enough data to
|
||||
* detect that.
|
||||
*/
|
||||
if (data.chan != link->csa_chanreq.oper.chan)
|
||||
if (data.chan != link->csa.chanreq.oper.chan)
|
||||
ieee80211_sta_abort_chanswitch(link);
|
||||
}
|
||||
|
||||
@ -2398,7 +2398,7 @@ ieee80211_sta_process_chanswitch(struct ieee80211_link_data *link,
|
||||
/* already processing - disregard action frames */
|
||||
return;
|
||||
case IEEE80211_CSA_SOURCE_BEACON:
|
||||
if (link->u.mgd.csa_waiting_bcn) {
|
||||
if (link->u.mgd.csa.waiting_bcn) {
|
||||
ieee80211_chswitch_post_beacon(link);
|
||||
/*
|
||||
* If the CSA is still present after the switch
|
||||
@ -2421,7 +2421,7 @@ ieee80211_sta_process_chanswitch(struct ieee80211_link_data *link,
|
||||
return;
|
||||
|
||||
/* switch work ran, so just complete the process */
|
||||
if (link->u.mgd.csa_waiting_bcn) {
|
||||
if (link->u.mgd.csa.waiting_bcn) {
|
||||
ieee80211_chswitch_post_beacon(link);
|
||||
/*
|
||||
* If the CSA is still present after the switch
|
||||
@ -2476,12 +2476,12 @@ ieee80211_sta_process_chanswitch(struct ieee80211_link_data *link,
|
||||
if (cfg80211_chandef_identical(&csa_ie.chanreq.oper,
|
||||
&link->conf->chanreq.oper) &&
|
||||
(!csa_ie.mode || source != IEEE80211_CSA_SOURCE_BEACON)) {
|
||||
if (link->u.mgd.csa_ignored_same_chan)
|
||||
if (link->u.mgd.csa.ignored_same_chan)
|
||||
return;
|
||||
link_info(link,
|
||||
"AP %pM tries to chanswitch to same channel, ignore\n",
|
||||
link->u.mgd.bssid);
|
||||
link->u.mgd.csa_ignored_same_chan = true;
|
||||
link->u.mgd.csa.ignored_same_chan = true;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2529,10 +2529,10 @@ ieee80211_sta_process_chanswitch(struct ieee80211_link_data *link,
|
||||
}
|
||||
|
||||
link->conf->csa_active = true;
|
||||
link->csa_chanreq = csa_ie.chanreq;
|
||||
link->u.mgd.csa_ignored_same_chan = false;
|
||||
link->csa.chanreq = csa_ie.chanreq;
|
||||
link->u.mgd.csa.ignored_same_chan = false;
|
||||
link->u.mgd.beacon_crc_valid = false;
|
||||
link->u.mgd.csa_blocked_tx = csa_ie.mode;
|
||||
link->u.mgd.csa.blocked_tx = csa_ie.mode;
|
||||
|
||||
if (csa_ie.mode &&
|
||||
!ieee80211_hw_check(&local->hw, HANDLES_QUIET_CSA)) {
|
||||
@ -2547,7 +2547,7 @@ ieee80211_sta_process_chanswitch(struct ieee80211_link_data *link,
|
||||
|
||||
/* we may have to handle timeout for deactivated link in software */
|
||||
now = jiffies;
|
||||
link->u.mgd.csa_time = now +
|
||||
link->u.mgd.csa.time = now +
|
||||
TU_TO_JIFFIES((max_t(int, csa_ie.count, 1) - 1) *
|
||||
link->conf->beacon_int);
|
||||
|
||||
@ -2557,7 +2557,7 @@ ieee80211_sta_process_chanswitch(struct ieee80211_link_data *link,
|
||||
* Use driver's channel switch callback, the driver will
|
||||
* later call ieee80211_chswitch_done(). It may deactivate
|
||||
* the link as well, we handle that elsewhere and queue
|
||||
* the chswitch_work for the calculated time then.
|
||||
* the csa.switch_work for the calculated time then.
|
||||
*/
|
||||
drv_channel_switch(local, sdata, &ch_switch);
|
||||
return;
|
||||
@ -2565,8 +2565,8 @@ ieee80211_sta_process_chanswitch(struct ieee80211_link_data *link,
|
||||
|
||||
/* channel switch handled in software */
|
||||
wiphy_delayed_work_queue(local->hw.wiphy,
|
||||
&link->u.mgd.chswitch_work,
|
||||
link->u.mgd.csa_time - now);
|
||||
&link->u.mgd.csa.switch_work,
|
||||
link->u.mgd.csa.time - now);
|
||||
return;
|
||||
drop_connection:
|
||||
/*
|
||||
@ -2577,7 +2577,7 @@ ieee80211_sta_process_chanswitch(struct ieee80211_link_data *link,
|
||||
* reset when the disconnection worker runs.
|
||||
*/
|
||||
link->conf->csa_active = true;
|
||||
link->u.mgd.csa_blocked_tx = csa_ie.mode;
|
||||
link->u.mgd.csa.blocked_tx = csa_ie.mode;
|
||||
sdata->csa_blocked_queues =
|
||||
csa_ie.mode && !ieee80211_hw_check(&local->hw, HANDLES_QUIET_CSA);
|
||||
|
||||
@ -3630,9 +3630,9 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
|
||||
}
|
||||
|
||||
sdata->vif.bss_conf.csa_active = false;
|
||||
sdata->deflink.u.mgd.csa_blocked_tx = false;
|
||||
sdata->deflink.u.mgd.csa_waiting_bcn = false;
|
||||
sdata->deflink.u.mgd.csa_ignored_same_chan = false;
|
||||
sdata->deflink.u.mgd.csa.blocked_tx = false;
|
||||
sdata->deflink.u.mgd.csa.waiting_bcn = false;
|
||||
sdata->deflink.u.mgd.csa.ignored_same_chan = false;
|
||||
if (sdata->csa_blocked_queues) {
|
||||
ieee80211_wake_vif_queues(local, sdata,
|
||||
IEEE80211_QUEUE_STOP_REASON_CSA);
|
||||
@ -3960,7 +3960,7 @@ static void __ieee80211_disconnect(struct ieee80211_sub_if_data *sdata)
|
||||
if (WARN_ON_ONCE(!link))
|
||||
continue;
|
||||
|
||||
if (link->u.mgd.csa_blocked_tx)
|
||||
if (link->u.mgd.csa.blocked_tx)
|
||||
continue;
|
||||
|
||||
tx = true;
|
||||
@ -3997,8 +3997,8 @@ static void __ieee80211_disconnect(struct ieee80211_sub_if_data *sdata)
|
||||
tx, frame_buf);
|
||||
/* the other links will be destroyed */
|
||||
sdata->vif.bss_conf.csa_active = false;
|
||||
sdata->deflink.u.mgd.csa_waiting_bcn = false;
|
||||
sdata->deflink.u.mgd.csa_blocked_tx = false;
|
||||
sdata->deflink.u.mgd.csa.waiting_bcn = false;
|
||||
sdata->deflink.u.mgd.csa.blocked_tx = false;
|
||||
if (sdata->csa_blocked_queues) {
|
||||
ieee80211_wake_vif_queues(local, sdata,
|
||||
IEEE80211_QUEUE_STOP_REASON_CSA);
|
||||
@ -7785,7 +7785,7 @@ static void ieee80211_sta_bcn_mon_timer(struct timer_list *t)
|
||||
return;
|
||||
|
||||
if (sdata->vif.bss_conf.csa_active &&
|
||||
!sdata->deflink.u.mgd.csa_waiting_bcn)
|
||||
!sdata->deflink.u.mgd.csa.waiting_bcn)
|
||||
return;
|
||||
|
||||
if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER)
|
||||
@ -7809,7 +7809,7 @@ static void ieee80211_sta_conn_mon_timer(struct timer_list *t)
|
||||
return;
|
||||
|
||||
if (sdata->vif.bss_conf.csa_active &&
|
||||
!sdata->deflink.u.mgd.csa_waiting_bcn)
|
||||
!sdata->deflink.u.mgd.csa.waiting_bcn)
|
||||
return;
|
||||
|
||||
sta = sta_info_get(sdata, sdata->vif.cfg.ap_addr);
|
||||
@ -8020,8 +8020,8 @@ void ieee80211_mgd_setup_link(struct ieee80211_link_data *link)
|
||||
else
|
||||
link->u.mgd.req_smps = IEEE80211_SMPS_OFF;
|
||||
|
||||
wiphy_delayed_work_init(&link->u.mgd.chswitch_work,
|
||||
ieee80211_chswitch_work);
|
||||
wiphy_delayed_work_init(&link->u.mgd.csa.switch_work,
|
||||
ieee80211_csa_switch_work);
|
||||
|
||||
ieee80211_clear_tpe(&link->conf->tpe);
|
||||
|
||||
@ -9152,7 +9152,7 @@ void ieee80211_mgd_stop_link(struct ieee80211_link_data *link)
|
||||
wiphy_work_cancel(link->sdata->local->hw.wiphy,
|
||||
&link->u.mgd.recalc_smps);
|
||||
wiphy_delayed_work_cancel(link->sdata->local->hw.wiphy,
|
||||
&link->u.mgd.chswitch_work);
|
||||
&link->u.mgd.csa.switch_work);
|
||||
}
|
||||
|
||||
void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata)
|
||||
|
Loading…
Reference in New Issue
Block a user