18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * WPA Supplicant - command line interface for wpa_supplicant daemon 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2004-2011, Jouni Malinen <j@w1.fi> 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 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" 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef ANDROID 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <cutils/properties.h> 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* ANDROID */ 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *wpa_cli_version = 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"wpa_cli v" VERSION_STR "\n" 30c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt"Copyright (c) 2004-2012, Jouni Malinen <j@w1.fi> and contributors"; 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *wpa_cli_license = 34c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt"This software may be distributed under the terms of the BSD license.\n" 35c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt"See README for more details.\n"; 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *wpa_cli_full_license = 38c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt"This software may be distributed under the terms of the BSD license.\n" 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n" 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"Redistribution and use in source and binary forms, with or without\n" 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"modification, are permitted provided that the following conditions are\n" 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"met:\n" 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n" 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"1. Redistributions of source code must retain the above copyright\n" 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt" notice, this list of conditions and the following disclaimer.\n" 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n" 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"2. Redistributions in binary form must reproduce the above copyright\n" 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt" notice, this list of conditions and the following disclaimer in the\n" 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt" documentation and/or other materials provided with the distribution.\n" 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n" 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"3. Neither the name(s) of the above-listed copyright holder(s) nor the\n" 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt" names of its contributors may be used to endorse or promote products\n" 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt" derived from this software without specific prior written permission.\n" 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n" 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n" 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n" 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n" 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n" 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n" 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n" 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n" 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n" 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n" 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n" 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt"\n"; 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_ctrl *ctrl_conn; 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_ctrl *mon_conn; 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_quit = 0; 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_attached = 0; 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_connected = 0; 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_last_id = 0; 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_CTRL_IFACE_DIR 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define CONFIG_CTRL_IFACE_DIR "/var/run/wpa_supplicant" 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_DIR */ 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *ctrl_iface_dir = CONFIG_CTRL_IFACE_DIR; 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char *ctrl_ifname = NULL; 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *pid_file = NULL; 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *action_file = NULL; 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int ping_interval = 5; 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int interactive = 0; 832fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt#if defined(CONFIG_P2P) && defined(ANDROID_P2P) 842fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidtstatic char* redirect_interface = NULL; 852fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt#endif 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstruct cli_txt_entry { 881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct dl_list list; 891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *txt; 901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}; 911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic DEFINE_DL_LIST(bsses); /* struct cli_txt_entry */ 931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic DEFINE_DL_LIST(p2p_peers); /* struct cli_txt_entry */ 941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic DEFINE_DL_LIST(p2p_groups); /* struct cli_txt_entry */ 951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void print_help(void); 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_mon_receive(int sock, void *eloop_ctx, void *sock_ctx); 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void usage(void) 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("wpa_cli [-p<path to ctrl sockets>] [-i<ifname>] [-hvB] " 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "[-a<action file>] \\\n" 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " [-P<pid file>] [-g<global ctrl>] [-G<ping interval>] " 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "[command..]\n" 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " -h = help (show this usage text)\n" 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " -v = shown version information\n" 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " -a = run in daemon mode executing the action file based on " 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "events from\n" 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " wpa_supplicant\n" 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " -B = run a daemon in the background\n" 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " default path: " CONFIG_CTRL_IFACE_DIR "\n" 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " default interface: first interface found in socket path\n"); 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt print_help(); 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_txt_list_free(struct cli_txt_entry *e) 1201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 1211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dl_list_del(&e->list); 1221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(e->txt); 1231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(e); 1241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 1251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_txt_list_flush(struct dl_list *list) 1281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 1291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct cli_txt_entry *e; 1301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt while ((e = dl_list_first(list, struct cli_txt_entry, list))) 1311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_txt_list_free(e); 1321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 1331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic struct cli_txt_entry * cli_txt_list_get(struct dl_list *txt_list, 1361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const char *txt) 1371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 1381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct cli_txt_entry *e; 1391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dl_list_for_each(e, txt_list, struct cli_txt_entry, list) { 1401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (os_strcmp(e->txt, txt) == 0) 1411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return e; 1421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 1431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return NULL; 1441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 1451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_txt_list_del(struct dl_list *txt_list, const char *txt) 1481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 1491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct cli_txt_entry *e; 1501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt e = cli_txt_list_get(txt_list, txt); 1511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (e) 1521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_txt_list_free(e); 1531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 1541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_txt_list_del_addr(struct dl_list *txt_list, const char *txt) 1571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 1581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt u8 addr[ETH_ALEN]; 1591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char buf[18]; 1601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hwaddr_aton(txt, addr) < 0) 1611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 1621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_snprintf(buf, sizeof(buf), MACSTR, MAC2STR(addr)); 1631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_txt_list_del(txt_list, buf); 1641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 1651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P 1681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_txt_list_del_word(struct dl_list *txt_list, const char *txt) 1691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 1701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const char *end; 1711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *buf; 1721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt end = os_strchr(txt, ' '); 1731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (end == NULL) 1741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt end = txt + os_strlen(txt); 1751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt buf = os_malloc(end - txt + 1); 1761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (buf == NULL) 1771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 1781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcpy(buf, txt, end - txt); 1791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt buf[end - txt] = '\0'; 1801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_txt_list_del(txt_list, buf); 1811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(buf); 1821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 1831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */ 1841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 1861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int cli_txt_list_add(struct dl_list *txt_list, const char *txt) 1871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 1881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct cli_txt_entry *e; 1891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt e = cli_txt_list_get(txt_list, txt); 1901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (e) 1911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return 0; 1921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt e = os_zalloc(sizeof(*e)); 1931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (e == NULL) 1941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 1951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt e->txt = os_strdup(txt); 1961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (e->txt == NULL) { 1971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(e); 1981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 1991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 2001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dl_list_add(txt_list, &e->list); 2011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return 0; 2021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 2031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P 2061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int cli_txt_list_add_addr(struct dl_list *txt_list, const char *txt) 2071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 2081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt u8 addr[ETH_ALEN]; 2091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char buf[18]; 2101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (hwaddr_aton(txt, addr) < 0) 2111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 2121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_snprintf(buf, sizeof(buf), MACSTR, MAC2STR(addr)); 2131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return cli_txt_list_add(txt_list, buf); 2141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 2151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int cli_txt_list_add_word(struct dl_list *txt_list, const char *txt) 2181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 2191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const char *end; 2201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *buf; 2211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int ret; 2221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt end = os_strchr(txt, ' '); 2231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (end == NULL) 2241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt end = txt + os_strlen(txt); 2251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt buf = os_malloc(end - txt + 1); 2261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (buf == NULL) 2271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 2281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_memcpy(buf, txt, end - txt); 2291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt buf[end - txt] = '\0'; 2301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt ret = cli_txt_list_add(txt_list, buf); 2311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt os_free(buf); 2321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return ret; 2331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 2341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */ 2351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** cli_txt_list_array(struct dl_list *txt_list) 2381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 2391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt unsigned int i, count = dl_list_len(txt_list); 2401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char **res; 2411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct cli_txt_entry *e; 2421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = os_zalloc((count + 1) * sizeof(char *)); 2441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (res == NULL) 2451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return NULL; 2461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt i = 0; 2481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt dl_list_for_each(e, txt_list, struct cli_txt_entry, list) { 2491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res[i] = os_strdup(e->txt); 2501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (res[i] == NULL) 2511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 2521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt i++; 2531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 2541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return res; 2561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 2571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int get_cmd_arg_num(const char *str, int pos) 2601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 2611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int arg = 0, i; 2621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt for (i = 0; i <= pos; i++) { 2641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (str[i] != ' ') { 2651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt arg++; 2661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt while (i <= pos && str[i] != ' ') 2671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt i++; 2681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 2691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 2701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (arg > 0) 2721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt arg--; 2731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return arg; 2741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 2751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int str_starts(const char *src, const char *match) 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return os_strncmp(src, match, os_strlen(match)) == 0; 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_show_event(const char *event) 2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *start; 2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start = os_strchr(event, '>'); 2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (start == NULL) 2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 1; 2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt start++; 2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Skip BSS added/removed events since they can be relatively frequent 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * and are likely of not much use for an interactive user. 2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (str_starts(start, WPA_EVENT_BSS_ADDED) || 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt str_starts(start, WPA_EVENT_BSS_REMOVED)) 2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 1; 3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_open_connection(const char *ifname, int attach) 3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#if defined(CONFIG_CTRL_IFACE_UDP) || defined(CONFIG_CTRL_IFACE_NAMED_PIPE) 3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_conn = wpa_ctrl_open(ifname); 3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_conn == NULL) 3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (attach && interactive) 3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mon_conn = wpa_ctrl_open(ifname); 3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mon_conn = NULL; 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */ 3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *cfile = NULL; 3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int flen, res; 3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ifname == NULL) 3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef ANDROID 3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (access(ctrl_iface_dir, F_OK) < 0) { 3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cfile = os_strdup(ifname); 3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (cfile == NULL) 3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* ANDROID */ 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (cfile == NULL) { 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt flen = os_strlen(ctrl_iface_dir) + os_strlen(ifname) + 2; 3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cfile = os_malloc(flen); 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (cfile == NULL) 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cfile, flen, "%s/%s", ctrl_iface_dir, 3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ifname); 3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || res >= flen) { 3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(cfile); 3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_conn = wpa_ctrl_open(cfile); 3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_conn == NULL) { 3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(cfile); 3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (attach && interactive) 3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mon_conn = wpa_ctrl_open(cfile); 3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mon_conn = NULL; 3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(cfile); 3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */ 3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (mon_conn) { 3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_ctrl_attach(mon_conn) == 0) { 3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_attached = 1; 3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (interactive) 3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_register_read_sock( 3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_ctrl_get_fd(mon_conn), 3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_mon_receive, NULL, NULL); 3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Warning: Failed to attach to " 3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_supplicant.\n"); 3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_close_connection(void) 3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_conn == NULL) 3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_cli_attached) { 3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_ctrl_detach(interactive ? mon_conn : ctrl_conn); 3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_attached = 0; 3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_ctrl_close(ctrl_conn); 3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_conn = NULL; 3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (mon_conn) { 3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_unregister_read_sock(wpa_ctrl_get_fd(mon_conn)); 3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_ctrl_close(mon_conn); 3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt mon_conn = NULL; 3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_msg_cb(char *msg, size_t len) 3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s\n", msg); 3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int _wpa_ctrl_command(struct wpa_ctrl *ctrl, char *cmd, int print) 4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 401c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#ifdef ANDROID 402c97d8bf1d6959387a528c901eaf9c0bff47da853Dmitry Shmidt char buf[4096]; 403c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#else 404c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt char buf[2048]; 405c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#endif 4062fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt#if defined(CONFIG_P2P) && defined(ANDROID_P2P) 4072fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt char _cmd[256]; 4082fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt#endif 4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_conn == NULL) { 4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Not connected to wpa_supplicant - command dropped.\n"); 4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4162fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt#if defined(CONFIG_P2P) && defined(ANDROID_P2P) 4172fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt if (redirect_interface) { 4182fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt char *arg; 4192fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt arg = os_strchr(cmd, ' '); 4202fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt if (arg) { 4212fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt *arg++ = '\0'; 4222fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt ret = os_snprintf(_cmd, sizeof(_cmd), "%s %s %s", cmd, redirect_interface, arg); 4232fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt } 4242fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt else { 4252fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt ret = os_snprintf(_cmd, sizeof(_cmd), "%s %s", cmd, redirect_interface); 4262fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt } 4272fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt cmd = _cmd; 4282fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt os_free(redirect_interface); 4292fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt redirect_interface = NULL; 4302fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt } 4312fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt#endif 4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = sizeof(buf) - 1; 4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len, 4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_msg_cb); 4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret == -2) { 4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("'%s' command timed out.\n", cmd); 4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -2; 4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (ret < 0) { 4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("'%s' command failed.\n", cmd); 4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (print) { 4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[len] = '\0'; 4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s", buf); 4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (interactive && len > 0 && buf[len - 1] != '\n') 4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\n"); 4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_ctrl_command(struct wpa_ctrl *ctrl, char *cmd) 4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return _wpa_ctrl_command(ctrl, cmd, 1); 4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_status(struct wpa_ctrl *ctrl, int argc, char *argv[]) 4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (argc > 0 && os_strcmp(argv[0], "verbose") == 0) 4611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpa_ctrl_command(ctrl, "STATUS-VERBOSE"); 4621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (argc > 0 && os_strcmp(argv[0], "wps") == 0) 4631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpa_ctrl_command(ctrl, "STATUS-WPS"); 4641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpa_ctrl_command(ctrl, "STATUS"); 4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ping(struct wpa_ctrl *ctrl, int argc, char *argv[]) 4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "PING"); 4718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_relog(struct wpa_ctrl *ctrl, int argc, char *argv[]) 4758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "RELOG"); 4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_note(struct wpa_ctrl *ctrl, int argc, char *argv[]) 4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 4848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 0) 4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(cmd, sizeof(cmd), "NOTE %s", argv[0]); 4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || (size_t) ret >= sizeof(cmd)) 4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_mib(struct wpa_ctrl *ctrl, int argc, char *argv[]) 4948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "MIB"); 4968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_pmksa(struct wpa_ctrl *ctrl, int argc, char *argv[]) 5008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "PMKSA"); 5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_help(struct wpa_ctrl *ctrl, int argc, char *argv[]) 5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt print_help(); 5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_license(struct wpa_ctrl *ctrl, int argc, char *argv[]) 5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s\n\n%s\n", wpa_cli_version, wpa_cli_full_license); 5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_quit(struct wpa_ctrl *ctrl, int argc, char *argv[]) 5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_quit = 1; 5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (interactive) 5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_terminate(); 5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_show_variables(void) 5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("set variables:\n" 5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " EAPOL::heldPeriod (EAPOL state machine held period, " 5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "in seconds)\n" 5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " EAPOL::authPeriod (EAPOL state machine authentication " 5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "period, in seconds)\n" 5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " EAPOL::startPeriod (EAPOL state machine start period, in " 5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "seconds)\n" 5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " EAPOL::maxStart (EAPOL state machine maximum start " 5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "attempts)\n"); 5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf(" dot11RSNAConfigPMKLifetime (WPA/WPA2 PMK lifetime in " 5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "seconds)\n" 5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " dot11RSNAConfigPMKReauthThreshold (WPA/WPA2 reauthentication" 5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " threshold\n\tpercentage)\n" 5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " dot11RSNAConfigSATimeout (WPA/WPA2 timeout for completing " 5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "security\n\tassociation in seconds)\n"); 5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_set(struct wpa_ctrl *ctrl, int argc, char *argv[]) 5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 0) { 5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_show_variables(); 5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (argc != 1 && argc != 2) { 5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid SET command: needs two arguments (variable " 5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "name and value)\n"); 5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (argc == 1) 5651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "SET %s ", argv[0]); 5661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt else 5671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "SET %s %s", 5681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt argv[0], argv[1]); 5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long SET command.\n"); 5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_get(struct wpa_ctrl *ctrl, int argc, char *argv[]) 5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1) { 5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid GET command: need one argument (variable " 5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "name)\n"); 5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "GET %s", argv[0]); 5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 5908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long GET command.\n"); 5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_logoff(struct wpa_ctrl *ctrl, int argc, char *argv[]) 5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "LOGOFF"); 6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_logon(struct wpa_ctrl *ctrl, int argc, char *argv[]) 6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "LOGON"); 6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_reassociate(struct wpa_ctrl *ctrl, int argc, 6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "REASSOCIATE"); 6138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_preauthenticate(struct wpa_ctrl *ctrl, int argc, 6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1) { 6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid PREAUTH command: needs one argument " 6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(BSSID)\n"); 6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "PREAUTH %s", argv[0]); 6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long PREAUTH command.\n"); 6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ap_scan(struct wpa_ctrl *ctrl, int argc, char *argv[]) 6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1) { 6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid AP_SCAN command: needs one argument (ap_scan " 6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "value)\n"); 6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "AP_SCAN %s", argv[0]); 6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long AP_SCAN command.\n"); 6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_scan_interval(struct wpa_ctrl *ctrl, int argc, 6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1) { 6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid SCAN_INTERVAL command: needs one argument " 6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "scan_interval value)\n"); 6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "SCAN_INTERVAL %s", argv[0]); 6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long SCAN_INTERVAL command.\n"); 6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bss_expire_age(struct wpa_ctrl *ctrl, int argc, 6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1) { 6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid BSS_EXPIRE_AGE command: needs one argument " 6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(bss_expire_age value)\n"); 6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "BSS_EXPIRE_AGE %s", argv[0]); 6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long BSS_EXPIRE_AGE command.\n"); 6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bss_expire_count(struct wpa_ctrl *ctrl, int argc, 6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1) { 7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid BSS_EXPIRE_COUNT command: needs one argument " 7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(bss_expire_count value)\n"); 7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "BSS_EXPIRE_COUNT %s", argv[0]); 7088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 7098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long BSS_EXPIRE_COUNT command.\n"); 7108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_stkstart(struct wpa_ctrl *ctrl, int argc, 7178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 7188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 7208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 7218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1) { 7238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid STKSTART command: needs one argument " 7248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(Peer STA MAC address)\n"); 7258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "STKSTART %s", argv[0]); 7298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 7308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long STKSTART command.\n"); 7318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 7348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ft_ds(struct wpa_ctrl *ctrl, int argc, char *argv[]) 7388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 7408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 7418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1) { 7438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid FT_DS command: needs one argument " 7448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(Target AP MAC address)\n"); 7458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "FT_DS %s", argv[0]); 7498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 7508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long FT_DS command.\n"); 7518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 7548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_pbc(struct wpa_ctrl *ctrl, int argc, char *argv[]) 7588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 7608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 7618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 0) { 7638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Any BSSID */ 7648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "WPS_PBC"); 7658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Specific BSSID */ 7688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "WPS_PBC %s", argv[0]); 7698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 7708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long WPS_PBC command.\n"); 7718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 7748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 7758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_pin(struct wpa_ctrl *ctrl, int argc, char *argv[]) 7788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 7798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 7808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 7818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 0) { 7838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid WPS_PIN command: need one or two arguments:\n" 7848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- BSSID: use 'any' to select any\n" 7858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- PIN: optional, used only with devices that have no " 7868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "display\n"); 7878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 7908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 1) { 7918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Use dynamically generated PIN (returned as reply) */ 7928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "WPS_PIN %s", argv[0]); 7938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 7948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long WPS_PIN command.\n"); 7958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 7968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 7988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 7998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Use hardcoded PIN from a label */ 8018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "WPS_PIN %s %s", argv[0], argv[1]); 8028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 8038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long WPS_PIN command.\n"); 8048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 8078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_check_pin(struct wpa_ctrl *ctrl, int argc, 8118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 8128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 8148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 8158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1 && argc != 2) { 8178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid WPS_CHECK_PIN command: needs one argument:\n" 8188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- PIN to be verified\n"); 8198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 2) 8238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "WPS_CHECK_PIN %s %s", 8248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 8258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 8268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "WPS_CHECK_PIN %s", 8278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0]); 8288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 8298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long WPS_CHECK_PIN command.\n"); 8308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 8338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_cancel(struct wpa_ctrl *ctrl, int argc, 8378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 8388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "WPS_CANCEL"); 8408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS_OOB 8448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_oob(struct wpa_ctrl *ctrl, int argc, char *argv[]) 8458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 8478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 8488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 3 && argc != 4) { 8508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid WPS_OOB command: need three or four " 8518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "arguments:\n" 8528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- DEV_TYPE: use 'ufd' or 'nfc'\n" 8538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- PATH: path of OOB device like '/mnt'\n" 8548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- METHOD: OOB method 'pin-e' or 'pin-r', " 8558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "'cred'\n" 8568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- DEV_NAME: (only for NFC) device name like " 8578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "'pn531'\n"); 8588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 3) 8628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "WPS_OOB %s %s %s", 8638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1], argv[2]); 8648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 8658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "WPS_OOB %s %s %s %s", 8668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1], argv[2], argv[3]); 8678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 8688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long WPS_OOB command.\n"); 8698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 8708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 8728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 8738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS_OOB */ 8748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_reg(struct wpa_ctrl *ctrl, int argc, char *argv[]) 8778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 8788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 8798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 8808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 2) 8828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "WPS_REG %s %s", 8838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 8848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (argc == 5 || argc == 6) { 8858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char ssid_hex[2 * 32 + 1]; 8868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char key_hex[2 * 64 + 1]; 8878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i; 8888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid_hex[0] = '\0'; 8908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < 32; i++) { 8918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argv[2][i] == '\0') 8928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 8938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(&ssid_hex[i * 2], 3, "%02x", argv[2][i]); 8948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 8958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 8968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_hex[0] = '\0'; 8978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 6) { 8988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < 64; i++) { 8998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argv[5][i] == '\0') 9008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 9018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(&key_hex[i * 2], 3, "%02x", 9028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[5][i]); 9038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), 9078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "WPS_REG %s %s %s %s %s %s", 9088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1], ssid_hex, argv[3], argv[4], 9098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_hex); 9108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 9118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid WPS_REG command: need two arguments:\n" 9128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- BSSID of the target AP\n" 9138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- AP PIN\n"); 9148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Alternatively, six arguments can be used to " 9158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "reconfigure the AP:\n" 9168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- BSSID of the target AP\n" 9178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- AP PIN\n" 9188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- new SSID\n" 9198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- new auth (OPEN, WPAPSK, WPA2PSK)\n" 9208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- new encr (NONE, WEP, TKIP, CCMP)\n" 9218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- new key\n"); 9228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 9268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long WPS_REG command.\n"); 9278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 9308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_ap_pin(struct wpa_ctrl *ctrl, int argc, 9348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 9358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 9378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 9388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 1) { 9408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid WPS_AP_PIN command: needs at least one " 9418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "argument\n"); 9428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc > 2) 9468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "WPS_AP_PIN %s %s %s", 9478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1], argv[2]); 9488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (argc > 1) 9498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "WPS_AP_PIN %s %s", 9508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 9518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 9528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "WPS_AP_PIN %s", 9538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0]); 9548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 9558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long WPS_AP_PIN command.\n"); 9568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 9598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_start(struct wpa_ctrl *ctrl, int argc, 9638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 9648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[100]; 9668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc > 0) { 9678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(cmd, sizeof(cmd), "WPS_ER_START %s", argv[0]); 9688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 9698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "WPS_ER_START"); 9718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_stop(struct wpa_ctrl *ctrl, int argc, 9758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 9768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "WPS_ER_STOP"); 9788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 9808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_pin(struct wpa_ctrl *ctrl, int argc, 9838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 9848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 9858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 9868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 9878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 2) { 9898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid WPS_ER_PIN command: need at least two " 9908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "arguments:\n" 9918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- UUID: use 'any' to select any\n" 9928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- PIN: Enrollee PIN\n" 9938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "optional: - Enrollee MAC address\n"); 9948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 9958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 9968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 9978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc > 2) 9988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "WPS_ER_PIN %s %s %s", 9998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1], argv[2]); 10008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 10018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "WPS_ER_PIN %s %s", 10028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 10038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 10048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long WPS_ER_PIN command.\n"); 10058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 10088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_pbc(struct wpa_ctrl *ctrl, int argc, 10128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 10138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 10158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 10168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1) { 10188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid WPS_ER_PBC command: need one argument:\n" 10198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- UUID: Specify the Enrollee\n"); 10208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "WPS_ER_PBC %s", 10248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0]); 10258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 10268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long WPS_ER_PBC command.\n"); 10278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 10308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_learn(struct wpa_ctrl *ctrl, int argc, 10348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 10358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 10378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 10388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 2) { 10408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid WPS_ER_LEARN command: need two arguments:\n" 10418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- UUID: specify which AP to use\n" 10428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- PIN: AP PIN\n"); 10438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "WPS_ER_LEARN %s %s", 10478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 10488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 10498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long WPS_ER_LEARN command.\n"); 10508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 10538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_set_config(struct wpa_ctrl *ctrl, int argc, 10578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 10588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 10608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 10618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 2) { 10638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid WPS_ER_SET_CONFIG command: need two " 10648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "arguments:\n" 10658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- UUID: specify which AP to use\n" 10668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- Network configuration id\n"); 10678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "WPS_ER_SET_CONFIG %s %s", 10718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 10728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 10738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long WPS_ER_SET_CONFIG command.\n"); 10748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 10758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 10778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 10788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_wps_er_config(struct wpa_ctrl *ctrl, int argc, 10818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 10828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 10838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 10848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 10858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 5 || argc == 6) { 10878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char ssid_hex[2 * 32 + 1]; 10888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char key_hex[2 * 64 + 1]; 10898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i; 10908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid_hex[0] = '\0'; 10928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < 32; i++) { 10938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argv[2][i] == '\0') 10948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 10958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(&ssid_hex[i * 2], 3, "%02x", argv[2][i]); 10968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 10978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 10988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_hex[0] = '\0'; 10998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 6) { 11008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < 64; i++) { 11018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argv[5][i] == '\0') 11028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 11038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(&key_hex[i * 2], 3, "%02x", 11048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[5][i]); 11058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), 11098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "WPS_ER_CONFIG %s %s %s %s %s %s", 11108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1], ssid_hex, argv[3], argv[4], 11118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt key_hex); 11128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 11138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid WPS_ER_CONFIG command: need six arguments:\n" 11148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- AP UUID\n" 11158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- AP PIN\n" 11168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- new SSID\n" 11178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- new auth (OPEN, WPAPSK, WPA2PSK)\n" 11188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- new encr (NONE, WEP, TKIP, CCMP)\n" 11198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "- new key\n"); 11208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 11248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long WPS_ER_CONFIG command.\n"); 11258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 11288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_ibss_rsn(struct wpa_ctrl *ctrl, int argc, char *argv[]) 11328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 11348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 11358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1) { 11378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid IBSS_RSN command: needs one argument " 11388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(Peer STA MAC address)\n"); 11398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "IBSS_RSN %s", argv[0]); 11438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 11448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long IBSS_RSN command.\n"); 11458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 11488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_level(struct wpa_ctrl *ctrl, int argc, char *argv[]) 11528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 11548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 11558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1) { 11578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid LEVEL command: needs one argument (debug " 11588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "level)\n"); 11598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "LEVEL %s", argv[0]); 11628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 11638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long LEVEL command.\n"); 11648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 11678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 11688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_identity(struct wpa_ctrl *ctrl, int argc, char *argv[]) 11718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 11728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256], *pos, *end; 11738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, ret; 11748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 2) { 11768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid IDENTITY command: needs two arguments " 11778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(network id and identity)\n"); 11788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = cmd + sizeof(cmd); 11828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = cmd; 11838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "IDENTITY-%s:%s", 11848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 11858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) { 11868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long IDENTITY command.\n"); 11878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 11908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 2; i < argc; i++) { 11918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, " %s", argv[i]); 11928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) { 11938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long IDENTITY command.\n"); 11948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 11958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 11978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 11988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 11998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 12008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_password(struct wpa_ctrl *ctrl, int argc, char *argv[]) 12048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256], *pos, *end; 12068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, ret; 12078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 2) { 12098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid PASSWORD command: needs two arguments " 12108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(network id and password)\n"); 12118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = cmd + sizeof(cmd); 12158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = cmd; 12168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PASSWORD-%s:%s", 12178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 12188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) { 12198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long PASSWORD command.\n"); 12208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 12238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 2; i < argc; i++) { 12248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, " %s", argv[i]); 12258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) { 12268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long PASSWORD command.\n"); 12278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 12308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 12338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_new_password(struct wpa_ctrl *ctrl, int argc, 12378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 12388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256], *pos, *end; 12408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, ret; 12418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 2) { 12438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid NEW_PASSWORD command: needs two arguments " 12448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(network id and password)\n"); 12458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = cmd + sizeof(cmd); 12498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = cmd; 12508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "NEW_PASSWORD-%s:%s", 12518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 12528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) { 12538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long NEW_PASSWORD command.\n"); 12548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 12578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 2; i < argc; i++) { 12588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, " %s", argv[i]); 12598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) { 12608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long NEW_PASSWORD command.\n"); 12618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 12648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 12678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 12688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_pin(struct wpa_ctrl *ctrl, int argc, char *argv[]) 12718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 12728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256], *pos, *end; 12738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, ret; 12748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 2) { 12768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid PIN command: needs two arguments " 12778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(network id and pin)\n"); 12788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 12818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = cmd + sizeof(cmd); 12828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = cmd; 12838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PIN-%s:%s", 12848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 12858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) { 12868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long PIN command.\n"); 12878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 12908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 2; i < argc; i++) { 12918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, " %s", argv[i]); 12928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) { 12938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long PIN command.\n"); 12948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 12958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 12978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 12988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 12998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 13008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_otp(struct wpa_ctrl *ctrl, int argc, char *argv[]) 13038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 13048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256], *pos, *end; 13058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, ret; 13068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 2) { 13088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid OTP command: needs two arguments (network " 13098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "id and password)\n"); 13108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 13118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = cmd + sizeof(cmd); 13148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = cmd; 13158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "OTP-%s:%s", 13168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 13178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) { 13188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long OTP command.\n"); 13198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 13208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 13228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 2; i < argc; i++) { 13238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, " %s", argv[i]); 13248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) { 13258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long OTP command.\n"); 13268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 13278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 13298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 13328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 13338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_passphrase(struct wpa_ctrl *ctrl, int argc, 13368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 13378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 13388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256], *pos, *end; 13398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, ret; 13408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 2) { 13428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid PASSPHRASE command: needs two arguments " 13438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(network id and passphrase)\n"); 13448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 13458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = cmd + sizeof(cmd); 13488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = cmd; 13498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PASSPHRASE-%s:%s", 13508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 13518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) { 13528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long PASSPHRASE command.\n"); 13538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 13548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 13568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 2; i < argc; i++) { 13578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, " %s", argv[i]); 13588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) { 13598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long PASSPHRASE command.\n"); 13608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 13618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 13638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 13668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 13678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bssid(struct wpa_ctrl *ctrl, int argc, char *argv[]) 13708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 13718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256], *pos, *end; 13728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, ret; 13738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 2) { 13758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid BSSID command: needs two arguments (network " 13768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "id and BSSID)\n"); 13778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 13788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = cmd + sizeof(cmd); 13818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = cmd; 13828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, "BSSID"); 13838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) { 13848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long BSSID command.\n"); 13858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 13868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 13888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < argc; i++) { 13898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_snprintf(pos, end - pos, " %s", argv[i]); 13908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret < 0 || ret >= end - pos) { 13918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long BSSID command.\n"); 13928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 13938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos += ret; 13958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 13968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 13978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 13988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 13998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1401696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidtstatic int wpa_cli_cmd_blacklist(struct wpa_ctrl *ctrl, int argc, char *argv[]) 1402696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt{ 1403696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt char cmd[256], *pos, *end; 1404696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt int i, ret; 1405696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt 1406696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt end = cmd + sizeof(cmd); 1407696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt pos = cmd; 1408696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt ret = os_snprintf(pos, end - pos, "BLACKLIST"); 1409696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt if (ret < 0 || ret >= end - pos) { 1410696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt printf("Too long BLACKLIST command.\n"); 1411696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt return -1; 1412696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt } 1413696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt pos += ret; 1414696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt for (i = 0; i < argc; i++) { 1415696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt ret = os_snprintf(pos, end - pos, " %s", argv[i]); 1416696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt if (ret < 0 || ret >= end - pos) { 1417696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt printf("Too long BLACKLIST command.\n"); 1418696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt return -1; 1419696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt } 1420696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt pos += ret; 1421696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt } 1422696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt 1423696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 1424696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt} 1425696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt 1426696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt 1427696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidtstatic int wpa_cli_cmd_log_level(struct wpa_ctrl *ctrl, int argc, char *argv[]) 1428696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt{ 1429696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt char cmd[256], *pos, *end; 1430696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt int i, ret; 1431696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt 1432696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt end = cmd + sizeof(cmd); 1433696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt pos = cmd; 1434696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt ret = os_snprintf(pos, end - pos, "LOG_LEVEL"); 1435696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt if (ret < 0 || ret >= end - pos) { 1436696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt printf("Too long LOG_LEVEL command.\n"); 1437696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt return -1; 1438696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt } 1439696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt pos += ret; 1440696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt for (i = 0; i < argc; i++) { 1441696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt ret = os_snprintf(pos, end - pos, " %s", argv[i]); 1442696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt if (ret < 0 || ret >= end - pos) { 1443696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt printf("Too long LOG_LEVEL command.\n"); 1444696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt return -1; 1445696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt } 1446696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt pos += ret; 1447696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt } 1448696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt 1449696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 1450696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt} 1451696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt 1452696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt 14538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_list_networks(struct wpa_ctrl *ctrl, int argc, 14548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 14558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 14568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "LIST_NETWORKS"); 14578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_select_network(struct wpa_ctrl *ctrl, int argc, 14618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 14628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 14638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[32]; 14648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 14658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 1) { 14678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid SELECT_NETWORK command: needs one argument " 14688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(network id)\n"); 14698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 14708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "SELECT_NETWORK %s", argv[0]); 14738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 14748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 14758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 14768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 14788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 14798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_enable_network(struct wpa_ctrl *ctrl, int argc, 14828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 14838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 14848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[32]; 14858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 14868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 1) { 14888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid ENABLE_NETWORK command: needs one argument " 14898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(network id)\n"); 14908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 14918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 14928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "ENABLE_NETWORK %s", argv[0]); 14948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 14958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 14968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 14978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 14988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 14998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_disable_network(struct wpa_ctrl *ctrl, int argc, 15038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 15048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 15058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[32]; 15068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 15078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 1) { 15098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid DISABLE_NETWORK command: needs one argument " 15108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(network id)\n"); 15118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 15128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "DISABLE_NETWORK %s", argv[0]); 15158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 15168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 15178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 15188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 15208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_add_network(struct wpa_ctrl *ctrl, int argc, 15248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 15258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 15268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "ADD_NETWORK"); 15278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_remove_network(struct wpa_ctrl *ctrl, int argc, 15318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 15328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 15338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[32]; 15348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 15358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 1) { 15378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid REMOVE_NETWORK command: needs one argument " 15388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(network id)\n"); 15398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 15408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "REMOVE_NETWORK %s", argv[0]); 15438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 15448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 15458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 15468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 15488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_show_network_variables(void) 15528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 15538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("set_network variables:\n" 15548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " ssid (network name, SSID)\n" 15558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " psk (WPA passphrase or pre-shared key)\n" 15568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " key_mgmt (key management protocol)\n" 15578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " identity (EAP identity)\n" 15588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " password (EAP password)\n" 15598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " ...\n" 15608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "\n" 15618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Note: Values are entered in the same format as the " 15628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "configuration file is using,\n" 15638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "i.e., strings values need to be inside double quotation " 15648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "marks.\n" 15658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "For example: set_network 1 ssid \"network name\"\n" 15668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "\n" 15678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Please see wpa_supplicant.conf documentation for full list " 15688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "of\navailable variables.\n"); 15698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_set_network(struct wpa_ctrl *ctrl, int argc, 15738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 15748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 15758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 15768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 15778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 0) { 15798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_show_network_variables(); 15808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 15818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 3) { 15848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid SET_NETWORK command: needs three arguments\n" 15858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(network id, variable name, and value)\n"); 15868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 15878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "SET_NETWORK %s %s %s", 15908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1], argv[2]); 15918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 15928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long SET_NETWORK command.\n"); 15938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 15948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 15958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 15968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 15978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 15998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_get_network(struct wpa_ctrl *ctrl, int argc, 16008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 16018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 16038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 16048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 0) { 16068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_show_network_variables(); 16078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 16088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 2) { 16118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid GET_NETWORK command: needs two arguments\n" 16128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(network id and variable name)\n"); 16138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 16148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "GET_NETWORK %s %s", 16178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 16188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 16198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long GET_NETWORK command.\n"); 16208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 16218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 16238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_disconnect(struct wpa_ctrl *ctrl, int argc, 16278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 16288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "DISCONNECT"); 16308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_reconnect(struct wpa_ctrl *ctrl, int argc, 16348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 16358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "RECONNECT"); 16378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_save_config(struct wpa_ctrl *ctrl, int argc, 16418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 16428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "SAVE_CONFIG"); 16448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_scan(struct wpa_ctrl *ctrl, int argc, char *argv[]) 16488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "SCAN"); 16508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_scan_results(struct wpa_ctrl *ctrl, int argc, 16548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 16558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "SCAN_RESULTS"); 16578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_bss(struct wpa_ctrl *ctrl, int argc, char *argv[]) 16618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 16628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[64]; 16638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 16648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1665f2df2f2f5318f4ce3046b93207fada30fe694069Dmitry Shmidt if (argc < 1) { 1666f2df2f2f5318f4ce3046b93207fada30fe694069Dmitry Shmidt printf("Invalid BSS command: need at least one argument" 1667f2df2f2f5318f4ce3046b93207fada30fe694069Dmitry Shmidt "(index or BSSID)\n"); 16688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 16698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 16708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1671f2df2f2f5318f4ce3046b93207fada30fe694069Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "BSS %s\t%s\t%s", argv[0], 1672f2df2f2f5318f4ce3046b93207fada30fe694069Dmitry Shmidt argc > 1 ? argv[1] : "", argc > 2 ? argv[2] : ""); 1673f2df2f2f5318f4ce3046b93207fada30fe694069Dmitry Shmidt 16748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 16758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 16768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 16778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 16798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 16808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 16821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** wpa_cli_complete_bss(const char *str, int pos) 16831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 16841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int arg = get_cmd_arg_num(str, pos); 16851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char **res = NULL; 16861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 16871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt switch (arg) { 16881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case 1: 16891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = cli_txt_list_array(&bsses); 16901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 16911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 16921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 16931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return res; 16941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 16951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 16961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 16978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_get_capability(struct wpa_ctrl *ctrl, int argc, 16988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 16998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[64]; 17018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 17028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 1 || argc > 2) { 17048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid GET_CAPABILITY command: need either one or " 17058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "two arguments\n"); 17068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 17078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((argc == 2) && os_strcmp(argv[1], "strict") != 0) { 17108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid GET_CAPABILITY command: second argument, " 17118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "if any, must be 'strict'\n"); 17128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 17138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "GET_CAPABILITY %s%s", argv[0], 17168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (argc == 2) ? " strict" : ""); 17178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 17188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 17198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 17208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 17228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_list_interfaces(struct wpa_ctrl *ctrl) 17268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Available interfaces:\n"); 17288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "INTERFACES"); 17298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface(struct wpa_ctrl *ctrl, int argc, char *argv[]) 17338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 1) { 17358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_list_interfaces(ctrl); 17368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 17378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_close_connection(); 17408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ctrl_ifname); 17418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_ifname = os_strdup(argv[0]); 17428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_cli_open_connection(ctrl_ifname, 1)) { 17448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Connected to interface '%s.\n", ctrl_ifname); 17458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 17468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Could not connect to interface '%s' - re-trying\n", 17478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_ifname); 17488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 17508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_reconfigure(struct wpa_ctrl *ctrl, int argc, 17548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 17558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "RECONFIGURE"); 17578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_terminate(struct wpa_ctrl *ctrl, int argc, 17618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 17628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "TERMINATE"); 17648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface_add(struct wpa_ctrl *ctrl, int argc, 17688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 17698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 17708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 17718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 17728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 1) { 17748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid INTERFACE_ADD command: needs at least one " 17758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "argument (interface name)\n" 17768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "All arguments: ifname confname driver ctrl_interface " 17778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "driver_param bridge_name\n"); 17788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 17798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 17808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 17828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * INTERFACE_ADD <ifname>TAB<confname>TAB<driver>TAB<ctrl_interface>TAB 17838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * <driver_param>TAB<bridge_name> 17848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 17858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), 17868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "INTERFACE_ADD %s\t%s\t%s\t%s\t%s\t%s", 17878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], 17888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argc > 1 ? argv[1] : "", argc > 2 ? argv[2] : "", 17898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argc > 3 ? argv[3] : "", argc > 4 ? argv[4] : "", 17908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argc > 5 ? argv[5] : ""); 17918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 17928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 17938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 17948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 17958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 17968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 17988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface_remove(struct wpa_ctrl *ctrl, int argc, 17998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 18008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[128]; 18028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 18038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1) { 18058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid INTERFACE_REMOVE command: needs one argument " 18068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(interface name)\n"); 18078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 18088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "INTERFACE_REMOVE %s", argv[0]); 18118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 18128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 18138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 18148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 18158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_interface_list(struct wpa_ctrl *ctrl, int argc, 18198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 18208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "INTERFACE_LIST"); 18228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_AP 18268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_sta(struct wpa_ctrl *ctrl, int argc, char *argv[]) 18278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[64]; 18298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1) { 18308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid 'sta' command - exactly one argument, STA " 18318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "address, is required.\n"); 18328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 18338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(buf, sizeof(buf), "STA %s", argv[0]); 18358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, buf); 18368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_ctrl_command_sta(struct wpa_ctrl *ctrl, char *cmd, 18408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *addr, size_t addr_len) 18418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[4096], *pos; 18438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 18448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 18458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_conn == NULL) { 18478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Not connected to hostapd - command dropped.\n"); 18488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 18498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = sizeof(buf) - 1; 18518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = wpa_ctrl_request(ctrl, cmd, strlen(cmd), buf, &len, 18528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_msg_cb); 18538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret == -2) { 18548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("'%s' command timed out.\n", cmd); 18558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -2; 18568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (ret < 0) { 18578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("'%s' command failed.\n", cmd); 18588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 18598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 18608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[len] = '\0'; 18628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (memcmp(buf, "FAIL", 4) == 0) 18638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 18648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s", buf); 18658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = buf; 18678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != '\0' && *pos != '\n') 18688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 18698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos = '\0'; 18708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlcpy(addr, buf, addr_len); 18718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 18728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_all_sta(struct wpa_ctrl *ctrl, int argc, char *argv[]) 18768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char addr[32], cmd[64]; 18788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_ctrl_command_sta(ctrl, "STA-FIRST", addr, sizeof(addr))) 18808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 18818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt do { 18828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(cmd, sizeof(cmd), "STA-NEXT %s", addr); 18838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } while (wpa_ctrl_command_sta(ctrl, cmd, addr, sizeof(addr)) == 0); 18848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 18868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_AP */ 18888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_suspend(struct wpa_ctrl *ctrl, int argc, char *argv[]) 18918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "SUSPEND"); 18938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 18948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 18968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_resume(struct wpa_ctrl *ctrl, int argc, char *argv[]) 18978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 18988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "RESUME"); 18998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 19008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_drop_sa(struct wpa_ctrl *ctrl, int argc, char *argv[]) 19038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 19048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "DROP_SA"); 19058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 19068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_roam(struct wpa_ctrl *ctrl, int argc, char *argv[]) 19098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 19108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[128]; 19118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 19128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1) { 19148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid ROAM command: needs one argument " 19158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(target AP's BSSID)\n"); 19168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 19178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "ROAM %s", argv[0]); 19208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 19218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long ROAM command.\n"); 19228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 19238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 19258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 19268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 19298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_find(struct wpa_ctrl *ctrl, int argc, char *argv[]) 19318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 19328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[128]; 19338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 19348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 0) 19368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "P2P_FIND"); 19378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1938c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt if (argc > 2) 1939c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_FIND %s %s %s", 1940c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt argv[0], argv[1], argv[2]); 1941c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt else if (argc > 1) 19428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_FIND %s %s", 19438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 19448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 19458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_FIND %s", argv[0]); 19468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 19478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 19488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 19498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 19508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 19518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_stop_find(struct wpa_ctrl *ctrl, int argc, 19548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 19558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 19568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "P2P_STOP_FIND"); 19578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 19588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_connect(struct wpa_ctrl *ctrl, int argc, 19618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 19628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 19638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[128]; 19648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 19658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 2) { 19678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid P2P_CONNECT command: needs at least two " 19688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "arguments (address and pbc/PIN)\n"); 19698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 19708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 19718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc > 4) 19738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), 19748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "P2P_CONNECT %s %s %s %s %s", 19758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1], argv[2], argv[3], 19768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[4]); 19778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (argc > 3) 19788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_CONNECT %s %s %s %s", 19798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1], argv[2], argv[3]); 19808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (argc > 2) 19818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_CONNECT %s %s %s", 19828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1], argv[2]); 19838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 19848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_CONNECT %s %s", 19858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 19868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 19878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 19888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 19898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 19908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 19918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 19931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** wpa_cli_complete_p2p_connect(const char *str, int pos) 19941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 19951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int arg = get_cmd_arg_num(str, pos); 19961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char **res = NULL; 19971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 19981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt switch (arg) { 19991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case 1: 20001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = cli_txt_list_array(&p2p_peers); 20011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 20021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 20031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 20041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return res; 20051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 20061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 20071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 20088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_listen(struct wpa_ctrl *ctrl, int argc, 20098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 20108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 20118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[128]; 20128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 20138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 0) 20158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "P2P_LISTEN"); 20168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_LISTEN %s", argv[0]); 20188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 20198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 20208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 20218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 20228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 20238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_group_remove(struct wpa_ctrl *ctrl, int argc, 20268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 20278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 20288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[128]; 20298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 20308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1) { 20328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid P2P_GROUP_REMOVE command: needs one argument " 20338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(interface name)\n"); 20348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 20358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_GROUP_REMOVE %s", argv[0]); 20388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 20398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 20408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 20418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 20428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 20438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** wpa_cli_complete_p2p_group_remove(const char *str, int pos) 20461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 20471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int arg = get_cmd_arg_num(str, pos); 20481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char **res = NULL; 20491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 20501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt switch (arg) { 20511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case 1: 20521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = cli_txt_list_array(&p2p_groups); 20531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 20541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 20551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 20561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return res; 20571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 20581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 20591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 20608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_group_add(struct wpa_ctrl *ctrl, int argc, 20618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 20628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 20638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[128]; 20648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 20658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 0) 20678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "P2P_GROUP_ADD"); 20688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2069c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt if (argc > 1) 2070c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_GROUP_ADD %s %s", 2071c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt argv[0], argv[1]); 2072c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt else 2073c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_GROUP_ADD %s", 2074c55524ad84d13014e8019491c2b17e5dcf13545aDmitry Shmidt argv[0]); 20758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 20768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 20778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 20788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 20798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 20808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_prov_disc(struct wpa_ctrl *ctrl, int argc, 20838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 20848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 20858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[128]; 20868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 20878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (argc != 2 && argc != 3) { 20891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt printf("Invalid P2P_PROV_DISC command: needs at least " 20901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "two arguments, address and config method\n" 20911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "(display, keypad, or pbc) and an optional join\n"); 20928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 20938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 20948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 20951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (argc == 3) 20961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_PROV_DISC %s %s %s", 20971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt argv[0], argv[1], argv[2]); 20981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt else 20991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_PROV_DISC %s %s", 21001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt argv[0], argv[1]); 21018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 21028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 21038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 21048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 21058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 21068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_get_passphrase(struct wpa_ctrl *ctrl, int argc, 21098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 21108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 21118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "P2P_GET_PASSPHRASE"); 21128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 21138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_req(struct wpa_ctrl *ctrl, int argc, 21168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 21178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 21188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[4096]; 21198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 21208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 2 && argc != 4) { 21228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid P2P_SERV_DISC_REQ command: needs two " 21238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "arguments (address and TLVs) or four arguments " 21248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(address, \"upnp\", version, search target " 21258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(SSDP ST:)\n"); 21268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 21278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 4) 21308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), 21318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "P2P_SERV_DISC_REQ %s %s %s %s", 21328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1], argv[2], argv[3]); 21338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 21348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_SERV_DISC_REQ %s %s", 21358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 21368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 21378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 21388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 21398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 21408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 21418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_cancel_req(struct wpa_ctrl *ctrl, 21448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int argc, char *argv[]) 21458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 21468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[128]; 21478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 21488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1) { 21508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid P2P_SERV_DISC_CANCEL_REQ command: needs one " 21518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "argument (pending request identifier)\n"); 21528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 21538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_SERV_DISC_CANCEL_REQ %s", 21568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0]); 21578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 21588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 21598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 21608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 21618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 21628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_resp(struct wpa_ctrl *ctrl, int argc, 21658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 21668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 21678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[4096]; 21688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 21698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 4) { 21718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid P2P_SERV_DISC_RESP command: needs four " 21728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "arguments (freq, address, dialog token, and TLVs)\n"); 21738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 21748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 21758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_SERV_DISC_RESP %s %s %s %s", 21778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1], argv[2], argv[3]); 21788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 21798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 21808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 21818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 21828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 21838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_update(struct wpa_ctrl *ctrl, int argc, 21868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 21878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 21888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "P2P_SERVICE_UPDATE"); 21898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 21908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_serv_disc_external(struct wpa_ctrl *ctrl, 21938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int argc, char *argv[]) 21948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 21958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[128]; 21968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 21978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 21988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1) { 21998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid P2P_SERV_DISC_EXTERNAL command: needs one " 22008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "argument (external processing: 0/1)\n"); 22018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 22028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_SERV_DISC_EXTERNAL %s", 22058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0]); 22068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 22078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 22088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 22098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 22108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 22118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_flush(struct wpa_ctrl *ctrl, int argc, 22148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 22158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 22168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "P2P_SERVICE_FLUSH"); 22178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 22188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_add(struct wpa_ctrl *ctrl, int argc, 22218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 22228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 22238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[4096]; 22248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 22258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 3 && argc != 4) { 22278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid P2P_SERVICE_ADD command: needs three or four " 22288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "arguments\n"); 22298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 22308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 4) 22338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), 22348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "P2P_SERVICE_ADD %s %s %s %s", 22358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1], argv[2], argv[3]); 22368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 22378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), 22388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "P2P_SERVICE_ADD %s %s %s", 22398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1], argv[2]); 22408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 22418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 22428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 22438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 22448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 22458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_service_del(struct wpa_ctrl *ctrl, int argc, 22488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 22498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 22508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[4096]; 22518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 22528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 2 && argc != 3) { 22548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid P2P_SERVICE_DEL command: needs two or three " 22558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "arguments\n"); 22568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 22578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 3) 22608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), 22618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "P2P_SERVICE_DEL %s %s %s", 22628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1], argv[2]); 22638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 22648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), 22658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "P2P_SERVICE_DEL %s %s", 22668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 22678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 22688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 22698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 22708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 22718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 22728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_reject(struct wpa_ctrl *ctrl, 22758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int argc, char *argv[]) 22768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 22778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[128]; 22788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 22798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1) { 22818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid P2P_REJECT command: needs one argument " 22828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(peer address)\n"); 22838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 22848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 22858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_REJECT %s", argv[0]); 22878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 22888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 22898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 22908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 22918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 22928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 22948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_invite(struct wpa_ctrl *ctrl, 22958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int argc, char *argv[]) 22968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 22978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[128]; 22988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 22998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 1) { 23018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid P2P_INVITE command: needs at least one " 23028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "argument\n"); 23038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 23048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc > 2) 23078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_INVITE %s %s %s", 23088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1], argv[2]); 23098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (argc > 1) 23108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_INVITE %s %s", 23118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 23128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 23138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_INVITE %s", argv[0]); 23148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 23158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 23168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 23178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 23188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 23198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_peer(struct wpa_ctrl *ctrl, int argc, char *argv[]) 23228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 23238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[64]; 23248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1) { 23258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid 'p2p_peer' command - exactly one argument, " 23268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "P2P peer device address, is required.\n"); 23278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 23288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(buf, sizeof(buf), "P2P_PEER %s", argv[0]); 23308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, buf); 23318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 23328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic char ** wpa_cli_complete_p2p_peer(const char *str, int pos) 23351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 23361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int arg = get_cmd_arg_num(str, pos); 23371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char **res = NULL; 23381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 23391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt switch (arg) { 23401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt case 1: 23411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = cli_txt_list_array(&p2p_peers); 23421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt break; 23431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 23441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 23451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return res; 23461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 23471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 23481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 23498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_ctrl_command_p2p_peer(struct wpa_ctrl *ctrl, char *cmd, 23508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *addr, size_t addr_len, 23518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int discovered) 23528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 23538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[4096], *pos; 23548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 23558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 23568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_conn == NULL) 23588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 23598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = sizeof(buf) - 1; 23608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = wpa_ctrl_request(ctrl, cmd, strlen(cmd), buf, &len, 23618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_msg_cb); 23628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret == -2) { 23638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("'%s' command timed out.\n", cmd); 23648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -2; 23658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (ret < 0) { 23668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("'%s' command failed.\n", cmd); 23678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 23688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 23698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[len] = '\0'; 23718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (memcmp(buf, "FAIL", 4) == 0) 23728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 23738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = buf; 23758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != '\0' && *pos != '\n') 23768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 23778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = '\0'; 23788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlcpy(addr, buf, addr_len); 23798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!discovered || os_strstr(pos, "[PROBE_REQ_ONLY]") == NULL) 23808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s\n", addr); 23818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 23828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 23838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_peers(struct wpa_ctrl *ctrl, int argc, char *argv[]) 23868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 23878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char addr[32], cmd[64]; 23888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int discovered; 23898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt discovered = argc > 0 && os_strcmp(argv[0], "discovered") == 0; 23918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 23928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_ctrl_command_p2p_peer(ctrl, "P2P_PEER FIRST", 23938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt addr, sizeof(addr), discovered)) 23941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 23958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt do { 23968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(cmd, sizeof(cmd), "P2P_PEER NEXT-%s", addr); 23978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } while (wpa_ctrl_command_p2p_peer(ctrl, cmd, addr, sizeof(addr), 23988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt discovered) == 0); 23998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return 0; 24018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 24028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_set(struct wpa_ctrl *ctrl, int argc, char *argv[]) 24058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 24068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[100]; 24078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 24088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 2) { 24108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid P2P_SET command: needs two arguments (field, " 24118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "value)\n"); 24128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 24138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_SET %s %s", argv[0], argv[1]); 24168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 24178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 24188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 24198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 24208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 24218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_flush(struct wpa_ctrl *ctrl, int argc, char *argv[]) 24248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 24258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "P2P_FLUSH"); 24268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 24278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_cancel(struct wpa_ctrl *ctrl, int argc, 24308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 24318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 24328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "P2P_CANCEL"); 24338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 24348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_unauthorize(struct wpa_ctrl *ctrl, int argc, 24378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 24388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 24398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[100]; 24408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 24418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1) { 24438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid P2P_UNAUTHORIZE command: needs one argument " 24448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(peer address)\n"); 24458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 24468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_UNAUTHORIZE %s", argv[0]); 24498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 24518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 24528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 24548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 24558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 24568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_presence_req(struct wpa_ctrl *ctrl, int argc, 24598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 24608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 24618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[100]; 24628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 24638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 0 && argc != 2 && argc != 4) { 24658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid P2P_PRESENCE_REQ command: needs two arguments " 24668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(preferred duration, interval; in microsecods).\n" 24678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Optional second pair can be used to provide " 24688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "acceptable values.\n"); 24698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 24708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 24718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 4) 24738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), 24748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "P2P_PRESENCE_REQ %s %s %s %s", 24758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1], argv[2], argv[3]); 24768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (argc == 2) 24778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_PRESENCE_REQ %s %s", 24788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 24798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 24808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_PRESENCE_REQ"); 24818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 24828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 24838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 24848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 24858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 24868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_p2p_ext_listen(struct wpa_ctrl *ctrl, int argc, 24898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 24908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 24918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[100]; 24928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 24938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 24948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 0 && argc != 2) { 24958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid P2P_EXT_LISTEN command: needs two arguments " 24968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(availability period, availability interval; in " 24978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "millisecods).\n" 24988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Extended Listen Timing can be cancelled with this " 24998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "command when used without parameters.\n"); 25008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 25018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 25028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == 2) 25048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_EXT_LISTEN %s %s", 25058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[0], argv[1]); 25068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 25078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "P2P_EXT_LISTEN"); 25088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 25098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 25108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 25118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 25128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 25138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 25158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_INTERWORKING 25181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_fetch_anqp(struct wpa_ctrl *ctrl, int argc, 25191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *argv[]) 25201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 25211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpa_ctrl_command(ctrl, "FETCH_ANQP"); 25221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 25231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_stop_fetch_anqp(struct wpa_ctrl *ctrl, int argc, 25261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *argv[]) 25271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 25281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpa_ctrl_command(ctrl, "STOP_FETCH_ANQP"); 25291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 25301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_interworking_select(struct wpa_ctrl *ctrl, int argc, 25331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *argv[]) 25341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 25351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char cmd[100]; 25361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int res; 25371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (argc == 0) 25391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpa_ctrl_command(ctrl, "INTERWORKING_SELECT"); 25401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "INTERWORKING_SELECT %s", argv[0]); 25421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 25431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 25441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 25451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 25461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 25471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_interworking_connect(struct wpa_ctrl *ctrl, int argc, 25501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *argv[]) 25511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 25521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char cmd[100]; 25531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int res; 25541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (argc != 1) { 25561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt printf("Invalid INTERWORKING_CONNECT commands: needs one " 25571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "argument (BSSID)\n"); 25581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 25591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 25601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "INTERWORKING_CONNECT %s", 25621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt argv[0]); 25631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 25641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 25651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 25661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 25671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 25681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_anqp_get(struct wpa_ctrl *ctrl, int argc, char *argv[]) 25711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 25721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char cmd[100]; 25731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt int res; 25741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (argc != 2) { 25761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt printf("Invalid ANQP_GET command: needs two arguments " 25771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "(addr and info id list)\n"); 25781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 25791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 25801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "ANQP_GET %s %s", 25821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt argv[0], argv[1]); 25831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd)) 25841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 25851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 25861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 25871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 25881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_INTERWORKING */ 25891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 25918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_sta_autoconnect(struct wpa_ctrl *ctrl, int argc, 25928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 25938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 25948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 25958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 25968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 25978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1) { 25988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid STA_AUTOCONNECT command: needs one argument " 25998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(0/1 = disable/enable automatic reconnection)\n"); 26008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 26018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "STA_AUTOCONNECT %s", argv[0]); 26038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 26048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long STA_AUTOCONNECT command.\n"); 26058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 26068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 26088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_tdls_discover(struct wpa_ctrl *ctrl, int argc, 26128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 26138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 26148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 26158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 26168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1) { 26188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid TDLS_DISCOVER command: needs one argument " 26198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(Peer STA MAC address)\n"); 26208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 26218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "TDLS_DISCOVER %s", argv[0]); 26248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 26258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long TDLS_DISCOVER command.\n"); 26268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 26278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 26298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_tdls_setup(struct wpa_ctrl *ctrl, int argc, 26338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 26348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 26358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 26368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 26378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1) { 26398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid TDLS_SETUP command: needs one argument " 26408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(Peer STA MAC address)\n"); 26418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 26428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "TDLS_SETUP %s", argv[0]); 26458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 26468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long TDLS_SETUP command.\n"); 26478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 26488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 26508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_tdls_teardown(struct wpa_ctrl *ctrl, int argc, 26548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 26558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 26568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char cmd[256]; 26578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 26588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc != 1) { 26608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Invalid TDLS_TEARDOWN command: needs one argument " 26618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "(Peer STA MAC address)\n"); 26628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 26638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, sizeof(cmd), "TDLS_TEARDOWN %s", argv[0]); 26668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= sizeof(cmd) - 1) { 26678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Too long TDLS_TEARDOWN command.\n"); 26688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 26698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 26708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 26718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_cmd_signal_poll(struct wpa_ctrl *ctrl, int argc, 26758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[]) 26768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 26778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_ctrl_command(ctrl, "SIGNAL_POLL"); 26788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 26798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 26811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic int wpa_cli_cmd_reauthenticate(struct wpa_ctrl *ctrl, int argc, 26821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt char *argv[]) 26831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 26841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpa_ctrl_command(ctrl, "REAUTHENTICATE"); 26851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 26861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 2687c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#ifdef ANDROID 26880716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidtstatic int wpa_cli_cmd_driver(struct wpa_ctrl *ctrl, int argc, char *argv[]) 26890716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt{ 26900716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt char cmd[256]; 26910716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt int i; 26920716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt int len; 26930716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt 26940716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt if (argc < 1) { 26950716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt printf("Invalid DRIVER command: needs one argument (cmd)\n"); 26960716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt return -1; 26970716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt } 26980716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt 26990716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt len = os_snprintf(cmd, sizeof(cmd), "DRIVER %s", argv[0]); 27000716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt for (i=1; i < argc; i++) 27010716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt len += os_snprintf(cmd + len, sizeof(cmd) - len, " %s", argv[i]); 27020716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt cmd[sizeof(cmd) - 1] = '\0'; 27030716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt printf("%s: %s\n", __func__, cmd); 27040716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt return wpa_ctrl_command(ctrl, cmd); 27050716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt} 2706c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#endif 27070716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt 27088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtenum wpa_cli_cmd_flags { 27098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none = 0x00, 27108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive = 0x01 27118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 27128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct wpa_cli_cmd { 27148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *cmd; 27158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int (*handler)(struct wpa_ctrl *ctrl, int argc, char *argv[]); 27168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt enum wpa_cli_cmd_flags flags; 27178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *usage; 27188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 27198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 27208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic struct wpa_cli_cmd wpa_cli_commands[] = { 27218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "status", wpa_cli_cmd_status, 27228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 27238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "[verbose] = get current WPA/EAPOL/EAP status" }, 27248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "ping", wpa_cli_cmd_ping, 27258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 27268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= pings wpa_supplicant" }, 27278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "relog", wpa_cli_cmd_relog, 27288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 27298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= re-open log-file (allow rolling logs)" }, 27308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "note", wpa_cli_cmd_note, 27318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 27328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<text> = add a note to wpa_supplicant debug log" }, 27338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "mib", wpa_cli_cmd_mib, 27348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 27358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= get MIB variables (dot1x, dot11)" }, 27368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "help", wpa_cli_cmd_help, 27378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 27388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= show this usage help" }, 27398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "interface", wpa_cli_cmd_interface, 27408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 27418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "[ifname] = show interfaces/select interface" }, 27428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "level", wpa_cli_cmd_level, 27438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 27448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<debug level> = change debug level" }, 27458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "license", wpa_cli_cmd_license, 27468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 27478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= show full wpa_cli license" }, 27488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "quit", wpa_cli_cmd_quit, 27498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 27508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= exit wpa_cli" }, 27518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "set", wpa_cli_cmd_set, 27528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 27538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= set variables (shows list of variables when run without " 27548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "arguments)" }, 27558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "get", wpa_cli_cmd_get, 27568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 27578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<name> = get information" }, 27588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "logon", wpa_cli_cmd_logon, 27598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 27608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= IEEE 802.1X EAPOL state machine logon" }, 27618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "logoff", wpa_cli_cmd_logoff, 27628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 27638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= IEEE 802.1X EAPOL state machine logoff" }, 27648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "pmksa", wpa_cli_cmd_pmksa, 27658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 27668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= show PMKSA cache" }, 27678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "reassociate", wpa_cli_cmd_reassociate, 27688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 27698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= force reassociation" }, 27708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "preauthenticate", wpa_cli_cmd_preauthenticate, 27718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 27728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<BSSID> = force preauthentication" }, 27738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "identity", wpa_cli_cmd_identity, 27748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 27758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> <identity> = configure identity for an SSID" }, 27768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "password", wpa_cli_cmd_password, 27778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 27788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> <password> = configure password for an SSID" }, 27798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "new_password", wpa_cli_cmd_new_password, 27808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 27818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> <password> = change password for an SSID" }, 27828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "pin", wpa_cli_cmd_pin, 27838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 27848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> <pin> = configure pin for an SSID" }, 27858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "otp", wpa_cli_cmd_otp, 27868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 27878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> <password> = configure one-time-password for an SSID" 27888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }, 27898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "passphrase", wpa_cli_cmd_passphrase, 27908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 27918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> <passphrase> = configure private key passphrase\n" 27928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " for an SSID" }, 27938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "bssid", wpa_cli_cmd_bssid, 27948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 27958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> <BSSID> = set preferred BSSID for an SSID" }, 2796696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt { "blacklist", wpa_cli_cmd_blacklist, 2797696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt cli_cmd_flag_none, 2798696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt "<BSSID> = add a BSSID to the blacklist\n" 2799696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt "blacklist clear = clear the blacklist\n" 2800696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt "blacklist = display the blacklist" }, 2801696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt { "log_level", wpa_cli_cmd_log_level, 2802696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt cli_cmd_flag_none, 28031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "<level> [<timestamp>] = update the log level/timestamp\n" 2804696359e14f6a38ce3cecb98021562c0252021960Dmitry Shmidt "log_level = display the current log level and log options" }, 28058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "list_networks", wpa_cli_cmd_list_networks, 28068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= list configured networks" }, 28088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "select_network", wpa_cli_cmd_select_network, 28098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> = select a network (disable others)" }, 28118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "enable_network", wpa_cli_cmd_enable_network, 28128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> = enable a network" }, 28148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "disable_network", wpa_cli_cmd_disable_network, 28158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> = disable a network" }, 28178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "add_network", wpa_cli_cmd_add_network, 28188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= add a network" }, 28208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "remove_network", wpa_cli_cmd_remove_network, 28218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> = remove a network" }, 28238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "set_network", wpa_cli_cmd_set_network, 28248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 28258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> <variable> <value> = set network variables (shows\n" 28268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " list of variables when run without arguments)" }, 28278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "get_network", wpa_cli_cmd_get_network, 28288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<network id> <variable> = get network variables" }, 28308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "save_config", wpa_cli_cmd_save_config, 28318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= save the current configuration" }, 28338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "disconnect", wpa_cli_cmd_disconnect, 28348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= disconnect and wait for reassociate/reconnect command before\n" 28368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " connecting" }, 28378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "reconnect", wpa_cli_cmd_reconnect, 28388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= like reassociate, but only takes effect if already disconnected" 28408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }, 28418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "scan", wpa_cli_cmd_scan, 28428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= request new BSS scan" }, 28448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "scan_results", wpa_cli_cmd_scan_results, 28458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= get latest scan results" }, 28478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "bss", wpa_cli_cmd_bss, 28488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<<idx> | <bssid>> = get detailed scan result info" }, 28508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "get_capability", wpa_cli_cmd_get_capability, 28518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<eap/pairwise/group/key_mgmt/proto/auth_alg> = get capabilies" }, 28538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "reconfigure", wpa_cli_cmd_reconfigure, 28548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= force wpa_supplicant to re-read its configuration file" }, 28568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "terminate", wpa_cli_cmd_terminate, 28578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= terminate wpa_supplicant" }, 28598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "interface_add", wpa_cli_cmd_interface_add, 28608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<ifname> <confname> <driver> <ctrl_interface> <driver_param>\n" 28628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " <bridge_name> = adds new interface, all parameters but <ifname>\n" 28638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt " are optional" }, 28648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "interface_remove", wpa_cli_cmd_interface_remove, 28658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<ifname> = removes the interface" }, 28678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "interface_list", wpa_cli_cmd_interface_list, 28688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= list available interfaces" }, 28708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "ap_scan", wpa_cli_cmd_ap_scan, 28718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<value> = set ap_scan parameter" }, 28738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "scan_interval", wpa_cli_cmd_scan_interval, 28748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<value> = set scan_interval parameter (in seconds)" }, 28768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "bss_expire_age", wpa_cli_cmd_bss_expire_age, 28778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<value> = set BSS expiration age parameter" }, 28798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "bss_expire_count", wpa_cli_cmd_bss_expire_count, 28808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<value> = set BSS expiration scan count parameter" }, 28828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "stkstart", wpa_cli_cmd_stkstart, 28838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<addr> = request STK negotiation with <addr>" }, 28858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "ft_ds", wpa_cli_cmd_ft_ds, 28868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<addr> = request over-the-DS FT with <addr>" }, 28888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "wps_pbc", wpa_cli_cmd_wps_pbc, 28898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 28908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "[BSSID] = start Wi-Fi Protected Setup: Push Button Configuration" }, 28918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "wps_pin", wpa_cli_cmd_wps_pin, 28928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 28938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<BSSID> [PIN] = start WPS PIN method (returns PIN, if not " 28948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "hardcoded)" }, 28958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "wps_check_pin", wpa_cli_cmd_wps_check_pin, 28968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 28978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<PIN> = verify PIN checksum" }, 28988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "wps_cancel", wpa_cli_cmd_wps_cancel, cli_cmd_flag_none, 28998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "Cancels the pending WPS operation" }, 29008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_WPS_OOB 29018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "wps_oob", wpa_cli_cmd_wps_oob, 29028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 29038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<DEV_TYPE> <PATH> <METHOD> [DEV_NAME] = start WPS OOB" }, 29048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_WPS_OOB */ 29058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "wps_reg", wpa_cli_cmd_wps_reg, 29068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 29078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<BSSID> <AP PIN> = start WPS Registrar to configure an AP" }, 29088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "wps_ap_pin", wpa_cli_cmd_wps_ap_pin, 29098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 29108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "[params..] = enable/disable AP PIN" }, 29118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "wps_er_start", wpa_cli_cmd_wps_er_start, 29128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "[IP address] = start Wi-Fi Protected Setup External Registrar" }, 29148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "wps_er_stop", wpa_cli_cmd_wps_er_stop, 29158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= stop Wi-Fi Protected Setup External Registrar" }, 29178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "wps_er_pin", wpa_cli_cmd_wps_er_pin, 29188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 29198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<UUID> <PIN> = add an Enrollee PIN to External Registrar" }, 29208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "wps_er_pbc", wpa_cli_cmd_wps_er_pbc, 29218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<UUID> = accept an Enrollee PBC using External Registrar" }, 29238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "wps_er_learn", wpa_cli_cmd_wps_er_learn, 29248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 29258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<UUID> <PIN> = learn AP configuration" }, 29268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "wps_er_set_config", wpa_cli_cmd_wps_er_set_config, 29278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<UUID> <network id> = set AP configuration for enrolling" }, 29298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "wps_er_config", wpa_cli_cmd_wps_er_config, 29308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive, 29318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<UUID> <PIN> <SSID> <auth> <encr> <key> = configure AP" }, 29328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "ibss_rsn", wpa_cli_cmd_ibss_rsn, 29338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<addr> = request RSN authentication with <addr> in IBSS" }, 29358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_AP 29368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "sta", wpa_cli_cmd_sta, 29378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<addr> = get information about an associated station (AP)" }, 29398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "all_sta", wpa_cli_cmd_all_sta, 29408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= get information about all associated stations (AP)" }, 29428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_AP */ 29438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "suspend", wpa_cli_cmd_suspend, cli_cmd_flag_none, 29448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= notification of suspend/hibernate" }, 29458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "resume", wpa_cli_cmd_resume, cli_cmd_flag_none, 29468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= notification of resume/thaw" }, 29478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "drop_sa", wpa_cli_cmd_drop_sa, cli_cmd_flag_none, 29488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= drop SA without deauth/disassoc (test command)" }, 29498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "roam", wpa_cli_cmd_roam, 29508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<addr> = roam to the specified BSS" }, 29528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_P2P 29538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_find", wpa_cli_cmd_p2p_find, cli_cmd_flag_none, 29548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "[timeout] [type=*] = find P2P Devices for up-to timeout seconds" }, 29558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_stop_find", wpa_cli_cmd_p2p_stop_find, cli_cmd_flag_none, 29568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= stop P2P Devices search" }, 29578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_connect", wpa_cli_cmd_p2p_connect, cli_cmd_flag_none, 29588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<addr> <\"pbc\"|PIN> = connect to a P2P Devices" }, 29598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_listen", wpa_cli_cmd_p2p_listen, cli_cmd_flag_none, 29608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "[timeout] = listen for P2P Devices for up-to timeout seconds" }, 29618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_group_remove", wpa_cli_cmd_p2p_group_remove, cli_cmd_flag_none, 29628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<ifname> = remove P2P group interface (terminate group if GO)" }, 29638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_group_add", wpa_cli_cmd_p2p_group_add, cli_cmd_flag_none, 29648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= add a new P2P group (local end as GO)" }, 29658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_prov_disc", wpa_cli_cmd_p2p_prov_disc, cli_cmd_flag_none, 29668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<addr> <method> = request provisioning discovery" }, 29678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_get_passphrase", wpa_cli_cmd_p2p_get_passphrase, 29688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= get the passphrase for a group (GO only)" }, 29708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_serv_disc_req", wpa_cli_cmd_p2p_serv_disc_req, 29718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<addr> <TLVs> = schedule service discovery request" }, 29738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_serv_disc_cancel_req", wpa_cli_cmd_p2p_serv_disc_cancel_req, 29748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<id> = cancel pending service discovery request" }, 29768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_serv_disc_resp", wpa_cli_cmd_p2p_serv_disc_resp, 29778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<freq> <addr> <dialog token> <TLVs> = service discovery response" }, 29798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_service_update", wpa_cli_cmd_p2p_service_update, 29808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= indicate change in local services" }, 29828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_serv_disc_external", wpa_cli_cmd_p2p_serv_disc_external, 29838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<external> = set external processing of service discovery" }, 29858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_service_flush", wpa_cli_cmd_p2p_service_flush, 29868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= remove all stored service entries" }, 29888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_service_add", wpa_cli_cmd_p2p_service_add, 29898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<bonjour|upnp> <query|version> <response|service> = add a local " 29918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "service" }, 29928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_service_del", wpa_cli_cmd_p2p_service_del, 29938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<bonjour|upnp> <query|version> [|service] = remove a local " 29958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "service" }, 29968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_reject", wpa_cli_cmd_p2p_reject, 29978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 29988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<addr> = reject connection attempts from a specific peer" }, 29998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_invite", wpa_cli_cmd_p2p_invite, 30008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<cmd> [peer=addr] = invite peer" }, 30028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_peers", wpa_cli_cmd_p2p_peers, cli_cmd_flag_none, 30038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "[discovered] = list known (optionally, only fully discovered) P2P " 30048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "peers" }, 30058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_peer", wpa_cli_cmd_p2p_peer, cli_cmd_flag_none, 30068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<address> = show information about known P2P peer" }, 30078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_set", wpa_cli_cmd_p2p_set, cli_cmd_flag_none, 30088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<field> <value> = set a P2P parameter" }, 30098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_flush", wpa_cli_cmd_p2p_flush, cli_cmd_flag_none, 30108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= flush P2P state" }, 30118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_cancel", wpa_cli_cmd_p2p_cancel, cli_cmd_flag_none, 30128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= cancel P2P group formation" }, 30138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_unauthorize", wpa_cli_cmd_p2p_unauthorize, cli_cmd_flag_none, 30148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<address> = unauthorize a peer" }, 30158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_presence_req", wpa_cli_cmd_p2p_presence_req, cli_cmd_flag_none, 30168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "[<duration> <interval>] [<duration> <interval>] = request GO " 30178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "presence" }, 30188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "p2p_ext_listen", wpa_cli_cmd_p2p_ext_listen, cli_cmd_flag_none, 30198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "[<period> <interval>] = set extended listen timing" }, 30208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_P2P */ 30211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 30221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_INTERWORKING 30231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt { "fetch_anqp", wpa_cli_cmd_fetch_anqp, cli_cmd_flag_none, 30241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "= fetch ANQP information for all APs" }, 30251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt { "stop_fetch_anqp", wpa_cli_cmd_stop_fetch_anqp, cli_cmd_flag_none, 30261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "= stop fetch_anqp operation" }, 30271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt { "interworking_select", wpa_cli_cmd_interworking_select, 30281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_cmd_flag_none, 30291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "[auto] = perform Interworking network selection" }, 30301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt { "interworking_connect", wpa_cli_cmd_interworking_connect, 30311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_cmd_flag_none, 30321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "<BSSID> = connect using Interworking credentials" }, 30331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt { "anqp_get", wpa_cli_cmd_anqp_get, cli_cmd_flag_none, 30341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "<addr> <info id>[,<info id>]... = request ANQP information" }, 30351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_INTERWORKING */ 30368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "sta_autoconnect", wpa_cli_cmd_sta_autoconnect, cli_cmd_flag_none, 30378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<0/1> = disable/enable automatic reconnection" }, 30388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "tdls_discover", wpa_cli_cmd_tdls_discover, 30398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<addr> = request TDLS discovery with <addr>" }, 30418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "tdls_setup", wpa_cli_cmd_tdls_setup, 30428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<addr> = request TDLS setup with <addr>" }, 30448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "tdls_teardown", wpa_cli_cmd_tdls_teardown, 30458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "<addr> = tear down TDLS with <addr>" }, 30478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { "signal_poll", wpa_cli_cmd_signal_poll, 30488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_none, 30498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "= get signal parameters" }, 30501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt { "reauthenticate", wpa_cli_cmd_reauthenticate, cli_cmd_flag_none, 30511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt "= trigger IEEE 802.1X/EAPOL reauthentication" }, 3052c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#ifdef ANDROID 30530716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt { "driver", wpa_cli_cmd_driver, 30540716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt cli_cmd_flag_none, 30550716c12e57090ce9904fb5948da1285fc36c1fe4Dmitry Shmidt "<command> = driver private commands" }, 3056c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#endif 30578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { NULL, NULL, cli_cmd_flag_none, NULL } 30588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 30598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 30628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Prints command usage, lines are padded with the specified string. 30638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 30648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void print_cmd_help(struct wpa_cli_cmd *cmd, const char *pad) 30658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char c; 30678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t n; 30688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s%s ", pad, cmd->cmd); 30708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (n = 0; (c = cmd->usage[n]); n++) { 30718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%c", c); 30728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (c == '\n') 30738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s", pad); 30748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 30758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\n"); 30768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void print_help(void) 30808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int n; 30828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("commands:\n"); 30838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (n = 0; wpa_cli_commands[n].cmd; n++) 30848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt print_cmd_help(&wpa_cli_commands[n], " "); 30858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 30868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_edit_filter_history_cb(void *ctx, const char *cmd) 30898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 30908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *c, *delim; 30918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int n; 30928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 30938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 30948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt delim = os_strchr(cmd, ' '); 30958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (delim) 30968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = delim - cmd; 30978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 30988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = os_strlen(cmd); 30998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (n = 0; (c = wpa_cli_commands[n].cmd); n++) { 31018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strncasecmp(cmd, c, len) == 0 && len == os_strlen(c)) 31028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return (wpa_cli_commands[n].flags & 31038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cli_cmd_flag_sensitive); 31048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 31068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char ** wpa_list_cmd_list(void) 31108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **res; 31128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i, count; 31138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt count = sizeof(wpa_cli_commands) / sizeof(wpa_cli_commands[0]); 31158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_zalloc(count * sizeof(char *)); 31168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res == NULL) 31178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 31188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; wpa_cli_commands[i].cmd; i++) { 31208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res[i] = os_strdup(wpa_cli_commands[i].cmd); 31218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res[i] == NULL) 31228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 31238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return res; 31268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char ** wpa_cli_cmd_completion(const char *cmd, const char *str, 31308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int pos) 31318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i; 31338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (os_strcasecmp(cmd, "bss") == 0) 31351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpa_cli_complete_bss(str, pos); 31361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P 31371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (os_strcasecmp(cmd, "p2p_connect") == 0) 31381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpa_cli_complete_p2p_connect(str, pos); 31391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (os_strcasecmp(cmd, "p2p_peer") == 0) 31401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpa_cli_complete_p2p_peer(str, pos); 31411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (os_strcasecmp(cmd, "p2p_group_remove") == 0) 31421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return wpa_cli_complete_p2p_group_remove(str, pos); 31431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */ 31441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 31458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; wpa_cli_commands[i].cmd; i++) { 31468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcasecmp(wpa_cli_commands[i].cmd, cmd) == 0) { 31478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt edit_clear_line(); 31488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\r%s\n", wpa_cli_commands[i].usage); 31498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt edit_redraw(); 31508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 31518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 31558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char ** wpa_cli_edit_completion_cb(void *ctx, const char *str, int pos) 31598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char **res; 31618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *end; 31628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *cmd; 31638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt end = os_strchr(str, ' '); 31658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (end == NULL || str + pos < end) 31668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return wpa_list_cmd_list(); 31678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd = os_malloc(pos + 1); 31698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (cmd == NULL) 31708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 31718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(cmd, str, pos); 31728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[end - str] = '\0'; 31738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = wpa_cli_cmd_completion(cmd, str, pos); 31748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(cmd); 31758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return res; 31768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 31778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_request(struct wpa_ctrl *ctrl, int argc, char *argv[]) 31808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 31818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_cli_cmd *cmd, *match = NULL; 31828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int count; 31838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret = 0; 31848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 31858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt count = 0; 31868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd = wpa_cli_commands; 31878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (cmd->cmd) { 31888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strncasecmp(cmd->cmd, argv[0], os_strlen(argv[0])) == 0) 31898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt { 31908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt match = cmd; 31918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcasecmp(cmd->cmd, argv[0]) == 0) { 31928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* we have an exact match */ 31938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt count = 1; 31948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 31958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt count++; 31978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 31988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd++; 31998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (count > 1) { 32028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Ambiguous command '%s'; possible commands:", argv[0]); 32038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd = wpa_cli_commands; 32048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (cmd->cmd) { 32058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strncasecmp(cmd->cmd, argv[0], 32068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strlen(argv[0])) == 0) { 32078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf(" %s", cmd->cmd); 32088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd++; 32108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\n"); 32128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = 1; 32138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (count == 0) { 32148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Unknown command '%s'\n", argv[0]); 32158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = 1; 32168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 32172fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt#if defined(CONFIG_P2P) && defined(ANDROID_P2P) 32182fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt if ( (argc >= 2) && (os_strncmp(argv[1], "interface=", 10) == 0)) { 32192fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt redirect_interface = os_strdup(argv[1]); 32202fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt ret = match->handler(ctrl, argc - 2, &argv[2]); 32212fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt } 32222fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt else 32232fb777c379ad560c309c54b96c2c13291da23f54Dmitry Shmidt#endif 32248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = match->handler(ctrl, argc - 1, &argv[1]); 32258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret; 32288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 32298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int str_match(const char *a, const char *b) 32328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 32338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return os_strncmp(a, b, os_strlen(b)) == 0; 32348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 32358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int wpa_cli_exec(const char *program, const char *arg1, 32388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *arg2) 32398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 32408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *cmd; 32418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 32428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 32438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret = 0; 32448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = os_strlen(program) + os_strlen(arg1) + os_strlen(arg2) + 3; 32468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd = os_malloc(len); 32478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (cmd == NULL) 32488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 32498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_snprintf(cmd, len, "%s %s %s", program, arg1, arg2); 32508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 || (size_t) res >= len) { 32518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(cmd); 32528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 32538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cmd[len - 1] = '\0'; 32558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef _WIN32_WCE 32568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (system(cmd) < 0) 32578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = -1; 32588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _WIN32_WCE */ 32598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(cmd); 32608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret; 32628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 32638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_action_process(const char *msg) 32668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 32678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *pos; 32688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *copy = NULL, *id, *pos2; 32698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = msg; 32718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '<') { 32728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* skip priority */ 32738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = os_strchr(pos, '>'); 32748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos) 32758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 32768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 32778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = msg; 32788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 32798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (str_match(pos, WPA_EVENT_CONNECTED)) { 32818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int new_id = -1; 32828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_unsetenv("WPA_ID"); 32838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_unsetenv("WPA_ID_STR"); 32848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_unsetenv("WPA_CTRL_DIR"); 32858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = os_strstr(pos, "[id="); 32878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos) 32888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt copy = os_strdup(pos + 4); 32898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 32908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (copy) { 32918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2 = id = copy; 32928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos2 && *pos2 != ' ') 32938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2++; 32948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos2++ = '\0'; 32958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt new_id = atoi(id); 32968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_setenv("WPA_ID", id, 1); 32978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos2 && *pos2 != '=') 32988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2++; 32998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos2 == '=') 33008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2++; 33018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt id = pos2; 33028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos2 && *pos2 != ']') 33038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos2++; 33048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos2 = '\0'; 33058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_setenv("WPA_ID_STR", id, 1); 33068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(copy); 33078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_setenv("WPA_CTRL_DIR", ctrl_iface_dir, 1); 33108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!wpa_cli_connected || new_id != wpa_cli_last_id) { 33128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_connected = 1; 33138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_last_id = new_id; 33148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_exec(action_file, ctrl_ifname, "CONNECTED"); 33158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, WPA_EVENT_DISCONNECTED)) { 33178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_cli_connected) { 33188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_connected = 0; 33198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_exec(action_file, ctrl_ifname, "DISCONNECTED"); 33208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, P2P_EVENT_GROUP_STARTED)) { 33228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_exec(action_file, ctrl_ifname, pos); 33238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, P2P_EVENT_GROUP_REMOVED)) { 33248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_exec(action_file, ctrl_ifname, pos); 33258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, P2P_EVENT_CROSS_CONNECT_ENABLE)) { 33268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_exec(action_file, ctrl_ifname, pos); 33278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, P2P_EVENT_CROSS_CONNECT_DISABLE)) { 33288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_exec(action_file, ctrl_ifname, pos); 33291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (str_match(pos, P2P_EVENT_GO_NEG_FAILURE)) { 33301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_cli_exec(action_file, ctrl_ifname, pos); 33318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, WPS_EVENT_SUCCESS)) { 33328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_exec(action_file, ctrl_ifname, pos); 33338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, WPS_EVENT_FAIL)) { 33348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_exec(action_file, ctrl_ifname, pos); 33351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (str_match(pos, AP_STA_CONNECTED)) { 33361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_cli_exec(action_file, ctrl_ifname, pos); 33371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } else if (str_match(pos, AP_STA_DISCONNECTED)) { 33381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt wpa_cli_exec(action_file, ctrl_ifname, pos); 33398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else if (str_match(pos, WPA_EVENT_TERMINATING)) { 33408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("wpa_supplicant is terminating - stop monitoring\n"); 33418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_quit = 1; 33428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 33438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 33448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef CONFIG_ANSI_C_EXTRA 33478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_action_cb(char *msg, size_t len) 33488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 33498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_action_process(msg); 33508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 33518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_ANSI_C_EXTRA */ 33528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_reconnect(void) 33558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 33568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_close_connection(); 33578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_open_connection(ctrl_ifname, 1); 33588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 33598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 33611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic void cli_event(const char *str) 33621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 33631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt const char *start, *s; 33641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 33651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt start = os_strchr(str, '>'); 33661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (start == NULL) 33671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 33681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 33691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt start++; 33701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 33711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (str_starts(start, WPA_EVENT_BSS_ADDED)) { 33721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt s = os_strchr(start, ' '); 33731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (s == NULL) 33741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 33751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt s = os_strchr(s + 1, ' '); 33761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (s == NULL) 33771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 33781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_txt_list_add(&bsses, s + 1); 33791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 33801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 33811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 33821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (str_starts(start, WPA_EVENT_BSS_REMOVED)) { 33831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt s = os_strchr(start, ' '); 33841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (s == NULL) 33851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 33861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt s = os_strchr(s + 1, ' '); 33871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (s == NULL) 33881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 33891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_txt_list_del_addr(&bsses, s + 1); 33901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 33911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 33921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 33931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef CONFIG_P2P 33941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (str_starts(start, P2P_EVENT_DEVICE_FOUND)) { 33951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt s = os_strstr(start, " p2p_dev_addr="); 33961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (s == NULL) 33971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 33981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_txt_list_add_addr(&p2p_peers, s + 14); 33991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 34001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 34011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 34021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (str_starts(start, P2P_EVENT_DEVICE_LOST)) { 34031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt s = os_strstr(start, " p2p_dev_addr="); 34041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (s == NULL) 34051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 34061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_txt_list_del_addr(&p2p_peers, s + 14); 34071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 34081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 34091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 34101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (str_starts(start, P2P_EVENT_GROUP_STARTED)) { 34111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt s = os_strchr(start, ' '); 34121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (s == NULL) 34131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 34141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_txt_list_add_word(&p2p_groups, s + 1); 34151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 34161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 34171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 34181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (str_starts(start, P2P_EVENT_GROUP_REMOVED)) { 34191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt s = os_strchr(start, ' '); 34201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (s == NULL) 34211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 34221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_txt_list_del_word(&p2p_groups, s + 1); 34231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return; 34241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt } 34251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif /* CONFIG_P2P */ 34261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 34271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 34281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 34298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_recv_pending(struct wpa_ctrl *ctrl, int action_monitor) 34308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 34318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_conn == NULL) { 34328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_reconnect(); 34338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return; 34348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 34358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (wpa_ctrl_pending(ctrl) > 0) { 34368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[256]; 34378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len = sizeof(buf) - 1; 34388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_ctrl_recv(ctrl, buf, &len) == 0) { 34398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[len] = '\0'; 34408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (action_monitor) 34418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_action_process(buf); 34428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else { 34431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_event(buf); 34448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_cli_show_event(buf)) { 34458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt edit_clear_line(); 34468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\r%s\n", buf); 34478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt edit_redraw(); 34488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 34498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 34508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 34518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Could not read pending message.\n"); 34528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 34538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 34548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 34558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_ctrl_pending(ctrl) < 0) { 34578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Connection to wpa_supplicant lost - trying to " 34588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "reconnect\n"); 34598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_reconnect(); 34608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 34618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 34628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define max_args 10 34648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic int tokenize_cmd(char *cmd, char *argv[]) 34668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 34678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *pos; 34688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int argc = 0; 34698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = cmd; 34718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (;;) { 34728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos == ' ') 34738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 34748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '\0') 34758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 34768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argv[argc] = pos; 34778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argc++; 34788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc == max_args) 34798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 34808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '"') { 34818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *pos2 = os_strrchr(pos, '"'); 34828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos2) 34838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = pos2 + 1; 34848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 34858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != '\0' && *pos != ' ') 34868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 34878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == ' ') 34888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos++ = '\0'; 34898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 34908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return argc; 34928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 34938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 34958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_ping(void *eloop_ctx, void *timeout_ctx) 34968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 34978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_conn && _wpa_ctrl_command(ctrl_conn, "PING", 0)) { 34988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Connection to wpa_supplicant lost - trying to " 34998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "reconnect\n"); 35008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_close_connection(); 35018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 35028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!ctrl_conn) 35038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_reconnect(); 35048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_register_timeout(ping_interval, 0, wpa_cli_ping, NULL, NULL); 35058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_eloop_terminate(int sig, void *signal_ctx) 35098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_terminate(); 35118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_mon_receive(int sock, void *eloop_ctx, void *sock_ctx) 35158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_recv_pending(mon_conn, 0); 35178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_edit_cmd_cb(void *ctx, char *cmd) 35218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *argv[max_args]; 35238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int argc; 35248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt argc = tokenize_cmd(cmd, argv); 35258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc) 35268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_request(ctrl_conn, argc, argv); 35278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_edit_eof_cb(void *ctx) 35318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_terminate(); 35338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_interactive(void) 35378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *home, *hfile = NULL; 35398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\nInteractive mode\n\n"); 35418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt home = getenv("HOME"); 35438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (home) { 35448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *fname = ".wpa_cli_history"; 35458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int hfile_len = os_strlen(home) + 1 + os_strlen(fname) + 1; 35468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hfile = os_malloc(hfile_len); 35478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (hfile) 35488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_snprintf(hfile, hfile_len, "%s/%s", home, fname); 35498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 35508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_register_signal_terminate(wpa_cli_eloop_terminate, NULL); 35528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt edit_init(wpa_cli_edit_cmd_cb, wpa_cli_edit_eof_cb, 35538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_edit_completion_cb, NULL, hfile); 35548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_register_timeout(ping_interval, 0, wpa_cli_ping, NULL, NULL); 35558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_run(); 35578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_txt_list_flush(&p2p_peers); 35591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_txt_list_flush(&p2p_groups); 35601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt cli_txt_list_flush(&bsses); 35618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt edit_deinit(hfile, wpa_cli_edit_filter_history_cb); 35628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(hfile); 35638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_cancel_timeout(wpa_cli_ping, NULL, NULL); 35648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_close_connection(); 35658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 35668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_action(struct wpa_ctrl *ctrl) 35698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 35708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_ANSI_C_EXTRA 35718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* TODO: ANSI C version(?) */ 35728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Action processing not supported in ANSI C build.\n"); 35738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_ANSI_C_EXTRA */ 35748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fd_set rfds; 35758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int fd, res; 35768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct timeval tv; 35778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char buf[256]; /* note: large enough to fit in unsolicited messages */ 35788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 35798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fd = wpa_ctrl_get_fd(ctrl); 35818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (!wpa_cli_quit) { 35838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt FD_ZERO(&rfds); 35848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt FD_SET(fd, &rfds); 35858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tv.tv_sec = ping_interval; 35868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tv.tv_usec = 0; 35878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = select(fd + 1, &rfds, NULL, NULL, &tv); 35888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res < 0 && errno != EINTR) { 35898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("select"); 35908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 35918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 35928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 35938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (FD_ISSET(fd, &rfds)) 35948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_recv_pending(ctrl, 1); 35958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else { 35968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* verify that connection is still working */ 35978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = sizeof(buf) - 1; 35988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_ctrl_request(ctrl, "PING", 4, buf, &len, 35998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_action_cb) < 0 || 36008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len < 4 || os_memcmp(buf, "PONG", 4) != 0) { 36018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("wpa_supplicant did not reply to PING " 36028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "command - exiting\n"); 36038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 36048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 36058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 36068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 36078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_ANSI_C_EXTRA */ 36088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 36098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_cleanup(void) 36128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 36138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_close_connection(); 36148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pid_file) 36158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_daemonize_terminate(pid_file); 36168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_program_deinit(); 36188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 36198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic void wpa_cli_terminate(int sig) 36218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 36228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_cleanup(); 36238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt exit(0); 36248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 36258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic char * wpa_cli_get_default_ifname(void) 36288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 36298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *ifname = NULL; 36308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_UNIX 36328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct dirent *dent; 36338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DIR *dir = opendir(ctrl_iface_dir); 36348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!dir) { 36358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef ANDROID 36368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char ifprop[PROPERTY_VALUE_MAX]; 36378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (property_get("wifi.interface", ifprop, NULL) != 0) { 36388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ifname = os_strdup(ifprop); 36398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Using interface '%s'\n", ifname); 36408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ifname; 36418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 36428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* ANDROID */ 36438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 36448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 36458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while ((dent = readdir(dir))) { 36468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef _DIRENT_HAVE_D_TYPE 36478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 36488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Skip the file if it is not a socket. Also accept 36498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * DT_UNKNOWN (0) in case the C library or underlying 36508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * file system does not support d_type. 36518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 36528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dent->d_type != DT_SOCK && dent->d_type != DT_UNKNOWN) 36538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 36548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _DIRENT_HAVE_D_TYPE */ 36558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strcmp(dent->d_name, ".") == 0 || 36568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_strcmp(dent->d_name, "..") == 0) 36578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 36588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Selected interface '%s'\n", dent->d_name); 36598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ifname = os_strdup(dent->d_name); 36608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 36618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 36628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt closedir(dir); 36638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_UNIX */ 36648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE 3666c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#ifdef ANDROID 3667c97d8bf1d6959387a528c901eaf9c0bff47da853Dmitry Shmidt char buf[4096], *pos; 3668c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#else 3669c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt char buf[2048], *pos; 3670c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#endif 36718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 36728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct wpa_ctrl *ctrl; 36738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 36748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl = wpa_ctrl_open(NULL); 36768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl == NULL) 36778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 36788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = sizeof(buf) - 1; 36808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = wpa_ctrl_request(ctrl, "INTERFACES", 10, buf, &len, NULL); 36818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret >= 0) { 36828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[len] = '\0'; 36838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = os_strchr(buf, '\n'); 36848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pos) 36858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos = '\0'; 36868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ifname = os_strdup(buf); 36878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 36888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_ctrl_close(ctrl); 36898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */ 36908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ifname; 36928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 36938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 36958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint main(int argc, char *argv[]) 36968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 36978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int warning_displayed = 0; 36988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int c; 36998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int daemonize = 0; 37008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret = 0; 37018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *global = NULL; 37028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_program_init()) 37048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 37058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (;;) { 37078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt c = getopt(argc, argv, "a:Bg:G:hi:p:P:v"); 37088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (c < 0) 37098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 37108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (c) { 37118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 'a': 37128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt action_file = optarg; 37138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 37148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 'B': 37158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt daemonize = 1; 37168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 37178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 'g': 37188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt global = optarg; 37198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 37208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 'G': 37218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ping_interval = atoi(optarg); 37228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 37238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 'h': 37248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt usage(); 37258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 37268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 'v': 37278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s\n", wpa_cli_version); 37288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 37298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 'i': 37308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ctrl_ifname); 37318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_ifname = os_strdup(optarg); 37328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 37338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 'p': 37348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_iface_dir = optarg; 37358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 37368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case 'P': 37378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pid_file = optarg; 37388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 37398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 37408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt usage(); 37418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 37428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 37438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 37448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt interactive = (argc == optind) && (action_file == NULL); 37468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (interactive) 37488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%s\n\n%s\n\n", wpa_cli_version, wpa_cli_license); 37498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (eloop_init()) 37518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 37528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (global) { 37548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE 37558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_conn = wpa_ctrl_open(NULL); 37568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_CTRL_IFACE_NAMED_PIPE */ 37578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_conn = wpa_ctrl_open(global); 37588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */ 37598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_conn == NULL) { 37608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("Failed to connect to wpa_supplicant - " 37618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_ctrl_open"); 37628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 37638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 37648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 37658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef _WIN32_WCE 37678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt signal(SIGINT, wpa_cli_terminate); 37688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt signal(SIGTERM, wpa_cli_terminate); 37698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _WIN32_WCE */ 37708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ctrl_ifname == NULL) 37728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ctrl_ifname = wpa_cli_get_default_ifname(); 37738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (interactive) { 37758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (; !global;) { 37768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_cli_open_connection(ctrl_ifname, 1) == 0) { 37778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (warning_displayed) 37788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Connection established.\n"); 37798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 37808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 37818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!warning_displayed) { 37838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Could not connect to wpa_supplicant - " 37848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "re-trying\n"); 37858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt warning_displayed = 1; 37868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 37878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_sleep(1, 0); 37888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt continue; 37898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 37908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 37918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!global && 37928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_open_connection(ctrl_ifname, 0) < 0) { 37938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt perror("Failed to connect to wpa_supplicant - " 37948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_ctrl_open"); 37958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 37968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 37978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 37988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (action_file) { 37998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (wpa_ctrl_attach(ctrl_conn) == 0) { 38008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_attached = 1; 38018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 38028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Warning: Failed to attach to " 38038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "wpa_supplicant.\n"); 38048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 38058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 38068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 38078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 38088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (daemonize && os_daemonize(pid_file)) 38108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 38118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (interactive) 38138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_interactive(); 38148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (action_file) 38158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_action(ctrl_conn); 38168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 38178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = wpa_request(ctrl_conn, argc - optind, &argv[optind]); 38188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(ctrl_ifname); 38208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt eloop_destroy(); 38218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt wpa_cli_cleanup(); 38228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret; 38248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 38258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 38268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else /* CONFIG_CTRL_IFACE */ 38278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint main(int argc, char *argv[]) 38288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 38298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("CONFIG_CTRL_IFACE not defined - wpa_cli disabled\n"); 38308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 38318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 38328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* CONFIG_CTRL_IFACE */ 3833