* [PATCH 1/4] cfg80211: Add channel type for IBSS
@ 2011-04-12 10:42 Alexander Simon
2011-04-12 11:04 ` [PATCH 2/4] nl80211: Add NL80211_ATTR_WIPHY_CHANNEL_TYPE " Alexander Simon
` (3 more replies)
0 siblings, 4 replies; 18+ messages in thread
From: Alexander Simon @ 2011-04-12 10:42 UTC (permalink / raw)
To: linux-wireless
Needed for IBSS IEEE802.11N operation
* Add ht channel type for cfg80211 IBSS configuration
Signed-off-by: Alexander Simon <alexander.simon@saxnet.de>
---
cfg80211.h | 1 +
1 file changed, 1 insertion(+)
diff -Nrup a/include/net/cfg80211.h b/include/net/cfg80211.h
--- a/include/net/cfg80211.h 2011-03-31 21:04:02.000000000 +0200
+++ b/include/net/cfg80211.h 2011-04-12 08:49:19.000000000 +0200
@@ -964,6 +964,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;
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: [PATCH 2/4] nl80211: Add NL80211_ATTR_WIPHY_CHANNEL_TYPE for IBSS 2011-04-12 10:42 [PATCH 1/4] cfg80211: Add channel type for IBSS Alexander Simon @ 2011-04-12 11:04 ` Alexander Simon 2011-04-12 11:08 ` Johannes Berg 2011-04-12 11:06 ` [PATCH 3/4] mac80211: Add function to build HT caps Alexander Simon ` (2 subsequent siblings) 3 siblings, 1 reply; 18+ messages in thread From: Alexander Simon @ 2011-04-12 11:04 UTC (permalink / raw) To: linux-wireless 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 <alexander.simon@saxnet.de> --- 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) ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 2/4] nl80211: Add NL80211_ATTR_WIPHY_CHANNEL_TYPE for IBSS 2011-04-12 11:04 ` [PATCH 2/4] nl80211: Add NL80211_ATTR_WIPHY_CHANNEL_TYPE " Alexander Simon @ 2011-04-12 11:08 ` Johannes Berg 0 siblings, 0 replies; 18+ messages in thread From: Johannes Berg @ 2011-04-12 11:08 UTC (permalink / raw) To: Alexander Simon; +Cc: linux-wireless 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 ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 3/4] mac80211: Add function to build HT caps 2011-04-12 10:42 [PATCH 1/4] cfg80211: Add channel type for IBSS Alexander Simon 2011-04-12 11:04 ` [PATCH 2/4] nl80211: Add NL80211_ATTR_WIPHY_CHANNEL_TYPE " Alexander Simon @ 2011-04-12 11:06 ` Alexander Simon 2011-04-12 11:16 ` Johannes Berg 2011-04-12 11:07 ` [PATCH 4/4] mac80211: Add IEEE802.11n for IBSS Alexander Simon 2011-04-26 19:11 ` [PATCH 1/4] cfg80211: Add channel type " John W. Linville 3 siblings, 1 reply; 18+ messages in thread From: Alexander Simon @ 2011-04-12 11:06 UTC (permalink / raw) To: linux-wireless Some refracturing work. Add a new function ieee80211_ie_build_ht_cap in util.c. Use this shared code from ieee80211_build_preq_ies (util.c) and ieee80211_add_ht_ie (work.c) This will be used from ibss.c also. Signed-off-by: Alexander Simon <alexander.simon@saxnet.de> --- ieee80211_i.h | 2 ++ util.c | 54 +++++++++++++++++++++++++++++++++++++----------------- work.c | 29 +---------------------------- 3 files changed, 40 insertions(+), 45 deletions(-) diff -Nrup a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h --- a/net/mac80211/ieee80211_i.h 2011-03-31 21:04:02.000000000 +0200 +++ b/net/mac80211/ieee80211_i.h 2011-04-12 09:55:16.000000000 +0200 @@ -1351,6 +1352,8 @@ void ieee80211_recalc_smps(struct ieee80 size_t ieee80211_ie_split(const u8 *ies, size_t ielen, const u8 *ids, int n_ids, size_t offset); size_t ieee80211_ie_split_vendor(const u8 *ies, size_t ielen, size_t offset); +u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_supported_band *sband, + u16 cap); /* internal work items */ void ieee80211_work_init(struct ieee80211_local *local); diff -Nrup a/net/mac80211/util.c b/net/mac80211/util.c --- a/net/mac80211/util.c 2011-03-31 21:04:02.000000000 +0200 +++ b/net/mac80211/util.c 2011-04-12 09:55:48.000000000 +0200 @@ -1007,23 +1007,8 @@ int ieee80211_build_preq_ies(struct ieee offset = noffset; } - if (sband->ht_cap.ht_supported) { - u16 cap = sband->ht_cap.cap; - __le16 tmp; - - *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 */ - } + if (sband->ht_cap.ht_supported) + pos = ieee80211_ie_build_ht_cap(pos, sband, sband->ht_cap.cap); /* * If adding more here, adjust code in main.c @@ -1443,3 +1428,38 @@ size_t ieee80211_ie_split_vendor(const u return pos; } + +u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_supported_band *sband, + u16 cap) +{ + __le16 tmp; + + *pos++ = WLAN_EID_HT_CAPABILITY; + *pos++ = sizeof(struct ieee80211_ht_cap); + memset(pos, 0, sizeof(struct ieee80211_ht_cap)); + + /* capability flags */ + tmp = cpu_to_le16(cap); + memcpy(pos, &tmp, sizeof(u16)); + pos += sizeof(u16); + + /* AMPDU parameters */ + *pos++ = sband->ht_cap.ampdu_factor | + (sband->ht_cap.ampdu_density << + IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT); + + /* MCS set */ + memcpy(pos, &sband->ht_cap.mcs, sizeof(sband->ht_cap.mcs)); + pos += sizeof(sband->ht_cap.mcs); + + /* extended capabilities */ + pos += sizeof(__le16); + + /* BF capabilities */ + pos += sizeof(__le32); + + /* antenna selection */ + pos += sizeof(u8); + + return pos; +} diff -Nrup a/net/mac80211/work.c b/net/mac80211/work.c --- a/net/mac80211/work.c 2011-03-31 21:04:01.000000000 +0200 +++ b/net/mac80211/work.c 2011-04-12 09:43:30.000000000 +0200 @@ -110,7 +110,6 @@ static void ieee80211_add_ht_ie(struct s u8 *pos; u32 flags = channel->flags; u16 cap = sband->ht_cap.cap; - __le16 tmp; if (!sband->ht_cap.ht_supported) return; @@ -161,34 +160,8 @@ static void ieee80211_add_ht_ie(struct s } /* reserve and fill IE */ - pos = skb_put(skb, sizeof(struct ieee80211_ht_cap) + 2); - *pos++ = WLAN_EID_HT_CAPABILITY; - *pos++ = sizeof(struct ieee80211_ht_cap); - memset(pos, 0, sizeof(struct ieee80211_ht_cap)); - - /* capability flags */ - tmp = cpu_to_le16(cap); - memcpy(pos, &tmp, sizeof(u16)); - pos += sizeof(u16); - - /* AMPDU parameters */ - *pos++ = sband->ht_cap.ampdu_factor | - (sband->ht_cap.ampdu_density << - IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT); - - /* MCS set */ - memcpy(pos, &sband->ht_cap.mcs, sizeof(sband->ht_cap.mcs)); - pos += sizeof(sband->ht_cap.mcs); - - /* extended capabilities */ - pos += sizeof(__le16); - - /* BF capabilities */ - pos += sizeof(__le32); - - /* antenna selection */ - pos += sizeof(u8); + ieee80211_ie_build_ht_cap(pos, sband, cap); } static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata, ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 3/4] mac80211: Add function to build HT caps 2011-04-12 11:06 ` [PATCH 3/4] mac80211: Add function to build HT caps Alexander Simon @ 2011-04-12 11:16 ` Johannes Berg 2011-04-12 11:22 ` Alexander Simon 0 siblings, 1 reply; 18+ messages in thread From: Johannes Berg @ 2011-04-12 11:16 UTC (permalink / raw) To: Alexander Simon; +Cc: linux-wireless On Tue, 2011-04-12 at 11:06 +0000, Alexander Simon wrote: > +u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_supported_band *sband, > + u16 cap) It makes no sense to pass cap as an argument since it's taken from the sband. johannes ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 3/4] mac80211: Add function to build HT caps 2011-04-12 11:16 ` Johannes Berg @ 2011-04-12 11:22 ` Alexander Simon 0 siblings, 0 replies; 18+ messages in thread From: Alexander Simon @ 2011-04-12 11:22 UTC (permalink / raw) To: Johannes Berg; +Cc: linux-wireless Am Dienstag, den 12.04.2011, 13:16 +0200 schrieb Johannes Berg: > On Tue, 2011-04-12 at 11:06 +0000, Alexander Simon wrote: > > > +u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_supported_band *sband, > > + u16 cap) > > It makes no sense to pass cap as an argument since it's taken from the > sband. > > johannes > Not true, in ieee80211_add_ht_ie in work.c cap is modified before. Alex ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 4/4] mac80211: Add IEEE802.11n for IBSS 2011-04-12 10:42 [PATCH 1/4] cfg80211: Add channel type for IBSS Alexander Simon 2011-04-12 11:04 ` [PATCH 2/4] nl80211: Add NL80211_ATTR_WIPHY_CHANNEL_TYPE " Alexander Simon 2011-04-12 11:06 ` [PATCH 3/4] mac80211: Add function to build HT caps Alexander Simon @ 2011-04-12 11:07 ` Alexander Simon 2011-04-12 11:19 ` Johannes Berg 2011-04-26 19:11 ` [PATCH 1/4] cfg80211: Add channel type " John W. Linville 3 siblings, 1 reply; 18+ messages in thread From: Alexander Simon @ 2011-04-12 11:07 UTC (permalink / raw) To: linux-wireless Okay, here we go. Hopefully this meets your requirements. * Use HT IEs from other stations for rate algo * Parameter to set HT channel type for IBSS join * Build HT IEs when joining an IBSS * Allow frame aggregation sessions for IBSS HT operation will only be started for a station after receiving a beacon. So there may be a delay running in legacy when adding a station from a data packet to a third station (prepare_for_handlers). Signed-off-by: Alexander Simon <alexander.simon@saxnet.de> --- agg-rx.c | 2 + agg-tx.c | 5 ++- ht.c | 2 + ibss.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++-------- ieee80211_i.h | 3 + rx.c | 5 +-- 6 files changed, 95 insertions(+), 16 deletions(-) diff -Nrup a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c --- a/net/mac80211/agg-rx.c 2011-03-31 21:04:01.000000000 +0200 +++ b/net/mac80211/agg-rx.c 2011-04-12 08:49:19.000000000 +0200 @@ -160,6 +160,8 @@ static void ieee80211_send_addba_resp(st memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN); else if (sdata->vif.type == NL80211_IFTYPE_STATION) memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN); + else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) + memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN); mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION); diff -Nrup a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c --- a/net/mac80211/agg-tx.c 2011-03-31 21:04:01.000000000 +0200 +++ b/net/mac80211/agg-tx.c 2011-04-12 08:49:19.000000000 +0200 @@ -83,6 +83,8 @@ static void ieee80211_send_addba_request memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN); else if (sdata->vif.type == NL80211_IFTYPE_STATION) memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN); + else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) + memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN); mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION); @@ -377,7 +379,8 @@ int ieee80211_start_tx_ba_session(struct */ if (sdata->vif.type != NL80211_IFTYPE_STATION && sdata->vif.type != NL80211_IFTYPE_AP_VLAN && - sdata->vif.type != NL80211_IFTYPE_AP) + sdata->vif.type != NL80211_IFTYPE_AP && + sdata->vif.type != NL80211_IFTYPE_ADHOC) return -EINVAL; if (test_sta_flags(sta, WLAN_STA_BLOCK_BA)) { diff -Nrup a/net/mac80211/ht.c b/net/mac80211/ht.c --- a/net/mac80211/ht.c 2011-03-31 21:04:01.000000000 +0200 +++ b/net/mac80211/ht.c 2011-04-12 08:49:19.000000000 +0200 @@ -182,6 +182,8 @@ void ieee80211_send_delba(struct ieee802 memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN); else if (sdata->vif.type == NL80211_IFTYPE_STATION) memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN); + else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) + memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN); mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION); diff -Nrup a/net/mac80211/ibss.c b/net/mac80211/ibss.c --- a/net/mac80211/ibss.c 2011-03-31 21:04:01.000000000 +0200 +++ b/net/mac80211/ibss.c 2011-04-12 10:23:09.000000000 +0200 @@ -65,6 +65,7 @@ static void ieee80211_rx_mgmt_auth_ibss( 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) { @@ -78,6 +79,7 @@ static void __ieee80211_sta_join_ibss(st struct cfg80211_bss *bss; u32 bss_change; u8 supp_rates[IEEE80211_MAX_SUPP_RATES]; + struct ieee80211_ht_info *ht_info; lockdep_assert_held(&ifibss->mtx); @@ -106,7 +108,7 @@ static void __ieee80211_sta_join_ibss(st sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0; local->oper_channel = chan; - WARN_ON(!ieee80211_set_channel_type(local, sdata, NL80211_CHAN_NO_HT)); + WARN_ON(!ieee80211_set_channel_type(local, sdata, channel_type)); ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL); sband = local->hw.wiphy->bands[chan->band]; @@ -172,6 +174,42 @@ static void __ieee80211_sta_join_ibss(st memcpy(skb_put(skb, ifibss->ie_len), ifibss->ie, ifibss->ie_len); + if (channel_type != NL80211_CHAN_NO_HT && sband->ht_cap.ht_supported) { + pos = skb_put(skb, 2 + sizeof(struct ieee80211_ht_cap)); + ieee80211_ie_build_ht_cap(pos, sband, sband->ht_cap.cap); + + /* Build HT Information */ + pos = skb_put(skb, 2 + sizeof(struct ieee80211_ht_info)); + *pos++ = WLAN_EID_HT_INFORMATION; + *pos++ = sizeof(struct ieee80211_ht_info); + ht_info = (struct ieee80211_ht_info *)pos; + + ht_info->control_chan = + ieee80211_frequency_to_channel(chan->center_freq); + ht_info->ht_param = 0x00; + switch (local->_oper_channel_type) { + 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; + case NL80211_CHAN_HT20: + default: + ht_info->ht_param |= IEEE80211_HT_PARAM_CHA_SEC_NONE; + 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 = 0x0000; + ht_info->stbc_param = 0x0000; + + /* 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, &sband->ht_cap.mcs, 10); + } + if (local->hw.queues >= 4) { pos = skb_put(skb, 9); *pos++ = WLAN_EID_VENDOR_SPECIFIC; @@ -220,6 +258,8 @@ static void ieee80211_sta_join_ibss(stru u32 basic_rates; int i, j; u16 beacon_int = cbss->beacon_interval; + enum nl80211_channel_type channel_type = NL80211_CHAN_NO_HT; + const u8 *ht_info_ie; lockdep_assert_held(&sdata->u.ibss.mtx); @@ -243,9 +283,29 @@ static void ieee80211_sta_join_ibss(stru } } + /* parse HT Information IE, if present */ + ht_info_ie = ieee80211_bss_get_ie(cbss, WLAN_EID_HT_INFORMATION); + if (ht_info_ie) { + const struct ieee80211_ht_info *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); @@ -310,7 +370,7 @@ static void ieee80211_rx_bss_info(struct } } else sta = ieee80211_ibss_add_sta(sdata, mgmt->bssid, - mgmt->sa, supp_rates, + mgmt->sa, supp_rates, elems->ht_cap_elem, GFP_ATOMIC); } @@ -405,7 +465,7 @@ static void ieee80211_rx_bss_info(struct ieee80211_sta_join_ibss(sdata, bss); supp_rates = ieee80211_sta_get_rates(local, elems, band); ieee80211_ibss_add_sta(sdata, mgmt->bssid, mgmt->sa, - supp_rates, GFP_KERNEL); + supp_rates, elems->ht_cap_elem, GFP_KERNEL); } put_bss: @@ -418,8 +478,8 @@ static void ieee80211_rx_bss_info(struct * must be callable in atomic context. */ struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata, - u8 *bssid,u8 *addr, u32 supp_rates, - gfp_t gfp) + u8 *bssid, u8 *addr, u32 supp_rates, + struct ieee80211_ht_cap *ht_cap, gfp_t gfp) { struct ieee80211_if_ibss *ifibss = &sdata->u.ibss; struct ieee80211_local *local = sdata->local; @@ -459,6 +519,10 @@ struct sta_info *ieee80211_ibss_add_sta( sta->sta.supp_rates[band] = supp_rates | ieee80211_mandatory_rates(local, band); + if (ht_cap) + ieee80211_ht_cap_ie_to_sta_ht_cap(local->hw.wiphy->bands[band], + ht_cap, &sta->sta.ht_cap); + rate_control_rate_init(sta); /* If it fails, maybe we raced another insertion? */ @@ -561,7 +625,7 @@ static void ieee80211_sta_create_ibss(st sdata->drop_unencrypted = 0; __ieee80211_sta_join_ibss(sdata, bssid, sdata->vif.bss_conf.beacon_int, - ifibss->channel, ifibss->basic_rates, + ifibss->channel, ifibss->channel_type, ifibss->basic_rates, capability, 0); } @@ -898,11 +962,16 @@ int ieee80211_ibss_join(struct ieee80211 struct sk_buff *skb; skb = dev_alloc_skb(sdata->local->hw.extra_tx_headroom + - 36 /* bitrates */ + - 34 /* SSID */ + - 3 /* DS params */ + - 4 /* IBSS params */ + - params->ie_len); + 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; @@ -922,13 +991,14 @@ int ieee80211_ibss_join(struct ieee80211 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; /* fix ourselves to that channel now already */ if (params->channel_fixed) { sdata->local->oper_channel = params->channel; WARN_ON(!ieee80211_set_channel_type(sdata->local, sdata, - NL80211_CHAN_NO_HT)); + params->channel_type)); } if (params->ie) { diff -Nrup a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h --- a/net/mac80211/ieee80211_i.h 2011-03-31 21:04:02.000000000 +0200 +++ b/net/mac80211/ieee80211_i.h 2011-04-12 09:55:16.000000000 +0200 @@ -439,6 +439,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 */ @@ -1107,7 +1108,7 @@ void ieee80211_ibss_notify_scan_complete void ieee80211_ibss_setup_sdata(struct ieee80211_sub_if_data *sdata); struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata, u8 *bssid, u8 *addr, u32 supp_rates, - gfp_t gfp); + struct ieee80211_ht_cap *ht_cap, gfp_t gfp); int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata, struct cfg80211_ibss_params *params); int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata); diff -Nrup a/net/mac80211/rx.c b/net/mac80211/rx.c --- a/net/mac80211/rx.c 2011-03-31 21:04:01.000000000 +0200 +++ b/net/mac80211/rx.c 2011-04-12 08:49:19.000000000 +0200 @@ -2118,7 +2118,8 @@ ieee80211_rx_h_action(struct ieee80211_r */ if (sdata->vif.type != NL80211_IFTYPE_STATION && sdata->vif.type != NL80211_IFTYPE_AP_VLAN && - sdata->vif.type != NL80211_IFTYPE_AP) + sdata->vif.type != NL80211_IFTYPE_AP && + sdata->vif.type != NL80211_IFTYPE_ADHOC) break; /* verify action_code is present */ @@ -2674,7 +2675,7 @@ static int prepare_for_handlers(struct i else rate_idx = status->rate_idx; rx->sta = ieee80211_ibss_add_sta(sdata, bssid, - hdr->addr2, BIT(rate_idx), GFP_ATOMIC); + hdr->addr2, BIT(rate_idx), NULL, GFP_ATOMIC); } break; case NL80211_IFTYPE_MESH_POINT: ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 4/4] mac80211: Add IEEE802.11n for IBSS 2011-04-12 11:07 ` [PATCH 4/4] mac80211: Add IEEE802.11n for IBSS Alexander Simon @ 2011-04-12 11:19 ` Johannes Berg 2011-04-28 12:13 ` Alexander Simon 0 siblings, 1 reply; 18+ messages in thread From: Johannes Berg @ 2011-04-12 11:19 UTC (permalink / raw) To: Alexander Simon; +Cc: linux-wireless On Tue, 2011-04-12 at 11:07 +0000, Alexander Simon wrote: > skb = dev_alloc_skb(sdata->local->hw.extra_tx_headroom + > - 36 /* bitrates */ + > - 34 /* SSID */ + > - 3 /* DS params */ + > - 4 /* IBSS params */ + > - params->ie_len); > + sizeof(struct ieee80211_hdr_3addr) + > + 12 /* struct ieee80211_mgmt.u.beacon */ + > + 2 + IEEE80211_MAX_SSID_LEN /* max SSID */ + You have a tendency to mess up the coding style. Also what if the IBSS is created with HT40+ and then joins, can it join HT40-? Is the channel type "advisory" like the frequency? Can it join HT20 IBSS as well? johannes ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 4/4] mac80211: Add IEEE802.11n for IBSS 2011-04-12 11:19 ` Johannes Berg @ 2011-04-28 12:13 ` Alexander Simon 2011-04-28 12:56 ` Johannes Berg 0 siblings, 1 reply; 18+ messages in thread From: Alexander Simon @ 2011-04-28 12:13 UTC (permalink / raw) To: linux-wireless > Also what if the IBSS is created with HT40+ and then joins, can it join > HT40-? Is the channel type "advisory" like the frequency? Can it join > HT20 IBSS as well? HT type can`t be advisory, as there may be stations without n. Our card is set to HT40+/- if set by iw. Some other station is added into our internal station list by its HT beacons. E.g. if we have configured HT40- and there is someone with HT40+, minstrel_ht should use HT20 only. But i admit it seems cleaner to AND both caps. ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 4/4] mac80211: Add IEEE802.11n for IBSS 2011-04-28 12:13 ` Alexander Simon @ 2011-04-28 12:56 ` Johannes Berg 2011-04-29 6:54 ` Alexander Simon 0 siblings, 1 reply; 18+ messages in thread From: Johannes Berg @ 2011-04-28 12:56 UTC (permalink / raw) To: Alexander Simon; +Cc: linux-wireless On Thu, 2011-04-28 at 12:13 +0000, Alexander Simon wrote: > > Also what if the IBSS is created with HT40+ and then joins, can it join > > HT40-? Is the channel type "advisory" like the frequency? Can it join > > HT20 IBSS as well? > HT type can`t be advisory, as there may be stations without n. Yeah, but it's possible to still communicate with them. > Our card is set to HT40+/- if set by iw. > Some other station is added into our internal station list by its HT beacons. > E.g. if we have configured HT40- and there is someone with HT40+, minstrel_ht > should use HT20 only. But i admit it seems cleaner to AND both caps. Well. You need to consider more than just this. I have a feeling you're only considering fixed channel use cases. But if we configure HT40+, and then find a peer on a channel that may only use HT40-, then what? johannes ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 4/4] mac80211: Add IEEE802.11n for IBSS 2011-04-28 12:56 ` Johannes Berg @ 2011-04-29 6:54 ` Alexander Simon 2011-04-29 7:21 ` Johannes Berg 0 siblings, 1 reply; 18+ messages in thread From: Alexander Simon @ 2011-04-29 6:54 UTC (permalink / raw) To: linux-wireless > Well. You need to consider more than just this. I have a feeling you're > only considering fixed channel use cases. But if we configure HT40+, and > then find a peer on a channel that may only use HT40-, then what? Good point. But still i think this is the same case. Right now, the card would still be set into HT40+, regardless of the frequency. Then, minstrel_ht would just use HT20, i suppose. My proposal would be making the HT iw argument non-advisory: Use it when creating a network, discard it when joining one. I also will do some refactoring in nl80211.c in order to check main and extension channel. ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 4/4] mac80211: Add IEEE802.11n for IBSS 2011-04-29 6:54 ` Alexander Simon @ 2011-04-29 7:21 ` Johannes Berg 2011-04-29 8:37 ` Alexander Simon 0 siblings, 1 reply; 18+ messages in thread From: Johannes Berg @ 2011-04-29 7:21 UTC (permalink / raw) To: Alexander Simon; +Cc: linux-wireless On Fri, 2011-04-29 at 06:54 +0000, Alexander Simon wrote: > > Well. You need to consider more than just this. I have a feeling you're > > only considering fixed channel use cases. But if we configure HT40+, and > > then find a peer on a channel that may only use HT40-, then what? > > Good point. But still i think this is the same case. Right now, the card would > still be set into HT40+, regardless of the frequency. Then, minstrel_ht would > just use HT20, i suppose. > > My proposal would be making the HT iw argument non-advisory: Use it when > creating a network, discard it when joining one. Yeah it would be an option to just always join as HT if HT is available, but not create as HT unless asked. johannes ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 4/4] mac80211: Add IEEE802.11n for IBSS 2011-04-29 7:21 ` Johannes Berg @ 2011-04-29 8:37 ` Alexander Simon 2011-04-29 12:36 ` Alexander Simon 0 siblings, 1 reply; 18+ messages in thread From: Alexander Simon @ 2011-04-29 8:37 UTC (permalink / raw) To: linux-wireless > Yeah it would be an option to just always join as HT if HT is available, > but not create as HT unless asked. Ok. I just had a few thoughts about this: This way an ht ibss has to be created from a (patched) mac80211 HT hardware. There would be no way to "convert" an existing g network into n. Additionally, if a non-ht implementation joins the network, it will advertise it as non-ht. If a second ht-station joins from one of these beacons, it won't use ht. This way a single non-ht station could destroy a ht ibss. I Think the best way to go would be to obey HT information when joining HT but using the HT iw parameter when joining non-ht. Then we could have the following scenario: Non-HT station A creates non-HT. HT station B joins and sets HT- (from iw). HT station C joins from A but doesn't see B. It's iw parameter says ht+. But when B comes closer to C do a "HT merge", comparing TSFs. Conclusion: - Create an ibss with the iw parameter - When joining a ht ibss, use its parameters - When joining non-ht, add ht from iw parameter - When encounter a different ht config, do a ht merge. ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 4/4] mac80211: Add IEEE802.11n for IBSS 2011-04-29 8:37 ` Alexander Simon @ 2011-04-29 12:36 ` Alexander Simon 2011-04-29 12:39 ` Johannes Berg 0 siblings, 1 reply; 18+ messages in thread From: Alexander Simon @ 2011-04-29 12:36 UTC (permalink / raw) To: linux-wireless Sorry for replying to myself but i'll try to explain this a little bit easier: - If the channel is not *fixed*, the channel type is only advisory. This means that a merge of two HT40 networks with fixed channels will only take place if the HT40 configuration equals. - When merging, the looser will obey the winner's HT configuration if there is one. If not, keep the old one. - If HT has been configured through iw and a non-HT network is to be joined, iw's HT setting is used and announced. HT configuration within an IBSS may get inhomogeneous as a HT station may join from a non-HT beacon but there are other HT members. - When receiving a different HT configuration from another member of our BSSID, use this configuration (first beacon wins) Alex ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 4/4] mac80211: Add IEEE802.11n for IBSS 2011-04-29 12:36 ` Alexander Simon @ 2011-04-29 12:39 ` Johannes Berg 2011-04-29 12:50 ` Alexander Simon 0 siblings, 1 reply; 18+ messages in thread From: Johannes Berg @ 2011-04-29 12:39 UTC (permalink / raw) To: Alexander Simon; +Cc: linux-wireless On Fri, 2011-04-29 at 14:36 +0200, Alexander Simon wrote: > - If HT has been configured through iw and a non-HT network is to be > joined, iw's HT setting is used and announced. This isn't possible, you might join a network on a channel that doesn't allow HT40+ for example. johannes ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 4/4] mac80211: Add IEEE802.11n for IBSS 2011-04-29 12:39 ` Johannes Berg @ 2011-04-29 12:50 ` Alexander Simon 0 siblings, 0 replies; 18+ messages in thread From: Alexander Simon @ 2011-04-29 12:50 UTC (permalink / raw) To: linux-wireless > > - If HT has been configured through iw and a non-HT network is to be > > joined, iw's HT setting is used and announced. > > This isn't possible, you might join a network on a channel that doesn't > allow HT40+ for example. Of course it must be checked. It has to be checked even when joining HT networks. E.g. a european user travels to America and opens an HT+ Network on channel 9. The american card should disable HT40+. ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 1/4] cfg80211: Add channel type for IBSS 2011-04-12 10:42 [PATCH 1/4] cfg80211: Add channel type for IBSS Alexander Simon ` (2 preceding siblings ...) 2011-04-12 11:07 ` [PATCH 4/4] mac80211: Add IEEE802.11n for IBSS Alexander Simon @ 2011-04-26 19:11 ` John W. Linville 2011-04-28 12:15 ` Alexander Simon 3 siblings, 1 reply; 18+ messages in thread From: John W. Linville @ 2011-04-26 19:11 UTC (permalink / raw) To: Alexander Simon; +Cc: linux-wireless On Tue, Apr 12, 2011 at 12:42:44PM +0200, Alexander Simon wrote: > Needed for IBSS IEEE802.11N operation > > * Add ht channel type for cfg80211 IBSS configuration > > Signed-off-by: Alexander Simon <alexander.simon@saxnet.de> Are you going to resubmit this series after addressing Johannes's comments? -- John W. Linville Someday the world will need a hero, and you linville@tuxdriver.com might be all we have. Be ready. ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 1/4] cfg80211: Add channel type for IBSS 2011-04-26 19:11 ` [PATCH 1/4] cfg80211: Add channel type " John W. Linville @ 2011-04-28 12:15 ` Alexander Simon 0 siblings, 0 replies; 18+ messages in thread From: Alexander Simon @ 2011-04-28 12:15 UTC (permalink / raw) To: linux-wireless Yes, i am. ^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2011-04-29 12:50 UTC | newest] Thread overview: 18+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-04-12 10:42 [PATCH 1/4] cfg80211: Add channel type for IBSS Alexander Simon 2011-04-12 11:04 ` [PATCH 2/4] nl80211: Add NL80211_ATTR_WIPHY_CHANNEL_TYPE " Alexander Simon 2011-04-12 11:08 ` Johannes Berg 2011-04-12 11:06 ` [PATCH 3/4] mac80211: Add function to build HT caps Alexander Simon 2011-04-12 11:16 ` Johannes Berg 2011-04-12 11:22 ` Alexander Simon 2011-04-12 11:07 ` [PATCH 4/4] mac80211: Add IEEE802.11n for IBSS Alexander Simon 2011-04-12 11:19 ` Johannes Berg 2011-04-28 12:13 ` Alexander Simon 2011-04-28 12:56 ` Johannes Berg 2011-04-29 6:54 ` Alexander Simon 2011-04-29 7:21 ` Johannes Berg 2011-04-29 8:37 ` Alexander Simon 2011-04-29 12:36 ` Alexander Simon 2011-04-29 12:39 ` Johannes Berg 2011-04-29 12:50 ` Alexander Simon 2011-04-26 19:11 ` [PATCH 1/4] cfg80211: Add channel type " John W. Linville 2011-04-28 12:15 ` Alexander Simon
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).