diff options
author | bschmidt <bschmidt@FreeBSD.org> | 2011-06-04 14:28:09 +0000 |
---|---|---|
committer | bschmidt <bschmidt@FreeBSD.org> | 2011-06-04 14:28:09 +0000 |
commit | aaeb38ff0e4c77afa7369e4049ca66f0af06380e (patch) | |
tree | 06ddbf4709fab58ae64680b24a8fda6dfa67d0e4 | |
parent | 9723861d87ecf52c81dcb461b5406eec139e4dc5 (diff) | |
download | FreeBSD-src-aaeb38ff0e4c77afa7369e4049ca66f0af06380e.zip FreeBSD-src-aaeb38ff0e4c77afa7369e4049ca66f0af06380e.tar.gz |
Data frames sent over the mgmt path might be part of a TX aggr session
too. In that case don't fiddle with the seqno as drivers are supposed
to handle that.
Currently only the powersave feature does sent QoS-null-data frames
before and after a background scan which must be handled correctly. Due
to this being quite rare we don't fiddle around with starting of aggr
sessions.
-rw-r--r-- | sys/net80211/ieee80211_output.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/sys/net80211/ieee80211_output.c b/sys/net80211/ieee80211_output.c index b689310..6020144 100644 --- a/sys/net80211/ieee80211_output.c +++ b/sys/net80211/ieee80211_output.c @@ -516,6 +516,7 @@ ieee80211_send_setup( { #define WH4(wh) ((struct ieee80211_frame_addr4 *)wh) struct ieee80211vap *vap = ni->ni_vap; + struct ieee80211_tx_ampdu *tap; struct ieee80211_frame *wh = mtod(m, struct ieee80211_frame *); ieee80211_seq seqno; @@ -583,9 +584,15 @@ ieee80211_send_setup( } *(uint16_t *)&wh->i_dur[0] = 0; - seqno = ni->ni_txseqs[tid]++; - *(uint16_t *)&wh->i_seq[0] = htole16(seqno << IEEE80211_SEQ_SEQ_SHIFT); - M_SEQNO_SET(m, seqno); + tap = &ni->ni_tx_ampdu[TID_TO_WME_AC(tid)]; + if (tid != IEEE80211_NONQOS_TID && IEEE80211_AMPDU_RUNNING(tap)) + m->m_flags |= M_AMPDU_MPDU; + else { + seqno = ni->ni_txseqs[tid]++; + *(uint16_t *)&wh->i_seq[0] = + htole16(seqno << IEEE80211_SEQ_SEQ_SHIFT); + M_SEQNO_SET(m, seqno); + } if (IEEE80211_IS_MULTICAST(wh->i_addr1)) m->m_flags |= M_MCAST; |