The same code is also used for probe request generation
Signed-off-by: Benoit Papillault <[email protected]>
---
net/mac80211/ibss.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++---
net/mac80211/util.c | 22 +++++++------
2 files changed, 93 insertions(+), 15 deletions(-)
diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c
index f95750b..86bd2a0 100644
--- a/net/mac80211/ibss.c
+++ b/net/mac80211/ibss.c
@@ -96,6 +96,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;
+ /* FIXME : we can have HT channels here */
local->oper_channel_type = NL80211_CHAN_NO_HT;
ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
@@ -111,7 +112,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 |
@@ -158,6 +162,64 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
memcpy(pos, &supp_rates[8], rates);
}
+ if (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;
+ /* FIXME : local->oper_channel_type is set to a fixed value */
+ switch (local->oper_channel_type) {
+ case NL80211_CHAN_NO_HT:
+ 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);
@@ -899,11 +961,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/util.c b/net/mac80211/util.c
index ca170b4..416b0e2 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -958,6 +958,7 @@ int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer,
if (sband->ht_cap.ht_supported) {
u16 cap = sband->ht_cap.cap;
+ struct ieee80211_ht_cap ht_cap;
__le16 tmp;
if (ieee80211_disable_40mhz_24ghz &&
@@ -966,18 +967,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.6.3.3
On Thu, 2010-01-21 at 00:03 +0100, Benoit PAPILLAULT wrote:
>
> Humm... same question for me. What's wrong in the patch? form? content?
> frame format? commit message?
Well shouldn't you only advertise HT if the user or somebody actually
asked to join an HT IBSS and you configured the right channel type?
johannes
Johannes,
What do you mean by saying "on its own the patch is wrong".
Thanks,
xxiao
--- On Wed, 1/20/10, Johannes Berg <[email protected]> wrote:
> From: Johannes Berg <[email protected]>
> Subject: Re: [PATCH] mac80211: Add HT IE to IBSS beacons and probe responses.
> To: "Benoit Papillault" <[email protected]>
> Cc: [email protected]
> Date: Wednesday, January 20, 2010, 4:21 AM
> On Tue, 2010-01-19 at 17:42 +0100,
> Benoit Papillault wrote:
> > The same code is also used for probe request
> generation
>
> The code is probably fine, but on its own the patch is
> wrong, so we
> shouldn't merge it.
>
> johannes
>
On Tue, 2010-01-19 at 17:42 +0100, Benoit Papillault wrote:
> The same code is also used for probe request generation
The code is probably fine, but on its own the patch is wrong, so we
shouldn't merge it.
johannes
Johannes Berg a écrit :
> On Thu, 2010-01-21 at 00:03 +0100, Benoit PAPILLAULT wrote:
>
>>
>> Humm... same question for me. What's wrong in the patch? form? content?
>> frame format? commit message?
>>
>
> Well shouldn't you only advertise HT if the user or somebody actually
> asked to join an HT IBSS and you configured the right channel type?
>
> johannes
>
There are things :
- HT Capabilities IE : this should be the hardware capabilities of the
sender, be it a member of a HT IBSS or not.
- HT Information IE : this should be the BSS information, shared by all
members of the HT IBSS I think.
BTW, currently, there is no way with iw for the user to tell mac82011 to
join/create a non-HT, HT20, HT40+ or HT40- IBSS. Maybe we should update
iw first as a requirement for HT IBSS?
Regards,
Benoit
On Thu, 2010-01-21 at 18:33 +0100, Benoit PAPILLAULT wrote:
> There are things :
> - HT Capabilities IE : this should be the hardware capabilities of the
> sender, be it a member of a HT IBSS or not.
I wouldn't advertise that though when the IBSS we want is not HT. Less
confusion that way.
> - HT Information IE : this should be the BSS information, shared by all
> members of the HT IBSS I think.
So we even need to adopt it, maybe?
> BTW, currently, there is no way with iw for the user to tell mac82011 to
> join/create a non-HT, HT20, HT40+ or HT40- IBSS. Maybe we should update
> iw first as a requirement for HT IBSS?
Indeed, we need nl80211/cfg80211 changes.
johannes
X Xiao a ?crit :
> Johannes,
>
> What do you mean by saying "on its own the patch is wrong".
>
> Thanks,
> xxiao
>
>
Humm... same question for me. What's wrong in the patch? form? content?
frame format? commit message?
Regards,
Benoit