123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- From: Johannes Berg <[email protected]>
- Date: Thu, 30 Aug 2018 10:55:49 +0200
- Subject: [PATCH] mac80211: always account for A-MSDU header changes
- 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 <[email protected]>
- Acked-by: Lorenzo Bianconi <[email protected]>
- Signed-off-by: Johannes Berg <[email protected]>
- ---
- --- a/net/mac80211/tx.c
- +++ b/net/mac80211/tx.c
- @@ -3232,7 +3232,7 @@ static bool ieee80211_amsdu_aggregate(st
-
- 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);
- @@ -3249,11 +3249,13 @@ static bool ieee80211_amsdu_aggregate(st
- 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:
- fq->memory_usage += head->truesize - orig_truesize;
-
|