18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * WPA Supplicant - command line interface for wpa_supplicant daemon
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2004-2011, Jouni Malinen <j@w1.fi>
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
58d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This program is free software; you can redistribute it and/or modify
68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * it under the terms of the GNU General Public License version 2 as
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * published by the Free Software Foundation.
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Alternatively, this software may be distributed under the terms of BSD
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * license.
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * See README and COPYING for more details.
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h"
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_UNIX
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <dirent.h>
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UNIX */
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/wpa_ctrl.h"
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/common.h"
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/eloop.h"
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "utils/edit.h"
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common/version.h"
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef ANDROID
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <cutils/properties.h>
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* ANDROID */
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *wpa_cli_version =
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"wpa_cli v" VERSION_STR "\n"
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"Copyright (c) 2004-2011, Jouni Malinen <j@w1.fi> and contributors";
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *wpa_cli_license =
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"This program is free software. You can distribute it and/or modify it\n"
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"under the terms of the GNU General Public License version 2.\n"
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"Alternatively, this software may be distributed under the terms of the\n"
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"BSD license. See README and COPYING for more details.\n";
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *wpa_cli_full_license =
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"This program is free software; you can redistribute it and/or modify\n"
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"it under the terms of the GNU General Public License version 2 as\n"
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"published by the Free Software Foundation.\n"
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"This program is distributed in the hope that it will be useful,\n"
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"GNU General Public License for more details.\n"
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"You should have received a copy of the GNU General Public License\n"
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"along with this program; if not, write to the Free Software\n"
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n"
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"Alternatively, this software may be distributed under the terms of the\n"
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"BSD license.\n"
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"Redistribution and use in source and binary forms, with or without\n"
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"modification, are permitted provided that the following conditions are\n"
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"met:\n"
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"1. Redistributions of source code must retain the above copyright\n"
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"   notice, this list of conditions and the following disclaimer.\n"
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"2. Redistributions in binary form must reproduce the above copyright\n"
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"   notice, this list of conditions and the following disclaimer in the\n"
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"   documentation and/or other materials provided with the distribution.\n"
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"   names of its contributors may be used to endorse or promote products\n"
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"   derived from this software without specific prior written permission.\n"
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n"
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n";
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_ctrl *ctrl_conn;
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_ctrl *mon_conn;
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_quit = 0;
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_attached = 0;
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_connected = 0;
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_last_id = 0;
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_CTRL_IFACE_DIR
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define CONFIG_CTRL_IFACE_DIR "/var/run/wpa_supplicant"
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_DIR */
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *ctrl_iface_dir = CONFIG_CTRL_IFACE_DIR;
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char *ctrl_ifname = NULL;
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *pid_file = NULL;
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *action_file = NULL;
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int ping_interval = 5;
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int interactive = 0;
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void print_help(void);
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_mon_receive(int sock, void *eloop_ctx, void *sock_ctx);
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void usage(void)
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("wpa_cli [-p<path to ctrl sockets>] [-i<ifname>] [-hvB] "
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "[-a<action file>] \\\n"
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "        [-P<pid file>] [-g<global ctrl>] [-G<ping interval>]  "
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "[command..]\n"
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  -h = help (show this usage text)\n"
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  -v = shown version information\n"
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  -a = run in daemon mode executing the action file based on "
1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "events from\n"
1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "       wpa_supplicant\n"
1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  -B = run a daemon in the background\n"
1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  default path: " CONFIG_CTRL_IFACE_DIR "\n"
1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  default interface: first interface found in socket path\n");
1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	print_help();
1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int str_starts(const char *src, const char *match)
1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return os_strncmp(src, match, os_strlen(match)) == 0;
1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_show_event(const char *event)
1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *start;
1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	start = os_strchr(event, '>');
1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (start == NULL)
1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 1;
1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	start++;
1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/*
1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * Skip BSS added/removed events since they can be relatively frequent
1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * and are likely of not much use for an interactive user.
1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (str_starts(start, WPA_EVENT_BSS_ADDED) ||
1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	    str_starts(start, WPA_EVENT_BSS_REMOVED))
1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 1;
1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_open_connection(const char *ifname, int attach)
1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#if defined(CONFIG_CTRL_IFACE_UDP) || defined(CONFIG_CTRL_IFACE_NAMED_PIPE)
1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctrl_conn = wpa_ctrl_open(ifname);
1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL)
1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (attach && interactive)
1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		mon_conn = wpa_ctrl_open(ifname);
1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		mon_conn = NULL;
1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */
1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *cfile = NULL;
1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int flen, res;
1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ifname == NULL)
1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef ANDROID
1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (access(ctrl_iface_dir, F_OK) < 0) {
1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		cfile = os_strdup(ifname);
1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (cfile == NULL)
1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* ANDROID */
1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (cfile == NULL) {
1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		flen = os_strlen(ctrl_iface_dir) + os_strlen(ifname) + 2;
1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		cfile = os_malloc(flen);
1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (cfile == NULL)
1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cfile, flen, "%s/%s", ctrl_iface_dir,
1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  ifname);
1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (res < 0 || res >= flen) {
1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(cfile);
1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctrl_conn = wpa_ctrl_open(cfile);
1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL) {
1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(cfile);
1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (attach && interactive)
2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		mon_conn = wpa_ctrl_open(cfile);
2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		mon_conn = NULL;
2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(cfile);
2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */
2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (mon_conn) {
2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpa_ctrl_attach(mon_conn) == 0) {
2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_attached = 1;
2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (interactive)
2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				eloop_register_read_sock(
2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					wpa_ctrl_get_fd(mon_conn),
2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					wpa_cli_mon_receive, NULL, NULL);
2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Warning: Failed to attach to "
2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       "wpa_supplicant.\n");
2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_close_connection(void)
2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL)
2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_cli_attached) {
2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_ctrl_detach(interactive ? mon_conn : ctrl_conn);
2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_attached = 0;
2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_ctrl_close(ctrl_conn);
2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctrl_conn = NULL;
2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (mon_conn) {
2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		eloop_unregister_read_sock(wpa_ctrl_get_fd(mon_conn));
2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_ctrl_close(mon_conn);
2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		mon_conn = NULL;
2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_msg_cb(char *msg, size_t len)
2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("%s\n", msg);
2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int _wpa_ctrl_command(struct wpa_ctrl *ctrl, char *cmd, int print)
2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
253c97d8bf1d6959387a528c901eaf9c0bff47da853Dmitry Shmidt	char buf[4096];
2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret;
2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL) {
2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Not connected to wpa_supplicant - command dropped.\n");
2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = sizeof(buf) - 1;
2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len,
2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       wpa_cli_msg_cb);
2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret == -2) {
2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command timed out.\n", cmd);
2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -2;
2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (ret < 0) {
2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command failed.\n", cmd);
2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (print) {
2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		buf[len] = '\0';
2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("%s", buf);
2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (interactive && len > 0 && buf[len - 1] != '\n')
2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("\n");
2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_ctrl_command(struct wpa_ctrl *ctrl, char *cmd)
2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return _wpa_ctrl_command(ctrl, cmd, 1);
2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_status(struct wpa_ctrl *ctrl, int argc, char *argv[])
2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int verbose = argc > 0 && os_strcmp(argv[0], "verbose") == 0;
2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, verbose ? "STATUS-VERBOSE" : "STATUS");
2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ping(struct wpa_ctrl *ctrl, int argc, char *argv[])
2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "PING");
2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_relog(struct wpa_ctrl *ctrl, int argc, char *argv[])
3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "RELOG");
3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_note(struct wpa_ctrl *ctrl, int argc, char *argv[])
3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret;
3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0)
3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(cmd, sizeof(cmd), "NOTE %s", argv[0]);
3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || (size_t) ret >= sizeof(cmd))
3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_mib(struct wpa_ctrl *ctrl, int argc, char *argv[])
3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "MIB");
3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_pmksa(struct wpa_ctrl *ctrl, int argc, char *argv[])
3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "PMKSA");
3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_help(struct wpa_ctrl *ctrl, int argc, char *argv[])
3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	print_help();
3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_license(struct wpa_ctrl *ctrl, int argc, char *argv[])
3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("%s\n\n%s\n", wpa_cli_version, wpa_cli_full_license);
3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_quit(struct wpa_ctrl *ctrl, int argc, char *argv[])
3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_quit = 1;
3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (interactive)
3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		eloop_terminate();
3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_show_variables(void)
3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("set variables:\n"
3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  EAPOL::heldPeriod (EAPOL state machine held period, "
3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "in seconds)\n"
3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  EAPOL::authPeriod (EAPOL state machine authentication "
3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "period, in seconds)\n"
3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  EAPOL::startPeriod (EAPOL state machine start period, in "
3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "seconds)\n"
3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  EAPOL::maxStart (EAPOL state machine maximum start "
3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "attempts)\n");
3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("  dot11RSNAConfigPMKLifetime (WPA/WPA2 PMK lifetime in "
3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "seconds)\n"
3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  dot11RSNAConfigPMKReauthThreshold (WPA/WPA2 reauthentication"
3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       " threshold\n\tpercentage)\n"
3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  dot11RSNAConfigSATimeout (WPA/WPA2 timeout for completing "
3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "security\n\tassociation in seconds)\n");
3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_set(struct wpa_ctrl *ctrl, int argc, char *argv[])
3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0) {
3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_show_variables();
3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2) {
3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid SET command: needs two arguments (variable "
3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "name and value)\n");
3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "SET %s %s", argv[0], argv[1]);
3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long SET command.\n");
3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_get(struct wpa_ctrl *ctrl, int argc, char *argv[])
4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid GET command: need one argument (variable "
4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "name)\n");
4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "GET %s", argv[0]);
4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long GET command.\n");
4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_logoff(struct wpa_ctrl *ctrl, int argc, char *argv[])
4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "LOGOFF");
4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_logon(struct wpa_ctrl *ctrl, int argc, char *argv[])
4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "LOGON");
4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_reassociate(struct wpa_ctrl *ctrl, int argc,
4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "REASSOCIATE");
4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_preauthenticate(struct wpa_ctrl *ctrl, int argc,
4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid PREAUTH command: needs one argument "
4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(BSSID)\n");
4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "PREAUTH %s", argv[0]);
4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long PREAUTH command.\n");
4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ap_scan(struct wpa_ctrl *ctrl, int argc, char *argv[])
4608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
4628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
4638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid AP_SCAN command: needs one argument (ap_scan "
4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "value)\n");
4678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
4688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "AP_SCAN %s", argv[0]);
4708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
4718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long AP_SCAN command.\n");
4728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
4738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
4758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_scan_interval(struct wpa_ctrl *ctrl, int argc,
4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid SCAN_INTERVAL command: needs one argument "
4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "scan_interval value)\n");
4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "SCAN_INTERVAL %s", argv[0]);
4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long SCAN_INTERVAL command.\n");
4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
4948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
4958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bss_expire_age(struct wpa_ctrl *ctrl, int argc,
4998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
5008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
5058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid BSS_EXPIRE_AGE command: needs one argument "
5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(bss_expire_age value)\n");
5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "BSS_EXPIRE_AGE %s", argv[0]);
5108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long BSS_EXPIRE_AGE command.\n");
5128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bss_expire_count(struct wpa_ctrl *ctrl, int argc,
5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				        char *argv[])
5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid BSS_EXPIRE_COUNT command: needs one argument "
5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(bss_expire_count value)\n");
5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "BSS_EXPIRE_COUNT %s", argv[0]);
5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long BSS_EXPIRE_COUNT command.\n");
5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_stkstart(struct wpa_ctrl *ctrl, int argc,
5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				char *argv[])
5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid STKSTART command: needs one argument "
5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(Peer STA MAC address)\n");
5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "STKSTART %s", argv[0]);
5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long STKSTART command.\n");
5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ft_ds(struct wpa_ctrl *ctrl, int argc, char *argv[])
5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid FT_DS command: needs one argument "
5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(Target AP MAC address)\n");
5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "FT_DS %s", argv[0]);
5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long FT_DS command.\n");
5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_pbc(struct wpa_ctrl *ctrl, int argc, char *argv[])
5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0) {
5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Any BSSID */
5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_ctrl_command(ctrl, "WPS_PBC");
5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Specific BSSID */
5908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "WPS_PBC %s", argv[0]);
5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_PBC command.\n");
5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_pin(struct wpa_ctrl *ctrl, int argc, char *argv[])
6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0) {
6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_PIN command: need one or two arguments:\n"
6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- BSSID: use 'any' to select any\n"
6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- PIN: optional, used only with devices that have no "
6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "display\n");
6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 1) {
6138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* Use dynamically generated PIN (returned as reply) */
6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_PIN %s", argv[0]);
6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long WPS_PIN command.\n");
6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_ctrl_command(ctrl, cmd);
6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Use hardcoded PIN from a label */
6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "WPS_PIN %s %s", argv[0], argv[1]);
6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_PIN command.\n");
6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_check_pin(struct wpa_ctrl *ctrl, int argc,
6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1 && argc != 2) {
6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_CHECK_PIN command: needs one argument:\n"
6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- PIN to be verified\n");
6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 2)
6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_CHECK_PIN %s %s",
6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_CHECK_PIN %s",
6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0]);
6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_CHECK_PIN command.\n");
6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_cancel(struct wpa_ctrl *ctrl, int argc,
6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "WPS_CANCEL");
6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS_OOB
6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_oob(struct wpa_ctrl *ctrl, int argc, char *argv[])
6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 3 && argc != 4) {
6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_OOB command: need three or four "
6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments:\n"
6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- DEV_TYPE: use 'ufd' or 'nfc'\n"
6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- PATH: path of OOB device like '/mnt'\n"
6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- METHOD: OOB method 'pin-e' or 'pin-r', "
6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "'cred'\n"
6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- DEV_NAME: (only for NFC) device name like "
6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "'pn531'\n");
6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 3)
6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_OOB %s %s %s",
6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2]);
6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_OOB %s %s %s %s",
6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2], argv[3]);
6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_OOB command.\n");
6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS_OOB */
6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_reg(struct wpa_ctrl *ctrl, int argc, char *argv[])
6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 2)
7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_REG %s %s",
7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else if (argc == 5 || argc == 6) {
7078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char ssid_hex[2 * 32 + 1];
7088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char key_hex[2 * 64 + 1];
7098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int i;
7108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssid_hex[0] = '\0';
7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (i = 0; i < 32; i++) {
7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (argv[2][i] == '\0')
7148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
7158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_snprintf(&ssid_hex[i * 2], 3, "%02x", argv[2][i]);
7168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_hex[0] = '\0';
7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (argc == 6) {
7208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			for (i = 0; i < 64; i++) {
7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (argv[5][i] == '\0')
7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					break;
7238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				os_snprintf(&key_hex[i * 2], 3, "%02x",
7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    argv[5][i]);
7258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
7268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
7278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "WPS_REG %s %s %s %s %s %s",
7308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], ssid_hex, argv[3], argv[4],
7318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  key_hex);
7328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
7338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_REG command: need two arguments:\n"
7348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- BSSID of the target AP\n"
7358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- AP PIN\n");
7368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Alternatively, six arguments can be used to "
7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "reconfigure the AP:\n"
7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- BSSID of the target AP\n"
7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- AP PIN\n"
7408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new SSID\n"
7418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new auth (OPEN, WPAPSK, WPA2PSK)\n"
7428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new encr (NONE, WEP, TKIP, CCMP)\n"
7438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new key\n");
7448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
7458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_REG command.\n");
7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
7528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_ap_pin(struct wpa_ctrl *ctrl, int argc,
7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
7598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
7608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1) {
7628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_AP_PIN command: needs at least one "
7638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "argument\n");
7648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc > 2)
7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_AP_PIN %s %s %s",
7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2]);
7708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else if (argc > 1)
7718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_AP_PIN %s %s",
7728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
7738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
7748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_AP_PIN %s",
7758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0]);
7768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
7778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_AP_PIN command.\n");
7788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
7798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
7818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_start(struct wpa_ctrl *ctrl, int argc,
7858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    char *argv[])
7868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
7888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc > 0) {
7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(cmd, sizeof(cmd), "WPS_ER_START %s", argv[0]);
7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_ctrl_command(ctrl, cmd);
7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
7928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "WPS_ER_START");
7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
7968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_stop(struct wpa_ctrl *ctrl, int argc,
7978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
7988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "WPS_ER_STOP");
8008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_pin(struct wpa_ctrl *ctrl, int argc,
8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
8068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
8088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
8098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
8118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_ER_PIN command: need at least two "
8128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments:\n"
8138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- UUID: use 'any' to select any\n"
8148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- PIN: Enrollee PIN\n"
8158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "optional: - Enrollee MAC address\n");
8168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
8178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc > 2)
8208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_ER_PIN %s %s %s",
8218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2]);
8228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
8238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "WPS_ER_PIN %s %s",
8248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
8258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
8268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_ER_PIN command.\n");
8278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
8288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_pbc(struct wpa_ctrl *ctrl, int argc,
8348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
8358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
8378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
8388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
8408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_ER_PBC command: need one argument:\n"
8418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- UUID: Specify the Enrollee\n");
8428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
8438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "WPS_ER_PBC %s",
8468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0]);
8478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
8488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_ER_PBC command.\n");
8498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
8508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
8528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_learn(struct wpa_ctrl *ctrl, int argc,
8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    char *argv[])
8578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
8598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
8608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2) {
8628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_ER_LEARN command: need two arguments:\n"
8638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- UUID: specify which AP to use\n"
8648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- PIN: AP PIN\n");
8658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
8668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "WPS_ER_LEARN %s %s",
8698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
8708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
8718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_ER_LEARN command.\n");
8728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
8738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
8768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_set_config(struct wpa_ctrl *ctrl, int argc,
8798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 char *argv[])
8808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
8818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
8828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
8838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2) {
8858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_ER_SET_CONFIG command: need two "
8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments:\n"
8878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- UUID: specify which AP to use\n"
8888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- Network configuration id\n");
8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
8928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "WPS_ER_SET_CONFIG %s %s",
8938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
8948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
8958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_ER_SET_CONFIG command.\n");
8968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
8978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_config(struct wpa_ctrl *ctrl, int argc,
9038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
9048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
9068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
9078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 5 || argc == 6) {
9098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char ssid_hex[2 * 32 + 1];
9108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char key_hex[2 * 64 + 1];
9118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int i;
9128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ssid_hex[0] = '\0';
9148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (i = 0; i < 32; i++) {
9158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (argv[2][i] == '\0')
9168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
9178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_snprintf(&ssid_hex[i * 2], 3, "%02x", argv[2][i]);
9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
9198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		key_hex[0] = '\0';
9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (argc == 6) {
9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			for (i = 0; i < 64; i++) {
9238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (argv[5][i] == '\0')
9248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					break;
9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				os_snprintf(&key_hex[i * 2], 3, "%02x",
9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    argv[5][i]);
9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
9288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
9298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
9318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "WPS_ER_CONFIG %s %s %s %s %s %s",
9328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], ssid_hex, argv[3], argv[4],
9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  key_hex);
9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid WPS_ER_CONFIG command: need six arguments:\n"
9368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- AP UUID\n"
9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- AP PIN\n"
9388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new SSID\n"
9398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new auth (OPEN, WPAPSK, WPA2PSK)\n"
9408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new encr (NONE, WEP, TKIP, CCMP)\n"
9418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "- new key\n");
9428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
9468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long WPS_ER_CONFIG command.\n");
9478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
9508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ibss_rsn(struct wpa_ctrl *ctrl, int argc, char *argv[])
9548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
9568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
9578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
9598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid IBSS_RSN command: needs one argument "
9608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(Peer STA MAC address)\n");
9618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "IBSS_RSN %s", argv[0]);
9658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
9668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long IBSS_RSN command.\n");
9678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
9708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_level(struct wpa_ctrl *ctrl, int argc, char *argv[])
9748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
9768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
9778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid LEVEL command: needs one argument (debug "
9808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "level)\n");
9818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "LEVEL %s", argv[0]);
9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long LEVEL command.\n");
9868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
9888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_identity(struct wpa_ctrl *ctrl, int argc, char *argv[])
9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid IDENTITY command: needs two arguments "
9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and identity)\n");
10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "IDENTITY-%s:%s",
10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long IDENTITY command.\n");
10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long IDENTITY command.\n");
10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_password(struct wpa_ctrl *ctrl, int argc, char *argv[])
10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
10298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
10318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid PASSWORD command: needs two arguments "
10328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and password)\n");
10338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
10378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PASSWORD-%s:%s",
10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long PASSWORD command.\n");
10428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
10458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
10468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
10478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
10488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long PASSWORD command.\n");
10498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
10508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_new_password(struct wpa_ctrl *ctrl, int argc,
10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    char *argv[])
10608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
10618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid NEW_PASSWORD command: needs two arguments "
10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and password)\n");
10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "NEW_PASSWORD-%s:%s",
10738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long NEW_PASSWORD command.\n");
10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
10818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
10828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long NEW_PASSWORD command.\n");
10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
10858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
10868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
10878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
10898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
10908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_pin(struct wpa_ctrl *ctrl, int argc, char *argv[])
10938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
10948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
10958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
10968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
10988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid PIN command: needs two arguments "
10998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and pin)\n");
11008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PIN-%s:%s",
11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
11078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long PIN command.\n");
11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
11148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long PIN command.\n");
11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_otp(struct wpa_ctrl *ctrl, int argc, char *argv[])
11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid OTP command: needs two arguments (network "
11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "id and password)\n");
11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "OTP-%s:%s",
11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long OTP command.\n");
11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
11458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
11468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long OTP command.\n");
11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_passphrase(struct wpa_ctrl *ctrl, int argc,
11588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
11598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
11618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
11628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
11648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid PASSPHRASE command: needs two arguments "
11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and passphrase)\n");
11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PASSPHRASE-%s:%s",
11728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
11748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long PASSPHRASE command.\n");
11758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
11768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 2; i < argc; i++) {
11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long PASSPHRASE command.\n");
11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bssid(struct wpa_ctrl *ctrl, int argc, char *argv[])
11928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256], *pos, *end;
11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, ret;
11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid BSSID command: needs two arguments (network "
11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "id and BSSID)\n");
11998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = cmd + sizeof(cmd);
12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = os_snprintf(pos, end - pos, "BSSID");
12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
12068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long BSSID command.\n");
12078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos += ret;
12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; i < argc; i++) {
12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
12128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Too long BSSID command.\n");
12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
12158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos += ret;
12178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1223696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidtstatic int wpa_cli_cmd_blacklist(struct wpa_ctrl *ctrl, int argc, char *argv[])
1224696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt{
1225696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	char cmd[256], *pos, *end;
1226696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	int i, ret;
1227696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
1228696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	end = cmd + sizeof(cmd);
1229696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	pos = cmd;
1230696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	ret = os_snprintf(pos, end - pos, "BLACKLIST");
1231696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
1232696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt		printf("Too long BLACKLIST command.\n");
1233696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt		return -1;
1234696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	}
1235696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	pos += ret;
1236696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	for (i = 0; i < argc; i++) {
1237696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
1238696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
1239696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt			printf("Too long BLACKLIST command.\n");
1240696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt			return -1;
1241696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt		}
1242696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt		pos += ret;
1243696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	}
1244696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
1245696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
1246696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt}
1247696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
1248696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
1249696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidtstatic int wpa_cli_cmd_log_level(struct wpa_ctrl *ctrl, int argc, char *argv[])
1250696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt{
1251696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	char cmd[256], *pos, *end;
1252696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	int i, ret;
1253696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
1254696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	end = cmd + sizeof(cmd);
1255696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	pos = cmd;
1256696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	ret = os_snprintf(pos, end - pos, "LOG_LEVEL");
1257696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	if (ret < 0 || ret >= end - pos) {
1258696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt		printf("Too long LOG_LEVEL command.\n");
1259696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt		return -1;
1260696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	}
1261696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	pos += ret;
1262696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	for (i = 0; i < argc; i++) {
1263696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt		ret = os_snprintf(pos, end - pos, " %s", argv[i]);
1264696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt		if (ret < 0 || ret >= end - pos) {
1265696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt			printf("Too long LOG_LEVEL command.\n");
1266696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt			return -1;
1267696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt		}
1268696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt		pos += ret;
1269696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	}
1270696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
1271696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
1272696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt}
1273696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
1274696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt
12758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_list_networks(struct wpa_ctrl *ctrl, int argc,
12768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
12778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
12788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "LIST_NETWORKS");
12798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
12808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_select_network(struct wpa_ctrl *ctrl, int argc,
12838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
12848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[32];
12868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
12878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1) {
12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid SELECT_NETWORK command: needs one argument "
12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id)\n");
12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
12938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "SELECT_NETWORK %s", argv[0]);
12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
12988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
12998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
13008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_enable_network(struct wpa_ctrl *ctrl, int argc,
13048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
13058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[32];
13078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
13088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1) {
13108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid ENABLE_NETWORK command: needs one argument "
13118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id)\n");
13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "ENABLE_NETWORK %s", argv[0]);
13168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
13188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
13198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
13218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_disable_network(struct wpa_ctrl *ctrl, int argc,
13258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
13268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[32];
13288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
13298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1) {
13318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid DISABLE_NETWORK command: needs one argument "
13328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id)\n");
13338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
13348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "DISABLE_NETWORK %s", argv[0]);
13378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
13388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
13398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
13408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
13428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_add_network(struct wpa_ctrl *ctrl, int argc,
13468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
13478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "ADD_NETWORK");
13498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_remove_network(struct wpa_ctrl *ctrl, int argc,
13538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
13548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[32];
13568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
13578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1) {
13598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid REMOVE_NETWORK command: needs one argument "
13608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id)\n");
13618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
13628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
13638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "REMOVE_NETWORK %s", argv[0]);
13658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
13668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
13678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
13688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
13708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_show_network_variables(void)
13748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("set_network variables:\n"
13768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  ssid (network name, SSID)\n"
13778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  psk (WPA passphrase or pre-shared key)\n"
13788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  key_mgmt (key management protocol)\n"
13798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  identity (EAP identity)\n"
13808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  password (EAP password)\n"
13818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "  ...\n"
13828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "\n"
13838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "Note: Values are entered in the same format as the "
13848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "configuration file is using,\n"
13858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "i.e., strings values need to be inside double quotation "
13868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "marks.\n"
13878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "For example: set_network 1 ssid \"network name\"\n"
13888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "\n"
13898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "Please see wpa_supplicant.conf documentation for full list "
13908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	       "of\navailable variables.\n");
13918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
13928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_set_network(struct wpa_ctrl *ctrl, int argc,
13958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
13968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
13978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
13988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
13998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0) {
14018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_show_network_variables();
14028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
14038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 3) {
14068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid SET_NETWORK command: needs three arguments\n"
14078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id, variable name, and value)\n");
14088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
14098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "SET_NETWORK %s %s %s",
14128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1], argv[2]);
14138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
14148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long SET_NETWORK command.\n");
14158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
14168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
14188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_get_network(struct wpa_ctrl *ctrl, int argc,
14228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
14238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
14258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
14268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0) {
14288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_show_network_variables();
14298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
14308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2) {
14338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid GET_NETWORK command: needs two arguments\n"
14348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(network id and variable name)\n");
14358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
14368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "GET_NETWORK %s %s",
14398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
14408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
14418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long GET_NETWORK command.\n");
14428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
14438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
14458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_disconnect(struct wpa_ctrl *ctrl, int argc,
14498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
14508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "DISCONNECT");
14528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_reconnect(struct wpa_ctrl *ctrl, int argc,
14568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
14578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "RECONNECT");
14598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_save_config(struct wpa_ctrl *ctrl, int argc,
14638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
14648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "SAVE_CONFIG");
14668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_scan(struct wpa_ctrl *ctrl, int argc, char *argv[])
14708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "SCAN");
14728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_scan_results(struct wpa_ctrl *ctrl, int argc,
14768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    char *argv[])
14778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "SCAN_RESULTS");
14798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
14808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bss(struct wpa_ctrl *ctrl, int argc, char *argv[])
14838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
14848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[64];
14858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
14868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
14888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid BSS command: need one argument (index or "
14898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "BSSID)\n");
14908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
14918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
14928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "BSS %s", argv[0]);
14948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
14958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
14968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
14978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
14988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
14998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_get_capability(struct wpa_ctrl *ctrl, int argc,
15038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
15048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[64];
15068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
15078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1 || argc > 2) {
15098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid GET_CAPABILITY command: need either one or "
15108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "two arguments\n");
15118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
15128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if ((argc == 2) && os_strcmp(argv[1], "strict") != 0) {
15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid GET_CAPABILITY command: second argument, "
15168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "if any, must be 'strict'\n");
15178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
15188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "GET_CAPABILITY %s%s", argv[0],
15218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  (argc == 2) ? " strict" : "");
15228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
15238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
15248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
15258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
15278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_list_interfaces(struct wpa_ctrl *ctrl)
15318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("Available interfaces:\n");
15338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "INTERFACES");
15348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface(struct wpa_ctrl *ctrl, int argc, char *argv[])
15388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1) {
15408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_list_interfaces(ctrl);
15418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
15428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_close_connection();
15458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(ctrl_ifname);
15468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctrl_ifname = os_strdup(argv[0]);
15478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_cli_open_connection(ctrl_ifname, 1)) {
15498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Connected to interface '%s.\n", ctrl_ifname);
15508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
15518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Could not connect to interface '%s' - re-trying\n",
15528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       ctrl_ifname);
15538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
15558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_reconfigure(struct wpa_ctrl *ctrl, int argc,
15598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
15608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "RECONFIGURE");
15628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_terminate(struct wpa_ctrl *ctrl, int argc,
15668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 char *argv[])
15678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "TERMINATE");
15698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
15708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface_add(struct wpa_ctrl *ctrl, int argc,
15738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
15748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
15758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
15768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
15778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1) {
15798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid INTERFACE_ADD command: needs at least one "
15808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "argument (interface name)\n"
15818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "All arguments: ifname confname driver ctrl_interface "
15828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "driver_param bridge_name\n");
15838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
15848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
15858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
15868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/*
15878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * INTERFACE_ADD <ifname>TAB<confname>TAB<driver>TAB<ctrl_interface>TAB
15888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 * <driver_param>TAB<bridge_name>
15898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	 */
15908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd),
15918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  "INTERFACE_ADD %s\t%s\t%s\t%s\t%s\t%s",
15928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0],
15938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argc > 1 ? argv[1] : "", argc > 2 ? argv[2] : "",
15948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argc > 3 ? argv[3] : "", argc > 4 ? argv[4] : "",
15958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argc > 5 ? argv[5] : "");
15968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
15978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
15988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
15998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
16008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface_remove(struct wpa_ctrl *ctrl, int argc,
16048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					char *argv[])
16058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[128];
16078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
16088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
16108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid INTERFACE_REMOVE command: needs one argument "
16118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(interface name)\n");
16128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
16138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "INTERFACE_REMOVE %s", argv[0]);
16168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
16178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
16188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
16198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
16208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface_list(struct wpa_ctrl *ctrl, int argc,
16248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
16258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "INTERFACE_LIST");
16278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_AP
16318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_sta(struct wpa_ctrl *ctrl, int argc, char *argv[])
16328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char buf[64];
16348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
16358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid 'sta' command - exactly one argument, STA "
16368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "address, is required.\n");
16378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
16388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_snprintf(buf, sizeof(buf), "STA %s", argv[0]);
16408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, buf);
16418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_ctrl_command_sta(struct wpa_ctrl *ctrl, char *cmd,
16458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				char *addr, size_t addr_len)
16468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char buf[4096], *pos;
16488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
16498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret;
16508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL) {
16528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Not connected to hostapd - command dropped.\n");
16538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
16548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = sizeof(buf) - 1;
16568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = wpa_ctrl_request(ctrl, cmd, strlen(cmd), buf, &len,
16578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       wpa_cli_msg_cb);
16588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret == -2) {
16598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command timed out.\n", cmd);
16608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -2;
16618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (ret < 0) {
16628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command failed.\n", cmd);
16638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
16648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
16658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	buf[len] = '\0';
16678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (memcmp(buf, "FAIL", 4) == 0)
16688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
16698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("%s", buf);
16708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = buf;
16728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*pos != '\0' && *pos != '\n')
16738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos++;
16748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	*pos = '\0';
16758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_strlcpy(addr, buf, addr_len);
16768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
16778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_all_sta(struct wpa_ctrl *ctrl, int argc, char *argv[])
16818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char addr[32], cmd[64];
16838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_ctrl_command_sta(ctrl, "STA-FIRST", addr, sizeof(addr)))
16858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
16868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	do {
16878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(cmd, sizeof(cmd), "STA-NEXT %s", addr);
16888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} while (wpa_ctrl_command_sta(ctrl, cmd, addr, sizeof(addr)) == 0);
16898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
16918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_AP */
16938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
16958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_suspend(struct wpa_ctrl *ctrl, int argc, char *argv[])
16968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
16978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "SUSPEND");
16988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
16998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_resume(struct wpa_ctrl *ctrl, int argc, char *argv[])
17028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "RESUME");
17048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_drop_sa(struct wpa_ctrl *ctrl, int argc, char *argv[])
17088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "DROP_SA");
17108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_roam(struct wpa_ctrl *ctrl, int argc, char *argv[])
17148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[128];
17168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
17178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
17198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid ROAM command: needs one argument "
17208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(target AP's BSSID)\n");
17218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
17228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "ROAM %s", argv[0]);
17258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
17268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long ROAM command.\n");
17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
17308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P
17348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_find(struct wpa_ctrl *ctrl, int argc, char *argv[])
17368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[128];
17388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
17398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0)
17418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_ctrl_command(ctrl, "P2P_FIND");
17428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc > 1)
17448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_FIND %s %s",
17458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
17468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
17478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_FIND %s", argv[0]);
17488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
17498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
17508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
17518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
17528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_stop_find(struct wpa_ctrl *ctrl, int argc,
17568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
17578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_STOP_FIND");
17598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_connect(struct wpa_ctrl *ctrl, int argc,
17638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
17648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[128];
17668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
17678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 2) {
17698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_CONNECT command: needs at least two "
17708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments (address and pbc/PIN)\n");
17718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
17728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
17738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc > 4)
17758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
17768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_CONNECT %s %s %s %s %s",
17778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2], argv[3],
17788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[4]);
17798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else if (argc > 3)
17808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_CONNECT %s %s %s %s",
17818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2], argv[3]);
17828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else if (argc > 2)
17838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_CONNECT %s %s %s",
17848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2]);
17858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
17868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_CONNECT %s %s",
17878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
17888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
17898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
17908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
17918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
17928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
17938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
17958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_listen(struct wpa_ctrl *ctrl, int argc,
17968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
17978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
17988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[128];
17998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
18008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0)
18028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_ctrl_command(ctrl, "P2P_LISTEN");
18038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "P2P_LISTEN %s", argv[0]);
18058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
18068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
18078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
18088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
18098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_group_remove(struct wpa_ctrl *ctrl, int argc,
18138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					char *argv[])
18148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[128];
18168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
18178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
18198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_GROUP_REMOVE command: needs one argument "
18208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(interface name)\n");
18218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
18228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "P2P_GROUP_REMOVE %s", argv[0]);
18258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
18268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
18278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
18288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
18298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_group_add(struct wpa_ctrl *ctrl, int argc,
18338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					char *argv[])
18348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[128];
18368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
18378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 0)
18398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_ctrl_command(ctrl, "P2P_GROUP_ADD");
18408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1841c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt	if (argc > 1)
1842c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_GROUP_ADD %s %s",
1843c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt				  argv[0], argv[1]);
1844c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt	else
1845c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_GROUP_ADD %s",
1846c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt				  argv[0]);
18478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
18488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
18498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
18508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
18518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_prov_disc(struct wpa_ctrl *ctrl, int argc,
18558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
18568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[128];
18588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
18598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2) {
18618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_PROV_DISC command: needs two arguments "
18628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(address and config method\n"
18638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(display, keypad, or pbc)\n");
18648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
18658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "P2P_PROV_DISC %s %s",
18688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1]);
18698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
18708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
18718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
18728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
18738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_get_passphrase(struct wpa_ctrl *ctrl, int argc,
18778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  char *argv[])
18788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_GET_PASSPHRASE");
18808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
18818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_req(struct wpa_ctrl *ctrl, int argc,
18848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 char *argv[])
18858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
18868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[4096];
18878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
18888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2 && argc != 4) {
18908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SERV_DISC_REQ command: needs two "
18918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments (address and TLVs) or four arguments "
18928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(address, \"upnp\", version, search target "
18938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(SSDP ST:)\n");
18948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
18958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
18968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
18978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 4)
18988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
18998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_SERV_DISC_REQ %s %s %s %s",
19008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2], argv[3]);
19018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
19028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_SERV_DISC_REQ %s %s",
19038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
19048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
19058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
19078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
19088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_cancel_req(struct wpa_ctrl *ctrl,
19128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						int argc, char *argv[])
19138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[128];
19158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
19168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
19188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SERV_DISC_CANCEL_REQ command: needs one "
19198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "argument (pending request identifier)\n");
19208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "P2P_SERV_DISC_CANCEL_REQ %s",
19248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0]);
19258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
19268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
19288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
19298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_resp(struct wpa_ctrl *ctrl, int argc,
19338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  char *argv[])
19348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[4096];
19368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
19378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 4) {
19398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SERV_DISC_RESP command: needs four "
19408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments (freq, address, dialog token, and TLVs)\n");
19418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "P2P_SERV_DISC_RESP %s %s %s %s",
19458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0], argv[1], argv[2], argv[3]);
19468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
19478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
19498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
19508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_update(struct wpa_ctrl *ctrl, int argc,
19548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  char *argv[])
19558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_SERVICE_UPDATE");
19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_external(struct wpa_ctrl *ctrl,
19618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      int argc, char *argv[])
19628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[128];
19648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
19658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SERV_DISC_EXTERNAL command: needs one "
19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "argument (external processing: 0/1)\n");
19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "P2P_SERV_DISC_EXTERNAL %s",
19738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			  argv[0]);
19748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
19758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
19778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
19788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_flush(struct wpa_ctrl *ctrl, int argc,
19828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 char *argv[])
19838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_SERVICE_FLUSH");
19858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
19868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_add(struct wpa_ctrl *ctrl, int argc,
19898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
19908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
19918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[4096];
19928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
19938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
19948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 3 && argc != 4) {
19958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SERVICE_ADD command: needs three or four "
19968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments\n");
19978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
19988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
19998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 4)
20018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
20028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_SERVICE_ADD %s %s %s %s",
20038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2], argv[3]);
20048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
20058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
20068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_SERVICE_ADD %s %s %s",
20078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2]);
20088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
20098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
20108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
20118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
20128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_del(struct wpa_ctrl *ctrl, int argc,
20168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
20178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
20188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[4096];
20198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
20208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2 && argc != 3) {
20228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SERVICE_DEL command: needs two or three "
20238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "arguments\n");
20248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
20258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
20268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 3)
20288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
20298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_SERVICE_DEL %s %s %s",
20308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2]);
20318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
20328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
20338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_SERVICE_DEL %s %s",
20348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
20358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
20368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
20378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
20388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
20398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_reject(struct wpa_ctrl *ctrl,
20438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  int argc, char *argv[])
20448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
20458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[128];
20468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
20478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
20498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_REJECT command: needs one argument "
20508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(peer address)\n");
20518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
20528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
20538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "P2P_REJECT %s", argv[0]);
20558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
20568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
20578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
20588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
20598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_invite(struct wpa_ctrl *ctrl,
20638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  int argc, char *argv[])
20648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
20658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[128];
20668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
20678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc < 1) {
20698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_INVITE command: needs at least one "
20708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "argument\n");
20718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
20728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
20738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc > 2)
20758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_INVITE %s %s %s",
20768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2]);
20778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else if (argc > 1)
20788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_INVITE %s %s",
20798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
20808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
20818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_INVITE %s", argv[0]);
20828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
20838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
20848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
20858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
20868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
20878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
20898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_peer(struct wpa_ctrl *ctrl, int argc, char *argv[])
20908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
20918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char buf[64];
20928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
20938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid 'p2p_peer' command - exactly one argument, "
20948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "P2P peer device address, is required.\n");
20958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
20968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
20978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_snprintf(buf, sizeof(buf), "P2P_PEER %s", argv[0]);
20988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, buf);
20998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_ctrl_command_p2p_peer(struct wpa_ctrl *ctrl, char *cmd,
21038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *addr, size_t addr_len,
21048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     int discovered)
21058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char buf[4096], *pos;
21078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
21088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret;
21098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL)
21118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
21128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = sizeof(buf) - 1;
21138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = wpa_ctrl_request(ctrl, cmd, strlen(cmd), buf, &len,
21148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       wpa_cli_msg_cb);
21158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret == -2) {
21168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command timed out.\n", cmd);
21178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -2;
21188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (ret < 0) {
21198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("'%s' command failed.\n", cmd);
21208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
21218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
21228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	buf[len] = '\0';
21248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (memcmp(buf, "FAIL", 4) == 0)
21258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
21268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = buf;
21288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (*pos != '\0' && *pos != '\n')
21298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos++;
21308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	*pos++ = '\0';
21318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_strlcpy(addr, buf, addr_len);
21328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!discovered || os_strstr(pos, "[PROBE_REQ_ONLY]") == NULL)
21338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("%s\n", addr);
21348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
21358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_peers(struct wpa_ctrl *ctrl, int argc, char *argv[])
21398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char addr[32], cmd[64];
21418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int discovered;
21428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	discovered = argc > 0 && os_strcmp(argv[0], "discovered") == 0;
21448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_ctrl_command_p2p_peer(ctrl, "P2P_PEER FIRST",
21468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      addr, sizeof(addr), discovered))
21478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
21488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	do {
21498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_snprintf(cmd, sizeof(cmd), "P2P_PEER NEXT-%s", addr);
21508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} while (wpa_ctrl_command_p2p_peer(ctrl, cmd, addr, sizeof(addr),
21518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			 discovered) == 0);
21528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
21548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_set(struct wpa_ctrl *ctrl, int argc, char *argv[])
21588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
21608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
21618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 2) {
21638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_SET command: needs two arguments (field, "
21648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "value)\n");
21658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
21668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
21678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "P2P_SET %s %s", argv[0], argv[1]);
21698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
21708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
21718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
21728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
21738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_flush(struct wpa_ctrl *ctrl, int argc, char *argv[])
21778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_FLUSH");
21798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_cancel(struct wpa_ctrl *ctrl, int argc,
21838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
21848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "P2P_CANCEL");
21868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
21878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_unauthorize(struct wpa_ctrl *ctrl, int argc,
21908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
21918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
21928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
21938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
21948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
21958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
21968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_UNAUTHORIZE command: needs one argument "
21978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(peer address)\n");
21988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
21998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
22008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "P2P_UNAUTHORIZE %s", argv[0]);
22028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
22048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
22058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
22078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
22088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
22098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_presence_req(struct wpa_ctrl *ctrl, int argc,
22128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					char *argv[])
22138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
22148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
22158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
22168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 0 && argc != 2 && argc != 4) {
22188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_PRESENCE_REQ command: needs two arguments "
22198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(preferred duration, interval; in microsecods).\n"
22208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "Optional second pair can be used to provide "
22218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "acceptable values.\n");
22228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
22238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
22248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 4)
22268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd),
22278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  "P2P_PRESENCE_REQ %s %s %s %s",
22288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1], argv[2], argv[3]);
22298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else if (argc == 2)
22308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_PRESENCE_REQ %s %s",
22318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
22328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
22338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_PRESENCE_REQ");
22348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
22358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
22368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
22378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
22388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
22398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_ext_listen(struct wpa_ctrl *ctrl, int argc,
22428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      char *argv[])
22438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
22448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[100];
22458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
22468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 0 && argc != 2) {
22488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid P2P_EXT_LISTEN command: needs two arguments "
22498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(availability period, availability interval; in "
22508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "millisecods).\n"
22518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "Extended Listen Timing can be cancelled with this "
22528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "command when used without parameters.\n");
22538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
22548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
22558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc == 2)
22578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_EXT_LISTEN %s %s",
22588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  argv[0], argv[1]);
22598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
22608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = os_snprintf(cmd, sizeof(cmd), "P2P_EXT_LISTEN");
22618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd))
22628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
22638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
22648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
22658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
22668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */
22688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_sta_autoconnect(struct wpa_ctrl *ctrl, int argc,
22718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       char *argv[])
22728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
22738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
22748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
22758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
22778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid STA_AUTOCONNECT command: needs one argument "
22788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(0/1 = disable/enable automatic reconnection)\n");
22798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
22808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
22818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "STA_AUTOCONNECT %s", argv[0]);
22828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
22838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long STA_AUTOCONNECT command.\n");
22848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
22858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
22868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
22878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
22888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_tdls_discover(struct wpa_ctrl *ctrl, int argc,
22918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
22928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
22938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
22948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
22958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
22968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
22978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid TDLS_DISCOVER command: needs one argument "
22988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(Peer STA MAC address)\n");
22998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
23008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
23018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "TDLS_DISCOVER %s", argv[0]);
23038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
23048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long TDLS_DISCOVER command.\n");
23058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
23068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
23078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
23088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_tdls_setup(struct wpa_ctrl *ctrl, int argc,
23128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  char *argv[])
23138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
23148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
23158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
23168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
23188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid TDLS_SETUP command: needs one argument "
23198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(Peer STA MAC address)\n");
23208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
23218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
23228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "TDLS_SETUP %s", argv[0]);
23248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
23258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long TDLS_SETUP command.\n");
23268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
23278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
23288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
23298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_tdls_teardown(struct wpa_ctrl *ctrl, int argc,
23338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     char *argv[])
23348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
23358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char cmd[256];
23368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
23378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc != 1) {
23398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Invalid TDLS_TEARDOWN command: needs one argument "
23408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "(Peer STA MAC address)\n");
23418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
23428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
23438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, sizeof(cmd), "TDLS_TEARDOWN %s", argv[0]);
23458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= sizeof(cmd) - 1) {
23468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Too long TDLS_TEARDOWN command.\n");
23478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
23488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
23498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
23508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_signal_poll(struct wpa_ctrl *ctrl, int argc,
23548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   char *argv[])
23558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
23568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_ctrl_command(ctrl, "SIGNAL_POLL");
23578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
23588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23600716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidtstatic int wpa_cli_cmd_driver(struct wpa_ctrl *ctrl, int argc, char *argv[])
23610716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt{
23620716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	char cmd[256];
23630716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	int i;
23640716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	int len;
23650716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt
23660716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	if (argc < 1) {
23670716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt		printf("Invalid DRIVER command: needs one argument (cmd)\n");
23680716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt		return -1;
23690716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	}
23700716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt
23710716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	len = os_snprintf(cmd, sizeof(cmd), "DRIVER %s", argv[0]);
23720716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	for (i=1; i < argc; i++)
23730716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt		len += os_snprintf(cmd + len, sizeof(cmd) - len, " %s", argv[i]);
23740716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	cmd[sizeof(cmd) - 1] = '\0';
23750716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	printf("%s: %s\n", __func__, cmd);
23760716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	return wpa_ctrl_command(ctrl, cmd);
23770716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt}
23780716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt
23790716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt
23808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtenum wpa_cli_cmd_flags {
23818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cli_cmd_flag_none		= 0x00,
23828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cli_cmd_flag_sensitive		= 0x01
23838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
23848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpa_cli_cmd {
23868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *cmd;
23878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int (*handler)(struct wpa_ctrl *ctrl, int argc, char *argv[]);
23888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	enum wpa_cli_cmd_flags flags;
23898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *usage;
23908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
23918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
23928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_cli_cmd wpa_cli_commands[] = {
23938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "status", wpa_cli_cmd_status,
23948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
23958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[verbose] = get current WPA/EAPOL/EAP status" },
23968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "ping", wpa_cli_cmd_ping,
23978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
23988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= pings wpa_supplicant" },
23998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "relog", wpa_cli_cmd_relog,
24008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= re-open log-file (allow rolling logs)" },
24028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "note", wpa_cli_cmd_note,
24038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<text> = add a note to wpa_supplicant debug log" },
24058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "mib", wpa_cli_cmd_mib,
24068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get MIB variables (dot1x, dot11)" },
24088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "help", wpa_cli_cmd_help,
24098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= show this usage help" },
24118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "interface", wpa_cli_cmd_interface,
24128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[ifname] = show interfaces/select interface" },
24148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "level", wpa_cli_cmd_level,
24158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<debug level> = change debug level" },
24178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "license", wpa_cli_cmd_license,
24188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= show full wpa_cli license" },
24208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "quit", wpa_cli_cmd_quit,
24218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= exit wpa_cli" },
24238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "set", wpa_cli_cmd_set,
24248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= set variables (shows list of variables when run without "
24268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "arguments)" },
24278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "get", wpa_cli_cmd_get,
24288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<name> = get information" },
24308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "logon", wpa_cli_cmd_logon,
24318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= IEEE 802.1X EAPOL state machine logon" },
24338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "logoff", wpa_cli_cmd_logoff,
24348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= IEEE 802.1X EAPOL state machine logoff" },
24368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "pmksa", wpa_cli_cmd_pmksa,
24378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= show PMKSA cache" },
24398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "reassociate", wpa_cli_cmd_reassociate,
24408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= force reassociation" },
24428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "preauthenticate", wpa_cli_cmd_preauthenticate,
24438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<BSSID> = force preauthentication" },
24458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "identity", wpa_cli_cmd_identity,
24468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <identity> = configure identity for an SSID" },
24488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "password", wpa_cli_cmd_password,
24498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
24508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <password> = configure password for an SSID" },
24518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "new_password", wpa_cli_cmd_new_password,
24528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
24538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <password> = change password for an SSID" },
24548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "pin", wpa_cli_cmd_pin,
24558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
24568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <pin> = configure pin for an SSID" },
24578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "otp", wpa_cli_cmd_otp,
24588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
24598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <password> = configure one-time-password for an SSID"
24608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	},
24618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "passphrase", wpa_cli_cmd_passphrase,
24628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
24638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <passphrase> = configure private key passphrase\n"
24648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  for an SSID" },
24658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "bssid", wpa_cli_cmd_bssid,
24668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <BSSID> = set preferred BSSID for an SSID" },
2468696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	{ "blacklist", wpa_cli_cmd_blacklist,
2469696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  cli_cmd_flag_none,
2470696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  "<BSSID> = add a BSSID to the blacklist\n"
2471696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  "blacklist clear = clear the blacklist\n"
2472696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  "blacklist = display the blacklist" },
2473696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	{ "log_level", wpa_cli_cmd_log_level,
2474696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  cli_cmd_flag_none,
2475696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  "<level> [<timestamp>] = update the log level/timestamp of wpa_supplicant\n"
2476696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt	  "log_level = display the current log level and log options" },
24778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "list_networks", wpa_cli_cmd_list_networks,
24788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= list configured networks" },
24808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "select_network", wpa_cli_cmd_select_network,
24818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> = select a network (disable others)" },
24838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "enable_network", wpa_cli_cmd_enable_network,
24848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> = enable a network" },
24868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "disable_network", wpa_cli_cmd_disable_network,
24878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> = disable a network" },
24898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "add_network", wpa_cli_cmd_add_network,
24908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= add a network" },
24928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "remove_network", wpa_cli_cmd_remove_network,
24938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
24948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> = remove a network" },
24958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "set_network", wpa_cli_cmd_set_network,
24968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
24978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <variable> <value> = set network variables (shows\n"
24988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  list of variables when run without arguments)" },
24998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "get_network", wpa_cli_cmd_get_network,
25008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<network id> <variable> = get network variables" },
25028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "save_config", wpa_cli_cmd_save_config,
25038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= save the current configuration" },
25058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "disconnect", wpa_cli_cmd_disconnect,
25068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= disconnect and wait for reassociate/reconnect command before\n"
25088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  connecting" },
25098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "reconnect", wpa_cli_cmd_reconnect,
25108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= like reassociate, but only takes effect if already disconnected"
25128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	},
25138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "scan", wpa_cli_cmd_scan,
25148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= request new BSS scan" },
25168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "scan_results", wpa_cli_cmd_scan_results,
25178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get latest scan results" },
25198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "bss", wpa_cli_cmd_bss,
25208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<<idx> | <bssid>> = get detailed scan result info" },
25228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "get_capability", wpa_cli_cmd_get_capability,
25238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<eap/pairwise/group/key_mgmt/proto/auth_alg> = get capabilies" },
25258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "reconfigure", wpa_cli_cmd_reconfigure,
25268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= force wpa_supplicant to re-read its configuration file" },
25288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "terminate", wpa_cli_cmd_terminate,
25298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= terminate wpa_supplicant" },
25318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "interface_add", wpa_cli_cmd_interface_add,
25328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<ifname> <confname> <driver> <ctrl_interface> <driver_param>\n"
25348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  <bridge_name> = adds new interface, all parameters but <ifname>\n"
25358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "  are optional" },
25368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "interface_remove", wpa_cli_cmd_interface_remove,
25378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<ifname> = removes the interface" },
25398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "interface_list", wpa_cli_cmd_interface_list,
25408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= list available interfaces" },
25428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "ap_scan", wpa_cli_cmd_ap_scan,
25438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<value> = set ap_scan parameter" },
25458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "scan_interval", wpa_cli_cmd_scan_interval,
25468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<value> = set scan_interval parameter (in seconds)" },
25488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "bss_expire_age", wpa_cli_cmd_bss_expire_age,
25498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<value> = set BSS expiration age parameter" },
25518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "bss_expire_count", wpa_cli_cmd_bss_expire_count,
25528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<value> = set BSS expiration scan count parameter" },
25548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "stkstart", wpa_cli_cmd_stkstart,
25558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request STK negotiation with <addr>" },
25578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "ft_ds", wpa_cli_cmd_ft_ds,
25588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request over-the-DS FT with <addr>" },
25608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_pbc", wpa_cli_cmd_wps_pbc,
25618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[BSSID] = start Wi-Fi Protected Setup: Push Button Configuration" },
25638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_pin", wpa_cli_cmd_wps_pin,
25648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
25658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<BSSID> [PIN] = start WPS PIN method (returns PIN, if not "
25668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "hardcoded)" },
25678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_check_pin", wpa_cli_cmd_wps_check_pin,
25688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
25698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<PIN> = verify PIN checksum" },
25708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_cancel", wpa_cli_cmd_wps_cancel, cli_cmd_flag_none,
25718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "Cancels the pending WPS operation" },
25728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS_OOB
25738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_oob", wpa_cli_cmd_wps_oob,
25748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
25758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<DEV_TYPE> <PATH> <METHOD> [DEV_NAME] = start WPS OOB" },
25768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS_OOB */
25778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_reg", wpa_cli_cmd_wps_reg,
25788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
25798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<BSSID> <AP PIN> = start WPS Registrar to configure an AP" },
25808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_ap_pin", wpa_cli_cmd_wps_ap_pin,
25818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
25828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[params..] = enable/disable AP PIN" },
25838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_er_start", wpa_cli_cmd_wps_er_start,
25848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[IP address] = start Wi-Fi Protected Setup External Registrar" },
25868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_er_stop", wpa_cli_cmd_wps_er_stop,
25878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= stop Wi-Fi Protected Setup External Registrar" },
25898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_er_pin", wpa_cli_cmd_wps_er_pin,
25908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
25918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> <PIN> = add an Enrollee PIN to External Registrar" },
25928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_er_pbc", wpa_cli_cmd_wps_er_pbc,
25938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
25948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> = accept an Enrollee PBC using External Registrar" },
25958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_er_learn", wpa_cli_cmd_wps_er_learn,
25968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
25978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> <PIN> = learn AP configuration" },
25988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_er_set_config", wpa_cli_cmd_wps_er_set_config,
25998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> <network id> = set AP configuration for enrolling" },
26018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "wps_er_config", wpa_cli_cmd_wps_er_config,
26028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_sensitive,
26038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<UUID> <PIN> <SSID> <auth> <encr> <key> = configure AP" },
26048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "ibss_rsn", wpa_cli_cmd_ibss_rsn,
26058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request RSN authentication with <addr> in IBSS" },
26078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_AP
26088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "sta", wpa_cli_cmd_sta,
26098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = get information about an associated station (AP)" },
26118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "all_sta", wpa_cli_cmd_all_sta,
26128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get information about all associated stations (AP)" },
26148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_AP */
26158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "suspend", wpa_cli_cmd_suspend, cli_cmd_flag_none,
26168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= notification of suspend/hibernate" },
26178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "resume", wpa_cli_cmd_resume, cli_cmd_flag_none,
26188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= notification of resume/thaw" },
26198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "drop_sa", wpa_cli_cmd_drop_sa, cli_cmd_flag_none,
26208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= drop SA without deauth/disassoc (test command)" },
26218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "roam", wpa_cli_cmd_roam,
26228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = roam to the specified BSS" },
26248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P
26258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_find", wpa_cli_cmd_p2p_find, cli_cmd_flag_none,
26268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[timeout] [type=*] = find P2P Devices for up-to timeout seconds" },
26278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_stop_find", wpa_cli_cmd_p2p_stop_find, cli_cmd_flag_none,
26288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= stop P2P Devices search" },
26298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_connect", wpa_cli_cmd_p2p_connect, cli_cmd_flag_none,
26308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> <\"pbc\"|PIN> = connect to a P2P Devices" },
26318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_listen", wpa_cli_cmd_p2p_listen, cli_cmd_flag_none,
26328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[timeout] = listen for P2P Devices for up-to timeout seconds" },
26338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_group_remove", wpa_cli_cmd_p2p_group_remove, cli_cmd_flag_none,
26348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<ifname> = remove P2P group interface (terminate group if GO)" },
26358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_group_add", wpa_cli_cmd_p2p_group_add, cli_cmd_flag_none,
26368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= add a new P2P group (local end as GO)" },
26378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_prov_disc", wpa_cli_cmd_p2p_prov_disc, cli_cmd_flag_none,
26388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> <method> = request provisioning discovery" },
26398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_get_passphrase", wpa_cli_cmd_p2p_get_passphrase,
26408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get the passphrase for a group (GO only)" },
26428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_serv_disc_req", wpa_cli_cmd_p2p_serv_disc_req,
26438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> <TLVs> = schedule service discovery request" },
26458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_serv_disc_cancel_req", wpa_cli_cmd_p2p_serv_disc_cancel_req,
26468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<id> = cancel pending service discovery request" },
26488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_serv_disc_resp", wpa_cli_cmd_p2p_serv_disc_resp,
26498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<freq> <addr> <dialog token> <TLVs> = service discovery response" },
26518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_service_update", wpa_cli_cmd_p2p_service_update,
26528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= indicate change in local services" },
26548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_serv_disc_external", wpa_cli_cmd_p2p_serv_disc_external,
26558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<external> = set external processing of service discovery" },
26578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_service_flush", wpa_cli_cmd_p2p_service_flush,
26588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= remove all stored service entries" },
26608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_service_add", wpa_cli_cmd_p2p_service_add,
26618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<bonjour|upnp> <query|version> <response|service> = add a local "
26638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "service" },
26648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_service_del", wpa_cli_cmd_p2p_service_del,
26658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<bonjour|upnp> <query|version> [|service] = remove a local "
26678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "service" },
26688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_reject", wpa_cli_cmd_p2p_reject,
26698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = reject connection attempts from a specific peer" },
26718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_invite", wpa_cli_cmd_p2p_invite,
26728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<cmd> [peer=addr] = invite peer" },
26748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_peers", wpa_cli_cmd_p2p_peers, cli_cmd_flag_none,
26758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[discovered] = list known (optionally, only fully discovered) P2P "
26768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "peers" },
26778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_peer", wpa_cli_cmd_p2p_peer, cli_cmd_flag_none,
26788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<address> = show information about known P2P peer" },
26798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_set", wpa_cli_cmd_p2p_set, cli_cmd_flag_none,
26808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<field> <value> = set a P2P parameter" },
26818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_flush", wpa_cli_cmd_p2p_flush, cli_cmd_flag_none,
26828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= flush P2P state" },
26838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_cancel", wpa_cli_cmd_p2p_cancel, cli_cmd_flag_none,
26848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= cancel P2P group formation" },
26858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_unauthorize", wpa_cli_cmd_p2p_unauthorize, cli_cmd_flag_none,
26868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<address> = unauthorize a peer" },
26878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_presence_req", wpa_cli_cmd_p2p_presence_req, cli_cmd_flag_none,
26888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[<duration> <interval>] [<duration> <interval>] = request GO "
26898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "presence" },
26908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "p2p_ext_listen", wpa_cli_cmd_p2p_ext_listen, cli_cmd_flag_none,
26918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "[<period> <interval>] = set extended listen timing" },
26928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */
26938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "sta_autoconnect", wpa_cli_cmd_sta_autoconnect, cli_cmd_flag_none,
26948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<0/1> = disable/enable automatic reconnection" },
26958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "tdls_discover", wpa_cli_cmd_tdls_discover,
26968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
26978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request TDLS discovery with <addr>" },
26988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "tdls_setup", wpa_cli_cmd_tdls_setup,
26998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = request TDLS setup with <addr>" },
27018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "tdls_teardown", wpa_cli_cmd_tdls_teardown,
27028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "<addr> = tear down TDLS with <addr>" },
27048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ "signal_poll", wpa_cli_cmd_signal_poll,
27058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  cli_cmd_flag_none,
27068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	  "= get signal parameters" },
27070716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	{ "driver", wpa_cli_cmd_driver,
27080716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	  cli_cmd_flag_none,
27090716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt	  "<command> = driver private commands" },
27108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	{ NULL, NULL, cli_cmd_flag_none, NULL }
27118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
27128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
27158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Prints command usage, lines are padded with the specified string.
27168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
27178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void print_cmd_help(struct wpa_cli_cmd *cmd, const char *pad)
27188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char c;
27208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t n;
27218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("%s%s ", pad, cmd->cmd);
27238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (n = 0; (c = cmd->usage[n]); n++) {
27248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("%c", c);
27258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (c == '\n')
27268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("%s", pad);
27278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
27288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("\n");
27298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void print_help(void)
27338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int n;
27358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("commands:\n");
27368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (n = 0; wpa_cli_commands[n].cmd; n++)
27378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		print_cmd_help(&wpa_cli_commands[n], "  ");
27388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_edit_filter_history_cb(void *ctx, const char *cmd)
27428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *c, *delim;
27448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int n;
27458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
27468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	delim = os_strchr(cmd, ' ');
27488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (delim)
27498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		len = delim - cmd;
27508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
27518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		len = os_strlen(cmd);
27528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (n = 0; (c = wpa_cli_commands[n].cmd); n++) {
27548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strncasecmp(cmd, c, len) == 0 && len == os_strlen(c))
27558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return (wpa_cli_commands[n].flags &
27568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				cli_cmd_flag_sensitive);
27578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
27588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
27598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char ** wpa_list_cmd_list(void)
27638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **res;
27658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i, count;
27668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	count = sizeof(wpa_cli_commands) / sizeof(wpa_cli_commands[0]);
27688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_zalloc(count * sizeof(char *));
27698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res == NULL)
27708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
27718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; wpa_cli_commands[i].cmd; i++) {
27738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res[i] = os_strdup(wpa_cli_commands[i].cmd);
27748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (res[i] == NULL)
27758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
27768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
27778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return res;
27798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char ** wpa_cli_cmd_completion(const char *cmd, const char *str,
27838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      int pos)
27848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
27858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int i;
27868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (i = 0; wpa_cli_commands[i].cmd; i++) {
27888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcasecmp(wpa_cli_commands[i].cmd, cmd) == 0) {
27898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			edit_clear_line();
27908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("\r%s\n", wpa_cli_commands[i].usage);
27918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			edit_redraw();
27928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
27938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
27948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
27958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
27978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
27988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
27998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char ** wpa_cli_edit_completion_cb(void *ctx, const char *str, int pos)
28018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
28028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char **res;
28038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *end;
28048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *cmd;
28058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	end = os_strchr(str, ' ');
28078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (end == NULL || str + pos < end)
28088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_list_cmd_list();
28098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd = os_malloc(pos + 1);
28118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (cmd == NULL)
28128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
28138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_memcpy(cmd, str, pos);
28148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[end - str] = '\0';
28158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = wpa_cli_cmd_completion(cmd, str, pos);
28168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(cmd);
28178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return res;
28188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
28198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_request(struct wpa_ctrl *ctrl, int argc, char *argv[])
28228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
28238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_cli_cmd *cmd, *match = NULL;
28248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int count;
28258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret = 0;
28268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	count = 0;
28288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd = wpa_cli_commands;
28298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (cmd->cmd) {
28308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strncasecmp(cmd->cmd, argv[0], os_strlen(argv[0])) == 0)
28318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		{
28328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			match = cmd;
28338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (os_strcasecmp(cmd->cmd, argv[0]) == 0) {
28348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				/* we have an exact match */
28358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				count = 1;
28368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
28378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
28388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			count++;
28398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
28408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		cmd++;
28418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
28428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (count > 1) {
28448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Ambiguous command '%s'; possible commands:", argv[0]);
28458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		cmd = wpa_cli_commands;
28468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		while (cmd->cmd) {
28478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (os_strncasecmp(cmd->cmd, argv[0],
28488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   os_strlen(argv[0])) == 0) {
28498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				printf(" %s", cmd->cmd);
28508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
28518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			cmd++;
28528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
28538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("\n");
28548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = 1;
28558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (count == 0) {
28568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Unknown command '%s'\n", argv[0]);
28578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = 1;
28588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
28598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = match->handler(ctrl, argc - 1, &argv[1]);
28608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
28618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return ret;
28638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
28648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int str_match(const char *a, const char *b)
28678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
28688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return os_strncmp(a, b, os_strlen(b)) == 0;
28698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
28708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_exec(const char *program, const char *arg1,
28738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			const char *arg2)
28748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
28758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *cmd;
28768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
28778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int res;
28788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret = 0;
28798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = os_strlen(program) + os_strlen(arg1) + os_strlen(arg2) + 3;
28818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd = os_malloc(len);
28828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (cmd == NULL)
28838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
28848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	res = os_snprintf(cmd, len, "%s %s %s", program, arg1, arg2);
28858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (res < 0 || (size_t) res >= len) {
28868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_free(cmd);
28878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
28888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
28898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	cmd[len - 1] = '\0';
28908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef _WIN32_WCE
28918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (system(cmd) < 0)
28928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = -1;
28938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _WIN32_WCE */
28948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(cmd);
28958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return ret;
28978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
28988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
28998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_action_process(const char *msg)
29018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *pos;
29038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *copy = NULL, *id, *pos2;
29048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = msg;
29068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (*pos == '<') {
29078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/* skip priority */
29088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos = os_strchr(pos, '>');
29098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos)
29108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos++;
29118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else
29128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos = msg;
29138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
29148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (str_match(pos, WPA_EVENT_CONNECTED)) {
29168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int new_id = -1;
29178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_unsetenv("WPA_ID");
29188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_unsetenv("WPA_ID_STR");
29198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_unsetenv("WPA_CTRL_DIR");
29208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos = os_strstr(pos, "[id=");
29228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos)
29238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			copy = os_strdup(pos + 4);
29248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (copy) {
29268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos2 = id = copy;
29278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			while (*pos2 && *pos2 != ' ')
29288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos2++;
29298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*pos2++ = '\0';
29308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			new_id = atoi(id);
29318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_setenv("WPA_ID", id, 1);
29328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			while (*pos2 && *pos2 != '=')
29338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos2++;
29348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (*pos2 == '=')
29358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos2++;
29368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			id = pos2;
29378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			while (*pos2 && *pos2 != ']')
29388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos2++;
29398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*pos2 = '\0';
29408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_setenv("WPA_ID_STR", id, 1);
29418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(copy);
29428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
29438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_setenv("WPA_CTRL_DIR", ctrl_iface_dir, 1);
29458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!wpa_cli_connected || new_id != wpa_cli_last_id) {
29478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_connected = 1;
29488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_last_id = new_id;
29498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_exec(action_file, ctrl_ifname, "CONNECTED");
29508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
29518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, WPA_EVENT_DISCONNECTED)) {
29528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpa_cli_connected) {
29538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_connected = 0;
29548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_exec(action_file, ctrl_ifname, "DISCONNECTED");
29558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
29568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, P2P_EVENT_GROUP_STARTED)) {
29578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
29588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, P2P_EVENT_GROUP_REMOVED)) {
29598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
29608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, P2P_EVENT_CROSS_CONNECT_ENABLE)) {
29618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
29628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, P2P_EVENT_CROSS_CONNECT_DISABLE)) {
29638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
29648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, WPS_EVENT_SUCCESS)) {
29658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
29668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, WPS_EVENT_FAIL)) {
29678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
29688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else if (str_match(pos, WPA_EVENT_TERMINATING)) {
29698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("wpa_supplicant is terminating - stop monitoring\n");
29708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_quit = 1;
29718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
297244da0253a740e0329b18f60c196e1f2dcacfcceaDmitry Shmidt#ifdef ANDROID_BRCM_P2P_PATCH
297344da0253a740e0329b18f60c196e1f2dcacfcceaDmitry Shmidt	else if (str_match(pos, P2P_EVENT_GO_NEG_FAILURE)) {
297444da0253a740e0329b18f60c196e1f2dcacfcceaDmitry Shmidt		wpa_cli_exec(action_file, ctrl_ifname, pos);
297544da0253a740e0329b18f60c196e1f2dcacfcceaDmitry Shmidt	}
297644da0253a740e0329b18f60c196e1f2dcacfcceaDmitry Shmidt#endif
29778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_ANSI_C_EXTRA
29818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_action_cb(char *msg, size_t len)
29828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_action_process(msg);
29848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_ANSI_C_EXTRA */
29868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_reconnect(void)
29898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_close_connection();
29918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_open_connection(ctrl_ifname, 1);
29928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
29938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
29958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_recv_pending(struct wpa_ctrl *ctrl, int action_monitor)
29968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
29978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn == NULL) {
29988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_reconnect();
29998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return;
30008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (wpa_ctrl_pending(ctrl) > 0) {
30028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char buf[256];
30038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		size_t len = sizeof(buf) - 1;
30048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (wpa_ctrl_recv(ctrl, buf, &len) == 0) {
30058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			buf[len] = '\0';
30068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (action_monitor)
30078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				wpa_cli_action_process(buf);
30088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			else {
30098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (wpa_cli_show_event(buf)) {
30108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					edit_clear_line();
30118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					printf("\r%s\n", buf);
30128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					edit_redraw();
30138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				}
30148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
30158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		} else {
30168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Could not read pending message.\n");
30178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
30188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
30198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_ctrl_pending(ctrl) < 0) {
30228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Connection to wpa_supplicant lost - trying to "
30238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "reconnect\n");
30248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_reconnect();
30258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define max_args 10
30298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int tokenize_cmd(char *cmd, char *argv[])
30318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *pos;
30338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int argc = 0;
30348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	pos = cmd;
30368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (;;) {
30378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		while (*pos == ' ')
30388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos++;
30398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (*pos == '\0')
30408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
30418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		argv[argc] = pos;
30428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		argc++;
30438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (argc == max_args)
30448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
30458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (*pos == '"') {
30468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			char *pos2 = os_strrchr(pos, '"');
30478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (pos2)
30488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				pos = pos2 + 1;
30498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
30508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		while (*pos != '\0' && *pos != ' ')
30518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pos++;
30528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (*pos == ' ')
30538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*pos++ = '\0';
30548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return argc;
30578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_ping(void *eloop_ctx, void *timeout_ctx)
30618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_conn && _wpa_ctrl_command(ctrl_conn, "PING", 0)) {
30638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Connection to wpa_supplicant lost - trying to "
30648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		       "reconnect\n");
30658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_close_connection();
30668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
30678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!ctrl_conn)
30688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_reconnect();
30698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_register_timeout(ping_interval, 0, wpa_cli_ping, NULL, NULL);
30708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_eloop_terminate(int sig, void *signal_ctx)
30748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_terminate();
30768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_mon_receive(int sock, void *eloop_ctx, void *sock_ctx)
30808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_recv_pending(mon_conn, 0);
30828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_edit_cmd_cb(void *ctx, char *cmd)
30868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *argv[max_args];
30888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int argc;
30898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	argc = tokenize_cmd(cmd, argv);
30908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (argc)
30918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_request(ctrl_conn, argc, argv);
30928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
30958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_edit_eof_cb(void *ctx)
30968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
30978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_terminate();
30988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
30998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_interactive(void)
31028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *home, *hfile = NULL;
31048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("\nInteractive mode\n\n");
31068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	home = getenv("HOME");
31088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (home) {
31098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		const char *fname = ".wpa_cli_history";
31108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		int hfile_len = os_strlen(home) + 1 + os_strlen(fname) + 1;
31118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		hfile = os_malloc(hfile_len);
31128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (hfile)
31138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_snprintf(hfile, hfile_len, "%s/%s", home, fname);
31148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
31158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_register_signal_terminate(wpa_cli_eloop_terminate, NULL);
31178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	edit_init(wpa_cli_edit_cmd_cb, wpa_cli_edit_eof_cb,
31188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		  wpa_cli_edit_completion_cb, NULL, hfile);
31198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_register_timeout(ping_interval, 0, wpa_cli_ping, NULL, NULL);
31208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_run();
31228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	edit_deinit(hfile, wpa_cli_edit_filter_history_cb);
31248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(hfile);
31258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_cancel_timeout(wpa_cli_ping, NULL, NULL);
31268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_close_connection();
31278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_action(struct wpa_ctrl *ctrl)
31318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_ANSI_C_EXTRA
31338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* TODO: ANSI C version(?) */
31348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("Action processing not supported in ANSI C build.\n");
31358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_ANSI_C_EXTRA */
31368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	fd_set rfds;
31378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int fd, res;
31388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct timeval tv;
31398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char buf[256]; /* note: large enough to fit in unsolicited messages */
31408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
31418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	fd = wpa_ctrl_get_fd(ctrl);
31438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while (!wpa_cli_quit) {
31458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		FD_ZERO(&rfds);
31468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		FD_SET(fd, &rfds);
31478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		tv.tv_sec = ping_interval;
31488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		tv.tv_usec = 0;
31498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		res = select(fd + 1, &rfds, NULL, NULL, &tv);
31508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (res < 0 && errno != EINTR) {
31518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			perror("select");
31528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
31538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
31548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (FD_ISSET(fd, &rfds))
31568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_cli_recv_pending(ctrl, 1);
31578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		else {
31588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			/* verify that connection is still working */
31598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			len = sizeof(buf) - 1;
31608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpa_ctrl_request(ctrl, "PING", 4, buf, &len,
31618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     wpa_cli_action_cb) < 0 ||
31628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    len < 4 || os_memcmp(buf, "PONG", 4) != 0) {
31638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				printf("wpa_supplicant did not reply to PING "
31648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       "command - exiting\n");
31658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
31668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
31678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
31688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
31698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_ANSI_C_EXTRA */
31708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_cleanup(void)
31748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_close_connection();
31768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (pid_file)
31778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		os_daemonize_terminate(pid_file);
31788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_program_deinit();
31808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_terminate(int sig)
31838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_cleanup();
31858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	exit(0);
31868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
31878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char * wpa_cli_get_default_ifname(void)
31908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
31918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	char *ifname = NULL;
31928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
31938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_UNIX
31948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct dirent *dent;
31958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	DIR *dir = opendir(ctrl_iface_dir);
31968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!dir) {
31978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef ANDROID
31988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		char ifprop[PROPERTY_VALUE_MAX];
31998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (property_get("wifi.interface", ifprop, NULL) != 0) {
32008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ifname = os_strdup(ifprop);
32018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("Using interface '%s'\n", ifname);
32028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return ifname;
32038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
32048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* ANDROID */
32058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
32068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
32078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	while ((dent = readdir(dir))) {
32088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef _DIRENT_HAVE_D_TYPE
32098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		/*
32108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * Skip the file if it is not a socket. Also accept
32118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * DT_UNKNOWN (0) in case the C library or underlying
32128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 * file system does not support d_type.
32138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 */
32148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (dent->d_type != DT_SOCK && dent->d_type != DT_UNKNOWN)
32158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			continue;
32168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _DIRENT_HAVE_D_TYPE */
32178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (os_strcmp(dent->d_name, ".") == 0 ||
32188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    os_strcmp(dent->d_name, "..") == 0)
32198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			continue;
32208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("Selected interface '%s'\n", dent->d_name);
32218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ifname = os_strdup(dent->d_name);
32228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		break;
32238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
32248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	closedir(dir);
32258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UNIX */
32268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
3228c97d8bf1d6959387a528c901eaf9c0bff47da853Dmitry Shmidt	char buf[4096], *pos;
32298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
32308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_ctrl *ctrl;
32318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret;
32328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ctrl = wpa_ctrl_open(NULL);
32348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl == NULL)
32358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return NULL;
32368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	len = sizeof(buf) - 1;
32388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	ret = wpa_ctrl_request(ctrl, "INTERFACES", 10, buf, &len, NULL);
32398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ret >= 0) {
32408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		buf[len] = '\0';
32418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		pos = os_strchr(buf, '\n');
32428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (pos)
32438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			*pos = '\0';
32448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ifname = os_strdup(buf);
32458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
32468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_ctrl_close(ctrl);
32478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
32488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return ifname;
32508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
32518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint main(int argc, char *argv[])
32548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
32558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int warning_displayed = 0;
32568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int c;
32578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int daemonize = 0;
32588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	int ret = 0;
32598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const char *global = NULL;
32608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (os_program_init())
32628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
32638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
32648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	for (;;) {
32658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		c = getopt(argc, argv, "a:Bg:G:hi:p:P:v");
32668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (c < 0)
32678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
32688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		switch (c) {
32698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'a':
32708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			action_file = optarg;
32718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
32728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'B':
32738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			daemonize = 1;
32748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
32758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'g':
32768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			global = optarg;
32778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
32788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'G':
32798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ping_interval = atoi(optarg);
32808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
32818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'h':
32828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			usage();
32838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return 0;
32848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'v':
32858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			printf("%s\n", wpa_cli_version);
32868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return 0;
32878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'i':
32888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_free(ctrl_ifname);
32898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ctrl_ifname = os_strdup(optarg);
32908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
32918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'p':
32928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			ctrl_iface_dir = optarg;
32938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
32948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		case 'P':
32958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			pid_file = optarg;
32968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			break;
32978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		default:
32988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			usage();
32998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
33008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
33018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	interactive = (argc == optind) && (action_file == NULL);
33048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (interactive)
33068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		printf("%s\n\n%s\n\n", wpa_cli_version, wpa_cli_license);
33078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (eloop_init())
33098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
33108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (global) {
33128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
33138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ctrl_conn = wpa_ctrl_open(NULL);
33148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_CTRL_IFACE_NAMED_PIPE */
33158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ctrl_conn = wpa_ctrl_open(global);
33168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
33178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (ctrl_conn == NULL) {
33188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			perror("Failed to connect to wpa_supplicant - "
33198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       "wpa_ctrl_open");
33208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
33218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
33228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef _WIN32_WCE
33258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	signal(SIGINT, wpa_cli_terminate);
33268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	signal(SIGTERM, wpa_cli_terminate);
33278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _WIN32_WCE */
33288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (ctrl_ifname == NULL)
33308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ctrl_ifname = wpa_cli_get_default_ifname();
33318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (interactive) {
33338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		for (; !global;) {
33348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpa_cli_open_connection(ctrl_ifname, 1) == 0) {
33358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				if (warning_displayed)
33368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					printf("Connection established.\n");
33378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				break;
33388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
33398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (!warning_displayed) {
33418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				printf("Could not connect to wpa_supplicant - "
33428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       "re-trying\n");
33438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				warning_displayed = 1;
33448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
33458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			os_sleep(1, 0);
33468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			continue;
33478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
33488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	} else {
33498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (!global &&
33508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		    wpa_cli_open_connection(ctrl_ifname, 0) < 0) {
33518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			perror("Failed to connect to wpa_supplicant - "
33528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       "wpa_ctrl_open");
33538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			return -1;
33548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
33558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		if (action_file) {
33578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			if (wpa_ctrl_attach(ctrl_conn) == 0) {
33588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				wpa_cli_attached = 1;
33598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			} else {
33608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				printf("Warning: Failed to attach to "
33618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       "wpa_supplicant.\n");
33628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				return -1;
33638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			}
33648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		}
33658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
33668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (daemonize && os_daemonize(pid_file))
33688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
33698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (interactive)
33718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_interactive();
33728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else if (action_file)
33738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_cli_action(ctrl_conn);
33748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	else
33758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		ret = wpa_request(ctrl_conn, argc - optind, &argv[optind]);
33768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	os_free(ctrl_ifname);
33788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	eloop_destroy();
33798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	wpa_cli_cleanup();
33808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return ret;
33828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
33838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
33848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_CTRL_IFACE */
33858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint main(int argc, char *argv[])
33868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
33878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	printf("CONFIG_CTRL_IFACE not defined - wpa_cli disabled\n");
33888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
33898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
33908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE */
3391