]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: cfg80211/mac80211: use proper link ID for DFS
authorAditya Kumar Singh <quic_adisi@quicinc.com>
Fri, 6 Sep 2024 06:44:25 +0000 (12:14 +0530)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 6 Sep 2024 11:01:05 +0000 (13:01 +0200)
Now that all APIs have support to handle DFS per link, use proper link ID
instead of 0.

Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
Link: https://patch.msgid.link/20240906064426.2101315-8-quic_adisi@quicinc.com
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/cfg.c
net/mac80211/mlme.c
net/mac80211/scan.c
net/wireless/mlme.c
net/wireless/nl80211.c

index 57e66c671e2e8001458346029e5cc510a15dab4e..847304a3a29a9631174cb63823f119f844f57759 100644 (file)
@@ -1662,12 +1662,12 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev,
        ieee80211_link_info_change_notify(sdata, link,
                                          BSS_CHANGED_BEACON_ENABLED);
 
-       if (sdata->wdev.links[0].cac_started) {
+       if (sdata->wdev.links[link_id].cac_started) {
                chandef = link_conf->chanreq.oper;
                wiphy_delayed_work_cancel(wiphy, &link->dfs_cac_timer_work);
                cfg80211_cac_event(sdata->dev, &chandef,
                                   NL80211_RADAR_CAC_ABORTED,
-                                  GFP_KERNEL, 0);
+                                  GFP_KERNEL, link_id);
        }
 
        drv_stop_ap(sdata->local, sdata, link_conf);
@@ -3968,7 +3968,7 @@ __ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
        if (!list_empty(&local->roc_list) || local->scanning)
                return -EBUSY;
 
-       if (sdata->wdev.links[0].cac_started)
+       if (sdata->wdev.links[link_id].cac_started)
                return -EBUSY;
 
        if (WARN_ON(link_id >= IEEE80211_MLD_MAX_NUM_LINKS))
index 715709860fdd37db744df3b526230689943f506d..735e78adb0db881060bcb8abad442210c94b51bf 100644 (file)
@@ -3039,11 +3039,11 @@ void ieee80211_dfs_cac_timer_work(struct wiphy *wiphy, struct wiphy_work *work)
 
        lockdep_assert_wiphy(sdata->local->hw.wiphy);
 
-       if (sdata->wdev.links[0].cac_started) {
+       if (sdata->wdev.links[link->link_id].cac_started) {
                ieee80211_link_release_channel(link);
                cfg80211_cac_event(sdata->dev, &chandef,
                                   NL80211_RADAR_CAC_FINISHED,
-                                  GFP_KERNEL, 0);
+                                  GFP_KERNEL, link->link_id);
        }
 }
 
