mac80211: fix AP multi-BSSID support (#11698)
[openwrt.git] / package / mac80211 / patches / 300-pending_work.patch
index cb219c9..4f96a01 100644 (file)
  }
  
  u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate)
+--- a/net/wireless/nl80211.c
++++ b/net/wireless/nl80211.c
+@@ -2246,6 +2246,33 @@ static int nl80211_parse_beacon(struct g
+       return 0;
+ }
++static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev,
++                                 struct cfg80211_ap_settings *params)
++{
++      struct wireless_dev *wdev;
++      bool ret = false;
++
++      mutex_lock(&rdev->devlist_mtx);
++
++      list_for_each_entry(wdev, &rdev->netdev_list, list) {
++              if (wdev->iftype != NL80211_IFTYPE_AP &&
++                  wdev->iftype != NL80211_IFTYPE_P2P_GO)
++                      continue;
++
++              if (!wdev->preset_chan)
++                      continue;
++
++              params->channel = wdev->preset_chan;
++              params->channel_type = wdev->preset_chantype;
++              ret = true;
++              break;
++      }
++
++      mutex_unlock(&rdev->devlist_mtx);
++
++      return ret;
++}
++
+ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
+ {
+       struct cfg80211_registered_device *rdev = info->user_ptr[0];
+@@ -2348,7 +2375,7 @@ static int nl80211_start_ap(struct sk_bu
+       } else if (wdev->preset_chan) {
+               params.channel = wdev->preset_chan;
+               params.channel_type = wdev->preset_chantype;
+-      } else
++      } else if (!nl80211_get_ap_channel(rdev, &params))
+               return -EINVAL;
+       if (!cfg80211_can_beacon_sec_chan(&rdev->wiphy, params.channel,
+@@ -2356,8 +2383,11 @@ static int nl80211_start_ap(struct sk_bu
+               return -EINVAL;
+       err = rdev->ops->start_ap(&rdev->wiphy, dev, &params);
+-      if (!err)
++      if (!err) {
++              wdev->preset_chan = params.channel;
++              wdev->preset_chantype = params.channel_type;
+               wdev->beacon_interval = params.beacon_interval;
++      }
+       return err;
+ }