MBO: Track STA cellular data capability from association request

This makes hostapd parse the MBO attribute in (Re)Association Request
frame and track the cellular data capability (mbo_cell_capa=<val> in STA
control interface command).

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
Jouni Malinen 2016-02-22 13:03:28 +02:00 committed by Jouni Malinen
parent f3cb7a6969
commit 6332aaf3b2
10 changed files with 111 additions and 0 deletions

View file

@ -265,6 +265,7 @@ endif
ifdef CONFIG_MBO
L_CFLAGS += -DCONFIG_MBO
OBJS += src/ap/mbo_ap.c
endif
ifdef CONFIG_FST

View file

@ -284,6 +284,7 @@ endif
ifdef CONFIG_MBO
CFLAGS += -DCONFIG_MBO
OBJS += ../src/ap/mbo_ap.o
endif
include ../src/drivers/drivers.mak

View file

@ -22,6 +22,7 @@
#include "p2p_hostapd.h"
#include "ctrl_iface_ap.h"
#include "ap_drv_ops.h"
#include "mbo_ap.h"
static int hostapd_get_sta_tx_rx(struct hostapd_data *hapd,
@ -161,6 +162,10 @@ static int hostapd_ctrl_iface_sta_mib(struct hostapd_data *hapd,
len += res;
}
res = mbo_ap_get_info(sta, buf + len, buflen - len);
if (res >= 0)
len += res;
return len;
}

View file

@ -34,6 +34,7 @@
#include "hw_features.h"
#include "dfs.h"
#include "beacon.h"
#include "mbo_ap.h"
int hostapd_notif_assoc(struct hostapd_data *hapd, const u8 *addr,
@ -173,6 +174,8 @@ int hostapd_notif_assoc(struct hostapd_data *hapd, const u8 *addr,
sta->mb_ies = NULL;
#endif /* CONFIG_FST */
mbo_ap_check_sta_assoc(hapd, sta, &elems);
if (hapd->conf->wpa) {
if (ie == NULL || ielen == 0) {
#ifdef CONFIG_WPS

View file

@ -42,6 +42,7 @@
#include "hw_features.h"
#include "ieee802_11.h"
#include "dfs.h"
#include "mbo_ap.h"
u8 * hostapd_eid_supp_rates(struct hostapd_data *hapd, u8 *eid)
@ -1713,6 +1714,8 @@ static u16 check_assoc_ies(struct hostapd_data *hapd, struct sta_info *sta,
sta->mb_ies = NULL;
#endif /* CONFIG_FST */
mbo_ap_check_sta_assoc(hapd, sta, &elems);
return WLAN_STATUS_SUCCESS;
}

49
src/ap/mbo_ap.c Normal file
View file

@ -0,0 +1,49 @@
/*
* hostapd - MBO
* Copyright (c) 2016, 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 "common/ieee802_11_defs.h"
#include "common/ieee802_11_common.h"
#include "hostapd.h"
#include "sta_info.h"
#include "mbo_ap.h"
void mbo_ap_check_sta_assoc(struct hostapd_data *hapd, struct sta_info *sta,
struct ieee802_11_elems *elems)
{
const u8 *pos, *attr;
size_t len;
if (!hapd->conf->mbo_enabled || !elems->mbo)
return;
pos = elems->mbo + 4;
len = elems->mbo_len - 4;
wpa_hexdump(MSG_DEBUG, "MBO: Association Request attributes", pos, len);
attr = get_ie(pos, len, MBO_ATTR_ID_CELL_DATA_CAPA);
if (attr && attr[1] >= 1)
sta->cell_capa = attr[2];
}
int mbo_ap_get_info(struct sta_info *sta, char *buf, size_t buflen)
{
int ret;
if (!sta->cell_capa)
return 0;
ret = os_snprintf(buf, buflen, "mbo_cell_capa=%u\n", sta->cell_capa);
if (os_snprintf_error(buflen, ret))
return 0;
return ret;
}

38
src/ap/mbo_ap.h Normal file
View file

@ -0,0 +1,38 @@
/*
* MBO related functions and structures
* Copyright (c) 2016, Qualcomm Atheros, Inc.
*
* This software may be distributed under the terms of the BSD license.
* See README for more details.
*/
#ifndef MBO_AP_H
#define MBO_AP_H
struct hostapd_data;
struct sta_info;
struct ieee802_11_elems;
#ifdef CONFIG_MBO
void mbo_ap_check_sta_assoc(struct hostapd_data *hapd, struct sta_info *sta,
struct ieee802_11_elems *elems);
int mbo_ap_get_info(struct sta_info *sta, char *buf, size_t buflen);
#else /* CONFIG_MBO */
static inline void mbo_ap_check_sta_assoc(struct hostapd_data *hapd,
struct sta_info *sta,
struct ieee802_11_elems *elems)
{
}
static inline int mbo_ap_get_info(struct sta_info *sta, char *buf,
size_t buflen)
{
return 0;
}
#endif /* CONFIG_MBO */
#endif /* MBO_AP_H */

View file

@ -174,6 +174,11 @@ struct sta_info {
u16 last_seq_ctrl;
/* Last Authentication/(Re)Association Request/Action frame subtype */
u8 last_subtype;
#ifdef CONFIG_MBO
u8 cell_capa; /* 0 = unknown (not an MBO STA); otherwise,
* enum mbo_cellular_capa values */
#endif /* CONFIG_MBO */
};

View file

@ -806,6 +806,9 @@ endif
ifdef CONFIG_WNM
OBJS += src/ap/wnm_ap.c
endif
ifdef CONFIG_MBO
OBJS += src/ap/mbo_ap.c
endif
ifdef CONFIG_CTRL_IFACE
OBJS += src/ap/ctrl_iface_ap.c
endif

View file

@ -848,6 +848,9 @@ endif
ifdef CONFIG_WNM
OBJS += ../src/ap/wnm_ap.o
endif
ifdef CONFIG_MBO
OBJS += ../src/ap/mbo_ap.o
endif
ifdef CONFIG_CTRL_IFACE
OBJS += ../src/ap/ctrl_iface_ap.o
endif