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;
 | 
						|
 
 |