cfg80211: include block-tx flag in channel switch started event
authorJohannes Berg <johannes.berg@intel.com>
Sun, 29 Nov 2020 15:30:55 +0000 (17:30 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 11 Dec 2020 11:59:37 +0000 (12:59 +0100)
In the NL80211_CMD_CH_SWITCH_STARTED_NOTIFY event, include the
NL80211_ATTR_CH_SWITCH_BLOCK_TX flag attribute if block-tx was
requested by the AP.

Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20201129172929.8953ef22cc64.Ifee9cab337a4369938545920ba5590559e91327a@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/cfg80211.h
include/uapi/linux/nl80211.h
net/mac80211/cfg.c
net/mac80211/mlme.c
net/wireless/nl80211.c

index f3dfb26..d9b67ee 100644 (file)
@@ -7532,6 +7532,7 @@ void cfg80211_ch_switch_notify(struct net_device *dev,
  * @dev: the device on which the channel switch started
  * @chandef: the future channel definition
  * @count: the number of TBTTs until the channel switch happens
+ * @quiet: whether or not immediate quiet was requested by the AP
  *
  * Inform the userspace about the channel switch that has just
  * started, so that it can take appropriate actions (eg. starting
@@ -7539,7 +7540,7 @@ void cfg80211_ch_switch_notify(struct net_device *dev,
  */
 void cfg80211_ch_switch_started_notify(struct net_device *dev,
                                       struct cfg80211_chan_def *chandef,
-                                      u8 count);
+                                      u8 count, bool quiet);
 
 /**
  * ieee80211_operating_class_to_band - convert operating class to band
index 3e0d4a0..83c8603 100644 (file)
@@ -2079,7 +2079,8 @@ enum nl80211_commands {
  *     until the channel switch event.
  * @NL80211_ATTR_CH_SWITCH_BLOCK_TX: flag attribute specifying that transmission
  *     must be blocked on the current channel (before the channel switch
- *     operation).
+ *     operation). Also included in the channel switch started event if quiet
+ *     was requested by the AP.
  * @NL80211_ATTR_CSA_IES: Nested set of attributes containing the IE information
  *     for the time while performing a channel switch.
  * @NL80211_ATTR_CNTDWN_OFFS_BEACON: An array of offsets (u16) to the channel
index c0d0b15..7da343e 100644 (file)
@@ -3450,7 +3450,7 @@ __ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
                                          IEEE80211_QUEUE_STOP_REASON_CSA);
 
        cfg80211_ch_switch_started_notify(sdata->dev, &sdata->csa_chandef,
-                                         params->count);
+                                         params->count, params->block_tx);
 
        if (changed) {
                ieee80211_bss_info_change_notify(sdata, changed);
index 6782966..d4da982 100644 (file)
@@ -1509,7 +1509,7 @@ ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata,
        mutex_unlock(&local->mtx);
 
        cfg80211_ch_switch_started_notify(sdata->dev, &csa_ie.chandef,
-                                         csa_ie.count);
+                                         csa_ie.count, csa_ie.mode);
 
        if (local->ops->channel_switch) {
                /* use driver's channel switch callback */
index 4a7ef3b..c8d3118 100644 (file)
@@ -17062,7 +17062,7 @@ static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
                                     struct cfg80211_chan_def *chandef,
                                     gfp_t gfp,
                                     enum nl80211_commands notif,
-                                    u8 count)
+                                    u8 count, bool quiet)
 {
        struct sk_buff *msg;
        void *hdr;
@@ -17083,9 +17083,13 @@ static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
        if (nl80211_send_chandef(msg, chandef))
                goto nla_put_failure;
 
-       if ((notif == NL80211_CMD_CH_SWITCH_STARTED_NOTIFY) &&
-           (nla_put_u32(msg, NL80211_ATTR_CH_SWITCH_COUNT, count)))
+       if (notif == NL80211_CMD_CH_SWITCH_STARTED_NOTIFY) {
+               if (nla_put_u32(msg, NL80211_ATTR_CH_SWITCH_COUNT, count))
                        goto nla_put_failure;
+               if (quiet &&
+                   nla_put_flag(msg, NL80211_ATTR_CH_SWITCH_BLOCK_TX))
+                       goto nla_put_failure;
+       }
 
        genlmsg_end(msg, hdr);
 
@@ -17118,13 +17122,13 @@ void cfg80211_ch_switch_notify(struct net_device *dev,
        cfg80211_sched_dfs_chan_update(rdev);
 
        nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL,
-                                NL80211_CMD_CH_SWITCH_NOTIFY, 0);
+                                NL80211_CMD_CH_SWITCH_NOTIFY, 0, false);
 }
 EXPORT_SYMBOL(cfg80211_ch_switch_notify);
 
 void cfg80211_ch_switch_started_notify(struct net_device *dev,
                                       struct cfg80211_chan_def *chandef,
-                                      u8 count)
+                                      u8 count, bool quiet)
 {
        struct wireless_dev *wdev = dev->ieee80211_ptr;
        struct wiphy *wiphy = wdev->wiphy;
@@ -17133,7 +17137,8 @@ void cfg80211_ch_switch_started_notify(struct net_device *dev,
        trace_cfg80211_ch_switch_started_notify(dev, chandef);
 
        nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL,
-                                NL80211_CMD_CH_SWITCH_STARTED_NOTIFY, count);
+                                NL80211_CMD_CH_SWITCH_STARTED_NOTIFY,
+                                count, quiet);
 }
 EXPORT_SYMBOL(cfg80211_ch_switch_started_notify);