Message ID | 20180830085549.21955-1-johannes@sipsolutions.net (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Johannes Berg |
Headers | show |
Series | mac80211: always account for A-MSDU header changes | expand |
> From: Johannes Berg <johannes.berg@intel.com> > > In the error path of changing the SKB headroom of the second > A-MSDU subframe, we would not account for the already-changed > length of the first frame that just got converted to be in > A-MSDU format and thus is a bit longer now. > > Fix this by doing the necessary accounting. > > It would be possible to reorder the operations, but that would > make the code more complex (to calculate the necessary pad), > and the headroom expansion should not fail frequently enough > to make that worthwhile. > > Fixes: 6e0456b54545 ("mac80211: add A-MSDU tx support") > Signed-off-by: Johannes Berg <johannes.berg@intel.com> > --- Acked-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 1aac5e3c7eee..6ca0865de945 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -3239,7 +3239,7 @@ static bool ieee80211_amsdu_aggregate(struct ieee80211_sub_if_data *sdata, if (!ieee80211_amsdu_realloc_pad(local, skb, sizeof(rfc1042_header) + 2 + pad)) - goto out; + goto out_recalc; ret = true; data = skb_push(skb, ETH_ALEN + 2); @@ -3256,11 +3256,13 @@ static bool ieee80211_amsdu_aggregate(struct ieee80211_sub_if_data *sdata, head->data_len += skb->len; *frag_tail = skb; - flow->backlog += head->len - orig_len; - tin->backlog_bytes += head->len - orig_len; - - fq_recalc_backlog(fq, tin, flow); +out_recalc: + if (head->len != orig_len) { + flow->backlog += head->len - orig_len; + tin->backlog_bytes += head->len - orig_len; + fq_recalc_backlog(fq, tin, flow); + } out: spin_unlock_bh(&fq->lock);