problems setting wpa keys
Marc Pignat
marc.pignat at hevs.ch
Tue Sep 18 08:45:34 EDT 2007
Hello all!
I've got a problem when the driver sets the wpa keys. When both
unicast and multicast keys are set at once, only the unicast key is set.
As soon as there is a multicast packet, the firmware sends a
"MACREG_INT_CODE_MIC_ERR_MULTICAST" event and disconnects.
I'm working with the marvell 8385 chip on the SDIO interface, and the firmware release 5.0.11p0.
The code base is the latest libertas-2.6.git#libertas.
For my investigation, I changed the code to read back the keys (see patch1 below).
setting keys (in this example, tkip for mcast and ccmp for ucast, but also tested in tkip/tkip and ccmp/ccmp):
libertas host: EXEC_NEXT_CMD: sending command 0x005e
libertas host: DNLD_CMD: command 0x005e, size 98, jiffies 822365
libertas DNLD_CMD: 5e 00 62 00 83 00 00 00 01 00 00 01 26 00 02 00
libertas DNLD_CMD: 06 00 10 00 de 38 cc 50 65 62 d0 44 60 b7 ef ac
libertas DNLD_CMD: b1 07 60 75 00 00 00 00 00 00 00 00 00 00 00 00
libertas DNLD_CMD: 00 00 00 00 00 00 00 01 26 00 01 00 05 00 20 00
libertas DNLD_CMD: 58 b0 79 67 a1 61 a4 32 b8 d6 64 77 46 e4 d8 1a
libertas DNLD_CMD: af e8 e8 ba 35 bb c7 05 2d d3 77 19 f7 b6 29 ee
libertas DNLD_CMD: 00 00
read back:
libertas host: CMD_RESP: response 0x805e, size 98, jiffies 822422
libertas CMD_RESP: 5e 80 62 00 83 00 00 00 01 00 00 01 26 00 02 00
libertas CMD_RESP: 06 00 10 00 de 38 cc 50 65 62 d0 44 60 b7 ef ac
libertas CMD_RESP: b1 07 60 75 00 00 00 00 00 00 00 00 00 00 00 00
libertas CMD_RESP: 00 00 00 00 00 00 00 01 26 00 01 00 05 00 20 00
libertas CMD_RESP: 58 b0 79 67 a1 61 a4 32 b8 d6 64 77 46 e4 d8 1a
libertas CMD_RESP: af e8 e8 ba 35 bb c7 05 2d d3 77 19 f7 b6 29 ee
libertas CMD_RESP: 00 00
In the response, the keys seems good, but in fact it doesn't work, the next
multicast packet will trigger a mic failure.
Setting the wpa keys in two CMD_802_11_KEY_MATERIAL commands solved the problem.
(see the ugly-patch-2, below).
I think this problem is specific to this firmware (and interface?),
is it working for the compact flash 8385?
Thanks in advance
Regards
Marc
patch1: (only for testing) read back wpa keys
--- drivers/net/wireless/libertas/assoc.c.orig 2007-09-18 12:00:32.000000000 +0200
+++ drivers/net/wireless/libertas/assoc.c 2007-09-18 12:54:22.000000000 +0200
@@ -381,6 +381,12 @@
CMD_OPTION_WAITFORRSP,
0, assoc_req);
+ ret = libertas_prepare_and_send_command(priv,
+ CMD_802_11_KEY_MATERIAL,
+ CMD_ACT_GET,
+ CMD_OPTION_WAITFORRSP,
+ 0, NULL);
+
lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret);
return ret;
}
ugly-patch-2: send one wpa key at once
--- drivers/net/wireless/libertas/assoc.c.orig 2007-09-18 12:00:32.000000000 +0200
+++ drivers/net/wireless/libertas/assoc.c 2007-09-18 14:08:40.000000000 +0200
@@ -372,15 +372,35 @@
struct assoc_request * assoc_req)
{
int ret = 0;
+ unsigned int flags = assoc_req->flags;
lbs_deb_enter(LBS_DEB_ASSOC);
- ret = libertas_prepare_and_send_command(priv,
- CMD_802_11_KEY_MATERIAL,
- CMD_ACT_SET,
- CMD_OPTION_WAITFORRSP,
- 0, assoc_req);
+ if (test_bit(ASSOC_FLAG_WPA_UCAST_KEY, &assoc_req->flags)) {
+ clear_bit(ASSOC_FLAG_WPA_MCAST_KEY, &assoc_req->flags);
+ ret = libertas_prepare_and_send_command(priv,
+ CMD_802_11_KEY_MATERIAL,
+ CMD_ACT_SET,
+ CMD_OPTION_WAITFORRSP,
+ 0, assoc_req);
+ assoc_req->flags = flags;
+ }
+
+ if (ret)
+ goto out;
+
+ if (test_bit(ASSOC_FLAG_WPA_MCAST_KEY, &assoc_req->flags)) {
+ clear_bit(ASSOC_FLAG_WPA_UCAST_KEY, &assoc_req->flags);
+
+ ret = libertas_prepare_and_send_command(priv,
+ CMD_802_11_KEY_MATERIAL,
+ CMD_ACT_SET,
+ CMD_OPTION_WAITFORRSP,
+ 0, assoc_req);
+ assoc_req->flags = flags;
+ }
+out:
lbs_deb_leave_args(LBS_DEB_ASSOC, "ret %d", ret);
return ret;
}
More information about the libertas-dev
mailing list