]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
dbus: Add a global property to set or unset WFD IEs
authorTomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Mon, 15 Sep 2014 05:04:31 +0000 (08:04 +0300)
committerJouni Malinen <j@w1.fi>
Sun, 28 Sep 2014 17:47:06 +0000 (20:47 +0300)
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>
wpa_supplicant/dbus/dbus_new.c
wpa_supplicant/dbus/dbus_new_handlers_p2p.c
wpa_supplicant/dbus/dbus_new_handlers_p2p.h

index 73b1aeabe2e54b8c75b35e898447e93ce510335c..3d2255202034ea548a1d7bfa540abd7773fb7bc0 100644 (file)
@@ -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 }
 };
 
index c9ecc7b429040f1abf595a9e7f506f9acc416a90..7867f0c853c58cb4f3c0557e8c01da0b1643fe78 100644 (file)
@@ -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 */
index 67dbfc95fa6c92275687f5dca9640cb63c89411e..6e67c89edcc724cceef2ab850f278f1e7a38f526 100644 (file)
@@ -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 */