2 * Network Configuration Module
4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
21 * This file implements wifi direct wpasupplicant dbus plugin functions.
23 * @file wfd-plugin-dbus-wpasupplicant.c
24 * @author Jiung Yu (jiung.yu@samsung.com)
31 #include <sys/types.h>
33 #include <sys/socket.h>
40 #include <sys/ioctl.h>
46 #include <tzplatform_config.h>
48 #include "wifi-direct-oem.h"
49 #include "wfd-plugin-log.h"
50 #include "dbus/wfd-plugin-supplicant-dbus.h"
51 #include "wfd-plugin-wpasupplicant.h"
53 #define GLIST_ITER_START(arg_list, elem)\
55 temp = g_list_first(arg_list);\
58 temp = g_list_next(temp);\
60 #define GLIST_ITER_END() }
62 #define NETCONFIG_SERVICE "net.netconfig"
63 #define NETCONFIG_WIFI_INTERFACE "net.netconfig.wifi"
64 #define NETCONFIG_WIFI_PATH "/net/netconfig/wifi"
66 #define NETCONFIG_DBUS_REPLY_TIMEOUT (10 * 1000)
68 #define CONF_FILE_PATH tzplatform_mkpath(TZ_SYS_ETC, "wpa_supplicant/wpa_supplicant.conf")
69 #define MAX_FILE_PATH_LEN 256
71 static wfd_oem_ops_s supplicant_ops = {
72 .configure = ws_configure,
75 .activate = ws_activate,
76 .deactivate = ws_deactivate,
78 .start_scan = ws_start_scan,
79 .stop_scan = ws_stop_scan,
80 .get_visibility = ws_get_visibility,
81 .set_visibility = ws_set_visibility,
82 .get_scan_result = ws_get_scan_result,
83 .get_peer_info = ws_get_peer_info,
85 .prov_disc_req = ws_prov_disc_req,
87 .connect = ws_connect,
88 .disconnect = ws_disconnect,
89 .reject_connection = ws_reject_connection,
90 .cancel_connection = ws_cancel_connection,
92 .get_connected_peers = ws_get_connected_peers,
93 .get_pin = ws_get_pin,
94 .set_pin = ws_set_pin,
95 .generate_pin = ws_generate_pin,
96 .get_supported_wps_mode = ws_get_supported_wps_mode,
98 .create_group = ws_create_group,
99 .destroy_group = ws_destroy_group,
101 .wps_start = ws_wps_start,
102 .enrollee_start = ws_enrollee_start,
103 .wps_cancel = ws_wps_cancel,
105 .get_dev_name = ws_get_dev_name,
106 .set_dev_name = ws_set_dev_name,
107 .get_dev_mac = ws_get_dev_mac,
108 .get_dev_type = ws_get_dev_type,
109 .set_dev_type = ws_set_dev_type,
110 .get_go_intent = ws_get_go_intent,
111 .set_go_intent = ws_set_go_intent,
112 .set_country = ws_set_country,
113 .get_persistent_groups = ws_get_persistent_groups,
114 .remove_persistent_group = ws_remove_persistent_group,
115 .set_persistent_reconnect = ws_set_persistent_reconnect,
117 .start_service_discovery = ws_start_service_discovery,
118 .cancel_service_discovery = ws_cancel_service_discovery,
120 .serv_add = ws_serv_add,
121 .serv_del = ws_serv_del,
123 .miracast_init = ws_miracast_init,
124 .set_display = ws_set_display,
126 .refresh = ws_refresh,
127 .save_config = ws_save_config,
128 .set_operating_channel = ws_set_operating_channel,
129 .remove_all_network = ws_remove_all_network,
130 .get_wpa_status = ws_get_wpa_status,
132 .advertise_service = ws_advertise_service,
133 .cancel_advertise_service = ws_cancel_advertise_service,
134 .seek_service = ws_seek_service,
135 .cancel_seek_service = ws_cancel_seek_service,
136 .asp_prov_disc_req = ws_asp_prov_disc_req,
138 .set_eapol_ip_config = ws_set_eapol_ip_config,
140 .add_vsie = ws_add_vsie,
141 .get_vsie = ws_get_vsie,
142 .remove_vsie = ws_remove_vsie,
143 .set_supported_wps_mode = ws_set_supported_wps_mode,
144 .remove_persistent_device = ws_remove_persistent_device,
145 .remove_all_persistent_device = ws_remove_all_persistent_device,
147 .get_supported_channels = ws_get_supported_channels,
152 static ws_dbus_plugin_data_s *g_pd;
153 static wfd_oem_config_s *config = NULL;
154 static int is_peer_joined_notified = 0;
155 static int is_peer_disconnected_notified = 0;
156 static int wps_config_method = WFD_OEM_WPS_MODE_PBC|WFD_OEM_WPS_MODE_DISPLAY|WFD_OEM_WPS_MODE_KEYPAD;
158 static GList *service_list;
159 static GList *seek_list;
161 static int __ws_txt_to_mac(unsigned char *txt, unsigned char *mac)
166 WDP_LOGE("Invalid parameter");
171 mac[i++] = (char) strtoul((char *)txt, (char **)&txt, 16);
172 if (!*txt++ || i == 6)
176 if (i != WS_MACADDR_LEN)
179 WDP_LOGD("Converted MAC address [" MACSECSTR "]", MAC2SECSTR(mac));
183 static int __ws_mac_compact_to_normal(char *compact, unsigned char *mac)
185 g_snprintf((char *)mac, OEM_MACSTR_LEN, "%c%c:%c%c:%c%c:%c%c:%c%c:%c%c",
186 compact[0], compact[1], compact[2], compact[3],
187 compact[4], compact[5], compact[6], compact[7],
188 compact[8], compact[9], compact[10], compact[11]);
192 static const char *__ws_wps_to_txt(int wps_mode)
195 case WFD_OEM_WPS_MODE_PBC:
196 return WS_DBUS_STR_PBC;
197 case WFD_OEM_WPS_MODE_DISPLAY:
198 return WS_DBUS_STR_DISPLAY;
199 case WFD_OEM_WPS_MODE_KEYPAD:
200 return WS_DBUS_STR_KEYPAD;
201 case WFD_OEM_WPS_MODE_NONE:
202 case WFD_OEM_WPS_MODE_P2PS:
203 return WS_DBUS_STR_P2PS;
209 static int __ws_hex_char_to_num(char c)
211 if (c >= '0' && c <= '9')
214 if (c >= 'a' && c <= 'f')
217 if (c >= 'A' && c <= 'F')
223 static int __ws_hex_to_byte(const char *hex)
227 a = __ws_hex_char_to_num(*hex++);
231 b = __ws_hex_char_to_num(*hex++);
238 static int __ws_hex_str_to_bin(const char *hex, unsigned char *buf, size_t len)
242 const char *ipos = hex;
243 unsigned char *opos = buf;
245 for (i = 0; i < len; i++) {
246 a = __ws_hex_to_byte(ipos);
257 static int __ws_byte_to_hex(char *buf, int buf_size, unsigned char *data, int data_len)
261 char *end = buf + buf_size;
265 for (i = 0; i < data_len; i++) {
266 ret = snprintf(pos, end - pos, "%02x", data[i]);
267 if (ret < 0 || ret >= end - pos) {
277 static int __ws_hex_to_num(char *src, int len)
282 if (!src || len < 0) {
283 WDP_LOGE("Invalid parameter");
287 temp = (char*) g_try_malloc0(len+1);
289 WDP_LOGE("Failed to allocate memory");
293 memcpy(temp, src, len);
294 num = strtoul(temp, NULL, 16);
300 static int __ws_segment_to_service(char *segment, wfd_oem_new_service_s **service)
302 wfd_oem_new_service_s *serv_tmp = NULL;
307 if (!segment || !service) {
308 WDP_LOGE("Invalid parameter");
313 WDP_LOGD("Segment: %s", segment);
315 serv_tmp = (wfd_oem_new_service_s*) g_try_malloc0(sizeof(wfd_oem_new_service_s));
317 WDP_LOGE("Failed to allocate memory for service");
321 serv_tmp->protocol = __ws_hex_to_num(ptr, 2);
322 serv_tmp->trans_id = __ws_hex_to_num(ptr+2, 2);
323 serv_tmp->status = __ws_hex_to_num(ptr+4, 2);
325 WDP_LOGD("Protocol[%d], Transaction ID[%d], Status[%d]", serv_tmp->protocol, serv_tmp->trans_id, serv_tmp->status);
327 if (serv_tmp->status != 0) {
328 WDP_LOGE("Service status is not success");
333 if (serv_tmp->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
334 WDP_LOGD("===== Bonjour service =====");
335 char compr[5] = {0, };
336 char query[256] = {0, };
337 char rdata[256] = {0, };
340 while (*ptr != 0 && strncmp(ptr, "c0", 2)) {
341 unsigned long int size = 0;
342 char temp_str[3] = {0,};
343 memcpy(temp_str, ptr, 2);
344 size = strtoul(temp_str, NULL, 16);
347 temp = (char*) calloc(1, size + 2);
350 for (i = 0; i < size; i++) {
351 temp[i+1] = (char) __ws_hex_to_num(ptr, 2);
354 g_strlcat(query, temp, sizeof(query));
361 if (!strncmp(ptr, "c0", 2)) {
362 memcpy(compr, ptr, 4);
365 if (!strncmp(ptr, "27", 2)) {
366 WDP_LOGD("Segment ended");
370 dns_type = __ws_hex_to_num(ptr, 4);
372 if (dns_type == 12) {
373 if (!strncmp(compr, "c011", 4))
374 g_strlcat(query, ".local.", sizeof(query));
375 else if (!strncmp(compr, "c00c", 4))
376 g_strlcat(query, "._tcp.local.", sizeof(query));
377 else if (!strncmp(compr, "c01c", 4))
378 g_strlcat(query, "._udp.local.", sizeof(query));
382 serv_tmp->data.bonjour.query = strdup(query + 1);
383 while (*ptr != 0 && strncmp(ptr, "c0", 2)) {
384 unsigned long int size = 0;
385 char temp_str[3] = {0,};
386 memcpy(temp_str, ptr, 2);
387 size = strtoul(temp_str, NULL, 16);
390 temp = (char*) g_try_malloc0(size + 2);
393 for (i = 0; i < size; i++) {
394 temp[i+1] = (char) __ws_hex_to_num(ptr, 2);
397 g_strlcat(rdata, temp, sizeof(rdata));
403 serv_tmp->data.bonjour.rdata = strdup(rdata + 1);
405 WDP_LOGD("Query: %s", serv_tmp->data.bonjour.query);
406 WDP_LOGD("RData: %s", serv_tmp->data.bonjour.rdata);
408 WDP_LOGE("Not supported yet. Only bonjour service supproted [%d]",
419 static void __extract_addr_from_path(char *peer_path, unsigned char *dev_addr)
421 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
424 if (!peer_path || !dev_addr)
427 loc = strrchr(peer_path, '/');
429 __ws_mac_compact_to_normal(loc + 1, peer_dev);
431 __ws_txt_to_mac(peer_dev, dev_addr);
432 WDP_LOGD("dev addr [" MACSTR "]", MAC2STR(dev_addr));
435 static void __ws_path_to_addr(char *peer_path,
436 unsigned char *dev_addr, GVariant *parameter)
438 __WDP_LOG_FUNC_ENTER__;
440 const char *path = NULL;
442 g_variant_get(parameter, "(&o)", &path);
443 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
444 WDP_LOGD("Retrive Added path [%s]", peer_path);
446 __extract_addr_from_path(peer_path, dev_addr);
448 __WDP_LOG_FUNC_EXIT__;
452 static int __ws_unpack_ay(unsigned char *dst, GVariant *src, int size)
454 GVariantIter *iter = NULL;
457 if (!dst || !src || size == 0) {
458 WDP_LOGE("Invalid parameter");
461 g_variant_get(src, "ay", &iter);
463 WDP_LOGE("failed to get iterator");
467 while (g_variant_iter_loop(iter, "y", &dst[length])) {
472 g_variant_iter_free(iter);
477 static int __ws_byte_to_txt(const unsigned char *src, char **dst, int src_len)
479 __WDP_LOG_FUNC_ENTER__;
486 WDP_LOGE("Invalid parameter.");
487 __WDP_LOG_FUNC_EXIT__;
491 *dst = (char *) g_try_malloc0((2*src_len)+1);
493 WDP_LOGE("failed to allocate memory to buffer.");
494 __WDP_LOG_FUNC_EXIT__;
500 for (i = 0; i < src_len; i++) {
501 snprintf(buf, 3, "%02x", src[i]);
506 __WDP_LOG_FUNC_EXIT__;
510 static int __ws_unpack_ay_malloc(unsigned char **dst, GVariantIter *iter)
512 GVariantIter *iter_copy = NULL;
515 unsigned char *tmp_dst = NULL;
517 if (!dst || *dst || !iter) {
518 WDP_LOGE("Invalid parameter");
522 iter_copy = g_variant_iter_copy(iter);
524 while (g_variant_iter_loop(iter, "y", &tmp))
526 g_variant_iter_free(iter);
528 tmp_dst = (unsigned char *)g_try_malloc0(length + 1);
530 WDP_LOGE("failed to allocate memory");
531 g_variant_iter_free(iter_copy);
536 while (g_variant_iter_loop(iter_copy, "y", &tmp_dst[length]))
538 g_variant_iter_free(iter_copy);
544 tmp_dst[length] = '\0';
548 WDP_LOGD("Length [%d]", length);
552 static int __parsing_wfd_info(unsigned char *wfd_dev_info,
553 wfd_oem_display_s* display)
555 __WDP_LOG_FUNC_ENTER__;
558 if (!wfd_dev_info || !display) {
559 WDP_LOGE("Invalid parameter");
560 __WDP_LOG_FUNC_EXIT__;
564 wfd_info = (wfd_dev_info[3]<<8 | wfd_dev_info[4]);
566 if (wfd_info & WS_WFD_INFO_PRIMARY_SINK)
567 display->type |= WS_WFD_INFO_PRIMARY_SINK;
568 if (wfd_info & WS_WFD_INFO_SECONDARY_SINK)
569 display->type |= WS_WFD_INFO_SECONDARY_SINK;
571 display->availability = (wfd_info & WS_WFD_INFO_AVAILABILITY) >> 4;
572 display->hdcp_support = (wfd_info & WS_WFD_INFO_HDCP_SUPPORT) >> 8;
574 display->port = (wfd_dev_info[5]<<8 | wfd_dev_info[6]);
575 display->max_tput = (wfd_dev_info[7]<<8 | wfd_dev_info[8]);
577 WDP_LOGD("type [%d],availability [%d],hdcp_support [%d],ctrl_port [%d] "
578 "max_tput[%d]", display->type, display->availability,
579 display->hdcp_support, display->port, display->max_tput);
581 __WDP_LOG_FUNC_EXIT__;
585 static int _ws_get_local_dev_mac(unsigned char *dev_mac)
587 __WDP_LOG_FUNC_ENTER__;
589 char file_path[MAX_FILE_PATH_LEN] = {0, };
590 char local_mac[OEM_MACSTR_LEN] = {0, };
593 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
596 g_snprintf(file_path, sizeof(file_path),
597 "/sys/class/net/%s/address", config->p2p_ifname);
599 fd = fopen(file_path, "r");
601 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
602 WDP_LOGE("Failed to open MAC info file [%s] (%s)", file_path, error_buf);
603 __WDP_LOG_FUNC_EXIT__;
608 ptr = fgets((char *)local_mac, WS_MACSTR_LEN, fd);
610 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
611 WDP_LOGE("Failed to read file or no data read(%s)", error_buf);
613 __WDP_LOG_FUNC_EXIT__;
616 WDP_SECLOGD("Local MAC address [%s]", ptr);
617 WDP_SECLOGD("Local MAC address [%s]", local_mac);
619 res = __ws_txt_to_mac((unsigned char *)local_mac, dev_mac);
621 WDP_LOGE("Failed to convert text to MAC address");
623 __WDP_LOG_FUNC_EXIT__;
627 WDP_LOGD("Local Device MAC address [" MACSECSTR "]", MAC2SECSTR(dev_mac));
630 __WDP_LOG_FUNC_EXIT__;
634 static void _ws_process_interface_removed(GDBusConnection *connection,
635 const gchar *sender, const gchar *object_path, const gchar *interface,
636 const gchar *signal, GVariant *parameters, gpointer user_data)
638 __WDP_LOG_FUNC_ENTER__;
639 static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
640 const char *path = NULL;
642 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
645 WDP_LOGD("Ignoring event");
646 __WDP_LOG_FUNC_EXIT__;
650 g_variant_get(parameters, "(&o)", &path);
651 g_strlcpy(interface_path, path, DBUS_OBJECT_PATH_MAX);
653 WDP_LOGD("Retrive removed path [%s]", interface_path);
655 if (!g_strcmp0(g_pd->group_iface_path, interface_path)) {
656 WDP_LOGD("p2p group interface removed");
657 memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
658 } else if (!g_strcmp0(g_pd->iface_path, interface_path)) {
660 WDP_LOGD("p2p interface removed");
661 wfd_oem_event_s event;
665 memset(&event, 0x0, sizeof(wfd_oem_event_s));
666 event.event_id = WFD_OEM_EVENT_DEACTIVATED;
667 if (g_pd->callback && g_pd->callback->deactivated_cb)
668 g_pd->callback->deactivated_cb(&event);
670 memset(g_pd->iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
672 __WDP_LOG_FUNC_EXIT__;
677 const char *interface;
679 void (*function) (GDBusConnection *connection,
680 const gchar *sender, const gchar *object_path, const gchar *interface,
681 const gchar *signal, GVariant *parameters, gpointer user_data);
682 } ws_supplicant_signal_map[] = {
685 SUPPLICANT_INTERFACE,
687 _ws_process_interface_removed
697 static void __ws_get_peer_property(const char *key, GVariant *value, void *user_data)
699 __WDP_LOG_FUNC_ENTER__;
701 wfd_oem_device_s *peer = (wfd_oem_device_s *)user_data;
703 __WDP_LOG_FUNC_EXIT__;
707 CHECK_KEY_VALUE(key, value);
709 if (g_strcmp0(key, "DeviceName") == 0) {
710 const char *name = NULL;
712 g_variant_get(value, "&s", &name);
713 g_strlcpy(peer->dev_name, name, WS_SSID_LEN + 1);
714 WDP_LOGD("Device name [%s]", peer->dev_name);
716 } else if (g_strcmp0(key, "config_method") == 0) {
717 int config_methods = 0;
718 g_variant_get(value, "q", &config_methods);
720 if (config_methods & WS_CONFIG_METHOD_DISPLAY)
721 peer->config_methods |= WFD_OEM_WPS_MODE_DISPLAY;
722 if (config_methods & WS_CONFIG_METHOD_PUSHBUTTON)
723 peer->config_methods |= WFD_OEM_WPS_MODE_PBC;
724 if (config_methods & WS_CONFIG_METHOD_KEYPAD)
725 peer->config_methods |= WFD_OEM_WPS_MODE_KEYPAD;
726 WDP_LOGD("Config method [0x%x]", peer->config_methods);
728 } else if (g_strcmp0(key, "level") == 0) {
731 g_variant_get(value, "i", &rssi);
733 WDP_LOGD("Peer RSSI [%d]", peer->rssi);
735 } else if (g_strcmp0(key, "devicecapability") == 0) {
736 unsigned char devicecapability = 0;
738 g_variant_get(value, "y", &devicecapability);
739 peer->dev_flags = (int)devicecapability;
740 WDP_LOGD("Device Capa [0x%02x]", peer->dev_flags);
742 } else if (g_strcmp0(key, "groupcapability") == 0) {
743 unsigned char groupcapability = 0;
745 g_variant_get(value, "y", &groupcapability);
746 WDP_LOGD("Group Capa [0x%02x]", groupcapability);
747 if (groupcapability & WS_GROUP_CAP_GROUP_OWNER) {
748 peer->group_flags = WFD_OEM_GROUP_FLAG_GROUP_OWNER;
749 peer->dev_role = WFD_OEM_DEV_ROLE_GO;
751 if (groupcapability & WS_GROUP_CAP_PERSISTENT_GROUP)
752 peer->group_flags = WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
754 } else if (g_strcmp0(key, "PrimaryDeviceType") == 0) {
755 unsigned char primarydevicetype[WS_DEVTYPE_LEN] = {0,};
757 if (__ws_unpack_ay(primarydevicetype, value, WS_DEVTYPE_LEN)) {
758 peer->pri_dev_type = primarydevicetype[1];
759 peer->sec_dev_type = primarydevicetype[WS_DEVTYPE_LEN -1];
761 } else if (g_strcmp0(key, "SecondaryDeviceTypes") == 0) {
762 } else if (g_strcmp0(key, "VendorExtension") == 0) {
763 } else if (g_strcmp0(key, "IEs") == 0) {
764 unsigned char ies[WFD_SUBELEM_LEN_DEV_INFO + 3] = {0,};
766 if (__ws_unpack_ay(ies, value, WFD_SUBELEM_LEN_DEV_INFO + 3))
767 __parsing_wfd_info(ies, &(peer->display));
768 } else if (g_strcmp0(key, "DeviceAddress") == 0) {
770 if (__ws_unpack_ay(peer->dev_addr, value, WS_MACADDR_LEN))
771 WDP_LOGD("Device address [" MACSTR "]", MAC2STR(peer->dev_addr));
773 } else if (g_strcmp0(key, "InterfaceAddress") == 0) {
775 if (__ws_unpack_ay(peer->intf_addr, value, WS_MACADDR_LEN))
776 WDP_LOGD("Interface address [" MACSTR "]", MAC2STR(peer->intf_addr));
778 } else if (g_strcmp0(key, "GODeviceAddress") == 0) {
780 if (__ws_unpack_ay(peer->go_dev_addr, value, WS_MACADDR_LEN))
781 WDP_LOGD("GODevice address [" MACSTR "]", MAC2STR(peer->go_dev_addr));
783 if (!ISZEROMACADDR(peer->go_dev_addr))
784 peer->dev_role = WFD_OEM_DEV_ROLE_GC;
786 } else if (g_strcmp0(key, "VSIE") == 0) {
788 unsigned char vsie[OEM_VSIE_MAX_LEN] = {0,};
790 vsie_len = __ws_unpack_ay(vsie, value, OEM_VSIE_MAX_LEN);
792 __ws_byte_to_txt(vsie, (char **)&(peer->vsie), vsie_len);
793 WDP_LOGD("VSIE [%s]", peer->vsie);
797 WDP_LOGD("Unknown value");
799 __WDP_LOG_FUNC_EXIT__;
803 static void __ws_peer_property(const char *key, GVariant *value, void *user_data)
805 __WDP_LOG_FUNC_ENTER__;
807 __WDP_LOG_FUNC_EXIT__;
811 wfd_oem_dev_data_s *peer = (wfd_oem_dev_data_s *)user_data;
813 CHECK_KEY_VALUE(key, value);
815 if (g_strcmp0(key, "DeviceName") == 0) {
816 const char *name = NULL;
818 g_variant_get(value, "&s", &name);
819 g_strlcpy(peer->name, name, WS_SSID_LEN + 1);
820 WDP_LOGD("Device Name [%s]", peer->name);
822 } else if (g_strcmp0(key, "config_method") == 0) {
823 int config_methods = 0;
825 g_variant_get(value, "q", &config_methods);
827 if (config_methods & WS_CONFIG_METHOD_DISPLAY)
828 peer->config_methods |= WFD_OEM_WPS_MODE_DISPLAY;
829 if (config_methods & WS_CONFIG_METHOD_PUSHBUTTON)
830 peer->config_methods |= WFD_OEM_WPS_MODE_PBC;
831 if (config_methods & WS_CONFIG_METHOD_KEYPAD)
832 peer->config_methods |= WFD_OEM_WPS_MODE_KEYPAD;
833 WDP_LOGD("Config method [0x%x]", peer->config_methods);
835 } else if (g_strcmp0(key, "level") == 0) {
838 g_variant_get(value, "i", &rssi);
840 WDP_LOGD("Peer RSSI [%d]", peer->rssi);
842 } else if (g_strcmp0(key, "devicecapability") == 0) {
843 unsigned char devicecapability = 0;
845 g_variant_get(value, "y", &devicecapability);
846 peer->dev_flags = (int)devicecapability;
847 WDP_LOGD("Device Capa [0x%02x]", peer->dev_flags);
849 } else if (g_strcmp0(key, "groupcapability") == 0) {
850 unsigned char groupcapability = 0;
852 g_variant_get(value, "y", &groupcapability);
853 WDP_LOGD("Group Capa [0x%02x]", groupcapability);
854 if (groupcapability & WS_GROUP_CAP_GROUP_OWNER) {
855 peer->group_flags = WFD_OEM_GROUP_FLAG_GROUP_OWNER;
856 peer->dev_role = WFD_OEM_DEV_ROLE_GO;
858 if (groupcapability & WS_GROUP_CAP_PERSISTENT_GROUP)
859 peer->group_flags = WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
861 } else if (g_strcmp0(key, "PrimaryDeviceType") == 0) {
862 unsigned char primarydevicetype[WS_DEVTYPE_LEN] = {0,};
864 if (__ws_unpack_ay(primarydevicetype, value, WS_DEVTYPE_LEN)) {
865 peer->pri_dev_type = primarydevicetype[1];
866 peer->sec_dev_type = primarydevicetype[WS_DEVTYPE_LEN -1];
868 } else if (g_strcmp0(key, "SecondaryDeviceTypes") == 0) {
869 } else if (g_strcmp0(key, "VendorExtension") == 0) {
870 } else if (g_strcmp0(key, "IEs") == 0) {
871 unsigned char ies[WFD_SUBELEM_LEN_DEV_INFO + 3] = {0,};
873 if (__ws_unpack_ay(ies, value, WFD_SUBELEM_LEN_DEV_INFO + 3))
874 __parsing_wfd_info(ies, &(peer->display));
875 } else if (g_strcmp0(key, "DeviceAddress") == 0) {
877 if (__ws_unpack_ay(peer->p2p_dev_addr, value, WS_MACADDR_LEN))
878 WDP_LOGD("Device address [" MACSTR "]", MAC2STR(peer->p2p_dev_addr));
880 } else if (g_strcmp0(key, "InterfaceAddress") == 0) {
882 if (__ws_unpack_ay(peer->p2p_intf_addr, value, WS_MACADDR_LEN))
883 WDP_LOGD("Interface Address [" MACSTR "]", MAC2STR(peer->p2p_intf_addr));
885 } else if (g_strcmp0(key, "GODeviceAddress") == 0) {
887 unsigned char go_dev_addr[OEM_MACADDR_LEN] = {0,};
888 if (__ws_unpack_ay(go_dev_addr, value, WS_MACADDR_LEN))
889 WDP_LOGD("[" MACSTR "]", MAC2STR(go_dev_addr));
891 if (!ISZEROMACADDR(go_dev_addr))
892 peer->dev_role = WFD_OEM_DEV_ROLE_GC;
894 } else if (g_strcmp0(key, "AdvertiseService") == 0) {
895 if (value != NULL && g_variant_get_size(value) != 0)
896 peer->has_asp_services = 1;
898 peer->has_asp_services = 0;
900 } else if (g_strcmp0(key, "AdvertiseASPService") == 0) {
901 if (value != NULL && g_variant_get_size(value) != 0)
902 peer->has_asp2_services = 1;
904 peer->has_asp2_services = 0;
906 } else if (g_strcmp0(key, "VSIE") == 0) {
908 unsigned char vsie[OEM_VSIE_MAX_LEN] = {0,};
910 vsie_len = __ws_unpack_ay(vsie, value, OEM_VSIE_MAX_LEN);
912 __ws_byte_to_txt(vsie, (char **)&(peer->vsie), vsie_len);
913 WDP_LOGD("VSIE [%s]", peer->vsie);
917 WDP_LOGD("Unknown value");
919 __WDP_LOG_FUNC_EXIT__;
923 void __ws_interface_property(const char *key, GVariant *value, void *user_data)
925 __WDP_LOG_FUNC_ENTER__;
926 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
930 CHECK_KEY_VALUE(key, value);
932 if (g_strcmp0(key, "Ifname") == 0) {
933 const char *ifname = NULL;
935 g_variant_get(value, "&s", &ifname);
936 g_strlcpy(event->ifname, ifname, OEM_IFACE_NAME_LEN+1);
937 WDP_LOGD("Ifname [%s]", event->ifname);
940 __WDP_LOG_FUNC_EXIT__;
944 void __ws_group_property(const char *key, GVariant *value, void *user_data)
946 __WDP_LOG_FUNC_ENTER__;
947 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
948 if (!event || !event->edata)
951 wfd_oem_group_data_s *group = (wfd_oem_group_data_s *)event->edata;
953 CHECK_KEY_VALUE(key, value);
955 if (g_strcmp0(key, "Role") == 0) {
956 const char *role = NULL;
958 g_variant_get(value, "&s", &role);
959 WDP_LOGD("Role [%s]", role);
961 if (!strncmp(role, "GO", 2))
962 event->dev_role = WFD_OEM_DEV_ROLE_GO;
963 else if (!strncmp(role, "client", 6))
964 event->dev_role = WFD_OEM_DEV_ROLE_GC;
966 } else if (g_strcmp0(key, "Frequency") == 0) {
969 g_variant_get(value, "q", &frequency);
970 group->freq = (int)frequency;
972 } else if (g_strcmp0(key, "Passphrase") == 0) {
973 const char *passphrase = NULL;
975 g_variant_get(value, "&s", &passphrase);
976 g_strlcpy(group->pass, passphrase, OEM_PASS_PHRASE_LEN+1);
977 WDP_LOGD("passphrase [%s]", group->pass);
979 } else if (g_strcmp0(key, "Group") == 0) {
981 } else if (g_strcmp0(key, "SSID") == 0) {
982 unsigned char ssid[WS_SSID_LEN +1] = {0,};
984 __ws_unpack_ay(ssid, value, WS_SSID_LEN);
985 memcpy(group->ssid, ssid, WS_SSID_LEN+1);
986 WDP_LOGD("ssid [%s]", group->ssid);
988 } else if (g_strcmp0(key, "BSSID") == 0) {
990 if (__ws_unpack_ay(group->go_dev_addr, value, WS_MACADDR_LEN))
991 WDP_LOGD("[" MACSTR "]", MAC2STR(group->go_dev_addr));
994 WDP_LOGD("Unknown value");
996 __WDP_LOG_FUNC_EXIT__;
1000 void __ws_extract_invitation_details(const char *key, GVariant *value, void *user_data)
1002 __WDP_LOG_FUNC_ENTER__;
1003 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1004 if (!event || !event->edata)
1007 wfd_oem_invite_data_s *invitation = (wfd_oem_invite_data_s *)event->edata;
1009 CHECK_KEY_VALUE(key, value);
1011 if (g_strcmp0(key, "sa") == 0) {
1012 if (__ws_unpack_ay(invitation->sa, value, WS_MACADDR_LEN))
1013 WDP_LOGD("SA [" MACSTR "]", MAC2STR(invitation->sa));
1015 } else if (g_strcmp0(key, "go_dev_addr") == 0) {
1016 if (__ws_unpack_ay(invitation->go_dev_addr, value, WS_MACADDR_LEN))
1017 WDP_LOGD("GO device address [" MACSTR "]", MAC2STR(invitation->go_dev_addr));
1019 } else if (g_strcmp0(key, "bssid") == 0) {
1020 if (__ws_unpack_ay(invitation->bssid, value, WS_MACADDR_LEN))
1021 WDP_LOGD("BSSID [" MACSTR "]", MAC2STR(invitation->bssid));
1023 } else if (g_strcmp0(key, "persistent_id") == 0) {
1024 g_variant_get(value, "i", &(invitation->persistent_id));
1025 WDP_LOGD("persistent id [%d]", invitation->persistent_id);
1027 } else if (g_strcmp0(key, "op_freq") == 0) {
1028 g_variant_get(value, "i", &(invitation->oper_freq));
1029 WDP_LOGD("op freq [%d]", invitation->oper_freq);
1031 WDP_LOGD("Unknown value");
1033 __WDP_LOG_FUNC_EXIT__;
1037 static void __ws_parse_peer_joined(char *peer_path,
1038 unsigned char *dev_addr, unsigned char *ip_addr, GVariant *parameter)
1040 __WDP_LOG_FUNC_ENTER__;
1043 gboolean iter_res = TRUE;
1044 const char *path = NULL;
1047 g_variant_get(parameter, "(&oay)", &path, &iter);
1048 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
1049 WDP_LOGD("Retrive Added path [%s]", peer_path);
1051 __extract_addr_from_path(peer_path, dev_addr);
1053 for (i = 0; iter_res && i < OEM_IPADDR_LEN; i++)
1054 iter_res = g_variant_iter_loop(iter, "y", &ip_addr[i]);
1055 g_variant_iter_free(iter);
1057 WDP_LOGD("peer ip [" IPSTR "]", IP2STR(ip_addr));
1059 __WDP_LOG_FUNC_EXIT__;
1063 static gboolean __is_valid_plugin(void)
1065 gboolean is_valid = (g_pd && g_pd->callback);
1068 WDP_LOGD("Ignoring event");
1073 static wfd_oem_dev_data_s *__create_dev_data(void)
1075 wfd_oem_dev_data_s *dev_data =
1076 (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
1078 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
1079 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1080 WDP_LOGF("Failed to allocate memory for event. [%s]",
1087 static void __set_event_data(int event_id, int edata_type, void *data, wfd_oem_event_s *event)
1092 memset(event, 0x0, sizeof(wfd_oem_event_s));
1094 event->edata = data;
1095 event->edata_type = edata_type;
1096 event->event_id = event_id;
1101 static void __destroy_dev_data(wfd_oem_dev_data_s *dev_data)
1107 g_free(dev_data->vsie);
1111 static void _ws_process_peer_joined(GDBusConnection *connection,
1112 const gchar *sender, const gchar *object_path, const gchar *interface,
1113 const gchar *signal, GVariant *parameters, gpointer user_data)
1115 __WDP_LOG_FUNC_ENTER__;
1116 wfd_oem_event_s event;
1117 wfd_oem_dev_data_s *dev_data = NULL;
1118 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1120 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
1122 if (!__is_valid_plugin())
1125 dev_data = __create_dev_data();
1127 __WDP_LOG_FUNC_EXIT__;
1131 __set_event_data(WFD_OEM_EVENT_STA_CONNECTED,
1132 WFD_OEM_EDATA_TYPE_DEVICE,
1136 __ws_parse_peer_joined(peer_path, event.dev_addr, event.ip_addr_peer, parameters);
1138 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
1139 __ws_peer_property, event.edata);
1141 if (g_pd->callback->sta_connected_cb)
1142 g_pd->callback->sta_connected_cb(&event);
1144 is_peer_joined_notified = 1;
1146 __destroy_dev_data(dev_data);
1148 __WDP_LOG_FUNC_EXIT__;
1151 static void _ws_process_peer_disconnected(GDBusConnection *connection,
1152 const gchar *sender, const gchar *object_path, const gchar *interface,
1153 const gchar *signal, GVariant *parameters, gpointer user_data)
1155 __WDP_LOG_FUNC_ENTER__;
1156 wfd_oem_event_s event;
1157 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1159 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
1161 if (!g_pd || !g_pd->callback) {
1162 WDP_LOGD("Ignoring event");
1163 __WDP_LOG_FUNC_EXIT__;
1167 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1169 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
1170 event.event_id = WFD_OEM_EVENT_STA_DISCONNECTED;
1172 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
1174 if (g_pd->callback->sta_disconnected_cb)
1175 g_pd->callback->sta_disconnected_cb(&event);
1177 is_peer_disconnected_notified = 1;
1178 __WDP_LOG_FUNC_EXIT__;
1183 const char *interface;
1185 void (*function) (GDBusConnection *connection,
1186 const gchar *sender, const gchar *object_path, const gchar *interface,
1187 const gchar *signal, GVariant *parameters, gpointer user_data);
1188 } ws_group_signal_map[] = {
1191 SUPPLICANT_P2P_GROUP,
1193 _ws_process_peer_joined
1197 SUPPLICANT_P2P_GROUP,
1199 _ws_process_peer_disconnected
1209 void __ws_extract_group_details(const char *key, GVariant *value, void *user_data)
1211 __WDP_LOG_FUNC_ENTER__;
1212 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1213 if (!event || !event->edata)
1217 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
1218 __WDP_LOG_FUNC_EXIT__;
1222 wfd_oem_group_data_s *group = (wfd_oem_group_data_s *)event->edata;
1224 CHECK_KEY_VALUE(key, value);
1226 if (g_strcmp0(key, "interface_object") == 0) {
1227 static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1228 const char *i_path = NULL;
1230 g_variant_get(value, "&o", &i_path);
1231 g_strlcpy(interface_path, i_path, DBUS_OBJECT_PATH_MAX);
1232 WDP_LOGD("Retrive Added path [%s]", interface_path);
1233 g_strlcpy(g_pd->group_iface_path, interface_path, DBUS_OBJECT_PATH_MAX);
1234 dbus_property_get_all(interface_path, g_pd->g_dbus,
1235 SUPPLICANT_IFACE, __ws_interface_property, event);
1237 } else if (g_strcmp0(key, "role") == 0) {
1238 const char *role = NULL;
1240 g_variant_get(value, "&s", &role);
1241 WDP_LOGD("Role [%s]", role);
1243 if (!strncmp(role, "GO", 2))
1244 event->dev_role = WFD_OEM_DEV_ROLE_GO;
1245 else if (!strncmp(role, "client", 6))
1246 event->dev_role = WFD_OEM_DEV_ROLE_GC;
1247 } else if (g_strcmp0(key, "persistent") == 0) {
1248 g_variant_get(value, "b", &group->is_persistent);
1249 WDP_LOGD("Is Persistent : [%s]", group->is_persistent ? "YES" : "NO");
1251 } else if (g_strcmp0(key, "IpAddr") == 0) {
1253 if (__ws_unpack_ay(group->ip_addr, value, OEM_IPADDR_LEN))
1254 WDP_LOGD("IP address [" IPSTR "]", IP2STR(group->ip_addr));
1256 } else if (g_strcmp0(key, "IpAddrMask") == 0) {
1258 if (__ws_unpack_ay(group->ip_addr_mask, value, OEM_IPADDR_LEN))
1259 WDP_LOGD("IP mask [" IPSTR "]", IP2STR(group->ip_addr_mask));
1261 } else if (g_strcmp0(key, "IpAddrGo") == 0) {
1263 if (__ws_unpack_ay(group->ip_addr_go, value, OEM_IPADDR_LEN))
1264 WDP_LOGD("GO IP address [" IPSTR "]", IP2STR(group->ip_addr_go));
1265 } else if (g_strcmp0(key, "group_object") == 0) {
1266 static char group_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1270 g_variant_get(value, "&o", &g_path);
1271 g_strlcpy(group_path, g_path, DBUS_OBJECT_PATH_MAX);
1272 WDP_LOGD("Retrive group path [%s]", group_path);
1273 dbus_property_get_all(group_path, g_pd->g_dbus, SUPPLICANT_P2P_GROUP,
1274 __ws_group_property, event);
1276 for (i = 0; ws_group_signal_map[i].member != NULL; i++) {
1277 ws_group_signal_map[i].sub_id =
1278 g_dbus_connection_signal_subscribe(g_pd->g_dbus,
1279 SUPPLICANT_SERVICE, /* bus name */
1280 ws_group_signal_map[i].interface, /* interface */
1281 ws_group_signal_map[i].member, /* member */
1282 group_path, /* object path */
1284 G_DBUS_SIGNAL_FLAGS_NONE,
1285 ws_group_signal_map[i].function,
1287 WDP_LOGD("Subscribed Group iface signal [%s]", ws_group_signal_map[i].member);
1290 __WDP_LOG_FUNC_EXIT__;
1294 void __ws_extract_gonegfailaure_details(const char *key, GVariant *value, void *user_data)
1296 __WDP_LOG_FUNC_ENTER__;
1297 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1298 if (!event || !event->edata)
1301 wfd_oem_conn_data_s *conn = (wfd_oem_conn_data_s *)event->edata;
1303 CHECK_KEY_VALUE(key, value);
1305 if (g_strcmp0(key, "peer_object") == 0) {
1306 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1309 g_variant_get(value, "&o", &path);
1310 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
1311 WDP_LOGD("Retrive peer path [%s]", peer_path);
1313 } else if (g_strcmp0(key, "status") == 0) {
1316 g_variant_get(value, "i", &status);
1317 WDP_LOGD("Retrive status [%d]", status);
1318 conn->status = status;
1320 __WDP_LOG_FUNC_EXIT__;
1324 void __ws_extract_gonegsuccess_details(const char *key, GVariant *value, void *user_data)
1326 __WDP_LOG_FUNC_ENTER__;
1327 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1328 if (!event || !event->edata)
1331 wfd_oem_conn_data_s *edata = (wfd_oem_conn_data_s *)event->edata;
1333 CHECK_KEY_VALUE(key, value);
1335 if (g_strcmp0(key, "peer_object") == 0) {
1337 } else if (g_strcmp0(key, "status") == 0) {
1339 } else if (g_strcmp0(key, "passphrase") == 0) {
1341 } else if (g_strcmp0(key, "role_go") == 0) {
1342 /* local device role */
1343 const char *role = NULL;
1345 g_variant_get(value, "&s", &role);
1346 if (!strncmp(role, "GO", 2))
1347 event->dev_role = WFD_OEM_DEV_ROLE_GO;
1348 else if (!strncmp(role, "client", 6))
1349 event->dev_role = WFD_OEM_DEV_ROLE_GC;
1351 } else if (g_strcmp0(key, "ssid") == 0) {
1352 unsigned char ssid[WS_SSID_LEN +1] = {0,};
1354 __ws_unpack_ay(ssid, value, WS_SSID_LEN);
1355 memcpy(edata->ssid, ssid, WS_SSID_LEN+1);
1356 WDP_LOGD("ssid [%s]", edata->ssid);
1358 } else if (g_strcmp0(key, "peer_device_addr") == 0) {
1360 if (__ws_unpack_ay(edata->peer_device_addr, value, WS_MACADDR_LEN))
1361 WDP_LOGD("Device address[" MACSTR "]", MAC2STR(edata->peer_device_addr));
1363 } else if (g_strcmp0(key, "peer_interface_addr") == 0) {
1365 if (__ws_unpack_ay(edata->peer_intf_addr, value, WS_MACADDR_LEN))
1366 WDP_LOGD("Interface address [" MACSTR "]", MAC2STR(edata->peer_intf_addr));
1368 } else if (g_strcmp0(key, "wps_method") == 0) {
1370 } else if (g_strcmp0(key, "frequency_list") == 0) {
1372 } else if (g_strcmp0(key, "persistent_group") == 0) {
1374 g_variant_get(value, "i", &(edata->persistent_group));
1375 WDP_LOGD("persistent_group [%d]", edata->persistent_group);
1377 } else if (g_strcmp0(key, "peer_config_timeout") == 0) {
1380 __WDP_LOG_FUNC_EXIT__;
1384 void __ws_extract_peer_service(wfd_oem_event_s *data, unsigned char *service_hex, int tlvs_len)
1386 GList *services = NULL;
1387 wfd_oem_new_service_s *new_service = NULL;
1388 char *segment = NULL;
1394 while (ptr + 2 < WS_MAX_SERVICE_LEN &&
1395 (length = (service_hex[ptr+1]*256) + service_hex[ptr]) > 0) {
1396 segment = (char*) g_try_malloc0(length*2+1);
1398 __ws_byte_to_hex(segment, length * 2 + 1, &service_hex[ptr + 3], length);
1399 res = __ws_segment_to_service(segment, &new_service);
1401 WDP_LOGE("Failed to convert segment as service instance");
1406 services = g_list_append(services, new_service);
1412 data->edata_type = WFD_OEM_EDATA_TYPE_NEW_SERVICE;
1413 data->dev_role = count;
1414 data->edata = (void*) services;
1418 void __ws_extract_servicediscoveryresponse_details(const char *key, GVariant *value, void *user_data)
1420 __WDP_LOG_FUNC_ENTER__;
1421 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1426 CHECK_KEY_VALUE(key, value);
1428 if (g_strcmp0(key, "peer_object") == 0) {
1429 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1430 const char *path = NULL;
1433 g_variant_get(value, "&o", &path);
1437 WDP_LOGD("Retrive Added path [%s]", path);
1438 loc = strrchr(path, '/');
1440 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1441 __ws_txt_to_mac(peer_dev, event->dev_addr);
1443 } else if (g_strcmp0(key, "update_indicator") == 0) {
1445 } else if (g_strcmp0(key, "tlvs") == 0) {
1446 GVariantIter *iter = NULL;
1447 unsigned char service_hex[WS_MAX_SERVICE_LEN];
1448 int byte_length = 0;
1450 g_variant_get(value, "ay", &iter);
1452 WDP_LOGE("failed to get iterator");
1456 memset(service_hex, 0x0, WS_MAX_SERVICE_LEN);
1457 while (g_variant_iter_loop(iter, "y", &service_hex[byte_length]))
1459 g_variant_iter_free(iter);
1461 __ws_extract_peer_service(event, service_hex, byte_length);
1464 __WDP_LOG_FUNC_EXIT__;
1467 static void __ws_extract_serviceaspresponse_details(const char *key, GVariant *value, void *user_data)
1469 __WDP_LOG_FUNC_ENTER__;
1470 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1471 if (!event || !event->edata)
1474 wfd_oem_asp_service_s *service = (wfd_oem_asp_service_s *)event->edata;
1476 if (g_strcmp0(key, "peer_object") == 0) {
1477 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1478 const char *path = NULL;
1481 g_variant_get(value, "&o", &path);
1485 WDP_LOGD("Retrive Added path [%s]", path);
1486 loc = strrchr(path, '/');
1488 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1489 __ws_txt_to_mac(peer_dev, event->dev_addr);
1491 } else if (g_strcmp0(key, "srv_trans_id") == 0) {
1492 unsigned int srv_trans_id = 0;
1493 g_variant_get(value, "u", &srv_trans_id);
1494 service->tran_id = srv_trans_id;
1495 WDP_LOGD("Retrive srv_trans_id [%x]", service->tran_id);
1497 } else if (g_strcmp0(key, "adv_id") == 0) {
1498 unsigned int adv_id = 0;
1499 g_variant_get(value, "u", &adv_id);
1500 service->adv_id = adv_id;
1501 WDP_LOGD("Retrive adv_id [%x]", service->adv_id);
1503 } else if (g_strcmp0(key, "svc_status") == 0) {
1504 unsigned char svc_status = 0;
1505 g_variant_get(value, "u", &svc_status);
1506 service->status = svc_status;
1507 WDP_LOGD("Retrive svc_status [%x]", service->status);
1509 } else if (g_strcmp0(key, "config_methods") == 0) {
1510 unsigned int config_methods = 0;
1511 g_variant_get(value, "q", &config_methods);
1512 service->config_method = config_methods;
1513 WDP_LOGD("Retrive config_methods [%x]", service->config_method);
1515 } else if (g_strcmp0(key, "svc_str") == 0) {
1516 const char *svc_str = NULL;
1517 g_variant_get(value, "&s", &svc_str);
1518 if (svc_str != NULL)
1519 service->service_type = g_strdup(svc_str);
1520 WDP_LOGD("Retrive srv_name [%s]", service->service_type);
1522 } else if (g_strcmp0(key, "info") == 0) {
1523 const char *info = NULL;
1524 g_variant_get(value, "&s", &info);
1526 service->service_info = g_strdup(info);
1527 WDP_LOGD("Retrive srv_info [%s]", service->service_info);
1529 __WDP_LOG_FUNC_EXIT__;
1532 static void __ws_extract_asp_provision_start_details(const char *key, GVariant *value, void *user_data)
1534 __WDP_LOG_FUNC_ENTER__;
1535 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1536 wfd_oem_asp_prov_s *asp_params = NULL;
1537 if (!event || !event->edata) {
1538 __WDP_LOG_FUNC_EXIT__;
1542 asp_params = (wfd_oem_asp_prov_s *)event->edata;
1544 if (g_strcmp0(key, "peer_object") == 0) {
1545 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1546 const char *path = NULL;
1549 g_variant_get(value, "&o", &path);
1551 __WDP_LOG_FUNC_EXIT__;
1555 WDP_LOGD("Retrive Added path [%s]", path);
1556 loc = strrchr(path, '/');
1558 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1559 __ws_txt_to_mac(peer_dev, event->dev_addr);
1561 } else if (g_strcmp0(key, "adv_id") == 0) {
1562 g_variant_get(value, "u", &asp_params->adv_id);
1563 WDP_LOGD("Retrive adv_id [%u]", asp_params->adv_id);
1565 } else if (g_strcmp0(key, "ses_id") == 0) {
1566 g_variant_get(value, "u", &asp_params->session_id);
1567 WDP_LOGD("Retrive session id [%u]", asp_params->session_id);
1569 } else if (g_strcmp0(key, "dev_passwd_id") == 0) {
1570 g_variant_get(value, "i", &event->wps_mode);
1571 WDP_LOGD("Retrive dev_passwd_id [%d]", event->wps_mode);
1573 } else if (g_strcmp0(key, "conncap") == 0) {
1574 g_variant_get(value, "u", &asp_params->network_role);
1575 WDP_LOGD("Retrive conncap [%x]", asp_params->network_role);
1577 } else if (g_strcmp0(key, "adv_mac") == 0) {
1578 if (__ws_unpack_ay(asp_params->service_mac, value, WS_MACADDR_LEN))
1579 WDP_LOGD("Adv address[" MACSTR "]", MAC2STR(asp_params->service_mac));
1581 } else if (g_strcmp0(key, "ses_mac") == 0) {
1582 if (__ws_unpack_ay(asp_params->session_mac, value, WS_MACADDR_LEN))
1583 WDP_LOGD("session address[" MACSTR "]", MAC2STR(asp_params->session_mac));
1585 } else if (g_strcmp0(key, "session_info") == 0) {
1586 const char *session_info = NULL;
1587 g_variant_get(value, "&s", &session_info);
1588 if (session_info != NULL)
1589 asp_params->session_information = g_strdup(session_info);
1590 WDP_LOGD("Retrive session_info [%s]", asp_params->session_information);
1592 __WDP_LOG_FUNC_EXIT__;
1595 static void __ws_extract_asp_provision_done_details(const char *key, GVariant *value, void *user_data)
1597 __WDP_LOG_FUNC_ENTER__;
1598 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1599 wfd_oem_asp_prov_s *asp_params = NULL;
1600 if (!event || !event->edata) {
1601 __WDP_LOG_FUNC_EXIT__;
1605 asp_params = (wfd_oem_asp_prov_s *)event->edata;
1608 if (g_strcmp0(key, "peer_object") == 0) {
1609 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1610 const char *path = NULL;
1613 g_variant_get(value, "&o", &path);
1615 __WDP_LOG_FUNC_EXIT__;
1619 WDP_LOGD("Retrive Added path [%s]", path);
1620 loc = strrchr(path, '/');
1622 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1623 __ws_txt_to_mac(peer_dev, event->dev_addr);
1625 WDP_LOGD("peer address[" MACSTR "]", MAC2STR(event->dev_addr));
1627 } else if (g_strcmp0(key, "adv_id") == 0) {
1628 g_variant_get(value, "u", &asp_params->adv_id);
1629 WDP_LOGD("Retrive adv_id [%u]", asp_params->adv_id);
1631 } else if (g_strcmp0(key, "ses_id") == 0) {
1632 g_variant_get(value, "u", &asp_params->session_id);
1633 WDP_LOGD("Retrive session id [%u]", asp_params->session_id);
1635 } else if (g_strcmp0(key, "dev_passwd_id") == 0) {
1636 g_variant_get(value, "i", &event->wps_mode);
1637 WDP_LOGD("Retrive dev_passwd_id [%d]", event->wps_mode);
1639 } else if (g_strcmp0(key, "conncap") == 0) {
1640 g_variant_get(value, "u", &asp_params->network_role);
1641 WDP_LOGD("Retrive network role [%x]", asp_params->network_role);
1643 } else if (g_strcmp0(key, "status") == 0) {
1644 g_variant_get(value, "u", &asp_params->status);
1645 WDP_LOGD("Retrive status [%x]", asp_params->status);
1647 } else if (g_strcmp0(key, "persist") == 0) {
1648 g_variant_get(value, "u", &asp_params->persistent_group_id);
1649 asp_params->persist = 1;
1650 WDP_LOGD("Retrive persist [%u]", asp_params->persistent_group_id);
1652 } else if (g_strcmp0(key, "adv_mac") == 0) {
1653 if (__ws_unpack_ay(asp_params->service_mac, value, WS_MACADDR_LEN))
1654 WDP_LOGD("Adv address[" MACSTR "]", MAC2STR(asp_params->service_mac));
1656 } else if (g_strcmp0(key, "ses_mac") == 0) {
1657 if (__ws_unpack_ay(asp_params->session_mac, value, WS_MACADDR_LEN))
1658 WDP_LOGD("session address[" MACSTR "]", MAC2STR(asp_params->session_mac));
1660 } else if (g_strcmp0(key, "group_mac") == 0) {
1661 if (__ws_unpack_ay(asp_params->group_mac, value, WS_MACADDR_LEN))
1662 WDP_LOGD("group address[" MACSTR "]", MAC2STR(asp_params->group_mac));
1664 __WDP_LOG_FUNC_EXIT__;
1667 static void __ws_extract_provision_fail_details(const char *key, GVariant *value, void *user_data)
1669 __WDP_LOG_FUNC_ENTER__;
1670 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1671 wfd_oem_asp_prov_s *asp_params = NULL;
1672 if (!event || !event->edata) {
1673 __WDP_LOG_FUNC_EXIT__;
1677 asp_params = (wfd_oem_asp_prov_s *)event->edata;
1679 if (g_strcmp0(key, "peer_object") == 0) {
1680 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1681 const char *path = NULL;
1684 g_variant_get(value, "&o", &path);
1686 __WDP_LOG_FUNC_EXIT__;
1690 WDP_LOGD("Retrive Added path [%s]", path);
1691 loc = strrchr(path, '/');
1693 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1694 __ws_txt_to_mac(peer_dev, event->dev_addr);
1696 } else if (g_strcmp0(key, "adv_id") == 0) {
1697 g_variant_get(value, "u", &asp_params->adv_id);
1698 WDP_LOGD("Retrive adv_id [%d]", asp_params->adv_id);
1700 } else if (g_strcmp0(key, "status") == 0) {
1701 g_variant_get(value, "i", &asp_params->status);
1702 WDP_LOGD("Retrive status [%d]", asp_params->status);
1704 } else if (g_strcmp0(key, "deferred_session_resp") == 0) {
1705 const char *session_info = NULL;
1706 g_variant_get(value, "&s", &session_info);
1707 if (session_info != NULL)
1708 asp_params->session_information = g_strdup(session_info);
1709 WDP_LOGD("Retrive deferred_session_resp [%s]", asp_params->session_information);
1711 __WDP_LOG_FUNC_EXIT__;
1714 static int _ws_flush(void)
1716 __WDP_LOG_FUNC_ENTER__;
1717 GDBusConnection *g_dbus = NULL;
1718 dbus_method_param_s params;
1722 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
1723 __WDP_LOG_FUNC_EXIT__;
1727 g_dbus = g_pd->g_dbus;
1729 WDP_LOGE("DBus connection is NULL");
1730 __WDP_LOG_FUNC_EXIT__;
1733 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
1735 dbus_set_method_param(¶ms, "Flush", g_pd->iface_path, g_dbus);
1736 params.params = NULL;
1738 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
1740 WDP_LOGE("Failed to send command to wpa_supplicant");
1742 WDP_LOGD("Succeeded to flush");
1744 __WDP_LOG_FUNC_EXIT__;
1748 static int _ws_cancel(void)
1750 __WDP_LOG_FUNC_ENTER__;
1751 GDBusConnection *g_dbus = NULL;
1752 dbus_method_param_s params;
1756 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
1757 __WDP_LOG_FUNC_EXIT__;
1762 g_dbus = g_pd->g_dbus;
1764 WDP_LOGE("DBus connection is NULL");
1765 __WDP_LOG_FUNC_EXIT__;
1768 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
1770 dbus_set_method_param(¶ms, "Cancel", g_pd->iface_path , g_dbus);
1771 params.params = NULL;
1773 res = dbus_method_call(¶ms, SUPPLICANT_WPS, NULL, NULL);
1775 WDP_LOGE("Failed to send command to wpa_supplicant");
1777 WDP_LOGD("Succeeded to cancel");
1779 __WDP_LOG_FUNC_EXIT__;
1783 int ws_get_advertise_service(const char *peer_path, GList **asp_services)
1785 __WDP_LOG_FUNC_ENTER__;
1786 GDBusConnection *g_dbus = NULL;
1787 GVariant *param = NULL;
1788 GVariant *reply = NULL;
1789 GVariant *temp1 = NULL;
1790 GVariant *temp2 = NULL;
1791 GError *error = NULL;
1792 GVariantIter *iter = NULL;
1793 wfd_oem_advertise_service_s *service;
1794 wfd_oem_asp_service_s *seek = NULL;
1795 unsigned char desc[7];
1796 unsigned int adv_id;
1797 unsigned int config_method;
1798 unsigned char length;
1804 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
1808 g_dbus = g_pd->g_dbus;
1810 WDP_LOGE("DBus connection is NULL");
1814 param = g_variant_new("(ss)", SUPPLICANT_P2P_PEER, "AdvertiseService");
1815 DEBUG_G_VARIANT("Params : ", param);
1817 reply = g_dbus_connection_call_sync(
1819 SUPPLICANT_SERVICE, /* bus name */
1820 peer_path, /* object path */
1821 DBUS_PROPERTIES_INTERFACE, /* interface name */
1822 DBUS_PROPERTIES_METHOD_GET, /* method name */
1823 param, /* GVariant *params */
1824 NULL, /* reply_type */
1825 G_DBUS_CALL_FLAGS_NONE, /* flags */
1826 SUPPLICANT_TIMEOUT , /* timeout */
1827 NULL, /* cancellable */
1828 &error); /* error */
1830 if (error != NULL) {
1831 WDP_LOGE("Error! Failed to get peer advertise service: [%s]",
1833 g_error_free(error);
1835 g_variant_unref(reply);
1836 __WDP_LOG_FUNC_EXIT__;
1840 if (reply != NULL) {
1841 DEBUG_G_VARIANT("Reply : ", reply);
1843 /* replay will have the format <(<ay>,)>
1844 * So, you need to remove tuple out side of variant and
1845 * variant out side of byte array
1847 temp1 = g_variant_get_child_value(reply, 0);
1848 temp2 = g_variant_get_child_value(temp1, 0);
1849 g_variant_get(temp2, "ay", &iter);
1851 g_variant_unref(reply);
1852 WDP_LOGE("Failed to get iterator");
1855 g_variant_unref(temp2);
1856 g_variant_unref(temp1);
1859 /* 4byte advertisement ID, 2 byte config method, 1byte length */
1862 memset(desc, 0x0, 7);
1863 while (cnt < 7 && g_variant_iter_loop(iter, "y", &desc[cnt]))
1866 if (cnt != 7 || desc[6] == 0) {
1867 WDP_LOGE("Invalid descriptor header length cnt [%d]", cnt);
1868 g_variant_unref(reply);
1872 adv_id = desc[3] << 24 | desc[2] << 16 | desc[1] << 8 | desc[0];
1873 config_method = desc[4] << 8 | desc[4];
1876 value = g_try_malloc0(length + 1);
1877 if (value == NULL) {
1878 WDP_LOGE("g_try_malloc0 failed");
1879 g_variant_unref(reply);
1882 WDP_LOGD("adv_id[%u] config_method[%u] length[%hhu]", adv_id, config_method, length);
1885 while (cnt < length && g_variant_iter_loop(iter, "y", &value[cnt]))
1888 if (cnt != length) {
1889 WDP_LOGE("Length doesn't matched with header value cnt [%d]", cnt);
1890 g_variant_unref(reply);
1896 service = (wfd_oem_advertise_service_s *)
1897 g_try_malloc0(sizeof(wfd_oem_advertise_service_s));
1898 if (service == NULL) {
1899 WDP_LOGE("g_try_malloc0 failed");
1900 g_variant_unref(reply);
1904 service->adv_id = adv_id;
1905 service->config_method = config_method;
1906 service->service_type_length = length;
1907 service->service_type = value;
1909 GLIST_ITER_START(seek_list, seek)
1910 if (g_strcmp0(seek->service_type, service->service_type) == 0) {
1911 WDP_LOGD("service type matched [%s] search_id [%llu]",
1912 service->service_type, seek->search_id);
1918 if (seek != NULL && seek->service_info != NULL) {
1919 WDP_LOGD("service info exists, service discovery will be performed");
1921 WDP_LOGD("service info doesn't exists. Add service to list");
1923 service->search_id = seek->search_id;
1924 *asp_services = g_list_append(*asp_services, service);
1927 g_variant_unref(reply);
1929 __WDP_LOG_FUNC_EXIT__;
1934 int ws_get_advertise_asp_service(const char *peer_path, GList **asp_services)
1936 __WDP_LOG_FUNC_ENTER__;
1937 GDBusConnection *g_dbus = NULL;
1938 GVariant *param = NULL;
1939 GVariant *reply = NULL;
1940 GVariant *temp1 = NULL;
1941 GVariant *temp2 = NULL;
1942 GError *error = NULL;
1943 GVariantIter *iter = NULL;
1944 wfd_oem_advertise_service_s *service;
1945 wfd_oem_asp_service_s *seek = NULL;
1946 unsigned char desc[7];
1947 unsigned int adv_id;
1948 unsigned int config_method;
1949 unsigned char length;
1950 char *service_type = NULL;
1951 char *instance_name = NULL;
1952 unsigned char instance_length = 0;
1957 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
1961 g_dbus = g_pd->g_dbus;
1963 WDP_LOGE("DBus connection is NULL");
1967 param = g_variant_new("(ss)", SUPPLICANT_P2P_PEER, "AdvertiseASPService");
1968 DEBUG_G_VARIANT("Params : ", param);
1970 reply = g_dbus_connection_call_sync(
1972 SUPPLICANT_SERVICE, /* bus name */
1973 peer_path, /* object path */
1974 DBUS_PROPERTIES_INTERFACE, /* interface name */
1975 DBUS_PROPERTIES_METHOD_GET, /* method name */
1976 param, /* GVariant *params */
1977 NULL, /* reply_type */
1978 G_DBUS_CALL_FLAGS_NONE, /* flags */
1979 SUPPLICANT_TIMEOUT , /* timeout */
1980 NULL, /* cancellable */
1981 &error); /* error */
1983 if (error != NULL) {
1984 WDP_LOGE("Error! Failed to get peer advertise service: [%s]",
1986 g_error_free(error);
1988 g_variant_unref(reply);
1989 __WDP_LOG_FUNC_EXIT__;
1993 if (reply != NULL) {
1994 DEBUG_G_VARIANT("Reply : ", reply);
1996 /* replay will have the format <(<ay>,)>
1997 * So, you need to remove tuple out side of variant and
1998 * variant out side of byte array
2000 temp1 = g_variant_get_child_value(reply, 0);
2001 temp2 = g_variant_get_child_value(temp1, 0);
2002 g_variant_get(temp2, "ay", &iter);
2004 g_variant_unref(reply);
2005 WDP_LOGE("Failed to get iterator");
2008 g_variant_unref(temp2);
2009 g_variant_unref(temp1);
2012 /* 4byte advertisement ID, 2 byte config method, 1byte length */
2015 memset(desc, 0x0, 7);
2016 while (cnt < 7 && g_variant_iter_loop(iter, "y", &desc[cnt]))
2019 if (cnt != 7 || desc[6] == 0) {
2020 WDP_LOGE("Invalid descriptor header length cnt [%d]", cnt);
2021 g_variant_unref(reply);
2025 adv_id = desc[3] << 24 | desc[2] << 16 | desc[1] << 8 | desc[0];
2026 config_method = desc[4] << 8 | desc[4];
2028 service_type = g_try_malloc0(length + 1);
2029 if (service_type == NULL) {
2030 WDP_LOGE("g_try_malloc0 failed");
2031 g_variant_unref(reply);
2034 WDP_LOGD("adv_id[%u] config_method[%u] length[%hhu]", adv_id, config_method, length);
2037 while (cnt < length + 1 && g_variant_iter_loop(iter, "y", &service_type[cnt]))
2040 if (cnt != length + 1) {
2041 WDP_LOGE("Length doesn't matched with header value cnt [%d]", cnt);
2042 g_variant_unref(reply);
2043 g_free(service_type);
2047 instance_length = (unsigned char)service_type[length];
2048 service_type[length] = '\0';
2050 if (instance_length != 0) {
2051 instance_name = g_try_malloc0(instance_length + 1);
2052 if (instance_name == NULL) {
2053 WDP_LOGE("g_try_malloc0 failed");
2054 g_variant_unref(reply);
2055 g_free(service_type);
2058 WDP_LOGD("instnace name length[%hhu]", instance_length);
2061 while (cnt < instance_length && g_variant_iter_loop(iter, "y", &instance_name[cnt]))
2064 if (cnt != instance_length) {
2065 WDP_LOGE("Length doesn't matched with header value cnt [%d]", cnt);
2066 g_variant_unref(reply);
2067 g_free(service_type);
2068 g_free(instance_name);
2074 service = (wfd_oem_advertise_service_s *)
2075 g_try_malloc0(sizeof(wfd_oem_advertise_service_s));
2076 if (service == NULL) {
2077 WDP_LOGE("g_try_malloc0 failed");
2078 g_variant_unref(reply);
2079 g_free(service_type);
2080 g_free(instance_name);
2083 service->adv_id = adv_id;
2084 service->config_method = config_method;
2085 service->service_type_length = length;
2086 service->service_type = service_type;
2087 service->instance_name_length = instance_length;
2088 service->instance_name = instance_name;
2090 GLIST_ITER_START(seek_list, seek)
2091 if (g_strcmp0(seek->service_type, service->service_type) == 0) {
2092 /* TODO: We need to support for instance name also hear */
2093 WDP_LOGD("service type matched [%s] search_id [%llu]",
2094 service->service_type, seek->search_id);
2100 if (seek != NULL && seek->service_info != NULL) {
2101 WDP_LOGD("service info exists, service discovery will be performed");
2103 WDP_LOGD("service info doesn't exists. Add service to list");
2105 service->search_id = seek->search_id;
2106 *asp_services = g_list_append(*asp_services, service);
2109 g_variant_unref(reply);
2111 __WDP_LOG_FUNC_EXIT__;
2115 static void _ws_process_device_found_properties(GDBusConnection *connection,
2116 const gchar *sender, const gchar *object_path, const gchar *interface,
2117 const gchar *signal, GVariant *parameters, gpointer user_data)
2119 __WDP_LOG_FUNC_ENTER__;
2120 wfd_oem_event_s event;
2121 wfd_oem_dev_data_s *dev_data = NULL;
2122 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2123 GVariantIter *iter = NULL;
2124 const char *path = NULL;
2126 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2128 if (!__is_valid_plugin())
2131 dev_data = __create_dev_data();
2133 __WDP_LOG_FUNC_EXIT__;
2137 __set_event_data(WFD_OEM_EVENT_PEER_FOUND,
2138 WFD_OEM_EDATA_TYPE_DEVICE,
2142 g_variant_get(parameters, "(&oa{sv})", &path, &iter);
2143 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
2144 WDP_LOGD("Retrive Added path [%s]", peer_path);
2146 __extract_addr_from_path(peer_path, event.dev_addr);
2150 GVariant *value = NULL;
2152 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
2153 CHECK_KEY_VALUE(key, value);
2155 __ws_peer_property(key, value, (void *)event.edata);
2157 g_variant_iter_free(iter);
2160 if (dev_data->has_asp_services)
2161 ws_get_advertise_service(peer_path, (GList **)&(event.asp_services));
2162 if (dev_data->has_asp2_services)
2163 ws_get_advertise_asp_service(peer_path, (GList **)&(event.asp2_services));
2165 if (g_pd->callback->peer_found_cb)
2166 g_pd->callback->peer_found_cb(&event);
2168 if (event.asp_services != NULL) {
2170 wfd_oem_advertise_service_s *service;
2171 for (l = (GList *)event.asp_services; l != NULL; l = l->next) {
2172 service = (wfd_oem_advertise_service_s *)l->data;
2173 event.asp_services = g_list_remove(l, service);
2174 g_free(service->service_type);
2178 if (event.asp2_services != NULL) {
2180 wfd_oem_advertise_service_s *service;
2181 for (l = (GList *)event.asp2_services; l != NULL; l = l->next) {
2182 service = (wfd_oem_advertise_service_s *)l->data;
2183 event.asp_services = g_list_remove(l, service);
2184 g_free(service->service_type);
2185 g_free(service->instance_name);
2190 __destroy_dev_data(dev_data);
2192 __WDP_LOG_FUNC_EXIT__;
2195 static void _ws_process_device_lost(GDBusConnection *connection,
2196 const gchar *sender, const gchar *object_path, const gchar *interface,
2197 const gchar *signal, GVariant *parameters, gpointer user_data)
2199 __WDP_LOG_FUNC_ENTER__;
2200 wfd_oem_event_s event;
2201 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2203 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2205 if (!g_pd || !g_pd->callback) {
2206 WDP_LOGD("Ignoring event");
2207 __WDP_LOG_FUNC_EXIT__;
2211 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2213 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2214 event.event_id = WFD_OEM_EVENT_PEER_DISAPPEARED;
2216 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
2218 if (g_pd->callback->peer_disappeared_cb)
2219 g_pd->callback->peer_disappeared_cb(&event);
2222 __WDP_LOG_FUNC_EXIT__;
2225 static void _ws_process_find_stoppped(GDBusConnection *connection,
2226 const gchar *sender, const gchar *object_path, const gchar *interface,
2227 const gchar *signal, GVariant *parameters, gpointer user_data)
2229 __WDP_LOG_FUNC_ENTER__;
2230 wfd_oem_event_s event;
2232 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2234 if (!g_pd || !g_pd->callback) {
2235 WDP_LOGD("Ignoring event");
2236 __WDP_LOG_FUNC_EXIT__;
2240 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2242 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2243 event.event_id = WFD_OEM_EVENT_DISCOVERY_FINISHED;
2245 if (g_pd->callback->discovery_finished_cb)
2246 g_pd->callback->discovery_finished_cb(&event);
2248 __WDP_LOG_FUNC_EXIT__;
2251 static void _ws_process_prov_disc_req_display_pin(GDBusConnection *connection,
2252 const gchar *sender, const gchar *object_path, const gchar *interface,
2253 const gchar *signal, GVariant *parameters, gpointer user_data)
2255 __WDP_LOG_FUNC_ENTER__;
2256 wfd_oem_event_s event;
2257 wfd_oem_dev_data_s *dev_data = NULL;
2258 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2259 const char *path = NULL;
2260 const char *pin = NULL;
2261 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2263 if (!__is_valid_plugin())
2266 dev_data = __create_dev_data();
2268 __WDP_LOG_FUNC_EXIT__;
2272 __set_event_data(WFD_OEM_EVENT_PROV_DISC_REQ,
2273 WFD_OEM_EDATA_TYPE_DEVICE,
2276 event.wps_mode = WFD_OEM_WPS_MODE_DISPLAY;
2278 g_variant_get(parameters, "(&o&s)", &path, &pin);
2279 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
2280 WDP_LOGD("Retrive Added path [%s]", peer_path);
2282 __extract_addr_from_path(peer_path, event.dev_addr);
2284 g_strlcpy(event.wps_pin, pin, WS_PINSTR_LEN + 1);
2285 WDP_LOGD("Retrive pin [%s]", event.wps_pin);
2287 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2288 __ws_peer_property, event.edata);
2290 if (g_pd->callback->prov_disc_req_cb)
2291 g_pd->callback->prov_disc_req_cb(&event);
2293 __destroy_dev_data(dev_data);
2295 __WDP_LOG_FUNC_EXIT__;
2298 static void _ws_process_prov_disc_resp_display_pin(GDBusConnection *connection,
2299 const gchar *sender, const gchar *object_path, const gchar *interface,
2300 const gchar *signal, GVariant *parameters, gpointer user_data)
2302 __WDP_LOG_FUNC_ENTER__;
2303 wfd_oem_event_s event;
2304 wfd_oem_dev_data_s *dev_data = NULL;
2305 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2306 const char *path = NULL;
2307 const char *pin = NULL;
2309 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2311 if (!__is_valid_plugin())
2314 dev_data = __create_dev_data();
2316 __WDP_LOG_FUNC_EXIT__;
2320 __set_event_data(WFD_OEM_EVENT_PROV_DISC_RESP,
2321 WFD_OEM_EDATA_TYPE_DEVICE,
2324 event.wps_mode = WFD_OEM_WPS_MODE_DISPLAY;
2326 g_variant_get(parameters, "(&o&s)", &path, &pin);
2327 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
2328 WDP_LOGD("Retrive Added path [%s]", peer_path);
2330 __extract_addr_from_path(peer_path, event.dev_addr);
2332 g_strlcpy(event.wps_pin, pin, WS_PINSTR_LEN + 1);
2333 WDP_LOGD("Retrive pin [%s]", event.wps_pin);
2335 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2336 __ws_peer_property, event.edata);
2338 if (g_pd->callback->prov_disc_resp_cb)
2339 g_pd->callback->prov_disc_resp_cb(&event);
2341 __destroy_dev_data(dev_data);
2343 __WDP_LOG_FUNC_EXIT__;
2346 static void _ws_process_prov_disc_req_enter_pin(GDBusConnection *connection,
2347 const gchar *sender, const gchar *object_path, const gchar *interface,
2348 const gchar *signal, GVariant *parameters, gpointer user_data)
2350 __WDP_LOG_FUNC_ENTER__;
2351 wfd_oem_event_s event;
2352 wfd_oem_dev_data_s *dev_data = NULL;
2353 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2355 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2356 if (!__is_valid_plugin())
2359 dev_data = __create_dev_data();
2361 __WDP_LOG_FUNC_EXIT__;
2365 __set_event_data(WFD_OEM_EVENT_PROV_DISC_REQ,
2366 WFD_OEM_EDATA_TYPE_DEVICE,
2369 event.wps_mode = WFD_OEM_WPS_MODE_KEYPAD;
2371 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
2373 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2374 __ws_peer_property, event.edata);
2376 if (g_pd->callback->prov_disc_req_cb)
2377 g_pd->callback->prov_disc_req_cb(&event);
2379 __destroy_dev_data(dev_data);
2381 __WDP_LOG_FUNC_EXIT__;
2384 static void _ws_process_prov_disc_resp_enter_pin(GDBusConnection *connection,
2385 const gchar *sender, const gchar *object_path, const gchar *interface,
2386 const gchar *signal, GVariant *parameters, gpointer user_data)
2388 __WDP_LOG_FUNC_ENTER__;
2389 wfd_oem_event_s event;
2390 wfd_oem_dev_data_s *dev_data = NULL;
2391 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2393 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2395 if (!__is_valid_plugin())
2398 dev_data = __create_dev_data();
2400 __WDP_LOG_FUNC_EXIT__;
2404 __set_event_data(WFD_OEM_EVENT_PROV_DISC_RESP,
2405 WFD_OEM_EDATA_TYPE_DEVICE,
2409 event.wps_mode = WFD_OEM_WPS_MODE_KEYPAD;
2411 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
2413 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2414 __ws_peer_property, event.edata);
2416 if (g_pd->callback->prov_disc_resp_cb)
2417 g_pd->callback->prov_disc_resp_cb(&event);
2419 __destroy_dev_data(dev_data);
2421 __WDP_LOG_FUNC_EXIT__;
2424 static void _ws_process_prov_disc_pbc_req(GDBusConnection *connection,
2425 const gchar *sender, const gchar *object_path, const gchar *interface,
2426 const gchar *signal, GVariant *parameters, gpointer user_data)
2428 __WDP_LOG_FUNC_ENTER__;
2429 wfd_oem_event_s event;
2430 wfd_oem_dev_data_s *dev_data = NULL;
2431 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2433 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2435 if (!__is_valid_plugin())
2438 dev_data = __create_dev_data();
2440 __WDP_LOG_FUNC_EXIT__;
2443 __set_event_data(WFD_OEM_EVENT_PROV_DISC_REQ,
2444 WFD_OEM_EDATA_TYPE_DEVICE,
2447 event.wps_mode = WFD_OEM_WPS_MODE_PBC;
2449 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
2451 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2452 __ws_peer_property, event.edata);
2454 if (g_pd->callback->prov_disc_req_cb)
2455 g_pd->callback->prov_disc_req_cb(&event);
2457 __destroy_dev_data(dev_data);
2459 __WDP_LOG_FUNC_EXIT__;
2462 static void _ws_process_prov_disc_pbc_resp(GDBusConnection *connection,
2463 const gchar *sender, const gchar *object_path, const gchar *interface,
2464 const gchar *signal, GVariant *parameters, gpointer user_data)
2466 __WDP_LOG_FUNC_ENTER__;
2467 wfd_oem_event_s event;
2468 wfd_oem_dev_data_s *dev_data = NULL;
2469 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2471 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2473 if (!__is_valid_plugin())
2476 dev_data = __create_dev_data();
2478 __WDP_LOG_FUNC_EXIT__;
2481 __set_event_data(WFD_OEM_EVENT_PROV_DISC_RESP,
2482 WFD_OEM_EDATA_TYPE_DEVICE,
2485 event.wps_mode = WFD_OEM_WPS_MODE_PBC;
2487 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
2489 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2490 __ws_peer_property, event.edata);
2492 if (g_pd->callback->prov_disc_resp_cb)
2493 g_pd->callback->prov_disc_resp_cb(&event);
2495 __destroy_dev_data(dev_data);
2497 __WDP_LOG_FUNC_EXIT__;
2500 static void _ws_process_prov_disc_failure(GDBusConnection *connection,
2501 const gchar *sender, const gchar *object_path, const gchar *interface,
2502 const gchar *signal, GVariant *parameters, gpointer user_data)
2504 __WDP_LOG_FUNC_ENTER__;
2505 GVariantIter *iter = NULL;
2506 wfd_oem_event_s event;
2507 wfd_oem_asp_prov_s *edata;
2509 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2511 if (!g_pd || !g_pd->callback) {
2512 WDP_LOGD("Ignoring event");
2513 __WDP_LOG_FUNC_EXIT__;
2517 edata = (wfd_oem_asp_prov_s *) g_try_malloc0(sizeof(wfd_oem_asp_prov_s));
2519 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2520 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2521 WDP_LOGF("Failed to allocate memory for event. [%s]",
2523 __WDP_LOG_FUNC_EXIT__;
2526 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2528 event.edata = (void*) edata;
2529 event.event_id = WFD_OEM_EVENT_PROV_DISC_FAIL;
2531 if (parameters != NULL) {
2532 g_variant_get(parameters, "(a{sv})", &iter);
2534 dbus_property_foreach(iter, __ws_extract_provision_fail_details, &event);
2535 event.edata_type = WFD_OEM_EDATA_TYPE_ASP_PROV;
2536 g_variant_iter_free(iter);
2539 WDP_LOGE("No Properties");
2542 if (g_pd->callback->prov_disc_fail_cb)
2543 g_pd->callback->prov_disc_fail_cb(&event);
2545 if (event.edata_type == WFD_OEM_EDATA_TYPE_ASP_PROV)
2546 g_free(edata->session_information);
2549 __WDP_LOG_FUNC_EXIT__;
2552 static void _ws_process_group_started(GDBusConnection *connection,
2553 const gchar *sender, const gchar *object_path, const gchar *interface,
2554 const gchar *signal, GVariant *parameters, gpointer user_data)
2556 __WDP_LOG_FUNC_ENTER__;
2557 GVariantIter *iter = NULL;
2558 wfd_oem_event_s event;
2559 wfd_oem_group_data_s *edata = NULL;
2561 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2563 if (!g_pd || !g_pd->callback) {
2564 WDP_LOGD("Ignoring event");
2565 __WDP_LOG_FUNC_EXIT__;
2569 edata = (wfd_oem_group_data_s*)calloc(1, sizeof(wfd_oem_group_data_s));
2571 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2572 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2573 WDP_LOGF("Failed to allocate memory for event. [%s]",
2575 __WDP_LOG_FUNC_EXIT__;
2578 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2580 event.edata = (void*) edata;
2581 event.edata_type = WFD_OEM_EDATA_TYPE_GROUP;
2582 event.event_id = WFD_OEM_EVENT_GROUP_CREATED;
2584 if (parameters != NULL) {
2585 g_variant_get(parameters, "(a{sv})", &iter);
2588 dbus_property_foreach(iter, __ws_extract_group_details, &event);
2589 g_variant_iter_free(iter);
2592 WDP_LOGE("No properties");
2595 if (g_pd->callback->group_created_cb)
2596 g_pd->callback->group_created_cb(&event);
2598 g_free(event.edata);
2600 __WDP_LOG_FUNC_EXIT__;
2603 static void _ws_process_go_neg_success(GDBusConnection *connection,
2604 const gchar *sender, const gchar *object_path, const gchar *interface,
2605 const gchar *signal, GVariant *parameters, gpointer user_data)
2607 __WDP_LOG_FUNC_ENTER__;
2608 GVariantIter *iter = NULL;
2609 wfd_oem_event_s event;
2610 wfd_oem_conn_data_s *edata = NULL;
2612 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2614 if (!g_pd || !g_pd->callback) {
2615 WDP_LOGD("Ignoring event");
2616 __WDP_LOG_FUNC_EXIT__;
2620 edata = (wfd_oem_conn_data_s*)calloc(1, sizeof(wfd_oem_conn_data_s));
2622 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2623 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2624 WDP_LOGF("Failed to allocate memory for event. [%s]",
2626 __WDP_LOG_FUNC_EXIT__;
2629 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2631 event.edata = edata;
2632 event.edata_type = WFD_OEM_EDATA_TYPE_CONN;
2633 event.event_id = WFD_OEM_EVENT_GO_NEG_DONE;
2635 if (parameters != NULL) {
2636 g_variant_get(parameters, "(a{sv})", &iter);
2639 dbus_property_foreach(iter, __ws_extract_gonegsuccess_details, &event);
2640 g_variant_iter_free(iter);
2643 WDP_LOGE("No properties");
2646 if (g_pd->callback->go_neg_done_cb)
2647 g_pd->callback->go_neg_done_cb(&event);
2651 __WDP_LOG_FUNC_EXIT__;
2654 static void _ws_process_go_neg_failure(GDBusConnection *connection,
2655 const gchar *sender, const gchar *object_path, const gchar *interface,
2656 const gchar *signal, GVariant *parameters, gpointer user_data)
2658 __WDP_LOG_FUNC_ENTER__;
2659 GVariantIter *iter = NULL;
2660 wfd_oem_event_s event;
2661 wfd_oem_conn_data_s *edata = NULL;
2663 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2665 if (!g_pd || !g_pd->callback) {
2666 WDP_LOGD("Ignoring event");
2667 __WDP_LOG_FUNC_EXIT__;
2671 edata = (wfd_oem_conn_data_s *) g_try_malloc0(sizeof(wfd_oem_conn_data_s));
2673 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2674 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2675 WDP_LOGF("Failed to allocate memory for event. [%s]",
2677 __WDP_LOG_FUNC_EXIT__;
2680 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2682 event.edata = (void*) edata;
2683 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
2684 event.event_id = WFD_OEM_EVENT_GO_NEG_FAIL;
2686 if (parameters != NULL) {
2687 g_variant_get(parameters, "(a{sv})", &iter);
2690 dbus_property_foreach(iter, __ws_extract_gonegfailaure_details, &event);
2691 g_variant_iter_free(iter);
2694 WDP_LOGE("No properties");
2697 if (g_pd->callback->go_neg_fail_cb)
2698 g_pd->callback->go_neg_fail_cb(&event);
2700 g_free(event.edata);
2702 __WDP_LOG_FUNC_EXIT__;
2705 static void __set_wps_mode_for_event(int dev_passwd_id, wfd_oem_event_s *event)
2710 WDP_LOGD("Retrive dev_passwd_id [%d]", dev_passwd_id);
2712 if (dev_passwd_id == WS_DEV_PASSWD_ID_PUSH_BUTTON)
2713 event->wps_mode = WFD_OEM_WPS_MODE_PBC;
2714 else if (dev_passwd_id == WS_DEV_PASSWD_ID_REGISTRAR_SPECIFIED)
2715 event->wps_mode = WFD_OEM_WPS_MODE_DISPLAY;
2716 else if (dev_passwd_id == WS_DEV_PASSWD_ID_USER_SPECIFIED)
2717 event->wps_mode = WFD_OEM_WPS_MODE_KEYPAD;
2719 event->wps_mode = WFD_OEM_WPS_MODE_NONE;
2722 static void _ws_process_go_neg_request(GDBusConnection *connection,
2723 const gchar *sender, const gchar *object_path, const gchar *interface,
2724 const gchar *signal, GVariant *parameters, gpointer user_data)
2726 __WDP_LOG_FUNC_ENTER__;
2727 wfd_oem_event_s event;
2728 wfd_oem_dev_data_s *dev_data = NULL;
2729 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2730 const char *path = NULL;
2731 int dev_passwd_id = 0;
2732 int device_go_intent = 0;
2734 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2736 if (!__is_valid_plugin())
2739 dev_data = __create_dev_data();
2741 __WDP_LOG_FUNC_EXIT__;
2744 __set_event_data(WFD_OEM_EVENT_GO_NEG_REQ,
2745 WFD_OEM_EDATA_TYPE_DEVICE,
2749 g_variant_get(parameters, "(&oqy)", &path, &dev_passwd_id, &device_go_intent);
2750 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
2752 WDP_LOGD("Retrive peer path [%s]", peer_path);
2753 __set_wps_mode_for_event(dev_passwd_id, &event);
2754 WDP_LOGD("Retrive device_go_intent [%d]", device_go_intent);
2755 dev_data->device_go_intent = device_go_intent;
2757 __extract_addr_from_path(peer_path, event.dev_addr);
2759 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2760 __ws_peer_property, event.edata);
2762 if (g_pd->callback->go_neg_req_cb)
2763 g_pd->callback->go_neg_req_cb(&event);
2765 __destroy_dev_data(dev_data);
2767 __WDP_LOG_FUNC_EXIT__;
2769 static void _ws_process_invitation_received(GDBusConnection *connection,
2770 const gchar *sender, const gchar *object_path, const gchar *interface,
2771 const gchar *signal, GVariant *parameters, gpointer user_data)
2773 __WDP_LOG_FUNC_ENTER__;
2774 GVariantIter *iter = NULL;
2775 wfd_oem_event_s event;
2776 wfd_oem_invite_data_s *edata = NULL;
2778 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2780 if (!g_pd || !g_pd->callback) {
2781 WDP_LOGD("Ignoring event");
2782 __WDP_LOG_FUNC_EXIT__;
2786 edata = (wfd_oem_invite_data_s *) g_try_malloc0(sizeof(wfd_oem_invite_data_s));
2788 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2789 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2790 WDP_LOGF("Failed to allocate memory for event. [%s]",
2792 __WDP_LOG_FUNC_EXIT__;
2795 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2797 event.edata = (void*) edata;
2798 event.edata_type = WFD_OEM_EDATA_TYPE_INVITE;
2799 event.event_id = WFD_OEM_EVENT_INVITATION_REQ;
2801 if (parameters != NULL) {
2802 g_variant_get(parameters, "(a{sv})", &iter);
2805 dbus_property_foreach(iter, __ws_extract_invitation_details, &event);
2806 g_variant_iter_free(iter);
2809 WDP_LOGE("No properties");
2811 memcpy(&(event.dev_addr), edata->sa, OEM_MACADDR_LEN);
2813 if (g_pd->callback->invitation_req_cb)
2814 g_pd->callback->invitation_req_cb(&event);
2816 g_free(event.edata);
2818 __WDP_LOG_FUNC_EXIT__;
2821 static void _ws_process_invitation_result(GDBusConnection *connection,
2822 const gchar *sender, const gchar *object_path, const gchar *interface,
2823 const gchar *signal, GVariant *parameters, gpointer user_data)
2825 __WDP_LOG_FUNC_ENTER__;
2826 wfd_oem_event_s event;
2828 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2830 if (!g_pd || !g_pd->callback) {
2831 WDP_LOGD("Ignoring event");
2832 __WDP_LOG_FUNC_EXIT__;
2836 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2838 __WDP_LOG_FUNC_EXIT__;
2841 static void _ws_process_group_finished(GDBusConnection *connection,
2842 const gchar *sender, const gchar *object_path, const gchar *interface,
2843 const gchar *signal, GVariant *parameters, gpointer user_data)
2845 __WDP_LOG_FUNC_ENTER__;
2846 wfd_oem_event_s event;
2849 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2851 if (!g_pd || !g_pd->callback) {
2852 WDP_LOGD("Ignoring event");
2853 __WDP_LOG_FUNC_EXIT__;
2857 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2859 event.event_id = WFD_OEM_EVENT_GROUP_DESTROYED;
2860 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2862 for (i = 0; ws_group_signal_map[i].member != NULL; i++) {
2863 g_dbus_connection_signal_unsubscribe(g_pd->g_dbus, ws_group_signal_map[i].sub_id);
2864 ws_group_signal_map[i].sub_id = 0;
2866 memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
2869 if (g_pd->callback->group_destroyed_cb)
2870 g_pd->callback->group_destroyed_cb(&event);
2872 __WDP_LOG_FUNC_EXIT__;
2875 static void _ws_process_service_discovery_response(GDBusConnection *connection,
2876 const gchar *sender, const gchar *object_path, const gchar *interface,
2877 const gchar *signal, GVariant *parameters, gpointer user_data)
2879 __WDP_LOG_FUNC_ENTER__;
2880 GVariantIter *iter = NULL;
2881 wfd_oem_event_s event;
2883 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2885 if (!g_pd || !g_pd->callback) {
2886 WDP_LOGD("Ignoring event");
2887 __WDP_LOG_FUNC_EXIT__;
2891 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2893 event.event_id = WFD_OEM_EVENT_SERV_DISC_RESP;
2895 if (parameters != NULL) {
2896 g_variant_get(parameters, "(a{sv})", &iter);
2898 dbus_property_foreach(iter, __ws_extract_servicediscoveryresponse_details, &event);
2899 event.edata_type = WFD_OEM_EDATA_TYPE_NEW_SERVICE;
2900 g_variant_iter_free(iter);
2903 WDP_LOGE("No Properties");
2906 if (g_pd->callback->serv_disc_resp_cb)
2907 g_pd->callback->serv_disc_resp_cb(&event);
2909 if (event.edata_type == WFD_OEM_EDATA_TYPE_NEW_SERVICE)
2910 g_list_free((GList*) event.edata);
2912 __WDP_LOG_FUNC_EXIT__;
2915 static void _ws_process_service_asp_response(GDBusConnection *connection,
2916 const gchar *sender, const gchar *object_path, const gchar *interface,
2917 const gchar *signal, GVariant *parameters, gpointer user_data)
2919 __WDP_LOG_FUNC_ENTER__;
2920 GVariantIter *iter = NULL;
2921 wfd_oem_event_s event;
2922 wfd_oem_asp_service_s *service = NULL;
2923 wfd_oem_asp_service_s *tmp = NULL;
2925 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2927 if (!g_pd || !g_pd->callback) {
2928 WDP_LOGD("Ignoring event");
2929 __WDP_LOG_FUNC_EXIT__;
2933 service = (wfd_oem_asp_service_s *) g_try_malloc0(sizeof(wfd_oem_asp_service_s));
2935 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2936 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2937 WDP_LOGF("Failed to allocate memory for event. [%s]",
2939 __WDP_LOG_FUNC_EXIT__;
2942 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2944 event.edata = (void*) service;
2945 event.edata_type = WFD_OEM_EDATA_TYPE_ASP_SERVICE;
2946 event.event_id = WFD_OEM_EVENT_ASP_SERV_RESP;
2948 if (parameters != NULL) {
2949 g_variant_get(parameters, "(a{sv})", &iter);
2951 dbus_property_foreach(iter, __ws_extract_serviceaspresponse_details, &event);
2952 g_variant_iter_free(iter);
2955 WDP_LOGE("No Properties");
2957 GLIST_ITER_START(seek_list, tmp)
2958 if (tmp->tran_id == service->tran_id) {
2959 WDP_LOGD("srv_trans_id matched [%d] search_id [%llu]"
2960 , tmp->tran_id, tmp->search_id);
2961 service->search_id = tmp->search_id;
2968 if (tmp != NULL && tmp->service_info != NULL) {
2969 if (g_pd->callback->asp_serv_resp_cb)
2970 g_pd->callback->asp_serv_resp_cb(&event);
2972 WDP_LOGD("service info is not required, don't notify to user");
2975 g_free(service->service_type);
2976 g_free(service->service_info);
2979 __WDP_LOG_FUNC_EXIT__;
2982 static void _ws_process_persistent_group_added(GDBusConnection *connection,
2983 const gchar *sender, const gchar *object_path, const gchar *interface,
2984 const gchar *signal, GVariant *parameters, gpointer user_data)
2986 __WDP_LOG_FUNC_ENTER__;
2987 wfd_oem_event_s event;
2989 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2991 if (!g_pd || !g_pd->callback) {
2992 WDP_LOGD("Ignoring event");
2993 __WDP_LOG_FUNC_EXIT__;
2997 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2999 __WDP_LOG_FUNC_EXIT__;
3002 static void _ws_process_persistent_group_removed(GDBusConnection *connection,
3003 const gchar *sender, const gchar *object_path, const gchar *interface,
3004 const gchar *signal, GVariant *parameters, gpointer user_data)
3006 __WDP_LOG_FUNC_ENTER__;
3007 wfd_oem_event_s event;
3009 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3011 if (!g_pd || !g_pd->callback) {
3012 WDP_LOGD("Ignoring event");
3013 __WDP_LOG_FUNC_EXIT__;
3017 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3019 __WDP_LOG_FUNC_EXIT__;
3022 static void _ws_process_wps_failed(GDBusConnection *connection,
3023 const gchar *sender, const gchar *object_path, const gchar *interface,
3024 const gchar *signal, GVariant *parameters, gpointer user_data)
3026 __WDP_LOG_FUNC_ENTER__;
3027 GVariantIter *iter = NULL;
3028 wfd_oem_event_s event;
3029 const char *name = NULL;
3031 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3033 if (!g_pd || !g_pd->callback) {
3034 WDP_LOGD("Ignoring event");
3035 __WDP_LOG_FUNC_EXIT__;
3039 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3041 event.event_id = WFD_OEM_EVENT_WPS_FAIL;
3042 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
3044 g_variant_get(parameters, "(&sa{sv})", &name, &iter);
3046 WDP_LOGD("code [%s]", name);
3051 GVariant *value = NULL;
3053 while (g_variant_iter_loop(iter, "{sv}", &key, &value))
3054 CHECK_KEY_VALUE(key, value);
3056 g_variant_iter_free(iter);
3059 if (g_pd->callback->wps_fail_cb)
3060 g_pd->callback->wps_fail_cb(&event);
3062 __WDP_LOG_FUNC_EXIT__;
3065 static void _ws_process_group_formation_failure(GDBusConnection *connection,
3066 const gchar *sender, const gchar *object_path, const gchar *interface,
3067 const gchar *signal, GVariant *parameters, gpointer user_data)
3069 __WDP_LOG_FUNC_ENTER__;
3070 wfd_oem_event_s event;
3072 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3074 if (!g_pd || !g_pd->callback) {
3075 WDP_LOGD("Ignoring event");
3076 __WDP_LOG_FUNC_EXIT__;
3080 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3082 event.event_id = WFD_OEM_EVENT_GROUP_FORMATION_FAILURE;
3083 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
3085 if (g_pd->callback->group_formation_failure_cb)
3086 g_pd->callback->group_formation_failure_cb(&event);
3088 __WDP_LOG_FUNC_EXIT__;
3091 static void _ws_process_invitation_accepted(GDBusConnection *connection,
3092 const gchar *sender, const gchar *object_path, const gchar *interface,
3093 const gchar *signal, GVariant *parameters, gpointer user_data)
3095 __WDP_LOG_FUNC_ENTER__;
3096 GVariantIter *iter = NULL;
3097 wfd_oem_event_s event;
3099 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3101 if (!g_pd || !g_pd->callback) {
3102 WDP_LOGD("Ignoring event");
3103 __WDP_LOG_FUNC_EXIT__;
3107 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3109 event.event_id = WFD_OEM_EVENT_INVITATION_ACCEPTED;
3110 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
3112 if (parameters != NULL) {
3113 g_variant_get(parameters, "(a{sv})", &iter);
3117 GVariant *value = NULL;
3119 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
3120 CHECK_KEY_VALUE(key, value);
3122 if (g_strcmp0(key, "sa") == 0)
3123 if (__ws_unpack_ay(event.dev_addr, value, WS_MACADDR_LEN))
3124 WDP_LOGI("[" MACSTR "]", MAC2STR(event.dev_addr));
3126 g_variant_iter_free(iter);
3130 if (g_pd->callback->invitation_accepted_cb)
3131 g_pd->callback->invitation_accepted_cb(&event);
3133 __WDP_LOG_FUNC_EXIT__;
3136 static void _ws_process_asp_provision_start(GDBusConnection *connection,
3137 const gchar *sender, const gchar *object_path, const gchar *interface,
3138 const gchar *signal, GVariant *parameters, gpointer user_data)
3140 __WDP_LOG_FUNC_ENTER__;
3141 GVariantIter *iter = NULL;
3142 wfd_oem_event_s event;
3143 wfd_oem_asp_prov_s *edata;
3145 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3147 if (!g_pd || !g_pd->callback) {
3148 WDP_LOGD("Ignoring event");
3149 __WDP_LOG_FUNC_EXIT__;
3153 edata = (wfd_oem_asp_prov_s *) g_try_malloc0(sizeof(wfd_oem_asp_prov_s));
3155 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
3156 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
3157 WDP_LOGF("Failed to allocate memory for event. [%s]",
3159 __WDP_LOG_FUNC_EXIT__;
3162 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3164 event.edata = (void*) edata;
3165 event.event_id = WFD_OEM_EVENT_ASP_PROV_START;
3167 if (parameters != NULL) {
3168 g_variant_get(parameters, "(a{sv})", &iter);
3170 dbus_property_foreach(iter, __ws_extract_asp_provision_start_details, &event);
3171 event.edata_type = WFD_OEM_EDATA_TYPE_ASP_PROV;
3172 g_variant_iter_free(iter);
3175 WDP_LOGE("No Properties");
3178 if (g_pd->callback->asp_prov_start_cb)
3179 g_pd->callback->asp_prov_start_cb(&event);
3181 if (event.edata_type == WFD_OEM_EDATA_TYPE_ASP_PROV)
3182 g_free(edata->session_information);
3185 __WDP_LOG_FUNC_EXIT__;
3188 static void _ws_process_asp_provision_done(GDBusConnection *connection,
3189 const gchar *sender, const gchar *object_path, const gchar *interface,
3190 const gchar *signal, GVariant *parameters, gpointer user_data)
3192 __WDP_LOG_FUNC_ENTER__;
3193 GVariantIter *iter = NULL;
3194 wfd_oem_event_s event;
3195 wfd_oem_asp_prov_s *edata;
3197 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3199 if (!g_pd || !g_pd->callback) {
3200 WDP_LOGD("Ignoring event");
3201 __WDP_LOG_FUNC_EXIT__;
3205 edata = (wfd_oem_asp_prov_s *) g_try_malloc0(sizeof(wfd_oem_asp_prov_s));
3207 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
3208 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
3209 WDP_LOGF("Failed to allocate memory for event. [%s]",
3211 __WDP_LOG_FUNC_EXIT__;
3214 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3216 event.edata = (void*) edata;
3217 event.event_id = WFD_OEM_EVENT_ASP_PROV_DONE;
3219 if (parameters != NULL) {
3220 g_variant_get(parameters, "(a{sv})", &iter);
3222 dbus_property_foreach(iter, __ws_extract_asp_provision_done_details, &event);
3223 event.edata_type = WFD_OEM_EDATA_TYPE_ASP_PROV;
3224 g_variant_iter_free(iter);
3227 WDP_LOGE("No Properties");
3230 if (g_pd->callback->asp_prov_done_cb)
3231 g_pd->callback->asp_prov_done_cb(&event);
3235 __WDP_LOG_FUNC_EXIT__;
3240 const char *interface;
3242 void (*function) (GDBusConnection *connection,
3243 const gchar *sender, const gchar *object_path, const gchar *interface,
3244 const gchar *signal, GVariant *parameters, gpointer user_data);
3245 } ws_p2pdevice_signal_map[] = {
3248 SUPPLICANT_P2PDEVICE,
3249 "DeviceFoundProperties",
3250 _ws_process_device_found_properties
3254 SUPPLICANT_P2PDEVICE,
3256 _ws_process_device_lost
3260 SUPPLICANT_P2PDEVICE,
3262 _ws_process_find_stoppped
3266 SUPPLICANT_P2PDEVICE,
3267 "ProvisionDiscoveryRequestDisplayPin",
3268 _ws_process_prov_disc_req_display_pin
3272 SUPPLICANT_P2PDEVICE,
3273 "ProvisionDiscoveryResponseDisplayPin",
3274 _ws_process_prov_disc_resp_display_pin
3278 SUPPLICANT_P2PDEVICE,
3279 "ProvisionDiscoveryRequestEnterPin",
3280 _ws_process_prov_disc_req_enter_pin
3284 SUPPLICANT_P2PDEVICE,
3285 "ProvisionDiscoveryResponseEnterPin",
3286 _ws_process_prov_disc_resp_enter_pin
3290 SUPPLICANT_P2PDEVICE,
3291 "ProvisionDiscoveryPBCRequest",
3292 _ws_process_prov_disc_pbc_req
3296 SUPPLICANT_P2PDEVICE,
3297 "ProvisionDiscoveryPBCResponse",
3298 _ws_process_prov_disc_pbc_resp
3302 SUPPLICANT_P2PDEVICE,
3303 "ProvisionDiscoveryFailure",
3304 _ws_process_prov_disc_failure
3308 SUPPLICANT_P2PDEVICE,
3310 _ws_process_group_started
3314 SUPPLICANT_P2PDEVICE,
3315 "GONegotiationSuccess",
3316 _ws_process_go_neg_success
3320 SUPPLICANT_P2PDEVICE,
3321 "GONegotiationFailure",
3322 _ws_process_go_neg_failure
3326 SUPPLICANT_P2PDEVICE,
3327 "GONegotiationRequest",
3328 _ws_process_go_neg_request
3332 SUPPLICANT_P2PDEVICE,
3333 "InvitationReceived",
3334 _ws_process_invitation_received
3338 SUPPLICANT_P2PDEVICE,
3340 _ws_process_invitation_result
3344 SUPPLICANT_P2PDEVICE,
3346 _ws_process_group_finished
3350 SUPPLICANT_P2PDEVICE,
3351 "ServiceDiscoveryResponse",
3352 _ws_process_service_discovery_response
3356 SUPPLICANT_P2PDEVICE,
3357 "ServiceASPResponse",
3358 _ws_process_service_asp_response
3362 SUPPLICANT_P2PDEVICE,
3363 "ASPProvisionStart",
3364 _ws_process_asp_provision_start
3368 SUPPLICANT_P2PDEVICE,
3370 _ws_process_asp_provision_done
3374 SUPPLICANT_P2PDEVICE,
3375 "PersistentGroupAdded",
3376 _ws_process_persistent_group_added
3380 SUPPLICANT_P2PDEVICE,
3381 "PersistentGroupRemoved",
3382 _ws_process_persistent_group_removed
3386 SUPPLICANT_P2PDEVICE,
3388 _ws_process_wps_failed
3392 SUPPLICANT_P2PDEVICE,
3393 "GroupFormationFailure",
3394 _ws_process_group_formation_failure
3398 SUPPLICANT_P2PDEVICE,
3399 "InvitationAccepted",
3400 _ws_process_invitation_accepted
3410 static void _ws_process_sta_authorized(GDBusConnection *connection,
3411 const gchar *sender, const gchar *object_path, const gchar *interface,
3412 const gchar *signal, GVariant *parameters, gpointer user_data)
3414 __WDP_LOG_FUNC_ENTER__;
3415 wfd_oem_event_s event;
3416 const gchar* mac_str = NULL;
3418 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3420 if (!g_pd || !g_pd->callback) {
3421 WDP_LOGD("Ignoring event");
3422 __WDP_LOG_FUNC_EXIT__;
3426 if (is_peer_joined_notified) {
3427 is_peer_joined_notified = 0;
3428 __WDP_LOG_FUNC_EXIT__;
3432 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3433 g_variant_get(parameters, "(&s)", &mac_str);
3434 __ws_txt_to_mac((unsigned char *)mac_str, event.intf_addr);
3436 event.event_id = WFD_OEM_EVENT_STA_CONNECTED;
3437 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
3439 if (g_pd->callback->sta_connected_cb)
3440 g_pd->callback->sta_connected_cb(&event);
3442 __WDP_LOG_FUNC_EXIT__;
3445 static void _ws_process_sta_deauthorized(GDBusConnection *connection,
3446 const gchar *sender, const gchar *object_path, const gchar *interface,
3447 const gchar *signal, GVariant *parameters, gpointer user_data)
3449 __WDP_LOG_FUNC_ENTER__;
3450 wfd_oem_event_s event;
3451 const gchar* mac_str = NULL;
3453 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3455 if (!g_pd || !g_pd->callback) {
3456 WDP_LOGD("Ignoring event");
3457 __WDP_LOG_FUNC_EXIT__;
3461 if (is_peer_disconnected_notified) {
3462 is_peer_disconnected_notified = 0;
3463 __WDP_LOG_FUNC_EXIT__;
3467 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3468 g_variant_get(parameters, "(&s)", &mac_str);
3469 __ws_txt_to_mac((unsigned char *)mac_str, event.intf_addr);
3471 event.event_id = WFD_OEM_EVENT_STA_DISCONNECTED;
3472 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
3474 if (g_pd->callback->sta_disconnected_cb)
3475 g_pd->callback->sta_disconnected_cb(&event);
3477 __WDP_LOG_FUNC_EXIT__;
3482 const char *interface;
3484 void (*function) (GDBusConnection *connection,
3485 const gchar *sender, const gchar *object_path, const gchar *interface,
3486 const gchar *signal, GVariant *parameters, gpointer user_data);
3487 } ws_interface_signal_map[] = {
3492 _ws_process_sta_authorized
3498 _ws_process_sta_deauthorized
3508 static void __register_p2pdevice_signal(GVariant *value, void *user_data)
3510 __WDP_LOG_FUNC_ENTER__;
3511 ws_dbus_plugin_data_s * pd_data;
3512 static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
3513 const char *path = NULL;
3517 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3518 __WDP_LOG_FUNC_EXIT__;
3522 pd_data = (ws_dbus_plugin_data_s *)g_pd;
3524 g_variant_get(value, "(&o)", &path);
3525 g_strlcpy(interface_path, path, DBUS_OBJECT_PATH_MAX);
3526 g_strlcpy(pd_data->iface_path, path, DBUS_OBJECT_PATH_MAX);
3528 WDP_LOGD("interface object path [%s]", interface_path);
3530 /* subscribe Interface iface signal */
3531 for (i = 0; ws_interface_signal_map[i].member != NULL; i++) {
3532 ws_interface_signal_map[i].sub_id =
3533 g_dbus_connection_signal_subscribe(pd_data->g_dbus,
3534 SUPPLICANT_SERVICE, /* bus name */
3535 ws_interface_signal_map[i].interface, /* interface */
3536 ws_interface_signal_map[i].member, /* member */
3537 pd_data->iface_path, /* object path */
3539 G_DBUS_SIGNAL_FLAGS_NONE,
3540 ws_interface_signal_map[i].function,
3542 WDP_LOGD("Subscribed Interface iface signal [%s]", ws_interface_signal_map[i].member);
3545 /* subscribe P2PDevice iface signal */
3546 for (i = 0; ws_p2pdevice_signal_map[i].member != NULL; i++) {
3547 ws_p2pdevice_signal_map[i].sub_id =
3548 g_dbus_connection_signal_subscribe(pd_data->g_dbus,
3549 SUPPLICANT_SERVICE, /* bus name */
3550 ws_p2pdevice_signal_map[i].interface, /* interface */
3551 ws_p2pdevice_signal_map[i].member, /* member */
3552 pd_data->iface_path, /* object path */
3554 G_DBUS_SIGNAL_FLAGS_NONE,
3555 ws_p2pdevice_signal_map[i].function,
3557 WDP_LOGD("Subscribed P2PDevice iface signal [%s]", ws_p2pdevice_signal_map[i].member);
3560 __WDP_LOG_FUNC_EXIT__;
3563 static int _ws_create_interface(const char *iface_name, handle_reply function, void *user_data)
3565 __WDP_LOG_FUNC_ENTER__;
3566 GDBusConnection *g_dbus = NULL;
3567 GVariantBuilder *builder = NULL;
3568 dbus_method_param_s params;
3573 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3574 __WDP_LOG_FUNC_EXIT__;
3578 g_dbus = g_pd->g_dbus;
3580 WDP_LOGE("DBus connection is NULL");
3581 __WDP_LOG_FUNC_EXIT__;
3584 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
3586 dbus_set_method_param(¶ms, "CreateInterface", SUPPLICANT_PATH, g_dbus);
3588 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
3589 g_variant_builder_add(builder, "{sv}", "Ifname", g_variant_new_string(iface_name));
3590 g_variant_builder_add(builder, "{sv}", "ConfigFile", g_variant_new_string(CONF_FILE_PATH));
3591 params.params = g_variant_new("(a{sv})", builder);
3592 g_variant_builder_unref(builder);
3593 res = dbus_method_call(¶ms, SUPPLICANT_INTERFACE, function, user_data);
3595 WDP_LOGE("Failed to send command to wpa_supplicant");
3597 WDP_LOGD("Succeeded to CreateInterface");
3599 __WDP_LOG_FUNC_EXIT__;
3603 static int _ws_get_interface(const char *iface_name, handle_reply function, void *user_data)
3605 __WDP_LOG_FUNC_ENTER__;
3606 GDBusConnection *g_dbus = NULL;
3607 dbus_method_param_s params;
3611 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3612 __WDP_LOG_FUNC_EXIT__;
3616 g_dbus = g_pd->g_dbus;
3618 WDP_LOGE("DBus connection is NULL");
3619 __WDP_LOG_FUNC_EXIT__;
3623 dbus_set_method_param(¶ms, SUPPLICANT_METHOD_GETINTERFACE,
3624 SUPPLICANT_PATH, g_pd->g_dbus);
3626 params.params = g_variant_new("(s)", iface_name);
3627 DEBUG_G_VARIANT("Params : ", params.params);
3629 res = dbus_method_call(¶ms, SUPPLICANT_INTERFACE,
3630 function, user_data);
3633 WDP_LOGE("Failed to send command to wpa_supplicant");
3635 WDP_LOGD("Succeeded to get interface");
3637 __WDP_LOG_FUNC_EXIT__;
3641 static void __ws_remove_interface(GVariant *value, void *user_data)
3643 __WDP_LOG_FUNC_ENTER__;
3644 GDBusConnection *g_dbus = NULL;
3645 dbus_method_param_s params;
3646 const char *path = NULL;
3647 static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
3651 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3655 g_dbus = g_pd->g_dbus;
3657 WDP_LOGE("DBus connection is NULL");
3661 g_variant_get(value, "(&o)", &path);
3662 g_strlcpy(interface_path, path, DBUS_OBJECT_PATH_MAX);
3663 WDP_LOGD("interface object path [%s]", interface_path);
3665 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
3667 dbus_set_method_param(¶ms, "RemoveInterface", SUPPLICANT_PATH, g_dbus);
3668 params.params = g_variant_new("(o)", interface_path);
3670 res = dbus_method_call(¶ms, SUPPLICANT_INTERFACE, NULL, NULL);
3672 WDP_LOGE("Failed to send command to wpa_supplicant");
3674 WDP_LOGD("Succeeded to RemoveInterface");
3676 __WDP_LOG_FUNC_EXIT__;
3680 static int _ws_init_dbus_connection(void)
3682 __WDP_LOG_FUNC_ENTER__;
3683 GDBusConnection *conn = NULL;
3684 GError *error = NULL;
3689 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3690 __WDP_LOG_FUNC_EXIT__;
3695 WDP_LOGE("no configurable data found");
3696 __WDP_LOG_FUNC_EXIT__;
3700 conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
3703 if (error != NULL) {
3704 WDP_LOGE("Error! Failed to connect to the D-BUS daemon: [%s]",
3706 g_error_free(error);
3708 __WDP_LOG_FUNC_EXIT__;
3712 g_pd->g_dbus = conn;
3714 for (i = 0; ws_supplicant_signal_map[i].member != NULL; i++) {
3715 ws_supplicant_signal_map[i].sub_id =
3716 g_dbus_connection_signal_subscribe(g_pd->g_dbus,
3717 SUPPLICANT_SERVICE, /* bus name */
3718 ws_supplicant_signal_map[i].interface, /* interface */
3719 ws_supplicant_signal_map[i].member, /* member */
3720 SUPPLICANT_PATH, /* object path */
3722 G_DBUS_SIGNAL_FLAGS_NONE,
3723 ws_supplicant_signal_map[i].function,
3725 WDP_LOGD("Subscribed supplicant iface signal [%s]", ws_supplicant_signal_map[i].member);
3728 if (g_strcmp0(config->ifname, config->p2p_ifname) != 0) {
3729 if (_ws_get_interface(config->ifname, NULL, NULL) < 0)
3730 res = _ws_create_interface(config->ifname, NULL, NULL);
3731 if (_ws_get_interface(config->p2p_ifname, __register_p2pdevice_signal, NULL) < 0)
3732 res = _ws_create_interface(config->p2p_ifname, __register_p2pdevice_signal, NULL);
3734 if (_ws_get_interface(config->p2p_ifname, __register_p2pdevice_signal, NULL) < 0)
3735 res = _ws_create_interface(config->p2p_ifname, __register_p2pdevice_signal, NULL);
3739 WDP_LOGE("Failed to subscribe interface signal");
3741 WDP_LOGI("Successfully register signal filters");
3743 __WDP_LOG_FUNC_EXIT__;
3747 static int _ws_deinit_dbus_connection(void)
3749 GDBusConnection *g_dbus = NULL;
3753 WDP_LOGE("Invalid parameter");
3754 __WDP_LOG_FUNC_EXIT__;
3758 g_dbus = g_pd->g_dbus;
3760 WDP_LOGE("DBus connection is NULL");
3761 __WDP_LOG_FUNC_EXIT__;
3765 for (i = 0; ws_supplicant_signal_map[i].member != NULL; i++) {
3766 g_dbus_connection_signal_unsubscribe(g_dbus, ws_supplicant_signal_map[i].sub_id);
3767 ws_supplicant_signal_map[i].sub_id = 0;
3770 for (i = 0; ws_interface_signal_map[i].member != NULL; i++) {
3771 g_dbus_connection_signal_unsubscribe(g_dbus, ws_interface_signal_map[i].sub_id);
3772 ws_interface_signal_map[i].sub_id = 0;
3775 for (i = 0; ws_p2pdevice_signal_map[i].member != NULL; i++) {
3776 g_dbus_connection_signal_unsubscribe(g_dbus, ws_p2pdevice_signal_map[i].sub_id);
3777 ws_p2pdevice_signal_map[i].sub_id = 0;
3780 for (i = 0; ws_group_signal_map[i].member != NULL; i++) {
3781 g_dbus_connection_signal_unsubscribe(g_dbus, ws_group_signal_map[i].sub_id);
3782 ws_group_signal_map[i].sub_id = 0;
3785 memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
3786 memset(g_pd->iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
3788 g_object_unref(g_dbus);
3789 __WDP_LOG_FUNC_EXIT__;
3793 int wfd_plugin_load(wfd_oem_ops_s **ops)
3795 __WDP_LOG_FUNC_ENTER__;
3797 WDP_LOGE("Invalid parameter");
3798 __WDP_LOG_FUNC_EXIT__;
3802 *ops = &supplicant_ops;
3804 __WDP_LOG_FUNC_EXIT__;
3808 static int _ws_reset_plugin(ws_dbus_plugin_data_s *f_pd)
3810 __WDP_LOG_FUNC_ENTER__;
3813 WDP_LOGE("Invalid parameter");
3814 __WDP_LOG_FUNC_EXIT__;
3818 _ws_deinit_dbus_connection();
3820 if (f_pd->activated)
3821 ws_deactivate(f_pd->concurrent);
3825 __WDP_LOG_FUNC_EXIT__;
3829 static int __ws_check_net_interface(char* if_name)
3834 if (if_name == NULL) {
3835 WDP_LOGE("Invalid param");
3839 fd = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
3841 WDP_LOGE("socket create error: %d", fd);
3845 memset(&ifr, 0, sizeof(ifr));
3846 g_strlcpy(ifr.ifr_name, if_name, IFNAMSIZ);
3848 if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) {
3850 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
3851 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
3852 WDP_LOGE("ioctl error: SIOCGIFFLAGS: %s [ %s ]", error_buf, if_name); /* interface is not found. */
3858 if (ifr.ifr_flags & IFF_UP) {
3859 WDP_LOGD("%s interface is up", if_name);
3861 } else if (!(ifr.ifr_flags & IFF_UP)) {
3862 WDP_LOGD("%s interface is down", if_name);
3868 int ws_configure(wfd_oem_config_s *conf)
3870 __WDP_LOG_FUNC_ENTER__;
3873 __WDP_LOG_FUNC_EXIT__;
3880 config = (wfd_oem_config_s *) g_try_malloc0(sizeof(wfd_oem_config_s));
3882 __WDP_LOG_FUNC_EXIT__;
3886 memcpy(config, conf, sizeof(wfd_oem_config_s));
3888 __WDP_LOG_FUNC_EXIT__;
3892 int ws_init(wfd_oem_event_cbs_s *event_cbs)
3894 __WDP_LOG_FUNC_ENTER__;
3896 if (event_cbs == NULL) {
3897 __WDP_LOG_FUNC_EXIT__;
3902 _ws_reset_plugin(g_pd);
3905 g_pd = (ws_dbus_plugin_data_s*) g_try_malloc0(sizeof(ws_dbus_plugin_data_s));
3907 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
3908 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
3909 WDP_LOGE("Failed to allocate memory for plugin data. [%s]", error_buf);
3913 g_pd->callback = event_cbs;
3914 g_pd->initialized = TRUE;
3916 __WDP_LOG_FUNC_EXIT__;
3922 __WDP_LOG_FUNC_ENTER__;
3925 _ws_reset_plugin(g_pd);
3932 __WDP_LOG_FUNC_EXIT__;
3936 gboolean _ws_util_execute_file(const char *file_path,
3937 char *const args[], char *const envs[])
3942 register unsigned int index = 0;
3943 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
3945 while (args[index] != NULL) {
3946 WDP_LOGD("[%s]", args[index]);
3950 if (!(pid = fork())) {
3951 WDP_LOGD("pid(%d), ppid(%d)", getpid(), getppid());
3952 WDP_LOGD("Inside child, exec (%s) command", file_path);
3955 if (execve(file_path, args, envs) == -1) {
3956 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
3957 WDP_LOGE("Fail to execute command (%s)", error_buf);
3960 } else if (pid > 0) {
3961 if (waitpid(pid, &rv, 0) == -1)
3962 WDP_LOGD("wait pid (%u) rv (%d)", pid, rv);
3964 WDP_LOGD("exited, rv=%d", WEXITSTATUS(rv));
3965 else if (WIFSIGNALED(rv))
3966 WDP_LOGD("killed by signal %d", WTERMSIG(rv));
3967 else if (WIFSTOPPED(rv))
3968 WDP_LOGD("stopped by signal %d", WSTOPSIG(rv));
3969 else if (WIFCONTINUED(rv))
3970 WDP_LOGD("continued");
3975 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
3976 WDP_LOGE("failed to fork (%s)", error_buf);
3980 static int __ws_p2p_firmware_start(const char *interface_name)
3982 gboolean rv = FALSE;
3983 const char *path = "/usr/bin/wlan.sh";
3984 char *const args[] = { "/usr/bin/wlan.sh", "p2p", (char *)interface_name, NULL };
3985 char *const envs[] = { NULL };
3987 rv = _ws_util_execute_file(path, args, envs);
3991 WDP_LOGI("Successfully loaded p2p device driver");
3995 static int __ws_p2p_firmware_stop(const char *interface_name)
3997 gboolean rv = FALSE;
3998 const char *path = "/usr/bin/wlan.sh";
3999 char *const args[] = { "/usr/bin/wlan.sh", "stop", (char *)interface_name, NULL };
4000 char *const envs[] = { NULL };
4001 rv = _ws_util_execute_file(path, args, envs);
4005 WDP_LOGI("Successfully removed p2p device driver");
4009 static int __ws_p2p_supplicant_start(void)
4011 gboolean rv = FALSE;
4012 const char *path = "/usr/sbin/p2p_supp.sh";
4013 char *const args[] = { "/usr/sbin/p2p_supp.sh", "start_dbus", NULL };
4014 char *const envs[] = { NULL };
4016 rv = _ws_util_execute_file(path, args, envs);
4019 WDP_LOGE("Failed to start p2p_supp.sh");
4023 WDP_LOGI("Successfully started p2p_supp.sh");
4028 static int __ws_p2p_supplicant_stop(void)
4030 gboolean rv = FALSE;
4031 const char *path = "/usr/sbin/p2p_supp.sh";
4032 char *const args[] = { "/usr/sbin/p2p_supp.sh", "stop", NULL };
4033 char *const envs[] = { NULL };
4035 rv = _ws_util_execute_file(path, args, envs);
4038 WDP_LOGE("Failed to stop p2p_supp.sh");
4042 WDP_LOGI("Successfully stopped p2p_supp.sh");
4046 static int __ws_p2p_on(void)
4049 DBusMessage *reply = NULL;
4050 DBusMessage *message = NULL;
4051 DBusConnection *connection = NULL;
4053 connection = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
4054 if (connection == NULL) {
4055 WDP_LOGE("Failed to get system bus");
4059 message = dbus_message_new_method_call(NETCONFIG_SERVICE,
4060 NETCONFIG_WIFI_PATH, NETCONFIG_WIFI_INTERFACE, "LoadP2pDriver");
4061 if (message == NULL) {
4062 WDP_LOGE("Failed DBus method call");
4063 dbus_connection_unref(connection);
4067 dbus_error_init(&error);
4069 reply = dbus_connection_send_with_reply_and_block(connection, message,
4070 NETCONFIG_DBUS_REPLY_TIMEOUT, &error);
4071 if (dbus_error_is_set(&error) == TRUE) {
4072 if (NULL != strstr(error.message, ".AlreadyExists")) {
4073 /* p2p already enabled */
4075 WDP_LOGE("dbus_connection_send_with_reply_and_block() failed. "
4076 "DBus error [%s: %s]", error.name, error.message);
4078 dbus_error_free(&error);
4081 dbus_error_free(&error);
4085 dbus_message_unref(reply);
4087 dbus_message_unref(message);
4088 dbus_connection_unref(connection);
4093 static int __ws_p2p_off(void)
4096 DBusMessage *reply = NULL;
4097 DBusMessage *message = NULL;
4098 DBusConnection *connection = NULL;
4100 connection = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
4101 if (connection == NULL) {
4102 WDP_LOGE("Failed to get system bus");
4106 message = dbus_message_new_method_call(NETCONFIG_SERVICE,
4107 NETCONFIG_WIFI_PATH, NETCONFIG_WIFI_INTERFACE, "RemoveP2pDriver");
4108 if (message == NULL) {
4109 WDP_LOGE("Failed DBus method call");
4110 dbus_connection_unref(connection);
4114 dbus_error_init(&error);
4116 reply = dbus_connection_send_with_reply_and_block(connection, message,
4117 NETCONFIG_DBUS_REPLY_TIMEOUT, &error);
4118 if (dbus_error_is_set(&error) == TRUE) {
4119 if (NULL != strstr(error.message, ".AlreadyExists")) {
4120 /* p2p already disabled */
4122 WDP_LOGE("dbus_connection_send_with_reply_and_block() failed. "
4123 "DBus error [%s: %s]", error.name, error.message);
4125 dbus_error_free(&error);
4128 dbus_error_free(&error);
4132 dbus_message_unref(reply);
4134 dbus_message_unref(message);
4135 dbus_connection_unref(connection);
4141 int __ws_init_p2pdevice(void)
4143 __WDP_LOG_FUNC_ENTER__;
4144 GDBusConnection *g_dbus = NULL;
4146 GVariant *value = NULL;
4147 GVariant *param = NULL;
4148 GVariantBuilder *builder = NULL;
4149 GVariantBuilder *type_builder = NULL;
4150 dbus_method_param_s params;
4152 unsigned char primary_device_type[8] = {
4153 0x00, 0x00, 0x00, 0x50,
4154 0xf2, 0x04, 0x00, 0x00
4161 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4162 __WDP_LOG_FUNC_EXIT__;
4167 WDP_LOGE("no configurable data found");
4168 __WDP_LOG_FUNC_EXIT__;
4172 primary_device_type[1] = config->pri_dev_type;
4173 primary_device_type[7] = config->sec_dev_type;
4175 for (i = 0; i < WS_DEVTYPE_LEN; i++)
4176 WDP_LOGD("device type[%02x]", primary_device_type[i]);
4178 g_dbus = g_pd->g_dbus;
4180 WDP_LOGE("DBus connection is NULL");
4181 __WDP_LOG_FUNC_EXIT__;
4184 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4186 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
4189 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4190 g_variant_builder_add(builder, "{sv}", "DeviceName",
4191 g_variant_new_string(config->device_name));
4193 g_variant_builder_add(builder, "{sv}", "GOIntent",
4194 g_variant_new_uint32(config->go_intent));
4196 g_variant_builder_add(builder, "{sv}", "PersistentReconnect",
4197 g_variant_new_boolean(config->persistent_reconnect));
4199 g_variant_builder_add(builder, "{sv}", "ListenRegClass",
4200 g_variant_new_uint32(config->listen_reg_class));
4202 g_variant_builder_add(builder, "{sv}", "ListenChannel",
4203 g_variant_new_uint32(config->listen_channel));
4205 g_variant_builder_add(builder, "{sv}", "OperRegClass",
4206 g_variant_new_uint32(config->operating_reg_class));
4208 g_variant_builder_add(builder, "{sv}", "OperChannel",
4209 g_variant_new_uint32(config->operating_channel));
4211 g_variant_builder_add(builder, "{sv}", "SsidPostfix",
4212 g_variant_new_string(config->device_name));
4214 g_variant_builder_add(builder, "{sv}", "NoGroupIface",
4215 g_variant_new_boolean(config->no_group_iface));
4217 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
4218 for (i = 0; i < WS_DEVTYPE_LEN; i++)
4219 g_variant_builder_add(type_builder, "y", primary_device_type[i]);
4220 g_variant_builder_add(builder, "{sv}", "PrimaryDeviceType",
4221 g_variant_new("ay", type_builder));
4222 g_variant_builder_unref(type_builder);
4223 value = g_variant_new("a{sv}", builder);
4224 g_variant_builder_unref(builder);
4226 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
4228 params.params = param;
4229 DEBUG_G_VARIANT("Params : ", params.params);
4231 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
4233 WDP_LOGE("Failed to send command to wpa_supplicant");
4235 WDP_LOGD("Succeeded to initialize p2pdevice");
4236 __WDP_LOG_FUNC_EXIT__;
4240 int __ws_set_config_methods(void)
4242 __WDP_LOG_FUNC_ENTER__;
4243 GDBusConnection *g_dbus = NULL;
4245 GVariant *value = NULL;
4246 GVariant *param = NULL;
4248 dbus_method_param_s params;
4252 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4253 __WDP_LOG_FUNC_EXIT__;
4258 WDP_LOGE("no configurable data found");
4259 __WDP_LOG_FUNC_EXIT__;
4263 g_dbus = g_pd->g_dbus;
4265 WDP_LOGE("DBus connection is NULL");
4266 __WDP_LOG_FUNC_EXIT__;
4269 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4271 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
4274 value = g_variant_new_string(config->config_methods);
4276 param = g_variant_new("(ssv)", SUPPLICANT_WPS, "ConfigMethods", value);
4277 params.params = param;
4279 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
4281 WDP_LOGE("Failed to send command to wpa_supplicant");
4283 WDP_LOGD("Succeeded to set config method(%s)", config->config_methods);
4285 __WDP_LOG_FUNC_EXIT__;
4289 int ws_activate(int concurrent)
4291 __WDP_LOG_FUNC_ENTER__;
4293 int retry_count = 0;
4296 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4297 __WDP_LOG_FUNC_EXIT__;
4302 WDP_LOGE("no configurable data found");
4303 __WDP_LOG_FUNC_EXIT__;
4307 res = __ws_p2p_supplicant_start();
4309 res = __ws_p2p_supplicant_stop();
4310 WDP_LOGI("P2P supplicant stopped with error %d", res);
4311 __WDP_LOG_FUNC_EXIT__;
4315 while (retry_count < WS_CONN_RETRY_COUNT) {
4316 /* load wlan driver */
4317 if (concurrent == 0)
4318 res = __ws_p2p_firmware_start(config->ifname);
4320 WDP_LOGE("Failed to load driver [ret=%d]", res);
4323 WDP_LOGI("P2P firmware started with error %d", res);
4325 if (__ws_check_net_interface(config->ifname) < 0) {
4326 usleep(150000); /* wait for 150ms */
4329 WDP_LOGE("interface is not up: retry, %d", retry_count);
4335 if (retry_count >= WS_CONN_RETRY_COUNT) {
4336 WDP_LOGE("Driver loading is failed [%d]", res);
4337 __WDP_LOG_FUNC_EXIT__;
4340 if (retry_count > 0) {
4341 /* Give driver marginal time to config net */
4342 WDP_LOGE("Driver loading is done. Wait marginal time for driver");
4346 g_pd->concurrent = concurrent;
4348 res = _ws_init_dbus_connection();
4350 res = __ws_p2p_supplicant_stop();
4351 WDP_LOGI("[/usr/sbin/p2p_supp.sh stop] returns %d", res);
4352 res = __ws_p2p_firmware_stop(config->ifname);
4353 WDP_LOGI("P2P firmware stopped with error %d", res);
4354 __WDP_LOG_FUNC_EXIT__;
4358 g_pd->activated = TRUE;
4359 __ws_init_p2pdevice();
4360 __ws_set_config_methods();
4363 __WDP_LOG_FUNC_EXIT__;
4367 int ws_deactivate(int concurrent)
4369 __WDP_LOG_FUNC_ENTER__;
4370 wfd_oem_asp_service_s *data = NULL;
4374 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4375 __WDP_LOG_FUNC_EXIT__;
4380 WDP_LOGE("no configurable data found");
4381 __WDP_LOG_FUNC_EXIT__;
4385 if (!g_pd->activated) {
4386 WDP_LOGE("Wi-Fi Direct is not activated");
4387 __WDP_LOG_FUNC_EXIT__;
4393 g_pd->concurrent = concurrent;
4395 if (g_strcmp0(config->ifname, config->group_ifname) != 0)
4396 _ws_get_interface(config->group_ifname, __ws_remove_interface, NULL);
4397 if (concurrent == 0)
4398 _ws_get_interface(config->ifname, __ws_remove_interface, NULL);
4400 _ws_deinit_dbus_connection();
4402 if (concurrent == 0) {
4403 res = __ws_p2p_supplicant_stop();
4404 WDP_LOGI("[/usr/sbin/p2p_supp.sh stop] returns %d", res);
4405 res = __ws_p2p_firmware_stop(config->ifname);
4406 WDP_LOGI("P2P firmware stopped with error %d", res);
4408 g_pd->activated = FALSE;
4410 GLIST_ITER_START(seek_list, data)
4413 temp = g_list_next(seek_list);
4414 seek_list = g_list_remove(seek_list, data);
4415 g_free(data->service_type);
4416 g_free(data->service_info);
4421 __WDP_LOG_FUNC_EXIT__;
4426 static gboolean _retry_start_scan(gpointer data)
4428 __WDP_LOG_FUNC_ENTER__;
4430 WDP_LOGD("Succeeded to start scan");
4432 __WDP_LOG_FUNC_EXIT__;
4437 static void __ws_add_seek_params(GVariantBuilder *builder)
4439 GVariantBuilder *outter = NULL;
4440 GVariantBuilder *inner = NULL;
4441 wfd_oem_asp_service_s *data = NULL;
4445 if (seek_list == NULL || g_list_length(seek_list) == 0) {
4446 WDP_LOGD("seek list is NULL");
4449 WDP_LOGD("seek list length [%d]", g_list_length(seek_list));
4451 outter = g_variant_builder_new(G_VARIANT_TYPE("aay"));
4453 GLIST_ITER_START(seek_list, data)
4454 if (data && data->service_type) {
4455 len = strlen(data->service_type) + 1;
4456 WDP_LOGD("data [%s] len [%d]", data->service_type, len);
4457 inner = g_variant_builder_new(G_VARIANT_TYPE("ay"));
4458 for (i = 0; i < len; i++)
4459 g_variant_builder_add(inner, "y", data->service_type[i]);
4460 g_variant_builder_add(outter, "ay", inner);
4461 g_variant_builder_unref(inner);
4464 g_variant_builder_add(builder, "{sv}", "Seek", g_variant_new("aay", outter));
4465 g_variant_builder_unref(outter);
4470 int ws_start_scan(wfd_oem_scan_param_s *param)
4472 __WDP_LOG_FUNC_ENTER__;
4473 GDBusConnection *g_dbus = NULL;
4474 GVariantBuilder *builder = NULL;
4475 GVariant *value = NULL;
4476 dbus_method_param_s params;
4480 WDP_LOGE("Invalid parameter");
4481 __WDP_LOG_FUNC_EXIT__;
4486 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4487 __WDP_LOG_FUNC_EXIT__;
4491 g_dbus = g_pd->g_dbus;
4493 WDP_LOGE("DBus connection is NULL");
4494 __WDP_LOG_FUNC_EXIT__;
4497 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4499 if (param->scan_mode == WFD_OEM_SCAN_MODE_ACTIVE) {
4501 dbus_set_method_param(¶ms, "Find", g_pd->iface_path, g_dbus);
4503 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4505 if (param->scan_time)
4506 g_variant_builder_add(builder, "{sv}", "Timeout",
4507 g_variant_new_int32(param->scan_time));
4508 if (param->scan_type == WFD_OEM_SCAN_TYPE_SOCIAL)
4509 g_variant_builder_add(builder, "{sv}", "DiscoveryType",
4510 g_variant_new_string("social"));
4511 if (seek_list != NULL)
4512 __ws_add_seek_params(builder);
4514 value = g_variant_new("(a{sv})", builder);
4515 g_variant_builder_unref(builder);
4518 dbus_set_method_param(¶ms, "Listen", g_pd->iface_path, g_dbus);
4519 value = g_variant_new("(i)", param->scan_time);
4522 params.params = value;
4523 DEBUG_G_VARIANT("Params : ", params.params);
4525 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4527 WDP_LOGE("Failed to send command to wpa_supplicant");
4529 WDP_LOGD("Succeeded to start scan");
4531 __WDP_LOG_FUNC_EXIT__;
4535 int ws_restart_scan(int freq)
4537 __WDP_LOG_FUNC_ENTER__;
4538 GDBusConnection *g_dbus = NULL;
4539 GVariantBuilder *builder = NULL;
4540 GVariant *value = NULL;
4541 dbus_method_param_s params;
4545 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4546 __WDP_LOG_FUNC_EXIT__;
4550 g_dbus = g_pd->g_dbus;
4552 WDP_LOGE("DBus connection is NULL");
4553 __WDP_LOG_FUNC_EXIT__;
4556 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4558 dbus_set_method_param(¶ms, "Find", g_pd->iface_path, g_dbus);
4560 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4561 g_variant_builder_add(builder, "{sv}", "Timeout", g_variant_new_int32(2));
4562 g_variant_builder_add(builder, "{sv}", "DiscoveryType",
4563 g_variant_new_string("social"));
4564 value = g_variant_new("(a{sv})", builder);
4565 g_variant_builder_unref(builder);
4567 params.params = value;
4568 DEBUG_G_VARIANT("Params : ", params.params);
4570 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4572 WDP_LOGE("Failed to send command to wpa_supplicant");
4574 WDP_LOGD("Succeeded to start scan");
4576 __WDP_LOG_FUNC_EXIT__;
4580 int ws_stop_scan(void)
4582 __WDP_LOG_FUNC_ENTER__;
4583 GDBusConnection *g_dbus = NULL;
4584 dbus_method_param_s params;
4588 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4589 __WDP_LOG_FUNC_EXIT__;
4593 g_dbus = g_pd->g_dbus;
4595 WDP_LOGE("DBus connection is NULL");
4596 __WDP_LOG_FUNC_EXIT__;
4599 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4601 dbus_set_method_param(¶ms, "StopFind", g_pd->iface_path, g_dbus);
4602 params.params = NULL;
4604 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4606 WDP_LOGE("Failed to send command to wpa_supplicant");
4608 WDP_LOGD("Succeeded to stop scan");
4610 __WDP_LOG_FUNC_EXIT__;
4614 int ws_get_visibility(int *visibility)
4616 __WDP_LOG_FUNC_ENTER__;
4618 __WDP_LOG_FUNC_EXIT__;
4622 int ws_set_visibility(int visibility)
4624 __WDP_LOG_FUNC_ENTER__;
4626 __WDP_LOG_FUNC_EXIT__;
4630 int ws_get_scan_result(GList **peers, int *peer_count)
4632 __WDP_LOG_FUNC_ENTER__;
4634 __WDP_LOG_FUNC_EXIT__;
4637 static wfd_oem_device_s *__create_oem_device(void)
4639 wfd_oem_device_s *device =
4640 (wfd_oem_device_s *) g_try_malloc0(sizeof(wfd_oem_device_s));
4642 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
4643 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
4644 WDP_LOGF("Failed to allocate memory for event. [%s]",
4651 int ws_get_peer_info(unsigned char *peer_addr, wfd_oem_device_s **peer)
4653 __WDP_LOG_FUNC_ENTER__;
4654 GDBusConnection *g_dbus = NULL;
4655 wfd_oem_device_s *device = NULL;
4656 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
4659 if (!peer_addr || !peer) {
4660 WDP_LOGE("Invalid parameter");
4661 __WDP_LOG_FUNC_EXIT__;
4666 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4667 __WDP_LOG_FUNC_EXIT__;
4671 g_dbus = g_pd->g_dbus;
4673 WDP_LOGE("DBus connection is NULL");
4674 __WDP_LOG_FUNC_EXIT__;
4678 device = __create_oem_device();
4680 __WDP_LOG_FUNC_EXIT__;
4684 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4685 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4687 WDP_LOGD("get peer path [%s]", peer_path);
4689 res = dbus_property_get_all(peer_path, g_dbus, SUPPLICANT_P2P_PEER,
4690 __ws_get_peer_property, device);
4693 WDP_LOGE("Failed to send command to wpa_supplicant");
4695 g_free(device->vsie);
4697 __WDP_LOG_FUNC_EXIT__;
4700 WDP_LOGD("succeeded to get peer info");
4704 //Memory ownership of dev_data is transferred to method handler
4705 //which uses this function.
4707 __WDP_LOG_FUNC_EXIT__;
4711 int ws_prov_disc_req(unsigned char *peer_addr, wfd_oem_wps_mode_e wps_mode, int join)
4713 __WDP_LOG_FUNC_ENTER__;
4714 GDBusConnection *g_dbus = NULL;
4715 GVariant *value = NULL;
4716 dbus_method_param_s params;
4717 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
4721 WDP_LOGE("Invalid parameter");
4722 __WDP_LOG_FUNC_EXIT__;
4727 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4728 __WDP_LOG_FUNC_EXIT__;
4732 g_dbus = g_pd->g_dbus;
4734 WDP_LOGE("DBus connection is NULL");
4735 __WDP_LOG_FUNC_EXIT__;
4738 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4740 dbus_set_method_param(¶ms, "ProvisionDiscoveryRequest", g_pd->iface_path, g_dbus);
4742 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4743 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4744 WDP_LOGD("get peer path [%s]", peer_path);
4746 value = g_variant_new("(os)", peer_path, __ws_wps_to_txt(wps_mode));
4748 params.params = value;
4749 DEBUG_G_VARIANT("Params : ", params.params);
4751 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4753 WDP_LOGE("Failed to send command to wpa_supplicant");
4755 WDP_LOGD("Succeeded to send prov disc to peer[" MACSTR "]", MAC2STR(peer_addr));
4757 __WDP_LOG_FUNC_EXIT__;
4761 int ws_connect(unsigned char *peer_addr, wfd_oem_conn_param_s *param)
4763 __WDP_LOG_FUNC_ENTER__;
4764 GDBusConnection *g_dbus = NULL;
4765 GVariantBuilder *builder = NULL;
4766 GVariant *value = NULL;
4767 dbus_method_param_s params;
4768 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
4771 if (!peer_addr || !param) {
4772 WDP_LOGE("Invalid parameter");
4773 __WDP_LOG_FUNC_EXIT__;
4778 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4779 __WDP_LOG_FUNC_EXIT__;
4783 g_dbus = g_pd->g_dbus;
4785 WDP_LOGE("DBus connection is NULL");
4786 __WDP_LOG_FUNC_EXIT__;
4789 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4791 dbus_set_method_param(¶ms, "Connect", g_pd->iface_path, g_dbus);
4793 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4794 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4795 WDP_LOGD("get peer path [%s]", peer_path);
4797 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4798 g_variant_builder_add(builder, "{sv}", "peer", g_variant_new_object_path(peer_path));
4799 if (param->conn_flags & WFD_OEM_CONN_TYPE_PERSISTENT)
4800 g_variant_builder_add(builder, "{sv}", "persistent", g_variant_new_boolean(TRUE));
4802 if (param->conn_flags & WFD_OEM_CONN_TYPE_JOIN)
4803 g_variant_builder_add(builder, "{sv}", "join", g_variant_new_boolean(TRUE));
4805 if (param->conn_flags & WFD_OEM_CONN_TYPE_AUTH)
4806 g_variant_builder_add(builder, "{sv}", "autorize_only", g_variant_new_boolean(TRUE));
4808 if (param->wps_pin[0] != '\0')
4809 g_variant_builder_add(builder, "{sv}", "pin", g_variant_new_string(param->wps_pin));
4811 g_variant_builder_add(builder, "{sv}", "wps_method",
4812 g_variant_new_string(__ws_wps_to_txt(param->wps_mode)));
4814 value = g_variant_new("(a{sv})", builder);
4815 g_variant_builder_unref(builder);
4817 params.params = value;
4818 DEBUG_G_VARIANT("Params : ", params.params);
4820 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4822 WDP_LOGE("Failed to send command to wpa_supplicant");
4824 WDP_LOGD("Succeeded to send connection command to peer[" MACSTR "]", MAC2STR(peer_addr));
4826 __WDP_LOG_FUNC_EXIT__;
4830 int ws_disconnect(unsigned char *peer_addr, int is_iface_addr)
4832 __WDP_LOG_FUNC_ENTER__;
4833 GDBusConnection *g_dbus = NULL;
4834 GVariant *value = NULL;
4835 dbus_method_param_s params;
4836 GVariantBuilder *builder = NULL;
4840 WDP_LOGE("Invalid parameter");
4841 __WDP_LOG_FUNC_EXIT__;
4846 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4847 __WDP_LOG_FUNC_EXIT__;
4851 g_dbus = g_pd->g_dbus;
4853 WDP_LOGE("DBus connection is NULL");
4854 __WDP_LOG_FUNC_EXIT__;
4857 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4859 dbus_set_method_param(¶ms, "RemoveClient", g_pd->iface_path, g_dbus);
4860 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4862 if (is_iface_addr) {
4863 char peer_mac_str[WS_MACSTR_LEN] = {'\0', };
4865 g_snprintf(peer_mac_str, WS_MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
4866 WDP_LOGI("peer addr [%s]", peer_mac_str);
4867 g_variant_builder_add(builder, "{sv}", "iface",
4868 g_variant_new_string(peer_mac_str));
4870 char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0', };
4872 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4873 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4874 g_variant_builder_add(builder, "{sv}", "peer",
4875 g_variant_new_object_path(peer_path));
4878 value = g_variant_new("(a{sv})", builder);
4879 g_variant_builder_unref(builder);
4881 params.params = value;
4882 DEBUG_G_VARIANT("Params : ", params.params);
4884 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4886 WDP_LOGE("Failed to send command to wpa_supplicant");
4888 WDP_LOGD("Succeeded to send disconnection command to peer[" MACSECSTR "]",
4889 MAC2SECSTR(peer_addr));
4891 __WDP_LOG_FUNC_EXIT__;
4895 int ws_reject_connection(unsigned char *peer_addr)
4897 __WDP_LOG_FUNC_ENTER__;
4898 GDBusConnection *g_dbus = NULL;
4899 GVariant *value = NULL;
4900 dbus_method_param_s params;
4901 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
4905 WDP_LOGE("Invalid parameter");
4906 __WDP_LOG_FUNC_EXIT__;
4911 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4912 __WDP_LOG_FUNC_EXIT__;
4916 g_dbus = g_pd->g_dbus;
4918 WDP_LOGE("DBus connection is NULL");
4919 __WDP_LOG_FUNC_EXIT__;
4922 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4924 dbus_set_method_param(¶ms, "RejectPeer", g_pd->iface_path, g_dbus);
4926 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4927 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4928 WDP_LOGE("get peer path [%s]", peer_path);
4930 value = g_variant_new("(o)", peer_path);
4932 params.params = value;
4933 DEBUG_G_VARIANT("Params : ", params.params);
4935 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4937 WDP_LOGE("Failed to send command to wpa_supplicant");
4939 WDP_LOGD("Succeeded to reject peer[" MACSTR "]", MAC2STR(peer_addr));
4942 __WDP_LOG_FUNC_EXIT__;
4946 int ws_cancel_connection(unsigned char *peer_addr)
4948 __WDP_LOG_FUNC_ENTER__;
4952 __WDP_LOG_FUNC_EXIT__;
4956 int ws_get_connected_peers(GList **peers, int *peer_count)
4958 __WDP_LOG_FUNC_ENTER__;
4960 __WDP_LOG_FUNC_EXIT__;
4964 int ws_get_pin(char *pin)
4966 __WDP_LOG_FUNC_ENTER__;
4968 __WDP_LOG_FUNC_EXIT__;
4972 int ws_set_pin(char *pin)
4974 __WDP_LOG_FUNC_ENTER__;
4976 __WDP_LOG_FUNC_EXIT__;
4980 static void __ws_get_pin(GVariant *value, void *user_data)
4982 __WDP_LOG_FUNC_ENTER__;
4983 const char *pin = NULL;
4985 g_variant_get(value, "(&s)", &pin);
4986 g_strlcpy((char *)user_data, pin, OEM_PINSTR_LEN + 1);
4988 __WDP_LOG_FUNC_EXIT__;
4992 int ws_generate_pin(char **pin)
4994 __WDP_LOG_FUNC_ENTER__;
4995 GDBusConnection *g_dbus = NULL;
4996 dbus_method_param_s params;
4997 char n_pin[9] = {0,};
5001 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5005 g_dbus = g_pd->g_dbus;
5007 WDP_LOGE("DBus connection is NULL");
5010 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5012 dbus_set_method_param(¶ms, "GeneratePin", g_pd->iface_path, g_dbus);
5013 params.params = NULL;
5015 res = dbus_method_call(¶ms, SUPPLICANT_WPS, __ws_get_pin, (void *)n_pin);
5017 WDP_LOGE("Failed to send command to wpa_supplicant");
5019 WDP_LOGD("Succeeded to generate_pin [ %s ]", n_pin);
5021 *pin = strndup(n_pin, OEM_PINSTR_LEN);
5022 __WDP_LOG_FUNC_EXIT__;
5026 int ws_get_supported_wps_mode(int *wps_mode)
5028 __WDP_LOG_FUNC_ENTER__;
5030 WDP_LOGE("Invalid parameter");
5031 __WDP_LOG_FUNC_EXIT__;
5035 *wps_mode = wps_config_method;
5036 __WDP_LOG_FUNC_EXIT__;
5040 int _ws_get_persistent_net_id(int *persistent_network_id, const unsigned char *go_dev_mac)
5042 __WDP_LOG_FUNC_ENTER__;
5043 int persistent_group_count = 0;
5047 wfd_oem_persistent_group_s *plist = NULL;
5049 res = ws_get_persistent_groups(&plist, &persistent_group_count);
5051 WDP_LOGE("failed to get persistent groups");
5052 __WDP_LOG_FUNC_EXIT__;
5056 if (persistent_group_count > WS_MAX_PERSISTENT_COUNT) {
5057 WDP_LOGE("persistent group count greater than max Persistent count");
5058 persistent_group_count = WS_MAX_PERSISTENT_COUNT;
5061 WDP_LOGD("Persistent Group Count=%d", persistent_group_count);
5063 for (counter = 0; counter < persistent_group_count ; counter++) {
5064 if (!memcmp(go_dev_mac, plist[counter].go_mac_address, WS_MACADDR_LEN)) {
5065 *persistent_network_id = plist[counter].network_id;
5068 WDP_LOGD("Invite: Persistent GO[" MACSTR "], GO Addr[" MACSTR "]",
5069 MAC2STR(plist[counter].go_mac_address), MAC2STR(go_dev_mac));
5075 WDP_LOGD("persistent network ID : [%d]", *persistent_network_id);
5077 __WDP_LOG_FUNC_EXIT__;
5081 static void __store_group_iface_path(GVariant* value, void* user_data)
5083 __WDP_LOG_FUNC_ENTER__;
5084 ws_dbus_plugin_data_s * pd_data;
5085 const char *path = NULL;
5088 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5092 pd_data = (ws_dbus_plugin_data_s *) g_pd;
5094 g_variant_get(value, "(&o)", &path);
5095 g_strlcpy(pd_data->group_iface_path, path, DBUS_OBJECT_PATH_MAX);
5097 WDP_LOGD("group object path [%s]", pd_data->group_iface_path);
5098 /* subscribe interface p2p signal */
5101 int ws_create_group(wfd_oem_group_param_s *param)
5103 __WDP_LOG_FUNC_ENTER__;
5104 GDBusConnection *g_dbus = NULL;
5105 GVariantBuilder *builder = NULL;
5106 GVariant *value = NULL;
5107 dbus_method_param_s params;
5108 char persistent_group_obj_path[OBJECT_PATH_MAX] = {0,};
5112 WDP_LOGE("Invalid parameter");
5113 __WDP_LOG_FUNC_EXIT__;
5118 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5119 __WDP_LOG_FUNC_EXIT__;
5123 g_dbus = g_pd->g_dbus;
5125 WDP_LOGE("DBus connection is NULL");
5126 __WDP_LOG_FUNC_EXIT__;
5129 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5131 dbus_set_method_param(¶ms, "GroupAdd", g_pd->iface_path, g_dbus);
5133 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
5135 if (param->persistent > 0) {
5136 unsigned char mac_address[WS_MACADDR_LEN] = {0x00, };
5137 int persistent_group_id = -1;
5139 res = _ws_get_local_dev_mac(mac_address);
5141 WDP_LOGE("failed to get local mac address");
5142 __WDP_LOG_FUNC_EXIT__;
5146 res = _ws_get_persistent_net_id(&persistent_group_id, mac_address);
5148 WDP_LOGE("failed to get persistent group ID");
5149 __WDP_LOG_FUNC_EXIT__;
5153 WDP_LOGD("persistent network ID : [%d]", persistent_group_id);
5155 g_variant_builder_add(builder, "{sv}", "persistent",
5156 g_variant_new_boolean(TRUE));
5157 if (persistent_group_id > -1) {
5158 g_snprintf(persistent_group_obj_path, OBJECT_PATH_MAX,
5159 "%s/" SUPPLICANT_PERSISTENT_GROUPS_PART "/%d",
5160 g_pd->iface_path, persistent_group_id);
5161 g_variant_builder_add(builder, "{sv}", "persistent_group_object",
5162 g_variant_new_object_path(persistent_group_obj_path));
5166 g_variant_builder_add(builder, "{sv}", "persistent",
5167 g_variant_new_boolean(FALSE));
5170 if (param->passphrase && strlen(param->passphrase) > 0)
5171 g_variant_builder_add(builder, "{sv}", "passphrase",
5172 g_variant_new_string(param->passphrase));
5174 if (param->ssid && strlen(param->ssid) > 0)
5175 g_variant_builder_add(builder, "{sv}", "ssid",
5176 g_variant_new_string(param->ssid));
5179 g_variant_builder_add(builder, "{sv}", "frequency",
5180 g_variant_new_int32(param->freq));
5182 value = g_variant_new("(a{sv})", builder);
5183 g_variant_builder_unref(builder);
5185 params.params = value;
5186 DEBUG_G_VARIANT("Params : ", params.params);
5188 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE,
5189 __store_group_iface_path, g_pd);
5191 WDP_LOGE("Failed to send command to wpa_supplicant");
5193 WDP_LOGD("Succeeded to add group");
5195 __WDP_LOG_FUNC_EXIT__;
5199 int ws_destroy_group(const char *ifname)
5201 __WDP_LOG_FUNC_ENTER__;
5202 GDBusConnection *g_dbus = NULL;
5203 dbus_method_param_s params;
5207 WDP_LOGE("Invalid parameter");
5212 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5213 __WDP_LOG_FUNC_EXIT__;
5217 g_dbus = g_pd->g_dbus;
5219 WDP_LOGE("DBus connection is NULL");
5220 __WDP_LOG_FUNC_EXIT__;
5224 if (g_pd->group_iface_path[0] == 0) {
5225 WDP_LOGE("group iface path is NULL");
5229 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5231 dbus_set_method_param(¶ms, "Disconnect", g_pd->group_iface_path, g_dbus);
5232 params.params = NULL;
5234 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
5236 WDP_LOGE("Failed to send command to wpa_supplicant");
5237 __WDP_LOG_FUNC_EXIT__;
5241 WDP_LOGD("Succeeded to remove group");
5244 __WDP_LOG_FUNC_EXIT__;
5248 int ws_invite(unsigned char *peer_addr, wfd_oem_invite_param_s *param)
5250 __WDP_LOG_FUNC_ENTER__;
5251 GDBusConnection *g_dbus = NULL;
5252 GVariantBuilder *builder = NULL;
5253 GVariant *value = NULL;
5254 dbus_method_param_s params;
5255 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
5258 if (!peer_addr || !param) {
5259 WDP_LOGE("Invalid parameter");
5264 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5265 __WDP_LOG_FUNC_EXIT__;
5269 g_dbus = g_pd->g_dbus;
5271 WDP_LOGE("DBus connection is NULL");
5272 __WDP_LOG_FUNC_EXIT__;
5275 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5277 dbus_set_method_param(¶ms, "Invite", g_pd->group_iface_path, g_dbus);
5279 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
5280 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
5281 WDP_LOGE("get peer path [%s]", peer_path);
5283 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
5284 g_variant_builder_add(builder, "{sv}", "peer", g_variant_new_object_path(peer_path));
5285 value = g_variant_new("(a{sv})", builder);
5286 g_variant_builder_unref(builder);
5288 params.params = value;
5289 DEBUG_G_VARIANT("Params : ", params.params);
5291 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
5293 WDP_LOGE("Failed to send command to wpa_supplicant");
5295 WDP_LOGD("Succeeded to invite peer[" MACSTR "]", MAC2STR(peer_addr));
5297 __WDP_LOG_FUNC_EXIT__;
5301 /* Only group owner can use this command */
5302 int ws_wps_start(unsigned char *peer_addr, int wps_mode, const char *pin)
5304 __WDP_LOG_FUNC_ENTER__;
5305 GDBusConnection *g_dbus = NULL;
5306 GVariantBuilder *builder = NULL;
5307 GVariant *value = NULL;
5308 GVariant *dev_addr = NULL;
5309 dbus_method_param_s params;
5314 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5315 __WDP_LOG_FUNC_EXIT__;
5319 g_dbus = g_pd->g_dbus;
5321 WDP_LOGE("DBus connection is NULL");
5322 __WDP_LOG_FUNC_EXIT__;
5326 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5328 dbus_set_method_param(¶ms, "Start", g_pd->group_iface_path, g_dbus);
5330 if (peer_addr != NULL) {
5331 builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
5332 for (i = 0; i < WS_MACADDR_LEN; i++)
5333 g_variant_builder_add(builder, "y", peer_addr[i]);
5335 dev_addr = g_variant_new("ay", builder);
5336 g_variant_builder_unref(builder);
5339 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
5340 g_variant_builder_add(builder, "{sv}", "Role", g_variant_new_string("enrollee"));
5341 if (peer_addr != NULL)
5342 g_variant_builder_add(builder, "{sv}", "P2PDeviceAddress", dev_addr);
5344 if (pin != NULL && pin[0] != '\0') {
5345 g_variant_builder_add(builder, "{sv}", "Type", g_variant_new_string("pin"));
5346 g_variant_builder_add(builder, "{sv}", "Pin", g_variant_new_string(pin));
5348 g_variant_builder_add(builder, "{sv}", "Type", g_variant_new_string("pbc"));
5351 value = g_variant_new("(a{sv})", builder);
5352 g_variant_builder_unref(builder);
5354 params.params = value;
5355 DEBUG_G_VARIANT("Params : ", params.params);
5357 res = dbus_method_call(¶ms, SUPPLICANT_WPS, NULL, NULL);
5359 WDP_LOGE("Failed to send command to wpa_supplicant");
5361 WDP_LOGD("Succeeded to run wps");
5363 __WDP_LOG_FUNC_EXIT__;
5367 int ws_enrollee_start(unsigned char *peer_addr, int wps_mode, const char *pin)
5369 __WDP_LOG_FUNC_ENTER__;
5371 WDP_LOGD("Succeeded to start WPS");
5373 __WDP_LOG_FUNC_EXIT__;
5377 int ws_wps_cancel(void)
5379 __WDP_LOG_FUNC_ENTER__;
5380 GDBusConnection *g_dbus = NULL;
5381 dbus_method_param_s params;
5384 g_dbus = g_pd->g_dbus;
5386 WDP_LOGE("DBus connection is NULL");
5387 __WDP_LOG_FUNC_EXIT__;
5390 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5392 dbus_set_method_param(¶ms, "Cancel", g_pd->group_iface_path, g_dbus);
5393 params.params = NULL;
5395 res = dbus_method_call(¶ms, SUPPLICANT_WPS, NULL, NULL);
5397 WDP_LOGE("Failed to send command to wpa_supplicant");
5399 WDP_LOGD("Succeeded to cancel WPS");
5401 __WDP_LOG_FUNC_EXIT__;
5405 int ws_get_dev_name(char *dev_name)
5407 __WDP_LOG_FUNC_ENTER__;
5409 __WDP_LOG_FUNC_EXIT__;
5413 int ws_set_dev_name(char *dev_name)
5415 __WDP_LOG_FUNC_ENTER__;
5416 GDBusConnection *g_dbus = NULL;
5418 GVariant *value = NULL;
5419 GVariant *param = NULL;
5420 GVariantBuilder *builder = NULL;
5421 dbus_method_param_s params;
5425 WDP_LOGE("Invalid parameter");
5426 __WDP_LOG_FUNC_EXIT__;
5431 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5432 __WDP_LOG_FUNC_EXIT__;
5436 g_dbus = g_pd->g_dbus;
5438 WDP_LOGE("DBus connection is NULL");
5439 __WDP_LOG_FUNC_EXIT__;
5442 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5444 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
5447 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
5448 g_variant_builder_add(builder, "{sv}", "DeviceName",
5449 g_variant_new_string(dev_name));
5450 g_variant_builder_add(builder, "{sv}", "SsidPostfix",
5451 g_variant_new_string(dev_name));
5452 value = g_variant_new("a{sv}", builder);
5453 g_variant_builder_unref(builder);
5455 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE,
5456 "P2PDeviceConfig", value);
5458 params.params = param;
5459 DEBUG_G_VARIANT("Params : ", params.params);
5461 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
5463 WDP_LOGE("Failed to send command to wpa_supplicant");
5465 WDP_LOGD("Succeeded to set device name");
5467 __WDP_LOG_FUNC_EXIT__;
5471 int ws_get_dev_mac(char *dev_mac)
5473 __WDP_LOG_FUNC_ENTER__;
5475 __WDP_LOG_FUNC_EXIT__;
5479 int ws_get_dev_type(int *pri_dev_type, int *sec_dev_type)
5481 __WDP_LOG_FUNC_ENTER__;
5483 __WDP_LOG_FUNC_EXIT__;
5487 int ws_set_dev_type(int pri_dev_type, int sec_dev_type)
5489 __WDP_LOG_FUNC_ENTER__;
5491 __WDP_LOG_FUNC_EXIT__;
5495 int ws_get_go_intent(int *go_intent)
5497 __WDP_LOG_FUNC_ENTER__;
5498 GDBusConnection *g_dbus = NULL;
5499 GVariant *param = NULL;
5500 GVariant *reply = NULL;
5501 GError *error = NULL;
5502 GVariantIter *iter = NULL;
5506 WDP_LOGE("Invalid parameter");
5511 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5512 __WDP_LOG_FUNC_EXIT__;
5516 g_dbus = g_pd->g_dbus;
5518 WDP_LOGE("DBus connection is NULL");
5519 __WDP_LOG_FUNC_EXIT__;
5523 param = g_variant_new("(ss)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig");
5524 DEBUG_G_VARIANT("Params : ", param);
5526 reply = g_dbus_connection_call_sync(
5528 SUPPLICANT_SERVICE, /* bus name */
5529 g_pd->iface_path, /* object path */
5530 DBUS_PROPERTIES_INTERFACE, /* interface name */
5531 DBUS_PROPERTIES_METHOD_GET, /* method name */
5532 param, /* GVariant *params */
5533 NULL, /* reply_type */
5534 G_DBUS_CALL_FLAGS_NONE, /* flags */
5535 SUPPLICANT_TIMEOUT , /* timeout */
5536 NULL, /* cancellable */
5537 &error); /* error */
5539 if (error != NULL) {
5540 WDP_LOGE("Error! Failed to get interface State: [%s]",
5542 g_error_free(error);
5544 g_variant_unref(reply);
5545 __WDP_LOG_FUNC_EXIT__;
5549 if (reply != NULL) {
5550 g_variant_get(reply, "(a{sv})", &iter);
5554 GVariant *value = NULL;
5556 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
5557 CHECK_KEY_VALUE(key, value);
5559 if (g_strcmp0(key, "GOIntent") == 0)
5560 g_variant_get(value, "u", go_intent);
5562 g_variant_iter_free(iter);
5564 g_variant_unref(reply);
5566 __WDP_LOG_FUNC_EXIT__;
5570 int ws_set_go_intent(int go_intent)
5572 __WDP_LOG_FUNC_ENTER__;
5573 GDBusConnection *g_dbus = NULL;
5575 GVariant *value = NULL;
5576 GVariant *param = NULL;
5577 GVariantBuilder *builder = NULL;
5578 dbus_method_param_s params;
5582 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5583 __WDP_LOG_FUNC_EXIT__;
5587 g_dbus = g_pd->g_dbus;
5589 WDP_LOGE("DBus connection is NULL");
5590 __WDP_LOG_FUNC_EXIT__;
5593 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5595 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
5598 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
5599 g_variant_builder_add(builder, "{sv}", "GOIntent",
5600 g_variant_new_uint32(go_intent));
5601 value = g_variant_new("a{sv}", builder);
5602 g_variant_builder_unref(builder);
5604 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
5606 params.params = param;
5607 DEBUG_G_VARIANT("Params : ", params.params);
5609 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
5611 WDP_LOGE("Failed to send command to wpa_supplicant");
5613 WDP_LOGE("Succeeded to set go intent");
5614 __WDP_LOG_FUNC_EXIT__;
5618 int ws_set_country(char *ccode)
5620 __WDP_LOG_FUNC_ENTER__;
5621 __WDP_LOG_FUNC_ENTER__;
5622 GDBusConnection *g_dbus = NULL;
5624 GVariant *value = NULL;
5625 GVariant *param = NULL;
5627 dbus_method_param_s params;
5631 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5632 __WDP_LOG_FUNC_EXIT__;
5636 g_dbus = g_pd->g_dbus;
5638 WDP_LOGE("DBus connection is NULL");
5639 __WDP_LOG_FUNC_EXIT__;
5642 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5644 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
5647 value = g_variant_new_string(ccode);
5649 param = g_variant_new("(ssv)", SUPPLICANT_IFACE, "Country", value);
5651 params.params = param;
5652 DEBUG_G_VARIANT("Params : ", params.params);
5654 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
5656 WDP_LOGE("Failed to send command to wpa_supplicant");
5658 WDP_LOGD("Succeeded to set country(%s)", ccode);
5660 __WDP_LOG_FUNC_EXIT__;
5664 void __parsing_networks(const char* key, GVariant* value, void* user_data)
5666 __WDP_LOG_FUNC_ENTER__;
5668 __WDP_LOG_FUNC_EXIT__;
5672 ws_network_info_s *network = (ws_network_info_s *)user_data;
5674 CHECK_KEY_VALUE(key, value);
5676 if (g_strcmp0(key, "ssid") == 0) {
5677 const char *ssid = NULL;
5678 g_variant_get(value, "&s", &ssid);
5679 WDP_LOGD("ssid [%s]", ssid);
5680 g_strlcpy(network->ssid, ssid + 1, WS_SSID_LEN + 1);
5681 network->ssid[strlen(ssid) - 2] = '\0';
5683 } else if (g_strcmp0(key, "bssid") == 0) {
5684 unsigned char *bssid = NULL;
5685 g_variant_get(value, "&s", &bssid);
5686 WDP_LOGD("bssid [%s]", bssid);
5687 __ws_txt_to_mac(bssid, network->bssid);
5689 } else if (g_strcmp0(key, "proto") == 0) {
5690 const char *proto = NULL;
5691 g_variant_get(value, "&s", &proto);
5692 WDP_LOGD("proto [%s]", proto);
5694 if (g_strrstr(proto, WFD_OEM_STR_PROTO_WPA) != NULL)
5695 network->proto |= WFD_OEM_PROTO_WPA;
5696 if (g_strrstr(proto, WFD_OEM_STR_PROTO_RSN) != NULL)
5697 network->proto |= WFD_OEM_PROTO_RSN;
5699 } else if (g_strcmp0(key, "key_mgmt") == 0) {
5700 const char *key_mgmt = NULL;
5701 g_variant_get(value, "&s", &key_mgmt);
5702 WDP_LOGD("key_mgmt [%s]", key_mgmt);
5704 if (g_strrstr(key_mgmt, WFD_OEM_STR_KEY_MGMT_IEEE8021X) != NULL)
5705 network->key_mgmt |= WFD_OEM_KEY_MGMT_IEEE8021X;
5706 if (g_strrstr(key_mgmt, WFD_OEM_STR_KEY_MGMT_PSK) != NULL)
5707 network->key_mgmt |= WFD_OEM_KEY_MGMT_PSK;
5708 if (g_strrstr(key_mgmt, WFD_OEM_STR_KEY_MGMT_NONE) != NULL)
5709 network->key_mgmt |= WFD_OEM_KEY_MGMT_NONE;
5711 } else if (g_strcmp0(key, "pairwise") == 0) {
5712 const char *pairwise = NULL;
5713 g_variant_get(value, "&s", &pairwise);
5714 WDP_LOGD("pairwise [%s]", pairwise);
5716 if (g_strrstr(pairwise, WFD_OEM_STR_CIPHER_NONE) != NULL)
5717 network->pairwise |= WFD_OEM_CIPHER_NONE;
5718 if (g_strrstr(pairwise, WFD_OEM_STR_CIPHER_TKIP) != NULL)
5719 network->pairwise |= WFD_OEM_CIPHER_TKIP;
5720 if (g_strrstr(pairwise, WFD_OEM_STR_CIPHER_CCMP) != NULL)
5721 network->pairwise |= WFD_OEM_CIPHER_CCMP;
5723 } else if (g_strcmp0(key, "group") == 0) {
5724 const char *group = NULL;
5725 g_variant_get(value, "&s", &group);
5726 WDP_LOGD("group [%s]", group);
5728 if (g_strrstr(group, WFD_OEM_STR_CIPHER_NONE) != NULL)
5729 network->group |= WFD_OEM_CIPHER_NONE;
5730 if (g_strrstr(group, WFD_OEM_STR_CIPHER_WEP40) != NULL)
5731 network->group |= WFD_OEM_CIPHER_WEP40;
5732 if (g_strrstr(group, WFD_OEM_STR_CIPHER_WEP104) != NULL)
5733 network->group |= WFD_OEM_CIPHER_WEP104;
5734 if (g_strrstr(group, WFD_OEM_STR_CIPHER_TKIP) != NULL)
5735 network->group |= WFD_OEM_CIPHER_TKIP;
5736 if (g_strrstr(group, WFD_OEM_STR_CIPHER_CCMP) != NULL)
5737 network->group |= WFD_OEM_CIPHER_CCMP;
5739 } else if (g_strcmp0(key, "auth_alg") == 0) {
5740 const char *auth_alg = NULL;
5741 g_variant_get(value, "&s", &auth_alg);
5742 WDP_LOGD("auth_alg [%s]", auth_alg);
5744 if (g_strrstr(auth_alg, WFD_OEM_STR_AUTH_ALG_OPEN) != NULL)
5745 network->auth_alg |= WFD_OEM_AUTH_ALG_OPEN;
5747 } else if (g_strcmp0(key, "mode") == 0) {
5748 const char *mode = NULL;
5749 g_variant_get(value, "&s", &mode);
5750 WDP_LOGD("mode [%s]", mode);
5752 if (g_strrstr(mode, WFD_OEM_STR_MODE_GC) != NULL)
5753 network->mode |= WFD_OEM_PERSISTENT_MODE_GC;
5754 if (g_strrstr(mode, WFD_OEM_STR_MODE_GO) != NULL)
5755 network->mode |= WFD_OEM_PERSISTENT_MODE_GO;
5757 } else if (g_strcmp0(key, "p2p_client_list") == 0) {
5758 const char *p2p_client_list = NULL;
5763 g_variant_get(value, "&s", &p2p_client_list);
5764 WDP_LOGD("p2p_client_list [%s]", p2p_client_list);
5765 ptr = (char *)p2p_client_list;
5766 list_len = strlen(p2p_client_list);
5767 WDP_LOGD("list_len [%d]", list_len);
5768 while (ptr && list_len >= (OEM_MACSTR_LEN - 1)) {
5769 __ws_txt_to_mac((unsigned char *)ptr, (network->p2p_client_list[num]));
5770 ptr += OEM_MACSTR_LEN;
5771 list_len -= OEM_MACSTR_LEN;
5772 if (ptr && ptr[0] == ' ') {
5777 if (num >= OEM_MAX_PEER_NUM)
5780 network->p2p_client_num = num;
5781 WDP_LOGD("p2p_client_num [%d]", network->p2p_client_num);
5786 void __ws_extract_p2pdevice_details(const char *key, GVariant *value, void *user_data)
5788 __WDP_LOG_FUNC_ENTER__;
5789 CHECK_KEY_VALUE(key, value);
5791 if (g_strcmp0(key, "PersistentGroups") == 0) {
5792 GVariantIter *iter = NULL;
5793 const char *path = NULL;
5796 ws_network_info_s *networks = NULL;
5797 networks = (ws_network_info_s *)user_data;
5799 WDP_LOGE("network is NULL");
5800 __WDP_LOG_FUNC_EXIT__;
5804 g_variant_get(value, "ao", &iter);
5805 while (g_variant_iter_loop(iter, "&o", &path)) {
5808 if (num >= WS_MAX_PERSISTENT_COUNT)
5811 WDP_LOGD("Retrive persistent path [%s]", path);
5812 g_strlcpy(networks[num].persistent_path, path, DBUS_OBJECT_PATH_MAX);
5814 loc = strrchr(networks[num].persistent_path, '/');
5816 networks[num].network_id = strtoul(loc+1, NULL, 10);
5818 WDP_LOGD("Retrive persistent path [%s]", networks[num].persistent_path);
5819 dbus_property_get_all(networks[num].persistent_path, g_pd->g_dbus,
5820 SUPPLICANT_P2P_PERSISTENTGROUP, __parsing_networks, &networks[num]);
5824 networks[0].total = num;
5825 WDP_LOGI("total number [%d]", num);
5826 g_variant_iter_free(iter);
5828 __WDP_LOG_FUNC_EXIT__;
5832 int ws_get_persistent_groups(wfd_oem_persistent_group_s **groups, int *group_count)
5834 __WDP_LOG_FUNC_ENTER__;
5835 GDBusConnection *g_dbus = NULL;
5837 ws_network_info_s networks[WS_MAX_PERSISTENT_COUNT];
5838 wfd_oem_persistent_group_s *wfd_persistent_groups = NULL;
5842 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5843 __WDP_LOG_FUNC_EXIT__;
5847 g_dbus = g_pd->g_dbus;
5849 WDP_LOGE("DBus connection is NULL");
5850 __WDP_LOG_FUNC_EXIT__;
5854 memset(&networks, 0x0, WS_MAX_PERSISTENT_COUNT * sizeof(ws_network_info_s));
5855 dbus_property_get_all(g_pd->iface_path, g_dbus, SUPPLICANT_P2PDEVICE,
5856 __ws_extract_p2pdevice_details, &networks[0]);
5858 cnt = networks[0].total;
5860 WDP_LOGD("Persistent Group Count=%d", cnt);
5861 if (cnt > WS_MAX_PERSISTENT_COUNT) {
5862 WDP_LOGE("Persistent group count exceeded or parsing error");
5863 __WDP_LOG_FUNC_EXIT__;
5868 WDP_LOGE("Persistent group count zero");
5871 __WDP_LOG_FUNC_EXIT__;
5875 wfd_persistent_groups = (wfd_oem_persistent_group_s *) g_try_malloc0(cnt * sizeof(wfd_oem_persistent_group_s));
5876 if (wfd_persistent_groups == NULL) {
5877 WDP_LOGE("Failed to allocate memory for wfd_persistent_groups ");
5878 __WDP_LOG_FUNC_EXIT__;
5882 for (i = 0; i < cnt; i++) {
5885 WDP_LOGD("----persistent group [%d]----", i);
5886 WDP_LOGD("network_id [%d]", networks[i].network_id);
5887 WDP_LOGD("ssid [%s]", networks[i].ssid);
5888 WDP_LOGD("bssid ["MACSTR"]", MAC2STR(networks[i].bssid));
5889 WDP_LOGD("p2p_client_num [%d]", networks[i].p2p_client_num);
5890 for (j = 0; j < networks[i].p2p_client_num; j++)
5891 WDP_LOGD("p2p_client_list ["MACSTR"]", MAC2STR(networks[i].p2p_client_list[j]));
5893 wfd_persistent_groups[i].network_id = networks[i].network_id;
5894 g_strlcpy(wfd_persistent_groups[i].ssid, networks[i].ssid, WS_SSID_LEN + 1);
5895 memcpy(wfd_persistent_groups[i].go_mac_address, networks[i].bssid, WS_MACADDR_LEN);
5896 wfd_persistent_groups[i].p2p_client_num = networks[i].p2p_client_num;
5897 if (wfd_persistent_groups[i].p2p_client_num > 0)
5898 memcpy(wfd_persistent_groups[i].p2p_client_list, networks[i].p2p_client_list,
5899 OEM_MACADDR_LEN * OEM_MAX_PEER_NUM * sizeof(char));
5903 *groups = wfd_persistent_groups;
5905 __WDP_LOG_FUNC_EXIT__;
5909 int ws_remove_persistent_group(char *ssid, unsigned char *bssid)
5911 __WDP_LOG_FUNC_ENTER__;
5912 GDBusConnection *g_dbus = NULL;
5914 dbus_method_param_s params;
5915 ws_network_info_s networks[WS_MAX_PERSISTENT_COUNT];
5920 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5921 __WDP_LOG_FUNC_EXIT__;
5925 g_dbus = g_pd->g_dbus;
5927 WDP_LOGE("DBus connection is NULL");
5928 __WDP_LOG_FUNC_EXIT__;
5931 memset(&networks, 0x0, WS_MAX_PERSISTENT_COUNT * sizeof(ws_network_info_s));
5932 dbus_property_get_all(g_pd->iface_path, g_dbus, SUPPLICANT_P2PDEVICE,
5933 __ws_extract_p2pdevice_details, networks);
5935 cnt = networks[0].total;
5937 WDP_LOGD("Persistent Group Count=%d", cnt);
5938 if (cnt > WS_MAX_PERSISTENT_COUNT) {
5939 WDP_LOGE("Persistent group count exceeded or parsing error");
5940 __WDP_LOG_FUNC_EXIT__;
5944 for (i = 0; i < cnt; i++) {
5947 WDP_LOGD("----persistent group [%d]----", i);
5948 WDP_LOGD("network_id [%d]", networks[i].network_id);
5949 WDP_LOGD("network ssid [%s]", networks[i].ssid);
5950 WDP_LOGD("network bssid ["MACSTR"]", MAC2STR(networks[i].bssid));
5951 WDP_LOGD("network p2p_client_num [%d]", networks[i].p2p_client_num);
5952 for (j = 0; j < networks[i].p2p_client_num; j++)
5953 WDP_LOGD("network p2p_client_list ["MACSTR"]",
5954 MAC2STR(networks[i].p2p_client_list[j]));
5956 WDP_LOGD("ssid [%s]", ssid);
5957 WDP_LOGD("bssid ["MACSTR"]", MAC2STR(bssid));
5959 if (!g_strcmp0(ssid, networks[i].ssid) &&
5960 !memcmp(bssid, networks[i].bssid, WS_MACADDR_LEN)) {
5961 WDP_LOGD("Persistent group owner found [%d: %s]",
5962 networks[i].network_id, ssid);
5964 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5965 dbus_set_method_param(¶ms, "RemovePersistentGroup",
5966 g_pd->iface_path, g_dbus);
5967 params.params = g_variant_new("(o)", networks[i].persistent_path);
5968 DEBUG_G_VARIANT("Params : ", params.params);
5970 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
5972 WDP_LOGE("Failed to send command to wpa_supplicant");
5973 __WDP_LOG_FUNC_EXIT__;
5977 WDP_LOGD("Succeeded to remove persistent group");;
5983 WDP_LOGE("Persistent group not found [%s]", ssid);
5987 __WDP_LOG_FUNC_EXIT__;
5991 int ws_set_persistent_reconnect(unsigned char *bssid, int reconnect)
5993 __WDP_LOG_FUNC_ENTER__;
5994 GDBusConnection *g_dbus = NULL;
5996 GVariant *value = NULL;
5997 GVariant *param = NULL;
5998 GVariantBuilder *builder = NULL;
5999 dbus_method_param_s params;
6003 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
6004 __WDP_LOG_FUNC_EXIT__;
6008 g_dbus = g_pd->g_dbus;
6010 WDP_LOGE("DBus connection is NULL");
6011 __WDP_LOG_FUNC_EXIT__;
6014 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6016 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
6019 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6020 g_variant_builder_add(builder, "{sv}", "PersistentReconnect",
6021 g_variant_new_boolean(reconnect));
6022 value = g_variant_new("a{sv}", builder);
6023 g_variant_builder_unref(builder);
6025 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
6027 params.params = param;
6028 DEBUG_G_VARIANT("Params : ", params.params);
6030 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
6032 WDP_LOGE("Failed to send command to wpa_supplicant");
6034 WDP_LOGD("Succeeded to set persistent reconnect");
6036 __WDP_LOG_FUNC_EXIT__;
6040 static int __ws_compress_query(char *compressed, char *query, int qtype)
6048 token = strtok_r(query, ".", &temp);
6050 if (!strcmp(token, "local")) {
6051 WDP_LOGD("Query conversion done");
6054 } else if (!strncmp(token, "_tcp", 4)) {
6055 memcpy(&compressed[length], WS_TCP_PTR_HEX, 2);
6058 } else if (!strncmp(token, "_udp", 4)) {
6059 memcpy(&compressed[length], WS_UDP_PTR_HEX, 2);
6063 WDP_LOGD("Token: [%s]", token);
6064 token_len = strlen(token);
6065 compressed[length] = token_len;
6068 memcpy(&compressed[length], token, token_len);
6069 length += token_len;
6072 token = strtok_r(NULL, ".", &temp);
6074 if (qtype == WS_QTYPE_PTR || token_num == 2)
6075 memcpy(&compressed[length], WS_PTR_TYPE_HEX, 3);
6076 else if (qtype == WS_QTYPE_TXT || token_num == 3)
6077 memcpy(&compressed[length], WS_TXT_TYPE_HEX, 3);
6080 WDP_LOGD("converted query length [%d] token num [%d]", length, token_num);
6085 static int __ws_compress_rdata(char *compressed, char *rdata, int qtype)
6092 if (qtype == WS_QTYPE_PTR) {
6094 token = strtok_r(rdata, ".", &temp);
6096 WDP_LOGD("Token: %s", token);
6097 token_len = strlen(token);
6098 compressed[length] = token_len;
6101 memcpy(&compressed[length], token, token_len);
6102 length += token_len;
6105 compressed[length] = 0xc0;
6106 compressed[length+1] = 0x27;
6109 } else if (qtype == WS_QTYPE_TXT) {
6111 token = strtok_r(rdata, ",", &temp);
6114 WDP_LOGD("Token: [%s]", token);
6116 token_len = strlen(token);
6117 compressed[length] = token_len;
6120 memcpy(&compressed[length], token, token_len);
6121 length += token_len;
6123 token = strtok_r(NULL, ",", &temp);
6126 WDP_LOGD("RDATA is NULL");
6131 int _convert_bonjour_to_args(char *query, char *rdata, GVariantBuilder *builder)
6133 GVariantBuilder *args = NULL;
6134 char compressed[256] = {0, };
6140 if (!query || !builder) {
6141 WDP_LOGE("Invalid parameter");
6144 if (!rdata || !strlen(rdata)) {
6145 WDP_LOGD("RDATA is NULL\n");
6147 temp = strstr(rdata, query);
6149 if (temp != NULL && temp - rdata > 0)
6150 qtype = WS_QTYPE_PTR;
6152 qtype = WS_QTYPE_TXT;
6156 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("bonjour"));
6158 /* compress query */
6159 length = __ws_compress_query(compressed, query, qtype);
6161 args = g_variant_builder_new(G_VARIANT_TYPE("ay"));
6162 for (i = 0; i < length; i++)
6163 g_variant_builder_add(args, "y", compressed[i]);
6164 g_variant_builder_add(builder, "{sv}", "query", g_variant_new("ay", args));
6165 g_variant_builder_unref(args);
6167 memset(compressed, 0x0, 256);
6172 length = __ws_compress_rdata(compressed, rdata, qtype);
6174 args = g_variant_builder_new(G_VARIANT_TYPE("ay"));
6175 for (i = 0; i < length; i++)
6176 g_variant_builder_add(args, "y", compressed[i]);
6177 g_variant_builder_add(builder, "{sv}", "response", g_variant_new("ay", args));
6178 g_variant_builder_unref(args);
6184 int _check_service_query_exists(wfd_oem_service_s *service)
6187 wfd_oem_service_s *data = NULL;
6189 for (count = 0; count < g_list_length(service_list); count++) {
6190 data = (wfd_oem_service_s*) g_list_nth_data(service_list, count);
6191 if (strncmp(service->query_id, data->query_id, OEM_QUERY_ID_LEN) == 0) {
6192 WDP_LOGD("Query already exists");
6199 static wfd_oem_service_s* _remove_service_query(char * s_type, char *mac_str, char *query_id)
6201 if (NULL == s_type || NULL == mac_str || NULL == query_id)
6205 wfd_oem_service_s *data = NULL;
6207 for (count = 0; count < g_list_length(service_list); count++) {
6208 data = (wfd_oem_service_s*) g_list_nth_data(service_list, count);
6209 if (data && !strncmp(data->service_type, s_type, SERVICE_TYPE_LEN) &&
6210 memcmp(data->dev_addr, mac_str, OEM_MACSTR_LEN - 1) == 0) {
6211 g_strlcpy(query_id, data->query_id, OEM_QUERY_ID_LEN + 1);
6215 if (strlen(query_id) <= 0) {
6216 WDP_LOGD("!! Query ID not found !!");
6220 WDP_LOGD("query id :[%s]", query_id);
6225 void __add_service_query(GVariant *value, void *user_data)
6227 __WDP_LOG_FUNC_ENTER__;
6228 wfd_oem_service_s *service = NULL;
6230 long long unsigned ref = 0;
6236 g_variant_get(value, "(t)", &ref);
6238 service = (wfd_oem_service_s*) g_try_malloc0(sizeof(wfd_oem_service_s));
6240 WDP_LOGE("Failed to allocate memory for service");
6244 memcpy(service, user_data, sizeof(wfd_oem_service_s));
6246 g_snprintf(service->query_id, OEM_QUERY_ID_LEN + 1, "%llx", ref);
6248 res = _check_service_query_exists(service);
6252 service_list = g_list_append(service_list, service);
6254 __WDP_LOG_FUNC_EXIT__;
6259 /* for now, supplicant dbus interface only provides upnp service fully */
6260 int ws_start_service_discovery(unsigned char *mac_addr, int service_type)
6262 __WDP_LOG_FUNC_ENTER__;
6263 GDBusConnection *g_dbus = NULL;
6264 GVariantBuilder *builder = NULL;
6265 GVariant *value = NULL;
6266 wfd_oem_service_s data = {0,};
6267 dbus_method_param_s params;
6268 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
6273 WDP_LOGE("Invalid parameter");
6274 __WDP_LOG_FUNC_EXIT__;
6279 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
6280 __WDP_LOG_FUNC_EXIT__;
6284 g_dbus = g_pd->g_dbus;
6286 WDP_LOGE("DBus connection is NULL");
6287 __WDP_LOG_FUNC_EXIT__;
6290 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6292 dbus_set_method_param(¶ms, "ServiceDiscoveryRequest", g_pd->iface_path, g_dbus);
6294 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6296 if (mac_addr && !ISZEROMACADDR(mac_addr)) {
6297 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
6298 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(mac_addr));
6299 WDP_LOGD("get peer path [%s]", peer_path);
6300 g_variant_builder_add(builder, "{sv}", "peer", g_variant_new_object_path(peer_path));
6303 if (service_type == WFD_OEM_SERVICE_TYPE_ALL) {
6305 char *service_all = "\x02\x00\x00\x01";
6306 GVariantBuilder *query = NULL;
6308 query = g_variant_builder_new(G_VARIANT_TYPE("ay"));
6309 for (i = 0; i < SERVICE_QUERY_LEN; i++)
6310 g_variant_builder_add(query, "y", service_all[i]);
6311 g_variant_builder_add(builder, "{sv}", "query", g_variant_new("ay", query));
6312 g_variant_builder_unref(query);
6313 g_strlcpy(data.service_type, SERV_DISC_REQ_ALL, OEM_SERVICE_TYPE_LEN + 1);
6315 } else if (service_type == WFD_OEM_SERVICE_TYPE_UPNP) {
6317 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("upnp"));
6318 g_variant_builder_add(builder, "{sv}", "version", g_variant_new_int32(10));
6319 g_variant_builder_add(builder, "{sv}", "service", g_variant_new_string("ssdp:all"));
6320 g_strlcpy(data.service_type, SERV_DISC_REQ_UPNP, OEM_SERVICE_TYPE_LEN + 1);
6322 } else if (service_type == WFD_OEM_SERVICE_TYPE_BONJOUR) {
6324 char *service_bonjour = "\x02\x00\x01\x01";
6325 GVariantBuilder *query = NULL;
6327 query = g_variant_builder_new(G_VARIANT_TYPE("ay"));
6328 for (i = 0; i < SERVICE_QUERY_LEN; i++)
6329 g_variant_builder_add(query, "y", service_bonjour[i]);
6330 g_variant_builder_add(builder, "{sv}", "tlv", g_variant_new("ay", query));
6331 g_variant_builder_unref(query);
6332 g_strlcpy(data.service_type, SERV_DISC_REQ_BONJOUR, OEM_SERVICE_TYPE_LEN + 1);
6335 value = g_variant_new("(a{sv})", builder);
6336 g_variant_builder_unref(builder);
6338 params.params = value;
6339 DEBUG_G_VARIANT("Params : ", params.params);
6341 if (ISZEROMACADDR(mac_addr))
6342 snprintf(data.dev_addr, WS_MACSTR_LEN , "%s", SERV_BROADCAST_ADDRESS);
6344 snprintf(data.dev_addr, WS_MACSTR_LEN, MACSTR, MAC2STR(mac_addr));
6346 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, __add_service_query, &data);
6348 WDP_LOGE("Failed to send command to wpa_supplicant");
6350 WDP_LOGD("Succeeded to start service discovery");
6352 __WDP_LOG_FUNC_EXIT__;
6356 int ws_cancel_service_discovery(unsigned char *mac_addr, int service_type)
6358 __WDP_LOG_FUNC_ENTER__;
6359 GDBusConnection *g_dbus = NULL;
6360 dbus_method_param_s params;
6361 wfd_oem_service_s *data = NULL;
6362 char query_id[OEM_QUERY_ID_LEN + 1] = {0, };
6363 char s_type[OEM_SERVICE_TYPE_LEN + 1] = {0, };
6364 char mac_str[18] = {0, };
6365 long long unsigned id;
6370 WDP_LOGE("Invalid parameter");
6371 __WDP_LOG_FUNC_EXIT__;
6376 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
6377 __WDP_LOG_FUNC_EXIT__;
6381 g_dbus = g_pd->g_dbus;
6383 WDP_LOGE("DBus connection is NULL");
6384 __WDP_LOG_FUNC_EXIT__;
6388 if (ISZEROMACADDR(mac_addr)) {
6389 snprintf(mac_str, WS_MACSTR_LEN , "%s", SERV_BROADCAST_ADDRESS);
6391 snprintf(mac_str, WS_MACSTR_LEN, MACSTR, MAC2STR(mac_addr));
6394 switch (service_type) {
6395 case WFD_OEM_SERVICE_TYPE_ALL:
6396 g_strlcpy(s_type, SERV_DISC_REQ_ALL, OEM_SERVICE_TYPE_LEN + 1);
6398 case WFD_OEM_SERVICE_TYPE_BONJOUR:
6399 g_strlcpy(s_type, SERV_DISC_REQ_BONJOUR, OEM_SERVICE_TYPE_LEN + 1);
6401 case WFD_OEM_SERVICE_TYPE_UPNP:
6402 g_strlcpy(s_type, SERV_DISC_REQ_UPNP, OEM_SERVICE_TYPE_LEN + 1);
6405 WDP_LOGE("Invalid Service type");
6406 __WDP_LOG_FUNC_EXIT__;
6410 WDP_LOGD("Cancel service discovery service_type [%d]", service_type);
6411 WDP_LOGD("Cancel service discovery s_type [%s]", s_type);
6413 data = _remove_service_query(s_type, mac_str, query_id);
6415 __WDP_LOG_FUNC_EXIT__;
6418 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6420 dbus_set_method_param(¶ms, "ServiceDiscoveryCancelRequest", g_pd->iface_path, g_dbus);
6421 id = (long long unsigned)strtoul(query_id, NULL, 16);
6422 params.params = g_variant_new("(t)", id);
6424 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
6426 WDP_LOGE("Failed to send command to wpa_supplicant");
6428 WDP_LOGD("Succeeded to cancel service discovery");
6430 service_list = g_list_remove(service_list, data);
6433 __WDP_LOG_FUNC_EXIT__;
6437 int ws_serv_add(wfd_oem_new_service_s *service)
6439 __WDP_LOG_FUNC_ENTER__;
6440 GDBusConnection *g_dbus = NULL;
6441 GVariantBuilder *builder = NULL;
6442 GVariant *value = NULL;
6443 dbus_method_param_s params;
6447 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
6448 __WDP_LOG_FUNC_EXIT__;
6452 g_dbus = g_pd->g_dbus;
6454 WDP_LOGE("DBus connection is NULL");
6455 __WDP_LOG_FUNC_EXIT__;
6458 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6460 dbus_set_method_param(¶ms, "AddService", g_pd->iface_path, g_dbus);
6462 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6464 if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
6466 WDP_LOGD("Service type: WFD_OEM_SERVICE_TYPE_BONJOUR");
6467 WDP_LOGD("Query: %s", service->data.bonjour.query);
6468 WDP_LOGD("RData: %s", service->data.bonjour.rdata);
6470 res = _convert_bonjour_to_args(service->data.bonjour.query,
6471 service->data.bonjour.rdata, builder);
6473 WDP_LOGE("Failed to convert Key string");
6474 g_variant_builder_unref(builder);
6478 } else if (service->protocol == WFD_OEM_SERVICE_TYPE_UPNP) {
6479 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("upnp"));
6480 g_variant_builder_add(builder, "{sv}", "version", g_variant_new_int32(10));
6481 g_variant_builder_add(builder, "{sv}", "service", g_variant_new_string(service->data.upnp.service));
6484 value = g_variant_new("(a{sv})", builder);
6485 g_variant_builder_unref(builder);
6487 params.params = value;
6488 DEBUG_G_VARIANT("Params : ", params.params);
6490 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
6492 WDP_LOGE("Failed to send command to wpa_supplicant");
6494 WDP_LOGD("Succeeded to add service");
6496 __WDP_LOG_FUNC_EXIT__;
6500 int ws_serv_del(wfd_oem_new_service_s *service)
6502 __WDP_LOG_FUNC_ENTER__;
6503 GDBusConnection *g_dbus = NULL;
6504 GVariantBuilder *builder = NULL;
6505 GVariant *value = NULL;
6506 dbus_method_param_s params;
6510 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
6511 __WDP_LOG_FUNC_EXIT__;
6515 g_dbus = g_pd->g_dbus;
6517 WDP_LOGE("DBus connection is NULL");
6518 __WDP_LOG_FUNC_EXIT__;
6521 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6523 dbus_set_method_param(¶ms, "DeleteService", g_pd->iface_path, g_dbus);
6525 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6527 if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
6529 WDP_LOGD("Service type: WFD_OEM_SERVICE_TYPE_BONJOUR");
6530 WDP_LOGD("Query: %s", service->data.bonjour.query);
6532 res = _convert_bonjour_to_args(service->data.bonjour.query,
6535 WDP_LOGE("Failed to convert Key string");
6536 g_variant_builder_unref(builder);
6540 } else if (service->protocol == WFD_OEM_SERVICE_TYPE_UPNP) {
6541 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("upnp"));
6542 g_variant_builder_add(builder, "{sv}", "version", g_variant_new_int32(10));
6543 g_variant_builder_add(builder, "{sv}", "service", g_variant_new_string(service->data.upnp.service));
6546 value = g_variant_new("(a{sv})", builder);
6547 g_variant_builder_unref(builder);
6549 params.params = value;
6550 DEBUG_G_VARIANT("Params : ", params.params);
6552 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
6554 WDP_LOGE("Failed to send command to wpa_supplicant");
6556 WDP_LOGD("Succeeded to del service");
6558 __WDP_LOG_FUNC_EXIT__;
6562 int _ws_disable_display()
6564 __WDP_LOG_FUNC_ENTER__;
6565 GDBusConnection *g_dbus = NULL;
6566 GVariantBuilder *builder = NULL;
6567 GVariant *value = NULL;
6568 GVariant *param = NULL;
6569 dbus_method_param_s params;
6573 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
6574 __WDP_LOG_FUNC_EXIT__;
6578 g_dbus = g_pd->g_dbus;
6580 WDP_LOGE("DBus connection is NULL");
6581 __WDP_LOG_FUNC_EXIT__;
6584 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6586 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, SUPPLICANT_PATH,
6589 builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
6590 value = g_variant_new("ay", builder);
6591 g_variant_builder_unref(builder);
6593 param = g_variant_new("(ssv)", SUPPLICANT_INTERFACE, "WFDIEs", value);
6595 params.params = param;
6596 DEBUG_G_VARIANT("Params : ", params.params);
6598 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
6600 WDP_LOGE("Failed to send command to wpa_supplicant");
6602 WDP_LOGD("Succeeded to disable Wi-Fi display");
6604 __WDP_LOG_FUNC_EXIT__;
6608 int ws_miracast_init(int enable)
6610 __WDP_LOG_FUNC_ENTER__;
6611 wfd_oem_display_s wifi_display;
6614 memset(&wifi_display, 0x0, sizeof(wfd_oem_display_s));
6616 wifi_display.availability = enable;
6617 wifi_display.hdcp_support = 1;
6618 wifi_display.port = 0x07E6;
6619 wifi_display.max_tput = 0x0028;
6621 res = ws_set_display(&wifi_display);
6623 WDP_LOGE("Failed to set miracast parameter(device info)");
6624 __WDP_LOG_FUNC_EXIT__;
6629 res = _ws_disable_display();
6631 WDP_LOGE("Failed to disable wifi display");
6633 WDP_LOGD("Succeeded to disable wifi display");
6635 __WDP_LOG_FUNC_EXIT__;
6639 int ws_set_display(wfd_oem_display_s *wifi_display)
6641 __WDP_LOG_FUNC_ENTER__;
6642 GDBusConnection *g_dbus = NULL;
6644 GVariant *value = NULL;
6645 GVariant *param = NULL;
6646 GVariantBuilder *builder = NULL;
6647 dbus_method_param_s params;
6651 unsigned char ies[WFD_SUBELEM_LEN_DEV_INFO + 3] = {0,};
6653 if (!wifi_display) {
6654 WDP_LOGE("Invalid parameter");
6657 g_dbus = g_pd->g_dbus;
6659 WDP_LOGE("DBus connection is NULL");
6660 __WDP_LOG_FUNC_EXIT__;
6663 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6665 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, SUPPLICANT_PATH,
6668 ies[2] = WFD_SUBELEM_LEN_DEV_INFO;
6669 ies[3] = wifi_display->hdcp_support;
6670 ies[4] = (wifi_display->type) | (wifi_display->availability<<4);
6671 ies[5] = wifi_display->port>>8;
6672 ies[6] = wifi_display->port&0xff;
6673 ies[7] = wifi_display->max_tput>>8;
6674 ies[8] = wifi_display->max_tput&0xff;
6676 builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
6677 for (i = 0; i < WFD_SUBELEM_LEN_DEV_INFO + 3; i++)
6678 g_variant_builder_add(builder, "y", ies[i]);
6679 value = g_variant_new("ay", builder);
6680 g_variant_builder_unref(builder);
6682 param = g_variant_new("(ssv)", SUPPLICANT_INTERFACE, "WFDIEs", value);
6684 params.params = param;
6685 DEBUG_G_VARIANT("Params : ", params.params);
6687 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
6689 WDP_LOGE("Failed to send command to wpa_supplicant");
6691 WDP_LOGD("Succeeded to set Wi-Fi Display");
6693 __WDP_LOG_FUNC_EXIT__;
6697 int ws_refresh(void)
6699 __WDP_LOG_FUNC_ENTER__;
6704 __WDP_LOG_FUNC_EXIT__;
6708 int ws_save_config(void)
6710 __WDP_LOG_FUNC_ENTER__;
6711 GDBusConnection *g_dbus = NULL;
6712 dbus_method_param_s params;
6715 g_dbus = g_pd->g_dbus;
6717 WDP_LOGE("DBus connection is NULL");
6718 __WDP_LOG_FUNC_EXIT__;
6721 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6723 dbus_set_method_param(¶ms, "SaveConfig", g_pd->iface_path, g_dbus);
6724 params.params = NULL;
6726 res = dbus_method_call(¶ms, SUPPLICANT_IFACE, NULL, NULL);
6728 WDP_LOGE("Failed to save config to wpa_supplicant");
6730 WDP_LOGD("Succeeded to save config");
6732 __WDP_LOG_FUNC_EXIT__;
6736 int ws_set_operating_channel(int channel)
6738 __WDP_LOG_FUNC_ENTER__;
6739 GDBusConnection *g_dbus = NULL;
6740 GVariant *value = NULL;
6741 GVariant *param = NULL;
6742 GVariantBuilder *builder = NULL;
6743 dbus_method_param_s params;
6746 g_dbus = g_pd->g_dbus;
6748 WDP_LOGE("DBus connection is NULL");
6749 __WDP_LOG_FUNC_EXIT__;
6753 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6755 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path, g_dbus);
6757 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6758 g_variant_builder_add(builder, "{sv}", "OperChannel", g_variant_new_uint32(channel));
6759 value = g_variant_new("a{sv}", builder);
6760 g_variant_builder_unref(builder);
6762 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
6763 params.params = param;
6765 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
6767 WDP_LOGE("Failed to send command to wpa_supplicant");
6769 WDP_LOGD("Succeeded to set Operating Channel");
6771 __WDP_LOG_FUNC_EXIT__;
6775 int ws_remove_all_network(void)
6777 __WDP_LOG_FUNC_ENTER__;
6778 GDBusConnection *g_dbus = NULL;
6779 dbus_method_param_s params;
6782 g_dbus = g_pd->g_dbus;
6784 WDP_LOGE("DBus connection is NULL");
6785 __WDP_LOG_FUNC_EXIT__;
6788 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6790 dbus_set_method_param(¶ms, "RemoveAllNetworks", g_pd->iface_path, g_dbus);
6791 params.params = NULL;
6793 res = dbus_method_call(¶ms, SUPPLICANT_IFACE, NULL, NULL);
6795 WDP_LOGE("Failed to send [RemoveAllNetworks] command to wpa_supplicant");
6797 WDP_LOGD("Succeeded to remove all networks from supplicant");
6799 WDP_LOGD("Succeeded to remove all network");
6800 __WDP_LOG_FUNC_EXIT__;
6804 int ws_get_wpa_status(int *wpa_status)
6806 __WDP_LOG_FUNC_ENTER__;
6807 GDBusConnection *g_dbus = NULL;
6808 GVariant *param = NULL;
6809 GVariant *reply = NULL;
6810 GError *error = NULL;
6813 WDP_LOGE("Invalid parameter");
6814 __WDP_LOG_FUNC_EXIT__;
6818 *wpa_status = WFD_OEM_WPA_STATE_MAX;
6820 g_dbus = g_pd->g_dbus;
6822 WDP_LOGE("DBus connection is NULL");
6823 __WDP_LOG_FUNC_EXIT__;
6827 param = g_variant_new("(s)", SUPPLICANT_IFACE);
6829 reply = g_dbus_connection_call_sync(
6831 SUPPLICANT_SERVICE, /* bus name */
6832 g_pd->iface_path, /* object path */
6833 DBUS_PROPERTIES_INTERFACE, /* interface name */
6834 DBUS_PROPERTIES_METHOD_GETALL, /* method name */
6835 param, /* GVariant *params */
6836 NULL, /* reply_type */
6837 G_DBUS_CALL_FLAGS_NONE, /* flags */
6838 SUPPLICANT_TIMEOUT , /* timeout */
6839 NULL, /* cancellable */
6840 &error); /* error */
6842 if (error != NULL) {
6843 WDP_LOGE("Error! Failed to get properties: [%s]",
6845 g_error_free(error);
6847 g_variant_unref(reply);
6848 __WDP_LOG_FUNC_EXIT__;
6852 gchar *reply_str = NULL;
6854 reply_str = g_variant_print(reply, TRUE);
6855 WDP_LOGE("reply [%s]", reply_str ? reply_str : "NULL");
6858 if (reply != NULL) {
6859 GVariantIter *iter = NULL;
6860 g_variant_get(reply, "(a{sv})", &iter);
6864 GVariant *value = NULL;
6866 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
6867 if (g_strcmp0(key, "State") == 0) {
6868 const gchar *state = NULL;
6869 g_variant_get(value, "&s", &state);
6870 WDP_LOGI("state : [%s]", state);
6872 if (g_strcmp0(state, "disconnected") == 0)
6873 *wpa_status = WFD_OEM_WPA_STATE_DISCONNECTED;
6874 else if (g_strcmp0(state, "inactive") == 0)
6875 *wpa_status = WFD_OEM_WPA_STATE_INACTIVE;
6876 else if (g_strcmp0(state, "scanning") == 0)
6877 *wpa_status = WFD_OEM_WPA_STATE_SCANNING;
6878 else if (g_strcmp0(state, "authenticating") == 0)
6879 *wpa_status = WFD_OEM_WPA_STATE_AUTHENTICATING;
6880 else if (g_strcmp0(state, "associating") == 0)
6881 *wpa_status = WFD_OEM_WPA_STATE_ASSOCIATING;
6882 else if (g_strcmp0(state, "associated") == 0)
6883 *wpa_status = WFD_OEM_WPA_STATE_ASSOCIATED;
6884 else if (g_strcmp0(state, "4way_handshake") == 0)
6885 *wpa_status = WFD_OEM_WPA_STATE_4WAY_HANDSHAKE;
6886 else if (g_strcmp0(state, "group_handshake") == 0)
6887 *wpa_status = WFD_OEM_WPA_STATE_GROUP_HANDSHAKE;
6888 else if (g_strcmp0(state, "completed") == 0)
6889 *wpa_status = WFD_OEM_WPA_STATE_COMPLETED;
6891 *wpa_status = WFD_OEM_WPA_STATE_MAX;
6894 g_variant_iter_free(iter);
6896 g_variant_unref(reply);
6898 WDP_LOGD("No properties");
6901 WDP_LOGI("wpa_status : [%d]", *wpa_status);
6903 __WDP_LOG_FUNC_EXIT__;
6907 int ws_advertise_service(wfd_oem_asp_service_s *service, int replace)
6909 __WDP_LOG_FUNC_ENTER__;
6910 GDBusConnection *g_dbus = NULL;
6911 GVariantBuilder *builder = NULL;
6912 GVariant *value = NULL;
6913 dbus_method_param_s params;
6914 unsigned int config_method = 0x1108;
6915 int auto_accept = 0;
6919 g_dbus = g_pd->g_dbus;
6921 WDP_LOGE("DBus connection is NULL");
6925 if (service->config_method == 2) {
6926 config_method = WS_CONFIG_METHOD_KEYPAD |
6927 WS_CONFIG_METHOD_DISPLAY;
6928 } else if (service->config_method == 3) {
6929 config_method = WS_CONFIG_METHOD_DISPLAY;
6930 } else if (service->config_method == 4) {
6931 config_method = WS_CONFIG_METHOD_KEYPAD;
6934 if (service->auto_accept) {
6935 if (service->role == 0)
6943 rep = (replace == 1);
6945 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6947 dbus_set_method_param(¶ms, "AddService", g_pd->iface_path, g_dbus);
6949 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6951 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("asp"));
6952 g_variant_builder_add(builder, "{sv}", "auto_accept", g_variant_new_int32(auto_accept));
6953 g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new_uint32(service->adv_id));
6954 g_variant_builder_add(builder, "{sv}", "svc_state", g_variant_new_uint32(service->status));
6955 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new_uint32(config_method));
6956 g_variant_builder_add(builder, "{sv}", "replace", g_variant_new_boolean(rep));
6957 if (service->service_type != NULL)
6958 g_variant_builder_add(builder, "{sv}", "adv_str",
6959 g_variant_new_string(service->service_type));
6960 if (service->service_info != NULL)
6961 g_variant_builder_add(builder, "{sv}", "svc_info",
6962 g_variant_new_string(service->service_info));
6963 if (service->instance_name != NULL)
6964 g_variant_builder_add(builder, "{sv}", "svc_instance",
6965 g_variant_new_string(service->instance_name));
6967 value = g_variant_new("(a{sv})", builder);
6968 g_variant_builder_unref(builder);
6969 DEBUG_G_VARIANT("Params : ", value);
6971 params.params = value;
6973 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
6975 WDP_LOGE("Failed to send command to wpa_supplicant");
6977 WDP_LOGD("Succeeded to add service");
6979 __WDP_LOG_FUNC_EXIT__;
6983 int ws_cancel_advertise_service(wfd_oem_asp_service_s *service)
6985 __WDP_LOG_FUNC_ENTER__;
6986 GDBusConnection *g_dbus = NULL;
6987 GVariantBuilder *builder = NULL;
6988 GVariant *value = NULL;
6989 dbus_method_param_s params;
6992 g_dbus = g_pd->g_dbus;
6994 WDP_LOGE("DBus connection is NULL");
6997 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6999 dbus_set_method_param(¶ms, "DeleteService", g_pd->iface_path, g_dbus);
7001 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
7003 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("asp"));
7004 g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new_uint32(service->adv_id));
7006 value = g_variant_new("(a{sv})", builder);
7007 g_variant_builder_unref(builder);
7008 DEBUG_G_VARIANT("Params : ", value);
7009 params.params = value;
7011 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
7013 WDP_LOGE("Failed to send command to wpa_supplicant");
7015 WDP_LOGD("Succeeded to del service");
7017 __WDP_LOG_FUNC_EXIT__;
7021 static void __ws_add_seek(wfd_oem_asp_service_s *service)
7023 __WDP_LOG_FUNC_ENTER__;
7024 wfd_oem_asp_service_s *seek = NULL;
7026 WDP_LOGE("invalid parameters");
7030 seek = g_try_malloc0(sizeof(wfd_oem_asp_service_s));
7032 WDP_LOGE("Failed to allocate memory for service");
7036 service->search_id = (intptr_t)seek;
7037 memcpy(seek, service, sizeof(wfd_oem_asp_service_s));
7038 if (service->service_type)
7039 seek->service_type = strdup(service->service_type);
7040 seek_list = g_list_prepend(seek_list, seek);
7042 __WDP_LOG_FUNC_EXIT__;
7046 static wfd_oem_asp_service_s * __ws_get_seek(long long unsigned asp_search_id)
7048 __WDP_LOG_FUNC_ENTER__;
7049 wfd_oem_asp_service_s *seek = NULL;
7052 for (list = seek_list; list != NULL; list = list->next) {
7054 if (seek && (seek->asp_search_id == asp_search_id)) {
7055 WDP_LOGD("List found");
7061 __WDP_LOG_FUNC_EXIT__;
7065 static void __ws_remove_seek(wfd_oem_asp_service_s *service)
7067 __WDP_LOG_FUNC_ENTER__;
7068 wfd_oem_asp_service_s *seek = NULL;
7071 for (list = seek_list; list != NULL; list = list->next) {
7074 if (seek && (seek->asp_search_id == service->asp_search_id)) {
7075 WDP_LOGD("List remove");
7076 seek_list = g_list_remove(seek_list, seek);
7077 g_free(seek->service_type);
7078 g_free(seek->service_info);
7082 __WDP_LOG_FUNC_EXIT__;
7086 static void __get_asp_search_id(GVariant *value, void *args)
7088 __WDP_LOG_FUNC_ENTER__;
7089 wfd_oem_asp_service_s *service = NULL;
7090 wfd_oem_asp_service_s *seek = NULL;
7091 long long unsigned search_id = 0;
7093 g_variant_get(value, "(t)", &search_id);
7095 service = (wfd_oem_asp_service_s *)args;
7097 WDP_LOGE("invalid parameters");
7098 __WDP_LOG_FUNC_EXIT__;
7102 seek = g_try_malloc0(sizeof(wfd_oem_asp_service_s));
7104 WDP_LOGE("Failed to allocate memory for service");
7105 __WDP_LOG_FUNC_EXIT__;
7109 service->search_id = search_id;
7110 memcpy(seek, service, sizeof(wfd_oem_asp_service_s));
7111 if (service->service_type)
7112 seek->service_type = strdup(service->service_type);
7113 if (service->service_info)
7114 seek->service_info = strdup(service->service_info);
7115 seek_list = g_list_append(seek_list, seek);
7117 __WDP_LOG_FUNC_EXIT__;
7121 int ws_seek_service(wfd_oem_asp_service_s *service)
7123 __WDP_LOG_FUNC_ENTER__;
7124 GDBusConnection *g_dbus = NULL;
7126 wfd_oem_asp_service_s *seek = NULL;
7129 g_dbus = g_pd->g_dbus;
7131 WDP_LOGE("DBus connection is NULL");
7132 __WDP_LOG_FUNC_EXIT__;
7135 list = g_list_last(seek_list);
7137 service->tran_id = 1;
7142 service->tran_id = seek->tran_id + 1;
7144 service->tran_id = 1;
7147 if (service->service_info) {
7148 GVariantBuilder *builder = NULL;
7149 GVariant *value = NULL;
7150 dbus_method_param_s params;
7152 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7153 dbus_set_method_param(¶ms, "ServiceDiscoveryRequest",
7154 g_pd->iface_path, g_dbus);
7156 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
7158 g_variant_builder_add(builder, "{sv}", "service_type",
7159 g_variant_new_string("asp"));
7160 g_variant_builder_add(builder, "{sv}", "transaction_id",
7161 g_variant_new_byte(service->tran_id));
7162 if (service->service_type != NULL)
7163 g_variant_builder_add(builder, "{sv}", "svc_str",
7164 g_variant_new_string(service->service_type));
7166 if (service->service_info != NULL)
7167 g_variant_builder_add(builder, "{sv}", "svc_info",
7168 g_variant_new_string(service->service_info));
7170 if (service->instance_name != NULL)
7171 g_variant_builder_add(builder, "{sv}", "svc_instance",
7172 g_variant_new_string(service->instance_name));
7174 value = g_variant_new("(a{sv})", builder);
7175 g_variant_builder_unref(builder);
7177 DEBUG_G_VARIANT("Params : ", value);
7179 params.params = value;
7180 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE,
7181 __get_asp_search_id, service);
7184 __ws_add_seek(service);
7188 WDP_LOGE("Failed to send command to wpa_supplicant");
7190 WDP_LOGD("Succeeded to seek service");
7192 __WDP_LOG_FUNC_EXIT__;
7196 int ws_cancel_seek_service(wfd_oem_asp_service_s *service)
7198 __WDP_LOG_FUNC_ENTER__;
7199 GDBusConnection *g_dbus = NULL;
7200 wfd_oem_asp_service_s *seek = NULL;
7201 dbus_method_param_s params;
7204 g_dbus = g_pd->g_dbus;
7206 WDP_LOGE("DBus connection is NULL");
7207 __WDP_LOG_FUNC_EXIT__;
7211 seek = __ws_get_seek(service->asp_search_id);
7213 WDP_LOGE("seek data is NULL");
7214 __WDP_LOG_FUNC_EXIT__;
7218 if (seek->service_info) {
7220 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7221 dbus_set_method_param(¶ms, "ServiceDiscoveryCancelRequest",
7222 g_pd->iface_path, g_dbus);
7224 params.params = g_variant_new("(t)", service->search_id);
7226 DEBUG_G_VARIANT("Params : ", params.params);
7228 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
7230 WDP_LOGE("Failed to send command to wpa_supplicant");
7232 WDP_LOGD("Succeeded to cancel seek service");
7235 __ws_remove_seek(seek);
7237 __WDP_LOG_FUNC_EXIT__;
7241 int ws_asp_prov_disc_req(wfd_oem_asp_prov_s *asp_params)
7243 __WDP_LOG_FUNC_ENTER__;
7244 GDBusConnection *g_dbus = NULL;
7245 GVariantBuilder *builder = NULL;
7246 GVariantBuilder *mac_builder = NULL;
7247 GVariant *value = NULL;
7248 dbus_method_param_s params;
7249 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
7250 int config_method = 0x1000;
7255 WDP_LOGE("Invalid parameter");
7256 __WDP_LOG_FUNC_EXIT__;
7259 g_dbus = g_pd->g_dbus;
7261 WDP_LOGE("DBus connection is NULL");
7262 __WDP_LOG_FUNC_EXIT__;
7266 if (asp_params->network_config == WFD_OEM_ASP_WPS_TYPE_PIN_DISPLAY)
7267 config_method = 0x8;
7268 else if (asp_params->network_config == WFD_OEM_ASP_WPS_TYPE_PIN_KEYPAD)
7269 config_method = 0x100;
7271 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7273 dbus_set_method_param(¶ms, "ASPProvisionDiscoveryRequest", g_pd->iface_path, g_dbus);
7275 if (asp_params->deferring == 0)
7276 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
7277 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(asp_params->service_mac));
7279 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
7280 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(asp_params->session_mac));
7281 WDP_LOGD("get peer path [%s]", peer_path);
7283 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
7284 g_variant_builder_add(builder, "{sv}", "peer", g_variant_new_object_path(peer_path));
7286 g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new_uint32(asp_params->adv_id));
7287 g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new_uint32(asp_params->session_id));
7288 g_variant_builder_add(builder, "{sv}", "role", g_variant_new_byte(asp_params->network_role));
7289 g_variant_builder_add(builder, "{sv}", "method", g_variant_new_int32(config_method));
7290 if (asp_params->status > 0)
7291 g_variant_builder_add(builder, "{sv}", "status", g_variant_new_int32(asp_params->status));
7292 if (asp_params->session_information)
7293 g_variant_builder_add(builder, "{sv}", "info", g_variant_new_string(asp_params->session_information));
7295 mac_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
7296 for (i = 0; i < OEM_MACADDR_LEN; i++)
7297 g_variant_builder_add(mac_builder, "y", asp_params->service_mac[i]);
7298 g_variant_builder_add(builder, "{sv}", "adv_mac",
7299 g_variant_new("ay", mac_builder));
7300 g_variant_builder_unref(mac_builder);
7302 mac_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
7303 for (i = 0; i < OEM_MACADDR_LEN; i++)
7304 g_variant_builder_add(mac_builder, "y", asp_params->session_mac[i]);
7305 g_variant_builder_add(builder, "{sv}", "session_mac",
7306 g_variant_new("ay", mac_builder));
7307 g_variant_builder_unref(mac_builder);
7309 value = g_variant_new("(a{sv})", builder);
7310 g_variant_builder_unref(builder);
7311 DEBUG_G_VARIANT("Params : ", value);
7313 params.params = value;
7315 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
7317 WDP_LOGE("Failed to send command to wpa_supplicant");
7319 WDP_LOGD("Succeeded to send connection command to peer[" MACSTR "]", MAC2STR(asp_params->service_mac));
7321 __WDP_LOG_FUNC_EXIT__;
7325 int ws_set_eapol_ip_config(int enable)
7327 __WDP_LOG_FUNC_ENTER__;
7328 GDBusConnection *g_dbus = NULL;
7330 GVariant *value = NULL;
7331 GVariant *param = NULL;
7332 GVariantBuilder *builder = NULL;
7333 GVariantBuilder *type_builder = NULL;
7334 dbus_method_param_s params;
7343 unsigned char eapol_ip[IP_END + 1][OEM_IPADDR_LEN + 1] = {0,};
7346 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
7347 __WDP_LOG_FUNC_EXIT__;
7351 g_dbus = g_pd->g_dbus;
7353 WDP_LOGE("DBus connection is NULL");
7354 __WDP_LOG_FUNC_EXIT__;
7357 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7359 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
7362 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
7364 memset(&eapol_ip, 0x0, (IP_END + 1) * (OEM_IPADDR_LEN + 1));
7366 memcpy(eapol_ip[IP_GO], DEFAULT_IP_GO, OEM_IPADDR_LEN);
7367 memcpy(eapol_ip[IP_MASK], DEFAULT_IP_MASK, OEM_IPADDR_LEN);
7368 memcpy(eapol_ip[IP_START], DEFAULT_IP_START, OEM_IPADDR_LEN);
7369 memcpy(eapol_ip[IP_END], DEFAULT_IP_END, OEM_IPADDR_LEN);
7372 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
7373 for (i = 0; i < OEM_IPADDR_LEN; i++)
7374 g_variant_builder_add(type_builder, "y", eapol_ip[IP_GO][i]);
7375 g_variant_builder_add(builder, "{sv}", "IpAddrGo",
7376 g_variant_new("ay", type_builder));
7377 g_variant_builder_unref(type_builder);
7379 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
7380 for (i = 0; i < OEM_IPADDR_LEN; i++)
7381 g_variant_builder_add(type_builder, "y", eapol_ip[IP_MASK][i]);
7382 g_variant_builder_add(builder, "{sv}", "IpAddrMask",
7383 g_variant_new("ay", type_builder));
7384 g_variant_builder_unref(type_builder);
7386 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
7387 for (i = 0; i < OEM_IPADDR_LEN; i++)
7388 g_variant_builder_add(type_builder, "y", eapol_ip[IP_START][i]);
7389 g_variant_builder_add(builder, "{sv}", "IpAddrStart",
7390 g_variant_new("ay", type_builder));
7391 g_variant_builder_unref(type_builder);
7393 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
7394 for (i = 0; i < OEM_IPADDR_LEN; i++)
7395 g_variant_builder_add(type_builder, "y", eapol_ip[IP_END][i]);
7396 g_variant_builder_add(builder, "{sv}", "IpAddrEnd",
7397 g_variant_new("ay", type_builder));
7398 g_variant_builder_unref(type_builder);
7400 value = g_variant_new("a{sv}", builder);
7401 g_variant_builder_unref(builder);
7403 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
7405 params.params = param;
7407 DEBUG_G_VARIANT("Params : ", param);
7408 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
7410 WDP_LOGE("Failed to send command to wpa_supplicant");
7412 WDP_LOGI("Succeeded to set eapol IP");
7414 __WDP_LOG_FUNC_EXIT__;
7418 int ws_add_vsie(wfd_oem_vsie_frames_e frame_id, const char* vsie)
7420 __WDP_LOG_FUNC_ENTER__;
7421 GDBusConnection *g_dbus = NULL;
7422 GVariant *value = NULL;
7423 GVariantBuilder *bytearray_builder = NULL;
7424 dbus_method_param_s params;
7427 size_t vsie_len = 0;
7429 unsigned char *bytearray = NULL;
7430 size_t bytearray_len = 0;
7432 if (frame_id >= WFD_OEM_VSIE_FRAME_MAX ||
7434 WDP_LOGE("Invalid parameter");
7439 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
7440 __WDP_LOG_FUNC_EXIT__;
7444 g_dbus = g_pd->g_dbus;
7446 WDP_LOGE("DBus connection is NULL");
7447 __WDP_LOG_FUNC_EXIT__;
7451 vsie_len = strlen(vsie);
7452 if (vsie_len == 0) {
7453 WDP_LOGE("vsie length is zero");
7454 __WDP_LOG_FUNC_EXIT__;
7458 bytearray_len = (vsie_len % 2) ? ((vsie_len / 2) + 1) : (vsie_len / 2);
7460 bytearray = (unsigned char *) g_try_malloc0(bytearray_len);
7461 if (bytearray == NULL) {
7462 WDP_LOGE("Failed to allocate memory to bytearray");
7463 __WDP_LOG_FUNC_EXIT__;
7467 if (__ws_hex_str_to_bin(vsie, bytearray, bytearray_len) < 0) {
7468 WDP_LOGE("invalid vsie string");
7470 __WDP_LOG_FUNC_EXIT__;
7474 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7475 dbus_set_method_param(¶ms, "VendorElemAdd", g_pd->iface_path,
7478 bytearray_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
7479 for (i = 0; i < bytearray_len; i++)
7480 g_variant_builder_add(bytearray_builder, "y", bytearray[i]);
7482 value = g_variant_new("(iay)", frame_id, bytearray_builder);
7483 g_variant_builder_unref(bytearray_builder);
7485 params.params = value;
7487 res = dbus_method_call(¶ms, SUPPLICANT_IFACE, NULL, NULL);
7489 WDP_LOGE("Failed to send command to wpa_supplicant");
7491 __WDP_LOG_FUNC_EXIT__;
7495 WDP_LOGD("Succeeded to add vsie: Frame ID [%d], VSIE [%s]", frame_id,
7499 __WDP_LOG_FUNC_EXIT__;
7503 int ws_get_vsie(wfd_oem_vsie_frames_e frame_id, char **vsie)
7505 __WDP_LOG_FUNC_ENTER__;
7506 GDBusConnection *g_dbus = NULL;
7507 GVariant *param = NULL;
7508 GVariant *reply = NULL;
7509 GError *error = NULL;
7511 if (frame_id >= WFD_OEM_VSIE_FRAME_MAX ||
7513 WDP_LOGE("Invalid parameter");
7514 __WDP_LOG_FUNC_EXIT__;
7519 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
7520 __WDP_LOG_FUNC_EXIT__;
7524 g_dbus = g_pd->g_dbus;
7526 WDP_LOGE("DBus connection is NULL");
7527 __WDP_LOG_FUNC_EXIT__;
7531 param = g_variant_new("(i)", frame_id);
7533 reply = g_dbus_connection_call_sync(
7535 SUPPLICANT_SERVICE, /* bus name */
7536 g_pd->iface_path, /* object path */
7537 SUPPLICANT_IFACE, /* interface name */
7538 "VendorElemGet", /* method name */
7539 param, /* GVariant *params */
7540 NULL, /* reply_type */
7541 G_DBUS_CALL_FLAGS_NONE, /* flags */
7542 SUPPLICANT_TIMEOUT, /* timeout */
7543 NULL, /* cancellable */
7544 &error); /* error */
7546 if (error != NULL) {
7547 WDP_LOGE("Error! Failed to get vsie: [%s]", error->message);
7548 g_error_free(error);
7550 g_variant_unref(reply);
7551 __WDP_LOG_FUNC_EXIT__;
7555 if (reply != NULL) {
7556 DEBUG_G_VARIANT("Reply : ", reply);
7558 GVariantIter *iter = NULL;
7559 unsigned char *vsie_bytes = NULL;
7562 g_variant_get(reply, "(ay)", &iter);
7564 WDP_LOGD("vsie is not present");
7565 __WDP_LOG_FUNC_EXIT__;
7569 vsie_len = __ws_unpack_ay_malloc(&vsie_bytes, iter);
7570 if (vsie_bytes == NULL) {
7571 WDP_LOGD("vsie_bytes not allocated");
7572 __WDP_LOG_FUNC_EXIT__;
7576 __ws_byte_to_txt(vsie_bytes, vsie, vsie_len);
7579 WDP_LOGE("vsie not allocated.");
7580 __WDP_LOG_FUNC_EXIT__;
7587 WDP_LOGD("Succeeded to get vsie: Frame ID [%d], VSIE [%s]", frame_id,
7589 __WDP_LOG_FUNC_EXIT__;
7593 int ws_remove_vsie(wfd_oem_vsie_frames_e frame_id, const char *vsie)
7595 __WDP_LOG_FUNC_ENTER__;
7596 GDBusConnection *g_dbus = NULL;
7597 GVariantBuilder *bytearray_builder = NULL;
7598 GVariant *value = NULL;
7599 dbus_method_param_s params;
7602 size_t vsie_len = 0;
7604 unsigned char *bytearray = NULL;
7605 size_t bytearray_len = 0;
7607 if (frame_id >= WFD_OEM_VSIE_FRAME_MAX ||
7609 WDP_LOGE("Invalid parameter");
7614 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
7615 __WDP_LOG_FUNC_EXIT__;
7619 g_dbus = g_pd->g_dbus;
7621 WDP_LOGE("DBus connection is NULL");
7622 __WDP_LOG_FUNC_EXIT__;
7626 vsie_len = strlen(vsie);
7627 if (vsie_len == 0) {
7628 WDP_LOGE("vsie length is zero");
7629 __WDP_LOG_FUNC_EXIT__;
7633 bytearray_len = (vsie_len % 2) ? ((vsie_len / 2) + 1) : (vsie_len / 2);
7635 bytearray = (unsigned char *) g_try_malloc0(bytearray_len);
7636 if (bytearray == NULL) {
7637 WDP_LOGE("Failed to allocate memory to bytearray");
7638 __WDP_LOG_FUNC_EXIT__;
7642 if (__ws_hex_str_to_bin(vsie, bytearray, bytearray_len) < 0) {
7643 WDP_LOGE("invalid vsie string");
7645 __WDP_LOG_FUNC_EXIT__;
7649 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7650 dbus_set_method_param(¶ms, "VendorElemRem", g_pd->iface_path,
7653 bytearray_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
7654 for (i = 0; i < bytearray_len; i++)
7655 g_variant_builder_add(bytearray_builder, "y", bytearray[i]);
7657 value = g_variant_new("(iay)", frame_id, bytearray_builder);
7658 g_variant_builder_unref(bytearray_builder);
7660 params.params = value;
7662 res = dbus_method_call(¶ms, SUPPLICANT_IFACE, NULL, NULL);
7664 WDP_LOGE("Failed to send command to wpa_supplicant");
7666 __WDP_LOG_FUNC_EXIT__;
7670 WDP_LOGD("Succeeded to remove vsie: Frame ID [%d], VSIE [%s]", frame_id,
7673 __WDP_LOG_FUNC_EXIT__;
7677 int ws_set_supported_wps_mode(int wps_mode)
7679 __WDP_LOG_FUNC_ENTER__;
7680 char config_value[DBUS_OBJECT_PATH_MAX+1] = {0,};
7682 int new_wps_mode = wps_mode;
7686 WDP_LOGE("no configurable data found");
7687 __WDP_LOG_FUNC_EXIT__;
7691 if (new_wps_mode == 0) {
7692 WDP_LOGE("Reset to default value");
7693 new_wps_mode = WFD_OEM_WPS_MODE_PBC|WFD_OEM_WPS_MODE_DISPLAY|WFD_OEM_WPS_MODE_KEYPAD;
7696 if (new_wps_mode & WFD_OEM_WPS_MODE_KEYPAD) {
7697 g_strlcat(config_value, "keypad ", sizeof(config_value));
7700 if (new_wps_mode & WFD_OEM_WPS_MODE_PBC) {
7701 g_strlcat(config_value, "virtual_push_button ", sizeof(config_value));
7704 if (new_wps_mode & WFD_OEM_WPS_MODE_DISPLAY) {
7705 g_strlcat(config_value, "physical_display ", sizeof(config_value));
7708 config_value[length-1] = 0;
7709 g_strlcpy(config->config_methods, config_value, OEM_CONFIG_METHOD_LEN);
7710 WDP_LOGD("config_value = %s, length = %d", config_value, length-1);
7711 res = __ws_set_config_methods();
7713 WDP_LOGE("Failed to set config method");
7714 __WDP_LOG_FUNC_EXIT__;
7717 wps_config_method = new_wps_mode;
7718 __WDP_LOG_FUNC_EXIT__;
7722 static int _ws_remove_persistent_group_by_object_path(const char *object_path)
7724 __WDP_LOG_FUNC_ENTER__;
7725 GDBusConnection *g_dbus = NULL;
7726 dbus_method_param_s params;
7730 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
7731 __WDP_LOG_FUNC_EXIT__;
7735 g_dbus = g_pd->g_dbus;
7737 WDP_LOGE("DBus connection is NULL");
7738 __WDP_LOG_FUNC_EXIT__;
7742 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7743 dbus_set_method_param(¶ms, "RemovePersistentGroup",
7744 g_pd->iface_path, g_dbus);
7745 params.params = g_variant_new("(o)", object_path);
7747 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
7749 WDP_LOGE("Failed to send command to wpa_supplicant");
7750 __WDP_LOG_FUNC_EXIT__;
7755 WDP_LOGD("Succeeded to remove persistent group");;
7756 __WDP_LOG_FUNC_EXIT__;
7760 int ws_remove_persistent_device(unsigned char *mac_addr)
7762 __WDP_LOG_FUNC_ENTER__;
7763 GDBusConnection *g_dbus = NULL;
7764 ws_network_info_s networks[WS_MAX_PERSISTENT_COUNT];
7767 int need_delete = 0;
7771 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
7772 __WDP_LOG_FUNC_EXIT__;
7776 g_dbus = g_pd->g_dbus;
7778 WDP_LOGE("DBus connection is NULL");
7779 __WDP_LOG_FUNC_EXIT__;
7782 memset(&networks, 0x0, WS_MAX_PERSISTENT_COUNT * sizeof(ws_network_info_s));
7783 dbus_property_get_all(g_pd->iface_path, g_dbus, SUPPLICANT_P2PDEVICE,
7784 __ws_extract_p2pdevice_details, networks);
7786 cnt = networks[0].total;
7788 WDP_LOGD("Persistent Group Count=%d", cnt);
7789 if (cnt > WS_MAX_PERSISTENT_COUNT) {
7790 WDP_LOGE("Persistent group count exceeded or parsing error");
7791 __WDP_LOG_FUNC_EXIT__;
7795 for (i = 0 ; i < cnt ; i++) {
7799 WDP_LOGD("----persistent group [%d]----", i);
7800 WDP_LOGD("network_id [%d]", networks[i].network_id);
7801 WDP_LOGD("ssid [%s]", networks[i].ssid);
7802 WDP_LOGD("bssid ["MACSTR"]", MAC2STR(networks[i].bssid));
7803 WDP_LOGD("p2p_client_num [%d]", networks[i].p2p_client_num);
7804 for (j = 0; j < networks[i].p2p_client_num; j++) {
7805 WDP_LOGD("p2p_client_list ["MACSTR"]", MAC2STR(networks[i].p2p_client_list[j]));
7808 WDP_LOGD("mac_addr ["MACSTR"]", MAC2STR(mac_addr));
7810 if (memcmp(mac_addr, networks[i].bssid, WS_MACADDR_LEN) == 0) {
7811 WDP_LOGD("Persistent group owner found [%d: "MACSTR"]", networks[i].network_id, MAC2STR(mac_addr));
7815 if (need_delete == 0) {
7816 for (j = 0; j < networks[i].p2p_client_num; j++) {
7817 if (!memcmp(mac_addr, networks[i].p2p_client_list[j], WS_MACADDR_LEN)) {
7818 WDP_LOGD("Persistent group client found [%d: "MACSTR"]", networks[i].network_id, MAC2STR(mac_addr));
7825 res = _ws_remove_persistent_group_by_object_path(networks[i].persistent_path);
7826 WDP_LOGI("persistent group deleted [%s]", networks[i].persistent_path);
7828 WDP_LOGE("Failed to _ws_remove_persistent_group_by_object_path");
7830 WDP_LOGD("Succeeded to _ws_remove_persistent_group_by_object_path");
7835 __WDP_LOG_FUNC_EXIT__;
7839 int ws_remove_all_persistent_device(void)
7841 __WDP_LOG_FUNC_ENTER__;
7842 GDBusConnection *g_dbus = NULL;
7843 dbus_method_param_s params;
7846 g_dbus = g_pd->g_dbus;
7848 WDP_LOGE("DBus connection is NULL");
7849 __WDP_LOG_FUNC_EXIT__;
7852 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7854 dbus_set_method_param(¶ms, "RemoveAllPersistentGroups", g_pd->iface_path, g_dbus);
7855 params.params = NULL;
7857 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
7859 WDP_LOGE("Failed to RemoveAllPersistentGroups");
7861 WDP_LOGD("Succeeded to RemoveAllPersistentGroups");
7865 WDP_LOGD("Succeeded to remove all network");
7866 __WDP_LOG_FUNC_EXIT__;
7870 static void __ws_get_supported_channels_reply(GVariant *reply, void *user_data)
7872 __WDP_LOG_FUNC_ENTER__;
7874 GVariantIter *iter = NULL;
7875 wfd_oem_supported_channels_s *data = (wfd_oem_supported_channels_s *)user_data;
7880 g_variant_get(reply, "(ai)", &iter);
7882 while (g_variant_iter_loop(iter, "i", &channel))
7883 data->channels[data->count++] = channel;
7885 g_variant_iter_free (iter);
7888 WDP_LOGE("Reply is NULL");
7890 __WDP_LOG_FUNC_EXIT__;
7893 int ws_get_supported_channels(wfd_oem_supported_channels_s *data)
7895 __WDP_LOG_FUNC_ENTER__;
7897 dbus_method_param_s params;
7900 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
7901 __WDP_LOG_FUNC_EXIT__;
7905 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7906 memset(data, 0x0, sizeof(wfd_oem_supported_channels_s));
7908 dbus_set_method_param(¶ms, "GetSupportedChannels", g_pd->iface_path, g_pd->g_dbus);
7909 params.params = NULL;
7911 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE,
7912 __ws_get_supported_channels_reply, data);
7914 WDP_LOGE("Failed to GetSupportedChannels");
7916 WDP_LOGD("Succeeded to GetSupportedChannels");
7919 __WDP_LOG_FUNC_EXIT__;