From 2fd208e2724e330ee9f42acb1c76be8942f968b2 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sat, 12 Feb 2022 23:03:33 +0100 Subject: mac80211: fix rekey failure in drivers with 802.3 decap offload Signed-off-by: Felix Fietkau --- ...211-fix-EAPoL-rekey-fail-in-802.3-rx-path.patch | 43 ++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 package/kernel/mac80211/patches/subsys/321-mac80211-fix-EAPoL-rekey-fail-in-802.3-rx-path.patch (limited to 'package/kernel/mac80211') diff --git a/package/kernel/mac80211/patches/subsys/321-mac80211-fix-EAPoL-rekey-fail-in-802.3-rx-path.patch b/package/kernel/mac80211/patches/subsys/321-mac80211-fix-EAPoL-rekey-fail-in-802.3-rx-path.patch new file mode 100644 index 0000000000..932403d653 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/321-mac80211-fix-EAPoL-rekey-fail-in-802.3-rx-path.patch @@ -0,0 +1,43 @@ +From: Deren Wu +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 +--- + +--- 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, -- cgit v1.2.3