diff options
author | Simon Wunderlich <simon.wunderlich@s2003.tu-chemnitz.de> | 2011-11-30 10:56:33 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-12-06 16:05:25 -0500 |
commit | ff3cc5f40f36db1a60a8f1051be7fbc92233419b (patch) | |
tree | 9348704f13be3aa3985aa1dc54cb8bf7e4d9af32 /net/mac80211 | |
parent | 54858ee5bf659f80a784303e41ee8898fd163f98 (diff) |
mac80211: handle protection mode, RIFS and ADDBA for HT IBSS
* Follow 802.11n-2009 9.13.3.1 for protection mode and ADDBA
* Send ADDBA only to HT STAs - implement 11.5.1.1 partially
Signed-off-by: Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
Signed-off-by: Mathias Kretschmer <mathias.kretschmer@fokus.fraunhofer.de>
Reviewed-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211')
-rw-r--r-- | net/mac80211/agg-tx.c | 21 | ||||
-rw-r--r-- | net/mac80211/ibss.c | 18 | ||||
-rw-r--r-- | net/mac80211/util.c | 5 |
3 files changed, 44 insertions, 0 deletions
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c index 2c2e9519a2e7..9bfe28c9ab59 100644 --- a/net/mac80211/agg-tx.c +++ b/net/mac80211/agg-tx.c | |||
@@ -430,6 +430,27 @@ int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid, | |||
430 | return -EINVAL; | 430 | return -EINVAL; |
431 | } | 431 | } |
432 | 432 | ||
433 | /* | ||
434 | * 802.11n-2009 11.5.1.1: If the initiating STA is an HT STA, is a | ||
435 | * member of an IBSS, and has no other existing Block Ack agreement | ||
436 | * with the recipient STA, then the initiating STA shall transmit a | ||
437 | * Probe Request frame to the recipient STA and shall not transmit an | ||
438 | * ADDBA Request frame unless it receives a Probe Response frame | ||
439 | * from the recipient within dot11ADDBAFailureTimeout. | ||
440 | * | ||
441 | * The probe request mechanism for ADDBA is currently not implemented, | ||
442 | * but we only build up Block Ack session with HT STAs. This information | ||
443 | * is set when we receive a bss info from a probe response or a beacon. | ||
444 | */ | ||
445 | if (sta->sdata->vif.type == NL80211_IFTYPE_ADHOC && | ||
446 | !sta->sta.ht_cap.ht_supported) { | ||
447 | #ifdef CONFIG_MAC80211_HT_DEBUG | ||
448 | printk(KERN_DEBUG "BA request denied - IBSS STA %pM" | ||
449 | "does not advertise HT support\n", pubsta->addr); | ||
450 | #endif /* CONFIG_MAC80211_HT_DEBUG */ | ||
451 | return -EINVAL; | ||
452 | } | ||
453 | |||
433 | spin_lock_bh(&sta->lock); | 454 | spin_lock_bh(&sta->lock); |
434 | 455 | ||
435 | /* we have tried too many times, receiver does not want A-MPDU */ | 456 | /* we have tried too many times, receiver does not want A-MPDU */ |
diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c index 7d84af70132f..a82f6b4adb58 100644 --- a/net/mac80211/ibss.c +++ b/net/mac80211/ibss.c | |||
@@ -896,6 +896,7 @@ int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata, | |||
896 | struct cfg80211_ibss_params *params) | 896 | struct cfg80211_ibss_params *params) |
897 | { | 897 | { |
898 | struct sk_buff *skb; | 898 | struct sk_buff *skb; |
899 | u32 changed = 0; | ||
899 | 900 | ||
900 | skb = dev_alloc_skb(sdata->local->hw.extra_tx_headroom + | 901 | skb = dev_alloc_skb(sdata->local->hw.extra_tx_headroom + |
901 | 36 /* bitrates */ + | 902 | 36 /* bitrates */ + |
@@ -951,6 +952,23 @@ int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata, | |||
951 | ieee80211_recalc_idle(sdata->local); | 952 | ieee80211_recalc_idle(sdata->local); |
952 | mutex_unlock(&sdata->local->mtx); | 953 | mutex_unlock(&sdata->local->mtx); |
953 | 954 | ||
955 | /* | ||
956 | * 802.11n-2009 9.13.3.1: In an IBSS, the HT Protection field is | ||
957 | * reserved, but an HT STA shall protect HT transmissions as though | ||
958 | * the HT Protection field were set to non-HT mixed mode. | ||
959 | * | ||
960 | * In an IBSS, the RIFS Mode field of the HT Operation element is | ||
961 | * also reserved, but an HT STA shall operate as though this field | ||
962 | * were set to 1. | ||
963 | */ | ||
964 | |||
965 | sdata->vif.bss_conf.ht_operation_mode |= | ||
966 | IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED | ||
967 | | IEEE80211_HT_PARAM_RIFS_MODE; | ||
968 | |||
969 | changed |= BSS_CHANGED_HT; | ||
970 | ieee80211_bss_info_change_notify(sdata, changed); | ||
971 | |||
954 | ieee80211_queue_work(&sdata->local->hw, &sdata->work); | 972 | ieee80211_queue_work(&sdata->local->hw, &sdata->work); |
955 | 973 | ||
956 | return 0; | 974 | return 0; |
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 5243c2cadeef..ac7ea2949de0 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
@@ -1587,6 +1587,11 @@ u8 *ieee80211_ie_build_ht_info(u8 *pos, | |||
1587 | } | 1587 | } |
1588 | if (ht_cap->cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) | 1588 | if (ht_cap->cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) |
1589 | ht_info->ht_param |= IEEE80211_HT_PARAM_CHAN_WIDTH_ANY; | 1589 | ht_info->ht_param |= IEEE80211_HT_PARAM_CHAN_WIDTH_ANY; |
1590 | |||
1591 | /* | ||
1592 | * Note: According to 802.11n-2009 9.13.3.1, HT Protection field and | ||
1593 | * RIFS Mode are reserved in IBSS mode, therefore keep them at 0 | ||
1594 | */ | ||
1590 | ht_info->operation_mode = 0x0000; | 1595 | ht_info->operation_mode = 0x0000; |
1591 | ht_info->stbc_param = 0x0000; | 1596 | ht_info->stbc_param = 0x0000; |
1592 | 1597 | ||