mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-26 08:51:13 +00:00
8a006c2480
Backport most significant upstream fixes (excl. hwsim fixes) Refreshed all patches. Contains important fixes for CSA (Channel Switch Announcement) and A-MSDU frames. [slightly altered to apply cleanly] Signed-off-by: Koen Vandeputte <koen.vandeputte@ncentric.com>
52 lines
1.6 KiB
Diff
52 lines
1.6 KiB
Diff
From: Johannes Berg <johannes.berg@intel.com>
|
|
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 <johannes.berg@intel.com>
|
|
Acked-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
|
|
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|
---
|
|
|
|
--- 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;
|
|
|