lkml.org 
[lkml]   [2013]   [Jan]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[ 087/171] mac80211: fix ibss scanning
    Date
    3.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Stanislaw Gruszka <sgruszka@redhat.com>

    commit 34bcf71502413f8903ade93746f2d0f04b937a78 upstream.

    Do not scan on no-IBSS and disabled channels in IBSS mode. Doing this
    can trigger Microcode errors on iwlwifi and iwlegacy drivers.

    Also rename ieee80211_request_internal_scan() function since it is only
    used in IBSS mode and simplify calling it from ieee80211_sta_find_ibss().

    This patch should address:
    https://bugzilla.redhat.com/show_bug.cgi?id=883414
    https://bugzilla.kernel.org/show_bug.cgi?id=49411

    Reported-by: Jesse Kahtava <jesse_kahtava@f-m.fm>
    Reported-by: Mikko Rapeli <mikko.rapeli@iki.fi>
    Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    net/mac80211/ibss.c | 9 ++++-----
    net/mac80211/ieee80211_i.h | 6 +++---
    net/mac80211/scan.c | 34 ++++++++++++++++++++++++----------
    3 files changed, 31 insertions(+), 18 deletions(-)

    --- a/net/mac80211/ibss.c
    +++ b/net/mac80211/ibss.c
    @@ -664,8 +664,8 @@ static void ieee80211_sta_merge_ibss(str
    printk(KERN_DEBUG "%s: No active IBSS STAs - trying to scan for other "
    "IBSS networks with same SSID (merge)\n", sdata->name);

    - ieee80211_request_internal_scan(sdata,
    - ifibss->ssid, ifibss->ssid_len, NULL);
    + ieee80211_request_ibss_scan(sdata, ifibss->ssid, ifibss->ssid_len,
    + NULL);
    }

    static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata)
    @@ -772,9 +772,8 @@ static void ieee80211_sta_find_ibss(stru
    printk(KERN_DEBUG "%s: Trigger new scan to find an IBSS to "
    "join\n", sdata->name);

    - ieee80211_request_internal_scan(sdata,
    - ifibss->ssid, ifibss->ssid_len,
    - ifibss->fixed_channel ? ifibss->channel : NULL);
    + ieee80211_request_ibss_scan(sdata, ifibss->ssid,
    + ifibss->ssid_len, chan);
    } else {
    int interval = IEEE80211_SCAN_INTERVAL;

    --- a/net/mac80211/ieee80211_i.h
    +++ b/net/mac80211/ieee80211_i.h
    @@ -1233,9 +1233,9 @@ void ieee80211_mesh_rx_queued_mgmt(struc

    /* scan/BSS handling */
    void ieee80211_scan_work(struct work_struct *work);
    -int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata,
    - const u8 *ssid, u8 ssid_len,
    - struct ieee80211_channel *chan);
    +int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata,
    + const u8 *ssid, u8 ssid_len,
    + struct ieee80211_channel *chan);
    int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata,
    struct cfg80211_scan_request *req);
    void ieee80211_scan_cancel(struct ieee80211_local *local);
    --- a/net/mac80211/scan.c
    +++ b/net/mac80211/scan.c
    @@ -761,9 +761,9 @@ int ieee80211_request_scan(struct ieee80
    return res;
    }

    -int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata,
    - const u8 *ssid, u8 ssid_len,
    - struct ieee80211_channel *chan)
    +int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata,
    + const u8 *ssid, u8 ssid_len,
    + struct ieee80211_channel *chan)
    {
    struct ieee80211_local *local = sdata->local;
    int ret = -EBUSY;
    @@ -777,22 +777,36 @@ int ieee80211_request_internal_scan(stru

    /* fill internal scan request */
    if (!chan) {
    - int i, nchan = 0;
    + int i, max_n;
    + int n_ch = 0;

    for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
    if (!local->hw.wiphy->bands[band])
    continue;
    - for (i = 0;
    - i < local->hw.wiphy->bands[band]->n_channels;
    - i++) {
    - local->int_scan_req->channels[nchan] =
    +
    + max_n = local->hw.wiphy->bands[band]->n_channels;
    + for (i = 0; i < max_n; i++) {
    + struct ieee80211_channel *tmp_ch =
    &local->hw.wiphy->bands[band]->channels[i];
    - nchan++;
    +
    + if (tmp_ch->flags & (IEEE80211_CHAN_NO_IBSS |
    + IEEE80211_CHAN_DISABLED))
    + continue;
    +
    + local->int_scan_req->channels[n_ch] = tmp_ch;
    + n_ch++;
    }
    }

    - local->int_scan_req->n_channels = nchan;
    + if (WARN_ON_ONCE(n_ch == 0))
    + goto unlock;
    +
    + local->int_scan_req->n_channels = n_ch;
    } else {
    + if (WARN_ON_ONCE(chan->flags & (IEEE80211_CHAN_NO_IBSS |
    + IEEE80211_CHAN_DISABLED)))
    + goto unlock;
    +
    local->int_scan_req->channels[0] = chan;
    local->int_scan_req->n_channels = 1;
    }



    \
     
     \ /
      Last update: 2013-01-16 01:41    [W:4.530 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site