mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-12-22 13:02:44 +01:00
client: add AP scanning support to iwctl
This commit is contained in:
parent
d4e9cda0c0
commit
2552ec26b7
115
client/ap.c
115
client/ap.c
@ -35,6 +35,7 @@
|
|||||||
struct ap {
|
struct ap {
|
||||||
bool started;
|
bool started;
|
||||||
char *name;
|
char *name;
|
||||||
|
bool scanning;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void *ap_create(void)
|
static void *ap_create(void)
|
||||||
@ -104,9 +105,31 @@ static void update_name(void *data, struct l_dbus_message_iter *variant)
|
|||||||
ap->name = l_strdup(name);
|
ap->name = l_strdup(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void update_scanning(void *data, struct l_dbus_message_iter *variant)
|
||||||
|
{
|
||||||
|
struct ap *ap = data;
|
||||||
|
bool value;
|
||||||
|
|
||||||
|
if (!l_dbus_message_iter_get_variant(variant, "b", &value)) {
|
||||||
|
ap->scanning = false;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ap->scanning = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *get_scanning_tostr(const void *data)
|
||||||
|
{
|
||||||
|
const struct ap *ap = data;
|
||||||
|
|
||||||
|
return ap->scanning ? "yes" : "no";
|
||||||
|
}
|
||||||
|
|
||||||
static const struct proxy_interface_property ap_properties[] = {
|
static const struct proxy_interface_property ap_properties[] = {
|
||||||
{ "Started", "b", update_started, get_started_tostr },
|
{ "Started", "b", update_started, get_started_tostr },
|
||||||
{ "Name", "s", update_name, get_name_tostr },
|
{ "Name", "s", update_name, get_name_tostr },
|
||||||
|
{ "Scanning", "b", update_scanning, get_scanning_tostr },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -301,6 +324,95 @@ static enum cmd_status cmd_start_profile(const char *device_name,
|
|||||||
return CMD_STATUS_TRIGGERED;
|
return CMD_STATUS_TRIGGERED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static enum cmd_status cmd_scan(const char *device_name, char **argv, int argc)
|
||||||
|
{
|
||||||
|
const struct proxy_interface *ap_i;
|
||||||
|
|
||||||
|
ap_i = device_proxy_find(device_name, IWD_ACCESS_POINT_INTERFACE);
|
||||||
|
if (!ap_i) {
|
||||||
|
display("No ap on device: '%s'\n", device_name);
|
||||||
|
return CMD_STATUS_INVALID_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
proxy_interface_method_call(ap_i, "Scan", "",
|
||||||
|
check_errors_method_callback);
|
||||||
|
|
||||||
|
return CMD_STATUS_TRIGGERED;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ap_display_network(struct l_dbus_message_iter *iter,
|
||||||
|
const char *margin, int name_width,
|
||||||
|
int value_width)
|
||||||
|
{
|
||||||
|
const char *key;
|
||||||
|
struct l_dbus_message_iter variant;
|
||||||
|
|
||||||
|
while (l_dbus_message_iter_next_entry(iter, &key, &variant)) {
|
||||||
|
const char *s;
|
||||||
|
int16_t n;
|
||||||
|
|
||||||
|
if (!strcmp(key, "Name") || !strcmp(key, "Type")) {
|
||||||
|
if (!l_dbus_message_iter_get_variant(&variant, "s", &s))
|
||||||
|
goto parse_error;
|
||||||
|
|
||||||
|
display("%s%-*s%-*s\n", margin, name_width, key,
|
||||||
|
value_width, s);
|
||||||
|
} else if (!strcmp(key, "SignalStrength")) {
|
||||||
|
if (!l_dbus_message_iter_get_variant(&variant, "n", &n))
|
||||||
|
goto parse_error;
|
||||||
|
|
||||||
|
display("%s%-*s%-*i\n", margin, name_width, key,
|
||||||
|
value_width, n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
parse_error:
|
||||||
|
display("Error displaying network results");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ap_get_networks_callback(struct l_dbus_message *message,
|
||||||
|
void *user_data)
|
||||||
|
{
|
||||||
|
struct l_dbus_message_iter array;
|
||||||
|
struct l_dbus_message_iter iter;
|
||||||
|
|
||||||
|
if (dbus_message_has_error(message))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!l_dbus_message_get_arguments(message, "aa{sv}", &array)) {
|
||||||
|
display("Failed to parse GetDiagnostics message");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
display_table_header("Networks", " %-*s%-*s",
|
||||||
|
20, "Property", 20, "Value");
|
||||||
|
while (l_dbus_message_iter_next_entry(&array, &iter)) {
|
||||||
|
ap_display_network(&iter, " ", 20, 20);
|
||||||
|
display("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
display_table_footer();
|
||||||
|
}
|
||||||
|
|
||||||
|
static enum cmd_status cmd_get_networks(const char *device_name, char **argv,
|
||||||
|
int argc)
|
||||||
|
{
|
||||||
|
const struct proxy_interface *ap_i;
|
||||||
|
|
||||||
|
ap_i = device_proxy_find(device_name, IWD_ACCESS_POINT_INTERFACE);
|
||||||
|
if (!ap_i) {
|
||||||
|
display("No ap on device: '%s'\n", device_name);
|
||||||
|
return CMD_STATUS_INVALID_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
proxy_interface_method_call(ap_i, "GetOrderedNetworks", "",
|
||||||
|
ap_get_networks_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,
|
||||||
@ -311,6 +423,9 @@ static const struct command ap_commands[] = {
|
|||||||
{ "<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 },
|
{ "<wlan>", "show", NULL, cmd_show, "Show AP info", false },
|
||||||
|
{ "<wlan>", "scan", NULL, cmd_scan, "Start an AP scan", false },
|
||||||
|
{ "<wlan>", "get-networks", NULL, cmd_get_networks,
|
||||||
|
"Get network list after scanning", false },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user