Greg Kroah-Hartman | 635d2b0 | 2012-06-19 16:15:42 -0700 | [diff] [blame] | 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; |
Greg Kroah-Hartman | 8c87f69 | 2012-07-20 12:00:10 -0700 | [diff] [blame] | 22 | u16 keyinfo; |
Greg Kroah-Hartman | 635d2b0 | 2012-06-19 16:15:42 -0700 | [diff] [blame] | 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 | |