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