Thread (3 messages) flat view 3 messages, 2 authors, 2022-09-23

Re: [PATCH] wifi: rsi: Fix handling of 802.3 EAPOL frames sent via control port

From: Fuzzey, Martin <hidden>
Date: 2022-09-23 07:12:06
Also in: linux-wireless

Hi Marek,

On Thu, 22 Sept 2022 at 22:33, Marek Vasut [off-list ref] wrote:
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.
...
Therefore, to fix this problem, inspect the ETH_P_802_3 frames in
the rsi_91x driver, check the ethertype of the encapsulated frame,
and in case it is ETH_P_PAE, transmit the frame via high-priority
queue just like other ETH_P_PAE frames.
quoted hunk ↗ jump to hunk
diff --git a/drivers/net/wireless/rsi/rsi_91x_core.c b/drivers/net/wireless/rsi/rsi_91x_core.c
index 0f3a80f66b61c..d76c9dc99cafa 100644
--- a/drivers/net/wireless/rsi/rsi_91x_core.c
+++ b/drivers/net/wireless/rsi/rsi_91x_core.c
+
                if (skb->protocol == cpu_to_be16(ETH_P_PAE)) {
+                       tx_eapol = true;
+               } else if (skb->protocol == cpu_to_be16(ETH_P_802_3)) {
+                       hdr_len = ieee80211_get_hdrlen_from_skb(skb) +
+                                 sizeof(rfc1042_header) - ETH_HLEN + 2;
+                       eth_hdr = (struct ethhdr *)(skb->data + hdr_len);
+                       if (eth_hdr->h_proto == cpu_to_be16(ETH_P_PAE))
+                               tx_eapol = true;
+               }
+
diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c b/drivers/net/wireless/rsi/rsi_91x_hal.c
index c61f83a7333b6..d43754fff287d 100644
@@ -168,6 +171,16 @@ int rsi_prepare_data_desc(struct rsi_common *common, struct sk_buff *skb)
+       if (skb->protocol == cpu_to_be16(ETH_P_PAE)) {
+               tx_eapol = true;
+       } else if (skb->protocol == cpu_to_be16(ETH_P_802_3)) {
+               hdr_len = ieee80211_get_hdrlen_from_skb(skb) +
+                         sizeof(rfc1042_header) - ETH_HLEN + 2;
+               eth_hdr = (struct ethhdr *)(skb->data + hdr_len);
+               if (eth_hdr->h_proto == cpu_to_be16(ETH_P_PAE))
+                       tx_eapol = true;
+       }
+
It looks like the same logic is being duplicated twice. Maybe create a
helper function for it, something like bool rsi_is_eapol(struct
sk_buff *skb) ?

Also I think it would be good to tag this for stable.

Martin
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help