hostapd_cli: Refresh stations list on control interface reconnect
Whenever reconnecting the control interface the hostapd station list is unknown as stations might have dropped or connected. Refresh the list of stations used for command completion on cli connect, reconnect and interface change. Signed-off-by: Mikael Kanstrup <mikael.kanstrup@sonymobile.com>
This commit is contained in:
parent
839e4a8a98
commit
aa2ab916ef
1 changed files with 27 additions and 4 deletions
|
@ -717,7 +717,7 @@ static int hostapd_cli_cmd_get_config(struct wpa_ctrl *ctrl, int argc,
|
||||||
|
|
||||||
|
|
||||||
static int wpa_ctrl_command_sta(struct wpa_ctrl *ctrl, char *cmd,
|
static int wpa_ctrl_command_sta(struct wpa_ctrl *ctrl, char *cmd,
|
||||||
char *addr, size_t addr_len)
|
char *addr, size_t addr_len, int print)
|
||||||
{
|
{
|
||||||
char buf[4096], *pos;
|
char buf[4096], *pos;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
@ -741,7 +741,8 @@ static int wpa_ctrl_command_sta(struct wpa_ctrl *ctrl, char *cmd,
|
||||||
buf[len] = '\0';
|
buf[len] = '\0';
|
||||||
if (memcmp(buf, "FAIL", 4) == 0)
|
if (memcmp(buf, "FAIL", 4) == 0)
|
||||||
return -1;
|
return -1;
|
||||||
printf("%s", buf);
|
if (print)
|
||||||
|
printf("%s", buf);
|
||||||
|
|
||||||
pos = buf;
|
pos = buf;
|
||||||
while (*pos != '\0' && *pos != '\n')
|
while (*pos != '\0' && *pos != '\n')
|
||||||
|
@ -757,11 +758,11 @@ static int hostapd_cli_cmd_all_sta(struct wpa_ctrl *ctrl, int argc,
|
||||||
{
|
{
|
||||||
char addr[32], cmd[64];
|
char addr[32], cmd[64];
|
||||||
|
|
||||||
if (wpa_ctrl_command_sta(ctrl, "STA-FIRST", addr, sizeof(addr)))
|
if (wpa_ctrl_command_sta(ctrl, "STA-FIRST", addr, sizeof(addr), 1))
|
||||||
return 0;
|
return 0;
|
||||||
do {
|
do {
|
||||||
snprintf(cmd, sizeof(cmd), "STA-NEXT %s", addr);
|
snprintf(cmd, sizeof(cmd), "STA-NEXT %s", addr);
|
||||||
} while (wpa_ctrl_command_sta(ctrl, cmd, addr, sizeof(addr)) == 0);
|
} while (wpa_ctrl_command_sta(ctrl, cmd, addr, sizeof(addr), 1) == 0);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -903,6 +904,25 @@ static int hostapd_cli_cmd_level(struct wpa_ctrl *ctrl, int argc, char *argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void update_stations(struct wpa_ctrl *ctrl)
|
||||||
|
{
|
||||||
|
char addr[32], cmd[64];
|
||||||
|
|
||||||
|
if (!ctrl || !interactive)
|
||||||
|
return;
|
||||||
|
|
||||||
|
cli_txt_list_flush(&stations);
|
||||||
|
|
||||||
|
if (wpa_ctrl_command_sta(ctrl, "STA-FIRST", addr, sizeof(addr), 0))
|
||||||
|
return;
|
||||||
|
do {
|
||||||
|
if (os_strcmp(addr, "") != 0)
|
||||||
|
cli_txt_list_add(&stations, addr);
|
||||||
|
os_snprintf(cmd, sizeof(cmd), "STA-NEXT %s", addr);
|
||||||
|
} while (wpa_ctrl_command_sta(ctrl, cmd, addr, sizeof(addr), 0) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void hostapd_cli_get_interfaces(struct wpa_ctrl *ctrl,
|
static void hostapd_cli_get_interfaces(struct wpa_ctrl *ctrl,
|
||||||
struct dl_list *interfaces)
|
struct dl_list *interfaces)
|
||||||
{
|
{
|
||||||
|
@ -967,6 +987,7 @@ static int hostapd_cli_cmd_interface(struct wpa_ctrl *ctrl, int argc,
|
||||||
if (wpa_ctrl_attach(ctrl_conn) == 0) {
|
if (wpa_ctrl_attach(ctrl_conn) == 0) {
|
||||||
hostapd_cli_attached = 1;
|
hostapd_cli_attached = 1;
|
||||||
register_event_handler(ctrl_conn);
|
register_event_handler(ctrl_conn);
|
||||||
|
update_stations(ctrl_conn);
|
||||||
} else {
|
} else {
|
||||||
printf("Warning: Failed to attach to "
|
printf("Warning: Failed to attach to "
|
||||||
"hostapd.\n");
|
"hostapd.\n");
|
||||||
|
@ -1526,6 +1547,7 @@ static void hostapd_cli_ping(void *eloop_ctx, void *timeout_ctx)
|
||||||
if (wpa_ctrl_attach(ctrl_conn) == 0) {
|
if (wpa_ctrl_attach(ctrl_conn) == 0) {
|
||||||
hostapd_cli_attached = 1;
|
hostapd_cli_attached = 1;
|
||||||
register_event_handler(ctrl_conn);
|
register_event_handler(ctrl_conn);
|
||||||
|
update_stations(ctrl_conn);
|
||||||
} else {
|
} else {
|
||||||
printf("Warning: Failed to attach to "
|
printf("Warning: Failed to attach to "
|
||||||
"hostapd.\n");
|
"hostapd.\n");
|
||||||
|
@ -1805,6 +1827,7 @@ int main(int argc, char *argv[])
|
||||||
if (wpa_ctrl_attach(ctrl_conn) == 0) {
|
if (wpa_ctrl_attach(ctrl_conn) == 0) {
|
||||||
hostapd_cli_attached = 1;
|
hostapd_cli_attached = 1;
|
||||||
register_event_handler(ctrl_conn);
|
register_event_handler(ctrl_conn);
|
||||||
|
update_stations(ctrl_conn);
|
||||||
} else {
|
} else {
|
||||||
printf("Warning: Failed to attach to hostapd.\n");
|
printf("Warning: Failed to attach to hostapd.\n");
|
||||||
if (action_file)
|
if (action_file)
|
||||||
|
|
Loading…
Reference in a new issue