xref: /aosp_15_r20/external/wpa_supplicant_8/hostapd/hostapd_cli.c (revision 03f9172ca588f91df233974f4258bab95191f931)
1*03f9172cSAndroid Build Coastguard Worker /*
2*03f9172cSAndroid Build Coastguard Worker  * hostapd - command line interface for hostapd daemon
3*03f9172cSAndroid Build Coastguard Worker  * Copyright (c) 2004-2022, Jouni Malinen <[email protected]>
4*03f9172cSAndroid Build Coastguard Worker  *
5*03f9172cSAndroid Build Coastguard Worker  * This software may be distributed under the terms of the BSD license.
6*03f9172cSAndroid Build Coastguard Worker  * See README for more details.
7*03f9172cSAndroid Build Coastguard Worker  */
8*03f9172cSAndroid Build Coastguard Worker 
9*03f9172cSAndroid Build Coastguard Worker #include "includes.h"
10*03f9172cSAndroid Build Coastguard Worker #include <dirent.h>
11*03f9172cSAndroid Build Coastguard Worker 
12*03f9172cSAndroid Build Coastguard Worker #include "common/wpa_ctrl.h"
13*03f9172cSAndroid Build Coastguard Worker #include "common/ieee802_11_defs.h"
14*03f9172cSAndroid Build Coastguard Worker #include "utils/common.h"
15*03f9172cSAndroid Build Coastguard Worker #include "utils/eloop.h"
16*03f9172cSAndroid Build Coastguard Worker #include "utils/edit.h"
17*03f9172cSAndroid Build Coastguard Worker #include "common/version.h"
18*03f9172cSAndroid Build Coastguard Worker #include "common/cli.h"
19*03f9172cSAndroid Build Coastguard Worker 
20*03f9172cSAndroid Build Coastguard Worker #ifndef CONFIG_NO_CTRL_IFACE
21*03f9172cSAndroid Build Coastguard Worker 
22*03f9172cSAndroid Build Coastguard Worker static const char *const hostapd_cli_version =
23*03f9172cSAndroid Build Coastguard Worker "hostapd_cli v" VERSION_STR "\n"
24*03f9172cSAndroid Build Coastguard Worker "Copyright (c) 2004-2024, Jouni Malinen <[email protected]> and contributors";
25*03f9172cSAndroid Build Coastguard Worker 
26*03f9172cSAndroid Build Coastguard Worker static struct wpa_ctrl *ctrl_conn;
27*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_quit = 0;
28*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_attached = 0;
29*03f9172cSAndroid Build Coastguard Worker 
30*03f9172cSAndroid Build Coastguard Worker #ifndef CONFIG_CTRL_IFACE_DIR
31*03f9172cSAndroid Build Coastguard Worker #define CONFIG_CTRL_IFACE_DIR "/var/run/hostapd"
32*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_CTRL_IFACE_DIR */
33*03f9172cSAndroid Build Coastguard Worker static const char *ctrl_iface_dir = CONFIG_CTRL_IFACE_DIR;
34*03f9172cSAndroid Build Coastguard Worker static const char *client_socket_dir = NULL;
35*03f9172cSAndroid Build Coastguard Worker 
36*03f9172cSAndroid Build Coastguard Worker static char *ctrl_ifname = NULL;
37*03f9172cSAndroid Build Coastguard Worker static const char *pid_file = NULL;
38*03f9172cSAndroid Build Coastguard Worker static const char *action_file = NULL;
39*03f9172cSAndroid Build Coastguard Worker static int ping_interval = 5;
40*03f9172cSAndroid Build Coastguard Worker static int interactive = 0;
41*03f9172cSAndroid Build Coastguard Worker static int event_handler_registered = 0;
42*03f9172cSAndroid Build Coastguard Worker 
43*03f9172cSAndroid Build Coastguard Worker static DEFINE_DL_LIST(stations); /* struct cli_txt_entry */
44*03f9172cSAndroid Build Coastguard Worker 
45*03f9172cSAndroid Build Coastguard Worker static void print_help(FILE *stream, const char *cmd);
46*03f9172cSAndroid Build Coastguard Worker static char ** list_cmd_list(void);
47*03f9172cSAndroid Build Coastguard Worker static void hostapd_cli_receive(int sock, void *eloop_ctx, void *sock_ctx);
48*03f9172cSAndroid Build Coastguard Worker static void update_stations(struct wpa_ctrl *ctrl);
49*03f9172cSAndroid Build Coastguard Worker static void cli_event(const char *str);
50*03f9172cSAndroid Build Coastguard Worker 
51*03f9172cSAndroid Build Coastguard Worker 
usage(void)52*03f9172cSAndroid Build Coastguard Worker static void usage(void)
53*03f9172cSAndroid Build Coastguard Worker {
54*03f9172cSAndroid Build Coastguard Worker 	fprintf(stderr, "%s\n", hostapd_cli_version);
55*03f9172cSAndroid Build Coastguard Worker 	fprintf(stderr,
56*03f9172cSAndroid Build Coastguard Worker 		"\n"
57*03f9172cSAndroid Build Coastguard Worker 		"usage: hostapd_cli [-p<path>] [-i<ifname>] "
58*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_IEEE80211BE
59*03f9172cSAndroid Build Coastguard Worker 		"[-l<link_id>] "
60*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_IEEE80211BE */
61*03f9172cSAndroid Build Coastguard Worker 		"[-hvBr] "
62*03f9172cSAndroid Build Coastguard Worker 		"[-a<path>] \\\n"
63*03f9172cSAndroid Build Coastguard Worker 		"                   [-P<pid file>] [-G<ping interval>] [command..]\n"
64*03f9172cSAndroid Build Coastguard Worker 		"\n"
65*03f9172cSAndroid Build Coastguard Worker 		"Options:\n"
66*03f9172cSAndroid Build Coastguard Worker 		"   -h           help (show this usage text)\n"
67*03f9172cSAndroid Build Coastguard Worker 		"   -v           shown version information\n"
68*03f9172cSAndroid Build Coastguard Worker 		"   -p<path>     path to find control sockets (default: "
69*03f9172cSAndroid Build Coastguard Worker 		"/var/run/hostapd)\n"
70*03f9172cSAndroid Build Coastguard Worker 		"   -s<dir_path> dir path to open client sockets (default: "
71*03f9172cSAndroid Build Coastguard Worker 		CONFIG_CTRL_IFACE_DIR ")\n"
72*03f9172cSAndroid Build Coastguard Worker 		"   -a<file>     run in daemon mode executing the action file "
73*03f9172cSAndroid Build Coastguard Worker 		"based on events\n"
74*03f9172cSAndroid Build Coastguard Worker 		"                from hostapd\n"
75*03f9172cSAndroid Build Coastguard Worker 		"   -r           try to reconnect when client socket is "
76*03f9172cSAndroid Build Coastguard Worker 		"disconnected.\n"
77*03f9172cSAndroid Build Coastguard Worker 		"                This is useful only when used with -a.\n"
78*03f9172cSAndroid Build Coastguard Worker 		"   -B           run a daemon in the background\n"
79*03f9172cSAndroid Build Coastguard Worker 		"   -i<ifname>   Interface to listen on (default: first "
80*03f9172cSAndroid Build Coastguard Worker 		"interface found in the\n"
81*03f9172cSAndroid Build Coastguard Worker 		"                socket path)\n"
82*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_IEEE80211BE
83*03f9172cSAndroid Build Coastguard Worker 		"   -l<link_id>  Link ID of the interface in case of Multi-Link Operation\n"
84*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_IEEE80211BE */
85*03f9172cSAndroid Build Coastguard Worker 		"\n");
86*03f9172cSAndroid Build Coastguard Worker 	print_help(stderr, NULL);
87*03f9172cSAndroid Build Coastguard Worker }
88*03f9172cSAndroid Build Coastguard Worker 
89*03f9172cSAndroid Build Coastguard Worker 
register_event_handler(struct wpa_ctrl * ctrl)90*03f9172cSAndroid Build Coastguard Worker static void register_event_handler(struct wpa_ctrl *ctrl)
91*03f9172cSAndroid Build Coastguard Worker {
92*03f9172cSAndroid Build Coastguard Worker 	if (!ctrl_conn)
93*03f9172cSAndroid Build Coastguard Worker 		return;
94*03f9172cSAndroid Build Coastguard Worker 	if (interactive) {
95*03f9172cSAndroid Build Coastguard Worker 		event_handler_registered =
96*03f9172cSAndroid Build Coastguard Worker 			!eloop_register_read_sock(wpa_ctrl_get_fd(ctrl),
97*03f9172cSAndroid Build Coastguard Worker 						  hostapd_cli_receive,
98*03f9172cSAndroid Build Coastguard Worker 						  NULL, NULL);
99*03f9172cSAndroid Build Coastguard Worker 	}
100*03f9172cSAndroid Build Coastguard Worker }
101*03f9172cSAndroid Build Coastguard Worker 
102*03f9172cSAndroid Build Coastguard Worker 
unregister_event_handler(struct wpa_ctrl * ctrl)103*03f9172cSAndroid Build Coastguard Worker static void unregister_event_handler(struct wpa_ctrl *ctrl)
104*03f9172cSAndroid Build Coastguard Worker {
105*03f9172cSAndroid Build Coastguard Worker 	if (!ctrl_conn)
106*03f9172cSAndroid Build Coastguard Worker 		return;
107*03f9172cSAndroid Build Coastguard Worker 	if (interactive && event_handler_registered) {
108*03f9172cSAndroid Build Coastguard Worker 		eloop_unregister_read_sock(wpa_ctrl_get_fd(ctrl));
109*03f9172cSAndroid Build Coastguard Worker 		event_handler_registered = 0;
110*03f9172cSAndroid Build Coastguard Worker 	}
111*03f9172cSAndroid Build Coastguard Worker }
112*03f9172cSAndroid Build Coastguard Worker 
113*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_open_connection(const char * ifname)114*03f9172cSAndroid Build Coastguard Worker static struct wpa_ctrl * hostapd_cli_open_connection(const char *ifname)
115*03f9172cSAndroid Build Coastguard Worker {
116*03f9172cSAndroid Build Coastguard Worker #ifndef CONFIG_CTRL_IFACE_UDP
117*03f9172cSAndroid Build Coastguard Worker 	char *cfile;
118*03f9172cSAndroid Build Coastguard Worker 	int flen;
119*03f9172cSAndroid Build Coastguard Worker #endif /* !CONFIG_CTRL_IFACE_UDP */
120*03f9172cSAndroid Build Coastguard Worker 
121*03f9172cSAndroid Build Coastguard Worker 	if (ifname == NULL)
122*03f9172cSAndroid Build Coastguard Worker 		return NULL;
123*03f9172cSAndroid Build Coastguard Worker 
124*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_CTRL_IFACE_UDP
125*03f9172cSAndroid Build Coastguard Worker 	ctrl_conn = wpa_ctrl_open(ifname);
126*03f9172cSAndroid Build Coastguard Worker 	return ctrl_conn;
127*03f9172cSAndroid Build Coastguard Worker #else /* CONFIG_CTRL_IFACE_UDP */
128*03f9172cSAndroid Build Coastguard Worker 	flen = strlen(ctrl_iface_dir) + strlen(ifname) + 2;
129*03f9172cSAndroid Build Coastguard Worker 	cfile = malloc(flen);
130*03f9172cSAndroid Build Coastguard Worker 	if (cfile == NULL)
131*03f9172cSAndroid Build Coastguard Worker 		return NULL;
132*03f9172cSAndroid Build Coastguard Worker 	snprintf(cfile, flen, "%s/%s", ctrl_iface_dir, ifname);
133*03f9172cSAndroid Build Coastguard Worker 
134*03f9172cSAndroid Build Coastguard Worker 	if (client_socket_dir && client_socket_dir[0] &&
135*03f9172cSAndroid Build Coastguard Worker 	    access(client_socket_dir, F_OK) < 0) {
136*03f9172cSAndroid Build Coastguard Worker 		perror(client_socket_dir);
137*03f9172cSAndroid Build Coastguard Worker 		free(cfile);
138*03f9172cSAndroid Build Coastguard Worker 		return NULL;
139*03f9172cSAndroid Build Coastguard Worker 	}
140*03f9172cSAndroid Build Coastguard Worker 
141*03f9172cSAndroid Build Coastguard Worker 	ctrl_conn = wpa_ctrl_open2(cfile, client_socket_dir);
142*03f9172cSAndroid Build Coastguard Worker 	free(cfile);
143*03f9172cSAndroid Build Coastguard Worker 	return ctrl_conn;
144*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_CTRL_IFACE_UDP */
145*03f9172cSAndroid Build Coastguard Worker }
146*03f9172cSAndroid Build Coastguard Worker 
147*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_close_connection(void)148*03f9172cSAndroid Build Coastguard Worker static void hostapd_cli_close_connection(void)
149*03f9172cSAndroid Build Coastguard Worker {
150*03f9172cSAndroid Build Coastguard Worker 	if (ctrl_conn == NULL)
151*03f9172cSAndroid Build Coastguard Worker 		return;
152*03f9172cSAndroid Build Coastguard Worker 
153*03f9172cSAndroid Build Coastguard Worker 	unregister_event_handler(ctrl_conn);
154*03f9172cSAndroid Build Coastguard Worker 	if (hostapd_cli_attached) {
155*03f9172cSAndroid Build Coastguard Worker 		wpa_ctrl_detach(ctrl_conn);
156*03f9172cSAndroid Build Coastguard Worker 		hostapd_cli_attached = 0;
157*03f9172cSAndroid Build Coastguard Worker 	}
158*03f9172cSAndroid Build Coastguard Worker 	wpa_ctrl_close(ctrl_conn);
159*03f9172cSAndroid Build Coastguard Worker 	ctrl_conn = NULL;
160*03f9172cSAndroid Build Coastguard Worker }
161*03f9172cSAndroid Build Coastguard Worker 
162*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_reconnect(const char * ifname)163*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_reconnect(const char *ifname)
164*03f9172cSAndroid Build Coastguard Worker {
165*03f9172cSAndroid Build Coastguard Worker 	char *next_ctrl_ifname;
166*03f9172cSAndroid Build Coastguard Worker 
167*03f9172cSAndroid Build Coastguard Worker 	hostapd_cli_close_connection();
168*03f9172cSAndroid Build Coastguard Worker 
169*03f9172cSAndroid Build Coastguard Worker 	if (!ifname)
170*03f9172cSAndroid Build Coastguard Worker 		return -1;
171*03f9172cSAndroid Build Coastguard Worker 
172*03f9172cSAndroid Build Coastguard Worker 	next_ctrl_ifname = os_strdup(ifname);
173*03f9172cSAndroid Build Coastguard Worker 	os_free(ctrl_ifname);
174*03f9172cSAndroid Build Coastguard Worker 	ctrl_ifname = next_ctrl_ifname;
175*03f9172cSAndroid Build Coastguard Worker 	if (!ctrl_ifname)
176*03f9172cSAndroid Build Coastguard Worker 		return -1;
177*03f9172cSAndroid Build Coastguard Worker 
178*03f9172cSAndroid Build Coastguard Worker 	ctrl_conn = hostapd_cli_open_connection(ctrl_ifname);
179*03f9172cSAndroid Build Coastguard Worker 	if (!ctrl_conn)
180*03f9172cSAndroid Build Coastguard Worker 		return -1;
181*03f9172cSAndroid Build Coastguard Worker 	if (!interactive && !action_file)
182*03f9172cSAndroid Build Coastguard Worker 		return 0;
183*03f9172cSAndroid Build Coastguard Worker 	if (wpa_ctrl_attach(ctrl_conn) == 0) {
184*03f9172cSAndroid Build Coastguard Worker 		hostapd_cli_attached = 1;
185*03f9172cSAndroid Build Coastguard Worker 		register_event_handler(ctrl_conn);
186*03f9172cSAndroid Build Coastguard Worker 		update_stations(ctrl_conn);
187*03f9172cSAndroid Build Coastguard Worker 	} else {
188*03f9172cSAndroid Build Coastguard Worker 		printf("Warning: Failed to attach to hostapd.\n");
189*03f9172cSAndroid Build Coastguard Worker 	}
190*03f9172cSAndroid Build Coastguard Worker 	return 0;
191*03f9172cSAndroid Build Coastguard Worker }
192*03f9172cSAndroid Build Coastguard Worker 
193*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_msg_cb(char * msg,size_t len)194*03f9172cSAndroid Build Coastguard Worker static void hostapd_cli_msg_cb(char *msg, size_t len)
195*03f9172cSAndroid Build Coastguard Worker {
196*03f9172cSAndroid Build Coastguard Worker 	cli_event(msg);
197*03f9172cSAndroid Build Coastguard Worker 	printf("%s\n", msg);
198*03f9172cSAndroid Build Coastguard Worker }
199*03f9172cSAndroid Build Coastguard Worker 
200*03f9172cSAndroid Build Coastguard Worker 
_wpa_ctrl_command(struct wpa_ctrl * ctrl,const char * cmd,int print)201*03f9172cSAndroid Build Coastguard Worker static int _wpa_ctrl_command(struct wpa_ctrl *ctrl, const char *cmd, int print)
202*03f9172cSAndroid Build Coastguard Worker {
203*03f9172cSAndroid Build Coastguard Worker 	char buf[4096];
204*03f9172cSAndroid Build Coastguard Worker 	size_t len;
205*03f9172cSAndroid Build Coastguard Worker 	int ret;
206*03f9172cSAndroid Build Coastguard Worker 
207*03f9172cSAndroid Build Coastguard Worker 	if (ctrl_conn == NULL) {
208*03f9172cSAndroid Build Coastguard Worker 		printf("Not connected to hostapd - command dropped.\n");
209*03f9172cSAndroid Build Coastguard Worker 		return -1;
210*03f9172cSAndroid Build Coastguard Worker 	}
211*03f9172cSAndroid Build Coastguard Worker 	len = sizeof(buf) - 1;
212*03f9172cSAndroid Build Coastguard Worker 	ret = wpa_ctrl_request(ctrl, cmd, strlen(cmd), buf, &len,
213*03f9172cSAndroid Build Coastguard Worker 			       hostapd_cli_msg_cb);
214*03f9172cSAndroid Build Coastguard Worker 	if (ret == -2) {
215*03f9172cSAndroid Build Coastguard Worker 		printf("'%s' command timed out.\n", cmd);
216*03f9172cSAndroid Build Coastguard Worker 		return -2;
217*03f9172cSAndroid Build Coastguard Worker 	} else if (ret < 0) {
218*03f9172cSAndroid Build Coastguard Worker 		printf("'%s' command failed.\n", cmd);
219*03f9172cSAndroid Build Coastguard Worker 		return -1;
220*03f9172cSAndroid Build Coastguard Worker 	}
221*03f9172cSAndroid Build Coastguard Worker 	if (print) {
222*03f9172cSAndroid Build Coastguard Worker 		buf[len] = '\0';
223*03f9172cSAndroid Build Coastguard Worker 		printf("%s", buf);
224*03f9172cSAndroid Build Coastguard Worker 	}
225*03f9172cSAndroid Build Coastguard Worker 	return 0;
226*03f9172cSAndroid Build Coastguard Worker }
227*03f9172cSAndroid Build Coastguard Worker 
228*03f9172cSAndroid Build Coastguard Worker 
wpa_ctrl_command(struct wpa_ctrl * ctrl,const char * cmd)229*03f9172cSAndroid Build Coastguard Worker static inline int wpa_ctrl_command(struct wpa_ctrl *ctrl, const char *cmd)
230*03f9172cSAndroid Build Coastguard Worker {
231*03f9172cSAndroid Build Coastguard Worker 	return _wpa_ctrl_command(ctrl, cmd, 1);
232*03f9172cSAndroid Build Coastguard Worker }
233*03f9172cSAndroid Build Coastguard Worker 
234*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd(struct wpa_ctrl * ctrl,const char * cmd,int min_args,int argc,char * argv[])235*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd(struct wpa_ctrl *ctrl, const char *cmd,
236*03f9172cSAndroid Build Coastguard Worker 			   int min_args, int argc, char *argv[])
237*03f9172cSAndroid Build Coastguard Worker {
238*03f9172cSAndroid Build Coastguard Worker 	char buf[4096];
239*03f9172cSAndroid Build Coastguard Worker 
240*03f9172cSAndroid Build Coastguard Worker 	if (argc < min_args) {
241*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid %s command - at least %d argument%s required.\n",
242*03f9172cSAndroid Build Coastguard Worker 		       cmd, min_args, min_args > 1 ? "s are" : " is");
243*03f9172cSAndroid Build Coastguard Worker 		return -1;
244*03f9172cSAndroid Build Coastguard Worker 	}
245*03f9172cSAndroid Build Coastguard Worker 	if (write_cmd(buf, sizeof(buf), cmd, argc, argv) < 0)
246*03f9172cSAndroid Build Coastguard Worker 		return -1;
247*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, buf);
248*03f9172cSAndroid Build Coastguard Worker }
249*03f9172cSAndroid Build Coastguard Worker 
250*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_ping(struct wpa_ctrl * ctrl,int argc,char * argv[])251*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_ping(struct wpa_ctrl *ctrl, int argc, char *argv[])
252*03f9172cSAndroid Build Coastguard Worker {
253*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "PING");
254*03f9172cSAndroid Build Coastguard Worker }
255*03f9172cSAndroid Build Coastguard Worker 
256*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_relog(struct wpa_ctrl * ctrl,int argc,char * argv[])257*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_relog(struct wpa_ctrl *ctrl, int argc, char *argv[])
258*03f9172cSAndroid Build Coastguard Worker {
259*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "RELOG");
260*03f9172cSAndroid Build Coastguard Worker }
261*03f9172cSAndroid Build Coastguard Worker 
262*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_close_log(struct wpa_ctrl * ctrl,int argc,char * argv[])263*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_close_log(struct wpa_ctrl *ctrl, int argc,
264*03f9172cSAndroid Build Coastguard Worker 				     char *argv[])
265*03f9172cSAndroid Build Coastguard Worker {
266*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "CLOSE_LOG");
267*03f9172cSAndroid Build Coastguard Worker }
268*03f9172cSAndroid Build Coastguard Worker 
269*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_status(struct wpa_ctrl * ctrl,int argc,char * argv[])270*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_status(struct wpa_ctrl *ctrl, int argc, char *argv[])
271*03f9172cSAndroid Build Coastguard Worker {
272*03f9172cSAndroid Build Coastguard Worker 	if (argc > 0 && os_strcmp(argv[0], "driver") == 0)
273*03f9172cSAndroid Build Coastguard Worker 		return wpa_ctrl_command(ctrl, "STATUS-DRIVER");
274*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "STATUS");
275*03f9172cSAndroid Build Coastguard Worker }
276*03f9172cSAndroid Build Coastguard Worker 
277*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_mib(struct wpa_ctrl * ctrl,int argc,char * argv[])278*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_mib(struct wpa_ctrl *ctrl, int argc, char *argv[])
279*03f9172cSAndroid Build Coastguard Worker {
280*03f9172cSAndroid Build Coastguard Worker 	if (argc > 0) {
281*03f9172cSAndroid Build Coastguard Worker 		char buf[100];
282*03f9172cSAndroid Build Coastguard Worker 		os_snprintf(buf, sizeof(buf), "MIB %s", argv[0]);
283*03f9172cSAndroid Build Coastguard Worker 		return wpa_ctrl_command(ctrl, buf);
284*03f9172cSAndroid Build Coastguard Worker 	}
285*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "MIB");
286*03f9172cSAndroid Build Coastguard Worker }
287*03f9172cSAndroid Build Coastguard Worker 
288*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_exec(const char * program,const char * arg1,const char * arg2)289*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_exec(const char *program, const char *arg1,
290*03f9172cSAndroid Build Coastguard Worker 			    const char *arg2)
291*03f9172cSAndroid Build Coastguard Worker {
292*03f9172cSAndroid Build Coastguard Worker 	char *arg;
293*03f9172cSAndroid Build Coastguard Worker 	size_t len;
294*03f9172cSAndroid Build Coastguard Worker 	int res;
295*03f9172cSAndroid Build Coastguard Worker 
296*03f9172cSAndroid Build Coastguard Worker 	len = os_strlen(arg1) + os_strlen(arg2) + 2;
297*03f9172cSAndroid Build Coastguard Worker 	arg = os_malloc(len);
298*03f9172cSAndroid Build Coastguard Worker 	if (arg == NULL)
299*03f9172cSAndroid Build Coastguard Worker 		return -1;
300*03f9172cSAndroid Build Coastguard Worker 	os_snprintf(arg, len, "%s %s", arg1, arg2);
301*03f9172cSAndroid Build Coastguard Worker 	res = os_exec(program, arg, 1);
302*03f9172cSAndroid Build Coastguard Worker 	os_free(arg);
303*03f9172cSAndroid Build Coastguard Worker 
304*03f9172cSAndroid Build Coastguard Worker 	return res;
305*03f9172cSAndroid Build Coastguard Worker }
306*03f9172cSAndroid Build Coastguard Worker 
307*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_action_process(char * msg,size_t len)308*03f9172cSAndroid Build Coastguard Worker static void hostapd_cli_action_process(char *msg, size_t len)
309*03f9172cSAndroid Build Coastguard Worker {
310*03f9172cSAndroid Build Coastguard Worker 	const char *pos;
311*03f9172cSAndroid Build Coastguard Worker 
312*03f9172cSAndroid Build Coastguard Worker 	pos = msg;
313*03f9172cSAndroid Build Coastguard Worker 	if (*pos == '<') {
314*03f9172cSAndroid Build Coastguard Worker 		pos = os_strchr(pos, '>');
315*03f9172cSAndroid Build Coastguard Worker 		if (pos)
316*03f9172cSAndroid Build Coastguard Worker 			pos++;
317*03f9172cSAndroid Build Coastguard Worker 		else
318*03f9172cSAndroid Build Coastguard Worker 			pos = msg;
319*03f9172cSAndroid Build Coastguard Worker 	}
320*03f9172cSAndroid Build Coastguard Worker 
321*03f9172cSAndroid Build Coastguard Worker 	hostapd_cli_exec(action_file, ctrl_ifname, pos);
322*03f9172cSAndroid Build Coastguard Worker }
323*03f9172cSAndroid Build Coastguard Worker 
324*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_action_cb(char * msg,size_t len)325*03f9172cSAndroid Build Coastguard Worker static void hostapd_cli_action_cb(char *msg, size_t len)
326*03f9172cSAndroid Build Coastguard Worker {
327*03f9172cSAndroid Build Coastguard Worker 	hostapd_cli_action_process(msg, len);
328*03f9172cSAndroid Build Coastguard Worker }
329*03f9172cSAndroid Build Coastguard Worker 
330*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_sta(struct wpa_ctrl * ctrl,int argc,char * argv[])331*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_sta(struct wpa_ctrl *ctrl, int argc, char *argv[])
332*03f9172cSAndroid Build Coastguard Worker {
333*03f9172cSAndroid Build Coastguard Worker 	char buf[64];
334*03f9172cSAndroid Build Coastguard Worker 	if (argc < 1) {
335*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid 'sta' command - at least one argument, STA "
336*03f9172cSAndroid Build Coastguard Worker 		       "address, is required.\n");
337*03f9172cSAndroid Build Coastguard Worker 		return -1;
338*03f9172cSAndroid Build Coastguard Worker 	}
339*03f9172cSAndroid Build Coastguard Worker 	if (argc > 1)
340*03f9172cSAndroid Build Coastguard Worker 		snprintf(buf, sizeof(buf), "STA %s %s", argv[0], argv[1]);
341*03f9172cSAndroid Build Coastguard Worker 	else
342*03f9172cSAndroid Build Coastguard Worker 		snprintf(buf, sizeof(buf), "STA %s", argv[0]);
343*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, buf);
344*03f9172cSAndroid Build Coastguard Worker }
345*03f9172cSAndroid Build Coastguard Worker 
346*03f9172cSAndroid Build Coastguard Worker 
hostapd_complete_stations(const char * str,int pos)347*03f9172cSAndroid Build Coastguard Worker static char ** hostapd_complete_stations(const char *str, int pos)
348*03f9172cSAndroid Build Coastguard Worker {
349*03f9172cSAndroid Build Coastguard Worker 	int arg = get_cmd_arg_num(str, pos);
350*03f9172cSAndroid Build Coastguard Worker 	char **res = NULL;
351*03f9172cSAndroid Build Coastguard Worker 
352*03f9172cSAndroid Build Coastguard Worker 	switch (arg) {
353*03f9172cSAndroid Build Coastguard Worker 	case 1:
354*03f9172cSAndroid Build Coastguard Worker 		res = cli_txt_list_array(&stations);
355*03f9172cSAndroid Build Coastguard Worker 		break;
356*03f9172cSAndroid Build Coastguard Worker 	}
357*03f9172cSAndroid Build Coastguard Worker 
358*03f9172cSAndroid Build Coastguard Worker 	return res;
359*03f9172cSAndroid Build Coastguard Worker }
360*03f9172cSAndroid Build Coastguard Worker 
361*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_new_sta(struct wpa_ctrl * ctrl,int argc,char * argv[])362*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_new_sta(struct wpa_ctrl *ctrl, int argc,
363*03f9172cSAndroid Build Coastguard Worker 				   char *argv[])
364*03f9172cSAndroid Build Coastguard Worker {
365*03f9172cSAndroid Build Coastguard Worker 	char buf[64];
366*03f9172cSAndroid Build Coastguard Worker 	if (argc != 1) {
367*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid 'new_sta' command - exactly one argument, STA "
368*03f9172cSAndroid Build Coastguard Worker 		       "address, is required.\n");
369*03f9172cSAndroid Build Coastguard Worker 		return -1;
370*03f9172cSAndroid Build Coastguard Worker 	}
371*03f9172cSAndroid Build Coastguard Worker 	snprintf(buf, sizeof(buf), "NEW_STA %s", argv[0]);
372*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, buf);
373*03f9172cSAndroid Build Coastguard Worker }
374*03f9172cSAndroid Build Coastguard Worker 
375*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_deauthenticate(struct wpa_ctrl * ctrl,int argc,char * argv[])376*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_deauthenticate(struct wpa_ctrl *ctrl, int argc,
377*03f9172cSAndroid Build Coastguard Worker 					  char *argv[])
378*03f9172cSAndroid Build Coastguard Worker {
379*03f9172cSAndroid Build Coastguard Worker 	char buf[64];
380*03f9172cSAndroid Build Coastguard Worker 	if (argc < 1) {
381*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid 'deauthenticate' command - exactly one "
382*03f9172cSAndroid Build Coastguard Worker 		       "argument, STA address, is required.\n");
383*03f9172cSAndroid Build Coastguard Worker 		return -1;
384*03f9172cSAndroid Build Coastguard Worker 	}
385*03f9172cSAndroid Build Coastguard Worker 	if (argc > 1)
386*03f9172cSAndroid Build Coastguard Worker 		os_snprintf(buf, sizeof(buf), "DEAUTHENTICATE %s %s",
387*03f9172cSAndroid Build Coastguard Worker 			    argv[0], argv[1]);
388*03f9172cSAndroid Build Coastguard Worker 	else
389*03f9172cSAndroid Build Coastguard Worker 		os_snprintf(buf, sizeof(buf), "DEAUTHENTICATE %s", argv[0]);
390*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, buf);
391*03f9172cSAndroid Build Coastguard Worker }
392*03f9172cSAndroid Build Coastguard Worker 
393*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_disassociate(struct wpa_ctrl * ctrl,int argc,char * argv[])394*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_disassociate(struct wpa_ctrl *ctrl, int argc,
395*03f9172cSAndroid Build Coastguard Worker 					char *argv[])
396*03f9172cSAndroid Build Coastguard Worker {
397*03f9172cSAndroid Build Coastguard Worker 	char buf[64];
398*03f9172cSAndroid Build Coastguard Worker 	if (argc < 1) {
399*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid 'disassociate' command - exactly one "
400*03f9172cSAndroid Build Coastguard Worker 		       "argument, STA address, is required.\n");
401*03f9172cSAndroid Build Coastguard Worker 		return -1;
402*03f9172cSAndroid Build Coastguard Worker 	}
403*03f9172cSAndroid Build Coastguard Worker 	if (argc > 1)
404*03f9172cSAndroid Build Coastguard Worker 		os_snprintf(buf, sizeof(buf), "DISASSOCIATE %s %s",
405*03f9172cSAndroid Build Coastguard Worker 			    argv[0], argv[1]);
406*03f9172cSAndroid Build Coastguard Worker 	else
407*03f9172cSAndroid Build Coastguard Worker 		os_snprintf(buf, sizeof(buf), "DISASSOCIATE %s", argv[0]);
408*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, buf);
409*03f9172cSAndroid Build Coastguard Worker }
410*03f9172cSAndroid Build Coastguard Worker 
411*03f9172cSAndroid Build Coastguard Worker 
412*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_TAXONOMY
hostapd_cli_cmd_signature(struct wpa_ctrl * ctrl,int argc,char * argv[])413*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_signature(struct wpa_ctrl *ctrl, int argc,
414*03f9172cSAndroid Build Coastguard Worker 				     char *argv[])
415*03f9172cSAndroid Build Coastguard Worker {
416*03f9172cSAndroid Build Coastguard Worker 	char buf[64];
417*03f9172cSAndroid Build Coastguard Worker 
418*03f9172cSAndroid Build Coastguard Worker 	if (argc != 1) {
419*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid 'signature' command - exactly one argument, STA address, is required.\n");
420*03f9172cSAndroid Build Coastguard Worker 		return -1;
421*03f9172cSAndroid Build Coastguard Worker 	}
422*03f9172cSAndroid Build Coastguard Worker 	os_snprintf(buf, sizeof(buf), "SIGNATURE %s", argv[0]);
423*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, buf);
424*03f9172cSAndroid Build Coastguard Worker }
425*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_TAXONOMY */
426*03f9172cSAndroid Build Coastguard Worker 
427*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_sa_query(struct wpa_ctrl * ctrl,int argc,char * argv[])428*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_sa_query(struct wpa_ctrl *ctrl, int argc,
429*03f9172cSAndroid Build Coastguard Worker 				    char *argv[])
430*03f9172cSAndroid Build Coastguard Worker {
431*03f9172cSAndroid Build Coastguard Worker 	char buf[64];
432*03f9172cSAndroid Build Coastguard Worker 	if (argc != 1) {
433*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid 'sa_query' command - exactly one argument, "
434*03f9172cSAndroid Build Coastguard Worker 		       "STA address, is required.\n");
435*03f9172cSAndroid Build Coastguard Worker 		return -1;
436*03f9172cSAndroid Build Coastguard Worker 	}
437*03f9172cSAndroid Build Coastguard Worker 	snprintf(buf, sizeof(buf), "SA_QUERY %s", argv[0]);
438*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, buf);
439*03f9172cSAndroid Build Coastguard Worker }
440*03f9172cSAndroid Build Coastguard Worker 
441*03f9172cSAndroid Build Coastguard Worker 
442*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_WPS
hostapd_cli_cmd_wps_pin(struct wpa_ctrl * ctrl,int argc,char * argv[])443*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_wps_pin(struct wpa_ctrl *ctrl, int argc,
444*03f9172cSAndroid Build Coastguard Worker 				   char *argv[])
445*03f9172cSAndroid Build Coastguard Worker {
446*03f9172cSAndroid Build Coastguard Worker 	char buf[256];
447*03f9172cSAndroid Build Coastguard Worker 	if (argc < 2) {
448*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid 'wps_pin' command - at least two arguments, "
449*03f9172cSAndroid Build Coastguard Worker 		       "UUID and PIN, are required.\n");
450*03f9172cSAndroid Build Coastguard Worker 		return -1;
451*03f9172cSAndroid Build Coastguard Worker 	}
452*03f9172cSAndroid Build Coastguard Worker 	if (argc > 3)
453*03f9172cSAndroid Build Coastguard Worker 		snprintf(buf, sizeof(buf), "WPS_PIN %s %s %s %s",
454*03f9172cSAndroid Build Coastguard Worker 			 argv[0], argv[1], argv[2], argv[3]);
455*03f9172cSAndroid Build Coastguard Worker 	else if (argc > 2)
456*03f9172cSAndroid Build Coastguard Worker 		snprintf(buf, sizeof(buf), "WPS_PIN %s %s %s",
457*03f9172cSAndroid Build Coastguard Worker 			 argv[0], argv[1], argv[2]);
458*03f9172cSAndroid Build Coastguard Worker 	else
459*03f9172cSAndroid Build Coastguard Worker 		snprintf(buf, sizeof(buf), "WPS_PIN %s %s", argv[0], argv[1]);
460*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, buf);
461*03f9172cSAndroid Build Coastguard Worker }
462*03f9172cSAndroid Build Coastguard Worker 
463*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_wps_check_pin(struct wpa_ctrl * ctrl,int argc,char * argv[])464*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_wps_check_pin(struct wpa_ctrl *ctrl, int argc,
465*03f9172cSAndroid Build Coastguard Worker 					 char *argv[])
466*03f9172cSAndroid Build Coastguard Worker {
467*03f9172cSAndroid Build Coastguard Worker 	char cmd[256];
468*03f9172cSAndroid Build Coastguard Worker 	int res;
469*03f9172cSAndroid Build Coastguard Worker 
470*03f9172cSAndroid Build Coastguard Worker 	if (argc != 1 && argc != 2) {
471*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid WPS_CHECK_PIN command: needs one argument:\n"
472*03f9172cSAndroid Build Coastguard Worker 		       "- PIN to be verified\n");
473*03f9172cSAndroid Build Coastguard Worker 		return -1;
474*03f9172cSAndroid Build Coastguard Worker 	}
475*03f9172cSAndroid Build Coastguard Worker 
476*03f9172cSAndroid Build Coastguard Worker 	if (argc == 2)
477*03f9172cSAndroid Build Coastguard Worker 		res = os_snprintf(cmd, sizeof(cmd), "WPS_CHECK_PIN %s %s",
478*03f9172cSAndroid Build Coastguard Worker 				  argv[0], argv[1]);
479*03f9172cSAndroid Build Coastguard Worker 	else
480*03f9172cSAndroid Build Coastguard Worker 		res = os_snprintf(cmd, sizeof(cmd), "WPS_CHECK_PIN %s",
481*03f9172cSAndroid Build Coastguard Worker 				  argv[0]);
482*03f9172cSAndroid Build Coastguard Worker 	if (os_snprintf_error(sizeof(cmd), res)) {
483*03f9172cSAndroid Build Coastguard Worker 		printf("Too long WPS_CHECK_PIN command.\n");
484*03f9172cSAndroid Build Coastguard Worker 		return -1;
485*03f9172cSAndroid Build Coastguard Worker 	}
486*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, cmd);
487*03f9172cSAndroid Build Coastguard Worker }
488*03f9172cSAndroid Build Coastguard Worker 
489*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_wps_pbc(struct wpa_ctrl * ctrl,int argc,char * argv[])490*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_wps_pbc(struct wpa_ctrl *ctrl, int argc,
491*03f9172cSAndroid Build Coastguard Worker 				   char *argv[])
492*03f9172cSAndroid Build Coastguard Worker {
493*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "WPS_PBC");
494*03f9172cSAndroid Build Coastguard Worker }
495*03f9172cSAndroid Build Coastguard Worker 
496*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_wps_cancel(struct wpa_ctrl * ctrl,int argc,char * argv[])497*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_wps_cancel(struct wpa_ctrl *ctrl, int argc,
498*03f9172cSAndroid Build Coastguard Worker 				      char *argv[])
499*03f9172cSAndroid Build Coastguard Worker {
500*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "WPS_CANCEL");
501*03f9172cSAndroid Build Coastguard Worker }
502*03f9172cSAndroid Build Coastguard Worker 
503*03f9172cSAndroid Build Coastguard Worker 
504*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_WPS_NFC
hostapd_cli_cmd_wps_nfc_tag_read(struct wpa_ctrl * ctrl,int argc,char * argv[])505*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_wps_nfc_tag_read(struct wpa_ctrl *ctrl, int argc,
506*03f9172cSAndroid Build Coastguard Worker 					    char *argv[])
507*03f9172cSAndroid Build Coastguard Worker {
508*03f9172cSAndroid Build Coastguard Worker 	int ret;
509*03f9172cSAndroid Build Coastguard Worker 	char *buf;
510*03f9172cSAndroid Build Coastguard Worker 	size_t buflen;
511*03f9172cSAndroid Build Coastguard Worker 
512*03f9172cSAndroid Build Coastguard Worker 	if (argc != 1) {
513*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid 'wps_nfc_tag_read' command - one argument "
514*03f9172cSAndroid Build Coastguard Worker 		       "is required.\n");
515*03f9172cSAndroid Build Coastguard Worker 		return -1;
516*03f9172cSAndroid Build Coastguard Worker 	}
517*03f9172cSAndroid Build Coastguard Worker 
518*03f9172cSAndroid Build Coastguard Worker 	buflen = 18 + os_strlen(argv[0]);
519*03f9172cSAndroid Build Coastguard Worker 	buf = os_malloc(buflen);
520*03f9172cSAndroid Build Coastguard Worker 	if (buf == NULL)
521*03f9172cSAndroid Build Coastguard Worker 		return -1;
522*03f9172cSAndroid Build Coastguard Worker 	os_snprintf(buf, buflen, "WPS_NFC_TAG_READ %s", argv[0]);
523*03f9172cSAndroid Build Coastguard Worker 
524*03f9172cSAndroid Build Coastguard Worker 	ret = wpa_ctrl_command(ctrl, buf);
525*03f9172cSAndroid Build Coastguard Worker 	os_free(buf);
526*03f9172cSAndroid Build Coastguard Worker 
527*03f9172cSAndroid Build Coastguard Worker 	return ret;
528*03f9172cSAndroid Build Coastguard Worker }
529*03f9172cSAndroid Build Coastguard Worker 
530*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_wps_nfc_config_token(struct wpa_ctrl * ctrl,int argc,char * argv[])531*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_wps_nfc_config_token(struct wpa_ctrl *ctrl,
532*03f9172cSAndroid Build Coastguard Worker 						int argc, char *argv[])
533*03f9172cSAndroid Build Coastguard Worker {
534*03f9172cSAndroid Build Coastguard Worker 	char cmd[64];
535*03f9172cSAndroid Build Coastguard Worker 	int res;
536*03f9172cSAndroid Build Coastguard Worker 
537*03f9172cSAndroid Build Coastguard Worker 	if (argc != 1) {
538*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid 'wps_nfc_config_token' command - one argument "
539*03f9172cSAndroid Build Coastguard Worker 		       "is required.\n");
540*03f9172cSAndroid Build Coastguard Worker 		return -1;
541*03f9172cSAndroid Build Coastguard Worker 	}
542*03f9172cSAndroid Build Coastguard Worker 
543*03f9172cSAndroid Build Coastguard Worker 	res = os_snprintf(cmd, sizeof(cmd), "WPS_NFC_CONFIG_TOKEN %s",
544*03f9172cSAndroid Build Coastguard Worker 			  argv[0]);
545*03f9172cSAndroid Build Coastguard Worker 	if (os_snprintf_error(sizeof(cmd), res)) {
546*03f9172cSAndroid Build Coastguard Worker 		printf("Too long WPS_NFC_CONFIG_TOKEN command.\n");
547*03f9172cSAndroid Build Coastguard Worker 		return -1;
548*03f9172cSAndroid Build Coastguard Worker 	}
549*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, cmd);
550*03f9172cSAndroid Build Coastguard Worker }
551*03f9172cSAndroid Build Coastguard Worker 
552*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_wps_nfc_token(struct wpa_ctrl * ctrl,int argc,char * argv[])553*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_wps_nfc_token(struct wpa_ctrl *ctrl,
554*03f9172cSAndroid Build Coastguard Worker 					 int argc, char *argv[])
555*03f9172cSAndroid Build Coastguard Worker {
556*03f9172cSAndroid Build Coastguard Worker 	char cmd[64];
557*03f9172cSAndroid Build Coastguard Worker 	int res;
558*03f9172cSAndroid Build Coastguard Worker 
559*03f9172cSAndroid Build Coastguard Worker 	if (argc != 1) {
560*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid 'wps_nfc_token' command - one argument is "
561*03f9172cSAndroid Build Coastguard Worker 		       "required.\n");
562*03f9172cSAndroid Build Coastguard Worker 		return -1;
563*03f9172cSAndroid Build Coastguard Worker 	}
564*03f9172cSAndroid Build Coastguard Worker 
565*03f9172cSAndroid Build Coastguard Worker 	res = os_snprintf(cmd, sizeof(cmd), "WPS_NFC_TOKEN %s", argv[0]);
566*03f9172cSAndroid Build Coastguard Worker 	if (os_snprintf_error(sizeof(cmd), res)) {
567*03f9172cSAndroid Build Coastguard Worker 		printf("Too long WPS_NFC_TOKEN command.\n");
568*03f9172cSAndroid Build Coastguard Worker 		return -1;
569*03f9172cSAndroid Build Coastguard Worker 	}
570*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, cmd);
571*03f9172cSAndroid Build Coastguard Worker }
572*03f9172cSAndroid Build Coastguard Worker 
573*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_nfc_get_handover_sel(struct wpa_ctrl * ctrl,int argc,char * argv[])574*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_nfc_get_handover_sel(struct wpa_ctrl *ctrl,
575*03f9172cSAndroid Build Coastguard Worker 						int argc, char *argv[])
576*03f9172cSAndroid Build Coastguard Worker {
577*03f9172cSAndroid Build Coastguard Worker 	char cmd[64];
578*03f9172cSAndroid Build Coastguard Worker 	int res;
579*03f9172cSAndroid Build Coastguard Worker 
580*03f9172cSAndroid Build Coastguard Worker 	if (argc != 2) {
581*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid 'nfc_get_handover_sel' command - two arguments "
582*03f9172cSAndroid Build Coastguard Worker 		       "are required.\n");
583*03f9172cSAndroid Build Coastguard Worker 		return -1;
584*03f9172cSAndroid Build Coastguard Worker 	}
585*03f9172cSAndroid Build Coastguard Worker 
586*03f9172cSAndroid Build Coastguard Worker 	res = os_snprintf(cmd, sizeof(cmd), "NFC_GET_HANDOVER_SEL %s %s",
587*03f9172cSAndroid Build Coastguard Worker 			  argv[0], argv[1]);
588*03f9172cSAndroid Build Coastguard Worker 	if (os_snprintf_error(sizeof(cmd), res)) {
589*03f9172cSAndroid Build Coastguard Worker 		printf("Too long NFC_GET_HANDOVER_SEL command.\n");
590*03f9172cSAndroid Build Coastguard Worker 		return -1;
591*03f9172cSAndroid Build Coastguard Worker 	}
592*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, cmd);
593*03f9172cSAndroid Build Coastguard Worker }
594*03f9172cSAndroid Build Coastguard Worker 
595*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_WPS_NFC */
596*03f9172cSAndroid Build Coastguard Worker 
597*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_wps_ap_pin(struct wpa_ctrl * ctrl,int argc,char * argv[])598*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_wps_ap_pin(struct wpa_ctrl *ctrl, int argc,
599*03f9172cSAndroid Build Coastguard Worker 				      char *argv[])
600*03f9172cSAndroid Build Coastguard Worker {
601*03f9172cSAndroid Build Coastguard Worker 	char buf[64];
602*03f9172cSAndroid Build Coastguard Worker 	if (argc < 1) {
603*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid 'wps_ap_pin' command - at least one argument "
604*03f9172cSAndroid Build Coastguard Worker 		       "is required.\n");
605*03f9172cSAndroid Build Coastguard Worker 		return -1;
606*03f9172cSAndroid Build Coastguard Worker 	}
607*03f9172cSAndroid Build Coastguard Worker 	if (argc > 2)
608*03f9172cSAndroid Build Coastguard Worker 		snprintf(buf, sizeof(buf), "WPS_AP_PIN %s %s %s",
609*03f9172cSAndroid Build Coastguard Worker 			 argv[0], argv[1], argv[2]);
610*03f9172cSAndroid Build Coastguard Worker 	else if (argc > 1)
611*03f9172cSAndroid Build Coastguard Worker 		snprintf(buf, sizeof(buf), "WPS_AP_PIN %s %s",
612*03f9172cSAndroid Build Coastguard Worker 			 argv[0], argv[1]);
613*03f9172cSAndroid Build Coastguard Worker 	else
614*03f9172cSAndroid Build Coastguard Worker 		snprintf(buf, sizeof(buf), "WPS_AP_PIN %s", argv[0]);
615*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, buf);
616*03f9172cSAndroid Build Coastguard Worker }
617*03f9172cSAndroid Build Coastguard Worker 
618*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_wps_get_status(struct wpa_ctrl * ctrl,int argc,char * argv[])619*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_wps_get_status(struct wpa_ctrl *ctrl, int argc,
620*03f9172cSAndroid Build Coastguard Worker 					  char *argv[])
621*03f9172cSAndroid Build Coastguard Worker {
622*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "WPS_GET_STATUS");
623*03f9172cSAndroid Build Coastguard Worker }
624*03f9172cSAndroid Build Coastguard Worker 
625*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_wps_config(struct wpa_ctrl * ctrl,int argc,char * argv[])626*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_wps_config(struct wpa_ctrl *ctrl, int argc,
627*03f9172cSAndroid Build Coastguard Worker 				      char *argv[])
628*03f9172cSAndroid Build Coastguard Worker {
629*03f9172cSAndroid Build Coastguard Worker 	char buf[256];
630*03f9172cSAndroid Build Coastguard Worker 	char ssid_hex[2 * SSID_MAX_LEN + 1];
631*03f9172cSAndroid Build Coastguard Worker 	char key_hex[2 * 64 + 1];
632*03f9172cSAndroid Build Coastguard Worker 	int i;
633*03f9172cSAndroid Build Coastguard Worker 
634*03f9172cSAndroid Build Coastguard Worker 	if (argc < 1) {
635*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid 'wps_config' command - at least two arguments "
636*03f9172cSAndroid Build Coastguard Worker 		       "are required.\n");
637*03f9172cSAndroid Build Coastguard Worker 		return -1;
638*03f9172cSAndroid Build Coastguard Worker 	}
639*03f9172cSAndroid Build Coastguard Worker 
640*03f9172cSAndroid Build Coastguard Worker 	ssid_hex[0] = '\0';
641*03f9172cSAndroid Build Coastguard Worker 	for (i = 0; i < SSID_MAX_LEN; i++) {
642*03f9172cSAndroid Build Coastguard Worker 		if (argv[0][i] == '\0')
643*03f9172cSAndroid Build Coastguard Worker 			break;
644*03f9172cSAndroid Build Coastguard Worker 		os_snprintf(&ssid_hex[i * 2], 3, "%02x", argv[0][i]);
645*03f9172cSAndroid Build Coastguard Worker 	}
646*03f9172cSAndroid Build Coastguard Worker 
647*03f9172cSAndroid Build Coastguard Worker 	key_hex[0] = '\0';
648*03f9172cSAndroid Build Coastguard Worker 	if (argc > 3) {
649*03f9172cSAndroid Build Coastguard Worker 		for (i = 0; i < 64; i++) {
650*03f9172cSAndroid Build Coastguard Worker 			if (argv[3][i] == '\0')
651*03f9172cSAndroid Build Coastguard Worker 				break;
652*03f9172cSAndroid Build Coastguard Worker 			os_snprintf(&key_hex[i * 2], 3, "%02x",
653*03f9172cSAndroid Build Coastguard Worker 				    argv[3][i]);
654*03f9172cSAndroid Build Coastguard Worker 		}
655*03f9172cSAndroid Build Coastguard Worker 	}
656*03f9172cSAndroid Build Coastguard Worker 
657*03f9172cSAndroid Build Coastguard Worker 	if (argc > 3)
658*03f9172cSAndroid Build Coastguard Worker 		snprintf(buf, sizeof(buf), "WPS_CONFIG %s %s %s %s",
659*03f9172cSAndroid Build Coastguard Worker 			 ssid_hex, argv[1], argv[2], key_hex);
660*03f9172cSAndroid Build Coastguard Worker 	else if (argc > 2)
661*03f9172cSAndroid Build Coastguard Worker 		snprintf(buf, sizeof(buf), "WPS_CONFIG %s %s %s",
662*03f9172cSAndroid Build Coastguard Worker 			 ssid_hex, argv[1], argv[2]);
663*03f9172cSAndroid Build Coastguard Worker 	else
664*03f9172cSAndroid Build Coastguard Worker 		snprintf(buf, sizeof(buf), "WPS_CONFIG %s %s",
665*03f9172cSAndroid Build Coastguard Worker 			 ssid_hex, argv[1]);
666*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, buf);
667*03f9172cSAndroid Build Coastguard Worker }
668*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_WPS */
669*03f9172cSAndroid Build Coastguard Worker 
670*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_disassoc_imminent(struct wpa_ctrl * ctrl,int argc,char * argv[])671*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_disassoc_imminent(struct wpa_ctrl *ctrl, int argc,
672*03f9172cSAndroid Build Coastguard Worker 					     char *argv[])
673*03f9172cSAndroid Build Coastguard Worker {
674*03f9172cSAndroid Build Coastguard Worker 	char buf[300];
675*03f9172cSAndroid Build Coastguard Worker 	int res;
676*03f9172cSAndroid Build Coastguard Worker 
677*03f9172cSAndroid Build Coastguard Worker 	if (argc < 2) {
678*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid 'disassoc_imminent' command - two arguments "
679*03f9172cSAndroid Build Coastguard Worker 		       "(STA addr and Disassociation Timer) are needed\n");
680*03f9172cSAndroid Build Coastguard Worker 		return -1;
681*03f9172cSAndroid Build Coastguard Worker 	}
682*03f9172cSAndroid Build Coastguard Worker 
683*03f9172cSAndroid Build Coastguard Worker 	res = os_snprintf(buf, sizeof(buf), "DISASSOC_IMMINENT %s %s",
684*03f9172cSAndroid Build Coastguard Worker 			  argv[0], argv[1]);
685*03f9172cSAndroid Build Coastguard Worker 	if (os_snprintf_error(sizeof(buf), res))
686*03f9172cSAndroid Build Coastguard Worker 		return -1;
687*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, buf);
688*03f9172cSAndroid Build Coastguard Worker }
689*03f9172cSAndroid Build Coastguard Worker 
690*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_ess_disassoc(struct wpa_ctrl * ctrl,int argc,char * argv[])691*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_ess_disassoc(struct wpa_ctrl *ctrl, int argc,
692*03f9172cSAndroid Build Coastguard Worker 					char *argv[])
693*03f9172cSAndroid Build Coastguard Worker {
694*03f9172cSAndroid Build Coastguard Worker 	char buf[300];
695*03f9172cSAndroid Build Coastguard Worker 	int res;
696*03f9172cSAndroid Build Coastguard Worker 
697*03f9172cSAndroid Build Coastguard Worker 	if (argc < 3) {
698*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid 'ess_disassoc' command - three arguments (STA "
699*03f9172cSAndroid Build Coastguard Worker 		       "addr, disassoc timer, and URL) are needed\n");
700*03f9172cSAndroid Build Coastguard Worker 		return -1;
701*03f9172cSAndroid Build Coastguard Worker 	}
702*03f9172cSAndroid Build Coastguard Worker 
703*03f9172cSAndroid Build Coastguard Worker 	res = os_snprintf(buf, sizeof(buf), "ESS_DISASSOC %s %s %s",
704*03f9172cSAndroid Build Coastguard Worker 			  argv[0], argv[1], argv[2]);
705*03f9172cSAndroid Build Coastguard Worker 	if (os_snprintf_error(sizeof(buf), res))
706*03f9172cSAndroid Build Coastguard Worker 		return -1;
707*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, buf);
708*03f9172cSAndroid Build Coastguard Worker }
709*03f9172cSAndroid Build Coastguard Worker 
710*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_bss_tm_req(struct wpa_ctrl * ctrl,int argc,char * argv[])711*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_bss_tm_req(struct wpa_ctrl *ctrl, int argc,
712*03f9172cSAndroid Build Coastguard Worker 				      char *argv[])
713*03f9172cSAndroid Build Coastguard Worker {
714*03f9172cSAndroid Build Coastguard Worker 	char buf[2000], *tmp;
715*03f9172cSAndroid Build Coastguard Worker 	int res, i, total;
716*03f9172cSAndroid Build Coastguard Worker 
717*03f9172cSAndroid Build Coastguard Worker 	if (argc < 1) {
718*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid 'bss_tm_req' command - at least one argument (STA addr) is needed\n");
719*03f9172cSAndroid Build Coastguard Worker 		return -1;
720*03f9172cSAndroid Build Coastguard Worker 	}
721*03f9172cSAndroid Build Coastguard Worker 
722*03f9172cSAndroid Build Coastguard Worker 	res = os_snprintf(buf, sizeof(buf), "BSS_TM_REQ %s", argv[0]);
723*03f9172cSAndroid Build Coastguard Worker 	if (os_snprintf_error(sizeof(buf), res))
724*03f9172cSAndroid Build Coastguard Worker 		return -1;
725*03f9172cSAndroid Build Coastguard Worker 
726*03f9172cSAndroid Build Coastguard Worker 	total = res;
727*03f9172cSAndroid Build Coastguard Worker 	for (i = 1; i < argc; i++) {
728*03f9172cSAndroid Build Coastguard Worker 		tmp = &buf[total];
729*03f9172cSAndroid Build Coastguard Worker 		res = os_snprintf(tmp, sizeof(buf) - total, " %s", argv[i]);
730*03f9172cSAndroid Build Coastguard Worker 		if (os_snprintf_error(sizeof(buf) - total, res))
731*03f9172cSAndroid Build Coastguard Worker 			return -1;
732*03f9172cSAndroid Build Coastguard Worker 		total += res;
733*03f9172cSAndroid Build Coastguard Worker 	}
734*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, buf);
735*03f9172cSAndroid Build Coastguard Worker }
736*03f9172cSAndroid Build Coastguard Worker 
737*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_get_config(struct wpa_ctrl * ctrl,int argc,char * argv[])738*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_get_config(struct wpa_ctrl *ctrl, int argc,
739*03f9172cSAndroid Build Coastguard Worker 				      char *argv[])
740*03f9172cSAndroid Build Coastguard Worker {
741*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "GET_CONFIG");
742*03f9172cSAndroid Build Coastguard Worker }
743*03f9172cSAndroid Build Coastguard Worker 
744*03f9172cSAndroid Build Coastguard Worker 
wpa_ctrl_command_sta(struct wpa_ctrl * ctrl,const char * cmd,char * addr,size_t addr_len,int print)745*03f9172cSAndroid Build Coastguard Worker static int wpa_ctrl_command_sta(struct wpa_ctrl *ctrl, const char *cmd,
746*03f9172cSAndroid Build Coastguard Worker 				char *addr, size_t addr_len, int print)
747*03f9172cSAndroid Build Coastguard Worker {
748*03f9172cSAndroid Build Coastguard Worker 	char buf[4096], *pos;
749*03f9172cSAndroid Build Coastguard Worker 	size_t len;
750*03f9172cSAndroid Build Coastguard Worker 	int ret;
751*03f9172cSAndroid Build Coastguard Worker 
752*03f9172cSAndroid Build Coastguard Worker 	if (ctrl_conn == NULL) {
753*03f9172cSAndroid Build Coastguard Worker 		printf("Not connected to hostapd - command dropped.\n");
754*03f9172cSAndroid Build Coastguard Worker 		return -1;
755*03f9172cSAndroid Build Coastguard Worker 	}
756*03f9172cSAndroid Build Coastguard Worker 	len = sizeof(buf) - 1;
757*03f9172cSAndroid Build Coastguard Worker 	ret = wpa_ctrl_request(ctrl, cmd, strlen(cmd), buf, &len,
758*03f9172cSAndroid Build Coastguard Worker 			       hostapd_cli_msg_cb);
759*03f9172cSAndroid Build Coastguard Worker 	if (ret == -2) {
760*03f9172cSAndroid Build Coastguard Worker 		printf("'%s' command timed out.\n", cmd);
761*03f9172cSAndroid Build Coastguard Worker 		return -2;
762*03f9172cSAndroid Build Coastguard Worker 	} else if (ret < 0) {
763*03f9172cSAndroid Build Coastguard Worker 		printf("'%s' command failed.\n", cmd);
764*03f9172cSAndroid Build Coastguard Worker 		return -1;
765*03f9172cSAndroid Build Coastguard Worker 	}
766*03f9172cSAndroid Build Coastguard Worker 
767*03f9172cSAndroid Build Coastguard Worker 	buf[len] = '\0';
768*03f9172cSAndroid Build Coastguard Worker 	if (memcmp(buf, "FAIL", 4) == 0)
769*03f9172cSAndroid Build Coastguard Worker 		return -1;
770*03f9172cSAndroid Build Coastguard Worker 	if (print)
771*03f9172cSAndroid Build Coastguard Worker 		printf("%s", buf);
772*03f9172cSAndroid Build Coastguard Worker 
773*03f9172cSAndroid Build Coastguard Worker 	pos = buf;
774*03f9172cSAndroid Build Coastguard Worker 	while (*pos != '\0' && *pos != '\n')
775*03f9172cSAndroid Build Coastguard Worker 		pos++;
776*03f9172cSAndroid Build Coastguard Worker 	*pos = '\0';
777*03f9172cSAndroid Build Coastguard Worker 	os_strlcpy(addr, buf, addr_len);
778*03f9172cSAndroid Build Coastguard Worker 	return 0;
779*03f9172cSAndroid Build Coastguard Worker }
780*03f9172cSAndroid Build Coastguard Worker 
781*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_all_sta(struct wpa_ctrl * ctrl,int argc,char * argv[])782*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_all_sta(struct wpa_ctrl *ctrl, int argc,
783*03f9172cSAndroid Build Coastguard Worker 				   char *argv[])
784*03f9172cSAndroid Build Coastguard Worker {
785*03f9172cSAndroid Build Coastguard Worker 	char addr[32], cmd[64];
786*03f9172cSAndroid Build Coastguard Worker 
787*03f9172cSAndroid Build Coastguard Worker 	if (wpa_ctrl_command_sta(ctrl, "STA-FIRST", addr, sizeof(addr), 1))
788*03f9172cSAndroid Build Coastguard Worker 		return 0;
789*03f9172cSAndroid Build Coastguard Worker 	do {
790*03f9172cSAndroid Build Coastguard Worker 		snprintf(cmd, sizeof(cmd), "STA-NEXT %s", addr);
791*03f9172cSAndroid Build Coastguard Worker 	} while (wpa_ctrl_command_sta(ctrl, cmd, addr, sizeof(addr), 1) == 0);
792*03f9172cSAndroid Build Coastguard Worker 
793*03f9172cSAndroid Build Coastguard Worker 	return -1;
794*03f9172cSAndroid Build Coastguard Worker }
795*03f9172cSAndroid Build Coastguard Worker 
796*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_list_sta(struct wpa_ctrl * ctrl,int argc,char * argv[])797*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_list_sta(struct wpa_ctrl *ctrl, int argc,
798*03f9172cSAndroid Build Coastguard Worker 				    char *argv[])
799*03f9172cSAndroid Build Coastguard Worker {
800*03f9172cSAndroid Build Coastguard Worker 	char addr[32], cmd[64];
801*03f9172cSAndroid Build Coastguard Worker 
802*03f9172cSAndroid Build Coastguard Worker 	if (wpa_ctrl_command_sta(ctrl, "STA-FIRST", addr, sizeof(addr), 0))
803*03f9172cSAndroid Build Coastguard Worker 		return 0;
804*03f9172cSAndroid Build Coastguard Worker 	do {
805*03f9172cSAndroid Build Coastguard Worker 		if (os_strcmp(addr, "") != 0)
806*03f9172cSAndroid Build Coastguard Worker 			printf("%s\n", addr);
807*03f9172cSAndroid Build Coastguard Worker 		os_snprintf(cmd, sizeof(cmd), "STA-NEXT %s", addr);
808*03f9172cSAndroid Build Coastguard Worker 	} while (wpa_ctrl_command_sta(ctrl, cmd, addr, sizeof(addr), 0) == 0);
809*03f9172cSAndroid Build Coastguard Worker 
810*03f9172cSAndroid Build Coastguard Worker 	return 0;
811*03f9172cSAndroid Build Coastguard Worker }
812*03f9172cSAndroid Build Coastguard Worker 
813*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_help(struct wpa_ctrl * ctrl,int argc,char * argv[])814*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_help(struct wpa_ctrl *ctrl, int argc, char *argv[])
815*03f9172cSAndroid Build Coastguard Worker {
816*03f9172cSAndroid Build Coastguard Worker 	print_help(stdout, argc > 0 ? argv[0] : NULL);
817*03f9172cSAndroid Build Coastguard Worker 	return 0;
818*03f9172cSAndroid Build Coastguard Worker }
819*03f9172cSAndroid Build Coastguard Worker 
820*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_complete_help(const char * str,int pos)821*03f9172cSAndroid Build Coastguard Worker static char ** hostapd_cli_complete_help(const char *str, int pos)
822*03f9172cSAndroid Build Coastguard Worker {
823*03f9172cSAndroid Build Coastguard Worker 	int arg = get_cmd_arg_num(str, pos);
824*03f9172cSAndroid Build Coastguard Worker 	char **res = NULL;
825*03f9172cSAndroid Build Coastguard Worker 
826*03f9172cSAndroid Build Coastguard Worker 	switch (arg) {
827*03f9172cSAndroid Build Coastguard Worker 	case 1:
828*03f9172cSAndroid Build Coastguard Worker 		res = list_cmd_list();
829*03f9172cSAndroid Build Coastguard Worker 		break;
830*03f9172cSAndroid Build Coastguard Worker 	}
831*03f9172cSAndroid Build Coastguard Worker 
832*03f9172cSAndroid Build Coastguard Worker 	return res;
833*03f9172cSAndroid Build Coastguard Worker }
834*03f9172cSAndroid Build Coastguard Worker 
835*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_license(struct wpa_ctrl * ctrl,int argc,char * argv[])836*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_license(struct wpa_ctrl *ctrl, int argc,
837*03f9172cSAndroid Build Coastguard Worker 				   char *argv[])
838*03f9172cSAndroid Build Coastguard Worker {
839*03f9172cSAndroid Build Coastguard Worker 	printf("%s\n\n%s\n", hostapd_cli_version, cli_full_license);
840*03f9172cSAndroid Build Coastguard Worker 	return 0;
841*03f9172cSAndroid Build Coastguard Worker }
842*03f9172cSAndroid Build Coastguard Worker 
843*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_set_qos_map_set(struct wpa_ctrl * ctrl,int argc,char * argv[])844*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_set_qos_map_set(struct wpa_ctrl *ctrl,
845*03f9172cSAndroid Build Coastguard Worker 					   int argc, char *argv[])
846*03f9172cSAndroid Build Coastguard Worker {
847*03f9172cSAndroid Build Coastguard Worker 	char buf[200];
848*03f9172cSAndroid Build Coastguard Worker 	int res;
849*03f9172cSAndroid Build Coastguard Worker 
850*03f9172cSAndroid Build Coastguard Worker 	if (argc != 1) {
851*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid 'set_qos_map_set' command - "
852*03f9172cSAndroid Build Coastguard Worker 		       "one argument (comma delimited QoS map set) "
853*03f9172cSAndroid Build Coastguard Worker 		       "is needed\n");
854*03f9172cSAndroid Build Coastguard Worker 		return -1;
855*03f9172cSAndroid Build Coastguard Worker 	}
856*03f9172cSAndroid Build Coastguard Worker 
857*03f9172cSAndroid Build Coastguard Worker 	res = os_snprintf(buf, sizeof(buf), "SET_QOS_MAP_SET %s", argv[0]);
858*03f9172cSAndroid Build Coastguard Worker 	if (os_snprintf_error(sizeof(buf), res))
859*03f9172cSAndroid Build Coastguard Worker 		return -1;
860*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, buf);
861*03f9172cSAndroid Build Coastguard Worker }
862*03f9172cSAndroid Build Coastguard Worker 
863*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_send_qos_map_conf(struct wpa_ctrl * ctrl,int argc,char * argv[])864*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_send_qos_map_conf(struct wpa_ctrl *ctrl,
865*03f9172cSAndroid Build Coastguard Worker 					     int argc, char *argv[])
866*03f9172cSAndroid Build Coastguard Worker {
867*03f9172cSAndroid Build Coastguard Worker 	char buf[50];
868*03f9172cSAndroid Build Coastguard Worker 	int res;
869*03f9172cSAndroid Build Coastguard Worker 
870*03f9172cSAndroid Build Coastguard Worker 	if (argc != 1) {
871*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid 'send_qos_map_conf' command - "
872*03f9172cSAndroid Build Coastguard Worker 		       "one argument (STA addr) is needed\n");
873*03f9172cSAndroid Build Coastguard Worker 		return -1;
874*03f9172cSAndroid Build Coastguard Worker 	}
875*03f9172cSAndroid Build Coastguard Worker 
876*03f9172cSAndroid Build Coastguard Worker 	res = os_snprintf(buf, sizeof(buf), "SEND_QOS_MAP_CONF %s", argv[0]);
877*03f9172cSAndroid Build Coastguard Worker 	if (os_snprintf_error(sizeof(buf), res))
878*03f9172cSAndroid Build Coastguard Worker 		return -1;
879*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, buf);
880*03f9172cSAndroid Build Coastguard Worker }
881*03f9172cSAndroid Build Coastguard Worker 
882*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_hs20_wnm_notif(struct wpa_ctrl * ctrl,int argc,char * argv[])883*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_hs20_wnm_notif(struct wpa_ctrl *ctrl, int argc,
884*03f9172cSAndroid Build Coastguard Worker 					  char *argv[])
885*03f9172cSAndroid Build Coastguard Worker {
886*03f9172cSAndroid Build Coastguard Worker 	char buf[300];
887*03f9172cSAndroid Build Coastguard Worker 	int res;
888*03f9172cSAndroid Build Coastguard Worker 
889*03f9172cSAndroid Build Coastguard Worker 	if (argc < 2) {
890*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid 'hs20_wnm_notif' command - two arguments (STA "
891*03f9172cSAndroid Build Coastguard Worker 		       "addr and URL) are needed\n");
892*03f9172cSAndroid Build Coastguard Worker 		return -1;
893*03f9172cSAndroid Build Coastguard Worker 	}
894*03f9172cSAndroid Build Coastguard Worker 
895*03f9172cSAndroid Build Coastguard Worker 	res = os_snprintf(buf, sizeof(buf), "HS20_WNM_NOTIF %s %s",
896*03f9172cSAndroid Build Coastguard Worker 			  argv[0], argv[1]);
897*03f9172cSAndroid Build Coastguard Worker 	if (os_snprintf_error(sizeof(buf), res))
898*03f9172cSAndroid Build Coastguard Worker 		return -1;
899*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, buf);
900*03f9172cSAndroid Build Coastguard Worker }
901*03f9172cSAndroid Build Coastguard Worker 
902*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_hs20_deauth_req(struct wpa_ctrl * ctrl,int argc,char * argv[])903*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_hs20_deauth_req(struct wpa_ctrl *ctrl, int argc,
904*03f9172cSAndroid Build Coastguard Worker 					   char *argv[])
905*03f9172cSAndroid Build Coastguard Worker {
906*03f9172cSAndroid Build Coastguard Worker 	char buf[300];
907*03f9172cSAndroid Build Coastguard Worker 	int res;
908*03f9172cSAndroid Build Coastguard Worker 
909*03f9172cSAndroid Build Coastguard Worker 	if (argc < 3) {
910*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid 'hs20_deauth_req' command - at least three arguments (STA addr, Code, Re-auth Delay) are needed\n");
911*03f9172cSAndroid Build Coastguard Worker 		return -1;
912*03f9172cSAndroid Build Coastguard Worker 	}
913*03f9172cSAndroid Build Coastguard Worker 
914*03f9172cSAndroid Build Coastguard Worker 	if (argc > 3)
915*03f9172cSAndroid Build Coastguard Worker 		res = os_snprintf(buf, sizeof(buf),
916*03f9172cSAndroid Build Coastguard Worker 				  "HS20_DEAUTH_REQ %s %s %s %s",
917*03f9172cSAndroid Build Coastguard Worker 				  argv[0], argv[1], argv[2], argv[3]);
918*03f9172cSAndroid Build Coastguard Worker 	else
919*03f9172cSAndroid Build Coastguard Worker 		res = os_snprintf(buf, sizeof(buf),
920*03f9172cSAndroid Build Coastguard Worker 				  "HS20_DEAUTH_REQ %s %s %s",
921*03f9172cSAndroid Build Coastguard Worker 				  argv[0], argv[1], argv[2]);
922*03f9172cSAndroid Build Coastguard Worker 	if (os_snprintf_error(sizeof(buf), res))
923*03f9172cSAndroid Build Coastguard Worker 		return -1;
924*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, buf);
925*03f9172cSAndroid Build Coastguard Worker }
926*03f9172cSAndroid Build Coastguard Worker 
927*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_quit(struct wpa_ctrl * ctrl,int argc,char * argv[])928*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_quit(struct wpa_ctrl *ctrl, int argc, char *argv[])
929*03f9172cSAndroid Build Coastguard Worker {
930*03f9172cSAndroid Build Coastguard Worker 	hostapd_cli_quit = 1;
931*03f9172cSAndroid Build Coastguard Worker 	if (interactive)
932*03f9172cSAndroid Build Coastguard Worker 		eloop_terminate();
933*03f9172cSAndroid Build Coastguard Worker 	return 0;
934*03f9172cSAndroid Build Coastguard Worker }
935*03f9172cSAndroid Build Coastguard Worker 
936*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_level(struct wpa_ctrl * ctrl,int argc,char * argv[])937*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_level(struct wpa_ctrl *ctrl, int argc, char *argv[])
938*03f9172cSAndroid Build Coastguard Worker {
939*03f9172cSAndroid Build Coastguard Worker 	char cmd[256];
940*03f9172cSAndroid Build Coastguard Worker 	if (argc != 1) {
941*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid LEVEL command: needs one argument (debug "
942*03f9172cSAndroid Build Coastguard Worker 		       "level)\n");
943*03f9172cSAndroid Build Coastguard Worker 		return 0;
944*03f9172cSAndroid Build Coastguard Worker 	}
945*03f9172cSAndroid Build Coastguard Worker 	snprintf(cmd, sizeof(cmd), "LEVEL %s", argv[0]);
946*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, cmd);
947*03f9172cSAndroid Build Coastguard Worker }
948*03f9172cSAndroid Build Coastguard Worker 
949*03f9172cSAndroid Build Coastguard Worker 
update_stations(struct wpa_ctrl * ctrl)950*03f9172cSAndroid Build Coastguard Worker static void update_stations(struct wpa_ctrl *ctrl)
951*03f9172cSAndroid Build Coastguard Worker {
952*03f9172cSAndroid Build Coastguard Worker 	char addr[32], cmd[64];
953*03f9172cSAndroid Build Coastguard Worker 
954*03f9172cSAndroid Build Coastguard Worker 	if (!ctrl || !interactive)
955*03f9172cSAndroid Build Coastguard Worker 		return;
956*03f9172cSAndroid Build Coastguard Worker 
957*03f9172cSAndroid Build Coastguard Worker 	cli_txt_list_flush(&stations);
958*03f9172cSAndroid Build Coastguard Worker 
959*03f9172cSAndroid Build Coastguard Worker 	if (wpa_ctrl_command_sta(ctrl, "STA-FIRST", addr, sizeof(addr), 0))
960*03f9172cSAndroid Build Coastguard Worker 		return;
961*03f9172cSAndroid Build Coastguard Worker 	do {
962*03f9172cSAndroid Build Coastguard Worker 		if (os_strcmp(addr, "") != 0)
963*03f9172cSAndroid Build Coastguard Worker 			cli_txt_list_add(&stations, addr);
964*03f9172cSAndroid Build Coastguard Worker 		os_snprintf(cmd, sizeof(cmd), "STA-NEXT %s", addr);
965*03f9172cSAndroid Build Coastguard Worker 	} while (wpa_ctrl_command_sta(ctrl, cmd, addr, sizeof(addr), 0) == 0);
966*03f9172cSAndroid Build Coastguard Worker }
967*03f9172cSAndroid Build Coastguard Worker 
968*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_get_interfaces(struct wpa_ctrl * ctrl,struct dl_list * interfaces)969*03f9172cSAndroid Build Coastguard Worker static void hostapd_cli_get_interfaces(struct wpa_ctrl *ctrl,
970*03f9172cSAndroid Build Coastguard Worker 				       struct dl_list *interfaces)
971*03f9172cSAndroid Build Coastguard Worker {
972*03f9172cSAndroid Build Coastguard Worker 	struct dirent *dent;
973*03f9172cSAndroid Build Coastguard Worker 	DIR *dir;
974*03f9172cSAndroid Build Coastguard Worker 
975*03f9172cSAndroid Build Coastguard Worker 	if (!ctrl || !interfaces)
976*03f9172cSAndroid Build Coastguard Worker 		return;
977*03f9172cSAndroid Build Coastguard Worker 	dir = opendir(ctrl_iface_dir);
978*03f9172cSAndroid Build Coastguard Worker 	if (dir == NULL)
979*03f9172cSAndroid Build Coastguard Worker 		return;
980*03f9172cSAndroid Build Coastguard Worker 
981*03f9172cSAndroid Build Coastguard Worker 	while ((dent = readdir(dir))) {
982*03f9172cSAndroid Build Coastguard Worker 		if (strcmp(dent->d_name, ".") == 0 ||
983*03f9172cSAndroid Build Coastguard Worker 		    strcmp(dent->d_name, "..") == 0)
984*03f9172cSAndroid Build Coastguard Worker 			continue;
985*03f9172cSAndroid Build Coastguard Worker 		cli_txt_list_add(interfaces, dent->d_name);
986*03f9172cSAndroid Build Coastguard Worker 	}
987*03f9172cSAndroid Build Coastguard Worker 	closedir(dir);
988*03f9172cSAndroid Build Coastguard Worker }
989*03f9172cSAndroid Build Coastguard Worker 
990*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_list_interfaces(struct wpa_ctrl * ctrl)991*03f9172cSAndroid Build Coastguard Worker static void hostapd_cli_list_interfaces(struct wpa_ctrl *ctrl)
992*03f9172cSAndroid Build Coastguard Worker {
993*03f9172cSAndroid Build Coastguard Worker 	struct dirent *dent;
994*03f9172cSAndroid Build Coastguard Worker 	DIR *dir;
995*03f9172cSAndroid Build Coastguard Worker 
996*03f9172cSAndroid Build Coastguard Worker 	dir = opendir(ctrl_iface_dir);
997*03f9172cSAndroid Build Coastguard Worker 	if (dir == NULL) {
998*03f9172cSAndroid Build Coastguard Worker 		printf("Control interface directory '%s' could not be "
999*03f9172cSAndroid Build Coastguard Worker 		       "opened.\n", ctrl_iface_dir);
1000*03f9172cSAndroid Build Coastguard Worker 		return;
1001*03f9172cSAndroid Build Coastguard Worker 	}
1002*03f9172cSAndroid Build Coastguard Worker 
1003*03f9172cSAndroid Build Coastguard Worker 	printf("Available interfaces:\n");
1004*03f9172cSAndroid Build Coastguard Worker 	while ((dent = readdir(dir))) {
1005*03f9172cSAndroid Build Coastguard Worker 		if (strcmp(dent->d_name, ".") == 0 ||
1006*03f9172cSAndroid Build Coastguard Worker 		    strcmp(dent->d_name, "..") == 0)
1007*03f9172cSAndroid Build Coastguard Worker 			continue;
1008*03f9172cSAndroid Build Coastguard Worker 		printf("%s\n", dent->d_name);
1009*03f9172cSAndroid Build Coastguard Worker 	}
1010*03f9172cSAndroid Build Coastguard Worker 	closedir(dir);
1011*03f9172cSAndroid Build Coastguard Worker }
1012*03f9172cSAndroid Build Coastguard Worker 
1013*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_interface(struct wpa_ctrl * ctrl,int argc,char * argv[])1014*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_interface(struct wpa_ctrl *ctrl, int argc,
1015*03f9172cSAndroid Build Coastguard Worker 				     char *argv[])
1016*03f9172cSAndroid Build Coastguard Worker {
1017*03f9172cSAndroid Build Coastguard Worker 	if (argc < 1) {
1018*03f9172cSAndroid Build Coastguard Worker 		hostapd_cli_list_interfaces(ctrl);
1019*03f9172cSAndroid Build Coastguard Worker 		return 0;
1020*03f9172cSAndroid Build Coastguard Worker 	}
1021*03f9172cSAndroid Build Coastguard Worker 	if (hostapd_cli_reconnect(argv[0]) != 0) {
1022*03f9172cSAndroid Build Coastguard Worker 		printf("Could not connect to interface '%s' - re-trying\n",
1023*03f9172cSAndroid Build Coastguard Worker 			ctrl_ifname);
1024*03f9172cSAndroid Build Coastguard Worker 	}
1025*03f9172cSAndroid Build Coastguard Worker 	return 0;
1026*03f9172cSAndroid Build Coastguard Worker }
1027*03f9172cSAndroid Build Coastguard Worker 
1028*03f9172cSAndroid Build Coastguard Worker 
hostapd_complete_interface(const char * str,int pos)1029*03f9172cSAndroid Build Coastguard Worker static char ** hostapd_complete_interface(const char *str, int pos)
1030*03f9172cSAndroid Build Coastguard Worker {
1031*03f9172cSAndroid Build Coastguard Worker 	int arg = get_cmd_arg_num(str, pos);
1032*03f9172cSAndroid Build Coastguard Worker 	char **res = NULL;
1033*03f9172cSAndroid Build Coastguard Worker 	DEFINE_DL_LIST(interfaces);
1034*03f9172cSAndroid Build Coastguard Worker 
1035*03f9172cSAndroid Build Coastguard Worker 	switch (arg) {
1036*03f9172cSAndroid Build Coastguard Worker 	case 1:
1037*03f9172cSAndroid Build Coastguard Worker 		hostapd_cli_get_interfaces(ctrl_conn, &interfaces);
1038*03f9172cSAndroid Build Coastguard Worker 		res = cli_txt_list_array(&interfaces);
1039*03f9172cSAndroid Build Coastguard Worker 		cli_txt_list_flush(&interfaces);
1040*03f9172cSAndroid Build Coastguard Worker 		break;
1041*03f9172cSAndroid Build Coastguard Worker 	}
1042*03f9172cSAndroid Build Coastguard Worker 
1043*03f9172cSAndroid Build Coastguard Worker 	return res;
1044*03f9172cSAndroid Build Coastguard Worker }
1045*03f9172cSAndroid Build Coastguard Worker 
1046*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_set(struct wpa_ctrl * ctrl,int argc,char * argv[])1047*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_set(struct wpa_ctrl *ctrl, int argc, char *argv[])
1048*03f9172cSAndroid Build Coastguard Worker {
1049*03f9172cSAndroid Build Coastguard Worker 	char cmd[2048];
1050*03f9172cSAndroid Build Coastguard Worker 	int res;
1051*03f9172cSAndroid Build Coastguard Worker 
1052*03f9172cSAndroid Build Coastguard Worker 	if (argc != 2) {
1053*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid SET command: needs two arguments (variable "
1054*03f9172cSAndroid Build Coastguard Worker 		       "name and value)\n");
1055*03f9172cSAndroid Build Coastguard Worker 		return -1;
1056*03f9172cSAndroid Build Coastguard Worker 	}
1057*03f9172cSAndroid Build Coastguard Worker 
1058*03f9172cSAndroid Build Coastguard Worker 	res = os_snprintf(cmd, sizeof(cmd), "SET %s %s", argv[0], argv[1]);
1059*03f9172cSAndroid Build Coastguard Worker 	if (os_snprintf_error(sizeof(cmd), res)) {
1060*03f9172cSAndroid Build Coastguard Worker 		printf("Too long SET command.\n");
1061*03f9172cSAndroid Build Coastguard Worker 		return -1;
1062*03f9172cSAndroid Build Coastguard Worker 	}
1063*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, cmd);
1064*03f9172cSAndroid Build Coastguard Worker }
1065*03f9172cSAndroid Build Coastguard Worker 
1066*03f9172cSAndroid Build Coastguard Worker 
hostapd_complete_set(const char * str,int pos)1067*03f9172cSAndroid Build Coastguard Worker static char ** hostapd_complete_set(const char *str, int pos)
1068*03f9172cSAndroid Build Coastguard Worker {
1069*03f9172cSAndroid Build Coastguard Worker 	int arg = get_cmd_arg_num(str, pos);
1070*03f9172cSAndroid Build Coastguard Worker 	const char *fields[] = {
1071*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_WPS_TESTING
1072*03f9172cSAndroid Build Coastguard Worker 		"wps_version_number", "wps_testing_stub_cred",
1073*03f9172cSAndroid Build Coastguard Worker 		"wps_corrupt_pkhash",
1074*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_WPS_TESTING */
1075*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_INTERWORKING
1076*03f9172cSAndroid Build Coastguard Worker 		"gas_frag_limit",
1077*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_INTERWORKING */
1078*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_TESTING_OPTIONS
1079*03f9172cSAndroid Build Coastguard Worker 		"ext_mgmt_frame_handling", "ext_eapol_frame_io",
1080*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_TESTING_OPTIONS */
1081*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_MBO
1082*03f9172cSAndroid Build Coastguard Worker 		"mbo_assoc_disallow",
1083*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_MBO */
1084*03f9172cSAndroid Build Coastguard Worker 		"deny_mac_file", "accept_mac_file",
1085*03f9172cSAndroid Build Coastguard Worker 	};
1086*03f9172cSAndroid Build Coastguard Worker 	int i, num_fields = ARRAY_SIZE(fields);
1087*03f9172cSAndroid Build Coastguard Worker 
1088*03f9172cSAndroid Build Coastguard Worker 	if (arg == 1) {
1089*03f9172cSAndroid Build Coastguard Worker 		char **res;
1090*03f9172cSAndroid Build Coastguard Worker 
1091*03f9172cSAndroid Build Coastguard Worker 		res = os_calloc(num_fields + 1, sizeof(char *));
1092*03f9172cSAndroid Build Coastguard Worker 		if (!res)
1093*03f9172cSAndroid Build Coastguard Worker 			return NULL;
1094*03f9172cSAndroid Build Coastguard Worker 		for (i = 0; i < num_fields; i++) {
1095*03f9172cSAndroid Build Coastguard Worker 			res[i] = os_strdup(fields[i]);
1096*03f9172cSAndroid Build Coastguard Worker 			if (!res[i])
1097*03f9172cSAndroid Build Coastguard Worker 				return res;
1098*03f9172cSAndroid Build Coastguard Worker 		}
1099*03f9172cSAndroid Build Coastguard Worker 		return res;
1100*03f9172cSAndroid Build Coastguard Worker 	}
1101*03f9172cSAndroid Build Coastguard Worker 	return NULL;
1102*03f9172cSAndroid Build Coastguard Worker }
1103*03f9172cSAndroid Build Coastguard Worker 
1104*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_get(struct wpa_ctrl * ctrl,int argc,char * argv[])1105*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_get(struct wpa_ctrl *ctrl, int argc, char *argv[])
1106*03f9172cSAndroid Build Coastguard Worker {
1107*03f9172cSAndroid Build Coastguard Worker 	char cmd[256];
1108*03f9172cSAndroid Build Coastguard Worker 	int res;
1109*03f9172cSAndroid Build Coastguard Worker 
1110*03f9172cSAndroid Build Coastguard Worker 	if (argc != 1) {
1111*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid GET command: needs one argument (variable "
1112*03f9172cSAndroid Build Coastguard Worker 		       "name)\n");
1113*03f9172cSAndroid Build Coastguard Worker 		return -1;
1114*03f9172cSAndroid Build Coastguard Worker 	}
1115*03f9172cSAndroid Build Coastguard Worker 
1116*03f9172cSAndroid Build Coastguard Worker 	res = os_snprintf(cmd, sizeof(cmd), "GET %s", argv[0]);
1117*03f9172cSAndroid Build Coastguard Worker 	if (os_snprintf_error(sizeof(cmd), res)) {
1118*03f9172cSAndroid Build Coastguard Worker 		printf("Too long GET command.\n");
1119*03f9172cSAndroid Build Coastguard Worker 		return -1;
1120*03f9172cSAndroid Build Coastguard Worker 	}
1121*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, cmd);
1122*03f9172cSAndroid Build Coastguard Worker }
1123*03f9172cSAndroid Build Coastguard Worker 
1124*03f9172cSAndroid Build Coastguard Worker 
hostapd_complete_get(const char * str,int pos)1125*03f9172cSAndroid Build Coastguard Worker static char ** hostapd_complete_get(const char *str, int pos)
1126*03f9172cSAndroid Build Coastguard Worker {
1127*03f9172cSAndroid Build Coastguard Worker 	int arg = get_cmd_arg_num(str, pos);
1128*03f9172cSAndroid Build Coastguard Worker 	const char *fields[] = {
1129*03f9172cSAndroid Build Coastguard Worker 		"version", "tls_library",
1130*03f9172cSAndroid Build Coastguard Worker 	};
1131*03f9172cSAndroid Build Coastguard Worker 	int i, num_fields = ARRAY_SIZE(fields);
1132*03f9172cSAndroid Build Coastguard Worker 
1133*03f9172cSAndroid Build Coastguard Worker 	if (arg == 1) {
1134*03f9172cSAndroid Build Coastguard Worker 		char **res;
1135*03f9172cSAndroid Build Coastguard Worker 
1136*03f9172cSAndroid Build Coastguard Worker 		res = os_calloc(num_fields + 1, sizeof(char *));
1137*03f9172cSAndroid Build Coastguard Worker 		if (!res)
1138*03f9172cSAndroid Build Coastguard Worker 			return NULL;
1139*03f9172cSAndroid Build Coastguard Worker 		for (i = 0; i < num_fields; i++) {
1140*03f9172cSAndroid Build Coastguard Worker 			res[i] = os_strdup(fields[i]);
1141*03f9172cSAndroid Build Coastguard Worker 			if (!res[i])
1142*03f9172cSAndroid Build Coastguard Worker 				return res;
1143*03f9172cSAndroid Build Coastguard Worker 		}
1144*03f9172cSAndroid Build Coastguard Worker 		return res;
1145*03f9172cSAndroid Build Coastguard Worker 	}
1146*03f9172cSAndroid Build Coastguard Worker 	return NULL;
1147*03f9172cSAndroid Build Coastguard Worker }
1148*03f9172cSAndroid Build Coastguard Worker 
1149*03f9172cSAndroid Build Coastguard Worker 
1150*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_FST
hostapd_cli_cmd_fst(struct wpa_ctrl * ctrl,int argc,char * argv[])1151*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_fst(struct wpa_ctrl *ctrl, int argc, char *argv[])
1152*03f9172cSAndroid Build Coastguard Worker {
1153*03f9172cSAndroid Build Coastguard Worker 	char cmd[256];
1154*03f9172cSAndroid Build Coastguard Worker 	int res;
1155*03f9172cSAndroid Build Coastguard Worker 	int i;
1156*03f9172cSAndroid Build Coastguard Worker 	int total;
1157*03f9172cSAndroid Build Coastguard Worker 
1158*03f9172cSAndroid Build Coastguard Worker 	if (argc <= 0) {
1159*03f9172cSAndroid Build Coastguard Worker 		printf("FST command: parameters are required.\n");
1160*03f9172cSAndroid Build Coastguard Worker 		return -1;
1161*03f9172cSAndroid Build Coastguard Worker 	}
1162*03f9172cSAndroid Build Coastguard Worker 
1163*03f9172cSAndroid Build Coastguard Worker 	total = os_snprintf(cmd, sizeof(cmd), "FST-MANAGER");
1164*03f9172cSAndroid Build Coastguard Worker 
1165*03f9172cSAndroid Build Coastguard Worker 	for (i = 0; i < argc; i++) {
1166*03f9172cSAndroid Build Coastguard Worker 		res = os_snprintf(cmd + total, sizeof(cmd) - total, " %s",
1167*03f9172cSAndroid Build Coastguard Worker 				  argv[i]);
1168*03f9172cSAndroid Build Coastguard Worker 		if (os_snprintf_error(sizeof(cmd) - total, res)) {
1169*03f9172cSAndroid Build Coastguard Worker 			printf("Too long fst command.\n");
1170*03f9172cSAndroid Build Coastguard Worker 			return -1;
1171*03f9172cSAndroid Build Coastguard Worker 		}
1172*03f9172cSAndroid Build Coastguard Worker 		total += res;
1173*03f9172cSAndroid Build Coastguard Worker 	}
1174*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, cmd);
1175*03f9172cSAndroid Build Coastguard Worker }
1176*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_FST */
1177*03f9172cSAndroid Build Coastguard Worker 
1178*03f9172cSAndroid Build Coastguard Worker 
1179*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_IEEE80211AX
hostapd_cli_cmd_color_change(struct wpa_ctrl * ctrl,int argc,char * argv[])1180*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_color_change(struct wpa_ctrl *ctrl,
1181*03f9172cSAndroid Build Coastguard Worker 					int argc, char *argv[])
1182*03f9172cSAndroid Build Coastguard Worker {
1183*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "COLOR_CHANGE", 1, argc, argv);
1184*03f9172cSAndroid Build Coastguard Worker }
1185*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_IEEE80211AX */
1186*03f9172cSAndroid Build Coastguard Worker 
1187*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_chan_switch(struct wpa_ctrl * ctrl,int argc,char * argv[])1188*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_chan_switch(struct wpa_ctrl *ctrl,
1189*03f9172cSAndroid Build Coastguard Worker 				       int argc, char *argv[])
1190*03f9172cSAndroid Build Coastguard Worker {
1191*03f9172cSAndroid Build Coastguard Worker 	char cmd[256];
1192*03f9172cSAndroid Build Coastguard Worker 	int res;
1193*03f9172cSAndroid Build Coastguard Worker 	int i;
1194*03f9172cSAndroid Build Coastguard Worker 	char *tmp;
1195*03f9172cSAndroid Build Coastguard Worker 	int total;
1196*03f9172cSAndroid Build Coastguard Worker 
1197*03f9172cSAndroid Build Coastguard Worker 	if (argc < 2) {
1198*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid chan_switch command: needs at least two "
1199*03f9172cSAndroid Build Coastguard Worker 		       "arguments (count and freq)\n"
1200*03f9172cSAndroid Build Coastguard Worker 		       "usage: <cs_count> <freq> [sec_channel_offset=] "
1201*03f9172cSAndroid Build Coastguard Worker 		       "[center_freq1=] [center_freq2=] [bandwidth=] "
1202*03f9172cSAndroid Build Coastguard Worker 		       "[blocktx] [ht|vht|he|eht]\n");
1203*03f9172cSAndroid Build Coastguard Worker 		return -1;
1204*03f9172cSAndroid Build Coastguard Worker 	}
1205*03f9172cSAndroid Build Coastguard Worker 
1206*03f9172cSAndroid Build Coastguard Worker 	res = os_snprintf(cmd, sizeof(cmd), "CHAN_SWITCH %s %s",
1207*03f9172cSAndroid Build Coastguard Worker 			  argv[0], argv[1]);
1208*03f9172cSAndroid Build Coastguard Worker 	if (os_snprintf_error(sizeof(cmd), res)) {
1209*03f9172cSAndroid Build Coastguard Worker 		printf("Too long CHAN_SWITCH command.\n");
1210*03f9172cSAndroid Build Coastguard Worker 		return -1;
1211*03f9172cSAndroid Build Coastguard Worker 	}
1212*03f9172cSAndroid Build Coastguard Worker 
1213*03f9172cSAndroid Build Coastguard Worker 	total = res;
1214*03f9172cSAndroid Build Coastguard Worker 	for (i = 2; i < argc; i++) {
1215*03f9172cSAndroid Build Coastguard Worker 		tmp = cmd + total;
1216*03f9172cSAndroid Build Coastguard Worker 		res = os_snprintf(tmp, sizeof(cmd) - total, " %s", argv[i]);
1217*03f9172cSAndroid Build Coastguard Worker 		if (os_snprintf_error(sizeof(cmd) - total, res)) {
1218*03f9172cSAndroid Build Coastguard Worker 			printf("Too long CHAN_SWITCH command.\n");
1219*03f9172cSAndroid Build Coastguard Worker 			return -1;
1220*03f9172cSAndroid Build Coastguard Worker 		}
1221*03f9172cSAndroid Build Coastguard Worker 		total += res;
1222*03f9172cSAndroid Build Coastguard Worker 	}
1223*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, cmd);
1224*03f9172cSAndroid Build Coastguard Worker }
1225*03f9172cSAndroid Build Coastguard Worker 
1226*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_notify_cw_change(struct wpa_ctrl * ctrl,int argc,char * argv[])1227*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_notify_cw_change(struct wpa_ctrl *ctrl,
1228*03f9172cSAndroid Build Coastguard Worker 					    int argc, char *argv[])
1229*03f9172cSAndroid Build Coastguard Worker {
1230*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "NOTIFY_CW_CHANGE", 1, argc, argv);
1231*03f9172cSAndroid Build Coastguard Worker }
1232*03f9172cSAndroid Build Coastguard Worker 
1233*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_enable(struct wpa_ctrl * ctrl,int argc,char * argv[])1234*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_enable(struct wpa_ctrl *ctrl, int argc,
1235*03f9172cSAndroid Build Coastguard Worker 				  char *argv[])
1236*03f9172cSAndroid Build Coastguard Worker {
1237*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "ENABLE");
1238*03f9172cSAndroid Build Coastguard Worker }
1239*03f9172cSAndroid Build Coastguard Worker 
1240*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_reload(struct wpa_ctrl * ctrl,int argc,char * argv[])1241*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_reload(struct wpa_ctrl *ctrl, int argc,
1242*03f9172cSAndroid Build Coastguard Worker 				  char *argv[])
1243*03f9172cSAndroid Build Coastguard Worker {
1244*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "RELOAD");
1245*03f9172cSAndroid Build Coastguard Worker }
1246*03f9172cSAndroid Build Coastguard Worker 
1247*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_reload_bss(struct wpa_ctrl * ctrl,int argc,char * argv[])1248*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_reload_bss(struct wpa_ctrl *ctrl, int argc,
1249*03f9172cSAndroid Build Coastguard Worker 				      char *argv[])
1250*03f9172cSAndroid Build Coastguard Worker {
1251*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "RELOAD_BSS");
1252*03f9172cSAndroid Build Coastguard Worker }
1253*03f9172cSAndroid Build Coastguard Worker 
1254*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_reload_config(struct wpa_ctrl * ctrl,int argc,char * argv[])1255*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_reload_config(struct wpa_ctrl *ctrl, int argc,
1256*03f9172cSAndroid Build Coastguard Worker 					 char *argv[])
1257*03f9172cSAndroid Build Coastguard Worker {
1258*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "RELOAD_CONFIG");
1259*03f9172cSAndroid Build Coastguard Worker }
1260*03f9172cSAndroid Build Coastguard Worker 
1261*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_disable(struct wpa_ctrl * ctrl,int argc,char * argv[])1262*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_disable(struct wpa_ctrl *ctrl, int argc,
1263*03f9172cSAndroid Build Coastguard Worker 				   char *argv[])
1264*03f9172cSAndroid Build Coastguard Worker {
1265*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "DISABLE");
1266*03f9172cSAndroid Build Coastguard Worker }
1267*03f9172cSAndroid Build Coastguard Worker 
1268*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_enable_mld(struct wpa_ctrl * ctrl,int argc,char * argv[])1269*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_enable_mld(struct wpa_ctrl *ctrl, int argc,
1270*03f9172cSAndroid Build Coastguard Worker 				      char *argv[])
1271*03f9172cSAndroid Build Coastguard Worker {
1272*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "ENABLE_MLD");
1273*03f9172cSAndroid Build Coastguard Worker }
1274*03f9172cSAndroid Build Coastguard Worker 
1275*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_disable_mld(struct wpa_ctrl * ctrl,int argc,char * argv[])1276*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_disable_mld(struct wpa_ctrl *ctrl, int argc,
1277*03f9172cSAndroid Build Coastguard Worker 				       char *argv[])
1278*03f9172cSAndroid Build Coastguard Worker {
1279*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "DISABLE_MLD");
1280*03f9172cSAndroid Build Coastguard Worker }
1281*03f9172cSAndroid Build Coastguard Worker 
1282*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_update_beacon(struct wpa_ctrl * ctrl,int argc,char * argv[])1283*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_update_beacon(struct wpa_ctrl *ctrl, int argc,
1284*03f9172cSAndroid Build Coastguard Worker 					 char *argv[])
1285*03f9172cSAndroid Build Coastguard Worker {
1286*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "UPDATE_BEACON");
1287*03f9172cSAndroid Build Coastguard Worker }
1288*03f9172cSAndroid Build Coastguard Worker 
1289*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_stop_ap(struct wpa_ctrl * ctrl,int argc,char * argv[])1290*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_stop_ap(struct wpa_ctrl *ctrl, int argc,
1291*03f9172cSAndroid Build Coastguard Worker 				   char *argv[])
1292*03f9172cSAndroid Build Coastguard Worker {
1293*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "STOP_AP");
1294*03f9172cSAndroid Build Coastguard Worker }
1295*03f9172cSAndroid Build Coastguard Worker 
1296*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_vendor(struct wpa_ctrl * ctrl,int argc,char * argv[])1297*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_vendor(struct wpa_ctrl *ctrl, int argc, char *argv[])
1298*03f9172cSAndroid Build Coastguard Worker {
1299*03f9172cSAndroid Build Coastguard Worker 	char cmd[256];
1300*03f9172cSAndroid Build Coastguard Worker 	int res;
1301*03f9172cSAndroid Build Coastguard Worker 
1302*03f9172cSAndroid Build Coastguard Worker 	if (argc < 2 || argc > 4) {
1303*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid vendor command\n"
1304*03f9172cSAndroid Build Coastguard Worker 		       "usage: <vendor id> <command id> [<hex formatted command argument>] [nested=<0|1>]\n");
1305*03f9172cSAndroid Build Coastguard Worker 		return -1;
1306*03f9172cSAndroid Build Coastguard Worker 	}
1307*03f9172cSAndroid Build Coastguard Worker 
1308*03f9172cSAndroid Build Coastguard Worker 	res = os_snprintf(cmd, sizeof(cmd), "VENDOR %s %s %s%s%s", argv[0],
1309*03f9172cSAndroid Build Coastguard Worker 			  argv[1], argc >= 3 ? argv[2] : "",
1310*03f9172cSAndroid Build Coastguard Worker 			  argc == 4 ? " " : "", argc == 4 ? argv[3] : "");
1311*03f9172cSAndroid Build Coastguard Worker 	if (os_snprintf_error(sizeof(cmd), res)) {
1312*03f9172cSAndroid Build Coastguard Worker 		printf("Too long VENDOR command.\n");
1313*03f9172cSAndroid Build Coastguard Worker 		return -1;
1314*03f9172cSAndroid Build Coastguard Worker 	}
1315*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, cmd);
1316*03f9172cSAndroid Build Coastguard Worker }
1317*03f9172cSAndroid Build Coastguard Worker 
1318*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_erp_flush(struct wpa_ctrl * ctrl,int argc,char * argv[])1319*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_erp_flush(struct wpa_ctrl *ctrl, int argc,
1320*03f9172cSAndroid Build Coastguard Worker 				     char *argv[])
1321*03f9172cSAndroid Build Coastguard Worker {
1322*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "ERP_FLUSH");
1323*03f9172cSAndroid Build Coastguard Worker }
1324*03f9172cSAndroid Build Coastguard Worker 
1325*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_log_level(struct wpa_ctrl * ctrl,int argc,char * argv[])1326*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_log_level(struct wpa_ctrl *ctrl, int argc,
1327*03f9172cSAndroid Build Coastguard Worker 				     char *argv[])
1328*03f9172cSAndroid Build Coastguard Worker {
1329*03f9172cSAndroid Build Coastguard Worker 	char cmd[256];
1330*03f9172cSAndroid Build Coastguard Worker 	int res;
1331*03f9172cSAndroid Build Coastguard Worker 
1332*03f9172cSAndroid Build Coastguard Worker 	res = os_snprintf(cmd, sizeof(cmd), "LOG_LEVEL%s%s%s%s",
1333*03f9172cSAndroid Build Coastguard Worker 			  argc >= 1 ? " " : "",
1334*03f9172cSAndroid Build Coastguard Worker 			  argc >= 1 ? argv[0] : "",
1335*03f9172cSAndroid Build Coastguard Worker 			  argc == 2 ? " " : "",
1336*03f9172cSAndroid Build Coastguard Worker 			  argc == 2 ? argv[1] : "");
1337*03f9172cSAndroid Build Coastguard Worker 	if (os_snprintf_error(sizeof(cmd), res)) {
1338*03f9172cSAndroid Build Coastguard Worker 		printf("Too long option\n");
1339*03f9172cSAndroid Build Coastguard Worker 		return -1;
1340*03f9172cSAndroid Build Coastguard Worker 	}
1341*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, cmd);
1342*03f9172cSAndroid Build Coastguard Worker }
1343*03f9172cSAndroid Build Coastguard Worker 
1344*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_raw(struct wpa_ctrl * ctrl,int argc,char * argv[])1345*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_raw(struct wpa_ctrl *ctrl, int argc, char *argv[])
1346*03f9172cSAndroid Build Coastguard Worker {
1347*03f9172cSAndroid Build Coastguard Worker 	if (argc == 0)
1348*03f9172cSAndroid Build Coastguard Worker 		return -1;
1349*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, argv[0], 0, argc - 1, &argv[1]);
1350*03f9172cSAndroid Build Coastguard Worker }
1351*03f9172cSAndroid Build Coastguard Worker 
1352*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_pmksa(struct wpa_ctrl * ctrl,int argc,char * argv[])1353*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_pmksa(struct wpa_ctrl *ctrl, int argc, char *argv[])
1354*03f9172cSAndroid Build Coastguard Worker {
1355*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "PMKSA");
1356*03f9172cSAndroid Build Coastguard Worker }
1357*03f9172cSAndroid Build Coastguard Worker 
1358*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_pmksa_flush(struct wpa_ctrl * ctrl,int argc,char * argv[])1359*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_pmksa_flush(struct wpa_ctrl *ctrl, int argc,
1360*03f9172cSAndroid Build Coastguard Worker 				       char *argv[])
1361*03f9172cSAndroid Build Coastguard Worker {
1362*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "PMKSA_FLUSH");
1363*03f9172cSAndroid Build Coastguard Worker }
1364*03f9172cSAndroid Build Coastguard Worker 
1365*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_set_neighbor(struct wpa_ctrl * ctrl,int argc,char * argv[])1366*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_set_neighbor(struct wpa_ctrl *ctrl, int argc,
1367*03f9172cSAndroid Build Coastguard Worker 					char *argv[])
1368*03f9172cSAndroid Build Coastguard Worker {
1369*03f9172cSAndroid Build Coastguard Worker 	char cmd[2048];
1370*03f9172cSAndroid Build Coastguard Worker 	int res;
1371*03f9172cSAndroid Build Coastguard Worker 
1372*03f9172cSAndroid Build Coastguard Worker 	if (argc < 3 || argc > 6) {
1373*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid set_neighbor command: needs 3-6 arguments\n");
1374*03f9172cSAndroid Build Coastguard Worker 		return -1;
1375*03f9172cSAndroid Build Coastguard Worker 	}
1376*03f9172cSAndroid Build Coastguard Worker 
1377*03f9172cSAndroid Build Coastguard Worker 	res = os_snprintf(cmd, sizeof(cmd), "SET_NEIGHBOR %s %s %s %s %s %s",
1378*03f9172cSAndroid Build Coastguard Worker 			  argv[0], argv[1], argv[2], argc >= 4 ? argv[3] : "",
1379*03f9172cSAndroid Build Coastguard Worker 			  argc >= 5 ? argv[4] : "", argc == 6 ? argv[5] : "");
1380*03f9172cSAndroid Build Coastguard Worker 	if (os_snprintf_error(sizeof(cmd), res)) {
1381*03f9172cSAndroid Build Coastguard Worker 		printf("Too long SET_NEIGHBOR command.\n");
1382*03f9172cSAndroid Build Coastguard Worker 		return -1;
1383*03f9172cSAndroid Build Coastguard Worker 	}
1384*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, cmd);
1385*03f9172cSAndroid Build Coastguard Worker }
1386*03f9172cSAndroid Build Coastguard Worker 
1387*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_show_neighbor(struct wpa_ctrl * ctrl,int argc,char * argv[])1388*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_show_neighbor(struct wpa_ctrl *ctrl, int argc,
1389*03f9172cSAndroid Build Coastguard Worker 					 char *argv[])
1390*03f9172cSAndroid Build Coastguard Worker {
1391*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "SHOW_NEIGHBOR");
1392*03f9172cSAndroid Build Coastguard Worker }
1393*03f9172cSAndroid Build Coastguard Worker 
1394*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_remove_neighbor(struct wpa_ctrl * ctrl,int argc,char * argv[])1395*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_remove_neighbor(struct wpa_ctrl *ctrl, int argc,
1396*03f9172cSAndroid Build Coastguard Worker 					   char *argv[])
1397*03f9172cSAndroid Build Coastguard Worker {
1398*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "REMOVE_NEIGHBOR", 1, argc, argv);
1399*03f9172cSAndroid Build Coastguard Worker }
1400*03f9172cSAndroid Build Coastguard Worker 
1401*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_req_lci(struct wpa_ctrl * ctrl,int argc,char * argv[])1402*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_req_lci(struct wpa_ctrl *ctrl, int argc,
1403*03f9172cSAndroid Build Coastguard Worker 				   char *argv[])
1404*03f9172cSAndroid Build Coastguard Worker {
1405*03f9172cSAndroid Build Coastguard Worker 	char cmd[256];
1406*03f9172cSAndroid Build Coastguard Worker 	int res;
1407*03f9172cSAndroid Build Coastguard Worker 
1408*03f9172cSAndroid Build Coastguard Worker 	if (argc != 1) {
1409*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid req_lci command - requires destination address\n");
1410*03f9172cSAndroid Build Coastguard Worker 		return -1;
1411*03f9172cSAndroid Build Coastguard Worker 	}
1412*03f9172cSAndroid Build Coastguard Worker 
1413*03f9172cSAndroid Build Coastguard Worker 	res = os_snprintf(cmd, sizeof(cmd), "REQ_LCI %s", argv[0]);
1414*03f9172cSAndroid Build Coastguard Worker 	if (os_snprintf_error(sizeof(cmd), res)) {
1415*03f9172cSAndroid Build Coastguard Worker 		printf("Too long REQ_LCI command.\n");
1416*03f9172cSAndroid Build Coastguard Worker 		return -1;
1417*03f9172cSAndroid Build Coastguard Worker 	}
1418*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, cmd);
1419*03f9172cSAndroid Build Coastguard Worker }
1420*03f9172cSAndroid Build Coastguard Worker 
1421*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_req_range(struct wpa_ctrl * ctrl,int argc,char * argv[])1422*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_req_range(struct wpa_ctrl *ctrl, int argc,
1423*03f9172cSAndroid Build Coastguard Worker 				     char *argv[])
1424*03f9172cSAndroid Build Coastguard Worker {
1425*03f9172cSAndroid Build Coastguard Worker 	if (argc < 4) {
1426*03f9172cSAndroid Build Coastguard Worker 		printf("Invalid req_range command: needs at least 4 arguments - dest address, randomization interval, min AP count, and 1 to 16 AP addresses\n");
1427*03f9172cSAndroid Build Coastguard Worker 		return -1;
1428*03f9172cSAndroid Build Coastguard Worker 	}
1429*03f9172cSAndroid Build Coastguard Worker 
1430*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "REQ_RANGE", 4, argc, argv);
1431*03f9172cSAndroid Build Coastguard Worker }
1432*03f9172cSAndroid Build Coastguard Worker 
1433*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_driver_flags(struct wpa_ctrl * ctrl,int argc,char * argv[])1434*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_driver_flags(struct wpa_ctrl *ctrl, int argc,
1435*03f9172cSAndroid Build Coastguard Worker 					char *argv[])
1436*03f9172cSAndroid Build Coastguard Worker {
1437*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "DRIVER_FLAGS");
1438*03f9172cSAndroid Build Coastguard Worker }
1439*03f9172cSAndroid Build Coastguard Worker 
1440*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_driver_flags2(struct wpa_ctrl * ctrl,int argc,char * argv[])1441*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_driver_flags2(struct wpa_ctrl *ctrl, int argc,
1442*03f9172cSAndroid Build Coastguard Worker 					 char *argv[])
1443*03f9172cSAndroid Build Coastguard Worker {
1444*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "DRIVER_FLAGS2");
1445*03f9172cSAndroid Build Coastguard Worker }
1446*03f9172cSAndroid Build Coastguard Worker 
1447*03f9172cSAndroid Build Coastguard Worker 
1448*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_DPP
1449*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_dpp_qr_code(struct wpa_ctrl * ctrl,int argc,char * argv[])1450*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_dpp_qr_code(struct wpa_ctrl *ctrl, int argc,
1451*03f9172cSAndroid Build Coastguard Worker 				       char *argv[])
1452*03f9172cSAndroid Build Coastguard Worker {
1453*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "DPP_QR_CODE", 1, argc, argv);
1454*03f9172cSAndroid Build Coastguard Worker }
1455*03f9172cSAndroid Build Coastguard Worker 
1456*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_dpp_bootstrap_gen(struct wpa_ctrl * ctrl,int argc,char * argv[])1457*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_dpp_bootstrap_gen(struct wpa_ctrl *ctrl, int argc,
1458*03f9172cSAndroid Build Coastguard Worker 					     char *argv[])
1459*03f9172cSAndroid Build Coastguard Worker {
1460*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "DPP_BOOTSTRAP_GEN", 1, argc, argv);
1461*03f9172cSAndroid Build Coastguard Worker }
1462*03f9172cSAndroid Build Coastguard Worker 
1463*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_dpp_bootstrap_remove(struct wpa_ctrl * ctrl,int argc,char * argv[])1464*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_dpp_bootstrap_remove(struct wpa_ctrl *ctrl, int argc,
1465*03f9172cSAndroid Build Coastguard Worker 						char *argv[])
1466*03f9172cSAndroid Build Coastguard Worker {
1467*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "DPP_BOOTSTRAP_REMOVE", 1, argc, argv);
1468*03f9172cSAndroid Build Coastguard Worker }
1469*03f9172cSAndroid Build Coastguard Worker 
1470*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_dpp_bootstrap_get_uri(struct wpa_ctrl * ctrl,int argc,char * argv[])1471*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_dpp_bootstrap_get_uri(struct wpa_ctrl *ctrl,
1472*03f9172cSAndroid Build Coastguard Worker 						 int argc, char *argv[])
1473*03f9172cSAndroid Build Coastguard Worker {
1474*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "DPP_BOOTSTRAP_GET_URI", 1, argc, argv);
1475*03f9172cSAndroid Build Coastguard Worker }
1476*03f9172cSAndroid Build Coastguard Worker 
1477*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_dpp_bootstrap_info(struct wpa_ctrl * ctrl,int argc,char * argv[])1478*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_dpp_bootstrap_info(struct wpa_ctrl *ctrl, int argc,
1479*03f9172cSAndroid Build Coastguard Worker 					      char *argv[])
1480*03f9172cSAndroid Build Coastguard Worker {
1481*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "DPP_BOOTSTRAP_INFO", 1, argc, argv);
1482*03f9172cSAndroid Build Coastguard Worker }
1483*03f9172cSAndroid Build Coastguard Worker 
1484*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_dpp_bootstrap_set(struct wpa_ctrl * ctrl,int argc,char * argv[])1485*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_dpp_bootstrap_set(struct wpa_ctrl *ctrl, int argc,
1486*03f9172cSAndroid Build Coastguard Worker 					     char *argv[])
1487*03f9172cSAndroid Build Coastguard Worker {
1488*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "DPP_BOOTSTRAP_SET", 1, argc, argv);
1489*03f9172cSAndroid Build Coastguard Worker }
1490*03f9172cSAndroid Build Coastguard Worker 
1491*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_dpp_auth_init(struct wpa_ctrl * ctrl,int argc,char * argv[])1492*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_dpp_auth_init(struct wpa_ctrl *ctrl, int argc,
1493*03f9172cSAndroid Build Coastguard Worker 					 char *argv[])
1494*03f9172cSAndroid Build Coastguard Worker {
1495*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "DPP_AUTH_INIT", 1, argc, argv);
1496*03f9172cSAndroid Build Coastguard Worker }
1497*03f9172cSAndroid Build Coastguard Worker 
1498*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_dpp_listen(struct wpa_ctrl * ctrl,int argc,char * argv[])1499*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_dpp_listen(struct wpa_ctrl *ctrl, int argc,
1500*03f9172cSAndroid Build Coastguard Worker 				      char *argv[])
1501*03f9172cSAndroid Build Coastguard Worker {
1502*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "DPP_LISTEN", 1, argc, argv);
1503*03f9172cSAndroid Build Coastguard Worker }
1504*03f9172cSAndroid Build Coastguard Worker 
1505*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_dpp_stop_listen(struct wpa_ctrl * ctrl,int argc,char * argv[])1506*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_dpp_stop_listen(struct wpa_ctrl *ctrl, int argc,
1507*03f9172cSAndroid Build Coastguard Worker 				       char *argv[])
1508*03f9172cSAndroid Build Coastguard Worker {
1509*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "DPP_STOP_LISTEN");
1510*03f9172cSAndroid Build Coastguard Worker }
1511*03f9172cSAndroid Build Coastguard Worker 
1512*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_dpp_configurator_add(struct wpa_ctrl * ctrl,int argc,char * argv[])1513*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_dpp_configurator_add(struct wpa_ctrl *ctrl, int argc,
1514*03f9172cSAndroid Build Coastguard Worker 						char *argv[])
1515*03f9172cSAndroid Build Coastguard Worker {
1516*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "DPP_CONFIGURATOR_ADD", 0, argc, argv);
1517*03f9172cSAndroid Build Coastguard Worker }
1518*03f9172cSAndroid Build Coastguard Worker 
1519*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_dpp_configurator_remove(struct wpa_ctrl * ctrl,int argc,char * argv[])1520*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_dpp_configurator_remove(struct wpa_ctrl *ctrl,
1521*03f9172cSAndroid Build Coastguard Worker 						   int argc, char *argv[])
1522*03f9172cSAndroid Build Coastguard Worker {
1523*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "DPP_CONFIGURATOR_REMOVE", 1, argc, argv);
1524*03f9172cSAndroid Build Coastguard Worker }
1525*03f9172cSAndroid Build Coastguard Worker 
1526*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_dpp_configurator_get_key(struct wpa_ctrl * ctrl,int argc,char * argv[])1527*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_dpp_configurator_get_key(struct wpa_ctrl *ctrl,
1528*03f9172cSAndroid Build Coastguard Worker 						    int argc, char *argv[])
1529*03f9172cSAndroid Build Coastguard Worker {
1530*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "DPP_CONFIGURATOR_GET_KEY", 1, argc, argv);
1531*03f9172cSAndroid Build Coastguard Worker }
1532*03f9172cSAndroid Build Coastguard Worker 
1533*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_dpp_configurator_sign(struct wpa_ctrl * ctrl,int argc,char * argv[])1534*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_dpp_configurator_sign(struct wpa_ctrl *ctrl,
1535*03f9172cSAndroid Build Coastguard Worker 						 int argc, char *argv[])
1536*03f9172cSAndroid Build Coastguard Worker {
1537*03f9172cSAndroid Build Coastguard Worker        return hostapd_cli_cmd(ctrl, "DPP_CONFIGURATOR_SIGN", 1, argc, argv);
1538*03f9172cSAndroid Build Coastguard Worker }
1539*03f9172cSAndroid Build Coastguard Worker 
1540*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_dpp_pkex_add(struct wpa_ctrl * ctrl,int argc,char * argv[])1541*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_dpp_pkex_add(struct wpa_ctrl *ctrl, int argc,
1542*03f9172cSAndroid Build Coastguard Worker 					char *argv[])
1543*03f9172cSAndroid Build Coastguard Worker {
1544*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "DPP_PKEX_ADD", 1, argc, argv);
1545*03f9172cSAndroid Build Coastguard Worker }
1546*03f9172cSAndroid Build Coastguard Worker 
1547*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_dpp_pkex_remove(struct wpa_ctrl * ctrl,int argc,char * argv[])1548*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_dpp_pkex_remove(struct wpa_ctrl *ctrl, int argc,
1549*03f9172cSAndroid Build Coastguard Worker 					   char *argv[])
1550*03f9172cSAndroid Build Coastguard Worker {
1551*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "DPP_PKEX_REMOVE", 1, argc, argv);
1552*03f9172cSAndroid Build Coastguard Worker }
1553*03f9172cSAndroid Build Coastguard Worker 
1554*03f9172cSAndroid Build Coastguard Worker 
1555*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_DPP2
1556*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_dpp_controller_start(struct wpa_ctrl * ctrl,int argc,char * argv[])1557*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_dpp_controller_start(struct wpa_ctrl *ctrl, int argc,
1558*03f9172cSAndroid Build Coastguard Worker 						char *argv[])
1559*03f9172cSAndroid Build Coastguard Worker {
1560*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "DPP_CONTROLLER_START", 0, argc, argv);
1561*03f9172cSAndroid Build Coastguard Worker }
1562*03f9172cSAndroid Build Coastguard Worker 
1563*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_dpp_controller_stop(struct wpa_ctrl * ctrl,int argc,char * argv[])1564*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_dpp_controller_stop(struct wpa_ctrl *ctrl, int argc,
1565*03f9172cSAndroid Build Coastguard Worker 					       char *argv[])
1566*03f9172cSAndroid Build Coastguard Worker {
1567*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "DPP_CONTROLLER_STOP");
1568*03f9172cSAndroid Build Coastguard Worker }
1569*03f9172cSAndroid Build Coastguard Worker 
1570*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_dpp_chirp(struct wpa_ctrl * ctrl,int argc,char * argv[])1571*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_dpp_chirp(struct wpa_ctrl *ctrl, int argc,
1572*03f9172cSAndroid Build Coastguard Worker 				     char *argv[])
1573*03f9172cSAndroid Build Coastguard Worker {
1574*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "DPP_CHIRP", 1, argc, argv);
1575*03f9172cSAndroid Build Coastguard Worker }
1576*03f9172cSAndroid Build Coastguard Worker 
1577*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_dpp_stop_chirp(struct wpa_ctrl * ctrl,int argc,char * argv[])1578*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_dpp_stop_chirp(struct wpa_ctrl *ctrl, int argc,
1579*03f9172cSAndroid Build Coastguard Worker 					  char *argv[])
1580*03f9172cSAndroid Build Coastguard Worker {
1581*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "DPP_STOP_CHIRP");
1582*03f9172cSAndroid Build Coastguard Worker }
1583*03f9172cSAndroid Build Coastguard Worker 
1584*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_DPP2 */
1585*03f9172cSAndroid Build Coastguard Worker 
1586*03f9172cSAndroid Build Coastguard Worker 
1587*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_DPP3
hostapd_cli_cmd_dpp_push_button(struct wpa_ctrl * ctrl,int argc,char * argv[])1588*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_dpp_push_button(struct wpa_ctrl *ctrl, int argc,
1589*03f9172cSAndroid Build Coastguard Worker 					   char *argv[])
1590*03f9172cSAndroid Build Coastguard Worker {
1591*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "DPP_PUSH_BUTTON", 0, argc, argv);
1592*03f9172cSAndroid Build Coastguard Worker }
1593*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_DPP3 */
1594*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_DPP */
1595*03f9172cSAndroid Build Coastguard Worker 
1596*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_accept_macacl(struct wpa_ctrl * ctrl,int argc,char * argv[])1597*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_accept_macacl(struct wpa_ctrl *ctrl, int argc,
1598*03f9172cSAndroid Build Coastguard Worker 					 char *argv[])
1599*03f9172cSAndroid Build Coastguard Worker {
1600*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "ACCEPT_ACL", 1, argc, argv);
1601*03f9172cSAndroid Build Coastguard Worker }
1602*03f9172cSAndroid Build Coastguard Worker 
1603*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_deny_macacl(struct wpa_ctrl * ctrl,int argc,char * argv[])1604*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_deny_macacl(struct wpa_ctrl *ctrl, int argc,
1605*03f9172cSAndroid Build Coastguard Worker 				       char *argv[])
1606*03f9172cSAndroid Build Coastguard Worker {
1607*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "DENY_ACL", 1, argc, argv);
1608*03f9172cSAndroid Build Coastguard Worker }
1609*03f9172cSAndroid Build Coastguard Worker 
1610*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_poll_sta(struct wpa_ctrl * ctrl,int argc,char * argv[])1611*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_poll_sta(struct wpa_ctrl *ctrl, int argc,
1612*03f9172cSAndroid Build Coastguard Worker 				    char *argv[])
1613*03f9172cSAndroid Build Coastguard Worker {
1614*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "POLL_STA", 1, argc, argv);
1615*03f9172cSAndroid Build Coastguard Worker }
1616*03f9172cSAndroid Build Coastguard Worker 
1617*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_req_beacon(struct wpa_ctrl * ctrl,int argc,char * argv[])1618*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_req_beacon(struct wpa_ctrl *ctrl, int argc,
1619*03f9172cSAndroid Build Coastguard Worker 				      char *argv[])
1620*03f9172cSAndroid Build Coastguard Worker {
1621*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "REQ_BEACON", 2, argc, argv);
1622*03f9172cSAndroid Build Coastguard Worker }
1623*03f9172cSAndroid Build Coastguard Worker 
1624*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_req_link_measurement(struct wpa_ctrl * ctrl,int argc,char * argv[])1625*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_req_link_measurement(struct wpa_ctrl *ctrl, int argc,
1626*03f9172cSAndroid Build Coastguard Worker 						char *argv[])
1627*03f9172cSAndroid Build Coastguard Worker {
1628*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "REQ_LINK_MEASUREMENT", 1, argc, argv);
1629*03f9172cSAndroid Build Coastguard Worker }
1630*03f9172cSAndroid Build Coastguard Worker 
1631*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_reload_wpa_psk(struct wpa_ctrl * ctrl,int argc,char * argv[])1632*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_reload_wpa_psk(struct wpa_ctrl *ctrl, int argc,
1633*03f9172cSAndroid Build Coastguard Worker 					  char *argv[])
1634*03f9172cSAndroid Build Coastguard Worker {
1635*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "RELOAD_WPA_PSK");
1636*03f9172cSAndroid Build Coastguard Worker }
1637*03f9172cSAndroid Build Coastguard Worker 
1638*03f9172cSAndroid Build Coastguard Worker 
1639*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_IEEE80211R_AP
1640*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_get_rxkhs(struct wpa_ctrl * ctrl,int argc,char * argv[])1641*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_get_rxkhs(struct wpa_ctrl *ctrl, int argc,
1642*03f9172cSAndroid Build Coastguard Worker 				     char *argv[])
1643*03f9172cSAndroid Build Coastguard Worker {
1644*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "GET_RXKHS");
1645*03f9172cSAndroid Build Coastguard Worker }
1646*03f9172cSAndroid Build Coastguard Worker 
1647*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_reload_rxkhs(struct wpa_ctrl * ctrl,int argc,char * argv[])1648*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_reload_rxkhs(struct wpa_ctrl *ctrl, int argc,
1649*03f9172cSAndroid Build Coastguard Worker 					char *argv[])
1650*03f9172cSAndroid Build Coastguard Worker {
1651*03f9172cSAndroid Build Coastguard Worker 	return wpa_ctrl_command(ctrl, "RELOAD_RXKHS");
1652*03f9172cSAndroid Build Coastguard Worker }
1653*03f9172cSAndroid Build Coastguard Worker 
1654*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_IEEE80211R_AP */
1655*03f9172cSAndroid Build Coastguard Worker 
1656*03f9172cSAndroid Build Coastguard Worker 
1657*03f9172cSAndroid Build Coastguard Worker #ifdef ANDROID
hostapd_cli_cmd_driver(struct wpa_ctrl * ctrl,int argc,char * argv[])1658*03f9172cSAndroid Build Coastguard Worker static int hostapd_cli_cmd_driver(struct wpa_ctrl *ctrl, int argc, char *argv[])
1659*03f9172cSAndroid Build Coastguard Worker {
1660*03f9172cSAndroid Build Coastguard Worker 	return hostapd_cli_cmd(ctrl, "DRIVER", 1, argc, argv);
1661*03f9172cSAndroid Build Coastguard Worker }
1662*03f9172cSAndroid Build Coastguard Worker #endif /* ANDROID */
1663*03f9172cSAndroid Build Coastguard Worker 
1664*03f9172cSAndroid Build Coastguard Worker 
1665*03f9172cSAndroid Build Coastguard Worker struct hostapd_cli_cmd {
1666*03f9172cSAndroid Build Coastguard Worker 	const char *cmd;
1667*03f9172cSAndroid Build Coastguard Worker 	int (*handler)(struct wpa_ctrl *ctrl, int argc, char *argv[]);
1668*03f9172cSAndroid Build Coastguard Worker 	char ** (*completion)(const char *str, int pos);
1669*03f9172cSAndroid Build Coastguard Worker 	const char *usage;
1670*03f9172cSAndroid Build Coastguard Worker };
1671*03f9172cSAndroid Build Coastguard Worker 
1672*03f9172cSAndroid Build Coastguard Worker static const struct hostapd_cli_cmd hostapd_cli_commands[] = {
1673*03f9172cSAndroid Build Coastguard Worker 	{ "ping", hostapd_cli_cmd_ping, NULL,
1674*03f9172cSAndroid Build Coastguard Worker 	  "= pings hostapd" },
1675*03f9172cSAndroid Build Coastguard Worker 	{ "mib", hostapd_cli_cmd_mib, NULL,
1676*03f9172cSAndroid Build Coastguard Worker 	  "= get MIB variables (dot1x, dot11, radius)" },
1677*03f9172cSAndroid Build Coastguard Worker 	{ "relog", hostapd_cli_cmd_relog, NULL,
1678*03f9172cSAndroid Build Coastguard Worker 	  "= reload/truncate debug log output file" },
1679*03f9172cSAndroid Build Coastguard Worker 	{ "close_log", hostapd_cli_cmd_close_log, NULL,
1680*03f9172cSAndroid Build Coastguard Worker 	  "= disable debug log output file" },
1681*03f9172cSAndroid Build Coastguard Worker 	{ "status", hostapd_cli_cmd_status, NULL,
1682*03f9172cSAndroid Build Coastguard Worker 	  "= show interface status info" },
1683*03f9172cSAndroid Build Coastguard Worker 	{ "sta", hostapd_cli_cmd_sta, hostapd_complete_stations,
1684*03f9172cSAndroid Build Coastguard Worker 	  "<addr> = get MIB variables for one station" },
1685*03f9172cSAndroid Build Coastguard Worker 	{ "all_sta", hostapd_cli_cmd_all_sta, NULL,
1686*03f9172cSAndroid Build Coastguard Worker 	   "= get MIB variables for all stations" },
1687*03f9172cSAndroid Build Coastguard Worker 	{ "list_sta", hostapd_cli_cmd_list_sta, NULL,
1688*03f9172cSAndroid Build Coastguard Worker 	   "= list all stations" },
1689*03f9172cSAndroid Build Coastguard Worker 	{ "new_sta", hostapd_cli_cmd_new_sta, NULL,
1690*03f9172cSAndroid Build Coastguard Worker 	  "<addr> = add a new station" },
1691*03f9172cSAndroid Build Coastguard Worker 	{ "deauthenticate", hostapd_cli_cmd_deauthenticate,
1692*03f9172cSAndroid Build Coastguard Worker 	  hostapd_complete_stations,
1693*03f9172cSAndroid Build Coastguard Worker 	  "<addr> = deauthenticate a station" },
1694*03f9172cSAndroid Build Coastguard Worker 	{ "disassociate", hostapd_cli_cmd_disassociate,
1695*03f9172cSAndroid Build Coastguard Worker 	  hostapd_complete_stations,
1696*03f9172cSAndroid Build Coastguard Worker 	  "<addr> = disassociate a station" },
1697*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_TAXONOMY
1698*03f9172cSAndroid Build Coastguard Worker 	{ "signature", hostapd_cli_cmd_signature, hostapd_complete_stations,
1699*03f9172cSAndroid Build Coastguard Worker 	  "<addr> = get taxonomy signature for a station" },
1700*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_TAXONOMY */
1701*03f9172cSAndroid Build Coastguard Worker 	{ "sa_query", hostapd_cli_cmd_sa_query, hostapd_complete_stations,
1702*03f9172cSAndroid Build Coastguard Worker 	  "<addr> = send SA Query to a station" },
1703*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_WPS
1704*03f9172cSAndroid Build Coastguard Worker 	{ "wps_pin", hostapd_cli_cmd_wps_pin, NULL,
1705*03f9172cSAndroid Build Coastguard Worker 	  "<uuid> <pin> [timeout] [addr] = add WPS Enrollee PIN" },
1706*03f9172cSAndroid Build Coastguard Worker 	{ "wps_check_pin", hostapd_cli_cmd_wps_check_pin, NULL,
1707*03f9172cSAndroid Build Coastguard Worker 	  "<PIN> = verify PIN checksum" },
1708*03f9172cSAndroid Build Coastguard Worker 	{ "wps_pbc", hostapd_cli_cmd_wps_pbc, NULL,
1709*03f9172cSAndroid Build Coastguard Worker 	  "= indicate button pushed to initiate PBC" },
1710*03f9172cSAndroid Build Coastguard Worker 	{ "wps_cancel", hostapd_cli_cmd_wps_cancel, NULL,
1711*03f9172cSAndroid Build Coastguard Worker 	  "= cancel the pending WPS operation" },
1712*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_WPS_NFC
1713*03f9172cSAndroid Build Coastguard Worker 	{ "wps_nfc_tag_read", hostapd_cli_cmd_wps_nfc_tag_read, NULL,
1714*03f9172cSAndroid Build Coastguard Worker 	  "<hexdump> = report read NFC tag with WPS data" },
1715*03f9172cSAndroid Build Coastguard Worker 	{ "wps_nfc_config_token", hostapd_cli_cmd_wps_nfc_config_token, NULL,
1716*03f9172cSAndroid Build Coastguard Worker 	  "<WPS/NDEF> = build NFC configuration token" },
1717*03f9172cSAndroid Build Coastguard Worker 	{ "wps_nfc_token", hostapd_cli_cmd_wps_nfc_token, NULL,
1718*03f9172cSAndroid Build Coastguard Worker 	  "<WPS/NDEF/enable/disable> = manager NFC password token" },
1719*03f9172cSAndroid Build Coastguard Worker 	{ "nfc_get_handover_sel", hostapd_cli_cmd_nfc_get_handover_sel, NULL,
1720*03f9172cSAndroid Build Coastguard Worker 	  NULL },
1721*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_WPS_NFC */
1722*03f9172cSAndroid Build Coastguard Worker 	{ "wps_ap_pin", hostapd_cli_cmd_wps_ap_pin, NULL,
1723*03f9172cSAndroid Build Coastguard Worker 	  "<cmd> [params..] = enable/disable AP PIN" },
1724*03f9172cSAndroid Build Coastguard Worker 	{ "wps_config", hostapd_cli_cmd_wps_config, NULL,
1725*03f9172cSAndroid Build Coastguard Worker 	  "<SSID> <auth> <encr> <key> = configure AP" },
1726*03f9172cSAndroid Build Coastguard Worker 	{ "wps_get_status", hostapd_cli_cmd_wps_get_status, NULL,
1727*03f9172cSAndroid Build Coastguard Worker 	  "= show current WPS status" },
1728*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_WPS */
1729*03f9172cSAndroid Build Coastguard Worker 	{ "disassoc_imminent", hostapd_cli_cmd_disassoc_imminent, NULL,
1730*03f9172cSAndroid Build Coastguard Worker 	  "= send Disassociation Imminent notification" },
1731*03f9172cSAndroid Build Coastguard Worker 	{ "ess_disassoc", hostapd_cli_cmd_ess_disassoc, NULL,
1732*03f9172cSAndroid Build Coastguard Worker 	  "= send ESS Dissassociation Imminent notification" },
1733*03f9172cSAndroid Build Coastguard Worker 	{ "bss_tm_req", hostapd_cli_cmd_bss_tm_req, NULL,
1734*03f9172cSAndroid Build Coastguard Worker 	  "= send BSS Transition Management Request" },
1735*03f9172cSAndroid Build Coastguard Worker 	{ "get_config", hostapd_cli_cmd_get_config, NULL,
1736*03f9172cSAndroid Build Coastguard Worker 	  "= show current configuration" },
1737*03f9172cSAndroid Build Coastguard Worker 	{ "help", hostapd_cli_cmd_help, hostapd_cli_complete_help,
1738*03f9172cSAndroid Build Coastguard Worker 	  "= show this usage help" },
1739*03f9172cSAndroid Build Coastguard Worker 	{ "interface", hostapd_cli_cmd_interface, hostapd_complete_interface,
1740*03f9172cSAndroid Build Coastguard Worker 	  "[ifname] = show interfaces/select interface" },
1741*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_FST
1742*03f9172cSAndroid Build Coastguard Worker 	{ "fst", hostapd_cli_cmd_fst, NULL,
1743*03f9172cSAndroid Build Coastguard Worker 	  "<params...> = send FST-MANAGER control interface command" },
1744*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_FST */
1745*03f9172cSAndroid Build Coastguard Worker 	{ "raw", hostapd_cli_cmd_raw, NULL,
1746*03f9172cSAndroid Build Coastguard Worker 	  "<params..> = send unprocessed command" },
1747*03f9172cSAndroid Build Coastguard Worker 	{ "level", hostapd_cli_cmd_level, NULL,
1748*03f9172cSAndroid Build Coastguard Worker 	  "<debug level> = change debug level" },
1749*03f9172cSAndroid Build Coastguard Worker 	{ "license", hostapd_cli_cmd_license, NULL,
1750*03f9172cSAndroid Build Coastguard Worker 	  "= show full hostapd_cli license" },
1751*03f9172cSAndroid Build Coastguard Worker 	{ "quit", hostapd_cli_cmd_quit, NULL,
1752*03f9172cSAndroid Build Coastguard Worker 	  "= exit hostapd_cli" },
1753*03f9172cSAndroid Build Coastguard Worker 	{ "set", hostapd_cli_cmd_set, hostapd_complete_set,
1754*03f9172cSAndroid Build Coastguard Worker 	  "<name> <value> = set runtime variables" },
1755*03f9172cSAndroid Build Coastguard Worker 	{ "get", hostapd_cli_cmd_get, hostapd_complete_get,
1756*03f9172cSAndroid Build Coastguard Worker 	  "<name> = get runtime info" },
1757*03f9172cSAndroid Build Coastguard Worker 	{ "set_qos_map_set", hostapd_cli_cmd_set_qos_map_set, NULL,
1758*03f9172cSAndroid Build Coastguard Worker 	  "<arg,arg,...> = set QoS Map set element" },
1759*03f9172cSAndroid Build Coastguard Worker 	{ "send_qos_map_conf", hostapd_cli_cmd_send_qos_map_conf,
1760*03f9172cSAndroid Build Coastguard Worker 	  hostapd_complete_stations,
1761*03f9172cSAndroid Build Coastguard Worker 	  "<addr> = send QoS Map Configure frame" },
1762*03f9172cSAndroid Build Coastguard Worker 	{ "chan_switch", hostapd_cli_cmd_chan_switch, NULL,
1763*03f9172cSAndroid Build Coastguard Worker 	  "<cs_count> <freq> [sec_channel_offset=] [center_freq1=]\n"
1764*03f9172cSAndroid Build Coastguard Worker 	  "  [center_freq2=] [bandwidth=] [blocktx] [ht|vht]\n"
1765*03f9172cSAndroid Build Coastguard Worker 	  "  = initiate channel switch announcement" },
1766*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_IEEE80211AX
1767*03f9172cSAndroid Build Coastguard Worker 	{ "color_change", hostapd_cli_cmd_color_change, NULL,
1768*03f9172cSAndroid Build Coastguard Worker 	  "<color> = initiate BSS color change to set the specified color\n"
1769*03f9172cSAndroid Build Coastguard Worker 	  "Value 0 will disable the color.\n"},
1770*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_IEEE80211AX */
1771*03f9172cSAndroid Build Coastguard Worker 	{ "notify_cw_change", hostapd_cli_cmd_notify_cw_change, NULL,
1772*03f9172cSAndroid Build Coastguard Worker 	  "<channel_width> = 0 - 20 MHz, 1 - 40 MHz, 2 - 80 MHz, 3 - 160 MHz" },
1773*03f9172cSAndroid Build Coastguard Worker 	{ "hs20_wnm_notif", hostapd_cli_cmd_hs20_wnm_notif, NULL,
1774*03f9172cSAndroid Build Coastguard Worker 	  "<addr> <url>\n"
1775*03f9172cSAndroid Build Coastguard Worker 	  "  = send WNM-Notification Subscription Remediation Request" },
1776*03f9172cSAndroid Build Coastguard Worker 	{ "hs20_deauth_req", hostapd_cli_cmd_hs20_deauth_req, NULL,
1777*03f9172cSAndroid Build Coastguard Worker 	  "<addr> <code (0/1)> <Re-auth-Delay(sec)> [url]\n"
1778*03f9172cSAndroid Build Coastguard Worker 	  "  = send WNM-Notification imminent deauthentication indication" },
1779*03f9172cSAndroid Build Coastguard Worker 	{ "vendor", hostapd_cli_cmd_vendor, NULL,
1780*03f9172cSAndroid Build Coastguard Worker 	  "<vendor id> <sub command id> [<hex formatted data>]\n"
1781*03f9172cSAndroid Build Coastguard Worker 	  "  = send vendor driver command" },
1782*03f9172cSAndroid Build Coastguard Worker 	{ "enable", hostapd_cli_cmd_enable, NULL,
1783*03f9172cSAndroid Build Coastguard Worker 	  "= enable hostapd on current interface" },
1784*03f9172cSAndroid Build Coastguard Worker 	{ "reload", hostapd_cli_cmd_reload, NULL,
1785*03f9172cSAndroid Build Coastguard Worker 	  "= reload configuration for current interface" },
1786*03f9172cSAndroid Build Coastguard Worker 	{ "reload_bss", hostapd_cli_cmd_reload_bss, NULL,
1787*03f9172cSAndroid Build Coastguard Worker 	  "= reload configuration for current BSS" },
1788*03f9172cSAndroid Build Coastguard Worker 	{ "reload_config", hostapd_cli_cmd_reload_config, NULL,
1789*03f9172cSAndroid Build Coastguard Worker 	  "= reload configuration for current interface" },
1790*03f9172cSAndroid Build Coastguard Worker 	{ "disable", hostapd_cli_cmd_disable, NULL,
1791*03f9172cSAndroid Build Coastguard Worker 	  "= disable hostapd on current interface" },
1792*03f9172cSAndroid Build Coastguard Worker 	{ "enable_mld", hostapd_cli_cmd_enable_mld, NULL,
1793*03f9172cSAndroid Build Coastguard Worker 	  "= enable AP MLD to which the interface is affiliated" },
1794*03f9172cSAndroid Build Coastguard Worker 	{ "disable_mld", hostapd_cli_cmd_disable_mld, NULL,
1795*03f9172cSAndroid Build Coastguard Worker 	  "= disable AP MLD to which the interface is affiliated" },
1796*03f9172cSAndroid Build Coastguard Worker 	{ "update_beacon", hostapd_cli_cmd_update_beacon, NULL,
1797*03f9172cSAndroid Build Coastguard Worker 	  "= update Beacon frame contents\n"},
1798*03f9172cSAndroid Build Coastguard Worker 	{ "stop_ap", hostapd_cli_cmd_stop_ap, NULL,
1799*03f9172cSAndroid Build Coastguard Worker 	  "= stop AP\n"},
1800*03f9172cSAndroid Build Coastguard Worker 	{ "erp_flush", hostapd_cli_cmd_erp_flush, NULL,
1801*03f9172cSAndroid Build Coastguard Worker 	  "= drop all ERP keys"},
1802*03f9172cSAndroid Build Coastguard Worker 	{ "log_level", hostapd_cli_cmd_log_level, NULL,
1803*03f9172cSAndroid Build Coastguard Worker 	  "[level] = show/change log verbosity level" },
1804*03f9172cSAndroid Build Coastguard Worker 	{ "pmksa", hostapd_cli_cmd_pmksa, NULL,
1805*03f9172cSAndroid Build Coastguard Worker 	  " = show PMKSA cache entries" },
1806*03f9172cSAndroid Build Coastguard Worker 	{ "pmksa_flush", hostapd_cli_cmd_pmksa_flush, NULL,
1807*03f9172cSAndroid Build Coastguard Worker 	  " = flush PMKSA cache" },
1808*03f9172cSAndroid Build Coastguard Worker 	{ "set_neighbor", hostapd_cli_cmd_set_neighbor, NULL,
1809*03f9172cSAndroid Build Coastguard Worker 	  "<addr> <ssid=> <nr=> [lci=] [civic=] [stat]\n"
1810*03f9172cSAndroid Build Coastguard Worker 	  "  = add AP to neighbor database" },
1811*03f9172cSAndroid Build Coastguard Worker 	{ "show_neighbor", hostapd_cli_cmd_show_neighbor, NULL,
1812*03f9172cSAndroid Build Coastguard Worker 	  "  = show neighbor database entries" },
1813*03f9172cSAndroid Build Coastguard Worker 	{ "remove_neighbor", hostapd_cli_cmd_remove_neighbor, NULL,
1814*03f9172cSAndroid Build Coastguard Worker 	  "<addr> [ssid=<hex>] = remove AP from neighbor database" },
1815*03f9172cSAndroid Build Coastguard Worker 	{ "req_lci", hostapd_cli_cmd_req_lci, hostapd_complete_stations,
1816*03f9172cSAndroid Build Coastguard Worker 	  "<addr> = send LCI request to a station"},
1817*03f9172cSAndroid Build Coastguard Worker 	{ "req_range", hostapd_cli_cmd_req_range, NULL,
1818*03f9172cSAndroid Build Coastguard Worker 	  " = send FTM range request"},
1819*03f9172cSAndroid Build Coastguard Worker 	{ "driver_flags", hostapd_cli_cmd_driver_flags, NULL,
1820*03f9172cSAndroid Build Coastguard Worker 	  " = show supported driver flags"},
1821*03f9172cSAndroid Build Coastguard Worker 	{ "driver_flags2", hostapd_cli_cmd_driver_flags2, NULL,
1822*03f9172cSAndroid Build Coastguard Worker 	  " = show supported driver flags2"},
1823*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_DPP
1824*03f9172cSAndroid Build Coastguard Worker 	{ "dpp_qr_code", hostapd_cli_cmd_dpp_qr_code, NULL,
1825*03f9172cSAndroid Build Coastguard Worker 	  "report a scanned DPP URI from a QR Code" },
1826*03f9172cSAndroid Build Coastguard Worker 	{ "dpp_bootstrap_gen", hostapd_cli_cmd_dpp_bootstrap_gen, NULL,
1827*03f9172cSAndroid Build Coastguard Worker 	  "type=<qrcode> [chan=..] [mac=..] [info=..] [curve=..] [key=..] = generate DPP bootstrap information" },
1828*03f9172cSAndroid Build Coastguard Worker 	{ "dpp_bootstrap_remove", hostapd_cli_cmd_dpp_bootstrap_remove, NULL,
1829*03f9172cSAndroid Build Coastguard Worker 	  "*|<id> = remove DPP bootstrap information" },
1830*03f9172cSAndroid Build Coastguard Worker 	{ "dpp_bootstrap_get_uri", hostapd_cli_cmd_dpp_bootstrap_get_uri, NULL,
1831*03f9172cSAndroid Build Coastguard Worker 	  "<id> = get DPP bootstrap URI" },
1832*03f9172cSAndroid Build Coastguard Worker 	{ "dpp_bootstrap_info", hostapd_cli_cmd_dpp_bootstrap_info, NULL,
1833*03f9172cSAndroid Build Coastguard Worker 	  "<id> = show DPP bootstrap information" },
1834*03f9172cSAndroid Build Coastguard Worker 	{ "dpp_bootstrap_set", hostapd_cli_cmd_dpp_bootstrap_set, NULL,
1835*03f9172cSAndroid Build Coastguard Worker 	  "<id> [conf=..] [ssid=<SSID>] [ssid_charset=#] [psk=<PSK>] [pass=<passphrase>] [configurator=<id>] [conn_status=#] [akm_use_selector=<0|1>] [group_id=..] [expiry=#] [csrattrs=..] = set DPP configurator parameters" },
1836*03f9172cSAndroid Build Coastguard Worker 	{ "dpp_auth_init", hostapd_cli_cmd_dpp_auth_init, NULL,
1837*03f9172cSAndroid Build Coastguard Worker 	  "peer=<id> [own=<id>] = initiate DPP bootstrapping" },
1838*03f9172cSAndroid Build Coastguard Worker 	{ "dpp_listen", hostapd_cli_cmd_dpp_listen, NULL,
1839*03f9172cSAndroid Build Coastguard Worker 	  "<freq in MHz> = start DPP listen" },
1840*03f9172cSAndroid Build Coastguard Worker 	{ "dpp_stop_listen", hostapd_cli_cmd_dpp_stop_listen, NULL,
1841*03f9172cSAndroid Build Coastguard Worker 	  "= stop DPP listen" },
1842*03f9172cSAndroid Build Coastguard Worker 	{ "dpp_configurator_add", hostapd_cli_cmd_dpp_configurator_add, NULL,
1843*03f9172cSAndroid Build Coastguard Worker 	  "[curve=..] [key=..] = add DPP configurator" },
1844*03f9172cSAndroid Build Coastguard Worker 	{ "dpp_configurator_remove", hostapd_cli_cmd_dpp_configurator_remove,
1845*03f9172cSAndroid Build Coastguard Worker 	  NULL,
1846*03f9172cSAndroid Build Coastguard Worker 	  "*|<id> = remove DPP configurator" },
1847*03f9172cSAndroid Build Coastguard Worker 	{ "dpp_configurator_get_key", hostapd_cli_cmd_dpp_configurator_get_key,
1848*03f9172cSAndroid Build Coastguard Worker 	  NULL,
1849*03f9172cSAndroid Build Coastguard Worker 	  "<id> = Get DPP configurator's private key" },
1850*03f9172cSAndroid Build Coastguard Worker 	{ "dpp_configurator_sign", hostapd_cli_cmd_dpp_configurator_sign, NULL,
1851*03f9172cSAndroid Build Coastguard Worker 	  "conf=<role> configurator=<id> = generate self DPP configuration" },
1852*03f9172cSAndroid Build Coastguard Worker 	{ "dpp_pkex_add", hostapd_cli_cmd_dpp_pkex_add, NULL,
1853*03f9172cSAndroid Build Coastguard Worker 	  "add PKEX code" },
1854*03f9172cSAndroid Build Coastguard Worker 	{ "dpp_pkex_remove", hostapd_cli_cmd_dpp_pkex_remove, NULL,
1855*03f9172cSAndroid Build Coastguard Worker 	  "*|<id> = remove DPP pkex information" },
1856*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_DPP2
1857*03f9172cSAndroid Build Coastguard Worker 	{ "dpp_controller_start", hostapd_cli_cmd_dpp_controller_start, NULL,
1858*03f9172cSAndroid Build Coastguard Worker 	  "[tcp_port=<port>] [role=..] = start DPP controller" },
1859*03f9172cSAndroid Build Coastguard Worker 	{ "dpp_controller_stop", hostapd_cli_cmd_dpp_controller_stop, NULL,
1860*03f9172cSAndroid Build Coastguard Worker 	  "= stop DPP controller" },
1861*03f9172cSAndroid Build Coastguard Worker 	{ "dpp_chirp", hostapd_cli_cmd_dpp_chirp, NULL,
1862*03f9172cSAndroid Build Coastguard Worker 	  "own=<BI ID> iter=<count> = start DPP chirp" },
1863*03f9172cSAndroid Build Coastguard Worker 	{ "dpp_stop_chirp", hostapd_cli_cmd_dpp_stop_chirp, NULL,
1864*03f9172cSAndroid Build Coastguard Worker 	  "= stop DPP chirp" },
1865*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_DPP2 */
1866*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_DPP3
1867*03f9172cSAndroid Build Coastguard Worker 	{ "dpp_push_button", hostapd_cli_cmd_dpp_push_button, NULL,
1868*03f9172cSAndroid Build Coastguard Worker 	  "= press DPP push button" },
1869*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_DPP3 */
1870*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_DPP */
1871*03f9172cSAndroid Build Coastguard Worker 	{ "accept_acl", hostapd_cli_cmd_accept_macacl, NULL,
1872*03f9172cSAndroid Build Coastguard Worker 	  "=Add/Delete/Show/Clear accept MAC ACL" },
1873*03f9172cSAndroid Build Coastguard Worker 	{ "deny_acl", hostapd_cli_cmd_deny_macacl, NULL,
1874*03f9172cSAndroid Build Coastguard Worker 	  "=Add/Delete/Show/Clear deny MAC ACL" },
1875*03f9172cSAndroid Build Coastguard Worker 	{ "poll_sta", hostapd_cli_cmd_poll_sta, hostapd_complete_stations,
1876*03f9172cSAndroid Build Coastguard Worker 	  "<addr> = poll a STA to check connectivity with a QoS null frame" },
1877*03f9172cSAndroid Build Coastguard Worker 	{ "req_beacon", hostapd_cli_cmd_req_beacon, NULL,
1878*03f9172cSAndroid Build Coastguard Worker 	  "<addr> [req_mode=] <measurement request hexdump>  = send a Beacon report request to a station" },
1879*03f9172cSAndroid Build Coastguard Worker 	{ "req_link_measurement", hostapd_cli_cmd_req_link_measurement, NULL,
1880*03f9172cSAndroid Build Coastguard Worker 	  "<addr> = send a link measurement report request to a station"},
1881*03f9172cSAndroid Build Coastguard Worker 	{ "reload_wpa_psk", hostapd_cli_cmd_reload_wpa_psk, NULL,
1882*03f9172cSAndroid Build Coastguard Worker 	  "= reload wpa_psk_file only" },
1883*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_IEEE80211R_AP
1884*03f9172cSAndroid Build Coastguard Worker 	{ "reload_rxkhs", hostapd_cli_cmd_reload_rxkhs, NULL,
1885*03f9172cSAndroid Build Coastguard Worker 	  "= reload R0KHs and R1KHs" },
1886*03f9172cSAndroid Build Coastguard Worker 	{ "get_rxkhs", hostapd_cli_cmd_get_rxkhs, NULL,
1887*03f9172cSAndroid Build Coastguard Worker 	  "= get R0KHs and R1KHs" },
1888*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_IEEE80211R_AP */
1889*03f9172cSAndroid Build Coastguard Worker #ifdef ANDROID
1890*03f9172cSAndroid Build Coastguard Worker 	{ "driver", hostapd_cli_cmd_driver, NULL,
1891*03f9172cSAndroid Build Coastguard Worker 	  "<driver sub command> [<hex formatted data>] = send driver command data" },
1892*03f9172cSAndroid Build Coastguard Worker #endif /* ANDROID */
1893*03f9172cSAndroid Build Coastguard Worker 	{ NULL, NULL, NULL, NULL }
1894*03f9172cSAndroid Build Coastguard Worker };
1895*03f9172cSAndroid Build Coastguard Worker 
1896*03f9172cSAndroid Build Coastguard Worker 
1897*03f9172cSAndroid Build Coastguard Worker /*
1898*03f9172cSAndroid Build Coastguard Worker  * Prints command usage, lines are padded with the specified string.
1899*03f9172cSAndroid Build Coastguard Worker  */
print_cmd_help(FILE * stream,const struct hostapd_cli_cmd * cmd,const char * pad)1900*03f9172cSAndroid Build Coastguard Worker static void print_cmd_help(FILE *stream, const struct hostapd_cli_cmd *cmd,
1901*03f9172cSAndroid Build Coastguard Worker 			   const char *pad)
1902*03f9172cSAndroid Build Coastguard Worker {
1903*03f9172cSAndroid Build Coastguard Worker 	char c;
1904*03f9172cSAndroid Build Coastguard Worker 	size_t n;
1905*03f9172cSAndroid Build Coastguard Worker 
1906*03f9172cSAndroid Build Coastguard Worker 	if (cmd->usage == NULL)
1907*03f9172cSAndroid Build Coastguard Worker 		return;
1908*03f9172cSAndroid Build Coastguard Worker 	fprintf(stream, "%s%s ", pad, cmd->cmd);
1909*03f9172cSAndroid Build Coastguard Worker 	for (n = 0; (c = cmd->usage[n]); n++) {
1910*03f9172cSAndroid Build Coastguard Worker 		fprintf(stream, "%c", c);
1911*03f9172cSAndroid Build Coastguard Worker 		if (c == '\n')
1912*03f9172cSAndroid Build Coastguard Worker 			fprintf(stream, "%s", pad);
1913*03f9172cSAndroid Build Coastguard Worker 	}
1914*03f9172cSAndroid Build Coastguard Worker 	fprintf(stream, "\n");
1915*03f9172cSAndroid Build Coastguard Worker }
1916*03f9172cSAndroid Build Coastguard Worker 
1917*03f9172cSAndroid Build Coastguard Worker 
print_help(FILE * stream,const char * cmd)1918*03f9172cSAndroid Build Coastguard Worker static void print_help(FILE *stream, const char *cmd)
1919*03f9172cSAndroid Build Coastguard Worker {
1920*03f9172cSAndroid Build Coastguard Worker 	int n;
1921*03f9172cSAndroid Build Coastguard Worker 
1922*03f9172cSAndroid Build Coastguard Worker 	fprintf(stream, "commands:\n");
1923*03f9172cSAndroid Build Coastguard Worker 	for (n = 0; hostapd_cli_commands[n].cmd; n++) {
1924*03f9172cSAndroid Build Coastguard Worker 		if (cmd == NULL || str_starts(hostapd_cli_commands[n].cmd, cmd))
1925*03f9172cSAndroid Build Coastguard Worker 			print_cmd_help(stream, &hostapd_cli_commands[n], "  ");
1926*03f9172cSAndroid Build Coastguard Worker 	}
1927*03f9172cSAndroid Build Coastguard Worker }
1928*03f9172cSAndroid Build Coastguard Worker 
1929*03f9172cSAndroid Build Coastguard Worker 
wpa_request(struct wpa_ctrl * ctrl,int argc,char * argv[])1930*03f9172cSAndroid Build Coastguard Worker static void wpa_request(struct wpa_ctrl *ctrl, int argc, char *argv[])
1931*03f9172cSAndroid Build Coastguard Worker {
1932*03f9172cSAndroid Build Coastguard Worker 	const struct hostapd_cli_cmd *cmd, *match = NULL;
1933*03f9172cSAndroid Build Coastguard Worker 	int count;
1934*03f9172cSAndroid Build Coastguard Worker 
1935*03f9172cSAndroid Build Coastguard Worker 	count = 0;
1936*03f9172cSAndroid Build Coastguard Worker 	cmd = hostapd_cli_commands;
1937*03f9172cSAndroid Build Coastguard Worker 	while (cmd->cmd) {
1938*03f9172cSAndroid Build Coastguard Worker 		if (strncasecmp(cmd->cmd, argv[0], strlen(argv[0])) == 0) {
1939*03f9172cSAndroid Build Coastguard Worker 			match = cmd;
1940*03f9172cSAndroid Build Coastguard Worker 			if (os_strcasecmp(cmd->cmd, argv[0]) == 0) {
1941*03f9172cSAndroid Build Coastguard Worker 				/* we have an exact match */
1942*03f9172cSAndroid Build Coastguard Worker 				count = 1;
1943*03f9172cSAndroid Build Coastguard Worker 				break;
1944*03f9172cSAndroid Build Coastguard Worker 			}
1945*03f9172cSAndroid Build Coastguard Worker 			count++;
1946*03f9172cSAndroid Build Coastguard Worker 		}
1947*03f9172cSAndroid Build Coastguard Worker 		cmd++;
1948*03f9172cSAndroid Build Coastguard Worker 	}
1949*03f9172cSAndroid Build Coastguard Worker 
1950*03f9172cSAndroid Build Coastguard Worker 	if (count > 1) {
1951*03f9172cSAndroid Build Coastguard Worker 		printf("Ambiguous command '%s'; possible commands:", argv[0]);
1952*03f9172cSAndroid Build Coastguard Worker 		cmd = hostapd_cli_commands;
1953*03f9172cSAndroid Build Coastguard Worker 		while (cmd->cmd) {
1954*03f9172cSAndroid Build Coastguard Worker 			if (strncasecmp(cmd->cmd, argv[0], strlen(argv[0])) ==
1955*03f9172cSAndroid Build Coastguard Worker 			    0) {
1956*03f9172cSAndroid Build Coastguard Worker 				printf(" %s", cmd->cmd);
1957*03f9172cSAndroid Build Coastguard Worker 			}
1958*03f9172cSAndroid Build Coastguard Worker 			cmd++;
1959*03f9172cSAndroid Build Coastguard Worker 		}
1960*03f9172cSAndroid Build Coastguard Worker 		printf("\n");
1961*03f9172cSAndroid Build Coastguard Worker 	} else if (count == 0) {
1962*03f9172cSAndroid Build Coastguard Worker 		printf("Unknown command '%s'\n", argv[0]);
1963*03f9172cSAndroid Build Coastguard Worker 	} else {
1964*03f9172cSAndroid Build Coastguard Worker 		match->handler(ctrl, argc - 1, &argv[1]);
1965*03f9172cSAndroid Build Coastguard Worker 	}
1966*03f9172cSAndroid Build Coastguard Worker }
1967*03f9172cSAndroid Build Coastguard Worker 
1968*03f9172cSAndroid Build Coastguard Worker 
cli_event(const char * str)1969*03f9172cSAndroid Build Coastguard Worker static void cli_event(const char *str)
1970*03f9172cSAndroid Build Coastguard Worker {
1971*03f9172cSAndroid Build Coastguard Worker 	const char *start, *s;
1972*03f9172cSAndroid Build Coastguard Worker 
1973*03f9172cSAndroid Build Coastguard Worker 	start = os_strchr(str, '>');
1974*03f9172cSAndroid Build Coastguard Worker 	if (start == NULL)
1975*03f9172cSAndroid Build Coastguard Worker 		return;
1976*03f9172cSAndroid Build Coastguard Worker 
1977*03f9172cSAndroid Build Coastguard Worker 	start++;
1978*03f9172cSAndroid Build Coastguard Worker 
1979*03f9172cSAndroid Build Coastguard Worker 	if (str_starts(start, AP_STA_CONNECTED)) {
1980*03f9172cSAndroid Build Coastguard Worker 		s = os_strchr(start, ' ');
1981*03f9172cSAndroid Build Coastguard Worker 		if (s == NULL)
1982*03f9172cSAndroid Build Coastguard Worker 			return;
1983*03f9172cSAndroid Build Coastguard Worker 		cli_txt_list_add(&stations, s + 1);
1984*03f9172cSAndroid Build Coastguard Worker 		return;
1985*03f9172cSAndroid Build Coastguard Worker 	}
1986*03f9172cSAndroid Build Coastguard Worker 
1987*03f9172cSAndroid Build Coastguard Worker 	if (str_starts(start, AP_STA_DISCONNECTED)) {
1988*03f9172cSAndroid Build Coastguard Worker 		s = os_strchr(start, ' ');
1989*03f9172cSAndroid Build Coastguard Worker 		if (s == NULL)
1990*03f9172cSAndroid Build Coastguard Worker 			return;
1991*03f9172cSAndroid Build Coastguard Worker 		cli_txt_list_del_addr(&stations, s + 1);
1992*03f9172cSAndroid Build Coastguard Worker 		return;
1993*03f9172cSAndroid Build Coastguard Worker 	}
1994*03f9172cSAndroid Build Coastguard Worker }
1995*03f9172cSAndroid Build Coastguard Worker 
1996*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_recv_pending(struct wpa_ctrl * ctrl,int in_read,int action_monitor)1997*03f9172cSAndroid Build Coastguard Worker static void hostapd_cli_recv_pending(struct wpa_ctrl *ctrl, int in_read,
1998*03f9172cSAndroid Build Coastguard Worker 				     int action_monitor)
1999*03f9172cSAndroid Build Coastguard Worker {
2000*03f9172cSAndroid Build Coastguard Worker 	int first = 1;
2001*03f9172cSAndroid Build Coastguard Worker 	if (ctrl_conn == NULL)
2002*03f9172cSAndroid Build Coastguard Worker 		return;
2003*03f9172cSAndroid Build Coastguard Worker 	while (wpa_ctrl_pending(ctrl)) {
2004*03f9172cSAndroid Build Coastguard Worker 		char buf[4096];
2005*03f9172cSAndroid Build Coastguard Worker 		size_t len = sizeof(buf) - 1;
2006*03f9172cSAndroid Build Coastguard Worker 		if (wpa_ctrl_recv(ctrl, buf, &len) == 0) {
2007*03f9172cSAndroid Build Coastguard Worker 			buf[len] = '\0';
2008*03f9172cSAndroid Build Coastguard Worker 			if (action_monitor)
2009*03f9172cSAndroid Build Coastguard Worker 				hostapd_cli_action_process(buf, len);
2010*03f9172cSAndroid Build Coastguard Worker 			else {
2011*03f9172cSAndroid Build Coastguard Worker 				cli_event(buf);
2012*03f9172cSAndroid Build Coastguard Worker 				if (in_read && first)
2013*03f9172cSAndroid Build Coastguard Worker 					printf("\n");
2014*03f9172cSAndroid Build Coastguard Worker 				first = 0;
2015*03f9172cSAndroid Build Coastguard Worker 				printf("%s\n", buf);
2016*03f9172cSAndroid Build Coastguard Worker 			}
2017*03f9172cSAndroid Build Coastguard Worker 		} else {
2018*03f9172cSAndroid Build Coastguard Worker 			printf("Could not read pending message.\n");
2019*03f9172cSAndroid Build Coastguard Worker 			break;
2020*03f9172cSAndroid Build Coastguard Worker 		}
2021*03f9172cSAndroid Build Coastguard Worker 	}
2022*03f9172cSAndroid Build Coastguard Worker }
2023*03f9172cSAndroid Build Coastguard Worker 
2024*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_receive(int sock,void * eloop_ctx,void * sock_ctx)2025*03f9172cSAndroid Build Coastguard Worker static void hostapd_cli_receive(int sock, void *eloop_ctx, void *sock_ctx)
2026*03f9172cSAndroid Build Coastguard Worker {
2027*03f9172cSAndroid Build Coastguard Worker 	hostapd_cli_recv_pending(ctrl_conn, 0, 0);
2028*03f9172cSAndroid Build Coastguard Worker }
2029*03f9172cSAndroid Build Coastguard Worker 
2030*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_ping(void * eloop_ctx,void * timeout_ctx)2031*03f9172cSAndroid Build Coastguard Worker static void hostapd_cli_ping(void *eloop_ctx, void *timeout_ctx)
2032*03f9172cSAndroid Build Coastguard Worker {
2033*03f9172cSAndroid Build Coastguard Worker 	if (ctrl_conn && _wpa_ctrl_command(ctrl_conn, "PING", 0)) {
2034*03f9172cSAndroid Build Coastguard Worker 		printf("Connection to hostapd lost - trying to reconnect\n");
2035*03f9172cSAndroid Build Coastguard Worker 		hostapd_cli_close_connection();
2036*03f9172cSAndroid Build Coastguard Worker 	}
2037*03f9172cSAndroid Build Coastguard Worker 	if (!ctrl_conn && hostapd_cli_reconnect(ctrl_ifname) == 0)
2038*03f9172cSAndroid Build Coastguard Worker 		printf("Connection to hostapd re-established\n");
2039*03f9172cSAndroid Build Coastguard Worker 	if (ctrl_conn)
2040*03f9172cSAndroid Build Coastguard Worker 		hostapd_cli_recv_pending(ctrl_conn, 1, 0);
2041*03f9172cSAndroid Build Coastguard Worker 	eloop_register_timeout(ping_interval, 0, hostapd_cli_ping, NULL, NULL);
2042*03f9172cSAndroid Build Coastguard Worker }
2043*03f9172cSAndroid Build Coastguard Worker 
2044*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_eloop_terminate(int sig,void * signal_ctx)2045*03f9172cSAndroid Build Coastguard Worker static void hostapd_cli_eloop_terminate(int sig, void *signal_ctx)
2046*03f9172cSAndroid Build Coastguard Worker {
2047*03f9172cSAndroid Build Coastguard Worker 	eloop_terminate();
2048*03f9172cSAndroid Build Coastguard Worker }
2049*03f9172cSAndroid Build Coastguard Worker 
2050*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_edit_cmd_cb(void * ctx,char * cmd)2051*03f9172cSAndroid Build Coastguard Worker static void hostapd_cli_edit_cmd_cb(void *ctx, char *cmd)
2052*03f9172cSAndroid Build Coastguard Worker {
2053*03f9172cSAndroid Build Coastguard Worker 	char *argv[max_args];
2054*03f9172cSAndroid Build Coastguard Worker 	int argc;
2055*03f9172cSAndroid Build Coastguard Worker 	argc = tokenize_cmd(cmd, argv);
2056*03f9172cSAndroid Build Coastguard Worker 	if (argc)
2057*03f9172cSAndroid Build Coastguard Worker 		wpa_request(ctrl_conn, argc, argv);
2058*03f9172cSAndroid Build Coastguard Worker }
2059*03f9172cSAndroid Build Coastguard Worker 
2060*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_edit_eof_cb(void * ctx)2061*03f9172cSAndroid Build Coastguard Worker static void hostapd_cli_edit_eof_cb(void *ctx)
2062*03f9172cSAndroid Build Coastguard Worker {
2063*03f9172cSAndroid Build Coastguard Worker 	eloop_terminate();
2064*03f9172cSAndroid Build Coastguard Worker }
2065*03f9172cSAndroid Build Coastguard Worker 
2066*03f9172cSAndroid Build Coastguard Worker 
list_cmd_list(void)2067*03f9172cSAndroid Build Coastguard Worker static char ** list_cmd_list(void)
2068*03f9172cSAndroid Build Coastguard Worker {
2069*03f9172cSAndroid Build Coastguard Worker 	char **res;
2070*03f9172cSAndroid Build Coastguard Worker 	int i, count;
2071*03f9172cSAndroid Build Coastguard Worker 
2072*03f9172cSAndroid Build Coastguard Worker 	count = ARRAY_SIZE(hostapd_cli_commands);
2073*03f9172cSAndroid Build Coastguard Worker 	res = os_calloc(count + 1, sizeof(char *));
2074*03f9172cSAndroid Build Coastguard Worker 	if (res == NULL)
2075*03f9172cSAndroid Build Coastguard Worker 		return NULL;
2076*03f9172cSAndroid Build Coastguard Worker 
2077*03f9172cSAndroid Build Coastguard Worker 	for (i = 0; hostapd_cli_commands[i].cmd; i++) {
2078*03f9172cSAndroid Build Coastguard Worker 		res[i] = os_strdup(hostapd_cli_commands[i].cmd);
2079*03f9172cSAndroid Build Coastguard Worker 		if (res[i] == NULL)
2080*03f9172cSAndroid Build Coastguard Worker 			break;
2081*03f9172cSAndroid Build Coastguard Worker 	}
2082*03f9172cSAndroid Build Coastguard Worker 
2083*03f9172cSAndroid Build Coastguard Worker 	return res;
2084*03f9172cSAndroid Build Coastguard Worker }
2085*03f9172cSAndroid Build Coastguard Worker 
2086*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cmd_completion(const char * cmd,const char * str,int pos)2087*03f9172cSAndroid Build Coastguard Worker static char ** hostapd_cli_cmd_completion(const char *cmd, const char *str,
2088*03f9172cSAndroid Build Coastguard Worker 				      int pos)
2089*03f9172cSAndroid Build Coastguard Worker {
2090*03f9172cSAndroid Build Coastguard Worker 	int i;
2091*03f9172cSAndroid Build Coastguard Worker 
2092*03f9172cSAndroid Build Coastguard Worker 	for (i = 0; hostapd_cli_commands[i].cmd; i++) {
2093*03f9172cSAndroid Build Coastguard Worker 		if (os_strcasecmp(hostapd_cli_commands[i].cmd, cmd) != 0)
2094*03f9172cSAndroid Build Coastguard Worker 			continue;
2095*03f9172cSAndroid Build Coastguard Worker 		if (hostapd_cli_commands[i].completion)
2096*03f9172cSAndroid Build Coastguard Worker 			return hostapd_cli_commands[i].completion(str, pos);
2097*03f9172cSAndroid Build Coastguard Worker 		if (!hostapd_cli_commands[i].usage)
2098*03f9172cSAndroid Build Coastguard Worker 			return NULL;
2099*03f9172cSAndroid Build Coastguard Worker 		edit_clear_line();
2100*03f9172cSAndroid Build Coastguard Worker 		printf("\r%s\n", hostapd_cli_commands[i].usage);
2101*03f9172cSAndroid Build Coastguard Worker 		edit_redraw();
2102*03f9172cSAndroid Build Coastguard Worker 		break;
2103*03f9172cSAndroid Build Coastguard Worker 	}
2104*03f9172cSAndroid Build Coastguard Worker 
2105*03f9172cSAndroid Build Coastguard Worker 	return NULL;
2106*03f9172cSAndroid Build Coastguard Worker }
2107*03f9172cSAndroid Build Coastguard Worker 
2108*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_edit_completion_cb(void * ctx,const char * str,int pos)2109*03f9172cSAndroid Build Coastguard Worker static char ** hostapd_cli_edit_completion_cb(void *ctx, const char *str,
2110*03f9172cSAndroid Build Coastguard Worker 					      int pos)
2111*03f9172cSAndroid Build Coastguard Worker {
2112*03f9172cSAndroid Build Coastguard Worker 	char **res;
2113*03f9172cSAndroid Build Coastguard Worker 	const char *end;
2114*03f9172cSAndroid Build Coastguard Worker 	char *cmd;
2115*03f9172cSAndroid Build Coastguard Worker 
2116*03f9172cSAndroid Build Coastguard Worker 	end = os_strchr(str, ' ');
2117*03f9172cSAndroid Build Coastguard Worker 	if (end == NULL || str + pos < end)
2118*03f9172cSAndroid Build Coastguard Worker 		return list_cmd_list();
2119*03f9172cSAndroid Build Coastguard Worker 
2120*03f9172cSAndroid Build Coastguard Worker 	cmd = os_malloc(pos + 1);
2121*03f9172cSAndroid Build Coastguard Worker 	if (cmd == NULL)
2122*03f9172cSAndroid Build Coastguard Worker 		return NULL;
2123*03f9172cSAndroid Build Coastguard Worker 	os_memcpy(cmd, str, pos);
2124*03f9172cSAndroid Build Coastguard Worker 	cmd[end - str] = '\0';
2125*03f9172cSAndroid Build Coastguard Worker 	res = hostapd_cli_cmd_completion(cmd, str, pos);
2126*03f9172cSAndroid Build Coastguard Worker 	os_free(cmd);
2127*03f9172cSAndroid Build Coastguard Worker 	return res;
2128*03f9172cSAndroid Build Coastguard Worker }
2129*03f9172cSAndroid Build Coastguard Worker 
2130*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_interactive(void)2131*03f9172cSAndroid Build Coastguard Worker static void hostapd_cli_interactive(void)
2132*03f9172cSAndroid Build Coastguard Worker {
2133*03f9172cSAndroid Build Coastguard Worker 	char *hfile = NULL;
2134*03f9172cSAndroid Build Coastguard Worker 	char *home;
2135*03f9172cSAndroid Build Coastguard Worker 
2136*03f9172cSAndroid Build Coastguard Worker 	printf("\nInteractive mode\n\n");
2137*03f9172cSAndroid Build Coastguard Worker 
2138*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_HOSTAPD_CLI_HISTORY_DIR
2139*03f9172cSAndroid Build Coastguard Worker 	home = CONFIG_HOSTAPD_CLI_HISTORY_DIR;
2140*03f9172cSAndroid Build Coastguard Worker #else /* CONFIG_HOSTAPD_CLI_HISTORY_DIR */
2141*03f9172cSAndroid Build Coastguard Worker 	home = getenv("HOME");
2142*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_HOSTAPD_CLI_HISTORY_DIR */
2143*03f9172cSAndroid Build Coastguard Worker 	if (home) {
2144*03f9172cSAndroid Build Coastguard Worker 		const char *fname = ".hostapd_cli_history";
2145*03f9172cSAndroid Build Coastguard Worker 		int hfile_len = os_strlen(home) + 1 + os_strlen(fname) + 1;
2146*03f9172cSAndroid Build Coastguard Worker 		hfile = os_malloc(hfile_len);
2147*03f9172cSAndroid Build Coastguard Worker 		if (hfile)
2148*03f9172cSAndroid Build Coastguard Worker 			os_snprintf(hfile, hfile_len, "%s/%s", home, fname);
2149*03f9172cSAndroid Build Coastguard Worker 	}
2150*03f9172cSAndroid Build Coastguard Worker 
2151*03f9172cSAndroid Build Coastguard Worker 	edit_init(hostapd_cli_edit_cmd_cb, hostapd_cli_edit_eof_cb,
2152*03f9172cSAndroid Build Coastguard Worker 		  hostapd_cli_edit_completion_cb, NULL, hfile, NULL);
2153*03f9172cSAndroid Build Coastguard Worker 	eloop_register_timeout(ping_interval, 0, hostapd_cli_ping, NULL, NULL);
2154*03f9172cSAndroid Build Coastguard Worker 
2155*03f9172cSAndroid Build Coastguard Worker 	eloop_run();
2156*03f9172cSAndroid Build Coastguard Worker 
2157*03f9172cSAndroid Build Coastguard Worker 	cli_txt_list_flush(&stations);
2158*03f9172cSAndroid Build Coastguard Worker 	edit_deinit(hfile, NULL);
2159*03f9172cSAndroid Build Coastguard Worker 	os_free(hfile);
2160*03f9172cSAndroid Build Coastguard Worker 	eloop_cancel_timeout(hostapd_cli_ping, NULL, NULL);
2161*03f9172cSAndroid Build Coastguard Worker }
2162*03f9172cSAndroid Build Coastguard Worker 
2163*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_cleanup(void)2164*03f9172cSAndroid Build Coastguard Worker static void hostapd_cli_cleanup(void)
2165*03f9172cSAndroid Build Coastguard Worker {
2166*03f9172cSAndroid Build Coastguard Worker 	hostapd_cli_close_connection();
2167*03f9172cSAndroid Build Coastguard Worker 	if (pid_file)
2168*03f9172cSAndroid Build Coastguard Worker 		os_daemonize_terminate(pid_file);
2169*03f9172cSAndroid Build Coastguard Worker 
2170*03f9172cSAndroid Build Coastguard Worker 	os_program_deinit();
2171*03f9172cSAndroid Build Coastguard Worker }
2172*03f9172cSAndroid Build Coastguard Worker 
2173*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_action_ping(void * eloop_ctx,void * timeout_ctx)2174*03f9172cSAndroid Build Coastguard Worker static void hostapd_cli_action_ping(void *eloop_ctx, void *timeout_ctx)
2175*03f9172cSAndroid Build Coastguard Worker {
2176*03f9172cSAndroid Build Coastguard Worker 	struct wpa_ctrl *ctrl = eloop_ctx;
2177*03f9172cSAndroid Build Coastguard Worker 	char buf[256];
2178*03f9172cSAndroid Build Coastguard Worker 	size_t len;
2179*03f9172cSAndroid Build Coastguard Worker 
2180*03f9172cSAndroid Build Coastguard Worker 	/* verify that connection is still working */
2181*03f9172cSAndroid Build Coastguard Worker 	len = sizeof(buf) - 1;
2182*03f9172cSAndroid Build Coastguard Worker 	if (wpa_ctrl_request(ctrl, "PING", 4, buf, &len,
2183*03f9172cSAndroid Build Coastguard Worker 			     hostapd_cli_action_cb) < 0 ||
2184*03f9172cSAndroid Build Coastguard Worker 	    len < 4 || os_memcmp(buf, "PONG", 4) != 0) {
2185*03f9172cSAndroid Build Coastguard Worker 		printf("hostapd did not reply to PING command - exiting\n");
2186*03f9172cSAndroid Build Coastguard Worker 		eloop_terminate();
2187*03f9172cSAndroid Build Coastguard Worker 		return;
2188*03f9172cSAndroid Build Coastguard Worker 	}
2189*03f9172cSAndroid Build Coastguard Worker 	eloop_register_timeout(ping_interval, 0, hostapd_cli_action_ping,
2190*03f9172cSAndroid Build Coastguard Worker 			       ctrl, NULL);
2191*03f9172cSAndroid Build Coastguard Worker }
2192*03f9172cSAndroid Build Coastguard Worker 
2193*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_action_receive(int sock,void * eloop_ctx,void * sock_ctx)2194*03f9172cSAndroid Build Coastguard Worker static void hostapd_cli_action_receive(int sock, void *eloop_ctx,
2195*03f9172cSAndroid Build Coastguard Worker 				       void *sock_ctx)
2196*03f9172cSAndroid Build Coastguard Worker {
2197*03f9172cSAndroid Build Coastguard Worker 	struct wpa_ctrl *ctrl = eloop_ctx;
2198*03f9172cSAndroid Build Coastguard Worker 
2199*03f9172cSAndroid Build Coastguard Worker 	hostapd_cli_recv_pending(ctrl, 0, 1);
2200*03f9172cSAndroid Build Coastguard Worker }
2201*03f9172cSAndroid Build Coastguard Worker 
2202*03f9172cSAndroid Build Coastguard Worker 
hostapd_cli_action(struct wpa_ctrl * ctrl)2203*03f9172cSAndroid Build Coastguard Worker static void hostapd_cli_action(struct wpa_ctrl *ctrl)
2204*03f9172cSAndroid Build Coastguard Worker {
2205*03f9172cSAndroid Build Coastguard Worker 	int fd;
2206*03f9172cSAndroid Build Coastguard Worker 
2207*03f9172cSAndroid Build Coastguard Worker 	fd = wpa_ctrl_get_fd(ctrl);
2208*03f9172cSAndroid Build Coastguard Worker 	eloop_register_timeout(ping_interval, 0, hostapd_cli_action_ping,
2209*03f9172cSAndroid Build Coastguard Worker 			       ctrl, NULL);
2210*03f9172cSAndroid Build Coastguard Worker 	eloop_register_read_sock(fd, hostapd_cli_action_receive, ctrl, NULL);
2211*03f9172cSAndroid Build Coastguard Worker 	eloop_run();
2212*03f9172cSAndroid Build Coastguard Worker 	eloop_cancel_timeout(hostapd_cli_action_ping, ctrl, NULL);
2213*03f9172cSAndroid Build Coastguard Worker 	eloop_unregister_read_sock(fd);
2214*03f9172cSAndroid Build Coastguard Worker }
2215*03f9172cSAndroid Build Coastguard Worker 
2216*03f9172cSAndroid Build Coastguard Worker 
main(int argc,char * argv[])2217*03f9172cSAndroid Build Coastguard Worker int main(int argc, char *argv[])
2218*03f9172cSAndroid Build Coastguard Worker {
2219*03f9172cSAndroid Build Coastguard Worker 	int warning_displayed = 0;
2220*03f9172cSAndroid Build Coastguard Worker 	int c;
2221*03f9172cSAndroid Build Coastguard Worker 	int daemonize = 0;
2222*03f9172cSAndroid Build Coastguard Worker 	int reconnect = 0;
2223*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_IEEE80211BE
2224*03f9172cSAndroid Build Coastguard Worker 	int link_id = -1;
2225*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_IEEE80211BE */
2226*03f9172cSAndroid Build Coastguard Worker 
2227*03f9172cSAndroid Build Coastguard Worker 	if (os_program_init())
2228*03f9172cSAndroid Build Coastguard Worker 		return -1;
2229*03f9172cSAndroid Build Coastguard Worker 
2230*03f9172cSAndroid Build Coastguard Worker 	for (;;) {
2231*03f9172cSAndroid Build Coastguard Worker 		c = getopt(argc, argv, "a:BhG:i:l:p:P:rs:v");
2232*03f9172cSAndroid Build Coastguard Worker 		if (c < 0)
2233*03f9172cSAndroid Build Coastguard Worker 			break;
2234*03f9172cSAndroid Build Coastguard Worker 		switch (c) {
2235*03f9172cSAndroid Build Coastguard Worker 		case 'a':
2236*03f9172cSAndroid Build Coastguard Worker 			action_file = optarg;
2237*03f9172cSAndroid Build Coastguard Worker 			break;
2238*03f9172cSAndroid Build Coastguard Worker 		case 'B':
2239*03f9172cSAndroid Build Coastguard Worker 			daemonize = 1;
2240*03f9172cSAndroid Build Coastguard Worker 			break;
2241*03f9172cSAndroid Build Coastguard Worker 		case 'G':
2242*03f9172cSAndroid Build Coastguard Worker 			ping_interval = atoi(optarg);
2243*03f9172cSAndroid Build Coastguard Worker 			break;
2244*03f9172cSAndroid Build Coastguard Worker 		case 'h':
2245*03f9172cSAndroid Build Coastguard Worker 			usage();
2246*03f9172cSAndroid Build Coastguard Worker 			return 0;
2247*03f9172cSAndroid Build Coastguard Worker 		case 'v':
2248*03f9172cSAndroid Build Coastguard Worker 			printf("%s\n", hostapd_cli_version);
2249*03f9172cSAndroid Build Coastguard Worker 			return 0;
2250*03f9172cSAndroid Build Coastguard Worker 		case 'i':
2251*03f9172cSAndroid Build Coastguard Worker 			os_free(ctrl_ifname);
2252*03f9172cSAndroid Build Coastguard Worker 			ctrl_ifname = os_strdup(optarg);
2253*03f9172cSAndroid Build Coastguard Worker 			break;
2254*03f9172cSAndroid Build Coastguard Worker 		case 'p':
2255*03f9172cSAndroid Build Coastguard Worker 			ctrl_iface_dir = optarg;
2256*03f9172cSAndroid Build Coastguard Worker 			break;
2257*03f9172cSAndroid Build Coastguard Worker 		case 'P':
2258*03f9172cSAndroid Build Coastguard Worker 			pid_file = optarg;
2259*03f9172cSAndroid Build Coastguard Worker 			break;
2260*03f9172cSAndroid Build Coastguard Worker 		case 'r':
2261*03f9172cSAndroid Build Coastguard Worker 			reconnect = 1;
2262*03f9172cSAndroid Build Coastguard Worker 			break;
2263*03f9172cSAndroid Build Coastguard Worker 		case 's':
2264*03f9172cSAndroid Build Coastguard Worker 			client_socket_dir = optarg;
2265*03f9172cSAndroid Build Coastguard Worker 			break;
2266*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_IEEE80211BE
2267*03f9172cSAndroid Build Coastguard Worker 		case 'l':
2268*03f9172cSAndroid Build Coastguard Worker 			link_id = atoi(optarg);
2269*03f9172cSAndroid Build Coastguard Worker 			break;
2270*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_IEEE80211BE */
2271*03f9172cSAndroid Build Coastguard Worker 		default:
2272*03f9172cSAndroid Build Coastguard Worker 			usage();
2273*03f9172cSAndroid Build Coastguard Worker 			return -1;
2274*03f9172cSAndroid Build Coastguard Worker 		}
2275*03f9172cSAndroid Build Coastguard Worker 	}
2276*03f9172cSAndroid Build Coastguard Worker 
2277*03f9172cSAndroid Build Coastguard Worker 	interactive = (argc == optind) && (action_file == NULL);
2278*03f9172cSAndroid Build Coastguard Worker 
2279*03f9172cSAndroid Build Coastguard Worker 	if (interactive) {
2280*03f9172cSAndroid Build Coastguard Worker 		printf("%s\n\n%s\n\n", hostapd_cli_version, cli_license);
2281*03f9172cSAndroid Build Coastguard Worker 	}
2282*03f9172cSAndroid Build Coastguard Worker 
2283*03f9172cSAndroid Build Coastguard Worker 	if (eloop_init())
2284*03f9172cSAndroid Build Coastguard Worker 		return -1;
2285*03f9172cSAndroid Build Coastguard Worker 
2286*03f9172cSAndroid Build Coastguard Worker 	for (;;) {
2287*03f9172cSAndroid Build Coastguard Worker 		if (ctrl_ifname == NULL) {
2288*03f9172cSAndroid Build Coastguard Worker 			struct dirent *dent;
2289*03f9172cSAndroid Build Coastguard Worker 			DIR *dir = opendir(ctrl_iface_dir);
2290*03f9172cSAndroid Build Coastguard Worker 			if (dir) {
2291*03f9172cSAndroid Build Coastguard Worker 				while ((dent = readdir(dir))) {
2292*03f9172cSAndroid Build Coastguard Worker 					if (os_strcmp(dent->d_name, ".") == 0
2293*03f9172cSAndroid Build Coastguard Worker 					    ||
2294*03f9172cSAndroid Build Coastguard Worker 					    os_strcmp(dent->d_name, "..") == 0)
2295*03f9172cSAndroid Build Coastguard Worker 						continue;
2296*03f9172cSAndroid Build Coastguard Worker 					printf("Selected interface '%s'\n",
2297*03f9172cSAndroid Build Coastguard Worker 					       dent->d_name);
2298*03f9172cSAndroid Build Coastguard Worker 					ctrl_ifname = os_strdup(dent->d_name);
2299*03f9172cSAndroid Build Coastguard Worker 					break;
2300*03f9172cSAndroid Build Coastguard Worker 				}
2301*03f9172cSAndroid Build Coastguard Worker 				closedir(dir);
2302*03f9172cSAndroid Build Coastguard Worker 			}
2303*03f9172cSAndroid Build Coastguard Worker 		}
2304*03f9172cSAndroid Build Coastguard Worker 
2305*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_IEEE80211BE
2306*03f9172cSAndroid Build Coastguard Worker 		if (link_id >= 0 && ctrl_ifname) {
2307*03f9172cSAndroid Build Coastguard Worker 			int ret;
2308*03f9172cSAndroid Build Coastguard Worker 			char buf[300];
2309*03f9172cSAndroid Build Coastguard Worker 
2310*03f9172cSAndroid Build Coastguard Worker 			ret = os_snprintf(buf, sizeof(buf), "%s_%s%d",
2311*03f9172cSAndroid Build Coastguard Worker 					  ctrl_ifname, WPA_CTRL_IFACE_LINK_NAME,
2312*03f9172cSAndroid Build Coastguard Worker 					  link_id);
2313*03f9172cSAndroid Build Coastguard Worker 			if (os_snprintf_error(sizeof(buf), ret))
2314*03f9172cSAndroid Build Coastguard Worker 				return -1;
2315*03f9172cSAndroid Build Coastguard Worker 
2316*03f9172cSAndroid Build Coastguard Worker 			os_free(ctrl_ifname);
2317*03f9172cSAndroid Build Coastguard Worker 			ctrl_ifname = os_strdup(buf);
2318*03f9172cSAndroid Build Coastguard Worker 			link_id = -1;
2319*03f9172cSAndroid Build Coastguard Worker 		}
2320*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_IEEE80211BE */
2321*03f9172cSAndroid Build Coastguard Worker 
2322*03f9172cSAndroid Build Coastguard Worker 		hostapd_cli_reconnect(ctrl_ifname);
2323*03f9172cSAndroid Build Coastguard Worker 		if (ctrl_conn) {
2324*03f9172cSAndroid Build Coastguard Worker 			if (warning_displayed)
2325*03f9172cSAndroid Build Coastguard Worker 				printf("Connection established.\n");
2326*03f9172cSAndroid Build Coastguard Worker 			break;
2327*03f9172cSAndroid Build Coastguard Worker 		}
2328*03f9172cSAndroid Build Coastguard Worker 		if (!interactive && !reconnect) {
2329*03f9172cSAndroid Build Coastguard Worker 			perror("Failed to connect to hostapd - "
2330*03f9172cSAndroid Build Coastguard Worker 			       "wpa_ctrl_open");
2331*03f9172cSAndroid Build Coastguard Worker 			return -1;
2332*03f9172cSAndroid Build Coastguard Worker 		}
2333*03f9172cSAndroid Build Coastguard Worker 
2334*03f9172cSAndroid Build Coastguard Worker 		if (!warning_displayed) {
2335*03f9172cSAndroid Build Coastguard Worker 			printf("Could not connect to hostapd - re-trying\n");
2336*03f9172cSAndroid Build Coastguard Worker 			warning_displayed = 1;
2337*03f9172cSAndroid Build Coastguard Worker 		}
2338*03f9172cSAndroid Build Coastguard Worker 		os_sleep(1, 0);
2339*03f9172cSAndroid Build Coastguard Worker 		continue;
2340*03f9172cSAndroid Build Coastguard Worker 	}
2341*03f9172cSAndroid Build Coastguard Worker 
2342*03f9172cSAndroid Build Coastguard Worker 	eloop_register_signal_terminate(hostapd_cli_eloop_terminate, NULL);
2343*03f9172cSAndroid Build Coastguard Worker 
2344*03f9172cSAndroid Build Coastguard Worker 	if (action_file && !hostapd_cli_attached)
2345*03f9172cSAndroid Build Coastguard Worker 		return -1;
2346*03f9172cSAndroid Build Coastguard Worker 	if (daemonize && os_daemonize(pid_file) && eloop_sock_requeue())
2347*03f9172cSAndroid Build Coastguard Worker 		return -1;
2348*03f9172cSAndroid Build Coastguard Worker 	if (reconnect && action_file && ctrl_ifname) {
2349*03f9172cSAndroid Build Coastguard Worker 		while (!hostapd_cli_quit) {
2350*03f9172cSAndroid Build Coastguard Worker 			if (ctrl_conn)
2351*03f9172cSAndroid Build Coastguard Worker 				hostapd_cli_action(ctrl_conn);
2352*03f9172cSAndroid Build Coastguard Worker 			os_sleep(1, 0);
2353*03f9172cSAndroid Build Coastguard Worker 			hostapd_cli_reconnect(ctrl_ifname);
2354*03f9172cSAndroid Build Coastguard Worker 		}
2355*03f9172cSAndroid Build Coastguard Worker 	} else if (interactive)
2356*03f9172cSAndroid Build Coastguard Worker 		hostapd_cli_interactive();
2357*03f9172cSAndroid Build Coastguard Worker 	else if (action_file)
2358*03f9172cSAndroid Build Coastguard Worker 		hostapd_cli_action(ctrl_conn);
2359*03f9172cSAndroid Build Coastguard Worker 	else
2360*03f9172cSAndroid Build Coastguard Worker 		wpa_request(ctrl_conn, argc - optind, &argv[optind]);
2361*03f9172cSAndroid Build Coastguard Worker 
2362*03f9172cSAndroid Build Coastguard Worker 	unregister_event_handler(ctrl_conn);
2363*03f9172cSAndroid Build Coastguard Worker 	os_free(ctrl_ifname);
2364*03f9172cSAndroid Build Coastguard Worker 	eloop_destroy();
2365*03f9172cSAndroid Build Coastguard Worker 	hostapd_cli_cleanup();
2366*03f9172cSAndroid Build Coastguard Worker 	return 0;
2367*03f9172cSAndroid Build Coastguard Worker }
2368*03f9172cSAndroid Build Coastguard Worker 
2369*03f9172cSAndroid Build Coastguard Worker #else /* CONFIG_NO_CTRL_IFACE */
2370*03f9172cSAndroid Build Coastguard Worker 
main(int argc,char * argv[])2371*03f9172cSAndroid Build Coastguard Worker int main(int argc, char *argv[])
2372*03f9172cSAndroid Build Coastguard Worker {
2373*03f9172cSAndroid Build Coastguard Worker 	return -1;
2374*03f9172cSAndroid Build Coastguard Worker }
2375*03f9172cSAndroid Build Coastguard Worker 
2376*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_NO_CTRL_IFACE */
2377