]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/mac80211/scan.c
mac80211: IBSS fix scan request
[karo-tx-linux.git] / net / mac80211 / scan.c
index 05f0d711b6d8666701e91262141fb67711d9dad7..7bb6a9383f58ec01b3f9c68964aac3f44f3e5beb 100644 (file)
@@ -928,11 +928,12 @@ int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata,
 
 int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata,
                                const u8 *ssid, u8 ssid_len,
-                               struct ieee80211_channel *chan,
+                               struct ieee80211_channel **channels,
+                               unsigned int n_channels,
                                enum nl80211_bss_scan_width scan_width)
 {
        struct ieee80211_local *local = sdata->local;
-       int ret = -EBUSY;
+       int ret = -EBUSY, i, n_ch = 0;
        enum ieee80211_band band;
 
        mutex_lock(&local->mtx);
@@ -942,9 +943,8 @@ int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata,
                goto unlock;
 
        /* fill internal scan request */
-       if (!chan) {
-               int i, max_n;
-               int n_ch = 0;
+       if (!channels) {
+               int max_n;
 
                for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
                        if (!local->hw.wiphy->bands[band])
@@ -969,12 +969,19 @@ int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata,
 
                local->int_scan_req->n_channels = n_ch;
        } else {
-               if (WARN_ON_ONCE(chan->flags & (IEEE80211_CHAN_NO_IR |
-                                               IEEE80211_CHAN_DISABLED)))
+               for (i = 0; i < n_channels; i++) {
+                       if (channels[i]->flags & (IEEE80211_CHAN_NO_IR |
+                                                 IEEE80211_CHAN_DISABLED))
+                               continue;
+
+                       local->int_scan_req->channels[n_ch] = channels[i];
+                       n_ch++;
+               }
+
+               if (WARN_ON_ONCE(n_ch == 0))
                        goto unlock;
 
-               local->int_scan_req->channels[0] = chan;
-               local->int_scan_req->n_channels = 1;
+               local->int_scan_req->n_channels = n_ch;
        }
 
        local->int_scan_req->ssids = &local->scan_ssid;