dbus: Add a global property to set or unset WFD IEs
This permits to set or unset the WiFi Display subelements from DBus, by providing the full WFD specific IE frame. Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
This commit is contained in:
parent
4bd7e1614f
commit
6a60488745
3 changed files with 92 additions and 0 deletions
|
@ -2097,6 +2097,12 @@ static const struct wpa_dbus_property_desc wpas_dbus_global_properties[] = {
|
|||
wpas_dbus_getter_global_capabilities,
|
||||
NULL
|
||||
},
|
||||
#ifdef CONFIG_WIFI_DISPLAY
|
||||
{ "WFDIEs", WPAS_DBUS_NEW_INTERFACE, "ay",
|
||||
wpas_dbus_getter_global_wfd_ies,
|
||||
wpas_dbus_setter_global_wfd_ies
|
||||
},
|
||||
#endif /* CONFIG_WIFI_DISPLAY */
|
||||
{ NULL, NULL, NULL, NULL, NULL }
|
||||
};
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include "ap/wps_hostapd.h"
|
||||
|
||||
#include "../p2p_supplicant.h"
|
||||
#include "../wifi_display.h"
|
||||
|
||||
/**
|
||||
* Parses out the mac address from the peer object path.
|
||||
|
@ -2589,3 +2590,77 @@ DBusMessage * wpas_dbus_handler_p2p_serv_disc_external(
|
|||
return NULL;
|
||||
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_WIFI_DISPLAY
|
||||
|
||||
dbus_bool_t wpas_dbus_getter_global_wfd_ies(DBusMessageIter *iter,
|
||||
DBusError *error, void *user_data)
|
||||
{
|
||||
struct wpa_global *global = user_data;
|
||||
struct wpabuf *ie;
|
||||
dbus_bool_t ret;
|
||||
|
||||
ie = wifi_display_get_wfd_ie(global);
|
||||
if (ie == NULL)
|
||||
return wpas_dbus_simple_array_property_getter(iter,
|
||||
DBUS_TYPE_BYTE,
|
||||
NULL, 0, error);
|
||||
|
||||
ret = wpas_dbus_simple_array_property_getter(iter, DBUS_TYPE_BYTE,
|
||||
wpabuf_head(ie),
|
||||
wpabuf_len(ie), error);
|
||||
wpabuf_free(ie);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
dbus_bool_t wpas_dbus_setter_global_wfd_ies(DBusMessageIter *iter,
|
||||
DBusError *error, void *user_data)
|
||||
{
|
||||
struct wpa_global *global = user_data;
|
||||
DBusMessageIter variant, array;
|
||||
struct wpabuf *ie = NULL;
|
||||
const u8 *data;
|
||||
int len;
|
||||
|
||||
if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_VARIANT)
|
||||
goto err;
|
||||
|
||||
dbus_message_iter_recurse(iter, &variant);
|
||||
if (dbus_message_iter_get_arg_type(&variant) != DBUS_TYPE_ARRAY)
|
||||
goto err;
|
||||
|
||||
dbus_message_iter_recurse(&variant, &array);
|
||||
dbus_message_iter_get_fixed_array(&array, &data, &len);
|
||||
if (len == 0) {
|
||||
wifi_display_enable(global, 0);
|
||||
wifi_display_deinit(global);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
ie = wpabuf_alloc(len);
|
||||
if (ie == NULL)
|
||||
goto err;
|
||||
|
||||
wpabuf_put_data(ie, data, len);
|
||||
if (wifi_display_subelem_set_from_ies(global, ie) != 0)
|
||||
goto err;
|
||||
|
||||
if (global->wifi_display == 0)
|
||||
wifi_display_enable(global, 1);
|
||||
|
||||
wpabuf_free(ie);
|
||||
|
||||
return TRUE;
|
||||
err:
|
||||
wpabuf_free(ie);
|
||||
|
||||
dbus_set_error_const(error, DBUS_ERROR_INVALID_ARGS,
|
||||
"invalid message format");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_WIFI_DISPLAY */
|
||||
|
|
|
@ -210,5 +210,16 @@ DBusMessage * wpas_dbus_handler_remove_persistent_group(
|
|||
DBusMessage * wpas_dbus_handler_remove_all_persistent_groups(
|
||||
DBusMessage *message, struct wpa_supplicant *wpa_s);
|
||||
|
||||
#ifdef CONFIG_WIFI_DISPLAY
|
||||
|
||||
dbus_bool_t wpas_dbus_getter_global_wfd_ies(DBusMessageIter *iter,
|
||||
DBusError *error,
|
||||
void *user_data);
|
||||
|
||||
dbus_bool_t wpas_dbus_setter_global_wfd_ies(DBusMessageIter *iter,
|
||||
DBusError *error,
|
||||
void *user_data);
|
||||
|
||||
#endif /* CONFIG_WIFI_DISPLAY */
|
||||
|
||||
#endif /* DBUS_NEW_HANDLERS_P2P_H */
|
||||
|
|
Loading…
Reference in a new issue