problems setting wpa keys
Dan Williams
dcbw at redhat.com
Tue Oct 2 11:22:13 EDT 2007
On Tue, 2007-09-18 at 14:45 +0200, Marc Pignat wrote:
> 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?
I tested this out; works for me too on usb8388. I'll commit it. Can
you just send along a "Signed-off-by: <your email>" just to be clear?
Thanks,
Dan
> 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;
> }
>
>
> _______________________________________________
> libertas-dev mailing list
> libertas-dev at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/libertas-dev
More information about the libertas-dev
mailing list