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"
31fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt"Copyright (c) 2004-2014, 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
535661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidtstatic int wpa_cli_cmd_pmksa_flush(struct wpa_ctrl *ctrl, int argc,
536661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt				   char *argv[])
537661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt{
538661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	return wpa_ctrl_command(ctrl, "PMKSA_FLUSH");
539661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt}
540661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
541661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_help(struct wpa_ctrl *ctrl, int argc, char *argv[])
5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
54461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print_help(argc > 0 ? argv[0] : NULL);
5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
54961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic char ** wpa_cli_complete_help(const char *str, int pos)
55061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
55161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
55261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	char **res = NULL;
55361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
55461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	switch (arg) {
55561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	case 1:
55661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		res = wpa_list_cmd_list();
55761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		break;
55861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
55961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
56061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return res;
56161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
56261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
56361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_license(struct wpa_ctrl *ctrl, int argc, char *argv[])
5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("%s\n\n%s\n", wpa_cli_version, wpa_cli_full_license);
5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_quit(struct wpa_ctrl *ctrl, int argc, char *argv[])
5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_quit = 1;
5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (interactive)
5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		eloop_terminate();
5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_set(struct wpa_ctrl *ctrl, int argc, char *argv[])
5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
58551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	if (argc == 1) {
58651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "SET %s ", argv[0]);
58751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
58851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt			printf("Too long SET command.\n");
58951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt			return -1;
59051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		}
59151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		return wpa_ctrl_command(ctrl, cmd);
5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
59451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	return wpa_cli_cmd(ctrl, "SET", 2, argc, argv);
59551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt}
5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
59751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
59851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidtstatic char ** wpa_cli_complete_set(const char *str, int pos)
59951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt{
60051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
60151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	const char *fields[] = {
60251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		/* runtime values */
60351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"EAPOL::heldPeriod", "EAPOL::authPeriod", "EAPOL::startPeriod",
60451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"EAPOL::maxStart", "dot11RSNAConfigPMKLifetime",
60551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"dot11RSNAConfigPMKReauthThreshold", "dot11RSNAConfigSATimeout",
60651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"wps_fragment_size", "wps_version_number", "ampdu",
60751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"tdls_testing", "tdls_disabled", "pno", "radio_disabled",
60851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"uapsd", "ps", "wifi_display", "bssid_filter", "disallow_aps",
60951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"no_keep_alive",
61051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		/* global configuration parameters */
61151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"eapol_version", "ap_scan", "disable_scan_offload",
61251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"fast_reauth", "opensc_engine_path", "pkcs11_engine_path",
61351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"pkcs11_module_path", "pcsc_reader", "pcsc_pin",
61451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"driver_param", "dot11RSNAConfigPMKLifetime",
61551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"dot11RSNAConfigPMKReauthThreshold",
61651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"dot11RSNAConfigSATimeout",
61751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"update_config", "load_dynamic_eap", "uuid", "device_name",
61851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"manufacturer", "model_name", "model_number", "serial_number",
61951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"device_type", "os_version", "config_methods",
62051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"wps_cred_processing", "wps_vendor_ext_m1", "sec_device_type",
62151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"p2p_listen_reg_class", "p2p_listen_channel",
62251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"p2p_oper_reg_class", "p2p_oper_channel",
62351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"p2p_go_intent", "p2p_ssid_postfix", "persistent_reconnect",
62451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"p2p_intra_bss", "p2p_group_idle", "p2p_pref_chan",
62568d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt		"p2p_no_go_freq",
62651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"p2p_go_ht40", "p2p_disabled", "p2p_no_group_iface",
62768d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt		"p2p_go_vht",
62851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"p2p_ignore_shared_freq", "country", "bss_max_count",
62951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"bss_expiration_age", "bss_expiration_scan_count",
63051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"filter_ssids", "filter_rssi", "max_num_sta",
63151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"disassoc_low_ack", "hs20", "interworking", "hessid",
63251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"access_network_type", "pbc_in_m1", "autoscan",
63351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"wps_nfc_dev_pw_id", "wps_nfc_dh_pubkey", "wps_nfc_dh_privkey",
63451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"wps_nfc_dev_pw", "ext_password_backend",
63551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"p2p_go_max_inactivity", "auto_interworking", "okc", "pmf",
63651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"sae_groups", "dtim_period", "beacon_int", "ap_vendor_elements",
6379767226d8e6a1adaa33beb9f517ef40dddfa460cDmitry Shmidt		"ignore_old_scan_res", "freq_list", "external_sim",
63809f57babfc1e4473db20ced4f58a4c9f082c8ed8Dmitry Shmidt		"tdls_external_control", "p2p_search_delay"
63951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	};
64068d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt	int i, num_fields = ARRAY_SIZE(fields);
64151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
64251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	if (arg == 1) {
64351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		char **res = os_calloc(num_fields + 1, sizeof(char *));
64451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		if (res == NULL)
64551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt			return NULL;
64651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		for (i = 0; i < num_fields; i++) {
64751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt			res[i] = os_strdup(fields[i]);
64851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt			if (res[i] == NULL)
64951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt				return res;
65051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		}
65151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		return res;
6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
65351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
65451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	if (arg > 1 && os_strncasecmp(str, "set bssid_filter ", 17) == 0)
65551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		return cli_txt_list_array(&bsses);
65651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
65751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	return NULL;
6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_get(struct wpa_ctrl *ctrl, int argc, char *argv[])
6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
66361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "GET", 1, argc, argv);
6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_logoff(struct wpa_ctrl *ctrl, int argc, char *argv[])
6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "LOGOFF");
6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_logon(struct wpa_ctrl *ctrl, int argc, char *argv[])
6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "LOGON");
6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_reassociate(struct wpa_ctrl *ctrl, int argc,
6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "REASSOCIATE");
6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6869866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidtstatic int wpa_cli_cmd_reattach(struct wpa_ctrl *ctrl, int argc, char *argv[])
6879866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt{
6889866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt	return wpa_ctrl_command(ctrl, "REATTACH");
6899866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt}
6909866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt
6919866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt
6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_preauthenticate(struct wpa_ctrl *ctrl, int argc,
6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
69561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "PREAUTH", 1, argc, argv);
6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ap_scan(struct wpa_ctrl *ctrl, int argc, char *argv[])
7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
70161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "AP_SCAN", 1, argc, argv);
7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_scan_interval(struct wpa_ctrl *ctrl, int argc,
7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
7078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
70861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "SCAN_INTERVAL", 1, argc, argv);
7098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bss_expire_age(struct wpa_ctrl *ctrl, int argc,
7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
7148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
71561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "BSS_EXPIRE_AGE", 1, argc, argv);
7168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bss_expire_count(struct wpa_ctrl *ctrl, int argc,
7208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				        char *argv[])
7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
72261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "BSS_EXPIRE_COUNT", 1, argc, argv);
7238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
726f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidtstatic int wpa_cli_cmd_bss_flush(struct wpa_ctrl *ctrl, int argc, char *argv[])
727f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt{
728f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	char cmd[256];
729f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	int res;
730f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt
731f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	if (argc < 1)
732f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "BSS_FLUSH 0");
733f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	else
734f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "BSS_FLUSH %s", argv[0]);
735f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
736f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt		printf("Too long BSS_FLUSH command.\n");
737f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt		return -1;
738f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	}
739f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
740f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt}
741f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt
742f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt
7438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_stkstart(struct wpa_ctrl *ctrl, int argc,
7448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				char *argv[])
7458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
74661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "STKSTART", 1, argc, argv);
7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ft_ds(struct wpa_ctrl *ctrl, int argc, char *argv[])
7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
75261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "FT_DS", 1, argc, argv);
7538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_pbc(struct wpa_ctrl *ctrl, int argc, char *argv[])
7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
75861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_PBC", 0, argc, argv);
7598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_pin(struct wpa_ctrl *ctrl, int argc, char *argv[])
7638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0) {
7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_PIN command: need one or two arguments:\n"
7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- BSSID: use 'any' to select any\n"
7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- PIN: optional, used only with devices that have no "
7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "display\n");
7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
7708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
77261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_PIN", 1, argc, argv);
7738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_check_pin(struct wpa_ctrl *ctrl, int argc,
7778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
7788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
77961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_CHECK_PIN", 1, argc, argv);
7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_cancel(struct wpa_ctrl *ctrl, int argc,
7848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
7858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "WPS_CANCEL");
7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
79004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_WPS_NFC
79104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
79204949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_wps_nfc(struct wpa_ctrl *ctrl, int argc, char *argv[])
79304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
79461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_NFC", 0, argc, argv);
79504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
79604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
79704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
798f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidtstatic int wpa_cli_cmd_wps_nfc_config_token(struct wpa_ctrl *ctrl, int argc,
799f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt					    char *argv[])
800f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt{
801f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_NFC_CONFIG_TOKEN", 1, argc, argv);
802f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt}
803f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt
804f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt
80504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_wps_nfc_token(struct wpa_ctrl *ctrl, int argc,
80604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				     char *argv[])
80704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
80861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_NFC_TOKEN", 1, argc, argv);
80904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
81004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
81104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
81204949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_wps_nfc_tag_read(struct wpa_ctrl *ctrl, int argc,
81304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					char *argv[])
81404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
81504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	int ret;
81604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char *buf;
81704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	size_t buflen;
81804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
81904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (argc != 1) {
82004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		printf("Invalid 'wps_nfc_tag_read' command - one argument "
82104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		       "is required.\n");
82204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
82304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
82404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
82504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	buflen = 18 + os_strlen(argv[0]);
82604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	buf = os_malloc(buflen);
82704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (buf == NULL)
82804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
82904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	os_snprintf(buf, buflen, "WPS_NFC_TAG_READ %s", argv[0]);
83004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
83104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	ret = wpa_ctrl_command(ctrl, buf);
83204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	os_free(buf);
83304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
83404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return ret;
83504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
83604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
837d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
838d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtstatic int wpa_cli_cmd_nfc_get_handover_req(struct wpa_ctrl *ctrl, int argc,
839d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt					    char *argv[])
840d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{
841d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return wpa_cli_cmd(ctrl, "NFC_GET_HANDOVER_REQ", 2, argc, argv);
842d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt}
843d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
844d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
845d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtstatic int wpa_cli_cmd_nfc_get_handover_sel(struct wpa_ctrl *ctrl, int argc,
846d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt					    char *argv[])
847d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{
848d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return wpa_cli_cmd(ctrl, "NFC_GET_HANDOVER_SEL", 2, argc, argv);
849d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt}
850d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
851d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
852f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidtstatic int wpa_cli_cmd_nfc_report_handover(struct wpa_ctrl *ctrl, int argc,
853f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt					   char *argv[])
854f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt{
855f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	return wpa_cli_cmd(ctrl, "NFC_REPORT_HANDOVER", 4, argc, argv);
856f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt}
857f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt
85804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_WPS_NFC */
85904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
86004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
8618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_reg(struct wpa_ctrl *ctrl, int argc, char *argv[])
8628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
8648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
8658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 2)
8678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_REG %s %s",
8688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
8698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else if (argc == 5 || argc == 6) {
8708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char ssid_hex[2 * 32 + 1];
8718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char key_hex[2 * 64 + 1];
8728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int i;
8738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssid_hex[0] = '\0';
8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (i = 0; i < 32; i++) {
8768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (argv[2][i] == '\0')
8778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
8788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_snprintf(&ssid_hex[i * 2], 3, "%02x", argv[2][i]);
8798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
8808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_hex[0] = '\0';
8828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (argc == 6) {
8838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			for (i = 0; i < 64; i++) {
8848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (argv[5][i] == '\0')
8858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					break;
8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				os_snprintf(&key_hex[i * 2], 3, "%02x",
8878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    argv[5][i]);
8888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
8928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "WPS_REG %s %s %s %s %s %s",
8938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], ssid_hex, argv[3], argv[4],
8948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  key_hex);
8958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
8968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_REG command: need two arguments:\n"
8978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- BSSID of the target AP\n"
8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- AP PIN\n");
8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Alternatively, six arguments can be used to "
9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "reconfigure the AP:\n"
9018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- BSSID of the target AP\n"
9028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- AP PIN\n"
9038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new SSID\n"
9048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new auth (OPEN, WPAPSK, WPA2PSK)\n"
9058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new encr (NONE, WEP, TKIP, CCMP)\n"
9068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new key\n");
9078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
9118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_REG command.\n");
9128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
9158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_ap_pin(struct wpa_ctrl *ctrl, int argc,
9198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
9208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
92161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_AP_PIN", 1, argc, argv);
9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_start(struct wpa_ctrl *ctrl, int argc,
9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    char *argv[])
9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
92861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_ER_START", 0, argc, argv);
9298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_stop(struct wpa_ctrl *ctrl, int argc,
9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "WPS_ER_STOP");
9368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_pin(struct wpa_ctrl *ctrl, int argc,
9418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
9428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
9448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_ER_PIN command: need at least two "
9458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments:\n"
9468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- UUID: use 'any' to select any\n"
9478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- PIN: Enrollee PIN\n"
9488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "optional: - Enrollee MAC address\n");
9498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
95261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_ER_PIN", 2, argc, argv);
9538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_pbc(struct wpa_ctrl *ctrl, int argc,
9578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
9588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
95961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_ER_PBC", 1, argc, argv);
9608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_learn(struct wpa_ctrl *ctrl, int argc,
9648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    char *argv[])
9658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2) {
9678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_ER_LEARN command: need two arguments:\n"
9688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- UUID: specify which AP to use\n"
9698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- PIN: AP PIN\n");
9708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
97361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_ER_LEARN", 2, argc, argv);
9748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_set_config(struct wpa_ctrl *ctrl, int argc,
9788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 char *argv[])
9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2) {
9818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_ER_SET_CONFIG command: need two "
9828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments:\n"
9838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- UUID: specify which AP to use\n"
9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- Network configuration id\n");
9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
98861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_ER_SET_CONFIG", 2, argc, argv);
9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_config(struct wpa_ctrl *ctrl, int argc,
9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 5 || argc == 6) {
9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char ssid_hex[2 * 32 + 1];
10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char key_hex[2 * 64 + 1];
10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int i;
10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssid_hex[0] = '\0';
10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (i = 0; i < 32; i++) {
10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (argv[2][i] == '\0')
10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_snprintf(&ssid_hex[i * 2], 3, "%02x", argv[2][i]);
10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_hex[0] = '\0';
10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (argc == 6) {
10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			for (i = 0; i < 64; i++) {
10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (argv[5][i] == '\0')
10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					break;
10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				os_snprintf(&key_hex[i * 2], 3, "%02x",
10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    argv[5][i]);
10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "WPS_ER_CONFIG %s %s %s %s %s %s",
10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], ssid_hex, argv[3], argv[4],
10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  key_hex);
10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_ER_CONFIG command: need six arguments:\n"
10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- AP UUID\n"
10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- AP PIN\n"
10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new SSID\n"
10298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new auth (OPEN, WPAPSK, WPA2PSK)\n"
10308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new encr (NONE, WEP, TKIP, CCMP)\n"
10318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new key\n");
10328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
10368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_ER_CONFIG command.\n");
10378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
104304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_WPS_NFC
104404949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_wps_er_nfc_config_token(struct wpa_ctrl *ctrl, int argc,
104504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       char *argv[])
104604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
104704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (argc != 2) {
104804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		printf("Invalid WPS_ER_NFC_CONFIG_TOKEN command: need two "
104904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		       "arguments:\n"
105004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		       "- WPS/NDEF: token format\n"
105104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		       "- UUID: specify which AP to use\n");
105204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
105304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
105404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
105561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_ER_NFC_CONFIG_TOKEN", 2, argc, argv);
105604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
105704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_WPS_NFC */
105804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
105904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
10608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ibss_rsn(struct wpa_ctrl *ctrl, int argc, char *argv[])
10618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
106261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "IBSS_RSN", 1, argc, argv);
10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_level(struct wpa_ctrl *ctrl, int argc, char *argv[])
10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
106861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "LEVEL", 1, argc, argv);
10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_identity(struct wpa_ctrl *ctrl, int argc, char *argv[])
10738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid IDENTITY command: needs two arguments "
10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and identity)\n");
10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
10858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "IDENTITY-%s:%s",
10868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
10878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
10888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long IDENTITY command.\n");
10898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
10938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
10948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
10958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long IDENTITY command.\n");
10968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
10998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
11028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_password(struct wpa_ctrl *ctrl, int argc, char *argv[])
11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
11078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid PASSWORD command: needs two arguments "
11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and password)\n");
11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PASSWORD-%s:%s",
11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long PASSWORD command.\n");
11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long PASSWORD command.\n");
11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_new_password(struct wpa_ctrl *ctrl, int argc,
11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    char *argv[])
11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
11458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid NEW_PASSWORD command: needs two arguments "
11468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and password)\n");
11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "NEW_PASSWORD-%s:%s",
11538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long NEW_PASSWORD command.\n");
11568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
11598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
11618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
11628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long NEW_PASSWORD command.\n");
11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_pin(struct wpa_ctrl *ctrl, int argc, char *argv[])
11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
11748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
11758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
11768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid PIN command: needs two arguments "
11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and pin)\n");
11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PIN-%s:%s",
11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long PIN command.\n");
11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
11928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long PIN command.\n");
11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
11998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
12018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_otp(struct wpa_ctrl *ctrl, int argc, char *argv[])
12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
12068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
12078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
12088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid OTP command: needs two arguments (network "
12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "id and password)\n");
12128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
12178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "OTP-%s:%s",
12188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
12198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long OTP command.\n");
12218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
12278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long OTP command.\n");
12288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1237051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidtstatic int wpa_cli_cmd_sim(struct wpa_ctrl *ctrl, int argc, char *argv[])
1238051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt{
1239051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	char cmd[256], *pos, *end;
1240051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	int i, ret;
1241051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
1242051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	if (argc < 2) {
1243051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		printf("Invalid SIM command: needs two arguments "
1244051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		       "(network id and SIM operation response)\n");
1245051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		return -1;
1246051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	}
1247051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
1248051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	end = cmd + sizeof(cmd);
1249051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	pos = cmd;
1250051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "SIM-%s:%s",
1251051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt			  argv[0], argv[1]);
1252051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
1253051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		printf("Too long SIM command.\n");
1254051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		return -1;
1255051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	}
1256051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	pos += ret;
1257051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	for (i = 2; i < argc; i++) {
1258051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
1259051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
1260051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt			printf("Too long SIM command.\n");
1261051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt			return -1;
1262051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		}
1263051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt		pos += ret;
1264051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	}
1265051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
1266051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt}
1267051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
1268051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt
12698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_passphrase(struct wpa_ctrl *ctrl, int argc,
12708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
12718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
12728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
12738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
12748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
12768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid PASSPHRASE command: needs two arguments "
12778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and passphrase)\n");
12788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
12828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
12838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PASSPHRASE-%s:%s",
12848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
12868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long PASSPHRASE command.\n");
12878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
12938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long PASSPHRASE command.\n");
12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
13008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bssid(struct wpa_ctrl *ctrl, int argc, char *argv[])
13048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
13068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid BSSID command: needs two arguments (network "
13078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "id and BSSID)\n");
13088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
13098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
131161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "BSSID", 2, argc, argv);
13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1315696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidtstatic int wpa_cli_cmd_blacklist(struct wpa_ctrl *ctrl, int argc, char *argv[])
1316696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt{
131761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "BLACKLIST", 0, argc, argv);
1318696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt}
1319696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
1320696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
1321696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidtstatic int wpa_cli_cmd_log_level(struct wpa_ctrl *ctrl, int argc, char *argv[])
1322696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt{
132361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "LOG_LEVEL", 0, argc, argv);
1324696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt}
1325696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
1326696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
13278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_list_networks(struct wpa_ctrl *ctrl, int argc,
13288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
13298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "LIST_NETWORKS");
13318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_select_network(struct wpa_ctrl *ctrl, int argc,
13358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
13368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
133761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "SELECT_NETWORK", 1, argc, argv);
13388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_enable_network(struct wpa_ctrl *ctrl, int argc,
13428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
13438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
134461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "ENABLE_NETWORK", 1, argc, argv);
13458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_disable_network(struct wpa_ctrl *ctrl, int argc,
13498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
13508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
135161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "DISABLE_NETWORK", 1, argc, argv);
13528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_add_network(struct wpa_ctrl *ctrl, int argc,
13568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
13578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "ADD_NETWORK");
13598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
136261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_remove_network(struct wpa_ctrl *ctrl, int argc,
136361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				      char *argv[])
136461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
136561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "REMOVE_NETWORK", 1, argc, argv);
13668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_show_network_variables(void)
13708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("set_network variables:\n"
13728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  ssid (network name, SSID)\n"
13738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  psk (WPA passphrase or pre-shared key)\n"
13748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  key_mgmt (key management protocol)\n"
13758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  identity (EAP identity)\n"
13768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  password (EAP password)\n"
13778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  ...\n"
13788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "\n"
13798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "Note: Values are entered in the same format as the "
13808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "configuration file is using,\n"
13818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "i.e., strings values need to be inside double quotation "
13828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "marks.\n"
13838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "For example: set_network 1 ssid \"network name\"\n"
13848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "\n"
13858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "Please see wpa_supplicant.conf documentation for full list "
13868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "of\navailable variables.\n");
13878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_set_network(struct wpa_ctrl *ctrl, int argc,
13918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
13928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0) {
13948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_show_network_variables();
13958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
13968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1398d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (argc < 3) {
13998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid SET_NETWORK command: needs three arguments\n"
14008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id, variable name, and value)\n");
14018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
14028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
140461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "SET_NETWORK", 3, argc, argv);
14058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_get_network(struct wpa_ctrl *ctrl, int argc,
14098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
14108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0) {
14128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_show_network_variables();
14138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
14148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2) {
14178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid GET_NETWORK command: needs two arguments\n"
14188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and variable name)\n");
14198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
14208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
142261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "GET_NETWORK", 2, argc, argv);
14238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1426684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidtstatic int wpa_cli_cmd_dup_network(struct wpa_ctrl *ctrl, int argc,
1427684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt				   char *argv[])
1428684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt{
1429684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt	if (argc == 0) {
1430684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt		wpa_cli_show_network_variables();
1431684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt		return 0;
1432684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt	}
1433684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt
1434684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt	if (argc < 3) {
1435684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt		printf("Invalid DUP_NETWORK command: needs three arguments\n"
1436684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt		       "(src netid, dest netid, and variable name)\n");
1437684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt		return -1;
1438684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt	}
1439684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt
1440684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt	return wpa_cli_cmd(ctrl, "DUP_NETWORK", 3, argc, argv);
1441684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt}
1442684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt
1443684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt
144404949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_list_creds(struct wpa_ctrl *ctrl, int argc,
144504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				  char *argv[])
144604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
144704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return wpa_ctrl_command(ctrl, "LIST_CREDS");
144804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
144904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
145004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
145104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_add_cred(struct wpa_ctrl *ctrl, int argc, char *argv[])
145204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
145304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return wpa_ctrl_command(ctrl, "ADD_CRED");
145404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
145504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
145604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
145704949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_remove_cred(struct wpa_ctrl *ctrl, int argc,
145804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				   char *argv[])
145904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
146061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "REMOVE_CRED", 1, argc, argv);
146104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
146204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
146304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
146404949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_set_cred(struct wpa_ctrl *ctrl, int argc, char *argv[])
146504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
146604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (argc != 3) {
146704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		printf("Invalid SET_CRED command: needs three arguments\n"
146804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		       "(cred id, variable name, and value)\n");
146904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
147004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
147104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
147261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "SET_CRED", 3, argc, argv);
147304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
147404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
147504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
14760cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidtstatic int wpa_cli_cmd_get_cred(struct wpa_ctrl *ctrl, int argc, char *argv[])
14770cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt{
14780cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt	if (argc != 2) {
14790cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt		printf("Invalid GET_CRED command: needs two arguments\n"
14800cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt		       "(cred id, variable name)\n");
14810cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt		return -1;
14820cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt	}
14830cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt
14840cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt	return wpa_cli_cmd(ctrl, "GET_CRED", 2, argc, argv);
14850cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt}
14860cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt
14870cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt
14888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_disconnect(struct wpa_ctrl *ctrl, int argc,
14898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
14908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "DISCONNECT");
14928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_reconnect(struct wpa_ctrl *ctrl, int argc,
14968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
14978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "RECONNECT");
14998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_save_config(struct wpa_ctrl *ctrl, int argc,
15038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
15048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "SAVE_CONFIG");
15068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_scan(struct wpa_ctrl *ctrl, int argc, char *argv[])
15108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15114b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt	return wpa_cli_cmd(ctrl, "SCAN", 0, argc, argv);
15128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_scan_results(struct wpa_ctrl *ctrl, int argc,
15168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    char *argv[])
15178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "SCAN_RESULTS");
15198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bss(struct wpa_ctrl *ctrl, int argc, char *argv[])
15238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
152461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "BSS", 1, argc, argv);
15258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** wpa_cli_complete_bss(const char *str, int pos)
15291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
15301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
15311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char **res = NULL;
15321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
15331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	switch (arg) {
15341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	case 1:
15351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		res = cli_txt_list_array(&bsses);
15361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		break;
15371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
15381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
15391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
15401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
15411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
15421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
15438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_get_capability(struct wpa_ctrl *ctrl, int argc,
15448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
15458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1 || argc > 2) {
15478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid GET_CAPABILITY command: need either one or "
15488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "two arguments\n");
15498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
15508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if ((argc == 2) && os_strcmp(argv[1], "strict") != 0) {
15538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid GET_CAPABILITY command: second argument, "
15548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "if any, must be 'strict'\n");
15558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
15568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
155861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "GET_CAPABILITY", 1, argc, argv);
15598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_list_interfaces(struct wpa_ctrl *ctrl)
15638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("Available interfaces:\n");
15658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "INTERFACES");
15668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface(struct wpa_ctrl *ctrl, int argc, char *argv[])
15708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1) {
15728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_list_interfaces(ctrl);
15738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
15748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_close_connection();
15778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(ctrl_ifname);
15788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctrl_ifname = os_strdup(argv[0]);
15798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1580413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt	if (wpa_cli_open_connection(ctrl_ifname, 1) == 0) {
15818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Connected to interface '%s.\n", ctrl_ifname);
15828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
15838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Could not connect to interface '%s' - re-trying\n",
15848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       ctrl_ifname);
15858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
15878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_reconfigure(struct wpa_ctrl *ctrl, int argc,
15918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
15928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "RECONFIGURE");
15948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_terminate(struct wpa_ctrl *ctrl, int argc,
15988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 char *argv[])
15998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "TERMINATE");
16018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface_add(struct wpa_ctrl *ctrl, int argc,
16058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
16068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
16088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
16098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1) {
16118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid INTERFACE_ADD command: needs at least one "
16128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "argument (interface name)\n"
16138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "All arguments: ifname confname driver ctrl_interface "
16148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "driver_param bridge_name\n");
16158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
16168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/*
16198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * INTERFACE_ADD <ifname>TAB<confname>TAB<driver>TAB<ctrl_interface>TAB
16208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * <driver_param>TAB<bridge_name>
16218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
16228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd),
16238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  "INTERFACE_ADD %s\t%s\t%s\t%s\t%s\t%s",
16248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0],
16258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argc > 1 ? argv[1] : "", argc > 2 ? argv[2] : "",
16268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argc > 3 ? argv[3] : "", argc > 4 ? argv[4] : "",
16278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argc > 5 ? argv[5] : "");
16288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
16298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
16308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
16318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
16328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface_remove(struct wpa_ctrl *ctrl, int argc,
16368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					char *argv[])
16378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
163861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "INTERFACE_REMOVE", 1, argc, argv);
16398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface_list(struct wpa_ctrl *ctrl, int argc,
16438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
16448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "INTERFACE_LIST");
16468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_AP
16508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_sta(struct wpa_ctrl *ctrl, int argc, char *argv[])
16518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
165261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "STA", 1, argc, argv);
16538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_ctrl_command_sta(struct wpa_ctrl *ctrl, char *cmd,
16578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				char *addr, size_t addr_len)
16588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char buf[4096], *pos;
16608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
16618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret;
16628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL) {
16648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Not connected to hostapd - command dropped.\n");
16658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
16668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = sizeof(buf) - 1;
166804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len,
16698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       wpa_cli_msg_cb);
16708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret == -2) {
16718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command timed out.\n", cmd);
16728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -2;
16738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (ret < 0) {
16748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command failed.\n", cmd);
16758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
16768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	buf[len] = '\0';
167904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (os_memcmp(buf, "FAIL", 4) == 0)
16808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
16818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("%s", buf);
16828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = buf;
16848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*pos != '\0' && *pos != '\n')
16858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos++;
16868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	*pos = '\0';
16878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_strlcpy(addr, buf, addr_len);
16888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
16898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_all_sta(struct wpa_ctrl *ctrl, int argc, char *argv[])
16938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char addr[32], cmd[64];
16958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_ctrl_command_sta(ctrl, "STA-FIRST", addr, sizeof(addr)))
16978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
16988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	do {
16998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(cmd, sizeof(cmd), "STA-NEXT %s", addr);
17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} while (wpa_ctrl_command_sta(ctrl, cmd, addr, sizeof(addr)) == 0);
17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
170404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
170504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
170604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_deauthenticate(struct wpa_ctrl *ctrl, int argc,
170704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				      char *argv[])
170804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
170961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "DEAUTHENTICATE", 1, argc, argv);
171004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
171104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
171204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
171304949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_disassociate(struct wpa_ctrl *ctrl, int argc,
171404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				    char *argv[])
171504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
171661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "DISASSOCIATE", 1, argc, argv);
171704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
1718e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
1719e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidtstatic int wpa_cli_cmd_chanswitch(struct wpa_ctrl *ctrl, int argc,
1720e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt				    char *argv[])
1721e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{
1722e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	return wpa_cli_cmd(ctrl, "CHAN_SWITCH", 2, argc, argv);
1723e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt}
1724e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt
17258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_AP */
17268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_suspend(struct wpa_ctrl *ctrl, int argc, char *argv[])
17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "SUSPEND");
17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_resume(struct wpa_ctrl *ctrl, int argc, char *argv[])
17358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "RESUME");
17378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
174021de214b4ba4271ca20843f3b8fba9f1501b2a89Dmitry Shmidt#ifdef CONFIG_TESTING_OPTIONS
17418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_drop_sa(struct wpa_ctrl *ctrl, int argc, char *argv[])
17428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "DROP_SA");
17448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
174521de214b4ba4271ca20843f3b8fba9f1501b2a89Dmitry Shmidt#endif /* CONFIG_TESTING_OPTIONS */
17468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_roam(struct wpa_ctrl *ctrl, int argc, char *argv[])
17498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
175061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "ROAM", 1, argc, argv);
17518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P
17558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_find(struct wpa_ctrl *ctrl, int argc, char *argv[])
17578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
175861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_FIND", 0, argc, argv);
175961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
17608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
176261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic char ** wpa_cli_complete_p2p_find(const char *str, int pos)
176361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
176461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	char **res = NULL;
176561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
176661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
176761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res = os_calloc(6, sizeof(char *));
176861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (res == NULL)
176961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return NULL;
177061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res[0] = os_strdup("type=social");
177161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (res[0] == NULL) {
177261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		os_free(res);
177361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return NULL;
177461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
177561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res[1] = os_strdup("type=progressive");
177661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (res[1] == NULL)
177761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return res;
177861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res[2] = os_strdup("delay=");
177961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (res[2] == NULL)
178061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return res;
178161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res[3] = os_strdup("dev_id=");
178261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (res[3] == NULL)
178361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return res;
178461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (arg == 1)
178561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		res[4] = os_strdup("[timeout]");
178661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
178761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return res;
17888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_stop_find(struct wpa_ctrl *ctrl, int argc,
17928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
17938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_STOP_FIND");
17958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_connect(struct wpa_ctrl *ctrl, int argc,
17998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
18008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
180161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_CONNECT", 2, argc, argv);
18028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** wpa_cli_complete_p2p_connect(const char *str, int pos)
18061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
18071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
18081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char **res = NULL;
18091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	switch (arg) {
18111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	case 1:
18121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		res = cli_txt_list_array(&p2p_peers);
18131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		break;
18141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
18151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
18171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
18181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_listen(struct wpa_ctrl *ctrl, int argc,
18218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
18228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
182361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_LISTEN", 0, argc, argv);
18248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_group_remove(struct wpa_ctrl *ctrl, int argc,
18288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					char *argv[])
18298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
183061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_GROUP_REMOVE", 1, argc, argv);
18318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** wpa_cli_complete_p2p_group_remove(const char *str, int pos)
18351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
18361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
18371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char **res = NULL;
18381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	switch (arg) {
18401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	case 1:
18411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		res = cli_txt_list_array(&p2p_groups);
18421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		break;
18431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
18441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
18461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
18471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_group_add(struct wpa_ctrl *ctrl, int argc,
18508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					char *argv[])
18518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
185261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_GROUP_ADD", 0, argc, argv);
18538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_prov_disc(struct wpa_ctrl *ctrl, int argc,
18578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
18588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (argc != 2 && argc != 3) {
18601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		printf("Invalid P2P_PROV_DISC command: needs at least "
18611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		       "two arguments, address and config method\n"
18621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		       "(display, keypad, or pbc) and an optional join\n");
18638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
18648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
186661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_PROV_DISC", 2, argc, argv);
18678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_get_passphrase(struct wpa_ctrl *ctrl, int argc,
18718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  char *argv[])
18728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_GET_PASSPHRASE");
18748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_req(struct wpa_ctrl *ctrl, int argc,
18788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 char *argv[])
18798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[4096];
18818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2 && argc != 4) {
18838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SERV_DISC_REQ command: needs two "
18848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments (address and TLVs) or four arguments "
18858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(address, \"upnp\", version, search target "
18868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(SSDP ST:)\n");
18878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
18888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
189061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (write_cmd(cmd, sizeof(cmd), "P2P_SERV_DISC_REQ", argc, argv) < 0)
18918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
18928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
18938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_cancel_req(struct wpa_ctrl *ctrl,
18978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						int argc, char *argv[])
18988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
189961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_SERV_DISC_CANCEL_REQ", 1, argc, argv);
19008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_resp(struct wpa_ctrl *ctrl, int argc,
19048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  char *argv[])
19058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[4096];
19078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
19088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 4) {
19108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SERV_DISC_RESP command: needs four "
19118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments (freq, address, dialog token, and TLVs)\n");
19128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "P2P_SERV_DISC_RESP %s %s %s %s",
19168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1], argv[2], argv[3]);
19178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
19188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
19208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
19218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_update(struct wpa_ctrl *ctrl, int argc,
19258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  char *argv[])
19268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_SERVICE_UPDATE");
19288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_external(struct wpa_ctrl *ctrl,
19328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      int argc, char *argv[])
19338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
193461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_SERV_DISC_EXTERNAL", 1, argc, argv);
19358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_flush(struct wpa_ctrl *ctrl, int argc,
19398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 char *argv[])
19408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_SERVICE_FLUSH");
19428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_add(struct wpa_ctrl *ctrl, int argc,
19468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
19478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[4096];
19498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
19508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 3 && argc != 4) {
19528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SERVICE_ADD command: needs three or four "
19538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments\n");
19548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 4)
19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_SERVICE_ADD %s %s %s %s",
19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2], argv[3]);
19618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
19628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
19638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_SERVICE_ADD %s %s %s",
19648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2]);
19658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
19668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_del(struct wpa_ctrl *ctrl, int argc,
19738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
19748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[4096];
19768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
19778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2 && argc != 3) {
19798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SERVICE_DEL command: needs two or three "
19808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments\n");
19818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 3)
19858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
19868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_SERVICE_DEL %s %s %s",
19878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2]);
19888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
19898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
19908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_SERVICE_DEL %s %s",
19918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
19928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
19938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
19958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
19968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_reject(struct wpa_ctrl *ctrl,
20008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  int argc, char *argv[])
20018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
200261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_REJECT", 1, argc, argv);
20038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_invite(struct wpa_ctrl *ctrl,
20078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  int argc, char *argv[])
20088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
200961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_INVITE", 1, argc, argv);
20108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_peer(struct wpa_ctrl *ctrl, int argc, char *argv[])
20148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
201561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_PEER", 1, argc, argv);
20168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** wpa_cli_complete_p2p_peer(const char *str, int pos)
20201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
20211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
20221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char **res = NULL;
20231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
20241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	switch (arg) {
20251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	case 1:
20261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		res = cli_txt_list_array(&p2p_peers);
20271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		break;
20281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
20291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
20301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
20311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
20321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
20331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
20348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_ctrl_command_p2p_peer(struct wpa_ctrl *ctrl, char *cmd,
20358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *addr, size_t addr_len,
20368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     int discovered)
20378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
20388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char buf[4096], *pos;
20398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
20408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret;
20418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL)
20438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
20448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = sizeof(buf) - 1;
204504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len,
20468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       wpa_cli_msg_cb);
20478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret == -2) {
20488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command timed out.\n", cmd);
20498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -2;
20508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (ret < 0) {
20518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command failed.\n", cmd);
20528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
20538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
20548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	buf[len] = '\0';
205604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (os_memcmp(buf, "FAIL", 4) == 0)
20578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
20588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = buf;
20608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*pos != '\0' && *pos != '\n')
20618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos++;
20628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	*pos++ = '\0';
20638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_strlcpy(addr, buf, addr_len);
20648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!discovered || os_strstr(pos, "[PROBE_REQ_ONLY]") == NULL)
20658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("%s\n", addr);
20668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
20678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_peers(struct wpa_ctrl *ctrl, int argc, char *argv[])
20718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
20728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char addr[32], cmd[64];
20738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int discovered;
20748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	discovered = argc > 0 && os_strcmp(argv[0], "discovered") == 0;
20768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_ctrl_command_p2p_peer(ctrl, "P2P_PEER FIRST",
20788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      addr, sizeof(addr), discovered))
20791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return -1;
20808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	do {
20818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(cmd, sizeof(cmd), "P2P_PEER NEXT-%s", addr);
20828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} while (wpa_ctrl_command_p2p_peer(ctrl, cmd, addr, sizeof(addr),
20838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			 discovered) == 0);
20848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return 0;
20868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_set(struct wpa_ctrl *ctrl, int argc, char *argv[])
20908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
209161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_SET", 2, argc, argv);
20928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2095391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidtstatic char ** wpa_cli_complete_p2p_set(const char *str, int pos)
2096391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt{
2097391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
2098391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	const char *fields[] = {
2099391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"discoverability",
2100391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"managed",
2101391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"listen_channel",
2102391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"ssid_postfix",
2103391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"noa",
2104391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"ps",
2105391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"oppps",
2106391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"ctwindow",
2107391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"disabled",
2108391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"conc_pref",
2109391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"force_long_sd",
2110391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"peer_filter",
2111391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"cross_connect",
2112391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"go_apsd",
2113391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"client_apsd",
2114391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"disallow_freq",
2115391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"disc_int",
2116391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"per_sta_psk",
2117391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	};
211868d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt	int i, num_fields = ARRAY_SIZE(fields);
2119391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
2120391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	if (arg == 1) {
2121391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		char **res = os_calloc(num_fields + 1, sizeof(char *));
2122391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		if (res == NULL)
2123391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt			return NULL;
2124391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		for (i = 0; i < num_fields; i++) {
2125391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt			res[i] = os_strdup(fields[i]);
2126391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt			if (res[i] == NULL)
2127391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt				return res;
2128391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		}
2129391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		return res;
2130391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	}
2131391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
2132391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	if (arg == 2 && os_strncasecmp(str, "p2p_set peer_filter ", 20) == 0)
2133391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		return cli_txt_list_array(&p2p_peers);
2134391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
2135391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	return NULL;
2136391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt}
2137391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
2138391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
21398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_flush(struct wpa_ctrl *ctrl, int argc, char *argv[])
21408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_FLUSH");
21428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_cancel(struct wpa_ctrl *ctrl, int argc,
21468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
21478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_CANCEL");
21498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_unauthorize(struct wpa_ctrl *ctrl, int argc,
21538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
21548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
215561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_UNAUTHORIZE", 1, argc, argv);
215661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
21578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
215861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
215961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_p2p_presence_req(struct wpa_ctrl *ctrl, int argc,
216061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					char *argv[])
216161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
216261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (argc != 0 && argc != 2 && argc != 4) {
216361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		printf("Invalid P2P_PRESENCE_REQ command: needs two arguments "
216461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "(preferred duration, interval; in microsecods).\n"
216561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "Optional second pair can be used to provide "
216661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "acceptable values.\n");
216761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return -1;
216861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
216961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
217061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_PRESENCE_REQ", 0, argc, argv);
217161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
217261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
217361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
217461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_p2p_ext_listen(struct wpa_ctrl *ctrl, int argc,
217561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				      char *argv[])
217661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
217761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (argc != 0 && argc != 2) {
217861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		printf("Invalid P2P_EXT_LISTEN command: needs two arguments "
217961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "(availability period, availability interval; in "
218061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "millisecods).\n"
218161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "Extended Listen Timing can be cancelled with this "
218261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "command when used without parameters.\n");
21838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
21848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
21858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
218661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_EXT_LISTEN", 0, argc, argv);
21878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2189391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
2190391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidtstatic int wpa_cli_cmd_p2p_remove_client(struct wpa_ctrl *ctrl, int argc,
2191391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt					 char *argv[])
2192391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt{
2193391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_REMOVE_CLIENT", 1, argc, argv);
2194391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt}
2195391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
219661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_P2P */
21978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
219861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#ifdef CONFIG_WIFI_DISPLAY
219961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
220061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_wfd_subelem_set(struct wpa_ctrl *ctrl, int argc,
220161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				       char *argv[])
22028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
22038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
22048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
22058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
220661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (argc != 1 && argc != 2) {
220761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		printf("Invalid WFD_SUBELEM_SET command: needs one or two "
220861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "arguments (subelem, hexdump)\n");
22098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
22108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
22118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
221261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "WFD_SUBELEM_SET %s %s",
221361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			  argv[0], argc > 1 ? argv[1] : "");
22148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
22158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
22168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
22178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
22188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
22198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
222161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_wfd_subelem_get(struct wpa_ctrl *ctrl, int argc,
222261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				       char *argv[])
22238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
22248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
22258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
22268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
222761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (argc != 1) {
222861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		printf("Invalid WFD_SUBELEM_GET command: needs one "
222961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "argument (subelem)\n");
22308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
22318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
22328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
223361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "WFD_SUBELEM_GET %s",
223461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			  argv[0]);
22358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
22368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
22378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
22388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
22398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
224061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_WIFI_DISPLAY */
22418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_INTERWORKING
22441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_fetch_anqp(struct wpa_ctrl *ctrl, int argc,
22451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				  char *argv[])
22461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
22471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpa_ctrl_command(ctrl, "FETCH_ANQP");
22481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
22491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_stop_fetch_anqp(struct wpa_ctrl *ctrl, int argc,
22521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				       char *argv[])
22531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
22541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpa_ctrl_command(ctrl, "STOP_FETCH_ANQP");
22551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
22561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_interworking_select(struct wpa_ctrl *ctrl, int argc,
22591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					   char *argv[])
22601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
226161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "INTERWORKING_SELECT", 0, argc, argv);
22621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
22631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_interworking_connect(struct wpa_ctrl *ctrl, int argc,
22661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					    char *argv[])
22671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
226861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "INTERWORKING_CONNECT", 1, argc, argv);
226961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
22701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
227261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_anqp_get(struct wpa_ctrl *ctrl, int argc, char *argv[])
227361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
227461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "ANQP_GET", 2, argc, argv);
22751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
22761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
227861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_gas_request(struct wpa_ctrl *ctrl, int argc,
227961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				   char *argv[])
22801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
228161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "GAS_REQUEST", 2, argc, argv);
228261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
22831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
228561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_gas_response_get(struct wpa_ctrl *ctrl, int argc,
228661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					char *argv[])
228761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
228861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "GAS_RESPONSE_GET", 2, argc, argv);
22891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
22901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_INTERWORKING */
22911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
229304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_HS20
229404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
229504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_hs20_anqp_get(struct wpa_ctrl *ctrl, int argc,
229604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				     char *argv[])
229704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
229861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "HS20_ANQP_GET", 2, argc, argv);
229904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
230004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
230104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
230204949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_get_nai_home_realm_list(struct wpa_ctrl *ctrl, int argc,
230304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       char *argv[])
230404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
230504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char cmd[512];
230604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
230704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (argc == 0) {
230804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		printf("Command needs one or two arguments (dst mac addr and "
230904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		       "optional home realm)\n");
231004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
231104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
231204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
231361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (write_cmd(cmd, sizeof(cmd), "HS20_GET_NAI_HOME_REALM_LIST",
231461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		      argc, argv) < 0)
231504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
231604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
231704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
231804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
231904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
2320f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt
2321f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidtstatic int wpa_cli_cmd_hs20_icon_request(struct wpa_ctrl *ctrl, int argc,
2322f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt					 char *argv[])
2323f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt{
2324f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt	char cmd[512];
2325f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt
2326f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt	if (argc < 2) {
2327f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt		printf("Command needs two arguments (dst mac addr and "
2328f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt		       "icon name)\n");
2329f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt		return -1;
2330f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt	}
2331f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt
2332f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt	if (write_cmd(cmd, sizeof(cmd), "HS20_ICON_REQUEST", argc, argv) < 0)
2333f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt		return -1;
2334f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt
2335f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
2336f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt}
2337f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt
2338f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt
2339f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidtstatic int wpa_cli_cmd_fetch_osu(struct wpa_ctrl *ctrl, int argc, char *argv[])
2340f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt{
2341f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt	return wpa_ctrl_command(ctrl, "FETCH_OSU");
2342f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt}
2343f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt
2344f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt
2345f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidtstatic int wpa_cli_cmd_cancel_fetch_osu(struct wpa_ctrl *ctrl, int argc,
2346f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt					char *argv[])
2347f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt{
2348f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt	return wpa_ctrl_command(ctrl, "CANCEL_FETCH_OSU");
2349f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt}
2350f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt
235104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_HS20 */
235204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
235304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
23548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_sta_autoconnect(struct wpa_ctrl *ctrl, int argc,
23558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
23568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
235761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "STA_AUTOCONNECT", 1, argc, argv);
23588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_tdls_discover(struct wpa_ctrl *ctrl, int argc,
23628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
23638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
236461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "TDLS_DISCOVER", 1, argc, argv);
23658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_tdls_setup(struct wpa_ctrl *ctrl, int argc,
23698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
23708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
237161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "TDLS_SETUP", 1, argc, argv);
23728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_tdls_teardown(struct wpa_ctrl *ctrl, int argc,
23768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
23778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
237861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "TDLS_TEARDOWN", 1, argc, argv);
23798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_signal_poll(struct wpa_ctrl *ctrl, int argc,
23838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
23848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
23858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "SIGNAL_POLL");
23868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2389fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zhengstatic int wpa_cli_cmd_pktcnt_poll(struct wpa_ctrl *ctrl, int argc,
2390fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng				   char *argv[])
2391fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng{
2392fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng	return wpa_ctrl_command(ctrl, "PKTCNT_POLL");
2393fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng}
2394fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng
2395fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng
23961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_reauthenticate(struct wpa_ctrl *ctrl, int argc,
23971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				      char *argv[])
23981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
23991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpa_ctrl_command(ctrl, "REAUTHENTICATE");
24001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
24011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
240204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
240304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN
240404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
240504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_autoscan(struct wpa_ctrl *ctrl, int argc, char *argv[])
240604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
240704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (argc == 0)
240804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return wpa_ctrl_command(ctrl, "AUTOSCAN ");
240904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
241061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "AUTOSCAN", 0, argc, argv);
241104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
241204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
241304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */
241404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
241504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
2416a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt#ifdef CONFIG_WNM
2417a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt
2418a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidtstatic int wpa_cli_cmd_wnm_sleep(struct wpa_ctrl *ctrl, int argc, char *argv[])
2419a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt{
2420a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WNM_SLEEP", 0, argc, argv);
2421a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt}
2422a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt
242344c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt
242444c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidtstatic int wpa_cli_cmd_wnm_bss_query(struct wpa_ctrl *ctrl, int argc, char *argv[])
242544c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt{
242644c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WNM_BSS_QUERY", 1, argc, argv);
242744c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt}
242844c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt
2429a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt#endif /* CONFIG_WNM */
2430a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt
2431a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt
243261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_raw(struct wpa_ctrl *ctrl, int argc, char *argv[])
243361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
243461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (argc == 0)
243561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return -1;
243661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, argv[0], 0, argc - 1, &argv[1]);
243761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
243861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
243961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
2440c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#ifdef ANDROID
24410716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidtstatic int wpa_cli_cmd_driver(struct wpa_ctrl *ctrl, int argc, char *argv[])
24420716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt{
2443292b0c3a742226c295f8db76eaef9e90c90e7513Dmitry Shmidt	return wpa_cli_cmd(ctrl, "DRIVER", 1, argc, argv);
24440716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt}
2445292b0c3a742226c295f8db76eaef9e90c90e7513Dmitry Shmidt#endif /* ANDROID */
24460716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt
244761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
2448a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidtstatic int wpa_cli_cmd_vendor(struct wpa_ctrl *ctrl, int argc, char *argv[])
2449a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt{
2450a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt	return wpa_cli_cmd(ctrl, "VENDOR", 1, argc, argv);
2451a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt}
2452a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt
2453a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt
2454444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidtstatic int wpa_cli_cmd_flush(struct wpa_ctrl *ctrl, int argc, char *argv[])
2455444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt{
2456444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt	return wpa_ctrl_command(ctrl, "FLUSH");
2457444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt}
2458444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt
2459444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt
2460fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtstatic int wpa_cli_cmd_radio_work(struct wpa_ctrl *ctrl, int argc, char *argv[])
2461fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt{
2462fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	return wpa_cli_cmd(ctrl, "RADIO_WORK", 1, argc, argv);
2463fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt}
2464fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt
2465fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt
24668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtenum wpa_cli_cmd_flags {
24678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cli_cmd_flag_none		= 0x00,
24688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cli_cmd_flag_sensitive		= 0x01
24698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
24708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpa_cli_cmd {
24728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *cmd;
24738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int (*handler)(struct wpa_ctrl *ctrl, int argc, char *argv[]);
247461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	char ** (*completion)(const char *str, int pos);
24758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	enum wpa_cli_cmd_flags flags;
24768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *usage;
24778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
24788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_cli_cmd wpa_cli_commands[] = {
248061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "status", wpa_cli_cmd_status, NULL,
24818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[verbose] = get current WPA/EAPOL/EAP status" },
248361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "ifname", wpa_cli_cmd_ifname, NULL,
248461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
248561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "= get current interface name" },
248661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "ping", wpa_cli_cmd_ping, NULL,
24878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= pings wpa_supplicant" },
248961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "relog", wpa_cli_cmd_relog, NULL,
24908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= re-open log-file (allow rolling logs)" },
249261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "note", wpa_cli_cmd_note, NULL,
24938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<text> = add a note to wpa_supplicant debug log" },
249561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "mib", wpa_cli_cmd_mib, NULL,
24968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get MIB variables (dot1x, dot11)" },
249861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "help", wpa_cli_cmd_help, wpa_cli_complete_help,
24998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
250061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "[command] = show usage help" },
250161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "interface", wpa_cli_cmd_interface, NULL,
25028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[ifname] = show interfaces/select interface" },
250461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "level", wpa_cli_cmd_level, NULL,
25058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<debug level> = change debug level" },
250761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "license", wpa_cli_cmd_license, NULL,
25088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= show full wpa_cli license" },
251061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "quit", wpa_cli_cmd_quit, NULL,
25118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= exit wpa_cli" },
251351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	{ "set", wpa_cli_cmd_set, wpa_cli_complete_set,
25148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= set variables (shows list of variables when run without "
25168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "arguments)" },
251761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "get", wpa_cli_cmd_get, NULL,
25188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<name> = get information" },
252061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "logon", wpa_cli_cmd_logon, NULL,
25218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= IEEE 802.1X EAPOL state machine logon" },
252361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "logoff", wpa_cli_cmd_logoff, NULL,
25248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= IEEE 802.1X EAPOL state machine logoff" },
252661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "pmksa", wpa_cli_cmd_pmksa, NULL,
25278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= show PMKSA cache" },
2529661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	{ "pmksa_flush", wpa_cli_cmd_pmksa_flush, NULL,
2530661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	  cli_cmd_flag_none,
2531661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	  "= flush PMKSA cache entries" },
253261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "reassociate", wpa_cli_cmd_reassociate, NULL,
25338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= force reassociation" },
25359866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt	{ "reattach", wpa_cli_cmd_reattach, NULL,
25369866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt	  cli_cmd_flag_none,
25379866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt	  "= force reassociation back to the same BSS" },
253861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "preauthenticate", wpa_cli_cmd_preauthenticate, wpa_cli_complete_bss,
25398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<BSSID> = force preauthentication" },
254161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "identity", wpa_cli_cmd_identity, NULL,
25428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <identity> = configure identity for an SSID" },
254461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "password", wpa_cli_cmd_password, NULL,
25458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
25468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <password> = configure password for an SSID" },
254761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "new_password", wpa_cli_cmd_new_password, NULL,
25488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
25498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <password> = change password for an SSID" },
255061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "pin", wpa_cli_cmd_pin, NULL,
25518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
25528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <pin> = configure pin for an SSID" },
255361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "otp", wpa_cli_cmd_otp, NULL,
25548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
25558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <password> = configure one-time-password for an SSID"
25568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	},
255761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "passphrase", wpa_cli_cmd_passphrase, NULL,
25588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
25598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <passphrase> = configure private key passphrase\n"
25608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  for an SSID" },
2561051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	{ "sim", wpa_cli_cmd_sim, NULL,
2562051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	  cli_cmd_flag_sensitive,
2563051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt	  "<network id> <pin> = report SIM operation result" },
256461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "bssid", wpa_cli_cmd_bssid, NULL,
25658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <BSSID> = set preferred BSSID for an SSID" },
256761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "blacklist", wpa_cli_cmd_blacklist, wpa_cli_complete_bss,
2568696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  cli_cmd_flag_none,
2569696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  "<BSSID> = add a BSSID to the blacklist\n"
2570696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  "blacklist clear = clear the blacklist\n"
2571696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  "blacklist = display the blacklist" },
257261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "log_level", wpa_cli_cmd_log_level, NULL,
2573696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  cli_cmd_flag_none,
25741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "<level> [<timestamp>] = update the log level/timestamp\n"
2575696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  "log_level = display the current log level and log options" },
257661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "list_networks", wpa_cli_cmd_list_networks, NULL,
25778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= list configured networks" },
257961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "select_network", wpa_cli_cmd_select_network, NULL,
25808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> = select a network (disable others)" },
258261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "enable_network", wpa_cli_cmd_enable_network, NULL,
25838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> = enable a network" },
258561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "disable_network", wpa_cli_cmd_disable_network, NULL,
25868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> = disable a network" },
258861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "add_network", wpa_cli_cmd_add_network, NULL,
25898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= add a network" },
259161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "remove_network", wpa_cli_cmd_remove_network, NULL,
25928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> = remove a network" },
259461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "set_network", wpa_cli_cmd_set_network, NULL,
25958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
25968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <variable> <value> = set network variables (shows\n"
25978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  list of variables when run without arguments)" },
259861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "get_network", wpa_cli_cmd_get_network, NULL,
25998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <variable> = get network variables" },
2601684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt	{ "dup_network", wpa_cli_cmd_dup_network, NULL,
2602684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt	  cli_cmd_flag_none,
2603684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt	  "<src network id> <dst network id> <variable> = duplicate network variables"
2604684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt	},
260561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "list_creds", wpa_cli_cmd_list_creds, NULL,
260604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_none,
260704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "= list configured credentials" },
260861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "add_cred", wpa_cli_cmd_add_cred, NULL,
260904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_none,
261004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "= add a credential" },
261161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "remove_cred", wpa_cli_cmd_remove_cred, NULL,
261204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_none,
261304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<cred id> = remove a credential" },
261461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "set_cred", wpa_cli_cmd_set_cred, NULL,
261504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_sensitive,
261604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<cred id> <variable> <value> = set credential variables" },
26170cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt	{ "get_cred", wpa_cli_cmd_get_cred, NULL,
26180cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt	  cli_cmd_flag_none,
26190cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt	  "<cred id> <variable> = get credential variables" },
262061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "save_config", wpa_cli_cmd_save_config, NULL,
26218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= save the current configuration" },
262361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "disconnect", wpa_cli_cmd_disconnect, NULL,
26248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= disconnect and wait for reassociate/reconnect command before\n"
26268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  connecting" },
262761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "reconnect", wpa_cli_cmd_reconnect, NULL,
26288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= like reassociate, but only takes effect if already disconnected"
26308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	},
263161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "scan", wpa_cli_cmd_scan, NULL,
26328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= request new BSS scan" },
263461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "scan_results", wpa_cli_cmd_scan_results, NULL,
26358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get latest scan results" },
263761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "bss", wpa_cli_cmd_bss, wpa_cli_complete_bss,
26388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<<idx> | <bssid>> = get detailed scan result info" },
264061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "get_capability", wpa_cli_cmd_get_capability, NULL,
26418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26428da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt	  "<eap/pairwise/group/key_mgmt/proto/auth_alg/channels/freq/modes> "
264361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "= get capabilies" },
264461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "reconfigure", wpa_cli_cmd_reconfigure, NULL,
26458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= force wpa_supplicant to re-read its configuration file" },
264761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "terminate", wpa_cli_cmd_terminate, NULL,
26488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= terminate wpa_supplicant" },
265061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "interface_add", wpa_cli_cmd_interface_add, NULL,
26518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<ifname> <confname> <driver> <ctrl_interface> <driver_param>\n"
26538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  <bridge_name> = adds new interface, all parameters but <ifname>\n"
26548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  are optional" },
265561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "interface_remove", wpa_cli_cmd_interface_remove, NULL,
26568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<ifname> = removes the interface" },
265861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "interface_list", wpa_cli_cmd_interface_list, NULL,
26598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= list available interfaces" },
266161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "ap_scan", wpa_cli_cmd_ap_scan, NULL,
26628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<value> = set ap_scan parameter" },
266461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "scan_interval", wpa_cli_cmd_scan_interval, NULL,
26658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<value> = set scan_interval parameter (in seconds)" },
266761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "bss_expire_age", wpa_cli_cmd_bss_expire_age, NULL,
26688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<value> = set BSS expiration age parameter" },
267061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "bss_expire_count", wpa_cli_cmd_bss_expire_count, NULL,
26718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<value> = set BSS expiration scan count parameter" },
267361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "bss_flush", wpa_cli_cmd_bss_flush, NULL,
2674f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	  cli_cmd_flag_none,
2675f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	  "<value> = set BSS flush age (0 by default)" },
267661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "stkstart", wpa_cli_cmd_stkstart, NULL,
26778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request STK negotiation with <addr>" },
267961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "ft_ds", wpa_cli_cmd_ft_ds, wpa_cli_complete_bss,
26808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request over-the-DS FT with <addr>" },
268261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_pbc", wpa_cli_cmd_wps_pbc, wpa_cli_complete_bss,
26838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[BSSID] = start Wi-Fi Protected Setup: Push Button Configuration" },
268561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_pin", wpa_cli_cmd_wps_pin, wpa_cli_complete_bss,
26868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
26878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<BSSID> [PIN] = start WPS PIN method (returns PIN, if not "
26888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "hardcoded)" },
268961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_check_pin", wpa_cli_cmd_wps_check_pin, NULL,
26908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
26918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<PIN> = verify PIN checksum" },
269261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_cancel", wpa_cli_cmd_wps_cancel, NULL, cli_cmd_flag_none,
26938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "Cancels the pending WPS operation" },
269404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_WPS_NFC
269561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_nfc", wpa_cli_cmd_wps_nfc, wpa_cli_complete_bss,
269604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_none,
269704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "[BSSID] = start Wi-Fi Protected Setup: NFC" },
2698f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	{ "wps_nfc_config_token", wpa_cli_cmd_wps_nfc_config_token, NULL,
2699f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	  cli_cmd_flag_none,
2700f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	  "<WPS|NDEF> = build configuration token" },
270161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_nfc_token", wpa_cli_cmd_wps_nfc_token, NULL,
270204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_none,
270304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<WPS|NDEF> = create password token" },
270461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_nfc_tag_read", wpa_cli_cmd_wps_nfc_tag_read, NULL,
270504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_sensitive,
270604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<hexdump of payload> = report read NFC tag with WPS data" },
2707d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	{ "nfc_get_handover_req", wpa_cli_cmd_nfc_get_handover_req, NULL,
2708d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	  cli_cmd_flag_none,
2709d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	  "<NDEF> <WPS> = create NFC handover request" },
2710d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	{ "nfc_get_handover_sel", wpa_cli_cmd_nfc_get_handover_sel, NULL,
2711d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	  cli_cmd_flag_none,
2712d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	  "<NDEF> <WPS> = create NFC handover select" },
2713f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	{ "nfc_report_handover", wpa_cli_cmd_nfc_report_handover, NULL,
2714f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	  cli_cmd_flag_none,
2715f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	  "<role> <type> <hexdump of req> <hexdump of sel> = report completed "
2716f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	  "NFC handover" },
271704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_WPS_NFC */
271861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_reg", wpa_cli_cmd_wps_reg, wpa_cli_complete_bss,
27198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
27208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<BSSID> <AP PIN> = start WPS Registrar to configure an AP" },
272161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_ap_pin", wpa_cli_cmd_wps_ap_pin, NULL,
27228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
27238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[params..] = enable/disable AP PIN" },
272461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_er_start", wpa_cli_cmd_wps_er_start, NULL,
27258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[IP address] = start Wi-Fi Protected Setup External Registrar" },
272761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_er_stop", wpa_cli_cmd_wps_er_stop, NULL,
27288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= stop Wi-Fi Protected Setup External Registrar" },
273061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_er_pin", wpa_cli_cmd_wps_er_pin, NULL,
27318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
27328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> <PIN> = add an Enrollee PIN to External Registrar" },
273361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_er_pbc", wpa_cli_cmd_wps_er_pbc, NULL,
27348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> = accept an Enrollee PBC using External Registrar" },
273661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_er_learn", wpa_cli_cmd_wps_er_learn, NULL,
27378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
27388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> <PIN> = learn AP configuration" },
273961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_er_set_config", wpa_cli_cmd_wps_er_set_config, NULL,
27408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> <network id> = set AP configuration for enrolling" },
274261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_er_config", wpa_cli_cmd_wps_er_config, NULL,
27438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
27448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> <PIN> <SSID> <auth> <encr> <key> = configure AP" },
274504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_WPS_NFC
274661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_er_nfc_config_token", wpa_cli_cmd_wps_er_nfc_config_token, NULL,
274704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_none,
274804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<WPS/NDEF> <UUID> = build NFC configuration token" },
274904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_WPS_NFC */
275061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "ibss_rsn", wpa_cli_cmd_ibss_rsn, NULL,
27518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request RSN authentication with <addr> in IBSS" },
27538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_AP
275461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "sta", wpa_cli_cmd_sta, NULL,
27558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = get information about an associated station (AP)" },
275761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "all_sta", wpa_cli_cmd_all_sta, NULL,
27588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get information about all associated stations (AP)" },
276061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "deauthenticate", wpa_cli_cmd_deauthenticate, NULL,
276104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_none,
276204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<addr> = deauthenticate a station" },
276361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "disassociate", wpa_cli_cmd_disassociate, NULL,
276404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_none,
276504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<addr> = disassociate a station" },
2766e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	{ "chan_switch", wpa_cli_cmd_chanswitch, NULL,
2767e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	  cli_cmd_flag_none,
2768e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	  "<cs_count> <freq> [sec_channel_offset=] [center_freq1=]"
2769e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	  " [center_freq2=] [bandwidth=] [blocktx] [ht|vht]"
2770e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt	  " = CSA parameters" },
27718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_AP */
277261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "suspend", wpa_cli_cmd_suspend, NULL, cli_cmd_flag_none,
27738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= notification of suspend/hibernate" },
277461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "resume", wpa_cli_cmd_resume, NULL, cli_cmd_flag_none,
27758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= notification of resume/thaw" },
277621de214b4ba4271ca20843f3b8fba9f1501b2a89Dmitry Shmidt#ifdef CONFIG_TESTING_OPTIONS
277761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "drop_sa", wpa_cli_cmd_drop_sa, NULL, cli_cmd_flag_none,
27788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= drop SA without deauth/disassoc (test command)" },
277921de214b4ba4271ca20843f3b8fba9f1501b2a89Dmitry Shmidt#endif /* CONFIG_TESTING_OPTIONS */
278061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "roam", wpa_cli_cmd_roam, wpa_cli_complete_bss,
27818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = roam to the specified BSS" },
27838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P
278461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_find", wpa_cli_cmd_p2p_find, wpa_cli_complete_p2p_find,
278561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
27868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[timeout] [type=*] = find P2P Devices for up-to timeout seconds" },
278761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_stop_find", wpa_cli_cmd_p2p_stop_find, NULL, cli_cmd_flag_none,
27888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= stop P2P Devices search" },
278961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_connect", wpa_cli_cmd_p2p_connect, wpa_cli_complete_p2p_connect,
279061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
279161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "<addr> <\"pbc\"|PIN> [ht40] = connect to a P2P Device" },
279261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_listen", wpa_cli_cmd_p2p_listen, NULL, cli_cmd_flag_none,
27938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[timeout] = listen for P2P Devices for up-to timeout seconds" },
279461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_group_remove", wpa_cli_cmd_p2p_group_remove,
279561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  wpa_cli_complete_p2p_group_remove, cli_cmd_flag_none,
27968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<ifname> = remove P2P group interface (terminate group if GO)" },
279761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_group_add", wpa_cli_cmd_p2p_group_add, NULL, cli_cmd_flag_none,
279861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "[ht40] = add a new P2P group (local end as GO)" },
279961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_prov_disc", wpa_cli_cmd_p2p_prov_disc,
280061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  wpa_cli_complete_p2p_peer, cli_cmd_flag_none,
28018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> <method> = request provisioning discovery" },
280261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_get_passphrase", wpa_cli_cmd_p2p_get_passphrase, NULL,
28038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get the passphrase for a group (GO only)" },
28058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_serv_disc_req", wpa_cli_cmd_p2p_serv_disc_req,
280661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  wpa_cli_complete_p2p_peer, cli_cmd_flag_none,
28078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> <TLVs> = schedule service discovery request" },
28088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_serv_disc_cancel_req", wpa_cli_cmd_p2p_serv_disc_cancel_req,
280961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  NULL, cli_cmd_flag_none,
28108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<id> = cancel pending service discovery request" },
281161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_serv_disc_resp", wpa_cli_cmd_p2p_serv_disc_resp, NULL,
28128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<freq> <addr> <dialog token> <TLVs> = service discovery response" },
281461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_service_update", wpa_cli_cmd_p2p_service_update, NULL,
28158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= indicate change in local services" },
281761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_serv_disc_external", wpa_cli_cmd_p2p_serv_disc_external, NULL,
28188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<external> = set external processing of service discovery" },
282061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_service_flush", wpa_cli_cmd_p2p_service_flush, NULL,
28218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= remove all stored service entries" },
282361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_service_add", wpa_cli_cmd_p2p_service_add, NULL,
28248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<bonjour|upnp> <query|version> <response|service> = add a local "
28268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "service" },
282761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_service_del", wpa_cli_cmd_p2p_service_del, NULL,
28288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<bonjour|upnp> <query|version> [|service] = remove a local "
28308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "service" },
283161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_reject", wpa_cli_cmd_p2p_reject, wpa_cli_complete_p2p_peer,
28328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = reject connection attempts from a specific peer" },
283461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_invite", wpa_cli_cmd_p2p_invite, NULL,
28358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<cmd> [peer=addr] = invite peer" },
283761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_peers", wpa_cli_cmd_p2p_peers, NULL, cli_cmd_flag_none,
28388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[discovered] = list known (optionally, only fully discovered) P2P "
28398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "peers" },
284061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_peer", wpa_cli_cmd_p2p_peer, wpa_cli_complete_p2p_peer,
284161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
28428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<address> = show information about known P2P peer" },
2843391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	{ "p2p_set", wpa_cli_cmd_p2p_set, wpa_cli_complete_p2p_set,
2844391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	  cli_cmd_flag_none,
28458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<field> <value> = set a P2P parameter" },
284661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_flush", wpa_cli_cmd_p2p_flush, NULL, cli_cmd_flag_none,
28478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= flush P2P state" },
284861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_cancel", wpa_cli_cmd_p2p_cancel, NULL, cli_cmd_flag_none,
28498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= cancel P2P group formation" },
285061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_unauthorize", wpa_cli_cmd_p2p_unauthorize,
285161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  wpa_cli_complete_p2p_peer, cli_cmd_flag_none,
28528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<address> = unauthorize a peer" },
285361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_presence_req", wpa_cli_cmd_p2p_presence_req, NULL,
285461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
28558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[<duration> <interval>] [<duration> <interval>] = request GO "
28568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "presence" },
285761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_ext_listen", wpa_cli_cmd_p2p_ext_listen, NULL,
285861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
28598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[<period> <interval>] = set extended listen timing" },
2860391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	{ "p2p_remove_client", wpa_cli_cmd_p2p_remove_client,
2861391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	  wpa_cli_complete_p2p_peer, cli_cmd_flag_none,
2862391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	  "<address|iface=address> = remove a peer from all groups" },
28638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */
286461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#ifdef CONFIG_WIFI_DISPLAY
286561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wfd_subelem_set", wpa_cli_cmd_wfd_subelem_set, NULL,
286661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
286761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "<subelem> [contents] = set Wi-Fi Display subelement" },
286861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wfd_subelem_get", wpa_cli_cmd_wfd_subelem_get, NULL,
286961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
287061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "<subelem> = get Wi-Fi Display subelement" },
287161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_WIFI_DISPLAY */
28721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_INTERWORKING
287361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "fetch_anqp", wpa_cli_cmd_fetch_anqp, NULL, cli_cmd_flag_none,
28741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "= fetch ANQP information for all APs" },
287561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "stop_fetch_anqp", wpa_cli_cmd_stop_fetch_anqp, NULL,
287661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
28771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "= stop fetch_anqp operation" },
287861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "interworking_select", wpa_cli_cmd_interworking_select, NULL,
28791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  cli_cmd_flag_none,
28801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "[auto] = perform Interworking network selection" },
28811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	{ "interworking_connect", wpa_cli_cmd_interworking_connect,
288261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  wpa_cli_complete_bss, cli_cmd_flag_none,
28831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "<BSSID> = connect using Interworking credentials" },
288461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "anqp_get", wpa_cli_cmd_anqp_get, wpa_cli_complete_bss,
288561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
28861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "<addr> <info id>[,<info id>]... = request ANQP information" },
288761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "gas_request", wpa_cli_cmd_gas_request, wpa_cli_complete_bss,
288861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
288961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "<addr> <AdvProtoID> [QueryReq] = GAS request" },
289061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "gas_response_get", wpa_cli_cmd_gas_response_get,
289161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  wpa_cli_complete_bss, cli_cmd_flag_none,
289261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "<addr> <dialog token> [start,len] = Fetch last GAS response" },
28931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_INTERWORKING */
289404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_HS20
289561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "hs20_anqp_get", wpa_cli_cmd_hs20_anqp_get, wpa_cli_complete_bss,
289661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
289704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<addr> <subtype>[,<subtype>]... = request HS 2.0 ANQP information"
289804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	},
289904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	{ "nai_home_realm_list", wpa_cli_cmd_get_nai_home_realm_list,
290061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  wpa_cli_complete_bss, cli_cmd_flag_none,
290104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<addr> <home realm> = get HS20 nai home realm list" },
2902f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt	{ "hs20_icon_request", wpa_cli_cmd_hs20_icon_request,
2903f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt	  wpa_cli_complete_bss, cli_cmd_flag_none,
2904f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt	  "<addr> <icon name> = get Hotspot 2.0 OSU icon" },
2905f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt	{ "fetch_osu", wpa_cli_cmd_fetch_osu, NULL, cli_cmd_flag_none,
2906f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt	  "= fetch OSU provider information from all APs" },
2907f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt	{ "cancel_fetch_osu", wpa_cli_cmd_cancel_fetch_osu, NULL,
2908f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt	  cli_cmd_flag_none,
2909f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt	  "= cancel fetch_osu command" },
291004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_HS20 */
291161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "sta_autoconnect", wpa_cli_cmd_sta_autoconnect, NULL,
291261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
29138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<0/1> = disable/enable automatic reconnection" },
291461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "tdls_discover", wpa_cli_cmd_tdls_discover, NULL,
29158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
29168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request TDLS discovery with <addr>" },
291761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "tdls_setup", wpa_cli_cmd_tdls_setup, NULL,
29188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
29198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request TDLS setup with <addr>" },
292061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "tdls_teardown", wpa_cli_cmd_tdls_teardown, NULL,
29218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
29228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = tear down TDLS with <addr>" },
292361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "signal_poll", wpa_cli_cmd_signal_poll, NULL,
29248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
29258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get signal parameters" },
292661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "pktcnt_poll", wpa_cli_cmd_pktcnt_poll, NULL,
2927fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng	  cli_cmd_flag_none,
2928fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng	  "= get TX/RX packet counters" },
292961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "reauthenticate", wpa_cli_cmd_reauthenticate, NULL,
293061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
29311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "= trigger IEEE 802.1X/EAPOL reauthentication" },
293204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN
293361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "autoscan", wpa_cli_cmd_autoscan, NULL, cli_cmd_flag_none,
293404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "[params] = Set or unset (if none) autoscan parameters" },
293504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */
2936a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt#ifdef CONFIG_WNM
2937a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt	{ "wnm_sleep", wpa_cli_cmd_wnm_sleep, NULL, cli_cmd_flag_none,
2938a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt	  "<enter/exit> [interval=#] = enter/exit WNM-Sleep mode" },
293944c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt	{ "wnm_bss_query", wpa_cli_cmd_wnm_bss_query, NULL, cli_cmd_flag_none,
294044c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt	  "<query reason> = Send BSS Transition Management Query" },
2941a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt#endif /* CONFIG_WNM */
294261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "raw", wpa_cli_cmd_raw, NULL, cli_cmd_flag_sensitive,
294361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "<params..> = Sent unprocessed command" },
2944444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt	{ "flush", wpa_cli_cmd_flush, NULL, cli_cmd_flag_none,
2945444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt	  "= flush wpa_supplicant state" },
2946c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#ifdef ANDROID
2947292b0c3a742226c295f8db76eaef9e90c90e7513Dmitry Shmidt	{ "driver", wpa_cli_cmd_driver, NULL, cli_cmd_flag_none,
29480716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	  "<command> = driver private commands" },
2949292b0c3a742226c295f8db76eaef9e90c90e7513Dmitry Shmidt#endif /* ANDROID */
2950fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	{ "radio_work", wpa_cli_cmd_radio_work, NULL, cli_cmd_flag_none,
2951fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt	  "= radio_work <show/add/done>" },
2952a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt	{ "vendor", wpa_cli_cmd_vendor, NULL, cli_cmd_flag_none,
2953a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt	  "<vendor id> <command id> [<hex formatted command argument>] = Send vendor command"
2954a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt	},
295561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ NULL, NULL, NULL, cli_cmd_flag_none, NULL }
29568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
29578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
29608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Prints command usage, lines are padded with the specified string.
29618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
29628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void print_cmd_help(struct wpa_cli_cmd *cmd, const char *pad)
29638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char c;
29658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t n;
29668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("%s%s ", pad, cmd->cmd);
29688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (n = 0; (c = cmd->usage[n]); n++) {
29698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("%c", c);
29708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (c == '\n')
29718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("%s", pad);
29728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
29738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("\n");
29748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
297761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void print_help(const char *cmd)
29788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int n;
29808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("commands:\n");
298161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	for (n = 0; wpa_cli_commands[n].cmd; n++) {
298261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (cmd == NULL || str_starts(wpa_cli_commands[n].cmd, cmd))
298361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			print_cmd_help(&wpa_cli_commands[n], "  ");
298461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
29858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_edit_filter_history_cb(void *ctx, const char *cmd)
29898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *c, *delim;
29918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int n;
29928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
29938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	delim = os_strchr(cmd, ' ');
29958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (delim)
29968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		len = delim - cmd;
29978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
29988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		len = os_strlen(cmd);
29998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (n = 0; (c = wpa_cli_commands[n].cmd); n++) {
30018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strncasecmp(cmd, c, len) == 0 && len == os_strlen(c))
30028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return (wpa_cli_commands[n].flags &
30038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				cli_cmd_flag_sensitive);
30048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
30068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char ** wpa_list_cmd_list(void)
30108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **res;
30128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, count;
3013f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	struct cli_txt_entry *e;
30148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
301568d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt	count = ARRAY_SIZE(wpa_cli_commands);
3016f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	count += dl_list_len(&p2p_groups);
3017f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	count += dl_list_len(&ifnames);
3018f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	res = os_calloc(count + 1, sizeof(char *));
30198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res == NULL)
30208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
30218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; wpa_cli_commands[i].cmd; i++) {
30238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res[i] = os_strdup(wpa_cli_commands[i].cmd);
30248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (res[i] == NULL)
30258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
30268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3028f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	dl_list_for_each(e, &p2p_groups, struct cli_txt_entry, list) {
3029f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		size_t len = 8 + os_strlen(e->txt);
3030f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		res[i] = os_malloc(len);
3031f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		if (res[i] == NULL)
3032f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt			break;
3033f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		os_snprintf(res[i], len, "ifname=%s", e->txt);
3034f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		i++;
3035f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	}
3036f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
3037f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	dl_list_for_each(e, &ifnames, struct cli_txt_entry, list) {
3038f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		res[i] = os_strdup(e->txt);
3039f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		if (res[i] == NULL)
3040f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt			break;
3041f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		i++;
3042f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	}
3043f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
30448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return res;
30458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char ** wpa_cli_cmd_completion(const char *cmd, const char *str,
30498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      int pos)
30508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i;
30528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; wpa_cli_commands[i].cmd; i++) {
30548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcasecmp(wpa_cli_commands[i].cmd, cmd) == 0) {
305561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			if (wpa_cli_commands[i].completion)
305661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				return wpa_cli_commands[i].completion(str,
305761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt								      pos);
30588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			edit_clear_line();
30598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("\r%s\n", wpa_cli_commands[i].usage);
30608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			edit_redraw();
30618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
30628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
30638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
30668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char ** wpa_cli_edit_completion_cb(void *ctx, const char *str, int pos)
30708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **res;
30728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *end;
30738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *cmd;
30748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3075f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	if (pos > 7 && os_strncasecmp(str, "IFNAME=", 7) == 0) {
3076f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		end = os_strchr(str, ' ');
3077f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		if (end && pos > end - str) {
3078f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt			pos -= end - str + 1;
3079f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt			str = end + 1;
3080f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		}
3081f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	}
3082f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
30838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = os_strchr(str, ' ');
30848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (end == NULL || str + pos < end)
30858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_list_cmd_list();
30868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd = os_malloc(pos + 1);
30888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (cmd == NULL)
30898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
30908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memcpy(cmd, str, pos);
30918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[end - str] = '\0';
30928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = wpa_cli_cmd_completion(cmd, str, pos);
30938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(cmd);
30948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return res;
30958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_request(struct wpa_ctrl *ctrl, int argc, char *argv[])
30998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_cli_cmd *cmd, *match = NULL;
31018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int count;
31028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret = 0;
31038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3104f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	if (argc > 1 && os_strncasecmp(argv[0], "IFNAME=", 7) == 0) {
3105f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		ifname_prefix = argv[0] + 7;
3106f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		argv = &argv[1];
3107f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		argc--;
3108f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	} else
3109f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		ifname_prefix = NULL;
3110f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
3111f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	if (argc == 0)
3112f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		return -1;
3113f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
31148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	count = 0;
31158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd = wpa_cli_commands;
31168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (cmd->cmd) {
31178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strncasecmp(cmd->cmd, argv[0], os_strlen(argv[0])) == 0)
31188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		{
31198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			match = cmd;
31208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (os_strcasecmp(cmd->cmd, argv[0]) == 0) {
31218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				/* we have an exact match */
31228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				count = 1;
31238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
31248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
31258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			count++;
31268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
31278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		cmd++;
31288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
31298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (count > 1) {
31318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Ambiguous command '%s'; possible commands:", argv[0]);
31328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		cmd = wpa_cli_commands;
31338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		while (cmd->cmd) {
31348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (os_strncasecmp(cmd->cmd, argv[0],
31358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   os_strlen(argv[0])) == 0) {
31368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				printf(" %s", cmd->cmd);
31378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
31388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			cmd++;
31398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
31408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("\n");
31418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = 1;
31428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (count == 0) {
31438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Unknown command '%s'\n", argv[0]);
31448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = 1;
31458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
31468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = match->handler(ctrl, argc - 1, &argv[1]);
31478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
31488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return ret;
31508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int str_match(const char *a, const char *b)
31548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return os_strncmp(a, b, os_strlen(b)) == 0;
31568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_exec(const char *program, const char *arg1,
31608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			const char *arg2)
31618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3162772e12cfed81754a9fd890be7bc77bc602a549b5Jouni Malinen	char *arg;
31638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
31648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
31658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3166772e12cfed81754a9fd890be7bc77bc602a549b5Jouni Malinen	len = os_strlen(arg1) + os_strlen(arg2) + 2;
3167772e12cfed81754a9fd890be7bc77bc602a549b5Jouni Malinen	arg = os_malloc(len);
3168772e12cfed81754a9fd890be7bc77bc602a549b5Jouni Malinen	if (arg == NULL)
31698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
3170772e12cfed81754a9fd890be7bc77bc602a549b5Jouni Malinen	os_snprintf(arg, len, "%s %s", arg1, arg2);
3171772e12cfed81754a9fd890be7bc77bc602a549b5Jouni Malinen	res = os_exec(program, arg, 1);
3172772e12cfed81754a9fd890be7bc77bc602a549b5Jouni Malinen	os_free(arg);
31738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3174772e12cfed81754a9fd890be7bc77bc602a549b5Jouni Malinen	return res;
31758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_action_process(const char *msg)
31798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *pos;
31818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *copy = NULL, *id, *pos2;
3182661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	const char *ifname = ctrl_ifname;
3183661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	char ifname_buf[100];
31848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = msg;
3186661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (os_strncmp(pos, "IFNAME=", 7) == 0) {
3187661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		const char *end;
3188661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		end = os_strchr(pos + 7, ' ');
3189661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		if (end && (unsigned int) (end - pos) < sizeof(ifname_buf)) {
3190661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt			pos += 7;
3191661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt			os_memcpy(ifname_buf, pos, end - pos);
3192661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt			ifname_buf[end - pos] = '\0';
3193661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt			ifname = ifname_buf;
3194661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt			pos = end + 1;
3195661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		}
3196661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	}
31978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (*pos == '<') {
3198661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		const char *prev = pos;
31998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* skip priority */
32008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos = os_strchr(pos, '>');
32018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos)
32028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos++;
32038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else
3204661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt			pos = prev;
32058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
32068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (str_match(pos, WPA_EVENT_CONNECTED)) {
32088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int new_id = -1;
32098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_unsetenv("WPA_ID");
32108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_unsetenv("WPA_ID_STR");
32118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_unsetenv("WPA_CTRL_DIR");
32128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos = os_strstr(pos, "[id=");
32148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos)
32158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			copy = os_strdup(pos + 4);
32168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (copy) {
32188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos2 = id = copy;
32198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			while (*pos2 && *pos2 != ' ')
32208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos2++;
32218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*pos2++ = '\0';
32228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			new_id = atoi(id);
32238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_setenv("WPA_ID", id, 1);
32248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			while (*pos2 && *pos2 != '=')
32258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos2++;
32268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (*pos2 == '=')
32278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos2++;
32288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			id = pos2;
32298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			while (*pos2 && *pos2 != ']')
32308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos2++;
32318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*pos2 = '\0';
32328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_setenv("WPA_ID_STR", id, 1);
32338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(copy);
32348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
32358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_setenv("WPA_CTRL_DIR", ctrl_iface_dir, 1);
32378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3238391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		if (wpa_cli_connected <= 0 || new_id != wpa_cli_last_id) {
32398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_connected = 1;
32408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_last_id = new_id;
3241661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt			wpa_cli_exec(action_file, ifname, "CONNECTED");
32428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
32438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, WPA_EVENT_DISCONNECTED)) {
32448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpa_cli_connected) {
32458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_connected = 0;
3246661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt			wpa_cli_exec(action_file, ifname, "DISCONNECTED");
32478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
32488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, P2P_EVENT_GROUP_STARTED)) {
3249661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		wpa_cli_exec(action_file, ifname, pos);
32508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, P2P_EVENT_GROUP_REMOVED)) {
3251661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		wpa_cli_exec(action_file, ifname, pos);
32528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, P2P_EVENT_CROSS_CONNECT_ENABLE)) {
3253661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		wpa_cli_exec(action_file, ifname, pos);
32548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, P2P_EVENT_CROSS_CONNECT_DISABLE)) {
3255661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		wpa_cli_exec(action_file, ifname, pos);
32561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	} else if (str_match(pos, P2P_EVENT_GO_NEG_FAILURE)) {
3257661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		wpa_cli_exec(action_file, ifname, pos);
32588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, WPS_EVENT_SUCCESS)) {
3259661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		wpa_cli_exec(action_file, ifname, pos);
32608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, WPS_EVENT_FAIL)) {
3261661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		wpa_cli_exec(action_file, ifname, pos);
32621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	} else if (str_match(pos, AP_STA_CONNECTED)) {
3263661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		wpa_cli_exec(action_file, ifname, pos);
32641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	} else if (str_match(pos, AP_STA_DISCONNECTED)) {
3265661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		wpa_cli_exec(action_file, ifname, pos);
3266f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	} else if (str_match(pos, ESS_DISASSOC_IMMINENT)) {
3267661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		wpa_cli_exec(action_file, ifname, pos);
3268f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt	} else if (str_match(pos, HS20_SUBSCRIPTION_REMEDIATION)) {
3269661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		wpa_cli_exec(action_file, ifname, pos);
3270f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt	} else if (str_match(pos, HS20_DEAUTH_IMMINENT_NOTICE)) {
3271661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		wpa_cli_exec(action_file, ifname, pos);
32728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, WPA_EVENT_TERMINATING)) {
32738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("wpa_supplicant is terminating - stop monitoring\n");
32748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_quit = 1;
32758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
32768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
32778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_ANSI_C_EXTRA
32808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_action_cb(char *msg, size_t len)
32818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
32828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_action_process(msg);
32838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
32848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_ANSI_C_EXTRA */
32858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_reconnect(void)
32888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
32898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_close_connection();
329061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (wpa_cli_open_connection(ctrl_ifname, 1) < 0)
329161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return;
329261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
329361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (interactive) {
329461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		edit_clear_line();
329561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		printf("\rConnection to wpa_supplicant re-established\n");
329661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		edit_redraw();
329761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
32988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
32998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_event(const char *str)
33021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
33031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	const char *start, *s;
33041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
33051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	start = os_strchr(str, '>');
33061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (start == NULL)
33071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
33081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
33091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	start++;
33101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
33111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (str_starts(start, WPA_EVENT_BSS_ADDED)) {
33121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strchr(start, ' ');
33131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
33141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
33151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strchr(s + 1, ' ');
33161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
33171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
33181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_add(&bsses, s + 1);
33191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
33201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
33211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
33221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (str_starts(start, WPA_EVENT_BSS_REMOVED)) {
33231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strchr(start, ' ');
33241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
33251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
33261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strchr(s + 1, ' ');
33271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
33281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
33291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_del_addr(&bsses, s + 1);
33301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
33311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
33321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
33331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P
33341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (str_starts(start, P2P_EVENT_DEVICE_FOUND)) {
33351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strstr(start, " p2p_dev_addr=");
33361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
33371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
33381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_add_addr(&p2p_peers, s + 14);
33391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
33401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
33411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
33421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (str_starts(start, P2P_EVENT_DEVICE_LOST)) {
33431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strstr(start, " p2p_dev_addr=");
33441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
33451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
33461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_del_addr(&p2p_peers, s + 14);
33471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
33481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
33491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
33501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (str_starts(start, P2P_EVENT_GROUP_STARTED)) {
33511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strchr(start, ' ');
33521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
33531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
33541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_add_word(&p2p_groups, s + 1);
33551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
33561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
33571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
33581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (str_starts(start, P2P_EVENT_GROUP_REMOVED)) {
33591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strchr(start, ' ');
33601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
33611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
33621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_del_word(&p2p_groups, s + 1);
33631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
33641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
33651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */
33661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
33671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
33681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
336961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int check_terminating(const char *msg)
337061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
337161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	const char *pos = msg;
337261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
337361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (*pos == '<') {
337461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		/* skip priority */
337561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		pos = os_strchr(pos, '>');
337661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (pos)
337761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			pos++;
337861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		else
337961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			pos = msg;
338061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
338161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
338261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (str_match(pos, WPA_EVENT_TERMINATING) && ctrl_conn) {
338361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		edit_clear_line();
338461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		printf("\rConnection to wpa_supplicant lost - trying to "
338561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "reconnect\n");
338661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		edit_redraw();
338761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		wpa_cli_attached = 0;
338861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		wpa_cli_close_connection();
338961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return 1;
339061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
339161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
339261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return 0;
339361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
339461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
339561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
33968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_recv_pending(struct wpa_ctrl *ctrl, int action_monitor)
33978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
33988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL) {
33998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_reconnect();
34008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
34018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
34028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (wpa_ctrl_pending(ctrl) > 0) {
3403661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		char buf[4096];
34048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		size_t len = sizeof(buf) - 1;
34058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpa_ctrl_recv(ctrl, buf, &len) == 0) {
34068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			buf[len] = '\0';
34078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (action_monitor)
34088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				wpa_cli_action_process(buf);
34098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			else {
34101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				cli_event(buf);
34118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (wpa_cli_show_event(buf)) {
34128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					edit_clear_line();
34138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					printf("\r%s\n", buf);
34148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					edit_redraw();
34158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				}
341661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
341761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				if (interactive && check_terminating(buf) > 0)
341861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					return;
34198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
34208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
34218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Could not read pending message.\n");
34228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
34238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
34248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
34258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_ctrl_pending(ctrl) < 0) {
34278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Connection to wpa_supplicant lost - trying to "
34288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "reconnect\n");
34298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_reconnect();
34308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
34318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
34328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define max_args 10
34348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int tokenize_cmd(char *cmd, char *argv[])
34368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
34378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *pos;
34388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int argc = 0;
34398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
34418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (;;) {
34428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		while (*pos == ' ')
34438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos++;
34448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (*pos == '\0')
34458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
34468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		argv[argc] = pos;
34478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		argc++;
34488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (argc == max_args)
34498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
34508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (*pos == '"') {
34518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			char *pos2 = os_strrchr(pos, '"');
34528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (pos2)
34538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos = pos2 + 1;
34548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
34558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		while (*pos != '\0' && *pos != ' ')
34568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos++;
34578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (*pos == ' ')
34588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*pos++ = '\0';
34598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
34608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return argc;
34628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
34638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_ping(void *eloop_ctx, void *timeout_ctx)
34668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3467661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt	if (ctrl_conn) {
3468661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		int res;
3469661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		char *prefix = ifname_prefix;
3470661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt
3471661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		ifname_prefix = NULL;
3472661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		res = _wpa_ctrl_command(ctrl_conn, "PING", 0);
3473661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		ifname_prefix = prefix;
3474661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		if (res) {
3475661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt			printf("Connection to wpa_supplicant lost - trying to "
3476661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt			       "reconnect\n");
3477661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt			wpa_cli_close_connection();
3478661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt		}
34798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
34808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!ctrl_conn)
34818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_reconnect();
34828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_register_timeout(ping_interval, 0, wpa_cli_ping, NULL, NULL);
34838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
34848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_mon_receive(int sock, void *eloop_ctx, void *sock_ctx)
34878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
34888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_recv_pending(mon_conn, 0);
34898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
34908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_edit_cmd_cb(void *ctx, char *cmd)
34938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
34948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *argv[max_args];
34958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int argc;
34968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	argc = tokenize_cmd(cmd, argv);
34978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc)
34988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_request(ctrl_conn, argc, argv);
34998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_edit_eof_cb(void *ctx)
35038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_terminate();
35058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
350861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int warning_displayed = 0;
350961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic char *hfile = NULL;
351061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int edit_started = 0;
351161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
351261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void start_edit(void)
35138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
351461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	char *home;
351561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	char *ps = NULL;
35168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
351761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_UDP_REMOTE
351861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	ps = wpa_ctrl_get_remote_ifname(ctrl_conn);
351961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */
35208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	home = getenv("HOME");
35228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (home) {
35238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *fname = ".wpa_cli_history";
35248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int hfile_len = os_strlen(home) + 1 + os_strlen(fname) + 1;
35258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		hfile = os_malloc(hfile_len);
35268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (hfile)
35278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_snprintf(hfile, hfile_len, "%s/%s", home, fname);
35288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
35298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
353061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (edit_init(wpa_cli_edit_cmd_cb, wpa_cli_edit_eof_cb,
353161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		      wpa_cli_edit_completion_cb, NULL, hfile, ps) < 0) {
353261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		eloop_terminate();
353361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return;
353461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
353561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
353661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	edit_started = 1;
35378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_register_timeout(ping_interval, 0, wpa_cli_ping, NULL, NULL);
353861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
353961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
354061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
354151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidtstatic void update_bssid_list(struct wpa_ctrl *ctrl)
354251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt{
354351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	char buf[4096];
354451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	size_t len = sizeof(buf);
354551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	int ret;
354651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	char *cmd = "BSS RANGE=ALL MASK=0x2";
354751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	char *pos, *end;
354851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
354951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	if (ctrl == NULL)
355051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		return;
355151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len, NULL);
355251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	if (ret < 0)
355351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		return;
355451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	buf[len] = '\0';
355551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
355651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	pos = buf;
355751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	while (pos) {
355851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		pos = os_strstr(pos, "bssid=");
355951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		if (pos == NULL)
356051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt			break;
356151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		pos += 6;
356251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		end = os_strchr(pos, '\n');
356351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		if (end == NULL)
356451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt			break;
356551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		*end = '\0';
356651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		cli_txt_list_add(&bsses, pos);
356751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		pos = end + 1;
356851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	}
356951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt}
357051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
357151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
3572f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidtstatic void update_ifnames(struct wpa_ctrl *ctrl)
3573f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt{
3574f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	char buf[4096];
3575f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	size_t len = sizeof(buf);
3576f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	int ret;
3577f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	char *cmd = "INTERFACES";
3578f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	char *pos, *end;
3579f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	char txt[200];
3580f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
3581f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	cli_txt_list_flush(&ifnames);
3582f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
3583f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	if (ctrl == NULL)
3584f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		return;
3585f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len, NULL);
3586f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	if (ret < 0)
3587f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		return;
3588f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	buf[len] = '\0';
3589f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
3590f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	pos = buf;
3591f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	while (pos) {
3592f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		end = os_strchr(pos, '\n');
3593f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		if (end == NULL)
3594f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt			break;
3595f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		*end = '\0';
3596f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		ret = os_snprintf(txt, sizeof(txt), "ifname=%s", pos);
3597f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		if (ret > 0 && ret < (int) sizeof(txt))
3598f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt			cli_txt_list_add(&ifnames, txt);
3599f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		pos = end + 1;
3600f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	}
3601f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt}
3602f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
3603f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
360461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void try_connection(void *eloop_ctx, void *timeout_ctx)
360561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
3606b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	if (ctrl_conn)
3607b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt		goto done;
3608b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt
360961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (ctrl_ifname == NULL)
361061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		ctrl_ifname = wpa_cli_get_default_ifname();
36118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
361261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (!wpa_cli_open_connection(ctrl_ifname, 1) == 0) {
361361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (!warning_displayed) {
361461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			printf("Could not connect to wpa_supplicant: "
361561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			       "%s - re-trying\n", ctrl_ifname);
361661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			warning_displayed = 1;
361761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		}
361861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		eloop_register_timeout(1, 0, try_connection, NULL, NULL);
361961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return;
362061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
362161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
362251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	update_bssid_list(ctrl_conn);
362351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
362461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (warning_displayed)
362561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		printf("Connection established.\n");
362661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
3627b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidtdone:
362861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	start_edit();
362961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
363061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
363161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
363261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void wpa_cli_interactive(void)
363361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
363461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	printf("\nInteractive mode\n\n");
363561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
363661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	eloop_register_timeout(0, 0, try_connection, NULL, NULL);
36378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_run();
363861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	eloop_cancel_timeout(try_connection, NULL, NULL);
36398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	cli_txt_list_flush(&p2p_peers);
36411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	cli_txt_list_flush(&p2p_groups);
36421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	cli_txt_list_flush(&bsses);
3643f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	cli_txt_list_flush(&ifnames);
364461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (edit_started)
364561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		edit_deinit(hfile, wpa_cli_edit_filter_history_cb);
36468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(hfile);
36478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_cancel_timeout(wpa_cli_ping, NULL, NULL);
36488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_close_connection();
36498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
36508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_action(struct wpa_ctrl *ctrl)
36538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
36548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_ANSI_C_EXTRA
36558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* TODO: ANSI C version(?) */
36568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("Action processing not supported in ANSI C build.\n");
36578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_ANSI_C_EXTRA */
36588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	fd_set rfds;
36598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int fd, res;
36608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct timeval tv;
36618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char buf[256]; /* note: large enough to fit in unsolicited messages */
36628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
36638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	fd = wpa_ctrl_get_fd(ctrl);
36658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (!wpa_cli_quit) {
36678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		FD_ZERO(&rfds);
36688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		FD_SET(fd, &rfds);
36698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		tv.tv_sec = ping_interval;
36708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		tv.tv_usec = 0;
36718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = select(fd + 1, &rfds, NULL, NULL, &tv);
36728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (res < 0 && errno != EINTR) {
36738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			perror("select");
36748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
36758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
36768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (FD_ISSET(fd, &rfds))
36788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_recv_pending(ctrl, 1);
36798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else {
36808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			/* verify that connection is still working */
36818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			len = sizeof(buf) - 1;
36828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpa_ctrl_request(ctrl, "PING", 4, buf, &len,
36838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     wpa_cli_action_cb) < 0 ||
36848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    len < 4 || os_memcmp(buf, "PONG", 4) != 0) {
36858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				printf("wpa_supplicant did not reply to PING "
36868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       "command - exiting\n");
36878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
36888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
36898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
36908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
36918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_ANSI_C_EXTRA */
36928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
36938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_cleanup(void)
36968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
36978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_close_connection();
36988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (pid_file)
36998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_daemonize_terminate(pid_file);
37008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_program_deinit();
37028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
37038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
370461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
370561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void wpa_cli_terminate(int sig, void *ctx)
37068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
370761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	eloop_terminate();
37088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
37098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char * wpa_cli_get_default_ifname(void)
37128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
37138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *ifname = NULL;
37148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_UNIX
37168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct dirent *dent;
37178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DIR *dir = opendir(ctrl_iface_dir);
37188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dir) {
37198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef ANDROID
37208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char ifprop[PROPERTY_VALUE_MAX];
37218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (property_get("wifi.interface", ifprop, NULL) != 0) {
37228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ifname = os_strdup(ifprop);
37238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Using interface '%s'\n", ifname);
37248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return ifname;
37258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
37268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* ANDROID */
37278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
37288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
37298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while ((dent = readdir(dir))) {
37308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef _DIRENT_HAVE_D_TYPE
37318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/*
37328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * Skip the file if it is not a socket. Also accept
37338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * DT_UNKNOWN (0) in case the C library or underlying
37348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * file system does not support d_type.
37358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 */
37368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (dent->d_type != DT_SOCK && dent->d_type != DT_UNKNOWN)
37378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			continue;
37388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _DIRENT_HAVE_D_TYPE */
37398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(dent->d_name, ".") == 0 ||
37408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    os_strcmp(dent->d_name, "..") == 0)
37418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			continue;
37428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Selected interface '%s'\n", dent->d_name);
37438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ifname = os_strdup(dent->d_name);
37448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
37458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
37468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	closedir(dir);
37478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UNIX */
37488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
3750b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	char buf[4096], *pos;
37518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
37528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ctrl *ctrl;
37538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret;
37548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctrl = wpa_ctrl_open(NULL);
37568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl == NULL)
37578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
37588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = sizeof(buf) - 1;
37608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = wpa_ctrl_request(ctrl, "INTERFACES", 10, buf, &len, NULL);
37618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret >= 0) {
37628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		buf[len] = '\0';
37638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos = os_strchr(buf, '\n');
37648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos)
37658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*pos = '\0';
37668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ifname = os_strdup(buf);
37678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
37688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_ctrl_close(ctrl);
37698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
37708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return ifname;
37728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
37738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint main(int argc, char *argv[])
37768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
37778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int c;
37788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int daemonize = 0;
37798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret = 0;
37808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *global = NULL;
37818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (os_program_init())
37838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
37848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (;;) {
37868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		c = getopt(argc, argv, "a:Bg:G:hi:p:P:v");
37878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (c < 0)
37888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		switch (c) {
37908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'a':
37918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			action_file = optarg;
37928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'B':
37948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			daemonize = 1;
37958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'g':
37978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			global = optarg;
37988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'G':
38008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ping_interval = atoi(optarg);
38018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
38028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'h':
38038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			usage();
38048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return 0;
38058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'v':
38068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("%s\n", wpa_cli_version);
38078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return 0;
38088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'i':
38098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(ctrl_ifname);
38108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ctrl_ifname = os_strdup(optarg);
38118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
38128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'p':
38138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ctrl_iface_dir = optarg;
38148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
38158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'P':
38168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pid_file = optarg;
38178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
38188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		default:
38198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			usage();
38208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
38218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
38228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
38238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	interactive = (argc == optind) && (action_file == NULL);
38258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (interactive)
38278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("%s\n\n%s\n\n", wpa_cli_version, wpa_cli_license);
38288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (eloop_init())
38308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
38318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (global) {
38338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
38348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ctrl_conn = wpa_ctrl_open(NULL);
38358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_CTRL_IFACE_NAMED_PIPE */
38368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ctrl_conn = wpa_ctrl_open(global);
38378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
38388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ctrl_conn == NULL) {
383904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			fprintf(stderr, "Failed to connect to wpa_supplicant "
384004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				"global interface: %s  error: %s\n",
384104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				global, strerror(errno));
38428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
38438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
3844b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt
3845b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt		if (interactive) {
3846f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt			update_ifnames(ctrl_conn);
3847b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt			mon_conn = wpa_ctrl_open(global);
3848b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt			if (mon_conn) {
3849b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt				if (wpa_ctrl_attach(mon_conn) == 0) {
3850b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt					wpa_cli_attached = 1;
3851b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt					eloop_register_read_sock(
3852b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt						wpa_ctrl_get_fd(mon_conn),
3853b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt						wpa_cli_mon_receive,
3854b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt						NULL, NULL);
3855b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt				} else {
3856b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt					printf("Failed to open monitor "
3857b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt					       "connection through global "
3858b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt					       "control interface\n");
3859b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt				}
3860b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt			}
3861b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt		}
38628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
38638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
386461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	eloop_register_signal_terminate(wpa_cli_terminate, NULL);
38658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_ifname == NULL)
38678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ctrl_ifname = wpa_cli_get_default_ifname();
38688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (interactive) {
387061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		wpa_cli_interactive();
38718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
38728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!global &&
38738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    wpa_cli_open_connection(ctrl_ifname, 0) < 0) {
387404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			fprintf(stderr, "Failed to connect to non-global "
387504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				"ctrl_ifname: %s  error: %s\n",
387604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				ctrl_ifname, strerror(errno));
38778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
38788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
38798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
38808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (action_file) {
38818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpa_ctrl_attach(ctrl_conn) == 0) {
38828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				wpa_cli_attached = 1;
38838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			} else {
38848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				printf("Warning: Failed to attach to "
38858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       "wpa_supplicant.\n");
38868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				return -1;
38878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
38888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
38898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
389061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (daemonize && os_daemonize(pid_file))
389161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			return -1;
38928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
389361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (action_file)
389461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			wpa_cli_action(ctrl_conn);
389561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		else
389661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			ret = wpa_request(ctrl_conn, argc - optind,
389761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					  &argv[optind]);
389861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
38998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(ctrl_ifname);
39018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_destroy();
39028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_cleanup();
39038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return ret;
39058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
39068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
39078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_CTRL_IFACE */
39088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint main(int argc, char *argv[])
39098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
39108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("CONFIG_CTRL_IFACE not defined - wpa_cli disabled\n");
39118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
39128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
39138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE */
3914