index 6735620378f48844652e62ad208ba84610197260..adb88c06b5982237f5022a8103e8bc974109679d 100644 (file)
@@ -575,6 +575,7 @@ static bool __ieee80211_can_leave_ch(struct ieee80211_sub_if_data *sdata)
 {
        struct ieee80211_local *local = sdata->local;
        struct ieee80211_sub_if_data *sdata_iter;
+       unsigned int link_id;
 
        lockdep_assert_wiphy(local->hw.wiphy);
 
@@ -585,8 +586,9 @@ static bool __ieee80211_can_leave_ch(struct ieee80211_sub_if_data *sdata)
                return false;
 
        list_for_each_entry(sdata_iter, &local->interfaces, list) {
-               if (sdata_iter->wdev.links[0].cac_started)
-                       return false;
+               for_each_valid_link(&sdata_iter->wdev, link_id)
+                       if (sdata_iter->wdev.links[link_id].cac_started)
+                               return false;
        }
 
        return true;
index 115c8cd28aafaa835b6d9dbe408e1708b71f769a..4dac818547210084378a7cba3abc57d2fb81325c 100644 (file)
@@ -1124,14 +1124,14 @@ void cfg80211_cac_event(struct net_device *netdev,
 
        trace_cfg80211_cac_event(netdev, event, link_id);
 
-       if (WARN_ON(!wdev->links[0].cac_started &&
+       if (WARN_ON(!wdev->links[link_id].cac_started &&
                    event != NL80211_RADAR_CAC_STARTED))
                return;
 
        switch (event) {
        case NL80211_RADAR_CAC_FINISHED:
-               timeout = wdev->links[0].cac_start_time +
-                         msecs_to_jiffies(wdev->links[0].cac_time_ms);
+               timeout = wdev->links[link_id].cac_start_time +
+                         msecs_to_jiffies(wdev->links[link_id].cac_time_ms);
                WARN_ON(!time_after_eq(jiffies, timeout));
                cfg80211_set_dfs_state(wiphy, chandef, NL80211_DFS_AVAILABLE);
                memcpy(&rdev->cac_done_chandef, chandef,
@@ -1140,10 +1140,10 @@ void cfg80211_cac_event(struct net_device *netdev,
                cfg80211_sched_dfs_chan_update(rdev);
                fallthrough;
        case NL80211_RADAR_CAC_ABORTED:
-               wdev->links[0].cac_started = false;
+               wdev->links[link_id].cac_started = false;
                break;
        case NL80211_RADAR_CAC_STARTED:
-               wdev->links[0].cac_started = true;
+               wdev->links[link_id].cac_started = true;
                break;
        default:
                WARN_ON(1);
index 7d9264304a8afcba4a5f6490ecaa53c8c3c4e958..8bad3c6db39d9050ab9a6d865cedea619aceb48e 100644 (file)
@@ -6066,7 +6066,7 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
        if (!rdev->ops->start_ap)
                return -EOPNOTSUPP;
 
-       if (wdev->links[0].cac_started)
+       if (wdev->links[link_id].cac_started)
                return -EBUSY;
 
        if (wdev->links[link_id].ap.beacon_interval)
@@ -10072,6 +10072,7 @@ static int nl80211_start_radar_detection(struct sk_buff *skb,
        struct cfg80211_registered_device *rdev = info->user_ptr[0];
        struct net_device *dev = info->user_ptr[1];
        struct wireless_dev *wdev = dev->ieee80211_ptr;
+       int link_id = nl80211_link_id(info->attrs);
        struct wiphy *wiphy = wdev->wiphy;
        struct cfg80211_chan_def chandef;
        enum nl80211_dfs_regions dfs_region;
@@ -10126,7 +10127,7 @@ static int nl80211_start_radar_detection(struct sk_buff *skb,
                 * can not already beacon
                 */
                if (wdev->valid_links &&
-                   !wdev->links[0].ap.beacon_interval) {
+                   !wdev->links[link_id].ap.beacon_interval) {
                        /* nothing */
                } else {
                        err = -EBUSY;
@@ -10134,7 +10135,7 @@ static int nl80211_start_radar_detection(struct sk_buff *skb,
                }
        }
 
-       if (wdev->links[0].cac_started) {
+       if (wdev->links[link_id].cac_started) {
                err = -EBUSY;
                goto unlock;
        }
@@ -10155,7 +10156,7 @@ static int nl80211_start_radar_detection(struct sk_buff *skb,
                cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
 
        err = rdev_start_radar_detection(rdev, dev, &chandef, cac_time_ms,
-                                        0);
+                                        link_id);
        if (!err) {
                switch (wdev->iftype) {
                case NL80211_IFTYPE_AP:
@@ -10171,9 +10172,9 @@ static int nl80211_start_radar_detection(struct sk_buff *skb,
                default:
                        break;
                }
-               wdev->links[0].cac_started = true;
-               wdev->links[0].cac_start_time = jiffies;
-               wdev->links[0].cac_time_ms = cac_time_ms;
+               wdev->links[link_id].cac_started = true;
+               wdev->links[link_id].cac_start_time = jiffies;
+               wdev->links[link_id].cac_time_ms = cac_time_ms;
        }
 unlock:
        wiphy_unlock(wiphy);