mac80211: fix AP multi-BSSID support (#11698)
authorFelix Fietkau <nbd@openwrt.org>
Tue, 19 Jun 2012 00:53:20 +0000 (00:53 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Tue, 19 Jun 2012 00:53:20 +0000 (00:53 +0000)
SVN-Revision: 32448

package/mac80211/patches/300-pending_work.patch
package/mac80211/patches/522-ath9k_per_chain_signal_strength.patch

index cb219c914762408fb302039fbb24280b5d09ca2d..4f96a013f4aff188a6382a5b7c06cf20ffa1b7be 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;
+ }
index 40f4e62c7e93506c6d520bb0bf601ab08371a17b..3b9cfe8752d04e5ff0e011a67240fdce478fe36c 100644 (file)
        __NL80211_STA_INFO_AFTER_LAST,
 --- a/net/wireless/nl80211.c
 +++ b/net/wireless/nl80211.c
-@@ -2523,6 +2523,33 @@ nla_put_failure:
+@@ -2553,6 +2553,33 @@ nla_put_failure:
        return false;
  }
  
  static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq,
                                int flags,
                                struct cfg80211_registered_device *rdev,
-@@ -2584,6 +2611,18 @@ static int nl80211_send_station(struct s
+@@ -2614,6 +2641,18 @@ static int nl80211_send_station(struct s
        default:
                break;
        }