lkml.org 
[lkml]   [2010]   [Dec]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] [214/223] cfg80211: fix extension channel checks to initiate communication
    Date
    2.6.35-longterm review patch.  If anyone has any objections, please let me know.

    ------------------
    From: Luis R. Rodriguez <lrodriguez@atheros.com>

    commit 9236d838c920e90708570d9bbd7bb82d30a38130 upstream.

    When operating in a mode that initiates communication and using
    HT40 we should fail if we cannot use both primary and secondary
    channels to initiate communication. Our current ht40 allowmap
    only covers STA mode of operation, for beaconing modes we need
    a check on the fly as the mode of operation is dynamic and
    there other flags other than disable which we should read
    to check if we can initiate communication.

    Do not allow for initiating communication if our secondary HT40
    channel has is either disabled, has a passive scan flag, a
    no-ibss flag or is a radar channel. Userspace now has similar
    checks but this is also needed in-kernel.

    Reported-by: Jouni Malinen <jouni.malinen@atheros.com>
    Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
    Signed-off-by: John W. Linville <linville@tuxdriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
    Signed-off-by: Andi Kleen <ak@linux.intel.com>

    ---
    net/wireless/chan.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
    1 file changed, 51 insertions(+)

    Index: linux/net/wireless/chan.c
    ===================================================================
    --- linux.orig/net/wireless/chan.c
    +++ linux/net/wireless/chan.c
    @@ -43,6 +43,36 @@ rdev_freq_to_chan(struct cfg80211_regist
    return chan;
    }

    +static bool can_beacon_sec_chan(struct wiphy *wiphy,
    + struct ieee80211_channel *chan,
    + enum nl80211_channel_type channel_type)
    +{
    + struct ieee80211_channel *sec_chan;
    + int diff;
    +
    + switch (channel_type) {
    + case NL80211_CHAN_HT40PLUS:
    + diff = 20;
    + case NL80211_CHAN_HT40MINUS:
    + diff = -20;
    + default:
    + return false;
    + }
    +
    + sec_chan = ieee80211_get_channel(wiphy, chan->center_freq + diff);
    + if (!sec_chan)
    + return false;
    +
    + /* we'll need a DFS capability later */
    + if (sec_chan->flags & (IEEE80211_CHAN_DISABLED |
    + IEEE80211_CHAN_PASSIVE_SCAN |
    + IEEE80211_CHAN_NO_IBSS |
    + IEEE80211_CHAN_RADAR))
    + return false;
    +
    + return true;
    +}
    +
    int cfg80211_set_freq(struct cfg80211_registered_device *rdev,
    struct wireless_dev *wdev, int freq,
    enum nl80211_channel_type channel_type)
    @@ -67,6 +97,27 @@ int cfg80211_set_freq(struct cfg80211_re
    if (!chan)
    return -EINVAL;

    + /* Both channels should be able to initiate communication */
    + if (wdev && (wdev->iftype == NL80211_IFTYPE_ADHOC ||
    + wdev->iftype == NL80211_IFTYPE_AP ||
    + wdev->iftype == NL80211_IFTYPE_AP_VLAN ||
    + wdev->iftype == NL80211_IFTYPE_MESH_POINT)) {
    + switch (channel_type) {
    + case NL80211_CHAN_HT40PLUS:
    + case NL80211_CHAN_HT40MINUS:
    + if (!can_beacon_sec_chan(&rdev->wiphy, chan,
    + channel_type)) {
    + printk(KERN_DEBUG
    + "cfg80211: Secondary channel not "
    + "allowed to initiate communication\n");
    + return -EINVAL;
    + }
    + break;
    + default:
    + break;
    + }
    + }
    +
    result = rdev->ops->set_channel(&rdev->wiphy,
    wdev ? wdev->netdev : NULL,
    chan, channel_type);

    \
     
     \ /
      Last update: 2010-12-13 00:55    [W:4.109 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site