MBO: Track STA cellular data capability from association request
authorJouni Malinen <jouni@qca.qualcomm.com>
Mon, 22 Feb 2016 11:03:28 +0000 (13:03 +0200)
committerJouni Malinen <j@w1.fi>
Mon, 22 Feb 2016 17:53:05 +0000 (19:53 +0200)
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>
hostapd/Android.mk
hostapd/Makefile
src/ap/ctrl_iface_ap.c
src/ap/drv_callbacks.c
src/ap/ieee802_11.c
src/ap/mbo_ap.c [new file with mode: 0644]
src/ap/mbo_ap.h [new file with mode: 0644]
src/ap/sta_info.h
wpa_supplicant/Android.mk
wpa_supplicant/Makefile

index 7048484..42d85a4 100644 (file)
@@ -265,6 +265,7 @@ endif
 
 ifdef CONFIG_MBO
 L_CFLAGS += -DCONFIG_MBO
+OBJS += src/ap/mbo_ap.c
 endif
 
 ifdef CONFIG_FST
index 43a96a5..62f3b32 100644 (file)
@@ -284,6 +284,7 @@ endif
 
 ifdef CONFIG_MBO
 CFLAGS += -DCONFIG_MBO
+OBJS += ../src/ap/mbo_ap.o
 endif
 
 include ../src/drivers/drivers.mak
index 4f93ac2..a95230e 100644 (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;
 }
 
index 9f53660..db18f29 100644 (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
index 251c1a9..3ac225d 100644 (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;
 }
 
diff --git a/src/ap/mbo_ap.c b/src/ap/mbo_ap.c
new file mode 100644 (file)
index 0000000..940f693
--- /dev/null
@@ -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 (file)
index 0000000..9c6aeda
--- /dev/null
@@ -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 */
index d36302f..0dd545a 100644 (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 */
 };
 
 
index c4e8c9f..9adc491 100644 (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
index 3f6038a..28ae172 100644 (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