Hi Marek, On Thu, 22 Sept 2022 at 22:33, Marek Vasut <marex@xxxxxxx> 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. > > 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