wifi: mac80211: collect some CSA data into sub-structs
authorJohannes Berg <johannes.berg@intel.com>
Mon, 6 May 2024 19:54:49 +0000 (21:54 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 23 May 2024 09:28:51 +0000 (11:28 +0200)
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>
net/mac80211/cfg.c
net/mac80211/chan.c
net/mac80211/ibss.c
net/mac80211/ieee80211_i.h
net/mac80211/iface.c
net/mac80211/link.c
net/mac80211/mlme.c

index 0ed7e8bbf5c081b66aa19e79b2ee53bc7afed6c4..3319c93605070e016e5287f79497b7b18c81e42e 100644 (file)
@@ -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);
index 380695fdc32fa58d9aaa7c1ac9bf54b29cf73a30..ec16d7676088ce7008ae7fab618557f1121f4e3a 100644 (file)
@@ -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:
index 7ace5cdc6c2651c98e754f188ff3669194ac9d64..bf338f3d4dd329abd2b53627d881611859f6f90f 100644 (file)
@@ -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);
index 4ce34e95902e13aca6b612b20597e153596a2ad6..cba1c2c3d9f1d329e51256b915e6f272643cea5f 100644 (file)
@@ -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;
index 1ef4b6dc373084e1a22ef30a3779d415edae7592..d1a49ee4a194f760b0d5c5562302b4b4c8f6e1f2 100644 (file)
@@ -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,
index 508759cc99794416c6d7ccaef50f1545e6eb0c52..2e6e92defbca65a699f75ea2a07dc0a3aeefdfe5 100644 (file)
@@ -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);
        }
 
index aedd1ce1fb8d0631ab7a87d025b7e8733f4a278b..75d53257dd974ccff8cc84baa9815a4ac12b6300 100644 (file)
@@ -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)