Commit d0dd2de0 authored by Andriy Tkachuk's avatar Andriy Tkachuk Committed by John W. Linville

mac80211: Account HT Control field in Data frame hdrlen according to 802.11n-2009

ieee80211_hdrlen() should account account new HT Control field in 802.11
data frame header introduced by IEEE 802.11n standard.

According to 802.11n-2009 HT Control field is present in data frames
when both of following are met:

   1. It is QoS data frame.
   2. Order bit is set in Frame Control field.

The change might be totally compatible with legacy non-11n aware frames,
because 802.11-2007 standard states that "all QoS STAs set this subfield
to 0".
Signed-off-by: default avatarAndriy V. Tkachuk <andrit@ukr.net>
Acked-by : Benoit Papillault <benoit.papillault@free.fr>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent ef15aac6
...@@ -138,6 +138,8 @@ ...@@ -138,6 +138,8 @@
#define IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK 0x03 #define IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK 0x03
#define IEEE80211_WMM_IE_STA_QOSINFO_SP_SHIFT 5 #define IEEE80211_WMM_IE_STA_QOSINFO_SP_SHIFT 5
#define IEEE80211_HT_CTL_LEN 4
struct ieee80211_hdr { struct ieee80211_hdr {
__le16 frame_control; __le16 frame_control;
__le16 duration_id; __le16 duration_id;
......
...@@ -227,8 +227,11 @@ unsigned int ieee80211_hdrlen(__le16 fc) ...@@ -227,8 +227,11 @@ unsigned int ieee80211_hdrlen(__le16 fc)
if (ieee80211_is_data(fc)) { if (ieee80211_is_data(fc)) {
if (ieee80211_has_a4(fc)) if (ieee80211_has_a4(fc))
hdrlen = 30; hdrlen = 30;
if (ieee80211_is_data_qos(fc)) if (ieee80211_is_data_qos(fc)) {
hdrlen += IEEE80211_QOS_CTL_LEN; hdrlen += IEEE80211_QOS_CTL_LEN;
if (ieee80211_has_order(fc))
hdrlen += IEEE80211_HT_CTL_LEN;
}
goto out; goto out;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment