ath9k: Fix incorrect sequence numbering for unaggregated QoS Frame.
This patch fixes an issue with the sequence numbers of unaggregated QoS frames, because of which the frames are handled in a different order at the AP and resulted in MLME REPLAYFAILURE. Signed-off-by: Senthil Balasubramanian <senthilkumar@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
f3d340c1d5
commit
d3a1db1c67
1 changed files with 17 additions and 21 deletions
|
@ -264,25 +264,22 @@ static void assign_aggr_tid_seqno(struct sk_buff *skb,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get seqno */
|
/* Get seqno */
|
||||||
|
/* For HT capable stations, we save tidno for later use.
|
||||||
if (ieee80211_is_data(fc) && !is_pae(skb)) {
|
* We also override seqno set by upper layer with the one
|
||||||
/* For HT capable stations, we save tidno for later use.
|
* in tx aggregation state.
|
||||||
* We also override seqno set by upper layer with the one
|
*
|
||||||
* in tx aggregation state.
|
* If fragmentation is on, the sequence number is
|
||||||
*
|
* not overridden, since it has been
|
||||||
* If fragmentation is on, the sequence number is
|
* incremented by the fragmentation routine.
|
||||||
* not overridden, since it has been
|
*
|
||||||
* incremented by the fragmentation routine.
|
* FIXME: check if the fragmentation threshold exceeds
|
||||||
*
|
* IEEE80211 max.
|
||||||
* FIXME: check if the fragmentation threshold exceeds
|
*/
|
||||||
* IEEE80211 max.
|
tid = ATH_AN_2_TID(an, bf->bf_tidno);
|
||||||
*/
|
hdr->seq_ctrl = cpu_to_le16(tid->seq_next <<
|
||||||
tid = ATH_AN_2_TID(an, bf->bf_tidno);
|
IEEE80211_SEQ_SEQ_SHIFT);
|
||||||
hdr->seq_ctrl = cpu_to_le16(tid->seq_next <<
|
bf->bf_seqno = tid->seq_next;
|
||||||
IEEE80211_SEQ_SEQ_SHIFT);
|
INCR(tid->seq_next, IEEE80211_SEQ_MAX);
|
||||||
bf->bf_seqno = tid->seq_next;
|
|
||||||
INCR(tid->seq_next, IEEE80211_SEQ_MAX);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int setup_tx_flags(struct ath_softc *sc, struct sk_buff *skb,
|
static int setup_tx_flags(struct ath_softc *sc, struct sk_buff *skb,
|
||||||
|
@ -1718,11 +1715,10 @@ static int ath_tx_setup_buffer(struct ath_softc *sc, struct ath_buf *bf,
|
||||||
|
|
||||||
/* Assign seqno, tidno */
|
/* Assign seqno, tidno */
|
||||||
|
|
||||||
if (bf_isht(bf) && (sc->sc_flags & SC_OP_TXAGGR))
|
if (ieee80211_is_data_qos(fc) && (sc->sc_flags & SC_OP_TXAGGR))
|
||||||
assign_aggr_tid_seqno(skb, bf);
|
assign_aggr_tid_seqno(skb, bf);
|
||||||
|
|
||||||
/* DMA setup */
|
/* DMA setup */
|
||||||
|
|
||||||
bf->bf_mpdu = skb;
|
bf->bf_mpdu = skb;
|
||||||
|
|
||||||
bf->bf_dmacontext = pci_map_single(sc->pdev, skb->data,
|
bf->bf_dmacontext = pci_map_single(sc->pdev, skb->data,
|
||||||
|
|
Loading…
Add table
Reference in a new issue