diff options
Diffstat (limited to 'net/mac80211/scan.c')
-rw-r--r-- | net/mac80211/scan.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c index 05f0d711b6d8..7bb6a9383f58 100644 --- a/net/mac80211/scan.c +++ b/net/mac80211/scan.c | |||
@@ -928,11 +928,12 @@ int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata, | |||
928 | 928 | ||
929 | int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata, | 929 | int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata, |
930 | const u8 *ssid, u8 ssid_len, | 930 | const u8 *ssid, u8 ssid_len, |
931 | struct ieee80211_channel *chan, | 931 | struct ieee80211_channel **channels, |
932 | unsigned int n_channels, | ||
932 | enum nl80211_bss_scan_width scan_width) | 933 | enum nl80211_bss_scan_width scan_width) |
933 | { | 934 | { |
934 | struct ieee80211_local *local = sdata->local; | 935 | struct ieee80211_local *local = sdata->local; |
935 | int ret = -EBUSY; | 936 | int ret = -EBUSY, i, n_ch = 0; |
936 | enum ieee80211_band band; | 937 | enum ieee80211_band band; |
937 | 938 | ||
938 | mutex_lock(&local->mtx); | 939 | mutex_lock(&local->mtx); |
@@ -942,9 +943,8 @@ int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata, | |||
942 | goto unlock; | 943 | goto unlock; |
943 | 944 | ||
944 | /* fill internal scan request */ | 945 | /* fill internal scan request */ |
945 | if (!chan) { | 946 | if (!channels) { |
946 | int i, max_n; | 947 | int max_n; |
947 | int n_ch = 0; | ||
948 | 948 | ||
949 | for (band = 0; band < IEEE80211_NUM_BANDS; band++) { | 949 | for (band = 0; band < IEEE80211_NUM_BANDS; band++) { |
950 | if (!local->hw.wiphy->bands[band]) | 950 | if (!local->hw.wiphy->bands[band]) |
@@ -969,12 +969,19 @@ int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata, | |||
969 | 969 | ||
970 | local->int_scan_req->n_channels = n_ch; | 970 | local->int_scan_req->n_channels = n_ch; |
971 | } else { | 971 | } else { |
972 | if (WARN_ON_ONCE(chan->flags & (IEEE80211_CHAN_NO_IR | | 972 | for (i = 0; i < n_channels; i++) { |
973 | IEEE80211_CHAN_DISABLED))) | 973 | if (channels[i]->flags & (IEEE80211_CHAN_NO_IR | |
974 | IEEE80211_CHAN_DISABLED)) | ||
975 | continue; | ||
976 | |||
977 | local->int_scan_req->channels[n_ch] = channels[i]; | ||
978 | n_ch++; | ||
979 | } | ||
980 | |||
981 | if (WARN_ON_ONCE(n_ch == 0)) | ||
974 | goto unlock; | 982 | goto unlock; |
975 | 983 | ||
976 | local->int_scan_req->channels[0] = chan; | 984 | local->int_scan_req->n_channels = n_ch; |
977 | local->int_scan_req->n_channels = 1; | ||
978 | } | 985 | } |
979 | 986 | ||
980 | local->int_scan_req->ssids = &local->scan_ssid; | 987 | local->int_scan_req->ssids = &local->scan_ssid; |