2 * WPA Supplicant - command line interface for wpa_supplicant daemon
3 * Copyright (c) 2004-2015, Jouni Malinen <j@w1.fi>
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
11 #ifdef CONFIG_CTRL_IFACE
13 #ifdef CONFIG_CTRL_IFACE_UNIX
15 #endif /* CONFIG_CTRL_IFACE_UNIX */
17 #include "common/wpa_ctrl.h"
18 #include "utils/common.h"
19 #include "utils/eloop.h"
20 #include "utils/edit.h"
21 #include "utils/list.h"
22 #include "common/version.h"
23 #include "common/ieee802_11_defs.h"
25 #include <cutils/properties.h>
29 static const char *wpa_cli_version =
30 "wpa_cli v" VERSION_STR "\n"
31 "Copyright (c) 2004-2015, Jouni Malinen <j@w1.fi> and contributors";
34 static const char *wpa_cli_license =
35 "This software may be distributed under the terms of the BSD license.\n"
36 "See README for more details.\n";
38 static const char *wpa_cli_full_license =
39 "This software may be distributed under the terms of the BSD license.\n"
41 "Redistribution and use in source and binary forms, with or without\n"
42 "modification, are permitted provided that the following conditions are\n"
45 "1. Redistributions of source code must retain the above copyright\n"
46 " notice, this list of conditions and the following disclaimer.\n"
48 "2. Redistributions in binary form must reproduce the above copyright\n"
49 " notice, this list of conditions and the following disclaimer in the\n"
50 " documentation and/or other materials provided with the distribution.\n"
52 "3. Neither the name(s) of the above-listed copyright holder(s) nor the\n"
53 " names of its contributors may be used to endorse or promote products\n"
54 " derived from this software without specific prior written permission.\n"
56 "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n"
57 "\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n"
58 "LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n"
59 "A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n"
60 "OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n"
61 "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n"
62 "LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"
63 "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"
64 "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"
65 "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"
66 "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
69 static struct wpa_ctrl *ctrl_conn;
70 static struct wpa_ctrl *mon_conn;
71 static int wpa_cli_quit = 0;
72 static int wpa_cli_attached = 0;
73 static int wpa_cli_connected = -1;
74 static int wpa_cli_last_id = 0;
75 #ifndef CONFIG_CTRL_IFACE_DIR
76 #define CONFIG_CTRL_IFACE_DIR "/var/run/wpa_supplicant"
77 #endif /* CONFIG_CTRL_IFACE_DIR */
78 static const char *ctrl_iface_dir = CONFIG_CTRL_IFACE_DIR;
79 static char *ctrl_ifname = NULL;
80 static const char *pid_file = NULL;
81 static const char *action_file = NULL;
82 static int ping_interval = 5;
83 static int interactive = 0;
84 static char *ifname_prefix = NULL;
86 struct cli_txt_entry {
91 static DEFINE_DL_LIST(bsses); /* struct cli_txt_entry */
92 static DEFINE_DL_LIST(p2p_peers); /* struct cli_txt_entry */
93 static DEFINE_DL_LIST(p2p_groups); /* struct cli_txt_entry */
94 static DEFINE_DL_LIST(ifnames); /* struct cli_txt_entry */
97 static void print_help(const char *cmd);
98 static void wpa_cli_mon_receive(int sock, void *eloop_ctx, void *sock_ctx);
99 static void wpa_cli_close_connection(void);
100 static char * wpa_cli_get_default_ifname(void);
101 static char ** wpa_list_cmd_list(void);
104 static void usage(void)
106 printf("wpa_cli [-p<path to ctrl sockets>] [-i<ifname>] [-hvB] "
107 "[-a<action file>] \\\n"
108 " [-P<pid file>] [-g<global ctrl>] [-G<ping interval>] "
110 " -h = help (show this usage text)\n"
111 " -v = shown version information\n"
112 " -a = run in daemon mode executing the action file based on "
115 " -B = run a daemon in the background\n"
116 " default path: " CONFIG_CTRL_IFACE_DIR "\n"
117 " default interface: first interface found in socket path\n");
122 static void cli_txt_list_free(struct cli_txt_entry *e)
124 dl_list_del(&e->list);
130 static void cli_txt_list_flush(struct dl_list *list)
132 struct cli_txt_entry *e;
133 while ((e = dl_list_first(list, struct cli_txt_entry, list)))
134 cli_txt_list_free(e);
138 static struct cli_txt_entry * cli_txt_list_get(struct dl_list *txt_list,
141 struct cli_txt_entry *e;
142 dl_list_for_each(e, txt_list, struct cli_txt_entry, list) {
143 if (os_strcmp(e->txt, txt) == 0)
150 static void cli_txt_list_del(struct dl_list *txt_list, const char *txt)
152 struct cli_txt_entry *e;
153 e = cli_txt_list_get(txt_list, txt);
155 cli_txt_list_free(e);
159 static void cli_txt_list_del_addr(struct dl_list *txt_list, const char *txt)
163 if (hwaddr_aton(txt, addr) < 0)
165 os_snprintf(buf, sizeof(buf), MACSTR, MAC2STR(addr));
166 cli_txt_list_del(txt_list, buf);
171 static void cli_txt_list_del_word(struct dl_list *txt_list, const char *txt)
175 end = os_strchr(txt, ' ');
177 end = txt + os_strlen(txt);
178 buf = dup_binstr(txt, end - txt);
181 cli_txt_list_del(txt_list, buf);
184 #endif /* CONFIG_P2P */
187 static int cli_txt_list_add(struct dl_list *txt_list, const char *txt)
189 struct cli_txt_entry *e;
190 e = cli_txt_list_get(txt_list, txt);
193 e = os_zalloc(sizeof(*e));
196 e->txt = os_strdup(txt);
197 if (e->txt == NULL) {
201 dl_list_add(txt_list, &e->list);
207 static int cli_txt_list_add_addr(struct dl_list *txt_list, const char *txt)
211 if (hwaddr_aton(txt, addr) < 0)
213 os_snprintf(buf, sizeof(buf), MACSTR, MAC2STR(addr));
214 return cli_txt_list_add(txt_list, buf);
218 static int cli_txt_list_add_word(struct dl_list *txt_list, const char *txt)
223 end = os_strchr(txt, ' ');
225 end = txt + os_strlen(txt);
226 buf = dup_binstr(txt, end - txt);
229 ret = cli_txt_list_add(txt_list, buf);
233 #endif /* CONFIG_P2P */
236 static char ** cli_txt_list_array(struct dl_list *txt_list)
238 unsigned int i, count = dl_list_len(txt_list);
240 struct cli_txt_entry *e;
242 res = os_calloc(count + 1, sizeof(char *));
247 dl_list_for_each(e, txt_list, struct cli_txt_entry, list) {
248 res[i] = os_strdup(e->txt);
258 static int get_cmd_arg_num(const char *str, int pos)
262 for (i = 0; i <= pos; i++) {
265 while (i <= pos && str[i] != ' ')
276 static int str_starts(const char *src, const char *match)
278 return os_strncmp(src, match, os_strlen(match)) == 0;
282 static int wpa_cli_show_event(const char *event)
286 start = os_strchr(event, '>');
292 * Skip BSS added/removed events since they can be relatively frequent
293 * and are likely of not much use for an interactive user.
295 if (str_starts(start, WPA_EVENT_BSS_ADDED) ||
296 str_starts(start, WPA_EVENT_BSS_REMOVED))
303 static int wpa_cli_open_connection(const char *ifname, int attach)
305 #if defined(CONFIG_CTRL_IFACE_UDP) || defined(CONFIG_CTRL_IFACE_NAMED_PIPE)
306 ctrl_conn = wpa_ctrl_open(ifname);
307 if (ctrl_conn == NULL)
310 if (attach && interactive)
311 mon_conn = wpa_ctrl_open(ifname);
314 #else /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */
322 if (access(ctrl_iface_dir, F_OK) < 0) {
323 cfile = os_strdup(ifname);
330 flen = os_strlen(ctrl_iface_dir) + os_strlen(ifname) + 2;
331 cfile = os_malloc(flen);
334 res = os_snprintf(cfile, flen, "%s/%s", ctrl_iface_dir,
336 if (os_snprintf_error(flen, res)) {
342 ctrl_conn = wpa_ctrl_open(cfile);
343 if (ctrl_conn == NULL) {
348 if (attach && interactive)
349 mon_conn = wpa_ctrl_open(cfile);
353 #endif /* CONFIG_CTRL_IFACE_UDP || CONFIG_CTRL_IFACE_NAMED_PIPE */
356 if (wpa_ctrl_attach(mon_conn) == 0) {
357 wpa_cli_attached = 1;
359 eloop_register_read_sock(
360 wpa_ctrl_get_fd(mon_conn),
361 wpa_cli_mon_receive, NULL, NULL);
363 printf("Warning: Failed to attach to "
364 "wpa_supplicant.\n");
365 wpa_cli_close_connection();
374 static void wpa_cli_close_connection(void)
376 if (ctrl_conn == NULL)
379 if (wpa_cli_attached) {
380 wpa_ctrl_detach(interactive ? mon_conn : ctrl_conn);
381 wpa_cli_attached = 0;
383 wpa_ctrl_close(ctrl_conn);
386 eloop_unregister_read_sock(wpa_ctrl_get_fd(mon_conn));
387 wpa_ctrl_close(mon_conn);
393 static void wpa_cli_msg_cb(char *msg, size_t len)
399 static int _wpa_ctrl_command(struct wpa_ctrl *ctrl, char *cmd, int print)
405 if (ctrl_conn == NULL) {
406 printf("Not connected to wpa_supplicant - command dropped.\n");
410 os_snprintf(buf, sizeof(buf), "IFNAME=%s %s",
412 buf[sizeof(buf) - 1] = '\0';
415 len = sizeof(buf) - 1;
416 ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len,
419 printf("'%s' command timed out.\n", cmd);
421 } else if (ret < 0) {
422 printf("'%s' command failed.\n", cmd);
428 if (interactive && len > 0 && buf[len - 1] != '\n')
435 static int wpa_ctrl_command(struct wpa_ctrl *ctrl, char *cmd)
437 return _wpa_ctrl_command(ctrl, cmd, 1);
441 static int write_cmd(char *buf, size_t buflen, const char *cmd, int argc,
450 res = os_snprintf(pos, end - pos, "%s", cmd);
451 if (os_snprintf_error(end - pos, res))
455 for (i = 0; i < argc; i++) {
456 res = os_snprintf(pos, end - pos, " %s", argv[i]);
457 if (os_snprintf_error(end - pos, res))
462 buf[buflen - 1] = '\0';
466 printf("Too long command\n");
471 static int wpa_cli_cmd(struct wpa_ctrl *ctrl, const char *cmd, int min_args,
472 int argc, char *argv[])
475 if (argc < min_args) {
476 printf("Invalid %s command - at least %d argument%s "
477 "required.\n", cmd, min_args,
478 min_args > 1 ? "s are" : " is");
481 if (write_cmd(buf, sizeof(buf), cmd, argc, argv) < 0)
483 return wpa_ctrl_command(ctrl, buf);
487 static int wpa_cli_cmd_ifname(struct wpa_ctrl *ctrl, int argc, char *argv[])
489 return wpa_ctrl_command(ctrl, "IFNAME");
493 static int wpa_cli_cmd_status(struct wpa_ctrl *ctrl, int argc, char *argv[])
495 if (argc > 0 && os_strcmp(argv[0], "verbose") == 0)
496 return wpa_ctrl_command(ctrl, "STATUS-VERBOSE");
497 if (argc > 0 && os_strcmp(argv[0], "wps") == 0)
498 return wpa_ctrl_command(ctrl, "STATUS-WPS");
499 if (argc > 0 && os_strcmp(argv[0], "driver") == 0)
500 return wpa_ctrl_command(ctrl, "STATUS-DRIVER");
501 return wpa_ctrl_command(ctrl, "STATUS");
505 static int wpa_cli_cmd_ping(struct wpa_ctrl *ctrl, int argc, char *argv[])
507 return wpa_ctrl_command(ctrl, "PING");
511 static int wpa_cli_cmd_relog(struct wpa_ctrl *ctrl, int argc, char *argv[])
513 return wpa_ctrl_command(ctrl, "RELOG");
517 static int wpa_cli_cmd_note(struct wpa_ctrl *ctrl, int argc, char *argv[])
519 return wpa_cli_cmd(ctrl, "NOTE", 1, argc, argv);
523 static int wpa_cli_cmd_mib(struct wpa_ctrl *ctrl, int argc, char *argv[])
525 return wpa_ctrl_command(ctrl, "MIB");
529 static int wpa_cli_cmd_pmksa(struct wpa_ctrl *ctrl, int argc, char *argv[])
531 return wpa_ctrl_command(ctrl, "PMKSA");
535 static int wpa_cli_cmd_pmksa_flush(struct wpa_ctrl *ctrl, int argc,
538 return wpa_ctrl_command(ctrl, "PMKSA_FLUSH");
542 static int wpa_cli_cmd_help(struct wpa_ctrl *ctrl, int argc, char *argv[])
544 print_help(argc > 0 ? argv[0] : NULL);
549 static char ** wpa_cli_complete_help(const char *str, int pos)
551 int arg = get_cmd_arg_num(str, pos);
556 res = wpa_list_cmd_list();
564 static int wpa_cli_cmd_license(struct wpa_ctrl *ctrl, int argc, char *argv[])
566 printf("%s\n\n%s\n", wpa_cli_version, wpa_cli_full_license);
571 static int wpa_cli_cmd_quit(struct wpa_ctrl *ctrl, int argc, char *argv[])
580 static int wpa_cli_cmd_set(struct wpa_ctrl *ctrl, int argc, char *argv[])
586 res = os_snprintf(cmd, sizeof(cmd), "SET %s ", argv[0]);
587 if (os_snprintf_error(sizeof(cmd), res)) {
588 printf("Too long SET command.\n");
591 return wpa_ctrl_command(ctrl, cmd);
594 return wpa_cli_cmd(ctrl, "SET", 2, argc, argv);
598 static char ** wpa_cli_complete_set(const char *str, int pos)
600 int arg = get_cmd_arg_num(str, pos);
601 const char *fields[] = {
603 "EAPOL::heldPeriod", "EAPOL::authPeriod", "EAPOL::startPeriod",
604 "EAPOL::maxStart", "dot11RSNAConfigPMKLifetime",
605 "dot11RSNAConfigPMKReauthThreshold", "dot11RSNAConfigSATimeout",
606 "wps_fragment_size", "wps_version_number", "ampdu",
607 "tdls_testing", "tdls_disabled", "pno", "radio_disabled",
608 "uapsd", "ps", "wifi_display", "bssid_filter", "disallow_aps",
610 /* global configuration parameters */
611 #ifdef CONFIG_CTRL_IFACE
612 "ctrl_interface", "no_ctrl_interface", "ctrl_interface_group",
613 #endif /* CONFIG_CTRL_IFACE */
614 "eapol_version", "ap_scan", "bgscan",
616 "user_mpm", "max_peer_links", "mesh_max_inactivity",
617 #endif /* CONFIG_MESH */
618 "disable_scan_offload", "fast_reauth", "opensc_engine_path",
619 "pkcs11_engine_path", "pkcs11_module_path", "openssl_ciphers",
620 "pcsc_reader", "pcsc_pin", "external_sim", "driver_param",
621 "dot11RSNAConfigPMKLifetime",
622 "dot11RSNAConfigPMKReauthThreshold",
623 "dot11RSNAConfigSATimeout",
624 #ifndef CONFIG_NO_CONFIG_WRITE
626 #endif /* CONFIG_NO_CONFIG_WRITE */
629 "uuid", "device_name", "manufacturer", "model_name",
630 "model_number", "serial_number", "device_type", "os_version",
631 "config_methods", "wps_cred_processing", "wps_vendor_ext_m1",
632 #endif /* CONFIG_WPS */
635 "p2p_listen_reg_class", "p2p_listen_channel",
636 "p2p_oper_reg_class", "p2p_oper_channel", "p2p_go_intent",
637 "p2p_ssid_postfix", "persistent_reconnect", "p2p_intra_bss",
638 "p2p_group_idle", "p2p_passphrase_len", "p2p_pref_chan",
639 "p2p_no_go_freq", "p2p_add_cli_chan",
640 "p2p_optimize_listen_chan", "p2p_go_ht40", "p2p_go_vht",
641 "p2p_disabled", "p2p_go_ctwindow", "p2p_no_group_iface",
642 "p2p_ignore_shared_freq", "ip_addr_go", "ip_addr_mask",
643 "ip_addr_start", "ip_addr_end",
644 #endif /* CONFIG_P2P */
645 "country", "bss_max_count", "bss_expiration_age",
646 "bss_expiration_scan_count", "filter_ssids", "filter_rssi",
647 "max_num_sta", "disassoc_low_ack",
650 #endif /* CONFIG_HS20 */
651 "interworking", "hessid", "access_network_type", "pbc_in_m1",
652 "autoscan", "wps_nfc_dev_pw_id", "wps_nfc_dh_pubkey",
653 "wps_nfc_dh_privkey", "wps_nfc_dev_pw", "ext_password_backend",
654 "p2p_go_max_inactivity", "auto_interworking", "okc", "pmf",
655 "sae_groups", "dtim_period", "beacon_int",
656 "ap_vendor_elements", "ignore_old_scan_res", "freq_list",
657 "scan_cur_freq", "sched_scan_interval",
658 "tdls_external_control", "osu_dir", "wowlan_triggers",
659 "p2p_search_delay", "mac_addr", "rand_addr_lifetime",
660 "preassoc_mac_addr", "key_mgmt_offload", "passive_scan",
661 "reassoc_same_bss_optim"
663 int i, num_fields = ARRAY_SIZE(fields);
666 char **res = os_calloc(num_fields + 1, sizeof(char *));
669 for (i = 0; i < num_fields; i++) {
670 res[i] = os_strdup(fields[i]);
677 if (arg > 1 && os_strncasecmp(str, "set bssid_filter ", 17) == 0)
678 return cli_txt_list_array(&bsses);
683 static int wpa_cli_cmd_dump(struct wpa_ctrl *ctrl, int argc, char *argv[])
685 return wpa_ctrl_command(ctrl, "DUMP");
689 static int wpa_cli_cmd_get(struct wpa_ctrl *ctrl, int argc, char *argv[])
691 return wpa_cli_cmd(ctrl, "GET", 1, argc, argv);
695 static char ** wpa_cli_complete_get(const char *str, int pos)
697 int arg = get_cmd_arg_num(str, pos);
698 const char *fields[] = {
699 #ifdef CONFIG_CTRL_IFACE
700 "ctrl_interface", "ctrl_interface_group",
701 #endif /* CONFIG_CTRL_IFACE */
702 "eapol_version", "ap_scan",
704 "user_mpm", "max_peer_links", "mesh_max_inactivity",
705 #endif /* CONFIG_MESH */
706 "disable_scan_offload", "fast_reauth", "opensc_engine_path",
707 "pkcs11_engine_path", "pkcs11_module_path", "openssl_ciphers",
708 "pcsc_reader", "pcsc_pin", "external_sim", "driver_param",
709 "dot11RSNAConfigPMKLifetime",
710 "dot11RSNAConfigPMKReauthThreshold",
711 "dot11RSNAConfigSATimeout",
712 #ifndef CONFIG_NO_CONFIG_WRITE
714 #endif /* CONFIG_NO_CONFIG_WRITE */
716 "device_name", "manufacturer", "model_name", "model_number",
717 "serial_number", "config_methods", "wps_cred_processing",
718 #endif /* CONFIG_WPS */
720 "p2p_listen_reg_class", "p2p_listen_channel",
721 "p2p_oper_reg_class", "p2p_oper_channel", "p2p_go_intent",
722 "p2p_ssid_postfix", "persistent_reconnect", "p2p_intra_bss",
723 "p2p_group_idle", "p2p_passphrase_len", "p2p_add_cli_chan",
724 "p2p_optimize_listen_chan", "p2p_go_ht40", "p2p_go_vht",
725 "p2p_disabled", "p2p_go_ctwindow", "p2p_no_group_iface",
726 "p2p_ignore_shared_freq", "ip_addr_go", "ip_addr_mask",
727 "ip_addr_start", "ip_addr_end",
728 #endif /* CONFIG_P2P */
729 "bss_max_count", "bss_expiration_age",
730 "bss_expiration_scan_count", "filter_ssids", "filter_rssi",
731 "max_num_sta", "disassoc_low_ack",
734 #endif /* CONFIG_HS20 */
735 "interworking", "access_network_type", "pbc_in_m1", "autoscan",
736 "wps_nfc_dev_pw_id", "ext_password_backend",
737 "p2p_go_max_inactivity", "auto_interworking", "okc", "pmf",
738 "dtim_period", "beacon_int", "ignore_old_scan_res",
739 "scan_cur_freq", "sched_scan_interval",
740 "tdls_external_control", "osu_dir", "wowlan_triggers",
741 "p2p_search_delay", "mac_addr", "rand_addr_lifetime",
742 "preassoc_mac_addr", "key_mgmt_offload", "passive_scan",
743 "reassoc_same_bss_optim"
745 int i, num_fields = ARRAY_SIZE(fields);
748 char **res = os_calloc(num_fields + 1, sizeof(char *));
751 for (i = 0; i < num_fields; i++) {
752 res[i] = os_strdup(fields[i]);
763 static int wpa_cli_cmd_logoff(struct wpa_ctrl *ctrl, int argc, char *argv[])
765 return wpa_ctrl_command(ctrl, "LOGOFF");
769 static int wpa_cli_cmd_logon(struct wpa_ctrl *ctrl, int argc, char *argv[])
771 return wpa_ctrl_command(ctrl, "LOGON");
775 static int wpa_cli_cmd_reassociate(struct wpa_ctrl *ctrl, int argc,
778 return wpa_ctrl_command(ctrl, "REASSOCIATE");
782 static int wpa_cli_cmd_reattach(struct wpa_ctrl *ctrl, int argc, char *argv[])
784 return wpa_ctrl_command(ctrl, "REATTACH");
788 static int wpa_cli_cmd_preauthenticate(struct wpa_ctrl *ctrl, int argc,
791 return wpa_cli_cmd(ctrl, "PREAUTH", 1, argc, argv);
795 static int wpa_cli_cmd_ap_scan(struct wpa_ctrl *ctrl, int argc, char *argv[])
797 return wpa_cli_cmd(ctrl, "AP_SCAN", 1, argc, argv);
801 static int wpa_cli_cmd_scan_interval(struct wpa_ctrl *ctrl, int argc,
804 return wpa_cli_cmd(ctrl, "SCAN_INTERVAL", 1, argc, argv);
808 static int wpa_cli_cmd_bss_expire_age(struct wpa_ctrl *ctrl, int argc,
811 return wpa_cli_cmd(ctrl, "BSS_EXPIRE_AGE", 1, argc, argv);
815 static int wpa_cli_cmd_bss_expire_count(struct wpa_ctrl *ctrl, int argc,
818 return wpa_cli_cmd(ctrl, "BSS_EXPIRE_COUNT", 1, argc, argv);
822 static int wpa_cli_cmd_bss_flush(struct wpa_ctrl *ctrl, int argc, char *argv[])
828 res = os_snprintf(cmd, sizeof(cmd), "BSS_FLUSH 0");
830 res = os_snprintf(cmd, sizeof(cmd), "BSS_FLUSH %s", argv[0]);
831 if (os_snprintf_error(sizeof(cmd), res)) {
832 printf("Too long BSS_FLUSH command.\n");
835 return wpa_ctrl_command(ctrl, cmd);
839 static int wpa_cli_cmd_stkstart(struct wpa_ctrl *ctrl, int argc,
842 return wpa_cli_cmd(ctrl, "STKSTART", 1, argc, argv);
846 static int wpa_cli_cmd_ft_ds(struct wpa_ctrl *ctrl, int argc, char *argv[])
848 return wpa_cli_cmd(ctrl, "FT_DS", 1, argc, argv);
852 static int wpa_cli_cmd_wps_pbc(struct wpa_ctrl *ctrl, int argc, char *argv[])
854 return wpa_cli_cmd(ctrl, "WPS_PBC", 0, argc, argv);
858 static int wpa_cli_cmd_wps_pin(struct wpa_ctrl *ctrl, int argc, char *argv[])
861 printf("Invalid WPS_PIN command: need one or two arguments:\n"
862 "- BSSID: use 'any' to select any\n"
863 "- PIN: optional, used only with devices that have no "
868 return wpa_cli_cmd(ctrl, "WPS_PIN", 1, argc, argv);
872 static int wpa_cli_cmd_wps_check_pin(struct wpa_ctrl *ctrl, int argc,
875 return wpa_cli_cmd(ctrl, "WPS_CHECK_PIN", 1, argc, argv);
879 static int wpa_cli_cmd_wps_cancel(struct wpa_ctrl *ctrl, int argc,
882 return wpa_ctrl_command(ctrl, "WPS_CANCEL");
886 #ifdef CONFIG_WPS_NFC
888 static int wpa_cli_cmd_wps_nfc(struct wpa_ctrl *ctrl, int argc, char *argv[])
890 return wpa_cli_cmd(ctrl, "WPS_NFC", 0, argc, argv);
894 static int wpa_cli_cmd_wps_nfc_config_token(struct wpa_ctrl *ctrl, int argc,
897 return wpa_cli_cmd(ctrl, "WPS_NFC_CONFIG_TOKEN", 1, argc, argv);
901 static int wpa_cli_cmd_wps_nfc_token(struct wpa_ctrl *ctrl, int argc,
904 return wpa_cli_cmd(ctrl, "WPS_NFC_TOKEN", 1, argc, argv);
908 static int wpa_cli_cmd_wps_nfc_tag_read(struct wpa_ctrl *ctrl, int argc,
916 printf("Invalid 'wps_nfc_tag_read' command - one argument "
921 buflen = 18 + os_strlen(argv[0]);
922 buf = os_malloc(buflen);
925 os_snprintf(buf, buflen, "WPS_NFC_TAG_READ %s", argv[0]);
927 ret = wpa_ctrl_command(ctrl, buf);
934 static int wpa_cli_cmd_nfc_get_handover_req(struct wpa_ctrl *ctrl, int argc,
937 return wpa_cli_cmd(ctrl, "NFC_GET_HANDOVER_REQ", 2, argc, argv);
941 static int wpa_cli_cmd_nfc_get_handover_sel(struct wpa_ctrl *ctrl, int argc,
944 return wpa_cli_cmd(ctrl, "NFC_GET_HANDOVER_SEL", 2, argc, argv);
948 static int wpa_cli_cmd_nfc_report_handover(struct wpa_ctrl *ctrl, int argc,
951 return wpa_cli_cmd(ctrl, "NFC_REPORT_HANDOVER", 4, argc, argv);
954 #endif /* CONFIG_WPS_NFC */
957 static int wpa_cli_cmd_wps_reg(struct wpa_ctrl *ctrl, int argc, char *argv[])
963 res = os_snprintf(cmd, sizeof(cmd), "WPS_REG %s %s",
965 else if (argc == 5 || argc == 6) {
966 char ssid_hex[2 * 32 + 1];
967 char key_hex[2 * 64 + 1];
971 for (i = 0; i < 32; i++) {
972 if (argv[2][i] == '\0')
974 os_snprintf(&ssid_hex[i * 2], 3, "%02x", argv[2][i]);
979 for (i = 0; i < 64; i++) {
980 if (argv[5][i] == '\0')
982 os_snprintf(&key_hex[i * 2], 3, "%02x",
987 res = os_snprintf(cmd, sizeof(cmd),
988 "WPS_REG %s %s %s %s %s %s",
989 argv[0], argv[1], ssid_hex, argv[3], argv[4],
992 printf("Invalid WPS_REG command: need two arguments:\n"
993 "- BSSID of the target AP\n"
995 printf("Alternatively, six arguments can be used to "
996 "reconfigure the AP:\n"
997 "- BSSID of the target AP\n"
1000 "- new auth (OPEN, WPAPSK, WPA2PSK)\n"
1001 "- new encr (NONE, WEP, TKIP, CCMP)\n"
1006 if (os_snprintf_error(sizeof(cmd), res)) {
1007 printf("Too long WPS_REG command.\n");
1010 return wpa_ctrl_command(ctrl, cmd);
1014 static int wpa_cli_cmd_wps_ap_pin(struct wpa_ctrl *ctrl, int argc,
1017 return wpa_cli_cmd(ctrl, "WPS_AP_PIN", 1, argc, argv);
1021 static int wpa_cli_cmd_wps_er_start(struct wpa_ctrl *ctrl, int argc,
1024 return wpa_cli_cmd(ctrl, "WPS_ER_START", 0, argc, argv);
1028 static int wpa_cli_cmd_wps_er_stop(struct wpa_ctrl *ctrl, int argc,
1031 return wpa_ctrl_command(ctrl, "WPS_ER_STOP");
1036 static int wpa_cli_cmd_wps_er_pin(struct wpa_ctrl *ctrl, int argc,
1040 printf("Invalid WPS_ER_PIN command: need at least two "
1042 "- UUID: use 'any' to select any\n"
1043 "- PIN: Enrollee PIN\n"
1044 "optional: - Enrollee MAC address\n");
1048 return wpa_cli_cmd(ctrl, "WPS_ER_PIN", 2, argc, argv);
1052 static int wpa_cli_cmd_wps_er_pbc(struct wpa_ctrl *ctrl, int argc,
1055 return wpa_cli_cmd(ctrl, "WPS_ER_PBC", 1, argc, argv);
1059 static int wpa_cli_cmd_wps_er_learn(struct wpa_ctrl *ctrl, int argc,
1063 printf("Invalid WPS_ER_LEARN command: need two arguments:\n"
1064 "- UUID: specify which AP to use\n"
1069 return wpa_cli_cmd(ctrl, "WPS_ER_LEARN", 2, argc, argv);
1073 static int wpa_cli_cmd_wps_er_set_config(struct wpa_ctrl *ctrl, int argc,
1077 printf("Invalid WPS_ER_SET_CONFIG command: need two "
1079 "- UUID: specify which AP to use\n"
1080 "- Network configuration id\n");
1084 return wpa_cli_cmd(ctrl, "WPS_ER_SET_CONFIG", 2, argc, argv);
1088 static int wpa_cli_cmd_wps_er_config(struct wpa_ctrl *ctrl, int argc,
1094 if (argc == 5 || argc == 6) {
1095 char ssid_hex[2 * 32 + 1];
1096 char key_hex[2 * 64 + 1];
1100 for (i = 0; i < 32; i++) {
1101 if (argv[2][i] == '\0')
1103 os_snprintf(&ssid_hex[i * 2], 3, "%02x", argv[2][i]);
1108 for (i = 0; i < 64; i++) {
1109 if (argv[5][i] == '\0')
1111 os_snprintf(&key_hex[i * 2], 3, "%02x",
1116 res = os_snprintf(cmd, sizeof(cmd),
1117 "WPS_ER_CONFIG %s %s %s %s %s %s",
1118 argv[0], argv[1], ssid_hex, argv[3], argv[4],
1121 printf("Invalid WPS_ER_CONFIG command: need six arguments:\n"
1125 "- new auth (OPEN, WPAPSK, WPA2PSK)\n"
1126 "- new encr (NONE, WEP, TKIP, CCMP)\n"
1131 if (os_snprintf_error(sizeof(cmd), res)) {
1132 printf("Too long WPS_ER_CONFIG command.\n");
1135 return wpa_ctrl_command(ctrl, cmd);
1139 #ifdef CONFIG_WPS_NFC
1140 static int wpa_cli_cmd_wps_er_nfc_config_token(struct wpa_ctrl *ctrl, int argc,
1144 printf("Invalid WPS_ER_NFC_CONFIG_TOKEN command: need two "
1146 "- WPS/NDEF: token format\n"
1147 "- UUID: specify which AP to use\n");
1151 return wpa_cli_cmd(ctrl, "WPS_ER_NFC_CONFIG_TOKEN", 2, argc, argv);
1153 #endif /* CONFIG_WPS_NFC */
1156 static int wpa_cli_cmd_ibss_rsn(struct wpa_ctrl *ctrl, int argc, char *argv[])
1158 return wpa_cli_cmd(ctrl, "IBSS_RSN", 1, argc, argv);
1162 static int wpa_cli_cmd_level(struct wpa_ctrl *ctrl, int argc, char *argv[])
1164 return wpa_cli_cmd(ctrl, "LEVEL", 1, argc, argv);
1168 static int wpa_cli_cmd_identity(struct wpa_ctrl *ctrl, int argc, char *argv[])
1170 char cmd[256], *pos, *end;
1174 printf("Invalid IDENTITY command: needs two arguments "
1175 "(network id and identity)\n");
1179 end = cmd + sizeof(cmd);
1181 ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "IDENTITY-%s:%s",
1183 if (os_snprintf_error(end - pos, ret)) {
1184 printf("Too long IDENTITY command.\n");
1188 for (i = 2; i < argc; i++) {
1189 ret = os_snprintf(pos, end - pos, " %s", argv[i]);
1190 if (os_snprintf_error(end - pos, ret)) {
1191 printf("Too long IDENTITY command.\n");
1197 return wpa_ctrl_command(ctrl, cmd);
1201 static int wpa_cli_cmd_password(struct wpa_ctrl *ctrl, int argc, char *argv[])
1203 char cmd[256], *pos, *end;
1207 printf("Invalid PASSWORD command: needs two arguments "
1208 "(network id and password)\n");
1212 end = cmd + sizeof(cmd);
1214 ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PASSWORD-%s:%s",
1216 if (os_snprintf_error(end - pos, ret)) {
1217 printf("Too long PASSWORD command.\n");
1221 for (i = 2; i < argc; i++) {
1222 ret = os_snprintf(pos, end - pos, " %s", argv[i]);
1223 if (os_snprintf_error(end - pos, ret)) {
1224 printf("Too long PASSWORD command.\n");
1230 return wpa_ctrl_command(ctrl, cmd);
1234 static int wpa_cli_cmd_new_password(struct wpa_ctrl *ctrl, int argc,
1237 char cmd[256], *pos, *end;
1241 printf("Invalid NEW_PASSWORD command: needs two arguments "
1242 "(network id and password)\n");
1246 end = cmd + sizeof(cmd);
1248 ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "NEW_PASSWORD-%s:%s",
1250 if (os_snprintf_error(end - pos, ret)) {
1251 printf("Too long NEW_PASSWORD command.\n");
1255 for (i = 2; i < argc; i++) {
1256 ret = os_snprintf(pos, end - pos, " %s", argv[i]);
1257 if (os_snprintf_error(end - pos, ret)) {
1258 printf("Too long NEW_PASSWORD command.\n");
1264 return wpa_ctrl_command(ctrl, cmd);
1268 static int wpa_cli_cmd_pin(struct wpa_ctrl *ctrl, int argc, char *argv[])
1270 char cmd[256], *pos, *end;
1274 printf("Invalid PIN command: needs two arguments "
1275 "(network id and pin)\n");
1279 end = cmd + sizeof(cmd);
1281 ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PIN-%s:%s",
1283 if (os_snprintf_error(end - pos, ret)) {
1284 printf("Too long PIN command.\n");
1288 for (i = 2; i < argc; i++) {
1289 ret = os_snprintf(pos, end - pos, " %s", argv[i]);
1290 if (os_snprintf_error(end - pos, ret)) {
1291 printf("Too long PIN command.\n");
1296 return wpa_ctrl_command(ctrl, cmd);
1300 static int wpa_cli_cmd_otp(struct wpa_ctrl *ctrl, int argc, char *argv[])
1302 char cmd[256], *pos, *end;
1306 printf("Invalid OTP command: needs two arguments (network "
1307 "id and password)\n");
1311 end = cmd + sizeof(cmd);
1313 ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "OTP-%s:%s",
1315 if (os_snprintf_error(end - pos, ret)) {
1316 printf("Too long OTP command.\n");
1320 for (i = 2; i < argc; i++) {
1321 ret = os_snprintf(pos, end - pos, " %s", argv[i]);
1322 if (os_snprintf_error(end - pos, ret)) {
1323 printf("Too long OTP command.\n");
1329 return wpa_ctrl_command(ctrl, cmd);
1333 static int wpa_cli_cmd_sim(struct wpa_ctrl *ctrl, int argc, char *argv[])
1335 char cmd[256], *pos, *end;
1339 printf("Invalid SIM command: needs two arguments "
1340 "(network id and SIM operation response)\n");
1344 end = cmd + sizeof(cmd);
1346 ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "SIM-%s:%s",
1348 if (os_snprintf_error(end - pos, ret)) {
1349 printf("Too long SIM command.\n");
1353 for (i = 2; i < argc; i++) {
1354 ret = os_snprintf(pos, end - pos, " %s", argv[i]);
1355 if (os_snprintf_error(end - pos, ret)) {
1356 printf("Too long SIM command.\n");
1361 return wpa_ctrl_command(ctrl, cmd);
1365 static int wpa_cli_cmd_passphrase(struct wpa_ctrl *ctrl, int argc,
1368 char cmd[256], *pos, *end;
1372 printf("Invalid PASSPHRASE command: needs two arguments "
1373 "(network id and passphrase)\n");
1377 end = cmd + sizeof(cmd);
1379 ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PASSPHRASE-%s:%s",
1381 if (os_snprintf_error(end - pos, ret)) {
1382 printf("Too long PASSPHRASE command.\n");
1386 for (i = 2; i < argc; i++) {
1387 ret = os_snprintf(pos, end - pos, " %s", argv[i]);
1388 if (os_snprintf_error(end - pos, ret)) {
1389 printf("Too long PASSPHRASE command.\n");
1395 return wpa_ctrl_command(ctrl, cmd);
1399 static int wpa_cli_cmd_bssid(struct wpa_ctrl *ctrl, int argc, char *argv[])
1402 printf("Invalid BSSID command: needs two arguments (network "
1407 return wpa_cli_cmd(ctrl, "BSSID", 2, argc, argv);
1411 static int wpa_cli_cmd_blacklist(struct wpa_ctrl *ctrl, int argc, char *argv[])
1413 return wpa_cli_cmd(ctrl, "BLACKLIST", 0, argc, argv);
1417 static int wpa_cli_cmd_log_level(struct wpa_ctrl *ctrl, int argc, char *argv[])
1419 return wpa_cli_cmd(ctrl, "LOG_LEVEL", 0, argc, argv);
1423 static int wpa_cli_cmd_list_networks(struct wpa_ctrl *ctrl, int argc,
1426 return wpa_ctrl_command(ctrl, "LIST_NETWORKS");
1430 static int wpa_cli_cmd_select_network(struct wpa_ctrl *ctrl, int argc,
1433 return wpa_cli_cmd(ctrl, "SELECT_NETWORK", 1, argc, argv);
1437 static int wpa_cli_cmd_enable_network(struct wpa_ctrl *ctrl, int argc,
1440 return wpa_cli_cmd(ctrl, "ENABLE_NETWORK", 1, argc, argv);
1444 static int wpa_cli_cmd_disable_network(struct wpa_ctrl *ctrl, int argc,
1447 return wpa_cli_cmd(ctrl, "DISABLE_NETWORK", 1, argc, argv);
1451 static int wpa_cli_cmd_add_network(struct wpa_ctrl *ctrl, int argc,
1454 return wpa_ctrl_command(ctrl, "ADD_NETWORK");
1458 static int wpa_cli_cmd_remove_network(struct wpa_ctrl *ctrl, int argc,
1461 return wpa_cli_cmd(ctrl, "REMOVE_NETWORK", 1, argc, argv);
1465 static void wpa_cli_show_network_variables(void)
1467 printf("set_network variables:\n"
1468 " ssid (network name, SSID)\n"
1469 " psk (WPA passphrase or pre-shared key)\n"
1470 " key_mgmt (key management protocol)\n"
1471 " identity (EAP identity)\n"
1472 " password (EAP password)\n"
1475 "Note: Values are entered in the same format as the "
1476 "configuration file is using,\n"
1477 "i.e., strings values need to be inside double quotation "
1479 "For example: set_network 1 ssid \"network name\"\n"
1481 "Please see wpa_supplicant.conf documentation for full list "
1482 "of\navailable variables.\n");
1486 static int wpa_cli_cmd_set_network(struct wpa_ctrl *ctrl, int argc,
1490 wpa_cli_show_network_variables();
1495 printf("Invalid SET_NETWORK command: needs three arguments\n"
1496 "(network id, variable name, and value)\n");
1500 return wpa_cli_cmd(ctrl, "SET_NETWORK", 3, argc, argv);
1504 static int wpa_cli_cmd_get_network(struct wpa_ctrl *ctrl, int argc,
1508 wpa_cli_show_network_variables();
1513 printf("Invalid GET_NETWORK command: needs two arguments\n"
1514 "(network id and variable name)\n");
1518 return wpa_cli_cmd(ctrl, "GET_NETWORK", 2, argc, argv);
1522 static int wpa_cli_cmd_dup_network(struct wpa_ctrl *ctrl, int argc,
1526 wpa_cli_show_network_variables();
1531 printf("Invalid DUP_NETWORK command: needs three arguments\n"
1532 "(src netid, dest netid, and variable name)\n");
1536 return wpa_cli_cmd(ctrl, "DUP_NETWORK", 3, argc, argv);
1540 static int wpa_cli_cmd_list_creds(struct wpa_ctrl *ctrl, int argc,
1543 return wpa_ctrl_command(ctrl, "LIST_CREDS");
1547 static int wpa_cli_cmd_add_cred(struct wpa_ctrl *ctrl, int argc, char *argv[])
1549 return wpa_ctrl_command(ctrl, "ADD_CRED");
1553 static int wpa_cli_cmd_remove_cred(struct wpa_ctrl *ctrl, int argc,
1556 return wpa_cli_cmd(ctrl, "REMOVE_CRED", 1, argc, argv);
1560 static int wpa_cli_cmd_set_cred(struct wpa_ctrl *ctrl, int argc, char *argv[])
1563 printf("Invalid SET_CRED command: needs three arguments\n"
1564 "(cred id, variable name, and value)\n");
1568 return wpa_cli_cmd(ctrl, "SET_CRED", 3, argc, argv);
1572 static int wpa_cli_cmd_get_cred(struct wpa_ctrl *ctrl, int argc, char *argv[])
1575 printf("Invalid GET_CRED command: needs two arguments\n"
1576 "(cred id, variable name)\n");
1580 return wpa_cli_cmd(ctrl, "GET_CRED", 2, argc, argv);
1584 static int wpa_cli_cmd_disconnect(struct wpa_ctrl *ctrl, int argc,
1587 return wpa_ctrl_command(ctrl, "DISCONNECT");
1591 static int wpa_cli_cmd_reconnect(struct wpa_ctrl *ctrl, int argc,
1594 return wpa_ctrl_command(ctrl, "RECONNECT");
1598 static int wpa_cli_cmd_save_config(struct wpa_ctrl *ctrl, int argc,
1601 return wpa_ctrl_command(ctrl, "SAVE_CONFIG");
1605 static int wpa_cli_cmd_scan(struct wpa_ctrl *ctrl, int argc, char *argv[])
1607 return wpa_cli_cmd(ctrl, "SCAN", 0, argc, argv);
1611 static int wpa_cli_cmd_scan_results(struct wpa_ctrl *ctrl, int argc,
1614 return wpa_ctrl_command(ctrl, "SCAN_RESULTS");
1618 static int wpa_cli_cmd_bss(struct wpa_ctrl *ctrl, int argc, char *argv[])
1620 return wpa_cli_cmd(ctrl, "BSS", 1, argc, argv);
1624 static char ** wpa_cli_complete_bss(const char *str, int pos)
1626 int arg = get_cmd_arg_num(str, pos);
1631 res = cli_txt_list_array(&bsses);
1639 static int wpa_cli_cmd_get_capability(struct wpa_ctrl *ctrl, int argc,
1642 if (argc < 1 || argc > 2) {
1643 printf("Invalid GET_CAPABILITY command: need either one or "
1648 if ((argc == 2) && os_strcmp(argv[1], "strict") != 0) {
1649 printf("Invalid GET_CAPABILITY command: second argument, "
1650 "if any, must be 'strict'\n");
1654 return wpa_cli_cmd(ctrl, "GET_CAPABILITY", 1, argc, argv);
1658 static int wpa_cli_list_interfaces(struct wpa_ctrl *ctrl)
1660 printf("Available interfaces:\n");
1661 return wpa_ctrl_command(ctrl, "INTERFACES");
1665 static int wpa_cli_cmd_interface(struct wpa_ctrl *ctrl, int argc, char *argv[])
1668 wpa_cli_list_interfaces(ctrl);
1672 wpa_cli_close_connection();
1673 os_free(ctrl_ifname);
1674 ctrl_ifname = os_strdup(argv[0]);
1676 printf("Failed to allocate memory\n");
1680 if (wpa_cli_open_connection(ctrl_ifname, 1) == 0) {
1681 printf("Connected to interface '%s.\n", ctrl_ifname);
1683 printf("Could not connect to interface '%s' - re-trying\n",
1690 static int wpa_cli_cmd_reconfigure(struct wpa_ctrl *ctrl, int argc,
1693 return wpa_ctrl_command(ctrl, "RECONFIGURE");
1697 static int wpa_cli_cmd_terminate(struct wpa_ctrl *ctrl, int argc,
1700 return wpa_ctrl_command(ctrl, "TERMINATE");
1704 static int wpa_cli_cmd_interface_add(struct wpa_ctrl *ctrl, int argc,
1711 printf("Invalid INTERFACE_ADD command: needs at least one "
1712 "argument (interface name)\n"
1713 "All arguments: ifname confname driver ctrl_interface "
1714 "driver_param bridge_name [create]\n");
1719 * INTERFACE_ADD <ifname>TAB<confname>TAB<driver>TAB<ctrl_interface>TAB
1720 * <driver_param>TAB<bridge_name>[TAB<create>]
1722 res = os_snprintf(cmd, sizeof(cmd),
1723 "INTERFACE_ADD %s\t%s\t%s\t%s\t%s\t%s\t%s",
1725 argc > 1 ? argv[1] : "", argc > 2 ? argv[2] : "",
1726 argc > 3 ? argv[3] : "", argc > 4 ? argv[4] : "",
1727 argc > 5 ? argv[5] : "", argc > 6 ? argv[6] : "");
1728 if (os_snprintf_error(sizeof(cmd), res))
1730 cmd[sizeof(cmd) - 1] = '\0';
1731 return wpa_ctrl_command(ctrl, cmd);
1735 static int wpa_cli_cmd_interface_remove(struct wpa_ctrl *ctrl, int argc,
1738 return wpa_cli_cmd(ctrl, "INTERFACE_REMOVE", 1, argc, argv);
1742 static int wpa_cli_cmd_interface_list(struct wpa_ctrl *ctrl, int argc,
1745 return wpa_ctrl_command(ctrl, "INTERFACE_LIST");
1750 static int wpa_cli_cmd_sta(struct wpa_ctrl *ctrl, int argc, char *argv[])
1752 return wpa_cli_cmd(ctrl, "STA", 1, argc, argv);
1756 static int wpa_ctrl_command_sta(struct wpa_ctrl *ctrl, char *cmd,
1757 char *addr, size_t addr_len)
1759 char buf[4096], *pos;
1763 if (ctrl_conn == NULL) {
1764 printf("Not connected to hostapd - command dropped.\n");
1767 len = sizeof(buf) - 1;
1768 ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len,
1771 printf("'%s' command timed out.\n", cmd);
1773 } else if (ret < 0) {
1774 printf("'%s' command failed.\n", cmd);
1779 if (os_memcmp(buf, "FAIL", 4) == 0)
1784 while (*pos != '\0' && *pos != '\n')
1787 os_strlcpy(addr, buf, addr_len);
1792 static int wpa_cli_cmd_all_sta(struct wpa_ctrl *ctrl, int argc, char *argv[])
1794 char addr[32], cmd[64];
1796 if (wpa_ctrl_command_sta(ctrl, "STA-FIRST", addr, sizeof(addr)))
1799 os_snprintf(cmd, sizeof(cmd), "STA-NEXT %s", addr);
1800 } while (wpa_ctrl_command_sta(ctrl, cmd, addr, sizeof(addr)) == 0);
1806 static int wpa_cli_cmd_deauthenticate(struct wpa_ctrl *ctrl, int argc,
1809 return wpa_cli_cmd(ctrl, "DEAUTHENTICATE", 1, argc, argv);
1813 static int wpa_cli_cmd_disassociate(struct wpa_ctrl *ctrl, int argc,
1816 return wpa_cli_cmd(ctrl, "DISASSOCIATE", 1, argc, argv);
1819 static int wpa_cli_cmd_chanswitch(struct wpa_ctrl *ctrl, int argc,
1822 return wpa_cli_cmd(ctrl, "CHAN_SWITCH", 2, argc, argv);
1825 #endif /* CONFIG_AP */
1828 static int wpa_cli_cmd_suspend(struct wpa_ctrl *ctrl, int argc, char *argv[])
1830 return wpa_ctrl_command(ctrl, "SUSPEND");
1834 static int wpa_cli_cmd_resume(struct wpa_ctrl *ctrl, int argc, char *argv[])
1836 return wpa_ctrl_command(ctrl, "RESUME");
1840 #ifdef CONFIG_TESTING_OPTIONS
1841 static int wpa_cli_cmd_drop_sa(struct wpa_ctrl *ctrl, int argc, char *argv[])
1843 return wpa_ctrl_command(ctrl, "DROP_SA");
1845 #endif /* CONFIG_TESTING_OPTIONS */
1848 static int wpa_cli_cmd_roam(struct wpa_ctrl *ctrl, int argc, char *argv[])
1850 return wpa_cli_cmd(ctrl, "ROAM", 1, argc, argv);
1856 static int wpa_cli_cmd_mesh_interface_add(struct wpa_ctrl *ctrl, int argc,
1859 return wpa_cli_cmd(ctrl, "MESH_INTERFACE_ADD", 0, argc, argv);
1863 static int wpa_cli_cmd_mesh_group_add(struct wpa_ctrl *ctrl, int argc,
1866 return wpa_cli_cmd(ctrl, "MESH_GROUP_ADD", 1, argc, argv);
1870 static int wpa_cli_cmd_mesh_group_remove(struct wpa_ctrl *ctrl, int argc,
1873 return wpa_cli_cmd(ctrl, "MESH_GROUP_REMOVE", 1, argc, argv);
1876 #endif /* CONFIG_MESH */
1881 static int wpa_cli_cmd_p2p_find(struct wpa_ctrl *ctrl, int argc, char *argv[])
1883 return wpa_cli_cmd(ctrl, "P2P_FIND", 0, argc, argv);
1887 static char ** wpa_cli_complete_p2p_find(const char *str, int pos)
1890 int arg = get_cmd_arg_num(str, pos);
1892 res = os_calloc(6, sizeof(char *));
1895 res[0] = os_strdup("type=social");
1896 if (res[0] == NULL) {
1900 res[1] = os_strdup("type=progressive");
1903 res[2] = os_strdup("delay=");
1906 res[3] = os_strdup("dev_id=");
1910 res[4] = os_strdup("[timeout]");
1916 static int wpa_cli_cmd_p2p_stop_find(struct wpa_ctrl *ctrl, int argc,
1919 return wpa_ctrl_command(ctrl, "P2P_STOP_FIND");
1923 static int wpa_cli_cmd_p2p_asp_provision(struct wpa_ctrl *ctrl, int argc,
1926 return wpa_cli_cmd(ctrl, "P2P_ASP_PROVISION", 3, argc, argv);
1930 static int wpa_cli_cmd_p2p_asp_provision_resp(struct wpa_ctrl *ctrl, int argc,
1933 return wpa_cli_cmd(ctrl, "P2P_ASP_PROVISION_RESP", 2, argc, argv);
1937 static int wpa_cli_cmd_p2p_connect(struct wpa_ctrl *ctrl, int argc,
1940 return wpa_cli_cmd(ctrl, "P2P_CONNECT", 2, argc, argv);
1944 static char ** wpa_cli_complete_p2p_connect(const char *str, int pos)
1946 int arg = get_cmd_arg_num(str, pos);
1951 res = cli_txt_list_array(&p2p_peers);
1959 static int wpa_cli_cmd_p2p_listen(struct wpa_ctrl *ctrl, int argc,
1962 return wpa_cli_cmd(ctrl, "P2P_LISTEN", 0, argc, argv);
1966 static int wpa_cli_cmd_p2p_group_remove(struct wpa_ctrl *ctrl, int argc,
1969 return wpa_cli_cmd(ctrl, "P2P_GROUP_REMOVE", 1, argc, argv);
1973 static char ** wpa_cli_complete_p2p_group_remove(const char *str, int pos)
1975 int arg = get_cmd_arg_num(str, pos);
1980 res = cli_txt_list_array(&p2p_groups);
1988 static int wpa_cli_cmd_p2p_group_add(struct wpa_ctrl *ctrl, int argc,
1991 return wpa_cli_cmd(ctrl, "P2P_GROUP_ADD", 0, argc, argv);
1995 static int wpa_cli_cmd_p2p_prov_disc(struct wpa_ctrl *ctrl, int argc,
1998 if (argc != 2 && argc != 3) {
1999 printf("Invalid P2P_PROV_DISC command: needs at least "
2000 "two arguments, address and config method\n"
2001 "(display, keypad, or pbc) and an optional join\n");
2005 return wpa_cli_cmd(ctrl, "P2P_PROV_DISC", 2, argc, argv);
2009 static int wpa_cli_cmd_p2p_get_passphrase(struct wpa_ctrl *ctrl, int argc,
2012 return wpa_ctrl_command(ctrl, "P2P_GET_PASSPHRASE");
2016 static int wpa_cli_cmd_p2p_serv_disc_req(struct wpa_ctrl *ctrl, int argc,
2022 printf("Invalid P2P_SERV_DISC_REQ command: needs two "
2023 "or more arguments (address and TLVs)\n");
2027 if (write_cmd(cmd, sizeof(cmd), "P2P_SERV_DISC_REQ", argc, argv) < 0)
2029 return wpa_ctrl_command(ctrl, cmd);
2033 static int wpa_cli_cmd_p2p_serv_disc_cancel_req(struct wpa_ctrl *ctrl,
2034 int argc, char *argv[])
2036 return wpa_cli_cmd(ctrl, "P2P_SERV_DISC_CANCEL_REQ", 1, argc, argv);
2040 static int wpa_cli_cmd_p2p_serv_disc_resp(struct wpa_ctrl *ctrl, int argc,
2047 printf("Invalid P2P_SERV_DISC_RESP command: needs four "
2048 "arguments (freq, address, dialog token, and TLVs)\n");
2052 res = os_snprintf(cmd, sizeof(cmd), "P2P_SERV_DISC_RESP %s %s %s %s",
2053 argv[0], argv[1], argv[2], argv[3]);
2054 if (os_snprintf_error(sizeof(cmd), res))
2056 cmd[sizeof(cmd) - 1] = '\0';
2057 return wpa_ctrl_command(ctrl, cmd);
2061 static int wpa_cli_cmd_p2p_service_update(struct wpa_ctrl *ctrl, int argc,
2064 return wpa_ctrl_command(ctrl, "P2P_SERVICE_UPDATE");
2068 static int wpa_cli_cmd_p2p_serv_disc_external(struct wpa_ctrl *ctrl,
2069 int argc, char *argv[])
2071 return wpa_cli_cmd(ctrl, "P2P_SERV_DISC_EXTERNAL", 1, argc, argv);
2075 static int wpa_cli_cmd_p2p_service_flush(struct wpa_ctrl *ctrl, int argc,
2078 return wpa_ctrl_command(ctrl, "P2P_SERVICE_FLUSH");
2082 static int wpa_cli_cmd_p2p_service_add(struct wpa_ctrl *ctrl, int argc,
2086 printf("Invalid P2P_SERVICE_ADD command: needs 3-6 arguments\n");
2090 return wpa_cli_cmd(ctrl, "P2P_SERVICE_ADD", 3, argc, argv);
2094 static int wpa_cli_cmd_p2p_service_rep(struct wpa_ctrl *ctrl, int argc,
2097 if (argc < 5 || argc > 6) {
2098 printf("Invalid P2P_SERVICE_REP command: needs 5-6 "
2103 return wpa_cli_cmd(ctrl, "P2P_SERVICE_REP", 5, argc, argv);
2107 static int wpa_cli_cmd_p2p_service_del(struct wpa_ctrl *ctrl, int argc,
2113 if (argc != 2 && argc != 3) {
2114 printf("Invalid P2P_SERVICE_DEL command: needs two or three "
2120 res = os_snprintf(cmd, sizeof(cmd),
2121 "P2P_SERVICE_DEL %s %s %s",
2122 argv[0], argv[1], argv[2]);
2124 res = os_snprintf(cmd, sizeof(cmd),
2125 "P2P_SERVICE_DEL %s %s",
2127 if (os_snprintf_error(sizeof(cmd), res))
2129 cmd[sizeof(cmd) - 1] = '\0';
2130 return wpa_ctrl_command(ctrl, cmd);
2134 static int wpa_cli_cmd_p2p_reject(struct wpa_ctrl *ctrl,
2135 int argc, char *argv[])
2137 return wpa_cli_cmd(ctrl, "P2P_REJECT", 1, argc, argv);
2141 static int wpa_cli_cmd_p2p_invite(struct wpa_ctrl *ctrl,
2142 int argc, char *argv[])
2144 return wpa_cli_cmd(ctrl, "P2P_INVITE", 1, argc, argv);
2148 static int wpa_cli_cmd_p2p_peer(struct wpa_ctrl *ctrl, int argc, char *argv[])
2150 return wpa_cli_cmd(ctrl, "P2P_PEER", 1, argc, argv);
2154 static char ** wpa_cli_complete_p2p_peer(const char *str, int pos)
2156 int arg = get_cmd_arg_num(str, pos);
2161 res = cli_txt_list_array(&p2p_peers);
2169 static int wpa_ctrl_command_p2p_peer(struct wpa_ctrl *ctrl, char *cmd,
2170 char *addr, size_t addr_len,
2173 char buf[4096], *pos;
2177 if (ctrl_conn == NULL)
2179 len = sizeof(buf) - 1;
2180 ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len,
2183 printf("'%s' command timed out.\n", cmd);
2185 } else if (ret < 0) {
2186 printf("'%s' command failed.\n", cmd);
2191 if (os_memcmp(buf, "FAIL", 4) == 0)
2195 while (*pos != '\0' && *pos != '\n')
2198 os_strlcpy(addr, buf, addr_len);
2199 if (!discovered || os_strstr(pos, "[PROBE_REQ_ONLY]") == NULL)
2200 printf("%s\n", addr);
2205 static int wpa_cli_cmd_p2p_peers(struct wpa_ctrl *ctrl, int argc, char *argv[])
2207 char addr[32], cmd[64];
2210 discovered = argc > 0 && os_strcmp(argv[0], "discovered") == 0;
2212 if (wpa_ctrl_command_p2p_peer(ctrl, "P2P_PEER FIRST",
2213 addr, sizeof(addr), discovered))
2216 os_snprintf(cmd, sizeof(cmd), "P2P_PEER NEXT-%s", addr);
2217 } while (wpa_ctrl_command_p2p_peer(ctrl, cmd, addr, sizeof(addr),
2224 static int wpa_cli_cmd_p2p_set(struct wpa_ctrl *ctrl, int argc, char *argv[])
2226 return wpa_cli_cmd(ctrl, "P2P_SET", 2, argc, argv);
2230 static char ** wpa_cli_complete_p2p_set(const char *str, int pos)
2232 int arg = get_cmd_arg_num(str, pos);
2233 const char *fields[] = {
2253 int i, num_fields = ARRAY_SIZE(fields);
2256 char **res = os_calloc(num_fields + 1, sizeof(char *));
2259 for (i = 0; i < num_fields; i++) {
2260 res[i] = os_strdup(fields[i]);
2267 if (arg == 2 && os_strncasecmp(str, "p2p_set peer_filter ", 20) == 0)
2268 return cli_txt_list_array(&p2p_peers);
2274 static int wpa_cli_cmd_p2p_flush(struct wpa_ctrl *ctrl, int argc, char *argv[])
2276 return wpa_ctrl_command(ctrl, "P2P_FLUSH");
2280 static int wpa_cli_cmd_p2p_cancel(struct wpa_ctrl *ctrl, int argc,
2283 return wpa_ctrl_command(ctrl, "P2P_CANCEL");
2287 static int wpa_cli_cmd_p2p_unauthorize(struct wpa_ctrl *ctrl, int argc,
2290 return wpa_cli_cmd(ctrl, "P2P_UNAUTHORIZE", 1, argc, argv);
2294 static int wpa_cli_cmd_p2p_presence_req(struct wpa_ctrl *ctrl, int argc,
2297 if (argc != 0 && argc != 2 && argc != 4) {
2298 printf("Invalid P2P_PRESENCE_REQ command: needs two arguments "
2299 "(preferred duration, interval; in microsecods).\n"
2300 "Optional second pair can be used to provide "
2301 "acceptable values.\n");
2305 return wpa_cli_cmd(ctrl, "P2P_PRESENCE_REQ", 0, argc, argv);
2309 static int wpa_cli_cmd_p2p_ext_listen(struct wpa_ctrl *ctrl, int argc,
2312 if (argc != 0 && argc != 2) {
2313 printf("Invalid P2P_EXT_LISTEN command: needs two arguments "
2314 "(availability period, availability interval; in "
2316 "Extended Listen Timing can be cancelled with this "
2317 "command when used without parameters.\n");
2321 return wpa_cli_cmd(ctrl, "P2P_EXT_LISTEN", 0, argc, argv);
2325 static int wpa_cli_cmd_p2p_remove_client(struct wpa_ctrl *ctrl, int argc,
2328 return wpa_cli_cmd(ctrl, "P2P_REMOVE_CLIENT", 1, argc, argv);
2331 #endif /* CONFIG_P2P */
2333 #ifdef CONFIG_WIFI_DISPLAY
2335 static int wpa_cli_cmd_wfd_subelem_set(struct wpa_ctrl *ctrl, int argc,
2341 if (argc != 1 && argc != 2) {
2342 printf("Invalid WFD_SUBELEM_SET command: needs one or two "
2343 "arguments (subelem, hexdump)\n");
2347 res = os_snprintf(cmd, sizeof(cmd), "WFD_SUBELEM_SET %s %s",
2348 argv[0], argc > 1 ? argv[1] : "");
2349 if (os_snprintf_error(sizeof(cmd), res))
2351 cmd[sizeof(cmd) - 1] = '\0';
2352 return wpa_ctrl_command(ctrl, cmd);
2356 static int wpa_cli_cmd_wfd_subelem_get(struct wpa_ctrl *ctrl, int argc,
2363 printf("Invalid WFD_SUBELEM_GET command: needs one "
2364 "argument (subelem)\n");
2368 res = os_snprintf(cmd, sizeof(cmd), "WFD_SUBELEM_GET %s",
2370 if (os_snprintf_error(sizeof(cmd), res))
2372 cmd[sizeof(cmd) - 1] = '\0';
2373 return wpa_ctrl_command(ctrl, cmd);
2375 #endif /* CONFIG_WIFI_DISPLAY */
2378 #ifdef CONFIG_INTERWORKING
2379 static int wpa_cli_cmd_fetch_anqp(struct wpa_ctrl *ctrl, int argc,
2382 return wpa_ctrl_command(ctrl, "FETCH_ANQP");
2386 static int wpa_cli_cmd_stop_fetch_anqp(struct wpa_ctrl *ctrl, int argc,
2389 return wpa_ctrl_command(ctrl, "STOP_FETCH_ANQP");
2393 static int wpa_cli_cmd_interworking_select(struct wpa_ctrl *ctrl, int argc,
2396 return wpa_cli_cmd(ctrl, "INTERWORKING_SELECT", 0, argc, argv);
2400 static int wpa_cli_cmd_interworking_connect(struct wpa_ctrl *ctrl, int argc,
2403 return wpa_cli_cmd(ctrl, "INTERWORKING_CONNECT", 1, argc, argv);
2407 static int wpa_cli_cmd_interworking_add_network(struct wpa_ctrl *ctrl, int argc,
2410 return wpa_cli_cmd(ctrl, "INTERWORKING_ADD_NETWORK", 1, argc, argv);
2414 static int wpa_cli_cmd_anqp_get(struct wpa_ctrl *ctrl, int argc, char *argv[])
2416 return wpa_cli_cmd(ctrl, "ANQP_GET", 2, argc, argv);
2420 static int wpa_cli_cmd_gas_request(struct wpa_ctrl *ctrl, int argc,
2423 return wpa_cli_cmd(ctrl, "GAS_REQUEST", 2, argc, argv);
2427 static int wpa_cli_cmd_gas_response_get(struct wpa_ctrl *ctrl, int argc,
2430 return wpa_cli_cmd(ctrl, "GAS_RESPONSE_GET", 2, argc, argv);
2432 #endif /* CONFIG_INTERWORKING */
2437 static int wpa_cli_cmd_hs20_anqp_get(struct wpa_ctrl *ctrl, int argc,
2440 return wpa_cli_cmd(ctrl, "HS20_ANQP_GET", 2, argc, argv);
2444 static int wpa_cli_cmd_get_nai_home_realm_list(struct wpa_ctrl *ctrl, int argc,
2450 printf("Command needs one or two arguments (dst mac addr and "
2451 "optional home realm)\n");
2455 if (write_cmd(cmd, sizeof(cmd), "HS20_GET_NAI_HOME_REALM_LIST",
2459 return wpa_ctrl_command(ctrl, cmd);
2463 static int wpa_cli_cmd_hs20_icon_request(struct wpa_ctrl *ctrl, int argc,
2469 printf("Command needs two arguments (dst mac addr and "
2474 if (write_cmd(cmd, sizeof(cmd), "HS20_ICON_REQUEST", argc, argv) < 0)
2477 return wpa_ctrl_command(ctrl, cmd);
2481 static int wpa_cli_cmd_fetch_osu(struct wpa_ctrl *ctrl, int argc, char *argv[])
2483 return wpa_ctrl_command(ctrl, "FETCH_OSU");
2487 static int wpa_cli_cmd_cancel_fetch_osu(struct wpa_ctrl *ctrl, int argc,
2490 return wpa_ctrl_command(ctrl, "CANCEL_FETCH_OSU");
2493 #endif /* CONFIG_HS20 */
2496 static int wpa_cli_cmd_sta_autoconnect(struct wpa_ctrl *ctrl, int argc,
2499 return wpa_cli_cmd(ctrl, "STA_AUTOCONNECT", 1, argc, argv);
2503 static int wpa_cli_cmd_tdls_discover(struct wpa_ctrl *ctrl, int argc,
2506 return wpa_cli_cmd(ctrl, "TDLS_DISCOVER", 1, argc, argv);
2510 static int wpa_cli_cmd_tdls_setup(struct wpa_ctrl *ctrl, int argc,
2513 return wpa_cli_cmd(ctrl, "TDLS_SETUP", 1, argc, argv);
2517 static int wpa_cli_cmd_tdls_teardown(struct wpa_ctrl *ctrl, int argc,
2520 return wpa_cli_cmd(ctrl, "TDLS_TEARDOWN", 1, argc, argv);
2524 static int wpa_cli_cmd_wmm_ac_addts(struct wpa_ctrl *ctrl, int argc,
2527 return wpa_cli_cmd(ctrl, "WMM_AC_ADDTS", 3, argc, argv);
2531 static int wpa_cli_cmd_wmm_ac_delts(struct wpa_ctrl *ctrl, int argc,
2534 return wpa_cli_cmd(ctrl, "WMM_AC_DELTS", 1, argc, argv);
2538 static int wpa_cli_cmd_wmm_ac_status(struct wpa_ctrl *ctrl, int argc,
2541 return wpa_ctrl_command(ctrl, "WMM_AC_STATUS");
2545 static int wpa_cli_cmd_tdls_chan_switch(struct wpa_ctrl *ctrl, int argc,
2548 return wpa_cli_cmd(ctrl, "TDLS_CHAN_SWITCH", 2, argc, argv);
2552 static int wpa_cli_cmd_tdls_cancel_chan_switch(struct wpa_ctrl *ctrl, int argc,
2555 return wpa_cli_cmd(ctrl, "TDLS_CANCEL_CHAN_SWITCH", 1, argc, argv);
2559 static int wpa_cli_cmd_signal_poll(struct wpa_ctrl *ctrl, int argc,
2562 return wpa_ctrl_command(ctrl, "SIGNAL_POLL");
2566 static int wpa_cli_cmd_pktcnt_poll(struct wpa_ctrl *ctrl, int argc,
2569 return wpa_ctrl_command(ctrl, "PKTCNT_POLL");
2573 static int wpa_cli_cmd_reauthenticate(struct wpa_ctrl *ctrl, int argc,
2576 return wpa_ctrl_command(ctrl, "REAUTHENTICATE");
2580 #ifdef CONFIG_AUTOSCAN
2582 static int wpa_cli_cmd_autoscan(struct wpa_ctrl *ctrl, int argc, char *argv[])
2585 return wpa_ctrl_command(ctrl, "AUTOSCAN ");
2587 return wpa_cli_cmd(ctrl, "AUTOSCAN", 0, argc, argv);
2590 #endif /* CONFIG_AUTOSCAN */
2595 static int wpa_cli_cmd_wnm_sleep(struct wpa_ctrl *ctrl, int argc, char *argv[])
2597 return wpa_cli_cmd(ctrl, "WNM_SLEEP", 0, argc, argv);
2601 static int wpa_cli_cmd_wnm_bss_query(struct wpa_ctrl *ctrl, int argc, char *argv[])
2603 return wpa_cli_cmd(ctrl, "WNM_BSS_QUERY", 1, argc, argv);
2606 #endif /* CONFIG_WNM */
2609 static int wpa_cli_cmd_raw(struct wpa_ctrl *ctrl, int argc, char *argv[])
2613 return wpa_cli_cmd(ctrl, argv[0], 0, argc - 1, &argv[1]);
2618 static int wpa_cli_cmd_driver(struct wpa_ctrl *ctrl, int argc, char *argv[])
2620 return wpa_cli_cmd(ctrl, "DRIVER", 1, argc, argv);
2622 #endif /* ANDROID */
2625 static int wpa_cli_cmd_vendor(struct wpa_ctrl *ctrl, int argc, char *argv[])
2627 return wpa_cli_cmd(ctrl, "VENDOR", 1, argc, argv);
2631 static int wpa_cli_cmd_flush(struct wpa_ctrl *ctrl, int argc, char *argv[])
2633 return wpa_ctrl_command(ctrl, "FLUSH");
2637 static int wpa_cli_cmd_radio_work(struct wpa_ctrl *ctrl, int argc, char *argv[])
2639 return wpa_cli_cmd(ctrl, "RADIO_WORK", 1, argc, argv);
2643 static int wpa_cli_cmd_neighbor_rep_request(struct wpa_ctrl *ctrl, int argc,
2646 return wpa_cli_cmd(ctrl, "NEIGHBOR_REP_REQUEST", 0, argc, argv);
2650 static int wpa_cli_cmd_erp_flush(struct wpa_ctrl *ctrl, int argc, char *argv[])
2652 return wpa_ctrl_command(ctrl, "ERP_FLUSH");
2656 static int wpa_cli_cmd_mac_rand_scan(struct wpa_ctrl *ctrl, int argc,
2659 return wpa_cli_cmd(ctrl, "MAC_RAND_SCAN", 1, argc, argv);
2663 enum wpa_cli_cmd_flags {
2664 cli_cmd_flag_none = 0x00,
2665 cli_cmd_flag_sensitive = 0x01
2668 struct wpa_cli_cmd {
2670 int (*handler)(struct wpa_ctrl *ctrl, int argc, char *argv[]);
2671 char ** (*completion)(const char *str, int pos);
2672 enum wpa_cli_cmd_flags flags;
2676 static struct wpa_cli_cmd wpa_cli_commands[] = {
2677 { "status", wpa_cli_cmd_status, NULL,
2679 "[verbose] = get current WPA/EAPOL/EAP status" },
2680 { "ifname", wpa_cli_cmd_ifname, NULL,
2682 "= get current interface name" },
2683 { "ping", wpa_cli_cmd_ping, NULL,
2685 "= pings wpa_supplicant" },
2686 { "relog", wpa_cli_cmd_relog, NULL,
2688 "= re-open log-file (allow rolling logs)" },
2689 { "note", wpa_cli_cmd_note, NULL,
2691 "<text> = add a note to wpa_supplicant debug log" },
2692 { "mib", wpa_cli_cmd_mib, NULL,
2694 "= get MIB variables (dot1x, dot11)" },
2695 { "help", wpa_cli_cmd_help, wpa_cli_complete_help,
2697 "[command] = show usage help" },
2698 { "interface", wpa_cli_cmd_interface, NULL,
2700 "[ifname] = show interfaces/select interface" },
2701 { "level", wpa_cli_cmd_level, NULL,
2703 "<debug level> = change debug level" },
2704 { "license", wpa_cli_cmd_license, NULL,
2706 "= show full wpa_cli license" },
2707 { "quit", wpa_cli_cmd_quit, NULL,
2710 { "set", wpa_cli_cmd_set, wpa_cli_complete_set,
2712 "= set variables (shows list of variables when run without "
2714 { "dump", wpa_cli_cmd_dump, NULL,
2716 "= dump config variables" },
2717 { "get", wpa_cli_cmd_get, wpa_cli_complete_get,
2719 "<name> = get information" },
2720 { "logon", wpa_cli_cmd_logon, NULL,
2722 "= IEEE 802.1X EAPOL state machine logon" },
2723 { "logoff", wpa_cli_cmd_logoff, NULL,
2725 "= IEEE 802.1X EAPOL state machine logoff" },
2726 { "pmksa", wpa_cli_cmd_pmksa, NULL,
2728 "= show PMKSA cache" },
2729 { "pmksa_flush", wpa_cli_cmd_pmksa_flush, NULL,
2731 "= flush PMKSA cache entries" },
2732 { "reassociate", wpa_cli_cmd_reassociate, NULL,
2734 "= force reassociation" },
2735 { "reattach", wpa_cli_cmd_reattach, NULL,
2737 "= force reassociation back to the same BSS" },
2738 { "preauthenticate", wpa_cli_cmd_preauthenticate, wpa_cli_complete_bss,
2740 "<BSSID> = force preauthentication" },
2741 { "identity", wpa_cli_cmd_identity, NULL,
2743 "<network id> <identity> = configure identity for an SSID" },
2744 { "password", wpa_cli_cmd_password, NULL,
2745 cli_cmd_flag_sensitive,
2746 "<network id> <password> = configure password for an SSID" },
2747 { "new_password", wpa_cli_cmd_new_password, NULL,
2748 cli_cmd_flag_sensitive,
2749 "<network id> <password> = change password for an SSID" },
2750 { "pin", wpa_cli_cmd_pin, NULL,
2751 cli_cmd_flag_sensitive,
2752 "<network id> <pin> = configure pin for an SSID" },
2753 { "otp", wpa_cli_cmd_otp, NULL,
2754 cli_cmd_flag_sensitive,
2755 "<network id> <password> = configure one-time-password for an SSID"
2757 { "passphrase", wpa_cli_cmd_passphrase, NULL,
2758 cli_cmd_flag_sensitive,
2759 "<network id> <passphrase> = configure private key passphrase\n"
2761 { "sim", wpa_cli_cmd_sim, NULL,
2762 cli_cmd_flag_sensitive,
2763 "<network id> <pin> = report SIM operation result" },
2764 { "bssid", wpa_cli_cmd_bssid, NULL,
2766 "<network id> <BSSID> = set preferred BSSID for an SSID" },
2767 { "blacklist", wpa_cli_cmd_blacklist, wpa_cli_complete_bss,
2769 "<BSSID> = add a BSSID to the blacklist\n"
2770 "blacklist clear = clear the blacklist\n"
2771 "blacklist = display the blacklist" },
2772 { "log_level", wpa_cli_cmd_log_level, NULL,
2774 "<level> [<timestamp>] = update the log level/timestamp\n"
2775 "log_level = display the current log level and log options" },
2776 { "list_networks", wpa_cli_cmd_list_networks, NULL,
2778 "= list configured networks" },
2779 { "select_network", wpa_cli_cmd_select_network, NULL,
2781 "<network id> = select a network (disable others)" },
2782 { "enable_network", wpa_cli_cmd_enable_network, NULL,
2784 "<network id> = enable a network" },
2785 { "disable_network", wpa_cli_cmd_disable_network, NULL,
2787 "<network id> = disable a network" },
2788 { "add_network", wpa_cli_cmd_add_network, NULL,
2790 "= add a network" },
2791 { "remove_network", wpa_cli_cmd_remove_network, NULL,
2793 "<network id> = remove a network" },
2794 { "set_network", wpa_cli_cmd_set_network, NULL,
2795 cli_cmd_flag_sensitive,
2796 "<network id> <variable> <value> = set network variables (shows\n"
2797 " list of variables when run without arguments)" },
2798 { "get_network", wpa_cli_cmd_get_network, NULL,
2800 "<network id> <variable> = get network variables" },
2801 { "dup_network", wpa_cli_cmd_dup_network, NULL,
2803 "<src network id> <dst network id> <variable> = duplicate network variables"
2805 { "list_creds", wpa_cli_cmd_list_creds, NULL,
2807 "= list configured credentials" },
2808 { "add_cred", wpa_cli_cmd_add_cred, NULL,
2810 "= add a credential" },
2811 { "remove_cred", wpa_cli_cmd_remove_cred, NULL,
2813 "<cred id> = remove a credential" },
2814 { "set_cred", wpa_cli_cmd_set_cred, NULL,
2815 cli_cmd_flag_sensitive,
2816 "<cred id> <variable> <value> = set credential variables" },
2817 { "get_cred", wpa_cli_cmd_get_cred, NULL,
2819 "<cred id> <variable> = get credential variables" },
2820 { "save_config", wpa_cli_cmd_save_config, NULL,
2822 "= save the current configuration" },
2823 { "disconnect", wpa_cli_cmd_disconnect, NULL,
2825 "= disconnect and wait for reassociate/reconnect command before\n"
2827 { "reconnect", wpa_cli_cmd_reconnect, NULL,
2829 "= like reassociate, but only takes effect if already disconnected"
2831 { "scan", wpa_cli_cmd_scan, NULL,
2833 "= request new BSS scan" },
2834 { "scan_results", wpa_cli_cmd_scan_results, NULL,
2836 "= get latest scan results" },
2837 { "bss", wpa_cli_cmd_bss, wpa_cli_complete_bss,
2839 "<<idx> | <bssid>> = get detailed scan result info" },
2840 { "get_capability", wpa_cli_cmd_get_capability, NULL,
2842 "<eap/pairwise/group/key_mgmt/proto/auth_alg/channels/freq/modes> "
2843 "= get capabilies" },
2844 { "reconfigure", wpa_cli_cmd_reconfigure, NULL,
2846 "= force wpa_supplicant to re-read its configuration file" },
2847 { "terminate", wpa_cli_cmd_terminate, NULL,
2849 "= terminate wpa_supplicant" },
2850 { "interface_add", wpa_cli_cmd_interface_add, NULL,
2852 "<ifname> <confname> <driver> <ctrl_interface> <driver_param>\n"
2853 " <bridge_name> = adds new interface, all parameters but <ifname>\n"
2855 { "interface_remove", wpa_cli_cmd_interface_remove, NULL,
2857 "<ifname> = removes the interface" },
2858 { "interface_list", wpa_cli_cmd_interface_list, NULL,
2860 "= list available interfaces" },
2861 { "ap_scan", wpa_cli_cmd_ap_scan, NULL,
2863 "<value> = set ap_scan parameter" },
2864 { "scan_interval", wpa_cli_cmd_scan_interval, NULL,
2866 "<value> = set scan_interval parameter (in seconds)" },
2867 { "bss_expire_age", wpa_cli_cmd_bss_expire_age, NULL,
2869 "<value> = set BSS expiration age parameter" },
2870 { "bss_expire_count", wpa_cli_cmd_bss_expire_count, NULL,
2872 "<value> = set BSS expiration scan count parameter" },
2873 { "bss_flush", wpa_cli_cmd_bss_flush, NULL,
2875 "<value> = set BSS flush age (0 by default)" },
2876 { "stkstart", wpa_cli_cmd_stkstart, NULL,
2878 "<addr> = request STK negotiation with <addr>" },
2879 { "ft_ds", wpa_cli_cmd_ft_ds, wpa_cli_complete_bss,
2881 "<addr> = request over-the-DS FT with <addr>" },
2882 { "wps_pbc", wpa_cli_cmd_wps_pbc, wpa_cli_complete_bss,
2884 "[BSSID] = start Wi-Fi Protected Setup: Push Button Configuration" },
2885 { "wps_pin", wpa_cli_cmd_wps_pin, wpa_cli_complete_bss,
2886 cli_cmd_flag_sensitive,
2887 "<BSSID> [PIN] = start WPS PIN method (returns PIN, if not "
2889 { "wps_check_pin", wpa_cli_cmd_wps_check_pin, NULL,
2890 cli_cmd_flag_sensitive,
2891 "<PIN> = verify PIN checksum" },
2892 { "wps_cancel", wpa_cli_cmd_wps_cancel, NULL, cli_cmd_flag_none,
2893 "Cancels the pending WPS operation" },
2894 #ifdef CONFIG_WPS_NFC
2895 { "wps_nfc", wpa_cli_cmd_wps_nfc, wpa_cli_complete_bss,
2897 "[BSSID] = start Wi-Fi Protected Setup: NFC" },
2898 { "wps_nfc_config_token", wpa_cli_cmd_wps_nfc_config_token, NULL,
2900 "<WPS|NDEF> = build configuration token" },
2901 { "wps_nfc_token", wpa_cli_cmd_wps_nfc_token, NULL,
2903 "<WPS|NDEF> = create password token" },
2904 { "wps_nfc_tag_read", wpa_cli_cmd_wps_nfc_tag_read, NULL,
2905 cli_cmd_flag_sensitive,
2906 "<hexdump of payload> = report read NFC tag with WPS data" },
2907 { "nfc_get_handover_req", wpa_cli_cmd_nfc_get_handover_req, NULL,
2909 "<NDEF> <WPS> = create NFC handover request" },
2910 { "nfc_get_handover_sel", wpa_cli_cmd_nfc_get_handover_sel, NULL,
2912 "<NDEF> <WPS> = create NFC handover select" },
2913 { "nfc_report_handover", wpa_cli_cmd_nfc_report_handover, NULL,
2915 "<role> <type> <hexdump of req> <hexdump of sel> = report completed "
2917 #endif /* CONFIG_WPS_NFC */
2918 { "wps_reg", wpa_cli_cmd_wps_reg, wpa_cli_complete_bss,
2919 cli_cmd_flag_sensitive,
2920 "<BSSID> <AP PIN> = start WPS Registrar to configure an AP" },
2921 { "wps_ap_pin", wpa_cli_cmd_wps_ap_pin, NULL,
2922 cli_cmd_flag_sensitive,
2923 "[params..] = enable/disable AP PIN" },
2924 { "wps_er_start", wpa_cli_cmd_wps_er_start, NULL,
2926 "[IP address] = start Wi-Fi Protected Setup External Registrar" },
2927 { "wps_er_stop", wpa_cli_cmd_wps_er_stop, NULL,
2929 "= stop Wi-Fi Protected Setup External Registrar" },
2930 { "wps_er_pin", wpa_cli_cmd_wps_er_pin, NULL,
2931 cli_cmd_flag_sensitive,
2932 "<UUID> <PIN> = add an Enrollee PIN to External Registrar" },
2933 { "wps_er_pbc", wpa_cli_cmd_wps_er_pbc, NULL,
2935 "<UUID> = accept an Enrollee PBC using External Registrar" },
2936 { "wps_er_learn", wpa_cli_cmd_wps_er_learn, NULL,
2937 cli_cmd_flag_sensitive,
2938 "<UUID> <PIN> = learn AP configuration" },
2939 { "wps_er_set_config", wpa_cli_cmd_wps_er_set_config, NULL,
2941 "<UUID> <network id> = set AP configuration for enrolling" },
2942 { "wps_er_config", wpa_cli_cmd_wps_er_config, NULL,
2943 cli_cmd_flag_sensitive,
2944 "<UUID> <PIN> <SSID> <auth> <encr> <key> = configure AP" },
2945 #ifdef CONFIG_WPS_NFC
2946 { "wps_er_nfc_config_token", wpa_cli_cmd_wps_er_nfc_config_token, NULL,
2948 "<WPS/NDEF> <UUID> = build NFC configuration token" },
2949 #endif /* CONFIG_WPS_NFC */
2950 { "ibss_rsn", wpa_cli_cmd_ibss_rsn, NULL,
2952 "<addr> = request RSN authentication with <addr> in IBSS" },
2954 { "sta", wpa_cli_cmd_sta, NULL,
2956 "<addr> = get information about an associated station (AP)" },
2957 { "all_sta", wpa_cli_cmd_all_sta, NULL,
2959 "= get information about all associated stations (AP)" },
2960 { "deauthenticate", wpa_cli_cmd_deauthenticate, NULL,
2962 "<addr> = deauthenticate a station" },
2963 { "disassociate", wpa_cli_cmd_disassociate, NULL,
2965 "<addr> = disassociate a station" },
2966 { "chan_switch", wpa_cli_cmd_chanswitch, NULL,
2968 "<cs_count> <freq> [sec_channel_offset=] [center_freq1=]"
2969 " [center_freq2=] [bandwidth=] [blocktx] [ht|vht]"
2970 " = CSA parameters" },
2971 #endif /* CONFIG_AP */
2972 { "suspend", wpa_cli_cmd_suspend, NULL, cli_cmd_flag_none,
2973 "= notification of suspend/hibernate" },
2974 { "resume", wpa_cli_cmd_resume, NULL, cli_cmd_flag_none,
2975 "= notification of resume/thaw" },
2976 #ifdef CONFIG_TESTING_OPTIONS
2977 { "drop_sa", wpa_cli_cmd_drop_sa, NULL, cli_cmd_flag_none,
2978 "= drop SA without deauth/disassoc (test command)" },
2979 #endif /* CONFIG_TESTING_OPTIONS */
2980 { "roam", wpa_cli_cmd_roam, wpa_cli_complete_bss,
2982 "<addr> = roam to the specified BSS" },
2984 { "mesh_interface_add", wpa_cli_cmd_mesh_interface_add, NULL,
2986 "[ifname] = Create a new mesh interface" },
2987 { "mesh_group_add", wpa_cli_cmd_mesh_group_add, NULL,
2989 "<network id> = join a mesh network (disable others)" },
2990 { "mesh_group_remove", wpa_cli_cmd_mesh_group_remove, NULL,
2992 "<ifname> = Remove mesh group interface" },
2993 #endif /* CONFIG_MESH */
2995 { "p2p_find", wpa_cli_cmd_p2p_find, wpa_cli_complete_p2p_find,
2997 "[timeout] [type=*] = find P2P Devices for up-to timeout seconds" },
2998 { "p2p_stop_find", wpa_cli_cmd_p2p_stop_find, NULL, cli_cmd_flag_none,
2999 "= stop P2P Devices search" },
3000 { "p2p_asp_provision", wpa_cli_cmd_p2p_asp_provision, NULL,
3002 "<addr> adv_id=<adv_id> conncap=<conncap> [info=<infodata>] = provision with a P2P ASP Device" },
3003 { "p2p_asp_provision_resp", wpa_cli_cmd_p2p_asp_provision_resp, NULL,
3005 "<addr> adv_id=<adv_id> [role<conncap>] [info=<infodata>] = provision with a P2P ASP Device" },
3006 { "p2p_connect", wpa_cli_cmd_p2p_connect, wpa_cli_complete_p2p_connect,
3008 "<addr> <\"pbc\"|PIN> [ht40] = connect to a P2P Device" },
3009 { "p2p_listen", wpa_cli_cmd_p2p_listen, NULL, cli_cmd_flag_none,
3010 "[timeout] = listen for P2P Devices for up-to timeout seconds" },
3011 { "p2p_group_remove", wpa_cli_cmd_p2p_group_remove,
3012 wpa_cli_complete_p2p_group_remove, cli_cmd_flag_none,
3013 "<ifname> = remove P2P group interface (terminate group if GO)" },
3014 { "p2p_group_add", wpa_cli_cmd_p2p_group_add, NULL, cli_cmd_flag_none,
3015 "[ht40] = add a new P2P group (local end as GO)" },
3016 { "p2p_prov_disc", wpa_cli_cmd_p2p_prov_disc,
3017 wpa_cli_complete_p2p_peer, cli_cmd_flag_none,
3018 "<addr> <method> = request provisioning discovery" },
3019 { "p2p_get_passphrase", wpa_cli_cmd_p2p_get_passphrase, NULL,
3021 "= get the passphrase for a group (GO only)" },
3022 { "p2p_serv_disc_req", wpa_cli_cmd_p2p_serv_disc_req,
3023 wpa_cli_complete_p2p_peer, cli_cmd_flag_none,
3024 "<addr> <TLVs> = schedule service discovery request" },
3025 { "p2p_serv_disc_cancel_req", wpa_cli_cmd_p2p_serv_disc_cancel_req,
3026 NULL, cli_cmd_flag_none,
3027 "<id> = cancel pending service discovery request" },
3028 { "p2p_serv_disc_resp", wpa_cli_cmd_p2p_serv_disc_resp, NULL,
3030 "<freq> <addr> <dialog token> <TLVs> = service discovery response" },
3031 { "p2p_service_update", wpa_cli_cmd_p2p_service_update, NULL,
3033 "= indicate change in local services" },
3034 { "p2p_serv_disc_external", wpa_cli_cmd_p2p_serv_disc_external, NULL,
3036 "<external> = set external processing of service discovery" },
3037 { "p2p_service_flush", wpa_cli_cmd_p2p_service_flush, NULL,
3039 "= remove all stored service entries" },
3040 { "p2p_service_add", wpa_cli_cmd_p2p_service_add, NULL,
3042 "<bonjour|upnp|asp> <query|version> <response|service> = add a local "
3044 { "p2p_service_rep", wpa_cli_cmd_p2p_service_rep, NULL,
3046 "asp <auto> <adv_id> <svc_state> <svc_string> [<svc_info>] = replace "
3047 "local ASP service" },
3048 { "p2p_service_del", wpa_cli_cmd_p2p_service_del, NULL,
3050 "<bonjour|upnp> <query|version> [|service] = remove a local "
3052 { "p2p_reject", wpa_cli_cmd_p2p_reject, wpa_cli_complete_p2p_peer,
3054 "<addr> = reject connection attempts from a specific peer" },
3055 { "p2p_invite", wpa_cli_cmd_p2p_invite, NULL,
3057 "<cmd> [peer=addr] = invite peer" },
3058 { "p2p_peers", wpa_cli_cmd_p2p_peers, NULL, cli_cmd_flag_none,
3059 "[discovered] = list known (optionally, only fully discovered) P2P "
3061 { "p2p_peer", wpa_cli_cmd_p2p_peer, wpa_cli_complete_p2p_peer,
3063 "<address> = show information about known P2P peer" },
3064 { "p2p_set", wpa_cli_cmd_p2p_set, wpa_cli_complete_p2p_set,
3066 "<field> <value> = set a P2P parameter" },
3067 { "p2p_flush", wpa_cli_cmd_p2p_flush, NULL, cli_cmd_flag_none,
3068 "= flush P2P state" },
3069 { "p2p_cancel", wpa_cli_cmd_p2p_cancel, NULL, cli_cmd_flag_none,
3070 "= cancel P2P group formation" },
3071 { "p2p_unauthorize", wpa_cli_cmd_p2p_unauthorize,
3072 wpa_cli_complete_p2p_peer, cli_cmd_flag_none,
3073 "<address> = unauthorize a peer" },
3074 { "p2p_presence_req", wpa_cli_cmd_p2p_presence_req, NULL,
3076 "[<duration> <interval>] [<duration> <interval>] = request GO "
3078 { "p2p_ext_listen", wpa_cli_cmd_p2p_ext_listen, NULL,
3080 "[<period> <interval>] = set extended listen timing" },
3081 { "p2p_remove_client", wpa_cli_cmd_p2p_remove_client,
3082 wpa_cli_complete_p2p_peer, cli_cmd_flag_none,
3083 "<address|iface=address> = remove a peer from all groups" },
3084 #endif /* CONFIG_P2P */
3085 #ifdef CONFIG_WIFI_DISPLAY
3086 { "wfd_subelem_set", wpa_cli_cmd_wfd_subelem_set, NULL,
3088 "<subelem> [contents] = set Wi-Fi Display subelement" },
3089 { "wfd_subelem_get", wpa_cli_cmd_wfd_subelem_get, NULL,
3091 "<subelem> = get Wi-Fi Display subelement" },
3092 #endif /* CONFIG_WIFI_DISPLAY */
3093 #ifdef CONFIG_INTERWORKING
3094 { "fetch_anqp", wpa_cli_cmd_fetch_anqp, NULL, cli_cmd_flag_none,
3095 "= fetch ANQP information for all APs" },
3096 { "stop_fetch_anqp", wpa_cli_cmd_stop_fetch_anqp, NULL,
3098 "= stop fetch_anqp operation" },
3099 { "interworking_select", wpa_cli_cmd_interworking_select, NULL,
3101 "[auto] = perform Interworking network selection" },
3102 { "interworking_connect", wpa_cli_cmd_interworking_connect,
3103 wpa_cli_complete_bss, cli_cmd_flag_none,
3104 "<BSSID> = connect using Interworking credentials" },
3105 { "interworking_add_network", wpa_cli_cmd_interworking_add_network,
3106 wpa_cli_complete_bss, cli_cmd_flag_none,
3107 "<BSSID> = connect using Interworking credentials" },
3108 { "anqp_get", wpa_cli_cmd_anqp_get, wpa_cli_complete_bss,
3110 "<addr> <info id>[,<info id>]... = request ANQP information" },
3111 { "gas_request", wpa_cli_cmd_gas_request, wpa_cli_complete_bss,
3113 "<addr> <AdvProtoID> [QueryReq] = GAS request" },
3114 { "gas_response_get", wpa_cli_cmd_gas_response_get,
3115 wpa_cli_complete_bss, cli_cmd_flag_none,
3116 "<addr> <dialog token> [start,len] = Fetch last GAS response" },
3117 #endif /* CONFIG_INTERWORKING */
3119 { "hs20_anqp_get", wpa_cli_cmd_hs20_anqp_get, wpa_cli_complete_bss,
3121 "<addr> <subtype>[,<subtype>]... = request HS 2.0 ANQP information"
3123 { "nai_home_realm_list", wpa_cli_cmd_get_nai_home_realm_list,
3124 wpa_cli_complete_bss, cli_cmd_flag_none,
3125 "<addr> <home realm> = get HS20 nai home realm list" },
3126 { "hs20_icon_request", wpa_cli_cmd_hs20_icon_request,
3127 wpa_cli_complete_bss, cli_cmd_flag_none,
3128 "<addr> <icon name> = get Hotspot 2.0 OSU icon" },
3129 { "fetch_osu", wpa_cli_cmd_fetch_osu, NULL, cli_cmd_flag_none,
3130 "= fetch OSU provider information from all APs" },
3131 { "cancel_fetch_osu", wpa_cli_cmd_cancel_fetch_osu, NULL,
3133 "= cancel fetch_osu command" },
3134 #endif /* CONFIG_HS20 */
3135 { "sta_autoconnect", wpa_cli_cmd_sta_autoconnect, NULL,
3137 "<0/1> = disable/enable automatic reconnection" },
3138 { "tdls_discover", wpa_cli_cmd_tdls_discover, NULL,
3140 "<addr> = request TDLS discovery with <addr>" },
3141 { "tdls_setup", wpa_cli_cmd_tdls_setup, NULL,
3143 "<addr> = request TDLS setup with <addr>" },
3144 { "tdls_teardown", wpa_cli_cmd_tdls_teardown, NULL,
3146 "<addr> = tear down TDLS with <addr>" },
3147 { "wmm_ac_addts", wpa_cli_cmd_wmm_ac_addts, NULL,
3149 "<uplink/downlink/bidi> <tsid=0..7> <up=0..7> [nominal_msdu_size=#] "
3150 "[mean_data_rate=#] [min_phy_rate=#] [sba=#] [fixed_nominal_msdu] "
3151 "= add WMM-AC traffic stream" },
3152 { "wmm_ac_delts", wpa_cli_cmd_wmm_ac_delts, NULL,
3154 "<tsid> = delete WMM-AC traffic stream" },
3155 { "wmm_ac_status", wpa_cli_cmd_wmm_ac_status, NULL,
3157 "= show status for Wireless Multi-Media Admission-Control" },
3158 { "tdls_chan_switch", wpa_cli_cmd_tdls_chan_switch, NULL,
3160 "<addr> <oper class> <freq> [sec_channel_offset=] [center_freq1=] "
3161 "[center_freq2=] [bandwidth=] [ht|vht] = enable channel switching "
3163 { "tdls_cancel_chan_switch", wpa_cli_cmd_tdls_cancel_chan_switch, NULL,
3165 "<addr> = disable channel switching with TDLS peer <addr>" },
3166 { "signal_poll", wpa_cli_cmd_signal_poll, NULL,
3168 "= get signal parameters" },
3169 { "pktcnt_poll", wpa_cli_cmd_pktcnt_poll, NULL,
3171 "= get TX/RX packet counters" },
3172 { "reauthenticate", wpa_cli_cmd_reauthenticate, NULL,
3174 "= trigger IEEE 802.1X/EAPOL reauthentication" },
3175 #ifdef CONFIG_AUTOSCAN
3176 { "autoscan", wpa_cli_cmd_autoscan, NULL, cli_cmd_flag_none,
3177 "[params] = Set or unset (if none) autoscan parameters" },
3178 #endif /* CONFIG_AUTOSCAN */
3180 { "wnm_sleep", wpa_cli_cmd_wnm_sleep, NULL, cli_cmd_flag_none,
3181 "<enter/exit> [interval=#] = enter/exit WNM-Sleep mode" },
3182 { "wnm_bss_query", wpa_cli_cmd_wnm_bss_query, NULL, cli_cmd_flag_none,
3183 "<query reason> = Send BSS Transition Management Query" },
3184 #endif /* CONFIG_WNM */
3185 { "raw", wpa_cli_cmd_raw, NULL, cli_cmd_flag_sensitive,
3186 "<params..> = Sent unprocessed command" },
3187 { "flush", wpa_cli_cmd_flush, NULL, cli_cmd_flag_none,
3188 "= flush wpa_supplicant state" },
3190 { "driver", wpa_cli_cmd_driver, NULL, cli_cmd_flag_none,
3191 "<command> = driver private commands" },
3192 #endif /* ANDROID */
3193 { "radio_work", wpa_cli_cmd_radio_work, NULL, cli_cmd_flag_none,
3194 "= radio_work <show/add/done>" },
3195 { "vendor", wpa_cli_cmd_vendor, NULL, cli_cmd_flag_none,
3196 "<vendor id> <command id> [<hex formatted command argument>] = Send vendor command"
3198 { "neighbor_rep_request",
3199 wpa_cli_cmd_neighbor_rep_request, NULL, cli_cmd_flag_none,
3200 "[ssid=<SSID>] = Trigger request to AP for neighboring AP report "
3201 "(with optional given SSID, default: current SSID)"
3203 { "erp_flush", wpa_cli_cmd_erp_flush, NULL, cli_cmd_flag_none,
3204 "= flush ERP keys" },
3206 wpa_cli_cmd_mac_rand_scan, NULL, cli_cmd_flag_none,
3207 "<scan|sched|pno|all> enable=<0/1> [addr=mac-address "
3208 "mask=mac-address-mask] = scan MAC randomization"
3210 { NULL, NULL, NULL, cli_cmd_flag_none, NULL }
3215 * Prints command usage, lines are padded with the specified string.
3217 static void print_cmd_help(struct wpa_cli_cmd *cmd, const char *pad)
3222 printf("%s%s ", pad, cmd->cmd);
3223 for (n = 0; (c = cmd->usage[n]); n++) {
3232 static void print_help(const char *cmd)
3235 printf("commands:\n");
3236 for (n = 0; wpa_cli_commands[n].cmd; n++) {
3237 if (cmd == NULL || str_starts(wpa_cli_commands[n].cmd, cmd))
3238 print_cmd_help(&wpa_cli_commands[n], " ");
3243 static int wpa_cli_edit_filter_history_cb(void *ctx, const char *cmd)
3245 const char *c, *delim;
3249 delim = os_strchr(cmd, ' ');
3253 len = os_strlen(cmd);
3255 for (n = 0; (c = wpa_cli_commands[n].cmd); n++) {
3256 if (os_strncasecmp(cmd, c, len) == 0 && len == os_strlen(c))
3257 return (wpa_cli_commands[n].flags &
3258 cli_cmd_flag_sensitive);
3264 static char ** wpa_list_cmd_list(void)
3268 struct cli_txt_entry *e;
3270 count = ARRAY_SIZE(wpa_cli_commands);
3271 count += dl_list_len(&p2p_groups);
3272 count += dl_list_len(&ifnames);
3273 res = os_calloc(count + 1, sizeof(char *));
3277 for (i = 0; wpa_cli_commands[i].cmd; i++) {
3278 res[i] = os_strdup(wpa_cli_commands[i].cmd);
3283 dl_list_for_each(e, &p2p_groups, struct cli_txt_entry, list) {
3284 size_t len = 8 + os_strlen(e->txt);
3285 res[i] = os_malloc(len);
3288 os_snprintf(res[i], len, "ifname=%s", e->txt);
3292 dl_list_for_each(e, &ifnames, struct cli_txt_entry, list) {
3293 res[i] = os_strdup(e->txt);
3303 static char ** wpa_cli_cmd_completion(const char *cmd, const char *str,
3308 for (i = 0; wpa_cli_commands[i].cmd; i++) {
3309 if (os_strcasecmp(wpa_cli_commands[i].cmd, cmd) == 0) {
3310 if (wpa_cli_commands[i].completion)
3311 return wpa_cli_commands[i].completion(str,
3314 printf("\r%s\n", wpa_cli_commands[i].usage);
3324 static char ** wpa_cli_edit_completion_cb(void *ctx, const char *str, int pos)
3330 if (pos > 7 && os_strncasecmp(str, "IFNAME=", 7) == 0) {
3331 end = os_strchr(str, ' ');
3332 if (end && pos > end - str) {
3333 pos -= end - str + 1;
3338 end = os_strchr(str, ' ');
3339 if (end == NULL || str + pos < end)
3340 return wpa_list_cmd_list();
3342 cmd = os_malloc(pos + 1);
3345 os_memcpy(cmd, str, pos);
3346 cmd[end - str] = '\0';
3347 res = wpa_cli_cmd_completion(cmd, str, pos);
3353 static int wpa_request(struct wpa_ctrl *ctrl, int argc, char *argv[])
3355 struct wpa_cli_cmd *cmd, *match = NULL;
3359 if (argc > 1 && os_strncasecmp(argv[0], "IFNAME=", 7) == 0) {
3360 ifname_prefix = argv[0] + 7;
3364 ifname_prefix = NULL;
3370 cmd = wpa_cli_commands;
3372 if (os_strncasecmp(cmd->cmd, argv[0], os_strlen(argv[0])) == 0)
3375 if (os_strcasecmp(cmd->cmd, argv[0]) == 0) {
3376 /* we have an exact match */
3386 printf("Ambiguous command '%s'; possible commands:", argv[0]);
3387 cmd = wpa_cli_commands;
3389 if (os_strncasecmp(cmd->cmd, argv[0],
3390 os_strlen(argv[0])) == 0) {
3391 printf(" %s", cmd->cmd);
3397 } else if (count == 0) {
3398 printf("Unknown command '%s'\n", argv[0]);
3401 ret = match->handler(ctrl, argc - 1, &argv[1]);
3408 static int str_match(const char *a, const char *b)
3410 return os_strncmp(a, b, os_strlen(b)) == 0;
3414 static int wpa_cli_exec(const char *program, const char *arg1,
3421 len = os_strlen(arg1) + os_strlen(arg2) + 2;
3422 arg = os_malloc(len);
3425 os_snprintf(arg, len, "%s %s", arg1, arg2);
3426 res = os_exec(program, arg, 1);
3433 static void wpa_cli_action_process(const char *msg)
3436 char *copy = NULL, *id, *pos2;
3437 const char *ifname = ctrl_ifname;
3438 char ifname_buf[100];
3441 if (os_strncmp(pos, "IFNAME=", 7) == 0) {
3443 end = os_strchr(pos + 7, ' ');
3444 if (end && (unsigned int) (end - pos) < sizeof(ifname_buf)) {
3446 os_memcpy(ifname_buf, pos, end - pos);
3447 ifname_buf[end - pos] = '\0';
3448 ifname = ifname_buf;
3453 const char *prev = pos;
3455 pos = os_strchr(pos, '>');
3462 if (str_match(pos, WPA_EVENT_CONNECTED)) {
3464 os_unsetenv("WPA_ID");
3465 os_unsetenv("WPA_ID_STR");
3466 os_unsetenv("WPA_CTRL_DIR");
3468 pos = os_strstr(pos, "[id=");
3470 copy = os_strdup(pos + 4);
3474 while (*pos2 && *pos2 != ' ')
3478 os_setenv("WPA_ID", id, 1);
3479 while (*pos2 && *pos2 != '=')
3484 while (*pos2 && *pos2 != ']')
3487 os_setenv("WPA_ID_STR", id, 1);
3491 os_setenv("WPA_CTRL_DIR", ctrl_iface_dir, 1);
3493 if (wpa_cli_connected <= 0 || new_id != wpa_cli_last_id) {
3494 wpa_cli_connected = 1;
3495 wpa_cli_last_id = new_id;
3496 wpa_cli_exec(action_file, ifname, "CONNECTED");
3498 } else if (str_match(pos, WPA_EVENT_DISCONNECTED)) {
3499 if (wpa_cli_connected) {
3500 wpa_cli_connected = 0;
3501 wpa_cli_exec(action_file, ifname, "DISCONNECTED");
3503 } else if (str_match(pos, MESH_GROUP_STARTED)) {
3504 wpa_cli_exec(action_file, ctrl_ifname, pos);
3505 } else if (str_match(pos, MESH_GROUP_REMOVED)) {
3506 wpa_cli_exec(action_file, ctrl_ifname, pos);
3507 } else if (str_match(pos, MESH_PEER_CONNECTED)) {
3508 wpa_cli_exec(action_file, ctrl_ifname, pos);
3509 } else if (str_match(pos, MESH_PEER_DISCONNECTED)) {
3510 wpa_cli_exec(action_file, ctrl_ifname, pos);
3511 } else if (str_match(pos, P2P_EVENT_GROUP_STARTED)) {
3512 wpa_cli_exec(action_file, ifname, pos);
3513 } else if (str_match(pos, P2P_EVENT_GROUP_REMOVED)) {
3514 wpa_cli_exec(action_file, ifname, pos);
3515 } else if (str_match(pos, P2P_EVENT_CROSS_CONNECT_ENABLE)) {
3516 wpa_cli_exec(action_file, ifname, pos);
3517 } else if (str_match(pos, P2P_EVENT_CROSS_CONNECT_DISABLE)) {
3518 wpa_cli_exec(action_file, ifname, pos);
3519 } else if (str_match(pos, P2P_EVENT_GO_NEG_FAILURE)) {
3520 wpa_cli_exec(action_file, ifname, pos);
3521 } else if (str_match(pos, WPS_EVENT_SUCCESS)) {
3522 wpa_cli_exec(action_file, ifname, pos);
3523 } else if (str_match(pos, WPS_EVENT_FAIL)) {
3524 wpa_cli_exec(action_file, ifname, pos);
3525 } else if (str_match(pos, AP_STA_CONNECTED)) {
3526 wpa_cli_exec(action_file, ifname, pos);
3527 } else if (str_match(pos, AP_STA_DISCONNECTED)) {
3528 wpa_cli_exec(action_file, ifname, pos);
3529 } else if (str_match(pos, ESS_DISASSOC_IMMINENT)) {
3530 wpa_cli_exec(action_file, ifname, pos);
3531 } else if (str_match(pos, HS20_SUBSCRIPTION_REMEDIATION)) {
3532 wpa_cli_exec(action_file, ifname, pos);
3533 } else if (str_match(pos, HS20_DEAUTH_IMMINENT_NOTICE)) {
3534 wpa_cli_exec(action_file, ifname, pos);
3535 } else if (str_match(pos, WPA_EVENT_TERMINATING)) {
3536 printf("wpa_supplicant is terminating - stop monitoring\n");
3542 #ifndef CONFIG_ANSI_C_EXTRA
3543 static void wpa_cli_action_cb(char *msg, size_t len)
3545 wpa_cli_action_process(msg);
3547 #endif /* CONFIG_ANSI_C_EXTRA */
3550 static void wpa_cli_reconnect(void)
3552 wpa_cli_close_connection();
3553 if (wpa_cli_open_connection(ctrl_ifname, 1) < 0)
3558 printf("\rConnection to wpa_supplicant re-established\n");
3564 static void cli_event(const char *str)
3566 const char *start, *s;
3568 start = os_strchr(str, '>');
3574 if (str_starts(start, WPA_EVENT_BSS_ADDED)) {
3575 s = os_strchr(start, ' ');
3578 s = os_strchr(s + 1, ' ');
3581 cli_txt_list_add(&bsses, s + 1);
3585 if (str_starts(start, WPA_EVENT_BSS_REMOVED)) {
3586 s = os_strchr(start, ' ');
3589 s = os_strchr(s + 1, ' ');
3592 cli_txt_list_del_addr(&bsses, s + 1);
3597 if (str_starts(start, P2P_EVENT_DEVICE_FOUND)) {
3598 s = os_strstr(start, " p2p_dev_addr=");
3601 cli_txt_list_add_addr(&p2p_peers, s + 14);
3605 if (str_starts(start, P2P_EVENT_DEVICE_LOST)) {
3606 s = os_strstr(start, " p2p_dev_addr=");
3609 cli_txt_list_del_addr(&p2p_peers, s + 14);
3613 if (str_starts(start, P2P_EVENT_GROUP_STARTED)) {
3614 s = os_strchr(start, ' ');
3617 cli_txt_list_add_word(&p2p_groups, s + 1);
3621 if (str_starts(start, P2P_EVENT_GROUP_REMOVED)) {
3622 s = os_strchr(start, ' ');
3625 cli_txt_list_del_word(&p2p_groups, s + 1);
3628 #endif /* CONFIG_P2P */
3632 static int check_terminating(const char *msg)
3634 const char *pos = msg;
3638 pos = os_strchr(pos, '>');
3645 if (str_match(pos, WPA_EVENT_TERMINATING) && ctrl_conn) {
3647 printf("\rConnection to wpa_supplicant lost - trying to "
3650 wpa_cli_attached = 0;
3651 wpa_cli_close_connection();
3659 static void wpa_cli_recv_pending(struct wpa_ctrl *ctrl, int action_monitor)
3661 if (ctrl_conn == NULL) {
3662 wpa_cli_reconnect();
3665 while (wpa_ctrl_pending(ctrl) > 0) {
3667 size_t len = sizeof(buf) - 1;
3668 if (wpa_ctrl_recv(ctrl, buf, &len) == 0) {
3671 wpa_cli_action_process(buf);
3674 if (wpa_cli_show_event(buf)) {
3676 printf("\r%s\n", buf);
3680 if (interactive && check_terminating(buf) > 0)
3684 printf("Could not read pending message.\n");
3689 if (wpa_ctrl_pending(ctrl) < 0) {
3690 printf("Connection to wpa_supplicant lost - trying to "
3692 wpa_cli_reconnect();
3698 static int tokenize_cmd(char *cmd, char *argv[])
3711 if (argc == max_args)
3714 char *pos2 = os_strrchr(pos, '"');
3718 while (*pos != '\0' && *pos != ' ')
3728 static void wpa_cli_ping(void *eloop_ctx, void *timeout_ctx)
3732 char *prefix = ifname_prefix;
3734 ifname_prefix = NULL;
3735 res = _wpa_ctrl_command(ctrl_conn, "PING", 0);
3736 ifname_prefix = prefix;
3738 printf("Connection to wpa_supplicant lost - trying to "
3740 wpa_cli_close_connection();
3744 wpa_cli_reconnect();
3745 eloop_register_timeout(ping_interval, 0, wpa_cli_ping, NULL, NULL);
3749 static void wpa_cli_mon_receive(int sock, void *eloop_ctx, void *sock_ctx)
3751 wpa_cli_recv_pending(mon_conn, 0);
3755 static void wpa_cli_edit_cmd_cb(void *ctx, char *cmd)
3757 char *argv[max_args];
3759 argc = tokenize_cmd(cmd, argv);
3761 wpa_request(ctrl_conn, argc, argv);
3765 static void wpa_cli_edit_eof_cb(void *ctx)
3771 static int warning_displayed = 0;
3772 static char *hfile = NULL;
3773 static int edit_started = 0;
3775 static void start_edit(void)
3780 #ifdef CONFIG_CTRL_IFACE_UDP_REMOTE
3781 ps = wpa_ctrl_get_remote_ifname(ctrl_conn);
3782 #endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */
3784 #ifdef CONFIG_WPA_CLI_HISTORY_DIR
3785 home = CONFIG_WPA_CLI_HISTORY_DIR;
3786 #else /* CONFIG_WPA_CLI_HISTORY_DIR */
3787 home = getenv("HOME");
3788 #endif /* CONFIG_WPA_CLI_HISTORY_DIR */
3790 const char *fname = ".wpa_cli_history";
3791 int hfile_len = os_strlen(home) + 1 + os_strlen(fname) + 1;
3792 hfile = os_malloc(hfile_len);
3794 os_snprintf(hfile, hfile_len, "%s/%s", home, fname);
3797 if (edit_init(wpa_cli_edit_cmd_cb, wpa_cli_edit_eof_cb,
3798 wpa_cli_edit_completion_cb, NULL, hfile, ps) < 0) {
3804 eloop_register_timeout(ping_interval, 0, wpa_cli_ping, NULL, NULL);
3808 static void update_bssid_list(struct wpa_ctrl *ctrl)
3811 size_t len = sizeof(buf);
3813 char *cmd = "BSS RANGE=ALL MASK=0x2";
3818 ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len, NULL);
3825 pos = os_strstr(pos, "bssid=");
3829 end = os_strchr(pos, '\n');
3833 cli_txt_list_add(&bsses, pos);
3839 static void update_ifnames(struct wpa_ctrl *ctrl)
3842 size_t len = sizeof(buf);
3844 char *cmd = "INTERFACES";
3848 cli_txt_list_flush(&ifnames);
3852 ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len, NULL);
3859 end = os_strchr(pos, '\n');
3863 ret = os_snprintf(txt, sizeof(txt), "ifname=%s", pos);
3864 if (!os_snprintf_error(sizeof(txt), ret))
3865 cli_txt_list_add(&ifnames, txt);
3871 static void try_connection(void *eloop_ctx, void *timeout_ctx)
3876 if (ctrl_ifname == NULL)
3877 ctrl_ifname = wpa_cli_get_default_ifname();
3879 if (!wpa_cli_open_connection(ctrl_ifname, 1) == 0) {
3880 if (!warning_displayed) {
3881 printf("Could not connect to wpa_supplicant: "
3883 ctrl_ifname ? ctrl_ifname : "(nil)");
3884 warning_displayed = 1;
3886 eloop_register_timeout(1, 0, try_connection, NULL, NULL);
3890 update_bssid_list(ctrl_conn);
3892 if (warning_displayed)
3893 printf("Connection established.\n");
3900 static void wpa_cli_interactive(void)
3902 printf("\nInteractive mode\n\n");
3904 eloop_register_timeout(0, 0, try_connection, NULL, NULL);
3906 eloop_cancel_timeout(try_connection, NULL, NULL);
3908 cli_txt_list_flush(&p2p_peers);
3909 cli_txt_list_flush(&p2p_groups);
3910 cli_txt_list_flush(&bsses);
3911 cli_txt_list_flush(&ifnames);
3913 edit_deinit(hfile, wpa_cli_edit_filter_history_cb);
3915 eloop_cancel_timeout(wpa_cli_ping, NULL, NULL);
3916 wpa_cli_close_connection();
3920 static void wpa_cli_action(struct wpa_ctrl *ctrl)
3922 #ifdef CONFIG_ANSI_C_EXTRA
3923 /* TODO: ANSI C version(?) */
3924 printf("Action processing not supported in ANSI C build.\n");
3925 #else /* CONFIG_ANSI_C_EXTRA */
3929 char buf[256]; /* note: large enough to fit in unsolicited messages */
3932 fd = wpa_ctrl_get_fd(ctrl);
3934 while (!wpa_cli_quit) {
3937 tv.tv_sec = ping_interval;
3939 res = select(fd + 1, &rfds, NULL, NULL, &tv);
3940 if (res < 0 && errno != EINTR) {
3945 if (FD_ISSET(fd, &rfds))
3946 wpa_cli_recv_pending(ctrl, 1);
3948 /* verify that connection is still working */
3949 len = sizeof(buf) - 1;
3950 if (wpa_ctrl_request(ctrl, "PING", 4, buf, &len,
3951 wpa_cli_action_cb) < 0 ||
3952 len < 4 || os_memcmp(buf, "PONG", 4) != 0) {
3953 printf("wpa_supplicant did not reply to PING "
3954 "command - exiting\n");
3959 #endif /* CONFIG_ANSI_C_EXTRA */
3963 static void wpa_cli_cleanup(void)
3965 wpa_cli_close_connection();
3967 os_daemonize_terminate(pid_file);
3969 os_program_deinit();
3973 static void wpa_cli_terminate(int sig, void *ctx)
3979 static char * wpa_cli_get_default_ifname(void)
3981 char *ifname = NULL;
3983 #ifdef CONFIG_CTRL_IFACE_UNIX
3984 struct dirent *dent;
3985 DIR *dir = opendir(ctrl_iface_dir);
3988 char ifprop[PROPERTY_VALUE_MAX];
3989 if (property_get("wifi.interface", ifprop, NULL) != 0) {
3990 ifname = os_strdup(ifprop);
3991 printf("Using interface '%s'\n", ifname);
3994 #endif /* ANDROID */
3997 while ((dent = readdir(dir))) {
3998 #ifdef _DIRENT_HAVE_D_TYPE
4000 * Skip the file if it is not a socket. Also accept
4001 * DT_UNKNOWN (0) in case the C library or underlying
4002 * file system does not support d_type.
4004 if (dent->d_type != DT_SOCK && dent->d_type != DT_UNKNOWN)
4006 #endif /* _DIRENT_HAVE_D_TYPE */
4007 if (os_strcmp(dent->d_name, ".") == 0 ||
4008 os_strcmp(dent->d_name, "..") == 0)
4010 printf("Selected interface '%s'\n", dent->d_name);
4011 ifname = os_strdup(dent->d_name);
4015 #endif /* CONFIG_CTRL_IFACE_UNIX */
4017 #ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
4018 char buf[4096], *pos;
4020 struct wpa_ctrl *ctrl;
4023 ctrl = wpa_ctrl_open(NULL);
4027 len = sizeof(buf) - 1;
4028 ret = wpa_ctrl_request(ctrl, "INTERFACES", 10, buf, &len, NULL);
4031 pos = os_strchr(buf, '\n');
4034 ifname = os_strdup(buf);
4036 wpa_ctrl_close(ctrl);
4037 #endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
4043 int main(int argc, char *argv[])
4048 const char *global = NULL;
4050 if (os_program_init())
4054 c = getopt(argc, argv, "a:Bg:G:hi:p:P:v");
4059 action_file = optarg;
4068 ping_interval = atoi(optarg);
4074 printf("%s\n", wpa_cli_version);
4077 os_free(ctrl_ifname);
4078 ctrl_ifname = os_strdup(optarg);
4081 ctrl_iface_dir = optarg;
4092 interactive = (argc == optind) && (action_file == NULL);
4095 printf("%s\n\n%s\n\n", wpa_cli_version, wpa_cli_license);
4101 #ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
4102 ctrl_conn = wpa_ctrl_open(NULL);
4103 #else /* CONFIG_CTRL_IFACE_NAMED_PIPE */
4104 ctrl_conn = wpa_ctrl_open(global);
4105 #endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
4106 if (ctrl_conn == NULL) {
4107 fprintf(stderr, "Failed to connect to wpa_supplicant "
4108 "global interface: %s error: %s\n",
4109 global, strerror(errno));
4114 update_ifnames(ctrl_conn);
4115 mon_conn = wpa_ctrl_open(global);
4117 if (wpa_ctrl_attach(mon_conn) == 0) {
4118 wpa_cli_attached = 1;
4119 eloop_register_read_sock(
4120 wpa_ctrl_get_fd(mon_conn),
4121 wpa_cli_mon_receive,
4124 printf("Failed to open monitor "
4125 "connection through global "
4126 "control interface\n");
4132 eloop_register_signal_terminate(wpa_cli_terminate, NULL);
4134 if (ctrl_ifname == NULL)
4135 ctrl_ifname = wpa_cli_get_default_ifname();
4138 wpa_cli_interactive();
4141 wpa_cli_open_connection(ctrl_ifname, 0) < 0) {
4142 fprintf(stderr, "Failed to connect to non-global "
4143 "ctrl_ifname: %s error: %s\n",
4144 ctrl_ifname ? ctrl_ifname : "(nil)",
4150 if (wpa_ctrl_attach(ctrl_conn) == 0) {
4151 wpa_cli_attached = 1;
4153 printf("Warning: Failed to attach to "
4154 "wpa_supplicant.\n");
4159 if (daemonize && os_daemonize(pid_file))
4163 wpa_cli_action(ctrl_conn);
4165 ret = wpa_request(ctrl_conn, argc - optind,
4169 os_free(ctrl_ifname);
4176 #else /* CONFIG_CTRL_IFACE */
4177 int main(int argc, char *argv[])
4179 printf("CONFIG_CTRL_IFACE not defined - wpa_cli disabled\n");
4182 #endif /* CONFIG_CTRL_IFACE */