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:
parent
f3cb7a6969
commit
6332aaf3b2
10 changed files with 111 additions and 0 deletions
|
@ -265,6 +265,7 @@ endif
|
|||
|
||||
ifdef CONFIG_MBO
|
||||
L_CFLAGS += -DCONFIG_MBO
|
||||
OBJS += src/ap/mbo_ap.c
|
||||
endif
|
||||
|
||||
ifdef CONFIG_FST
|
||||
|
|
|
@ -284,6 +284,7 @@ endif
|
|||
|
||||
ifdef CONFIG_MBO
|
||||
CFLAGS += -DCONFIG_MBO
|
||||
OBJS += ../src/ap/mbo_ap.o
|
||||
endif
|
||||
|
||||
include ../src/drivers/drivers.mak
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
49
src/ap/mbo_ap.c
Normal 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
38
src/ap/mbo_ap.h
Normal 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 */
|
|
@ -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 */
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue