Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target...
[cascardo/linux.git] / drivers / staging / csr / data_tx.c
1 /*
2  * ---------------------------------------------------------------------------
3  * FILE:     data_tx.c
4  *
5  * PURPOSE:
6  *      This file provides functions to send data requests to the UniFi.
7  *
8  * Copyright (C) 2007-2009 by Cambridge Silicon Radio Ltd.
9  *
10  * Refer to LICENSE.txt included with this source code for details on
11  * the license terms.
12  *
13  * ---------------------------------------------------------------------------
14  */
15 #include "csr_wifi_hip_unifi.h"
16 #include "unifi_priv.h"
17
18 int
19 uf_verify_m4(unifi_priv_t *priv, const unsigned char *packet, unsigned int length)
20 {
21     const unsigned char *p = packet;
22     u16 keyinfo;
23
24
25     if (length < (4 + 5 + 8 + 32 + 16 + 8 + 8 + 16 + 1 + 8)) {
26         return 1;
27     }
28
29     p += 8;
30     keyinfo = p[5] << 8 | p[6]; /* big-endian */
31     if (
32           (p[0] == 1 || p[0] == 2) /* protocol version 802.1X-2001 (WPA) or -2004 (WPA2) */ &&
33           p[1] == 3 /* EAPOL-Key */ &&
34           /* don't bother checking p[2] p[3] (hh ll, packet body length) */
35           (p[4] == 254 || p[4] == 2) /* descriptor type P802.1i-D3.0 (WPA) or 802.11i-2004 (WPA2) */ &&
36           ((keyinfo & 0x0007) == 1 || (keyinfo & 0x0007) == 2) /* key descriptor version */ &&
37          (keyinfo & ~0x0207U) == 0x0108 && /* key info for 4/4 or 4/2 -- ignore key desc version and sec bit (since varies in WPA 4/4) */
38           (p[4 + 5 + 8 + 32 + 16 + 8 + 8 + 16 + 0] == 0 && /* key data length (2 octets) 0 for 4/4 only */
39            p[4 + 5 + 8 + 32 + 16 + 8 + 8 + 16 + 1] == 0)
40         ) {
41         unifi_trace(priv, UDBG1, "uf_verify_m4: M4 detected \n");
42         return 0;
43     }
44     else
45     {
46         return 1;
47     }
48 }
49
50 /*
51  * ---------------------------------------------------------------------------
52  *
53  *      Data transport signals.
54  *
55  * ---------------------------------------------------------------------------
56  */
57