18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * WPA Supplicant - command line interface for wpa_supplicant daemon 3de47be75037bccd4a11b62eedb3d4aed1b36fa67Dmitry Shmidt * Copyright (c) 2004-2016, 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 291d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidtstatic const char *const wpa_cli_version = 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"wpa_cli v" VERSION_STR "\n" 31de47be75037bccd4a11b62eedb3d4aed1b36fa67Dmitry Shmidt"Copyright (c) 2004-2016, Jouni Malinen <j@w1.fi> and contributors"; 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 341d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidtstatic const char *const 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 381d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidtstatic const char *const 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 69d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt#define VENDOR_ELEM_FRAME_ID \ 70d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt " 0: Probe Req (P2P), 1: Probe Resp (P2P) , 2: Probe Resp (GO), " \ 71d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt "3: Beacon (GO), 4: PD Req, 5: PD Resp, 6: GO Neg Req, " \ 72d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt "7: GO Neg Resp, 8: GO Neg Conf, 9: Inv Req, 10: Inv Resp, " \ 73d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt "11: Assoc Req (P2P), 12: Assoc Resp (P2P)" 74d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_ctrl *ctrl_conn; 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_ctrl *mon_conn; 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_quit = 0; 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_attached = 0; 79391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidtstatic int wpa_cli_connected = -1; 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_last_id = 0; 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_CTRL_IFACE_DIR 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define CONFIG_CTRL_IFACE_DIR "/var/run/wpa_supplicant" 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_DIR */ 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *ctrl_iface_dir = CONFIG_CTRL_IFACE_DIR; 85d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtstatic const char *client_socket_dir = NULL; 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char *ctrl_ifname = NULL; 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *pid_file = NULL; 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *action_file = NULL; 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int ping_interval = 5; 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int interactive = 0; 91f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidtstatic char *ifname_prefix = NULL; 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstruct cli_txt_entry { 941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct dl_list list; 951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *txt; 961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}; 971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic DEFINE_DL_LIST(bsses); /* struct cli_txt_entry */ 991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic DEFINE_DL_LIST(p2p_peers); /* struct cli_txt_entry */ 1001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic DEFINE_DL_LIST(p2p_groups); /* struct cli_txt_entry */ 101f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidtstatic DEFINE_DL_LIST(ifnames); /* struct cli_txt_entry */ 102912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidtstatic DEFINE_DL_LIST(networks); /* struct cli_txt_entry */ 1031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void print_help(const char *cmd); 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_mon_receive(int sock, void *eloop_ctx, void *sock_ctx); 10761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void wpa_cli_close_connection(void); 10861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic char * wpa_cli_get_default_ifname(void); 10961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic char ** wpa_list_cmd_list(void); 110912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidtstatic void update_networks(struct wpa_ctrl *ctrl); 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void usage(void) 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("wpa_cli [-p<path to ctrl sockets>] [-i<ifname>] [-hvB] " 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "[-a<action file>] \\\n" 117d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt " [-P<pid file>] [-g<global ctrl>] [-G<ping interval>] " 118d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt "\\\n" 119d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt " [-s<wpa_client_socket_file_path>] " 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "[command..]\n" 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " -h = help (show this usage text)\n" 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " -v = shown version information\n" 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " -a = run in daemon mode executing the action file based on " 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "events from\n" 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " wpa_supplicant\n" 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " -B = run a daemon in the background\n" 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " default path: " CONFIG_CTRL_IFACE_DIR "\n" 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " default interface: first interface found in socket path\n"); 12961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt print_help(NULL); 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_txt_list_free(struct cli_txt_entry *e) 1341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 1351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dl_list_del(&e->list); 1361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(e->txt); 1371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(e); 1381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 1391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_txt_list_flush(struct dl_list *list) 1421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 1431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct cli_txt_entry *e; 1441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt while ((e = dl_list_first(list, struct cli_txt_entry, list))) 1451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_txt_list_free(e); 1461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 1471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic struct cli_txt_entry * cli_txt_list_get(struct dl_list *txt_list, 1501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const char *txt) 1511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 1521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct cli_txt_entry *e; 1531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dl_list_for_each(e, txt_list, struct cli_txt_entry, list) { 1541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (os_strcmp(e->txt, txt) == 0) 1551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return e; 1561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 1571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return NULL; 1581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 1591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_txt_list_del(struct dl_list *txt_list, const char *txt) 1621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 1631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct cli_txt_entry *e; 1641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt e = cli_txt_list_get(txt_list, txt); 1651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (e) 1661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_txt_list_free(e); 1671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 1681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_txt_list_del_addr(struct dl_list *txt_list, const char *txt) 1711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 1721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt u8 addr[ETH_ALEN]; 1731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char buf[18]; 1741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hwaddr_aton(txt, addr) < 0) 1751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 1761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_snprintf(buf, sizeof(buf), MACSTR, MAC2STR(addr)); 1771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_txt_list_del(txt_list, buf); 1781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 1791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P 182912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidtstatic void cli_txt_list_del_word(struct dl_list *txt_list, const char *txt, 183912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt int separator) 1841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 1851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const char *end; 1861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *buf; 187912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt end = os_strchr(txt, separator); 1881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (end == NULL) 1891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt end = txt + os_strlen(txt); 1904b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt buf = dup_binstr(txt, end - txt); 1911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (buf == NULL) 1921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 1931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_txt_list_del(txt_list, buf); 1941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(buf); 1951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 1961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */ 1971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int cli_txt_list_add(struct dl_list *txt_list, const char *txt) 2001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 2011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct cli_txt_entry *e; 2021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt e = cli_txt_list_get(txt_list, txt); 2031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (e) 2041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return 0; 2051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt e = os_zalloc(sizeof(*e)); 2061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (e == NULL) 2071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 2081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt e->txt = os_strdup(txt); 2091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (e->txt == NULL) { 2101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(e); 2111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 2121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 2131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dl_list_add(txt_list, &e->list); 2141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return 0; 2151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 2161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P 2191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int cli_txt_list_add_addr(struct dl_list *txt_list, const char *txt) 2201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 2211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt u8 addr[ETH_ALEN]; 2221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char buf[18]; 2231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hwaddr_aton(txt, addr) < 0) 2241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 2251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_snprintf(buf, sizeof(buf), MACSTR, MAC2STR(addr)); 2261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return cli_txt_list_add(txt_list, buf); 2271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 228912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#endif /* CONFIG_P2P */ 2291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 231912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidtstatic int cli_txt_list_add_word(struct dl_list *txt_list, const char *txt, 232912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt int separator) 2331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 2341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const char *end; 2351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *buf; 2361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int ret; 237912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt end = os_strchr(txt, separator); 2381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (end == NULL) 2391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt end = txt + os_strlen(txt); 2404b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt buf = dup_binstr(txt, end - txt); 2411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (buf == NULL) 2421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 2431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ret = cli_txt_list_add(txt_list, buf); 2441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(buf); 2451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return ret; 2461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 2471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** cli_txt_list_array(struct dl_list *txt_list) 2501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 2511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt unsigned int i, count = dl_list_len(txt_list); 2521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char **res; 2531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct cli_txt_entry *e; 2541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt res = os_calloc(count + 1, sizeof(char *)); 2561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (res == NULL) 2571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return NULL; 2581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt i = 0; 2601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dl_list_for_each(e, txt_list, struct cli_txt_entry, list) { 2611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res[i] = os_strdup(e->txt); 2621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (res[i] == NULL) 2631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 2641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt i++; 2651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 2661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return res; 2681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 2691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int get_cmd_arg_num(const char *str, int pos) 2721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 2731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int arg = 0, i; 2741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt for (i = 0; i <= pos; i++) { 2761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (str[i] != ' ') { 2771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt arg++; 2781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt while (i <= pos && str[i] != ' ') 2791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt i++; 2801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 2811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 2821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (arg > 0) 2841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt arg--; 2851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return arg; 2861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 2871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int str_starts(const char *src, const char *match) 2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return os_strncmp(src, match, os_strlen(match)) == 0; 2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_show_event(const char *event) 2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *start; 2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = os_strchr(event, '>'); 3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (start == NULL) 3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 1; 3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start++; 3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Skip BSS added/removed events since they can be relatively frequent 3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * and are likely of not much use for an interactive user. 3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (str_starts(start, WPA_EVENT_BSS_ADDED) || 3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt str_starts(start, WPA_EVENT_BSS_REMOVED)) 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 1; 3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_open_connection(const char *ifname, int attach) 3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#if defined(CONFIG_CTRL_IFACE_UDP) || defined(CONFIG_CTRL_IFACE_NAMED_PIPE) 3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_conn = wpa_ctrl_open(ifname); 3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_conn == NULL) 3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (attach && interactive) 3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mon_conn = wpa_ctrl_open(ifname); 3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mon_conn = NULL; 3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */ 3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *cfile = NULL; 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int flen, res; 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ifname == NULL) 3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef ANDROID 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (access(ctrl_iface_dir, F_OK) < 0) { 3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cfile = os_strdup(ifname); 3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (cfile == NULL) 3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* ANDROID */ 3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 342d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt if (client_socket_dir && client_socket_dir[0] && 343d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt access(client_socket_dir, F_OK) < 0) { 344d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt perror(client_socket_dir); 345d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt os_free(cfile); 346d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt return -1; 347d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt } 348d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (cfile == NULL) { 3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt flen = os_strlen(ctrl_iface_dir) + os_strlen(ifname) + 2; 3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cfile = os_malloc(flen); 3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (cfile == NULL) 3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cfile, flen, "%s/%s", ctrl_iface_dir, 3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ifname); 3566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(flen, res)) { 3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(cfile); 3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 362d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt ctrl_conn = wpa_ctrl_open2(cfile, client_socket_dir); 3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_conn == NULL) { 3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(cfile); 3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (attach && interactive) 369d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt mon_conn = wpa_ctrl_open2(cfile, client_socket_dir); 3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mon_conn = NULL; 3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(cfile); 3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */ 3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (mon_conn) { 3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_ctrl_attach(mon_conn) == 0) { 3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_attached = 1; 3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (interactive) 3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_register_read_sock( 3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_ctrl_get_fd(mon_conn), 3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_mon_receive, NULL, NULL); 3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Warning: Failed to attach to " 3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_supplicant.\n"); 38561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_cli_close_connection(); 3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_close_connection(void) 3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_conn == NULL) 3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_cli_attached) { 4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_ctrl_detach(interactive ? mon_conn : ctrl_conn); 4018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_attached = 0; 4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_ctrl_close(ctrl_conn); 4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_conn = NULL; 4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (mon_conn) { 4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_unregister_read_sock(wpa_ctrl_get_fd(mon_conn)); 4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_ctrl_close(mon_conn); 4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mon_conn = NULL; 4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_msg_cb(char *msg, size_t len) 4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s\n", msg); 4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int _wpa_ctrl_command(struct wpa_ctrl *ctrl, char *cmd, int print) 4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 421c97d8bf1d6959387a528c901eaf9c0bff47da853Dmitry Shmidt char buf[4096]; 4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_conn == NULL) { 4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Not connected to wpa_supplicant - command dropped.\n"); 4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 429d3e385e428c94340d89ba090e3500a085463e713Dmitry Shmidt if (ifname_prefix) { 430d3e385e428c94340d89ba090e3500a085463e713Dmitry Shmidt os_snprintf(buf, sizeof(buf), "IFNAME=%s %s", 431d3e385e428c94340d89ba090e3500a085463e713Dmitry Shmidt ifname_prefix, cmd); 432d3e385e428c94340d89ba090e3500a085463e713Dmitry Shmidt buf[sizeof(buf) - 1] = '\0'; 433d3e385e428c94340d89ba090e3500a085463e713Dmitry Shmidt cmd = buf; 434d3e385e428c94340d89ba090e3500a085463e713Dmitry Shmidt } 4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = sizeof(buf) - 1; 4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len, 4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_msg_cb); 4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret == -2) { 4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("'%s' command timed out.\n", cmd); 4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -2; 4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (ret < 0) { 4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("'%s' command failed.\n", cmd); 4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (print) { 4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[len] = '\0'; 4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s", buf); 4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (interactive && len > 0 && buf[len - 1] != '\n') 4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\n"); 4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_ctrl_command(struct wpa_ctrl *ctrl, char *cmd) 4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return _wpa_ctrl_command(ctrl, cmd, 1); 4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 46161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int write_cmd(char *buf, size_t buflen, const char *cmd, int argc, 46261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *argv[]) 46361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 46461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt int i, res; 46561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *pos, *end; 46661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 46761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = buf; 46861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt end = buf + buflen; 46961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 47061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt res = os_snprintf(pos, end - pos, "%s", cmd); 4716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(end - pos, res)) 47261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 47361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos += res; 47461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 47561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt for (i = 0; i < argc; i++) { 47661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt res = os_snprintf(pos, end - pos, " %s", argv[i]); 4776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(end - pos, res)) 47861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt goto fail; 47961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos += res; 48061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 48161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 48261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt buf[buflen - 1] = '\0'; 48361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 0; 48461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 48561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtfail: 48661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt printf("Too long command\n"); 48761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 48861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 48961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 49061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 49161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd(struct wpa_ctrl *ctrl, const char *cmd, int min_args, 49261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt int argc, char *argv[]) 49361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 4944b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt char buf[4096]; 49561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (argc < min_args) { 49661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt printf("Invalid %s command - at least %d argument%s " 49761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "required.\n", cmd, min_args, 49861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt min_args > 1 ? "s are" : " is"); 49961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 50061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 50161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (write_cmd(buf, sizeof(buf), cmd, argc, argv) < 0) 50261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 50361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_ctrl_command(ctrl, buf); 50461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 50561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 50661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 50761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_ifname(struct wpa_ctrl *ctrl, int argc, char *argv[]) 50861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 50961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_ctrl_command(ctrl, "IFNAME"); 51061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 51161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 51261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_status(struct wpa_ctrl *ctrl, int argc, char *argv[]) 5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (argc > 0 && os_strcmp(argv[0], "verbose") == 0) 5161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpa_ctrl_command(ctrl, "STATUS-VERBOSE"); 5171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (argc > 0 && os_strcmp(argv[0], "wps") == 0) 5181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpa_ctrl_command(ctrl, "STATUS-WPS"); 5195605286c30e1701491bd3af974ae423727750eddDmitry Shmidt if (argc > 0 && os_strcmp(argv[0], "driver") == 0) 5205605286c30e1701491bd3af974ae423727750eddDmitry Shmidt return wpa_ctrl_command(ctrl, "STATUS-DRIVER"); 521d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt#ifdef ANDROID 522d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt if (argc > 0 && os_strcmp(argv[0], "no_events") == 0) 523d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt return wpa_ctrl_command(ctrl, "STATUS-NO_EVENTS"); 524d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt#endif /* ANDROID */ 5251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpa_ctrl_command(ctrl, "STATUS"); 5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ping(struct wpa_ctrl *ctrl, int argc, char *argv[]) 5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "PING"); 5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_relog(struct wpa_ctrl *ctrl, int argc, char *argv[]) 5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "RELOG"); 5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_note(struct wpa_ctrl *ctrl, int argc, char *argv[]) 5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 54361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "NOTE", 1, argc, argv); 5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_mib(struct wpa_ctrl *ctrl, int argc, char *argv[]) 5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "MIB"); 5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_pmksa(struct wpa_ctrl *ctrl, int argc, char *argv[]) 5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "PMKSA"); 5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 559661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidtstatic int wpa_cli_cmd_pmksa_flush(struct wpa_ctrl *ctrl, int argc, 560661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt char *argv[]) 561661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt{ 562661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt return wpa_ctrl_command(ctrl, "PMKSA_FLUSH"); 563661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt} 564661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 565661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_help(struct wpa_ctrl *ctrl, int argc, char *argv[]) 5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 56861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt print_help(argc > 0 ? argv[0] : NULL); 5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 57361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic char ** wpa_cli_complete_help(const char *str, int pos) 57461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 57561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt int arg = get_cmd_arg_num(str, pos); 57661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char **res = NULL; 57761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 57861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt switch (arg) { 57961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt case 1: 58061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt res = wpa_list_cmd_list(); 58161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt break; 58261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 58361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 58461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return res; 58561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 58661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 58761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_license(struct wpa_ctrl *ctrl, int argc, char *argv[]) 5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s\n\n%s\n", wpa_cli_version, wpa_cli_full_license); 5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_quit(struct wpa_ctrl *ctrl, int argc, char *argv[]) 5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_quit = 1; 5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (interactive) 5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_terminate(); 6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_set(struct wpa_ctrl *ctrl, int argc, char *argv[]) 6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 60951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt if (argc == 1) { 61051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "SET %s ", argv[0]); 6116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(sizeof(cmd), res)) { 61251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt printf("Too long SET command.\n"); 61351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt return -1; 61451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt } 61551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 61851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt return wpa_cli_cmd(ctrl, "SET", 2, argc, argv); 61951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt} 6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 62151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt 62251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidtstatic char ** wpa_cli_complete_set(const char *str, int pos) 62351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt{ 62451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt int arg = get_cmd_arg_num(str, pos); 62551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt const char *fields[] = { 62651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt /* runtime values */ 62751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt "EAPOL::heldPeriod", "EAPOL::authPeriod", "EAPOL::startPeriod", 62851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt "EAPOL::maxStart", "dot11RSNAConfigPMKLifetime", 62951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt "dot11RSNAConfigPMKReauthThreshold", "dot11RSNAConfigSATimeout", 63051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt "wps_fragment_size", "wps_version_number", "ampdu", 63151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt "tdls_testing", "tdls_disabled", "pno", "radio_disabled", 63251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt "uapsd", "ps", "wifi_display", "bssid_filter", "disallow_aps", 63351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt "no_keep_alive", 63451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt /* global configuration parameters */ 635f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE 636f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "ctrl_interface", "no_ctrl_interface", "ctrl_interface_group", 637f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE */ 638f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "eapol_version", "ap_scan", "bgscan", 639f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt#ifdef CONFIG_MESH 640f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "user_mpm", "max_peer_links", "mesh_max_inactivity", 641d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt "dot11RSNASAERetransPeriod", 642f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt#endif /* CONFIG_MESH */ 643f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "disable_scan_offload", "fast_reauth", "opensc_engine_path", 644f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "pkcs11_engine_path", "pkcs11_module_path", "openssl_ciphers", 645f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "pcsc_reader", "pcsc_pin", "external_sim", "driver_param", 646f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "dot11RSNAConfigPMKLifetime", 64751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt "dot11RSNAConfigPMKReauthThreshold", 64851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt "dot11RSNAConfigSATimeout", 649f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_WRITE 650f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "update_config", 651f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_WRITE */ 652f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "load_dynamic_eap", 653f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt#ifdef CONFIG_WPS 654f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "uuid", "device_name", "manufacturer", "model_name", 655f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "model_number", "serial_number", "device_type", "os_version", 656f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "config_methods", "wps_cred_processing", "wps_vendor_ext_m1", 657f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt#endif /* CONFIG_WPS */ 658f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt#ifdef CONFIG_P2P 659f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "sec_device_type", 66051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt "p2p_listen_reg_class", "p2p_listen_channel", 661f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "p2p_oper_reg_class", "p2p_oper_channel", "p2p_go_intent", 662f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "p2p_ssid_postfix", "persistent_reconnect", "p2p_intra_bss", 663f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "p2p_group_idle", "p2p_passphrase_len", "p2p_pref_chan", 664f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "p2p_no_go_freq", "p2p_add_cli_chan", 665f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "p2p_optimize_listen_chan", "p2p_go_ht40", "p2p_go_vht", 666f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "p2p_disabled", "p2p_go_ctwindow", "p2p_no_group_iface", 667f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "p2p_ignore_shared_freq", "ip_addr_go", "ip_addr_mask", 668f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "ip_addr_start", "ip_addr_end", 669f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt#endif /* CONFIG_P2P */ 670f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "country", "bss_max_count", "bss_expiration_age", 671f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "bss_expiration_scan_count", "filter_ssids", "filter_rssi", 672f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "max_num_sta", "disassoc_low_ack", 673f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt#ifdef CONFIG_HS20 674f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "hs20", 675f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt#endif /* CONFIG_HS20 */ 676f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "interworking", "hessid", "access_network_type", "pbc_in_m1", 677f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "autoscan", "wps_nfc_dev_pw_id", "wps_nfc_dh_pubkey", 678f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "wps_nfc_dh_privkey", "wps_nfc_dev_pw", "ext_password_backend", 67951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt "p2p_go_max_inactivity", "auto_interworking", "okc", "pmf", 680f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "sae_groups", "dtim_period", "beacon_int", 681f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "ap_vendor_elements", "ignore_old_scan_res", "freq_list", 682f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "scan_cur_freq", "sched_scan_interval", 683f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "tdls_external_control", "osu_dir", "wowlan_triggers", 684f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "p2p_search_delay", "mac_addr", "rand_addr_lifetime", 685f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "preassoc_mac_addr", "key_mgmt_offload", "passive_scan", 6867a53dbb56693ee9f55c0cab1a8297436511e8613Dmitry Shmidt "reassoc_same_bss_optim", "wps_priority" 68751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt }; 68868d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt int i, num_fields = ARRAY_SIZE(fields); 68951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt 69051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt if (arg == 1) { 69151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt char **res = os_calloc(num_fields + 1, sizeof(char *)); 69251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt if (res == NULL) 69351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt return NULL; 69451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt for (i = 0; i < num_fields; i++) { 69551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt res[i] = os_strdup(fields[i]); 69651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt if (res[i] == NULL) 69751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt return res; 69851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt } 69951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt return res; 7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 70151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt 70251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt if (arg > 1 && os_strncasecmp(str, "set bssid_filter ", 17) == 0) 70351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt return cli_txt_list_array(&bsses); 70451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt 70551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt return NULL; 7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7087f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidtstatic int wpa_cli_cmd_dump(struct wpa_ctrl *ctrl, int argc, char *argv[]) 7097f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt{ 7107f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt return wpa_ctrl_command(ctrl, "DUMP"); 7117f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt} 7127f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt 7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_get(struct wpa_ctrl *ctrl, int argc, char *argv[]) 7158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 71661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "GET", 1, argc, argv); 7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 720f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidtstatic char ** wpa_cli_complete_get(const char *str, int pos) 721f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt{ 722f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt int arg = get_cmd_arg_num(str, pos); 723f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt const char *fields[] = { 724f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE 725f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "ctrl_interface", "ctrl_interface_group", 726f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE */ 727f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "eapol_version", "ap_scan", 728f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt#ifdef CONFIG_MESH 729f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "user_mpm", "max_peer_links", "mesh_max_inactivity", 730f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt#endif /* CONFIG_MESH */ 731f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "disable_scan_offload", "fast_reauth", "opensc_engine_path", 732f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "pkcs11_engine_path", "pkcs11_module_path", "openssl_ciphers", 733f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "pcsc_reader", "pcsc_pin", "external_sim", "driver_param", 734f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "dot11RSNAConfigPMKLifetime", 735f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "dot11RSNAConfigPMKReauthThreshold", 736f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "dot11RSNAConfigSATimeout", 737f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt#ifndef CONFIG_NO_CONFIG_WRITE 738f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "update_config", 739f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt#endif /* CONFIG_NO_CONFIG_WRITE */ 740f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt#ifdef CONFIG_WPS 741f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "device_name", "manufacturer", "model_name", "model_number", 742f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "serial_number", "config_methods", "wps_cred_processing", 743f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt#endif /* CONFIG_WPS */ 744f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt#ifdef CONFIG_P2P 745f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "p2p_listen_reg_class", "p2p_listen_channel", 746f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "p2p_oper_reg_class", "p2p_oper_channel", "p2p_go_intent", 747f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "p2p_ssid_postfix", "persistent_reconnect", "p2p_intra_bss", 748f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "p2p_group_idle", "p2p_passphrase_len", "p2p_add_cli_chan", 749f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "p2p_optimize_listen_chan", "p2p_go_ht40", "p2p_go_vht", 750f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "p2p_disabled", "p2p_go_ctwindow", "p2p_no_group_iface", 751f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "p2p_ignore_shared_freq", "ip_addr_go", "ip_addr_mask", 752f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "ip_addr_start", "ip_addr_end", 753f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt#endif /* CONFIG_P2P */ 754f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "bss_max_count", "bss_expiration_age", 755f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "bss_expiration_scan_count", "filter_ssids", "filter_rssi", 756f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "max_num_sta", "disassoc_low_ack", 757f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt#ifdef CONFIG_HS20 758f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "hs20", 759f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt#endif /* CONFIG_HS20 */ 760f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "interworking", "access_network_type", "pbc_in_m1", "autoscan", 761f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "wps_nfc_dev_pw_id", "ext_password_backend", 762f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "p2p_go_max_inactivity", "auto_interworking", "okc", "pmf", 763f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "dtim_period", "beacon_int", "ignore_old_scan_res", 764f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "scan_cur_freq", "sched_scan_interval", 765f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "tdls_external_control", "osu_dir", "wowlan_triggers", 766f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "p2p_search_delay", "mac_addr", "rand_addr_lifetime", 767f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "preassoc_mac_addr", "key_mgmt_offload", "passive_scan", 768f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt "reassoc_same_bss_optim" 769f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt }; 770f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt int i, num_fields = ARRAY_SIZE(fields); 771f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt 772f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt if (arg == 1) { 773f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt char **res = os_calloc(num_fields + 1, sizeof(char *)); 774f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt if (res == NULL) 775f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt return NULL; 776f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt for (i = 0; i < num_fields; i++) { 777f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt res[i] = os_strdup(fields[i]); 778f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt if (res[i] == NULL) 779f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt return res; 780f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt } 781f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt return res; 782f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt } 783f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt 784f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt return NULL; 785f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt} 786f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt 787f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt 7888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_logoff(struct wpa_ctrl *ctrl, int argc, char *argv[]) 7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "LOGOFF"); 7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_logon(struct wpa_ctrl *ctrl, int argc, char *argv[]) 7958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "LOGON"); 7978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_reassociate(struct wpa_ctrl *ctrl, int argc, 8018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 8028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "REASSOCIATE"); 8048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8079866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidtstatic int wpa_cli_cmd_reattach(struct wpa_ctrl *ctrl, int argc, char *argv[]) 8089866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt{ 8099866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt return wpa_ctrl_command(ctrl, "REATTACH"); 8109866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt} 8119866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt 8129866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt 8138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_preauthenticate(struct wpa_ctrl *ctrl, int argc, 8148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 8158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 81661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "PREAUTH", 1, argc, argv); 8178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ap_scan(struct wpa_ctrl *ctrl, int argc, char *argv[]) 8218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 82261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "AP_SCAN", 1, argc, argv); 8238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_scan_interval(struct wpa_ctrl *ctrl, int argc, 8278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 8288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 82961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "SCAN_INTERVAL", 1, argc, argv); 8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bss_expire_age(struct wpa_ctrl *ctrl, int argc, 8348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 8358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 83661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "BSS_EXPIRE_AGE", 1, argc, argv); 8378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bss_expire_count(struct wpa_ctrl *ctrl, int argc, 8418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 8428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 84361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "BSS_EXPIRE_COUNT", 1, argc, argv); 8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 847f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidtstatic int wpa_cli_cmd_bss_flush(struct wpa_ctrl *ctrl, int argc, char *argv[]) 848f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt{ 849f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt char cmd[256]; 850f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt int res; 851f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt 852f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt if (argc < 1) 853f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "BSS_FLUSH 0"); 854f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt else 855f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "BSS_FLUSH %s", argv[0]); 8566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(sizeof(cmd), res)) { 857f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt printf("Too long BSS_FLUSH command.\n"); 858f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt return -1; 859f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt } 860f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 861f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt} 862f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt 863f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt 8648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_stkstart(struct wpa_ctrl *ctrl, int argc, 8658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 8668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 86761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "STKSTART", 1, argc, argv); 8688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ft_ds(struct wpa_ctrl *ctrl, int argc, char *argv[]) 8728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 87361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "FT_DS", 1, argc, argv); 8748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_pbc(struct wpa_ctrl *ctrl, int argc, char *argv[]) 8788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 87961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "WPS_PBC", 0, argc, argv); 8808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_pin(struct wpa_ctrl *ctrl, int argc, char *argv[]) 8848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 0) { 8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid WPS_PIN command: need one or two arguments:\n" 8878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- BSSID: use 'any' to select any\n" 8888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- PIN: optional, used only with devices that have no " 8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "display\n"); 8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 89361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "WPS_PIN", 1, argc, argv); 8948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_check_pin(struct wpa_ctrl *ctrl, int argc, 8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 90061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "WPS_CHECK_PIN", 1, argc, argv); 9018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_cancel(struct wpa_ctrl *ctrl, int argc, 9058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 9068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "WPS_CANCEL"); 9088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 91104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_WPS_NFC 91204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 91304949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_wps_nfc(struct wpa_ctrl *ctrl, int argc, char *argv[]) 91404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 91561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "WPS_NFC", 0, argc, argv); 91604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 91704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 91804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 919f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidtstatic int wpa_cli_cmd_wps_nfc_config_token(struct wpa_ctrl *ctrl, int argc, 920f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt char *argv[]) 921f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt{ 922f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt return wpa_cli_cmd(ctrl, "WPS_NFC_CONFIG_TOKEN", 1, argc, argv); 923f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt} 924f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt 925f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt 92604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_wps_nfc_token(struct wpa_ctrl *ctrl, int argc, 92704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *argv[]) 92804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 92961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "WPS_NFC_TOKEN", 1, argc, argv); 93004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 93104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 93204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 93304949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_wps_nfc_tag_read(struct wpa_ctrl *ctrl, int argc, 93404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *argv[]) 93504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 93604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt int ret; 93704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *buf; 93804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt size_t buflen; 93904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 94004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (argc != 1) { 94104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt printf("Invalid 'wps_nfc_tag_read' command - one argument " 94204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "is required.\n"); 94304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 94404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 94504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 94604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt buflen = 18 + os_strlen(argv[0]); 94704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt buf = os_malloc(buflen); 94804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (buf == NULL) 94904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 95004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_snprintf(buf, buflen, "WPS_NFC_TAG_READ %s", argv[0]); 95104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 95204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ret = wpa_ctrl_command(ctrl, buf); 95304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt os_free(buf); 95404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 95504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return ret; 95604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 95704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 958d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 959d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtstatic int wpa_cli_cmd_nfc_get_handover_req(struct wpa_ctrl *ctrl, int argc, 960d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt char *argv[]) 961d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{ 962d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return wpa_cli_cmd(ctrl, "NFC_GET_HANDOVER_REQ", 2, argc, argv); 963d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt} 964d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 965d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 966d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidtstatic int wpa_cli_cmd_nfc_get_handover_sel(struct wpa_ctrl *ctrl, int argc, 967d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt char *argv[]) 968d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt{ 969d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt return wpa_cli_cmd(ctrl, "NFC_GET_HANDOVER_SEL", 2, argc, argv); 970d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt} 971d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 972d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt 973f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidtstatic int wpa_cli_cmd_nfc_report_handover(struct wpa_ctrl *ctrl, int argc, 974f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt char *argv[]) 975f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt{ 976f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt return wpa_cli_cmd(ctrl, "NFC_REPORT_HANDOVER", 4, argc, argv); 977f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt} 978f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt 97904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_WPS_NFC */ 98004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 98104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 9828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_reg(struct wpa_ctrl *ctrl, int argc, char *argv[]) 9838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 9868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 2) 9888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "WPS_REG %s %s", 9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (argc == 5 || argc == 6) { 9919d9e60286e05ae45025b672636490bd12586138dDmitry Shmidt char ssid_hex[2 * SSID_MAX_LEN + 1]; 9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char key_hex[2 * 64 + 1]; 9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i; 9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid_hex[0] = '\0'; 9969d9e60286e05ae45025b672636490bd12586138dDmitry Shmidt for (i = 0; i < SSID_MAX_LEN; i++) { 9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argv[2][i] == '\0') 9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(&ssid_hex[i * 2], 3, "%02x", argv[2][i]); 10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_hex[0] = '\0'; 10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 6) { 10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < 64; i++) { 10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argv[5][i] == '\0') 10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(&key_hex[i * 2], 3, "%02x", 10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[5][i]); 10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), 10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "WPS_REG %s %s %s %s %s %s", 10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1], ssid_hex, argv[3], argv[4], 10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_hex); 10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid WPS_REG command: need two arguments:\n" 10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- BSSID of the target AP\n" 10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- AP PIN\n"); 10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Alternatively, six arguments can be used to " 10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "reconfigure the AP:\n" 10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- BSSID of the target AP\n" 10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- AP PIN\n" 10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- new SSID\n" 10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- new auth (OPEN, WPAPSK, WPA2PSK)\n" 10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- new encr (NONE, WEP, TKIP, CCMP)\n" 10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- new key\n"); 10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(sizeof(cmd), res)) { 10328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long WPS_REG command.\n"); 10338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 10368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_ap_pin(struct wpa_ctrl *ctrl, int argc, 10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 104261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "WPS_AP_PIN", 1, argc, argv); 10438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_start(struct wpa_ctrl *ctrl, int argc, 10478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 10488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 104961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "WPS_ER_START", 0, argc, argv); 10508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_stop(struct wpa_ctrl *ctrl, int argc, 10548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "WPS_ER_STOP"); 10578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_pin(struct wpa_ctrl *ctrl, int argc, 10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 2) { 10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid WPS_ER_PIN command: need at least two " 10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "arguments:\n" 10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- UUID: use 'any' to select any\n" 10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- PIN: Enrollee PIN\n" 10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "optional: - Enrollee MAC address\n"); 10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 107361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "WPS_ER_PIN", 2, argc, argv); 10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_pbc(struct wpa_ctrl *ctrl, int argc, 10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 108061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "WPS_ER_PBC", 1, argc, argv); 10818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_learn(struct wpa_ctrl *ctrl, int argc, 10858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 10868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 2) { 10888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid WPS_ER_LEARN command: need two arguments:\n" 10898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- UUID: specify which AP to use\n" 10908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- PIN: AP PIN\n"); 10918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 109461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "WPS_ER_LEARN", 2, argc, argv); 10958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_set_config(struct wpa_ctrl *ctrl, int argc, 10998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 11008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 2) { 11028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid WPS_ER_SET_CONFIG command: need two " 11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "arguments:\n" 11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- UUID: specify which AP to use\n" 11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- Network configuration id\n"); 11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 110961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "WPS_ER_SET_CONFIG", 2, argc, argv); 11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_config(struct wpa_ctrl *ctrl, int argc, 11148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 5 || argc == 6) { 11209d9e60286e05ae45025b672636490bd12586138dDmitry Shmidt char ssid_hex[2 * SSID_MAX_LEN + 1]; 11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char key_hex[2 * 64 + 1]; 11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i; 11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid_hex[0] = '\0'; 11259d9e60286e05ae45025b672636490bd12586138dDmitry Shmidt for (i = 0; i < SSID_MAX_LEN; i++) { 11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argv[2][i] == '\0') 11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(&ssid_hex[i * 2], 3, "%02x", argv[2][i]); 11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_hex[0] = '\0'; 11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 6) { 11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < 64; i++) { 11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argv[5][i] == '\0') 11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(&key_hex[i * 2], 3, "%02x", 11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[5][i]); 11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), 11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "WPS_ER_CONFIG %s %s %s %s %s %s", 11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1], ssid_hex, argv[3], argv[4], 11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_hex); 11458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 11468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid WPS_ER_CONFIG command: need six arguments:\n" 11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- AP UUID\n" 11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- AP PIN\n" 11498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- new SSID\n" 11508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- new auth (OPEN, WPAPSK, WPA2PSK)\n" 11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- new encr (NONE, WEP, TKIP, CCMP)\n" 11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- new key\n"); 11538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(sizeof(cmd), res)) { 11578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long WPS_ER_CONFIG command.\n"); 11588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 11618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 116404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_WPS_NFC 116504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_wps_er_nfc_config_token(struct wpa_ctrl *ctrl, int argc, 116604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *argv[]) 116704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 116804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (argc != 2) { 116904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt printf("Invalid WPS_ER_NFC_CONFIG_TOKEN command: need two " 117004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "arguments:\n" 117104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "- WPS/NDEF: token format\n" 117204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "- UUID: specify which AP to use\n"); 117304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 117404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 117504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 117661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "WPS_ER_NFC_CONFIG_TOKEN", 2, argc, argv); 117704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 117804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_WPS_NFC */ 117904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 118004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ibss_rsn(struct wpa_ctrl *ctrl, int argc, char *argv[]) 11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 118361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "IBSS_RSN", 1, argc, argv); 11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_level(struct wpa_ctrl *ctrl, int argc, char *argv[]) 11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 118961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "LEVEL", 1, argc, argv); 11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_identity(struct wpa_ctrl *ctrl, int argc, char *argv[]) 11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256], *pos, *end; 11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, ret; 11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 2) { 11998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid IDENTITY command: needs two arguments " 12008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(network id and identity)\n"); 12018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = cmd + sizeof(cmd); 12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = cmd; 12068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "IDENTITY-%s:%s", 12078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 12086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(end - pos, ret)) { 12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long IDENTITY command.\n"); 12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 2; i < argc; i++) { 12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, " %s", argv[i]); 12156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(end - pos, ret)) { 12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long IDENTITY command.\n"); 12178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_password(struct wpa_ctrl *ctrl, int argc, char *argv[]) 12278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256], *pos, *end; 12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, ret; 12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 2) { 12328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid PASSWORD command: needs two arguments " 12338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(network id and password)\n"); 12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = cmd + sizeof(cmd); 12388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = cmd; 12398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PASSWORD-%s:%s", 12408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 12416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(end - pos, ret)) { 12428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long PASSWORD command.\n"); 12438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 12468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 2; i < argc; i++) { 12478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, " %s", argv[i]); 12486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(end - pos, ret)) { 12498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long PASSWORD command.\n"); 12508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 12538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_new_password(struct wpa_ctrl *ctrl, int argc, 12608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256], *pos, *end; 12638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, ret; 12648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 2) { 12668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid NEW_PASSWORD command: needs two arguments " 12678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(network id and password)\n"); 12688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = cmd + sizeof(cmd); 12728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = cmd; 12738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "NEW_PASSWORD-%s:%s", 12748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 12756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(end - pos, ret)) { 12768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long NEW_PASSWORD command.\n"); 12778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 12808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 2; i < argc; i++) { 12818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, " %s", argv[i]); 12826c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(end - pos, ret)) { 12838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long NEW_PASSWORD command.\n"); 12848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 12878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_pin(struct wpa_ctrl *ctrl, int argc, char *argv[]) 12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256], *pos, *end; 12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, ret; 12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 2) { 12998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid PIN command: needs two arguments " 13008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(network id and pin)\n"); 13018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 13028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = cmd + sizeof(cmd); 13058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = cmd; 13068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PIN-%s:%s", 13078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 13086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(end - pos, ret)) { 13098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long PIN command.\n"); 13108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 13118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 2; i < argc; i++) { 13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, " %s", argv[i]); 13156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(end - pos, ret)) { 13168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long PIN command.\n"); 13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 13188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 13208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 13228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 13238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_otp(struct wpa_ctrl *ctrl, int argc, char *argv[]) 13268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 13278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256], *pos, *end; 13288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, ret; 13298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 2) { 13318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid OTP command: needs two arguments (network " 13328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "id and password)\n"); 13338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 13348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = cmd + sizeof(cmd); 13378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = cmd; 13388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "OTP-%s:%s", 13398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 13406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(end - pos, ret)) { 13418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long OTP command.\n"); 13428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 13438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 13458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 2; i < argc; i++) { 13468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, " %s", argv[i]); 13476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(end - pos, ret)) { 13488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long OTP command.\n"); 13498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 13508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 13528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 13558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 13568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1358051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidtstatic int wpa_cli_cmd_sim(struct wpa_ctrl *ctrl, int argc, char *argv[]) 1359051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt{ 1360051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt char cmd[256], *pos, *end; 1361051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt int i, ret; 1362051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 1363051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt if (argc < 2) { 1364051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt printf("Invalid SIM command: needs two arguments " 1365051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt "(network id and SIM operation response)\n"); 1366051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt return -1; 1367051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt } 1368051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 1369051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt end = cmd + sizeof(cmd); 1370051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt pos = cmd; 1371051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "SIM-%s:%s", 1372051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt argv[0], argv[1]); 13736c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(end - pos, ret)) { 1374051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt printf("Too long SIM command.\n"); 1375051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt return -1; 1376051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt } 1377051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt pos += ret; 1378051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt for (i = 2; i < argc; i++) { 1379051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt ret = os_snprintf(pos, end - pos, " %s", argv[i]); 13806c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(end - pos, ret)) { 1381051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt printf("Too long SIM command.\n"); 1382051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt return -1; 1383051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt } 1384051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt pos += ret; 1385051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt } 1386051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 1387051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt} 1388051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 1389051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt 13908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_passphrase(struct wpa_ctrl *ctrl, int argc, 13918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 13928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 13938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256], *pos, *end; 13948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, ret; 13958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 2) { 13978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid PASSPHRASE command: needs two arguments " 13988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(network id and passphrase)\n"); 13998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 14008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = cmd + sizeof(cmd); 14038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = cmd; 14048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PASSPHRASE-%s:%s", 14058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 14066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(end - pos, ret)) { 14078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long PASSPHRASE command.\n"); 14088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 14098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 14118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 2; i < argc; i++) { 14128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, " %s", argv[i]); 14136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(end - pos, ret)) { 14148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long PASSPHRASE command.\n"); 14158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 14168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 14188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 14218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bssid(struct wpa_ctrl *ctrl, int argc, char *argv[]) 14258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 14268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 2) { 14278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid BSSID command: needs two arguments (network " 14288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "id and BSSID)\n"); 14298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 14308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 143261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "BSSID", 2, argc, argv); 14338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1436696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidtstatic int wpa_cli_cmd_blacklist(struct wpa_ctrl *ctrl, int argc, char *argv[]) 1437696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt{ 143861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "BLACKLIST", 0, argc, argv); 1439696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt} 1440696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt 1441696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt 1442696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidtstatic int wpa_cli_cmd_log_level(struct wpa_ctrl *ctrl, int argc, char *argv[]) 1443696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt{ 144461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "LOG_LEVEL", 0, argc, argv); 1445696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt} 1446696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt 1447696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt 14488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_list_networks(struct wpa_ctrl *ctrl, int argc, 14498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 14508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 14518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "LIST_NETWORKS"); 14528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_select_network(struct wpa_ctrl *ctrl, int argc, 14568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 14578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 145861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "SELECT_NETWORK", 1, argc, argv); 14598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_enable_network(struct wpa_ctrl *ctrl, int argc, 14638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 14648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 146561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "ENABLE_NETWORK", 1, argc, argv); 14668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_disable_network(struct wpa_ctrl *ctrl, int argc, 14708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 14718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 147261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "DISABLE_NETWORK", 1, argc, argv); 14738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_add_network(struct wpa_ctrl *ctrl, int argc, 14778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 14788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1479912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt int res = wpa_ctrl_command(ctrl, "ADD_NETWORK"); 1480cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (interactive) 1481cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt update_networks(ctrl); 1482912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt return res; 14838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 148661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_remove_network(struct wpa_ctrl *ctrl, int argc, 148761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *argv[]) 148861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 1489912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt int res = wpa_cli_cmd(ctrl, "REMOVE_NETWORK", 1, argc, argv); 1490cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt if (interactive) 1491cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt update_networks(ctrl); 1492912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt return res; 14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_show_network_variables(void) 14978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 14988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("set_network variables:\n" 14998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " ssid (network name, SSID)\n" 15008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " psk (WPA passphrase or pre-shared key)\n" 15018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " key_mgmt (key management protocol)\n" 15028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " identity (EAP identity)\n" 15038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " password (EAP password)\n" 15048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " ...\n" 15058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "\n" 15068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Note: Values are entered in the same format as the " 15078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "configuration file is using,\n" 15088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "i.e., strings values need to be inside double quotation " 15098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "marks.\n" 15108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "For example: set_network 1 ssid \"network name\"\n" 15118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "\n" 15128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Please see wpa_supplicant.conf documentation for full list " 15138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "of\navailable variables.\n"); 15148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_set_network(struct wpa_ctrl *ctrl, int argc, 15188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 15198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 15208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 0) { 15218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_show_network_variables(); 15228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 15238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1525d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt if (argc < 3) { 15268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid SET_NETWORK command: needs three arguments\n" 15278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(network id, variable name, and value)\n"); 15288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 15298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 153161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "SET_NETWORK", 3, argc, argv); 15328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_get_network(struct wpa_ctrl *ctrl, int argc, 15368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 15378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 15388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 0) { 15398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_show_network_variables(); 15408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 15418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 2) { 15448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid GET_NETWORK command: needs two arguments\n" 15458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(network id and variable name)\n"); 15468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 15478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 154961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "GET_NETWORK", 2, argc, argv); 15508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1553912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidtstatic const char *network_fields[] = { 1554912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "ssid", "scan_ssid", "bssid", "bssid_blacklist", 1555912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "bssid_whitelist", "psk", "proto", "key_mgmt", 1556912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "bg_scan_period", "pairwise", "group", "auth_alg", "scan_freq", 1557d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt "freq_list", "max_oper_chwidth", 1558912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#ifdef IEEE8021X_EAPOL 1559912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "eap", "identity", "anonymous_identity", "password", "ca_cert", 1560912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "ca_path", "client_cert", "private_key", "private_key_passwd", 1561912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "dh_file", "subject_match", "altsubject_match", 1562912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "domain_suffix_match", "domain_match", "ca_cert2", "ca_path2", 1563912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "client_cert2", "private_key2", "private_key2_passwd", 1564912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "dh_file2", "subject_match2", "altsubject_match2", 1565912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "domain_suffix_match2", "domain_match2", "phase1", "phase2", 1566912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "pcsc", "pin", "engine_id", "key_id", "cert_id", "ca_cert_id", 1567912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "pin2", "engine2_id", "key2_id", "cert2_id", "ca_cert2_id", 1568912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "engine", "engine2", "eapol_flags", "sim_num", 1569912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "openssl_ciphers", "erp", 1570912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#endif /* IEEE8021X_EAPOL */ 1571912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "wep_key0", "wep_key1", "wep_key2", "wep_key3", 1572912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "wep_tx_keyidx", "priority", 1573912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#ifdef IEEE8021X_EAPOL 1574912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "eap_workaround", "pac_file", "fragment_size", "ocsp", 1575912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#endif /* IEEE8021X_EAPOL */ 1576912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#ifdef CONFIG_MESH 1577912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "mode", "no_auto_peer", 1578912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#else /* CONFIG_MESH */ 1579912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "mode", 1580912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#endif /* CONFIG_MESH */ 1581912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "proactive_key_caching", "disabled", "id_str", 1582912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#ifdef CONFIG_IEEE80211W 1583912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "ieee80211w", 1584912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#endif /* CONFIG_IEEE80211W */ 1585912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "peerkey", "mixed_cell", "frequency", "fixed_freq", 1586912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#ifdef CONFIG_MESH 1587912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "mesh_basic_rates", "dot11MeshMaxRetries", 1588912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "dot11MeshRetryTimeout", "dot11MeshConfirmTimeout", 1589912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "dot11MeshHoldingTimeout", 1590912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#endif /* CONFIG_MESH */ 1591912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "wpa_ptk_rekey", "bgscan", "ignore_broadcast_ssid", 1592912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#ifdef CONFIG_P2P 1593912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "go_p2p_dev_addr", "p2p_client_list", "psk_list", 1594912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#endif /* CONFIG_P2P */ 1595912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#ifdef CONFIG_HT_OVERRIDES 1596912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "disable_ht", "disable_ht40", "disable_sgi", "disable_ldpc", 1597912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "ht40_intolerant", "disable_max_amsdu", "ampdu_factor", 1598912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "ampdu_density", "ht_mcs", 1599912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#endif /* CONFIG_HT_OVERRIDES */ 1600912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#ifdef CONFIG_VHT_OVERRIDES 1601912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "disable_vht", "vht_capa", "vht_capa_mask", "vht_rx_mcs_nss_1", 1602912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "vht_rx_mcs_nss_2", "vht_rx_mcs_nss_3", "vht_rx_mcs_nss_4", 1603912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "vht_rx_mcs_nss_5", "vht_rx_mcs_nss_6", "vht_rx_mcs_nss_7", 1604912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "vht_rx_mcs_nss_8", "vht_tx_mcs_nss_1", "vht_tx_mcs_nss_2", 1605912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "vht_tx_mcs_nss_3", "vht_tx_mcs_nss_4", "vht_tx_mcs_nss_5", 1606912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "vht_tx_mcs_nss_6", "vht_tx_mcs_nss_7", "vht_tx_mcs_nss_8", 1607912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#endif /* CONFIG_VHT_OVERRIDES */ 1608912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "ap_max_inactivity", "dtim_period", "beacon_int", 1609912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#ifdef CONFIG_MACSEC 1610912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "macsec_policy", 1611912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#endif /* CONFIG_MACSEC */ 1612912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#ifdef CONFIG_HS20 1613912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "update_identifier", 1614912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#endif /* CONFIG_HS20 */ 161557c2d39d85825f38c5fdac9b73bb0088406ffc85Dmitry Shmidt "mac_addr", "pbss" 1616912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt}; 1617912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 1618912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 1619912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidtstatic char ** wpa_cli_complete_network(const char *str, int pos) 1620912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt{ 1621912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt int arg = get_cmd_arg_num(str, pos); 1622912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt int i, num_fields = ARRAY_SIZE(network_fields); 1623912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt char **res = NULL; 1624912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 1625912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt switch (arg) { 1626912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt case 1: 1627912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt res = cli_txt_list_array(&networks); 1628912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt break; 1629912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt case 2: 1630912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt res = os_calloc(num_fields + 1, sizeof(char *)); 1631912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt if (res == NULL) 1632912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt return NULL; 1633912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt for (i = 0; i < num_fields; i++) { 1634912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt res[i] = os_strdup(network_fields[i]); 1635912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt if (res[i] == NULL) 1636912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt break; 1637912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt } 1638912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt } 1639912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt return res; 1640912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt} 1641912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 1642912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 1643912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidtstatic char ** wpa_cli_complete_network_id(const char *str, int pos) 1644912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt{ 1645912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt int arg = get_cmd_arg_num(str, pos); 1646912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt if (arg == 1) 1647912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt return cli_txt_list_array(&networks); 1648912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt return NULL; 1649912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt} 1650912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 1651912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 1652684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidtstatic int wpa_cli_cmd_dup_network(struct wpa_ctrl *ctrl, int argc, 1653684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt char *argv[]) 1654684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt{ 1655684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt if (argc == 0) { 1656684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt wpa_cli_show_network_variables(); 1657684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt return 0; 1658684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt } 1659684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt 1660684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt if (argc < 3) { 1661684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt printf("Invalid DUP_NETWORK command: needs three arguments\n" 1662684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt "(src netid, dest netid, and variable name)\n"); 1663684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt return -1; 1664684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt } 1665684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt 1666684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt return wpa_cli_cmd(ctrl, "DUP_NETWORK", 3, argc, argv); 1667684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt} 1668684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt 1669684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt 1670912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidtstatic char ** wpa_cli_complete_dup_network(const char *str, int pos) 1671912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt{ 1672912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt int arg = get_cmd_arg_num(str, pos); 1673912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt int i, num_fields = ARRAY_SIZE(network_fields); 1674912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt char **res = NULL; 1675912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 1676912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt switch (arg) { 1677912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt case 1: 1678912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt case 2: 1679912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt res = cli_txt_list_array(&networks); 1680912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt break; 1681912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt case 3: 1682912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt res = os_calloc(num_fields + 1, sizeof(char *)); 1683912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt if (res == NULL) 1684912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt return NULL; 1685912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt for (i = 0; i < num_fields; i++) { 1686912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt res[i] = os_strdup(network_fields[i]); 1687912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt if (res[i] == NULL) 1688912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt break; 1689912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt } 1690912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt } 1691912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt return res; 1692912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt} 1693912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 1694912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 169504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_list_creds(struct wpa_ctrl *ctrl, int argc, 169604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *argv[]) 169704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 169804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return wpa_ctrl_command(ctrl, "LIST_CREDS"); 169904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 170004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 170104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 170204949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_add_cred(struct wpa_ctrl *ctrl, int argc, char *argv[]) 170304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 170404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return wpa_ctrl_command(ctrl, "ADD_CRED"); 170504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 170604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 170704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 170804949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_remove_cred(struct wpa_ctrl *ctrl, int argc, 170904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *argv[]) 171004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 171161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "REMOVE_CRED", 1, argc, argv); 171204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 171304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 171404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 171504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_set_cred(struct wpa_ctrl *ctrl, int argc, char *argv[]) 171604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 171704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (argc != 3) { 171804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt printf("Invalid SET_CRED command: needs three arguments\n" 171904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "(cred id, variable name, and value)\n"); 172004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 172104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 172204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 172361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "SET_CRED", 3, argc, argv); 172404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 172504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 172604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 17270cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidtstatic int wpa_cli_cmd_get_cred(struct wpa_ctrl *ctrl, int argc, char *argv[]) 17280cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt{ 17290cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt if (argc != 2) { 17300cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt printf("Invalid GET_CRED command: needs two arguments\n" 17310cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt "(cred id, variable name)\n"); 17320cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt return -1; 17330cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt } 17340cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt 17350cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt return wpa_cli_cmd(ctrl, "GET_CRED", 2, argc, argv); 17360cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt} 17370cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt 17380cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt 17398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_disconnect(struct wpa_ctrl *ctrl, int argc, 17408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 17418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "DISCONNECT"); 17438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_reconnect(struct wpa_ctrl *ctrl, int argc, 17478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 17488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "RECONNECT"); 17508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_save_config(struct wpa_ctrl *ctrl, int argc, 17548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 17558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "SAVE_CONFIG"); 17578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_scan(struct wpa_ctrl *ctrl, int argc, char *argv[]) 17618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17624b9d52f502481b258fec743c03a5e957e5605afcDmitry Shmidt return wpa_cli_cmd(ctrl, "SCAN", 0, argc, argv); 17638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_scan_results(struct wpa_ctrl *ctrl, int argc, 17678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 17688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "SCAN_RESULTS"); 17708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1773d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidtstatic int wpa_cli_cmd_abort_scan(struct wpa_ctrl *ctrl, int argc, 1774d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt char *argv[]) 1775d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt{ 1776d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt return wpa_ctrl_command(ctrl, "ABORT_SCAN"); 1777d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt} 1778d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt 1779d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt 17808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bss(struct wpa_ctrl *ctrl, int argc, char *argv[]) 17818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 178261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "BSS", 1, argc, argv); 17838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** wpa_cli_complete_bss(const char *str, int pos) 17871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 17881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int arg = get_cmd_arg_num(str, pos); 17891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char **res = NULL; 17901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 17911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt switch (arg) { 17921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case 1: 17931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = cli_txt_list_array(&bsses); 17941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 17951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 17961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 17971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return res; 17981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 17991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 18018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_get_capability(struct wpa_ctrl *ctrl, int argc, 18028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 18038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 1 || argc > 2) { 18058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid GET_CAPABILITY command: need either one or " 18068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "two arguments\n"); 18078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 18088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((argc == 2) && os_strcmp(argv[1], "strict") != 0) { 18118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid GET_CAPABILITY command: second argument, " 18128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "if any, must be 'strict'\n"); 18138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 18148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 181661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "GET_CAPABILITY", 1, argc, argv); 18178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_list_interfaces(struct wpa_ctrl *ctrl) 18218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Available interfaces:\n"); 18238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "INTERFACES"); 18248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface(struct wpa_ctrl *ctrl, int argc, char *argv[]) 18288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 1) { 18308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_list_interfaces(ctrl); 18318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 18328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_close_connection(); 18358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ctrl_ifname); 18368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_ifname = os_strdup(argv[0]); 18372f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt if (!ctrl_ifname) { 18382f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt printf("Failed to allocate memory\n"); 18392f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt return 0; 18402f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt } 18418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1842413dde71f7bc166de54229f337c24b61f4d909fdDmitry Shmidt if (wpa_cli_open_connection(ctrl_ifname, 1) == 0) { 18438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Connected to interface '%s.\n", ctrl_ifname); 18448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 18458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Could not connect to interface '%s' - re-trying\n", 18468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_ifname); 18478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 18498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_reconfigure(struct wpa_ctrl *ctrl, int argc, 18538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 18548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "RECONFIGURE"); 18568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_terminate(struct wpa_ctrl *ctrl, int argc, 18608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 18618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "TERMINATE"); 18638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface_add(struct wpa_ctrl *ctrl, int argc, 18678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 18688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 18708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 18718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 1) { 18738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid INTERFACE_ADD command: needs at least one " 18748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "argument (interface name)\n" 18758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "All arguments: ifname confname driver ctrl_interface " 1876912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt "driver_param bridge_name [create]\n"); 18778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 18788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 18818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * INTERFACE_ADD <ifname>TAB<confname>TAB<driver>TAB<ctrl_interface>TAB 1882d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt * <driver_param>TAB<bridge_name>[TAB<create>[TAB<type>]] 18838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 18848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), 1885d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt "INTERFACE_ADD %s\t%s\t%s\t%s\t%s\t%s\t%s\t%s", 18868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], 18878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argc > 1 ? argv[1] : "", argc > 2 ? argv[2] : "", 18888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argc > 3 ? argv[3] : "", argc > 4 ? argv[4] : "", 1889d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt argc > 5 ? argv[5] : "", argc > 6 ? argv[6] : "", 1890d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt argc > 7 ? argv[7] : ""); 18916c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(sizeof(cmd), res)) 18928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 18938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 18948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 18958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface_remove(struct wpa_ctrl *ctrl, int argc, 18998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 19008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 190161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "INTERFACE_REMOVE", 1, argc, argv); 19028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 19038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface_list(struct wpa_ctrl *ctrl, int argc, 19068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 19078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 19088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "INTERFACE_LIST"); 19098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 19108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_AP 19138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_sta(struct wpa_ctrl *ctrl, int argc, char *argv[]) 19148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 191561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "STA", 1, argc, argv); 19168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 19178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_ctrl_command_sta(struct wpa_ctrl *ctrl, char *cmd, 19208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *addr, size_t addr_len) 19218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 19228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[4096], *pos; 19238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 19248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 19258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_conn == NULL) { 19278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Not connected to hostapd - command dropped.\n"); 19288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 19298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19307d56b75791f317618c9c3ff08a4cfc36c91c9611Dmitry Shmidt if (ifname_prefix) { 19317d56b75791f317618c9c3ff08a4cfc36c91c9611Dmitry Shmidt os_snprintf(buf, sizeof(buf), "IFNAME=%s %s", 19327d56b75791f317618c9c3ff08a4cfc36c91c9611Dmitry Shmidt ifname_prefix, cmd); 19337d56b75791f317618c9c3ff08a4cfc36c91c9611Dmitry Shmidt buf[sizeof(buf) - 1] = '\0'; 19347d56b75791f317618c9c3ff08a4cfc36c91c9611Dmitry Shmidt cmd = buf; 19357d56b75791f317618c9c3ff08a4cfc36c91c9611Dmitry Shmidt } 19368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = sizeof(buf) - 1; 193704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len, 19388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_msg_cb); 19398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret == -2) { 19408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("'%s' command timed out.\n", cmd); 19418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -2; 19428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (ret < 0) { 19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("'%s' command failed.\n", cmd); 19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 19458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[len] = '\0'; 194804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_memcmp(buf, "FAIL", 4) == 0) 19498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 19508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s", buf); 19518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = buf; 19538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != '\0' && *pos != '\n') 19548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 19558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos = '\0'; 19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlcpy(addr, buf, addr_len); 19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_all_sta(struct wpa_ctrl *ctrl, int argc, char *argv[]) 19628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 19638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char addr[32], cmd[64]; 19648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_ctrl_command_sta(ctrl, "STA-FIRST", addr, sizeof(addr))) 19668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt do { 19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(cmd, sizeof(cmd), "STA-NEXT %s", addr); 19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } while (wpa_ctrl_command_sta(ctrl, cmd, addr, sizeof(addr)) == 0); 19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 19728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 197304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 197404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 197504949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_deauthenticate(struct wpa_ctrl *ctrl, int argc, 197604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *argv[]) 197704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 197861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "DEAUTHENTICATE", 1, argc, argv); 197904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 198004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 198104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 198204949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_disassociate(struct wpa_ctrl *ctrl, int argc, 198304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *argv[]) 198404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 198561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "DISASSOCIATE", 1, argc, argv); 198604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 1987e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 1988e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidtstatic int wpa_cli_cmd_chanswitch(struct wpa_ctrl *ctrl, int argc, 1989e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt char *argv[]) 1990e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt{ 1991e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt return wpa_cli_cmd(ctrl, "CHAN_SWITCH", 2, argc, argv); 1992e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt} 1993e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt 19948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_AP */ 19958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_suspend(struct wpa_ctrl *ctrl, int argc, char *argv[]) 19988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 19998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "SUSPEND"); 20008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 20018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_resume(struct wpa_ctrl *ctrl, int argc, char *argv[]) 20048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 20058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "RESUME"); 20068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 20078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 200921de214b4ba4271ca20843f3b8fba9f1501b2a89Dmitry Shmidt#ifdef CONFIG_TESTING_OPTIONS 20108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_drop_sa(struct wpa_ctrl *ctrl, int argc, char *argv[]) 20118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 20128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "DROP_SA"); 20138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 201421de214b4ba4271ca20843f3b8fba9f1501b2a89Dmitry Shmidt#endif /* CONFIG_TESTING_OPTIONS */ 20158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_roam(struct wpa_ctrl *ctrl, int argc, char *argv[]) 20188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 201961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "ROAM", 1, argc, argv); 20208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 20218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt#ifdef CONFIG_MESH 20246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 20256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic int wpa_cli_cmd_mesh_interface_add(struct wpa_ctrl *ctrl, int argc, 20266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt char *argv[]) 20276c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt{ 20286c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpa_cli_cmd(ctrl, "MESH_INTERFACE_ADD", 0, argc, argv); 20296c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt} 20306c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 20316c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 20326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic int wpa_cli_cmd_mesh_group_add(struct wpa_ctrl *ctrl, int argc, 20336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt char *argv[]) 20346c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt{ 20356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpa_cli_cmd(ctrl, "MESH_GROUP_ADD", 1, argc, argv); 20366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt} 20376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 20386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 20396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic int wpa_cli_cmd_mesh_group_remove(struct wpa_ctrl *ctrl, int argc, 20406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt char *argv[]) 20416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt{ 20426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpa_cli_cmd(ctrl, "MESH_GROUP_REMOVE", 1, argc, argv); 20436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt} 20446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 2045e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 2046e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidtstatic int wpa_cli_cmd_mesh_peer_remove(struct wpa_ctrl *ctrl, int argc, 2047e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt char *argv[]) 2048e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt{ 2049e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return wpa_cli_cmd(ctrl, "MESH_PEER_REMOVE", 1, argc, argv); 2050e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt} 2051e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 2052e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 2053e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidtstatic int wpa_cli_cmd_mesh_peer_add(struct wpa_ctrl *ctrl, int argc, 2054e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt char *argv[]) 2055e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt{ 2056e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt return wpa_cli_cmd(ctrl, "MESH_PEER_ADD", 1, argc, argv); 2057e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt} 2058e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 20596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt#endif /* CONFIG_MESH */ 20606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 20616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 20628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 20638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_find(struct wpa_ctrl *ctrl, int argc, char *argv[]) 20658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 206661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "P2P_FIND", 0, argc, argv); 206761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 20688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 207061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic char ** wpa_cli_complete_p2p_find(const char *str, int pos) 207161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 207261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char **res = NULL; 207361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt int arg = get_cmd_arg_num(str, pos); 207461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 207561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt res = os_calloc(6, sizeof(char *)); 207661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (res == NULL) 207761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return NULL; 207861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt res[0] = os_strdup("type=social"); 207961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (res[0] == NULL) { 208061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt os_free(res); 208161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return NULL; 208261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 208361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt res[1] = os_strdup("type=progressive"); 208461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (res[1] == NULL) 208561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return res; 208661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt res[2] = os_strdup("delay="); 208761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (res[2] == NULL) 208861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return res; 208961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt res[3] = os_strdup("dev_id="); 209061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (res[3] == NULL) 209161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return res; 209261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (arg == 1) 209361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt res[4] = os_strdup("[timeout]"); 209461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 209561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return res; 20968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 20978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_stop_find(struct wpa_ctrl *ctrl, int argc, 21008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 21018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 21028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "P2P_STOP_FIND"); 21038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 21048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2106216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidtstatic int wpa_cli_cmd_p2p_asp_provision(struct wpa_ctrl *ctrl, int argc, 2107216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt char *argv[]) 2108216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt{ 2109216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt return wpa_cli_cmd(ctrl, "P2P_ASP_PROVISION", 3, argc, argv); 2110216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt} 2111216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt 2112216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt 2113216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidtstatic int wpa_cli_cmd_p2p_asp_provision_resp(struct wpa_ctrl *ctrl, int argc, 2114216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt char *argv[]) 2115216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt{ 2116216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt return wpa_cli_cmd(ctrl, "P2P_ASP_PROVISION_RESP", 2, argc, argv); 2117216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt} 2118216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt 2119216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt 21208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_connect(struct wpa_ctrl *ctrl, int argc, 21218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 21228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 212361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "P2P_CONNECT", 2, argc, argv); 21248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 21258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** wpa_cli_complete_p2p_connect(const char *str, int pos) 21281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 21291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int arg = get_cmd_arg_num(str, pos); 21301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char **res = NULL; 21311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 21321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt switch (arg) { 21331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case 1: 21341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = cli_txt_list_array(&p2p_peers); 21351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 21361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 21371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 21381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return res; 21391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 21401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 21411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 21428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_listen(struct wpa_ctrl *ctrl, int argc, 21438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 21448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 214561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "P2P_LISTEN", 0, argc, argv); 21468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 21478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_group_remove(struct wpa_ctrl *ctrl, int argc, 21508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 21518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 215261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "P2P_GROUP_REMOVE", 1, argc, argv); 21538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 21548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** wpa_cli_complete_p2p_group_remove(const char *str, int pos) 21571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 21581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int arg = get_cmd_arg_num(str, pos); 21591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char **res = NULL; 21601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 21611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt switch (arg) { 21621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case 1: 21631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = cli_txt_list_array(&p2p_groups); 21641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 21651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 21661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 21671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return res; 21681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 21691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 21701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 21718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_group_add(struct wpa_ctrl *ctrl, int argc, 21728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 21738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 217461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "P2P_GROUP_ADD", 0, argc, argv); 21758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 21768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_prov_disc(struct wpa_ctrl *ctrl, int argc, 21798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 21808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 21811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (argc != 2 && argc != 3) { 21821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt printf("Invalid P2P_PROV_DISC command: needs at least " 21831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "two arguments, address and config method\n" 21841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "(display, keypad, or pbc) and an optional join\n"); 21858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 21868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 218861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "P2P_PROV_DISC", 2, argc, argv); 21898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 21908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_get_passphrase(struct wpa_ctrl *ctrl, int argc, 21938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 21948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 21958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "P2P_GET_PASSPHRASE"); 21968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 21978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_req(struct wpa_ctrl *ctrl, int argc, 22008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 22018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 22028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[4096]; 22038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2204216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt if (argc < 2) { 22058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid P2P_SERV_DISC_REQ command: needs two " 2206216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt "or more arguments (address and TLVs)\n"); 22078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 22088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 221061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (write_cmd(cmd, sizeof(cmd), "P2P_SERV_DISC_REQ", argc, argv) < 0) 22118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 22128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 22138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 22148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_cancel_req(struct wpa_ctrl *ctrl, 22178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int argc, char *argv[]) 22188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 221961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "P2P_SERV_DISC_CANCEL_REQ", 1, argc, argv); 22208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 22218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_resp(struct wpa_ctrl *ctrl, int argc, 22248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 22258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 22268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[4096]; 22278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 22288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 4) { 22308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid P2P_SERV_DISC_RESP command: needs four " 22318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "arguments (freq, address, dialog token, and TLVs)\n"); 22328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 22338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_SERV_DISC_RESP %s %s %s %s", 22368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1], argv[2], argv[3]); 22376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(sizeof(cmd), res)) 22388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 22398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 22408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 22418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 22428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_update(struct wpa_ctrl *ctrl, int argc, 22458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 22468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 22478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "P2P_SERVICE_UPDATE"); 22488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 22498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_external(struct wpa_ctrl *ctrl, 22528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int argc, char *argv[]) 22538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 225461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "P2P_SERV_DISC_EXTERNAL", 1, argc, argv); 22558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 22568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_flush(struct wpa_ctrl *ctrl, int argc, 22598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 22608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 22618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "P2P_SERVICE_FLUSH"); 22628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 22638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_add(struct wpa_ctrl *ctrl, int argc, 22668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 22678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2268216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt if (argc < 3) { 2269216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt printf("Invalid P2P_SERVICE_ADD command: needs 3-6 arguments\n"); 2270216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt return -1; 2271216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt } 22728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2273216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt return wpa_cli_cmd(ctrl, "P2P_SERVICE_ADD", 3, argc, argv); 2274216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt} 2275216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt 2276216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt 2277216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_rep(struct wpa_ctrl *ctrl, int argc, 2278216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt char *argv[]) 2279216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt{ 2280216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt if (argc < 5 || argc > 6) { 2281216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt printf("Invalid P2P_SERVICE_REP command: needs 5-6 " 22828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "arguments\n"); 22838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 22848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2286216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt return wpa_cli_cmd(ctrl, "P2P_SERVICE_REP", 5, argc, argv); 22878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 22888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_del(struct wpa_ctrl *ctrl, int argc, 22918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 22928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 22938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[4096]; 22948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 22958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 2 && argc != 3) { 22978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid P2P_SERVICE_DEL command: needs two or three " 22988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "arguments\n"); 22998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 23008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 3) 23038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), 23048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "P2P_SERVICE_DEL %s %s %s", 23058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1], argv[2]); 23068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 23078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), 23088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "P2P_SERVICE_DEL %s %s", 23098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 23106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(sizeof(cmd), res)) 23118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 23128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 23138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 23148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 23158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_reject(struct wpa_ctrl *ctrl, 23188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int argc, char *argv[]) 23198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 232061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "P2P_REJECT", 1, argc, argv); 23218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 23228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_invite(struct wpa_ctrl *ctrl, 23258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int argc, char *argv[]) 23268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 232761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "P2P_INVITE", 1, argc, argv); 23288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 23298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_peer(struct wpa_ctrl *ctrl, int argc, char *argv[]) 23328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 233361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "P2P_PEER", 1, argc, argv); 23348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 23358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** wpa_cli_complete_p2p_peer(const char *str, int pos) 23381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 23391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int arg = get_cmd_arg_num(str, pos); 23401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char **res = NULL; 23411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 23421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt switch (arg) { 23431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case 1: 23441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = cli_txt_list_array(&p2p_peers); 23451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 23461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 23471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 23481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return res; 23491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 23501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 23511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 23528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_ctrl_command_p2p_peer(struct wpa_ctrl *ctrl, char *cmd, 23538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *addr, size_t addr_len, 23548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int discovered) 23558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 23568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[4096], *pos; 23578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 23588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 23598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_conn == NULL) 23618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 23628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = sizeof(buf) - 1; 236304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len, 23648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_msg_cb); 23658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret == -2) { 23668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("'%s' command timed out.\n", cmd); 23678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -2; 23688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (ret < 0) { 23698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("'%s' command failed.\n", cmd); 23708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 23718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[len] = '\0'; 237404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (os_memcmp(buf, "FAIL", 4) == 0) 23758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 23768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = buf; 23788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != '\0' && *pos != '\n') 23798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 23808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = '\0'; 23818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlcpy(addr, buf, addr_len); 23828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!discovered || os_strstr(pos, "[PROBE_REQ_ONLY]") == NULL) 23838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s\n", addr); 23848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 23858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 23868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_peers(struct wpa_ctrl *ctrl, int argc, char *argv[]) 23898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 23908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char addr[32], cmd[64]; 23918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int discovered; 23928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt discovered = argc > 0 && os_strcmp(argv[0], "discovered") == 0; 23948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_ctrl_command_p2p_peer(ctrl, "P2P_PEER FIRST", 23968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addr, sizeof(addr), discovered)) 23971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 23988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt do { 23998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(cmd, sizeof(cmd), "P2P_PEER NEXT-%s", addr); 24008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } while (wpa_ctrl_command_p2p_peer(ctrl, cmd, addr, sizeof(addr), 24018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt discovered) == 0); 24028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return 0; 24048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 24058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_set(struct wpa_ctrl *ctrl, int argc, char *argv[]) 24088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 240961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "P2P_SET", 2, argc, argv); 24108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 24118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2413391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidtstatic char ** wpa_cli_complete_p2p_set(const char *str, int pos) 2414391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt{ 2415391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt int arg = get_cmd_arg_num(str, pos); 2416391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt const char *fields[] = { 2417391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt "discoverability", 2418391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt "managed", 2419391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt "listen_channel", 2420391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt "ssid_postfix", 2421391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt "noa", 2422391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt "ps", 2423391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt "oppps", 2424391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt "ctwindow", 2425391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt "disabled", 2426391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt "conc_pref", 2427391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt "force_long_sd", 2428391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt "peer_filter", 2429391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt "cross_connect", 2430391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt "go_apsd", 2431391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt "client_apsd", 2432391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt "disallow_freq", 2433391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt "disc_int", 2434391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt "per_sta_psk", 2435391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt }; 243668d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt int i, num_fields = ARRAY_SIZE(fields); 2437391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt 2438391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt if (arg == 1) { 2439391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt char **res = os_calloc(num_fields + 1, sizeof(char *)); 2440391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt if (res == NULL) 2441391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt return NULL; 2442391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt for (i = 0; i < num_fields; i++) { 2443391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt res[i] = os_strdup(fields[i]); 2444391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt if (res[i] == NULL) 2445391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt return res; 2446391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt } 2447391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt return res; 2448391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt } 2449391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt 2450391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt if (arg == 2 && os_strncasecmp(str, "p2p_set peer_filter ", 20) == 0) 2451391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt return cli_txt_list_array(&p2p_peers); 2452391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt 2453391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt return NULL; 2454391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt} 2455391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt 2456391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt 24578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_flush(struct wpa_ctrl *ctrl, int argc, char *argv[]) 24588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 24598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "P2P_FLUSH"); 24608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 24618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_cancel(struct wpa_ctrl *ctrl, int argc, 24648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 24658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 24668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "P2P_CANCEL"); 24678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 24688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_unauthorize(struct wpa_ctrl *ctrl, int argc, 24718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 24728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 247361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "P2P_UNAUTHORIZE", 1, argc, argv); 247461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 24758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 247661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 247761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_p2p_presence_req(struct wpa_ctrl *ctrl, int argc, 247861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *argv[]) 247961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 248061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (argc != 0 && argc != 2 && argc != 4) { 248161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt printf("Invalid P2P_PRESENCE_REQ command: needs two arguments " 248261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "(preferred duration, interval; in microsecods).\n" 248361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "Optional second pair can be used to provide " 248461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "acceptable values.\n"); 248561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 248661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 248761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 248861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "P2P_PRESENCE_REQ", 0, argc, argv); 248961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 249061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 249161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 249261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_p2p_ext_listen(struct wpa_ctrl *ctrl, int argc, 249361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *argv[]) 249461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 249561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (argc != 0 && argc != 2) { 249661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt printf("Invalid P2P_EXT_LISTEN command: needs two arguments " 249761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "(availability period, availability interval; in " 249861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "millisecods).\n" 249961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "Extended Listen Timing can be cancelled with this " 250061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "command when used without parameters.\n"); 25018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 25028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 250461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "P2P_EXT_LISTEN", 0, argc, argv); 25058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 25068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2507391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt 2508391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidtstatic int wpa_cli_cmd_p2p_remove_client(struct wpa_ctrl *ctrl, int argc, 2509391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt char *argv[]) 2510391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt{ 2511391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt return wpa_cli_cmd(ctrl, "P2P_REMOVE_CLIENT", 1, argc, argv); 2512391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt} 2513391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt 2514d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 2515d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtstatic int wpa_cli_cmd_vendor_elem_add(struct wpa_ctrl *ctrl, int argc, 2516d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt char *argv[]) 2517d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt{ 2518d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt return wpa_cli_cmd(ctrl, "VENDOR_ELEM_ADD", 2, argc, argv); 2519d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt} 2520d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 2521d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 2522d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtstatic int wpa_cli_cmd_vendor_elem_get(struct wpa_ctrl *ctrl, int argc, 2523d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt char *argv[]) 2524d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt{ 2525d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt return wpa_cli_cmd(ctrl, "VENDOR_ELEM_GET", 1, argc, argv); 2526d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt} 2527d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 2528d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 2529d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtstatic int wpa_cli_cmd_vendor_elem_remove(struct wpa_ctrl *ctrl, int argc, 2530d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt char *argv[]) 2531d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt{ 2532d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt return wpa_cli_cmd(ctrl, "VENDOR_ELEM_REMOVE", 2, argc, argv); 2533d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt} 2534d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 253561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_P2P */ 25368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 253761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#ifdef CONFIG_WIFI_DISPLAY 253861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 253961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_wfd_subelem_set(struct wpa_ctrl *ctrl, int argc, 254061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *argv[]) 25418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 25428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[100]; 25438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 25448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 254561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (argc != 1 && argc != 2) { 254661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt printf("Invalid WFD_SUBELEM_SET command: needs one or two " 254761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "arguments (subelem, hexdump)\n"); 25488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 25498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 255161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "WFD_SUBELEM_SET %s %s", 255261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt argv[0], argc > 1 ? argv[1] : ""); 25536c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(sizeof(cmd), res)) 25548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 25558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 25568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 25578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 25588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 256061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_wfd_subelem_get(struct wpa_ctrl *ctrl, int argc, 256161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *argv[]) 25628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 25638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[100]; 25648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 25658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 256661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (argc != 1) { 256761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt printf("Invalid WFD_SUBELEM_GET command: needs one " 256861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "argument (subelem)\n"); 25698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 25708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 257261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "WFD_SUBELEM_GET %s", 257361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt argv[0]); 25746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (os_snprintf_error(sizeof(cmd), res)) 25758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 25768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 25778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 25788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 257961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_WIFI_DISPLAY */ 25808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_INTERWORKING 25831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_fetch_anqp(struct wpa_ctrl *ctrl, int argc, 25841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *argv[]) 25851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 25861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpa_ctrl_command(ctrl, "FETCH_ANQP"); 25871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 25881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_stop_fetch_anqp(struct wpa_ctrl *ctrl, int argc, 25911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *argv[]) 25921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 25931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpa_ctrl_command(ctrl, "STOP_FETCH_ANQP"); 25941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 25951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_interworking_select(struct wpa_ctrl *ctrl, int argc, 25981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *argv[]) 25991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 260061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "INTERWORKING_SELECT", 0, argc, argv); 26011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 26021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 26031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 26041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_interworking_connect(struct wpa_ctrl *ctrl, int argc, 26051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *argv[]) 26061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 260761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "INTERWORKING_CONNECT", 1, argc, argv); 260861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 26091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 26101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 26117f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidtstatic int wpa_cli_cmd_interworking_add_network(struct wpa_ctrl *ctrl, int argc, 26127f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt char *argv[]) 26137f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt{ 26147f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt return wpa_cli_cmd(ctrl, "INTERWORKING_ADD_NETWORK", 1, argc, argv); 26157f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt} 26167f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt 26177f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt 261861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_anqp_get(struct wpa_ctrl *ctrl, int argc, char *argv[]) 261961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 262061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "ANQP_GET", 2, argc, argv); 26211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 26221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 26231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 262461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_gas_request(struct wpa_ctrl *ctrl, int argc, 262561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *argv[]) 26261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 262761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "GAS_REQUEST", 2, argc, argv); 262861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 26291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 26301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 263161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_gas_response_get(struct wpa_ctrl *ctrl, int argc, 263261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *argv[]) 263361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 263461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "GAS_RESPONSE_GET", 2, argc, argv); 26351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 26361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_INTERWORKING */ 26371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 26381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 263904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_HS20 264004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 264104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_hs20_anqp_get(struct wpa_ctrl *ctrl, int argc, 264204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *argv[]) 264304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 264461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "HS20_ANQP_GET", 2, argc, argv); 264504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 264604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 264704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 264804949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_get_nai_home_realm_list(struct wpa_ctrl *ctrl, int argc, 264904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char *argv[]) 265004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 265104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt char cmd[512]; 265204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 265304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (argc == 0) { 265404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt printf("Command needs one or two arguments (dst mac addr and " 265504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "optional home realm)\n"); 265604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 265704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt } 265804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 265961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (write_cmd(cmd, sizeof(cmd), "HS20_GET_NAI_HOME_REALM_LIST", 266061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt argc, argv) < 0) 266104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return -1; 266204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 266304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 266404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 266504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 2666f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 2667f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidtstatic int wpa_cli_cmd_hs20_icon_request(struct wpa_ctrl *ctrl, int argc, 2668f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt char *argv[]) 2669f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt{ 2670f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt char cmd[512]; 2671f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 2672f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (argc < 2) { 2673f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt printf("Command needs two arguments (dst mac addr and " 2674f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt "icon name)\n"); 2675f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return -1; 2676f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt } 2677f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 2678f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt if (write_cmd(cmd, sizeof(cmd), "HS20_ICON_REQUEST", argc, argv) < 0) 2679f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return -1; 2680f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 2681f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 2682f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt} 2683f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 2684f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 2685f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidtstatic int wpa_cli_cmd_fetch_osu(struct wpa_ctrl *ctrl, int argc, char *argv[]) 2686f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt{ 2687f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return wpa_ctrl_command(ctrl, "FETCH_OSU"); 2688f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt} 2689f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 2690f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 2691f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidtstatic int wpa_cli_cmd_cancel_fetch_osu(struct wpa_ctrl *ctrl, int argc, 2692f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt char *argv[]) 2693f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt{ 2694f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt return wpa_ctrl_command(ctrl, "CANCEL_FETCH_OSU"); 2695f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt} 2696f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt 269704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_HS20 */ 269804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 269904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 27008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_sta_autoconnect(struct wpa_ctrl *ctrl, int argc, 27018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 27028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 270361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "STA_AUTOCONNECT", 1, argc, argv); 27048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_tdls_discover(struct wpa_ctrl *ctrl, int argc, 27088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 27098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 271061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "TDLS_DISCOVER", 1, argc, argv); 27118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_tdls_setup(struct wpa_ctrl *ctrl, int argc, 27158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 27168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 271761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "TDLS_SETUP", 1, argc, argv); 27188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_tdls_teardown(struct wpa_ctrl *ctrl, int argc, 27228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 27238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 272461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "TDLS_TEARDOWN", 1, argc, argv); 27258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2728cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidtstatic int wpa_cli_cmd_tdls_link_status(struct wpa_ctrl *ctrl, int argc, 2729cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt char *argv[]) 2730cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt{ 2731cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt return wpa_cli_cmd(ctrl, "TDLS_LINK_STATUS", 1, argc, argv); 2732cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt} 2733cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt 2734cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt 27356c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic int wpa_cli_cmd_wmm_ac_addts(struct wpa_ctrl *ctrl, int argc, 27366c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt char *argv[]) 27376c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt{ 27386c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpa_cli_cmd(ctrl, "WMM_AC_ADDTS", 3, argc, argv); 27396c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt} 27406c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 27416c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 27426c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic int wpa_cli_cmd_wmm_ac_delts(struct wpa_ctrl *ctrl, int argc, 27436c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt char *argv[]) 27446c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt{ 27456c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpa_cli_cmd(ctrl, "WMM_AC_DELTS", 1, argc, argv); 27466c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt} 27476c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 27486c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 27496c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic int wpa_cli_cmd_wmm_ac_status(struct wpa_ctrl *ctrl, int argc, 27506c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt char *argv[]) 27516c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt{ 27526c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpa_ctrl_command(ctrl, "WMM_AC_STATUS"); 27536c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt} 27546c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 27556c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 27566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic int wpa_cli_cmd_tdls_chan_switch(struct wpa_ctrl *ctrl, int argc, 27576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt char *argv[]) 27586c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt{ 27596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpa_cli_cmd(ctrl, "TDLS_CHAN_SWITCH", 2, argc, argv); 27606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt} 27616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 27626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 27636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic int wpa_cli_cmd_tdls_cancel_chan_switch(struct wpa_ctrl *ctrl, int argc, 27646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt char *argv[]) 27656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt{ 27666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpa_cli_cmd(ctrl, "TDLS_CANCEL_CHAN_SWITCH", 1, argc, argv); 27676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt} 27686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 27696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 27708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_signal_poll(struct wpa_ctrl *ctrl, int argc, 27718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 27728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 27738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "SIGNAL_POLL"); 27748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 27758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27777d56b75791f317618c9c3ff08a4cfc36c91c9611Dmitry Shmidtstatic int wpa_cli_cmd_signal_monitor(struct wpa_ctrl *ctrl, int argc, 27787d56b75791f317618c9c3ff08a4cfc36c91c9611Dmitry Shmidt char *argv[]) 27797d56b75791f317618c9c3ff08a4cfc36c91c9611Dmitry Shmidt{ 27807d56b75791f317618c9c3ff08a4cfc36c91c9611Dmitry Shmidt return wpa_cli_cmd(ctrl, "SIGNAL_MONITOR", 0, argc, argv); 27817d56b75791f317618c9c3ff08a4cfc36c91c9611Dmitry Shmidt} 27827d56b75791f317618c9c3ff08a4cfc36c91c9611Dmitry Shmidt 27837d56b75791f317618c9c3ff08a4cfc36c91c9611Dmitry Shmidt 2784fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zhengstatic int wpa_cli_cmd_pktcnt_poll(struct wpa_ctrl *ctrl, int argc, 2785fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng char *argv[]) 2786fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng{ 2787fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng return wpa_ctrl_command(ctrl, "PKTCNT_POLL"); 2788fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng} 2789fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng 2790fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng 27911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_reauthenticate(struct wpa_ctrl *ctrl, int argc, 27921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *argv[]) 27931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 27941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpa_ctrl_command(ctrl, "REAUTHENTICATE"); 27951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 27961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 279704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 279804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN 279904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 280004949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int wpa_cli_cmd_autoscan(struct wpa_ctrl *ctrl, int argc, char *argv[]) 280104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{ 280204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt if (argc == 0) 280304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt return wpa_ctrl_command(ctrl, "AUTOSCAN "); 280404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 280561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, "AUTOSCAN", 0, argc, argv); 280604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt} 280704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 280804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */ 280904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 281004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt 2811a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt#ifdef CONFIG_WNM 2812a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt 2813a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidtstatic int wpa_cli_cmd_wnm_sleep(struct wpa_ctrl *ctrl, int argc, char *argv[]) 2814a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt{ 2815a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt return wpa_cli_cmd(ctrl, "WNM_SLEEP", 0, argc, argv); 2816a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt} 2817a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt 281844c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt 281944c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidtstatic int wpa_cli_cmd_wnm_bss_query(struct wpa_ctrl *ctrl, int argc, char *argv[]) 282044c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt{ 282144c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt return wpa_cli_cmd(ctrl, "WNM_BSS_QUERY", 1, argc, argv); 282244c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt} 282344c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt 2824a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt#endif /* CONFIG_WNM */ 2825a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt 2826a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt 282761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int wpa_cli_cmd_raw(struct wpa_ctrl *ctrl, int argc, char *argv[]) 282861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 282961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (argc == 0) 283061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 283161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_cmd(ctrl, argv[0], 0, argc - 1, &argv[1]); 283261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 283361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 283461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 2835c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#ifdef ANDROID 28360716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidtstatic int wpa_cli_cmd_driver(struct wpa_ctrl *ctrl, int argc, char *argv[]) 28370716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt{ 2838292b0c3a742226c295f8db76eaef9e90c90e7513Dmitry Shmidt return wpa_cli_cmd(ctrl, "DRIVER", 1, argc, argv); 28390716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt} 2840292b0c3a742226c295f8db76eaef9e90c90e7513Dmitry Shmidt#endif /* ANDROID */ 28410716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt 284261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 2843a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidtstatic int wpa_cli_cmd_vendor(struct wpa_ctrl *ctrl, int argc, char *argv[]) 2844a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt{ 2845a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt return wpa_cli_cmd(ctrl, "VENDOR", 1, argc, argv); 2846a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt} 2847a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt 2848a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt 2849444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidtstatic int wpa_cli_cmd_flush(struct wpa_ctrl *ctrl, int argc, char *argv[]) 2850444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt{ 2851444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt return wpa_ctrl_command(ctrl, "FLUSH"); 2852444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt} 2853444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt 2854444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt 2855fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidtstatic int wpa_cli_cmd_radio_work(struct wpa_ctrl *ctrl, int argc, char *argv[]) 2856fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt{ 2857fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt return wpa_cli_cmd(ctrl, "RADIO_WORK", 1, argc, argv); 2858fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt} 2859fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 2860fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 28616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic int wpa_cli_cmd_neighbor_rep_request(struct wpa_ctrl *ctrl, int argc, 28626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt char *argv[]) 28636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt{ 28646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpa_cli_cmd(ctrl, "NEIGHBOR_REP_REQUEST", 0, argc, argv); 28656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt} 28666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 28676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 28686c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic int wpa_cli_cmd_erp_flush(struct wpa_ctrl *ctrl, int argc, char *argv[]) 28696c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt{ 28706c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpa_ctrl_command(ctrl, "ERP_FLUSH"); 28716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt} 28726c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 28736c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 28746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidtstatic int wpa_cli_cmd_mac_rand_scan(struct wpa_ctrl *ctrl, int argc, 28756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt char *argv[]) 28766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt{ 28776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt return wpa_cli_cmd(ctrl, "MAC_RAND_SCAN", 1, argc, argv); 28786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt} 28796c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 28806c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt 2881d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidtstatic int wpa_cli_cmd_get_pref_freq_list(struct wpa_ctrl *ctrl, int argc, 2882d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt char *argv[]) 2883d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt{ 2884d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt return wpa_cli_cmd(ctrl, "GET_PREF_FREQ_LIST", 1, argc, argv); 2885d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt} 2886d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 2887d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 28888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtenum wpa_cli_cmd_flags { 28898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none = 0x00, 28908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive = 0x01 28918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 28928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 28938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpa_cli_cmd { 28948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *cmd; 28958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int (*handler)(struct wpa_ctrl *ctrl, int argc, char *argv[]); 289661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char ** (*completion)(const char *str, int pos); 28978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt enum wpa_cli_cmd_flags flags; 28988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *usage; 28998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 29008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 29011d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidtstatic const struct wpa_cli_cmd wpa_cli_commands[] = { 290261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "status", wpa_cli_cmd_status, NULL, 29038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "[verbose] = get current WPA/EAPOL/EAP status" }, 290561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "ifname", wpa_cli_cmd_ifname, NULL, 290661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt cli_cmd_flag_none, 290761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "= get current interface name" }, 290861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "ping", wpa_cli_cmd_ping, NULL, 29098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= pings wpa_supplicant" }, 291161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "relog", wpa_cli_cmd_relog, NULL, 29128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= re-open log-file (allow rolling logs)" }, 291461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "note", wpa_cli_cmd_note, NULL, 29158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<text> = add a note to wpa_supplicant debug log" }, 291761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "mib", wpa_cli_cmd_mib, NULL, 29188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= get MIB variables (dot1x, dot11)" }, 292061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "help", wpa_cli_cmd_help, wpa_cli_complete_help, 29218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 292261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "[command] = show usage help" }, 292361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "interface", wpa_cli_cmd_interface, NULL, 29248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "[ifname] = show interfaces/select interface" }, 292661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "level", wpa_cli_cmd_level, NULL, 29278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<debug level> = change debug level" }, 292961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "license", wpa_cli_cmd_license, NULL, 29308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= show full wpa_cli license" }, 293261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "quit", wpa_cli_cmd_quit, NULL, 29338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= exit wpa_cli" }, 293551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt { "set", wpa_cli_cmd_set, wpa_cli_complete_set, 29368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= set variables (shows list of variables when run without " 29388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "arguments)" }, 29397f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt { "dump", wpa_cli_cmd_dump, NULL, 29407f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt cli_cmd_flag_none, 29417f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt "= dump config variables" }, 2942f73259cc00af557e36add405799b7f2326587c13Dmitry Shmidt { "get", wpa_cli_cmd_get, wpa_cli_complete_get, 29438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<name> = get information" }, 294561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "logon", wpa_cli_cmd_logon, NULL, 29468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= IEEE 802.1X EAPOL state machine logon" }, 294861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "logoff", wpa_cli_cmd_logoff, NULL, 29498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= IEEE 802.1X EAPOL state machine logoff" }, 295161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "pmksa", wpa_cli_cmd_pmksa, NULL, 29528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= show PMKSA cache" }, 2954661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt { "pmksa_flush", wpa_cli_cmd_pmksa_flush, NULL, 2955661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt cli_cmd_flag_none, 2956661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt "= flush PMKSA cache entries" }, 295761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "reassociate", wpa_cli_cmd_reassociate, NULL, 29588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= force reassociation" }, 29609866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt { "reattach", wpa_cli_cmd_reattach, NULL, 29619866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt cli_cmd_flag_none, 29629866086a955d00e237cc8df3722e7dff75c02532Dmitry Shmidt "= force reassociation back to the same BSS" }, 296361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "preauthenticate", wpa_cli_cmd_preauthenticate, wpa_cli_complete_bss, 29648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<BSSID> = force preauthentication" }, 296661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "identity", wpa_cli_cmd_identity, NULL, 29678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> <identity> = configure identity for an SSID" }, 296961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "password", wpa_cli_cmd_password, NULL, 29708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 29718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> <password> = configure password for an SSID" }, 297261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "new_password", wpa_cli_cmd_new_password, NULL, 29738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 29748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> <password> = change password for an SSID" }, 297561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "pin", wpa_cli_cmd_pin, NULL, 29768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 29778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> <pin> = configure pin for an SSID" }, 297861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "otp", wpa_cli_cmd_otp, NULL, 29798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 29808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> <password> = configure one-time-password for an SSID" 29818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }, 298261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "passphrase", wpa_cli_cmd_passphrase, NULL, 29838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 29848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> <passphrase> = configure private key passphrase\n" 29858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " for an SSID" }, 2986051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt { "sim", wpa_cli_cmd_sim, NULL, 2987051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt cli_cmd_flag_sensitive, 2988051af73b8f8014eff33330aead0f36944b3403e6Dmitry Shmidt "<network id> <pin> = report SIM operation result" }, 298961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "bssid", wpa_cli_cmd_bssid, NULL, 29908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> <BSSID> = set preferred BSSID for an SSID" }, 299261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "blacklist", wpa_cli_cmd_blacklist, wpa_cli_complete_bss, 2993696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt cli_cmd_flag_none, 2994696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt "<BSSID> = add a BSSID to the blacklist\n" 2995696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt "blacklist clear = clear the blacklist\n" 2996696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt "blacklist = display the blacklist" }, 299761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "log_level", wpa_cli_cmd_log_level, NULL, 2998696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt cli_cmd_flag_none, 29991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "<level> [<timestamp>] = update the log level/timestamp\n" 3000696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt "log_level = display the current log level and log options" }, 300161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "list_networks", wpa_cli_cmd_list_networks, NULL, 30028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= list configured networks" }, 3004912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt { "select_network", wpa_cli_cmd_select_network, 3005912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt wpa_cli_complete_network_id, 30068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> = select a network (disable others)" }, 3008912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt { "enable_network", wpa_cli_cmd_enable_network, 3009912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt wpa_cli_complete_network_id, 30108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> = enable a network" }, 3012912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt { "disable_network", wpa_cli_cmd_disable_network, 3013912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt wpa_cli_complete_network_id, 30148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> = disable a network" }, 301661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "add_network", wpa_cli_cmd_add_network, NULL, 30178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= add a network" }, 3019912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt { "remove_network", wpa_cli_cmd_remove_network, 3020912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt wpa_cli_complete_network_id, 30218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> = remove a network" }, 3023912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt { "set_network", wpa_cli_cmd_set_network, wpa_cli_complete_network, 30248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 30258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> <variable> <value> = set network variables (shows\n" 30268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " list of variables when run without arguments)" }, 3027912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt { "get_network", wpa_cli_cmd_get_network, wpa_cli_complete_network, 30288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> <variable> = get network variables" }, 3030912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt { "dup_network", wpa_cli_cmd_dup_network, wpa_cli_complete_dup_network, 3031684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt cli_cmd_flag_none, 3032684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt "<src network id> <dst network id> <variable> = duplicate network variables" 3033684785c7f4e58498603a9a5ce26f933cc2557ebdDmitry Shmidt }, 303461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "list_creds", wpa_cli_cmd_list_creds, NULL, 303504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cli_cmd_flag_none, 303604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "= list configured credentials" }, 303761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "add_cred", wpa_cli_cmd_add_cred, NULL, 303804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cli_cmd_flag_none, 303904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "= add a credential" }, 304061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "remove_cred", wpa_cli_cmd_remove_cred, NULL, 304104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cli_cmd_flag_none, 304204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "<cred id> = remove a credential" }, 304361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "set_cred", wpa_cli_cmd_set_cred, NULL, 304404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cli_cmd_flag_sensitive, 304504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "<cred id> <variable> <value> = set credential variables" }, 30460cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt { "get_cred", wpa_cli_cmd_get_cred, NULL, 30470cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt cli_cmd_flag_none, 30480cfd5f779f6cdd2f774a27bb1dec95d3940cd16aDmitry Shmidt "<cred id> <variable> = get credential variables" }, 304961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "save_config", wpa_cli_cmd_save_config, NULL, 30508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= save the current configuration" }, 305261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "disconnect", wpa_cli_cmd_disconnect, NULL, 30538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= disconnect and wait for reassociate/reconnect command before\n" 30558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " connecting" }, 305661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "reconnect", wpa_cli_cmd_reconnect, NULL, 30578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= like reassociate, but only takes effect if already disconnected" 30598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }, 306061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "scan", wpa_cli_cmd_scan, NULL, 30618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= request new BSS scan" }, 306361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "scan_results", wpa_cli_cmd_scan_results, NULL, 30648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= get latest scan results" }, 3066d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt { "abort_scan", wpa_cli_cmd_abort_scan, NULL, 3067d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt cli_cmd_flag_none, 3068d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt "= request ongoing scan to be aborted" }, 306961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "bss", wpa_cli_cmd_bss, wpa_cli_complete_bss, 30708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<<idx> | <bssid>> = get detailed scan result info" }, 307261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "get_capability", wpa_cli_cmd_get_capability, NULL, 30738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30748da800a193fb6f8832218715f82a7b4e2d2ad338Dmitry Shmidt "<eap/pairwise/group/key_mgmt/proto/auth_alg/channels/freq/modes> " 3075af9da3180dc20f57df1fc1e1811f3df9fa9e6ab5Dmitry Shmidt "= get capabilities" }, 307661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "reconfigure", wpa_cli_cmd_reconfigure, NULL, 30778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= force wpa_supplicant to re-read its configuration file" }, 307961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "terminate", wpa_cli_cmd_terminate, NULL, 30808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= terminate wpa_supplicant" }, 308261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "interface_add", wpa_cli_cmd_interface_add, NULL, 30838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<ifname> <confname> <driver> <ctrl_interface> <driver_param>\n" 3085d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt " <bridge_name> <create> <type> = adds new interface, all " 3086d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt "parameters but\n" 3087d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt " <ifname> are optional. Supported types are station ('sta') and " 3088d7ff03d48f825360eec2a371e3361306f2fd721bDmitry Shmidt "AP ('ap')" }, 308961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "interface_remove", wpa_cli_cmd_interface_remove, NULL, 30908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<ifname> = removes the interface" }, 309261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "interface_list", wpa_cli_cmd_interface_list, NULL, 30938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= list available interfaces" }, 309561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "ap_scan", wpa_cli_cmd_ap_scan, NULL, 30968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<value> = set ap_scan parameter" }, 309861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "scan_interval", wpa_cli_cmd_scan_interval, NULL, 30998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 31008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<value> = set scan_interval parameter (in seconds)" }, 310161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "bss_expire_age", wpa_cli_cmd_bss_expire_age, NULL, 31028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 31038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<value> = set BSS expiration age parameter" }, 310461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "bss_expire_count", wpa_cli_cmd_bss_expire_count, NULL, 31058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 31068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<value> = set BSS expiration scan count parameter" }, 310761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "bss_flush", wpa_cli_cmd_bss_flush, NULL, 3108f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt cli_cmd_flag_none, 3109f48e4f901d4b39a4e03210fe0154cdb11112e22eDmitry Shmidt "<value> = set BSS flush age (0 by default)" }, 311061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "stkstart", wpa_cli_cmd_stkstart, NULL, 31118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 31128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<addr> = request STK negotiation with <addr>" }, 311361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "ft_ds", wpa_cli_cmd_ft_ds, wpa_cli_complete_bss, 31148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 31158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<addr> = request over-the-DS FT with <addr>" }, 311661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "wps_pbc", wpa_cli_cmd_wps_pbc, wpa_cli_complete_bss, 31178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 31188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "[BSSID] = start Wi-Fi Protected Setup: Push Button Configuration" }, 311961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "wps_pin", wpa_cli_cmd_wps_pin, wpa_cli_complete_bss, 31208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 31218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<BSSID> [PIN] = start WPS PIN method (returns PIN, if not " 31228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "hardcoded)" }, 312361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "wps_check_pin", wpa_cli_cmd_wps_check_pin, NULL, 31248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 31258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<PIN> = verify PIN checksum" }, 312661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "wps_cancel", wpa_cli_cmd_wps_cancel, NULL, cli_cmd_flag_none, 31278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Cancels the pending WPS operation" }, 312804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_WPS_NFC 312961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "wps_nfc", wpa_cli_cmd_wps_nfc, wpa_cli_complete_bss, 313004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cli_cmd_flag_none, 313104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "[BSSID] = start Wi-Fi Protected Setup: NFC" }, 3132f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt { "wps_nfc_config_token", wpa_cli_cmd_wps_nfc_config_token, NULL, 3133f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt cli_cmd_flag_none, 3134f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt "<WPS|NDEF> = build configuration token" }, 313561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "wps_nfc_token", wpa_cli_cmd_wps_nfc_token, NULL, 313604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cli_cmd_flag_none, 313704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "<WPS|NDEF> = create password token" }, 313861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "wps_nfc_tag_read", wpa_cli_cmd_wps_nfc_tag_read, NULL, 313904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cli_cmd_flag_sensitive, 314004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "<hexdump of payload> = report read NFC tag with WPS data" }, 3141d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt { "nfc_get_handover_req", wpa_cli_cmd_nfc_get_handover_req, NULL, 3142d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt cli_cmd_flag_none, 3143d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt "<NDEF> <WPS> = create NFC handover request" }, 3144d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt { "nfc_get_handover_sel", wpa_cli_cmd_nfc_get_handover_sel, NULL, 3145d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt cli_cmd_flag_none, 3146d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt "<NDEF> <WPS> = create NFC handover select" }, 3147f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt { "nfc_report_handover", wpa_cli_cmd_nfc_report_handover, NULL, 3148f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt cli_cmd_flag_none, 3149f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt "<role> <type> <hexdump of req> <hexdump of sel> = report completed " 3150f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt "NFC handover" }, 315104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_WPS_NFC */ 315261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "wps_reg", wpa_cli_cmd_wps_reg, wpa_cli_complete_bss, 31538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 31548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<BSSID> <AP PIN> = start WPS Registrar to configure an AP" }, 315561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "wps_ap_pin", wpa_cli_cmd_wps_ap_pin, NULL, 31568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 31578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "[params..] = enable/disable AP PIN" }, 315861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "wps_er_start", wpa_cli_cmd_wps_er_start, NULL, 31598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 31608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "[IP address] = start Wi-Fi Protected Setup External Registrar" }, 316161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "wps_er_stop", wpa_cli_cmd_wps_er_stop, NULL, 31628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 31638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= stop Wi-Fi Protected Setup External Registrar" }, 316461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "wps_er_pin", wpa_cli_cmd_wps_er_pin, NULL, 31658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 31668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<UUID> <PIN> = add an Enrollee PIN to External Registrar" }, 316761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "wps_er_pbc", wpa_cli_cmd_wps_er_pbc, NULL, 31688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 31698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<UUID> = accept an Enrollee PBC using External Registrar" }, 317061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "wps_er_learn", wpa_cli_cmd_wps_er_learn, NULL, 31718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 31728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<UUID> <PIN> = learn AP configuration" }, 317361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "wps_er_set_config", wpa_cli_cmd_wps_er_set_config, NULL, 31748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 31758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<UUID> <network id> = set AP configuration for enrolling" }, 317661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "wps_er_config", wpa_cli_cmd_wps_er_config, NULL, 31778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 31788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<UUID> <PIN> <SSID> <auth> <encr> <key> = configure AP" }, 317904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_WPS_NFC 318061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "wps_er_nfc_config_token", wpa_cli_cmd_wps_er_nfc_config_token, NULL, 318104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cli_cmd_flag_none, 318204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "<WPS/NDEF> <UUID> = build NFC configuration token" }, 318304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_WPS_NFC */ 318461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "ibss_rsn", wpa_cli_cmd_ibss_rsn, NULL, 31858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 31868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<addr> = request RSN authentication with <addr> in IBSS" }, 31878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_AP 318861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "sta", wpa_cli_cmd_sta, NULL, 31898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 31908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<addr> = get information about an associated station (AP)" }, 319161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "all_sta", wpa_cli_cmd_all_sta, NULL, 31928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 31938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= get information about all associated stations (AP)" }, 319461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "deauthenticate", wpa_cli_cmd_deauthenticate, NULL, 319504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cli_cmd_flag_none, 319604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "<addr> = deauthenticate a station" }, 319761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "disassociate", wpa_cli_cmd_disassociate, NULL, 319804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt cli_cmd_flag_none, 319904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "<addr> = disassociate a station" }, 3200e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt { "chan_switch", wpa_cli_cmd_chanswitch, NULL, 3201e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt cli_cmd_flag_none, 3202e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt "<cs_count> <freq> [sec_channel_offset=] [center_freq1=]" 3203e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt " [center_freq2=] [bandwidth=] [blocktx] [ht|vht]" 3204e0e48dc666fb14a7bb60264ca87463ba7bc1fe0bDmitry Shmidt " = CSA parameters" }, 32058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_AP */ 320661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "suspend", wpa_cli_cmd_suspend, NULL, cli_cmd_flag_none, 32078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= notification of suspend/hibernate" }, 320861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "resume", wpa_cli_cmd_resume, NULL, cli_cmd_flag_none, 32098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= notification of resume/thaw" }, 321021de214b4ba4271ca20843f3b8fba9f1501b2a89Dmitry Shmidt#ifdef CONFIG_TESTING_OPTIONS 321161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "drop_sa", wpa_cli_cmd_drop_sa, NULL, cli_cmd_flag_none, 32128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= drop SA without deauth/disassoc (test command)" }, 321321de214b4ba4271ca20843f3b8fba9f1501b2a89Dmitry Shmidt#endif /* CONFIG_TESTING_OPTIONS */ 321461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "roam", wpa_cli_cmd_roam, wpa_cli_complete_bss, 32158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 32168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<addr> = roam to the specified BSS" }, 32176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt#ifdef CONFIG_MESH 32186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt { "mesh_interface_add", wpa_cli_cmd_mesh_interface_add, NULL, 32196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt cli_cmd_flag_none, 32206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "[ifname] = Create a new mesh interface" }, 32216c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt { "mesh_group_add", wpa_cli_cmd_mesh_group_add, NULL, 32226c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt cli_cmd_flag_none, 32236c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "<network id> = join a mesh network (disable others)" }, 32246c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt { "mesh_group_remove", wpa_cli_cmd_mesh_group_remove, NULL, 32256c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt cli_cmd_flag_none, 32266c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "<ifname> = Remove mesh group interface" }, 3227e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt { "mesh_peer_remove", wpa_cli_cmd_mesh_peer_remove, NULL, 3228e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt cli_cmd_flag_none, 3229e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt "<addr> = Remove a mesh peer" }, 3230e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt { "mesh_peer_add", wpa_cli_cmd_mesh_peer_add, NULL, 3231e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt cli_cmd_flag_none, 3232e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt "<addr> [duration=<seconds>] = Add a mesh peer" }, 32336c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt#endif /* CONFIG_MESH */ 32348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 323561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "p2p_find", wpa_cli_cmd_p2p_find, wpa_cli_complete_p2p_find, 323661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt cli_cmd_flag_none, 32378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "[timeout] [type=*] = find P2P Devices for up-to timeout seconds" }, 323861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "p2p_stop_find", wpa_cli_cmd_p2p_stop_find, NULL, cli_cmd_flag_none, 32398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= stop P2P Devices search" }, 3240216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt { "p2p_asp_provision", wpa_cli_cmd_p2p_asp_provision, NULL, 3241216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt cli_cmd_flag_none, 3242216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt "<addr> adv_id=<adv_id> conncap=<conncap> [info=<infodata>] = provision with a P2P ASP Device" }, 3243216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt { "p2p_asp_provision_resp", wpa_cli_cmd_p2p_asp_provision_resp, NULL, 3244216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt cli_cmd_flag_none, 3245216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt "<addr> adv_id=<adv_id> [role<conncap>] [info=<infodata>] = provision with a P2P ASP Device" }, 324661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "p2p_connect", wpa_cli_cmd_p2p_connect, wpa_cli_complete_p2p_connect, 324761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt cli_cmd_flag_none, 324861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "<addr> <\"pbc\"|PIN> [ht40] = connect to a P2P Device" }, 324961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "p2p_listen", wpa_cli_cmd_p2p_listen, NULL, cli_cmd_flag_none, 32508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "[timeout] = listen for P2P Devices for up-to timeout seconds" }, 325161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "p2p_group_remove", wpa_cli_cmd_p2p_group_remove, 325261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_cli_complete_p2p_group_remove, cli_cmd_flag_none, 32538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<ifname> = remove P2P group interface (terminate group if GO)" }, 325461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "p2p_group_add", wpa_cli_cmd_p2p_group_add, NULL, cli_cmd_flag_none, 325561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "[ht40] = add a new P2P group (local end as GO)" }, 325661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "p2p_prov_disc", wpa_cli_cmd_p2p_prov_disc, 325761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_cli_complete_p2p_peer, cli_cmd_flag_none, 32588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<addr> <method> = request provisioning discovery" }, 325961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "p2p_get_passphrase", wpa_cli_cmd_p2p_get_passphrase, NULL, 32608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 32618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= get the passphrase for a group (GO only)" }, 32628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_serv_disc_req", wpa_cli_cmd_p2p_serv_disc_req, 326361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_cli_complete_p2p_peer, cli_cmd_flag_none, 32648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<addr> <TLVs> = schedule service discovery request" }, 32658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_serv_disc_cancel_req", wpa_cli_cmd_p2p_serv_disc_cancel_req, 326661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt NULL, cli_cmd_flag_none, 32678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<id> = cancel pending service discovery request" }, 326861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "p2p_serv_disc_resp", wpa_cli_cmd_p2p_serv_disc_resp, NULL, 32698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 32708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<freq> <addr> <dialog token> <TLVs> = service discovery response" }, 327161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "p2p_service_update", wpa_cli_cmd_p2p_service_update, NULL, 32728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 32738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= indicate change in local services" }, 327461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "p2p_serv_disc_external", wpa_cli_cmd_p2p_serv_disc_external, NULL, 32758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 32768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<external> = set external processing of service discovery" }, 327761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "p2p_service_flush", wpa_cli_cmd_p2p_service_flush, NULL, 32788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 32798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= remove all stored service entries" }, 328061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "p2p_service_add", wpa_cli_cmd_p2p_service_add, NULL, 32818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 3282216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt "<bonjour|upnp|asp> <query|version> <response|service> = add a local " 32838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "service" }, 3284216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt { "p2p_service_rep", wpa_cli_cmd_p2p_service_rep, NULL, 3285216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt cli_cmd_flag_none, 3286216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt "asp <auto> <adv_id> <svc_state> <svc_string> [<svc_info>] = replace " 3287216983bceec7c450951e2fbcd076b5c75d432e57Dmitry Shmidt "local ASP service" }, 328861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "p2p_service_del", wpa_cli_cmd_p2p_service_del, NULL, 32898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 32908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<bonjour|upnp> <query|version> [|service] = remove a local " 32918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "service" }, 329261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "p2p_reject", wpa_cli_cmd_p2p_reject, wpa_cli_complete_p2p_peer, 32938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 32948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<addr> = reject connection attempts from a specific peer" }, 329561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "p2p_invite", wpa_cli_cmd_p2p_invite, NULL, 32968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 32978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<cmd> [peer=addr] = invite peer" }, 329861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "p2p_peers", wpa_cli_cmd_p2p_peers, NULL, cli_cmd_flag_none, 32998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "[discovered] = list known (optionally, only fully discovered) P2P " 33008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "peers" }, 330161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "p2p_peer", wpa_cli_cmd_p2p_peer, wpa_cli_complete_p2p_peer, 330261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt cli_cmd_flag_none, 33038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<address> = show information about known P2P peer" }, 3304391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt { "p2p_set", wpa_cli_cmd_p2p_set, wpa_cli_complete_p2p_set, 3305391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt cli_cmd_flag_none, 33068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<field> <value> = set a P2P parameter" }, 330761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "p2p_flush", wpa_cli_cmd_p2p_flush, NULL, cli_cmd_flag_none, 33088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= flush P2P state" }, 330961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "p2p_cancel", wpa_cli_cmd_p2p_cancel, NULL, cli_cmd_flag_none, 33108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= cancel P2P group formation" }, 331161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "p2p_unauthorize", wpa_cli_cmd_p2p_unauthorize, 331261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_cli_complete_p2p_peer, cli_cmd_flag_none, 33138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<address> = unauthorize a peer" }, 331461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "p2p_presence_req", wpa_cli_cmd_p2p_presence_req, NULL, 331561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt cli_cmd_flag_none, 33168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "[<duration> <interval>] [<duration> <interval>] = request GO " 33178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "presence" }, 331861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "p2p_ext_listen", wpa_cli_cmd_p2p_ext_listen, NULL, 331961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt cli_cmd_flag_none, 33208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "[<period> <interval>] = set extended listen timing" }, 3321391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt { "p2p_remove_client", wpa_cli_cmd_p2p_remove_client, 3322391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt wpa_cli_complete_p2p_peer, cli_cmd_flag_none, 3323391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt "<address|iface=address> = remove a peer from all groups" }, 3324d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt { "vendor_elem_add", wpa_cli_cmd_vendor_elem_add, NULL, 3325d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt cli_cmd_flag_none, 3326d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt "<frame id> <hexdump of elem(s)> = add vendor specific IEs to frame(s)\n" 3327d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt VENDOR_ELEM_FRAME_ID }, 3328d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt { "vendor_elem_get", wpa_cli_cmd_vendor_elem_get, NULL, 3329d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt cli_cmd_flag_none, 3330d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt "<frame id> = get vendor specific IE(s) to frame(s)\n" 3331d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt VENDOR_ELEM_FRAME_ID }, 3332d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt { "vendor_elem_remove", wpa_cli_cmd_vendor_elem_remove, NULL, 3333d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt cli_cmd_flag_none, 3334d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt "<frame id> <hexdump of elem(s)> = remove vendor specific IE(s) in frame(s)\n" 3335d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt VENDOR_ELEM_FRAME_ID }, 33368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 333761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#ifdef CONFIG_WIFI_DISPLAY 333861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "wfd_subelem_set", wpa_cli_cmd_wfd_subelem_set, NULL, 333961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt cli_cmd_flag_none, 334061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "<subelem> [contents] = set Wi-Fi Display subelement" }, 334161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "wfd_subelem_get", wpa_cli_cmd_wfd_subelem_get, NULL, 334261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt cli_cmd_flag_none, 334361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "<subelem> = get Wi-Fi Display subelement" }, 334461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_WIFI_DISPLAY */ 33451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_INTERWORKING 334661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "fetch_anqp", wpa_cli_cmd_fetch_anqp, NULL, cli_cmd_flag_none, 33471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "= fetch ANQP information for all APs" }, 334861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "stop_fetch_anqp", wpa_cli_cmd_stop_fetch_anqp, NULL, 334961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt cli_cmd_flag_none, 33501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "= stop fetch_anqp operation" }, 335161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "interworking_select", wpa_cli_cmd_interworking_select, NULL, 33521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_cmd_flag_none, 33531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "[auto] = perform Interworking network selection" }, 33541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt { "interworking_connect", wpa_cli_cmd_interworking_connect, 335561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_cli_complete_bss, cli_cmd_flag_none, 33561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "<BSSID> = connect using Interworking credentials" }, 33577f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt { "interworking_add_network", wpa_cli_cmd_interworking_add_network, 33587f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt wpa_cli_complete_bss, cli_cmd_flag_none, 33597f65602d49069f96a7bb44da8bd79ffe8d4c6a98Dmitry Shmidt "<BSSID> = connect using Interworking credentials" }, 336061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "anqp_get", wpa_cli_cmd_anqp_get, wpa_cli_complete_bss, 336161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt cli_cmd_flag_none, 33621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "<addr> <info id>[,<info id>]... = request ANQP information" }, 336361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "gas_request", wpa_cli_cmd_gas_request, wpa_cli_complete_bss, 336461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt cli_cmd_flag_none, 336561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "<addr> <AdvProtoID> [QueryReq] = GAS request" }, 336661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "gas_response_get", wpa_cli_cmd_gas_response_get, 336761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_cli_complete_bss, cli_cmd_flag_none, 336861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "<addr> <dialog token> [start,len] = Fetch last GAS response" }, 33691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_INTERWORKING */ 337004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_HS20 337161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "hs20_anqp_get", wpa_cli_cmd_hs20_anqp_get, wpa_cli_complete_bss, 337261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt cli_cmd_flag_none, 337304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "<addr> <subtype>[,<subtype>]... = request HS 2.0 ANQP information" 337404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt }, 337504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt { "nai_home_realm_list", wpa_cli_cmd_get_nai_home_realm_list, 337661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_cli_complete_bss, cli_cmd_flag_none, 337704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "<addr> <home realm> = get HS20 nai home realm list" }, 3378f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt { "hs20_icon_request", wpa_cli_cmd_hs20_icon_request, 3379f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt wpa_cli_complete_bss, cli_cmd_flag_none, 3380f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt "<addr> <icon name> = get Hotspot 2.0 OSU icon" }, 3381f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt { "fetch_osu", wpa_cli_cmd_fetch_osu, NULL, cli_cmd_flag_none, 3382f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt "= fetch OSU provider information from all APs" }, 3383f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt { "cancel_fetch_osu", wpa_cli_cmd_cancel_fetch_osu, NULL, 3384f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt cli_cmd_flag_none, 3385f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt "= cancel fetch_osu command" }, 338604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_HS20 */ 338761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "sta_autoconnect", wpa_cli_cmd_sta_autoconnect, NULL, 338861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt cli_cmd_flag_none, 33898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<0/1> = disable/enable automatic reconnection" }, 339061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "tdls_discover", wpa_cli_cmd_tdls_discover, NULL, 33918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 33928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<addr> = request TDLS discovery with <addr>" }, 339361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "tdls_setup", wpa_cli_cmd_tdls_setup, NULL, 33948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 33958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<addr> = request TDLS setup with <addr>" }, 339661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "tdls_teardown", wpa_cli_cmd_tdls_teardown, NULL, 33978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 33988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<addr> = tear down TDLS with <addr>" }, 3399cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt { "tdls_link_status", wpa_cli_cmd_tdls_link_status, NULL, 3400cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt cli_cmd_flag_none, 3401cc00d5dc8483e32158b2ba61ea44b0c38d790ed7Dmitry Shmidt "<addr> = TDLS link status with <addr>" }, 34026c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt { "wmm_ac_addts", wpa_cli_cmd_wmm_ac_addts, NULL, 34036c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt cli_cmd_flag_none, 34046c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "<uplink/downlink/bidi> <tsid=0..7> <up=0..7> [nominal_msdu_size=#] " 34056c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "[mean_data_rate=#] [min_phy_rate=#] [sba=#] [fixed_nominal_msdu] " 34066c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "= add WMM-AC traffic stream" }, 34076c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt { "wmm_ac_delts", wpa_cli_cmd_wmm_ac_delts, NULL, 34086c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt cli_cmd_flag_none, 34096c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "<tsid> = delete WMM-AC traffic stream" }, 34106c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt { "wmm_ac_status", wpa_cli_cmd_wmm_ac_status, NULL, 34116c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt cli_cmd_flag_none, 34126c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "= show status for Wireless Multi-Media Admission-Control" }, 34136c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt { "tdls_chan_switch", wpa_cli_cmd_tdls_chan_switch, NULL, 34146c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt cli_cmd_flag_none, 34156c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "<addr> <oper class> <freq> [sec_channel_offset=] [center_freq1=] " 34166c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "[center_freq2=] [bandwidth=] [ht|vht] = enable channel switching " 34176c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "with TDLS peer" }, 34186c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt { "tdls_cancel_chan_switch", wpa_cli_cmd_tdls_cancel_chan_switch, NULL, 34196c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt cli_cmd_flag_none, 34206c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "<addr> = disable channel switching with TDLS peer <addr>" }, 342161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "signal_poll", wpa_cli_cmd_signal_poll, NULL, 34228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 34238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= get signal parameters" }, 34247d56b75791f317618c9c3ff08a4cfc36c91c9611Dmitry Shmidt { "signal_monitor", wpa_cli_cmd_signal_monitor, NULL, 34257d56b75791f317618c9c3ff08a4cfc36c91c9611Dmitry Shmidt cli_cmd_flag_none, 34267d56b75791f317618c9c3ff08a4cfc36c91c9611Dmitry Shmidt "= set signal monitor parameters" }, 342761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "pktcnt_poll", wpa_cli_cmd_pktcnt_poll, NULL, 3428fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng cli_cmd_flag_none, 3429fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng "= get TX/RX packet counters" }, 343061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "reauthenticate", wpa_cli_cmd_reauthenticate, NULL, 343161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt cli_cmd_flag_none, 34321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "= trigger IEEE 802.1X/EAPOL reauthentication" }, 343304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#ifdef CONFIG_AUTOSCAN 343461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "autoscan", wpa_cli_cmd_autoscan, NULL, cli_cmd_flag_none, 343504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "[params] = Set or unset (if none) autoscan parameters" }, 343604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#endif /* CONFIG_AUTOSCAN */ 3437a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt#ifdef CONFIG_WNM 3438a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt { "wnm_sleep", wpa_cli_cmd_wnm_sleep, NULL, cli_cmd_flag_none, 3439a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt "<enter/exit> [interval=#] = enter/exit WNM-Sleep mode" }, 344044c957860ca714a86357591f39aff0bfa904c743Dmitry Shmidt { "wnm_bss_query", wpa_cli_cmd_wnm_bss_query, NULL, cli_cmd_flag_none, 344157c2d39d85825f38c5fdac9b73bb0088406ffc85Dmitry Shmidt "<query reason> [list] = Send BSS Transition Management Query" }, 3442a54fa5fb807eaeff45464139b5a7759f060cec68Dmitry Shmidt#endif /* CONFIG_WNM */ 344361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { "raw", wpa_cli_cmd_raw, NULL, cli_cmd_flag_sensitive, 344461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "<params..> = Sent unprocessed command" }, 3445444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt { "flush", wpa_cli_cmd_flush, NULL, cli_cmd_flag_none, 3446444d567b27731d8572ef37697dd12fd1c37c2f24Dmitry Shmidt "= flush wpa_supplicant state" }, 3447c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#ifdef ANDROID 3448292b0c3a742226c295f8db76eaef9e90c90e7513Dmitry Shmidt { "driver", wpa_cli_cmd_driver, NULL, cli_cmd_flag_none, 34490716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt "<command> = driver private commands" }, 3450292b0c3a742226c295f8db76eaef9e90c90e7513Dmitry Shmidt#endif /* ANDROID */ 3451fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt { "radio_work", wpa_cli_cmd_radio_work, NULL, cli_cmd_flag_none, 3452fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt "= radio_work <show/add/done>" }, 3453a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt { "vendor", wpa_cli_cmd_vendor, NULL, cli_cmd_flag_none, 3454a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt "<vendor id> <command id> [<hex formatted command argument>] = Send vendor command" 3455a38abf9af7bec7e89dbfb39ac7bb77223fe47c72Dmitry Shmidt }, 34566c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt { "neighbor_rep_request", 34576c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_cli_cmd_neighbor_rep_request, NULL, cli_cmd_flag_none, 34586c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "[ssid=<SSID>] = Trigger request to AP for neighboring AP report " 34596c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "(with optional given SSID, default: current SSID)" 34606c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt }, 34616c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt { "erp_flush", wpa_cli_cmd_erp_flush, NULL, cli_cmd_flag_none, 34626c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "= flush ERP keys" }, 34636c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt { "mac_rand_scan", 34646c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_cli_cmd_mac_rand_scan, NULL, cli_cmd_flag_none, 34656c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "<scan|sched|pno|all> enable=<0/1> [addr=mac-address " 34666c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt "mask=mac-address-mask] = scan MAC randomization" 34676c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt }, 3468d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt { "get_pref_freq_list", wpa_cli_cmd_get_pref_freq_list, NULL, 3469d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt cli_cmd_flag_none, 3470d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt "<interface type> = retrieve preferred freq list for the specified interface type" }, 347161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt { NULL, NULL, NULL, cli_cmd_flag_none, NULL } 34728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 34738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 34768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Prints command usage, lines are padded with the specified string. 34778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 34781d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidtstatic void print_cmd_help(const struct wpa_cli_cmd *cmd, const char *pad) 34798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 34808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char c; 34818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t n; 34828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s%s ", pad, cmd->cmd); 34848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (n = 0; (c = cmd->usage[n]); n++) { 34858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%c", c); 34868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (c == '\n') 34878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s", pad); 34888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 34898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\n"); 34908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 34918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 349361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void print_help(const char *cmd) 34948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 34958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int n; 34968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("commands:\n"); 349761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt for (n = 0; wpa_cli_commands[n].cmd; n++) { 349861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (cmd == NULL || str_starts(wpa_cli_commands[n].cmd, cmd)) 349961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt print_cmd_help(&wpa_cli_commands[n], " "); 350061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 35018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_edit_filter_history_cb(void *ctx, const char *cmd) 35058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *c, *delim; 35078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int n; 35088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 35098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt delim = os_strchr(cmd, ' '); 35118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (delim) 35128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = delim - cmd; 35138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 35148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = os_strlen(cmd); 35158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (n = 0; (c = wpa_cli_commands[n].cmd); n++) { 35178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strncasecmp(cmd, c, len) == 0 && len == os_strlen(c)) 35188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return (wpa_cli_commands[n].flags & 35198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive); 35208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 35218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 35228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char ** wpa_list_cmd_list(void) 35268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **res; 35288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, count; 3529f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt struct cli_txt_entry *e; 35308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 353168d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt count = ARRAY_SIZE(wpa_cli_commands); 3532f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt count += dl_list_len(&p2p_groups); 3533f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt count += dl_list_len(&ifnames); 3534f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt res = os_calloc(count + 1, sizeof(char *)); 35358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res == NULL) 35368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 35378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; wpa_cli_commands[i].cmd; i++) { 35398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res[i] = os_strdup(wpa_cli_commands[i].cmd); 35408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res[i] == NULL) 35418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 35428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 35438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3544f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt dl_list_for_each(e, &p2p_groups, struct cli_txt_entry, list) { 3545f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt size_t len = 8 + os_strlen(e->txt); 3546f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt res[i] = os_malloc(len); 3547f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt if (res[i] == NULL) 3548f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt break; 3549f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt os_snprintf(res[i], len, "ifname=%s", e->txt); 3550f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt i++; 3551f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt } 3552f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt 3553f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt dl_list_for_each(e, &ifnames, struct cli_txt_entry, list) { 3554f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt res[i] = os_strdup(e->txt); 3555f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt if (res[i] == NULL) 3556f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt break; 3557f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt i++; 3558f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt } 3559f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt 35608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return res; 35618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char ** wpa_cli_cmd_completion(const char *cmd, const char *str, 35658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int pos) 35668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i; 35688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; wpa_cli_commands[i].cmd; i++) { 35708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcasecmp(wpa_cli_commands[i].cmd, cmd) == 0) { 357161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (wpa_cli_commands[i].completion) 357261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return wpa_cli_commands[i].completion(str, 357361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos); 35748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt edit_clear_line(); 35758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\r%s\n", wpa_cli_commands[i].usage); 35768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt edit_redraw(); 35778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 35788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 35798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 35808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 35828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char ** wpa_cli_edit_completion_cb(void *ctx, const char *str, int pos) 35868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **res; 35888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *end; 35898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *cmd; 35908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3591f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt if (pos > 7 && os_strncasecmp(str, "IFNAME=", 7) == 0) { 3592f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt end = os_strchr(str, ' '); 3593f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt if (end && pos > end - str) { 3594f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt pos -= end - str + 1; 3595f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt str = end + 1; 3596f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt } 3597f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt } 3598f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt 35998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = os_strchr(str, ' '); 36008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (end == NULL || str + pos < end) 36018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_list_cmd_list(); 36028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd = os_malloc(pos + 1); 36048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (cmd == NULL) 36058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 36068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(cmd, str, pos); 36078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[end - str] = '\0'; 36088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = wpa_cli_cmd_completion(cmd, str, pos); 36098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(cmd); 36108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return res; 36118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 36128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_request(struct wpa_ctrl *ctrl, int argc, char *argv[]) 36158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 36161d755d025b206e22b06aeb322e25a79f98ca7777Dmitry Shmidt const struct wpa_cli_cmd *cmd, *match = NULL; 36178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int count; 36188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret = 0; 36198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3620f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt if (argc > 1 && os_strncasecmp(argv[0], "IFNAME=", 7) == 0) { 3621f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt ifname_prefix = argv[0] + 7; 3622f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt argv = &argv[1]; 3623f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt argc--; 3624f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt } else 3625f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt ifname_prefix = NULL; 3626f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt 3627f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt if (argc == 0) 3628f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt return -1; 3629f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt 36308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt count = 0; 36318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd = wpa_cli_commands; 36328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (cmd->cmd) { 36338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strncasecmp(cmd->cmd, argv[0], os_strlen(argv[0])) == 0) 36348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 36358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt match = cmd; 36368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcasecmp(cmd->cmd, argv[0]) == 0) { 36378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* we have an exact match */ 36388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt count = 1; 36398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 36408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 36418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt count++; 36428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 36438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd++; 36448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 36458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (count > 1) { 36478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Ambiguous command '%s'; possible commands:", argv[0]); 36488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd = wpa_cli_commands; 36498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (cmd->cmd) { 36508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strncasecmp(cmd->cmd, argv[0], 36518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlen(argv[0])) == 0) { 36528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf(" %s", cmd->cmd); 36538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 36548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd++; 36558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 36568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\n"); 36578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = 1; 36588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (count == 0) { 36598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Unknown command '%s'\n", argv[0]); 36608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = 1; 36618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 36628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = match->handler(ctrl, argc - 1, &argv[1]); 36638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 36648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret; 36668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 36678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int str_match(const char *a, const char *b) 36708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 36718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return os_strncmp(a, b, os_strlen(b)) == 0; 36728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 36738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_exec(const char *program, const char *arg1, 36768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *arg2) 36778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3678772e12cfed81754a9fd890be7bc77bc602a549b5Jouni Malinen char *arg; 36798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 36808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 36818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36829c17526f86859e2b6aebac0ed4f2561601816103Dmitry Shmidt /* If no interface is specified, set the global */ 36839c17526f86859e2b6aebac0ed4f2561601816103Dmitry Shmidt if (!arg1) 36849c17526f86859e2b6aebac0ed4f2561601816103Dmitry Shmidt arg1 = "global"; 36859c17526f86859e2b6aebac0ed4f2561601816103Dmitry Shmidt 3686772e12cfed81754a9fd890be7bc77bc602a549b5Jouni Malinen len = os_strlen(arg1) + os_strlen(arg2) + 2; 3687772e12cfed81754a9fd890be7bc77bc602a549b5Jouni Malinen arg = os_malloc(len); 3688772e12cfed81754a9fd890be7bc77bc602a549b5Jouni Malinen if (arg == NULL) 36898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3690772e12cfed81754a9fd890be7bc77bc602a549b5Jouni Malinen os_snprintf(arg, len, "%s %s", arg1, arg2); 3691772e12cfed81754a9fd890be7bc77bc602a549b5Jouni Malinen res = os_exec(program, arg, 1); 3692772e12cfed81754a9fd890be7bc77bc602a549b5Jouni Malinen os_free(arg); 36938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3694772e12cfed81754a9fd890be7bc77bc602a549b5Jouni Malinen return res; 36958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 36968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_action_process(const char *msg) 36998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 37008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *pos; 37018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *copy = NULL, *id, *pos2; 3702661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt const char *ifname = ctrl_ifname; 3703661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt char ifname_buf[100]; 37048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3705d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt if (eloop_terminated()) 3706d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt return; 3707d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt 37088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = msg; 3709661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (os_strncmp(pos, "IFNAME=", 7) == 0) { 3710661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt const char *end; 3711661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt end = os_strchr(pos + 7, ' '); 3712661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (end && (unsigned int) (end - pos) < sizeof(ifname_buf)) { 3713661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt pos += 7; 3714661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt os_memcpy(ifname_buf, pos, end - pos); 3715661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt ifname_buf[end - pos] = '\0'; 3716661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt ifname = ifname_buf; 3717661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt pos = end + 1; 3718661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt } 3719661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt } 37208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '<') { 3721661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt const char *prev = pos; 37228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* skip priority */ 37238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = os_strchr(pos, '>'); 37248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos) 37258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 37268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 3727661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt pos = prev; 37288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 37298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (str_match(pos, WPA_EVENT_CONNECTED)) { 37318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int new_id = -1; 37328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_unsetenv("WPA_ID"); 37338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_unsetenv("WPA_ID_STR"); 37348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_unsetenv("WPA_CTRL_DIR"); 37358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = os_strstr(pos, "[id="); 37378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos) 37388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt copy = os_strdup(pos + 4); 37398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (copy) { 37418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2 = id = copy; 37428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos2 && *pos2 != ' ') 37438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2++; 37448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos2++ = '\0'; 37458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt new_id = atoi(id); 37468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_setenv("WPA_ID", id, 1); 37478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos2 && *pos2 != '=') 37488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2++; 37498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos2 == '=') 37508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2++; 37518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt id = pos2; 37528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos2 && *pos2 != ']') 37538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2++; 37548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos2 = '\0'; 37558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_setenv("WPA_ID_STR", id, 1); 37568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(copy); 37578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 37588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_setenv("WPA_CTRL_DIR", ctrl_iface_dir, 1); 37608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3761391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt if (wpa_cli_connected <= 0 || new_id != wpa_cli_last_id) { 37628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_connected = 1; 37638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_last_id = new_id; 3764661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt wpa_cli_exec(action_file, ifname, "CONNECTED"); 37658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 37668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, WPA_EVENT_DISCONNECTED)) { 37678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_cli_connected) { 37688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_connected = 0; 3769661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt wpa_cli_exec(action_file, ifname, "DISCONNECTED"); 37708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 37716c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } else if (str_match(pos, MESH_GROUP_STARTED)) { 37726c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_cli_exec(action_file, ctrl_ifname, pos); 37736c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } else if (str_match(pos, MESH_GROUP_REMOVED)) { 37746c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_cli_exec(action_file, ctrl_ifname, pos); 37756c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } else if (str_match(pos, MESH_PEER_CONNECTED)) { 37766c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_cli_exec(action_file, ctrl_ifname, pos); 37776c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt } else if (str_match(pos, MESH_PEER_DISCONNECTED)) { 37786c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt wpa_cli_exec(action_file, ctrl_ifname, pos); 37798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, P2P_EVENT_GROUP_STARTED)) { 3780661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt wpa_cli_exec(action_file, ifname, pos); 37818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, P2P_EVENT_GROUP_REMOVED)) { 3782661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt wpa_cli_exec(action_file, ifname, pos); 37838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, P2P_EVENT_CROSS_CONNECT_ENABLE)) { 3784661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt wpa_cli_exec(action_file, ifname, pos); 37858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, P2P_EVENT_CROSS_CONNECT_DISABLE)) { 3786661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt wpa_cli_exec(action_file, ifname, pos); 37871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (str_match(pos, P2P_EVENT_GO_NEG_FAILURE)) { 3788661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt wpa_cli_exec(action_file, ifname, pos); 37898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, WPS_EVENT_SUCCESS)) { 3790661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt wpa_cli_exec(action_file, ifname, pos); 37918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, WPS_EVENT_FAIL)) { 3792661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt wpa_cli_exec(action_file, ifname, pos); 37931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (str_match(pos, AP_STA_CONNECTED)) { 3794661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt wpa_cli_exec(action_file, ifname, pos); 37951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (str_match(pos, AP_STA_DISCONNECTED)) { 3796661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt wpa_cli_exec(action_file, ifname, pos); 3797f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt } else if (str_match(pos, ESS_DISASSOC_IMMINENT)) { 3798661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt wpa_cli_exec(action_file, ifname, pos); 3799f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt } else if (str_match(pos, HS20_SUBSCRIPTION_REMEDIATION)) { 3800661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt wpa_cli_exec(action_file, ifname, pos); 3801f21452aea786ac056eb01f1cbba4f553bd502747Dmitry Shmidt } else if (str_match(pos, HS20_DEAUTH_IMMINENT_NOTICE)) { 3802661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt wpa_cli_exec(action_file, ifname, pos); 38038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, WPA_EVENT_TERMINATING)) { 38048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("wpa_supplicant is terminating - stop monitoring\n"); 38058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_quit = 1; 38068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 38078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 38088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_ANSI_C_EXTRA 38118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_action_cb(char *msg, size_t len) 38128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 38138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_action_process(msg); 38148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 38158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_ANSI_C_EXTRA */ 38168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_reconnect(void) 38198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 38208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_close_connection(); 382161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (wpa_cli_open_connection(ctrl_ifname, 1) < 0) 382261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return; 382361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 382461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (interactive) { 382561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt edit_clear_line(); 382661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt printf("\rConnection to wpa_supplicant re-established\n"); 382761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt edit_redraw(); 382861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 38298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 38308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_event(const char *str) 38331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 38341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const char *start, *s; 38351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 38361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt start = os_strchr(str, '>'); 38371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (start == NULL) 38381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 38391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 38401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt start++; 38411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 38421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (str_starts(start, WPA_EVENT_BSS_ADDED)) { 38431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt s = os_strchr(start, ' '); 38441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (s == NULL) 38451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 38461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt s = os_strchr(s + 1, ' '); 38471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (s == NULL) 38481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 38491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_txt_list_add(&bsses, s + 1); 38501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 38511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 38521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 38531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (str_starts(start, WPA_EVENT_BSS_REMOVED)) { 38541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt s = os_strchr(start, ' '); 38551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (s == NULL) 38561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 38571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt s = os_strchr(s + 1, ' '); 38581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (s == NULL) 38591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 38601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_txt_list_del_addr(&bsses, s + 1); 38611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 38621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 38631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 38641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P 38651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (str_starts(start, P2P_EVENT_DEVICE_FOUND)) { 38661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt s = os_strstr(start, " p2p_dev_addr="); 38671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (s == NULL) 38681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 38691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_txt_list_add_addr(&p2p_peers, s + 14); 38701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 38711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 38721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 38731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (str_starts(start, P2P_EVENT_DEVICE_LOST)) { 38741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt s = os_strstr(start, " p2p_dev_addr="); 38751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (s == NULL) 38761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 38771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_txt_list_del_addr(&p2p_peers, s + 14); 38781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 38791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 38801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 38811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (str_starts(start, P2P_EVENT_GROUP_STARTED)) { 38821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt s = os_strchr(start, ' '); 38831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (s == NULL) 38841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 3885912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt cli_txt_list_add_word(&p2p_groups, s + 1, ' '); 38861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 38871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 38881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 38891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (str_starts(start, P2P_EVENT_GROUP_REMOVED)) { 38901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt s = os_strchr(start, ' '); 38911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (s == NULL) 38921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 3893912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt cli_txt_list_del_word(&p2p_groups, s + 1, ' '); 38941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 38951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 38961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */ 38971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 38981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 38991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 390061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int check_terminating(const char *msg) 390161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 390261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt const char *pos = msg; 390361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 390461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (*pos == '<') { 390561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt /* skip priority */ 390661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = os_strchr(pos, '>'); 390761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (pos) 390861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos++; 390961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt else 391061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pos = msg; 391161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 391261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 391361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (str_match(pos, WPA_EVENT_TERMINATING) && ctrl_conn) { 391461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt edit_clear_line(); 391561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt printf("\rConnection to wpa_supplicant lost - trying to " 391661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "reconnect\n"); 391761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt edit_redraw(); 391861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_cli_attached = 0; 391961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_cli_close_connection(); 392061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 1; 392161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 392261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 392361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return 0; 392461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 392561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 392661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 39278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_recv_pending(struct wpa_ctrl *ctrl, int action_monitor) 39288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 39298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_conn == NULL) { 39308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_reconnect(); 39318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 39328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 39338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (wpa_ctrl_pending(ctrl) > 0) { 3934661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt char buf[4096]; 39358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len = sizeof(buf) - 1; 39368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_ctrl_recv(ctrl, buf, &len) == 0) { 39378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[len] = '\0'; 39388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (action_monitor) 39398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_action_process(buf); 39408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else { 39411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_event(buf); 39428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_cli_show_event(buf)) { 39438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt edit_clear_line(); 39448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\r%s\n", buf); 39458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt edit_redraw(); 39468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 394761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 394861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (interactive && check_terminating(buf) > 0) 394961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return; 39508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 39518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 39528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Could not read pending message.\n"); 39538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 39548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 39558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 39568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_ctrl_pending(ctrl) < 0) { 39588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Connection to wpa_supplicant lost - trying to " 39598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "reconnect\n"); 39608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_reconnect(); 39618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 39628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 39638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define max_args 10 39658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int tokenize_cmd(char *cmd, char *argv[]) 39678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 39688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *pos; 39698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int argc = 0; 39708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = cmd; 39728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (;;) { 39738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos == ' ') 39748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 39758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '\0') 39768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 39778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[argc] = pos; 39788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argc++; 39798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == max_args) 39808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 39818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '"') { 39828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *pos2 = os_strrchr(pos, '"'); 39838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos2) 39848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = pos2 + 1; 39858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 39868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != '\0' && *pos != ' ') 39878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 39888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == ' ') 39898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = '\0'; 39908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 39918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return argc; 39938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 39948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 39968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_ping(void *eloop_ctx, void *timeout_ctx) 39978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3998661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (ctrl_conn) { 3999661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt int res; 4000661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt char *prefix = ifname_prefix; 4001661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt 4002661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt ifname_prefix = NULL; 4003661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt res = _wpa_ctrl_command(ctrl_conn, "PING", 0); 4004661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt ifname_prefix = prefix; 4005661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt if (res) { 4006661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt printf("Connection to wpa_supplicant lost - trying to " 4007661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt "reconnect\n"); 4008661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt wpa_cli_close_connection(); 4009661b4f78e48c697429dc46154a4125892c001718Dmitry Shmidt } 40108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 40118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!ctrl_conn) 40128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_reconnect(); 40138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_register_timeout(ping_interval, 0, wpa_cli_ping, NULL, NULL); 40148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 40158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_mon_receive(int sock, void *eloop_ctx, void *sock_ctx) 40188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 40198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_recv_pending(mon_conn, 0); 40208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 40218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_edit_cmd_cb(void *ctx, char *cmd) 40248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 40258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[max_args]; 40268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int argc; 40278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argc = tokenize_cmd(cmd, argv); 40288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc) 40298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_request(ctrl_conn, argc, argv); 40308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 40318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_edit_eof_cb(void *ctx) 40348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 40358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_terminate(); 40368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 40378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 40388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 403961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int warning_displayed = 0; 404061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic char *hfile = NULL; 404161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic int edit_started = 0; 404261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 404361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void start_edit(void) 40448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 404561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *home; 404661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt char *ps = NULL; 40478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 404861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_UDP_REMOTE 404961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ps = wpa_ctrl_get_remote_ifname(ctrl_conn); 405061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */ 40518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4052912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#ifdef CONFIG_WPA_CLI_HISTORY_DIR 4053912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt home = CONFIG_WPA_CLI_HISTORY_DIR; 4054912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#else /* CONFIG_WPA_CLI_HISTORY_DIR */ 40558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt home = getenv("HOME"); 4056912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt#endif /* CONFIG_WPA_CLI_HISTORY_DIR */ 40578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (home) { 40588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *fname = ".wpa_cli_history"; 40598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int hfile_len = os_strlen(home) + 1 + os_strlen(fname) + 1; 40608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hfile = os_malloc(hfile_len); 40618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hfile) 40628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(hfile, hfile_len, "%s/%s", home, fname); 40638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 40648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 406561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (edit_init(wpa_cli_edit_cmd_cb, wpa_cli_edit_eof_cb, 406661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_cli_edit_completion_cb, NULL, hfile, ps) < 0) { 406761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt eloop_terminate(); 406861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return; 406961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 407061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 407161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt edit_started = 1; 40728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_register_timeout(ping_interval, 0, wpa_cli_ping, NULL, NULL); 407361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 407461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 407561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 407651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidtstatic void update_bssid_list(struct wpa_ctrl *ctrl) 407751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt{ 407851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt char buf[4096]; 407951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt size_t len = sizeof(buf); 408051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt int ret; 408151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt char *cmd = "BSS RANGE=ALL MASK=0x2"; 408251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt char *pos, *end; 408351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt 408451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt if (ctrl == NULL) 408551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt return; 408651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len, NULL); 408751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt if (ret < 0) 408851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt return; 408951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt buf[len] = '\0'; 409051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt 409151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt pos = buf; 409251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt while (pos) { 409351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt pos = os_strstr(pos, "bssid="); 409451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt if (pos == NULL) 409551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt break; 409651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt pos += 6; 409751b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt end = os_strchr(pos, '\n'); 409851b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt if (end == NULL) 409951b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt break; 410051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt *end = '\0'; 410151b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt cli_txt_list_add(&bsses, pos); 410251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt pos = end + 1; 410351b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt } 410451b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt} 410551b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt 410651b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt 4107f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidtstatic void update_ifnames(struct wpa_ctrl *ctrl) 4108f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt{ 4109f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt char buf[4096]; 4110f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt size_t len = sizeof(buf); 4111f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt int ret; 4112f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt char *cmd = "INTERFACES"; 4113f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt char *pos, *end; 4114f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt char txt[200]; 4115f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt 4116f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt cli_txt_list_flush(&ifnames); 4117f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt 4118f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt if (ctrl == NULL) 4119f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt return; 4120f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len, NULL); 4121f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt if (ret < 0) 4122f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt return; 4123f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt buf[len] = '\0'; 4124f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt 4125f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt pos = buf; 4126f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt while (pos) { 4127f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt end = os_strchr(pos, '\n'); 4128f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt if (end == NULL) 4129f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt break; 4130f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt *end = '\0'; 4131f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt ret = os_snprintf(txt, sizeof(txt), "ifname=%s", pos); 41326c0da2bb83f6915d8260912362692d1a742e057bDmitry Shmidt if (!os_snprintf_error(sizeof(txt), ret)) 4133f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt cli_txt_list_add(&ifnames, txt); 4134f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt pos = end + 1; 4135f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt } 4136f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt} 4137f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt 4138f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt 4139912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidtstatic void update_networks(struct wpa_ctrl *ctrl) 4140912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt{ 4141912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt char buf[4096]; 4142912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt size_t len = sizeof(buf); 4143912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt int ret; 4144912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt char *cmd = "LIST_NETWORKS"; 4145912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt char *pos, *end; 4146912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt int header = 1; 4147912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 4148912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt cli_txt_list_flush(&networks); 4149912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 4150912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt if (ctrl == NULL) 4151912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt return; 4152912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len, NULL); 4153912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt if (ret < 0) 4154912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt return; 4155912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt buf[len] = '\0'; 4156912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 4157912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt pos = buf; 4158912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt while (pos) { 4159912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt end = os_strchr(pos, '\n'); 4160912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt if (end == NULL) 4161912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt break; 4162912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt *end = '\0'; 4163912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt if (!header) 4164912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt cli_txt_list_add_word(&networks, pos, '\t'); 4165912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt header = 0; 4166912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt pos = end + 1; 4167912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt } 4168912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt} 4169912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 4170912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt 417161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void try_connection(void *eloop_ctx, void *timeout_ctx) 417261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 4173b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt if (ctrl_conn) 4174b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt goto done; 4175b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt 417661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (ctrl_ifname == NULL) 417761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ctrl_ifname = wpa_cli_get_default_ifname(); 41788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 417957c2d39d85825f38c5fdac9b73bb0088406ffc85Dmitry Shmidt if (wpa_cli_open_connection(ctrl_ifname, 1)) { 418061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (!warning_displayed) { 418161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt printf("Could not connect to wpa_supplicant: " 41822f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt "%s - re-trying\n", 41832f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt ctrl_ifname ? ctrl_ifname : "(nil)"); 418461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt warning_displayed = 1; 418561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 418661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt eloop_register_timeout(1, 0, try_connection, NULL, NULL); 418761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return; 418861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 418961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 419051b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt update_bssid_list(ctrl_conn); 4191912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt update_networks(ctrl_conn); 419251b6ea882f234c14cd1fe1332a3840cf61fafccaDmitry Shmidt 419361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (warning_displayed) 419461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt printf("Connection established.\n"); 419561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 4196b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidtdone: 419761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt start_edit(); 419861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 419961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 420061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 420161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void wpa_cli_interactive(void) 420261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{ 420361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt printf("\nInteractive mode\n\n"); 420461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 420561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt eloop_register_timeout(0, 0, try_connection, NULL, NULL); 42068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_run(); 420761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt eloop_cancel_timeout(try_connection, NULL, NULL); 42088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 42091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_txt_list_flush(&p2p_peers); 42101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_txt_list_flush(&p2p_groups); 42111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_txt_list_flush(&bsses); 4212f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt cli_txt_list_flush(&ifnames); 4213912c6ecf72fb2c84fbf17dbd0666492778dbd9fcDmitry Shmidt cli_txt_list_flush(&networks); 421461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (edit_started) 421561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt edit_deinit(hfile, wpa_cli_edit_filter_history_cb); 42168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(hfile); 42178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_cancel_timeout(wpa_cli_ping, NULL, NULL); 42188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_close_connection(); 42198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 42208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 42218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4222a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidtstatic void wpa_cli_action_ping(void *eloop_ctx, void *timeout_ctx) 4223a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt{ 4224a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt struct wpa_ctrl *ctrl = eloop_ctx; 4225a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt char buf[256]; 4226a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt size_t len; 4227a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt 4228a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt /* verify that connection is still working */ 4229a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt len = sizeof(buf) - 1; 4230a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt if (wpa_ctrl_request(ctrl, "PING", 4, buf, &len, 4231a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt wpa_cli_action_cb) < 0 || 4232a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt len < 4 || os_memcmp(buf, "PONG", 4) != 0) { 4233a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt printf("wpa_supplicant did not reply to PING command - exiting\n"); 4234a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt eloop_terminate(); 4235a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt return; 4236a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt } 4237a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt eloop_register_timeout(ping_interval, 0, wpa_cli_action_ping, 4238a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt ctrl, NULL); 4239a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt} 4240a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt 4241a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt 4242a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidtstatic void wpa_cli_action_receive(int sock, void *eloop_ctx, void *sock_ctx) 4243a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt{ 4244a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt struct wpa_ctrl *ctrl = eloop_ctx; 4245a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt 4246a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt wpa_cli_recv_pending(ctrl, 1); 4247a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt} 4248a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt 4249a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt 42508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_action(struct wpa_ctrl *ctrl) 42518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 42528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_ANSI_C_EXTRA 42538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* TODO: ANSI C version(?) */ 42548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Action processing not supported in ANSI C build.\n"); 42558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_ANSI_C_EXTRA */ 4256a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt int fd; 42578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 42588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fd = wpa_ctrl_get_fd(ctrl); 4259a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt eloop_register_timeout(ping_interval, 0, wpa_cli_action_ping, 4260a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt ctrl, NULL); 4261a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt eloop_register_read_sock(fd, wpa_cli_action_receive, ctrl, NULL); 4262a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt eloop_run(); 4263a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt eloop_cancel_timeout(wpa_cli_action_ping, ctrl, NULL); 4264a3dc30964aa24aea2b518246f6812663a1103490Dmitry Shmidt eloop_unregister_read_sock(fd); 42658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_ANSI_C_EXTRA */ 42668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 42678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 42688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 42698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_cleanup(void) 42708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 42718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_close_connection(); 42728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pid_file) 42738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_daemonize_terminate(pid_file); 42748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 42758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_program_deinit(); 42768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 42778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 427861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 427961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic void wpa_cli_terminate(int sig, void *ctx) 42808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 428161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt eloop_terminate(); 42828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 42838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 42848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 42858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char * wpa_cli_get_default_ifname(void) 42868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 42878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *ifname = NULL; 42888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4289d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt#ifdef ANDROID 4290d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt char ifprop[PROPERTY_VALUE_MAX]; 4291d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt if (property_get("wifi.interface", ifprop, NULL) != 0) { 4292d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt ifname = os_strdup(ifprop); 4293d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt printf("Using interface '%s'\n", ifname ? ifname : "N/A"); 4294d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt } 4295d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt#else /* ANDROID */ 42968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_UNIX 42978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct dirent *dent; 42988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DIR *dir = opendir(ctrl_iface_dir); 42998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dir) { 43008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 43018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 43028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while ((dent = readdir(dir))) { 43038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef _DIRENT_HAVE_D_TYPE 43048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 43058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Skip the file if it is not a socket. Also accept 43068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * DT_UNKNOWN (0) in case the C library or underlying 43078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * file system does not support d_type. 43088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 43098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dent->d_type != DT_SOCK && dent->d_type != DT_UNKNOWN) 43108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 43118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _DIRENT_HAVE_D_TYPE */ 43128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(dent->d_name, ".") == 0 || 43138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strcmp(dent->d_name, "..") == 0) 43148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 43158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Selected interface '%s'\n", dent->d_name); 43168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ifname = os_strdup(dent->d_name); 43178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 43188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 43198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt closedir(dir); 43208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UNIX */ 43218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 43228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE 4323b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt char buf[4096], *pos; 43248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 43258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ctrl *ctrl; 43268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 43278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 43288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl = wpa_ctrl_open(NULL); 43298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl == NULL) 43308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 43318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 43328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = sizeof(buf) - 1; 43338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = wpa_ctrl_request(ctrl, "INTERFACES", 10, buf, &len, NULL); 43348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret >= 0) { 43358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[len] = '\0'; 43368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = os_strchr(buf, '\n'); 43378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos) 43388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos = '\0'; 43398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ifname = os_strdup(buf); 43408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 43418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_ctrl_close(ctrl); 43428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */ 4343d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt#endif /* ANDROID */ 43448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 43458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ifname; 43468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 43478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 43488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 43498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint main(int argc, char *argv[]) 43508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 43518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int c; 43528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int daemonize = 0; 43538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret = 0; 43548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *global = NULL; 43558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 43568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_program_init()) 43578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 43588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 43598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (;;) { 4360d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt c = getopt(argc, argv, "a:Bg:G:hi:p:P:s:v"); 43618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (c < 0) 43628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 43638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (c) { 43648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 'a': 43658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt action_file = optarg; 43668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 43678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 'B': 43688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt daemonize = 1; 43698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 43708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 'g': 43718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt global = optarg; 43728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 43738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 'G': 43748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ping_interval = atoi(optarg); 43758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 43768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 'h': 43778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt usage(); 43788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 43798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 'v': 43808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s\n", wpa_cli_version); 43818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 43828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 'i': 43838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ctrl_ifname); 43848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_ifname = os_strdup(optarg); 43858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 43868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 'p': 43878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_iface_dir = optarg; 43888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 43898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 'P': 43908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pid_file = optarg; 43918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4392d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt case 's': 4393d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt client_socket_dir = optarg; 4394d80a401aed31d06f261efd19223cf55d1a2a8228Dmitry Shmidt break; 43958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 43968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt usage(); 43978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 43988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 43998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 44008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 44018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt interactive = (argc == optind) && (action_file == NULL); 44028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 44038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (interactive) 44048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s\n\n%s\n\n", wpa_cli_version, wpa_cli_license); 44058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 44068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (eloop_init()) 44078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 44088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 44098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (global) { 44108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE 44118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_conn = wpa_ctrl_open(NULL); 44128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_CTRL_IFACE_NAMED_PIPE */ 44138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_conn = wpa_ctrl_open(global); 44148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */ 44158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_conn == NULL) { 441604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(stderr, "Failed to connect to wpa_supplicant " 441704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "global interface: %s error: %s\n", 441804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt global, strerror(errno)); 44198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 44208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4421b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt 4422b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt if (interactive) { 4423f7e0a9905988e62e4f70fed8b795722abeab719bDmitry Shmidt update_ifnames(ctrl_conn); 4424b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt mon_conn = wpa_ctrl_open(global); 4425b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt if (mon_conn) { 4426b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt if (wpa_ctrl_attach(mon_conn) == 0) { 4427b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt wpa_cli_attached = 1; 4428b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt eloop_register_read_sock( 4429b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt wpa_ctrl_get_fd(mon_conn), 4430b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt wpa_cli_mon_receive, 4431b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt NULL, NULL); 4432b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt } else { 4433b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt printf("Failed to open monitor " 4434b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt "connection through global " 4435b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt "control interface\n"); 4436b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt } 4437b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt } 4438b6e9aaf735990dc64cdb6efccc03d076768eabf3Dmitry Shmidt } 44398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 44408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 444161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt eloop_register_signal_terminate(wpa_cli_terminate, NULL); 44428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 44438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_ifname == NULL) 44448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_ifname = wpa_cli_get_default_ifname(); 44458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 44468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (interactive) { 444761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_cli_interactive(); 44488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 44498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!global && 44508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_open_connection(ctrl_ifname, 0) < 0) { 445104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt fprintf(stderr, "Failed to connect to non-global " 445204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt "ctrl_ifname: %s error: %s\n", 44532f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt ctrl_ifname ? ctrl_ifname : "(nil)", 44542f74e36e84064ffa32f82f3decf36b653c7e4fadDmitry Shmidt strerror(errno)); 44558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 44568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 44578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 44588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (action_file) { 44598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_ctrl_attach(ctrl_conn) == 0) { 44608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_attached = 1; 44618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 44628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Warning: Failed to attach to " 44638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_supplicant.\n"); 44648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 44658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 44668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 44678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4468b97e428f8acf1ecb93f38f8d0063d2f2fd0bc36eDmitry Shmidt if (daemonize && os_daemonize(pid_file) && eloop_sock_requeue()) 446961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return -1; 44708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 447161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (action_file) 447261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt wpa_cli_action(ctrl_conn); 447361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt else 447461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ret = wpa_request(ctrl_conn, argc - optind, 447561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt &argv[optind]); 447661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 44778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 44788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ctrl_ifname); 44798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_destroy(); 44808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_cleanup(); 44818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 44828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret; 44838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 44848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 44858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_CTRL_IFACE */ 44868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint main(int argc, char *argv[]) 44878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 44888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("CONFIG_CTRL_IFACE not defined - wpa_cli disabled\n"); 44898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 44908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 44918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE */ 4492