| /* |
| * --------------------------------------------------------------------------- |
| * FILE: data_tx.c |
| * |
| * PURPOSE: |
| * This file provides functions to send data requests to the UniFi. |
| * |
| * Copyright (C) 2007-2009 by Cambridge Silicon Radio Ltd. |
| * |
| * Refer to LICENSE.txt included with this source code for details on |
| * the license terms. |
| * |
| * --------------------------------------------------------------------------- |
| */ |
| #include "csr_wifi_hip_unifi.h" |
| #include "unifi_priv.h" |
| |
| int |
| uf_verify_m4(unifi_priv_t *priv, const unsigned char *packet, unsigned int length) |
| { |
| const unsigned char *p = packet; |
| u16 keyinfo; |
| |
| |
| if (length < (4 + 5 + 8 + 32 + 16 + 8 + 8 + 16 + 1 + 8)) |
| return 1; |
| |
| p += 8; |
| keyinfo = p[5] << 8 | p[6]; /* big-endian */ |
| if ( |
| (p[0] == 1 || p[0] == 2) /* protocol version 802.1X-2001 (WPA) or -2004 (WPA2) */ && |
| p[1] == 3 /* EAPOL-Key */ && |
| /* don't bother checking p[2] p[3] (hh ll, packet body length) */ |
| (p[4] == 254 || p[4] == 2) /* descriptor type P802.1i-D3.0 (WPA) or 802.11i-2004 (WPA2) */ && |
| ((keyinfo & 0x0007) == 1 || (keyinfo & 0x0007) == 2) /* key descriptor version */ && |
| (keyinfo & ~0x0207U) == 0x0108 && /* key info for 4/4 or 4/2 -- ignore key desc version and sec bit (since varies in WPA 4/4) */ |
| (p[4 + 5 + 8 + 32 + 16 + 8 + 8 + 16 + 0] == 0 && /* key data length (2 octets) 0 for 4/4 only */ |
| p[4 + 5 + 8 + 32 + 16 + 8 + 8 + 16 + 1] == 0) |
| ) { |
| unifi_trace(priv, UDBG1, "uf_verify_m4: M4 detected\n"); |
| return 0; |
| } else { |
| return 1; |
| } |
| } |
| |
| /* |
| * --------------------------------------------------------------------------- |
| * |
| * Data transport signals. |
| * |
| * --------------------------------------------------------------------------- |
| */ |
| |