Wifi plugin will be able to update the WFD IEs through that function and will know if it has been successfully set or not by a callback. --- gsupplicant/gsupplicant.h | 6 +++++ gsupplicant/supplicant.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+)
diff --git a/gsupplicant/gsupplicant.h b/gsupplicant/gsupplicant.h index e820381..c9aad8d 100644 --- a/gsupplicant/gsupplicant.h +++ b/gsupplicant/gsupplicant.h @@ -183,6 +183,8 @@ struct _GSupplicantP2PServiceParams { int query_length; unsigned char *response; int response_length; + unsigned char *wfd_ies; + int wfd_ies_length; }; typedef struct _GSupplicantP2PServiceParams GSupplicantP2PServiceParams; @@ -251,6 +253,10 @@ int g_supplicant_interface_p2p_add_service(GSupplicantInterface *interface, int g_supplicant_interface_p2p_del_service(GSupplicantInterface *interface, GSupplicantP2PServiceParams *p2p_service_params); +int g_supplicant_set_widi_ies(GSupplicantP2PServiceParams *p2p_service_params, + GSupplicantInterfaceCallback callback, + void *user_data); + int g_supplicant_interface_connect(GSupplicantInterface *interface, GSupplicantSSID *ssid, GSupplicantInterfaceCallback callback, diff --git a/gsupplicant/supplicant.c b/gsupplicant/supplicant.c index b796524..e96d80b 100644 --- a/gsupplicant/supplicant.c +++ b/gsupplicant/supplicant.c @@ -4879,6 +4879,7 @@ static void interface_p2p_service_result(const char *error, g_free(data->service->query); g_free(data->service->response); g_free(data->service->service); + g_free(data->service->wfd_ies); g_free(data->service); dbus_free(data); } @@ -5017,6 +5018,61 @@ int g_supplicant_interface_p2p_listen(GSupplicantInterface *interface, NULL, ¶ms, NULL); } +static void widi_ies_params(DBusMessageIter *iter, void *user_data) +{ + struct p2p_service_data *data = user_data; + GSupplicantP2PServiceParams *service = data->service; + DBusMessageIter array; + + SUPPLICANT_DBG("%p - %d", service->wfd_ies, service->wfd_ies_length); + + dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, + DBUS_TYPE_BYTE_AS_STRING, &array); + + if (service->wfd_ies && service->wfd_ies_length > 0) { + dbus_message_iter_append_fixed_array(&array, DBUS_TYPE_BYTE, + &service->wfd_ies, service->wfd_ies_length); + } + + dbus_message_iter_close_container(iter, &array); +} + +int g_supplicant_set_widi_ies(GSupplicantP2PServiceParams *p2p_service_params, + GSupplicantInterfaceCallback callback, + void *user_data) +{ + struct p2p_service_data *data; + int ret; + + SUPPLICANT_DBG(""); + + if (!system_available) + return -EFAULT; + + data = dbus_malloc0(sizeof(*data)); + data->service = p2p_service_params; + data->callback = callback; + data->user_data = user_data; + + if (p2p_service_params->wfd_ies) + data->registration = true; + + ret = supplicant_dbus_property_set(SUPPLICANT_PATH, + SUPPLICANT_INTERFACE, "WFDIEs", + DBUS_TYPE_ARRAY_AS_STRING + DBUS_TYPE_BYTE_AS_STRING, + widi_ies_params, + interface_p2p_service_result, + data, NULL); + if (ret < 0 && ret != -EINPROGRESS) { + dbus_free(data); + return ret; + } + + return -EINPROGRESS; +} + + static const char *g_supplicant_rule0 = "type=signal," "path=" DBUS_PATH_DBUS "," "sender=" DBUS_SERVICE_DBUS "," -- 1.8.5.5 _______________________________________________ connman mailing list connman@connman.net https://lists.connman.net/mailman/listinfo/connman