]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
MBO: Parse MBO ANQP-element on STA
authorJouni Malinen <jouni@qca.qualcomm.com>
Fri, 10 Mar 2017 16:57:12 +0000 (18:57 +0200)
committerJouni Malinen <j@w1.fi>
Fri, 10 Mar 2017 16:57:12 +0000 (18:57 +0200)
This extends the GAS/ANQP parser in wpa_supplicant to process MBO
ANQP-elements and indicate received Cellular Data Connection Preference
values over the control interface.

When a valid MBO ANQP-element is received, the following control
interface message is sent:

RX-MBO-ANQP <BSSID> cell_conn_pref=<value>

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
src/common/wpa_ctrl.h
wpa_supplicant/interworking.c
wpa_supplicant/mbo.c
wpa_supplicant/wpa_supplicant_i.h

index 247bf80cb60a0fa9e2d5e875014905663decc01d..88f526d5d67b7b2a8e8b8ce92cf821ce0ac81a3c 100644 (file)
@@ -234,6 +234,7 @@ extern "C" {
 #define RX_HS20_ANQP "RX-HS20-ANQP "
 #define RX_HS20_ANQP_ICON "RX-HS20-ANQP-ICON "
 #define RX_HS20_ICON "RX-HS20-ICON "
+#define RX_MBO_ANQP "RX-MBO-ANQP "
 
 #define HS20_SUBSCRIPTION_REMEDIATION "HS20-SUBSCRIPTION-REMEDIATION "
 #define HS20_DEAUTH_IMMINENT_NOTICE "HS20-DEAUTH-IMMINENT-NOTICE "
index b9ec124613f0080e6c622de6133989444296b53c..1965a3e8c592ffab6e086207b5850837a603d88d 100644 (file)
@@ -2912,7 +2912,6 @@ static void interworking_parse_rx_anqp_resp(struct wpa_supplicant *wpa_s,
                        return;
 
                switch (WPA_GET_BE24(pos)) {
-#ifdef CONFIG_HS20
                case OUI_WFA:
                        pos += 3;
                        slen -= 3;
@@ -2923,19 +2922,26 @@ static void interworking_parse_rx_anqp_resp(struct wpa_supplicant *wpa_s,
                        slen--;
 
                        switch (type) {
+#ifdef CONFIG_HS20
                        case HS20_ANQP_OUI_TYPE:
                                hs20_parse_rx_hs20_anqp_resp(wpa_s, bss, sa,
                                                             pos, slen,
                                                             dialog_token);
                                break;
+#endif /* CONFIG_HS20 */
+#ifdef CONFIG_MBO
+                       case MBO_ANQP_OUI_TYPE:
+                               mbo_parse_rx_anqp_resp(wpa_s, bss, sa,
+                                                      pos, slen);
+                               break;
+#endif /* CONFIG_MBO */
                        default:
                                wpa_msg(wpa_s, MSG_DEBUG,
-                                       "HS20: Unsupported ANQP vendor type %u",
+                                       "ANQP: Unsupported ANQP vendor type %u",
                                        type);
                                break;
                        }
                        break;
-#endif /* CONFIG_HS20 */
                default:
                        wpa_msg(wpa_s, MSG_DEBUG,
                                "Interworking: Unsupported vendor-specific ANQP OUI %06x",
index 5348b9a96ad0d8ca0430db384031f22f6ac8545c..138b4055b759761f9e565ab0cf831378b6ed3e31 100644 (file)
@@ -549,3 +549,31 @@ struct wpabuf * mbo_build_anqp_buf(struct wpa_supplicant *wpa_s,
 
        return anqp_buf;
 }
+
+
+void mbo_parse_rx_anqp_resp(struct wpa_supplicant *wpa_s,
+                           struct wpa_bss *bss, const u8 *sa,
+                           const u8 *data, size_t slen)
+{
+       const u8 *pos = data;
+       u8 subtype;
+
+       if (slen < 1)
+               return;
+
+       subtype = *pos++;
+       slen--;
+
+       switch (subtype) {
+       case MBO_ANQP_SUBTYPE_CELL_CONN_PREF:
+               if (slen < 1)
+                       break;
+               wpa_msg(wpa_s, MSG_INFO, RX_MBO_ANQP MACSTR
+                       " cell_conn_pref=%u", MAC2STR(sa), *pos);
+               break;
+       default:
+               wpa_printf(MSG_DEBUG, "MBO: Unsupported ANQP subtype %u",
+                          subtype);
+               break;
+       }
+}
index 08df4cca19b102e400bee0938bf9a6934d31d1bf..50d65ab400ee5cf53366fb737ff471e73853dd6a 100644 (file)
@@ -1295,6 +1295,9 @@ size_t wpas_mbo_ie_bss_trans_reject(struct wpa_supplicant *wpa_s, u8 *pos,
 void wpas_mbo_update_cell_capa(struct wpa_supplicant *wpa_s, u8 mbo_cell_capa);
 struct wpabuf * mbo_build_anqp_buf(struct wpa_supplicant *wpa_s,
                                   struct wpa_bss *bss, u32 mbo_subtypes);
+void mbo_parse_rx_anqp_resp(struct wpa_supplicant *wpa_s,
+                           struct wpa_bss *bss, const u8 *sa,
+                           const u8 *data, size_t slen);
 
 /* op_classes.c */
 enum chan_allowed {