]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
WNM: Add option to configure candidates for BTM query candidate list
authorAvraham Stern <avraham.stern@intel.com>
Wed, 8 Mar 2017 12:37:40 +0000 (14:37 +0200)
committerJouni Malinen <j@w1.fi>
Sat, 11 Mar 2017 08:47:28 +0000 (10:47 +0200)
Add a mechanism to configure the candidates for BTM query candidate list
manually. This can be used to verify AP behavior for various candidates
preferences.

usage:
wnm_bss_query <reason> [neighbor=<BSSID>,<BSSID information>,
                <operating class>,<channel number>,
<PHY type>[,<hexdump of optional subelements>]]

Signed-off-by: Avraham Stern <avraham.stern@intel.com>
wpa_supplicant/ctrl_iface.c
wpa_supplicant/wnm_sta.c
wpa_supplicant/wnm_sta.h

index 08348d292037f0de5b8847e824e0439c75582a0e..95cae13ccfec08ea8d2a2297ff57dfa05c702256 100644 (file)
@@ -7157,26 +7157,25 @@ static int wpas_ctrl_iface_wnm_sleep(struct wpa_supplicant *wpa_s, char *cmd)
 static int wpas_ctrl_iface_wnm_bss_query(struct wpa_supplicant *wpa_s, char *cmd)
 {
        int query_reason, list = 0;
+       char *btm_candidates = NULL;
 
        query_reason = atoi(cmd);
 
        cmd = os_strchr(cmd, ' ');
        if (cmd) {
-               cmd++;
-               if (os_strncmp(cmd, "list", 4) == 0) {
+               if (os_strncmp(cmd, " list", 5) == 0)
                        list = 1;
-               } else {
-                       wpa_printf(MSG_DEBUG, "WNM Query: Invalid option %s",
-                                  cmd);
-                       return -1;
-               }
+               else
+                       btm_candidates = cmd;
        }
 
        wpa_printf(MSG_DEBUG,
                   "CTRL_IFACE: WNM_BSS_QUERY query_reason=%d%s",
                   query_reason, list ? " candidate list" : "");
 
-       return wnm_send_bss_transition_mgmt_query(wpa_s, query_reason, list);
+       return wnm_send_bss_transition_mgmt_query(wpa_s, query_reason,
+                                                 btm_candidates,
+                                                 list);
 }
 
 #endif /* CONFIG_WNM */
index c4f77e7306cd259c3acc91f4feef26f5d21b8617..dd6ce8de1ad262e24c0e83677bbef603b1859885 100644 (file)
@@ -1486,7 +1486,9 @@ static void ieee802_11_rx_bss_trans_mgmt_req(struct wpa_supplicant *wpa_s,
 #define BTM_QUERY_MIN_SIZE     4
 
 int wnm_send_bss_transition_mgmt_query(struct wpa_supplicant *wpa_s,
-                                      u8 query_reason, int cand_list)
+                                      u8 query_reason,
+                                      const char *btm_candidates,
+                                      int cand_list)
 {
        struct wpabuf *buf;
        int ret;
@@ -1508,6 +1510,26 @@ int wnm_send_bss_transition_mgmt_query(struct wpa_supplicant *wpa_s,
        if (cand_list)
                wnm_add_cand_list(wpa_s, &buf);
 
+       if (btm_candidates) {
+               const size_t max_len = 1000;
+
+               ret = wpabuf_resize(&buf, max_len);
+               if (ret < 0) {
+                       wpabuf_free(buf);
+                       return ret;
+               }
+
+               ret = ieee802_11_parse_candidate_list(btm_candidates,
+                                                     wpabuf_put(buf, 0),
+                                                     max_len);
+               if (ret < 0) {
+                       wpabuf_free(buf);
+                       return ret;
+               }
+
+               wpabuf_put(buf, ret);
+       }
+
        ret = wpa_drv_send_action(wpa_s, wpa_s->assoc_freq, 0, wpa_s->bssid,
                                  wpa_s->own_addr, wpa_s->bssid,
                                  wpabuf_head_u8(buf), wpabuf_len(buf), 0);
index 78b87d05532a37c5d43c94a57df56b903d5262ee..02cd1cde67425251ca46280a5710ff0ceee69230 100644 (file)
@@ -60,7 +60,10 @@ void ieee802_11_rx_wnm_action(struct wpa_supplicant *wpa_s,
                              const struct ieee80211_mgmt *mgmt, size_t len);
 
 int wnm_send_bss_transition_mgmt_query(struct wpa_supplicant *wpa_s,
-                                      u8 query_reason, int cand_list);
+                                      u8 query_reason,
+                                      const char *btm_candidates,
+                                      int cand_list);
+
 void wnm_deallocate_memory(struct wpa_supplicant *wpa_s);