When forwarding is set to 0, frames are typically sent with ttl=1. Move the ttl decrement check below the check for local receive in order to fix packet drops. Signed-off-by: Felix Fietkau <nbd@nbd.name>
		
			
				
	
	
		
			51 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From: Felix Fietkau <nbd@nbd.name>
 | 
						|
Date: Sun, 26 Mar 2023 17:11:34 +0200
 | 
						|
Subject: [PATCH] wifi: mac80211: fix receiving mesh packets in forwarding=0
 | 
						|
 networks
 | 
						|
MIME-Version: 1.0
 | 
						|
Content-Type: text/plain; charset=UTF-8
 | 
						|
Content-Transfer-Encoding: 8bit
 | 
						|
 | 
						|
When forwarding is set to 0, frames are typically sent with ttl=1.
 | 
						|
Move the ttl decrement check below the check for local receive in order to
 | 
						|
fix packet drops.
 | 
						|
 | 
						|
Reported-by: Thomas Hühn <thomas.huehn@hs-nordhausen.de>
 | 
						|
Reported-by: Nick Hainke <vincent@systemli.org>
 | 
						|
Fixes: 986e43b19ae9 ("wifi: mac80211: fix receiving A-MSDU frames on mesh interfaces")
 | 
						|
Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
						|
---
 | 
						|
 | 
						|
--- a/net/mac80211/rx.c
 | 
						|
+++ b/net/mac80211/rx.c
 | 
						|
@@ -2828,14 +2828,6 @@ ieee80211_rx_mesh_data(struct ieee80211_
 | 
						|
 	if (sdata->crypto_tx_tailroom_needed_cnt)
 | 
						|
 		tailroom = IEEE80211_ENCRYPT_TAILROOM;
 | 
						|
 
 | 
						|
-	if (!--mesh_hdr->ttl) {
 | 
						|
-		if (multicast)
 | 
						|
-			goto rx_accept;
 | 
						|
-
 | 
						|
-		IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, dropped_frames_ttl);
 | 
						|
-		return RX_DROP_MONITOR;
 | 
						|
-	}
 | 
						|
-
 | 
						|
 	if (mesh_hdr->flags & MESH_FLAGS_AE) {
 | 
						|
 		struct mesh_path *mppath;
 | 
						|
 		char *proxied_addr;
 | 
						|
@@ -2874,6 +2866,14 @@ ieee80211_rx_mesh_data(struct ieee80211_
 | 
						|
 	if (ether_addr_equal(sdata->vif.addr, eth->h_dest))
 | 
						|
 		goto rx_accept;
 | 
						|
 
 | 
						|
+	if (!--mesh_hdr->ttl) {
 | 
						|
+		if (multicast)
 | 
						|
+			goto rx_accept;
 | 
						|
+
 | 
						|
+		IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, dropped_frames_ttl);
 | 
						|
+		return RX_DROP_MONITOR;
 | 
						|
+	}
 | 
						|
+
 | 
						|
 	if (!ifmsh->mshcfg.dot11MeshForwarding) {
 | 
						|
 		if (is_multicast_ether_addr(eth->h_dest))
 | 
						|
 			goto rx_accept;
 |