aboutsummaryrefslogtreecommitdiff
path: root/sys/net80211/ieee80211_sta.c
diff options
context:
space:
mode:
authorAdrian Chadd <adrian@FreeBSD.org>2015-05-12 16:55:50 +0000
committerAdrian Chadd <adrian@FreeBSD.org>2015-05-12 16:55:50 +0000
commitc3ebe01919baaa1e049b36208e957ae5363db722 (patch)
tree716461345caf036699974e8086adfb6b3ba88e3a /sys/net80211/ieee80211_sta.c
parentd27c74649bc757f771b1a0d9142145d72e5ccd33 (diff)
downloadsrc-c3ebe01919baaa1e049b36208e957ae5363db722.tar.gz
src-c3ebe01919baaa1e049b36208e957ae5363db722.zip
Do not check sequence number for QoS Null frames; set it for generated QoS Null
frames to 0 From IEEE Std. 802.11-2012, 8.3.2.1 "Data frame format", p. 415 (513): "The Sequence Control field for QoS (+)Null frames is ignored by the receiver upon reception." At this moment, any <mode>_input() function interprets them as regular QoS data frames with TID = 0. As a result, stations, that use another TX sequence for QoS Null frames (e.g. wpi(4), where (QoS) Null frames are generated by the firmware), may experience significant packet loss with any other NIC in hostap mode. Tested: * wpi(4) (author) * iwn(4) - Intel 5100, STA mode (me) PR: kern/200128 Submitted by: Andriy Voskoboinyk <s3erios@gmail.com>
Notes
Notes: svn path=/head/; revision=282820
Diffstat (limited to 'sys/net80211/ieee80211_sta.c')
-rw-r--r--sys/net80211/ieee80211_sta.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/sys/net80211/ieee80211_sta.c b/sys/net80211/ieee80211_sta.c
index 5a217473897a..267ad1149d73 100644
--- a/sys/net80211/ieee80211_sta.c
+++ b/sys/net80211/ieee80211_sta.c
@@ -527,7 +527,6 @@ doprint(struct ieee80211vap *vap, int subtype)
static int
sta_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf)
{
-#define HAS_SEQ(type) ((type & 0x4) == 0)
struct ieee80211vap *vap = ni->ni_vap;
struct ieee80211com *ic = ni->ni_ic;
struct ifnet *ifp = vap->iv_ifp;
@@ -623,7 +622,8 @@ sta_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf)
IEEE80211_RSSI_LPF(ni->ni_avgrssi, rssi);
ni->ni_noise = nf;
- if (HAS_SEQ(type) && !IEEE80211_IS_MULTICAST(wh->i_addr1)) {
+ if ( IEEE80211_HAS_SEQ(type, subtype) &&
+ !IEEE80211_IS_MULTICAST(wh->i_addr1)) {
uint8_t tid = ieee80211_gettid(wh);
if (IEEE80211_QOS_HAS_SEQ(wh) &&
TID_TO_WME_AC(tid) >= WME_AC_VI)