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 "eapol_version", "ap_scan", "disable_scan_offload",
612 "fast_reauth", "opensc_engine_path", "pkcs11_engine_path",
613 "pkcs11_module_path", "openssl_ciphers",
614 "pcsc_reader", "pcsc_pin",
615 "driver_param", "dot11RSNAConfigPMKLifetime",
616 "dot11RSNAConfigPMKReauthThreshold",
617 "dot11RSNAConfigSATimeout",
618 "update_config", "load_dynamic_eap", "uuid", "device_name",
619 "manufacturer", "model_name", "model_number", "serial_number",
620 "device_type", "os_version", "config_methods",
621 "wps_cred_processing", "wps_vendor_ext_m1", "sec_device_type",
622 "p2p_listen_reg_class", "p2p_listen_channel",
623 "p2p_oper_reg_class", "p2p_oper_channel",
624 "p2p_go_intent", "p2p_ssid_postfix", "persistent_reconnect",
625 "p2p_intra_bss", "p2p_group_idle", "p2p_pref_chan",
627 "p2p_go_ht40", "p2p_disabled", "p2p_no_group_iface",
629 "p2p_ignore_shared_freq", "country", "bss_max_count",
630 "bss_expiration_age", "bss_expiration_scan_count",
631 "filter_ssids", "filter_rssi", "max_num_sta",
632 "disassoc_low_ack", "hs20", "interworking", "hessid",
633 "access_network_type", "pbc_in_m1", "autoscan",
634 "wps_nfc_dev_pw_id", "wps_nfc_dh_pubkey", "wps_nfc_dh_privkey",
635 "wps_nfc_dev_pw", "ext_password_backend",
636 "p2p_go_max_inactivity", "auto_interworking", "okc", "pmf",
637 "sae_groups", "dtim_period", "beacon_int", "ap_vendor_elements",
638 "ignore_old_scan_res", "freq_list", "external_sim",
639 "tdls_external_control", "p2p_search_delay"
641 int i, num_fields = ARRAY_SIZE(fields);
644 char **res = os_calloc(num_fields + 1, sizeof(char *));
647 for (i = 0; i < num_fields; i++) {
648 res[i] = os_strdup(fields[i]);
655 if (arg > 1 && os_strncasecmp(str, "set bssid_filter ", 17) == 0)
656 return cli_txt_list_array(&bsses);
661 static int wpa_cli_cmd_dump(struct wpa_ctrl *ctrl, int argc, char *argv[])
663 return wpa_ctrl_command(ctrl, "DUMP");
667 static int wpa_cli_cmd_get(struct wpa_ctrl *ctrl, int argc, char *argv[])
669 return wpa_cli_cmd(ctrl, "GET", 1, argc, argv);
673 static char ** wpa_cli_complete_get(const char *str, int pos)
675 int arg = get_cmd_arg_num(str, pos);
676 const char *fields[] = {
677 #ifdef CONFIG_CTRL_IFACE
678 "ctrl_interface", "ctrl_interface_group",
679 #endif /* CONFIG_CTRL_IFACE */
680 "eapol_version", "ap_scan",
682 "user_mpm", "max_peer_links", "mesh_max_inactivity",
683 #endif /* CONFIG_MESH */
684 "disable_scan_offload", "fast_reauth", "opensc_engine_path",
685 "pkcs11_engine_path", "pkcs11_module_path", "openssl_ciphers",
686 "pcsc_reader", "pcsc_pin", "external_sim", "driver_param",
687 "dot11RSNAConfigPMKLifetime",
688 "dot11RSNAConfigPMKReauthThreshold",
689 "dot11RSNAConfigSATimeout",
690 #ifndef CONFIG_NO_CONFIG_WRITE
692 #endif /* CONFIG_NO_CONFIG_WRITE */
694 "device_name", "manufacturer", "model_name", "model_number",
695 "serial_number", "config_methods", "wps_cred_processing",
696 #endif /* CONFIG_WPS */
698 "p2p_listen_reg_class", "p2p_listen_channel",
699 "p2p_oper_reg_class", "p2p_oper_channel", "p2p_go_intent",
700 "p2p_ssid_postfix", "persistent_reconnect", "p2p_intra_bss",
701 "p2p_group_idle", "p2p_passphrase_len", "p2p_add_cli_chan",
702 "p2p_optimize_listen_chan", "p2p_go_ht40", "p2p_go_vht",
703 "p2p_disabled", "p2p_go_ctwindow", "p2p_no_group_iface",
704 "p2p_ignore_shared_freq", "ip_addr_go", "ip_addr_mask",
705 "ip_addr_start", "ip_addr_end",
706 #endif /* CONFIG_P2P */
707 "bss_max_count", "bss_expiration_age",
708 "bss_expiration_scan_count", "filter_ssids", "filter_rssi",
709 "max_num_sta", "disassoc_low_ack",
712 #endif /* CONFIG_HS20 */
713 "interworking", "access_network_type", "pbc_in_m1", "autoscan",
714 "wps_nfc_dev_pw_id", "ext_password_backend",
715 "p2p_go_max_inactivity", "auto_interworking", "okc", "pmf",
716 "dtim_period", "beacon_int", "ignore_old_scan_res",
717 "scan_cur_freq", "sched_scan_interval",
718 "tdls_external_control", "osu_dir", "wowlan_triggers",
719 "p2p_search_delay", "mac_addr", "rand_addr_lifetime",
720 "preassoc_mac_addr", "key_mgmt_offload", "passive_scan",
721 "reassoc_same_bss_optim"
723 int i, num_fields = ARRAY_SIZE(fields);
726 char **res = os_calloc(num_fields + 1, sizeof(char *));
729 for (i = 0; i < num_fields; i++) {
730 res[i] = os_strdup(fields[i]);
741 static int wpa_cli_cmd_logoff(struct wpa_ctrl *ctrl, int argc, char *argv[])
743 return wpa_ctrl_command(ctrl, "LOGOFF");
747 static int wpa_cli_cmd_logon(struct wpa_ctrl *ctrl, int argc, char *argv[])
749 return wpa_ctrl_command(ctrl, "LOGON");
753 static int wpa_cli_cmd_reassociate(struct wpa_ctrl *ctrl, int argc,
756 return wpa_ctrl_command(ctrl, "REASSOCIATE");
760 static int wpa_cli_cmd_reattach(struct wpa_ctrl *ctrl, int argc, char *argv[])
762 return wpa_ctrl_command(ctrl, "REATTACH");
766 static int wpa_cli_cmd_preauthenticate(struct wpa_ctrl *ctrl, int argc,
769 return wpa_cli_cmd(ctrl, "PREAUTH", 1, argc, argv);
773 static int wpa_cli_cmd_ap_scan(struct wpa_ctrl *ctrl, int argc, char *argv[])
775 return wpa_cli_cmd(ctrl, "AP_SCAN", 1, argc, argv);
779 static int wpa_cli_cmd_scan_interval(struct wpa_ctrl *ctrl, int argc,
782 return wpa_cli_cmd(ctrl, "SCAN_INTERVAL", 1, argc, argv);
786 static int wpa_cli_cmd_bss_expire_age(struct wpa_ctrl *ctrl, int argc,
789 return wpa_cli_cmd(ctrl, "BSS_EXPIRE_AGE", 1, argc, argv);
793 static int wpa_cli_cmd_bss_expire_count(struct wpa_ctrl *ctrl, int argc,
796 return wpa_cli_cmd(ctrl, "BSS_EXPIRE_COUNT", 1, argc, argv);
800 static int wpa_cli_cmd_bss_flush(struct wpa_ctrl *ctrl, int argc, char *argv[])
806 res = os_snprintf(cmd, sizeof(cmd), "BSS_FLUSH 0");
808 res = os_snprintf(cmd, sizeof(cmd), "BSS_FLUSH %s", argv[0]);
809 if (os_snprintf_error(sizeof(cmd), res)) {
810 printf("Too long BSS_FLUSH command.\n");
813 return wpa_ctrl_command(ctrl, cmd);
817 static int wpa_cli_cmd_stkstart(struct wpa_ctrl *ctrl, int argc,
820 return wpa_cli_cmd(ctrl, "STKSTART", 1, argc, argv);
824 static int wpa_cli_cmd_ft_ds(struct wpa_ctrl *ctrl, int argc, char *argv[])
826 return wpa_cli_cmd(ctrl, "FT_DS", 1, argc, argv);
830 static int wpa_cli_cmd_wps_pbc(struct wpa_ctrl *ctrl, int argc, char *argv[])
832 return wpa_cli_cmd(ctrl, "WPS_PBC", 0, argc, argv);
836 static int wpa_cli_cmd_wps_pin(struct wpa_ctrl *ctrl, int argc, char *argv[])
839 printf("Invalid WPS_PIN command: need one or two arguments:\n"
840 "- BSSID: use 'any' to select any\n"
841 "- PIN: optional, used only with devices that have no "
846 return wpa_cli_cmd(ctrl, "WPS_PIN", 1, argc, argv);
850 static int wpa_cli_cmd_wps_check_pin(struct wpa_ctrl *ctrl, int argc,
853 return wpa_cli_cmd(ctrl, "WPS_CHECK_PIN", 1, argc, argv);
857 static int wpa_cli_cmd_wps_cancel(struct wpa_ctrl *ctrl, int argc,
860 return wpa_ctrl_command(ctrl, "WPS_CANCEL");
864 #ifdef CONFIG_WPS_NFC
866 static int wpa_cli_cmd_wps_nfc(struct wpa_ctrl *ctrl, int argc, char *argv[])
868 return wpa_cli_cmd(ctrl, "WPS_NFC", 0, argc, argv);
872 static int wpa_cli_cmd_wps_nfc_config_token(struct wpa_ctrl *ctrl, int argc,
875 return wpa_cli_cmd(ctrl, "WPS_NFC_CONFIG_TOKEN", 1, argc, argv);
879 static int wpa_cli_cmd_wps_nfc_token(struct wpa_ctrl *ctrl, int argc,
882 return wpa_cli_cmd(ctrl, "WPS_NFC_TOKEN", 1, argc, argv);
886 static int wpa_cli_cmd_wps_nfc_tag_read(struct wpa_ctrl *ctrl, int argc,
894 printf("Invalid 'wps_nfc_tag_read' command - one argument "
899 buflen = 18 + os_strlen(argv[0]);
900 buf = os_malloc(buflen);
903 os_snprintf(buf, buflen, "WPS_NFC_TAG_READ %s", argv[0]);
905 ret = wpa_ctrl_command(ctrl, buf);
912 static int wpa_cli_cmd_nfc_get_handover_req(struct wpa_ctrl *ctrl, int argc,
915 return wpa_cli_cmd(ctrl, "NFC_GET_HANDOVER_REQ", 2, argc, argv);
919 static int wpa_cli_cmd_nfc_get_handover_sel(struct wpa_ctrl *ctrl, int argc,
922 return wpa_cli_cmd(ctrl, "NFC_GET_HANDOVER_SEL", 2, argc, argv);
926 static int wpa_cli_cmd_nfc_report_handover(struct wpa_ctrl *ctrl, int argc,
929 return wpa_cli_cmd(ctrl, "NFC_REPORT_HANDOVER", 4, argc, argv);
932 #endif /* CONFIG_WPS_NFC */
935 static int wpa_cli_cmd_wps_reg(struct wpa_ctrl *ctrl, int argc, char *argv[])
941 res = os_snprintf(cmd, sizeof(cmd), "WPS_REG %s %s",
943 else if (argc == 5 || argc == 6) {
944 char ssid_hex[2 * 32 + 1];
945 char key_hex[2 * 64 + 1];
949 for (i = 0; i < 32; i++) {
950 if (argv[2][i] == '\0')
952 os_snprintf(&ssid_hex[i * 2], 3, "%02x", argv[2][i]);
957 for (i = 0; i < 64; i++) {
958 if (argv[5][i] == '\0')
960 os_snprintf(&key_hex[i * 2], 3, "%02x",
965 res = os_snprintf(cmd, sizeof(cmd),
966 "WPS_REG %s %s %s %s %s %s",
967 argv[0], argv[1], ssid_hex, argv[3], argv[4],
970 printf("Invalid WPS_REG command: need two arguments:\n"
971 "- BSSID of the target AP\n"
973 printf("Alternatively, six arguments can be used to "
974 "reconfigure the AP:\n"
975 "- BSSID of the target AP\n"
978 "- new auth (OPEN, WPAPSK, WPA2PSK)\n"
979 "- new encr (NONE, WEP, TKIP, CCMP)\n"
984 if (os_snprintf_error(sizeof(cmd), res)) {
985 printf("Too long WPS_REG command.\n");
988 return wpa_ctrl_command(ctrl, cmd);
992 static int wpa_cli_cmd_wps_ap_pin(struct wpa_ctrl *ctrl, int argc,
995 return wpa_cli_cmd(ctrl, "WPS_AP_PIN", 1, argc, argv);
999 static int wpa_cli_cmd_wps_er_start(struct wpa_ctrl *ctrl, int argc,
1002 return wpa_cli_cmd(ctrl, "WPS_ER_START", 0, argc, argv);
1006 static int wpa_cli_cmd_wps_er_stop(struct wpa_ctrl *ctrl, int argc,
1009 return wpa_ctrl_command(ctrl, "WPS_ER_STOP");
1014 static int wpa_cli_cmd_wps_er_pin(struct wpa_ctrl *ctrl, int argc,
1018 printf("Invalid WPS_ER_PIN command: need at least two "
1020 "- UUID: use 'any' to select any\n"
1021 "- PIN: Enrollee PIN\n"
1022 "optional: - Enrollee MAC address\n");
1026 return wpa_cli_cmd(ctrl, "WPS_ER_PIN", 2, argc, argv);
1030 static int wpa_cli_cmd_wps_er_pbc(struct wpa_ctrl *ctrl, int argc,
1033 return wpa_cli_cmd(ctrl, "WPS_ER_PBC", 1, argc, argv);
1037 static int wpa_cli_cmd_wps_er_learn(struct wpa_ctrl *ctrl, int argc,
1041 printf("Invalid WPS_ER_LEARN command: need two arguments:\n"
1042 "- UUID: specify which AP to use\n"
1047 return wpa_cli_cmd(ctrl, "WPS_ER_LEARN", 2, argc, argv);
1051 static int wpa_cli_cmd_wps_er_set_config(struct wpa_ctrl *ctrl, int argc,
1055 printf("Invalid WPS_ER_SET_CONFIG command: need two "
1057 "- UUID: specify which AP to use\n"
1058 "- Network configuration id\n");
1062 return wpa_cli_cmd(ctrl, "WPS_ER_SET_CONFIG", 2, argc, argv);
1066 static int wpa_cli_cmd_wps_er_config(struct wpa_ctrl *ctrl, int argc,
1072 if (argc == 5 || argc == 6) {
1073 char ssid_hex[2 * 32 + 1];
1074 char key_hex[2 * 64 + 1];
1078 for (i = 0; i < 32; i++) {
1079 if (argv[2][i] == '\0')
1081 os_snprintf(&ssid_hex[i * 2], 3, "%02x", argv[2][i]);
1086 for (i = 0; i < 64; i++) {
1087 if (argv[5][i] == '\0')
1089 os_snprintf(&key_hex[i * 2], 3, "%02x",
1094 res = os_snprintf(cmd, sizeof(cmd),
1095 "WPS_ER_CONFIG %s %s %s %s %s %s",
1096 argv[0], argv[1], ssid_hex, argv[3], argv[4],
1099 printf("Invalid WPS_ER_CONFIG command: need six arguments:\n"
1103 "- new auth (OPEN, WPAPSK, WPA2PSK)\n"
1104 "- new encr (NONE, WEP, TKIP, CCMP)\n"
1109 if (os_snprintf_error(sizeof(cmd), res)) {
1110 printf("Too long WPS_ER_CONFIG command.\n");
1113 return wpa_ctrl_command(ctrl, cmd);
1117 #ifdef CONFIG_WPS_NFC
1118 static int wpa_cli_cmd_wps_er_nfc_config_token(struct wpa_ctrl *ctrl, int argc,
1122 printf("Invalid WPS_ER_NFC_CONFIG_TOKEN command: need two "
1124 "- WPS/NDEF: token format\n"
1125 "- UUID: specify which AP to use\n");
1129 return wpa_cli_cmd(ctrl, "WPS_ER_NFC_CONFIG_TOKEN", 2, argc, argv);
1131 #endif /* CONFIG_WPS_NFC */
1134 static int wpa_cli_cmd_ibss_rsn(struct wpa_ctrl *ctrl, int argc, char *argv[])
1136 return wpa_cli_cmd(ctrl, "IBSS_RSN", 1, argc, argv);
1140 static int wpa_cli_cmd_level(struct wpa_ctrl *ctrl, int argc, char *argv[])
1142 return wpa_cli_cmd(ctrl, "LEVEL", 1, argc, argv);
1146 static int wpa_cli_cmd_identity(struct wpa_ctrl *ctrl, int argc, char *argv[])
1148 char cmd[256], *pos, *end;
1152 printf("Invalid IDENTITY command: needs two arguments "
1153 "(network id and identity)\n");
1157 end = cmd + sizeof(cmd);
1159 ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "IDENTITY-%s:%s",
1161 if (os_snprintf_error(end - pos, ret)) {
1162 printf("Too long IDENTITY command.\n");
1166 for (i = 2; i < argc; i++) {
1167 ret = os_snprintf(pos, end - pos, " %s", argv[i]);
1168 if (os_snprintf_error(end - pos, ret)) {
1169 printf("Too long IDENTITY command.\n");
1175 return wpa_ctrl_command(ctrl, cmd);
1179 static int wpa_cli_cmd_password(struct wpa_ctrl *ctrl, int argc, char *argv[])
1181 char cmd[256], *pos, *end;
1185 printf("Invalid PASSWORD command: needs two arguments "
1186 "(network id and password)\n");
1190 end = cmd + sizeof(cmd);
1192 ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PASSWORD-%s:%s",
1194 if (os_snprintf_error(end - pos, ret)) {
1195 printf("Too long PASSWORD command.\n");
1199 for (i = 2; i < argc; i++) {
1200 ret = os_snprintf(pos, end - pos, " %s", argv[i]);
1201 if (os_snprintf_error(end - pos, ret)) {
1202 printf("Too long PASSWORD command.\n");
1208 return wpa_ctrl_command(ctrl, cmd);
1212 static int wpa_cli_cmd_new_password(struct wpa_ctrl *ctrl, int argc,
1215 char cmd[256], *pos, *end;
1219 printf("Invalid NEW_PASSWORD command: needs two arguments "
1220 "(network id and password)\n");
1224 end = cmd + sizeof(cmd);
1226 ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "NEW_PASSWORD-%s:%s",
1228 if (os_snprintf_error(end - pos, ret)) {
1229 printf("Too long NEW_PASSWORD command.\n");
1233 for (i = 2; i < argc; i++) {
1234 ret = os_snprintf(pos, end - pos, " %s", argv[i]);
1235 if (os_snprintf_error(end - pos, ret)) {
1236 printf("Too long NEW_PASSWORD command.\n");
1242 return wpa_ctrl_command(ctrl, cmd);
1246 static int wpa_cli_cmd_pin(struct wpa_ctrl *ctrl, int argc, char *argv[])
1248 char cmd[256], *pos, *end;
1252 printf("Invalid PIN command: needs two arguments "
1253 "(network id and pin)\n");
1257 end = cmd + sizeof(cmd);
1259 ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PIN-%s:%s",
1261 if (os_snprintf_error(end - pos, ret)) {
1262 printf("Too long PIN command.\n");
1266 for (i = 2; i < argc; i++) {
1267 ret = os_snprintf(pos, end - pos, " %s", argv[i]);
1268 if (os_snprintf_error(end - pos, ret)) {
1269 printf("Too long PIN command.\n");
1274 return wpa_ctrl_command(ctrl, cmd);
1278 static int wpa_cli_cmd_otp(struct wpa_ctrl *ctrl, int argc, char *argv[])
1280 char cmd[256], *pos, *end;
1284 printf("Invalid OTP command: needs two arguments (network "
1285 "id and password)\n");
1289 end = cmd + sizeof(cmd);
1291 ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "OTP-%s:%s",
1293 if (os_snprintf_error(end - pos, ret)) {
1294 printf("Too long OTP command.\n");
1298 for (i = 2; i < argc; i++) {
1299 ret = os_snprintf(pos, end - pos, " %s", argv[i]);
1300 if (os_snprintf_error(end - pos, ret)) {
1301 printf("Too long OTP command.\n");
1307 return wpa_ctrl_command(ctrl, cmd);
1311 static int wpa_cli_cmd_sim(struct wpa_ctrl *ctrl, int argc, char *argv[])
1313 char cmd[256], *pos, *end;
1317 printf("Invalid SIM command: needs two arguments "
1318 "(network id and SIM operation response)\n");
1322 end = cmd + sizeof(cmd);
1324 ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "SIM-%s:%s",
1326 if (os_snprintf_error(end - pos, ret)) {
1327 printf("Too long SIM command.\n");
1331 for (i = 2; i < argc; i++) {
1332 ret = os_snprintf(pos, end - pos, " %s", argv[i]);
1333 if (os_snprintf_error(end - pos, ret)) {
1334 printf("Too long SIM command.\n");
1339 return wpa_ctrl_command(ctrl, cmd);
1343 static int wpa_cli_cmd_passphrase(struct wpa_ctrl *ctrl, int argc,
1346 char cmd[256], *pos, *end;
1350 printf("Invalid PASSPHRASE command: needs two arguments "
1351 "(network id and passphrase)\n");
1355 end = cmd + sizeof(cmd);
1357 ret = os_snprintf(pos, end - pos, WPA_CTRL_RSP "PASSPHRASE-%s:%s",
1359 if (os_snprintf_error(end - pos, ret)) {
1360 printf("Too long PASSPHRASE command.\n");
1364 for (i = 2; i < argc; i++) {
1365 ret = os_snprintf(pos, end - pos, " %s", argv[i]);
1366 if (os_snprintf_error(end - pos, ret)) {
1367 printf("Too long PASSPHRASE command.\n");
1373 return wpa_ctrl_command(ctrl, cmd);
1377 static int wpa_cli_cmd_bssid(struct wpa_ctrl *ctrl, int argc, char *argv[])
1380 printf("Invalid BSSID command: needs two arguments (network "
1385 return wpa_cli_cmd(ctrl, "BSSID", 2, argc, argv);
1389 static int wpa_cli_cmd_blacklist(struct wpa_ctrl *ctrl, int argc, char *argv[])
1391 return wpa_cli_cmd(ctrl, "BLACKLIST", 0, argc, argv);
1395 static int wpa_cli_cmd_log_level(struct wpa_ctrl *ctrl, int argc, char *argv[])
1397 return wpa_cli_cmd(ctrl, "LOG_LEVEL", 0, argc, argv);
1401 static int wpa_cli_cmd_list_networks(struct wpa_ctrl *ctrl, int argc,
1404 return wpa_ctrl_command(ctrl, "LIST_NETWORKS");
1408 static int wpa_cli_cmd_select_network(struct wpa_ctrl *ctrl, int argc,
1411 return wpa_cli_cmd(ctrl, "SELECT_NETWORK", 1, argc, argv);
1415 static int wpa_cli_cmd_enable_network(struct wpa_ctrl *ctrl, int argc,
1418 return wpa_cli_cmd(ctrl, "ENABLE_NETWORK", 1, argc, argv);
1422 static int wpa_cli_cmd_disable_network(struct wpa_ctrl *ctrl, int argc,
1425 return wpa_cli_cmd(ctrl, "DISABLE_NETWORK", 1, argc, argv);
1429 static int wpa_cli_cmd_add_network(struct wpa_ctrl *ctrl, int argc,
1432 return wpa_ctrl_command(ctrl, "ADD_NETWORK");
1436 static int wpa_cli_cmd_remove_network(struct wpa_ctrl *ctrl, int argc,
1439 return wpa_cli_cmd(ctrl, "REMOVE_NETWORK", 1, argc, argv);
1443 static void wpa_cli_show_network_variables(void)
1445 printf("set_network variables:\n"
1446 " ssid (network name, SSID)\n"
1447 " psk (WPA passphrase or pre-shared key)\n"
1448 " key_mgmt (key management protocol)\n"
1449 " identity (EAP identity)\n"
1450 " password (EAP password)\n"
1453 "Note: Values are entered in the same format as the "
1454 "configuration file is using,\n"
1455 "i.e., strings values need to be inside double quotation "
1457 "For example: set_network 1 ssid \"network name\"\n"
1459 "Please see wpa_supplicant.conf documentation for full list "
1460 "of\navailable variables.\n");
1464 static int wpa_cli_cmd_set_network(struct wpa_ctrl *ctrl, int argc,
1468 wpa_cli_show_network_variables();
1473 printf("Invalid SET_NETWORK command: needs three arguments\n"
1474 "(network id, variable name, and value)\n");
1478 return wpa_cli_cmd(ctrl, "SET_NETWORK", 3, argc, argv);
1482 static int wpa_cli_cmd_get_network(struct wpa_ctrl *ctrl, int argc,
1486 wpa_cli_show_network_variables();
1491 printf("Invalid GET_NETWORK command: needs two arguments\n"
1492 "(network id and variable name)\n");
1496 return wpa_cli_cmd(ctrl, "GET_NETWORK", 2, argc, argv);
1500 static int wpa_cli_cmd_dup_network(struct wpa_ctrl *ctrl, int argc,
1504 wpa_cli_show_network_variables();
1509 printf("Invalid DUP_NETWORK command: needs three arguments\n"
1510 "(src netid, dest netid, and variable name)\n");
1514 return wpa_cli_cmd(ctrl, "DUP_NETWORK", 3, argc, argv);
1518 static int wpa_cli_cmd_list_creds(struct wpa_ctrl *ctrl, int argc,
1521 return wpa_ctrl_command(ctrl, "LIST_CREDS");
1525 static int wpa_cli_cmd_add_cred(struct wpa_ctrl *ctrl, int argc, char *argv[])
1527 return wpa_ctrl_command(ctrl, "ADD_CRED");
1531 static int wpa_cli_cmd_remove_cred(struct wpa_ctrl *ctrl, int argc,
1534 return wpa_cli_cmd(ctrl, "REMOVE_CRED", 1, argc, argv);
1538 static int wpa_cli_cmd_set_cred(struct wpa_ctrl *ctrl, int argc, char *argv[])
1541 printf("Invalid SET_CRED command: needs three arguments\n"
1542 "(cred id, variable name, and value)\n");
1546 return wpa_cli_cmd(ctrl, "SET_CRED", 3, argc, argv);
1550 static int wpa_cli_cmd_get_cred(struct wpa_ctrl *ctrl, int argc, char *argv[])
1553 printf("Invalid GET_CRED command: needs two arguments\n"
1554 "(cred id, variable name)\n");
1558 return wpa_cli_cmd(ctrl, "GET_CRED", 2, argc, argv);
1562 static int wpa_cli_cmd_disconnect(struct wpa_ctrl *ctrl, int argc,
1565 return wpa_ctrl_command(ctrl, "DISCONNECT");
1569 static int wpa_cli_cmd_reconnect(struct wpa_ctrl *ctrl, int argc,
1572 return wpa_ctrl_command(ctrl, "RECONNECT");
1576 static int wpa_cli_cmd_save_config(struct wpa_ctrl *ctrl, int argc,
1579 return wpa_ctrl_command(ctrl, "SAVE_CONFIG");
1583 static int wpa_cli_cmd_scan(struct wpa_ctrl *ctrl, int argc, char *argv[])
1585 return wpa_cli_cmd(ctrl, "SCAN", 0, argc, argv);
1589 static int wpa_cli_cmd_scan_results(struct wpa_ctrl *ctrl, int argc,
1592 return wpa_ctrl_command(ctrl, "SCAN_RESULTS");
1596 static int wpa_cli_cmd_bss(struct wpa_ctrl *ctrl, int argc, char *argv[])
1598 return wpa_cli_cmd(ctrl, "BSS", 1, argc, argv);
1602 static char ** wpa_cli_complete_bss(const char *str, int pos)
1604 int arg = get_cmd_arg_num(str, pos);
1609 res = cli_txt_list_array(&bsses);
1617 static int wpa_cli_cmd_get_capability(struct wpa_ctrl *ctrl, int argc,
1620 if (argc < 1 || argc > 2) {
1621 printf("Invalid GET_CAPABILITY command: need either one or "
1626 if ((argc == 2) && os_strcmp(argv[1], "strict") != 0) {
1627 printf("Invalid GET_CAPABILITY command: second argument, "
1628 "if any, must be 'strict'\n");
1632 return wpa_cli_cmd(ctrl, "GET_CAPABILITY", 1, argc, argv);
1636 static int wpa_cli_list_interfaces(struct wpa_ctrl *ctrl)
1638 printf("Available interfaces:\n");
1639 return wpa_ctrl_command(ctrl, "INTERFACES");
1643 static int wpa_cli_cmd_interface(struct wpa_ctrl *ctrl, int argc, char *argv[])
1646 wpa_cli_list_interfaces(ctrl);
1650 wpa_cli_close_connection();
1651 os_free(ctrl_ifname);
1652 ctrl_ifname = os_strdup(argv[0]);
1654 printf("Failed to allocate memory\n");
1658 if (wpa_cli_open_connection(ctrl_ifname, 1) == 0) {
1659 printf("Connected to interface '%s.\n", ctrl_ifname);
1661 printf("Could not connect to interface '%s' - re-trying\n",
1668 static int wpa_cli_cmd_reconfigure(struct wpa_ctrl *ctrl, int argc,
1671 return wpa_ctrl_command(ctrl, "RECONFIGURE");
1675 static int wpa_cli_cmd_terminate(struct wpa_ctrl *ctrl, int argc,
1678 return wpa_ctrl_command(ctrl, "TERMINATE");
1682 static int wpa_cli_cmd_interface_add(struct wpa_ctrl *ctrl, int argc,
1689 printf("Invalid INTERFACE_ADD command: needs at least one "
1690 "argument (interface name)\n"
1691 "All arguments: ifname confname driver ctrl_interface "
1692 "driver_param bridge_name\n");
1697 * INTERFACE_ADD <ifname>TAB<confname>TAB<driver>TAB<ctrl_interface>TAB
1698 * <driver_param>TAB<bridge_name>
1700 res = os_snprintf(cmd, sizeof(cmd),
1701 "INTERFACE_ADD %s\t%s\t%s\t%s\t%s\t%s",
1703 argc > 1 ? argv[1] : "", argc > 2 ? argv[2] : "",
1704 argc > 3 ? argv[3] : "", argc > 4 ? argv[4] : "",
1705 argc > 5 ? argv[5] : "");
1706 if (os_snprintf_error(sizeof(cmd), res))
1708 cmd[sizeof(cmd) - 1] = '\0';
1709 return wpa_ctrl_command(ctrl, cmd);
1713 static int wpa_cli_cmd_interface_remove(struct wpa_ctrl *ctrl, int argc,
1716 return wpa_cli_cmd(ctrl, "INTERFACE_REMOVE", 1, argc, argv);
1720 static int wpa_cli_cmd_interface_list(struct wpa_ctrl *ctrl, int argc,
1723 return wpa_ctrl_command(ctrl, "INTERFACE_LIST");
1728 static int wpa_cli_cmd_sta(struct wpa_ctrl *ctrl, int argc, char *argv[])
1730 return wpa_cli_cmd(ctrl, "STA", 1, argc, argv);
1734 static int wpa_ctrl_command_sta(struct wpa_ctrl *ctrl, char *cmd,
1735 char *addr, size_t addr_len)
1737 char buf[4096], *pos;
1741 if (ctrl_conn == NULL) {
1742 printf("Not connected to hostapd - command dropped.\n");
1745 len = sizeof(buf) - 1;
1746 ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len,
1749 printf("'%s' command timed out.\n", cmd);
1751 } else if (ret < 0) {
1752 printf("'%s' command failed.\n", cmd);
1757 if (os_memcmp(buf, "FAIL", 4) == 0)
1762 while (*pos != '\0' && *pos != '\n')
1765 os_strlcpy(addr, buf, addr_len);
1770 static int wpa_cli_cmd_all_sta(struct wpa_ctrl *ctrl, int argc, char *argv[])
1772 char addr[32], cmd[64];
1774 if (wpa_ctrl_command_sta(ctrl, "STA-FIRST", addr, sizeof(addr)))
1777 os_snprintf(cmd, sizeof(cmd), "STA-NEXT %s", addr);
1778 } while (wpa_ctrl_command_sta(ctrl, cmd, addr, sizeof(addr)) == 0);
1784 static int wpa_cli_cmd_deauthenticate(struct wpa_ctrl *ctrl, int argc,
1787 return wpa_cli_cmd(ctrl, "DEAUTHENTICATE", 1, argc, argv);
1791 static int wpa_cli_cmd_disassociate(struct wpa_ctrl *ctrl, int argc,
1794 return wpa_cli_cmd(ctrl, "DISASSOCIATE", 1, argc, argv);
1797 static int wpa_cli_cmd_chanswitch(struct wpa_ctrl *ctrl, int argc,
1800 return wpa_cli_cmd(ctrl, "CHAN_SWITCH", 2, argc, argv);
1803 #endif /* CONFIG_AP */
1806 static int wpa_cli_cmd_suspend(struct wpa_ctrl *ctrl, int argc, char *argv[])
1808 return wpa_ctrl_command(ctrl, "SUSPEND");
1812 static int wpa_cli_cmd_resume(struct wpa_ctrl *ctrl, int argc, char *argv[])
1814 return wpa_ctrl_command(ctrl, "RESUME");
1818 #ifdef CONFIG_TESTING_OPTIONS
1819 static int wpa_cli_cmd_drop_sa(struct wpa_ctrl *ctrl, int argc, char *argv[])
1821 return wpa_ctrl_command(ctrl, "DROP_SA");
1823 #endif /* CONFIG_TESTING_OPTIONS */
1826 static int wpa_cli_cmd_roam(struct wpa_ctrl *ctrl, int argc, char *argv[])
1828 return wpa_cli_cmd(ctrl, "ROAM", 1, argc, argv);
1834 static int wpa_cli_cmd_mesh_interface_add(struct wpa_ctrl *ctrl, int argc,
1837 return wpa_cli_cmd(ctrl, "MESH_INTERFACE_ADD", 0, argc, argv);
1841 static int wpa_cli_cmd_mesh_group_add(struct wpa_ctrl *ctrl, int argc,
1844 return wpa_cli_cmd(ctrl, "MESH_GROUP_ADD", 1, argc, argv);
1848 static int wpa_cli_cmd_mesh_group_remove(struct wpa_ctrl *ctrl, int argc,
1851 return wpa_cli_cmd(ctrl, "MESH_GROUP_REMOVE", 1, argc, argv);
1854 #endif /* CONFIG_MESH */
1859 static int wpa_cli_cmd_p2p_find(struct wpa_ctrl *ctrl, int argc, char *argv[])
1861 return wpa_cli_cmd(ctrl, "P2P_FIND", 0, argc, argv);
1865 static char ** wpa_cli_complete_p2p_find(const char *str, int pos)
1868 int arg = get_cmd_arg_num(str, pos);
1870 res = os_calloc(6, sizeof(char *));
1873 res[0] = os_strdup("type=social");
1874 if (res[0] == NULL) {
1878 res[1] = os_strdup("type=progressive");
1881 res[2] = os_strdup("delay=");
1884 res[3] = os_strdup("dev_id=");
1888 res[4] = os_strdup("[timeout]");
1894 static int wpa_cli_cmd_p2p_stop_find(struct wpa_ctrl *ctrl, int argc,
1897 return wpa_ctrl_command(ctrl, "P2P_STOP_FIND");
1901 static int wpa_cli_cmd_p2p_asp_provision(struct wpa_ctrl *ctrl, int argc,
1904 return wpa_cli_cmd(ctrl, "P2P_ASP_PROVISION", 3, argc, argv);
1908 static int wpa_cli_cmd_p2p_asp_provision_resp(struct wpa_ctrl *ctrl, int argc,
1911 return wpa_cli_cmd(ctrl, "P2P_ASP_PROVISION_RESP", 2, argc, argv);
1915 static int wpa_cli_cmd_p2p_connect(struct wpa_ctrl *ctrl, int argc,
1918 return wpa_cli_cmd(ctrl, "P2P_CONNECT", 2, argc, argv);
1922 static char ** wpa_cli_complete_p2p_connect(const char *str, int pos)
1924 int arg = get_cmd_arg_num(str, pos);
1929 res = cli_txt_list_array(&p2p_peers);
1937 static int wpa_cli_cmd_p2p_listen(struct wpa_ctrl *ctrl, int argc,
1940 return wpa_cli_cmd(ctrl, "P2P_LISTEN", 0, argc, argv);
1944 static int wpa_cli_cmd_p2p_group_remove(struct wpa_ctrl *ctrl, int argc,
1947 return wpa_cli_cmd(ctrl, "P2P_GROUP_REMOVE", 1, argc, argv);
1951 static char ** wpa_cli_complete_p2p_group_remove(const char *str, int pos)
1953 int arg = get_cmd_arg_num(str, pos);
1958 res = cli_txt_list_array(&p2p_groups);
1966 static int wpa_cli_cmd_p2p_group_add(struct wpa_ctrl *ctrl, int argc,
1969 return wpa_cli_cmd(ctrl, "P2P_GROUP_ADD", 0, argc, argv);
1973 static int wpa_cli_cmd_p2p_prov_disc(struct wpa_ctrl *ctrl, int argc,
1976 if (argc != 2 && argc != 3) {
1977 printf("Invalid P2P_PROV_DISC command: needs at least "
1978 "two arguments, address and config method\n"
1979 "(display, keypad, or pbc) and an optional join\n");
1983 return wpa_cli_cmd(ctrl, "P2P_PROV_DISC", 2, argc, argv);
1987 static int wpa_cli_cmd_p2p_get_passphrase(struct wpa_ctrl *ctrl, int argc,
1990 return wpa_ctrl_command(ctrl, "P2P_GET_PASSPHRASE");
1994 static int wpa_cli_cmd_p2p_serv_disc_req(struct wpa_ctrl *ctrl, int argc,
2000 printf("Invalid P2P_SERV_DISC_REQ command: needs two "
2001 "or more arguments (address and TLVs)\n");
2005 if (write_cmd(cmd, sizeof(cmd), "P2P_SERV_DISC_REQ", argc, argv) < 0)
2007 return wpa_ctrl_command(ctrl, cmd);
2011 static int wpa_cli_cmd_p2p_serv_disc_cancel_req(struct wpa_ctrl *ctrl,
2012 int argc, char *argv[])
2014 return wpa_cli_cmd(ctrl, "P2P_SERV_DISC_CANCEL_REQ", 1, argc, argv);
2018 static int wpa_cli_cmd_p2p_serv_disc_resp(struct wpa_ctrl *ctrl, int argc,
2025 printf("Invalid P2P_SERV_DISC_RESP command: needs four "
2026 "arguments (freq, address, dialog token, and TLVs)\n");
2030 res = os_snprintf(cmd, sizeof(cmd), "P2P_SERV_DISC_RESP %s %s %s %s",
2031 argv[0], argv[1], argv[2], argv[3]);
2032 if (os_snprintf_error(sizeof(cmd), res))
2034 cmd[sizeof(cmd) - 1] = '\0';
2035 return wpa_ctrl_command(ctrl, cmd);
2039 static int wpa_cli_cmd_p2p_service_update(struct wpa_ctrl *ctrl, int argc,
2042 return wpa_ctrl_command(ctrl, "P2P_SERVICE_UPDATE");
2046 static int wpa_cli_cmd_p2p_serv_disc_external(struct wpa_ctrl *ctrl,
2047 int argc, char *argv[])
2049 return wpa_cli_cmd(ctrl, "P2P_SERV_DISC_EXTERNAL", 1, argc, argv);
2053 static int wpa_cli_cmd_p2p_service_flush(struct wpa_ctrl *ctrl, int argc,
2056 return wpa_ctrl_command(ctrl, "P2P_SERVICE_FLUSH");
2060 static int wpa_cli_cmd_p2p_service_add(struct wpa_ctrl *ctrl, int argc,
2064 printf("Invalid P2P_SERVICE_ADD command: needs 3-6 arguments\n");
2068 return wpa_cli_cmd(ctrl, "P2P_SERVICE_ADD", 3, argc, argv);
2072 static int wpa_cli_cmd_p2p_service_rep(struct wpa_ctrl *ctrl, int argc,
2075 if (argc < 5 || argc > 6) {
2076 printf("Invalid P2P_SERVICE_REP command: needs 5-6 "
2081 return wpa_cli_cmd(ctrl, "P2P_SERVICE_REP", 5, argc, argv);
2085 static int wpa_cli_cmd_p2p_service_del(struct wpa_ctrl *ctrl, int argc,
2091 if (argc != 2 && argc != 3) {
2092 printf("Invalid P2P_SERVICE_DEL command: needs two or three "
2098 res = os_snprintf(cmd, sizeof(cmd),
2099 "P2P_SERVICE_DEL %s %s %s",
2100 argv[0], argv[1], argv[2]);
2102 res = os_snprintf(cmd, sizeof(cmd),
2103 "P2P_SERVICE_DEL %s %s",
2105 if (os_snprintf_error(sizeof(cmd), res))
2107 cmd[sizeof(cmd) - 1] = '\0';
2108 return wpa_ctrl_command(ctrl, cmd);
2112 static int wpa_cli_cmd_p2p_reject(struct wpa_ctrl *ctrl,
2113 int argc, char *argv[])
2115 return wpa_cli_cmd(ctrl, "P2P_REJECT", 1, argc, argv);
2119 static int wpa_cli_cmd_p2p_invite(struct wpa_ctrl *ctrl,
2120 int argc, char *argv[])
2122 return wpa_cli_cmd(ctrl, "P2P_INVITE", 1, argc, argv);
2126 static int wpa_cli_cmd_p2p_peer(struct wpa_ctrl *ctrl, int argc, char *argv[])
2128 return wpa_cli_cmd(ctrl, "P2P_PEER", 1, argc, argv);
2132 static char ** wpa_cli_complete_p2p_peer(const char *str, int pos)
2134 int arg = get_cmd_arg_num(str, pos);
2139 res = cli_txt_list_array(&p2p_peers);
2147 static int wpa_ctrl_command_p2p_peer(struct wpa_ctrl *ctrl, char *cmd,
2148 char *addr, size_t addr_len,
2151 char buf[4096], *pos;
2155 if (ctrl_conn == NULL)
2157 len = sizeof(buf) - 1;
2158 ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len,
2161 printf("'%s' command timed out.\n", cmd);
2163 } else if (ret < 0) {
2164 printf("'%s' command failed.\n", cmd);
2169 if (os_memcmp(buf, "FAIL", 4) == 0)
2173 while (*pos != '\0' && *pos != '\n')
2176 os_strlcpy(addr, buf, addr_len);
2177 if (!discovered || os_strstr(pos, "[PROBE_REQ_ONLY]") == NULL)
2178 printf("%s\n", addr);
2183 static int wpa_cli_cmd_p2p_peers(struct wpa_ctrl *ctrl, int argc, char *argv[])
2185 char addr[32], cmd[64];
2188 discovered = argc > 0 && os_strcmp(argv[0], "discovered") == 0;
2190 if (wpa_ctrl_command_p2p_peer(ctrl, "P2P_PEER FIRST",
2191 addr, sizeof(addr), discovered))
2194 os_snprintf(cmd, sizeof(cmd), "P2P_PEER NEXT-%s", addr);
2195 } while (wpa_ctrl_command_p2p_peer(ctrl, cmd, addr, sizeof(addr),
2202 static int wpa_cli_cmd_p2p_set(struct wpa_ctrl *ctrl, int argc, char *argv[])
2204 return wpa_cli_cmd(ctrl, "P2P_SET", 2, argc, argv);
2208 static char ** wpa_cli_complete_p2p_set(const char *str, int pos)
2210 int arg = get_cmd_arg_num(str, pos);
2211 const char *fields[] = {
2231 int i, num_fields = ARRAY_SIZE(fields);
2234 char **res = os_calloc(num_fields + 1, sizeof(char *));
2237 for (i = 0; i < num_fields; i++) {
2238 res[i] = os_strdup(fields[i]);
2245 if (arg == 2 && os_strncasecmp(str, "p2p_set peer_filter ", 20) == 0)
2246 return cli_txt_list_array(&p2p_peers);
2252 static int wpa_cli_cmd_p2p_flush(struct wpa_ctrl *ctrl, int argc, char *argv[])
2254 return wpa_ctrl_command(ctrl, "P2P_FLUSH");
2258 static int wpa_cli_cmd_p2p_cancel(struct wpa_ctrl *ctrl, int argc,
2261 return wpa_ctrl_command(ctrl, "P2P_CANCEL");
2265 static int wpa_cli_cmd_p2p_unauthorize(struct wpa_ctrl *ctrl, int argc,
2268 return wpa_cli_cmd(ctrl, "P2P_UNAUTHORIZE", 1, argc, argv);
2272 static int wpa_cli_cmd_p2p_presence_req(struct wpa_ctrl *ctrl, int argc,
2275 if (argc != 0 && argc != 2 && argc != 4) {
2276 printf("Invalid P2P_PRESENCE_REQ command: needs two arguments "
2277 "(preferred duration, interval; in microsecods).\n"
2278 "Optional second pair can be used to provide "
2279 "acceptable values.\n");
2283 return wpa_cli_cmd(ctrl, "P2P_PRESENCE_REQ", 0, argc, argv);
2287 static int wpa_cli_cmd_p2p_ext_listen(struct wpa_ctrl *ctrl, int argc,
2290 if (argc != 0 && argc != 2) {
2291 printf("Invalid P2P_EXT_LISTEN command: needs two arguments "
2292 "(availability period, availability interval; in "
2294 "Extended Listen Timing can be cancelled with this "
2295 "command when used without parameters.\n");
2299 return wpa_cli_cmd(ctrl, "P2P_EXT_LISTEN", 0, argc, argv);
2303 static int wpa_cli_cmd_p2p_remove_client(struct wpa_ctrl *ctrl, int argc,
2306 return wpa_cli_cmd(ctrl, "P2P_REMOVE_CLIENT", 1, argc, argv);
2309 #endif /* CONFIG_P2P */
2311 #ifdef CONFIG_WIFI_DISPLAY
2313 static int wpa_cli_cmd_wfd_subelem_set(struct wpa_ctrl *ctrl, int argc,
2319 if (argc != 1 && argc != 2) {
2320 printf("Invalid WFD_SUBELEM_SET command: needs one or two "
2321 "arguments (subelem, hexdump)\n");
2325 res = os_snprintf(cmd, sizeof(cmd), "WFD_SUBELEM_SET %s %s",
2326 argv[0], argc > 1 ? argv[1] : "");
2327 if (os_snprintf_error(sizeof(cmd), res))
2329 cmd[sizeof(cmd) - 1] = '\0';
2330 return wpa_ctrl_command(ctrl, cmd);
2334 static int wpa_cli_cmd_wfd_subelem_get(struct wpa_ctrl *ctrl, int argc,
2341 printf("Invalid WFD_SUBELEM_GET command: needs one "
2342 "argument (subelem)\n");
2346 res = os_snprintf(cmd, sizeof(cmd), "WFD_SUBELEM_GET %s",
2348 if (os_snprintf_error(sizeof(cmd), res))
2350 cmd[sizeof(cmd) - 1] = '\0';
2351 return wpa_ctrl_command(ctrl, cmd);
2353 #endif /* CONFIG_WIFI_DISPLAY */
2356 #ifdef CONFIG_INTERWORKING
2357 static int wpa_cli_cmd_fetch_anqp(struct wpa_ctrl *ctrl, int argc,
2360 return wpa_ctrl_command(ctrl, "FETCH_ANQP");
2364 static int wpa_cli_cmd_stop_fetch_anqp(struct wpa_ctrl *ctrl, int argc,
2367 return wpa_ctrl_command(ctrl, "STOP_FETCH_ANQP");
2371 static int wpa_cli_cmd_interworking_select(struct wpa_ctrl *ctrl, int argc,
2374 return wpa_cli_cmd(ctrl, "INTERWORKING_SELECT", 0, argc, argv);
2378 static int wpa_cli_cmd_interworking_connect(struct wpa_ctrl *ctrl, int argc,
2381 return wpa_cli_cmd(ctrl, "INTERWORKING_CONNECT", 1, argc, argv);
2385 static int wpa_cli_cmd_interworking_add_network(struct wpa_ctrl *ctrl, int argc,
2388 return wpa_cli_cmd(ctrl, "INTERWORKING_ADD_NETWORK", 1, argc, argv);
2392 static int wpa_cli_cmd_anqp_get(struct wpa_ctrl *ctrl, int argc, char *argv[])
2394 return wpa_cli_cmd(ctrl, "ANQP_GET", 2, argc, argv);
2398 static int wpa_cli_cmd_gas_request(struct wpa_ctrl *ctrl, int argc,
2401 return wpa_cli_cmd(ctrl, "GAS_REQUEST", 2, argc, argv);
2405 static int wpa_cli_cmd_gas_response_get(struct wpa_ctrl *ctrl, int argc,
2408 return wpa_cli_cmd(ctrl, "GAS_RESPONSE_GET", 2, argc, argv);
2410 #endif /* CONFIG_INTERWORKING */
2415 static int wpa_cli_cmd_hs20_anqp_get(struct wpa_ctrl *ctrl, int argc,
2418 return wpa_cli_cmd(ctrl, "HS20_ANQP_GET", 2, argc, argv);
2422 static int wpa_cli_cmd_get_nai_home_realm_list(struct wpa_ctrl *ctrl, int argc,
2428 printf("Command needs one or two arguments (dst mac addr and "
2429 "optional home realm)\n");
2433 if (write_cmd(cmd, sizeof(cmd), "HS20_GET_NAI_HOME_REALM_LIST",
2437 return wpa_ctrl_command(ctrl, cmd);
2441 static int wpa_cli_cmd_hs20_icon_request(struct wpa_ctrl *ctrl, int argc,
2447 printf("Command needs two arguments (dst mac addr and "
2452 if (write_cmd(cmd, sizeof(cmd), "HS20_ICON_REQUEST", argc, argv) < 0)
2455 return wpa_ctrl_command(ctrl, cmd);
2459 static int wpa_cli_cmd_fetch_osu(struct wpa_ctrl *ctrl, int argc, char *argv[])
2461 return wpa_ctrl_command(ctrl, "FETCH_OSU");
2465 static int wpa_cli_cmd_cancel_fetch_osu(struct wpa_ctrl *ctrl, int argc,
2468 return wpa_ctrl_command(ctrl, "CANCEL_FETCH_OSU");
2471 #endif /* CONFIG_HS20 */
2474 static int wpa_cli_cmd_sta_autoconnect(struct wpa_ctrl *ctrl, int argc,
2477 return wpa_cli_cmd(ctrl, "STA_AUTOCONNECT", 1, argc, argv);
2481 static int wpa_cli_cmd_tdls_discover(struct wpa_ctrl *ctrl, int argc,
2484 return wpa_cli_cmd(ctrl, "TDLS_DISCOVER", 1, argc, argv);
2488 static int wpa_cli_cmd_tdls_setup(struct wpa_ctrl *ctrl, int argc,
2491 return wpa_cli_cmd(ctrl, "TDLS_SETUP", 1, argc, argv);
2495 static int wpa_cli_cmd_tdls_teardown(struct wpa_ctrl *ctrl, int argc,
2498 return wpa_cli_cmd(ctrl, "TDLS_TEARDOWN", 1, argc, argv);
2502 static int wpa_cli_cmd_wmm_ac_addts(struct wpa_ctrl *ctrl, int argc,
2505 return wpa_cli_cmd(ctrl, "WMM_AC_ADDTS", 3, argc, argv);
2509 static int wpa_cli_cmd_wmm_ac_delts(struct wpa_ctrl *ctrl, int argc,
2512 return wpa_cli_cmd(ctrl, "WMM_AC_DELTS", 1, argc, argv);
2516 static int wpa_cli_cmd_wmm_ac_status(struct wpa_ctrl *ctrl, int argc,
2519 return wpa_ctrl_command(ctrl, "WMM_AC_STATUS");
2523 static int wpa_cli_cmd_tdls_chan_switch(struct wpa_ctrl *ctrl, int argc,
2526 return wpa_cli_cmd(ctrl, "TDLS_CHAN_SWITCH", 2, argc, argv);
2530 static int wpa_cli_cmd_tdls_cancel_chan_switch(struct wpa_ctrl *ctrl, int argc,
2533 return wpa_cli_cmd(ctrl, "TDLS_CANCEL_CHAN_SWITCH", 1, argc, argv);
2537 static int wpa_cli_cmd_signal_poll(struct wpa_ctrl *ctrl, int argc,
2540 return wpa_ctrl_command(ctrl, "SIGNAL_POLL");
2544 static int wpa_cli_cmd_pktcnt_poll(struct wpa_ctrl *ctrl, int argc,
2547 return wpa_ctrl_command(ctrl, "PKTCNT_POLL");
2551 static int wpa_cli_cmd_reauthenticate(struct wpa_ctrl *ctrl, int argc,
2554 return wpa_ctrl_command(ctrl, "REAUTHENTICATE");
2558 #ifdef CONFIG_AUTOSCAN
2560 static int wpa_cli_cmd_autoscan(struct wpa_ctrl *ctrl, int argc, char *argv[])
2563 return wpa_ctrl_command(ctrl, "AUTOSCAN ");
2565 return wpa_cli_cmd(ctrl, "AUTOSCAN", 0, argc, argv);
2568 #endif /* CONFIG_AUTOSCAN */
2573 static int wpa_cli_cmd_wnm_sleep(struct wpa_ctrl *ctrl, int argc, char *argv[])
2575 return wpa_cli_cmd(ctrl, "WNM_SLEEP", 0, argc, argv);
2579 static int wpa_cli_cmd_wnm_bss_query(struct wpa_ctrl *ctrl, int argc, char *argv[])
2581 return wpa_cli_cmd(ctrl, "WNM_BSS_QUERY", 1, argc, argv);
2584 #endif /* CONFIG_WNM */
2587 static int wpa_cli_cmd_raw(struct wpa_ctrl *ctrl, int argc, char *argv[])
2591 return wpa_cli_cmd(ctrl, argv[0], 0, argc - 1, &argv[1]);
2596 static int wpa_cli_cmd_driver(struct wpa_ctrl *ctrl, int argc, char *argv[])
2598 return wpa_cli_cmd(ctrl, "DRIVER", 1, argc, argv);
2600 #endif /* ANDROID */
2603 static int wpa_cli_cmd_vendor(struct wpa_ctrl *ctrl, int argc, char *argv[])
2605 return wpa_cli_cmd(ctrl, "VENDOR", 1, argc, argv);
2609 static int wpa_cli_cmd_flush(struct wpa_ctrl *ctrl, int argc, char *argv[])
2611 return wpa_ctrl_command(ctrl, "FLUSH");
2615 static int wpa_cli_cmd_radio_work(struct wpa_ctrl *ctrl, int argc, char *argv[])
2617 return wpa_cli_cmd(ctrl, "RADIO_WORK", 1, argc, argv);
2621 static int wpa_cli_cmd_neighbor_rep_request(struct wpa_ctrl *ctrl, int argc,
2624 return wpa_cli_cmd(ctrl, "NEIGHBOR_REP_REQUEST", 0, argc, argv);
2628 static int wpa_cli_cmd_erp_flush(struct wpa_ctrl *ctrl, int argc, char *argv[])
2630 return wpa_ctrl_command(ctrl, "ERP_FLUSH");
2634 static int wpa_cli_cmd_mac_rand_scan(struct wpa_ctrl *ctrl, int argc,
2637 return wpa_cli_cmd(ctrl, "MAC_RAND_SCAN", 1, argc, argv);
2641 enum wpa_cli_cmd_flags {
2642 cli_cmd_flag_none = 0x00,
2643 cli_cmd_flag_sensitive = 0x01
2646 struct wpa_cli_cmd {
2648 int (*handler)(struct wpa_ctrl *ctrl, int argc, char *argv[]);
2649 char ** (*completion)(const char *str, int pos);
2650 enum wpa_cli_cmd_flags flags;
2654 static struct wpa_cli_cmd wpa_cli_commands[] = {
2655 { "status", wpa_cli_cmd_status, NULL,
2657 "[verbose] = get current WPA/EAPOL/EAP status" },
2658 { "ifname", wpa_cli_cmd_ifname, NULL,
2660 "= get current interface name" },
2661 { "ping", wpa_cli_cmd_ping, NULL,
2663 "= pings wpa_supplicant" },
2664 { "relog", wpa_cli_cmd_relog, NULL,
2666 "= re-open log-file (allow rolling logs)" },
2667 { "note", wpa_cli_cmd_note, NULL,
2669 "<text> = add a note to wpa_supplicant debug log" },
2670 { "mib", wpa_cli_cmd_mib, NULL,
2672 "= get MIB variables (dot1x, dot11)" },
2673 { "help", wpa_cli_cmd_help, wpa_cli_complete_help,
2675 "[command] = show usage help" },
2676 { "interface", wpa_cli_cmd_interface, NULL,
2678 "[ifname] = show interfaces/select interface" },
2679 { "level", wpa_cli_cmd_level, NULL,
2681 "<debug level> = change debug level" },
2682 { "license", wpa_cli_cmd_license, NULL,
2684 "= show full wpa_cli license" },
2685 { "quit", wpa_cli_cmd_quit, NULL,
2688 { "set", wpa_cli_cmd_set, wpa_cli_complete_set,
2690 "= set variables (shows list of variables when run without "
2692 { "dump", wpa_cli_cmd_dump, NULL,
2694 "= dump config variables" },
2695 { "get", wpa_cli_cmd_get, wpa_cli_complete_get,
2697 "<name> = get information" },
2698 { "logon", wpa_cli_cmd_logon, NULL,
2700 "= IEEE 802.1X EAPOL state machine logon" },
2701 { "logoff", wpa_cli_cmd_logoff, NULL,
2703 "= IEEE 802.1X EAPOL state machine logoff" },
2704 { "pmksa", wpa_cli_cmd_pmksa, NULL,
2706 "= show PMKSA cache" },
2707 { "pmksa_flush", wpa_cli_cmd_pmksa_flush, NULL,
2709 "= flush PMKSA cache entries" },
2710 { "reassociate", wpa_cli_cmd_reassociate, NULL,
2712 "= force reassociation" },
2713 { "reattach", wpa_cli_cmd_reattach, NULL,
2715 "= force reassociation back to the same BSS" },
2716 { "preauthenticate", wpa_cli_cmd_preauthenticate, wpa_cli_complete_bss,
2718 "<BSSID> = force preauthentication" },
2719 { "identity", wpa_cli_cmd_identity, NULL,
2721 "<network id> <identity> = configure identity for an SSID" },
2722 { "password", wpa_cli_cmd_password, NULL,
2723 cli_cmd_flag_sensitive,
2724 "<network id> <password> = configure password for an SSID" },
2725 { "new_password", wpa_cli_cmd_new_password, NULL,
2726 cli_cmd_flag_sensitive,
2727 "<network id> <password> = change password for an SSID" },
2728 { "pin", wpa_cli_cmd_pin, NULL,
2729 cli_cmd_flag_sensitive,
2730 "<network id> <pin> = configure pin for an SSID" },
2731 { "otp", wpa_cli_cmd_otp, NULL,
2732 cli_cmd_flag_sensitive,
2733 "<network id> <password> = configure one-time-password for an SSID"
2735 { "passphrase", wpa_cli_cmd_passphrase, NULL,
2736 cli_cmd_flag_sensitive,
2737 "<network id> <passphrase> = configure private key passphrase\n"
2739 { "sim", wpa_cli_cmd_sim, NULL,
2740 cli_cmd_flag_sensitive,
2741 "<network id> <pin> = report SIM operation result" },
2742 { "bssid", wpa_cli_cmd_bssid, NULL,
2744 "<network id> <BSSID> = set preferred BSSID for an SSID" },
2745 { "blacklist", wpa_cli_cmd_blacklist, wpa_cli_complete_bss,
2747 "<BSSID> = add a BSSID to the blacklist\n"
2748 "blacklist clear = clear the blacklist\n"
2749 "blacklist = display the blacklist" },
2750 { "log_level", wpa_cli_cmd_log_level, NULL,
2752 "<level> [<timestamp>] = update the log level/timestamp\n"
2753 "log_level = display the current log level and log options" },
2754 { "list_networks", wpa_cli_cmd_list_networks, NULL,
2756 "= list configured networks" },
2757 { "select_network", wpa_cli_cmd_select_network, NULL,
2759 "<network id> = select a network (disable others)" },
2760 { "enable_network", wpa_cli_cmd_enable_network, NULL,
2762 "<network id> = enable a network" },
2763 { "disable_network", wpa_cli_cmd_disable_network, NULL,
2765 "<network id> = disable a network" },
2766 { "add_network", wpa_cli_cmd_add_network, NULL,
2768 "= add a network" },
2769 { "remove_network", wpa_cli_cmd_remove_network, NULL,
2771 "<network id> = remove a network" },
2772 { "set_network", wpa_cli_cmd_set_network, NULL,
2773 cli_cmd_flag_sensitive,
2774 "<network id> <variable> <value> = set network variables (shows\n"
2775 " list of variables when run without arguments)" },
2776 { "get_network", wpa_cli_cmd_get_network, NULL,
2778 "<network id> <variable> = get network variables" },
2779 { "dup_network", wpa_cli_cmd_dup_network, NULL,
2781 "<src network id> <dst network id> <variable> = duplicate network variables"
2783 { "list_creds", wpa_cli_cmd_list_creds, NULL,
2785 "= list configured credentials" },
2786 { "add_cred", wpa_cli_cmd_add_cred, NULL,
2788 "= add a credential" },
2789 { "remove_cred", wpa_cli_cmd_remove_cred, NULL,
2791 "<cred id> = remove a credential" },
2792 { "set_cred", wpa_cli_cmd_set_cred, NULL,
2793 cli_cmd_flag_sensitive,
2794 "<cred id> <variable> <value> = set credential variables" },
2795 { "get_cred", wpa_cli_cmd_get_cred, NULL,
2797 "<cred id> <variable> = get credential variables" },
2798 { "save_config", wpa_cli_cmd_save_config, NULL,
2800 "= save the current configuration" },
2801 { "disconnect", wpa_cli_cmd_disconnect, NULL,
2803 "= disconnect and wait for reassociate/reconnect command before\n"
2805 { "reconnect", wpa_cli_cmd_reconnect, NULL,
2807 "= like reassociate, but only takes effect if already disconnected"
2809 { "scan", wpa_cli_cmd_scan, NULL,
2811 "= request new BSS scan" },
2812 { "scan_results", wpa_cli_cmd_scan_results, NULL,
2814 "= get latest scan results" },
2815 { "bss", wpa_cli_cmd_bss, wpa_cli_complete_bss,
2817 "<<idx> | <bssid>> = get detailed scan result info" },
2818 { "get_capability", wpa_cli_cmd_get_capability, NULL,
2820 "<eap/pairwise/group/key_mgmt/proto/auth_alg/channels/freq/modes> "
2821 "= get capabilies" },
2822 { "reconfigure", wpa_cli_cmd_reconfigure, NULL,
2824 "= force wpa_supplicant to re-read its configuration file" },
2825 { "terminate", wpa_cli_cmd_terminate, NULL,
2827 "= terminate wpa_supplicant" },
2828 { "interface_add", wpa_cli_cmd_interface_add, NULL,
2830 "<ifname> <confname> <driver> <ctrl_interface> <driver_param>\n"
2831 " <bridge_name> = adds new interface, all parameters but <ifname>\n"
2833 { "interface_remove", wpa_cli_cmd_interface_remove, NULL,
2835 "<ifname> = removes the interface" },
2836 { "interface_list", wpa_cli_cmd_interface_list, NULL,
2838 "= list available interfaces" },
2839 { "ap_scan", wpa_cli_cmd_ap_scan, NULL,
2841 "<value> = set ap_scan parameter" },
2842 { "scan_interval", wpa_cli_cmd_scan_interval, NULL,
2844 "<value> = set scan_interval parameter (in seconds)" },
2845 { "bss_expire_age", wpa_cli_cmd_bss_expire_age, NULL,
2847 "<value> = set BSS expiration age parameter" },
2848 { "bss_expire_count", wpa_cli_cmd_bss_expire_count, NULL,
2850 "<value> = set BSS expiration scan count parameter" },
2851 { "bss_flush", wpa_cli_cmd_bss_flush, NULL,
2853 "<value> = set BSS flush age (0 by default)" },
2854 { "stkstart", wpa_cli_cmd_stkstart, NULL,
2856 "<addr> = request STK negotiation with <addr>" },
2857 { "ft_ds", wpa_cli_cmd_ft_ds, wpa_cli_complete_bss,
2859 "<addr> = request over-the-DS FT with <addr>" },
2860 { "wps_pbc", wpa_cli_cmd_wps_pbc, wpa_cli_complete_bss,
2862 "[BSSID] = start Wi-Fi Protected Setup: Push Button Configuration" },
2863 { "wps_pin", wpa_cli_cmd_wps_pin, wpa_cli_complete_bss,
2864 cli_cmd_flag_sensitive,
2865 "<BSSID> [PIN] = start WPS PIN method (returns PIN, if not "
2867 { "wps_check_pin", wpa_cli_cmd_wps_check_pin, NULL,
2868 cli_cmd_flag_sensitive,
2869 "<PIN> = verify PIN checksum" },
2870 { "wps_cancel", wpa_cli_cmd_wps_cancel, NULL, cli_cmd_flag_none,
2871 "Cancels the pending WPS operation" },
2872 #ifdef CONFIG_WPS_NFC
2873 { "wps_nfc", wpa_cli_cmd_wps_nfc, wpa_cli_complete_bss,
2875 "[BSSID] = start Wi-Fi Protected Setup: NFC" },
2876 { "wps_nfc_config_token", wpa_cli_cmd_wps_nfc_config_token, NULL,
2878 "<WPS|NDEF> = build configuration token" },
2879 { "wps_nfc_token", wpa_cli_cmd_wps_nfc_token, NULL,
2881 "<WPS|NDEF> = create password token" },
2882 { "wps_nfc_tag_read", wpa_cli_cmd_wps_nfc_tag_read, NULL,
2883 cli_cmd_flag_sensitive,
2884 "<hexdump of payload> = report read NFC tag with WPS data" },
2885 { "nfc_get_handover_req", wpa_cli_cmd_nfc_get_handover_req, NULL,
2887 "<NDEF> <WPS> = create NFC handover request" },
2888 { "nfc_get_handover_sel", wpa_cli_cmd_nfc_get_handover_sel, NULL,
2890 "<NDEF> <WPS> = create NFC handover select" },
2891 { "nfc_report_handover", wpa_cli_cmd_nfc_report_handover, NULL,
2893 "<role> <type> <hexdump of req> <hexdump of sel> = report completed "
2895 #endif /* CONFIG_WPS_NFC */
2896 { "wps_reg", wpa_cli_cmd_wps_reg, wpa_cli_complete_bss,
2897 cli_cmd_flag_sensitive,
2898 "<BSSID> <AP PIN> = start WPS Registrar to configure an AP" },
2899 { "wps_ap_pin", wpa_cli_cmd_wps_ap_pin, NULL,
2900 cli_cmd_flag_sensitive,
2901 "[params..] = enable/disable AP PIN" },
2902 { "wps_er_start", wpa_cli_cmd_wps_er_start, NULL,
2904 "[IP address] = start Wi-Fi Protected Setup External Registrar" },
2905 { "wps_er_stop", wpa_cli_cmd_wps_er_stop, NULL,
2907 "= stop Wi-Fi Protected Setup External Registrar" },
2908 { "wps_er_pin", wpa_cli_cmd_wps_er_pin, NULL,
2909 cli_cmd_flag_sensitive,
2910 "<UUID> <PIN> = add an Enrollee PIN to External Registrar" },
2911 { "wps_er_pbc", wpa_cli_cmd_wps_er_pbc, NULL,
2913 "<UUID> = accept an Enrollee PBC using External Registrar" },
2914 { "wps_er_learn", wpa_cli_cmd_wps_er_learn, NULL,
2915 cli_cmd_flag_sensitive,
2916 "<UUID> <PIN> = learn AP configuration" },
2917 { "wps_er_set_config", wpa_cli_cmd_wps_er_set_config, NULL,
2919 "<UUID> <network id> = set AP configuration for enrolling" },
2920 { "wps_er_config", wpa_cli_cmd_wps_er_config, NULL,
2921 cli_cmd_flag_sensitive,
2922 "<UUID> <PIN> <SSID> <auth> <encr> <key> = configure AP" },
2923 #ifdef CONFIG_WPS_NFC
2924 { "wps_er_nfc_config_token", wpa_cli_cmd_wps_er_nfc_config_token, NULL,
2926 "<WPS/NDEF> <UUID> = build NFC configuration token" },
2927 #endif /* CONFIG_WPS_NFC */
2928 { "ibss_rsn", wpa_cli_cmd_ibss_rsn, NULL,
2930 "<addr> = request RSN authentication with <addr> in IBSS" },
2932 { "sta", wpa_cli_cmd_sta, NULL,
2934 "<addr> = get information about an associated station (AP)" },
2935 { "all_sta", wpa_cli_cmd_all_sta, NULL,
2937 "= get information about all associated stations (AP)" },
2938 { "deauthenticate", wpa_cli_cmd_deauthenticate, NULL,
2940 "<addr> = deauthenticate a station" },
2941 { "disassociate", wpa_cli_cmd_disassociate, NULL,
2943 "<addr> = disassociate a station" },
2944 { "chan_switch", wpa_cli_cmd_chanswitch, NULL,
2946 "<cs_count> <freq> [sec_channel_offset=] [center_freq1=]"
2947 " [center_freq2=] [bandwidth=] [blocktx] [ht|vht]"
2948 " = CSA parameters" },
2949 #endif /* CONFIG_AP */
2950 { "suspend", wpa_cli_cmd_suspend, NULL, cli_cmd_flag_none,
2951 "= notification of suspend/hibernate" },
2952 { "resume", wpa_cli_cmd_resume, NULL, cli_cmd_flag_none,
2953 "= notification of resume/thaw" },
2954 #ifdef CONFIG_TESTING_OPTIONS
2955 { "drop_sa", wpa_cli_cmd_drop_sa, NULL, cli_cmd_flag_none,
2956 "= drop SA without deauth/disassoc (test command)" },
2957 #endif /* CONFIG_TESTING_OPTIONS */
2958 { "roam", wpa_cli_cmd_roam, wpa_cli_complete_bss,
2960 "<addr> = roam to the specified BSS" },
2962 { "mesh_interface_add", wpa_cli_cmd_mesh_interface_add, NULL,
2964 "[ifname] = Create a new mesh interface" },
2965 { "mesh_group_add", wpa_cli_cmd_mesh_group_add, NULL,
2967 "<network id> = join a mesh network (disable others)" },
2968 { "mesh_group_remove", wpa_cli_cmd_mesh_group_remove, NULL,
2970 "<ifname> = Remove mesh group interface" },
2971 #endif /* CONFIG_MESH */
2973 { "p2p_find", wpa_cli_cmd_p2p_find, wpa_cli_complete_p2p_find,
2975 "[timeout] [type=*] = find P2P Devices for up-to timeout seconds" },
2976 { "p2p_stop_find", wpa_cli_cmd_p2p_stop_find, NULL, cli_cmd_flag_none,
2977 "= stop P2P Devices search" },
2978 { "p2p_asp_provision", wpa_cli_cmd_p2p_asp_provision, NULL,
2980 "<addr> adv_id=<adv_id> conncap=<conncap> [info=<infodata>] = provision with a P2P ASP Device" },
2981 { "p2p_asp_provision_resp", wpa_cli_cmd_p2p_asp_provision_resp, NULL,
2983 "<addr> adv_id=<adv_id> [role<conncap>] [info=<infodata>] = provision with a P2P ASP Device" },
2984 { "p2p_connect", wpa_cli_cmd_p2p_connect, wpa_cli_complete_p2p_connect,
2986 "<addr> <\"pbc\"|PIN> [ht40] = connect to a P2P Device" },
2987 { "p2p_listen", wpa_cli_cmd_p2p_listen, NULL, cli_cmd_flag_none,
2988 "[timeout] = listen for P2P Devices for up-to timeout seconds" },
2989 { "p2p_group_remove", wpa_cli_cmd_p2p_group_remove,
2990 wpa_cli_complete_p2p_group_remove, cli_cmd_flag_none,
2991 "<ifname> = remove P2P group interface (terminate group if GO)" },
2992 { "p2p_group_add", wpa_cli_cmd_p2p_group_add, NULL, cli_cmd_flag_none,
2993 "[ht40] = add a new P2P group (local end as GO)" },
2994 { "p2p_prov_disc", wpa_cli_cmd_p2p_prov_disc,
2995 wpa_cli_complete_p2p_peer, cli_cmd_flag_none,
2996 "<addr> <method> = request provisioning discovery" },
2997 { "p2p_get_passphrase", wpa_cli_cmd_p2p_get_passphrase, NULL,
2999 "= get the passphrase for a group (GO only)" },
3000 { "p2p_serv_disc_req", wpa_cli_cmd_p2p_serv_disc_req,
3001 wpa_cli_complete_p2p_peer, cli_cmd_flag_none,
3002 "<addr> <TLVs> = schedule service discovery request" },
3003 { "p2p_serv_disc_cancel_req", wpa_cli_cmd_p2p_serv_disc_cancel_req,
3004 NULL, cli_cmd_flag_none,
3005 "<id> = cancel pending service discovery request" },
3006 { "p2p_serv_disc_resp", wpa_cli_cmd_p2p_serv_disc_resp, NULL,
3008 "<freq> <addr> <dialog token> <TLVs> = service discovery response" },
3009 { "p2p_service_update", wpa_cli_cmd_p2p_service_update, NULL,
3011 "= indicate change in local services" },
3012 { "p2p_serv_disc_external", wpa_cli_cmd_p2p_serv_disc_external, NULL,
3014 "<external> = set external processing of service discovery" },
3015 { "p2p_service_flush", wpa_cli_cmd_p2p_service_flush, NULL,
3017 "= remove all stored service entries" },
3018 { "p2p_service_add", wpa_cli_cmd_p2p_service_add, NULL,
3020 "<bonjour|upnp|asp> <query|version> <response|service> = add a local "
3022 { "p2p_service_rep", wpa_cli_cmd_p2p_service_rep, NULL,
3024 "asp <auto> <adv_id> <svc_state> <svc_string> [<svc_info>] = replace "
3025 "local ASP service" },
3026 { "p2p_service_del", wpa_cli_cmd_p2p_service_del, NULL,
3028 "<bonjour|upnp> <query|version> [|service] = remove a local "
3030 { "p2p_reject", wpa_cli_cmd_p2p_reject, wpa_cli_complete_p2p_peer,
3032 "<addr> = reject connection attempts from a specific peer" },
3033 { "p2p_invite", wpa_cli_cmd_p2p_invite, NULL,
3035 "<cmd> [peer=addr] = invite peer" },
3036 { "p2p_peers", wpa_cli_cmd_p2p_peers, NULL, cli_cmd_flag_none,
3037 "[discovered] = list known (optionally, only fully discovered) P2P "
3039 { "p2p_peer", wpa_cli_cmd_p2p_peer, wpa_cli_complete_p2p_peer,
3041 "<address> = show information about known P2P peer" },
3042 { "p2p_set", wpa_cli_cmd_p2p_set, wpa_cli_complete_p2p_set,
3044 "<field> <value> = set a P2P parameter" },
3045 { "p2p_flush", wpa_cli_cmd_p2p_flush, NULL, cli_cmd_flag_none,
3046 "= flush P2P state" },
3047 { "p2p_cancel", wpa_cli_cmd_p2p_cancel, NULL, cli_cmd_flag_none,
3048 "= cancel P2P group formation" },
3049 { "p2p_unauthorize", wpa_cli_cmd_p2p_unauthorize,
3050 wpa_cli_complete_p2p_peer, cli_cmd_flag_none,
3051 "<address> = unauthorize a peer" },
3052 { "p2p_presence_req", wpa_cli_cmd_p2p_presence_req, NULL,
3054 "[<duration> <interval>] [<duration> <interval>] = request GO "
3056 { "p2p_ext_listen", wpa_cli_cmd_p2p_ext_listen, NULL,
3058 "[<period> <interval>] = set extended listen timing" },
3059 { "p2p_remove_client", wpa_cli_cmd_p2p_remove_client,
3060 wpa_cli_complete_p2p_peer, cli_cmd_flag_none,
3061 "<address|iface=address> = remove a peer from all groups" },
3062 #endif /* CONFIG_P2P */
3063 #ifdef CONFIG_WIFI_DISPLAY
3064 { "wfd_subelem_set", wpa_cli_cmd_wfd_subelem_set, NULL,
3066 "<subelem> [contents] = set Wi-Fi Display subelement" },
3067 { "wfd_subelem_get", wpa_cli_cmd_wfd_subelem_get, NULL,
3069 "<subelem> = get Wi-Fi Display subelement" },
3070 #endif /* CONFIG_WIFI_DISPLAY */
3071 #ifdef CONFIG_INTERWORKING
3072 { "fetch_anqp", wpa_cli_cmd_fetch_anqp, NULL, cli_cmd_flag_none,
3073 "= fetch ANQP information for all APs" },
3074 { "stop_fetch_anqp", wpa_cli_cmd_stop_fetch_anqp, NULL,
3076 "= stop fetch_anqp operation" },
3077 { "interworking_select", wpa_cli_cmd_interworking_select, NULL,
3079 "[auto] = perform Interworking network selection" },
3080 { "interworking_connect", wpa_cli_cmd_interworking_connect,
3081 wpa_cli_complete_bss, cli_cmd_flag_none,
3082 "<BSSID> = connect using Interworking credentials" },
3083 { "interworking_add_network", wpa_cli_cmd_interworking_add_network,
3084 wpa_cli_complete_bss, cli_cmd_flag_none,
3085 "<BSSID> = connect using Interworking credentials" },
3086 { "anqp_get", wpa_cli_cmd_anqp_get, wpa_cli_complete_bss,
3088 "<addr> <info id>[,<info id>]... = request ANQP information" },
3089 { "gas_request", wpa_cli_cmd_gas_request, wpa_cli_complete_bss,
3091 "<addr> <AdvProtoID> [QueryReq] = GAS request" },
3092 { "gas_response_get", wpa_cli_cmd_gas_response_get,
3093 wpa_cli_complete_bss, cli_cmd_flag_none,
3094 "<addr> <dialog token> [start,len] = Fetch last GAS response" },
3095 #endif /* CONFIG_INTERWORKING */
3097 { "hs20_anqp_get", wpa_cli_cmd_hs20_anqp_get, wpa_cli_complete_bss,
3099 "<addr> <subtype>[,<subtype>]... = request HS 2.0 ANQP information"
3101 { "nai_home_realm_list", wpa_cli_cmd_get_nai_home_realm_list,
3102 wpa_cli_complete_bss, cli_cmd_flag_none,
3103 "<addr> <home realm> = get HS20 nai home realm list" },
3104 { "hs20_icon_request", wpa_cli_cmd_hs20_icon_request,
3105 wpa_cli_complete_bss, cli_cmd_flag_none,
3106 "<addr> <icon name> = get Hotspot 2.0 OSU icon" },
3107 { "fetch_osu", wpa_cli_cmd_fetch_osu, NULL, cli_cmd_flag_none,
3108 "= fetch OSU provider information from all APs" },
3109 { "cancel_fetch_osu", wpa_cli_cmd_cancel_fetch_osu, NULL,
3111 "= cancel fetch_osu command" },
3112 #endif /* CONFIG_HS20 */
3113 { "sta_autoconnect", wpa_cli_cmd_sta_autoconnect, NULL,
3115 "<0/1> = disable/enable automatic reconnection" },
3116 { "tdls_discover", wpa_cli_cmd_tdls_discover, NULL,
3118 "<addr> = request TDLS discovery with <addr>" },
3119 { "tdls_setup", wpa_cli_cmd_tdls_setup, NULL,
3121 "<addr> = request TDLS setup with <addr>" },
3122 { "tdls_teardown", wpa_cli_cmd_tdls_teardown, NULL,
3124 "<addr> = tear down TDLS with <addr>" },
3125 { "wmm_ac_addts", wpa_cli_cmd_wmm_ac_addts, NULL,
3127 "<uplink/downlink/bidi> <tsid=0..7> <up=0..7> [nominal_msdu_size=#] "
3128 "[mean_data_rate=#] [min_phy_rate=#] [sba=#] [fixed_nominal_msdu] "
3129 "= add WMM-AC traffic stream" },
3130 { "wmm_ac_delts", wpa_cli_cmd_wmm_ac_delts, NULL,
3132 "<tsid> = delete WMM-AC traffic stream" },
3133 { "wmm_ac_status", wpa_cli_cmd_wmm_ac_status, NULL,
3135 "= show status for Wireless Multi-Media Admission-Control" },
3136 { "tdls_chan_switch", wpa_cli_cmd_tdls_chan_switch, NULL,
3138 "<addr> <oper class> <freq> [sec_channel_offset=] [center_freq1=] "
3139 "[center_freq2=] [bandwidth=] [ht|vht] = enable channel switching "
3141 { "tdls_cancel_chan_switch", wpa_cli_cmd_tdls_cancel_chan_switch, NULL,
3143 "<addr> = disable channel switching with TDLS peer <addr>" },
3144 { "signal_poll", wpa_cli_cmd_signal_poll, NULL,
3146 "= get signal parameters" },
3147 { "pktcnt_poll", wpa_cli_cmd_pktcnt_poll, NULL,
3149 "= get TX/RX packet counters" },
3150 { "reauthenticate", wpa_cli_cmd_reauthenticate, NULL,
3152 "= trigger IEEE 802.1X/EAPOL reauthentication" },
3153 #ifdef CONFIG_AUTOSCAN
3154 { "autoscan", wpa_cli_cmd_autoscan, NULL, cli_cmd_flag_none,
3155 "[params] = Set or unset (if none) autoscan parameters" },
3156 #endif /* CONFIG_AUTOSCAN */
3158 { "wnm_sleep", wpa_cli_cmd_wnm_sleep, NULL, cli_cmd_flag_none,
3159 "<enter/exit> [interval=#] = enter/exit WNM-Sleep mode" },
3160 { "wnm_bss_query", wpa_cli_cmd_wnm_bss_query, NULL, cli_cmd_flag_none,
3161 "<query reason> = Send BSS Transition Management Query" },
3162 #endif /* CONFIG_WNM */
3163 { "raw", wpa_cli_cmd_raw, NULL, cli_cmd_flag_sensitive,
3164 "<params..> = Sent unprocessed command" },
3165 { "flush", wpa_cli_cmd_flush, NULL, cli_cmd_flag_none,
3166 "= flush wpa_supplicant state" },
3168 { "driver", wpa_cli_cmd_driver, NULL, cli_cmd_flag_none,
3169 "<command> = driver private commands" },
3170 #endif /* ANDROID */
3171 { "radio_work", wpa_cli_cmd_radio_work, NULL, cli_cmd_flag_none,
3172 "= radio_work <show/add/done>" },
3173 { "vendor", wpa_cli_cmd_vendor, NULL, cli_cmd_flag_none,
3174 "<vendor id> <command id> [<hex formatted command argument>] = Send vendor command"
3176 { "neighbor_rep_request",
3177 wpa_cli_cmd_neighbor_rep_request, NULL, cli_cmd_flag_none,
3178 "[ssid=<SSID>] = Trigger request to AP for neighboring AP report "
3179 "(with optional given SSID, default: current SSID)"
3181 { "erp_flush", wpa_cli_cmd_erp_flush, NULL, cli_cmd_flag_none,
3182 "= flush ERP keys" },
3184 wpa_cli_cmd_mac_rand_scan, NULL, cli_cmd_flag_none,
3185 "<scan|sched|pno|all> enable=<0/1> [addr=mac-address "
3186 "mask=mac-address-mask] = scan MAC randomization"
3188 { NULL, NULL, NULL, cli_cmd_flag_none, NULL }
3193 * Prints command usage, lines are padded with the specified string.
3195 static void print_cmd_help(struct wpa_cli_cmd *cmd, const char *pad)
3200 printf("%s%s ", pad, cmd->cmd);
3201 for (n = 0; (c = cmd->usage[n]); n++) {
3210 static void print_help(const char *cmd)
3213 printf("commands:\n");
3214 for (n = 0; wpa_cli_commands[n].cmd; n++) {
3215 if (cmd == NULL || str_starts(wpa_cli_commands[n].cmd, cmd))
3216 print_cmd_help(&wpa_cli_commands[n], " ");
3221 static int wpa_cli_edit_filter_history_cb(void *ctx, const char *cmd)
3223 const char *c, *delim;
3227 delim = os_strchr(cmd, ' ');
3231 len = os_strlen(cmd);
3233 for (n = 0; (c = wpa_cli_commands[n].cmd); n++) {
3234 if (os_strncasecmp(cmd, c, len) == 0 && len == os_strlen(c))
3235 return (wpa_cli_commands[n].flags &
3236 cli_cmd_flag_sensitive);
3242 static char ** wpa_list_cmd_list(void)
3246 struct cli_txt_entry *e;
3248 count = ARRAY_SIZE(wpa_cli_commands);
3249 count += dl_list_len(&p2p_groups);
3250 count += dl_list_len(&ifnames);
3251 res = os_calloc(count + 1, sizeof(char *));
3255 for (i = 0; wpa_cli_commands[i].cmd; i++) {
3256 res[i] = os_strdup(wpa_cli_commands[i].cmd);
3261 dl_list_for_each(e, &p2p_groups, struct cli_txt_entry, list) {
3262 size_t len = 8 + os_strlen(e->txt);
3263 res[i] = os_malloc(len);
3266 os_snprintf(res[i], len, "ifname=%s", e->txt);
3270 dl_list_for_each(e, &ifnames, struct cli_txt_entry, list) {
3271 res[i] = os_strdup(e->txt);
3281 static char ** wpa_cli_cmd_completion(const char *cmd, const char *str,
3286 for (i = 0; wpa_cli_commands[i].cmd; i++) {
3287 if (os_strcasecmp(wpa_cli_commands[i].cmd, cmd) == 0) {
3288 if (wpa_cli_commands[i].completion)
3289 return wpa_cli_commands[i].completion(str,
3292 printf("\r%s\n", wpa_cli_commands[i].usage);
3302 static char ** wpa_cli_edit_completion_cb(void *ctx, const char *str, int pos)
3308 if (pos > 7 && os_strncasecmp(str, "IFNAME=", 7) == 0) {
3309 end = os_strchr(str, ' ');
3310 if (end && pos > end - str) {
3311 pos -= end - str + 1;
3316 end = os_strchr(str, ' ');
3317 if (end == NULL || str + pos < end)
3318 return wpa_list_cmd_list();
3320 cmd = os_malloc(pos + 1);
3323 os_memcpy(cmd, str, pos);
3324 cmd[end - str] = '\0';
3325 res = wpa_cli_cmd_completion(cmd, str, pos);
3331 static int wpa_request(struct wpa_ctrl *ctrl, int argc, char *argv[])
3333 struct wpa_cli_cmd *cmd, *match = NULL;
3337 if (argc > 1 && os_strncasecmp(argv[0], "IFNAME=", 7) == 0) {
3338 ifname_prefix = argv[0] + 7;
3342 ifname_prefix = NULL;
3348 cmd = wpa_cli_commands;
3350 if (os_strncasecmp(cmd->cmd, argv[0], os_strlen(argv[0])) == 0)
3353 if (os_strcasecmp(cmd->cmd, argv[0]) == 0) {
3354 /* we have an exact match */
3364 printf("Ambiguous command '%s'; possible commands:", argv[0]);
3365 cmd = wpa_cli_commands;
3367 if (os_strncasecmp(cmd->cmd, argv[0],
3368 os_strlen(argv[0])) == 0) {
3369 printf(" %s", cmd->cmd);
3375 } else if (count == 0) {
3376 printf("Unknown command '%s'\n", argv[0]);
3379 ret = match->handler(ctrl, argc - 1, &argv[1]);
3386 static int str_match(const char *a, const char *b)
3388 return os_strncmp(a, b, os_strlen(b)) == 0;
3392 static int wpa_cli_exec(const char *program, const char *arg1,
3399 len = os_strlen(arg1) + os_strlen(arg2) + 2;
3400 arg = os_malloc(len);
3403 os_snprintf(arg, len, "%s %s", arg1, arg2);
3404 res = os_exec(program, arg, 1);
3411 static void wpa_cli_action_process(const char *msg)
3414 char *copy = NULL, *id, *pos2;
3415 const char *ifname = ctrl_ifname;
3416 char ifname_buf[100];
3419 if (os_strncmp(pos, "IFNAME=", 7) == 0) {
3421 end = os_strchr(pos + 7, ' ');
3422 if (end && (unsigned int) (end - pos) < sizeof(ifname_buf)) {
3424 os_memcpy(ifname_buf, pos, end - pos);
3425 ifname_buf[end - pos] = '\0';
3426 ifname = ifname_buf;
3431 const char *prev = pos;
3433 pos = os_strchr(pos, '>');
3440 if (str_match(pos, WPA_EVENT_CONNECTED)) {
3442 os_unsetenv("WPA_ID");
3443 os_unsetenv("WPA_ID_STR");
3444 os_unsetenv("WPA_CTRL_DIR");
3446 pos = os_strstr(pos, "[id=");
3448 copy = os_strdup(pos + 4);
3452 while (*pos2 && *pos2 != ' ')
3456 os_setenv("WPA_ID", id, 1);
3457 while (*pos2 && *pos2 != '=')
3462 while (*pos2 && *pos2 != ']')
3465 os_setenv("WPA_ID_STR", id, 1);
3469 os_setenv("WPA_CTRL_DIR", ctrl_iface_dir, 1);
3471 if (wpa_cli_connected <= 0 || new_id != wpa_cli_last_id) {
3472 wpa_cli_connected = 1;
3473 wpa_cli_last_id = new_id;
3474 wpa_cli_exec(action_file, ifname, "CONNECTED");
3476 } else if (str_match(pos, WPA_EVENT_DISCONNECTED)) {
3477 if (wpa_cli_connected) {
3478 wpa_cli_connected = 0;
3479 wpa_cli_exec(action_file, ifname, "DISCONNECTED");
3481 } else if (str_match(pos, MESH_GROUP_STARTED)) {
3482 wpa_cli_exec(action_file, ctrl_ifname, pos);
3483 } else if (str_match(pos, MESH_GROUP_REMOVED)) {
3484 wpa_cli_exec(action_file, ctrl_ifname, pos);
3485 } else if (str_match(pos, MESH_PEER_CONNECTED)) {
3486 wpa_cli_exec(action_file, ctrl_ifname, pos);
3487 } else if (str_match(pos, MESH_PEER_DISCONNECTED)) {
3488 wpa_cli_exec(action_file, ctrl_ifname, pos);
3489 } else if (str_match(pos, P2P_EVENT_GROUP_STARTED)) {
3490 wpa_cli_exec(action_file, ifname, pos);
3491 } else if (str_match(pos, P2P_EVENT_GROUP_REMOVED)) {
3492 wpa_cli_exec(action_file, ifname, pos);
3493 } else if (str_match(pos, P2P_EVENT_CROSS_CONNECT_ENABLE)) {
3494 wpa_cli_exec(action_file, ifname, pos);
3495 } else if (str_match(pos, P2P_EVENT_CROSS_CONNECT_DISABLE)) {
3496 wpa_cli_exec(action_file, ifname, pos);
3497 } else if (str_match(pos, P2P_EVENT_GO_NEG_FAILURE)) {
3498 wpa_cli_exec(action_file, ifname, pos);
3499 } else if (str_match(pos, WPS_EVENT_SUCCESS)) {
3500 wpa_cli_exec(action_file, ifname, pos);
3501 } else if (str_match(pos, WPS_EVENT_FAIL)) {
3502 wpa_cli_exec(action_file, ifname, pos);
3503 } else if (str_match(pos, AP_STA_CONNECTED)) {
3504 wpa_cli_exec(action_file, ifname, pos);
3505 } else if (str_match(pos, AP_STA_DISCONNECTED)) {
3506 wpa_cli_exec(action_file, ifname, pos);
3507 } else if (str_match(pos, ESS_DISASSOC_IMMINENT)) {
3508 wpa_cli_exec(action_file, ifname, pos);
3509 } else if (str_match(pos, HS20_SUBSCRIPTION_REMEDIATION)) {
3510 wpa_cli_exec(action_file, ifname, pos);
3511 } else if (str_match(pos, HS20_DEAUTH_IMMINENT_NOTICE)) {
3512 wpa_cli_exec(action_file, ifname, pos);
3513 } else if (str_match(pos, WPA_EVENT_TERMINATING)) {
3514 printf("wpa_supplicant is terminating - stop monitoring\n");
3520 #ifndef CONFIG_ANSI_C_EXTRA
3521 static void wpa_cli_action_cb(char *msg, size_t len)
3523 wpa_cli_action_process(msg);
3525 #endif /* CONFIG_ANSI_C_EXTRA */
3528 static void wpa_cli_reconnect(void)
3530 wpa_cli_close_connection();
3531 if (wpa_cli_open_connection(ctrl_ifname, 1) < 0)
3536 printf("\rConnection to wpa_supplicant re-established\n");
3542 static void cli_event(const char *str)
3544 const char *start, *s;
3546 start = os_strchr(str, '>');
3552 if (str_starts(start, WPA_EVENT_BSS_ADDED)) {
3553 s = os_strchr(start, ' ');
3556 s = os_strchr(s + 1, ' ');
3559 cli_txt_list_add(&bsses, s + 1);
3563 if (str_starts(start, WPA_EVENT_BSS_REMOVED)) {
3564 s = os_strchr(start, ' ');
3567 s = os_strchr(s + 1, ' ');
3570 cli_txt_list_del_addr(&bsses, s + 1);
3575 if (str_starts(start, P2P_EVENT_DEVICE_FOUND)) {
3576 s = os_strstr(start, " p2p_dev_addr=");
3579 cli_txt_list_add_addr(&p2p_peers, s + 14);
3583 if (str_starts(start, P2P_EVENT_DEVICE_LOST)) {
3584 s = os_strstr(start, " p2p_dev_addr=");
3587 cli_txt_list_del_addr(&p2p_peers, s + 14);
3591 if (str_starts(start, P2P_EVENT_GROUP_STARTED)) {
3592 s = os_strchr(start, ' ');
3595 cli_txt_list_add_word(&p2p_groups, s + 1);
3599 if (str_starts(start, P2P_EVENT_GROUP_REMOVED)) {
3600 s = os_strchr(start, ' ');
3603 cli_txt_list_del_word(&p2p_groups, s + 1);
3606 #endif /* CONFIG_P2P */
3610 static int check_terminating(const char *msg)
3612 const char *pos = msg;
3616 pos = os_strchr(pos, '>');
3623 if (str_match(pos, WPA_EVENT_TERMINATING) && ctrl_conn) {
3625 printf("\rConnection to wpa_supplicant lost - trying to "
3628 wpa_cli_attached = 0;
3629 wpa_cli_close_connection();
3637 static void wpa_cli_recv_pending(struct wpa_ctrl *ctrl, int action_monitor)
3639 if (ctrl_conn == NULL) {
3640 wpa_cli_reconnect();
3643 while (wpa_ctrl_pending(ctrl) > 0) {
3645 size_t len = sizeof(buf) - 1;
3646 if (wpa_ctrl_recv(ctrl, buf, &len) == 0) {
3649 wpa_cli_action_process(buf);
3652 if (wpa_cli_show_event(buf)) {
3654 printf("\r%s\n", buf);
3658 if (interactive && check_terminating(buf) > 0)
3662 printf("Could not read pending message.\n");
3667 if (wpa_ctrl_pending(ctrl) < 0) {
3668 printf("Connection to wpa_supplicant lost - trying to "
3670 wpa_cli_reconnect();
3676 static int tokenize_cmd(char *cmd, char *argv[])
3689 if (argc == max_args)
3692 char *pos2 = os_strrchr(pos, '"');
3696 while (*pos != '\0' && *pos != ' ')
3706 static void wpa_cli_ping(void *eloop_ctx, void *timeout_ctx)
3710 char *prefix = ifname_prefix;
3712 ifname_prefix = NULL;
3713 res = _wpa_ctrl_command(ctrl_conn, "PING", 0);
3714 ifname_prefix = prefix;
3716 printf("Connection to wpa_supplicant lost - trying to "
3718 wpa_cli_close_connection();
3722 wpa_cli_reconnect();
3723 eloop_register_timeout(ping_interval, 0, wpa_cli_ping, NULL, NULL);
3727 static void wpa_cli_mon_receive(int sock, void *eloop_ctx, void *sock_ctx)
3729 wpa_cli_recv_pending(mon_conn, 0);
3733 static void wpa_cli_edit_cmd_cb(void *ctx, char *cmd)
3735 char *argv[max_args];
3737 argc = tokenize_cmd(cmd, argv);
3739 wpa_request(ctrl_conn, argc, argv);
3743 static void wpa_cli_edit_eof_cb(void *ctx)
3749 static int warning_displayed = 0;
3750 static char *hfile = NULL;
3751 static int edit_started = 0;
3753 static void start_edit(void)
3758 #ifdef CONFIG_CTRL_IFACE_UDP_REMOTE
3759 ps = wpa_ctrl_get_remote_ifname(ctrl_conn);
3760 #endif /* CONFIG_CTRL_IFACE_UDP_REMOTE */
3762 home = getenv("HOME");
3764 const char *fname = ".wpa_cli_history";
3765 int hfile_len = os_strlen(home) + 1 + os_strlen(fname) + 1;
3766 hfile = os_malloc(hfile_len);
3768 os_snprintf(hfile, hfile_len, "%s/%s", home, fname);
3771 if (edit_init(wpa_cli_edit_cmd_cb, wpa_cli_edit_eof_cb,
3772 wpa_cli_edit_completion_cb, NULL, hfile, ps) < 0) {
3778 eloop_register_timeout(ping_interval, 0, wpa_cli_ping, NULL, NULL);
3782 static void update_bssid_list(struct wpa_ctrl *ctrl)
3785 size_t len = sizeof(buf);
3787 char *cmd = "BSS RANGE=ALL MASK=0x2";
3792 ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len, NULL);
3799 pos = os_strstr(pos, "bssid=");
3803 end = os_strchr(pos, '\n');
3807 cli_txt_list_add(&bsses, pos);
3813 static void update_ifnames(struct wpa_ctrl *ctrl)
3816 size_t len = sizeof(buf);
3818 char *cmd = "INTERFACES";
3822 cli_txt_list_flush(&ifnames);
3826 ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len, NULL);
3833 end = os_strchr(pos, '\n');
3837 ret = os_snprintf(txt, sizeof(txt), "ifname=%s", pos);
3838 if (!os_snprintf_error(sizeof(txt), ret))
3839 cli_txt_list_add(&ifnames, txt);
3845 static void try_connection(void *eloop_ctx, void *timeout_ctx)
3850 if (ctrl_ifname == NULL)
3851 ctrl_ifname = wpa_cli_get_default_ifname();
3853 if (!wpa_cli_open_connection(ctrl_ifname, 1) == 0) {
3854 if (!warning_displayed) {
3855 printf("Could not connect to wpa_supplicant: "
3857 ctrl_ifname ? ctrl_ifname : "(nil)");
3858 warning_displayed = 1;
3860 eloop_register_timeout(1, 0, try_connection, NULL, NULL);
3864 update_bssid_list(ctrl_conn);
3866 if (warning_displayed)
3867 printf("Connection established.\n");
3874 static void wpa_cli_interactive(void)
3876 printf("\nInteractive mode\n\n");
3878 eloop_register_timeout(0, 0, try_connection, NULL, NULL);
3880 eloop_cancel_timeout(try_connection, NULL, NULL);
3882 cli_txt_list_flush(&p2p_peers);
3883 cli_txt_list_flush(&p2p_groups);
3884 cli_txt_list_flush(&bsses);
3885 cli_txt_list_flush(&ifnames);
3887 edit_deinit(hfile, wpa_cli_edit_filter_history_cb);
3889 eloop_cancel_timeout(wpa_cli_ping, NULL, NULL);
3890 wpa_cli_close_connection();
3894 static void wpa_cli_action(struct wpa_ctrl *ctrl)
3896 #ifdef CONFIG_ANSI_C_EXTRA
3897 /* TODO: ANSI C version(?) */
3898 printf("Action processing not supported in ANSI C build.\n");
3899 #else /* CONFIG_ANSI_C_EXTRA */
3903 char buf[256]; /* note: large enough to fit in unsolicited messages */
3906 fd = wpa_ctrl_get_fd(ctrl);
3908 while (!wpa_cli_quit) {
3911 tv.tv_sec = ping_interval;
3913 res = select(fd + 1, &rfds, NULL, NULL, &tv);
3914 if (res < 0 && errno != EINTR) {
3919 if (FD_ISSET(fd, &rfds))
3920 wpa_cli_recv_pending(ctrl, 1);
3922 /* verify that connection is still working */
3923 len = sizeof(buf) - 1;
3924 if (wpa_ctrl_request(ctrl, "PING", 4, buf, &len,
3925 wpa_cli_action_cb) < 0 ||
3926 len < 4 || os_memcmp(buf, "PONG", 4) != 0) {
3927 printf("wpa_supplicant did not reply to PING "
3928 "command - exiting\n");
3933 #endif /* CONFIG_ANSI_C_EXTRA */
3937 static void wpa_cli_cleanup(void)
3939 wpa_cli_close_connection();
3941 os_daemonize_terminate(pid_file);
3943 os_program_deinit();
3947 static void wpa_cli_terminate(int sig, void *ctx)
3953 static char * wpa_cli_get_default_ifname(void)
3955 char *ifname = NULL;
3957 #ifdef CONFIG_CTRL_IFACE_UNIX
3958 struct dirent *dent;
3959 DIR *dir = opendir(ctrl_iface_dir);
3962 char ifprop[PROPERTY_VALUE_MAX];
3963 if (property_get("wifi.interface", ifprop, NULL) != 0) {
3964 ifname = os_strdup(ifprop);
3965 printf("Using interface '%s'\n", ifname);
3968 #endif /* ANDROID */
3971 while ((dent = readdir(dir))) {
3972 #ifdef _DIRENT_HAVE_D_TYPE
3974 * Skip the file if it is not a socket. Also accept
3975 * DT_UNKNOWN (0) in case the C library or underlying
3976 * file system does not support d_type.
3978 if (dent->d_type != DT_SOCK && dent->d_type != DT_UNKNOWN)
3980 #endif /* _DIRENT_HAVE_D_TYPE */
3981 if (os_strcmp(dent->d_name, ".") == 0 ||
3982 os_strcmp(dent->d_name, "..") == 0)
3984 printf("Selected interface '%s'\n", dent->d_name);
3985 ifname = os_strdup(dent->d_name);
3989 #endif /* CONFIG_CTRL_IFACE_UNIX */
3991 #ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
3992 char buf[4096], *pos;
3994 struct wpa_ctrl *ctrl;
3997 ctrl = wpa_ctrl_open(NULL);
4001 len = sizeof(buf) - 1;
4002 ret = wpa_ctrl_request(ctrl, "INTERFACES", 10, buf, &len, NULL);
4005 pos = os_strchr(buf, '\n');
4008 ifname = os_strdup(buf);
4010 wpa_ctrl_close(ctrl);
4011 #endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
4017 int main(int argc, char *argv[])
4022 const char *global = NULL;
4024 if (os_program_init())
4028 c = getopt(argc, argv, "a:Bg:G:hi:p:P:v");
4033 action_file = optarg;
4042 ping_interval = atoi(optarg);
4048 printf("%s\n", wpa_cli_version);
4051 os_free(ctrl_ifname);
4052 ctrl_ifname = os_strdup(optarg);
4055 ctrl_iface_dir = optarg;
4066 interactive = (argc == optind) && (action_file == NULL);
4069 printf("%s\n\n%s\n\n", wpa_cli_version, wpa_cli_license);
4075 #ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
4076 ctrl_conn = wpa_ctrl_open(NULL);
4077 #else /* CONFIG_CTRL_IFACE_NAMED_PIPE */
4078 ctrl_conn = wpa_ctrl_open(global);
4079 #endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
4080 if (ctrl_conn == NULL) {
4081 fprintf(stderr, "Failed to connect to wpa_supplicant "
4082 "global interface: %s error: %s\n",
4083 global, strerror(errno));
4088 update_ifnames(ctrl_conn);
4089 mon_conn = wpa_ctrl_open(global);
4091 if (wpa_ctrl_attach(mon_conn) == 0) {
4092 wpa_cli_attached = 1;
4093 eloop_register_read_sock(
4094 wpa_ctrl_get_fd(mon_conn),
4095 wpa_cli_mon_receive,
4098 printf("Failed to open monitor "
4099 "connection through global "
4100 "control interface\n");
4106 eloop_register_signal_terminate(wpa_cli_terminate, NULL);
4108 if (ctrl_ifname == NULL)
4109 ctrl_ifname = wpa_cli_get_default_ifname();
4112 wpa_cli_interactive();
4115 wpa_cli_open_connection(ctrl_ifname, 0) < 0) {
4116 fprintf(stderr, "Failed to connect to non-global "
4117 "ctrl_ifname: %s error: %s\n",
4118 ctrl_ifname ? ctrl_ifname : "(nil)",
4124 if (wpa_ctrl_attach(ctrl_conn) == 0) {
4125 wpa_cli_attached = 1;
4127 printf("Warning: Failed to attach to "
4128 "wpa_supplicant.\n");
4133 if (daemonize && os_daemonize(pid_file))
4137 wpa_cli_action(ctrl_conn);
4139 ret = wpa_request(ctrl_conn, argc - optind,
4143 os_free(ctrl_ifname);
4150 #else /* CONFIG_CTRL_IFACE */
4151 int main(int argc, char *argv[])
4153 printf("CONFIG_CTRL_IFACE not defined - wpa_cli disabled\n");
4156 #endif /* CONFIG_CTRL_IFACE */