2011-04-12 11:04:33

by Alexander Simon

[permalink] [raw]
Subject: Re: [PATCH 2/4] nl80211: Add NL80211_ATTR_WIPHY_CHANNEL_TYPE for IBSS

Needed for IBSS IEEE802.11N operation

* Add a new attribute NL80211_ATTR_WIPHY_CHANNEL_TYPE to specify
a HT channel type for IBSS

Signed-off-by: Alexander Simon <[email protected]>
---
nl80211.c | 20 ++++++++++++++++++--
1 file changed, 18 insertions(+), 2 deletions(-)

diff -Nrup a/net/wireless/nl80211.c b/net/wireless/nl80211.c
--- a/net/wireless/nl80211.c 2011-03-31 21:04:02.000000000 +0200
+++ b/net/wireless/nl80211.c 2011-04-12 08:49:19.000000000 +0200
@@ -3927,8 +3927,24 @@ static int nl80211_join_ibss(struct sk_b
ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
}

- ibss.channel = ieee80211_get_channel(wiphy,
- nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
+ if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
+ enum nl80211_channel_type channel_type;
+
+ channel_type = nla_get_u32(
+ info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
+ if (channel_type != NL80211_CHAN_NO_HT &&
+ channel_type != NL80211_CHAN_HT20 &&
+ channel_type != NL80211_CHAN_HT40PLUS &&
+ channel_type != NL80211_CHAN_HT40MINUS)
+ return -EINVAL;
+ ibss.channel_type = channel_type;
+ } else {
+ ibss.channel_type = NL80211_CHAN_NO_HT;
+ }
+
+ ibss.channel = rdev_freq_to_chan(rdev,
+ nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]),
+ ibss.channel_type);
if (!ibss.channel ||
ibss.channel->flags & IEEE80211_CHAN_NO_IBSS ||
ibss.channel->flags & IEEE80211_CHAN_DISABLED)





2011-04-12 11:08:09

by Johannes Berg

[permalink] [raw]
Subject: Re: [PATCH 2/4] nl80211: Add NL80211_ATTR_WIPHY_CHANNEL_TYPE for IBSS

On Tue, 2011-04-12 at 11:04 +0000, Alexander Simon wrote:
> Needed for IBSS IEEE802.11N operation
>
> * Add a new attribute NL80211_ATTR_WIPHY_CHANNEL_TYPE to specify
> a HT channel type for IBSS

> - ibss.channel = ieee80211_get_channel(wiphy,
> - nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
> + if (info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]) {
> + enum nl80211_channel_type channel_type;
> +
> + channel_type = nla_get_u32(
> + info->attrs[NL80211_ATTR_WIPHY_CHANNEL_TYPE]);
> + if (channel_type != NL80211_CHAN_NO_HT &&
> + channel_type != NL80211_CHAN_HT20 &&
> + channel_type != NL80211_CHAN_HT40PLUS &&
> + channel_type != NL80211_CHAN_HT40MINUS)
> + return -EINVAL;
> + ibss.channel_type = channel_type;

Please use Linux coding style.

> + ibss.channel = rdev_freq_to_chan(rdev,
> + nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]),
> + ibss.channel_type);

I don't think that is sufficient. Need to check that IBSS is allowed on
both channels, maybe with a function like can_beacon_sec_chan.

johannes