]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: mac80211: use vif radio mask to limit creating chanctx
authorFelix Fietkau <nbd@nbd.name>
Wed, 9 Oct 2024 08:25:44 +0000 (10:25 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 23 Oct 2024 14:44:55 +0000 (16:44 +0200)
Reject frequencies not supported by any radio that the vif is allowed to use.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
Link: https://patch.msgid.link/95ea1f6fc5bd1614a0c7952b6c67726e3fd635fb.1728462320.git-series.nbd@nbd.name
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/chan.c

index 0e44f4e3809958ed843fc85fb8a2053fc654d83a..996965005d49a86ed05d31d2043c008f0509bc48 100644 (file)
@@ -1177,7 +1177,7 @@ ieee80211_replace_chanctx(struct ieee80211_local *local,
 static bool
 ieee80211_find_available_radio(struct ieee80211_local *local,
                               const struct ieee80211_chan_req *chanreq,
-                              int *radio_idx)
+                              u32 radio_mask, int *radio_idx)
 {
        struct wiphy *wiphy = local->hw.wiphy;
        const struct wiphy_radio *radio;
@@ -1188,6 +1188,9 @@ ieee80211_find_available_radio(struct ieee80211_local *local,
                return true;
 
        for (i = 0; i < wiphy->n_radio; i++) {
+               if (!(radio_mask & BIT(i)))
+                       continue;
+
                radio = &wiphy->radio[i];
                if (!cfg80211_radio_chandef_valid(radio, &chanreq->oper))
                        continue;
@@ -1221,7 +1224,9 @@ int ieee80211_link_reserve_chanctx(struct ieee80211_link_data *link,
        new_ctx = ieee80211_find_reservation_chanctx(local, chanreq, mode);
        if (!new_ctx) {
                if (ieee80211_can_create_new_chanctx(local, -1) &&
-                   ieee80211_find_available_radio(local, chanreq, &radio_idx))
+                   ieee80211_find_available_radio(local, chanreq,
+                                                  sdata->wdev.radio_mask,
+                                                  &radio_idx))
                        new_ctx = ieee80211_new_chanctx(local, chanreq, mode,
                                                        false, radio_idx);
                else
@@ -1891,7 +1896,9 @@ int _ieee80211_link_use_channel(struct ieee80211_link_data *link,
        /* Note: context is now reserved */
        if (ctx)
                reserved = true;
-       else if (!ieee80211_find_available_radio(local, chanreq, &radio_idx))
+       else if (!ieee80211_find_available_radio(local, chanreq,
+                                                sdata->wdev.radio_mask,
+                                                &radio_idx))
                ctx = ERR_PTR(-EBUSY);
        else
                ctx = ieee80211_new_chanctx(local, chanreq, mode,