18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * WPA Supplicant - command line interface for wpa_supplicant daemon
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2004-2011, Jouni Malinen <j@w1.fi>
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license.
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details.
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h"
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_UNIX
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <dirent.h>
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UNIX */
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/wpa_ctrl.h"
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/common.h"
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/eloop.h"
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/edit.h"
211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#include "utils/list.h"
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/version.h"
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef ANDROID
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <cutils/properties.h>
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* ANDROID */
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *wpa_cli_version =
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"wpa_cli v" VERSION_STR "\n"
30c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt"Copyright (c) 2004-2012, Jouni Malinen <j@w1.fi> and contributors";
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *wpa_cli_license =
34c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt"This software may be distributed under the terms of the BSD license.\n"
35c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt"See README for more details.\n";
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *wpa_cli_full_license =
38c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt"This software may be distributed under the terms of the BSD license.\n"
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"Redistribution and use in source and binary forms, with or without\n"
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"modification, are permitted provided that the following conditions are\n"
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"met:\n"
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"1. Redistributions of source code must retain the above copyright\n"
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"   notice, this list of conditions and the following disclaimer.\n"
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"2. Redistributions in binary form must reproduce the above copyright\n"
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"   notice, this list of conditions and the following disclaimer in the\n"
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"   documentation and/or other materials provided with the distribution.\n"
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"   names of its contributors may be used to endorse or promote products\n"
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"   derived from this software without specific prior written permission.\n"
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n"
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n";
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_ctrl *ctrl_conn;
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_ctrl *mon_conn;
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_quit = 0;
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_attached = 0;
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_connected = 0;
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_last_id = 0;
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_CTRL_IFACE_DIR
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define CONFIG_CTRL_IFACE_DIR "/var/run/wpa_supplicant"
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_DIR */
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *ctrl_iface_dir = CONFIG_CTRL_IFACE_DIR;
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char *ctrl_ifname = NULL;
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *pid_file = NULL;
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *action_file = NULL;
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int ping_interval = 5;
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int interactive = 0;
832fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt#if defined(CONFIG_P2P) && defined(ANDROID_P2P)
842fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidtstatic char* redirect_interface = NULL;
852fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt#endif
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstruct cli_txt_entry {
881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct dl_list list;
891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char *txt;
901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt};
911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic DEFINE_DL_LIST(bsses); /* struct cli_txt_entry */
931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic DEFINE_DL_LIST(p2p_peers); /* struct cli_txt_entry */
941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic DEFINE_DL_LIST(p2p_groups); /* struct cli_txt_entry */
951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void print_help(void);
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_mon_receive(int sock, void *eloop_ctx, void *sock_ctx);
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void usage(void)
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("wpa_cli [-p<path to ctrl sockets>] [-i<ifname>] [-hvB] "
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "[-a<action file>] \\\n"
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "        [-P<pid file>] [-g<global ctrl>] [-G<ping interval>]  "
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "[command..]\n"
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  -h = help (show this usage text)\n"
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  -v = shown version information\n"
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  -a = run in daemon mode executing the action file based on "
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "events from\n"
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "       wpa_supplicant\n"
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  -B = run a daemon in the background\n"
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  default path: " CONFIG_CTRL_IFACE_DIR "\n"
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  default interface: first interface found in socket path\n");
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	print_help();
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_txt_list_free(struct cli_txt_entry *e)
1201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
1211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dl_list_del(&e->list);
1221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(e->txt);
1231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(e);
1241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
1251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_txt_list_flush(struct dl_list *list)
1281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
1291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct cli_txt_entry *e;
1301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	while ((e = dl_list_first(list, struct cli_txt_entry, list)))
1311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_free(e);
1321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
1331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic struct cli_txt_entry * cli_txt_list_get(struct dl_list *txt_list,
1361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					       const char *txt)
1371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
1381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct cli_txt_entry *e;
1391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dl_list_for_each(e, txt_list, struct cli_txt_entry, list) {
1401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (os_strcmp(e->txt, txt) == 0)
1411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return e;
1421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
1431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return NULL;
1441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
1451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_txt_list_del(struct dl_list *txt_list, const char *txt)
1481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
1491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct cli_txt_entry *e;
1501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	e = cli_txt_list_get(txt_list, txt);
1511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (e)
1521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_free(e);
1531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
1541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_txt_list_del_addr(struct dl_list *txt_list, const char *txt)
1571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
1581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	u8 addr[ETH_ALEN];
1591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char buf[18];
1601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (hwaddr_aton(txt, addr) < 0)
1611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
1621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_snprintf(buf, sizeof(buf), MACSTR, MAC2STR(addr));
1631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	cli_txt_list_del(txt_list, buf);
1641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
1651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P
1681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_txt_list_del_word(struct dl_list *txt_list, const char *txt)
1691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
1701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	const char *end;
1711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char *buf;
1721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	end = os_strchr(txt, ' ');
1731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (end == NULL)
1741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		end = txt + os_strlen(txt);
1751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	buf = os_malloc(end - txt + 1);
1761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (buf == NULL)
1771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
1781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_memcpy(buf, txt, end - txt);
1791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	buf[end - txt] = '\0';
1801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	cli_txt_list_del(txt_list, buf);
1811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(buf);
1821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
1831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */
1841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int cli_txt_list_add(struct dl_list *txt_list, const char *txt)
1871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
1881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct cli_txt_entry *e;
1891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	e = cli_txt_list_get(txt_list, txt);
1901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (e)
1911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return 0;
1921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	e = os_zalloc(sizeof(*e));
1931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (e == NULL)
1941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return -1;
1951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	e->txt = os_strdup(txt);
1961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (e->txt == NULL) {
1971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		os_free(e);
1981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return -1;
1991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
2001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dl_list_add(txt_list, &e->list);
2011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return 0;
2021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
2031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P
2061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int cli_txt_list_add_addr(struct dl_list *txt_list, const char *txt)
2071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
2081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	u8 addr[ETH_ALEN];
2091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char buf[18];
2101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (hwaddr_aton(txt, addr) < 0)
2111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return -1;
2121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_snprintf(buf, sizeof(buf), MACSTR, MAC2STR(addr));
2131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return cli_txt_list_add(txt_list, buf);
2141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
2151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int cli_txt_list_add_word(struct dl_list *txt_list, const char *txt)
2181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
2191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	const char *end;
2201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char *buf;
2211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int ret;
2221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	end = os_strchr(txt, ' ');
2231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (end == NULL)
2241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		end = txt + os_strlen(txt);
2251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	buf = os_malloc(end - txt + 1);
2261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (buf == NULL)
2271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return -1;
2281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_memcpy(buf, txt, end - txt);
2291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	buf[end - txt] = '\0';
2301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	ret = cli_txt_list_add(txt_list, buf);
2311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(buf);
2321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return ret;
2331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
2341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */
2351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** cli_txt_list_array(struct dl_list *txt_list)
2381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
2391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	unsigned int i, count = dl_list_len(txt_list);
2401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char **res;
2411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct cli_txt_entry *e;
2421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = os_zalloc((count + 1) * sizeof(char *));
2441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (res == NULL)
2451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return NULL;
2461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	i = 0;
2481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dl_list_for_each(e, txt_list, struct cli_txt_entry, list) {
2491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		res[i] = os_strdup(e->txt);
2501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (res[i] == NULL)
2511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			break;
2521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		i++;
2531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
2541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
2561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
2571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int get_cmd_arg_num(const char *str, int pos)
2601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
2611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int arg = 0, i;
2621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	for (i = 0; i <= pos; i++) {
2641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (str[i] != ' ') {
2651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			arg++;
2661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			while (i <= pos && str[i] != ' ')
2671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				i++;
2681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		}
2691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
2701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (arg > 0)
2721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		arg--;
2731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return arg;
2741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
2751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int str_starts(const char *src, const char *match)
2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return os_strncmp(src, match, os_strlen(match)) == 0;
2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_show_event(const char *event)
2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *start;
2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	start = os_strchr(event, '>');
2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (start == NULL)
2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 1;
2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	start++;
2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/*
2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * Skip BSS added/removed events since they can be relatively frequent
2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * and are likely of not much use for an interactive user.
2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (str_starts(start, WPA_EVENT_BSS_ADDED) ||
2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    str_starts(start, WPA_EVENT_BSS_REMOVED))
2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 1;
3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_open_connection(const char *ifname, int attach)
3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#if defined(CONFIG_CTRL_IFACE_UDP) || defined(CONFIG_CTRL_IFACE_NAMED_PIPE)
3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctrl_conn = wpa_ctrl_open(ifname);
3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL)
3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (attach && interactive)
3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		mon_conn = wpa_ctrl_open(ifname);
3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		mon_conn = NULL;
3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */
3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *cfile = NULL;
3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int flen, res;
3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ifname == NULL)
3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef ANDROID
3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (access(ctrl_iface_dir, F_OK) < 0) {
3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		cfile = os_strdup(ifname);
3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (cfile == NULL)
3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* ANDROID */
3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (cfile == NULL) {
3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		flen = os_strlen(ctrl_iface_dir) + os_strlen(ifname) + 2;
3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		cfile = os_malloc(flen);
3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (cfile == NULL)
3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cfile, flen, "%s/%s", ctrl_iface_dir,
3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  ifname);
3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (res < 0 || res >= flen) {
3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(cfile);
3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctrl_conn = wpa_ctrl_open(cfile);
3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL) {
3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(cfile);
3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (attach && interactive)
3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		mon_conn = wpa_ctrl_open(cfile);
3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		mon_conn = NULL;
3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(cfile);
3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */
3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (mon_conn) {
3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpa_ctrl_attach(mon_conn) == 0) {
3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_attached = 1;
3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (interactive)
3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				eloop_register_read_sock(
3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					wpa_ctrl_get_fd(mon_conn),
3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					wpa_cli_mon_receive, NULL, NULL);
3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Warning: Failed to attach to "
3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       "wpa_supplicant.\n");
3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_close_connection(void)
3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL)
3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_cli_attached) {
3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_ctrl_detach(interactive ? mon_conn : ctrl_conn);
3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_attached = 0;
3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_ctrl_close(ctrl_conn);
3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctrl_conn = NULL;
3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (mon_conn) {
3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		eloop_unregister_read_sock(wpa_ctrl_get_fd(mon_conn));
3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_ctrl_close(mon_conn);
3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		mon_conn = NULL;
3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_msg_cb(char *msg, size_t len)
3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("%s\n", msg);
3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int _wpa_ctrl_command(struct wpa_ctrl *ctrl, char *cmd, int print)
4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
401c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#ifdef ANDROID
402c97d8bf1d6959387a528c901eaf9c0bff47da853Dmitry Shmidt	char buf[4096];
403c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#else
404c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	char buf[2048];
405c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#endif
4062fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt#if defined(CONFIG_P2P) && defined(ANDROID_P2P)
4072fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt	char _cmd[256];
4082fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt#endif
4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret;
4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL) {
4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Not connected to wpa_supplicant - command dropped.\n");
4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4162fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt#if defined(CONFIG_P2P) && defined(ANDROID_P2P)
4172fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt	if (redirect_interface) {
4182fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt		char *arg;
4192fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt		arg = os_strchr(cmd, ' ');
4202fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt		if (arg) {
4212fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt			*arg++ = '\0';
4222fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt			ret = os_snprintf(_cmd, sizeof(_cmd), "%s %s %s", cmd, redirect_interface, arg);
4232fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt		}
4242fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt		else {
4252fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt			ret = os_snprintf(_cmd, sizeof(_cmd), "%s %s", cmd, redirect_interface);
4262fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt		}
4272fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt		cmd = _cmd;
4282fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt		os_free(redirect_interface);
4292fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt		redirect_interface = NULL;
4302fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt	}
4312fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt#endif
4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = sizeof(buf) - 1;
4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len,
4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       wpa_cli_msg_cb);
4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret == -2) {
4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command timed out.\n", cmd);
4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -2;
4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (ret < 0) {
4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command failed.\n", cmd);
4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (print) {
4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		buf[len] = '\0';
4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("%s", buf);
4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (interactive && len > 0 && buf[len - 1] != '\n')
4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("\n");
4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_ctrl_command(struct wpa_ctrl *ctrl, char *cmd)
4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return _wpa_ctrl_command(ctrl, cmd, 1);
4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_status(struct wpa_ctrl *ctrl, int argc, char *argv[])
4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (argc > 0 && os_strcmp(argv[0], "verbose") == 0)
4611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return wpa_ctrl_command(ctrl, "STATUS-VERBOSE");
4621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (argc > 0 && os_strcmp(argv[0], "wps") == 0)
4631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return wpa_ctrl_command(ctrl, "STATUS-WPS");
4641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpa_ctrl_command(ctrl, "STATUS");
4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ping(struct wpa_ctrl *ctrl, int argc, char *argv[])
4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "PING");
4718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_relog(struct wpa_ctrl *ctrl, int argc, char *argv[])
4758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "RELOG");
4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_note(struct wpa_ctrl *ctrl, int argc, char *argv[])
4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret;
4848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0)
4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(cmd, sizeof(cmd), "NOTE %s", argv[0]);
4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || (size_t) ret >= sizeof(cmd))
4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_mib(struct wpa_ctrl *ctrl, int argc, char *argv[])
4948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "MIB");
4968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_pmksa(struct wpa_ctrl *ctrl, int argc, char *argv[])
5008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "PMKSA");
5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_help(struct wpa_ctrl *ctrl, int argc, char *argv[])
5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	print_help();
5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_license(struct wpa_ctrl *ctrl, int argc, char *argv[])
5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("%s\n\n%s\n", wpa_cli_version, wpa_cli_full_license);
5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_quit(struct wpa_ctrl *ctrl, int argc, char *argv[])
5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_quit = 1;
5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (interactive)
5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		eloop_terminate();
5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_show_variables(void)
5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("set variables:\n"
5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  EAPOL::heldPeriod (EAPOL state machine held period, "
5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "in seconds)\n"
5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  EAPOL::authPeriod (EAPOL state machine authentication "
5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "period, in seconds)\n"
5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  EAPOL::startPeriod (EAPOL state machine start period, in "
5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "seconds)\n"
5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  EAPOL::maxStart (EAPOL state machine maximum start "
5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "attempts)\n");
5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("  dot11RSNAConfigPMKLifetime (WPA/WPA2 PMK lifetime in "
5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "seconds)\n"
5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  dot11RSNAConfigPMKReauthThreshold (WPA/WPA2 reauthentication"
5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       " threshold\n\tpercentage)\n"
5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  dot11RSNAConfigSATimeout (WPA/WPA2 timeout for completing "
5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "security\n\tassociation in seconds)\n");
5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_set(struct wpa_ctrl *ctrl, int argc, char *argv[])
5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0) {
5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_show_variables();
5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (argc != 1 && argc != 2) {
5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid SET command: needs two arguments (variable "
5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "name and value)\n");
5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (argc == 1)
5651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "SET %s ", argv[0]);
5661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	else
5671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "SET %s %s",
5681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				  argv[0], argv[1]);
5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long SET command.\n");
5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_get(struct wpa_ctrl *ctrl, int argc, char *argv[])
5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid GET command: need one argument (variable "
5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "name)\n");
5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "GET %s", argv[0]);
5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
5908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long GET command.\n");
5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_logoff(struct wpa_ctrl *ctrl, int argc, char *argv[])
5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "LOGOFF");
6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_logon(struct wpa_ctrl *ctrl, int argc, char *argv[])
6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "LOGON");
6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_reassociate(struct wpa_ctrl *ctrl, int argc,
6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "REASSOCIATE");
6138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_preauthenticate(struct wpa_ctrl *ctrl, int argc,
6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid PREAUTH command: needs one argument "
6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(BSSID)\n");
6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "PREAUTH %s", argv[0]);
6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long PREAUTH command.\n");
6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ap_scan(struct wpa_ctrl *ctrl, int argc, char *argv[])
6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid AP_SCAN command: needs one argument (ap_scan "
6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "value)\n");
6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "AP_SCAN %s", argv[0]);
6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long AP_SCAN command.\n");
6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_scan_interval(struct wpa_ctrl *ctrl, int argc,
6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid SCAN_INTERVAL command: needs one argument "
6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "scan_interval value)\n");
6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "SCAN_INTERVAL %s", argv[0]);
6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long SCAN_INTERVAL command.\n");
6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bss_expire_age(struct wpa_ctrl *ctrl, int argc,
6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid BSS_EXPIRE_AGE command: needs one argument "
6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(bss_expire_age value)\n");
6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "BSS_EXPIRE_AGE %s", argv[0]);
6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long BSS_EXPIRE_AGE command.\n");
6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bss_expire_count(struct wpa_ctrl *ctrl, int argc,
6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				        char *argv[])
6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid BSS_EXPIRE_COUNT command: needs one argument "
7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(bss_expire_count value)\n");
7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "BSS_EXPIRE_COUNT %s", argv[0]);
7088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
7098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long BSS_EXPIRE_COUNT command.\n");
7108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_stkstart(struct wpa_ctrl *ctrl, int argc,
7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				char *argv[])
7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
7208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
7238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid STKSTART command: needs one argument "
7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(Peer STA MAC address)\n");
7258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
7268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "STKSTART %s", argv[0]);
7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
7308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long STKSTART command.\n");
7318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
7328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
7348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ft_ds(struct wpa_ctrl *ctrl, int argc, char *argv[])
7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
7408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
7418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
7438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid FT_DS command: needs one argument "
7448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(Target AP MAC address)\n");
7458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "FT_DS %s", argv[0]);
7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long FT_DS command.\n");
7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
7528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
7548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_pbc(struct wpa_ctrl *ctrl, int argc, char *argv[])
7588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
7608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
7618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0) {
7638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Any BSSID */
7648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_ctrl_command(ctrl, "WPS_PBC");
7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Specific BSSID */
7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "WPS_PBC %s", argv[0]);
7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
7708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_PBC command.\n");
7718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
7728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
7748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_pin(struct wpa_ctrl *ctrl, int argc, char *argv[])
7788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
7818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0) {
7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_PIN command: need one or two arguments:\n"
7848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- BSSID: use 'any' to select any\n"
7858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- PIN: optional, used only with devices that have no "
7868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "display\n");
7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
7888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 1) {
7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Use dynamically generated PIN (returned as reply) */
7928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_PIN %s", argv[0]);
7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long WPS_PIN command.\n");
7958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
7968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
7978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_ctrl_command(ctrl, cmd);
7988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Use hardcoded PIN from a label */
8018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "WPS_PIN %s %s", argv[0], argv[1]);
8028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
8038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_PIN command.\n");
8048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
8078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_check_pin(struct wpa_ctrl *ctrl, int argc,
8118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
8128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
8148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
8158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1 && argc != 2) {
8178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_CHECK_PIN command: needs one argument:\n"
8188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- PIN to be verified\n");
8198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
8208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 2)
8238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_CHECK_PIN %s %s",
8248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
8258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
8268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_CHECK_PIN %s",
8278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0]);
8288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
8298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_CHECK_PIN command.\n");
8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
8318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
8338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_cancel(struct wpa_ctrl *ctrl, int argc,
8378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
8388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "WPS_CANCEL");
8408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS_OOB
8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_oob(struct wpa_ctrl *ctrl, int argc, char *argv[])
8458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
8478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
8488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 3 && argc != 4) {
8508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_OOB command: need three or four "
8518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments:\n"
8528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- DEV_TYPE: use 'ufd' or 'nfc'\n"
8538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- PATH: path of OOB device like '/mnt'\n"
8548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- METHOD: OOB method 'pin-e' or 'pin-r', "
8558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "'cred'\n"
8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- DEV_NAME: (only for NFC) device name like "
8578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "'pn531'\n");
8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
8598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 3)
8628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_OOB %s %s %s",
8638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2]);
8648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
8658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_OOB %s %s %s %s",
8668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2], argv[3]);
8678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
8688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_OOB command.\n");
8698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
8708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
8728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS_OOB */
8748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_reg(struct wpa_ctrl *ctrl, int argc, char *argv[])
8778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
8798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
8808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 2)
8828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_REG %s %s",
8838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
8848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else if (argc == 5 || argc == 6) {
8858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char ssid_hex[2 * 32 + 1];
8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char key_hex[2 * 64 + 1];
8878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int i;
8888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssid_hex[0] = '\0';
8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (i = 0; i < 32; i++) {
8918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (argv[2][i] == '\0')
8928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
8938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_snprintf(&ssid_hex[i * 2], 3, "%02x", argv[2][i]);
8948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
8958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_hex[0] = '\0';
8978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (argc == 6) {
8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			for (i = 0; i < 64; i++) {
8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (argv[5][i] == '\0')
9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					break;
9018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				os_snprintf(&key_hex[i * 2], 3, "%02x",
9028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    argv[5][i]);
9038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
9048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
9058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
9078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "WPS_REG %s %s %s %s %s %s",
9088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], ssid_hex, argv[3], argv[4],
9098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  key_hex);
9108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
9118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_REG command: need two arguments:\n"
9128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- BSSID of the target AP\n"
9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- AP PIN\n");
9148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Alternatively, six arguments can be used to "
9158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "reconfigure the AP:\n"
9168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- BSSID of the target AP\n"
9178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- AP PIN\n"
9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new SSID\n"
9198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new auth (OPEN, WPAPSK, WPA2PSK)\n"
9208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new encr (NONE, WEP, TKIP, CCMP)\n"
9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new key\n");
9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_REG command.\n");
9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
9308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_ap_pin(struct wpa_ctrl *ctrl, int argc,
9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
9388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1) {
9408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_AP_PIN command: needs at least one "
9418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "argument\n");
9428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc > 2)
9468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_AP_PIN %s %s %s",
9478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2]);
9488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else if (argc > 1)
9498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_AP_PIN %s %s",
9508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
9518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
9528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_AP_PIN %s",
9538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0]);
9548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
9558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_AP_PIN command.\n");
9568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
9598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_start(struct wpa_ctrl *ctrl, int argc,
9638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    char *argv[])
9648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
9668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc > 0) {
9678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(cmd, sizeof(cmd), "WPS_ER_START %s", argv[0]);
9688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_ctrl_command(ctrl, cmd);
9698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "WPS_ER_START");
9718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_stop(struct wpa_ctrl *ctrl, int argc,
9758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
9768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "WPS_ER_STOP");
9788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_pin(struct wpa_ctrl *ctrl, int argc,
9838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
9868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_ER_PIN command: need at least two "
9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments:\n"
9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- UUID: use 'any' to select any\n"
9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- PIN: Enrollee PIN\n"
9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "optional: - Enrollee MAC address\n");
9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc > 2)
9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_ER_PIN %s %s %s",
9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2]);
10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_ER_PIN %s %s",
10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_ER_PIN command.\n");
10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_pbc(struct wpa_ctrl *ctrl, int argc,
10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_ER_PBC command: need one argument:\n"
10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- UUID: Specify the Enrollee\n");
10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "WPS_ER_PBC %s",
10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0]);
10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_ER_PBC command.\n");
10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
10308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_learn(struct wpa_ctrl *ctrl, int argc,
10348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    char *argv[])
10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
10368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
10378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2) {
10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_ER_LEARN command: need two arguments:\n"
10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- UUID: specify which AP to use\n"
10428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- PIN: AP PIN\n");
10438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "WPS_ER_LEARN %s %s",
10478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
10488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
10498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_ER_LEARN command.\n");
10508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_set_config(struct wpa_ctrl *ctrl, int argc,
10578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 char *argv[])
10588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
10608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
10618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2) {
10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_ER_SET_CONFIG command: need two "
10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments:\n"
10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- UUID: specify which AP to use\n"
10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- Network configuration id\n");
10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "WPS_ER_SET_CONFIG %s %s",
10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
10738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_ER_SET_CONFIG command.\n");
10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_config(struct wpa_ctrl *ctrl, int argc,
10818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
10828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
10858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 5 || argc == 6) {
10878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char ssid_hex[2 * 32 + 1];
10888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char key_hex[2 * 64 + 1];
10898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int i;
10908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssid_hex[0] = '\0';
10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (i = 0; i < 32; i++) {
10938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (argv[2][i] == '\0')
10948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
10958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_snprintf(&ssid_hex[i * 2], 3, "%02x", argv[2][i]);
10968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_hex[0] = '\0';
10998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (argc == 6) {
11008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			for (i = 0; i < 64; i++) {
11018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (argv[5][i] == '\0')
11028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					break;
11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				os_snprintf(&key_hex[i * 2], 3, "%02x",
11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    argv[5][i]);
11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "WPS_ER_CONFIG %s %s %s %s %s %s",
11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], ssid_hex, argv[3], argv[4],
11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  key_hex);
11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_ER_CONFIG command: need six arguments:\n"
11148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- AP UUID\n"
11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- AP PIN\n"
11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new SSID\n"
11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new auth (OPEN, WPAPSK, WPA2PSK)\n"
11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new encr (NONE, WEP, TKIP, CCMP)\n"
11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new key\n");
11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_ER_CONFIG command.\n");
11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ibss_rsn(struct wpa_ctrl *ctrl, int argc, char *argv[])
11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid IBSS_RSN command: needs one argument "
11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(Peer STA MAC address)\n");
11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "IBSS_RSN %s", argv[0]);
11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long IBSS_RSN command.\n");
11458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_level(struct wpa_ctrl *ctrl, int argc, char *argv[])
11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
11538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
11578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid LEVEL command: needs one argument (debug "
11588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "level)\n");
11598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "LEVEL %s", argv[0]);
11628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long LEVEL command.\n");
11648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_identity(struct wpa_ctrl *ctrl, int argc, char *argv[])
11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
11728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
11748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
11768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid IDENTITY command: needs two arguments "
11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and identity)\n");
11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "IDENTITY-%s:%s",
11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long IDENTITY command.\n");
11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
11928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long IDENTITY command.\n");
11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
12008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_password(struct wpa_ctrl *ctrl, int argc, char *argv[])
12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
12068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
12078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid PASSWORD command: needs two arguments "
12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and password)\n");
12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
12158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PASSWORD-%s:%s",
12178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
12188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
12198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long PASSWORD command.\n");
12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long PASSWORD command.\n");
12278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
12288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
12338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_new_password(struct wpa_ctrl *ctrl, int argc,
12378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    char *argv[])
12388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
12398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
12408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
12418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
12438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid NEW_PASSWORD command: needs two arguments "
12448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and password)\n");
12458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
12498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
12508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "NEW_PASSWORD-%s:%s",
12518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
12528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
12538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long NEW_PASSWORD command.\n");
12548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
12608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long NEW_PASSWORD command.\n");
12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
12648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
12678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_pin(struct wpa_ctrl *ctrl, int argc, char *argv[])
12718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
12728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
12738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
12748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
12768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid PIN command: needs two arguments "
12778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and pin)\n");
12788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
12828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
12838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PIN-%s:%s",
12848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
12868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long PIN command.\n");
12878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
12938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long PIN command.\n");
12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
12998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_otp(struct wpa_ctrl *ctrl, int argc, char *argv[])
13038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
13058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
13068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
13088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid OTP command: needs two arguments (network "
13098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "id and password)\n");
13108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
13118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
13158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "OTP-%s:%s",
13168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
13188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long OTP command.\n");
13198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
13208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
13228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
13238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
13248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
13258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long OTP command.\n");
13268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
13278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
13288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
13298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
13328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_passphrase(struct wpa_ctrl *ctrl, int argc,
13368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
13378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
13398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
13408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
13428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid PASSPHRASE command: needs two arguments "
13438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and passphrase)\n");
13448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
13458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
13488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
13498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PASSPHRASE-%s:%s",
13508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
13518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
13528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long PASSPHRASE command.\n");
13538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
13548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
13568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
13578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
13588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
13598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long PASSPHRASE command.\n");
13608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
13618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
13628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
13638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
13668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bssid(struct wpa_ctrl *ctrl, int argc, char *argv[])
13708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
13728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
13738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
13758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid BSSID command: needs two arguments (network "
13768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "id and BSSID)\n");
13778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
13788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
13818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
13828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, "BSSID");
13838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
13848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long BSSID command.\n");
13858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
13868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
13888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < argc; i++) {
13898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
13908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
13918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long BSSID command.\n");
13928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
13938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
13948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
13958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
13988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1401696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidtstatic int wpa_cli_cmd_blacklist(struct wpa_ctrl *ctrl, int argc, char *argv[])
1402696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt{
1403696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	char cmd[256], *pos, *end;
1404696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	int i, ret;
1405696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
1406696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	end = cmd + sizeof(cmd);
1407696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	pos = cmd;
1408696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	ret = os_snprintf(pos, end - pos, "BLACKLIST");
1409696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
1410696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt		printf("Too long BLACKLIST command.\n");
1411696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt		return -1;
1412696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	}
1413696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	pos += ret;
1414696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	for (i = 0; i < argc; i++) {
1415696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
1416696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
1417696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt			printf("Too long BLACKLIST command.\n");
1418696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt			return -1;
1419696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt		}
1420696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt		pos += ret;
1421696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	}
1422696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
1423696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
1424696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt}
1425696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
1426696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
1427696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidtstatic int wpa_cli_cmd_log_level(struct wpa_ctrl *ctrl, int argc, char *argv[])
1428696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt{
1429696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	char cmd[256], *pos, *end;
1430696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	int i, ret;
1431696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
1432696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	end = cmd + sizeof(cmd);
1433696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	pos = cmd;
1434696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	ret = os_snprintf(pos, end - pos, "LOG_LEVEL");
1435696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
1436696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt		printf("Too long LOG_LEVEL command.\n");
1437696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt		return -1;
1438696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	}
1439696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	pos += ret;
1440696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	for (i = 0; i < argc; i++) {
1441696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
1442696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
1443696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt			printf("Too long LOG_LEVEL command.\n");
1444696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt			return -1;
1445696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt		}
1446696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt		pos += ret;
1447696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	}
1448696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
1449696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
1450696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt}
1451696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
1452696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
14538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_list_networks(struct wpa_ctrl *ctrl, int argc,
14548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
14558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "LIST_NETWORKS");
14578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_select_network(struct wpa_ctrl *ctrl, int argc,
14618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
14628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[32];
14648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
14658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1) {
14678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid SELECT_NETWORK command: needs one argument "
14688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id)\n");
14698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
14708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "SELECT_NETWORK %s", argv[0]);
14738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
14748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
14758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
14768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
14788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_enable_network(struct wpa_ctrl *ctrl, int argc,
14828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
14838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[32];
14858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
14868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1) {
14888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid ENABLE_NETWORK command: needs one argument "
14898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id)\n");
14908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
14918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "ENABLE_NETWORK %s", argv[0]);
14948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
14958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
14968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
14978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
14998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_disable_network(struct wpa_ctrl *ctrl, int argc,
15038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
15048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[32];
15068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
15078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1) {
15098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid DISABLE_NETWORK command: needs one argument "
15108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id)\n");
15118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
15128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "DISABLE_NETWORK %s", argv[0]);
15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
15168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
15178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
15188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
15208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_add_network(struct wpa_ctrl *ctrl, int argc,
15248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
15258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "ADD_NETWORK");
15278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_remove_network(struct wpa_ctrl *ctrl, int argc,
15318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
15328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[32];
15348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
15358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1) {
15378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid REMOVE_NETWORK command: needs one argument "
15388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id)\n");
15398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
15408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "REMOVE_NETWORK %s", argv[0]);
15438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
15448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
15458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
15468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
15488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_show_network_variables(void)
15528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("set_network variables:\n"
15548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  ssid (network name, SSID)\n"
15558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  psk (WPA passphrase or pre-shared key)\n"
15568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  key_mgmt (key management protocol)\n"
15578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  identity (EAP identity)\n"
15588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  password (EAP password)\n"
15598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  ...\n"
15608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "\n"
15618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "Note: Values are entered in the same format as the "
15628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "configuration file is using,\n"
15638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "i.e., strings values need to be inside double quotation "
15648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "marks.\n"
15658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "For example: set_network 1 ssid \"network name\"\n"
15668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "\n"
15678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "Please see wpa_supplicant.conf documentation for full list "
15688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "of\navailable variables.\n");
15698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_set_network(struct wpa_ctrl *ctrl, int argc,
15738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
15748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
15768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
15778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0) {
15798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_show_network_variables();
15808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
15818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 3) {
15848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid SET_NETWORK command: needs three arguments\n"
15858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id, variable name, and value)\n");
15868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
15878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "SET_NETWORK %s %s %s",
15908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1], argv[2]);
15918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
15928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long SET_NETWORK command.\n");
15938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
15948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
15968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_get_network(struct wpa_ctrl *ctrl, int argc,
16008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
16018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
16038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
16048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0) {
16068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_show_network_variables();
16078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
16088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2) {
16118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid GET_NETWORK command: needs two arguments\n"
16128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and variable name)\n");
16138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
16148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "GET_NETWORK %s %s",
16178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
16188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
16198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long GET_NETWORK command.\n");
16208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
16218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
16238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_disconnect(struct wpa_ctrl *ctrl, int argc,
16278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
16288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "DISCONNECT");
16308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_reconnect(struct wpa_ctrl *ctrl, int argc,
16348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
16358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "RECONNECT");
16378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_save_config(struct wpa_ctrl *ctrl, int argc,
16418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
16428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "SAVE_CONFIG");
16448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_scan(struct wpa_ctrl *ctrl, int argc, char *argv[])
16488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "SCAN");
16508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_scan_results(struct wpa_ctrl *ctrl, int argc,
16548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    char *argv[])
16558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "SCAN_RESULTS");
16578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bss(struct wpa_ctrl *ctrl, int argc, char *argv[])
16618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[64];
16638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
16648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1665f2df2f2f5318f4ce3046b93207fada30fe694069Dmitry Shmidt	if (argc < 1) {
1666f2df2f2f5318f4ce3046b93207fada30fe694069Dmitry Shmidt		printf("Invalid BSS command: need at least one argument"
1667f2df2f2f5318f4ce3046b93207fada30fe694069Dmitry Shmidt		       "(index or BSSID)\n");
16688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
16698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1671f2df2f2f5318f4ce3046b93207fada30fe694069Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "BSS %s\t%s\t%s", argv[0],
1672f2df2f2f5318f4ce3046b93207fada30fe694069Dmitry Shmidt			  argc > 1 ? argv[1] : "", argc > 2 ? argv[2] : "");
1673f2df2f2f5318f4ce3046b93207fada30fe694069Dmitry Shmidt
16748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
16758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
16768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
16778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
16798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** wpa_cli_complete_bss(const char *str, int pos)
16831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
16841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
16851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char **res = NULL;
16861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
16871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	switch (arg) {
16881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	case 1:
16891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		res = cli_txt_list_array(&bsses);
16901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		break;
16911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
16921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
16931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
16941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
16951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
16961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
16978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_get_capability(struct wpa_ctrl *ctrl, int argc,
16988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
16998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[64];
17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
17028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1 || argc > 2) {
17048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid GET_CAPABILITY command: need either one or "
17058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "two arguments\n");
17068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
17078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if ((argc == 2) && os_strcmp(argv[1], "strict") != 0) {
17108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid GET_CAPABILITY command: second argument, "
17118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "if any, must be 'strict'\n");
17128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
17138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "GET_CAPABILITY %s%s", argv[0],
17168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  (argc == 2) ? " strict" : "");
17178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
17188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
17198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
17208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
17228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_list_interfaces(struct wpa_ctrl *ctrl)
17268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("Available interfaces:\n");
17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "INTERFACES");
17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface(struct wpa_ctrl *ctrl, int argc, char *argv[])
17338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1) {
17358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_list_interfaces(ctrl);
17368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
17378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_close_connection();
17408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(ctrl_ifname);
17418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctrl_ifname = os_strdup(argv[0]);
17428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_cli_open_connection(ctrl_ifname, 1)) {
17448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Connected to interface '%s.\n", ctrl_ifname);
17458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
17468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Could not connect to interface '%s' - re-trying\n",
17478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       ctrl_ifname);
17488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
17508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_reconfigure(struct wpa_ctrl *ctrl, int argc,
17548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
17558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "RECONFIGURE");
17578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_terminate(struct wpa_ctrl *ctrl, int argc,
17618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 char *argv[])
17628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "TERMINATE");
17648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface_add(struct wpa_ctrl *ctrl, int argc,
17688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
17698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
17718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
17728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1) {
17748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid INTERFACE_ADD command: needs at least one "
17758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "argument (interface name)\n"
17768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "All arguments: ifname confname driver ctrl_interface "
17778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "driver_param bridge_name\n");
17788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
17798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/*
17828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * INTERFACE_ADD <ifname>TAB<confname>TAB<driver>TAB<ctrl_interface>TAB
17838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * <driver_param>TAB<bridge_name>
17848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
17858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd),
17868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  "INTERFACE_ADD %s\t%s\t%s\t%s\t%s\t%s",
17878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0],
17888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argc > 1 ? argv[1] : "", argc > 2 ? argv[2] : "",
17898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argc > 3 ? argv[3] : "", argc > 4 ? argv[4] : "",
17908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argc > 5 ? argv[5] : "");
17918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
17928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
17938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
17948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
17958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface_remove(struct wpa_ctrl *ctrl, int argc,
17998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					char *argv[])
18008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[128];
18028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
18038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
18058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid INTERFACE_REMOVE command: needs one argument "
18068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(interface name)\n");
18078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
18088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "INTERFACE_REMOVE %s", argv[0]);
18118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
18128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
18138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
18148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
18158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface_list(struct wpa_ctrl *ctrl, int argc,
18198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
18208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "INTERFACE_LIST");
18228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_AP
18268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_sta(struct wpa_ctrl *ctrl, int argc, char *argv[])
18278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char buf[64];
18298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
18308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid 'sta' command - exactly one argument, STA "
18318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "address, is required.\n");
18328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
18338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_snprintf(buf, sizeof(buf), "STA %s", argv[0]);
18358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, buf);
18368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_ctrl_command_sta(struct wpa_ctrl *ctrl, char *cmd,
18408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				char *addr, size_t addr_len)
18418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char buf[4096], *pos;
18438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
18448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret;
18458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL) {
18478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Not connected to hostapd - command dropped.\n");
18488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
18498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = sizeof(buf) - 1;
18518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = wpa_ctrl_request(ctrl, cmd, strlen(cmd), buf, &len,
18528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       wpa_cli_msg_cb);
18538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret == -2) {
18548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command timed out.\n", cmd);
18558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -2;
18568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (ret < 0) {
18578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command failed.\n", cmd);
18588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
18598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	buf[len] = '\0';
18628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (memcmp(buf, "FAIL", 4) == 0)
18638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
18648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("%s", buf);
18658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = buf;
18678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*pos != '\0' && *pos != '\n')
18688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos++;
18698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	*pos = '\0';
18708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_strlcpy(addr, buf, addr_len);
18718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
18728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_all_sta(struct wpa_ctrl *ctrl, int argc, char *argv[])
18768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char addr[32], cmd[64];
18788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_ctrl_command_sta(ctrl, "STA-FIRST", addr, sizeof(addr)))
18808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
18818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	do {
18828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(cmd, sizeof(cmd), "STA-NEXT %s", addr);
18838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} while (wpa_ctrl_command_sta(ctrl, cmd, addr, sizeof(addr)) == 0);
18848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
18868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_AP */
18888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_suspend(struct wpa_ctrl *ctrl, int argc, char *argv[])
18918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "SUSPEND");
18938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_resume(struct wpa_ctrl *ctrl, int argc, char *argv[])
18978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "RESUME");
18998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_drop_sa(struct wpa_ctrl *ctrl, int argc, char *argv[])
19038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "DROP_SA");
19058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_roam(struct wpa_ctrl *ctrl, int argc, char *argv[])
19098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[128];
19118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
19128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
19148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid ROAM command: needs one argument "
19158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(target AP's BSSID)\n");
19168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "ROAM %s", argv[0]);
19208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
19218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long ROAM command.\n");
19228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
19258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P
19298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_find(struct wpa_ctrl *ctrl, int argc, char *argv[])
19318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[128];
19338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
19348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0)
19368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_ctrl_command(ctrl, "P2P_FIND");
19378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1938c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	if (argc > 2)
1939c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_FIND %s %s %s",
1940c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt				  argv[0], argv[1], argv[2]);
1941c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	else if (argc > 1)
19428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_FIND %s %s",
19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
19458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_FIND %s", argv[0]);
19468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
19478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
19498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
19508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_stop_find(struct wpa_ctrl *ctrl, int argc,
19548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
19558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_STOP_FIND");
19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_connect(struct wpa_ctrl *ctrl, int argc,
19618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
19628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[128];
19648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
19658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_CONNECT command: needs at least two "
19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments (address and pbc/PIN)\n");
19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc > 4)
19738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
19748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_CONNECT %s %s %s %s %s",
19758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2], argv[3],
19768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[4]);
19778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else if (argc > 3)
19788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_CONNECT %s %s %s %s",
19798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2], argv[3]);
19808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else if (argc > 2)
19818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_CONNECT %s %s %s",
19828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2]);
19838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
19848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_CONNECT %s %s",
19858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
19868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
19878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
19898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
19908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** wpa_cli_complete_p2p_connect(const char *str, int pos)
19941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
19951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
19961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char **res = NULL;
19971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
19981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	switch (arg) {
19991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	case 1:
20001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		res = cli_txt_list_array(&p2p_peers);
20011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		break;
20021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
20031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
20041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
20051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
20061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
20071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
20088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_listen(struct wpa_ctrl *ctrl, int argc,
20098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
20108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
20118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[128];
20128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
20138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0)
20158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_ctrl_command(ctrl, "P2P_LISTEN");
20168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "P2P_LISTEN %s", argv[0]);
20188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
20198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
20208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
20218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
20228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_group_remove(struct wpa_ctrl *ctrl, int argc,
20268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					char *argv[])
20278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
20288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[128];
20298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
20308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
20328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_GROUP_REMOVE command: needs one argument "
20338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(interface name)\n");
20348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
20358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
20368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "P2P_GROUP_REMOVE %s", argv[0]);
20388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
20398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
20408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
20418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
20428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** wpa_cli_complete_p2p_group_remove(const char *str, int pos)
20461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
20471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
20481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char **res = NULL;
20491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
20501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	switch (arg) {
20511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	case 1:
20521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		res = cli_txt_list_array(&p2p_groups);
20531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		break;
20541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
20551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
20561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
20571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
20581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
20591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
20608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_group_add(struct wpa_ctrl *ctrl, int argc,
20618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					char *argv[])
20628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
20638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[128];
20648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
20658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0)
20678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_ctrl_command(ctrl, "P2P_GROUP_ADD");
20688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2069c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt	if (argc > 1)
2070c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_GROUP_ADD %s %s",
2071c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt				  argv[0], argv[1]);
2072c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt	else
2073c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_GROUP_ADD %s",
2074c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt				  argv[0]);
20758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
20768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
20778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
20788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
20798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_prov_disc(struct wpa_ctrl *ctrl, int argc,
20838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
20848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
20858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[128];
20868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
20878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (argc != 2 && argc != 3) {
20891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		printf("Invalid P2P_PROV_DISC command: needs at least "
20901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		       "two arguments, address and config method\n"
20911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		       "(display, keypad, or pbc) and an optional join\n");
20928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
20938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
20948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (argc == 3)
20961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_PROV_DISC %s %s %s",
20971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				  argv[0], argv[1], argv[2]);
20981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	else
20991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_PROV_DISC %s %s",
21001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				  argv[0], argv[1]);
21018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
21028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
21038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
21048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
21058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_get_passphrase(struct wpa_ctrl *ctrl, int argc,
21098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  char *argv[])
21108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_GET_PASSPHRASE");
21128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_req(struct wpa_ctrl *ctrl, int argc,
21168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 char *argv[])
21178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[4096];
21198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
21208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2 && argc != 4) {
21228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SERV_DISC_REQ command: needs two "
21238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments (address and TLVs) or four arguments "
21248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(address, \"upnp\", version, search target "
21258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(SSDP ST:)\n");
21268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
21278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
21288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 4)
21308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
21318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_SERV_DISC_REQ %s %s %s %s",
21328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2], argv[3]);
21338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
21348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_SERV_DISC_REQ %s %s",
21358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
21368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
21378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
21388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
21398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
21408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_cancel_req(struct wpa_ctrl *ctrl,
21448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						int argc, char *argv[])
21458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[128];
21478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
21488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
21508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SERV_DISC_CANCEL_REQ command: needs one "
21518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "argument (pending request identifier)\n");
21528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
21538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
21548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "P2P_SERV_DISC_CANCEL_REQ %s",
21568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0]);
21578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
21588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
21598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
21608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
21618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_resp(struct wpa_ctrl *ctrl, int argc,
21658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  char *argv[])
21668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[4096];
21688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
21698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 4) {
21718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SERV_DISC_RESP command: needs four "
21728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments (freq, address, dialog token, and TLVs)\n");
21738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
21748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
21758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "P2P_SERV_DISC_RESP %s %s %s %s",
21778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1], argv[2], argv[3]);
21788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
21798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
21808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
21818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
21828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_update(struct wpa_ctrl *ctrl, int argc,
21868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  char *argv[])
21878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_SERVICE_UPDATE");
21898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_external(struct wpa_ctrl *ctrl,
21938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      int argc, char *argv[])
21948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[128];
21968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
21978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
21998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SERV_DISC_EXTERNAL command: needs one "
22008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "argument (external processing: 0/1)\n");
22018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
22028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
22038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "P2P_SERV_DISC_EXTERNAL %s",
22058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0]);
22068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
22078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
22088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
22098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
22108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
22118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_flush(struct wpa_ctrl *ctrl, int argc,
22148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 char *argv[])
22158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
22168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_SERVICE_FLUSH");
22178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
22188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_add(struct wpa_ctrl *ctrl, int argc,
22218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
22228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
22238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[4096];
22248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
22258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 3 && argc != 4) {
22278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SERVICE_ADD command: needs three or four "
22288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments\n");
22298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
22308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
22318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 4)
22338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
22348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_SERVICE_ADD %s %s %s %s",
22358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2], argv[3]);
22368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
22378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
22388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_SERVICE_ADD %s %s %s",
22398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2]);
22408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
22418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
22428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
22438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
22448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
22458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_del(struct wpa_ctrl *ctrl, int argc,
22488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
22498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
22508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[4096];
22518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
22528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2 && argc != 3) {
22548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SERVICE_DEL command: needs two or three "
22558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments\n");
22568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
22578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
22588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 3)
22608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
22618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_SERVICE_DEL %s %s %s",
22628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2]);
22638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
22648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
22658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_SERVICE_DEL %s %s",
22668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
22678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
22688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
22698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
22708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
22718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
22728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_reject(struct wpa_ctrl *ctrl,
22758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  int argc, char *argv[])
22768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
22778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[128];
22788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
22798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
22818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_REJECT command: needs one argument "
22828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(peer address)\n");
22838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
22848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
22858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "P2P_REJECT %s", argv[0]);
22878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
22888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
22898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
22908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
22918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
22928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_invite(struct wpa_ctrl *ctrl,
22958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  int argc, char *argv[])
22968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
22978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[128];
22988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
22998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1) {
23018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_INVITE command: needs at least one "
23028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "argument\n");
23038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
23048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
23058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc > 2)
23078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_INVITE %s %s %s",
23088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2]);
23098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else if (argc > 1)
23108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_INVITE %s %s",
23118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
23128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
23138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_INVITE %s", argv[0]);
23148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
23158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
23168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
23178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
23188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_peer(struct wpa_ctrl *ctrl, int argc, char *argv[])
23228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
23238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char buf[64];
23248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
23258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid 'p2p_peer' command - exactly one argument, "
23268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "P2P peer device address, is required.\n");
23278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
23288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
23298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_snprintf(buf, sizeof(buf), "P2P_PEER %s", argv[0]);
23308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, buf);
23318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** wpa_cli_complete_p2p_peer(const char *str, int pos)
23351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
23361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
23371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char **res = NULL;
23381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
23391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	switch (arg) {
23401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	case 1:
23411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		res = cli_txt_list_array(&p2p_peers);
23421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		break;
23431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
23441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
23451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
23461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
23471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
23481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
23498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_ctrl_command_p2p_peer(struct wpa_ctrl *ctrl, char *cmd,
23508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *addr, size_t addr_len,
23518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     int discovered)
23528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
23538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char buf[4096], *pos;
23548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
23558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret;
23568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL)
23588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
23598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = sizeof(buf) - 1;
23608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = wpa_ctrl_request(ctrl, cmd, strlen(cmd), buf, &len,
23618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       wpa_cli_msg_cb);
23628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret == -2) {
23638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command timed out.\n", cmd);
23648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -2;
23658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (ret < 0) {
23668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command failed.\n", cmd);
23678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
23688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
23698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	buf[len] = '\0';
23718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (memcmp(buf, "FAIL", 4) == 0)
23728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
23738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = buf;
23758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*pos != '\0' && *pos != '\n')
23768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos++;
23778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	*pos++ = '\0';
23788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_strlcpy(addr, buf, addr_len);
23798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!discovered || os_strstr(pos, "[PROBE_REQ_ONLY]") == NULL)
23808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("%s\n", addr);
23818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
23828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_peers(struct wpa_ctrl *ctrl, int argc, char *argv[])
23868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
23878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char addr[32], cmd[64];
23888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int discovered;
23898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	discovered = argc > 0 && os_strcmp(argv[0], "discovered") == 0;
23918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_ctrl_command_p2p_peer(ctrl, "P2P_PEER FIRST",
23938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      addr, sizeof(addr), discovered))
23941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return -1;
23958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	do {
23968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(cmd, sizeof(cmd), "P2P_PEER NEXT-%s", addr);
23978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} while (wpa_ctrl_command_p2p_peer(ctrl, cmd, addr, sizeof(addr),
23988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			 discovered) == 0);
23998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return 0;
24018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
24028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_set(struct wpa_ctrl *ctrl, int argc, char *argv[])
24058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
24068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
24078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
24088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2) {
24108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SET command: needs two arguments (field, "
24118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "value)\n");
24128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
24138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
24148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "P2P_SET %s %s", argv[0], argv[1]);
24168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
24178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
24188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
24198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
24208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
24218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_flush(struct wpa_ctrl *ctrl, int argc, char *argv[])
24248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
24258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_FLUSH");
24268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
24278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_cancel(struct wpa_ctrl *ctrl, int argc,
24308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
24318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
24328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_CANCEL");
24338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
24348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_unauthorize(struct wpa_ctrl *ctrl, int argc,
24378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
24388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
24398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
24408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
24418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
24438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_UNAUTHORIZE command: needs one argument "
24448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(peer address)\n");
24458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
24468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
24478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "P2P_UNAUTHORIZE %s", argv[0]);
24498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
24518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
24528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
24548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
24558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
24568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_presence_req(struct wpa_ctrl *ctrl, int argc,
24598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					char *argv[])
24608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
24618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
24628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
24638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 0 && argc != 2 && argc != 4) {
24658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_PRESENCE_REQ command: needs two arguments "
24668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(preferred duration, interval; in microsecods).\n"
24678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "Optional second pair can be used to provide "
24688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "acceptable values.\n");
24698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
24708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
24718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 4)
24738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
24748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_PRESENCE_REQ %s %s %s %s",
24758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2], argv[3]);
24768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else if (argc == 2)
24778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_PRESENCE_REQ %s %s",
24788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
24798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
24808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_PRESENCE_REQ");
24818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
24828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
24838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
24848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
24858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
24868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_ext_listen(struct wpa_ctrl *ctrl, int argc,
24898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
24908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
24918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
24928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
24938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 0 && argc != 2) {
24958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_EXT_LISTEN command: needs two arguments "
24968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(availability period, availability interval; in "
24978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "millisecods).\n"
24988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "Extended Listen Timing can be cancelled with this "
24998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "command when used without parameters.\n");
25008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
25018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
25028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 2)
25048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_EXT_LISTEN %s %s",
25058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
25068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
25078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_EXT_LISTEN");
25088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
25098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
25108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
25118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
25128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
25138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */
25158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_INTERWORKING
25181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_fetch_anqp(struct wpa_ctrl *ctrl, int argc,
25191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				  char *argv[])
25201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
25211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpa_ctrl_command(ctrl, "FETCH_ANQP");
25221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
25231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
25241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
25251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_stop_fetch_anqp(struct wpa_ctrl *ctrl, int argc,
25261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				       char *argv[])
25271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
25281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpa_ctrl_command(ctrl, "STOP_FETCH_ANQP");
25291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
25301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
25311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
25321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_interworking_select(struct wpa_ctrl *ctrl, int argc,
25331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					   char *argv[])
25341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
25351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char cmd[100];
25361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int res;
25371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
25381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (argc == 0)
25391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return wpa_ctrl_command(ctrl, "INTERWORKING_SELECT");
25401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
25411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "INTERWORKING_SELECT %s", argv[0]);
25421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
25431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return -1;
25441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
25451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
25461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
25471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
25481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
25491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_interworking_connect(struct wpa_ctrl *ctrl, int argc,
25501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					    char *argv[])
25511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
25521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char cmd[100];
25531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int res;
25541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
25551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (argc != 1) {
25561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		printf("Invalid INTERWORKING_CONNECT commands: needs one "
25571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		       "argument (BSSID)\n");
25581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return -1;
25591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
25601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
25611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "INTERWORKING_CONNECT %s",
25621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			  argv[0]);
25631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
25641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return -1;
25651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
25661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
25671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
25681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
25691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
25701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_anqp_get(struct wpa_ctrl *ctrl, int argc, char *argv[])
25711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
25721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char cmd[100];
25731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int res;
25741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
25751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (argc != 2) {
25761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		printf("Invalid ANQP_GET command: needs two arguments "
25771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		       "(addr and info id list)\n");
25781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return -1;
25791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
25801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
25811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "ANQP_GET %s %s",
25821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			  argv[0], argv[1]);
25831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
25841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return -1;
25851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
25861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
25871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
25881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_INTERWORKING */
25891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
25901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
25918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_sta_autoconnect(struct wpa_ctrl *ctrl, int argc,
25928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
25938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
25948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
25958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
25968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
25978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
25988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid STA_AUTOCONNECT command: needs one argument "
25998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(0/1 = disable/enable automatic reconnection)\n");
26008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
26018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
26028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "STA_AUTOCONNECT %s", argv[0]);
26038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
26048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long STA_AUTOCONNECT command.\n");
26058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
26068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
26078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
26088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
26098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_tdls_discover(struct wpa_ctrl *ctrl, int argc,
26128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
26138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
26148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
26158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
26168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
26188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid TDLS_DISCOVER command: needs one argument "
26198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(Peer STA MAC address)\n");
26208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
26218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
26228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "TDLS_DISCOVER %s", argv[0]);
26248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
26258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long TDLS_DISCOVER command.\n");
26268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
26278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
26288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
26298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
26308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_tdls_setup(struct wpa_ctrl *ctrl, int argc,
26338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
26348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
26358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
26368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
26378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
26398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid TDLS_SETUP command: needs one argument "
26408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(Peer STA MAC address)\n");
26418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
26428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
26438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "TDLS_SETUP %s", argv[0]);
26458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
26468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long TDLS_SETUP command.\n");
26478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
26488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
26498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
26508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
26518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_tdls_teardown(struct wpa_ctrl *ctrl, int argc,
26548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
26558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
26568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
26578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
26588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
26608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid TDLS_TEARDOWN command: needs one argument "
26618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(Peer STA MAC address)\n");
26628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
26638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
26648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "TDLS_TEARDOWN %s", argv[0]);
26668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
26678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long TDLS_TEARDOWN command.\n");
26688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
26698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
26708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
26718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
26728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_signal_poll(struct wpa_ctrl *ctrl, int argc,
26758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
26768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
26778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "SIGNAL_POLL");
26788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
26798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
26811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_reauthenticate(struct wpa_ctrl *ctrl, int argc,
26821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				      char *argv[])
26831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
26841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpa_ctrl_command(ctrl, "REAUTHENTICATE");
26851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
26861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2687c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#ifdef ANDROID
26880716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidtstatic int wpa_cli_cmd_driver(struct wpa_ctrl *ctrl, int argc, char *argv[])
26890716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt{
26900716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	char cmd[256];
26910716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	int i;
26920716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	int len;
26930716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt
26940716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	if (argc < 1) {
26950716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt		printf("Invalid DRIVER command: needs one argument (cmd)\n");
26960716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt		return -1;
26970716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	}
26980716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt
26990716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	len = os_snprintf(cmd, sizeof(cmd), "DRIVER %s", argv[0]);
27000716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	for (i=1; i < argc; i++)
27010716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt		len += os_snprintf(cmd + len, sizeof(cmd) - len, " %s", argv[i]);
27020716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
27030716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	printf("%s: %s\n", __func__, cmd);
27040716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
27050716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt}
2706c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#endif
27070716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt
27088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtenum wpa_cli_cmd_flags {
27098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cli_cmd_flag_none		= 0x00,
27108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cli_cmd_flag_sensitive		= 0x01
27118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
27128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpa_cli_cmd {
27148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *cmd;
27158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int (*handler)(struct wpa_ctrl *ctrl, int argc, char *argv[]);
27168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	enum wpa_cli_cmd_flags flags;
27178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *usage;
27188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
27198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_cli_cmd wpa_cli_commands[] = {
27218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "status", wpa_cli_cmd_status,
27228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[verbose] = get current WPA/EAPOL/EAP status" },
27248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "ping", wpa_cli_cmd_ping,
27258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= pings wpa_supplicant" },
27278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "relog", wpa_cli_cmd_relog,
27288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= re-open log-file (allow rolling logs)" },
27308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "note", wpa_cli_cmd_note,
27318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<text> = add a note to wpa_supplicant debug log" },
27338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "mib", wpa_cli_cmd_mib,
27348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get MIB variables (dot1x, dot11)" },
27368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "help", wpa_cli_cmd_help,
27378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= show this usage help" },
27398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "interface", wpa_cli_cmd_interface,
27408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[ifname] = show interfaces/select interface" },
27428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "level", wpa_cli_cmd_level,
27438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<debug level> = change debug level" },
27458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "license", wpa_cli_cmd_license,
27468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= show full wpa_cli license" },
27488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "quit", wpa_cli_cmd_quit,
27498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= exit wpa_cli" },
27518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "set", wpa_cli_cmd_set,
27528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= set variables (shows list of variables when run without "
27548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "arguments)" },
27558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "get", wpa_cli_cmd_get,
27568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<name> = get information" },
27588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "logon", wpa_cli_cmd_logon,
27598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= IEEE 802.1X EAPOL state machine logon" },
27618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "logoff", wpa_cli_cmd_logoff,
27628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= IEEE 802.1X EAPOL state machine logoff" },
27648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "pmksa", wpa_cli_cmd_pmksa,
27658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= show PMKSA cache" },
27678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "reassociate", wpa_cli_cmd_reassociate,
27688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= force reassociation" },
27708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "preauthenticate", wpa_cli_cmd_preauthenticate,
27718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<BSSID> = force preauthentication" },
27738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "identity", wpa_cli_cmd_identity,
27748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <identity> = configure identity for an SSID" },
27768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "password", wpa_cli_cmd_password,
27778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
27788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <password> = configure password for an SSID" },
27798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "new_password", wpa_cli_cmd_new_password,
27808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
27818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <password> = change password for an SSID" },
27828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "pin", wpa_cli_cmd_pin,
27838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
27848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <pin> = configure pin for an SSID" },
27858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "otp", wpa_cli_cmd_otp,
27868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
27878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <password> = configure one-time-password for an SSID"
27888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	},
27898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "passphrase", wpa_cli_cmd_passphrase,
27908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
27918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <passphrase> = configure private key passphrase\n"
27928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  for an SSID" },
27938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "bssid", wpa_cli_cmd_bssid,
27948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <BSSID> = set preferred BSSID for an SSID" },
2796696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	{ "blacklist", wpa_cli_cmd_blacklist,
2797696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  cli_cmd_flag_none,
2798696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  "<BSSID> = add a BSSID to the blacklist\n"
2799696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  "blacklist clear = clear the blacklist\n"
2800696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  "blacklist = display the blacklist" },
2801696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	{ "log_level", wpa_cli_cmd_log_level,
2802696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  cli_cmd_flag_none,
28031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "<level> [<timestamp>] = update the log level/timestamp\n"
2804696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  "log_level = display the current log level and log options" },
28058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "list_networks", wpa_cli_cmd_list_networks,
28068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= list configured networks" },
28088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "select_network", wpa_cli_cmd_select_network,
28098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> = select a network (disable others)" },
28118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "enable_network", wpa_cli_cmd_enable_network,
28128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> = enable a network" },
28148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "disable_network", wpa_cli_cmd_disable_network,
28158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> = disable a network" },
28178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "add_network", wpa_cli_cmd_add_network,
28188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= add a network" },
28208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "remove_network", wpa_cli_cmd_remove_network,
28218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> = remove a network" },
28238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "set_network", wpa_cli_cmd_set_network,
28248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
28258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <variable> <value> = set network variables (shows\n"
28268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  list of variables when run without arguments)" },
28278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "get_network", wpa_cli_cmd_get_network,
28288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <variable> = get network variables" },
28308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "save_config", wpa_cli_cmd_save_config,
28318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= save the current configuration" },
28338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "disconnect", wpa_cli_cmd_disconnect,
28348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= disconnect and wait for reassociate/reconnect command before\n"
28368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  connecting" },
28378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "reconnect", wpa_cli_cmd_reconnect,
28388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= like reassociate, but only takes effect if already disconnected"
28408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	},
28418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "scan", wpa_cli_cmd_scan,
28428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= request new BSS scan" },
28448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "scan_results", wpa_cli_cmd_scan_results,
28458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get latest scan results" },
28478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "bss", wpa_cli_cmd_bss,
28488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<<idx> | <bssid>> = get detailed scan result info" },
28508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "get_capability", wpa_cli_cmd_get_capability,
28518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<eap/pairwise/group/key_mgmt/proto/auth_alg> = get capabilies" },
28538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "reconfigure", wpa_cli_cmd_reconfigure,
28548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= force wpa_supplicant to re-read its configuration file" },
28568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "terminate", wpa_cli_cmd_terminate,
28578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= terminate wpa_supplicant" },
28598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "interface_add", wpa_cli_cmd_interface_add,
28608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<ifname> <confname> <driver> <ctrl_interface> <driver_param>\n"
28628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  <bridge_name> = adds new interface, all parameters but <ifname>\n"
28638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  are optional" },
28648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "interface_remove", wpa_cli_cmd_interface_remove,
28658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<ifname> = removes the interface" },
28678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "interface_list", wpa_cli_cmd_interface_list,
28688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= list available interfaces" },
28708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "ap_scan", wpa_cli_cmd_ap_scan,
28718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<value> = set ap_scan parameter" },
28738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "scan_interval", wpa_cli_cmd_scan_interval,
28748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<value> = set scan_interval parameter (in seconds)" },
28768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "bss_expire_age", wpa_cli_cmd_bss_expire_age,
28778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<value> = set BSS expiration age parameter" },
28798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "bss_expire_count", wpa_cli_cmd_bss_expire_count,
28808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<value> = set BSS expiration scan count parameter" },
28828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "stkstart", wpa_cli_cmd_stkstart,
28838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request STK negotiation with <addr>" },
28858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "ft_ds", wpa_cli_cmd_ft_ds,
28868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request over-the-DS FT with <addr>" },
28888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_pbc", wpa_cli_cmd_wps_pbc,
28898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[BSSID] = start Wi-Fi Protected Setup: Push Button Configuration" },
28918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_pin", wpa_cli_cmd_wps_pin,
28928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
28938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<BSSID> [PIN] = start WPS PIN method (returns PIN, if not "
28948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "hardcoded)" },
28958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_check_pin", wpa_cli_cmd_wps_check_pin,
28968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
28978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<PIN> = verify PIN checksum" },
28988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_cancel", wpa_cli_cmd_wps_cancel, cli_cmd_flag_none,
28998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "Cancels the pending WPS operation" },
29008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS_OOB
29018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_oob", wpa_cli_cmd_wps_oob,
29028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
29038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<DEV_TYPE> <PATH> <METHOD> [DEV_NAME] = start WPS OOB" },
29048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS_OOB */
29058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_reg", wpa_cli_cmd_wps_reg,
29068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
29078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<BSSID> <AP PIN> = start WPS Registrar to configure an AP" },
29088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_ap_pin", wpa_cli_cmd_wps_ap_pin,
29098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
29108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[params..] = enable/disable AP PIN" },
29118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_er_start", wpa_cli_cmd_wps_er_start,
29128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
29138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[IP address] = start Wi-Fi Protected Setup External Registrar" },
29148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_er_stop", wpa_cli_cmd_wps_er_stop,
29158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
29168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= stop Wi-Fi Protected Setup External Registrar" },
29178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_er_pin", wpa_cli_cmd_wps_er_pin,
29188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
29198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> <PIN> = add an Enrollee PIN to External Registrar" },
29208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_er_pbc", wpa_cli_cmd_wps_er_pbc,
29218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
29228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> = accept an Enrollee PBC using External Registrar" },
29238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_er_learn", wpa_cli_cmd_wps_er_learn,
29248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
29258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> <PIN> = learn AP configuration" },
29268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_er_set_config", wpa_cli_cmd_wps_er_set_config,
29278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
29288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> <network id> = set AP configuration for enrolling" },
29298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_er_config", wpa_cli_cmd_wps_er_config,
29308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
29318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> <PIN> <SSID> <auth> <encr> <key> = configure AP" },
29328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "ibss_rsn", wpa_cli_cmd_ibss_rsn,
29338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
29348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request RSN authentication with <addr> in IBSS" },
29358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_AP
29368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "sta", wpa_cli_cmd_sta,
29378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
29388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = get information about an associated station (AP)" },
29398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "all_sta", wpa_cli_cmd_all_sta,
29408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
29418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get information about all associated stations (AP)" },
29428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_AP */
29438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "suspend", wpa_cli_cmd_suspend, cli_cmd_flag_none,
29448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= notification of suspend/hibernate" },
29458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "resume", wpa_cli_cmd_resume, cli_cmd_flag_none,
29468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= notification of resume/thaw" },
29478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "drop_sa", wpa_cli_cmd_drop_sa, cli_cmd_flag_none,
29488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= drop SA without deauth/disassoc (test command)" },
29498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "roam", wpa_cli_cmd_roam,
29508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
29518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = roam to the specified BSS" },
29528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P
29538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_find", wpa_cli_cmd_p2p_find, cli_cmd_flag_none,
29548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[timeout] [type=*] = find P2P Devices for up-to timeout seconds" },
29558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_stop_find", wpa_cli_cmd_p2p_stop_find, cli_cmd_flag_none,
29568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= stop P2P Devices search" },
29578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_connect", wpa_cli_cmd_p2p_connect, cli_cmd_flag_none,
29588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> <\"pbc\"|PIN> = connect to a P2P Devices" },
29598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_listen", wpa_cli_cmd_p2p_listen, cli_cmd_flag_none,
29608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[timeout] = listen for P2P Devices for up-to timeout seconds" },
29618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_group_remove", wpa_cli_cmd_p2p_group_remove, cli_cmd_flag_none,
29628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<ifname> = remove P2P group interface (terminate group if GO)" },
29638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_group_add", wpa_cli_cmd_p2p_group_add, cli_cmd_flag_none,
29648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= add a new P2P group (local end as GO)" },
29658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_prov_disc", wpa_cli_cmd_p2p_prov_disc, cli_cmd_flag_none,
29668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> <method> = request provisioning discovery" },
29678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_get_passphrase", wpa_cli_cmd_p2p_get_passphrase,
29688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
29698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get the passphrase for a group (GO only)" },
29708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_serv_disc_req", wpa_cli_cmd_p2p_serv_disc_req,
29718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
29728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> <TLVs> = schedule service discovery request" },
29738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_serv_disc_cancel_req", wpa_cli_cmd_p2p_serv_disc_cancel_req,
29748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
29758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<id> = cancel pending service discovery request" },
29768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_serv_disc_resp", wpa_cli_cmd_p2p_serv_disc_resp,
29778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
29788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<freq> <addr> <dialog token> <TLVs> = service discovery response" },
29798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_service_update", wpa_cli_cmd_p2p_service_update,
29808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
29818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= indicate change in local services" },
29828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_serv_disc_external", wpa_cli_cmd_p2p_serv_disc_external,
29838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
29848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<external> = set external processing of service discovery" },
29858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_service_flush", wpa_cli_cmd_p2p_service_flush,
29868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
29878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= remove all stored service entries" },
29888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_service_add", wpa_cli_cmd_p2p_service_add,
29898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
29908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<bonjour|upnp> <query|version> <response|service> = add a local "
29918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "service" },
29928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_service_del", wpa_cli_cmd_p2p_service_del,
29938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
29948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<bonjour|upnp> <query|version> [|service] = remove a local "
29958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "service" },
29968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_reject", wpa_cli_cmd_p2p_reject,
29978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
29988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = reject connection attempts from a specific peer" },
29998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_invite", wpa_cli_cmd_p2p_invite,
30008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
30018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<cmd> [peer=addr] = invite peer" },
30028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_peers", wpa_cli_cmd_p2p_peers, cli_cmd_flag_none,
30038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[discovered] = list known (optionally, only fully discovered) P2P "
30048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "peers" },
30058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_peer", wpa_cli_cmd_p2p_peer, cli_cmd_flag_none,
30068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<address> = show information about known P2P peer" },
30078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_set", wpa_cli_cmd_p2p_set, cli_cmd_flag_none,
30088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<field> <value> = set a P2P parameter" },
30098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_flush", wpa_cli_cmd_p2p_flush, cli_cmd_flag_none,
30108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= flush P2P state" },
30118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_cancel", wpa_cli_cmd_p2p_cancel, cli_cmd_flag_none,
30128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= cancel P2P group formation" },
30138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_unauthorize", wpa_cli_cmd_p2p_unauthorize, cli_cmd_flag_none,
30148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<address> = unauthorize a peer" },
30158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_presence_req", wpa_cli_cmd_p2p_presence_req, cli_cmd_flag_none,
30168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[<duration> <interval>] [<duration> <interval>] = request GO "
30178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "presence" },
30188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_ext_listen", wpa_cli_cmd_p2p_ext_listen, cli_cmd_flag_none,
30198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[<period> <interval>] = set extended listen timing" },
30208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */
30211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
30221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_INTERWORKING
30231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	{ "fetch_anqp", wpa_cli_cmd_fetch_anqp, cli_cmd_flag_none,
30241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "= fetch ANQP information for all APs" },
30251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	{ "stop_fetch_anqp", wpa_cli_cmd_stop_fetch_anqp, cli_cmd_flag_none,
30261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "= stop fetch_anqp operation" },
30271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	{ "interworking_select", wpa_cli_cmd_interworking_select,
30281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  cli_cmd_flag_none,
30291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "[auto] = perform Interworking network selection" },
30301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	{ "interworking_connect", wpa_cli_cmd_interworking_connect,
30311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  cli_cmd_flag_none,
30321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "<BSSID> = connect using Interworking credentials" },
30331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	{ "anqp_get", wpa_cli_cmd_anqp_get, cli_cmd_flag_none,
30341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "<addr> <info id>[,<info id>]... = request ANQP information" },
30351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_INTERWORKING */
30368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "sta_autoconnect", wpa_cli_cmd_sta_autoconnect, cli_cmd_flag_none,
30378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<0/1> = disable/enable automatic reconnection" },
30388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "tdls_discover", wpa_cli_cmd_tdls_discover,
30398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
30408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request TDLS discovery with <addr>" },
30418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "tdls_setup", wpa_cli_cmd_tdls_setup,
30428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
30438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request TDLS setup with <addr>" },
30448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "tdls_teardown", wpa_cli_cmd_tdls_teardown,
30458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
30468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = tear down TDLS with <addr>" },
30478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "signal_poll", wpa_cli_cmd_signal_poll,
30488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
30498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get signal parameters" },
30501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	{ "reauthenticate", wpa_cli_cmd_reauthenticate, cli_cmd_flag_none,
30511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "= trigger IEEE 802.1X/EAPOL reauthentication" },
3052c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#ifdef ANDROID
30530716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	{ "driver", wpa_cli_cmd_driver,
30540716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	  cli_cmd_flag_none,
30550716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	  "<command> = driver private commands" },
3056c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#endif
30578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ NULL, NULL, cli_cmd_flag_none, NULL }
30588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
30598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
30628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Prints command usage, lines are padded with the specified string.
30638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
30648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void print_cmd_help(struct wpa_cli_cmd *cmd, const char *pad)
30658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char c;
30678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t n;
30688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("%s%s ", pad, cmd->cmd);
30708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (n = 0; (c = cmd->usage[n]); n++) {
30718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("%c", c);
30728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (c == '\n')
30738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("%s", pad);
30748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("\n");
30768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void print_help(void)
30808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int n;
30828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("commands:\n");
30838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (n = 0; wpa_cli_commands[n].cmd; n++)
30848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		print_cmd_help(&wpa_cli_commands[n], "  ");
30858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_edit_filter_history_cb(void *ctx, const char *cmd)
30898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *c, *delim;
30918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int n;
30928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
30938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	delim = os_strchr(cmd, ' ');
30958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (delim)
30968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		len = delim - cmd;
30978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
30988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		len = os_strlen(cmd);
30998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (n = 0; (c = wpa_cli_commands[n].cmd); n++) {
31018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strncasecmp(cmd, c, len) == 0 && len == os_strlen(c))
31028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return (wpa_cli_commands[n].flags &
31038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				cli_cmd_flag_sensitive);
31048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
31058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
31068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char ** wpa_list_cmd_list(void)
31108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **res;
31128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, count;
31138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	count = sizeof(wpa_cli_commands) / sizeof(wpa_cli_commands[0]);
31158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_zalloc(count * sizeof(char *));
31168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res == NULL)
31178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
31188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; wpa_cli_commands[i].cmd; i++) {
31208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res[i] = os_strdup(wpa_cli_commands[i].cmd);
31218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (res[i] == NULL)
31228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
31238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
31248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return res;
31268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char ** wpa_cli_cmd_completion(const char *cmd, const char *str,
31308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      int pos)
31318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i;
31338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (os_strcasecmp(cmd, "bss") == 0)
31351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return wpa_cli_complete_bss(str, pos);
31361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P
31371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (os_strcasecmp(cmd, "p2p_connect") == 0)
31381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return wpa_cli_complete_p2p_connect(str, pos);
31391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (os_strcasecmp(cmd, "p2p_peer") == 0)
31401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return wpa_cli_complete_p2p_peer(str, pos);
31411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (os_strcasecmp(cmd, "p2p_group_remove") == 0)
31421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return wpa_cli_complete_p2p_group_remove(str, pos);
31431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */
31441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
31458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; wpa_cli_commands[i].cmd; i++) {
31468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcasecmp(wpa_cli_commands[i].cmd, cmd) == 0) {
31478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			edit_clear_line();
31488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("\r%s\n", wpa_cli_commands[i].usage);
31498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			edit_redraw();
31508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
31518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
31528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
31538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
31558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char ** wpa_cli_edit_completion_cb(void *ctx, const char *str, int pos)
31598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **res;
31618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *end;
31628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *cmd;
31638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = os_strchr(str, ' ');
31658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (end == NULL || str + pos < end)
31668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_list_cmd_list();
31678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd = os_malloc(pos + 1);
31698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (cmd == NULL)
31708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
31718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memcpy(cmd, str, pos);
31728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[end - str] = '\0';
31738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = wpa_cli_cmd_completion(cmd, str, pos);
31748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(cmd);
31758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return res;
31768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_request(struct wpa_ctrl *ctrl, int argc, char *argv[])
31808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_cli_cmd *cmd, *match = NULL;
31828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int count;
31838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret = 0;
31848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	count = 0;
31868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd = wpa_cli_commands;
31878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (cmd->cmd) {
31888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strncasecmp(cmd->cmd, argv[0], os_strlen(argv[0])) == 0)
31898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		{
31908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			match = cmd;
31918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (os_strcasecmp(cmd->cmd, argv[0]) == 0) {
31928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				/* we have an exact match */
31938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				count = 1;
31948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
31958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
31968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			count++;
31978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
31988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		cmd++;
31998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
32008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (count > 1) {
32028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Ambiguous command '%s'; possible commands:", argv[0]);
32038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		cmd = wpa_cli_commands;
32048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		while (cmd->cmd) {
32058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (os_strncasecmp(cmd->cmd, argv[0],
32068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   os_strlen(argv[0])) == 0) {
32078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				printf(" %s", cmd->cmd);
32088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
32098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			cmd++;
32108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
32118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("\n");
32128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = 1;
32138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (count == 0) {
32148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Unknown command '%s'\n", argv[0]);
32158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = 1;
32168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
32172fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt#if defined(CONFIG_P2P) && defined(ANDROID_P2P)
32182fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt		if ( (argc >= 2) && (os_strncmp(argv[1], "interface=", 10) == 0)) {
32192fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt			redirect_interface = os_strdup(argv[1]);
32202fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt			ret = match->handler(ctrl, argc - 2, &argv[2]);
32212fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt		}
32222fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt		else
32232fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt#endif
32248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = match->handler(ctrl, argc - 1, &argv[1]);
32258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
32268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return ret;
32288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
32298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int str_match(const char *a, const char *b)
32328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
32338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return os_strncmp(a, b, os_strlen(b)) == 0;
32348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
32358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_exec(const char *program, const char *arg1,
32388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			const char *arg2)
32398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
32408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *cmd;
32418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
32428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
32438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret = 0;
32448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = os_strlen(program) + os_strlen(arg1) + os_strlen(arg2) + 3;
32468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd = os_malloc(len);
32478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (cmd == NULL)
32488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
32498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, len, "%s %s %s", program, arg1, arg2);
32508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= len) {
32518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(cmd);
32528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
32538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
32548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[len - 1] = '\0';
32558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef _WIN32_WCE
32568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (system(cmd) < 0)
32578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = -1;
32588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _WIN32_WCE */
32598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(cmd);
32608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return ret;
32628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
32638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_action_process(const char *msg)
32668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
32678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *pos;
32688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *copy = NULL, *id, *pos2;
32698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = msg;
32718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (*pos == '<') {
32728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* skip priority */
32738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos = os_strchr(pos, '>');
32748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos)
32758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos++;
32768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else
32778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos = msg;
32788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
32798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (str_match(pos, WPA_EVENT_CONNECTED)) {
32818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int new_id = -1;
32828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_unsetenv("WPA_ID");
32838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_unsetenv("WPA_ID_STR");
32848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_unsetenv("WPA_CTRL_DIR");
32858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos = os_strstr(pos, "[id=");
32878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos)
32888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			copy = os_strdup(pos + 4);
32898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (copy) {
32918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos2 = id = copy;
32928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			while (*pos2 && *pos2 != ' ')
32938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos2++;
32948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*pos2++ = '\0';
32958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			new_id = atoi(id);
32968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_setenv("WPA_ID", id, 1);
32978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			while (*pos2 && *pos2 != '=')
32988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos2++;
32998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (*pos2 == '=')
33008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos2++;
33018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			id = pos2;
33028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			while (*pos2 && *pos2 != ']')
33038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos2++;
33048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*pos2 = '\0';
33058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_setenv("WPA_ID_STR", id, 1);
33068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(copy);
33078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
33088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_setenv("WPA_CTRL_DIR", ctrl_iface_dir, 1);
33108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_cli_connected || new_id != wpa_cli_last_id) {
33128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_connected = 1;
33138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_last_id = new_id;
33148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_exec(action_file, ctrl_ifname, "CONNECTED");
33158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
33168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, WPA_EVENT_DISCONNECTED)) {
33178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpa_cli_connected) {
33188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_connected = 0;
33198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_exec(action_file, ctrl_ifname, "DISCONNECTED");
33208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
33218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, P2P_EVENT_GROUP_STARTED)) {
33228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
33238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, P2P_EVENT_GROUP_REMOVED)) {
33248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
33258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, P2P_EVENT_CROSS_CONNECT_ENABLE)) {
33268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
33278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, P2P_EVENT_CROSS_CONNECT_DISABLE)) {
33288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
33291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	} else if (str_match(pos, P2P_EVENT_GO_NEG_FAILURE)) {
33301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
33318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, WPS_EVENT_SUCCESS)) {
33328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
33338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, WPS_EVENT_FAIL)) {
33348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
33351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	} else if (str_match(pos, AP_STA_CONNECTED)) {
33361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
33371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	} else if (str_match(pos, AP_STA_DISCONNECTED)) {
33381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
33398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, WPA_EVENT_TERMINATING)) {
33408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("wpa_supplicant is terminating - stop monitoring\n");
33418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_quit = 1;
33428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
33448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_ANSI_C_EXTRA
33478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_action_cb(char *msg, size_t len)
33488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
33498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_action_process(msg);
33508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
33518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_ANSI_C_EXTRA */
33528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_reconnect(void)
33558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
33568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_close_connection();
33578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_open_connection(ctrl_ifname, 1);
33588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
33598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_event(const char *str)
33621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
33631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	const char *start, *s;
33641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
33651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	start = os_strchr(str, '>');
33661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (start == NULL)
33671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
33681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
33691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	start++;
33701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
33711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (str_starts(start, WPA_EVENT_BSS_ADDED)) {
33721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strchr(start, ' ');
33731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
33741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
33751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strchr(s + 1, ' ');
33761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
33771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
33781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_add(&bsses, s + 1);
33791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
33801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
33811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
33821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (str_starts(start, WPA_EVENT_BSS_REMOVED)) {
33831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strchr(start, ' ');
33841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
33851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
33861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strchr(s + 1, ' ');
33871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
33881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
33891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_del_addr(&bsses, s + 1);
33901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
33911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
33921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
33931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P
33941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (str_starts(start, P2P_EVENT_DEVICE_FOUND)) {
33951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strstr(start, " p2p_dev_addr=");
33961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
33971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
33981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_add_addr(&p2p_peers, s + 14);
33991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
34001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
34011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
34021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (str_starts(start, P2P_EVENT_DEVICE_LOST)) {
34031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strstr(start, " p2p_dev_addr=");
34041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
34051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
34061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_del_addr(&p2p_peers, s + 14);
34071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
34081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
34091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
34101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (str_starts(start, P2P_EVENT_GROUP_STARTED)) {
34111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strchr(start, ' ');
34121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
34131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
34141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_add_word(&p2p_groups, s + 1);
34151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
34161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
34171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
34181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (str_starts(start, P2P_EVENT_GROUP_REMOVED)) {
34191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strchr(start, ' ');
34201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
34211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
34221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_del_word(&p2p_groups, s + 1);
34231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
34241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
34251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */
34261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
34271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
34281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
34298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_recv_pending(struct wpa_ctrl *ctrl, int action_monitor)
34308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
34318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL) {
34328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_reconnect();
34338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
34348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
34358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (wpa_ctrl_pending(ctrl) > 0) {
34368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char buf[256];
34378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		size_t len = sizeof(buf) - 1;
34388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpa_ctrl_recv(ctrl, buf, &len) == 0) {
34398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			buf[len] = '\0';
34408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (action_monitor)
34418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				wpa_cli_action_process(buf);
34428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			else {
34431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				cli_event(buf);
34448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (wpa_cli_show_event(buf)) {
34458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					edit_clear_line();
34468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					printf("\r%s\n", buf);
34478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					edit_redraw();
34488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				}
34498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
34508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
34518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Could not read pending message.\n");
34528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
34538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
34548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
34558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_ctrl_pending(ctrl) < 0) {
34578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Connection to wpa_supplicant lost - trying to "
34588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "reconnect\n");
34598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_reconnect();
34608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
34618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
34628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define max_args 10
34648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int tokenize_cmd(char *cmd, char *argv[])
34668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
34678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *pos;
34688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int argc = 0;
34698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
34718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (;;) {
34728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		while (*pos == ' ')
34738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos++;
34748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (*pos == '\0')
34758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
34768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		argv[argc] = pos;
34778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		argc++;
34788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (argc == max_args)
34798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
34808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (*pos == '"') {
34818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			char *pos2 = os_strrchr(pos, '"');
34828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (pos2)
34838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos = pos2 + 1;
34848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
34858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		while (*pos != '\0' && *pos != ' ')
34868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos++;
34878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (*pos == ' ')
34888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*pos++ = '\0';
34898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
34908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return argc;
34928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
34938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_ping(void *eloop_ctx, void *timeout_ctx)
34968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
34978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn && _wpa_ctrl_command(ctrl_conn, "PING", 0)) {
34988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Connection to wpa_supplicant lost - trying to "
34998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "reconnect\n");
35008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_close_connection();
35018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
35028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!ctrl_conn)
35038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_reconnect();
35048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_register_timeout(ping_interval, 0, wpa_cli_ping, NULL, NULL);
35058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_eloop_terminate(int sig, void *signal_ctx)
35098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_terminate();
35118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_mon_receive(int sock, void *eloop_ctx, void *sock_ctx)
35158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_recv_pending(mon_conn, 0);
35178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_edit_cmd_cb(void *ctx, char *cmd)
35218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *argv[max_args];
35238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int argc;
35248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	argc = tokenize_cmd(cmd, argv);
35258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc)
35268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_request(ctrl_conn, argc, argv);
35278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_edit_eof_cb(void *ctx)
35318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_terminate();
35338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_interactive(void)
35378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *home, *hfile = NULL;
35398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("\nInteractive mode\n\n");
35418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	home = getenv("HOME");
35438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (home) {
35448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *fname = ".wpa_cli_history";
35458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int hfile_len = os_strlen(home) + 1 + os_strlen(fname) + 1;
35468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		hfile = os_malloc(hfile_len);
35478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (hfile)
35488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_snprintf(hfile, hfile_len, "%s/%s", home, fname);
35498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
35508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_register_signal_terminate(wpa_cli_eloop_terminate, NULL);
35528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	edit_init(wpa_cli_edit_cmd_cb, wpa_cli_edit_eof_cb,
35538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		  wpa_cli_edit_completion_cb, NULL, hfile);
35548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_register_timeout(ping_interval, 0, wpa_cli_ping, NULL, NULL);
35558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_run();
35578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	cli_txt_list_flush(&p2p_peers);
35591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	cli_txt_list_flush(&p2p_groups);
35601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	cli_txt_list_flush(&bsses);
35618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	edit_deinit(hfile, wpa_cli_edit_filter_history_cb);
35628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(hfile);
35638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_cancel_timeout(wpa_cli_ping, NULL, NULL);
35648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_close_connection();
35658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_action(struct wpa_ctrl *ctrl)
35698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_ANSI_C_EXTRA
35718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* TODO: ANSI C version(?) */
35728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("Action processing not supported in ANSI C build.\n");
35738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_ANSI_C_EXTRA */
35748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	fd_set rfds;
35758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int fd, res;
35768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct timeval tv;
35778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char buf[256]; /* note: large enough to fit in unsolicited messages */
35788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
35798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	fd = wpa_ctrl_get_fd(ctrl);
35818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (!wpa_cli_quit) {
35838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		FD_ZERO(&rfds);
35848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		FD_SET(fd, &rfds);
35858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		tv.tv_sec = ping_interval;
35868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		tv.tv_usec = 0;
35878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = select(fd + 1, &rfds, NULL, NULL, &tv);
35888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (res < 0 && errno != EINTR) {
35898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			perror("select");
35908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
35918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
35928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (FD_ISSET(fd, &rfds))
35948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_recv_pending(ctrl, 1);
35958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else {
35968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			/* verify that connection is still working */
35978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			len = sizeof(buf) - 1;
35988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpa_ctrl_request(ctrl, "PING", 4, buf, &len,
35998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     wpa_cli_action_cb) < 0 ||
36008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    len < 4 || os_memcmp(buf, "PONG", 4) != 0) {
36018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				printf("wpa_supplicant did not reply to PING "
36028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       "command - exiting\n");
36038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
36048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
36058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
36068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
36078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_ANSI_C_EXTRA */
36088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
36098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_cleanup(void)
36128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
36138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_close_connection();
36148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (pid_file)
36158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_daemonize_terminate(pid_file);
36168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_program_deinit();
36188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
36198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_terminate(int sig)
36218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
36228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_cleanup();
36238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	exit(0);
36248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
36258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char * wpa_cli_get_default_ifname(void)
36288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
36298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *ifname = NULL;
36308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_UNIX
36328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct dirent *dent;
36338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DIR *dir = opendir(ctrl_iface_dir);
36348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dir) {
36358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef ANDROID
36368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char ifprop[PROPERTY_VALUE_MAX];
36378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (property_get("wifi.interface", ifprop, NULL) != 0) {
36388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ifname = os_strdup(ifprop);
36398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Using interface '%s'\n", ifname);
36408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return ifname;
36418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
36428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* ANDROID */
36438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
36448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
36458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while ((dent = readdir(dir))) {
36468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef _DIRENT_HAVE_D_TYPE
36478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/*
36488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * Skip the file if it is not a socket. Also accept
36498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * DT_UNKNOWN (0) in case the C library or underlying
36508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * file system does not support d_type.
36518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 */
36528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (dent->d_type != DT_SOCK && dent->d_type != DT_UNKNOWN)
36538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			continue;
36548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _DIRENT_HAVE_D_TYPE */
36558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(dent->d_name, ".") == 0 ||
36568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    os_strcmp(dent->d_name, "..") == 0)
36578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			continue;
36588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Selected interface '%s'\n", dent->d_name);
36598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ifname = os_strdup(dent->d_name);
36608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
36618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
36628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	closedir(dir);
36638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UNIX */
36648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
3666c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#ifdef ANDROID
3667c97d8bf1d6959387a528c901eaf9c0bff47da853Dmitry Shmidt	char buf[4096], *pos;
3668c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#else
3669c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	char buf[2048], *pos;
3670c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#endif
36718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
36728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ctrl *ctrl;
36738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret;
36748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctrl = wpa_ctrl_open(NULL);
36768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl == NULL)
36778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
36788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = sizeof(buf) - 1;
36808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = wpa_ctrl_request(ctrl, "INTERFACES", 10, buf, &len, NULL);
36818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret >= 0) {
36828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		buf[len] = '\0';
36838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos = os_strchr(buf, '\n');
36848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos)
36858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*pos = '\0';
36868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ifname = os_strdup(buf);
36878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
36888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_ctrl_close(ctrl);
36898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
36908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return ifname;
36928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
36938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint main(int argc, char *argv[])
36968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
36978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int warning_displayed = 0;
36988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int c;
36998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int daemonize = 0;
37008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret = 0;
37018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *global = NULL;
37028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (os_program_init())
37048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
37058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (;;) {
37078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		c = getopt(argc, argv, "a:Bg:G:hi:p:P:v");
37088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (c < 0)
37098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		switch (c) {
37118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'a':
37128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			action_file = optarg;
37138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'B':
37158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			daemonize = 1;
37168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'g':
37188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			global = optarg;
37198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'G':
37218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ping_interval = atoi(optarg);
37228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'h':
37248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			usage();
37258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return 0;
37268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'v':
37278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("%s\n", wpa_cli_version);
37288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return 0;
37298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'i':
37308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(ctrl_ifname);
37318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ctrl_ifname = os_strdup(optarg);
37328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'p':
37348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ctrl_iface_dir = optarg;
37358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'P':
37378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pid_file = optarg;
37388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		default:
37408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			usage();
37418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
37428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
37438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
37448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	interactive = (argc == optind) && (action_file == NULL);
37468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (interactive)
37488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("%s\n\n%s\n\n", wpa_cli_version, wpa_cli_license);
37498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (eloop_init())
37518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
37528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (global) {
37548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
37558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ctrl_conn = wpa_ctrl_open(NULL);
37568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_CTRL_IFACE_NAMED_PIPE */
37578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ctrl_conn = wpa_ctrl_open(global);
37588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
37598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ctrl_conn == NULL) {
37608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			perror("Failed to connect to wpa_supplicant - "
37618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       "wpa_ctrl_open");
37628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
37638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
37648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
37658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef _WIN32_WCE
37678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	signal(SIGINT, wpa_cli_terminate);
37688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	signal(SIGTERM, wpa_cli_terminate);
37698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _WIN32_WCE */
37708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_ifname == NULL)
37728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ctrl_ifname = wpa_cli_get_default_ifname();
37738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (interactive) {
37758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (; !global;) {
37768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpa_cli_open_connection(ctrl_ifname, 1) == 0) {
37778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (warning_displayed)
37788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					printf("Connection established.\n");
37798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
37808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
37818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!warning_displayed) {
37838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				printf("Could not connect to wpa_supplicant - "
37848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       "re-trying\n");
37858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				warning_displayed = 1;
37868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
37878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_sleep(1, 0);
37888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			continue;
37898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
37908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
37918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!global &&
37928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    wpa_cli_open_connection(ctrl_ifname, 0) < 0) {
37938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			perror("Failed to connect to wpa_supplicant - "
37948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       "wpa_ctrl_open");
37958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
37968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
37978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (action_file) {
37998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpa_ctrl_attach(ctrl_conn) == 0) {
38008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				wpa_cli_attached = 1;
38018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			} else {
38028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				printf("Warning: Failed to attach to "
38038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       "wpa_supplicant.\n");
38048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				return -1;
38058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
38068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
38078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
38088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (daemonize && os_daemonize(pid_file))
38108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
38118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (interactive)
38138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_interactive();
38148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else if (action_file)
38158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_action(ctrl_conn);
38168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
38178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = wpa_request(ctrl_conn, argc - optind, &argv[optind]);
38188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(ctrl_ifname);
38208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_destroy();
38218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_cleanup();
38228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return ret;
38248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
38258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_CTRL_IFACE */
38278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint main(int argc, char *argv[])
38288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
38298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("CONFIG_CTRL_IFACE not defined - wpa_cli disabled\n");
38308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
38318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
38328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE */
3833