* [PATCH] cfg80211: Parse channel_type in NL80211_CMD_JOIN_IBSS
@ 2010-05-04 6:47 Benoit Papillault
2010-05-04 6:47 ` [PATCH] cfg80211: Check for channel HT capabilities in an IBSS Benoit Papillault
0 siblings, 1 reply; 11+ messages in thread
From: Benoit Papillault @ 2010-05-04 6:47 UTC (permalink / raw)
To: johannes; +Cc: linux-wireless, Benoit Papillault
This field is filled by iw and parse by cfg80211 before being sent to
mac80211 for instance. This information is needed to properly configure
an HT IBSS.
It requires a patch to iw to fill this field.
Signed-off-by: Benoit Papillault <benoit.papillault@free.fr>
---
include/net/cfg80211.h | 1 +
net/wireless/nl80211.c | 12 ++++++++++++
2 files changed, 13 insertions(+), 0 deletions(-)
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 7d10c01..93e5558 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -806,6 +806,7 @@ struct cfg80211_ibss_params {
u8 *ssid;
u8 *bssid;
struct ieee80211_channel *channel;
+ enum nl80211_channel_type channel_type;
u8 *ie;
u8 ssid_len, ie_len;
u16 beacon_interval;
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 01da83d..8da9823 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -3792,6 +3792,7 @@ static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
struct cfg80211_ibss_params ibss;
struct wiphy *wiphy;
struct cfg80211_cached_keys *connkeys = NULL;
+ enum nl80211_channel_type channel_type = NL80211_CHAN_NO_HT;
int err;
memset(&ibss, 0, sizeof(ibss));
@@ -3813,6 +3814,17 @@ static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
return -EINVAL;
}
+ if (info->attrs[NL80211_ATTR_WIPHY_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;
+
rtnl_lock();
err = get_rdev_dev_by_info_ifindex(info, &rdev, &dev);
--
1.5.6.5
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH] cfg80211: Check for channel HT capabilities in an IBSS
2010-05-04 6:47 [PATCH] cfg80211: Parse channel_type in NL80211_CMD_JOIN_IBSS Benoit Papillault
@ 2010-05-04 6:47 ` Benoit Papillault
2010-05-04 6:47 ` [PATCH] mac80211: Add HT IE to IBSS beacons and probe responses Benoit Papillault
` (2 more replies)
0 siblings, 3 replies; 11+ messages in thread
From: Benoit Papillault @ 2010-05-04 6:47 UTC (permalink / raw)
To: johannes; +Cc: linux-wireless, Benoit Papillault
When configuring an HT IBSS, we need to check if the specified channel
is capable of ht40+, ht40- or ht20.
Signed-off-by: Benoit Papillault <benoit.papillault@free.fr>
---
net/wireless/nl80211.c | 8 ++++----
1 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 8da9823..0a82623 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -3858,11 +3858,11 @@ static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
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]));
+ ibss.channel = rdev_freq_to_chan(rdev,
+ nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]),
+ channel_type);
if (!ibss.channel ||
- ibss.channel->flags & IEEE80211_CHAN_NO_IBSS ||
- ibss.channel->flags & IEEE80211_CHAN_DISABLED) {
+ ibss.channel->flags & IEEE80211_CHAN_NO_IBSS) {
err = -EINVAL;
goto out;
}
--
1.5.6.5
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH] mac80211: Add HT IE to IBSS beacons and probe responses.
2010-05-04 6:47 ` [PATCH] cfg80211: Check for channel HT capabilities in an IBSS Benoit Papillault
@ 2010-05-04 6:47 ` Benoit Papillault
2010-05-04 8:26 ` Johannes Berg
2010-05-05 11:46 ` Johannes Berg
2010-05-04 8:23 ` [PATCH] cfg80211: Check for channel HT capabilities in an IBSS Johannes Berg
2010-05-04 18:14 ` Luis R. Rodriguez
2 siblings, 2 replies; 11+ messages in thread
From: Benoit Papillault @ 2010-05-04 6:47 UTC (permalink / raw)
To: johannes; +Cc: linux-wireless, Benoit Papillault
When an HT IBSS is configured, we add HT Information and HT Capabilities
IE to beacon & probe responses. This is done according to channel_type
transmitted by iw/cfg80211.
Signed-off-by: Benoit Papillault <benoit.papillault@free.fr>
---
net/mac80211/ibss.c | 114 +++++++++++++++++++++++++++++++++++++++++---
net/mac80211/ieee80211_i.h | 1 +
net/mac80211/util.c | 23 +++++----
3 files changed, 120 insertions(+), 18 deletions(-)
diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c
index f657854..c501d3b 100644
--- a/net/mac80211/ibss.c
+++ b/net/mac80211/ibss.c
@@ -64,6 +64,7 @@ static void ieee80211_rx_mgmt_auth_ibss(struct ieee80211_sub_if_data *sdata,
static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
const u8 *bssid, const int beacon_int,
struct ieee80211_channel *chan,
+ enum nl80211_channel_type channel_type,
const u32 basic_rates,
const u16 capability, u64 tsf)
{
@@ -103,7 +104,7 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0;
local->oper_channel = chan;
- local->oper_channel_type = NL80211_CHAN_NO_HT;
+ local->oper_channel_type = channel_type;
ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
sband = local->hw.wiphy->bands[chan->band];
@@ -118,7 +119,10 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
*pos++ = basic | (u8) (rate / 5);
}
- /* Build IBSS probe response */
+ /*
+ * Build IBSS probe response template (also used for beacon template
+ * in ieee80211_beacon_get_tim())
+ */
mgmt = (void *) skb_put(skb, 24 + sizeof(mgmt->u.beacon));
memset(mgmt, 0, 24 + sizeof(mgmt->u.beacon));
mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
@@ -165,6 +169,64 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
memcpy(pos, &supp_rates[8], rates);
}
+ if (channel_type != NL80211_CHAN_NO_HT &&
+ sband->ht_cap.ht_supported) {
+ u16 cap = sband->ht_cap.cap;
+ struct ieee80211_ht_cap ht_cap;
+ struct ieee80211_ht_info ht_info;
+
+ if (ieee80211_disable_40mhz_24ghz &&
+ sband->band == IEEE80211_BAND_2GHZ) {
+ cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
+ cap &= ~IEEE80211_HT_CAP_SGI_40;
+ }
+
+ ht_cap.cap_info = cpu_to_le16(cap);
+ ht_cap.ampdu_params_info = sband->ht_cap.ampdu_factor |
+ (sband->ht_cap.ampdu_density <<
+ IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT);
+ ht_cap.mcs = sband->ht_cap.mcs;
+ ht_cap.extended_ht_cap_info = cpu_to_le16(0);
+ ht_cap.tx_BF_cap_info = cpu_to_le32(0);
+ ht_cap.antenna_selection_info = 0;
+
+ /* HT Capabilities element */
+ pos = skb_put(skb, 2 + sizeof(struct ieee80211_ht_cap));
+ *pos++ = WLAN_EID_HT_CAPABILITY;
+ *pos++ = sizeof(struct ieee80211_ht_cap);
+ memcpy(pos, &ht_cap, sizeof(struct ieee80211_ht_cap));
+
+ ht_info.control_chan =
+ ieee80211_frequency_to_channel(chan->center_freq);
+ ht_info.ht_param = 0;
+ switch (local->oper_channel_type) {
+ case NL80211_CHAN_NO_HT: /* to make compiler happy */
+ case NL80211_CHAN_HT20:
+ ht_info.ht_param |= IEEE80211_HT_PARAM_CHA_SEC_NONE;
+ break;
+ case NL80211_CHAN_HT40MINUS:
+ ht_info.ht_param |= IEEE80211_HT_PARAM_CHA_SEC_BELOW;
+ break;
+ case NL80211_CHAN_HT40PLUS:
+ ht_info.ht_param |= IEEE80211_HT_PARAM_CHA_SEC_ABOVE;
+ break;
+ }
+ if (sband->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
+ ht_info.ht_param |= IEEE80211_HT_PARAM_CHAN_WIDTH_ANY;
+ ht_info.operation_mode = cpu_to_le16(0);
+ ht_info.stbc_param = cpu_to_le16(0);
+ /* It seems that Basic MCS set and Supported MCS set
+ are identical for the first 10 bytes */
+ memset(&ht_info.basic_set, 0, 16);
+ memcpy(&ht_info.basic_set, &ht_cap.mcs, 10);
+
+ /* HT Information element */
+ pos = skb_put(skb, 2 + sizeof(struct ieee80211_ht_info));
+ *pos++ = WLAN_EID_HT_INFORMATION;
+ *pos++ = sizeof(struct ieee80211_ht_info);
+ memcpy(pos, &ht_info, sizeof(struct ieee80211_ht_info));
+ }
+
if (ifibss->ie_len)
memcpy(skb_put(skb, ifibss->ie_len),
ifibss->ie, ifibss->ie_len);
@@ -202,6 +264,9 @@ static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
u32 basic_rates;
int i, j;
u16 beacon_int = cbss->beacon_interval;
+ const u8 * ht_info_ie;
+ const struct ieee80211_ht_info *ht_info;
+ enum nl80211_channel_type channel_type = NL80211_CHAN_NO_HT;
if (beacon_int < 10)
beacon_int = 10;
@@ -223,9 +288,28 @@ static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
}
}
+ /* parse HT Information IE, if present */
+ ht_info_ie = ieee80211_bss_get_ie(cbss, WLAN_EID_HT_INFORMATION);
+ if (ht_info_ie) {
+ ht_info = (const struct ieee80211_ht_info *)(ht_info_ie + 2);
+ switch (ht_info->ht_param
+ & IEEE80211_HT_PARAM_CHA_SEC_OFFSET) {
+ case IEEE80211_HT_PARAM_CHA_SEC_NONE:
+ channel_type = NL80211_CHAN_HT20;
+ break;
+ case IEEE80211_HT_PARAM_CHA_SEC_ABOVE:
+ channel_type = NL80211_CHAN_HT40PLUS;
+ break;
+ case IEEE80211_HT_PARAM_CHA_SEC_BELOW:
+ channel_type = NL80211_CHAN_HT40MINUS;
+ break;
+ }
+ }
+
__ieee80211_sta_join_ibss(sdata, cbss->bssid,
beacon_int,
cbss->channel,
+ channel_type,
basic_rates,
cbss->capability,
cbss->tsf);
@@ -529,7 +613,8 @@ static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata)
sdata->drop_unencrypted = 0;
__ieee80211_sta_join_ibss(sdata, bssid, sdata->vif.bss_conf.beacon_int,
- ifibss->channel, 3, /* first two are basic */
+ ifibss->channel, ifibss->channel_type,
+ 3, /* first two are basic */
capability, 0);
}
@@ -906,6 +991,7 @@ int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
sdata->vif.bss_conf.beacon_int = params->beacon_interval;
sdata->u.ibss.channel = params->channel;
+ sdata->u.ibss.channel_type = params->channel_type;
sdata->u.ibss.fixed_channel = params->channel_fixed;
if (params->ie) {
@@ -915,11 +1001,25 @@ int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
sdata->u.ibss.ie_len = params->ie_len;
}
+ /*
+ * Allocate IBSS probe response template (see
+ * __ieee80211_sta_join_ibss for the needed size). According to IEEE
+ * 802.11-2007 10.4.4.2, there is only 20 possibles values. We
+ * support up IEEE80211_MAX_SUPP_RATES (currently 32) : so 8 for
+ * Supported Rates and IEEE80211_MAX_SUPP_RATES-8 for Extended
+ * Supported Rates
+ */
+
skb = dev_alloc_skb(sdata->local->hw.extra_tx_headroom +
- 36 /* bitrates */ +
- 34 /* SSID */ +
- 3 /* DS params */ +
- 4 /* IBSS params */ +
+ sizeof(struct ieee80211_hdr_3addr) +
+ 12 /* struct ieee80211_mgmt.u.beacon */ +
+ 2 + IEEE80211_MAX_SSID_LEN /* max SSID */ +
+ 2 + 8 /* max Supported Rates */ +
+ 3 /* max DS params */ +
+ 4 /* IBSS params */ +
+ 2 + (IEEE80211_MAX_SUPP_RATES-8) /* max Ext Rates */ +
+ 2 + sizeof(struct ieee80211_ht_cap) +
+ 2 + sizeof(struct ieee80211_ht_info) +
params->ie_len);
if (!skb)
return -ENOMEM;
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index c8077a3..30876f3 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -404,6 +404,7 @@ struct ieee80211_if_ibss {
u8 ssid_len, ie_len;
u8 *ie;
struct ieee80211_channel *channel;
+ enum nl80211_channel_type channel_type;
unsigned long ibss_join_req;
/* probe response/beacon for IBSS */
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index 2b75b4f..b83f264 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -967,7 +967,7 @@ int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer,
if (sband->ht_cap.ht_supported) {
u16 cap = sband->ht_cap.cap;
- __le16 tmp;
+ struct ieee80211_ht_cap ht_cap;
if (ieee80211_disable_40mhz_24ghz &&
sband->band == IEEE80211_BAND_2GHZ) {
@@ -975,18 +975,19 @@ int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer,
cap &= ~IEEE80211_HT_CAP_SGI_40;
}
+ ht_cap.cap_info = cpu_to_le16(cap);
+ ht_cap.ampdu_params_info = sband->ht_cap.ampdu_factor |
+ (sband->ht_cap.ampdu_density <<
+ IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT);
+ ht_cap.mcs = sband->ht_cap.mcs;
+ ht_cap.extended_ht_cap_info = cpu_to_le16(0);
+ ht_cap.tx_BF_cap_info = cpu_to_le32(0);
+ ht_cap.antenna_selection_info = 0;
+
*pos++ = WLAN_EID_HT_CAPABILITY;
*pos++ = sizeof(struct ieee80211_ht_cap);
- memset(pos, 0, sizeof(struct ieee80211_ht_cap));
- tmp = cpu_to_le16(cap);
- memcpy(pos, &tmp, sizeof(u16));
- pos += sizeof(u16);
- *pos++ = sband->ht_cap.ampdu_factor |
- (sband->ht_cap.ampdu_density <<
- IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT);
- memcpy(pos, &sband->ht_cap.mcs, sizeof(sband->ht_cap.mcs));
- pos += sizeof(sband->ht_cap.mcs);
- pos += 2 + 4 + 1; /* ext info, BF cap, antsel */
+ memcpy(pos, &ht_cap, sizeof(struct ieee80211_ht_cap));
+ pos += sizeof(struct ieee80211_ht_cap);
}
/*
--
1.5.6.5
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH] cfg80211: Check for channel HT capabilities in an IBSS
2010-05-04 6:47 ` [PATCH] cfg80211: Check for channel HT capabilities in an IBSS Benoit Papillault
2010-05-04 6:47 ` [PATCH] mac80211: Add HT IE to IBSS beacons and probe responses Benoit Papillault
@ 2010-05-04 8:23 ` Johannes Berg
2010-05-05 6:29 ` Benoit Papillault
2010-05-04 18:14 ` Luis R. Rodriguez
2 siblings, 1 reply; 11+ messages in thread
From: Johannes Berg @ 2010-05-04 8:23 UTC (permalink / raw)
To: Benoit Papillault; +Cc: linux-wireless
On Tue, 2010-05-04 at 08:47 +0200, Benoit Papillault wrote:
> When configuring an HT IBSS, we need to check if the specified channel
> is capable of ht40+, ht40- or ht20.
These first two patches cannot be separate.
johannes
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] mac80211: Add HT IE to IBSS beacons and probe responses.
2010-05-04 6:47 ` [PATCH] mac80211: Add HT IE to IBSS beacons and probe responses Benoit Papillault
@ 2010-05-04 8:26 ` Johannes Berg
2010-05-05 6:37 ` Benoit Papillault
2010-05-05 11:46 ` Johannes Berg
1 sibling, 1 reply; 11+ messages in thread
From: Johannes Berg @ 2010-05-04 8:26 UTC (permalink / raw)
To: Benoit Papillault; +Cc: linux-wireless
> @@ -118,7 +119,10 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
> *pos++ = basic | (u8) (rate / 5);
> }
>
> - /* Build IBSS probe response */
> + /*
> + * Build IBSS probe response template (also used for beacon template
> + * in ieee80211_beacon_get_tim())
> + */
That change is wrong -- no way beacon code can call into IBSS code.
I think you meant to say "I need to create a common helper function that
I call here and in the beacon code."
> --- a/net/mac80211/util.c
> +++ b/net/mac80211/util.c
> @@ -967,7 +967,7 @@ int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer,
>
> if (sband->ht_cap.ht_supported) {
> u16 cap = sband->ht_cap.cap;
> - __le16 tmp;
> + struct ieee80211_ht_cap ht_cap;
>
> if (ieee80211_disable_40mhz_24ghz &&
> sband->band == IEEE80211_BAND_2GHZ) {
> @@ -975,18 +975,19 @@ int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer,
> cap &= ~IEEE80211_HT_CAP_SGI_40;
> }
>
> + ht_cap.cap_info = cpu_to_le16(cap);
> + ht_cap.ampdu_params_info = sband->ht_cap.ampdu_factor |
> + (sband->ht_cap.ampdu_density <<
> + IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT);
> + ht_cap.mcs = sband->ht_cap.mcs;
> + ht_cap.extended_ht_cap_info = cpu_to_le16(0);
> + ht_cap.tx_BF_cap_info = cpu_to_le32(0);
> + ht_cap.antenna_selection_info = 0;
> +
> *pos++ = WLAN_EID_HT_CAPABILITY;
> *pos++ = sizeof(struct ieee80211_ht_cap);
> - memset(pos, 0, sizeof(struct ieee80211_ht_cap));
> - tmp = cpu_to_le16(cap);
> - memcpy(pos, &tmp, sizeof(u16));
> - pos += sizeof(u16);
> - *pos++ = sband->ht_cap.ampdu_factor |
> - (sband->ht_cap.ampdu_density <<
> - IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT);
> - memcpy(pos, &sband->ht_cap.mcs, sizeof(sband->ht_cap.mcs));
> - pos += sizeof(sband->ht_cap.mcs);
> - pos += 2 + 4 + 1; /* ext info, BF cap, antsel */
> + memcpy(pos, &ht_cap, sizeof(struct ieee80211_ht_cap));
> + pos += sizeof(struct ieee80211_ht_cap);
And this is an unrelated change that doesn't belong into this patch at
all.
johannes
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] cfg80211: Check for channel HT capabilities in an IBSS
2010-05-04 6:47 ` [PATCH] cfg80211: Check for channel HT capabilities in an IBSS Benoit Papillault
2010-05-04 6:47 ` [PATCH] mac80211: Add HT IE to IBSS beacons and probe responses Benoit Papillault
2010-05-04 8:23 ` [PATCH] cfg80211: Check for channel HT capabilities in an IBSS Johannes Berg
@ 2010-05-04 18:14 ` Luis R. Rodriguez
2010-05-05 6:28 ` Benoit Papillault
2 siblings, 1 reply; 11+ messages in thread
From: Luis R. Rodriguez @ 2010-05-04 18:14 UTC (permalink / raw)
To: Benoit Papillault; +Cc: johannes, linux-wireless
On Mon, May 3, 2010 at 11:47 PM, Benoit Papillault
<benoit.papillault@free.fr> wrote:
> When configuring an HT IBSS, we need to check if the specified channel
> is capable of ht40+, ht40- or ht20.
>
> Signed-off-by: Benoit Papillault <benoit.papillault@free.fr>
> ---
> net/wireless/nl80211.c | 8 ++++----
> 1 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
> index 8da9823..0a82623 100644
> --- a/net/wireless/nl80211.c
> +++ b/net/wireless/nl80211.c
> @@ -3858,11 +3858,11 @@ static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
> 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]));
> + ibss.channel = rdev_freq_to_chan(rdev,
> + nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]),
> + channel_type);
> if (!ibss.channel ||
> - ibss.channel->flags & IEEE80211_CHAN_NO_IBSS ||
> - ibss.channel->flags & IEEE80211_CHAN_DISABLED) {
> + ibss.channel->flags & IEEE80211_CHAN_NO_IBSS) {
> err = -EINVAL;
Why is the disabled channel check being removed here?
Luis
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] cfg80211: Check for channel HT capabilities in an IBSS
2010-05-04 18:14 ` Luis R. Rodriguez
@ 2010-05-05 6:28 ` Benoit Papillault
0 siblings, 0 replies; 11+ messages in thread
From: Benoit Papillault @ 2010-05-05 6:28 UTC (permalink / raw)
To: Luis R. Rodriguez; +Cc: johannes, linux-wireless
Le 04/05/2010 20:14, Luis R. Rodriguez a écrit :
> On Mon, May 3, 2010 at 11:47 PM, Benoit Papillault
> <benoit.papillault@free.fr> wrote:
>> When configuring an HT IBSS, we need to check if the specified channel
>> is capable of ht40+, ht40- or ht20.
>>
>> Signed-off-by: Benoit Papillault<benoit.papillault@free.fr>
>> ---
>> net/wireless/nl80211.c | 8 ++++----
>> 1 files changed, 4 insertions(+), 4 deletions(-)
>>
>> diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
>> index 8da9823..0a82623 100644
>> --- a/net/wireless/nl80211.c
>> +++ b/net/wireless/nl80211.c
>> @@ -3858,11 +3858,11 @@ static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
>> 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]));
>> + ibss.channel = rdev_freq_to_chan(rdev,
>> + nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]),
>> + channel_type);
>> if (!ibss.channel ||
>> - ibss.channel->flags& IEEE80211_CHAN_NO_IBSS ||
>> - ibss.channel->flags& IEEE80211_CHAN_DISABLED) {
>> + ibss.channel->flags& IEEE80211_CHAN_NO_IBSS) {
>> err = -EINVAL;
>
> Why is the disabled channel check being removed here?
>
> Luis
>
Hi Luis,
It's because the check is already done in rdev_freq_to_chan.
Regards,
Benoit
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] cfg80211: Check for channel HT capabilities in an IBSS
2010-05-04 8:23 ` [PATCH] cfg80211: Check for channel HT capabilities in an IBSS Johannes Berg
@ 2010-05-05 6:29 ` Benoit Papillault
0 siblings, 0 replies; 11+ messages in thread
From: Benoit Papillault @ 2010-05-05 6:29 UTC (permalink / raw)
To: Johannes Berg; +Cc: linux-wireless
Le 04/05/2010 10:23, Johannes Berg a écrit :
> On Tue, 2010-05-04 at 08:47 +0200, Benoit Papillault wrote:
>> When configuring an HT IBSS, we need to check if the specified channel
>> is capable of ht40+, ht40- or ht20.
>
> These first two patches cannot be separate.
>
> johannes
>
>
Right. Will repost a single patch including both.
Regards,
Benoit
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] mac80211: Add HT IE to IBSS beacons and probe responses.
2010-05-04 8:26 ` Johannes Berg
@ 2010-05-05 6:37 ` Benoit Papillault
0 siblings, 0 replies; 11+ messages in thread
From: Benoit Papillault @ 2010-05-05 6:37 UTC (permalink / raw)
To: Johannes Berg; +Cc: linux-wireless
Le 04/05/2010 10:26, Johannes Berg a écrit :
>
>> @@ -118,7 +119,10 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
>> *pos++ = basic | (u8) (rate / 5);
>> }
>>
>> - /* Build IBSS probe response */
>> + /*
>> + * Build IBSS probe response template (also used for beacon template
>> + * in ieee80211_beacon_get_tim())
>> + */
>
> That change is wrong -- no way beacon code can call into IBSS code.
I meant the skb that is produced here and stored in ifibss->presp is
then used both for sending beacons in ieee80211_beacon_get_tim and for
sending probe response in ieee80211_rx_mgmt_probe_req
>
> I think you meant to say "I need to create a common helper function that
> I call here and in the beacon code."
You are right : I will add a helper function to create HT Capability IE.
>
>> --- a/net/mac80211/util.c
>> +++ b/net/mac80211/util.c
>> @@ -967,7 +967,7 @@ int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer,
>>
>> if (sband->ht_cap.ht_supported) {
>> u16 cap = sband->ht_cap.cap;
>> - __le16 tmp;
>> + struct ieee80211_ht_cap ht_cap;
>>
>> if (ieee80211_disable_40mhz_24ghz&&
>> sband->band == IEEE80211_BAND_2GHZ) {
>> @@ -975,18 +975,19 @@ int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer,
>> cap&= ~IEEE80211_HT_CAP_SGI_40;
>> }
>>
>> + ht_cap.cap_info = cpu_to_le16(cap);
>> + ht_cap.ampdu_params_info = sband->ht_cap.ampdu_factor |
>> + (sband->ht_cap.ampdu_density<<
>> + IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT);
>> + ht_cap.mcs = sband->ht_cap.mcs;
>> + ht_cap.extended_ht_cap_info = cpu_to_le16(0);
>> + ht_cap.tx_BF_cap_info = cpu_to_le32(0);
>> + ht_cap.antenna_selection_info = 0;
>> +
>> *pos++ = WLAN_EID_HT_CAPABILITY;
>> *pos++ = sizeof(struct ieee80211_ht_cap);
>> - memset(pos, 0, sizeof(struct ieee80211_ht_cap));
>> - tmp = cpu_to_le16(cap);
>> - memcpy(pos,&tmp, sizeof(u16));
>> - pos += sizeof(u16);
>> - *pos++ = sband->ht_cap.ampdu_factor |
>> - (sband->ht_cap.ampdu_density<<
>> - IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT);
>> - memcpy(pos,&sband->ht_cap.mcs, sizeof(sband->ht_cap.mcs));
>> - pos += sizeof(sband->ht_cap.mcs);
>> - pos += 2 + 4 + 1; /* ext info, BF cap, antsel */
>> + memcpy(pos,&ht_cap, sizeof(struct ieee80211_ht_cap));
>> + pos += sizeof(struct ieee80211_ht_cap);
>
> And this is an unrelated change that doesn't belong into this patch at
> all.
>
> johannes
>
>
Regards,
Benoit
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] mac80211: Add HT IE to IBSS beacons and probe responses.
2010-05-04 6:47 ` [PATCH] mac80211: Add HT IE to IBSS beacons and probe responses Benoit Papillault
2010-05-04 8:26 ` Johannes Berg
@ 2010-05-05 11:46 ` Johannes Berg
2010-05-05 21:37 ` Benoit Papillault
1 sibling, 1 reply; 11+ messages in thread
From: Johannes Berg @ 2010-05-05 11:46 UTC (permalink / raw)
To: Benoit Papillault; +Cc: linux-wireless
On Tue, 2010-05-04 at 08:47 +0200, Benoit Papillault wrote:
> When an HT IBSS is configured, we add HT Information and HT Capabilities
> IE to beacon & probe responses. This is done according to channel_type
> transmitted by iw/cfg80211.
Just noticed something else -- this allows creating an HT40 IBSS on an
invalid channel pair -- do we want to catch that?
johannse
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] mac80211: Add HT IE to IBSS beacons and probe responses.
2010-05-05 11:46 ` Johannes Berg
@ 2010-05-05 21:37 ` Benoit Papillault
0 siblings, 0 replies; 11+ messages in thread
From: Benoit Papillault @ 2010-05-05 21:37 UTC (permalink / raw)
To: Johannes Berg; +Cc: linux-wireless
Le 05/05/2010 13:46, Johannes Berg a écrit :
> On Tue, 2010-05-04 at 08:47 +0200, Benoit Papillault wrote:
>> When an HT IBSS is configured, we add HT Information and HT Capabilities
>> IE to beacon& probe responses. This is done according to channel_type
>> transmitted by iw/cfg80211.
>
> Just noticed something else -- this allows creating an HT40 IBSS on an
> invalid channel pair -- do we want to catch that?
>
> johannse
>
Do you mean creating an ht40+ over channel 112, where only ht40- is
allowed by 802.11 ? Since it's the same for AP & IBSS, maybe it could be
done in the regulatory code?
Anyway, since this latter issue was already there for a while, it could
be fixed in a follow up patch.
Regards,
Benoit
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2010-05-05 21:37 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-05-04 6:47 [PATCH] cfg80211: Parse channel_type in NL80211_CMD_JOIN_IBSS Benoit Papillault
2010-05-04 6:47 ` [PATCH] cfg80211: Check for channel HT capabilities in an IBSS Benoit Papillault
2010-05-04 6:47 ` [PATCH] mac80211: Add HT IE to IBSS beacons and probe responses Benoit Papillault
2010-05-04 8:26 ` Johannes Berg
2010-05-05 6:37 ` Benoit Papillault
2010-05-05 11:46 ` Johannes Berg
2010-05-05 21:37 ` Benoit Papillault
2010-05-04 8:23 ` [PATCH] cfg80211: Check for channel HT capabilities in an IBSS Johannes Berg
2010-05-05 6:29 ` Benoit Papillault
2010-05-04 18:14 ` Luis R. Rodriguez
2010-05-05 6:28 ` Benoit Papillault
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).