ahci_imx: depend on CONFIG_MFD_SYSCON
[linux-block.git] / drivers / staging / csr / data_tx.c
CommitLineData
635d2b00
GKH
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
18int
19uf_verify_m4(unifi_priv_t *priv, const unsigned char *packet, unsigned int length)
20{
7c5745cc
GKH
21 const unsigned char *p = packet;
22 u16 keyinfo;
635d2b00
GKH
23
24
dbff11c9 25 if (length < (4 + 5 + 8 + 32 + 16 + 8 + 8 + 16 + 1 + 8))
7c5745cc 26 return 1;
635d2b00 27
7c5745cc
GKH
28 p += 8;
29 keyinfo = p[5] << 8 | p[6]; /* big-endian */
30 if (
31 (p[0] == 1 || p[0] == 2) /* protocol version 802.1X-2001 (WPA) or -2004 (WPA2) */ &&
32 p[1] == 3 /* EAPOL-Key */ &&
33 /* don't bother checking p[2] p[3] (hh ll, packet body length) */
34 (p[4] == 254 || p[4] == 2) /* descriptor type P802.1i-D3.0 (WPA) or 802.11i-2004 (WPA2) */ &&
35 ((keyinfo & 0x0007) == 1 || (keyinfo & 0x0007) == 2) /* key descriptor version */ &&
36 (keyinfo & ~0x0207U) == 0x0108 && /* key info for 4/4 or 4/2 -- ignore key desc version and sec bit (since varies in WPA 4/4) */
37 (p[4 + 5 + 8 + 32 + 16 + 8 + 8 + 16 + 0] == 0 && /* key data length (2 octets) 0 for 4/4 only */
38 p[4 + 5 + 8 + 32 + 16 + 8 + 8 + 16 + 1] == 0)
39 ) {
0567e1ec 40 unifi_trace(priv, UDBG1, "uf_verify_m4: M4 detected\n");
7c5745cc 41 return 0;
dbff11c9 42 } else {
7c5745cc
GKH
43 return 1;
44 }
635d2b00
GKH
45}
46
47/*
48 * ---------------------------------------------------------------------------
49 *
50 * Data transport signals.
51 *
52 * ---------------------------------------------------------------------------
53 */
54