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 <jouni@qca.qualcomm.com>
This commit is contained in:
parent
5a9d504938
commit
54b04d6f39
7 changed files with 112 additions and 79 deletions
|
@ -263,6 +263,7 @@ endif
|
||||||
|
|
||||||
ifdef CONFIG_FILS
|
ifdef CONFIG_FILS
|
||||||
L_CFLAGS += -DCONFIG_FILS
|
L_CFLAGS += -DCONFIG_FILS
|
||||||
|
OBJS += src/ap/fils_hlp.c
|
||||||
NEED_CRC32=y
|
NEED_CRC32=y
|
||||||
NEED_SHA384=y
|
NEED_SHA384=y
|
||||||
NEED_AES_SIV=y
|
NEED_AES_SIV=y
|
||||||
|
|
|
@ -307,6 +307,7 @@ endif
|
||||||
|
|
||||||
ifdef CONFIG_FILS
|
ifdef CONFIG_FILS
|
||||||
CFLAGS += -DCONFIG_FILS
|
CFLAGS += -DCONFIG_FILS
|
||||||
|
OBJS += ../src/ap/fils_hlp.o
|
||||||
NEED_CRC32=y
|
NEED_CRC32=y
|
||||||
NEED_SHA384=y
|
NEED_SHA384=y
|
||||||
NEED_AES_SIV=y
|
NEED_AES_SIV=y
|
||||||
|
|
88
src/ap/fils_hlp.c
Normal file
88
src/ap/fils_hlp.c
Normal file
|
@ -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);
|
||||||
|
}
|
15
src/ap/fils_hlp.h
Normal file
15
src/ap/fils_hlp.h
Normal file
|
@ -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 */
|
|
@ -45,6 +45,7 @@
|
||||||
#include "mbo_ap.h"
|
#include "mbo_ap.h"
|
||||||
#include "rrm.h"
|
#include "rrm.h"
|
||||||
#include "taxonomy.h"
|
#include "taxonomy.h"
|
||||||
|
#include "fils_hlp.h"
|
||||||
|
|
||||||
|
|
||||||
u8 * hostapd_eid_supp_rates(struct hostapd_data *hapd, u8 *eid)
|
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,
|
static void handle_assoc(struct hostapd_data *hapd,
|
||||||
const struct ieee80211_mgmt *mgmt, size_t len,
|
const struct ieee80211_mgmt *mgmt, size_t len,
|
||||||
int reassoc)
|
int reassoc)
|
||||||
|
|
|
@ -835,6 +835,9 @@ endif
|
||||||
ifdef CONFIG_MBO
|
ifdef CONFIG_MBO
|
||||||
OBJS += src/ap/mbo_ap.c
|
OBJS += src/ap/mbo_ap.c
|
||||||
endif
|
endif
|
||||||
|
ifdef CONFIG_FILS
|
||||||
|
OBJS += src/ap/fils_hlp.c
|
||||||
|
endif
|
||||||
ifdef CONFIG_CTRL_IFACE
|
ifdef CONFIG_CTRL_IFACE
|
||||||
OBJS += src/ap/ctrl_iface_ap.c
|
OBJS += src/ap/ctrl_iface_ap.c
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -876,6 +876,9 @@ endif
|
||||||
ifdef CONFIG_MBO
|
ifdef CONFIG_MBO
|
||||||
OBJS += ../src/ap/mbo_ap.o
|
OBJS += ../src/ap/mbo_ap.o
|
||||||
endif
|
endif
|
||||||
|
ifdef CONFIG_FILS
|
||||||
|
OBJS += ../src/ap/fils_hlp.o
|
||||||
|
endif
|
||||||
ifdef CONFIG_CTRL_IFACE
|
ifdef CONFIG_CTRL_IFACE
|
||||||
OBJS += ../src/ap/ctrl_iface_ap.o
|
OBJS += ../src/ap/ctrl_iface_ap.o
|
||||||
endif
|
endif
|
||||||
|
|
Loading…
Reference in a new issue