I can confirm that the problem with the rt2870sta driver and WPA still exists in Ubuntu 10.04.2 LTS, and that it goes away when linux-backports-modules-wireless-lucid-generic is installed.
I am using the rt2870sta driver for my D-Link DWL-G122 rev. E1 (chipset RT3070, USB 07d1:3c0f), with NetworkManager and wpa_supplicant. The rt2800usb driver is blacklisted (it doesn't work for me), and the USB ID of my WLAN adapter is configured in the rt2870sta driver by writing it to /sys/bus/usb/drivers/rt2870/new_id; see "Variante B" in http://forum.ubuntuusers.de/topic/linksys-wusb100-wireless-stick/#post-2264339 (German). [Note: When the backported drivers are installed, these tricks are no longer necessary, i.e., rt2870sta is loaded and works out of the box. Very nice.]
The driver correctly detects my Access Point (and other APs), but fails to connect. Running 'iwevent', I noticed that the Association Request IEs are corrupt:
12:01:36.189784 wlan0 Association Request IEs:000E45617379426F782D373934453232010882848B961224486C0100000FAC020100000FAC040100000FAC020000
Breaking this up (two-byte header per information element - one byte for the identifier, one for the length), it reads:
At the position ____, there are two bytes (h'3014) missing. I assume that the Association Request is ignored by the AP for this reason. I have checked the source code of the original rt2870sta driver, and I think the bug is in linux-source-2.6.32/drivers/staging/rt2860/sta/assoc.c, MlmeAssocReqAction():
In my case, the wpa_supplicant is up and does not set the WPA2 IE; the driver uses its own StaCfg.RSN_IE, but without the two-byte header. In later versions of the rt2870 driver, this bug was fixed by checking if wpa_supplicant has actually provided the IE; e.g.:
I can confirm that the problem with the rt2870sta driver and WPA still exists in Ubuntu 10.04.2 LTS, and that it goes away when linux-backports -modules- wireless- lucid-generic is installed.
I am using the rt2870sta driver for my D-Link DWL-G122 rev. E1 (chipset RT3070, USB 07d1:3c0f), with NetworkManager and wpa_supplicant. The rt2800usb driver is blacklisted (it doesn't work for me), and the USB ID of my WLAN adapter is configured in the rt2870sta driver by writing it to /sys/bus/ usb/drivers/ rt2870/ new_id; see "Variante B" in http:// forum.ubuntuuse rs.de/topic/ linksys- wusb100- wireless- stick/# post-2264339 (German). [Note: When the backported drivers are installed, these tricks are no longer necessary, i.e., rt2870sta is loaded and works out of the box. Very nice.]
The driver correctly detects my Access Point (and other APs), but fails to connect. Running 'iwevent', I noticed that the Association Request IEs are corrupt:
12:01:36.189784 wlan0 Association Request IEs:000E4561737 9426F782D373934 453232010882848 B961224486C0100 000FAC020100000 FAC040100000FAC 020000
Breaking this up (two-byte header per information element - one byte for the identifier, one for the length), it reads:
000E 45617379426F782 D373934453232 0000FAC04010000 0FAC020000
0108 82848B961224486C
____ 0100000FAC02010
At the position ____, there are two bytes (h'3014) missing. I assume that the Association Request is ignored by the AP for this reason. I have checked the source code of the original rt2870sta driver, and I think the bug is in linux-source- 2.6.32/ drivers/ staging/ rt2860/ sta/assoc. c, MlmeAssocReqAct ion():
if (pAd->StaCfg. WpaSupplicantUP == 1)
MakeOutgoingFr ame(pOutBuffer + FrameLen, &tmp,
// <<< missing RSNIe and RSNIE_Len here! >>>
pAd->StaCfg. RSNIE_Len, pAd->StaCfg.RSN_IE,
END_OF_ ARGS);
MakeOutgoingFr ame(pOutBuffer + FrameLen, &tmp,
1, &RSNIe,
1, &pAd->StaCfg. RSNIE_Len,
pAd->StaCfg. RSNIE_Len, pAd->StaCfg.RSN_IE,
END_OF_ ARGS);
{
}
else
{
}
In my case, the wpa_supplicant is up and does not set the WPA2 IE; the driver uses its own StaCfg.RSN_IE, but without the two-byte header. In later versions of the rt2870 driver, this bug was fixed by checking if wpa_supplicant has actually provided the IE; e.g.:
if ((pAd-> StaCfg. WpaSupplicantUP ==
WPA_SUPPLICAN T_ENABLE) bRSN_IE_ FromWpaSupplica nt ==
MakeOutgoi ngFrame( pOutBuffer + FrameLen, &tmp,
pAd-> StaCfg. RSNIE_Len,
pAd-> StaCfg. RSN_IE,
END_OF_ ARGS);
MakeOutgoi ngFrame( pOutBuffer + FrameLen, &tmp,
1, &RSNIe,
1, &pAd->StaCfg. RSNIE_Len,
pAd-> StaCfg. RSNIE_Len,
pAd-> StaCfg. RSN_IE,
END_OF_ ARGS);
&& (pAd->StaCfg.
TRUE)) {
} else {
}
Anyway, when the backported driver is installed, the IEs shown by 'iwevent' are correct, and the driver connects to my AP immediately.