Use the assigned sequence number when checking if a retried packet is
within the BAW. This regression was introduced in ane earlier commit by me to fix the BAW seqno allocation-but-not-insertion-into-BAW race. Since it was only ever using the to-be allocated sequence number, any frame retries with the first frame in the BAW still in the software queue would have constantly failed, as ni_txseqs[tid] would always be outside the BAW. TODO: * Extract out the mostly common code here in the agg and non-agg ADDBA case and stuff it into a single function. PR: kern/166357
This commit is contained in:
parent
5b40a50e9a
commit
091e146cf6
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=233514
@ -2348,7 +2348,6 @@ ath_tx_xmit_aggr(struct ath_softc *sc, struct ath_node *an, struct ath_buf *bf)
|
||||
struct ath_tid *tid = &an->an_tid[bf->bf_state.bfs_tid];
|
||||
struct ath_txq *txq = bf->bf_state.bfs_txq;
|
||||
struct ieee80211_tx_ampdu *tap;
|
||||
int seqno;
|
||||
|
||||
ATH_TXQ_LOCK_ASSERT(txq);
|
||||
|
||||
@ -2384,13 +2383,31 @@ ath_tx_xmit_aggr(struct ath_softc *sc, struct ath_node *an, struct ath_buf *bf)
|
||||
* the TIDs that map to it. Ugh.
|
||||
*/
|
||||
if (bf->bf_state.bfs_dobaw) {
|
||||
if (! BAW_WITHIN(tap->txa_start, tap->txa_wnd,
|
||||
ni->ni_txseqs[bf->bf_state.bfs_tid])) {
|
||||
ieee80211_seq seqno;
|
||||
|
||||
/*
|
||||
* If the sequence number is allocated, use it.
|
||||
* Otherwise, use the sequence number we WOULD
|
||||
* allocate.
|
||||
*/
|
||||
if (bf->bf_state.bfs_seqno_assigned)
|
||||
seqno = SEQNO(bf->bf_state.bfs_seqno);
|
||||
else
|
||||
seqno = ni->ni_txseqs[bf->bf_state.bfs_tid];
|
||||
|
||||
/*
|
||||
* Check whether either the currently allocated
|
||||
* sequence number _OR_ the to-be allocated
|
||||
* sequence number is inside the BAW.
|
||||
*/
|
||||
if (! BAW_WITHIN(tap->txa_start, tap->txa_wnd, seqno)) {
|
||||
ATH_TXQ_INSERT_TAIL(tid, bf, bf_list);
|
||||
ath_tx_tid_sched(sc, tid);
|
||||
return;
|
||||
}
|
||||
if (! bf->bf_state.bfs_seqno_assigned) {
|
||||
int seqno;
|
||||
|
||||
seqno = ath_tx_tid_seqno_assign(sc, ni, bf, bf->bf_m);
|
||||
if (seqno < 0) {
|
||||
device_printf(sc->sc_dev,
|
||||
|
@ -652,7 +652,6 @@ ath_tx_form_aggr(struct ath_softc *sc, struct ath_node *an, struct ath_tid *tid,
|
||||
int status = ATH_AGGR_DONE;
|
||||
int prev_frames = 0; /* XXX for AR5416 burst, not done here */
|
||||
int prev_al = 0; /* XXX also for AR5416 burst */
|
||||
int seqno;
|
||||
|
||||
ATH_TXQ_LOCK_ASSERT(sc->sc_ac2q[tid->ac]);
|
||||
|
||||
@ -747,13 +746,32 @@ ath_tx_form_aggr(struct ath_softc *sc, struct ath_node *an, struct ath_tid *tid,
|
||||
* see ath_tx_xmit_aggr() for more info.
|
||||
*/
|
||||
if (bf->bf_state.bfs_dobaw) {
|
||||
ieee80211_seq seqno;
|
||||
|
||||
/*
|
||||
* If the sequence number is allocated, use it.
|
||||
* Otherwise, use the sequence number we WOULD
|
||||
* allocate.
|
||||
*/
|
||||
if (bf->bf_state.bfs_seqno_assigned)
|
||||
seqno = SEQNO(bf->bf_state.bfs_seqno);
|
||||
else
|
||||
seqno = ni->ni_txseqs[bf->bf_state.bfs_tid];
|
||||
|
||||
/*
|
||||
* Check whether either the currently allocated
|
||||
* sequence number _OR_ the to-be allocated
|
||||
* sequence number is inside the BAW.
|
||||
*/
|
||||
if (! BAW_WITHIN(tap->txa_start, tap->txa_wnd,
|
||||
ni->ni_txseqs[bf->bf_state.bfs_tid])) {
|
||||
seqno)) {
|
||||
status = ATH_AGGR_BAW_CLOSED;
|
||||
break;
|
||||
}
|
||||
|
||||
/* XXX check for bfs_need_seqno? */
|
||||
if (! bf->bf_state.bfs_seqno_assigned) {
|
||||
int seqno;
|
||||
seqno = ath_tx_tid_seqno_assign(sc, ni, bf, bf->bf_m);
|
||||
if (seqno < 0) {
|
||||
device_printf(sc->sc_dev,
|
||||
|
Loading…
Reference in New Issue
Block a user