[PATCH v4 4/5] client: display BasicServiceSet RSN property
Aleksman4o <[email protected]> Tue, 28 Jul 2026 18:46:43 +0300
| Newsgroups | dev.linux.lists.iwd |
|---|---|
| Message-ID | <[email protected]> |
From: Aleks Man <[email protected]> Parse the optional RSN dictionary and include the advertised key management and cipher capabilities in the station get-bsses output. --- client/bss.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/client/bss.c b/client/bss.c index def4de7f..b5c80087 100644 --- a/client/bss.c +++ b/client/bss.c @@ -32,6 +32,7 @@ struct bss { char *address; + char *rsn; }; static const char *get_address(const void *data) @@ -57,8 +58,82 @@ static void update_address(void *data, struct l_dbus_message_iter *variant) bss->address = l_strdup(value); } +static char *string_array_to_string(struct l_dbus_message_iter *variant) +{ + struct l_dbus_message_iter array; + const char *value; + char **strv; + char *result; + + if (!l_dbus_message_iter_get_variant(variant, "as", &array)) + return NULL; + + strv = l_strv_new(); + + while (l_dbus_message_iter_next_entry(&array, &value)) + strv = l_strv_append(strv, value); + + result = l_strjoinv(strv, ' '); + l_strv_free(strv); + + return result; +} + +static void update_rsn(void *data, struct l_dbus_message_iter *variant) +{ + struct bss *bss = data; + struct l_dbus_message_iter dict; + struct l_dbus_message_iter value; + const char *key; + const char *group_value; + char *key_mgmt = NULL; + char *pairwise = NULL; + char *group = NULL; + + l_free(bss->rsn); + bss->rsn = NULL; + + if (!variant || + !l_dbus_message_iter_get_variant(variant, "a{sv}", &dict)) + goto done; + + while (l_dbus_message_iter_next_entry(&dict, &key, &value)) { + if (!strcmp(key, "KeyMgmt")) { + l_free(key_mgmt); + key_mgmt = string_array_to_string(&value); + } else if (!strcmp(key, "Pairwise")) { + l_free(pairwise); + pairwise = string_array_to_string(&value); + } else if (!strcmp(key, "Group") && + l_dbus_message_iter_get_variant(&value, "s", + &group_value)) { + l_free(group); + group = l_strdup(group_value); + } + } + + if (!key_mgmt || !pairwise || !group) + goto done; + + bss->rsn = l_strdup_printf("KeyMgmt: %s; Pairwise: %s; Group: %s", + key_mgmt, pairwise, group); + +done: + l_free(key_mgmt); + l_free(pairwise); + l_free(group); +} + +static const char *get_rsn(const void *data) +{ + const struct bss *bss = data; + + return bss->rsn; +} + static const struct proxy_interface_property bss_properties[] = { { "Address", "s", update_address, get_address }, + { "RSN", "a{sv}", update_rsn, get_rsn }, { } }; @@ -72,6 +147,7 @@ static void bss_destroy(void *data) struct bss *bss = data; l_free(bss->address); + l_free(bss->rsn); l_free(bss); } -- 2.55.0