mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-03 22:44:27 -05:00 
			
		
		
		
	mac80211: fix rekey failure in drivers with 802.3 decap offload
Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
		
							parent
							
								
									0d1220acdf
								
							
						
					
					
						commit
						2fd208e272
					
				@ -0,0 +1,43 @@
 | 
			
		||||
From: Deren Wu <deren.wu@mediatek.com>
 | 
			
		||||
Date: Sun, 13 Feb 2022 00:20:15 +0800
 | 
			
		||||
Subject: [PATCH] mac80211: fix EAPoL rekey fail in 802.3 rx path
 | 
			
		||||
 | 
			
		||||
mac80211 set capability NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211
 | 
			
		||||
to upper layer by default. That means we should pass EAPoL packets through
 | 
			
		||||
nl80211 path only, and should not send the EAPoL skb to netdevice diretly.
 | 
			
		||||
At the meanwhile, wpa_supplicant would not regist sock to listen EAPoL skb
 | 
			
		||||
on the netdevice.
 | 
			
		||||
 | 
			
		||||
However, there is no contorl_port_protocol handler in mac80211 for 802.3 RX
 | 
			
		||||
packets, mac80211 driver would pass up the EAPoL rekey frame to netdevice
 | 
			
		||||
and wpa_supplicant would be never interactive with this kind of packets,
 | 
			
		||||
if SUPPORTS_RX_DECAP_OFFLOAD is enabled. This causes STA always rekey fail
 | 
			
		||||
if EAPoL frame go through 802.3 path.
 | 
			
		||||
 | 
			
		||||
To avoid this problem, align the same process as 802.11 type to handle
 | 
			
		||||
this frame before put it into network stack.
 | 
			
		||||
 | 
			
		||||
Fixes: 80a915ec4427 ("mac80211: add rx decapsulation offload support")
 | 
			
		||||
Signed-off-by: Deren Wu <deren.wu@mediatek.com>
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
--- a/net/mac80211/rx.c
 | 
			
		||||
+++ b/net/mac80211/rx.c
 | 
			
		||||
@@ -4523,16 +4523,7 @@ static void ieee80211_rx_8023(struct iee
 | 
			
		||||
 
 | 
			
		||||
 	/* deliver to local stack */
 | 
			
		||||
 	skb->protocol = eth_type_trans(skb, fast_rx->dev);
 | 
			
		||||
-	memset(skb->cb, 0, sizeof(skb->cb));
 | 
			
		||||
-	if (rx->list)
 | 
			
		||||
-#if LINUX_VERSION_IS_GEQ(4,19,0)
 | 
			
		||||
-		list_add_tail(&skb->list, rx->list);
 | 
			
		||||
-#else
 | 
			
		||||
-		__skb_queue_tail(rx->list, skb);
 | 
			
		||||
-#endif
 | 
			
		||||
-	else
 | 
			
		||||
-		netif_receive_skb(skb);
 | 
			
		||||
-
 | 
			
		||||
+	ieee80211_deliver_skb_to_local_stack(skb, rx);
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 static bool ieee80211_invoke_fast_rx(struct ieee80211_rx_data *rx,
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user