Add wpa_supplicant EVENT_TEST control interface command
[mech_eap.git] / wpa_supplicant / ctrl_iface.c
index 4d4d51a..02d0cc2 100644 (file)
@@ -2168,7 +2168,7 @@ static int wpa_supplicant_ctrl_iface_log_level(struct wpa_supplicant *wpa_s,
                }
        }
 
-       if (cmd && os_strlen(cmd)) {
+       if (os_strlen(cmd)) {
                int level = str_to_debug_level(cmd);
                if (level < 0)
                        return -1;
@@ -3039,19 +3039,19 @@ static int wpa_supplicant_ctrl_iface_get_network(
        *name++ = '\0';
 
        id = atoi(cmd);
-       wpa_printf(MSG_DEBUG, "CTRL_IFACE: GET_NETWORK id=%d name='%s'",
+       wpa_printf(MSG_EXCESSIVE, "CTRL_IFACE: GET_NETWORK id=%d name='%s'",
                   id, name);
 
        ssid = wpa_config_get_network(wpa_s->conf, id);
        if (ssid == NULL) {
-               wpa_printf(MSG_DEBUG, "CTRL_IFACE: Could not find network "
+               wpa_printf(MSG_EXCESSIVE, "CTRL_IFACE: Could not find network "
                           "id=%d", id);
                return -1;
        }
 
        value = wpa_config_get_no_key(ssid, name);
        if (value == NULL) {
-               wpa_printf(MSG_DEBUG, "CTRL_IFACE: Failed to get network "
+               wpa_printf(MSG_EXCESSIVE, "CTRL_IFACE: Failed to get network "
                           "variable '%s'", name);
                return -1;
        }
@@ -4184,9 +4184,10 @@ static int print_bss_info(struct wpa_supplicant *wpa_s, struct wpa_bss *bss,
        if (mask & WPA_BSS_MASK_WPS_SCAN) {
                ie = (const u8 *) (bss + 1);
                ret = wpas_wps_scan_result_text(ie, bss->ie_len, pos, end);
-               if (ret < 0 || ret >= end - pos)
+               if (ret >= end - pos)
                        return 0;
-               pos += ret;
+               if (ret > 0)
+                       pos += ret;
        }
 #endif /* CONFIG_WPS */
 
@@ -7734,6 +7735,33 @@ static int wpas_ctrl_get_fail(struct wpa_supplicant *wpa_s,
 #endif /* WPA_TRACE_BFD */
 }
 
+
+static void wpas_ctrl_event_test_cb(void *eloop_ctx, void *timeout_ctx)
+{
+       struct wpa_supplicant *wpa_s = eloop_ctx;
+       int i, count = (intptr_t) timeout_ctx;
+
+       wpa_printf(MSG_DEBUG, "TEST: Send %d control interface event messages",
+                  count);
+       for (i = 0; i < count; i++) {
+               wpa_msg_ctrl(wpa_s, MSG_INFO, "TEST-EVENT-MESSAGE %d/%d",
+                            i + 1, count);
+       }
+}
+
+
+static int wpas_ctrl_event_test(struct wpa_supplicant *wpa_s, const char *cmd)
+{
+       int count;
+
+       count = atoi(cmd);
+       if (count <= 0)
+               return -1;
+
+       return eloop_register_timeout(0, 0, wpas_ctrl_event_test_cb, wpa_s,
+                                     (void *) (intptr_t) count);
+}
+
 #endif /* CONFIG_TESTING_OPTIONS */
 
 
@@ -8111,6 +8139,19 @@ static int wpas_ctrl_iface_mac_rand_scan(struct wpa_supplicant *wpa_s,
 }
 
 
+static int wpas_ctrl_cmd_debug_level(const char *cmd)
+{
+       if (os_strcmp(cmd, "PING") == 0 ||
+           os_strncmp(cmd, "BSS ", 4) == 0 ||
+           os_strncmp(cmd, "GET_NETWORK ", 12) == 0 ||
+           os_strncmp(cmd, "STATUS", 6) == 0 ||
+           os_strncmp(cmd, "STA ", 4) == 0 ||
+           os_strncmp(cmd, "STA-", 4) == 0)
+               return MSG_EXCESSIVE;
+       return MSG_DEBUG;
+}
+
+
 char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s,
                                         char *buf, size_t *resp_len)
 {
@@ -8134,9 +8175,7 @@ char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s,
                wpa_hexdump_ascii_key(MSG_DEBUG, "RX ctrl_iface",
                                      (const u8 *) buf, os_strlen(buf));
        } else {
-               int level = MSG_DEBUG;
-               if (os_strcmp(buf, "PING") == 0)
-                       level = MSG_EXCESSIVE;
+               int level = wpas_ctrl_cmd_debug_level(buf);
                wpa_dbg(wpa_s, level, "Control interface command '%s'", buf);
        }
 
@@ -8757,6 +8796,9 @@ char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s,
                        reply_len = -1;
        } else if (os_strcmp(buf, "GET_FAIL") == 0) {
                reply_len = wpas_ctrl_get_fail(wpa_s, reply, reply_size);
+       } else if (os_strncmp(buf, "EVENT_TEST ", 11) == 0) {
+               if (wpas_ctrl_event_test(wpa_s, buf + 11) < 0)
+                       reply_len = -1;
 #endif /* CONFIG_TESTING_OPTIONS */
        } else if (os_strncmp(buf, "VENDOR_ELEM_ADD ", 16) == 0) {
                if (wpas_ctrl_vendor_elem_add(wpa_s, buf + 16) < 0)