mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-12-22 21:12:48 +01:00
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:
parent
11d1d860f0
commit
9659c936cd
49
client/ap.c
49
client/ap.c
@ -30,6 +30,7 @@
|
|||||||
#include "client/dbus-proxy.h"
|
#include "client/dbus-proxy.h"
|
||||||
#include "client/device.h"
|
#include "client/device.h"
|
||||||
#include "client/display.h"
|
#include "client/display.h"
|
||||||
|
#include "client/diagnostic.h"
|
||||||
|
|
||||||
struct ap {
|
struct ap {
|
||||||
bool started;
|
bool started;
|
||||||
@ -189,6 +190,51 @@ static enum cmd_status cmd_stop(const char *device_name, char **argv, int argc)
|
|||||||
return CMD_STATUS_TRIGGERED;
|
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[] = {
|
static const struct command ap_commands[] = {
|
||||||
{ NULL, "list", NULL, cmd_list, "List devices in AP mode", true },
|
{ NULL, "list", NULL, cmd_list, "List devices in AP mode", true },
|
||||||
{ "<wlan>", "start", "<\"network name\"> <passphrase>", cmd_start,
|
{ "<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" },
|
"name\" with\n\t\t\t\t\t\t a passphrase" },
|
||||||
{ "<wlan>", "stop", NULL, cmd_stop, "Stop a started access\n"
|
{ "<wlan>", "stop", NULL, cmd_stop, "Stop a started access\n"
|
||||||
"\t\t\t\t\t\t point" },
|
"\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)
|
static int ap_interface_init(void)
|
||||||
{
|
{
|
||||||
proxy_interface_type_register(&ap_interface_type);
|
proxy_interface_type_register(&ap_interface_type);
|
||||||
|
proxy_interface_type_register(&ap_diagnostic_interface_type);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -243,6 +291,7 @@ static int ap_interface_init(void)
|
|||||||
static void ap_interface_exit(void)
|
static void ap_interface_exit(void)
|
||||||
{
|
{
|
||||||
proxy_interface_type_unregister(&ap_interface_type);
|
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)
|
INTERFACE_TYPE(ap_interface_type, ap_interface_init, ap_interface_exit)
|
||||||
|
Loading…
Reference in New Issue
Block a user