diff mbox series

rsi: Fix TX EAPOL packet handling against iwlwifi AP

Message ID 20201015111616.429220-1-marex@denx.de
State New
Headers show
Series rsi: Fix TX EAPOL packet handling against iwlwifi AP | expand

Commit Message

Marek Vasut Oct. 15, 2020, 11:16 a.m. UTC
In case RSI9116 SDIO WiFi operates in STA mode against Intel 9260 in AP mode,
the association fails. The former is using wpa_supplicant during association,
the later is set up using hostapd:

iwl$ cat hostapd.conf
interface=wlp1s0
ssid=test
country_code=DE
hw_mode=g
channel=1
wpa=2
wpa_passphrase=test
wpa_key_mgmt=WPA-PSK
iwl$ hostapd -d hostapd.conf

rsi$ wpa_supplicant -i wlan0 -c <(wpa_passphrase test test)

The problem is that the TX EAPOL data descriptor RSI_DESC_REQUIRE_CFM_TO_HOST
flag and extended descriptor EAPOL4_CONFIRM frame type are not set in case the
AP is iwlwifi, because in that case the TX EAPOL packet is 2 bytes shorter.

The downstream vendor driver has this change in place already [1], however
there is no explanation for it, neither is there any commit history from which
such explanation could be obtained.

[1] https://github.com/SiliconLabs/RS911X-nLink-OSD/blob/master/rsi/rsi_91x_hal.c#L238

Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Angus Ainslie <angus@akkea.ca>
Cc: David S. Miller <davem@davemloft.net>
Cc: Jakub Kicinski <kuba@kernel.org>
Cc: Kalle Valo <kvalo@codeaurora.org>
Cc: Lee Jones <lee.jones@linaro.org>
Cc: Martin Kepplinger <martink@posteo.de>
Cc: Sebastian Krzyszkowiak <sebastian.krzyszkowiak@puri.sm>
Cc: Siva Rebbagondla <siva8118@gmail.com>
Cc: linux-wireless@vger.kernel.org
Cc: netdev@vger.kernel.org
---
 drivers/net/wireless/rsi/rsi_91x_hal.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Kalle Valo Nov. 7, 2020, 11:32 a.m. UTC | #1
Marek Vasut <marex@denx.de> wrote:

> In case RSI9116 SDIO WiFi operates in STA mode against Intel 9260 in AP mode,
> the association fails. The former is using wpa_supplicant during association,
> the later is set up using hostapd:
> 
> iwl$ cat hostapd.conf
> interface=wlp1s0
> ssid=test
> country_code=DE
> hw_mode=g
> channel=1
> wpa=2
> wpa_passphrase=test
> wpa_key_mgmt=WPA-PSK
> iwl$ hostapd -d hostapd.conf
> 
> rsi$ wpa_supplicant -i wlan0 -c <(wpa_passphrase test test)
> 
> The problem is that the TX EAPOL data descriptor RSI_DESC_REQUIRE_CFM_TO_HOST
> flag and extended descriptor EAPOL4_CONFIRM frame type are not set in case the
> AP is iwlwifi, because in that case the TX EAPOL packet is 2 bytes shorter.
> 
> The downstream vendor driver has this change in place already [1], however
> there is no explanation for it, neither is there any commit history from which
> such explanation could be obtained.
> 
> [1] https://github.com/SiliconLabs/RS911X-nLink-OSD/blob/master/rsi/rsi_91x_hal.c#L238
> 
> Signed-off-by: Marek Vasut <marex@denx.de>
> Cc: Angus Ainslie <angus@akkea.ca>
> Cc: David S. Miller <davem@davemloft.net>
> Cc: Jakub Kicinski <kuba@kernel.org>
> Cc: Kalle Valo <kvalo@codeaurora.org>
> Cc: Lee Jones <lee.jones@linaro.org>
> Cc: Martin Kepplinger <martink@posteo.de>
> Cc: Sebastian Krzyszkowiak <sebastian.krzyszkowiak@puri.sm>
> Cc: Siva Rebbagondla <siva8118@gmail.com>
> Cc: linux-wireless@vger.kernel.org
> Cc: netdev@vger.kernel.org

Patch applied to wireless-drivers-next.git, thanks.

65277100caa2 rsi: Fix TX EAPOL packet handling against iwlwifi AP
Martin Fuzzey May 27, 2021, 4:52 p.m. UTC | #2
Hi Marek,

I've just run into the same problem (on -5.4) and found your (now 
merged) patch


On 15/10/2020 13:16, Marek Vasut wrote:
> In case RSI9116 SDIO WiFi operates in STA mode against Intel 9260 in AP mode,

