diff --git a/hostapd/Android.mk b/hostapd/Android.mk index 704848461..42d85a4c5 100644 --- a/hostapd/Android.mk +++ b/hostapd/Android.mk @@ -265,6 +265,7 @@ endif ifdef CONFIG_MBO L_CFLAGS += -DCONFIG_MBO +OBJS += src/ap/mbo_ap.c endif ifdef CONFIG_FST diff --git a/hostapd/Makefile b/hostapd/Makefile index 43a96a525..62f3b3244 100644 --- a/hostapd/Makefile +++ b/hostapd/Makefile @@ -284,6 +284,7 @@ endif ifdef CONFIG_MBO CFLAGS += -DCONFIG_MBO +OBJS += ../src/ap/mbo_ap.o endif include ../src/drivers/drivers.mak diff --git a/src/ap/ctrl_iface_ap.c b/src/ap/ctrl_iface_ap.c index 4f93ac203..a95230e06 100644 --- a/src/ap/ctrl_iface_ap.c +++ b/src/ap/ctrl_iface_ap.c @@ -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; } diff --git a/src/ap/drv_callbacks.c b/src/ap/drv_callbacks.c index 9f53660a0..db18f2974 100644 --- a/src/ap/drv_callbacks.c +++ b/src/ap/drv_callbacks.c @@ -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 diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c index 251c1a909..3ac225deb 100644 --- a/src/ap/ieee802_11.c +++ b/src/ap/ieee802_11.c @@ -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; } diff --git a/src/ap/mbo_ap.c b/src/ap/mbo_ap.c new file mode 100644 index 000000000..940f69342 --- /dev/null +++ b/src/ap/mbo_ap.c @@ -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; +} diff --git a/src/ap/mbo_ap.h b/src/ap/mbo_ap.h new file mode 100644 index 000000000..9c6aedac5 --- /dev/null +++ b/src/ap/mbo_ap.h @@ -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 */ diff --git a/src/ap/sta_info.h b/src/ap/sta_info.h index d36302f95..0dd545a96 100644 --- a/src/ap/sta_info.h +++ b/src/ap/sta_info.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 */ }; diff --git a/wpa_supplicant/Android.mk b/wpa_supplicant/Android.mk index c4e8c9f77..9adc491e0 100644 --- a/wpa_supplicant/Android.mk +++ b/wpa_supplicant/Android.mk @@ -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 diff --git a/wpa_supplicant/Makefile b/wpa_supplicant/Makefile index 3f6038a29..28ae1728f 100644 --- a/wpa_supplicant/Makefile +++ b/wpa_supplicant/Makefile @@ -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