client: implement "ap <wlan> show"

This command uses GetDiagnostics to show a list of connected
clients and some information about them. The information
contained for each connected station nearly maps 1:1 with the
station diagnostics information shown in "station <wlan> show"
apart from "ConnectedBss" which is now "Address".
This commit is contained in:
James Prestwood 2021-01-22 12:38:47 -08:00 committed by Denis Kenzior
parent 11d1d860f0
commit 9659c936cd
1 changed files with 49 additions and 0 deletions

View File

@ -30,6 +30,7 @@
#include "client/dbus-proxy.h"
#include "client/device.h"
#include "client/display.h"
#include "client/diagnostic.h"
struct ap {
bool started;
@ -189,6 +190,51 @@ static enum cmd_status cmd_stop(const char *device_name, char **argv, int argc)
return CMD_STATUS_TRIGGERED;
}
static struct proxy_interface_type ap_diagnostic_interface_type = {
.interface = IWD_AP_DIAGNOSTIC_INTERFACE,
};
static void ap_get_diagnostics_callback(struct l_dbus_message *message,
void *user_data)
{
struct l_dbus_message_iter array;
struct l_dbus_message_iter iter;
uint16_t idx = 0;
char client_num[15];
if (dbus_message_has_error(message))
return;
if (!l_dbus_message_get_arguments(message, "aa{sv}", &array)) {
display("Failed to parse GetDiagnostics message");
return;
}
while (l_dbus_message_iter_next_entry(&array, &iter)) {
sprintf(client_num, "Client %u", idx++);
display_table_header(client_num, "%-*s%-*s",
20, "Property", 20, "Value");
diagnostic_display(&iter, "", 20, 20);
display_table_footer();
}
}
static enum cmd_status cmd_show(const char *device_name, char **argv, int argc)
{
const struct proxy_interface *ap_diagnostic =
device_proxy_find(device_name, IWD_AP_DIAGNOSTIC_INTERFACE);
if (!ap_diagnostic) {
display("No ap on device: '%s'\n", device_name);
return CMD_STATUS_INVALID_VALUE;
}
proxy_interface_method_call(ap_diagnostic, "GetDiagnostics", "",
ap_get_diagnostics_callback);
return CMD_STATUS_TRIGGERED;
}
static const struct command ap_commands[] = {
{ NULL, "list", NULL, cmd_list, "List devices in AP mode", true },
{ "<wlan>", "start", "<\"network name\"> <passphrase>", cmd_start,
@ -196,6 +242,7 @@ static const struct command ap_commands[] = {
"name\" with\n\t\t\t\t\t\t a passphrase" },
{ "<wlan>", "stop", NULL, cmd_stop, "Stop a started access\n"
"\t\t\t\t\t\t point" },
{ "<wlan", "show", NULL, cmd_show, "Show AP info", false },
{ }
};
@ -236,6 +283,7 @@ COMMAND_FAMILY(ap_command_family, ap_command_family_init,
static int ap_interface_init(void)
{
proxy_interface_type_register(&ap_interface_type);
proxy_interface_type_register(&ap_diagnostic_interface_type);
return 0;
}
@ -243,6 +291,7 @@ static int ap_interface_init(void)
static void ap_interface_exit(void)
{
proxy_interface_type_unregister(&ap_interface_type);
proxy_interface_type_unregister(&ap_diagnostic_interface_type);
}
INTERFACE_TYPE(ap_interface_type, ap_interface_init, ap_interface_exit)