> the association fails. The former is using wpa_supplicant during association,

> the later is set up using hostapd:

>

> iwl$ cat hostapd.conf

> interface=wlp1s0

> ssid=test

> country_code=DE

> hw_mode=g

> channel=1

> wpa=2

> wpa_passphrase=test

> wpa_key_mgmt=WPA-PSK

> iwl$ hostapd -d hostapd.conf

>

> rsi$ wpa_supplicant -i wlan0 -c <(wpa_passphrase test test)

>

> The problem is that the TX EAPOL data descriptor RSI_DESC_REQUIRE_CFM_TO_HOST

> flag and extended descriptor EAPOL4_CONFIRM frame type are not set in case the

> AP is iwlwifi, because in that case the TX EAPOL packet is 2 bytes shorter.

>

> The downstream vendor driver has this change in place already [1], however

> there is no explanation for it, neither is there any commit history from which

> such explanation could be obtained.

>


I get this using 2 RSI9116 s, for both AP and STA using hostapd.
Comparing packet captures in the working and non working (without your 
patch) case shows that
the working case has a 802.11 QOS header whereas the non working case 
does not, hence the 2 byte difference.
The size of the EAPOL data is the same, it's the previous header that 
causes the problem...

This whole use the message size to determine the messages to ACK seems 
very fragile...

Regards,


Martin
Marek Vasut May 27, 2021, 5:07 p.m. UTC | #3
On 5/27/21 6:52 PM, Martin Fuzzey wrote:
> Hi Marek,


Hi,

> I've just run into the same problem (on -5.4) and found your (now 

> merged) patch


The patch should already be part of 5.4.y, no ?

> On 15/10/2020 13:16, Marek Vasut wrote:

>> In case RSI9116 SDIO WiFi operates in STA mode against Intel 9260 in 

>> AP mode,

>> the association fails. The former is using wpa_supplicant during 

>> association,

>> the later is set up using hostapd:

>>

>> iwl$ cat hostapd.conf

>> interface=wlp1s0

>> ssid=test

>> country_code=DE

>> hw_mode=g

>> channel=1

>> wpa=2

>> wpa_passphrase=test

>> wpa_key_mgmt=WPA-PSK

>> iwl$ hostapd -d hostapd.conf

>>

>> rsi$ wpa_supplicant -i wlan0 -c <(wpa_passphrase test test)

>>

>> The problem is that the TX EAPOL data descriptor 

>> RSI_DESC_REQUIRE_CFM_TO_HOST

>> flag and extended descriptor EAPOL4_CONFIRM frame type are not set in 

>> case the

>> AP is iwlwifi, because in that case the TX EAPOL packet is 2 bytes 

>> shorter.

>>

>> The downstream vendor driver has this change in place already [1], 

>> however

>> there is no explanation for it, neither is there any commit history 

>> from which

>> such explanation could be obtained.

>>

> 

> I get this using 2 RSI9116 s, for both AP and STA using hostapd.


Do I understand it correctly that two RSI9116 did not even work against 
one another as STA and AP respectively ? Sigh ...

> Comparing packet captures in the working and non working (without your 

> patch) case shows that

> the working case has a 802.11 QOS header whereas the non working case 

> does not, hence the 2 byte difference.

> The size of the EAPOL data is the same, it's the previous header that 

> causes the problem...

> 

> This whole use the message size to determine the messages to ACK seems 

> very fragile...


I'm not surprised, the quality of this driver is low and the 
documentation is lacking. Thanks for clarifying.

Do you think you can write and submit a patch which would fix this in a 
better way?
diff mbox series

Patch

diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c b/drivers/net/wireless/rsi/rsi_91x_hal.c
index 3f7e3cfb6f00..ce9892152f4d 100644
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
@@ -248,7 +248,8 @@  int rsi_prepare_data_desc(struct rsi_common *common, struct sk_buff *skb)
 			rsi_set_len_qno(&data_desc->len_qno,
 					(skb->len - FRAME_DESC_SZ),
 					RSI_WIFI_MGMT_Q);
-		if ((skb->len - header_size) == EAPOL4_PACKET_LEN) {
+		if (((skb->len - header_size) == EAPOL4_PACKET_LEN) ||
+		    ((skb->len - header_size) == EAPOL4_PACKET_LEN - 2)) {
 			data_desc->misc_flags |=
 				RSI_DESC_REQUIRE_CFM_TO_HOST;
 			xtend_desc->confirm_frame_type = EAPOL4_CONFIRM;