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