Patch "wifi: rsi: Fix handling of 802.3 EAPOL frames sent via control port" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    wifi: rsi: Fix handling of 802.3 EAPOL frames sent via control port

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     wifi-rsi-fix-handling-of-802.3-eapol-frames-sent-via.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 6a28949fbad179689095a0e6a7a30538479ac1c2
Author: Marek Vasut <marex@xxxxxxx>
Date:   Fri Nov 4 17:33:39 2022 +0100

    wifi: rsi: Fix handling of 802.3 EAPOL frames sent via control port
    
    [ Upstream commit b8f6efccbb9dc0ff5dee7e20d69a4747298ee603 ]
    
    When using wpa_supplicant v2.10, this driver is no longer able to
    associate with any AP and fails in the EAPOL 4-way handshake while
    sending the 2/4 message to the AP. The problem is not present in
    wpa_supplicant v2.9 or older. The problem stems from HostAP commit
    144314eaa ("wpa_supplicant: Send EAPOL frames over nl80211 where available")
    which changes the way EAPOL frames are sent, from them being send
    at L2 frames to them being sent via nl80211 control port.
    
    An EAPOL frame sent as L2 frame is passed to the WiFi driver with
    skb->protocol ETH_P_PAE, while EAPOL frame sent via nl80211 control
    port has skb->protocol set to ETH_P_802_3 . The later happens in
    ieee80211_tx_control_port(), where the EAPOL frame is encapsulated
    into 802.3 frame.
    
    The rsi_91x driver handles ETH_P_PAE EAPOL frames as high-priority
    frames and sends them via highest-priority transmit queue, while
    the ETH_P_802_3 frames are sent as regular frames. The EAPOL 4-way
    handshake frames must be sent as highest-priority, otherwise the
    4-way handshake times out.
    
    Therefore, to fix this problem, inspect the skb control flags and
    if flag IEEE80211_TX_CTRL_PORT_CTRL_PROTO is set, assume this is
    an EAPOL frame and transmit the frame via high-priority queue just
    like other ETH_P_PAE frames.
    
    Fixes: 0eb42586cf87 ("rsi: data packet descriptor enhancements")
    Signed-off-by: Marek Vasut <marex@xxxxxxx>
    Signed-off-by: Kalle Valo <kvalo@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20221104163339.227432-1-marex@xxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/wireless/rsi/rsi_91x_core.c b/drivers/net/wireless/rsi/rsi_91x_core.c
index 9c4c58557248..b7fa03813da1 100644
--- a/drivers/net/wireless/rsi/rsi_91x_core.c
+++ b/drivers/net/wireless/rsi/rsi_91x_core.c
@@ -466,7 +466,9 @@ void rsi_core_xmit(struct rsi_common *common, struct sk_buff *skb)
 							      tid, 0);
 			}
 		}
-		if (skb->protocol == cpu_to_be16(ETH_P_PAE)) {
+
+		if (IEEE80211_SKB_CB(skb)->control.flags &
+		    IEEE80211_TX_CTRL_PORT_CTRL_PROTO) {
 			q_num = MGMT_SOFT_Q;
 			skb->priority = q_num;
 		}
diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c b/drivers/net/wireless/rsi/rsi_91x_hal.c
index dca81a4bbdd7..30d2eccbcadd 100644
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
@@ -162,12 +162,16 @@ int rsi_prepare_data_desc(struct rsi_common *common, struct sk_buff *skb)
 	u8 header_size;
 	u8 vap_id = 0;
 	u8 dword_align_bytes;
+	bool tx_eapol;
 	u16 seq_num;
 
 	info = IEEE80211_SKB_CB(skb);
 	vif = info->control.vif;
 	tx_params = (struct skb_info *)info->driver_data;
 
+	tx_eapol = IEEE80211_SKB_CB(skb)->control.flags &
+		   IEEE80211_TX_CTRL_PORT_CTRL_PROTO;
+
 	header_size = FRAME_DESC_SZ + sizeof(struct rsi_xtended_desc);
 	if (header_size > skb_headroom(skb)) {
 		rsi_dbg(ERR_ZONE, "%s: Unable to send pkt\n", __func__);
@@ -231,7 +235,7 @@ int rsi_prepare_data_desc(struct rsi_common *common, struct sk_buff *skb)
 		}
 	}
 
-	if (skb->protocol == cpu_to_be16(ETH_P_PAE)) {
+	if (tx_eapol) {
 		rsi_dbg(INFO_ZONE, "*** Tx EAPOL ***\n");
 
 		data_desc->frame_info = cpu_to_le16(RATE_INFO_ENABLE);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux