From 54b04d6f39995c7ec5ca1ba598d48867d5365e64 Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Tue, 31 Jan 2017 14:00:12 +0200 Subject: [PATCH] FILS: Move HLP request handling into a separate file This is independent functionality from the core IEEE 802.11 management handling and will increase significantly in size, so it is cleaner to maintain this in a separate source code file. Signed-off-by: Jouni Malinen --- hostapd/Android.mk | 1 + hostapd/Makefile | 1 + src/ap/fils_hlp.c | 88 +++++++++++++++++++++++++++++++++++++++ src/ap/fils_hlp.h | 15 +++++++ src/ap/ieee802_11.c | 80 +---------------------------------- wpa_supplicant/Android.mk | 3 ++ wpa_supplicant/Makefile | 3 ++ 7 files changed, 112 insertions(+), 79 deletions(-) create mode 100644 src/ap/fils_hlp.c create mode 100644 src/ap/fils_hlp.h diff --git a/hostapd/Android.mk b/hostapd/Android.mk index ec2d55a9f..8664cfa76 100644 --- a/hostapd/Android.mk +++ b/hostapd/Android.mk @@ -263,6 +263,7 @@ endif ifdef CONFIG_FILS L_CFLAGS += -DCONFIG_FILS +OBJS += src/ap/fils_hlp.c NEED_CRC32=y NEED_SHA384=y NEED_AES_SIV=y diff --git a/hostapd/Makefile b/hostapd/Makefile index d9bb72a0a..dfa7b969b 100644 --- a/hostapd/Makefile +++ b/hostapd/Makefile @@ -307,6 +307,7 @@ endif ifdef CONFIG_FILS CFLAGS += -DCONFIG_FILS +OBJS += ../src/ap/fils_hlp.o NEED_CRC32=y NEED_SHA384=y NEED_AES_SIV=y diff --git a/src/ap/fils_hlp.c b/src/ap/fils_hlp.c new file mode 100644 index 000000000..3fde71efc --- /dev/null +++ b/src/ap/fils_hlp.c @@ -0,0 +1,88 @@ +/* + * FILS HLP request processing + * Copyright (c) 2017, Qualcomm Atheros, Inc. + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#include "utils/includes.h" + +#include "utils/common.h" +#include "sta_info.h" +#include "fils_hlp.h" + + +static void fils_process_hlp_req(struct hostapd_data *hapd, + struct sta_info *sta, + const u8 *pos, size_t len) +{ + const u8 *pkt, *end; + + wpa_printf(MSG_DEBUG, "FILS: HLP request from " MACSTR " (dst=" MACSTR + " src=" MACSTR " len=%u)", + MAC2STR(sta->addr), MAC2STR(pos), MAC2STR(pos + ETH_ALEN), + (unsigned int) len); + if (os_memcmp(sta->addr, pos + ETH_ALEN, ETH_ALEN) != 0) { + wpa_printf(MSG_DEBUG, + "FILS: Ignore HLP request with unexpected source address" + MACSTR, MAC2STR(pos + ETH_ALEN)); + return; + } + + end = pos + len; + pkt = pos + 2 * ETH_ALEN; + if (end - pkt >= 6 && + os_memcmp(pkt, "\xaa\xaa\x03\x00\x00\x00", 6) == 0) + pkt += 6; /* Remove SNAP/LLC header */ + wpa_hexdump(MSG_MSGDUMP, "FILS: HLP request packet", pkt, end - pkt); +} + + +void fils_process_hlp(struct hostapd_data *hapd, struct sta_info *sta, + const u8 *pos, int left) +{ + const u8 *end = pos + left; + u8 *tmp, *tmp_pos; + + /* Check if there are any FILS HLP Container elements */ + while (end - pos >= 2) { + if (2 + pos[1] > end - pos) + return; + if (pos[0] == WLAN_EID_EXTENSION && + pos[1] >= 1 + 2 * ETH_ALEN && + pos[2] == WLAN_EID_EXT_FILS_HLP_CONTAINER) + break; + pos += 2 + pos[1]; + } + if (end - pos < 2) + return; /* No FILS HLP Container elements */ + + tmp = os_malloc(end - pos); + if (!tmp) + return; + + while (end - pos >= 2) { + if (2 + pos[1] > end - pos || + pos[0] != WLAN_EID_EXTENSION || + pos[1] < 1 + 2 * ETH_ALEN || + pos[2] != WLAN_EID_EXT_FILS_HLP_CONTAINER) + break; + tmp_pos = tmp; + os_memcpy(tmp_pos, pos + 3, pos[1] - 1); + tmp_pos += pos[1] - 1; + pos += 2 + pos[1]; + + /* Add possible fragments */ + while (end - pos >= 2 && pos[0] == WLAN_EID_FRAGMENT && + 2 + pos[1] <= end - pos) { + os_memcpy(tmp_pos, pos + 2, pos[1]); + tmp_pos += pos[1]; + pos += 2 + pos[1]; + } + + fils_process_hlp_req(hapd, sta, tmp, tmp_pos - tmp); + } + + os_free(tmp); +} diff --git a/src/ap/fils_hlp.h b/src/ap/fils_hlp.h new file mode 100644 index 000000000..98cc3195b --- /dev/null +++ b/src/ap/fils_hlp.h @@ -0,0 +1,15 @@ +/* + * FILS HLP request processing + * Copyright (c) 2017, Qualcomm Atheros, Inc. + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef FILS_HLP_H +#define FILS_HLP_H + +void fils_process_hlp(struct hostapd_data *hapd, struct sta_info *sta, + const u8 *pos, int left); + +#endif /* FILS_HLP_H */ diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c index 64d180079..129cc158d 100644 --- a/src/ap/ieee802_11.c +++ b/src/ap/ieee802_11.c @@ -45,6 +45,7 @@ #include "mbo_ap.h" #include "rrm.h" #include "taxonomy.h" +#include "fils_hlp.h" u8 * hostapd_eid_supp_rates(struct hostapd_data *hapd, u8 *eid) @@ -2447,85 +2448,6 @@ static u16 send_assoc_resp(struct hostapd_data *hapd, struct sta_info *sta, } -#ifdef CONFIG_FILS - -static void fils_process_hlp_req(struct hostapd_data *hapd, - struct sta_info *sta, - const u8 *pos, size_t len) -{ - const u8 *pkt, *end; - - wpa_printf(MSG_DEBUG, "FILS: HLP request from " MACSTR " (dst=" MACSTR - " src=" MACSTR " len=%u)", - MAC2STR(sta->addr), MAC2STR(pos), MAC2STR(pos + ETH_ALEN), - (unsigned int) len); - if (os_memcmp(sta->addr, pos + ETH_ALEN, ETH_ALEN) != 0) { - wpa_printf(MSG_DEBUG, - "FILS: Ignore HLP request with unexpected source address" - MACSTR, MAC2STR(pos + ETH_ALEN)); - return; - } - - end = pos + len; - pkt = pos + 2 * ETH_ALEN; - if (end - pkt >= 6 && - os_memcmp(pkt, "\xaa\xaa\x03\x00\x00\x00", 6) == 0) - pkt += 6; /* Remove SNAP/LLC header */ - wpa_hexdump(MSG_MSGDUMP, "FILS: HLP request packet", pkt, end - pkt); -} - - -static void fils_process_hlp(struct hostapd_data *hapd, struct sta_info *sta, - const u8 *pos, int left) -{ - const u8 *end = pos + left; - u8 *tmp, *tmp_pos; - - /* Check if there are any FILS HLP Container elements */ - while (end - pos >= 2) { - if (2 + pos[1] > end - pos) - return; - if (pos[0] == WLAN_EID_EXTENSION && - pos[1] >= 1 + 2 * ETH_ALEN && - pos[2] == WLAN_EID_EXT_FILS_HLP_CONTAINER) - break; - pos += 2 + pos[1]; - } - if (end - pos < 2) - return; /* No FILS HLP Container elements */ - - tmp = os_malloc(end - pos); - if (!tmp) - return; - - while (end - pos >= 2) { - if (2 + pos[1] > end - pos || - pos[0] != WLAN_EID_EXTENSION || - pos[1] < 1 + 2 * ETH_ALEN || - pos[2] != WLAN_EID_EXT_FILS_HLP_CONTAINER) - break; - tmp_pos = tmp; - os_memcpy(tmp_pos, pos + 3, pos[1] - 1); - tmp_pos += pos[1] - 1; - pos += 2 + pos[1]; - - /* Add possible fragments */ - while (end - pos >= 2 && pos[0] == WLAN_EID_FRAGMENT && - 2 + pos[1] <= end - pos) { - os_memcpy(tmp_pos, pos + 2, pos[1]); - tmp_pos += pos[1]; - pos += 2 + pos[1]; - } - - fils_process_hlp_req(hapd, sta, tmp, tmp_pos - tmp); - } - - os_free(tmp); -} - -#endif /* CONFIG_FILS */ - - static void handle_assoc(struct hostapd_data *hapd, const struct ieee80211_mgmt *mgmt, size_t len, int reassoc) diff --git a/wpa_supplicant/Android.mk b/wpa_supplicant/Android.mk index 3c877f090..0f56f1d6a 100644 --- a/wpa_supplicant/Android.mk +++ b/wpa_supplicant/Android.mk @@ -835,6 +835,9 @@ endif ifdef CONFIG_MBO OBJS += src/ap/mbo_ap.c endif +ifdef CONFIG_FILS +OBJS += src/ap/fils_hlp.c +endif ifdef CONFIG_CTRL_IFACE OBJS += src/ap/ctrl_iface_ap.c endif diff --git a/wpa_supplicant/Makefile b/wpa_supplicant/Makefile index dae691105..460441c15 100644 --- a/wpa_supplicant/Makefile +++ b/wpa_supplicant/Makefile @@ -876,6 +876,9 @@ endif ifdef CONFIG_MBO OBJS += ../src/ap/mbo_ap.o endif +ifdef CONFIG_FILS +OBJS += ../src/ap/fils_hlp.o +endif ifdef CONFIG_CTRL_IFACE OBJS += ../src/ap/ctrl_iface_ap.o endif