wifi: mac80211: pass link_id to channel switch ops
authorJohannes Berg <johannes.berg@intel.com>
Wed, 28 Feb 2024 08:55:43 +0000 (09:55 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 4 Mar 2024 13:33:54 +0000 (14:33 +0100)
For CSA to work correctly in multi-link scenarios, pass
the link_id to the relevant callbacks.

While at it, unify/deduplicate the tracing for them.

Reviewed-by: Miriam Rachel Korenblit <miriam.rachel.korenblit@intel.com>
Reviewed-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Link: https://msgid.link/20240228095718.b7726635c054.I0be5d00af4acb48cfbd23a9dbf067f9aeb66469d@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/mac80211.h
net/mac80211/cfg.c
net/mac80211/mlme.c
net/mac80211/trace.h

index 6c6d8210d637482c16da980539f1743440a14b50..8ea9fa81e68c59cf9d8f61fabc1514e234c270f1 100644 (file)
@@ -1763,8 +1763,9 @@ struct ieee80211_conf {
  * @chandef: the new channel to switch to
  * @count: the number of TBTT's until the channel switch event
  * @delay: maximum delay between the time the AP transmitted the last beacon in
-  *    current channel and the expected time of the first beacon in the new
-  *    channel, expressed in TU.
+ *     current channel and the expected time of the first beacon in the new
+ *     channel, expressed in TU.
+ * @link_id: the link ID of the link doing the channel switch, 0 for non-MLO
  */
 struct ieee80211_channel_switch {
        u64 timestamp;
@@ -1772,6 +1773,7 @@ struct ieee80211_channel_switch {
        bool block_tx;
        struct cfg80211_chan_def chandef;
        u8 count;
+       u8 link_id;
        u32 delay;
 };
 
index 358593eeb5000fea110579a8e3dd684c3195601b..4bc0cc2dff83a6ad259c56d9f2090e6cfbb8494e 100644 (file)
@@ -3931,7 +3931,9 @@ __ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct ieee80211_chan_req chanreq = { .oper = params->chandef };
        struct ieee80211_local *local = sdata->local;
-       struct ieee80211_channel_switch ch_switch;
+       struct ieee80211_channel_switch ch_switch = {
+               .link_id = params->link_id,
+       };
        struct ieee80211_chanctx_conf *conf;
        struct ieee80211_chanctx *chanctx;
        struct ieee80211_bss_conf *link_conf;
index 90e505778db6151a21b68f5dd149a475ddacd218..d1d4480c0352d25be25ba93eeb489b018c1dfccd 100644 (file)
@@ -2021,7 +2021,9 @@ ieee80211_sta_process_chanswitch(struct ieee80211_link_data *link,
        struct ieee80211_chanctx *chanctx;
        enum nl80211_band current_band;
        struct ieee80211_csa_ie csa_ie;
-       struct ieee80211_channel_switch ch_switch;
+       struct ieee80211_channel_switch ch_switch = {
+               .link_id = link->link_id,
+       };
        struct ieee80211_bss *bss;
        unsigned long timeout;
        int res;
index 478b32d2520a193da4e7582e116623ca56f0713c..8e758b5074bde71357079c3f005df0370814294a 100644 (file)
@@ -1209,7 +1209,7 @@ DEFINE_EVENT(sta_event, drv_flush_sta,
        TP_ARGS(local, sdata, sta)
 );
 
-TRACE_EVENT(drv_channel_switch,
+DECLARE_EVENT_CLASS(chanswitch_evt,
        TP_PROTO(struct ieee80211_local *local,
                 struct ieee80211_sub_if_data *sdata,
                 struct ieee80211_channel_switch *ch_switch),
@@ -1224,6 +1224,7 @@ TRACE_EVENT(drv_channel_switch,
                __field(u32, device_timestamp)
                __field(bool, block_tx)
                __field(u8, count)
+               __field(u8, link_id)
        ),
 
        TP_fast_assign(
@@ -1234,14 +1235,24 @@ TRACE_EVENT(drv_channel_switch,
                __entry->device_timestamp = ch_switch->device_timestamp;
                __entry->block_tx = ch_switch->block_tx;
                __entry->count = ch_switch->count;
+               __entry->link_id = ch_switch->link_id;
        ),
 
        TP_printk(
-               LOCAL_PR_FMT VIF_PR_FMT " new " CHANDEF_PR_FMT " count:%d",
-               LOCAL_PR_ARG, VIF_PR_ARG, CHANDEF_PR_ARG, __entry->count
+               LOCAL_PR_FMT VIF_PR_FMT CHANDEF_PR_FMT  " count:%d block_tx:%d timestamp:%llu device_ts:%u link_id:%d",
+               LOCAL_PR_ARG, VIF_PR_ARG, CHANDEF_PR_ARG, __entry->count,
+               __entry->block_tx, __entry->timestamp,
+               __entry->device_timestamp, __entry->link_id
        )
 );
 
+DEFINE_EVENT(chanswitch_evt, drv_channel_switch,
+       TP_PROTO(struct ieee80211_local *local,
+                struct ieee80211_sub_if_data *sdata,
+                struct ieee80211_channel_switch *ch_switch),
+       TP_ARGS(local, sdata, ch_switch)
+);
+
 TRACE_EVENT(drv_set_antenna,
        TP_PROTO(struct ieee80211_local *local, u32 tx_ant, u32 rx_ant, int ret),
 
@@ -2121,39 +2132,11 @@ TRACE_EVENT(drv_channel_switch_beacon,
        )
 );
 
-TRACE_EVENT(drv_pre_channel_switch,
+DEFINE_EVENT(chanswitch_evt, drv_pre_channel_switch,
        TP_PROTO(struct ieee80211_local *local,
                 struct ieee80211_sub_if_data *sdata,
                 struct ieee80211_channel_switch *ch_switch),
-
-       TP_ARGS(local, sdata, ch_switch),
-
-       TP_STRUCT__entry(
-               LOCAL_ENTRY
-               VIF_ENTRY
-               CHANDEF_ENTRY
-               __field(u64, timestamp)
-               __field(u32, device_timestamp)
-               __field(bool, block_tx)
-               __field(u8, count)
-       ),
-
-       TP_fast_assign(
-               LOCAL_ASSIGN;
-               VIF_ASSIGN;
-               CHANDEF_ASSIGN(&ch_switch->chandef)
-               __entry->timestamp = ch_switch->timestamp;
-               __entry->device_timestamp = ch_switch->device_timestamp;
-               __entry->block_tx = ch_switch->block_tx;
-               __entry->count = ch_switch->count;
-       ),
-
-       TP_printk(
-               LOCAL_PR_FMT VIF_PR_FMT " prepare channel switch to "
-               CHANDEF_PR_FMT  " count:%d block_tx:%d timestamp:%llu",
-               LOCAL_PR_ARG, VIF_PR_ARG, CHANDEF_PR_ARG, __entry->count,
-               __entry->block_tx, __entry->timestamp
-       )
+       TP_ARGS(local, sdata, ch_switch)
 );
 
 DEFINE_EVENT(local_sdata_evt, drv_post_channel_switch,
@@ -2168,40 +2151,11 @@ DEFINE_EVENT(local_sdata_evt, drv_abort_channel_switch,
             TP_ARGS(local, sdata)
 );
 
-TRACE_EVENT(drv_channel_switch_rx_beacon,
+DEFINE_EVENT(chanswitch_evt, drv_channel_switch_rx_beacon,
        TP_PROTO(struct ieee80211_local *local,
                 struct ieee80211_sub_if_data *sdata,
                 struct ieee80211_channel_switch *ch_switch),
-
-       TP_ARGS(local, sdata, ch_switch),
-
-       TP_STRUCT__entry(
-               LOCAL_ENTRY
-               VIF_ENTRY
-               CHANDEF_ENTRY
-               __field(u64, timestamp)
-               __field(u32, device_timestamp)
-               __field(bool, block_tx)
-               __field(u8, count)
-       ),
-
-       TP_fast_assign(
-               LOCAL_ASSIGN;
-               VIF_ASSIGN;
-               CHANDEF_ASSIGN(&ch_switch->chandef)
-               __entry->timestamp = ch_switch->timestamp;
-               __entry->device_timestamp = ch_switch->device_timestamp;
-               __entry->block_tx = ch_switch->block_tx;
-               __entry->count = ch_switch->count;
-       ),
-
-       TP_printk(
-               LOCAL_PR_FMT VIF_PR_FMT
-               " received a channel switch beacon to "
-               CHANDEF_PR_FMT  " count:%d block_tx:%d timestamp:%llu",
-               LOCAL_PR_ARG, VIF_PR_ARG, CHANDEF_PR_ARG, __entry->count,
-               __entry->block_tx, __entry->timestamp
-       )
+       TP_ARGS(local, sdata, ch_switch)
 );
 
 TRACE_EVENT(drv_get_txpower,