18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * WPA Supplicant - command line interface for wpa_supplicant daemon
3f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt * Copyright (c) 2004-2013, Jouni Malinen <j@w1.fi>
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license.
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details.
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h"
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_UNIX
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <dirent.h>
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UNIX */
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/wpa_ctrl.h"
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/common.h"
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/eloop.h"
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/edit.h"
211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#include "utils/list.h"
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/version.h"
2304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "common/ieee802_11_defs.h"
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef ANDROID
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <cutils/properties.h>
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* ANDROID */
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *wpa_cli_version =
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"wpa_cli v" VERSION_STR "\n"
31a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt"Copyright (c) 2004-2013, Jouni Malinen <j@w1.fi> and contributors";
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *wpa_cli_license =
35c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt"This software may be distributed under the terms of the BSD license.\n"
36c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt"See README for more details.\n";
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *wpa_cli_full_license =
39c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt"This software may be distributed under the terms of the BSD license.\n"
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"Redistribution and use in source and binary forms, with or without\n"
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"modification, are permitted provided that the following conditions are\n"
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"met:\n"
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"1. Redistributions of source code must retain the above copyright\n"
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"   notice, this list of conditions and the following disclaimer.\n"
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"2. Redistributions in binary form must reproduce the above copyright\n"
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"   notice, this list of conditions and the following disclaimer in the\n"
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"   documentation and/or other materials provided with the distribution.\n"
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"   names of its contributors may be used to endorse or promote products\n"
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"   derived from this software without specific prior written permission.\n"
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n"
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n";
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_ctrl *ctrl_conn;
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_ctrl *mon_conn;
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_quit = 0;
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_attached = 0;
73391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidtstatic int wpa_cli_connected = -1;
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_last_id = 0;
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_CTRL_IFACE_DIR
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define CONFIG_CTRL_IFACE_DIR "/var/run/wpa_supplicant"
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_DIR */
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *ctrl_iface_dir = CONFIG_CTRL_IFACE_DIR;
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char *ctrl_ifname = NULL;
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *pid_file = NULL;
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *action_file = NULL;
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int ping_interval = 5;
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int interactive = 0;
84f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidtstatic char *ifname_prefix = NULL;
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstruct cli_txt_entry {
871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct dl_list list;
881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char *txt;
891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt};
901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic DEFINE_DL_LIST(bsses); /* struct cli_txt_entry */
921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic DEFINE_DL_LIST(p2p_peers); /* struct cli_txt_entry */
931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic DEFINE_DL_LIST(p2p_groups); /* struct cli_txt_entry */
94f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidtstatic DEFINE_DL_LIST(ifnames); /* struct cli_txt_entry */
951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void print_help(const char *cmd);
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_mon_receive(int sock, void *eloop_ctx, void *sock_ctx);
9961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void wpa_cli_close_connection(void);
10061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic char * wpa_cli_get_default_ifname(void);
10161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic char ** wpa_list_cmd_list(void);
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void usage(void)
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("wpa_cli [-p<path to ctrl sockets>] [-i<ifname>] [-hvB] "
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "[-a<action file>] \\\n"
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "        [-P<pid file>] [-g<global ctrl>] [-G<ping interval>]  "
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "[command..]\n"
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  -h = help (show this usage text)\n"
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  -v = shown version information\n"
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  -a = run in daemon mode executing the action file based on "
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "events from\n"
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "       wpa_supplicant\n"
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  -B = run a daemon in the background\n"
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  default path: " CONFIG_CTRL_IFACE_DIR "\n"
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  default interface: first interface found in socket path\n");
11861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print_help(NULL);
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_txt_list_free(struct cli_txt_entry *e)
1231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
1241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dl_list_del(&e->list);
1251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(e->txt);
1261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(e);
1271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
1281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_txt_list_flush(struct dl_list *list)
1311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
1321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct cli_txt_entry *e;
1331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	while ((e = dl_list_first(list, struct cli_txt_entry, list)))
1341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_free(e);
1351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
1361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic struct cli_txt_entry * cli_txt_list_get(struct dl_list *txt_list,
1391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					       const char *txt)
1401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
1411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct cli_txt_entry *e;
1421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dl_list_for_each(e, txt_list, struct cli_txt_entry, list) {
1431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (os_strcmp(e->txt, txt) == 0)
1441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return e;
1451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
1461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return NULL;
1471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
1481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_txt_list_del(struct dl_list *txt_list, const char *txt)
1511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
1521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct cli_txt_entry *e;
1531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	e = cli_txt_list_get(txt_list, txt);
1541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (e)
1551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_free(e);
1561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
1571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_txt_list_del_addr(struct dl_list *txt_list, const char *txt)
1601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
1611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	u8 addr[ETH_ALEN];
1621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char buf[18];
1631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (hwaddr_aton(txt, addr) < 0)
1641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
1651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_snprintf(buf, sizeof(buf), MACSTR, MAC2STR(addr));
1661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	cli_txt_list_del(txt_list, buf);
1671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
1681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P
1711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_txt_list_del_word(struct dl_list *txt_list, const char *txt)
1721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
1731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	const char *end;
1741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char *buf;
1751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	end = os_strchr(txt, ' ');
1761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (end == NULL)
1771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		end = txt + os_strlen(txt);
1784b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt	buf = dup_binstr(txt, end - txt);
1791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (buf == NULL)
1801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
1811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	cli_txt_list_del(txt_list, buf);
1821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(buf);
1831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
1841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */
1851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int cli_txt_list_add(struct dl_list *txt_list, const char *txt)
1881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
1891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct cli_txt_entry *e;
1901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	e = cli_txt_list_get(txt_list, txt);
1911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (e)
1921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return 0;
1931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	e = os_zalloc(sizeof(*e));
1941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (e == NULL)
1951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return -1;
1961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	e->txt = os_strdup(txt);
1971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (e->txt == NULL) {
1981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		os_free(e);
1991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return -1;
2001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
2011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dl_list_add(txt_list, &e->list);
2021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return 0;
2031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
2041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P
2071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int cli_txt_list_add_addr(struct dl_list *txt_list, const char *txt)
2081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
2091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	u8 addr[ETH_ALEN];
2101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char buf[18];
2111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (hwaddr_aton(txt, addr) < 0)
2121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return -1;
2131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_snprintf(buf, sizeof(buf), MACSTR, MAC2STR(addr));
2141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return cli_txt_list_add(txt_list, buf);
2151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
2161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int cli_txt_list_add_word(struct dl_list *txt_list, const char *txt)
2191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
2201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	const char *end;
2211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char *buf;
2221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int ret;
2231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	end = os_strchr(txt, ' ');
2241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (end == NULL)
2251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		end = txt + os_strlen(txt);
2264b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt	buf = dup_binstr(txt, end - txt);
2271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (buf == NULL)
2281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return -1;
2291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	ret = cli_txt_list_add(txt_list, buf);
2301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	os_free(buf);
2311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return ret;
2321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
2331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */
2341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** cli_txt_list_array(struct dl_list *txt_list)
2371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
2381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	unsigned int i, count = dl_list_len(txt_list);
2391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char **res;
2401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	struct cli_txt_entry *e;
2411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
24261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res = os_calloc(count + 1, sizeof(char *));
2431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (res == NULL)
2441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return NULL;
2451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	i = 0;
2471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	dl_list_for_each(e, txt_list, struct cli_txt_entry, list) {
2481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		res[i] = os_strdup(e->txt);
2491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (res[i] == NULL)
2501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			break;
2511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		i++;
2521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
2531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
2551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
2561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int get_cmd_arg_num(const char *str, int pos)
2591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
2601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int arg = 0, i;
2611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	for (i = 0; i <= pos; i++) {
2631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (str[i] != ' ') {
2641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			arg++;
2651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			while (i <= pos && str[i] != ' ')
2661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				i++;
2671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		}
2681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
2691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (arg > 0)
2711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		arg--;
2721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return arg;
2731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
2741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int str_starts(const char *src, const char *match)
2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return os_strncmp(src, match, os_strlen(match)) == 0;
2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_show_event(const char *event)
2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *start;
2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	start = os_strchr(event, '>');
2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (start == NULL)
2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 1;
2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	start++;
2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/*
2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * Skip BSS added/removed events since they can be relatively frequent
2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * and are likely of not much use for an interactive user.
2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (str_starts(start, WPA_EVENT_BSS_ADDED) ||
2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    str_starts(start, WPA_EVENT_BSS_REMOVED))
2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 1;
3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_open_connection(const char *ifname, int attach)
3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#if defined(CONFIG_CTRL_IFACE_UDP) || defined(CONFIG_CTRL_IFACE_NAMED_PIPE)
3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctrl_conn = wpa_ctrl_open(ifname);
3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL)
3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (attach && interactive)
3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		mon_conn = wpa_ctrl_open(ifname);
3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		mon_conn = NULL;
3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */
3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *cfile = NULL;
3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int flen, res;
3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ifname == NULL)
3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef ANDROID
3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (access(ctrl_iface_dir, F_OK) < 0) {
3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		cfile = os_strdup(ifname);
3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (cfile == NULL)
3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* ANDROID */
3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (cfile == NULL) {
3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		flen = os_strlen(ctrl_iface_dir) + os_strlen(ifname) + 2;
3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		cfile = os_malloc(flen);
3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (cfile == NULL)
3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cfile, flen, "%s/%s", ctrl_iface_dir,
3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  ifname);
3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (res < 0 || res >= flen) {
3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(cfile);
3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctrl_conn = wpa_ctrl_open(cfile);
3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL) {
3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(cfile);
3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (attach && interactive)
3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		mon_conn = wpa_ctrl_open(cfile);
3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		mon_conn = NULL;
3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(cfile);
3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */
3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (mon_conn) {
3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpa_ctrl_attach(mon_conn) == 0) {
3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_attached = 1;
3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (interactive)
3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				eloop_register_read_sock(
3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					wpa_ctrl_get_fd(mon_conn),
3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					wpa_cli_mon_receive, NULL, NULL);
3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Warning: Failed to attach to "
3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       "wpa_supplicant.\n");
36561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			wpa_cli_close_connection();
3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_close_connection(void)
3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL)
3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_cli_attached) {
3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_ctrl_detach(interactive ? mon_conn : ctrl_conn);
3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_attached = 0;
3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_ctrl_close(ctrl_conn);
3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctrl_conn = NULL;
3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (mon_conn) {
3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		eloop_unregister_read_sock(wpa_ctrl_get_fd(mon_conn));
3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_ctrl_close(mon_conn);
3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		mon_conn = NULL;
3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_msg_cb(char *msg, size_t len)
3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("%s\n", msg);
3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int _wpa_ctrl_command(struct wpa_ctrl *ctrl, char *cmd, int print)
4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
401c97d8bf1d6959387a528c901eaf9c0bff47da853Dmitry Shmidt	char buf[4096];
4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret;
4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL) {
4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Not connected to wpa_supplicant - command dropped.\n");
4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
409d3e385e428c94340d89ba090e3500a085463e713Dmitry Shmidt	if (ifname_prefix) {
410d3e385e428c94340d89ba090e3500a085463e713Dmitry Shmidt		os_snprintf(buf, sizeof(buf), "IFNAME=%s %s",
411d3e385e428c94340d89ba090e3500a085463e713Dmitry Shmidt			    ifname_prefix, cmd);
412d3e385e428c94340d89ba090e3500a085463e713Dmitry Shmidt		buf[sizeof(buf) - 1] = '\0';
413d3e385e428c94340d89ba090e3500a085463e713Dmitry Shmidt		cmd = buf;
414d3e385e428c94340d89ba090e3500a085463e713Dmitry Shmidt	}
4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = sizeof(buf) - 1;
4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len,
4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       wpa_cli_msg_cb);
4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret == -2) {
4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command timed out.\n", cmd);
4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -2;
4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (ret < 0) {
4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command failed.\n", cmd);
4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (print) {
4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		buf[len] = '\0';
4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("%s", buf);
4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (interactive && len > 0 && buf[len - 1] != '\n')
4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("\n");
4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_ctrl_command(struct wpa_ctrl *ctrl, char *cmd)
4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return _wpa_ctrl_command(ctrl, cmd, 1);
4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
44161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int write_cmd(char *buf, size_t buflen, const char *cmd, int argc,
44261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		     char *argv[])
44361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
44461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	int i, res;
44561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	char *pos, *end;
44661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
44761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	pos = buf;
44861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	end = buf + buflen;
44961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
45061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res = os_snprintf(pos, end - pos, "%s", cmd);
45161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (res < 0 || res >= end - pos)
45261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		goto fail;
45361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	pos += res;
45461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
45561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	for (i = 0; i < argc; i++) {
45661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		res = os_snprintf(pos, end - pos, " %s", argv[i]);
45761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (res < 0 || res >= end - pos)
45861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			goto fail;
45961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		pos += res;
46061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
46161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
46261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	buf[buflen - 1] = '\0';
46361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return 0;
46461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
46561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtfail:
46661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	printf("Too long command\n");
46761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return -1;
46861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
46961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
47061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
47161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd(struct wpa_ctrl *ctrl, const char *cmd, int min_args,
47261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       int argc, char *argv[])
47361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
4744b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt	char buf[4096];
47561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (argc < min_args) {
47661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		printf("Invalid %s command - at least %d argument%s "
47761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "required.\n", cmd, min_args,
47861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       min_args > 1 ? "s are" : " is");
47961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return -1;
48061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
48161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (write_cmd(buf, sizeof(buf), cmd, argc, argv) < 0)
48261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return -1;
48361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_ctrl_command(ctrl, buf);
48461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
48561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
48661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
48761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_ifname(struct wpa_ctrl *ctrl, int argc, char *argv[])
48861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
48961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_ctrl_command(ctrl, "IFNAME");
49061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
49161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
49261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_status(struct wpa_ctrl *ctrl, int argc, char *argv[])
4948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (argc > 0 && os_strcmp(argv[0], "verbose") == 0)
4961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return wpa_ctrl_command(ctrl, "STATUS-VERBOSE");
4971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (argc > 0 && os_strcmp(argv[0], "wps") == 0)
4981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return wpa_ctrl_command(ctrl, "STATUS-WPS");
4991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpa_ctrl_command(ctrl, "STATUS");
5008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ping(struct wpa_ctrl *ctrl, int argc, char *argv[])
5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "PING");
5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_relog(struct wpa_ctrl *ctrl, int argc, char *argv[])
5108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "RELOG");
5128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_note(struct wpa_ctrl *ctrl, int argc, char *argv[])
5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
51761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "NOTE", 1, argc, argv);
5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_mib(struct wpa_ctrl *ctrl, int argc, char *argv[])
5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "MIB");
5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_pmksa(struct wpa_ctrl *ctrl, int argc, char *argv[])
5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "PMKSA");
5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_help(struct wpa_ctrl *ctrl, int argc, char *argv[])
5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
53561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	print_help(argc > 0 ? argv[0] : NULL);
5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
54061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic char ** wpa_cli_complete_help(const char *str, int pos)
54161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
54261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
54361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	char **res = NULL;
54461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
54561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	switch (arg) {
54661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	case 1:
54761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		res = wpa_list_cmd_list();
54861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		break;
54961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
55061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
55161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return res;
55261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
55361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
55461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_license(struct wpa_ctrl *ctrl, int argc, char *argv[])
5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("%s\n\n%s\n", wpa_cli_version, wpa_cli_full_license);
5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_quit(struct wpa_ctrl *ctrl, int argc, char *argv[])
5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_quit = 1;
5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (interactive)
5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		eloop_terminate();
5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_set(struct wpa_ctrl *ctrl, int argc, char *argv[])
5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
57651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	if (argc == 1) {
57751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "SET %s ", argv[0]);
57851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
57951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt			printf("Too long SET command.\n");
58051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt			return -1;
58151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		}
58251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		return wpa_ctrl_command(ctrl, cmd);
5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
58551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	return wpa_cli_cmd(ctrl, "SET", 2, argc, argv);
58651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt}
5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
58851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
58951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidtstatic char ** wpa_cli_complete_set(const char *str, int pos)
59051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt{
59151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
59251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	const char *fields[] = {
59351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		/* runtime values */
59451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"EAPOL::heldPeriod", "EAPOL::authPeriod", "EAPOL::startPeriod",
59551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"EAPOL::maxStart", "dot11RSNAConfigPMKLifetime",
59651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"dot11RSNAConfigPMKReauthThreshold", "dot11RSNAConfigSATimeout",
59751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"wps_fragment_size", "wps_version_number", "ampdu",
59851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"tdls_testing", "tdls_disabled", "pno", "radio_disabled",
59951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"uapsd", "ps", "wifi_display", "bssid_filter", "disallow_aps",
60051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"no_keep_alive",
60151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		/* global configuration parameters */
60251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"eapol_version", "ap_scan", "disable_scan_offload",
60351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"fast_reauth", "opensc_engine_path", "pkcs11_engine_path",
60451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"pkcs11_module_path", "pcsc_reader", "pcsc_pin",
60551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"driver_param", "dot11RSNAConfigPMKLifetime",
60651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"dot11RSNAConfigPMKReauthThreshold",
60751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"dot11RSNAConfigSATimeout",
60851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"update_config", "load_dynamic_eap", "uuid", "device_name",
60951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"manufacturer", "model_name", "model_number", "serial_number",
61051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"device_type", "os_version", "config_methods",
61151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"wps_cred_processing", "wps_vendor_ext_m1", "sec_device_type",
61251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"p2p_listen_reg_class", "p2p_listen_channel",
61351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"p2p_oper_reg_class", "p2p_oper_channel",
61451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"p2p_go_intent", "p2p_ssid_postfix", "persistent_reconnect",
61551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"p2p_intra_bss", "p2p_group_idle", "p2p_pref_chan",
61651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"p2p_go_ht40", "p2p_disabled", "p2p_no_group_iface",
61751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"p2p_ignore_shared_freq", "country", "bss_max_count",
61851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"bss_expiration_age", "bss_expiration_scan_count",
61951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"filter_ssids", "filter_rssi", "max_num_sta",
62051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"disassoc_low_ack", "hs20", "interworking", "hessid",
62151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"access_network_type", "pbc_in_m1", "autoscan",
62251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"wps_nfc_dev_pw_id", "wps_nfc_dh_pubkey", "wps_nfc_dh_privkey",
62351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"wps_nfc_dev_pw", "ext_password_backend",
62451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"p2p_go_max_inactivity", "auto_interworking", "okc", "pmf",
62551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"sae_groups", "dtim_period", "beacon_int", "ap_vendor_elements",
62651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		"ignore_old_scan_res", "freq_list"
62751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	};
62851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	int i, num_fields = sizeof(fields) / sizeof(fields[0]);
62951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
63051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	if (arg == 1) {
63151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		char **res = os_calloc(num_fields + 1, sizeof(char *));
63251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		if (res == NULL)
63351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt			return NULL;
63451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		for (i = 0; i < num_fields; i++) {
63551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt			res[i] = os_strdup(fields[i]);
63651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt			if (res[i] == NULL)
63751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt				return res;
63851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		}
63951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		return res;
6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
64151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
64251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	if (arg > 1 && os_strncasecmp(str, "set bssid_filter ", 17) == 0)
64351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		return cli_txt_list_array(&bsses);
64451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
64551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	return NULL;
6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_get(struct wpa_ctrl *ctrl, int argc, char *argv[])
6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
65161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "GET", 1, argc, argv);
6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_logoff(struct wpa_ctrl *ctrl, int argc, char *argv[])
6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "LOGOFF");
6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_logon(struct wpa_ctrl *ctrl, int argc, char *argv[])
6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "LOGON");
6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_reassociate(struct wpa_ctrl *ctrl, int argc,
6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "REASSOCIATE");
6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_preauthenticate(struct wpa_ctrl *ctrl, int argc,
6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
67761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "PREAUTH", 1, argc, argv);
6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ap_scan(struct wpa_ctrl *ctrl, int argc, char *argv[])
6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
68361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "AP_SCAN", 1, argc, argv);
6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_scan_interval(struct wpa_ctrl *ctrl, int argc,
6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
69061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "SCAN_INTERVAL", 1, argc, argv);
6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bss_expire_age(struct wpa_ctrl *ctrl, int argc,
6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
69761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "BSS_EXPIRE_AGE", 1, argc, argv);
6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bss_expire_count(struct wpa_ctrl *ctrl, int argc,
7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				        char *argv[])
7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
70461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "BSS_EXPIRE_COUNT", 1, argc, argv);
7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
708f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidtstatic int wpa_cli_cmd_bss_flush(struct wpa_ctrl *ctrl, int argc, char *argv[])
709f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt{
710f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	char cmd[256];
711f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	int res;
712f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt
713f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	if (argc < 1)
714f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "BSS_FLUSH 0");
715f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	else
716f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "BSS_FLUSH %s", argv[0]);
717f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
718f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt		printf("Too long BSS_FLUSH command.\n");
719f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt		return -1;
720f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	}
721f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
722f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt}
723f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt
724f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt
7258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_stkstart(struct wpa_ctrl *ctrl, int argc,
7268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				char *argv[])
7278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
72861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "STKSTART", 1, argc, argv);
7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ft_ds(struct wpa_ctrl *ctrl, int argc, char *argv[])
7338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
73461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "FT_DS", 1, argc, argv);
7358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_pbc(struct wpa_ctrl *ctrl, int argc, char *argv[])
7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
74061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_PBC", 0, argc, argv);
7418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_pin(struct wpa_ctrl *ctrl, int argc, char *argv[])
7458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0) {
7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_PIN command: need one or two arguments:\n"
7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- BSSID: use 'any' to select any\n"
7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- PIN: optional, used only with devices that have no "
7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "display\n");
7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
7528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
75461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_PIN", 1, argc, argv);
7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_check_pin(struct wpa_ctrl *ctrl, int argc,
7598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
7608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
76161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_CHECK_PIN", 1, argc, argv);
7628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_cancel(struct wpa_ctrl *ctrl, int argc,
7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "WPS_CANCEL");
7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
77204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_WPS_NFC
77304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
77404949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_wps_nfc(struct wpa_ctrl *ctrl, int argc, char *argv[])
77504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
77661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_NFC", 0, argc, argv);
77704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
77804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
77904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
780f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidtstatic int wpa_cli_cmd_wps_nfc_config_token(struct wpa_ctrl *ctrl, int argc,
781f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt					    char *argv[])
782f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt{
783f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_NFC_CONFIG_TOKEN", 1, argc, argv);
784f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt}
785f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt
786f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt
78704949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_wps_nfc_token(struct wpa_ctrl *ctrl, int argc,
78804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				     char *argv[])
78904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
79061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_NFC_TOKEN", 1, argc, argv);
79104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
79204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
79304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
79404949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_wps_nfc_tag_read(struct wpa_ctrl *ctrl, int argc,
79504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					char *argv[])
79604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
79704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	int ret;
79804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char *buf;
79904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	size_t buflen;
80004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
80104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (argc != 1) {
80204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		printf("Invalid 'wps_nfc_tag_read' command - one argument "
80304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		       "is required.\n");
80404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
80504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
80604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
80704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	buflen = 18 + os_strlen(argv[0]);
80804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	buf = os_malloc(buflen);
80904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (buf == NULL)
81004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
81104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	os_snprintf(buf, buflen, "WPS_NFC_TAG_READ %s", argv[0]);
81204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
81304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	ret = wpa_ctrl_command(ctrl, buf);
81404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	os_free(buf);
81504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
81604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return ret;
81704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
81804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
819d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
820d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtstatic int wpa_cli_cmd_nfc_get_handover_req(struct wpa_ctrl *ctrl, int argc,
821d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt					    char *argv[])
822d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{
823d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return wpa_cli_cmd(ctrl, "NFC_GET_HANDOVER_REQ", 2, argc, argv);
824d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt}
825d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
826d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
827d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtstatic int wpa_cli_cmd_nfc_get_handover_sel(struct wpa_ctrl *ctrl, int argc,
828d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt					    char *argv[])
829d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{
830d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return wpa_cli_cmd(ctrl, "NFC_GET_HANDOVER_SEL", 2, argc, argv);
831d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt}
832d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
833d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
834d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtstatic int wpa_cli_cmd_nfc_rx_handover_req(struct wpa_ctrl *ctrl, int argc,
835d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt					   char *argv[])
836d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{
837d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	int ret;
838d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	char *buf;
839d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	size_t buflen;
840d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
841d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (argc != 1) {
842d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		printf("Invalid 'nfc_rx_handover_req' command - one argument "
843d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		       "is required.\n");
844d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		return -1;
845d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	}
846d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
847d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	buflen = 21 + os_strlen(argv[0]);
848d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	buf = os_malloc(buflen);
849d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (buf == NULL)
850d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		return -1;
851d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	os_snprintf(buf, buflen, "NFC_RX_HANDOVER_REQ %s", argv[0]);
852d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
853d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	ret = wpa_ctrl_command(ctrl, buf);
854d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	os_free(buf);
855d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
856d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return ret;
857d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt}
858d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
859d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
860d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtstatic int wpa_cli_cmd_nfc_rx_handover_sel(struct wpa_ctrl *ctrl, int argc,
861d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt					   char *argv[])
862d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{
863d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	int ret;
864d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	char *buf;
865d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	size_t buflen;
866d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
867d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (argc != 1) {
868d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		printf("Invalid 'nfc_rx_handover_sel' command - one argument "
869d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		       "is required.\n");
870d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		return -1;
871d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	}
872d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
873d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	buflen = 21 + os_strlen(argv[0]);
874d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	buf = os_malloc(buflen);
875d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (buf == NULL)
876d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt		return -1;
877d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	os_snprintf(buf, buflen, "NFC_RX_HANDOVER_SEL %s", argv[0]);
878d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
879d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	ret = wpa_ctrl_command(ctrl, buf);
880d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	os_free(buf);
881d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
882d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	return ret;
883d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt}
884d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt
885f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt
886f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidtstatic int wpa_cli_cmd_nfc_report_handover(struct wpa_ctrl *ctrl, int argc,
887f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt					   char *argv[])
888f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt{
889f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	return wpa_cli_cmd(ctrl, "NFC_REPORT_HANDOVER", 4, argc, argv);
890f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt}
891f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt
89204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_WPS_NFC */
89304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
89404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
8958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_reg(struct wpa_ctrl *ctrl, int argc, char *argv[])
8968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 2)
9018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_REG %s %s",
9028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
9038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else if (argc == 5 || argc == 6) {
9048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char ssid_hex[2 * 32 + 1];
9058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char key_hex[2 * 64 + 1];
9068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int i;
9078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssid_hex[0] = '\0';
9098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (i = 0; i < 32; i++) {
9108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (argv[2][i] == '\0')
9118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
9128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_snprintf(&ssid_hex[i * 2], 3, "%02x", argv[2][i]);
9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
9148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_hex[0] = '\0';
9168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (argc == 6) {
9178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			for (i = 0; i < 64; i++) {
9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (argv[5][i] == '\0')
9198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					break;
9208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				os_snprintf(&key_hex[i * 2], 3, "%02x",
9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    argv[5][i]);
9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
9238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
9248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "WPS_REG %s %s %s %s %s %s",
9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], ssid_hex, argv[3], argv[4],
9288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  key_hex);
9298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
9308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_REG command: need two arguments:\n"
9318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- BSSID of the target AP\n"
9328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- AP PIN\n");
9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Alternatively, six arguments can be used to "
9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "reconfigure the AP:\n"
9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- BSSID of the target AP\n"
9368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- AP PIN\n"
9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new SSID\n"
9388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new auth (OPEN, WPAPSK, WPA2PSK)\n"
9398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new encr (NONE, WEP, TKIP, CCMP)\n"
9408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new key\n");
9418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
9458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_REG command.\n");
9468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
9498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_ap_pin(struct wpa_ctrl *ctrl, int argc,
9538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
9548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
95561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_AP_PIN", 1, argc, argv);
9568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_start(struct wpa_ctrl *ctrl, int argc,
9608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    char *argv[])
9618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
96261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_ER_START", 0, argc, argv);
9638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_stop(struct wpa_ctrl *ctrl, int argc,
9678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
9688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "WPS_ER_STOP");
9708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_pin(struct wpa_ctrl *ctrl, int argc,
9758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
9768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
9788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_ER_PIN command: need at least two "
9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments:\n"
9808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- UUID: use 'any' to select any\n"
9818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- PIN: Enrollee PIN\n"
9828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "optional: - Enrollee MAC address\n");
9838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
98661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_ER_PIN", 2, argc, argv);
9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_pbc(struct wpa_ctrl *ctrl, int argc,
9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
99361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_ER_PBC", 1, argc, argv);
9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_learn(struct wpa_ctrl *ctrl, int argc,
9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    char *argv[])
9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2) {
10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_ER_LEARN command: need two arguments:\n"
10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- UUID: specify which AP to use\n"
10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- PIN: AP PIN\n");
10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
100761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_ER_LEARN", 2, argc, argv);
10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_set_config(struct wpa_ctrl *ctrl, int argc,
10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 char *argv[])
10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2) {
10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_ER_SET_CONFIG command: need two "
10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments:\n"
10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- UUID: specify which AP to use\n"
10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- Network configuration id\n");
10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
102261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_ER_SET_CONFIG", 2, argc, argv);
10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_config(struct wpa_ctrl *ctrl, int argc,
10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
10298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
10308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
10318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 5 || argc == 6) {
10338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char ssid_hex[2 * 32 + 1];
10348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char key_hex[2 * 64 + 1];
10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int i;
10368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssid_hex[0] = '\0';
10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (i = 0; i < 32; i++) {
10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (argv[2][i] == '\0')
10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_snprintf(&ssid_hex[i * 2], 3, "%02x", argv[2][i]);
10428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_hex[0] = '\0';
10458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (argc == 6) {
10468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			for (i = 0; i < 64; i++) {
10478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (argv[5][i] == '\0')
10488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					break;
10498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				os_snprintf(&key_hex[i * 2], 3, "%02x",
10508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    argv[5][i]);
10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "WPS_ER_CONFIG %s %s %s %s %s %s",
10568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], ssid_hex, argv[3], argv[4],
10578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  key_hex);
10588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_ER_CONFIG command: need six arguments:\n"
10608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- AP UUID\n"
10618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- AP PIN\n"
10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new SSID\n"
10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new auth (OPEN, WPAPSK, WPA2PSK)\n"
10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new encr (NONE, WEP, TKIP, CCMP)\n"
10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new key\n");
10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_ER_CONFIG command.\n");
10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
107704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_WPS_NFC
107804949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_wps_er_nfc_config_token(struct wpa_ctrl *ctrl, int argc,
107904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       char *argv[])
108004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
108104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (argc != 2) {
108204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		printf("Invalid WPS_ER_NFC_CONFIG_TOKEN command: need two "
108304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		       "arguments:\n"
108404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		       "- WPS/NDEF: token format\n"
108504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		       "- UUID: specify which AP to use\n");
108604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
108704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
108804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
108961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WPS_ER_NFC_CONFIG_TOKEN", 2, argc, argv);
109004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
109104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_WPS_NFC */
109204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
109304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
10948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ibss_rsn(struct wpa_ctrl *ctrl, int argc, char *argv[])
10958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
109661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "IBSS_RSN", 1, argc, argv);
10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_level(struct wpa_ctrl *ctrl, int argc, char *argv[])
11018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
110261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "LEVEL", 1, argc, argv);
11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_identity(struct wpa_ctrl *ctrl, int argc, char *argv[])
11078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid IDENTITY command: needs two arguments "
11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and identity)\n");
11148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "IDENTITY-%s:%s",
11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long IDENTITY command.\n");
11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long IDENTITY command.\n");
11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_password(struct wpa_ctrl *ctrl, int argc, 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 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 "PASSWORD-%s:%s",
11538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long 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 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_new_password(struct wpa_ctrl *ctrl, int argc,
11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    char *argv[])
11748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
11758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
11768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid NEW_PASSWORD command: needs two arguments "
11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and password)\n");
11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "NEW_PASSWORD-%s:%s",
11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long NEW_PASSWORD command.\n");
11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long NEW_PASSWORD command.\n");
11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
12008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_pin(struct wpa_ctrl *ctrl, int argc, char *argv[])
12078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
12088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
12128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid PIN command: needs two arguments "
12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and pin)\n");
12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
12188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
12198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PIN-%s:%s",
12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
12218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
12228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long PIN command.\n");
12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
12278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
12288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long PIN command.\n");
12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
12338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_otp(struct wpa_ctrl *ctrl, int argc, char *argv[])
12398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
12408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
12418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
12428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
12448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid OTP command: needs two arguments (network "
12458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "id and password)\n");
12468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
12508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
12518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "OTP-%s:%s",
12528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
12538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
12548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long OTP command.\n");
12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
12608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long OTP command.\n");
12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
12638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
12658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
12688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_passphrase(struct wpa_ctrl *ctrl, int argc,
12728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
12738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
12748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
12758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
12768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
12788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid PASSPHRASE command: needs two arguments "
12798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and passphrase)\n");
12808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
12848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PASSPHRASE-%s:%s",
12868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
12878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
12888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long PASSPHRASE command.\n");
12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
12938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long PASSPHRASE command.\n");
12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
12998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
13028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bssid(struct wpa_ctrl *ctrl, int argc, char *argv[])
13068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
13088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid BSSID command: needs two arguments (network "
13098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "id and BSSID)\n");
13108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
13118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
131361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "BSSID", 2, argc, argv);
13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1317696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidtstatic int wpa_cli_cmd_blacklist(struct wpa_ctrl *ctrl, int argc, char *argv[])
1318696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt{
131961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "BLACKLIST", 0, argc, argv);
1320696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt}
1321696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
1322696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
1323696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidtstatic int wpa_cli_cmd_log_level(struct wpa_ctrl *ctrl, int argc, char *argv[])
1324696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt{
132561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "LOG_LEVEL", 0, argc, argv);
1326696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt}
1327696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
1328696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
13298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_list_networks(struct wpa_ctrl *ctrl, int argc,
13308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
13318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "LIST_NETWORKS");
13338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_select_network(struct wpa_ctrl *ctrl, int argc,
13378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
13388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
133961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "SELECT_NETWORK", 1, argc, argv);
13408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_enable_network(struct wpa_ctrl *ctrl, int argc,
13448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
13458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
134661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "ENABLE_NETWORK", 1, argc, argv);
13478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_disable_network(struct wpa_ctrl *ctrl, int argc,
13518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
13528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
135361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "DISABLE_NETWORK", 1, argc, argv);
13548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_add_network(struct wpa_ctrl *ctrl, int argc,
13588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
13598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "ADD_NETWORK");
13618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
136461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_remove_network(struct wpa_ctrl *ctrl, int argc,
136561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				      char *argv[])
136661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
136761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "REMOVE_NETWORK", 1, argc, argv);
13688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_show_network_variables(void)
13728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("set_network variables:\n"
13748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  ssid (network name, SSID)\n"
13758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  psk (WPA passphrase or pre-shared key)\n"
13768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  key_mgmt (key management protocol)\n"
13778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  identity (EAP identity)\n"
13788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  password (EAP password)\n"
13798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  ...\n"
13808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "\n"
13818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "Note: Values are entered in the same format as the "
13828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "configuration file is using,\n"
13838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "i.e., strings values need to be inside double quotation "
13848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "marks.\n"
13858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "For example: set_network 1 ssid \"network name\"\n"
13868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "\n"
13878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "Please see wpa_supplicant.conf documentation for full list "
13888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "of\navailable variables.\n");
13898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_set_network(struct wpa_ctrl *ctrl, int argc,
13938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
13948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0) {
13968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_show_network_variables();
13978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
13988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1400d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	if (argc < 3) {
14018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid SET_NETWORK command: needs three arguments\n"
14028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id, variable name, and value)\n");
14038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
14048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
140661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "SET_NETWORK", 3, argc, argv);
14078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_get_network(struct wpa_ctrl *ctrl, int argc,
14118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
14128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0) {
14148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_show_network_variables();
14158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
14168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2) {
14198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid GET_NETWORK command: needs two arguments\n"
14208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and variable name)\n");
14218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
14228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
142461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "GET_NETWORK", 2, argc, argv);
14258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
142804949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_list_creds(struct wpa_ctrl *ctrl, int argc,
142904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				  char *argv[])
143004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
143104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return wpa_ctrl_command(ctrl, "LIST_CREDS");
143204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
143304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
143404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
143504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_add_cred(struct wpa_ctrl *ctrl, int argc, char *argv[])
143604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
143704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return wpa_ctrl_command(ctrl, "ADD_CRED");
143804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
143904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
144004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
144104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_remove_cred(struct wpa_ctrl *ctrl, int argc,
144204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				   char *argv[])
144304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
144461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "REMOVE_CRED", 1, argc, argv);
144504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
144604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
144704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
144804949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_set_cred(struct wpa_ctrl *ctrl, int argc, char *argv[])
144904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
145004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (argc != 3) {
145104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		printf("Invalid SET_CRED command: needs three arguments\n"
145204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		       "(cred id, variable name, and value)\n");
145304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
145404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
145504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
145661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "SET_CRED", 3, argc, argv);
145704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
145804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
145904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
14608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_disconnect(struct wpa_ctrl *ctrl, int argc,
14618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
14628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "DISCONNECT");
14648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_reconnect(struct wpa_ctrl *ctrl, int argc,
14688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
14698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "RECONNECT");
14718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_save_config(struct wpa_ctrl *ctrl, int argc,
14758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
14768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "SAVE_CONFIG");
14788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_scan(struct wpa_ctrl *ctrl, int argc, char *argv[])
14828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14834b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt	return wpa_cli_cmd(ctrl, "SCAN", 0, argc, argv);
14848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_scan_results(struct wpa_ctrl *ctrl, int argc,
14888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    char *argv[])
14898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "SCAN_RESULTS");
14918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bss(struct wpa_ctrl *ctrl, int argc, char *argv[])
14958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
149661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "BSS", 1, argc, argv);
14978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** wpa_cli_complete_bss(const char *str, int pos)
15011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
15021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
15031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char **res = NULL;
15041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
15051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	switch (arg) {
15061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	case 1:
15071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		res = cli_txt_list_array(&bsses);
15081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		break;
15091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
15101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
15111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
15121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
15131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
15141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_get_capability(struct wpa_ctrl *ctrl, int argc,
15168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
15178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1 || argc > 2) {
15198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid GET_CAPABILITY command: need either one or "
15208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "two arguments\n");
15218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
15228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if ((argc == 2) && os_strcmp(argv[1], "strict") != 0) {
15258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid GET_CAPABILITY command: second argument, "
15268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "if any, must be 'strict'\n");
15278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
15288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
153061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "GET_CAPABILITY", 1, argc, argv);
15318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_list_interfaces(struct wpa_ctrl *ctrl)
15358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("Available interfaces:\n");
15378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "INTERFACES");
15388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface(struct wpa_ctrl *ctrl, int argc, char *argv[])
15428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1) {
15448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_list_interfaces(ctrl);
15458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
15468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_close_connection();
15498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(ctrl_ifname);
15508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctrl_ifname = os_strdup(argv[0]);
15518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_cli_open_connection(ctrl_ifname, 1)) {
15538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Connected to interface '%s.\n", ctrl_ifname);
15548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
15558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Could not connect to interface '%s' - re-trying\n",
15568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       ctrl_ifname);
15578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
15598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_reconfigure(struct wpa_ctrl *ctrl, int argc,
15638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
15648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "RECONFIGURE");
15668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_terminate(struct wpa_ctrl *ctrl, int argc,
15708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 char *argv[])
15718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "TERMINATE");
15738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface_add(struct wpa_ctrl *ctrl, int argc,
15778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
15788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
15808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
15818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1) {
15838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid INTERFACE_ADD command: needs at least one "
15848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "argument (interface name)\n"
15858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "All arguments: ifname confname driver ctrl_interface "
15868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "driver_param bridge_name\n");
15878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
15888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/*
15918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * INTERFACE_ADD <ifname>TAB<confname>TAB<driver>TAB<ctrl_interface>TAB
15928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * <driver_param>TAB<bridge_name>
15938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
15948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd),
15958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  "INTERFACE_ADD %s\t%s\t%s\t%s\t%s\t%s",
15968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0],
15978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argc > 1 ? argv[1] : "", argc > 2 ? argv[2] : "",
15988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argc > 3 ? argv[3] : "", argc > 4 ? argv[4] : "",
15998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argc > 5 ? argv[5] : "");
16008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
16018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
16028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
16038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
16048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface_remove(struct wpa_ctrl *ctrl, int argc,
16088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					char *argv[])
16098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
161061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "INTERFACE_REMOVE", 1, argc, argv);
16118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface_list(struct wpa_ctrl *ctrl, int argc,
16158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
16168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "INTERFACE_LIST");
16188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_AP
16228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_sta(struct wpa_ctrl *ctrl, int argc, char *argv[])
16238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
162461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "STA", 1, argc, argv);
16258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_ctrl_command_sta(struct wpa_ctrl *ctrl, char *cmd,
16298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				char *addr, size_t addr_len)
16308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char buf[4096], *pos;
16328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
16338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret;
16348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL) {
16368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Not connected to hostapd - command dropped.\n");
16378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
16388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = sizeof(buf) - 1;
164004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len,
16418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       wpa_cli_msg_cb);
16428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret == -2) {
16438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command timed out.\n", cmd);
16448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -2;
16458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (ret < 0) {
16468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command failed.\n", cmd);
16478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
16488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	buf[len] = '\0';
165104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (os_memcmp(buf, "FAIL", 4) == 0)
16528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
16538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("%s", buf);
16548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = buf;
16568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*pos != '\0' && *pos != '\n')
16578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos++;
16588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	*pos = '\0';
16598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_strlcpy(addr, buf, addr_len);
16608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
16618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_all_sta(struct wpa_ctrl *ctrl, int argc, char *argv[])
16658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char addr[32], cmd[64];
16678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_ctrl_command_sta(ctrl, "STA-FIRST", addr, sizeof(addr)))
16698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
16708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	do {
16718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(cmd, sizeof(cmd), "STA-NEXT %s", addr);
16728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} while (wpa_ctrl_command_sta(ctrl, cmd, addr, sizeof(addr)) == 0);
16738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
16758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
167604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
167704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
167804949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_deauthenticate(struct wpa_ctrl *ctrl, int argc,
167904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				      char *argv[])
168004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
168161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "DEAUTHENTICATE", 1, argc, argv);
168204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
168304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
168404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
168504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_disassociate(struct wpa_ctrl *ctrl, int argc,
168604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				    char *argv[])
168704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
168861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "DISASSOCIATE", 1, argc, argv);
168904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
16908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_AP */
16918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_suspend(struct wpa_ctrl *ctrl, int argc, char *argv[])
16948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "SUSPEND");
16968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_resume(struct wpa_ctrl *ctrl, int argc, char *argv[])
17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "RESUME");
17028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_drop_sa(struct wpa_ctrl *ctrl, int argc, char *argv[])
17068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "DROP_SA");
17088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_roam(struct wpa_ctrl *ctrl, int argc, char *argv[])
17128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
171361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "ROAM", 1, argc, argv);
17148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P
17188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_find(struct wpa_ctrl *ctrl, int argc, char *argv[])
17208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
172161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_FIND", 0, argc, argv);
172261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
17238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
172561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic char ** wpa_cli_complete_p2p_find(const char *str, int pos)
172661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
172761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	char **res = NULL;
172861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
172961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
173061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res = os_calloc(6, sizeof(char *));
173161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (res == NULL)
173261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return NULL;
173361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res[0] = os_strdup("type=social");
173461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (res[0] == NULL) {
173561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		os_free(res);
173661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return NULL;
173761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
173861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res[1] = os_strdup("type=progressive");
173961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (res[1] == NULL)
174061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return res;
174161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res[2] = os_strdup("delay=");
174261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (res[2] == NULL)
174361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return res;
174461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res[3] = os_strdup("dev_id=");
174561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (res[3] == NULL)
174661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return res;
174761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (arg == 1)
174861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		res[4] = os_strdup("[timeout]");
174961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
175061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return res;
17518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_stop_find(struct wpa_ctrl *ctrl, int argc,
17558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
17568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_STOP_FIND");
17588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_connect(struct wpa_ctrl *ctrl, int argc,
17628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
17638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
176461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_CONNECT", 2, argc, argv);
17658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** wpa_cli_complete_p2p_connect(const char *str, int pos)
17691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
17701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
17711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char **res = NULL;
17721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
17731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	switch (arg) {
17741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	case 1:
17751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		res = cli_txt_list_array(&p2p_peers);
17761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		break;
17771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
17781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
17791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
17801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
17811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
17821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
17838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_listen(struct wpa_ctrl *ctrl, int argc,
17848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
17858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
178661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_LISTEN", 0, argc, argv);
17878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_group_remove(struct wpa_ctrl *ctrl, int argc,
17918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					char *argv[])
17928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
179361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_GROUP_REMOVE", 1, argc, argv);
17948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** wpa_cli_complete_p2p_group_remove(const char *str, int pos)
17981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
17991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
18001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char **res = NULL;
18011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	switch (arg) {
18031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	case 1:
18041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		res = cli_txt_list_array(&p2p_groups);
18051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		break;
18061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
18071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
18091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
18101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
18128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_group_add(struct wpa_ctrl *ctrl, int argc,
18138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					char *argv[])
18148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
181561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_GROUP_ADD", 0, argc, argv);
18168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_prov_disc(struct wpa_ctrl *ctrl, int argc,
18208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
18218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (argc != 2 && argc != 3) {
18231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		printf("Invalid P2P_PROV_DISC command: needs at least "
18241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		       "two arguments, address and config method\n"
18251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		       "(display, keypad, or pbc) and an optional join\n");
18268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
18278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
182961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_PROV_DISC", 2, argc, argv);
18308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_get_passphrase(struct wpa_ctrl *ctrl, int argc,
18348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  char *argv[])
18358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_GET_PASSPHRASE");
18378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_req(struct wpa_ctrl *ctrl, int argc,
18418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 char *argv[])
18428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[4096];
18448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2 && argc != 4) {
18468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SERV_DISC_REQ command: needs two "
18478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments (address and TLVs) or four arguments "
18488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(address, \"upnp\", version, search target "
18498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(SSDP ST:)\n");
18508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
18518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
185361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (write_cmd(cmd, sizeof(cmd), "P2P_SERV_DISC_REQ", argc, argv) < 0)
18548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
18558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
18568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_cancel_req(struct wpa_ctrl *ctrl,
18608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						int argc, char *argv[])
18618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
186261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_SERV_DISC_CANCEL_REQ", 1, argc, argv);
18638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_resp(struct wpa_ctrl *ctrl, int argc,
18678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  char *argv[])
18688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[4096];
18708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
18718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 4) {
18738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SERV_DISC_RESP command: needs four "
18748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments (freq, address, dialog token, and TLVs)\n");
18758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
18768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "P2P_SERV_DISC_RESP %s %s %s %s",
18798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1], argv[2], argv[3]);
18808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
18818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
18828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
18838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
18848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_update(struct wpa_ctrl *ctrl, int argc,
18888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  char *argv[])
18898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_SERVICE_UPDATE");
18918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_external(struct wpa_ctrl *ctrl,
18958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      int argc, char *argv[])
18968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
189761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_SERV_DISC_EXTERNAL", 1, argc, argv);
18988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_flush(struct wpa_ctrl *ctrl, int argc,
19028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 char *argv[])
19038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_SERVICE_FLUSH");
19058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_add(struct wpa_ctrl *ctrl, int argc,
19098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
19108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[4096];
19128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
19138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 3 && argc != 4) {
19158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SERVICE_ADD command: needs three or four "
19168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments\n");
19178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 4)
19218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
19228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_SERVICE_ADD %s %s %s %s",
19238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2], argv[3]);
19248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
19258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
19268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_SERVICE_ADD %s %s %s",
19278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2]);
19288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
19298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
19318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
19328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_del(struct wpa_ctrl *ctrl, int argc,
19368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
19378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[4096];
19398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
19408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2 && argc != 3) {
19428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SERVICE_DEL command: needs two or three "
19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments\n");
19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 3)
19488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
19498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_SERVICE_DEL %s %s %s",
19508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2]);
19518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
19528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
19538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_SERVICE_DEL %s %s",
19548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
19558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_reject(struct wpa_ctrl *ctrl,
19638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  int argc, char *argv[])
19648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
196561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_REJECT", 1, argc, argv);
19668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_invite(struct wpa_ctrl *ctrl,
19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  int argc, char *argv[])
19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
197261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_INVITE", 1, argc, argv);
19738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_peer(struct wpa_ctrl *ctrl, int argc, char *argv[])
19778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
197861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_PEER", 1, argc, argv);
19798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** wpa_cli_complete_p2p_peer(const char *str, int pos)
19831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
19841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
19851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	char **res = NULL;
19861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
19871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	switch (arg) {
19881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	case 1:
19891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		res = cli_txt_list_array(&p2p_peers);
19901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		break;
19911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
19921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
19931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return res;
19941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
19951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
19961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
19978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_ctrl_command_p2p_peer(struct wpa_ctrl *ctrl, char *cmd,
19988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *addr, size_t addr_len,
19998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     int discovered)
20008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
20018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char buf[4096], *pos;
20028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
20038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret;
20048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL)
20068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
20078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = sizeof(buf) - 1;
200804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len,
20098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       wpa_cli_msg_cb);
20108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret == -2) {
20118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command timed out.\n", cmd);
20128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -2;
20138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (ret < 0) {
20148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command failed.\n", cmd);
20158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
20168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
20178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	buf[len] = '\0';
201904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (os_memcmp(buf, "FAIL", 4) == 0)
20208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
20218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = buf;
20238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*pos != '\0' && *pos != '\n')
20248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos++;
20258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	*pos++ = '\0';
20268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_strlcpy(addr, buf, addr_len);
20278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!discovered || os_strstr(pos, "[PROBE_REQ_ONLY]") == NULL)
20288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("%s\n", addr);
20298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
20308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_peers(struct wpa_ctrl *ctrl, int argc, char *argv[])
20348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
20358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char addr[32], cmd[64];
20368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int discovered;
20378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	discovered = argc > 0 && os_strcmp(argv[0], "discovered") == 0;
20398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_ctrl_command_p2p_peer(ctrl, "P2P_PEER FIRST",
20418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      addr, sizeof(addr), discovered))
20421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return -1;
20438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	do {
20448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(cmd, sizeof(cmd), "P2P_PEER NEXT-%s", addr);
20458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} while (wpa_ctrl_command_p2p_peer(ctrl, cmd, addr, sizeof(addr),
20468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			 discovered) == 0);
20478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return 0;
20498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_set(struct wpa_ctrl *ctrl, int argc, char *argv[])
20538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
205461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_SET", 2, argc, argv);
20558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2058391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidtstatic char ** wpa_cli_complete_p2p_set(const char *str, int pos)
2059391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt{
2060391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	int arg = get_cmd_arg_num(str, pos);
2061391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	const char *fields[] = {
2062391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"discoverability",
2063391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"managed",
2064391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"listen_channel",
2065391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"ssid_postfix",
2066391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"noa",
2067391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"ps",
2068391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"oppps",
2069391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"ctwindow",
2070391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"disabled",
2071391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"conc_pref",
2072391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"force_long_sd",
2073391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"peer_filter",
2074391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"cross_connect",
2075391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"go_apsd",
2076391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"client_apsd",
2077391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"disallow_freq",
2078391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"disc_int",
2079391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		"per_sta_psk",
2080391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	};
2081391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	int i, num_fields = sizeof(fields) / sizeof(fields[0]);
2082391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
2083391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	if (arg == 1) {
2084391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		char **res = os_calloc(num_fields + 1, sizeof(char *));
2085391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		if (res == NULL)
2086391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt			return NULL;
2087391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		for (i = 0; i < num_fields; i++) {
2088391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt			res[i] = os_strdup(fields[i]);
2089391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt			if (res[i] == NULL)
2090391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt				return res;
2091391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		}
2092391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		return res;
2093391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	}
2094391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
2095391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	if (arg == 2 && os_strncasecmp(str, "p2p_set peer_filter ", 20) == 0)
2096391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		return cli_txt_list_array(&p2p_peers);
2097391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
2098391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	return NULL;
2099391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt}
2100391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
2101391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
21028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_flush(struct wpa_ctrl *ctrl, int argc, char *argv[])
21038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_FLUSH");
21058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_cancel(struct wpa_ctrl *ctrl, int argc,
21098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
21108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_CANCEL");
21128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_unauthorize(struct wpa_ctrl *ctrl, int argc,
21168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
21178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
211861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_UNAUTHORIZE", 1, argc, argv);
211961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
21208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
212161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
212261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_p2p_presence_req(struct wpa_ctrl *ctrl, int argc,
212361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					char *argv[])
212461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
212561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (argc != 0 && argc != 2 && argc != 4) {
212661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		printf("Invalid P2P_PRESENCE_REQ command: needs two arguments "
212761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "(preferred duration, interval; in microsecods).\n"
212861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "Optional second pair can be used to provide "
212961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "acceptable values.\n");
213061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return -1;
213161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
213261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
213361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_PRESENCE_REQ", 0, argc, argv);
213461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
213561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
213661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
213761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_p2p_ext_listen(struct wpa_ctrl *ctrl, int argc,
213861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				      char *argv[])
213961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
214061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (argc != 0 && argc != 2) {
214161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		printf("Invalid P2P_EXT_LISTEN command: needs two arguments "
214261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "(availability period, availability interval; in "
214361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "millisecods).\n"
214461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "Extended Listen Timing can be cancelled with this "
214561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "command when used without parameters.\n");
21468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
21478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
21488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
214961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_EXT_LISTEN", 0, argc, argv);
21508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2152391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
2153391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidtstatic int wpa_cli_cmd_p2p_remove_client(struct wpa_ctrl *ctrl, int argc,
2154391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt					 char *argv[])
2155391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt{
2156391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	return wpa_cli_cmd(ctrl, "P2P_REMOVE_CLIENT", 1, argc, argv);
2157391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt}
2158391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
215961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_P2P */
21608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
216161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#ifdef CONFIG_WIFI_DISPLAY
216261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
216361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_wfd_subelem_set(struct wpa_ctrl *ctrl, int argc,
216461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				       char *argv[])
21658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
21678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
21688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
216961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (argc != 1 && argc != 2) {
217061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		printf("Invalid WFD_SUBELEM_SET command: needs one or two "
217161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "arguments (subelem, hexdump)\n");
21728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
21738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
21748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
217561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "WFD_SUBELEM_SET %s %s",
217661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			  argv[0], argc > 1 ? argv[1] : "");
21778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
21788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
21798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
21808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
21818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
218461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_wfd_subelem_get(struct wpa_ctrl *ctrl, int argc,
218561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				       char *argv[])
21868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
21888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
21898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
219061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (argc != 1) {
219161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		printf("Invalid WFD_SUBELEM_GET command: needs one "
219261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "argument (subelem)\n");
21938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
21948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
21958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
219661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "WFD_SUBELEM_GET %s",
219761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			  argv[0]);
21988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
21998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
22008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
22018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
22028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
220361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_WIFI_DISPLAY */
22048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_INTERWORKING
22071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_fetch_anqp(struct wpa_ctrl *ctrl, int argc,
22081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				  char *argv[])
22091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
22101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpa_ctrl_command(ctrl, "FETCH_ANQP");
22111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
22121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_stop_fetch_anqp(struct wpa_ctrl *ctrl, int argc,
22151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				       char *argv[])
22161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
22171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpa_ctrl_command(ctrl, "STOP_FETCH_ANQP");
22181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
22191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_interworking_select(struct wpa_ctrl *ctrl, int argc,
22221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					   char *argv[])
22231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
222461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "INTERWORKING_SELECT", 0, argc, argv);
22251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
22261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_interworking_connect(struct wpa_ctrl *ctrl, int argc,
22291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					    char *argv[])
22301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
223161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "INTERWORKING_CONNECT", 1, argc, argv);
223261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
22331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
223561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_anqp_get(struct wpa_ctrl *ctrl, int argc, char *argv[])
223661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
223761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "ANQP_GET", 2, argc, argv);
22381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
22391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
224161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_gas_request(struct wpa_ctrl *ctrl, int argc,
224261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				   char *argv[])
22431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
224461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "GAS_REQUEST", 2, argc, argv);
224561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
22461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
224861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_gas_response_get(struct wpa_ctrl *ctrl, int argc,
224961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					char *argv[])
225061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
225161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "GAS_RESPONSE_GET", 2, argc, argv);
22521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
22531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_INTERWORKING */
22541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
22551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
225604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_HS20
225704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
225804949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_hs20_anqp_get(struct wpa_ctrl *ctrl, int argc,
225904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				     char *argv[])
226004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
226161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "HS20_ANQP_GET", 2, argc, argv);
226204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
226304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
226404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
226504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_get_nai_home_realm_list(struct wpa_ctrl *ctrl, int argc,
226604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					       char *argv[])
226704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
226804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	char cmd[512];
226904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
227004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (argc == 0) {
227104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		printf("Command needs one or two arguments (dst mac addr and "
227204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		       "optional home realm)\n");
227304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
227404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
227504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
227661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (write_cmd(cmd, sizeof(cmd), "HS20_GET_NAI_HOME_REALM_LIST",
227761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		      argc, argv) < 0)
227804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
227904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
228004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
228104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
228204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
228304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_HS20 */
228404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
228504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
22868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_sta_autoconnect(struct wpa_ctrl *ctrl, int argc,
22878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
22888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
228961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "STA_AUTOCONNECT", 1, argc, argv);
22908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
22918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_tdls_discover(struct wpa_ctrl *ctrl, int argc,
22948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
22958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
229661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "TDLS_DISCOVER", 1, argc, argv);
22978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
22988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_tdls_setup(struct wpa_ctrl *ctrl, int argc,
23018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
23028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
230361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "TDLS_SETUP", 1, argc, argv);
23048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_tdls_teardown(struct wpa_ctrl *ctrl, int argc,
23088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
23098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
231061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "TDLS_TEARDOWN", 1, argc, argv);
23118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_signal_poll(struct wpa_ctrl *ctrl, int argc,
23158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
23168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
23178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "SIGNAL_POLL");
23188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2321fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zhengstatic int wpa_cli_cmd_pktcnt_poll(struct wpa_ctrl *ctrl, int argc,
2322fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng				   char *argv[])
2323fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng{
2324fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng	return wpa_ctrl_command(ctrl, "PKTCNT_POLL");
2325fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng}
2326fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng
2327fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng
23281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_reauthenticate(struct wpa_ctrl *ctrl, int argc,
23291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				      char *argv[])
23301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
23311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return wpa_ctrl_command(ctrl, "REAUTHENTICATE");
23321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
23331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
233404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
233504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN
233604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
233704949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_autoscan(struct wpa_ctrl *ctrl, int argc, char *argv[])
233804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
233904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (argc == 0)
234004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return wpa_ctrl_command(ctrl, "AUTOSCAN ");
234104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
234261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, "AUTOSCAN", 0, argc, argv);
234304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
234404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
234504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */
234604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
234704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
2348a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt#ifdef CONFIG_WNM
2349a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt
2350a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidtstatic int wpa_cli_cmd_wnm_sleep(struct wpa_ctrl *ctrl, int argc, char *argv[])
2351a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt{
2352a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WNM_SLEEP", 0, argc, argv);
2353a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt}
2354a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt
235544c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt
235644c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidtstatic int wpa_cli_cmd_wnm_bss_query(struct wpa_ctrl *ctrl, int argc, char *argv[])
235744c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt{
235844c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt	return wpa_cli_cmd(ctrl, "WNM_BSS_QUERY", 1, argc, argv);
235944c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt}
236044c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt
2361a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt#endif /* CONFIG_WNM */
2362a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt
2363a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt
236461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_raw(struct wpa_ctrl *ctrl, int argc, char *argv[])
236561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
236661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (argc == 0)
236761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return -1;
236861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_cli_cmd(ctrl, argv[0], 0, argc - 1, &argv[1]);
236961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
237061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
237161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
2372c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#ifdef ANDROID
23730716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidtstatic int wpa_cli_cmd_driver(struct wpa_ctrl *ctrl, int argc, char *argv[])
23740716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt{
23750716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	char cmd[256];
23760716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	int i;
23770716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	int len;
23780716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt
23790716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	if (argc < 1) {
23800716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt		printf("Invalid DRIVER command: needs one argument (cmd)\n");
23810716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt		return -1;
23820716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	}
23830716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt
23840716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	len = os_snprintf(cmd, sizeof(cmd), "DRIVER %s", argv[0]);
23850716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	for (i=1; i < argc; i++)
23860716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt		len += os_snprintf(cmd + len, sizeof(cmd) - len, " %s", argv[i]);
23870716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
23880716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	printf("%s: %s\n", __func__, cmd);
23890716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
23900716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt}
2391c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#endif
23920716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt
239361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
2394444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidtstatic int wpa_cli_cmd_flush(struct wpa_ctrl *ctrl, int argc, char *argv[])
2395444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt{
2396444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt	return wpa_ctrl_command(ctrl, "FLUSH");
2397444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt}
2398444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt
2399444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt
24008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtenum wpa_cli_cmd_flags {
24018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cli_cmd_flag_none		= 0x00,
24028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cli_cmd_flag_sensitive		= 0x01
24038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
24048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpa_cli_cmd {
24068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *cmd;
24078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int (*handler)(struct wpa_ctrl *ctrl, int argc, char *argv[]);
240861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	char ** (*completion)(const char *str, int pos);
24098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	enum wpa_cli_cmd_flags flags;
24108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *usage;
24118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
24128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
24138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_cli_cmd wpa_cli_commands[] = {
241461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "status", wpa_cli_cmd_status, NULL,
24158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[verbose] = get current WPA/EAPOL/EAP status" },
241761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "ifname", wpa_cli_cmd_ifname, NULL,
241861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
241961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "= get current interface name" },
242061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "ping", wpa_cli_cmd_ping, NULL,
24218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= pings wpa_supplicant" },
242361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "relog", wpa_cli_cmd_relog, NULL,
24248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= re-open log-file (allow rolling logs)" },
242661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "note", wpa_cli_cmd_note, NULL,
24278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<text> = add a note to wpa_supplicant debug log" },
242961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "mib", wpa_cli_cmd_mib, NULL,
24308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get MIB variables (dot1x, dot11)" },
243261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "help", wpa_cli_cmd_help, wpa_cli_complete_help,
24338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
243461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "[command] = show usage help" },
243561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "interface", wpa_cli_cmd_interface, NULL,
24368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[ifname] = show interfaces/select interface" },
243861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "level", wpa_cli_cmd_level, NULL,
24398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<debug level> = change debug level" },
244161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "license", wpa_cli_cmd_license, NULL,
24428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= show full wpa_cli license" },
244461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "quit", wpa_cli_cmd_quit, NULL,
24458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= exit wpa_cli" },
244751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	{ "set", wpa_cli_cmd_set, wpa_cli_complete_set,
24488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= set variables (shows list of variables when run without "
24508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "arguments)" },
245161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "get", wpa_cli_cmd_get, NULL,
24528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<name> = get information" },
245461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "logon", wpa_cli_cmd_logon, NULL,
24558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= IEEE 802.1X EAPOL state machine logon" },
245761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "logoff", wpa_cli_cmd_logoff, NULL,
24588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= IEEE 802.1X EAPOL state machine logoff" },
246061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "pmksa", wpa_cli_cmd_pmksa, NULL,
24618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= show PMKSA cache" },
246361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "reassociate", wpa_cli_cmd_reassociate, NULL,
24648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= force reassociation" },
246661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "preauthenticate", wpa_cli_cmd_preauthenticate, wpa_cli_complete_bss,
24678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<BSSID> = force preauthentication" },
246961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "identity", wpa_cli_cmd_identity, NULL,
24708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <identity> = configure identity for an SSID" },
247261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "password", wpa_cli_cmd_password, NULL,
24738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
24748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <password> = configure password for an SSID" },
247561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "new_password", wpa_cli_cmd_new_password, NULL,
24768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
24778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <password> = change password for an SSID" },
247861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "pin", wpa_cli_cmd_pin, NULL,
24798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
24808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <pin> = configure pin for an SSID" },
248161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "otp", wpa_cli_cmd_otp, NULL,
24828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
24838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <password> = configure one-time-password for an SSID"
24848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	},
248561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "passphrase", wpa_cli_cmd_passphrase, NULL,
24868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
24878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <passphrase> = configure private key passphrase\n"
24888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  for an SSID" },
248961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "bssid", wpa_cli_cmd_bssid, NULL,
24908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <BSSID> = set preferred BSSID for an SSID" },
249261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "blacklist", wpa_cli_cmd_blacklist, wpa_cli_complete_bss,
2493696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  cli_cmd_flag_none,
2494696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  "<BSSID> = add a BSSID to the blacklist\n"
2495696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  "blacklist clear = clear the blacklist\n"
2496696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  "blacklist = display the blacklist" },
249761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "log_level", wpa_cli_cmd_log_level, NULL,
2498696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  cli_cmd_flag_none,
24991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "<level> [<timestamp>] = update the log level/timestamp\n"
2500696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  "log_level = display the current log level and log options" },
250161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "list_networks", wpa_cli_cmd_list_networks, NULL,
25028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= list configured networks" },
250461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "select_network", wpa_cli_cmd_select_network, NULL,
25058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> = select a network (disable others)" },
250761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "enable_network", wpa_cli_cmd_enable_network, NULL,
25088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> = enable a network" },
251061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "disable_network", wpa_cli_cmd_disable_network, NULL,
25118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> = disable a network" },
251361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "add_network", wpa_cli_cmd_add_network, NULL,
25148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= add a network" },
251661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "remove_network", wpa_cli_cmd_remove_network, NULL,
25178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> = remove a network" },
251961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "set_network", wpa_cli_cmd_set_network, NULL,
25208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
25218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <variable> <value> = set network variables (shows\n"
25228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  list of variables when run without arguments)" },
252361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "get_network", wpa_cli_cmd_get_network, NULL,
25248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <variable> = get network variables" },
252661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "list_creds", wpa_cli_cmd_list_creds, NULL,
252704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_none,
252804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "= list configured credentials" },
252961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "add_cred", wpa_cli_cmd_add_cred, NULL,
253004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_none,
253104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "= add a credential" },
253261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "remove_cred", wpa_cli_cmd_remove_cred, NULL,
253304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_none,
253404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<cred id> = remove a credential" },
253561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "set_cred", wpa_cli_cmd_set_cred, NULL,
253604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_sensitive,
253704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<cred id> <variable> <value> = set credential variables" },
253861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "save_config", wpa_cli_cmd_save_config, NULL,
25398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= save the current configuration" },
254161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "disconnect", wpa_cli_cmd_disconnect, NULL,
25428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= disconnect and wait for reassociate/reconnect command before\n"
25448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  connecting" },
254561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "reconnect", wpa_cli_cmd_reconnect, NULL,
25468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= like reassociate, but only takes effect if already disconnected"
25488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	},
254961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "scan", wpa_cli_cmd_scan, NULL,
25508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= request new BSS scan" },
255261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "scan_results", wpa_cli_cmd_scan_results, NULL,
25538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get latest scan results" },
255561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "bss", wpa_cli_cmd_bss, wpa_cli_complete_bss,
25568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<<idx> | <bssid>> = get detailed scan result info" },
255861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "get_capability", wpa_cli_cmd_get_capability, NULL,
25598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25608da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt	  "<eap/pairwise/group/key_mgmt/proto/auth_alg/channels/freq/modes> "
256161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "= get capabilies" },
256261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "reconfigure", wpa_cli_cmd_reconfigure, NULL,
25638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= force wpa_supplicant to re-read its configuration file" },
256561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "terminate", wpa_cli_cmd_terminate, NULL,
25668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= terminate wpa_supplicant" },
256861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "interface_add", wpa_cli_cmd_interface_add, NULL,
25698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<ifname> <confname> <driver> <ctrl_interface> <driver_param>\n"
25718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  <bridge_name> = adds new interface, all parameters but <ifname>\n"
25728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  are optional" },
257361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "interface_remove", wpa_cli_cmd_interface_remove, NULL,
25748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<ifname> = removes the interface" },
257661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "interface_list", wpa_cli_cmd_interface_list, NULL,
25778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= list available interfaces" },
257961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "ap_scan", wpa_cli_cmd_ap_scan, NULL,
25808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<value> = set ap_scan parameter" },
258261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "scan_interval", wpa_cli_cmd_scan_interval, NULL,
25838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<value> = set scan_interval parameter (in seconds)" },
258561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "bss_expire_age", wpa_cli_cmd_bss_expire_age, NULL,
25868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<value> = set BSS expiration age parameter" },
258861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "bss_expire_count", wpa_cli_cmd_bss_expire_count, NULL,
25898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<value> = set BSS expiration scan count parameter" },
259161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "bss_flush", wpa_cli_cmd_bss_flush, NULL,
2592f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	  cli_cmd_flag_none,
2593f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt	  "<value> = set BSS flush age (0 by default)" },
259461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "stkstart", wpa_cli_cmd_stkstart, NULL,
25958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request STK negotiation with <addr>" },
259761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "ft_ds", wpa_cli_cmd_ft_ds, wpa_cli_complete_bss,
25988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request over-the-DS FT with <addr>" },
260061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_pbc", wpa_cli_cmd_wps_pbc, wpa_cli_complete_bss,
26018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[BSSID] = start Wi-Fi Protected Setup: Push Button Configuration" },
260361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_pin", wpa_cli_cmd_wps_pin, wpa_cli_complete_bss,
26048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
26058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<BSSID> [PIN] = start WPS PIN method (returns PIN, if not "
26068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "hardcoded)" },
260761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_check_pin", wpa_cli_cmd_wps_check_pin, NULL,
26088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
26098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<PIN> = verify PIN checksum" },
261061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_cancel", wpa_cli_cmd_wps_cancel, NULL, cli_cmd_flag_none,
26118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "Cancels the pending WPS operation" },
261204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_WPS_NFC
261361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_nfc", wpa_cli_cmd_wps_nfc, wpa_cli_complete_bss,
261404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_none,
261504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "[BSSID] = start Wi-Fi Protected Setup: NFC" },
2616f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	{ "wps_nfc_config_token", wpa_cli_cmd_wps_nfc_config_token, NULL,
2617f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	  cli_cmd_flag_none,
2618f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	  "<WPS|NDEF> = build configuration token" },
261961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_nfc_token", wpa_cli_cmd_wps_nfc_token, NULL,
262004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_none,
262104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<WPS|NDEF> = create password token" },
262261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_nfc_tag_read", wpa_cli_cmd_wps_nfc_tag_read, NULL,
262304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_sensitive,
262404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<hexdump of payload> = report read NFC tag with WPS data" },
2625d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	{ "nfc_get_handover_req", wpa_cli_cmd_nfc_get_handover_req, NULL,
2626d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	  cli_cmd_flag_none,
2627d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	  "<NDEF> <WPS> = create NFC handover request" },
2628d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	{ "nfc_get_handover_sel", wpa_cli_cmd_nfc_get_handover_sel, NULL,
2629d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	  cli_cmd_flag_none,
2630d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	  "<NDEF> <WPS> = create NFC handover select" },
2631d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	{ "nfc_rx_handover_req", wpa_cli_cmd_nfc_rx_handover_req, NULL,
2632d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	  cli_cmd_flag_none,
2633d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	  "<hexdump of payload> = report received NFC handover request" },
2634d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	{ "nfc_rx_handover_sel", wpa_cli_cmd_nfc_rx_handover_sel, NULL,
2635d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	  cli_cmd_flag_none,
2636d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt	  "<hexdump of payload> = report received NFC handover select" },
2637f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	{ "nfc_report_handover", wpa_cli_cmd_nfc_report_handover, NULL,
2638f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	  cli_cmd_flag_none,
2639f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	  "<role> <type> <hexdump of req> <hexdump of sel> = report completed "
2640f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt	  "NFC handover" },
264104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_WPS_NFC */
264261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_reg", wpa_cli_cmd_wps_reg, wpa_cli_complete_bss,
26438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
26448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<BSSID> <AP PIN> = start WPS Registrar to configure an AP" },
264561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_ap_pin", wpa_cli_cmd_wps_ap_pin, NULL,
26468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
26478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[params..] = enable/disable AP PIN" },
264861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_er_start", wpa_cli_cmd_wps_er_start, NULL,
26498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[IP address] = start Wi-Fi Protected Setup External Registrar" },
265161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_er_stop", wpa_cli_cmd_wps_er_stop, NULL,
26528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= stop Wi-Fi Protected Setup External Registrar" },
265461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_er_pin", wpa_cli_cmd_wps_er_pin, NULL,
26558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
26568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> <PIN> = add an Enrollee PIN to External Registrar" },
265761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_er_pbc", wpa_cli_cmd_wps_er_pbc, NULL,
26588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> = accept an Enrollee PBC using External Registrar" },
266061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_er_learn", wpa_cli_cmd_wps_er_learn, NULL,
26618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
26628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> <PIN> = learn AP configuration" },
266361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_er_set_config", wpa_cli_cmd_wps_er_set_config, NULL,
26648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> <network id> = set AP configuration for enrolling" },
266661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_er_config", wpa_cli_cmd_wps_er_config, NULL,
26678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
26688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> <PIN> <SSID> <auth> <encr> <key> = configure AP" },
266904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_WPS_NFC
267061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wps_er_nfc_config_token", wpa_cli_cmd_wps_er_nfc_config_token, NULL,
267104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_none,
267204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<WPS/NDEF> <UUID> = build NFC configuration token" },
267304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_WPS_NFC */
267461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "ibss_rsn", wpa_cli_cmd_ibss_rsn, NULL,
26758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request RSN authentication with <addr> in IBSS" },
26778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_AP
267861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "sta", wpa_cli_cmd_sta, NULL,
26798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = get information about an associated station (AP)" },
268161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "all_sta", wpa_cli_cmd_all_sta, NULL,
26828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get information about all associated stations (AP)" },
268461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "deauthenticate", wpa_cli_cmd_deauthenticate, NULL,
268504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_none,
268604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<addr> = deauthenticate a station" },
268761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "disassociate", wpa_cli_cmd_disassociate, NULL,
268804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  cli_cmd_flag_none,
268904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<addr> = disassociate a station" },
26908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_AP */
269161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "suspend", wpa_cli_cmd_suspend, NULL, cli_cmd_flag_none,
26928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= notification of suspend/hibernate" },
269361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "resume", wpa_cli_cmd_resume, NULL, cli_cmd_flag_none,
26948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= notification of resume/thaw" },
269561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "drop_sa", wpa_cli_cmd_drop_sa, NULL, cli_cmd_flag_none,
26968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= drop SA without deauth/disassoc (test command)" },
269761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "roam", wpa_cli_cmd_roam, wpa_cli_complete_bss,
26988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = roam to the specified BSS" },
27008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P
270161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_find", wpa_cli_cmd_p2p_find, wpa_cli_complete_p2p_find,
270261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
27038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[timeout] [type=*] = find P2P Devices for up-to timeout seconds" },
270461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_stop_find", wpa_cli_cmd_p2p_stop_find, NULL, cli_cmd_flag_none,
27058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= stop P2P Devices search" },
270661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_connect", wpa_cli_cmd_p2p_connect, wpa_cli_complete_p2p_connect,
270761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
270861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "<addr> <\"pbc\"|PIN> [ht40] = connect to a P2P Device" },
270961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_listen", wpa_cli_cmd_p2p_listen, NULL, cli_cmd_flag_none,
27108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[timeout] = listen for P2P Devices for up-to timeout seconds" },
271161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_group_remove", wpa_cli_cmd_p2p_group_remove,
271261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  wpa_cli_complete_p2p_group_remove, cli_cmd_flag_none,
27138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<ifname> = remove P2P group interface (terminate group if GO)" },
271461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_group_add", wpa_cli_cmd_p2p_group_add, NULL, cli_cmd_flag_none,
271561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "[ht40] = add a new P2P group (local end as GO)" },
271661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_prov_disc", wpa_cli_cmd_p2p_prov_disc,
271761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  wpa_cli_complete_p2p_peer, cli_cmd_flag_none,
27188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> <method> = request provisioning discovery" },
271961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_get_passphrase", wpa_cli_cmd_p2p_get_passphrase, NULL,
27208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get the passphrase for a group (GO only)" },
27228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_serv_disc_req", wpa_cli_cmd_p2p_serv_disc_req,
272361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  wpa_cli_complete_p2p_peer, cli_cmd_flag_none,
27248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> <TLVs> = schedule service discovery request" },
27258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_serv_disc_cancel_req", wpa_cli_cmd_p2p_serv_disc_cancel_req,
272661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  NULL, cli_cmd_flag_none,
27278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<id> = cancel pending service discovery request" },
272861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_serv_disc_resp", wpa_cli_cmd_p2p_serv_disc_resp, NULL,
27298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<freq> <addr> <dialog token> <TLVs> = service discovery response" },
273161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_service_update", wpa_cli_cmd_p2p_service_update, NULL,
27328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= indicate change in local services" },
273461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_serv_disc_external", wpa_cli_cmd_p2p_serv_disc_external, NULL,
27358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<external> = set external processing of service discovery" },
273761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_service_flush", wpa_cli_cmd_p2p_service_flush, NULL,
27388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= remove all stored service entries" },
274061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_service_add", wpa_cli_cmd_p2p_service_add, NULL,
27418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<bonjour|upnp> <query|version> <response|service> = add a local "
27438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "service" },
274461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_service_del", wpa_cli_cmd_p2p_service_del, NULL,
27458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<bonjour|upnp> <query|version> [|service] = remove a local "
27478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "service" },
274861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_reject", wpa_cli_cmd_p2p_reject, wpa_cli_complete_p2p_peer,
27498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = reject connection attempts from a specific peer" },
275161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_invite", wpa_cli_cmd_p2p_invite, NULL,
27528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<cmd> [peer=addr] = invite peer" },
275461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_peers", wpa_cli_cmd_p2p_peers, NULL, cli_cmd_flag_none,
27558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[discovered] = list known (optionally, only fully discovered) P2P "
27568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "peers" },
275761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_peer", wpa_cli_cmd_p2p_peer, wpa_cli_complete_p2p_peer,
275861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
27598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<address> = show information about known P2P peer" },
2760391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	{ "p2p_set", wpa_cli_cmd_p2p_set, wpa_cli_complete_p2p_set,
2761391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	  cli_cmd_flag_none,
27628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<field> <value> = set a P2P parameter" },
276361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_flush", wpa_cli_cmd_p2p_flush, NULL, cli_cmd_flag_none,
27648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= flush P2P state" },
276561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_cancel", wpa_cli_cmd_p2p_cancel, NULL, cli_cmd_flag_none,
27668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= cancel P2P group formation" },
276761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_unauthorize", wpa_cli_cmd_p2p_unauthorize,
276861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  wpa_cli_complete_p2p_peer, cli_cmd_flag_none,
27698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<address> = unauthorize a peer" },
277061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_presence_req", wpa_cli_cmd_p2p_presence_req, NULL,
277161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
27728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[<duration> <interval>] [<duration> <interval>] = request GO "
27738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "presence" },
277461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "p2p_ext_listen", wpa_cli_cmd_p2p_ext_listen, NULL,
277561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
27768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[<period> <interval>] = set extended listen timing" },
2777391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	{ "p2p_remove_client", wpa_cli_cmd_p2p_remove_client,
2778391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	  wpa_cli_complete_p2p_peer, cli_cmd_flag_none,
2779391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt	  "<address|iface=address> = remove a peer from all groups" },
27808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */
278161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#ifdef CONFIG_WIFI_DISPLAY
278261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wfd_subelem_set", wpa_cli_cmd_wfd_subelem_set, NULL,
278361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
278461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "<subelem> [contents] = set Wi-Fi Display subelement" },
278561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "wfd_subelem_get", wpa_cli_cmd_wfd_subelem_get, NULL,
278661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
278761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "<subelem> = get Wi-Fi Display subelement" },
278861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_WIFI_DISPLAY */
27891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_INTERWORKING
279061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "fetch_anqp", wpa_cli_cmd_fetch_anqp, NULL, cli_cmd_flag_none,
27911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "= fetch ANQP information for all APs" },
279261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "stop_fetch_anqp", wpa_cli_cmd_stop_fetch_anqp, NULL,
279361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
27941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "= stop fetch_anqp operation" },
279561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "interworking_select", wpa_cli_cmd_interworking_select, NULL,
27961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  cli_cmd_flag_none,
27971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "[auto] = perform Interworking network selection" },
27981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	{ "interworking_connect", wpa_cli_cmd_interworking_connect,
279961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  wpa_cli_complete_bss, cli_cmd_flag_none,
28001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "<BSSID> = connect using Interworking credentials" },
280161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "anqp_get", wpa_cli_cmd_anqp_get, wpa_cli_complete_bss,
280261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
28031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "<addr> <info id>[,<info id>]... = request ANQP information" },
280461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "gas_request", wpa_cli_cmd_gas_request, wpa_cli_complete_bss,
280561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
280661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "<addr> <AdvProtoID> [QueryReq] = GAS request" },
280761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "gas_response_get", wpa_cli_cmd_gas_response_get,
280861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  wpa_cli_complete_bss, cli_cmd_flag_none,
280961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "<addr> <dialog token> [start,len] = Fetch last GAS response" },
28101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_INTERWORKING */
281104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_HS20
281261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "hs20_anqp_get", wpa_cli_cmd_hs20_anqp_get, wpa_cli_complete_bss,
281361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
281404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<addr> <subtype>[,<subtype>]... = request HS 2.0 ANQP information"
281504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	},
281604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	{ "nai_home_realm_list", wpa_cli_cmd_get_nai_home_realm_list,
281761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  wpa_cli_complete_bss, cli_cmd_flag_none,
281804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "<addr> <home realm> = get HS20 nai home realm list" },
281904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_HS20 */
282061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "sta_autoconnect", wpa_cli_cmd_sta_autoconnect, NULL,
282161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
28228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<0/1> = disable/enable automatic reconnection" },
282361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "tdls_discover", wpa_cli_cmd_tdls_discover, NULL,
28248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request TDLS discovery with <addr>" },
282661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "tdls_setup", wpa_cli_cmd_tdls_setup, NULL,
28278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request TDLS setup with <addr>" },
282961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "tdls_teardown", wpa_cli_cmd_tdls_teardown, NULL,
28308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = tear down TDLS with <addr>" },
283261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "signal_poll", wpa_cli_cmd_signal_poll, NULL,
28338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
28348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get signal parameters" },
283561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "pktcnt_poll", wpa_cli_cmd_pktcnt_poll, NULL,
2836fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng	  cli_cmd_flag_none,
2837fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng	  "= get TX/RX packet counters" },
283861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "reauthenticate", wpa_cli_cmd_reauthenticate, NULL,
283961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  cli_cmd_flag_none,
28401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	  "= trigger IEEE 802.1X/EAPOL reauthentication" },
284104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN
284261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "autoscan", wpa_cli_cmd_autoscan, NULL, cli_cmd_flag_none,
284304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	  "[params] = Set or unset (if none) autoscan parameters" },
284404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */
2845a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt#ifdef CONFIG_WNM
2846a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt	{ "wnm_sleep", wpa_cli_cmd_wnm_sleep, NULL, cli_cmd_flag_none,
2847a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt	  "<enter/exit> [interval=#] = enter/exit WNM-Sleep mode" },
284844c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt	{ "wnm_bss_query", wpa_cli_cmd_wnm_bss_query, NULL, cli_cmd_flag_none,
284944c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt	  "<query reason> = Send BSS Transition Management Query" },
2850a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt#endif /* CONFIG_WNM */
285161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "raw", wpa_cli_cmd_raw, NULL, cli_cmd_flag_sensitive,
285261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	  "<params..> = Sent unprocessed command" },
2853444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt	{ "flush", wpa_cli_cmd_flush, NULL, cli_cmd_flag_none,
2854444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt	  "= flush wpa_supplicant state" },
2855c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#ifdef ANDROID
285661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ "driver", wpa_cli_cmd_driver, NULL,
28570716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	  cli_cmd_flag_none,
28580716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	  "<command> = driver private commands" },
2859c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#endif
286061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	{ NULL, NULL, NULL, cli_cmd_flag_none, NULL }
28618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
28628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Prints command usage, lines are padded with the specified string.
28668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
28678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void print_cmd_help(struct wpa_cli_cmd *cmd, const char *pad)
28688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
28698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char c;
28708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t n;
28718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("%s%s ", pad, cmd->cmd);
28738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (n = 0; (c = cmd->usage[n]); n++) {
28748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("%c", c);
28758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (c == '\n')
28768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("%s", pad);
28778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
28788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("\n");
28798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
28808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
288261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void print_help(const char *cmd)
28838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
28848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int n;
28858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("commands:\n");
288661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	for (n = 0; wpa_cli_commands[n].cmd; n++) {
288761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (cmd == NULL || str_starts(wpa_cli_commands[n].cmd, cmd))
288861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			print_cmd_help(&wpa_cli_commands[n], "  ");
288961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
28908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
28918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_edit_filter_history_cb(void *ctx, const char *cmd)
28948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
28958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *c, *delim;
28968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int n;
28978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
28988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	delim = os_strchr(cmd, ' ');
29008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (delim)
29018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		len = delim - cmd;
29028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
29038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		len = os_strlen(cmd);
29048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (n = 0; (c = wpa_cli_commands[n].cmd); n++) {
29068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strncasecmp(cmd, c, len) == 0 && len == os_strlen(c))
29078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return (wpa_cli_commands[n].flags &
29088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				cli_cmd_flag_sensitive);
29098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
29108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
29118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char ** wpa_list_cmd_list(void)
29158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **res;
29178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, count;
2918f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	struct cli_txt_entry *e;
29198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	count = sizeof(wpa_cli_commands) / sizeof(wpa_cli_commands[0]);
2921f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	count += dl_list_len(&p2p_groups);
2922f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	count += dl_list_len(&ifnames);
2923f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	res = os_calloc(count + 1, sizeof(char *));
29248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res == NULL)
29258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
29268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; wpa_cli_commands[i].cmd; i++) {
29288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res[i] = os_strdup(wpa_cli_commands[i].cmd);
29298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (res[i] == NULL)
29308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
29318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
29328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2933f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	dl_list_for_each(e, &p2p_groups, struct cli_txt_entry, list) {
2934f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		size_t len = 8 + os_strlen(e->txt);
2935f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		res[i] = os_malloc(len);
2936f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		if (res[i] == NULL)
2937f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt			break;
2938f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		os_snprintf(res[i], len, "ifname=%s", e->txt);
2939f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		i++;
2940f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	}
2941f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
2942f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	dl_list_for_each(e, &ifnames, struct cli_txt_entry, list) {
2943f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		res[i] = os_strdup(e->txt);
2944f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		if (res[i] == NULL)
2945f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt			break;
2946f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		i++;
2947f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	}
2948f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
29498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return res;
29508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char ** wpa_cli_cmd_completion(const char *cmd, const char *str,
29548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      int pos)
29558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i;
29578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; wpa_cli_commands[i].cmd; i++) {
29598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcasecmp(wpa_cli_commands[i].cmd, cmd) == 0) {
296061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			if (wpa_cli_commands[i].completion)
296161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				return wpa_cli_commands[i].completion(str,
296261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt								      pos);
29638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			edit_clear_line();
29648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("\r%s\n", wpa_cli_commands[i].usage);
29658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			edit_redraw();
29668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
29678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
29688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
29698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
29718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char ** wpa_cli_edit_completion_cb(void *ctx, const char *str, int pos)
29758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **res;
29778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *end;
29788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *cmd;
29798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2980f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	if (pos > 7 && os_strncasecmp(str, "IFNAME=", 7) == 0) {
2981f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		end = os_strchr(str, ' ');
2982f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		if (end && pos > end - str) {
2983f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt			pos -= end - str + 1;
2984f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt			str = end + 1;
2985f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		}
2986f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	}
2987f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
29888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = os_strchr(str, ' ');
29898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (end == NULL || str + pos < end)
29908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_list_cmd_list();
29918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd = os_malloc(pos + 1);
29938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (cmd == NULL)
29948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
29958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memcpy(cmd, str, pos);
29968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[end - str] = '\0';
29978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = wpa_cli_cmd_completion(cmd, str, pos);
29988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(cmd);
29998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return res;
30008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_request(struct wpa_ctrl *ctrl, int argc, char *argv[])
30048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_cli_cmd *cmd, *match = NULL;
30068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int count;
30078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret = 0;
30088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3009f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	if (argc > 1 && os_strncasecmp(argv[0], "IFNAME=", 7) == 0) {
3010f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		ifname_prefix = argv[0] + 7;
3011f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		argv = &argv[1];
3012f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		argc--;
3013f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	} else
3014f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		ifname_prefix = NULL;
3015f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
3016f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	if (argc == 0)
3017f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		return -1;
3018f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
30198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	count = 0;
30208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd = wpa_cli_commands;
30218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (cmd->cmd) {
30228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strncasecmp(cmd->cmd, argv[0], os_strlen(argv[0])) == 0)
30238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		{
30248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			match = cmd;
30258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (os_strcasecmp(cmd->cmd, argv[0]) == 0) {
30268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				/* we have an exact match */
30278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				count = 1;
30288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
30298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
30308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			count++;
30318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
30328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		cmd++;
30338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (count > 1) {
30368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Ambiguous command '%s'; possible commands:", argv[0]);
30378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		cmd = wpa_cli_commands;
30388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		while (cmd->cmd) {
30398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (os_strncasecmp(cmd->cmd, argv[0],
30408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   os_strlen(argv[0])) == 0) {
30418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				printf(" %s", cmd->cmd);
30428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
30438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			cmd++;
30448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
30458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("\n");
30468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = 1;
30478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (count == 0) {
30488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Unknown command '%s'\n", argv[0]);
30498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = 1;
30508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
30518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = match->handler(ctrl, argc - 1, &argv[1]);
30528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return ret;
30558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int str_match(const char *a, const char *b)
30598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return os_strncmp(a, b, os_strlen(b)) == 0;
30618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_exec(const char *program, const char *arg1,
30658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			const char *arg2)
30668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *cmd;
30688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
30698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
30708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret = 0;
30718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = os_strlen(program) + os_strlen(arg1) + os_strlen(arg2) + 3;
30738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd = os_malloc(len);
30748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (cmd == NULL)
30758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
30768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, len, "%s %s %s", program, arg1, arg2);
30778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= len) {
30788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(cmd);
30798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
30808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[len - 1] = '\0';
30828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef _WIN32_WCE
30838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (system(cmd) < 0)
30848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = -1;
30858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _WIN32_WCE */
30868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(cmd);
30878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return ret;
30898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_action_process(const char *msg)
30938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *pos;
30958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *copy = NULL, *id, *pos2;
30968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = msg;
30988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (*pos == '<') {
30998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* skip priority */
31008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos = os_strchr(pos, '>');
31018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos)
31028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos++;
31038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else
31048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos = msg;
31058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
31068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (str_match(pos, WPA_EVENT_CONNECTED)) {
31088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int new_id = -1;
31098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_unsetenv("WPA_ID");
31108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_unsetenv("WPA_ID_STR");
31118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_unsetenv("WPA_CTRL_DIR");
31128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos = os_strstr(pos, "[id=");
31148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos)
31158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			copy = os_strdup(pos + 4);
31168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (copy) {
31188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos2 = id = copy;
31198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			while (*pos2 && *pos2 != ' ')
31208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos2++;
31218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*pos2++ = '\0';
31228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			new_id = atoi(id);
31238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_setenv("WPA_ID", id, 1);
31248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			while (*pos2 && *pos2 != '=')
31258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos2++;
31268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (*pos2 == '=')
31278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos2++;
31288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			id = pos2;
31298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			while (*pos2 && *pos2 != ']')
31308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos2++;
31318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*pos2 = '\0';
31328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_setenv("WPA_ID_STR", id, 1);
31338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(copy);
31348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
31358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_setenv("WPA_CTRL_DIR", ctrl_iface_dir, 1);
31378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3138391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt		if (wpa_cli_connected <= 0 || new_id != wpa_cli_last_id) {
31398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_connected = 1;
31408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_last_id = new_id;
31418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_exec(action_file, ctrl_ifname, "CONNECTED");
31428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
31438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, WPA_EVENT_DISCONNECTED)) {
31448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpa_cli_connected) {
31458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_connected = 0;
31468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_exec(action_file, ctrl_ifname, "DISCONNECTED");
31478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
31488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, P2P_EVENT_GROUP_STARTED)) {
31498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
31508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, P2P_EVENT_GROUP_REMOVED)) {
31518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
31528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, P2P_EVENT_CROSS_CONNECT_ENABLE)) {
31538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
31548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, P2P_EVENT_CROSS_CONNECT_DISABLE)) {
31558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
31561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	} else if (str_match(pos, P2P_EVENT_GO_NEG_FAILURE)) {
31571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
31588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, WPS_EVENT_SUCCESS)) {
31598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
31608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, WPS_EVENT_FAIL)) {
31618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
31621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	} else if (str_match(pos, AP_STA_CONNECTED)) {
31631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
31641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	} else if (str_match(pos, AP_STA_DISCONNECTED)) {
31651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
3166f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	} else if (str_match(pos, ESS_DISASSOC_IMMINENT)) {
3167f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
31688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, WPA_EVENT_TERMINATING)) {
31698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("wpa_supplicant is terminating - stop monitoring\n");
31708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_quit = 1;
31718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
31728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_ANSI_C_EXTRA
31768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_action_cb(char *msg, size_t len)
31778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_action_process(msg);
31798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_ANSI_C_EXTRA */
31818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_reconnect(void)
31848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_close_connection();
318661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (wpa_cli_open_connection(ctrl_ifname, 1) < 0)
318761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return;
318861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
318961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (interactive) {
319061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		edit_clear_line();
319161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		printf("\rConnection to wpa_supplicant re-established\n");
319261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		edit_redraw();
319361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
31948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_event(const char *str)
31981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
31991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	const char *start, *s;
32001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
32011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	start = os_strchr(str, '>');
32021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (start == NULL)
32031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
32041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
32051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	start++;
32061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
32071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (str_starts(start, WPA_EVENT_BSS_ADDED)) {
32081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strchr(start, ' ');
32091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
32101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
32111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strchr(s + 1, ' ');
32121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
32131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
32141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_add(&bsses, s + 1);
32151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
32161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
32171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
32181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (str_starts(start, WPA_EVENT_BSS_REMOVED)) {
32191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strchr(start, ' ');
32201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
32211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
32221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strchr(s + 1, ' ');
32231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
32241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
32251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_del_addr(&bsses, s + 1);
32261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
32271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
32281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
32291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P
32301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (str_starts(start, P2P_EVENT_DEVICE_FOUND)) {
32311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strstr(start, " p2p_dev_addr=");
32321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
32331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
32341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_add_addr(&p2p_peers, s + 14);
32351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
32361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
32371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
32381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (str_starts(start, P2P_EVENT_DEVICE_LOST)) {
32391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strstr(start, " p2p_dev_addr=");
32401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
32411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
32421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_del_addr(&p2p_peers, s + 14);
32431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
32441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
32451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
32461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (str_starts(start, P2P_EVENT_GROUP_STARTED)) {
32471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strchr(start, ' ');
32481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
32491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
32501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_add_word(&p2p_groups, s + 1);
32511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
32521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
32531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
32541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (str_starts(start, P2P_EVENT_GROUP_REMOVED)) {
32551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		s = os_strchr(start, ' ');
32561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		if (s == NULL)
32571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt			return;
32581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		cli_txt_list_del_word(&p2p_groups, s + 1);
32591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
32601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	}
32611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */
32621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
32631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
32641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
326561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int check_terminating(const char *msg)
326661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
326761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	const char *pos = msg;
326861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
326961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (*pos == '<') {
327061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		/* skip priority */
327161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		pos = os_strchr(pos, '>');
327261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (pos)
327361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			pos++;
327461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		else
327561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			pos = msg;
327661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
327761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
327861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (str_match(pos, WPA_EVENT_TERMINATING) && ctrl_conn) {
327961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		edit_clear_line();
328061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		printf("\rConnection to wpa_supplicant lost - trying to "
328161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       "reconnect\n");
328261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		edit_redraw();
328361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		wpa_cli_attached = 0;
328461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		wpa_cli_close_connection();
328561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return 1;
328661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
328761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
328861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return 0;
328961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
329061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
329161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
32928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_recv_pending(struct wpa_ctrl *ctrl, int action_monitor)
32938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
32948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL) {
32958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_reconnect();
32968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
32978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
32988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (wpa_ctrl_pending(ctrl) > 0) {
32998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char buf[256];
33008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		size_t len = sizeof(buf) - 1;
33018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpa_ctrl_recv(ctrl, buf, &len) == 0) {
33028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			buf[len] = '\0';
33038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (action_monitor)
33048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				wpa_cli_action_process(buf);
33058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			else {
33061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				cli_event(buf);
33078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (wpa_cli_show_event(buf)) {
33088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					edit_clear_line();
33098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					printf("\r%s\n", buf);
33108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					edit_redraw();
33118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				}
331261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
331361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				if (interactive && check_terminating(buf) > 0)
331461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					return;
33158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
33168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
33178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Could not read pending message.\n");
33188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
33198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
33208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_ctrl_pending(ctrl) < 0) {
33238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Connection to wpa_supplicant lost - trying to "
33248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "reconnect\n");
33258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_reconnect();
33268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
33288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define max_args 10
33308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int tokenize_cmd(char *cmd, char *argv[])
33328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
33338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *pos;
33348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int argc = 0;
33358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
33378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (;;) {
33388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		while (*pos == ' ')
33398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos++;
33408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (*pos == '\0')
33418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
33428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		argv[argc] = pos;
33438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		argc++;
33448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (argc == max_args)
33458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
33468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (*pos == '"') {
33478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			char *pos2 = os_strrchr(pos, '"');
33488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (pos2)
33498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos = pos2 + 1;
33508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
33518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		while (*pos != '\0' && *pos != ' ')
33528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos++;
33538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (*pos == ' ')
33548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*pos++ = '\0';
33558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return argc;
33588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
33598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_ping(void *eloop_ctx, void *timeout_ctx)
33628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
33638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn && _wpa_ctrl_command(ctrl_conn, "PING", 0)) {
33648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Connection to wpa_supplicant lost - trying to "
33658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "reconnect\n");
33668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_close_connection();
33678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!ctrl_conn)
33698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_reconnect();
33708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_register_timeout(ping_interval, 0, wpa_cli_ping, NULL, NULL);
33718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
33728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_mon_receive(int sock, void *eloop_ctx, void *sock_ctx)
33758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
33768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_recv_pending(mon_conn, 0);
33778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
33788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_edit_cmd_cb(void *ctx, char *cmd)
33818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
33828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *argv[max_args];
33838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int argc;
33848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	argc = tokenize_cmd(cmd, argv);
33858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc)
33868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_request(ctrl_conn, argc, argv);
33878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
33888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_edit_eof_cb(void *ctx)
33918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
33928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_terminate();
33938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
33948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
339661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int warning_displayed = 0;
339761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic char *hfile = NULL;
339861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int edit_started = 0;
339961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
340061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void start_edit(void)
34018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
340261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	char *home;
340361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	char *ps = NULL;
34048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
340561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_UDP_REMOTE
340661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	ps = wpa_ctrl_get_remote_ifname(ctrl_conn);
340761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */
34088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
34098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	home = getenv("HOME");
34108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (home) {
34118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *fname = ".wpa_cli_history";
34128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int hfile_len = os_strlen(home) + 1 + os_strlen(fname) + 1;
34138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		hfile = os_malloc(hfile_len);
34148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (hfile)
34158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_snprintf(hfile, hfile_len, "%s/%s", home, fname);
34168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
34178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
341861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (edit_init(wpa_cli_edit_cmd_cb, wpa_cli_edit_eof_cb,
341961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		      wpa_cli_edit_completion_cb, NULL, hfile, ps) < 0) {
342061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		eloop_terminate();
342161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return;
342261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
342361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
342461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	edit_started = 1;
34258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_register_timeout(ping_interval, 0, wpa_cli_ping, NULL, NULL);
342661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
342761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
342861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
342951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidtstatic void update_bssid_list(struct wpa_ctrl *ctrl)
343051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt{
343151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	char buf[4096];
343251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	size_t len = sizeof(buf);
343351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	int ret;
343451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	char *cmd = "BSS RANGE=ALL MASK=0x2";
343551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	char *pos, *end;
343651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
343751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	if (ctrl == NULL)
343851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		return;
343951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len, NULL);
344051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	if (ret < 0)
344151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		return;
344251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	buf[len] = '\0';
344351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
344451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	pos = buf;
344551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	while (pos) {
344651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		pos = os_strstr(pos, "bssid=");
344751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		if (pos == NULL)
344851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt			break;
344951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		pos += 6;
345051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		end = os_strchr(pos, '\n');
345151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		if (end == NULL)
345251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt			break;
345351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		*end = '\0';
345451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		cli_txt_list_add(&bsses, pos);
345551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt		pos = end + 1;
345651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	}
345751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt}
345851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
345951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
3460f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidtstatic void update_ifnames(struct wpa_ctrl *ctrl)
3461f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt{
3462f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	char buf[4096];
3463f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	size_t len = sizeof(buf);
3464f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	int ret;
3465f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	char *cmd = "INTERFACES";
3466f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	char *pos, *end;
3467f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	char txt[200];
3468f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
3469f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	cli_txt_list_flush(&ifnames);
3470f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
3471f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	if (ctrl == NULL)
3472f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		return;
3473f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len, NULL);
3474f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	if (ret < 0)
3475f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		return;
3476f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	buf[len] = '\0';
3477f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
3478f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	pos = buf;
3479f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	while (pos) {
3480f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		end = os_strchr(pos, '\n');
3481f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		if (end == NULL)
3482f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt			break;
3483f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		*end = '\0';
3484f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		ret = os_snprintf(txt, sizeof(txt), "ifname=%s", pos);
3485f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		if (ret > 0 && ret < (int) sizeof(txt))
3486f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt			cli_txt_list_add(&ifnames, txt);
3487f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt		pos = end + 1;
3488f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	}
3489f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt}
3490f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
3491f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt
349261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void try_connection(void *eloop_ctx, void *timeout_ctx)
349361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
3494b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	if (ctrl_conn)
3495b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt		goto done;
3496b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt
349761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (ctrl_ifname == NULL)
349861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		ctrl_ifname = wpa_cli_get_default_ifname();
34998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
350061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (!wpa_cli_open_connection(ctrl_ifname, 1) == 0) {
350161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (!warning_displayed) {
350261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			printf("Could not connect to wpa_supplicant: "
350361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			       "%s - re-trying\n", ctrl_ifname);
350461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			warning_displayed = 1;
350561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		}
350661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		eloop_register_timeout(1, 0, try_connection, NULL, NULL);
350761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return;
350861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
350961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
351051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt	update_bssid_list(ctrl_conn);
351151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt
351261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (warning_displayed)
351361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		printf("Connection established.\n");
351461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
3515b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidtdone:
351661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	start_edit();
351761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
351861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
351961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
352061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void wpa_cli_interactive(void)
352161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
352261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	printf("\nInteractive mode\n\n");
352361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
352461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	eloop_register_timeout(0, 0, try_connection, NULL, NULL);
35258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_run();
352661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	eloop_cancel_timeout(try_connection, NULL, NULL);
35278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	cli_txt_list_flush(&p2p_peers);
35291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	cli_txt_list_flush(&p2p_groups);
35301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	cli_txt_list_flush(&bsses);
3531f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt	cli_txt_list_flush(&ifnames);
353261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (edit_started)
353361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		edit_deinit(hfile, wpa_cli_edit_filter_history_cb);
35348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(hfile);
35358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_cancel_timeout(wpa_cli_ping, NULL, NULL);
35368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_close_connection();
35378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_action(struct wpa_ctrl *ctrl)
35418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_ANSI_C_EXTRA
35438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* TODO: ANSI C version(?) */
35448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("Action processing not supported in ANSI C build.\n");
35458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_ANSI_C_EXTRA */
35468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	fd_set rfds;
35478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int fd, res;
35488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct timeval tv;
35498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char buf[256]; /* note: large enough to fit in unsolicited messages */
35508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
35518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	fd = wpa_ctrl_get_fd(ctrl);
35538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (!wpa_cli_quit) {
35558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		FD_ZERO(&rfds);
35568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		FD_SET(fd, &rfds);
35578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		tv.tv_sec = ping_interval;
35588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		tv.tv_usec = 0;
35598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = select(fd + 1, &rfds, NULL, NULL, &tv);
35608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (res < 0 && errno != EINTR) {
35618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			perror("select");
35628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
35638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
35648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (FD_ISSET(fd, &rfds))
35668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_recv_pending(ctrl, 1);
35678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else {
35688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			/* verify that connection is still working */
35698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			len = sizeof(buf) - 1;
35708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpa_ctrl_request(ctrl, "PING", 4, buf, &len,
35718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     wpa_cli_action_cb) < 0 ||
35728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    len < 4 || os_memcmp(buf, "PONG", 4) != 0) {
35738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				printf("wpa_supplicant did not reply to PING "
35748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       "command - exiting\n");
35758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
35768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
35778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
35788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
35798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_ANSI_C_EXTRA */
35808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_cleanup(void)
35848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
35858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_close_connection();
35868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (pid_file)
35878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_daemonize_terminate(pid_file);
35888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_program_deinit();
35908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
359261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
359361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void wpa_cli_terminate(int sig, void *ctx)
35948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
359561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	eloop_terminate();
35968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
35978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
35998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char * wpa_cli_get_default_ifname(void)
36008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
36018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *ifname = NULL;
36028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_UNIX
36048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct dirent *dent;
36058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DIR *dir = opendir(ctrl_iface_dir);
36068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dir) {
36078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef ANDROID
36088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char ifprop[PROPERTY_VALUE_MAX];
36098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (property_get("wifi.interface", ifprop, NULL) != 0) {
36108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ifname = os_strdup(ifprop);
36118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Using interface '%s'\n", ifname);
36128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return ifname;
36138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
36148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* ANDROID */
36158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
36168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
36178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while ((dent = readdir(dir))) {
36188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef _DIRENT_HAVE_D_TYPE
36198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/*
36208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * Skip the file if it is not a socket. Also accept
36218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * DT_UNKNOWN (0) in case the C library or underlying
36228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * file system does not support d_type.
36238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 */
36248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (dent->d_type != DT_SOCK && dent->d_type != DT_UNKNOWN)
36258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			continue;
36268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _DIRENT_HAVE_D_TYPE */
36278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(dent->d_name, ".") == 0 ||
36288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    os_strcmp(dent->d_name, "..") == 0)
36298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			continue;
36308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Selected interface '%s'\n", dent->d_name);
36318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ifname = os_strdup(dent->d_name);
36328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
36338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
36348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	closedir(dir);
36358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UNIX */
36368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
3638b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt	char buf[4096], *pos;
36398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
36408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ctrl *ctrl;
36418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret;
36428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctrl = wpa_ctrl_open(NULL);
36448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl == NULL)
36458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
36468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = sizeof(buf) - 1;
36488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = wpa_ctrl_request(ctrl, "INTERFACES", 10, buf, &len, NULL);
36498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret >= 0) {
36508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		buf[len] = '\0';
36518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos = os_strchr(buf, '\n');
36528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos)
36538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*pos = '\0';
36548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ifname = os_strdup(buf);
36558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
36568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_ctrl_close(ctrl);
36578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
36588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return ifname;
36608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
36618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint main(int argc, char *argv[])
36648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
36658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int c;
36668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int daemonize = 0;
36678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret = 0;
36688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *global = NULL;
36698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (os_program_init())
36718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
36728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
36738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (;;) {
36748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		c = getopt(argc, argv, "a:Bg:G:hi:p:P:v");
36758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (c < 0)
36768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
36778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		switch (c) {
36788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'a':
36798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			action_file = optarg;
36808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
36818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'B':
36828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			daemonize = 1;
36838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
36848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'g':
36858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			global = optarg;
36868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
36878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'G':
36888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ping_interval = atoi(optarg);
36898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
36908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'h':
36918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			usage();
36928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return 0;
36938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'v':
36948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("%s\n", wpa_cli_version);
36958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return 0;
36968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'i':
36978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(ctrl_ifname);
36988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ctrl_ifname = os_strdup(optarg);
36998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'p':
37018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ctrl_iface_dir = optarg;
37028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'P':
37048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pid_file = optarg;
37058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
37068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		default:
37078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			usage();
37088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
37098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
37108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
37118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	interactive = (argc == optind) && (action_file == NULL);
37138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (interactive)
37158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("%s\n\n%s\n\n", wpa_cli_version, wpa_cli_license);
37168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (eloop_init())
37188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
37198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (global) {
37218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
37228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ctrl_conn = wpa_ctrl_open(NULL);
37238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_CTRL_IFACE_NAMED_PIPE */
37248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ctrl_conn = wpa_ctrl_open(global);
37258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
37268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ctrl_conn == NULL) {
372704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			fprintf(stderr, "Failed to connect to wpa_supplicant "
372804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				"global interface: %s  error: %s\n",
372904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				global, strerror(errno));
37308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
37318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
3732b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt
3733b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt		if (interactive) {
3734f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt			update_ifnames(ctrl_conn);
3735b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt			mon_conn = wpa_ctrl_open(global);
3736b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt			if (mon_conn) {
3737b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt				if (wpa_ctrl_attach(mon_conn) == 0) {
3738b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt					wpa_cli_attached = 1;
3739b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt					eloop_register_read_sock(
3740b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt						wpa_ctrl_get_fd(mon_conn),
3741b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt						wpa_cli_mon_receive,
3742b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt						NULL, NULL);
3743b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt				} else {
3744b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt					printf("Failed to open monitor "
3745b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt					       "connection through global "
3746b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt					       "control interface\n");
3747b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt				}
3748b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt			}
3749b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt		}
37508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
37518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
375261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	eloop_register_signal_terminate(wpa_cli_terminate, NULL);
37538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_ifname == NULL)
37558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ctrl_ifname = wpa_cli_get_default_ifname();
37568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (interactive) {
375861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		wpa_cli_interactive();
37598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
37608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!global &&
37618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    wpa_cli_open_connection(ctrl_ifname, 0) < 0) {
376204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt			fprintf(stderr, "Failed to connect to non-global "
376304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				"ctrl_ifname: %s  error: %s\n",
376404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				ctrl_ifname, strerror(errno));
37658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
37668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
37678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (action_file) {
37698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpa_ctrl_attach(ctrl_conn) == 0) {
37708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				wpa_cli_attached = 1;
37718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			} else {
37728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				printf("Warning: Failed to attach to "
37738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       "wpa_supplicant.\n");
37748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				return -1;
37758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
37768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
37778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
377861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (daemonize && os_daemonize(pid_file))
377961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			return -1;
37808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
378161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		if (action_file)
378261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			wpa_cli_action(ctrl_conn);
378361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		else
378461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt			ret = wpa_request(ctrl_conn, argc - optind,
378561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt					  &argv[optind]);
378661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	}
37878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(ctrl_ifname);
37898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_destroy();
37908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_cleanup();
37918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return ret;
37938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
37948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
37958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_CTRL_IFACE */
37968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint main(int argc, char *argv[])
37978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
37988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("CONFIG_CTRL_IFACE not defined - wpa_cli disabled\n");
37998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
38008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
38018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE */
3802