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