wpa_cli.c revision 051af73b8f8014eff33330aead0f36944b3403e6
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * WPA Supplicant - command line interface for wpa_supplicant daemon
3f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt * Copyright (c) 2004-2013, 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"
2304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "common/ieee802_11_defs.h"
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef ANDROID
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <cutils/properties.h>
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* ANDROID */
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *wpa_cli_version =
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"wpa_cli v" VERSION_STR "\n"
31a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt"Copyright (c) 2004-2013, Jouni Malinen <j@w1.fi> and contributors";
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *wpa_cli_license =
35c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt"This software may be distributed under the terms of the BSD license.\n"
36c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt"See README for more details.\n";
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *wpa_cli_full_license =
39c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt"This software may be distributed under the terms of the BSD license.\n"
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"Redistribution and use in source and binary forms, with or without\n"
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"modification, are permitted provided that the following conditions are\n"
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"met:\n"
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"1. Redistributions of source code must retain the above copyright\n"
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"   notice, this list of conditions and the following disclaimer.\n"
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"2. Redistributions in binary form must reproduce the above copyright\n"
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"   notice, this list of conditions and the following disclaimer in the\n"
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"   documentation and/or other materials provided with the distribution.\n"
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"   names of its contributors may be used to endorse or promote products\n"
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"   derived from this software without specific prior written permission.\n"
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n"
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n";
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_ctrl *ctrl_conn;
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_ctrl *mon_conn;
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_quit = 0;
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_attached = 0;
73391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidtstatic int wpa_cli_connected = -1;
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_last_id = 0;
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_CTRL_IFACE_DIR
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define CONFIG_CTRL_IFACE_DIR "/var/run/wpa_supplicant"
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_DIR */
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *ctrl_iface_dir = CONFIG_CTRL_IFACE_DIR;
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char *ctrl_ifname = NULL;
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *pid_file = NULL;
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *action_file = NULL;
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int ping_interval = 5;
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int interactive = 0;
84f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidtstatic char *ifname_prefix = NULL;
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstruct cli_txt_entry {
871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct dl_list list;
881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char *txt;
891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt};
901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic DEFINE_DL_LIST(bsses); /* struct cli_txt_entry */
921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic DEFINE_DL_LIST(p2p_peers); /* struct cli_txt_entry */
931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic DEFINE_DL_LIST(p2p_groups); /* struct cli_txt_entry */
94f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidtstatic DEFINE_DL_LIST(ifnames); /* struct cli_txt_entry */
951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void print_help(const char *cmd);
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_mon_receive(int sock, void *eloop_ctx, void *sock_ctx);
9961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void wpa_cli_close_connection(void);
10061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic char * wpa_cli_get_default_ifname(void);
10161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic char ** wpa_list_cmd_list(void);
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void usage(void)
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("wpa_cli [-p<path to ctrl sockets>] [-i<ifname>] [-hvB] "
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "[-a<action file>] \\\n"
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "        [-P<pid file>] [-g<global ctrl>] [-G<ping interval>]  "
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "[command..]\n"
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  -h = help (show this usage text)\n"
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  -v = shown version information\n"
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  -a = run in daemon mode executing the action file based on "
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "events from\n"
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "       wpa_supplicant\n"
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  -B = run a daemon in the background\n"
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  default path: " CONFIG_CTRL_IFACE_DIR "\n"
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  default interface: first interface found in socket path\n");
11861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print_help(NULL);
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_txt_list_free(struct cli_txt_entry *e)
1231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
1241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dl_list_del(&e->list);
1251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(e->txt);
1261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(e);
1271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
1281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_txt_list_flush(struct dl_list *list)
1311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
1321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct cli_txt_entry *e;
1331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	while ((e = dl_list_first(list, struct cli_txt_entry, list)))
1341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_free(e);
1351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
1361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic struct cli_txt_entry * cli_txt_list_get(struct dl_list *txt_list,
1391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					       const char *txt)
1401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
1411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct cli_txt_entry *e;
1421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dl_list_for_each(e, txt_list, struct cli_txt_entry, list) {
1431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (os_strcmp(e->txt, txt) == 0)
1441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return e;
1451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
1461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return NULL;
1471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
1481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_txt_list_del(struct dl_list *txt_list, const char *txt)
1511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
1521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct cli_txt_entry *e;
1531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	e = cli_txt_list_get(txt_list, txt);
1541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (e)
1551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_free(e);
1561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
1571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_txt_list_del_addr(struct dl_list *txt_list, const char *txt)
1601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
1611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	u8 addr[ETH_ALEN];
1621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char buf[18];
1631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (hwaddr_aton(txt, addr) < 0)
1641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
1651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_snprintf(buf, sizeof(buf), MACSTR, MAC2STR(addr));
1661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	cli_txt_list_del(txt_list, buf);
1671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
1681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P
1711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_txt_list_del_word(struct dl_list *txt_list, const char *txt)
1721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
1731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	const char *end;
1741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char *buf;
1751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	end = os_strchr(txt, ' ');
1761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (end == NULL)
1771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		end = txt + os_strlen(txt);
1784b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt	buf = dup_binstr(txt, end - txt);
1791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (buf == NULL)
1801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
1811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	cli_txt_list_del(txt_list, buf);
1821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(buf);
1831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
1841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */
1851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int cli_txt_list_add(struct dl_list *txt_list, const char *txt)
1881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
1891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct cli_txt_entry *e;
1901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	e = cli_txt_list_get(txt_list, txt);
1911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (e)
1921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return 0;
1931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	e = os_zalloc(sizeof(*e));
1941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (e == NULL)
1951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return -1;
1961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	e->txt = os_strdup(txt);
1971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (e->txt == NULL) {
1981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		os_free(e);
1991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return -1;
2001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
2011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dl_list_add(txt_list, &e->list);
2021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return 0;
2031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
2041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P
2071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int cli_txt_list_add_addr(struct dl_list *txt_list, const char *txt)
2081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
2091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	u8 addr[ETH_ALEN];
2101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char buf[18];
2111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (hwaddr_aton(txt, addr) < 0)
2121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return -1;
2131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_snprintf(buf, sizeof(buf), MACSTR, MAC2STR(addr));
2141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return cli_txt_list_add(txt_list, buf);
2151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
2161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int cli_txt_list_add_word(struct dl_list *txt_list, const char *txt)
2191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
2201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	const char *end;
2211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char *buf;
2221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int ret;
2231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	end = os_strchr(txt, ' ');
2241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (end == NULL)
2251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		end = txt + os_strlen(txt);
2264b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt	buf = dup_binstr(txt, end - txt);
2271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (buf == NULL)
2281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return -1;
2291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	ret = cli_txt_list_add(txt_list, buf);
2301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(buf);
2311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return ret;
2321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
2331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */
2341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** cli_txt_list_array(struct dl_list *txt_list)
2371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
2381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	unsigned int i, count = dl_list_len(txt_list);
2391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char **res;
2401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct cli_txt_entry *e;
2411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
24261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res = os_calloc(count + 1, sizeof(char *));
2431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (res == NULL)
2441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return NULL;
2451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	i = 0;
2471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dl_list_for_each(e, txt_list, struct cli_txt_entry, list) {
2481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		res[i] = os_strdup(e->txt);
2491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (res[i] == NULL)
2501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			break;
2511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		i++;
2521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
2531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
2551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
2561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int get_cmd_arg_num(const char *str, int pos)
2591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
2601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int arg = 0, i;
2611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	for (i = 0; i <= pos; i++) {
2631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (str[i] != ' ') {
2641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			arg++;
2651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			while (i <= pos && str[i] != ' ')
2661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				i++;
2671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		}
2681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
2691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (arg > 0)
2711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		arg--;
2721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return arg;
2731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
2741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int str_starts(const char *src, const char *match)
2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return os_strncmp(src, match, os_strlen(match)) == 0;
2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_show_event(const char *event)
2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *start;
2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	start = os_strchr(event, '>');
2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (start == NULL)
2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 1;
2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	start++;
2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/*
2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * Skip BSS added/removed events since they can be relatively frequent
2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * and are likely of not much use for an interactive user.
2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (str_starts(start, WPA_EVENT_BSS_ADDED) ||
2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    str_starts(start, WPA_EVENT_BSS_REMOVED))
2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 1;
3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_open_connection(const char *ifname, int attach)
3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#if defined(CONFIG_CTRL_IFACE_UDP) || defined(CONFIG_CTRL_IFACE_NAMED_PIPE)
3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctrl_conn = wpa_ctrl_open(ifname);
3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL)
3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (attach && interactive)
3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		mon_conn = wpa_ctrl_open(ifname);
3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		mon_conn = NULL;
3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */
3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *cfile = NULL;
3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int flen, res;
3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ifname == NULL)
3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef ANDROID
3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (access(ctrl_iface_dir, F_OK) < 0) {
3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		cfile = os_strdup(ifname);
3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (cfile == NULL)
3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* ANDROID */
3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (cfile == NULL) {
3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		flen = os_strlen(ctrl_iface_dir) + os_strlen(ifname) + 2;
3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		cfile = os_malloc(flen);
3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (cfile == NULL)
3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cfile, flen, "%s/%s", ctrl_iface_dir,
3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  ifname);
3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (res < 0 || res >= flen) {
3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(cfile);
3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctrl_conn = wpa_ctrl_open(cfile);
3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL) {
3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(cfile);
3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (attach && interactive)
3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		mon_conn = wpa_ctrl_open(cfile);
3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		mon_conn = NULL;
3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(cfile);
3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */
3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (mon_conn) {
3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpa_ctrl_attach(mon_conn) == 0) {
3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_attached = 1;
3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (interactive)
3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				eloop_register_read_sock(
3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					wpa_ctrl_get_fd(mon_conn),
3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					wpa_cli_mon_receive, NULL, NULL);
3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Warning: Failed to attach to "
3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       "wpa_supplicant.\n");
36561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			wpa_cli_close_connection();
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{
401c97d8bf1d6959387a528c901eaf9c0bff47da853Dmitry Shmidt	char buf[4096];
4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret;
4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL) {
4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Not connected to wpa_supplicant - command dropped.\n");
4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
409d3e385e428c94340d89ba090e3500a085463e713Dmitry Shmidt	if (ifname_prefix) {
410d3e385e428c94340d89ba090e3500a085463e713Dmitry Shmidt		os_snprintf(buf, sizeof(buf), "IFNAME=%s %s",
411d3e385e428c94340d89ba090e3500a085463e713Dmitry Shmidt			    ifname_prefix, cmd);
412d3e385e428c94340d89ba090e3500a085463e713Dmitry Shmidt		buf[sizeof(buf) - 1] = '\0';
413d3e385e428c94340d89ba090e3500a085463e713Dmitry Shmidt		cmd = buf;
414d3e385e428c94340d89ba090e3500a085463e713Dmitry Shmidt	}
4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = sizeof(buf) - 1;
4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len,
4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       wpa_cli_msg_cb);
4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret == -2) {
4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command timed out.\n", cmd);
4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -2;
4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (ret < 0) {
4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command failed.\n", cmd);
4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (print) {
4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		buf[len] = '\0';
4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("%s", buf);
4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (interactive && len > 0 && buf[len - 1] != '\n')
4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("\n");
4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_ctrl_command(struct wpa_ctrl *ctrl, char *cmd)
4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return _wpa_ctrl_command(ctrl, cmd, 1);
4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
44161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int write_cmd(char *buf, size_t buflen, const char *cmd, int argc,
44261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		     char *argv[])
44361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
44461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	int i, res;
44561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	char *pos, *end;
44661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
44761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	pos = buf;
44861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	end = buf + buflen;
44961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
45061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res = os_snprintf(pos, end - pos, "%s", cmd);
45161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (res < 0 || res >= end - pos)
45261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		goto fail;
45361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	pos += res;
45461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
45561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	for (i = 0; i < argc; i++) {
45661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		res = os_snprintf(pos, end - pos, " %s", argv[i]);
45761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (res < 0 || res >= end - pos)
45861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			goto fail;
45961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		pos += res;
46061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
46161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
46261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	buf[buflen - 1] = '\0';
46361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return 0;
46461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
46561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtfail:
46661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	printf("Too long command\n");
46761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return -1;
46861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
46961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
47061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
47161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd(struct wpa_ctrl *ctrl, const char *cmd, int min_args,
47261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       int argc, char *argv[])
47361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
4744b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt	char buf[4096];
47561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (argc < min_args) {
47661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		printf("Invalid %s command - at least %d argument%s "
47761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "required.\n", cmd, min_args,
47861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       min_args > 1 ? "s are" : " is");
47961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return -1;
48061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
48161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (write_cmd(buf, sizeof(buf), cmd, argc, argv) < 0)
48261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return -1;
48361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_ctrl_command(ctrl, buf);
48461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
48561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
48661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
48761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_ifname(struct wpa_ctrl *ctrl, int argc, char *argv[])
48861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
48961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_ctrl_command(ctrl, "IFNAME");
49061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
49161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
49261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_status(struct wpa_ctrl *ctrl, int argc, char *argv[])
4948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (argc > 0 && os_strcmp(argv[0], "verbose") == 0)
4961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return wpa_ctrl_command(ctrl, "STATUS-VERBOSE");
4971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (argc > 0 && os_strcmp(argv[0], "wps") == 0)
4981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return wpa_ctrl_command(ctrl, "STATUS-WPS");
4995605286c30e1701491bd3af974ae423727750eddDmitry Shmidt	if (argc > 0 && os_strcmp(argv[0], "driver") == 0)
5005605286c30e1701491bd3af974ae423727750eddDmitry Shmidt		return wpa_ctrl_command(ctrl, "STATUS-DRIVER");
5011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpa_ctrl_command(ctrl, "STATUS");
5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ping(struct wpa_ctrl *ctrl, int argc, char *argv[])
5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "PING");
5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_relog(struct wpa_ctrl *ctrl, int argc, char *argv[])
5128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "RELOG");
5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_note(struct wpa_ctrl *ctrl, int argc, char *argv[])
5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
51961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "NOTE", 1, argc, argv);
5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_mib(struct wpa_ctrl *ctrl, int argc, char *argv[])
5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "MIB");
5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_pmksa(struct wpa_ctrl *ctrl, int argc, char *argv[])
5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "PMKSA");
5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_help(struct wpa_ctrl *ctrl, int argc, char *argv[])
5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
53761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print_help(argc > 0 ? argv[0] : NULL);
5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
54261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic char ** wpa_cli_complete_help(const char *str, int pos)
54361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
54461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
54561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	char **res = NULL;
54661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
54761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	switch (arg) {
54861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	case 1:
54961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		res = wpa_list_cmd_list();
55061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		break;
55161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
55261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
55361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return res;
55461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
55561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
55661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_license(struct wpa_ctrl *ctrl, int argc, char *argv[])
5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("%s\n\n%s\n", wpa_cli_version, wpa_cli_full_license);
5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_quit(struct wpa_ctrl *ctrl, int argc, char *argv[])
5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_quit = 1;
5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (interactive)
5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		eloop_terminate();
5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_set(struct wpa_ctrl *ctrl, int argc, char *argv[])
5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
57851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	if (argc == 1) {
57951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "SET %s ", argv[0]);
58051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
58151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt			printf("Too long SET command.\n");
58251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt			return -1;
58351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		}
58451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		return wpa_ctrl_command(ctrl, cmd);
5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
58751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	return wpa_cli_cmd(ctrl, "SET", 2, argc, argv);
58851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt}
5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
59051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
59151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidtstatic char ** wpa_cli_complete_set(const char *str, int pos)
59251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt{
59351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
59451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	const char *fields[] = {
59551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		/* runtime values */
59651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"EAPOL::heldPeriod", "EAPOL::authPeriod", "EAPOL::startPeriod",
59751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"EAPOL::maxStart", "dot11RSNAConfigPMKLifetime",
59851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"dot11RSNAConfigPMKReauthThreshold", "dot11RSNAConfigSATimeout",
59951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"wps_fragment_size", "wps_version_number", "ampdu",
60051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"tdls_testing", "tdls_disabled", "pno", "radio_disabled",
60151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"uapsd", "ps", "wifi_display", "bssid_filter", "disallow_aps",
60251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"no_keep_alive",
60351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		/* global configuration parameters */
60451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"eapol_version", "ap_scan", "disable_scan_offload",
60551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"fast_reauth", "opensc_engine_path", "pkcs11_engine_path",
60651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"pkcs11_module_path", "pcsc_reader", "pcsc_pin",
60751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"driver_param", "dot11RSNAConfigPMKLifetime",
60851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"dot11RSNAConfigPMKReauthThreshold",
60951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"dot11RSNAConfigSATimeout",
61051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"update_config", "load_dynamic_eap", "uuid", "device_name",
61151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"manufacturer", "model_name", "model_number", "serial_number",
61251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"device_type", "os_version", "config_methods",
61351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"wps_cred_processing", "wps_vendor_ext_m1", "sec_device_type",
61451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"p2p_listen_reg_class", "p2p_listen_channel",
61551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"p2p_oper_reg_class", "p2p_oper_channel",
61651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"p2p_go_intent", "p2p_ssid_postfix", "persistent_reconnect",
61751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"p2p_intra_bss", "p2p_group_idle", "p2p_pref_chan",
61851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"p2p_go_ht40", "p2p_disabled", "p2p_no_group_iface",
61951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"p2p_ignore_shared_freq", "country", "bss_max_count",
62051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"bss_expiration_age", "bss_expiration_scan_count",
62151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"filter_ssids", "filter_rssi", "max_num_sta",
62251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"disassoc_low_ack", "hs20", "interworking", "hessid",
62351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"access_network_type", "pbc_in_m1", "autoscan",
62451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"wps_nfc_dev_pw_id", "wps_nfc_dh_pubkey", "wps_nfc_dh_privkey",
62551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"wps_nfc_dev_pw", "ext_password_backend",
62651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"p2p_go_max_inactivity", "auto_interworking", "okc", "pmf",
62751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"sae_groups", "dtim_period", "beacon_int", "ap_vendor_elements",
628051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		"ignore_old_scan_res", "freq_list", "external_sim"
62951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	};
63051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	int i, num_fields = sizeof(fields) / sizeof(fields[0]);
63151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
63251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	if (arg == 1) {
63351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		char **res = os_calloc(num_fields + 1, sizeof(char *));
63451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		if (res == NULL)
63551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt			return NULL;
63651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		for (i = 0; i < num_fields; i++) {
63751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt			res[i] = os_strdup(fields[i]);
63851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt			if (res[i] == NULL)
63951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt				return res;
64051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		}
64151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		return res;
6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
64351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
64451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	if (arg > 1 && os_strncasecmp(str, "set bssid_filter ", 17) == 0)
64551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		return cli_txt_list_array(&bsses);
64651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
64751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	return NULL;
6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_get(struct wpa_ctrl *ctrl, int argc, char *argv[])
6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
65361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "GET", 1, argc, argv);
6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_logoff(struct wpa_ctrl *ctrl, int argc, char *argv[])
6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "LOGOFF");
6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_logon(struct wpa_ctrl *ctrl, int argc, char *argv[])
6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "LOGON");
6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_reassociate(struct wpa_ctrl *ctrl, int argc,
6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "REASSOCIATE");
6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_preauthenticate(struct wpa_ctrl *ctrl, int argc,
6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
67961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "PREAUTH", 1, argc, argv);
6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ap_scan(struct wpa_ctrl *ctrl, int argc, char *argv[])
6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
68561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "AP_SCAN", 1, argc, argv);
6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_scan_interval(struct wpa_ctrl *ctrl, int argc,
6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
69261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "SCAN_INTERVAL", 1, argc, argv);
6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bss_expire_age(struct wpa_ctrl *ctrl, int argc,
6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
69961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "BSS_EXPIRE_AGE", 1, argc, argv);
7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bss_expire_count(struct wpa_ctrl *ctrl, int argc,
7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				        char *argv[])
7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
70661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "BSS_EXPIRE_COUNT", 1, argc, argv);
7078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
710f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidtstatic int wpa_cli_cmd_bss_flush(struct wpa_ctrl *ctrl, int argc, char *argv[])
711f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt{
712f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	char cmd[256];
713f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	int res;
714f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt
715f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	if (argc < 1)
716f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "BSS_FLUSH 0");
717f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	else
718f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "BSS_FLUSH %s", argv[0]);
719f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
720f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt		printf("Too long BSS_FLUSH command.\n");
721f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt		return -1;
722f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	}
723f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
724f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt}
725f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt
726f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt
7278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_stkstart(struct wpa_ctrl *ctrl, int argc,
7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				char *argv[])
7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
73061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "STKSTART", 1, argc, argv);
7318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ft_ds(struct wpa_ctrl *ctrl, int argc, char *argv[])
7358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
73661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "FT_DS", 1, argc, argv);
7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_pbc(struct wpa_ctrl *ctrl, int argc, char *argv[])
7418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
74261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_PBC", 0, argc, argv);
7438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_pin(struct wpa_ctrl *ctrl, int argc, char *argv[])
7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0) {
7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_PIN command: need one or two arguments:\n"
7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- BSSID: use 'any' to select any\n"
7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- PIN: optional, used only with devices that have no "
7528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "display\n");
7538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
7548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
75661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_PIN", 1, argc, argv);
7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_check_pin(struct wpa_ctrl *ctrl, int argc,
7618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
7628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
76361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_CHECK_PIN", 1, argc, argv);
7648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_cancel(struct wpa_ctrl *ctrl, int argc,
7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "WPS_CANCEL");
7718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
77404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_WPS_NFC
77504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
77604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_wps_nfc(struct wpa_ctrl *ctrl, int argc, char *argv[])
77704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
77861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_NFC", 0, argc, argv);
77904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
78004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
78104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
782f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidtstatic int wpa_cli_cmd_wps_nfc_config_token(struct wpa_ctrl *ctrl, int argc,
783f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt					    char *argv[])
784f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt{
785f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_NFC_CONFIG_TOKEN", 1, argc, argv);
786f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt}
787f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt
788f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt
78904949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_wps_nfc_token(struct wpa_ctrl *ctrl, int argc,
79004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				     char *argv[])
79104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
79261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_NFC_TOKEN", 1, argc, argv);
79304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
79404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
79504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
79604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_wps_nfc_tag_read(struct wpa_ctrl *ctrl, int argc,
79704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					char *argv[])
79804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
79904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	int ret;
80004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char *buf;
80104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	size_t buflen;
80204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
80304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (argc != 1) {
80404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		printf("Invalid 'wps_nfc_tag_read' command - one argument "
80504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		       "is required.\n");
80604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
80704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
80804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
80904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	buflen = 18 + os_strlen(argv[0]);
81004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	buf = os_malloc(buflen);
81104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (buf == NULL)
81204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
81304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	os_snprintf(buf, buflen, "WPS_NFC_TAG_READ %s", argv[0]);
81404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
81504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	ret = wpa_ctrl_command(ctrl, buf);
81604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	os_free(buf);
81704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
81804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return ret;
81904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
82004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
821d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
822d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtstatic int wpa_cli_cmd_nfc_get_handover_req(struct wpa_ctrl *ctrl, int argc,
823d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt					    char *argv[])
824d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{
825d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return wpa_cli_cmd(ctrl, "NFC_GET_HANDOVER_REQ", 2, argc, argv);
826d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt}
827d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
828d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
829d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtstatic int wpa_cli_cmd_nfc_get_handover_sel(struct wpa_ctrl *ctrl, int argc,
830d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt					    char *argv[])
831d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{
832d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return wpa_cli_cmd(ctrl, "NFC_GET_HANDOVER_SEL", 2, argc, argv);
833d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt}
834d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
835d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
836d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtstatic int wpa_cli_cmd_nfc_rx_handover_req(struct wpa_ctrl *ctrl, int argc,
837d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt					   char *argv[])
838d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{
839d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	int ret;
840d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	char *buf;
841d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	size_t buflen;
842d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
843d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (argc != 1) {
844d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		printf("Invalid 'nfc_rx_handover_req' command - one argument "
845d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		       "is required.\n");
846d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		return -1;
847d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	}
848d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
849d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	buflen = 21 + os_strlen(argv[0]);
850d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	buf = os_malloc(buflen);
851d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (buf == NULL)
852d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		return -1;
853d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	os_snprintf(buf, buflen, "NFC_RX_HANDOVER_REQ %s", argv[0]);
854d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
855d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	ret = wpa_ctrl_command(ctrl, buf);
856d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	os_free(buf);
857d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
858d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return ret;
859d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt}
860d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
861d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
862d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtstatic int wpa_cli_cmd_nfc_rx_handover_sel(struct wpa_ctrl *ctrl, int argc,
863d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt					   char *argv[])
864d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{
865d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	int ret;
866d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	char *buf;
867d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	size_t buflen;
868d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
869d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (argc != 1) {
870d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		printf("Invalid 'nfc_rx_handover_sel' command - one argument "
871d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		       "is required.\n");
872d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		return -1;
873d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	}
874d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
875d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	buflen = 21 + os_strlen(argv[0]);
876d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	buf = os_malloc(buflen);
877d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (buf == NULL)
878d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		return -1;
879d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	os_snprintf(buf, buflen, "NFC_RX_HANDOVER_SEL %s", argv[0]);
880d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
881d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	ret = wpa_ctrl_command(ctrl, buf);
882d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	os_free(buf);
883d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
884d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return ret;
885d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt}
886d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
887f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt
888f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidtstatic int wpa_cli_cmd_nfc_report_handover(struct wpa_ctrl *ctrl, int argc,
889f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt					   char *argv[])
890f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt{
891f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	return wpa_cli_cmd(ctrl, "NFC_REPORT_HANDOVER", 4, argc, argv);
892f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt}
893f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt
89404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_WPS_NFC */
89504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
89604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
8978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_reg(struct wpa_ctrl *ctrl, int argc, char *argv[])
8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
9018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 2)
9038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_REG %s %s",
9048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
9058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else if (argc == 5 || argc == 6) {
9068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char ssid_hex[2 * 32 + 1];
9078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char key_hex[2 * 64 + 1];
9088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int i;
9098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssid_hex[0] = '\0';
9118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (i = 0; i < 32; i++) {
9128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (argv[2][i] == '\0')
9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
9148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_snprintf(&ssid_hex[i * 2], 3, "%02x", argv[2][i]);
9158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
9168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_hex[0] = '\0';
9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (argc == 6) {
9198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			for (i = 0; i < 64; i++) {
9208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (argv[5][i] == '\0')
9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					break;
9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				os_snprintf(&key_hex[i * 2], 3, "%02x",
9238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    argv[5][i]);
9248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
9288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "WPS_REG %s %s %s %s %s %s",
9298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], ssid_hex, argv[3], argv[4],
9308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  key_hex);
9318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
9328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_REG command: need two arguments:\n"
9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- BSSID of the target AP\n"
9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- AP PIN\n");
9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Alternatively, six arguments can be used to "
9368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "reconfigure the AP:\n"
9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- BSSID of the target AP\n"
9388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- AP PIN\n"
9398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new SSID\n"
9408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new auth (OPEN, WPAPSK, WPA2PSK)\n"
9418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new encr (NONE, WEP, TKIP, CCMP)\n"
9428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new key\n");
9438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
9478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_REG command.\n");
9488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
9518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_ap_pin(struct wpa_ctrl *ctrl, int argc,
9558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
9568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
95761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_AP_PIN", 1, argc, argv);
9588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_start(struct wpa_ctrl *ctrl, int argc,
9628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    char *argv[])
9638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
96461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_ER_START", 0, argc, argv);
9658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_stop(struct wpa_ctrl *ctrl, int argc,
9698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
9708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "WPS_ER_STOP");
9728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_pin(struct wpa_ctrl *ctrl, int argc,
9778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
9788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
9808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_ER_PIN command: need at least two "
9818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments:\n"
9828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- UUID: use 'any' to select any\n"
9838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- PIN: Enrollee PIN\n"
9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "optional: - Enrollee MAC address\n");
9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
98861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_ER_PIN", 2, argc, argv);
9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_pbc(struct wpa_ctrl *ctrl, int argc,
9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
99561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_ER_PBC", 1, argc, argv);
9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_learn(struct wpa_ctrl *ctrl, int argc,
10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    char *argv[])
10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2) {
10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_ER_LEARN command: need two arguments:\n"
10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- UUID: specify which AP to use\n"
10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- PIN: AP PIN\n");
10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
100961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_ER_LEARN", 2, argc, argv);
10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_set_config(struct wpa_ctrl *ctrl, int argc,
10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 char *argv[])
10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2) {
10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_ER_SET_CONFIG command: need two "
10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments:\n"
10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- UUID: specify which AP to use\n"
10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- Network configuration id\n");
10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
102461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_ER_SET_CONFIG", 2, argc, argv);
10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_config(struct wpa_ctrl *ctrl, int argc,
10298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
10308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
10318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
10328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
10338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 5 || argc == 6) {
10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char ssid_hex[2 * 32 + 1];
10368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char key_hex[2 * 64 + 1];
10378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int i;
10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssid_hex[0] = '\0';
10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (i = 0; i < 32; i++) {
10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (argv[2][i] == '\0')
10428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
10438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_snprintf(&ssid_hex[i * 2], 3, "%02x", argv[2][i]);
10448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_hex[0] = '\0';
10478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (argc == 6) {
10488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			for (i = 0; i < 64; i++) {
10498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (argv[5][i] == '\0')
10508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					break;
10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				os_snprintf(&key_hex[i * 2], 3, "%02x",
10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    argv[5][i]);
10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
10548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
10578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "WPS_ER_CONFIG %s %s %s %s %s %s",
10588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], ssid_hex, argv[3], argv[4],
10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  key_hex);
10608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
10618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_ER_CONFIG command: need six arguments:\n"
10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- AP UUID\n"
10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- AP PIN\n"
10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new SSID\n"
10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new auth (OPEN, WPAPSK, WPA2PSK)\n"
10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new encr (NONE, WEP, TKIP, CCMP)\n"
10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new key\n");
10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_ER_CONFIG command.\n");
10738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
107904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_WPS_NFC
108004949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_wps_er_nfc_config_token(struct wpa_ctrl *ctrl, int argc,
108104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       char *argv[])
108204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
108304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (argc != 2) {
108404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		printf("Invalid WPS_ER_NFC_CONFIG_TOKEN command: need two "
108504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		       "arguments:\n"
108604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		       "- WPS/NDEF: token format\n"
108704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		       "- UUID: specify which AP to use\n");
108804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
108904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
109004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
109161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_ER_NFC_CONFIG_TOKEN", 2, argc, argv);
109204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
109304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_WPS_NFC */
109404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
109504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
10968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ibss_rsn(struct wpa_ctrl *ctrl, int argc, char *argv[])
10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
109861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "IBSS_RSN", 1, argc, argv);
10998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_level(struct wpa_ctrl *ctrl, int argc, char *argv[])
11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
110461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "LEVEL", 1, argc, argv);
11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_identity(struct wpa_ctrl *ctrl, int argc, char *argv[])
11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
11148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid IDENTITY command: needs two arguments "
11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and identity)\n");
11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "IDENTITY-%s:%s",
11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long IDENTITY command.\n");
11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long IDENTITY command.\n");
11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_password(struct wpa_ctrl *ctrl, int argc, char *argv[])
11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
11458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid PASSWORD command: needs two arguments "
11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and password)\n");
11498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
11538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PASSWORD-%s:%s",
11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
11568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
11578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long PASSWORD command.\n");
11588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
11618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
11628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
11648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long PASSWORD command.\n");
11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_new_password(struct wpa_ctrl *ctrl, int argc,
11758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    char *argv[])
11768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid NEW_PASSWORD command: needs two arguments "
11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and password)\n");
11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "NEW_PASSWORD-%s:%s",
11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long NEW_PASSWORD command.\n");
11928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long NEW_PASSWORD command.\n");
11998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
12008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_pin(struct wpa_ctrl *ctrl, int argc, char *argv[])
12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
12128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid PIN command: needs two arguments "
12158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and pin)\n");
12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
12218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PIN-%s:%s",
12228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long PIN command.\n");
12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
12288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long PIN command.\n");
12328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
12338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
12378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_otp(struct wpa_ctrl *ctrl, int argc, char *argv[])
12418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
12428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
12438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
12448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
12468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid OTP command: needs two arguments (network "
12478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "id and password)\n");
12488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
12528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
12538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "OTP-%s:%s",
12548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long OTP command.\n");
12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
12608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
12638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long OTP command.\n");
12648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
12658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
12678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
12708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1273051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidtstatic int wpa_cli_cmd_sim(struct wpa_ctrl *ctrl, int argc, char *argv[])
1274051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt{
1275051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	char cmd[256], *pos, *end;
1276051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	int i, ret;
1277051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
1278051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	if (argc < 2) {
1279051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		printf("Invalid SIM command: needs two arguments "
1280051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		       "(network id and SIM operation response)\n");
1281051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		return -1;
1282051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	}
1283051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
1284051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	end = cmd + sizeof(cmd);
1285051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	pos = cmd;
1286051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "SIM-%s:%s",
1287051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt			  argv[0], argv[1]);
1288051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
1289051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		printf("Too long SIM command.\n");
1290051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		return -1;
1291051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	}
1292051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	pos += ret;
1293051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	for (i = 2; i < argc; i++) {
1294051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
1295051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
1296051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt			printf("Too long SIM command.\n");
1297051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt			return -1;
1298051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		}
1299051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		pos += ret;
1300051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	}
1301051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
1302051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt}
1303051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
1304051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
13058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_passphrase(struct wpa_ctrl *ctrl, int argc,
13068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
13078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
13098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
13108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid PASSPHRASE command: needs two arguments "
13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and passphrase)\n");
13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
13158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
13188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
13198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PASSPHRASE-%s:%s",
13208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
13218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
13228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long PASSPHRASE command.\n");
13238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
13248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
13268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
13278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
13288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
13298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long PASSPHRASE command.\n");
13308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
13318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
13328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
13338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
13368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bssid(struct wpa_ctrl *ctrl, int argc, char *argv[])
13408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
13428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid BSSID command: needs two arguments (network "
13438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "id and BSSID)\n");
13448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
13458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
134761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "BSSID", 2, argc, argv);
13488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1351696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidtstatic int wpa_cli_cmd_blacklist(struct wpa_ctrl *ctrl, int argc, char *argv[])
1352696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt{
135361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "BLACKLIST", 0, argc, argv);
1354696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt}
1355696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
1356696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
1357696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidtstatic int wpa_cli_cmd_log_level(struct wpa_ctrl *ctrl, int argc, char *argv[])
1358696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt{
135961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "LOG_LEVEL", 0, argc, argv);
1360696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt}
1361696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
1362696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
13638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_list_networks(struct wpa_ctrl *ctrl, int argc,
13648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
13658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "LIST_NETWORKS");
13678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_select_network(struct wpa_ctrl *ctrl, int argc,
13718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
13728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
137361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "SELECT_NETWORK", 1, argc, argv);
13748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_enable_network(struct wpa_ctrl *ctrl, int argc,
13788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
13798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
138061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "ENABLE_NETWORK", 1, argc, argv);
13818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_disable_network(struct wpa_ctrl *ctrl, int argc,
13858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
13868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
138761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "DISABLE_NETWORK", 1, argc, argv);
13888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_add_network(struct wpa_ctrl *ctrl, int argc,
13928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
13938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "ADD_NETWORK");
13958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
139861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_remove_network(struct wpa_ctrl *ctrl, int argc,
139961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				      char *argv[])
140061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
140161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "REMOVE_NETWORK", 1, argc, argv);
14028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_show_network_variables(void)
14068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("set_network variables:\n"
14088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  ssid (network name, SSID)\n"
14098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  psk (WPA passphrase or pre-shared key)\n"
14108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  key_mgmt (key management protocol)\n"
14118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  identity (EAP identity)\n"
14128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  password (EAP password)\n"
14138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  ...\n"
14148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "\n"
14158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "Note: Values are entered in the same format as the "
14168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "configuration file is using,\n"
14178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "i.e., strings values need to be inside double quotation "
14188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "marks.\n"
14198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "For example: set_network 1 ssid \"network name\"\n"
14208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "\n"
14218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "Please see wpa_supplicant.conf documentation for full list "
14228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "of\navailable variables.\n");
14238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_set_network(struct wpa_ctrl *ctrl, int argc,
14278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
14288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0) {
14308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_show_network_variables();
14318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
14328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1434d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (argc < 3) {
14358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid SET_NETWORK command: needs three arguments\n"
14368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id, variable name, and value)\n");
14378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
14388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
144061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "SET_NETWORK", 3, argc, argv);
14418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_get_network(struct wpa_ctrl *ctrl, int argc,
14458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
14468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0) {
14488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_show_network_variables();
14498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
14508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2) {
14538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid GET_NETWORK command: needs two arguments\n"
14548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and variable name)\n");
14558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
14568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
145861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "GET_NETWORK", 2, argc, argv);
14598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
146204949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_list_creds(struct wpa_ctrl *ctrl, int argc,
146304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				  char *argv[])
146404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
146504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return wpa_ctrl_command(ctrl, "LIST_CREDS");
146604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
146704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
146804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
146904949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_add_cred(struct wpa_ctrl *ctrl, int argc, char *argv[])
147004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
147104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return wpa_ctrl_command(ctrl, "ADD_CRED");
147204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
147304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
147404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
147504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_remove_cred(struct wpa_ctrl *ctrl, int argc,
147604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				   char *argv[])
147704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
147861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "REMOVE_CRED", 1, argc, argv);
147904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
148004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
148104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
148204949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_set_cred(struct wpa_ctrl *ctrl, int argc, char *argv[])
148304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
148404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (argc != 3) {
148504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		printf("Invalid SET_CRED command: needs three arguments\n"
148604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		       "(cred id, variable name, and value)\n");
148704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
148804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
148904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
149061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "SET_CRED", 3, argc, argv);
149104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
149204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
149304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
14948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_disconnect(struct wpa_ctrl *ctrl, int argc,
14958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
14968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "DISCONNECT");
14988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_reconnect(struct wpa_ctrl *ctrl, int argc,
15028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
15038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "RECONNECT");
15058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_save_config(struct wpa_ctrl *ctrl, int argc,
15098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
15108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "SAVE_CONFIG");
15128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_scan(struct wpa_ctrl *ctrl, int argc, char *argv[])
15168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15174b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt	return wpa_cli_cmd(ctrl, "SCAN", 0, argc, argv);
15188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_scan_results(struct wpa_ctrl *ctrl, int argc,
15228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    char *argv[])
15238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "SCAN_RESULTS");
15258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bss(struct wpa_ctrl *ctrl, int argc, char *argv[])
15298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
153061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "BSS", 1, argc, argv);
15318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** wpa_cli_complete_bss(const char *str, int pos)
15351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
15361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
15371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char **res = NULL;
15381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
15391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	switch (arg) {
15401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	case 1:
15411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		res = cli_txt_list_array(&bsses);
15421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		break;
15431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
15441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
15451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
15461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
15471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
15481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
15498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_get_capability(struct wpa_ctrl *ctrl, int argc,
15508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
15518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1 || argc > 2) {
15538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid GET_CAPABILITY command: need either one or "
15548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "two arguments\n");
15558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
15568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if ((argc == 2) && os_strcmp(argv[1], "strict") != 0) {
15598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid GET_CAPABILITY command: second argument, "
15608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "if any, must be 'strict'\n");
15618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
15628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
156461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "GET_CAPABILITY", 1, argc, argv);
15658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_list_interfaces(struct wpa_ctrl *ctrl)
15698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("Available interfaces:\n");
15718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "INTERFACES");
15728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface(struct wpa_ctrl *ctrl, int argc, char *argv[])
15768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1) {
15788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_list_interfaces(ctrl);
15798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
15808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_close_connection();
15838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(ctrl_ifname);
15848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctrl_ifname = os_strdup(argv[0]);
15858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_cli_open_connection(ctrl_ifname, 1)) {
15878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Connected to interface '%s.\n", ctrl_ifname);
15888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
15898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Could not connect to interface '%s' - re-trying\n",
15908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       ctrl_ifname);
15918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
15938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_reconfigure(struct wpa_ctrl *ctrl, int argc,
15978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
15988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "RECONFIGURE");
16008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_terminate(struct wpa_ctrl *ctrl, int argc,
16048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 char *argv[])
16058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "TERMINATE");
16078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface_add(struct wpa_ctrl *ctrl, int argc,
16118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
16128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
16148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
16158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1) {
16178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid INTERFACE_ADD command: needs at least one "
16188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "argument (interface name)\n"
16198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "All arguments: ifname confname driver ctrl_interface "
16208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "driver_param bridge_name\n");
16218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
16228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/*
16258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * INTERFACE_ADD <ifname>TAB<confname>TAB<driver>TAB<ctrl_interface>TAB
16268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * <driver_param>TAB<bridge_name>
16278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
16288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd),
16298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  "INTERFACE_ADD %s\t%s\t%s\t%s\t%s\t%s",
16308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0],
16318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argc > 1 ? argv[1] : "", argc > 2 ? argv[2] : "",
16328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argc > 3 ? argv[3] : "", argc > 4 ? argv[4] : "",
16338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argc > 5 ? argv[5] : "");
16348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
16358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
16368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
16378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
16388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface_remove(struct wpa_ctrl *ctrl, int argc,
16428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					char *argv[])
16438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
164461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "INTERFACE_REMOVE", 1, argc, argv);
16458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface_list(struct wpa_ctrl *ctrl, int argc,
16498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
16508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "INTERFACE_LIST");
16528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_AP
16568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_sta(struct wpa_ctrl *ctrl, int argc, char *argv[])
16578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
165861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "STA", 1, argc, argv);
16598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_ctrl_command_sta(struct wpa_ctrl *ctrl, char *cmd,
16638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				char *addr, size_t addr_len)
16648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char buf[4096], *pos;
16668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
16678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret;
16688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL) {
16708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Not connected to hostapd - command dropped.\n");
16718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
16728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = sizeof(buf) - 1;
167404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len,
16758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       wpa_cli_msg_cb);
16768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret == -2) {
16778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command timed out.\n", cmd);
16788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -2;
16798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (ret < 0) {
16808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command failed.\n", cmd);
16818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
16828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	buf[len] = '\0';
168504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (os_memcmp(buf, "FAIL", 4) == 0)
16868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
16878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("%s", buf);
16888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = buf;
16908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*pos != '\0' && *pos != '\n')
16918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos++;
16928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	*pos = '\0';
16938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_strlcpy(addr, buf, addr_len);
16948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
16958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_all_sta(struct wpa_ctrl *ctrl, int argc, char *argv[])
16998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char addr[32], cmd[64];
17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_ctrl_command_sta(ctrl, "STA-FIRST", addr, sizeof(addr)))
17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
17048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	do {
17058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(cmd, sizeof(cmd), "STA-NEXT %s", addr);
17068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} while (wpa_ctrl_command_sta(ctrl, cmd, addr, sizeof(addr)) == 0);
17078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
17098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
171004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
171104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
171204949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_deauthenticate(struct wpa_ctrl *ctrl, int argc,
171304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				      char *argv[])
171404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
171561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "DEAUTHENTICATE", 1, argc, argv);
171604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
171704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
171804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
171904949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_disassociate(struct wpa_ctrl *ctrl, int argc,
172004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				    char *argv[])
172104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
172261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "DISASSOCIATE", 1, argc, argv);
172304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
17248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_AP */
17258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_suspend(struct wpa_ctrl *ctrl, int argc, char *argv[])
17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "SUSPEND");
17308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_resume(struct wpa_ctrl *ctrl, int argc, char *argv[])
17348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "RESUME");
17368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_drop_sa(struct wpa_ctrl *ctrl, int argc, char *argv[])
17408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "DROP_SA");
17428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_roam(struct wpa_ctrl *ctrl, int argc, char *argv[])
17468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
174761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "ROAM", 1, argc, argv);
17488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P
17528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_find(struct wpa_ctrl *ctrl, int argc, char *argv[])
17548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
175561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_FIND", 0, argc, argv);
175661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
17578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
175961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic char ** wpa_cli_complete_p2p_find(const char *str, int pos)
176061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
176161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	char **res = NULL;
176261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
176361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
176461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res = os_calloc(6, sizeof(char *));
176561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (res == NULL)
176661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return NULL;
176761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res[0] = os_strdup("type=social");
176861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (res[0] == NULL) {
176961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		os_free(res);
177061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return NULL;
177161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
177261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res[1] = os_strdup("type=progressive");
177361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (res[1] == NULL)
177461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return res;
177561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res[2] = os_strdup("delay=");
177661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (res[2] == NULL)
177761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return res;
177861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res[3] = os_strdup("dev_id=");
177961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (res[3] == NULL)
178061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return res;
178161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (arg == 1)
178261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		res[4] = os_strdup("[timeout]");
178361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
178461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return res;
17858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_stop_find(struct wpa_ctrl *ctrl, int argc,
17898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
17908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_STOP_FIND");
17928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_connect(struct wpa_ctrl *ctrl, int argc,
17968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
17978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
179861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_CONNECT", 2, argc, argv);
17998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** wpa_cli_complete_p2p_connect(const char *str, int pos)
18031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
18041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
18051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char **res = NULL;
18061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	switch (arg) {
18081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	case 1:
18091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		res = cli_txt_list_array(&p2p_peers);
18101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		break;
18111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
18121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
18141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
18151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_listen(struct wpa_ctrl *ctrl, int argc,
18188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
18198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
182061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_LISTEN", 0, argc, argv);
18218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_group_remove(struct wpa_ctrl *ctrl, int argc,
18258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					char *argv[])
18268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
182761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_GROUP_REMOVE", 1, argc, argv);
18288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** wpa_cli_complete_p2p_group_remove(const char *str, int pos)
18321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
18331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
18341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char **res = NULL;
18351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	switch (arg) {
18371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	case 1:
18381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		res = cli_txt_list_array(&p2p_groups);
18391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		break;
18401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
18411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
18431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
18441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_group_add(struct wpa_ctrl *ctrl, int argc,
18478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					char *argv[])
18488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
184961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_GROUP_ADD", 0, argc, argv);
18508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_prov_disc(struct wpa_ctrl *ctrl, int argc,
18548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
18558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (argc != 2 && argc != 3) {
18571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		printf("Invalid P2P_PROV_DISC command: needs at least "
18581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		       "two arguments, address and config method\n"
18591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		       "(display, keypad, or pbc) and an optional join\n");
18608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
18618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
186361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_PROV_DISC", 2, argc, argv);
18648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_get_passphrase(struct wpa_ctrl *ctrl, int argc,
18688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  char *argv[])
18698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_GET_PASSPHRASE");
18718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_req(struct wpa_ctrl *ctrl, int argc,
18758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 char *argv[])
18768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[4096];
18788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2 && argc != 4) {
18808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SERV_DISC_REQ command: needs two "
18818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments (address and TLVs) or four arguments "
18828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(address, \"upnp\", version, search target "
18838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(SSDP ST:)\n");
18848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
18858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
188761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (write_cmd(cmd, sizeof(cmd), "P2P_SERV_DISC_REQ", argc, argv) < 0)
18888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
18898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
18908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_cancel_req(struct wpa_ctrl *ctrl,
18948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						int argc, char *argv[])
18958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
189661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_SERV_DISC_CANCEL_REQ", 1, argc, argv);
18978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_resp(struct wpa_ctrl *ctrl, int argc,
19018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  char *argv[])
19028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[4096];
19048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
19058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 4) {
19078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SERV_DISC_RESP command: needs four "
19088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments (freq, address, dialog token, and TLVs)\n");
19098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "P2P_SERV_DISC_RESP %s %s %s %s",
19138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1], argv[2], argv[3]);
19148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
19158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
19178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
19188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_update(struct wpa_ctrl *ctrl, int argc,
19228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  char *argv[])
19238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_SERVICE_UPDATE");
19258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_external(struct wpa_ctrl *ctrl,
19298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      int argc, char *argv[])
19308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
193161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_SERV_DISC_EXTERNAL", 1, argc, argv);
19328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_flush(struct wpa_ctrl *ctrl, int argc,
19368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 char *argv[])
19378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_SERVICE_FLUSH");
19398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_add(struct wpa_ctrl *ctrl, int argc,
19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[4096];
19468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
19478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 3 && argc != 4) {
19498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SERVICE_ADD command: needs three or four "
19508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments\n");
19518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 4)
19558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_SERVICE_ADD %s %s %s %s",
19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2], argv[3]);
19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_SERVICE_ADD %s %s %s",
19618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2]);
19628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
19638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
19658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
19668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_del(struct wpa_ctrl *ctrl, int argc,
19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[4096];
19738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
19748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2 && argc != 3) {
19768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SERVICE_DEL command: needs two or three "
19778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments\n");
19788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 3)
19828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
19838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_SERVICE_DEL %s %s %s",
19848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2]);
19858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
19868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
19878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_SERVICE_DEL %s %s",
19888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
19898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
19908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
19928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
19938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_reject(struct wpa_ctrl *ctrl,
19978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  int argc, char *argv[])
19988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
199961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_REJECT", 1, argc, argv);
20008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_invite(struct wpa_ctrl *ctrl,
20048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  int argc, char *argv[])
20058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
200661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_INVITE", 1, argc, argv);
20078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_peer(struct wpa_ctrl *ctrl, int argc, char *argv[])
20118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
201261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_PEER", 1, argc, argv);
20138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** wpa_cli_complete_p2p_peer(const char *str, int pos)
20171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
20181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
20191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char **res = NULL;
20201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
20211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	switch (arg) {
20221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	case 1:
20231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		res = cli_txt_list_array(&p2p_peers);
20241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		break;
20251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
20261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
20271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
20281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
20291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
20301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
20318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_ctrl_command_p2p_peer(struct wpa_ctrl *ctrl, char *cmd,
20328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *addr, size_t addr_len,
20338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     int discovered)
20348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
20358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char buf[4096], *pos;
20368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
20378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret;
20388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL)
20408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
20418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = sizeof(buf) - 1;
204204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len,
20438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       wpa_cli_msg_cb);
20448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret == -2) {
20458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command timed out.\n", cmd);
20468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -2;
20478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (ret < 0) {
20488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command failed.\n", cmd);
20498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
20508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
20518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	buf[len] = '\0';
205304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (os_memcmp(buf, "FAIL", 4) == 0)
20548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
20558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = buf;
20578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*pos != '\0' && *pos != '\n')
20588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos++;
20598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	*pos++ = '\0';
20608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_strlcpy(addr, buf, addr_len);
20618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!discovered || os_strstr(pos, "[PROBE_REQ_ONLY]") == NULL)
20628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("%s\n", addr);
20638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
20648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_peers(struct wpa_ctrl *ctrl, int argc, char *argv[])
20688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
20698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char addr[32], cmd[64];
20708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int discovered;
20718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	discovered = argc > 0 && os_strcmp(argv[0], "discovered") == 0;
20738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_ctrl_command_p2p_peer(ctrl, "P2P_PEER FIRST",
20758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      addr, sizeof(addr), discovered))
20761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return -1;
20778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	do {
20788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(cmd, sizeof(cmd), "P2P_PEER NEXT-%s", addr);
20798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} while (wpa_ctrl_command_p2p_peer(ctrl, cmd, addr, sizeof(addr),
20808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			 discovered) == 0);
20818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return 0;
20838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_set(struct wpa_ctrl *ctrl, int argc, char *argv[])
20878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
208861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_SET", 2, argc, argv);
20898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2092391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidtstatic char ** wpa_cli_complete_p2p_set(const char *str, int pos)
2093391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt{
2094391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
2095391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	const char *fields[] = {
2096391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"discoverability",
2097391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"managed",
2098391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"listen_channel",
2099391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"ssid_postfix",
2100391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"noa",
2101391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"ps",
2102391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"oppps",
2103391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"ctwindow",
2104391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"disabled",
2105391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"conc_pref",
2106391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"force_long_sd",
2107391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"peer_filter",
2108391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"cross_connect",
2109391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"go_apsd",
2110391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"client_apsd",
2111391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"disallow_freq",
2112391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"disc_int",
2113391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"per_sta_psk",
2114391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	};
2115391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	int i, num_fields = sizeof(fields) / sizeof(fields[0]);
2116391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
2117391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	if (arg == 1) {
2118391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		char **res = os_calloc(num_fields + 1, sizeof(char *));
2119391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		if (res == NULL)
2120391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt			return NULL;
2121391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		for (i = 0; i < num_fields; i++) {
2122391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt			res[i] = os_strdup(fields[i]);
2123391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt			if (res[i] == NULL)
2124391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt				return res;
2125391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		}
2126391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		return res;
2127391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	}
2128391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
2129391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	if (arg == 2 && os_strncasecmp(str, "p2p_set peer_filter ", 20) == 0)
2130391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		return cli_txt_list_array(&p2p_peers);
2131391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
2132391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	return NULL;
2133391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt}
2134391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
2135391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
21368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_flush(struct wpa_ctrl *ctrl, int argc, char *argv[])
21378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_FLUSH");
21398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_cancel(struct wpa_ctrl *ctrl, int argc,
21438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
21448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_CANCEL");
21468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_unauthorize(struct wpa_ctrl *ctrl, int argc,
21508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
21518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
215261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_UNAUTHORIZE", 1, argc, argv);
215361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
21548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
215561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
215661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_p2p_presence_req(struct wpa_ctrl *ctrl, int argc,
215761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					char *argv[])
215861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
215961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (argc != 0 && argc != 2 && argc != 4) {
216061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		printf("Invalid P2P_PRESENCE_REQ command: needs two arguments "
216161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "(preferred duration, interval; in microsecods).\n"
216261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "Optional second pair can be used to provide "
216361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "acceptable values.\n");
216461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return -1;
216561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
216661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
216761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_PRESENCE_REQ", 0, argc, argv);
216861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
216961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
217061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
217161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_p2p_ext_listen(struct wpa_ctrl *ctrl, int argc,
217261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				      char *argv[])
217361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
217461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (argc != 0 && argc != 2) {
217561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		printf("Invalid P2P_EXT_LISTEN command: needs two arguments "
217661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "(availability period, availability interval; in "
217761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "millisecods).\n"
217861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "Extended Listen Timing can be cancelled with this "
217961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "command when used without parameters.\n");
21808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
21818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
21828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
218361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_EXT_LISTEN", 0, argc, argv);
21848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2186391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
2187391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidtstatic int wpa_cli_cmd_p2p_remove_client(struct wpa_ctrl *ctrl, int argc,
2188391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt					 char *argv[])
2189391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt{
2190391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_REMOVE_CLIENT", 1, argc, argv);
2191391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt}
2192391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
219361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_P2P */
21948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
219561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#ifdef CONFIG_WIFI_DISPLAY
219661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
219761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_wfd_subelem_set(struct wpa_ctrl *ctrl, int argc,
219861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				       char *argv[])
21998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
22008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
22018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
22028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
220361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (argc != 1 && argc != 2) {
220461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		printf("Invalid WFD_SUBELEM_SET command: needs one or two "
220561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "arguments (subelem, hexdump)\n");
22068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
22078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
22088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
220961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "WFD_SUBELEM_SET %s %s",
221061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			  argv[0], argc > 1 ? argv[1] : "");
22118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
22128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
22138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
22148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
22158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
22168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
221861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_wfd_subelem_get(struct wpa_ctrl *ctrl, int argc,
221961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				       char *argv[])
22208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
22218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
22228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
22238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
222461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (argc != 1) {
222561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		printf("Invalid WFD_SUBELEM_GET command: needs one "
222661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "argument (subelem)\n");
22278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
22288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
22298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
223061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "WFD_SUBELEM_GET %s",
223161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			  argv[0]);
22328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
22338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
22348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
22358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
22368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
223761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_WIFI_DISPLAY */
22388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_INTERWORKING
22411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_fetch_anqp(struct wpa_ctrl *ctrl, int argc,
22421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				  char *argv[])
22431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
22441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpa_ctrl_command(ctrl, "FETCH_ANQP");
22451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
22461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_stop_fetch_anqp(struct wpa_ctrl *ctrl, int argc,
22491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				       char *argv[])
22501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
22511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpa_ctrl_command(ctrl, "STOP_FETCH_ANQP");
22521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
22531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_interworking_select(struct wpa_ctrl *ctrl, int argc,
22561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					   char *argv[])
22571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
225861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "INTERWORKING_SELECT", 0, argc, argv);
22591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
22601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_interworking_connect(struct wpa_ctrl *ctrl, int argc,
22631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					    char *argv[])
22641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
226561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "INTERWORKING_CONNECT", 1, argc, argv);
226661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
22671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
226961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_anqp_get(struct wpa_ctrl *ctrl, int argc, char *argv[])
227061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
227161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "ANQP_GET", 2, argc, argv);
22721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
22731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
227561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_gas_request(struct wpa_ctrl *ctrl, int argc,
227661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				   char *argv[])
22771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
227861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "GAS_REQUEST", 2, argc, argv);
227961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
22801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
228261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_gas_response_get(struct wpa_ctrl *ctrl, int argc,
228361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					char *argv[])
228461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
228561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "GAS_RESPONSE_GET", 2, argc, argv);
22861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
22871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_INTERWORKING */
22881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
229004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_HS20
229104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
229204949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_hs20_anqp_get(struct wpa_ctrl *ctrl, int argc,
229304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				     char *argv[])
229404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
229561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "HS20_ANQP_GET", 2, argc, argv);
229604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
229704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
229804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
229904949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_get_nai_home_realm_list(struct wpa_ctrl *ctrl, int argc,
230004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       char *argv[])
230104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
230204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char cmd[512];
230304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
230404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (argc == 0) {
230504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		printf("Command needs one or two arguments (dst mac addr and "
230604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		       "optional home realm)\n");
230704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
230804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
230904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
231061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (write_cmd(cmd, sizeof(cmd), "HS20_GET_NAI_HOME_REALM_LIST",
231161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		      argc, argv) < 0)
231204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
231304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
231404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
231504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
231604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
231704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_HS20 */
231804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
231904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
23208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_sta_autoconnect(struct wpa_ctrl *ctrl, int argc,
23218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
23228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
232361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "STA_AUTOCONNECT", 1, argc, argv);
23248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_tdls_discover(struct wpa_ctrl *ctrl, int argc,
23288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
23298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
233061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "TDLS_DISCOVER", 1, argc, argv);
23318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_tdls_setup(struct wpa_ctrl *ctrl, int argc,
23358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
23368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
233761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "TDLS_SETUP", 1, argc, argv);
23388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_tdls_teardown(struct wpa_ctrl *ctrl, int argc,
23428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
23438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
234461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "TDLS_TEARDOWN", 1, argc, argv);
23458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_signal_poll(struct wpa_ctrl *ctrl, int argc,
23498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
23508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
23518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "SIGNAL_POLL");
23528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2355fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zhengstatic int wpa_cli_cmd_pktcnt_poll(struct wpa_ctrl *ctrl, int argc,
2356fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng				   char *argv[])
2357fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng{
2358fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng	return wpa_ctrl_command(ctrl, "PKTCNT_POLL");
2359fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng}
2360fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng
2361fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng
23621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_reauthenticate(struct wpa_ctrl *ctrl, int argc,
23631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				      char *argv[])
23641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
23651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpa_ctrl_command(ctrl, "REAUTHENTICATE");
23661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
23671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
236804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
236904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN
237004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
237104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_autoscan(struct wpa_ctrl *ctrl, int argc, char *argv[])
237204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
237304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (argc == 0)
237404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return wpa_ctrl_command(ctrl, "AUTOSCAN ");
237504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
237661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "AUTOSCAN", 0, argc, argv);
237704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
237804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
237904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */
238004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
238104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
2382a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt#ifdef CONFIG_WNM
2383a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt
2384a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidtstatic int wpa_cli_cmd_wnm_sleep(struct wpa_ctrl *ctrl, int argc, char *argv[])
2385a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt{
2386a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WNM_SLEEP", 0, argc, argv);
2387a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt}
2388a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt
238944c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt
239044c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidtstatic int wpa_cli_cmd_wnm_bss_query(struct wpa_ctrl *ctrl, int argc, char *argv[])
239144c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt{
239244c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WNM_BSS_QUERY", 1, argc, argv);
239344c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt}
239444c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt
2395a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt#endif /* CONFIG_WNM */
2396a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt
2397a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt
239861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_raw(struct wpa_ctrl *ctrl, int argc, char *argv[])
239961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
240061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (argc == 0)
240161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return -1;
240261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, argv[0], 0, argc - 1, &argv[1]);
240361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
240461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
240561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
2406c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#ifdef ANDROID
24070716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidtstatic int wpa_cli_cmd_driver(struct wpa_ctrl *ctrl, int argc, char *argv[])
24080716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt{
24090716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	char cmd[256];
24100716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	int i;
24110716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	int len;
24120716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt
24130716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	if (argc < 1) {
24140716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt		printf("Invalid DRIVER command: needs one argument (cmd)\n");
24150716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt		return -1;
24160716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	}
24170716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt
24180716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	len = os_snprintf(cmd, sizeof(cmd), "DRIVER %s", argv[0]);
24190716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	for (i=1; i < argc; i++)
24200716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt		len += os_snprintf(cmd + len, sizeof(cmd) - len, " %s", argv[i]);
24210716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
24220716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	printf("%s: %s\n", __func__, cmd);
24230716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
24240716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt}
2425c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#endif
24260716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt
242761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
2428444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidtstatic int wpa_cli_cmd_flush(struct wpa_ctrl *ctrl, int argc, char *argv[])
2429444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt{
2430444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt	return wpa_ctrl_command(ctrl, "FLUSH");
2431444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt}
2432444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt
2433444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt
24348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtenum wpa_cli_cmd_flags {
24358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cli_cmd_flag_none		= 0x00,
24368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cli_cmd_flag_sensitive		= 0x01
24378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
24388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpa_cli_cmd {
24408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *cmd;
24418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int (*handler)(struct wpa_ctrl *ctrl, int argc, char *argv[]);
244261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	char ** (*completion)(const char *str, int pos);
24438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	enum wpa_cli_cmd_flags flags;
24448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *usage;
24458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
24468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_cli_cmd wpa_cli_commands[] = {
244861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "status", wpa_cli_cmd_status, NULL,
24498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[verbose] = get current WPA/EAPOL/EAP status" },
245161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "ifname", wpa_cli_cmd_ifname, NULL,
245261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
245361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "= get current interface name" },
245461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "ping", wpa_cli_cmd_ping, NULL,
24558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= pings wpa_supplicant" },
245761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "relog", wpa_cli_cmd_relog, NULL,
24588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= re-open log-file (allow rolling logs)" },
246061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "note", wpa_cli_cmd_note, NULL,
24618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<text> = add a note to wpa_supplicant debug log" },
246361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "mib", wpa_cli_cmd_mib, NULL,
24648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get MIB variables (dot1x, dot11)" },
246661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "help", wpa_cli_cmd_help, wpa_cli_complete_help,
24678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
246861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "[command] = show usage help" },
246961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "interface", wpa_cli_cmd_interface, NULL,
24708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[ifname] = show interfaces/select interface" },
247261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "level", wpa_cli_cmd_level, NULL,
24738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<debug level> = change debug level" },
247561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "license", wpa_cli_cmd_license, NULL,
24768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= show full wpa_cli license" },
247861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "quit", wpa_cli_cmd_quit, NULL,
24798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= exit wpa_cli" },
248151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	{ "set", wpa_cli_cmd_set, wpa_cli_complete_set,
24828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= set variables (shows list of variables when run without "
24848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "arguments)" },
248561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "get", wpa_cli_cmd_get, NULL,
24868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<name> = get information" },
248861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "logon", wpa_cli_cmd_logon, NULL,
24898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= IEEE 802.1X EAPOL state machine logon" },
249161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "logoff", wpa_cli_cmd_logoff, NULL,
24928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= IEEE 802.1X EAPOL state machine logoff" },
249461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "pmksa", wpa_cli_cmd_pmksa, NULL,
24958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= show PMKSA cache" },
249761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "reassociate", wpa_cli_cmd_reassociate, NULL,
24988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= force reassociation" },
250061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "preauthenticate", wpa_cli_cmd_preauthenticate, wpa_cli_complete_bss,
25018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<BSSID> = force preauthentication" },
250361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "identity", wpa_cli_cmd_identity, NULL,
25048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <identity> = configure identity for an SSID" },
250661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "password", wpa_cli_cmd_password, NULL,
25078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
25088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <password> = configure password for an SSID" },
250961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "new_password", wpa_cli_cmd_new_password, NULL,
25108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
25118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <password> = change password for an SSID" },
251261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "pin", wpa_cli_cmd_pin, NULL,
25138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
25148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <pin> = configure pin for an SSID" },
251561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "otp", wpa_cli_cmd_otp, NULL,
25168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
25178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <password> = configure one-time-password for an SSID"
25188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	},
251961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "passphrase", wpa_cli_cmd_passphrase, NULL,
25208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
25218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <passphrase> = configure private key passphrase\n"
25228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  for an SSID" },
2523051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	{ "sim", wpa_cli_cmd_sim, NULL,
2524051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	  cli_cmd_flag_sensitive,
2525051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	  "<network id> <pin> = report SIM operation result" },
252661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "bssid", wpa_cli_cmd_bssid, NULL,
25278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <BSSID> = set preferred BSSID for an SSID" },
252961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "blacklist", wpa_cli_cmd_blacklist, wpa_cli_complete_bss,
2530696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  cli_cmd_flag_none,
2531696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  "<BSSID> = add a BSSID to the blacklist\n"
2532696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  "blacklist clear = clear the blacklist\n"
2533696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  "blacklist = display the blacklist" },
253461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "log_level", wpa_cli_cmd_log_level, NULL,
2535696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  cli_cmd_flag_none,
25361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "<level> [<timestamp>] = update the log level/timestamp\n"
2537696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  "log_level = display the current log level and log options" },
253861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "list_networks", wpa_cli_cmd_list_networks, NULL,
25398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= list configured networks" },
254161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "select_network", wpa_cli_cmd_select_network, NULL,
25428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> = select a network (disable others)" },
254461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "enable_network", wpa_cli_cmd_enable_network, NULL,
25458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> = enable a network" },
254761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "disable_network", wpa_cli_cmd_disable_network, NULL,
25488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> = disable a network" },
255061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "add_network", wpa_cli_cmd_add_network, NULL,
25518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= add a network" },
255361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "remove_network", wpa_cli_cmd_remove_network, NULL,
25548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> = remove a network" },
255661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "set_network", wpa_cli_cmd_set_network, NULL,
25578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
25588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <variable> <value> = set network variables (shows\n"
25598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  list of variables when run without arguments)" },
256061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "get_network", wpa_cli_cmd_get_network, NULL,
25618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <variable> = get network variables" },
256361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "list_creds", wpa_cli_cmd_list_creds, NULL,
256404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_none,
256504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "= list configured credentials" },
256661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "add_cred", wpa_cli_cmd_add_cred, NULL,
256704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_none,
256804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "= add a credential" },
256961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "remove_cred", wpa_cli_cmd_remove_cred, NULL,
257004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_none,
257104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<cred id> = remove a credential" },
257261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "set_cred", wpa_cli_cmd_set_cred, NULL,
257304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_sensitive,
257404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<cred id> <variable> <value> = set credential variables" },
257561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "save_config", wpa_cli_cmd_save_config, NULL,
25768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= save the current configuration" },
257861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "disconnect", wpa_cli_cmd_disconnect, NULL,
25798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= disconnect and wait for reassociate/reconnect command before\n"
25818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  connecting" },
258261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "reconnect", wpa_cli_cmd_reconnect, NULL,
25838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= like reassociate, but only takes effect if already disconnected"
25858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	},
258661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "scan", wpa_cli_cmd_scan, NULL,
25878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= request new BSS scan" },
258961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "scan_results", wpa_cli_cmd_scan_results, NULL,
25908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get latest scan results" },
259261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "bss", wpa_cli_cmd_bss, wpa_cli_complete_bss,
25938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<<idx> | <bssid>> = get detailed scan result info" },
259561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "get_capability", wpa_cli_cmd_get_capability, NULL,
25968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25978da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt	  "<eap/pairwise/group/key_mgmt/proto/auth_alg/channels/freq/modes> "
259861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "= get capabilies" },
259961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "reconfigure", wpa_cli_cmd_reconfigure, NULL,
26008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= force wpa_supplicant to re-read its configuration file" },
260261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "terminate", wpa_cli_cmd_terminate, NULL,
26038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= terminate wpa_supplicant" },
260561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "interface_add", wpa_cli_cmd_interface_add, NULL,
26068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<ifname> <confname> <driver> <ctrl_interface> <driver_param>\n"
26088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  <bridge_name> = adds new interface, all parameters but <ifname>\n"
26098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  are optional" },
261061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "interface_remove", wpa_cli_cmd_interface_remove, NULL,
26118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<ifname> = removes the interface" },
261361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "interface_list", wpa_cli_cmd_interface_list, NULL,
26148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= list available interfaces" },
261661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "ap_scan", wpa_cli_cmd_ap_scan, NULL,
26178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<value> = set ap_scan parameter" },
261961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "scan_interval", wpa_cli_cmd_scan_interval, NULL,
26208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<value> = set scan_interval parameter (in seconds)" },
262261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "bss_expire_age", wpa_cli_cmd_bss_expire_age, NULL,
26238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<value> = set BSS expiration age parameter" },
262561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "bss_expire_count", wpa_cli_cmd_bss_expire_count, NULL,
26268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<value> = set BSS expiration scan count parameter" },
262861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "bss_flush", wpa_cli_cmd_bss_flush, NULL,
2629f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	  cli_cmd_flag_none,
2630f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	  "<value> = set BSS flush age (0 by default)" },
263161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "stkstart", wpa_cli_cmd_stkstart, NULL,
26328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request STK negotiation with <addr>" },
263461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "ft_ds", wpa_cli_cmd_ft_ds, wpa_cli_complete_bss,
26358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request over-the-DS FT with <addr>" },
263761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_pbc", wpa_cli_cmd_wps_pbc, wpa_cli_complete_bss,
26388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[BSSID] = start Wi-Fi Protected Setup: Push Button Configuration" },
264061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_pin", wpa_cli_cmd_wps_pin, wpa_cli_complete_bss,
26418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
26428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<BSSID> [PIN] = start WPS PIN method (returns PIN, if not "
26438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "hardcoded)" },
264461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_check_pin", wpa_cli_cmd_wps_check_pin, NULL,
26458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
26468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<PIN> = verify PIN checksum" },
264761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_cancel", wpa_cli_cmd_wps_cancel, NULL, cli_cmd_flag_none,
26488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "Cancels the pending WPS operation" },
264904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_WPS_NFC
265061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_nfc", wpa_cli_cmd_wps_nfc, wpa_cli_complete_bss,
265104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_none,
265204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "[BSSID] = start Wi-Fi Protected Setup: NFC" },
2653f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	{ "wps_nfc_config_token", wpa_cli_cmd_wps_nfc_config_token, NULL,
2654f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	  cli_cmd_flag_none,
2655f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	  "<WPS|NDEF> = build configuration token" },
265661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_nfc_token", wpa_cli_cmd_wps_nfc_token, NULL,
265704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_none,
265804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<WPS|NDEF> = create password token" },
265961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_nfc_tag_read", wpa_cli_cmd_wps_nfc_tag_read, NULL,
266004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_sensitive,
266104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<hexdump of payload> = report read NFC tag with WPS data" },
2662d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	{ "nfc_get_handover_req", wpa_cli_cmd_nfc_get_handover_req, NULL,
2663d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	  cli_cmd_flag_none,
2664d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	  "<NDEF> <WPS> = create NFC handover request" },
2665d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	{ "nfc_get_handover_sel", wpa_cli_cmd_nfc_get_handover_sel, NULL,
2666d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	  cli_cmd_flag_none,
2667d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	  "<NDEF> <WPS> = create NFC handover select" },
2668d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	{ "nfc_rx_handover_req", wpa_cli_cmd_nfc_rx_handover_req, NULL,
2669d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	  cli_cmd_flag_none,
2670d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	  "<hexdump of payload> = report received NFC handover request" },
2671d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	{ "nfc_rx_handover_sel", wpa_cli_cmd_nfc_rx_handover_sel, NULL,
2672d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	  cli_cmd_flag_none,
2673d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	  "<hexdump of payload> = report received NFC handover select" },
2674f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	{ "nfc_report_handover", wpa_cli_cmd_nfc_report_handover, NULL,
2675f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	  cli_cmd_flag_none,
2676f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	  "<role> <type> <hexdump of req> <hexdump of sel> = report completed "
2677f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	  "NFC handover" },
267804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_WPS_NFC */
267961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_reg", wpa_cli_cmd_wps_reg, wpa_cli_complete_bss,
26808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
26818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<BSSID> <AP PIN> = start WPS Registrar to configure an AP" },
268261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_ap_pin", wpa_cli_cmd_wps_ap_pin, NULL,
26838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
26848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[params..] = enable/disable AP PIN" },
268561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_er_start", wpa_cli_cmd_wps_er_start, NULL,
26868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[IP address] = start Wi-Fi Protected Setup External Registrar" },
268861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_er_stop", wpa_cli_cmd_wps_er_stop, NULL,
26898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= stop Wi-Fi Protected Setup External Registrar" },
269161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_er_pin", wpa_cli_cmd_wps_er_pin, NULL,
26928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
26938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> <PIN> = add an Enrollee PIN to External Registrar" },
269461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_er_pbc", wpa_cli_cmd_wps_er_pbc, NULL,
26958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> = accept an Enrollee PBC using External Registrar" },
269761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_er_learn", wpa_cli_cmd_wps_er_learn, NULL,
26988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
26998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> <PIN> = learn AP configuration" },
270061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_er_set_config", wpa_cli_cmd_wps_er_set_config, NULL,
27018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> <network id> = set AP configuration for enrolling" },
270361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_er_config", wpa_cli_cmd_wps_er_config, NULL,
27048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
27058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> <PIN> <SSID> <auth> <encr> <key> = configure AP" },
270604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_WPS_NFC
270761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_er_nfc_config_token", wpa_cli_cmd_wps_er_nfc_config_token, NULL,
270804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_none,
270904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<WPS/NDEF> <UUID> = build NFC configuration token" },
271004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_WPS_NFC */
271161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "ibss_rsn", wpa_cli_cmd_ibss_rsn, NULL,
27128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request RSN authentication with <addr> in IBSS" },
27148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_AP
271561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "sta", wpa_cli_cmd_sta, NULL,
27168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = get information about an associated station (AP)" },
271861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "all_sta", wpa_cli_cmd_all_sta, NULL,
27198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get information about all associated stations (AP)" },
272161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "deauthenticate", wpa_cli_cmd_deauthenticate, NULL,
272204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_none,
272304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<addr> = deauthenticate a station" },
272461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "disassociate", wpa_cli_cmd_disassociate, NULL,
272504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_none,
272604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<addr> = disassociate a station" },
27278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_AP */
272861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "suspend", wpa_cli_cmd_suspend, NULL, cli_cmd_flag_none,
27298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= notification of suspend/hibernate" },
273061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "resume", wpa_cli_cmd_resume, NULL, cli_cmd_flag_none,
27318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= notification of resume/thaw" },
273261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "drop_sa", wpa_cli_cmd_drop_sa, NULL, cli_cmd_flag_none,
27338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= drop SA without deauth/disassoc (test command)" },
273461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "roam", wpa_cli_cmd_roam, wpa_cli_complete_bss,
27358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = roam to the specified BSS" },
27378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P
273861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_find", wpa_cli_cmd_p2p_find, wpa_cli_complete_p2p_find,
273961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
27408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[timeout] [type=*] = find P2P Devices for up-to timeout seconds" },
274161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_stop_find", wpa_cli_cmd_p2p_stop_find, NULL, cli_cmd_flag_none,
27428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= stop P2P Devices search" },
274361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_connect", wpa_cli_cmd_p2p_connect, wpa_cli_complete_p2p_connect,
274461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
274561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "<addr> <\"pbc\"|PIN> [ht40] = connect to a P2P Device" },
274661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_listen", wpa_cli_cmd_p2p_listen, NULL, cli_cmd_flag_none,
27478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[timeout] = listen for P2P Devices for up-to timeout seconds" },
274861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_group_remove", wpa_cli_cmd_p2p_group_remove,
274961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  wpa_cli_complete_p2p_group_remove, cli_cmd_flag_none,
27508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<ifname> = remove P2P group interface (terminate group if GO)" },
275161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_group_add", wpa_cli_cmd_p2p_group_add, NULL, cli_cmd_flag_none,
275261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "[ht40] = add a new P2P group (local end as GO)" },
275361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_prov_disc", wpa_cli_cmd_p2p_prov_disc,
275461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  wpa_cli_complete_p2p_peer, cli_cmd_flag_none,
27558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> <method> = request provisioning discovery" },
275661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_get_passphrase", wpa_cli_cmd_p2p_get_passphrase, NULL,
27578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get the passphrase for a group (GO only)" },
27598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_serv_disc_req", wpa_cli_cmd_p2p_serv_disc_req,
276061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  wpa_cli_complete_p2p_peer, cli_cmd_flag_none,
27618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> <TLVs> = schedule service discovery request" },
27628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_serv_disc_cancel_req", wpa_cli_cmd_p2p_serv_disc_cancel_req,
276361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  NULL, cli_cmd_flag_none,
27648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<id> = cancel pending service discovery request" },
276561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_serv_disc_resp", wpa_cli_cmd_p2p_serv_disc_resp, NULL,
27668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<freq> <addr> <dialog token> <TLVs> = service discovery response" },
276861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_service_update", wpa_cli_cmd_p2p_service_update, NULL,
27698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= indicate change in local services" },
277161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_serv_disc_external", wpa_cli_cmd_p2p_serv_disc_external, NULL,
27728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<external> = set external processing of service discovery" },
277461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_service_flush", wpa_cli_cmd_p2p_service_flush, NULL,
27758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= remove all stored service entries" },
277761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_service_add", wpa_cli_cmd_p2p_service_add, NULL,
27788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<bonjour|upnp> <query|version> <response|service> = add a local "
27808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "service" },
278161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_service_del", wpa_cli_cmd_p2p_service_del, NULL,
27828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<bonjour|upnp> <query|version> [|service] = remove a local "
27848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "service" },
278561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_reject", wpa_cli_cmd_p2p_reject, wpa_cli_complete_p2p_peer,
27868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = reject connection attempts from a specific peer" },
278861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_invite", wpa_cli_cmd_p2p_invite, NULL,
27898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<cmd> [peer=addr] = invite peer" },
279161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_peers", wpa_cli_cmd_p2p_peers, NULL, cli_cmd_flag_none,
27928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[discovered] = list known (optionally, only fully discovered) P2P "
27938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "peers" },
279461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_peer", wpa_cli_cmd_p2p_peer, wpa_cli_complete_p2p_peer,
279561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
27968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<address> = show information about known P2P peer" },
2797391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	{ "p2p_set", wpa_cli_cmd_p2p_set, wpa_cli_complete_p2p_set,
2798391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	  cli_cmd_flag_none,
27998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<field> <value> = set a P2P parameter" },
280061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_flush", wpa_cli_cmd_p2p_flush, NULL, cli_cmd_flag_none,
28018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= flush P2P state" },
280261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_cancel", wpa_cli_cmd_p2p_cancel, NULL, cli_cmd_flag_none,
28038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= cancel P2P group formation" },
280461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_unauthorize", wpa_cli_cmd_p2p_unauthorize,
280561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  wpa_cli_complete_p2p_peer, cli_cmd_flag_none,
28068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<address> = unauthorize a peer" },
280761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_presence_req", wpa_cli_cmd_p2p_presence_req, NULL,
280861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
28098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[<duration> <interval>] [<duration> <interval>] = request GO "
28108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "presence" },
281161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_ext_listen", wpa_cli_cmd_p2p_ext_listen, NULL,
281261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
28138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[<period> <interval>] = set extended listen timing" },
2814391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	{ "p2p_remove_client", wpa_cli_cmd_p2p_remove_client,
2815391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	  wpa_cli_complete_p2p_peer, cli_cmd_flag_none,
2816391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	  "<address|iface=address> = remove a peer from all groups" },
28178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */
281861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#ifdef CONFIG_WIFI_DISPLAY
281961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wfd_subelem_set", wpa_cli_cmd_wfd_subelem_set, NULL,
282061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
282161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "<subelem> [contents] = set Wi-Fi Display subelement" },
282261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wfd_subelem_get", wpa_cli_cmd_wfd_subelem_get, NULL,
282361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
282461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "<subelem> = get Wi-Fi Display subelement" },
282561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_WIFI_DISPLAY */
28261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_INTERWORKING
282761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "fetch_anqp", wpa_cli_cmd_fetch_anqp, NULL, cli_cmd_flag_none,
28281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "= fetch ANQP information for all APs" },
282961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "stop_fetch_anqp", wpa_cli_cmd_stop_fetch_anqp, NULL,
283061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
28311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "= stop fetch_anqp operation" },
283261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "interworking_select", wpa_cli_cmd_interworking_select, NULL,
28331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  cli_cmd_flag_none,
28341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "[auto] = perform Interworking network selection" },
28351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	{ "interworking_connect", wpa_cli_cmd_interworking_connect,
283661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  wpa_cli_complete_bss, cli_cmd_flag_none,
28371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "<BSSID> = connect using Interworking credentials" },
283861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "anqp_get", wpa_cli_cmd_anqp_get, wpa_cli_complete_bss,
283961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
28401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "<addr> <info id>[,<info id>]... = request ANQP information" },
284161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "gas_request", wpa_cli_cmd_gas_request, wpa_cli_complete_bss,
284261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
284361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "<addr> <AdvProtoID> [QueryReq] = GAS request" },
284461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "gas_response_get", wpa_cli_cmd_gas_response_get,
284561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  wpa_cli_complete_bss, cli_cmd_flag_none,
284661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "<addr> <dialog token> [start,len] = Fetch last GAS response" },
28471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_INTERWORKING */
284804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_HS20
284961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "hs20_anqp_get", wpa_cli_cmd_hs20_anqp_get, wpa_cli_complete_bss,
285061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
285104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<addr> <subtype>[,<subtype>]... = request HS 2.0 ANQP information"
285204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	},
285304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	{ "nai_home_realm_list", wpa_cli_cmd_get_nai_home_realm_list,
285461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  wpa_cli_complete_bss, cli_cmd_flag_none,
285504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<addr> <home realm> = get HS20 nai home realm list" },
285604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_HS20 */
285761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "sta_autoconnect", wpa_cli_cmd_sta_autoconnect, NULL,
285861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
28598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<0/1> = disable/enable automatic reconnection" },
286061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "tdls_discover", wpa_cli_cmd_tdls_discover, NULL,
28618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request TDLS discovery with <addr>" },
286361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "tdls_setup", wpa_cli_cmd_tdls_setup, NULL,
28648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request TDLS setup with <addr>" },
286661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "tdls_teardown", wpa_cli_cmd_tdls_teardown, NULL,
28678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = tear down TDLS with <addr>" },
286961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "signal_poll", wpa_cli_cmd_signal_poll, NULL,
28708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get signal parameters" },
287261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "pktcnt_poll", wpa_cli_cmd_pktcnt_poll, NULL,
2873fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng	  cli_cmd_flag_none,
2874fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng	  "= get TX/RX packet counters" },
287561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "reauthenticate", wpa_cli_cmd_reauthenticate, NULL,
287661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
28771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "= trigger IEEE 802.1X/EAPOL reauthentication" },
287804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN
287961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "autoscan", wpa_cli_cmd_autoscan, NULL, cli_cmd_flag_none,
288004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "[params] = Set or unset (if none) autoscan parameters" },
288104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */
2882a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt#ifdef CONFIG_WNM
2883a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt	{ "wnm_sleep", wpa_cli_cmd_wnm_sleep, NULL, cli_cmd_flag_none,
2884a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt	  "<enter/exit> [interval=#] = enter/exit WNM-Sleep mode" },
288544c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt	{ "wnm_bss_query", wpa_cli_cmd_wnm_bss_query, NULL, cli_cmd_flag_none,
288644c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt	  "<query reason> = Send BSS Transition Management Query" },
2887a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt#endif /* CONFIG_WNM */
288861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "raw", wpa_cli_cmd_raw, NULL, cli_cmd_flag_sensitive,
288961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "<params..> = Sent unprocessed command" },
2890444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt	{ "flush", wpa_cli_cmd_flush, NULL, cli_cmd_flag_none,
2891444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt	  "= flush wpa_supplicant state" },
2892c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#ifdef ANDROID
289361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "driver", wpa_cli_cmd_driver, NULL,
28940716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	  cli_cmd_flag_none,
28950716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	  "<command> = driver private commands" },
2896c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#endif
289761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ NULL, NULL, NULL, cli_cmd_flag_none, NULL }
28988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
28998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
29028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Prints command usage, lines are padded with the specified string.
29038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
29048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void print_cmd_help(struct wpa_cli_cmd *cmd, const char *pad)
29058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char c;
29078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t n;
29088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("%s%s ", pad, cmd->cmd);
29108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (n = 0; (c = cmd->usage[n]); n++) {
29118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("%c", c);
29128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (c == '\n')
29138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("%s", pad);
29148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
29158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("\n");
29168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
291961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void print_help(const char *cmd)
29208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int n;
29228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("commands:\n");
292361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	for (n = 0; wpa_cli_commands[n].cmd; n++) {
292461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (cmd == NULL || str_starts(wpa_cli_commands[n].cmd, cmd))
292561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			print_cmd_help(&wpa_cli_commands[n], "  ");
292661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
29278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_edit_filter_history_cb(void *ctx, const char *cmd)
29318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *c, *delim;
29338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int n;
29348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
29358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	delim = os_strchr(cmd, ' ');
29378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (delim)
29388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		len = delim - cmd;
29398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
29408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		len = os_strlen(cmd);
29418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (n = 0; (c = wpa_cli_commands[n].cmd); n++) {
29438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strncasecmp(cmd, c, len) == 0 && len == os_strlen(c))
29448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return (wpa_cli_commands[n].flags &
29458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				cli_cmd_flag_sensitive);
29468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
29478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
29488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char ** wpa_list_cmd_list(void)
29528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **res;
29548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, count;
2955f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	struct cli_txt_entry *e;
29568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	count = sizeof(wpa_cli_commands) / sizeof(wpa_cli_commands[0]);
2958f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	count += dl_list_len(&p2p_groups);
2959f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	count += dl_list_len(&ifnames);
2960f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	res = os_calloc(count + 1, sizeof(char *));
29618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res == NULL)
29628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
29638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; wpa_cli_commands[i].cmd; i++) {
29658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res[i] = os_strdup(wpa_cli_commands[i].cmd);
29668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (res[i] == NULL)
29678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
29688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
29698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2970f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	dl_list_for_each(e, &p2p_groups, struct cli_txt_entry, list) {
2971f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		size_t len = 8 + os_strlen(e->txt);
2972f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		res[i] = os_malloc(len);
2973f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		if (res[i] == NULL)
2974f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt			break;
2975f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		os_snprintf(res[i], len, "ifname=%s", e->txt);
2976f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		i++;
2977f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	}
2978f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
2979f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	dl_list_for_each(e, &ifnames, struct cli_txt_entry, list) {
2980f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		res[i] = os_strdup(e->txt);
2981f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		if (res[i] == NULL)
2982f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt			break;
2983f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		i++;
2984f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	}
2985f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
29868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return res;
29878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char ** wpa_cli_cmd_completion(const char *cmd, const char *str,
29918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      int pos)
29928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i;
29948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; wpa_cli_commands[i].cmd; i++) {
29968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcasecmp(wpa_cli_commands[i].cmd, cmd) == 0) {
299761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			if (wpa_cli_commands[i].completion)
299861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				return wpa_cli_commands[i].completion(str,
299961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt								      pos);
30008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			edit_clear_line();
30018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("\r%s\n", wpa_cli_commands[i].usage);
30028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			edit_redraw();
30038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
30048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
30058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
30088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char ** wpa_cli_edit_completion_cb(void *ctx, const char *str, int pos)
30128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **res;
30148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *end;
30158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *cmd;
30168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3017f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	if (pos > 7 && os_strncasecmp(str, "IFNAME=", 7) == 0) {
3018f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		end = os_strchr(str, ' ');
3019f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		if (end && pos > end - str) {
3020f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt			pos -= end - str + 1;
3021f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt			str = end + 1;
3022f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		}
3023f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	}
3024f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
30258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = os_strchr(str, ' ');
30268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (end == NULL || str + pos < end)
30278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_list_cmd_list();
30288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd = os_malloc(pos + 1);
30308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (cmd == NULL)
30318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
30328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memcpy(cmd, str, pos);
30338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[end - str] = '\0';
30348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = wpa_cli_cmd_completion(cmd, str, pos);
30358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(cmd);
30368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return res;
30378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_request(struct wpa_ctrl *ctrl, int argc, char *argv[])
30418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_cli_cmd *cmd, *match = NULL;
30438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int count;
30448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret = 0;
30458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3046f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	if (argc > 1 && os_strncasecmp(argv[0], "IFNAME=", 7) == 0) {
3047f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		ifname_prefix = argv[0] + 7;
3048f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		argv = &argv[1];
3049f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		argc--;
3050f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	} else
3051f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		ifname_prefix = NULL;
3052f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
3053f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	if (argc == 0)
3054f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		return -1;
3055f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
30568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	count = 0;
30578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd = wpa_cli_commands;
30588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (cmd->cmd) {
30598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strncasecmp(cmd->cmd, argv[0], os_strlen(argv[0])) == 0)
30608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		{
30618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			match = cmd;
30628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (os_strcasecmp(cmd->cmd, argv[0]) == 0) {
30638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				/* we have an exact match */
30648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				count = 1;
30658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
30668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
30678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			count++;
30688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
30698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		cmd++;
30708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (count > 1) {
30738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Ambiguous command '%s'; possible commands:", argv[0]);
30748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		cmd = wpa_cli_commands;
30758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		while (cmd->cmd) {
30768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (os_strncasecmp(cmd->cmd, argv[0],
30778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   os_strlen(argv[0])) == 0) {
30788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				printf(" %s", cmd->cmd);
30798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
30808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			cmd++;
30818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
30828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("\n");
30838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = 1;
30848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (count == 0) {
30858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Unknown command '%s'\n", argv[0]);
30868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = 1;
30878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
30888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = match->handler(ctrl, argc - 1, &argv[1]);
30898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return ret;
30928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int str_match(const char *a, const char *b)
30968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return os_strncmp(a, b, os_strlen(b)) == 0;
30988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_exec(const char *program, const char *arg1,
31028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			const char *arg2)
31038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *cmd;
31058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
31068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
31078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret = 0;
31088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = os_strlen(program) + os_strlen(arg1) + os_strlen(arg2) + 3;
31108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd = os_malloc(len);
31118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (cmd == NULL)
31128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
31138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, len, "%s %s %s", program, arg1, arg2);
31148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= len) {
31158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(cmd);
31168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
31178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
31188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[len - 1] = '\0';
31198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef _WIN32_WCE
31208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (system(cmd) < 0)
31218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = -1;
31228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _WIN32_WCE */
31238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(cmd);
31248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return ret;
31268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_action_process(const char *msg)
31308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *pos;
31328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *copy = NULL, *id, *pos2;
31338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = msg;
31358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (*pos == '<') {
31368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* skip priority */
31378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos = os_strchr(pos, '>');
31388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos)
31398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos++;
31408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else
31418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos = msg;
31428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
31438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (str_match(pos, WPA_EVENT_CONNECTED)) {
31458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int new_id = -1;
31468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_unsetenv("WPA_ID");
31478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_unsetenv("WPA_ID_STR");
31488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_unsetenv("WPA_CTRL_DIR");
31498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos = os_strstr(pos, "[id=");
31518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos)
31528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			copy = os_strdup(pos + 4);
31538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (copy) {
31558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos2 = id = copy;
31568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			while (*pos2 && *pos2 != ' ')
31578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos2++;
31588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*pos2++ = '\0';
31598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			new_id = atoi(id);
31608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_setenv("WPA_ID", id, 1);
31618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			while (*pos2 && *pos2 != '=')
31628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos2++;
31638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (*pos2 == '=')
31648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos2++;
31658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			id = pos2;
31668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			while (*pos2 && *pos2 != ']')
31678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos2++;
31688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*pos2 = '\0';
31698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_setenv("WPA_ID_STR", id, 1);
31708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(copy);
31718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
31728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_setenv("WPA_CTRL_DIR", ctrl_iface_dir, 1);
31748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3175391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		if (wpa_cli_connected <= 0 || new_id != wpa_cli_last_id) {
31768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_connected = 1;
31778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_last_id = new_id;
31788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_exec(action_file, ctrl_ifname, "CONNECTED");
31798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
31808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, WPA_EVENT_DISCONNECTED)) {
31818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpa_cli_connected) {
31828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_connected = 0;
31838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_exec(action_file, ctrl_ifname, "DISCONNECTED");
31848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
31858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, P2P_EVENT_GROUP_STARTED)) {
31868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
31878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, P2P_EVENT_GROUP_REMOVED)) {
31888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
31898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, P2P_EVENT_CROSS_CONNECT_ENABLE)) {
31908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
31918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, P2P_EVENT_CROSS_CONNECT_DISABLE)) {
31928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
31931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	} else if (str_match(pos, P2P_EVENT_GO_NEG_FAILURE)) {
31941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
31958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, WPS_EVENT_SUCCESS)) {
31968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
31978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, WPS_EVENT_FAIL)) {
31988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
31991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	} else if (str_match(pos, AP_STA_CONNECTED)) {
32001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
32011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	} else if (str_match(pos, AP_STA_DISCONNECTED)) {
32021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
3203f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	} else if (str_match(pos, ESS_DISASSOC_IMMINENT)) {
3204f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
32058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, WPA_EVENT_TERMINATING)) {
32068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("wpa_supplicant is terminating - stop monitoring\n");
32078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_quit = 1;
32088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
32098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
32108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_ANSI_C_EXTRA
32138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_action_cb(char *msg, size_t len)
32148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
32158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_action_process(msg);
32168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
32178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_ANSI_C_EXTRA */
32188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_reconnect(void)
32218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
32228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_close_connection();
322361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (wpa_cli_open_connection(ctrl_ifname, 1) < 0)
322461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return;
322561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
322661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (interactive) {
322761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		edit_clear_line();
322861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		printf("\rConnection to wpa_supplicant re-established\n");
322961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		edit_redraw();
323061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
32318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
32328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_event(const char *str)
32351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
32361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	const char *start, *s;
32371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
32381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	start = os_strchr(str, '>');
32391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (start == NULL)
32401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
32411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
32421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	start++;
32431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
32441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (str_starts(start, WPA_EVENT_BSS_ADDED)) {
32451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strchr(start, ' ');
32461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
32471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
32481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strchr(s + 1, ' ');
32491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
32501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
32511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_add(&bsses, s + 1);
32521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
32531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
32541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
32551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (str_starts(start, WPA_EVENT_BSS_REMOVED)) {
32561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strchr(start, ' ');
32571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
32581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
32591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strchr(s + 1, ' ');
32601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
32611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
32621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_del_addr(&bsses, s + 1);
32631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
32641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
32651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
32661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P
32671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (str_starts(start, P2P_EVENT_DEVICE_FOUND)) {
32681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strstr(start, " p2p_dev_addr=");
32691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
32701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
32711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_add_addr(&p2p_peers, s + 14);
32721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
32731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
32741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
32751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (str_starts(start, P2P_EVENT_DEVICE_LOST)) {
32761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strstr(start, " p2p_dev_addr=");
32771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
32781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
32791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_del_addr(&p2p_peers, s + 14);
32801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
32811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
32821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
32831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (str_starts(start, P2P_EVENT_GROUP_STARTED)) {
32841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strchr(start, ' ');
32851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
32861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
32871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_add_word(&p2p_groups, s + 1);
32881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
32891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
32901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
32911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (str_starts(start, P2P_EVENT_GROUP_REMOVED)) {
32921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strchr(start, ' ');
32931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
32941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
32951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_del_word(&p2p_groups, s + 1);
32961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
32971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
32981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */
32991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
33001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
33011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
330261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int check_terminating(const char *msg)
330361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
330461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	const char *pos = msg;
330561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
330661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (*pos == '<') {
330761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		/* skip priority */
330861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		pos = os_strchr(pos, '>');
330961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (pos)
331061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			pos++;
331161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		else
331261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			pos = msg;
331361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
331461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
331561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (str_match(pos, WPA_EVENT_TERMINATING) && ctrl_conn) {
331661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		edit_clear_line();
331761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		printf("\rConnection to wpa_supplicant lost - trying to "
331861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "reconnect\n");
331961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		edit_redraw();
332061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		wpa_cli_attached = 0;
332161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		wpa_cli_close_connection();
332261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return 1;
332361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
332461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
332561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return 0;
332661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
332761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
332861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
33298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_recv_pending(struct wpa_ctrl *ctrl, int action_monitor)
33308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
33318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL) {
33328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_reconnect();
33338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
33348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (wpa_ctrl_pending(ctrl) > 0) {
33368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char buf[256];
33378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		size_t len = sizeof(buf) - 1;
33388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpa_ctrl_recv(ctrl, buf, &len) == 0) {
33398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			buf[len] = '\0';
33408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (action_monitor)
33418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				wpa_cli_action_process(buf);
33428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			else {
33431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				cli_event(buf);
33448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (wpa_cli_show_event(buf)) {
33458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					edit_clear_line();
33468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					printf("\r%s\n", buf);
33478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					edit_redraw();
33488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				}
334961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
335061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				if (interactive && check_terminating(buf) > 0)
335161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					return;
33528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
33538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
33548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Could not read pending message.\n");
33558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
33568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
33578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_ctrl_pending(ctrl) < 0) {
33608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Connection to wpa_supplicant lost - trying to "
33618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "reconnect\n");
33628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_reconnect();
33638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
33658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define max_args 10
33678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int tokenize_cmd(char *cmd, char *argv[])
33698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
33708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *pos;
33718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int argc = 0;
33728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
33748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (;;) {
33758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		while (*pos == ' ')
33768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos++;
33778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (*pos == '\0')
33788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
33798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		argv[argc] = pos;
33808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		argc++;
33818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (argc == max_args)
33828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
33838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (*pos == '"') {
33848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			char *pos2 = os_strrchr(pos, '"');
33858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (pos2)
33868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos = pos2 + 1;
33878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
33888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		while (*pos != '\0' && *pos != ' ')
33898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos++;
33908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (*pos == ' ')
33918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*pos++ = '\0';
33928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return argc;
33958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
33968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_ping(void *eloop_ctx, void *timeout_ctx)
33998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
34008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn && _wpa_ctrl_command(ctrl_conn, "PING", 0)) {
34018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Connection to wpa_supplicant lost - trying to "
34028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "reconnect\n");
34038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_close_connection();
34048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
34058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!ctrl_conn)
34068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_reconnect();
34078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_register_timeout(ping_interval, 0, wpa_cli_ping, NULL, NULL);
34088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
34098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_mon_receive(int sock, void *eloop_ctx, void *sock_ctx)
34128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
34138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_recv_pending(mon_conn, 0);
34148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
34158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_edit_cmd_cb(void *ctx, char *cmd)
34188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
34198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *argv[max_args];
34208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int argc;
34218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	argc = tokenize_cmd(cmd, argv);
34228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc)
34238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_request(ctrl_conn, argc, argv);
34248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
34258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_edit_eof_cb(void *ctx)
34288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
34298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_terminate();
34308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
34318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
343361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int warning_displayed = 0;
343461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic char *hfile = NULL;
343561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int edit_started = 0;
343661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
343761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void start_edit(void)
34388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
343961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	char *home;
344061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	char *ps = NULL;
34418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
344261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_UDP_REMOTE
344361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	ps = wpa_ctrl_get_remote_ifname(ctrl_conn);
344461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */
34458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	home = getenv("HOME");
34478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (home) {
34488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *fname = ".wpa_cli_history";
34498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int hfile_len = os_strlen(home) + 1 + os_strlen(fname) + 1;
34508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		hfile = os_malloc(hfile_len);
34518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (hfile)
34528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_snprintf(hfile, hfile_len, "%s/%s", home, fname);
34538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
34548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
345561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (edit_init(wpa_cli_edit_cmd_cb, wpa_cli_edit_eof_cb,
345661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		      wpa_cli_edit_completion_cb, NULL, hfile, ps) < 0) {
345761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		eloop_terminate();
345861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return;
345961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
346061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
346161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	edit_started = 1;
34628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_register_timeout(ping_interval, 0, wpa_cli_ping, NULL, NULL);
346361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
346461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
346561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
346651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidtstatic void update_bssid_list(struct wpa_ctrl *ctrl)
346751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt{
346851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	char buf[4096];
346951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	size_t len = sizeof(buf);
347051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	int ret;
347151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	char *cmd = "BSS RANGE=ALL MASK=0x2";
347251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	char *pos, *end;
347351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
347451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	if (ctrl == NULL)
347551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		return;
347651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len, NULL);
347751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	if (ret < 0)
347851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		return;
347951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	buf[len] = '\0';
348051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
348151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	pos = buf;
348251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	while (pos) {
348351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		pos = os_strstr(pos, "bssid=");
348451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		if (pos == NULL)
348551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt			break;
348651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		pos += 6;
348751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		end = os_strchr(pos, '\n');
348851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		if (end == NULL)
348951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt			break;
349051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		*end = '\0';
349151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		cli_txt_list_add(&bsses, pos);
349251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		pos = end + 1;
349351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	}
349451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt}
349551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
349651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
3497f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidtstatic void update_ifnames(struct wpa_ctrl *ctrl)
3498f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt{
3499f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	char buf[4096];
3500f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	size_t len = sizeof(buf);
3501f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	int ret;
3502f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	char *cmd = "INTERFACES";
3503f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	char *pos, *end;
3504f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	char txt[200];
3505f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
3506f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	cli_txt_list_flush(&ifnames);
3507f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
3508f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	if (ctrl == NULL)
3509f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		return;
3510f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len, NULL);
3511f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	if (ret < 0)
3512f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		return;
3513f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	buf[len] = '\0';
3514f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
3515f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	pos = buf;
3516f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	while (pos) {
3517f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		end = os_strchr(pos, '\n');
3518f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		if (end == NULL)
3519f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt			break;
3520f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		*end = '\0';
3521f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		ret = os_snprintf(txt, sizeof(txt), "ifname=%s", pos);
3522f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		if (ret > 0 && ret < (int) sizeof(txt))
3523f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt			cli_txt_list_add(&ifnames, txt);
3524f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		pos = end + 1;
3525f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	}
3526f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt}
3527f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
3528f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
352961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void try_connection(void *eloop_ctx, void *timeout_ctx)
353061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
3531b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	if (ctrl_conn)
3532b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt		goto done;
3533b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt
353461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (ctrl_ifname == NULL)
353561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		ctrl_ifname = wpa_cli_get_default_ifname();
35368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
353761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (!wpa_cli_open_connection(ctrl_ifname, 1) == 0) {
353861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (!warning_displayed) {
353961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			printf("Could not connect to wpa_supplicant: "
354061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			       "%s - re-trying\n", ctrl_ifname);
354161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			warning_displayed = 1;
354261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		}
354361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		eloop_register_timeout(1, 0, try_connection, NULL, NULL);
354461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return;
354561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
354661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
354751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	update_bssid_list(ctrl_conn);
354851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
354961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (warning_displayed)
355061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		printf("Connection established.\n");
355161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
3552b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidtdone:
355361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	start_edit();
355461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
355561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
355661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
355761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void wpa_cli_interactive(void)
355861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
355961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	printf("\nInteractive mode\n\n");
356061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
356161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	eloop_register_timeout(0, 0, try_connection, NULL, NULL);
35628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_run();
356361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	eloop_cancel_timeout(try_connection, NULL, NULL);
35648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	cli_txt_list_flush(&p2p_peers);
35661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	cli_txt_list_flush(&p2p_groups);
35671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	cli_txt_list_flush(&bsses);
3568f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	cli_txt_list_flush(&ifnames);
356961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (edit_started)
357061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		edit_deinit(hfile, wpa_cli_edit_filter_history_cb);
35718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(hfile);
35728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_cancel_timeout(wpa_cli_ping, NULL, NULL);
35738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_close_connection();
35748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_action(struct wpa_ctrl *ctrl)
35788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_ANSI_C_EXTRA
35808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* TODO: ANSI C version(?) */
35818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("Action processing not supported in ANSI C build.\n");
35828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_ANSI_C_EXTRA */
35838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	fd_set rfds;
35848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int fd, res;
35858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct timeval tv;
35868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char buf[256]; /* note: large enough to fit in unsolicited messages */
35878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
35888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	fd = wpa_ctrl_get_fd(ctrl);
35908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (!wpa_cli_quit) {
35928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		FD_ZERO(&rfds);
35938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		FD_SET(fd, &rfds);
35948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		tv.tv_sec = ping_interval;
35958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		tv.tv_usec = 0;
35968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = select(fd + 1, &rfds, NULL, NULL, &tv);
35978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (res < 0 && errno != EINTR) {
35988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			perror("select");
35998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
36008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
36018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (FD_ISSET(fd, &rfds))
36038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_recv_pending(ctrl, 1);
36048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else {
36058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			/* verify that connection is still working */
36068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			len = sizeof(buf) - 1;
36078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpa_ctrl_request(ctrl, "PING", 4, buf, &len,
36088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     wpa_cli_action_cb) < 0 ||
36098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    len < 4 || os_memcmp(buf, "PONG", 4) != 0) {
36108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				printf("wpa_supplicant did not reply to PING "
36118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       "command - exiting\n");
36128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
36138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
36148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
36158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
36168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_ANSI_C_EXTRA */
36178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
36188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_cleanup(void)
36218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
36228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_close_connection();
36238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (pid_file)
36248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_daemonize_terminate(pid_file);
36258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_program_deinit();
36278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
36288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
362961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
363061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void wpa_cli_terminate(int sig, void *ctx)
36318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
363261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	eloop_terminate();
36338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
36348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char * wpa_cli_get_default_ifname(void)
36378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
36388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *ifname = NULL;
36398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_UNIX
36418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct dirent *dent;
36428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DIR *dir = opendir(ctrl_iface_dir);
36438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dir) {
36448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef ANDROID
36458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char ifprop[PROPERTY_VALUE_MAX];
36468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (property_get("wifi.interface", ifprop, NULL) != 0) {
36478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ifname = os_strdup(ifprop);
36488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Using interface '%s'\n", ifname);
36498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return ifname;
36508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
36518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* ANDROID */
36528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
36538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
36548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while ((dent = readdir(dir))) {
36558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef _DIRENT_HAVE_D_TYPE
36568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/*
36578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * Skip the file if it is not a socket. Also accept
36588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * DT_UNKNOWN (0) in case the C library or underlying
36598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * file system does not support d_type.
36608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 */
36618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (dent->d_type != DT_SOCK && dent->d_type != DT_UNKNOWN)
36628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			continue;
36638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _DIRENT_HAVE_D_TYPE */
36648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(dent->d_name, ".") == 0 ||
36658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    os_strcmp(dent->d_name, "..") == 0)
36668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			continue;
36678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Selected interface '%s'\n", dent->d_name);
36688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ifname = os_strdup(dent->d_name);
36698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
36708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
36718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	closedir(dir);
36728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UNIX */
36738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
3675b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	char buf[4096], *pos;
36768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
36778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ctrl *ctrl;
36788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret;
36798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctrl = wpa_ctrl_open(NULL);
36818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl == NULL)
36828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
36838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = sizeof(buf) - 1;
36858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = wpa_ctrl_request(ctrl, "INTERFACES", 10, buf, &len, NULL);
36868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret >= 0) {
36878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		buf[len] = '\0';
36888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos = os_strchr(buf, '\n');
36898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos)
36908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*pos = '\0';
36918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ifname = os_strdup(buf);
36928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
36938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_ctrl_close(ctrl);
36948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
36958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return ifname;
36978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
36988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint main(int argc, char *argv[])
37018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
37028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int c;
37038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int daemonize = 0;
37048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret = 0;
37058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *global = NULL;
37068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (os_program_init())
37088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
37098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (;;) {
37118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		c = getopt(argc, argv, "a:Bg:G:hi:p:P:v");
37128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (c < 0)
37138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		switch (c) {
37158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'a':
37168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			action_file = optarg;
37178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'B':
37198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			daemonize = 1;
37208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'g':
37228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			global = optarg;
37238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'G':
37258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ping_interval = atoi(optarg);
37268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'h':
37288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			usage();
37298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return 0;
37308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'v':
37318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("%s\n", wpa_cli_version);
37328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return 0;
37338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'i':
37348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(ctrl_ifname);
37358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ctrl_ifname = os_strdup(optarg);
37368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'p':
37388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ctrl_iface_dir = optarg;
37398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'P':
37418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pid_file = optarg;
37428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		default:
37448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			usage();
37458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
37468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
37478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
37488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	interactive = (argc == optind) && (action_file == NULL);
37508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (interactive)
37528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("%s\n\n%s\n\n", wpa_cli_version, wpa_cli_license);
37538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (eloop_init())
37558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
37568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (global) {
37588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
37598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ctrl_conn = wpa_ctrl_open(NULL);
37608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_CTRL_IFACE_NAMED_PIPE */
37618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ctrl_conn = wpa_ctrl_open(global);
37628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
37638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ctrl_conn == NULL) {
376404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			fprintf(stderr, "Failed to connect to wpa_supplicant "
376504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				"global interface: %s  error: %s\n",
376604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				global, strerror(errno));
37678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
37688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
3769b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt
3770b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt		if (interactive) {
3771f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt			update_ifnames(ctrl_conn);
3772b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt			mon_conn = wpa_ctrl_open(global);
3773b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt			if (mon_conn) {
3774b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt				if (wpa_ctrl_attach(mon_conn) == 0) {
3775b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt					wpa_cli_attached = 1;
3776b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt					eloop_register_read_sock(
3777b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt						wpa_ctrl_get_fd(mon_conn),
3778b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt						wpa_cli_mon_receive,
3779b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt						NULL, NULL);
3780b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt				} else {
3781b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt					printf("Failed to open monitor "
3782b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt					       "connection through global "
3783b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt					       "control interface\n");
3784b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt				}
3785b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt			}
3786b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt		}
37878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
37888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
378961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	eloop_register_signal_terminate(wpa_cli_terminate, NULL);
37908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_ifname == NULL)
37928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ctrl_ifname = wpa_cli_get_default_ifname();
37938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (interactive) {
379561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		wpa_cli_interactive();
37968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
37978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!global &&
37988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    wpa_cli_open_connection(ctrl_ifname, 0) < 0) {
379904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			fprintf(stderr, "Failed to connect to non-global "
380004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				"ctrl_ifname: %s  error: %s\n",
380104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				ctrl_ifname, strerror(errno));
38028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
38038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
38048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (action_file) {
38068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpa_ctrl_attach(ctrl_conn) == 0) {
38078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				wpa_cli_attached = 1;
38088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			} else {
38098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				printf("Warning: Failed to attach to "
38108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       "wpa_supplicant.\n");
38118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				return -1;
38128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
38138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
38148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
381561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (daemonize && os_daemonize(pid_file))
381661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			return -1;
38178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
381861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (action_file)
381961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			wpa_cli_action(ctrl_conn);
382061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		else
382161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			ret = wpa_request(ctrl_conn, argc - optind,
382261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					  &argv[optind]);
382361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
38248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(ctrl_ifname);
38268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_destroy();
38278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_cleanup();
38288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return ret;
38308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
38318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_CTRL_IFACE */
38338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint main(int argc, char *argv[])
38348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
38358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("CONFIG_CTRL_IFACE not defined - wpa_cli disabled\n");
38368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
38378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
38388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE */
3839