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>
49 #include "wifi-direct-oem.h"
50 #include "wfd-plugin-log.h"
51 #include "dbus/wfd-plugin-supplicant-dbus.h"
52 #include "wfd-plugin-wpasupplicant.h"
54 #define GLIST_ITER_START(arg_list, elem)\
56 temp = g_list_first(arg_list);\
59 temp = g_list_next(temp);\
61 #define GLIST_ITER_END() }
63 #define NETCONFIG_SERVICE "net.netconfig"
64 #define NETCONFIG_WIFI_INTERFACE "net.netconfig.wifi"
65 #define NETCONFIG_WIFI_PATH "/net/netconfig/wifi"
67 #define NETCONFIG_DBUS_REPLY_TIMEOUT (10 * 1000)
69 #define CONF_FILE_PATH tzplatform_mkpath(TZ_SYS_ETC, "wpa_supplicant/wpa_supplicant.conf")
70 #define MAX_FILE_PATH_LEN 256
72 static wfd_oem_ops_s supplicant_ops = {
73 .configure = ws_configure,
76 .activate = ws_activate,
77 .deactivate = ws_deactivate,
79 .start_scan = ws_start_scan,
80 .stop_scan = ws_stop_scan,
81 .get_visibility = ws_get_visibility,
82 .set_visibility = ws_set_visibility,
83 .get_scan_result = ws_get_scan_result,
84 .get_peer_info = ws_get_peer_info,
86 .prov_disc_req = ws_prov_disc_req,
88 .connect = ws_connect,
89 .disconnect = ws_disconnect,
90 .reject_connection = ws_reject_connection,
91 .cancel_connection = ws_cancel_connection,
93 .get_connected_peers = ws_get_connected_peers,
94 .get_pin = ws_get_pin,
95 .set_pin = ws_set_pin,
96 .generate_pin = ws_generate_pin,
97 .get_supported_wps_mode = ws_get_supported_wps_mode,
99 .create_group = ws_create_group,
100 .destroy_group = ws_destroy_group,
102 .wps_start = ws_wps_start,
103 .enrollee_start = ws_enrollee_start,
104 .wps_cancel = ws_wps_cancel,
106 .get_dev_name = ws_get_dev_name,
107 .set_dev_name = ws_set_dev_name,
108 .get_dev_mac = ws_get_dev_mac,
109 .get_dev_type = ws_get_dev_type,
110 .set_dev_type = ws_set_dev_type,
111 .get_go_intent = ws_get_go_intent,
112 .set_go_intent = ws_set_go_intent,
113 .set_country = ws_set_country,
114 .get_persistent_groups = ws_get_persistent_groups,
115 .remove_persistent_group = ws_remove_persistent_group,
116 .set_persistent_reconnect = ws_set_persistent_reconnect,
118 .start_service_discovery = ws_start_service_discovery,
119 .cancel_service_discovery = ws_cancel_service_discovery,
121 .serv_add = ws_serv_add,
122 .serv_del = ws_serv_del,
124 .miracast_init = ws_miracast_init,
125 .set_display = ws_set_display,
127 .refresh = ws_refresh,
128 .save_config = ws_save_config,
129 .set_operating_channel = ws_set_operating_channel,
130 .remove_all_network = ws_remove_all_network,
131 .get_wpa_status = ws_get_wpa_status,
133 .advertise_service = ws_advertise_service,
134 .cancel_advertise_service = ws_cancel_advertise_service,
135 .seek_service = ws_seek_service,
136 .cancel_seek_service = ws_cancel_seek_service,
137 .asp_prov_disc_req = ws_asp_prov_disc_req,
139 .set_eapol_ip_config = ws_set_eapol_ip_config,
141 .add_vsie = ws_add_vsie,
142 .get_vsie = ws_get_vsie,
143 .remove_vsie = ws_remove_vsie,
144 .set_supported_wps_mode = ws_set_supported_wps_mode,
145 .remove_persistent_device = ws_remove_persistent_device,
146 .remove_all_persistent_device = ws_remove_all_persistent_device,
148 .get_supported_channels = ws_get_supported_channels,
153 static ws_dbus_plugin_data_s *g_pd;
154 static wfd_oem_config_s *config = NULL;
155 static int is_peer_joined_notified = 0;
156 static int is_peer_disconnected_notified = 0;
157 static int wps_config_method = WFD_OEM_WPS_MODE_PBC|WFD_OEM_WPS_MODE_DISPLAY|WFD_OEM_WPS_MODE_KEYPAD;
159 static GList *service_list;
160 static GList *seek_list;
162 static int __ws_txt_to_mac(unsigned char *txt, unsigned char *mac)
167 WDP_LOGE("Invalid parameter");
172 mac[i++] = (char) strtoul((char *)txt, (char **)&txt, 16);
173 if (!*txt++ || i == 6)
177 if (i != WS_MACADDR_LEN)
180 WDP_LOGD("Converted MAC address [" MACSECSTR "]", MAC2SECSTR(mac));
184 static int __ws_mac_compact_to_normal(char *compact, unsigned char *mac)
186 g_snprintf((char *)mac, OEM_MACSTR_LEN, "%c%c:%c%c:%c%c:%c%c:%c%c:%c%c",
187 compact[0], compact[1], compact[2], compact[3],
188 compact[4], compact[5], compact[6], compact[7],
189 compact[8], compact[9], compact[10], compact[11]);
193 static const char *__ws_wps_to_txt(int wps_mode)
196 case WFD_OEM_WPS_MODE_PBC:
197 return WS_DBUS_STR_PBC;
198 case WFD_OEM_WPS_MODE_DISPLAY:
199 return WS_DBUS_STR_DISPLAY;
200 case WFD_OEM_WPS_MODE_KEYPAD:
201 return WS_DBUS_STR_KEYPAD;
202 case WFD_OEM_WPS_MODE_NONE:
203 case WFD_OEM_WPS_MODE_P2PS:
204 return WS_DBUS_STR_P2PS;
210 static int __ws_hex_char_to_num(char c)
212 if (c >= '0' && c <= '9')
215 if (c >= 'a' && c <= 'f')
218 if (c >= 'A' && c <= 'F')
224 static int __ws_hex_to_byte(const char *hex)
228 a = __ws_hex_char_to_num(*hex++);
232 b = __ws_hex_char_to_num(*hex++);
239 static int __ws_hex_str_to_bin(const char *hex, unsigned char *buf, size_t len)
243 const char *ipos = hex;
244 unsigned char *opos = buf;
246 for (i = 0; i < len; i++) {
247 a = __ws_hex_to_byte(ipos);
258 static int __ws_byte_to_hex(char *buf, int buf_size, unsigned char *data, int data_len)
262 char *end = buf + buf_size;
266 for (i = 0; i < data_len; i++) {
267 ret = snprintf(pos, end - pos, "%02x", data[i]);
268 if (ret < 0 || ret >= end - pos) {
278 static int __ws_hex_to_num(char *src, int len)
283 if (!src || len < 0) {
284 WDP_LOGE("Invalid parameter");
288 temp = (char*) g_try_malloc0(len+1);
290 WDP_LOGE("Failed to allocate memory");
294 memcpy(temp, src, len);
295 num = strtoul(temp, NULL, 16);
301 static int __ws_segment_to_service(char *segment, wfd_oem_new_service_s **service)
303 wfd_oem_new_service_s *serv_tmp = NULL;
308 if (!segment || !service) {
309 WDP_LOGE("Invalid parameter");
314 WDP_LOGD("Segment: %s", segment);
316 serv_tmp = (wfd_oem_new_service_s*) g_try_malloc0(sizeof(wfd_oem_new_service_s));
318 WDP_LOGE("Failed to allocate memory for service");
322 serv_tmp->protocol = __ws_hex_to_num(ptr, 2);
323 serv_tmp->trans_id = __ws_hex_to_num(ptr+2, 2);
324 serv_tmp->status = __ws_hex_to_num(ptr+4, 2);
326 WDP_LOGD("Protocol[%d], Transaction ID[%d], Status[%d]", serv_tmp->protocol, serv_tmp->trans_id, serv_tmp->status);
328 if (serv_tmp->status != 0) {
329 WDP_LOGE("Service status is not success");
334 if (serv_tmp->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
335 WDP_LOGD("===== Bonjour service =====");
336 char compr[5] = {0, };
337 char query[256] = {0, };
338 char rdata[256] = {0, };
341 while (*ptr != 0 && strncmp(ptr, "c0", 2)) {
342 unsigned long int size = 0;
343 char temp_str[3] = {0,};
344 memcpy(temp_str, ptr, 2);
345 size = strtoul(temp_str, NULL, 16);
348 temp = (char*) calloc(1, size + 2);
351 for (i = 0; i < size; i++) {
352 temp[i+1] = (char) __ws_hex_to_num(ptr, 2);
355 g_strlcat(query, temp, sizeof(query));
362 if (!strncmp(ptr, "c0", 2)) {
363 memcpy(compr, ptr, 4);
366 if (!strncmp(ptr, "27", 2)) {
367 WDP_LOGD("Segment ended");
371 dns_type = __ws_hex_to_num(ptr, 4);
373 if (dns_type == 12) {
374 if (!strncmp(compr, "c011", 4))
375 g_strlcat(query, ".local.", sizeof(query));
376 else if (!strncmp(compr, "c00c", 4))
377 g_strlcat(query, "._tcp.local.", sizeof(query));
378 else if (!strncmp(compr, "c01c", 4))
379 g_strlcat(query, "._udp.local.", sizeof(query));
383 serv_tmp->data.bonjour.query = strdup(query + 1);
384 while (*ptr != 0 && strncmp(ptr, "c0", 2)) {
385 unsigned long int size = 0;
386 char temp_str[3] = {0,};
387 memcpy(temp_str, ptr, 2);
388 size = strtoul(temp_str, NULL, 16);
391 temp = (char*) g_try_malloc0(size + 2);
394 for (i = 0; i < size; i++) {
395 temp[i+1] = (char) __ws_hex_to_num(ptr, 2);
398 g_strlcat(rdata, temp, sizeof(rdata));
404 serv_tmp->data.bonjour.rdata = strdup(rdata + 1);
406 WDP_LOGD("Query: %s", serv_tmp->data.bonjour.query);
407 WDP_LOGD("RData: %s", serv_tmp->data.bonjour.rdata);
409 WDP_LOGE("Not supported yet. Only bonjour service supproted [%d]",
420 static void __extract_addr_from_path(char *peer_path, unsigned char *dev_addr)
422 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
425 if (!peer_path || !dev_addr)
428 loc = strrchr(peer_path, '/');
430 __ws_mac_compact_to_normal(loc + 1, peer_dev);
432 __ws_txt_to_mac(peer_dev, dev_addr);
433 WDP_LOGD("dev addr [" MACSTR "]", MAC2STR(dev_addr));
436 static void __ws_path_to_addr(char *peer_path,
437 unsigned char *dev_addr, GVariant *parameter)
439 __WDP_LOG_FUNC_ENTER__;
441 const char *path = NULL;
443 g_variant_get(parameter, "(&o)", &path);
444 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
445 WDP_LOGD("Retrive Added path [%s]", peer_path);
447 __extract_addr_from_path(peer_path, dev_addr);
449 __WDP_LOG_FUNC_EXIT__;
453 static int __ws_unpack_ay(unsigned char *dst, GVariant *src, int size)
455 GVariantIter *iter = NULL;
458 if (!dst || !src || size == 0) {
459 WDP_LOGE("Invalid parameter");
462 g_variant_get(src, "ay", &iter);
464 WDP_LOGE("failed to get iterator");
468 while (g_variant_iter_loop(iter, "y", &dst[length])) {
473 g_variant_iter_free(iter);
478 static int __ws_byte_to_txt(const unsigned char *src, char **dst, int src_len)
480 __WDP_LOG_FUNC_ENTER__;
487 WDP_LOGE("Invalid parameter.");
488 __WDP_LOG_FUNC_EXIT__;
492 *dst = (char *) g_try_malloc0((2*src_len)+1);
494 WDP_LOGE("failed to allocate memory to buffer.");
495 __WDP_LOG_FUNC_EXIT__;
501 for (i = 0; i < src_len; i++) {
502 snprintf(buf, 3, "%02x", src[i]);
507 __WDP_LOG_FUNC_EXIT__;
511 static int __ws_unpack_ay_malloc(unsigned char **dst, GVariantIter *iter)
513 GVariantIter *iter_copy = NULL;
516 unsigned char *tmp_dst = NULL;
518 if (!dst || *dst || !iter) {
519 WDP_LOGE("Invalid parameter");
523 iter_copy = g_variant_iter_copy(iter);
525 while (g_variant_iter_loop(iter, "y", &tmp))
527 g_variant_iter_free(iter);
529 tmp_dst = (unsigned char *)g_try_malloc0(length + 1);
531 WDP_LOGE("failed to allocate memory");
532 g_variant_iter_free(iter_copy);
537 while (g_variant_iter_loop(iter_copy, "y", &tmp_dst[length]))
539 g_variant_iter_free(iter_copy);
545 tmp_dst[length] = '\0';
549 WDP_LOGD("Length [%d]", length);
553 static int __parsing_wfd_info(unsigned char *wfd_dev_info,
554 wfd_oem_display_s* display)
556 __WDP_LOG_FUNC_ENTER__;
559 if (!wfd_dev_info || !display) {
560 WDP_LOGE("Invalid parameter");
561 __WDP_LOG_FUNC_EXIT__;
565 wfd_info = (wfd_dev_info[3]<<8 | wfd_dev_info[4]);
567 if (wfd_info & WS_WFD_INFO_PRIMARY_SINK)
568 display->type |= WS_WFD_INFO_PRIMARY_SINK;
569 if (wfd_info & WS_WFD_INFO_SECONDARY_SINK)
570 display->type |= WS_WFD_INFO_SECONDARY_SINK;
572 display->availability = (wfd_info & WS_WFD_INFO_AVAILABILITY) >> 4;
573 display->hdcp_support = (wfd_info & WS_WFD_INFO_HDCP_SUPPORT) >> 8;
575 display->port = (wfd_dev_info[5]<<8 | wfd_dev_info[6]);
576 display->max_tput = (wfd_dev_info[7]<<8 | wfd_dev_info[8]);
578 WDP_LOGD("type [%d],availability [%d],hdcp_support [%d],ctrl_port [%d] "
579 "max_tput[%d]", display->type, display->availability,
580 display->hdcp_support, display->port, display->max_tput);
582 __WDP_LOG_FUNC_EXIT__;
586 static int _ws_get_local_dev_mac(unsigned char *dev_mac)
588 __WDP_LOG_FUNC_ENTER__;
590 char file_path[MAX_FILE_PATH_LEN] = {0, };
591 char local_mac[OEM_MACSTR_LEN] = {0, };
594 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
597 g_snprintf(file_path, sizeof(file_path),
598 "/sys/class/net/%s/address", config->p2p_ifname);
600 fd = fopen(file_path, "r");
602 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
603 WDP_LOGE("Failed to open MAC info file [%s] (%s)", file_path, error_buf);
604 __WDP_LOG_FUNC_EXIT__;
609 ptr = fgets((char *)local_mac, WS_MACSTR_LEN, fd);
611 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
612 WDP_LOGE("Failed to read file or no data read(%s)", error_buf);
614 __WDP_LOG_FUNC_EXIT__;
617 WDP_SECLOGD("Local MAC address [%s]", ptr);
618 WDP_SECLOGD("Local MAC address [%s]", local_mac);
620 res = __ws_txt_to_mac((unsigned char *)local_mac, dev_mac);
622 WDP_LOGE("Failed to convert text to MAC address");
624 __WDP_LOG_FUNC_EXIT__;
628 WDP_LOGD("Local Device MAC address [" MACSECSTR "]", MAC2SECSTR(dev_mac));
631 __WDP_LOG_FUNC_EXIT__;
635 static void _ws_manage_group_iface_signal(const gchar *group_iface_obj_path,
636 gboolean is_created);
638 static void _ws_process_interface_removed(GDBusConnection *connection,
639 const gchar *sender, const gchar *object_path, const gchar *interface,
640 const gchar *signal, GVariant *parameters, gpointer user_data)
642 __WDP_LOG_FUNC_ENTER__;
643 static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
644 const char *path = NULL;
646 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
649 WDP_LOGD("Ignoring event");
650 __WDP_LOG_FUNC_EXIT__;
654 g_variant_get(parameters, "(&o)", &path);
655 g_strlcpy(interface_path, path, DBUS_OBJECT_PATH_MAX);
657 WDP_LOGD("Retrive removed path [%s]", interface_path);
659 if (!g_strcmp0(g_pd->group_iface_path, interface_path)) {
660 WDP_LOGD("p2p group interface removed");
661 memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
662 } else if (!g_strcmp0(g_pd->iface_path, interface_path)) {
664 WDP_LOGD("p2p interface removed");
665 wfd_oem_event_s event;
669 memset(&event, 0x0, sizeof(wfd_oem_event_s));
670 event.event_id = WFD_OEM_EVENT_DEACTIVATED;
671 if (g_pd->callback && g_pd->callback->deactivated_cb)
672 g_pd->callback->deactivated_cb(&event);
674 memset(g_pd->iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
676 __WDP_LOG_FUNC_EXIT__;
681 const char *interface;
683 void (*function) (GDBusConnection *connection,
684 const gchar *sender, const gchar *object_path, const gchar *interface,
685 const gchar *signal, GVariant *parameters, gpointer user_data);
686 } ws_supplicant_signal_map[] = {
689 SUPPLICANT_INTERFACE,
691 _ws_process_interface_removed
701 static void __ws_get_peer_property(const char *key, GVariant *value, void *user_data)
703 __WDP_LOG_FUNC_ENTER__;
705 wfd_oem_device_s *peer = (wfd_oem_device_s *)user_data;
707 __WDP_LOG_FUNC_EXIT__;
711 CHECK_KEY_VALUE(key, value);
713 if (g_strcmp0(key, "DeviceName") == 0) {
714 const char *name = NULL;
716 g_variant_get(value, "&s", &name);
717 g_strlcpy(peer->dev_name, name, WS_SSID_LEN + 1);
718 WDP_LOGD("Device name [%s]", peer->dev_name);
720 } else if (g_strcmp0(key, "config_method") == 0) {
721 int config_methods = 0;
722 g_variant_get(value, "q", &config_methods);
724 if (config_methods & WS_CONFIG_METHOD_DISPLAY)
725 peer->config_methods |= WFD_OEM_WPS_MODE_DISPLAY;
726 if (config_methods & WS_CONFIG_METHOD_PUSHBUTTON)
727 peer->config_methods |= WFD_OEM_WPS_MODE_PBC;
728 if (config_methods & WS_CONFIG_METHOD_KEYPAD)
729 peer->config_methods |= WFD_OEM_WPS_MODE_KEYPAD;
730 WDP_LOGD("Config method [0x%x]", peer->config_methods);
732 } else if (g_strcmp0(key, "level") == 0) {
735 g_variant_get(value, "i", &rssi);
737 WDP_LOGD("Peer RSSI [%d]", peer->rssi);
739 } else if (g_strcmp0(key, "devicecapability") == 0) {
740 unsigned char devicecapability = 0;
742 g_variant_get(value, "y", &devicecapability);
743 peer->dev_flags = (int)devicecapability;
744 WDP_LOGD("Device Capa [0x%02x]", peer->dev_flags);
746 } else if (g_strcmp0(key, "groupcapability") == 0) {
747 unsigned char groupcapability = 0;
749 g_variant_get(value, "y", &groupcapability);
750 WDP_LOGD("Group Capa [0x%02x]", groupcapability);
751 if (groupcapability & WS_GROUP_CAP_GROUP_OWNER) {
752 peer->group_flags = WFD_OEM_GROUP_FLAG_GROUP_OWNER;
753 peer->dev_role = WFD_OEM_DEV_ROLE_GO;
755 if (groupcapability & WS_GROUP_CAP_PERSISTENT_GROUP)
756 peer->group_flags = WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
758 } else if (g_strcmp0(key, "PrimaryDeviceType") == 0) {
759 unsigned char primarydevicetype[WS_DEVTYPE_LEN] = {0,};
761 if (__ws_unpack_ay(primarydevicetype, value, WS_DEVTYPE_LEN)) {
762 peer->pri_dev_type = primarydevicetype[1];
763 peer->sec_dev_type = primarydevicetype[WS_DEVTYPE_LEN -1];
765 } else if (g_strcmp0(key, "SecondaryDeviceTypes") == 0) {
766 } else if (g_strcmp0(key, "VendorExtension") == 0) {
767 } else if (g_strcmp0(key, "IEs") == 0) {
768 unsigned char ies[WFD_SUBELEM_LEN_DEV_INFO + 3] = {0,};
770 if (__ws_unpack_ay(ies, value, WFD_SUBELEM_LEN_DEV_INFO + 3))
771 __parsing_wfd_info(ies, &(peer->display));
772 } else if (g_strcmp0(key, "DeviceAddress") == 0) {
774 if (__ws_unpack_ay(peer->dev_addr, value, WS_MACADDR_LEN))
775 WDP_LOGD("Device address [" MACSTR "]", MAC2STR(peer->dev_addr));
777 } else if (g_strcmp0(key, "InterfaceAddress") == 0) {
779 if (__ws_unpack_ay(peer->intf_addr, value, WS_MACADDR_LEN))
780 WDP_LOGD("Interface address [" MACSTR "]", MAC2STR(peer->intf_addr));
782 } else if (g_strcmp0(key, "GODeviceAddress") == 0) {
784 if (__ws_unpack_ay(peer->go_dev_addr, value, WS_MACADDR_LEN))
785 WDP_LOGD("GODevice address [" MACSTR "]", MAC2STR(peer->go_dev_addr));
787 if (!ISZEROMACADDR(peer->go_dev_addr))
788 peer->dev_role = WFD_OEM_DEV_ROLE_GC;
790 } else if (g_strcmp0(key, "VSIE") == 0) {
792 unsigned char vsie[OEM_VSIE_MAX_LEN] = {0,};
794 vsie_len = __ws_unpack_ay(vsie, value, OEM_VSIE_MAX_LEN);
796 __ws_byte_to_txt(vsie, (char **)&(peer->vsie), vsie_len);
797 WDP_LOGD("VSIE [%s]", peer->vsie);
801 WDP_LOGD("Unknown value");
803 __WDP_LOG_FUNC_EXIT__;
807 static void __ws_peer_property(const char *key, GVariant *value, void *user_data)
809 __WDP_LOG_FUNC_ENTER__;
811 __WDP_LOG_FUNC_EXIT__;
815 wfd_oem_dev_data_s *peer = (wfd_oem_dev_data_s *)user_data;
817 CHECK_KEY_VALUE(key, value);
819 if (g_strcmp0(key, "DeviceName") == 0) {
820 const char *name = NULL;
822 g_variant_get(value, "&s", &name);
823 g_strlcpy(peer->name, name, WS_SSID_LEN + 1);
824 WDP_LOGD("Device Name [%s]", peer->name);
826 } else if (g_strcmp0(key, "config_method") == 0) {
827 int config_methods = 0;
829 g_variant_get(value, "q", &config_methods);
831 if (config_methods & WS_CONFIG_METHOD_DISPLAY)
832 peer->config_methods |= WFD_OEM_WPS_MODE_DISPLAY;
833 if (config_methods & WS_CONFIG_METHOD_PUSHBUTTON)
834 peer->config_methods |= WFD_OEM_WPS_MODE_PBC;
835 if (config_methods & WS_CONFIG_METHOD_KEYPAD)
836 peer->config_methods |= WFD_OEM_WPS_MODE_KEYPAD;
837 WDP_LOGD("Config method [0x%x]", peer->config_methods);
839 } else if (g_strcmp0(key, "level") == 0) {
842 g_variant_get(value, "i", &rssi);
844 WDP_LOGD("Peer RSSI [%d]", peer->rssi);
846 } else if (g_strcmp0(key, "devicecapability") == 0) {
847 unsigned char devicecapability = 0;
849 g_variant_get(value, "y", &devicecapability);
850 peer->dev_flags = (int)devicecapability;
851 WDP_LOGD("Device Capa [0x%02x]", peer->dev_flags);
853 } else if (g_strcmp0(key, "groupcapability") == 0) {
854 unsigned char groupcapability = 0;
856 g_variant_get(value, "y", &groupcapability);
857 WDP_LOGD("Group Capa [0x%02x]", groupcapability);
858 if (groupcapability & WS_GROUP_CAP_GROUP_OWNER) {
859 peer->group_flags = WFD_OEM_GROUP_FLAG_GROUP_OWNER;
860 peer->dev_role = WFD_OEM_DEV_ROLE_GO;
862 if (groupcapability & WS_GROUP_CAP_PERSISTENT_GROUP)
863 peer->group_flags = WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
865 } else if (g_strcmp0(key, "PrimaryDeviceType") == 0) {
866 unsigned char primarydevicetype[WS_DEVTYPE_LEN] = {0,};
868 if (__ws_unpack_ay(primarydevicetype, value, WS_DEVTYPE_LEN)) {
869 peer->pri_dev_type = primarydevicetype[1];
870 peer->sec_dev_type = primarydevicetype[WS_DEVTYPE_LEN -1];
872 } else if (g_strcmp0(key, "SecondaryDeviceTypes") == 0) {
873 } else if (g_strcmp0(key, "VendorExtension") == 0) {
874 } else if (g_strcmp0(key, "IEs") == 0) {
875 unsigned char ies[WFD_SUBELEM_LEN_DEV_INFO + 3] = {0,};
877 if (__ws_unpack_ay(ies, value, WFD_SUBELEM_LEN_DEV_INFO + 3))
878 __parsing_wfd_info(ies, &(peer->display));
879 } else if (g_strcmp0(key, "DeviceAddress") == 0) {
881 if (__ws_unpack_ay(peer->p2p_dev_addr, value, WS_MACADDR_LEN))
882 WDP_LOGD("Device address [" MACSTR "]", MAC2STR(peer->p2p_dev_addr));
884 } else if (g_strcmp0(key, "InterfaceAddress") == 0) {
886 if (__ws_unpack_ay(peer->p2p_intf_addr, value, WS_MACADDR_LEN))
887 WDP_LOGD("Interface Address [" MACSTR "]", MAC2STR(peer->p2p_intf_addr));
889 } else if (g_strcmp0(key, "GODeviceAddress") == 0) {
891 unsigned char go_dev_addr[OEM_MACADDR_LEN] = {0,};
892 if (__ws_unpack_ay(go_dev_addr, value, WS_MACADDR_LEN))
893 WDP_LOGD("[" MACSTR "]", MAC2STR(go_dev_addr));
895 if (!ISZEROMACADDR(go_dev_addr))
896 peer->dev_role = WFD_OEM_DEV_ROLE_GC;
898 } else if (g_strcmp0(key, "AdvertiseService") == 0) {
899 if (value != NULL && g_variant_get_size(value) != 0)
900 peer->has_asp_services = 1;
902 peer->has_asp_services = 0;
904 } else if (g_strcmp0(key, "AdvertiseASPService") == 0) {
905 if (value != NULL && g_variant_get_size(value) != 0)
906 peer->has_asp2_services = 1;
908 peer->has_asp2_services = 0;
910 } else if (g_strcmp0(key, "VSIE") == 0) {
912 unsigned char vsie[OEM_VSIE_MAX_LEN] = {0,};
914 vsie_len = __ws_unpack_ay(vsie, value, OEM_VSIE_MAX_LEN);
916 __ws_byte_to_txt(vsie, (char **)&(peer->vsie), vsie_len);
917 WDP_LOGD("VSIE [%s]", peer->vsie);
921 WDP_LOGD("Unknown value");
923 __WDP_LOG_FUNC_EXIT__;
927 void __ws_interface_property(const char *key, GVariant *value, void *user_data)
929 __WDP_LOG_FUNC_ENTER__;
930 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
934 CHECK_KEY_VALUE(key, value);
936 if (g_strcmp0(key, "Ifname") == 0) {
937 const char *ifname = NULL;
939 g_variant_get(value, "&s", &ifname);
940 g_strlcpy(event->ifname, ifname, OEM_IFACE_NAME_LEN+1);
941 WDP_LOGD("Ifname [%s]", event->ifname);
944 __WDP_LOG_FUNC_EXIT__;
948 void __ws_group_property(const char *key, GVariant *value, void *user_data)
950 __WDP_LOG_FUNC_ENTER__;
951 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
952 if (!event || !event->edata)
955 wfd_oem_group_data_s *group = (wfd_oem_group_data_s *)event->edata;
957 CHECK_KEY_VALUE(key, value);
959 if (g_strcmp0(key, "Role") == 0) {
960 const char *role = NULL;
962 g_variant_get(value, "&s", &role);
963 WDP_LOGD("Role [%s]", role);
965 if (!strncmp(role, "GO", 2))
966 event->dev_role = WFD_OEM_DEV_ROLE_GO;
967 else if (!strncmp(role, "client", 6))
968 event->dev_role = WFD_OEM_DEV_ROLE_GC;
970 } else if (g_strcmp0(key, "Frequency") == 0) {
973 g_variant_get(value, "q", &frequency);
974 group->freq = (int)frequency;
976 } else if (g_strcmp0(key, "Passphrase") == 0) {
977 const char *passphrase = NULL;
979 g_variant_get(value, "&s", &passphrase);
980 g_strlcpy(group->pass, passphrase, OEM_PASS_PHRASE_LEN+1);
981 WDP_LOGD("passphrase [%s]", group->pass);
983 } else if (g_strcmp0(key, "Group") == 0) {
985 } else if (g_strcmp0(key, "SSID") == 0) {
986 unsigned char ssid[WS_SSID_LEN +1] = {0,};
988 __ws_unpack_ay(ssid, value, WS_SSID_LEN);
989 memcpy(group->ssid, ssid, WS_SSID_LEN+1);
990 WDP_LOGD("ssid [%s]", group->ssid);
992 } else if (g_strcmp0(key, "BSSID") == 0) {
994 if (__ws_unpack_ay(group->go_dev_addr, value, WS_MACADDR_LEN))
995 WDP_LOGD("[" MACSTR "]", MAC2STR(group->go_dev_addr));
998 WDP_LOGD("Unknown value");
1000 __WDP_LOG_FUNC_EXIT__;
1004 void __ws_extract_invitation_details(const char *key, GVariant *value, void *user_data)
1006 __WDP_LOG_FUNC_ENTER__;
1007 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1008 if (!event || !event->edata)
1011 wfd_oem_invite_data_s *invitation = (wfd_oem_invite_data_s *)event->edata;
1013 CHECK_KEY_VALUE(key, value);
1015 if (g_strcmp0(key, "sa") == 0) {
1016 if (__ws_unpack_ay(invitation->sa, value, WS_MACADDR_LEN))
1017 WDP_LOGD("SA [" MACSTR "]", MAC2STR(invitation->sa));
1019 } else if (g_strcmp0(key, "go_dev_addr") == 0) {
1020 if (__ws_unpack_ay(invitation->go_dev_addr, value, WS_MACADDR_LEN))
1021 WDP_LOGD("GO device address [" MACSTR "]", MAC2STR(invitation->go_dev_addr));
1023 } else if (g_strcmp0(key, "bssid") == 0) {
1024 if (__ws_unpack_ay(invitation->bssid, value, WS_MACADDR_LEN))
1025 WDP_LOGD("BSSID [" MACSTR "]", MAC2STR(invitation->bssid));
1027 } else if (g_strcmp0(key, "persistent_id") == 0) {
1028 g_variant_get(value, "i", &(invitation->persistent_id));
1029 WDP_LOGD("persistent id [%d]", invitation->persistent_id);
1031 } else if (g_strcmp0(key, "op_freq") == 0) {
1032 g_variant_get(value, "i", &(invitation->oper_freq));
1033 WDP_LOGD("op freq [%d]", invitation->oper_freq);
1035 WDP_LOGD("Unknown value");
1037 __WDP_LOG_FUNC_EXIT__;
1041 static void __ws_parse_peer_joined(char *peer_path,
1042 unsigned char *dev_addr, unsigned char *ip_addr, GVariant *parameter)
1044 __WDP_LOG_FUNC_ENTER__;
1047 gboolean iter_res = TRUE;
1048 const char *path = NULL;
1051 g_variant_get(parameter, "(&oay)", &path, &iter);
1052 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
1053 WDP_LOGD("Retrive Added path [%s]", peer_path);
1055 __extract_addr_from_path(peer_path, dev_addr);
1057 for (i = 0; iter_res && i < OEM_IPADDR_LEN; i++)
1058 iter_res = g_variant_iter_loop(iter, "y", &ip_addr[i]);
1059 g_variant_iter_free(iter);
1061 WDP_LOGD("peer ip [" IPSTR "]", IP2STR(ip_addr));
1063 __WDP_LOG_FUNC_EXIT__;
1067 static gboolean __is_valid_plugin(void)
1069 gboolean is_valid = (g_pd && g_pd->callback);
1072 WDP_LOGD("Ignoring event");
1077 static wfd_oem_dev_data_s *__create_dev_data(void)
1079 wfd_oem_dev_data_s *dev_data =
1080 (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
1082 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
1083 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1084 WDP_LOGF("Failed to allocate memory for event. [%s]",
1091 static void __set_event_data(int event_id, int edata_type, void *data, wfd_oem_event_s *event)
1096 memset(event, 0x0, sizeof(wfd_oem_event_s));
1098 event->edata = data;
1099 event->edata_type = edata_type;
1100 event->event_id = event_id;
1105 static void __destroy_dev_data(wfd_oem_dev_data_s *dev_data)
1111 g_free(dev_data->vsie);
1115 static void _ws_process_peer_joined(GDBusConnection *connection,
1116 const gchar *sender, const gchar *object_path, const gchar *interface,
1117 const gchar *signal, GVariant *parameters, gpointer user_data)
1119 __WDP_LOG_FUNC_ENTER__;
1120 wfd_oem_event_s event;
1121 wfd_oem_dev_data_s *dev_data = NULL;
1122 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1124 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
1126 if (!__is_valid_plugin())
1129 dev_data = __create_dev_data();
1131 __WDP_LOG_FUNC_EXIT__;
1135 __set_event_data(WFD_OEM_EVENT_STA_CONNECTED,
1136 WFD_OEM_EDATA_TYPE_DEVICE,
1140 __ws_parse_peer_joined(peer_path, event.dev_addr, event.ip_addr_peer, parameters);
1142 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
1143 __ws_peer_property, event.edata);
1145 if (g_pd->callback->sta_connected_cb)
1146 g_pd->callback->sta_connected_cb(&event);
1148 is_peer_joined_notified = 1;
1150 __destroy_dev_data(dev_data);
1152 __WDP_LOG_FUNC_EXIT__;
1155 static void _ws_process_peer_disconnected(GDBusConnection *connection,
1156 const gchar *sender, const gchar *object_path, const gchar *interface,
1157 const gchar *signal, GVariant *parameters, gpointer user_data)
1159 __WDP_LOG_FUNC_ENTER__;
1160 wfd_oem_event_s event;
1161 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1163 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
1165 if (!g_pd || !g_pd->callback) {
1166 WDP_LOGD("Ignoring event");
1167 __WDP_LOG_FUNC_EXIT__;
1171 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1173 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
1174 event.event_id = WFD_OEM_EVENT_STA_DISCONNECTED;
1176 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
1178 if (g_pd->callback->sta_disconnected_cb)
1179 g_pd->callback->sta_disconnected_cb(&event);
1181 is_peer_disconnected_notified = 1;
1182 __WDP_LOG_FUNC_EXIT__;
1187 const char *interface;
1189 void (*function) (GDBusConnection *connection,
1190 const gchar *sender, const gchar *object_path, const gchar *interface,
1191 const gchar *signal, GVariant *parameters, gpointer user_data);
1192 } ws_group_signal_map[] = {
1195 SUPPLICANT_P2P_GROUP,
1197 _ws_process_peer_joined
1201 SUPPLICANT_P2P_GROUP,
1203 _ws_process_peer_disconnected
1213 void __ws_extract_group_details(const char *key, GVariant *value, void *user_data)
1215 __WDP_LOG_FUNC_ENTER__;
1216 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1217 if (!event || !event->edata)
1221 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
1222 __WDP_LOG_FUNC_EXIT__;
1226 wfd_oem_group_data_s *group = (wfd_oem_group_data_s *)event->edata;
1228 CHECK_KEY_VALUE(key, value);
1230 if (g_strcmp0(key, "interface_object") == 0) {
1231 static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1232 const char *i_path = NULL;
1234 g_variant_get(value, "&o", &i_path);
1235 g_strlcpy(interface_path, i_path, DBUS_OBJECT_PATH_MAX);
1236 WDP_LOGD("Retrive Added path [%s]", interface_path);
1237 g_strlcpy(g_pd->group_iface_path, interface_path, DBUS_OBJECT_PATH_MAX);
1239 dbus_property_get_all(interface_path, g_pd->g_dbus,
1240 SUPPLICANT_IFACE, __ws_interface_property, event);
1242 _ws_manage_group_iface_signal(interface_path, TRUE);
1244 } else if (g_strcmp0(key, "role") == 0) {
1245 const char *role = NULL;
1247 g_variant_get(value, "&s", &role);
1248 WDP_LOGD("Role [%s]", role);
1250 if (!strncmp(role, "GO", 2))
1251 event->dev_role = WFD_OEM_DEV_ROLE_GO;
1252 else if (!strncmp(role, "client", 6))
1253 event->dev_role = WFD_OEM_DEV_ROLE_GC;
1254 } else if (g_strcmp0(key, "persistent") == 0) {
1255 g_variant_get(value, "b", &group->is_persistent);
1256 WDP_LOGD("Is Persistent : [%s]", group->is_persistent ? "YES" : "NO");
1258 } else if (g_strcmp0(key, "IpAddr") == 0) {
1260 if (__ws_unpack_ay(group->ip_addr, value, OEM_IPADDR_LEN))
1261 WDP_LOGD("IP address [" IPSTR "]", IP2STR(group->ip_addr));
1263 } else if (g_strcmp0(key, "IpAddrMask") == 0) {
1265 if (__ws_unpack_ay(group->ip_addr_mask, value, OEM_IPADDR_LEN))
1266 WDP_LOGD("IP mask [" IPSTR "]", IP2STR(group->ip_addr_mask));
1268 } else if (g_strcmp0(key, "IpAddrGo") == 0) {
1270 if (__ws_unpack_ay(group->ip_addr_go, value, OEM_IPADDR_LEN))
1271 WDP_LOGD("GO IP address [" IPSTR "]", IP2STR(group->ip_addr_go));
1272 } else if (g_strcmp0(key, "group_object") == 0) {
1273 static char group_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1277 g_variant_get(value, "&o", &g_path);
1278 g_strlcpy(group_path, g_path, DBUS_OBJECT_PATH_MAX);
1279 WDP_LOGD("Retrive group path [%s]", group_path);
1280 dbus_property_get_all(group_path, g_pd->g_dbus, SUPPLICANT_P2P_GROUP,
1281 __ws_group_property, event);
1283 for (i = 0; ws_group_signal_map[i].member != NULL; i++) {
1284 ws_group_signal_map[i].sub_id =
1285 g_dbus_connection_signal_subscribe(g_pd->g_dbus,
1286 SUPPLICANT_SERVICE, /* bus name */
1287 ws_group_signal_map[i].interface, /* interface */
1288 ws_group_signal_map[i].member, /* member */
1289 group_path, /* object path */
1291 G_DBUS_SIGNAL_FLAGS_NONE,
1292 ws_group_signal_map[i].function,
1294 WDP_LOGD("Subscribed Group iface signal [%s]", ws_group_signal_map[i].member);
1297 __WDP_LOG_FUNC_EXIT__;
1301 void __ws_extract_gonegfailaure_details(const char *key, GVariant *value, void *user_data)
1303 __WDP_LOG_FUNC_ENTER__;
1304 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1305 if (!event || !event->edata)
1308 wfd_oem_conn_data_s *conn = (wfd_oem_conn_data_s *)event->edata;
1310 CHECK_KEY_VALUE(key, value);
1312 if (g_strcmp0(key, "peer_object") == 0) {
1313 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1316 g_variant_get(value, "&o", &path);
1317 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
1318 WDP_LOGD("Retrive peer path [%s]", peer_path);
1320 } else if (g_strcmp0(key, "status") == 0) {
1323 g_variant_get(value, "i", &status);
1324 WDP_LOGD("Retrive status [%d]", status);
1325 conn->status = status;
1327 __WDP_LOG_FUNC_EXIT__;
1331 void __ws_extract_gonegsuccess_details(const char *key, GVariant *value, void *user_data)
1333 __WDP_LOG_FUNC_ENTER__;
1334 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1335 if (!event || !event->edata)
1338 wfd_oem_conn_data_s *edata = (wfd_oem_conn_data_s *)event->edata;
1340 CHECK_KEY_VALUE(key, value);
1342 if (g_strcmp0(key, "peer_object") == 0) {
1344 } else if (g_strcmp0(key, "status") == 0) {
1346 } else if (g_strcmp0(key, "passphrase") == 0) {
1348 } else if (g_strcmp0(key, "role_go") == 0) {
1349 /* local device role */
1350 const char *role = NULL;
1352 g_variant_get(value, "&s", &role);
1353 if (!strncmp(role, "GO", 2))
1354 event->dev_role = WFD_OEM_DEV_ROLE_GO;
1355 else if (!strncmp(role, "client", 6))
1356 event->dev_role = WFD_OEM_DEV_ROLE_GC;
1358 } else if (g_strcmp0(key, "ssid") == 0) {
1359 unsigned char ssid[WS_SSID_LEN +1] = {0,};
1361 __ws_unpack_ay(ssid, value, WS_SSID_LEN);
1362 memcpy(edata->ssid, ssid, WS_SSID_LEN+1);
1363 WDP_LOGD("ssid [%s]", edata->ssid);
1365 } else if (g_strcmp0(key, "peer_device_addr") == 0) {
1367 if (__ws_unpack_ay(edata->peer_device_addr, value, WS_MACADDR_LEN))
1368 WDP_LOGD("Device address[" MACSTR "]", MAC2STR(edata->peer_device_addr));
1370 } else if (g_strcmp0(key, "peer_interface_addr") == 0) {
1372 if (__ws_unpack_ay(edata->peer_intf_addr, value, WS_MACADDR_LEN))
1373 WDP_LOGD("Interface address [" MACSTR "]", MAC2STR(edata->peer_intf_addr));
1375 } else if (g_strcmp0(key, "wps_method") == 0) {
1377 } else if (g_strcmp0(key, "frequency_list") == 0) {
1379 } else if (g_strcmp0(key, "persistent_group") == 0) {
1381 g_variant_get(value, "i", &(edata->persistent_group));
1382 WDP_LOGD("persistent_group [%d]", edata->persistent_group);
1384 } else if (g_strcmp0(key, "peer_config_timeout") == 0) {
1387 __WDP_LOG_FUNC_EXIT__;
1391 void __ws_extract_peer_service(wfd_oem_event_s *data, unsigned char *service_hex, int tlvs_len)
1393 GList *services = NULL;
1394 wfd_oem_new_service_s *new_service = NULL;
1395 char *segment = NULL;
1401 while (ptr + 2 < WS_MAX_SERVICE_LEN &&
1402 (length = (service_hex[ptr+1]*256) + service_hex[ptr]) > 0) {
1403 segment = (char*) g_try_malloc0(length*2+1);
1405 __ws_byte_to_hex(segment, length * 2 + 1, &service_hex[ptr + 3], length);
1406 res = __ws_segment_to_service(segment, &new_service);
1408 WDP_LOGE("Failed to convert segment as service instance");
1413 services = g_list_append(services, new_service);
1419 data->edata_type = WFD_OEM_EDATA_TYPE_NEW_SERVICE;
1420 data->dev_role = count;
1421 data->edata = (void*) services;
1425 void __ws_extract_servicediscoveryresponse_details(const char *key, GVariant *value, void *user_data)
1427 __WDP_LOG_FUNC_ENTER__;
1428 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1433 CHECK_KEY_VALUE(key, value);
1435 if (g_strcmp0(key, "peer_object") == 0) {
1436 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1437 const char *path = NULL;
1440 g_variant_get(value, "&o", &path);
1444 WDP_LOGD("Retrive Added path [%s]", path);
1445 loc = strrchr(path, '/');
1447 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1448 __ws_txt_to_mac(peer_dev, event->dev_addr);
1450 } else if (g_strcmp0(key, "update_indicator") == 0) {
1452 } else if (g_strcmp0(key, "tlvs") == 0) {
1453 GVariantIter *iter = NULL;
1454 unsigned char service_hex[WS_MAX_SERVICE_LEN];
1455 int byte_length = 0;
1457 g_variant_get(value, "ay", &iter);
1459 WDP_LOGE("failed to get iterator");
1463 memset(service_hex, 0x0, WS_MAX_SERVICE_LEN);
1464 while (g_variant_iter_loop(iter, "y", &service_hex[byte_length]))
1466 g_variant_iter_free(iter);
1468 __ws_extract_peer_service(event, service_hex, byte_length);
1471 __WDP_LOG_FUNC_EXIT__;
1474 static void __ws_extract_serviceaspresponse_details(const char *key, GVariant *value, void *user_data)
1476 __WDP_LOG_FUNC_ENTER__;
1477 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1478 if (!event || !event->edata)
1481 wfd_oem_asp_service_s *service = (wfd_oem_asp_service_s *)event->edata;
1483 if (g_strcmp0(key, "peer_object") == 0) {
1484 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1485 const char *path = NULL;
1488 g_variant_get(value, "&o", &path);
1492 WDP_LOGD("Retrive Added path [%s]", path);
1493 loc = strrchr(path, '/');
1495 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1496 __ws_txt_to_mac(peer_dev, event->dev_addr);
1498 } else if (g_strcmp0(key, "srv_trans_id") == 0) {
1499 unsigned int srv_trans_id = 0;
1500 g_variant_get(value, "u", &srv_trans_id);
1501 service->tran_id = srv_trans_id;
1502 WDP_LOGD("Retrive srv_trans_id [%x]", service->tran_id);
1504 } else if (g_strcmp0(key, "adv_id") == 0) {
1505 unsigned int adv_id = 0;
1506 g_variant_get(value, "u", &adv_id);
1507 service->adv_id = adv_id;
1508 WDP_LOGD("Retrive adv_id [%x]", service->adv_id);
1510 } else if (g_strcmp0(key, "svc_status") == 0) {
1511 unsigned char svc_status = 0;
1512 g_variant_get(value, "u", &svc_status);
1513 service->status = svc_status;
1514 WDP_LOGD("Retrive svc_status [%x]", service->status);
1516 } else if (g_strcmp0(key, "config_methods") == 0) {
1517 unsigned int config_methods = 0;
1518 g_variant_get(value, "q", &config_methods);
1519 service->config_method = config_methods;
1520 WDP_LOGD("Retrive config_methods [%x]", service->config_method);
1522 } else if (g_strcmp0(key, "svc_str") == 0) {
1523 const char *svc_str = NULL;
1524 g_variant_get(value, "&s", &svc_str);
1525 if (svc_str != NULL)
1526 service->service_type = g_strdup(svc_str);
1527 WDP_LOGD("Retrive srv_name [%s]", service->service_type);
1529 } else if (g_strcmp0(key, "info") == 0) {
1530 const char *info = NULL;
1531 g_variant_get(value, "&s", &info);
1533 service->service_info = g_strdup(info);
1534 WDP_LOGD("Retrive srv_info [%s]", service->service_info);
1536 __WDP_LOG_FUNC_EXIT__;
1539 static void __ws_extract_asp_provision_start_details(const char *key, GVariant *value, void *user_data)
1541 __WDP_LOG_FUNC_ENTER__;
1542 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1543 wfd_oem_asp_prov_s *asp_params = NULL;
1544 if (!event || !event->edata) {
1545 __WDP_LOG_FUNC_EXIT__;
1549 asp_params = (wfd_oem_asp_prov_s *)event->edata;
1551 if (g_strcmp0(key, "peer_object") == 0) {
1552 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1553 const char *path = NULL;
1556 g_variant_get(value, "&o", &path);
1558 __WDP_LOG_FUNC_EXIT__;
1562 WDP_LOGD("Retrive Added path [%s]", path);
1563 loc = strrchr(path, '/');
1565 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1566 __ws_txt_to_mac(peer_dev, event->dev_addr);
1568 } else if (g_strcmp0(key, "adv_id") == 0) {
1569 g_variant_get(value, "u", &asp_params->adv_id);
1570 WDP_LOGD("Retrive adv_id [%u]", asp_params->adv_id);
1572 } else if (g_strcmp0(key, "ses_id") == 0) {
1573 g_variant_get(value, "u", &asp_params->session_id);
1574 WDP_LOGD("Retrive session id [%u]", asp_params->session_id);
1576 } else if (g_strcmp0(key, "dev_passwd_id") == 0) {
1577 g_variant_get(value, "i", &event->wps_mode);
1578 WDP_LOGD("Retrive dev_passwd_id [%d]", event->wps_mode);
1580 } else if (g_strcmp0(key, "conncap") == 0) {
1581 g_variant_get(value, "u", &asp_params->network_role);
1582 WDP_LOGD("Retrive conncap [%x]", asp_params->network_role);
1584 } else if (g_strcmp0(key, "adv_mac") == 0) {
1585 if (__ws_unpack_ay(asp_params->service_mac, value, WS_MACADDR_LEN))
1586 WDP_LOGD("Adv address[" MACSTR "]", MAC2STR(asp_params->service_mac));
1588 } else if (g_strcmp0(key, "ses_mac") == 0) {
1589 if (__ws_unpack_ay(asp_params->session_mac, value, WS_MACADDR_LEN))
1590 WDP_LOGD("session address[" MACSTR "]", MAC2STR(asp_params->session_mac));
1592 } else if (g_strcmp0(key, "session_info") == 0) {
1593 const char *session_info = NULL;
1594 g_variant_get(value, "&s", &session_info);
1595 if (session_info != NULL)
1596 asp_params->session_information = g_strdup(session_info);
1597 WDP_LOGD("Retrive session_info [%s]", asp_params->session_information);
1599 __WDP_LOG_FUNC_EXIT__;
1602 static void __ws_extract_asp_provision_done_details(const char *key, GVariant *value, void *user_data)
1604 __WDP_LOG_FUNC_ENTER__;
1605 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1606 wfd_oem_asp_prov_s *asp_params = NULL;
1607 if (!event || !event->edata) {
1608 __WDP_LOG_FUNC_EXIT__;
1612 asp_params = (wfd_oem_asp_prov_s *)event->edata;
1615 if (g_strcmp0(key, "peer_object") == 0) {
1616 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1617 const char *path = NULL;
1620 g_variant_get(value, "&o", &path);
1622 __WDP_LOG_FUNC_EXIT__;
1626 WDP_LOGD("Retrive Added path [%s]", path);
1627 loc = strrchr(path, '/');
1629 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1630 __ws_txt_to_mac(peer_dev, event->dev_addr);
1632 WDP_LOGD("peer address[" MACSTR "]", MAC2STR(event->dev_addr));
1634 } else if (g_strcmp0(key, "adv_id") == 0) {
1635 g_variant_get(value, "u", &asp_params->adv_id);
1636 WDP_LOGD("Retrive adv_id [%u]", asp_params->adv_id);
1638 } else if (g_strcmp0(key, "ses_id") == 0) {
1639 g_variant_get(value, "u", &asp_params->session_id);
1640 WDP_LOGD("Retrive session id [%u]", asp_params->session_id);
1642 } else if (g_strcmp0(key, "dev_passwd_id") == 0) {
1643 g_variant_get(value, "i", &event->wps_mode);
1644 WDP_LOGD("Retrive dev_passwd_id [%d]", event->wps_mode);
1646 } else if (g_strcmp0(key, "conncap") == 0) {
1647 g_variant_get(value, "u", &asp_params->network_role);
1648 WDP_LOGD("Retrive network role [%x]", asp_params->network_role);
1650 } else if (g_strcmp0(key, "status") == 0) {
1651 g_variant_get(value, "u", &asp_params->status);
1652 WDP_LOGD("Retrive status [%x]", asp_params->status);
1654 } else if (g_strcmp0(key, "persist") == 0) {
1655 g_variant_get(value, "u", &asp_params->persistent_group_id);
1656 asp_params->persist = 1;
1657 WDP_LOGD("Retrive persist [%u]", asp_params->persistent_group_id);
1659 } else if (g_strcmp0(key, "adv_mac") == 0) {
1660 if (__ws_unpack_ay(asp_params->service_mac, value, WS_MACADDR_LEN))
1661 WDP_LOGD("Adv address[" MACSTR "]", MAC2STR(asp_params->service_mac));
1663 } else if (g_strcmp0(key, "ses_mac") == 0) {
1664 if (__ws_unpack_ay(asp_params->session_mac, value, WS_MACADDR_LEN))
1665 WDP_LOGD("session address[" MACSTR "]", MAC2STR(asp_params->session_mac));
1667 } else if (g_strcmp0(key, "group_mac") == 0) {
1668 if (__ws_unpack_ay(asp_params->group_mac, value, WS_MACADDR_LEN))
1669 WDP_LOGD("group address[" MACSTR "]", MAC2STR(asp_params->group_mac));
1671 __WDP_LOG_FUNC_EXIT__;
1674 static void __ws_extract_provision_fail_details(const char *key, GVariant *value, void *user_data)
1676 __WDP_LOG_FUNC_ENTER__;
1677 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1678 wfd_oem_asp_prov_s *asp_params = NULL;
1679 if (!event || !event->edata) {
1680 __WDP_LOG_FUNC_EXIT__;
1684 asp_params = (wfd_oem_asp_prov_s *)event->edata;
1686 if (g_strcmp0(key, "peer_object") == 0) {
1687 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1688 const char *path = NULL;
1691 g_variant_get(value, "&o", &path);
1693 __WDP_LOG_FUNC_EXIT__;
1697 WDP_LOGD("Retrive Added path [%s]", path);
1698 loc = strrchr(path, '/');
1700 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1701 __ws_txt_to_mac(peer_dev, event->dev_addr);
1703 } else if (g_strcmp0(key, "adv_id") == 0) {
1704 g_variant_get(value, "u", &asp_params->adv_id);
1705 WDP_LOGD("Retrive adv_id [%d]", asp_params->adv_id);
1707 } else if (g_strcmp0(key, "status") == 0) {
1708 g_variant_get(value, "i", &asp_params->status);
1709 WDP_LOGD("Retrive status [%d]", asp_params->status);
1711 } else if (g_strcmp0(key, "deferred_session_resp") == 0) {
1712 const char *session_info = NULL;
1713 g_variant_get(value, "&s", &session_info);
1714 if (session_info != NULL)
1715 asp_params->session_information = g_strdup(session_info);
1716 WDP_LOGD("Retrive deferred_session_resp [%s]", asp_params->session_information);
1718 __WDP_LOG_FUNC_EXIT__;
1721 static int _ws_flush(void)
1723 __WDP_LOG_FUNC_ENTER__;
1724 GDBusConnection *g_dbus = NULL;
1725 dbus_method_param_s params;
1729 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
1730 __WDP_LOG_FUNC_EXIT__;
1734 g_dbus = g_pd->g_dbus;
1736 WDP_LOGE("DBus connection is NULL");
1737 __WDP_LOG_FUNC_EXIT__;
1740 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
1742 dbus_set_method_param(¶ms, "Flush", g_pd->iface_path, g_dbus);
1743 params.params = NULL;
1745 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
1747 WDP_LOGE("Failed to send command to wpa_supplicant");
1749 WDP_LOGD("Succeeded to flush");
1751 __WDP_LOG_FUNC_EXIT__;
1755 static int _ws_cancel(void)
1757 __WDP_LOG_FUNC_ENTER__;
1758 GDBusConnection *g_dbus = NULL;
1759 dbus_method_param_s params;
1763 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
1764 __WDP_LOG_FUNC_EXIT__;
1769 g_dbus = g_pd->g_dbus;
1771 WDP_LOGE("DBus connection is NULL");
1772 __WDP_LOG_FUNC_EXIT__;
1775 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
1777 dbus_set_method_param(¶ms, "Cancel", g_pd->iface_path , g_dbus);
1778 params.params = NULL;
1780 res = dbus_method_call(¶ms, SUPPLICANT_WPS, NULL, NULL);
1782 WDP_LOGE("Failed to send command to wpa_supplicant");
1784 WDP_LOGD("Succeeded to cancel");
1786 __WDP_LOG_FUNC_EXIT__;
1790 int ws_get_advertise_service(const char *peer_path, GList **asp_services)
1792 __WDP_LOG_FUNC_ENTER__;
1793 GDBusConnection *g_dbus = NULL;
1794 GVariant *param = NULL;
1795 GVariant *reply = NULL;
1796 GVariant *temp1 = NULL;
1797 GVariant *temp2 = NULL;
1798 GError *error = NULL;
1799 GVariantIter *iter = NULL;
1800 wfd_oem_advertise_service_s *service;
1801 wfd_oem_asp_service_s *seek = NULL;
1802 unsigned char desc[7];
1803 unsigned int adv_id;
1804 unsigned int config_method;
1805 unsigned char length;
1811 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
1815 g_dbus = g_pd->g_dbus;
1817 WDP_LOGE("DBus connection is NULL");
1821 param = g_variant_new("(ss)", SUPPLICANT_P2P_PEER, "AdvertiseService");
1822 DEBUG_G_VARIANT("Params : ", param);
1824 reply = g_dbus_connection_call_sync(
1826 SUPPLICANT_SERVICE, /* bus name */
1827 peer_path, /* object path */
1828 DBUS_PROPERTIES_INTERFACE, /* interface name */
1829 DBUS_PROPERTIES_METHOD_GET, /* method name */
1830 param, /* GVariant *params */
1831 NULL, /* reply_type */
1832 G_DBUS_CALL_FLAGS_NONE, /* flags */
1833 SUPPLICANT_TIMEOUT , /* timeout */
1834 NULL, /* cancellable */
1835 &error); /* error */
1837 if (error != NULL) {
1838 WDP_LOGE("Error! Failed to get peer advertise service: [%s]",
1840 g_error_free(error);
1842 g_variant_unref(reply);
1843 __WDP_LOG_FUNC_EXIT__;
1847 if (reply != NULL) {
1848 DEBUG_G_VARIANT("Reply : ", reply);
1850 /* replay will have the format <(<ay>,)>
1851 * So, you need to remove tuple out side of variant and
1852 * variant out side of byte array
1854 temp1 = g_variant_get_child_value(reply, 0);
1855 temp2 = g_variant_get_child_value(temp1, 0);
1856 g_variant_get(temp2, "ay", &iter);
1858 g_variant_unref(reply);
1859 WDP_LOGE("Failed to get iterator");
1862 g_variant_unref(temp2);
1863 g_variant_unref(temp1);
1866 /* 4byte advertisement ID, 2 byte config method, 1byte length */
1869 memset(desc, 0x0, 7);
1870 while (cnt < 7 && g_variant_iter_loop(iter, "y", &desc[cnt]))
1873 if (cnt != 7 || desc[6] == 0) {
1874 WDP_LOGE("Invalid descriptor header length cnt [%d]", cnt);
1875 g_variant_unref(reply);
1879 adv_id = desc[3] << 24 | desc[2] << 16 | desc[1] << 8 | desc[0];
1880 config_method = desc[4] << 8 | desc[4];
1883 value = g_try_malloc0(length + 1);
1884 if (value == NULL) {
1885 WDP_LOGE("g_try_malloc0 failed");
1886 g_variant_unref(reply);
1889 WDP_LOGD("adv_id[%u] config_method[%u] length[%hhu]", adv_id, config_method, length);
1892 while (cnt < length && g_variant_iter_loop(iter, "y", &value[cnt]))
1895 if (cnt != length) {
1896 WDP_LOGE("Length doesn't matched with header value cnt [%d]", cnt);
1897 g_variant_unref(reply);
1903 service = (wfd_oem_advertise_service_s *)
1904 g_try_malloc0(sizeof(wfd_oem_advertise_service_s));
1905 if (service == NULL) {
1906 WDP_LOGE("g_try_malloc0 failed");
1907 g_variant_unref(reply);
1911 service->adv_id = adv_id;
1912 service->config_method = config_method;
1913 service->service_type_length = length;
1914 service->service_type = value;
1916 GLIST_ITER_START(seek_list, seek)
1917 if (g_strcmp0(seek->service_type, service->service_type) == 0) {
1918 WDP_LOGD("service type matched [%s] search_id [%llu]",
1919 service->service_type, seek->search_id);
1925 if (seek != NULL && seek->service_info != NULL) {
1926 WDP_LOGD("service info exists, service discovery will be performed");
1928 WDP_LOGD("service info doesn't exists. Add service to list");
1930 service->search_id = seek->search_id;
1931 *asp_services = g_list_append(*asp_services, service);
1934 g_variant_unref(reply);
1936 __WDP_LOG_FUNC_EXIT__;
1941 int ws_get_advertise_asp_service(const char *peer_path, GList **asp_services)
1943 __WDP_LOG_FUNC_ENTER__;
1944 GDBusConnection *g_dbus = NULL;
1945 GVariant *param = NULL;
1946 GVariant *reply = NULL;
1947 GVariant *temp1 = NULL;
1948 GVariant *temp2 = NULL;
1949 GError *error = NULL;
1950 GVariantIter *iter = NULL;
1951 wfd_oem_advertise_service_s *service;
1952 wfd_oem_asp_service_s *seek = NULL;
1953 unsigned char desc[7];
1954 unsigned int adv_id;
1955 unsigned int config_method;
1956 unsigned char length;
1957 char *service_type = NULL;
1958 char *instance_name = NULL;
1959 unsigned char instance_length = 0;
1964 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
1968 g_dbus = g_pd->g_dbus;
1970 WDP_LOGE("DBus connection is NULL");
1974 param = g_variant_new("(ss)", SUPPLICANT_P2P_PEER, "AdvertiseASPService");
1975 DEBUG_G_VARIANT("Params : ", param);
1977 reply = g_dbus_connection_call_sync(
1979 SUPPLICANT_SERVICE, /* bus name */
1980 peer_path, /* object path */
1981 DBUS_PROPERTIES_INTERFACE, /* interface name */
1982 DBUS_PROPERTIES_METHOD_GET, /* method name */
1983 param, /* GVariant *params */
1984 NULL, /* reply_type */
1985 G_DBUS_CALL_FLAGS_NONE, /* flags */
1986 SUPPLICANT_TIMEOUT , /* timeout */
1987 NULL, /* cancellable */
1988 &error); /* error */
1990 if (error != NULL) {
1991 WDP_LOGE("Error! Failed to get peer advertise service: [%s]",
1993 g_error_free(error);
1995 g_variant_unref(reply);
1996 __WDP_LOG_FUNC_EXIT__;
2000 if (reply != NULL) {
2001 DEBUG_G_VARIANT("Reply : ", reply);
2003 /* replay will have the format <(<ay>,)>
2004 * So, you need to remove tuple out side of variant and
2005 * variant out side of byte array
2007 temp1 = g_variant_get_child_value(reply, 0);
2008 temp2 = g_variant_get_child_value(temp1, 0);
2009 g_variant_get(temp2, "ay", &iter);
2011 g_variant_unref(reply);
2012 WDP_LOGE("Failed to get iterator");
2015 g_variant_unref(temp2);
2016 g_variant_unref(temp1);
2019 /* 4byte advertisement ID, 2 byte config method, 1byte length */
2022 memset(desc, 0x0, 7);
2023 while (cnt < 7 && g_variant_iter_loop(iter, "y", &desc[cnt]))
2026 if (cnt != 7 || desc[6] == 0) {
2027 WDP_LOGE("Invalid descriptor header length cnt [%d]", cnt);
2028 g_variant_unref(reply);
2032 adv_id = desc[3] << 24 | desc[2] << 16 | desc[1] << 8 | desc[0];
2033 config_method = desc[4] << 8 | desc[4];
2035 service_type = g_try_malloc0(length + 1);
2036 if (service_type == NULL) {
2037 WDP_LOGE("g_try_malloc0 failed");
2038 g_variant_unref(reply);
2041 WDP_LOGD("adv_id[%u] config_method[%u] length[%hhu]", adv_id, config_method, length);
2044 while (cnt < length + 1 && g_variant_iter_loop(iter, "y", &service_type[cnt]))
2047 if (cnt != length + 1) {
2048 WDP_LOGE("Length doesn't matched with header value cnt [%d]", cnt);
2049 g_variant_unref(reply);
2050 g_free(service_type);
2054 instance_length = (unsigned char)service_type[length];
2055 service_type[length] = '\0';
2057 if (instance_length != 0) {
2058 instance_name = g_try_malloc0(instance_length + 1);
2059 if (instance_name == NULL) {
2060 WDP_LOGE("g_try_malloc0 failed");
2061 g_variant_unref(reply);
2062 g_free(service_type);
2065 WDP_LOGD("instnace name length[%hhu]", instance_length);
2068 while (cnt < instance_length && g_variant_iter_loop(iter, "y", &instance_name[cnt]))
2071 if (cnt != instance_length) {
2072 WDP_LOGE("Length doesn't matched with header value cnt [%d]", cnt);
2073 g_variant_unref(reply);
2074 g_free(service_type);
2075 g_free(instance_name);
2081 service = (wfd_oem_advertise_service_s *)
2082 g_try_malloc0(sizeof(wfd_oem_advertise_service_s));
2083 if (service == NULL) {
2084 WDP_LOGE("g_try_malloc0 failed");
2085 g_variant_unref(reply);
2086 g_free(service_type);
2087 g_free(instance_name);
2090 service->adv_id = adv_id;
2091 service->config_method = config_method;
2092 service->service_type_length = length;
2093 service->service_type = service_type;
2094 service->instance_name_length = instance_length;
2095 service->instance_name = instance_name;
2097 GLIST_ITER_START(seek_list, seek)
2098 if (g_strcmp0(seek->service_type, service->service_type) == 0) {
2099 /* TODO: We need to support for instance name also hear */
2100 WDP_LOGD("service type matched [%s] search_id [%llu]",
2101 service->service_type, seek->search_id);
2107 if (seek != NULL && seek->service_info != NULL) {
2108 WDP_LOGD("service info exists, service discovery will be performed");
2110 WDP_LOGD("service info doesn't exists. Add service to list");
2112 service->search_id = seek->search_id;
2113 *asp_services = g_list_append(*asp_services, service);
2116 g_variant_unref(reply);
2118 __WDP_LOG_FUNC_EXIT__;
2122 static void _ws_process_device_found_properties(GDBusConnection *connection,
2123 const gchar *sender, const gchar *object_path, const gchar *interface,
2124 const gchar *signal, GVariant *parameters, gpointer user_data)
2126 __WDP_LOG_FUNC_ENTER__;
2127 wfd_oem_event_s event;
2128 wfd_oem_dev_data_s *dev_data = NULL;
2129 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2130 GVariantIter *iter = NULL;
2131 const char *path = NULL;
2133 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2135 if (!__is_valid_plugin())
2138 dev_data = __create_dev_data();
2140 __WDP_LOG_FUNC_EXIT__;
2144 __set_event_data(WFD_OEM_EVENT_PEER_FOUND,
2145 WFD_OEM_EDATA_TYPE_DEVICE,
2149 g_variant_get(parameters, "(&oa{sv})", &path, &iter);
2150 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
2151 WDP_LOGD("Retrive Added path [%s]", peer_path);
2153 __extract_addr_from_path(peer_path, event.dev_addr);
2157 GVariant *value = NULL;
2159 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
2160 CHECK_KEY_VALUE(key, value);
2162 __ws_peer_property(key, value, (void *)event.edata);
2164 g_variant_iter_free(iter);
2167 if (dev_data->p2p_dev_addr[0] == 0x0)
2168 memcpy(dev_data->p2p_dev_addr, event.dev_addr, OEM_MACADDR_LEN);
2170 if (dev_data->has_asp_services)
2171 ws_get_advertise_service(peer_path, (GList **)&(event.asp_services));
2172 if (dev_data->has_asp2_services)
2173 ws_get_advertise_asp_service(peer_path, (GList **)&(event.asp2_services));
2175 if (g_pd->callback->peer_found_cb)
2176 g_pd->callback->peer_found_cb(&event);
2178 if (event.asp_services != NULL) {
2180 wfd_oem_advertise_service_s *service;
2181 for (l = (GList *)event.asp_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);
2188 if (event.asp2_services != NULL) {
2190 wfd_oem_advertise_service_s *service;
2191 for (l = (GList *)event.asp2_services; l != NULL; l = l->next) {
2192 service = (wfd_oem_advertise_service_s *)l->data;
2193 event.asp_services = g_list_remove(l, service);
2194 g_free(service->service_type);
2195 g_free(service->instance_name);
2200 __destroy_dev_data(dev_data);
2202 __WDP_LOG_FUNC_EXIT__;
2205 static void _ws_process_device_lost(GDBusConnection *connection,
2206 const gchar *sender, const gchar *object_path, const gchar *interface,
2207 const gchar *signal, GVariant *parameters, gpointer user_data)
2209 __WDP_LOG_FUNC_ENTER__;
2210 wfd_oem_event_s event;
2211 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2213 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2215 if (!g_pd || !g_pd->callback) {
2216 WDP_LOGD("Ignoring event");
2217 __WDP_LOG_FUNC_EXIT__;
2221 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2223 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2224 event.event_id = WFD_OEM_EVENT_PEER_DISAPPEARED;
2226 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
2228 if (g_pd->callback->peer_disappeared_cb)
2229 g_pd->callback->peer_disappeared_cb(&event);
2232 __WDP_LOG_FUNC_EXIT__;
2235 static void _ws_process_find_stoppped(GDBusConnection *connection,
2236 const gchar *sender, const gchar *object_path, const gchar *interface,
2237 const gchar *signal, GVariant *parameters, gpointer user_data)
2239 __WDP_LOG_FUNC_ENTER__;
2240 wfd_oem_event_s event;
2242 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2244 if (!g_pd || !g_pd->callback) {
2245 WDP_LOGD("Ignoring event");
2246 __WDP_LOG_FUNC_EXIT__;
2250 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2252 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2253 event.event_id = WFD_OEM_EVENT_DISCOVERY_FINISHED;
2255 if (g_pd->callback->discovery_finished_cb)
2256 g_pd->callback->discovery_finished_cb(&event);
2258 __WDP_LOG_FUNC_EXIT__;
2261 static void _ws_process_prov_disc_req_display_pin(GDBusConnection *connection,
2262 const gchar *sender, const gchar *object_path, const gchar *interface,
2263 const gchar *signal, GVariant *parameters, gpointer user_data)
2265 __WDP_LOG_FUNC_ENTER__;
2266 wfd_oem_event_s event;
2267 wfd_oem_dev_data_s *dev_data = NULL;
2268 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2269 const char *path = NULL;
2270 const char *pin = NULL;
2271 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2273 if (!__is_valid_plugin())
2276 dev_data = __create_dev_data();
2278 __WDP_LOG_FUNC_EXIT__;
2282 __set_event_data(WFD_OEM_EVENT_PROV_DISC_REQ,
2283 WFD_OEM_EDATA_TYPE_DEVICE,
2286 event.wps_mode = WFD_OEM_WPS_MODE_DISPLAY;
2288 g_variant_get(parameters, "(&o&s)", &path, &pin);
2289 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
2290 WDP_LOGD("Retrive Added path [%s]", peer_path);
2292 __extract_addr_from_path(peer_path, event.dev_addr);
2294 g_strlcpy(event.wps_pin, pin, WS_PINSTR_LEN + 1);
2295 WDP_LOGD("Retrive pin [%s]", event.wps_pin);
2297 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2298 __ws_peer_property, event.edata);
2300 if (g_pd->callback->prov_disc_req_cb)
2301 g_pd->callback->prov_disc_req_cb(&event);
2303 __destroy_dev_data(dev_data);
2305 __WDP_LOG_FUNC_EXIT__;
2308 static void _ws_process_prov_disc_resp_display_pin(GDBusConnection *connection,
2309 const gchar *sender, const gchar *object_path, const gchar *interface,
2310 const gchar *signal, GVariant *parameters, gpointer user_data)
2312 __WDP_LOG_FUNC_ENTER__;
2313 wfd_oem_event_s event;
2314 wfd_oem_dev_data_s *dev_data = NULL;
2315 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2316 const char *path = NULL;
2317 const char *pin = NULL;
2319 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2321 if (!__is_valid_plugin())
2324 dev_data = __create_dev_data();
2326 __WDP_LOG_FUNC_EXIT__;
2330 __set_event_data(WFD_OEM_EVENT_PROV_DISC_RESP,
2331 WFD_OEM_EDATA_TYPE_DEVICE,
2334 event.wps_mode = WFD_OEM_WPS_MODE_DISPLAY;
2336 g_variant_get(parameters, "(&o&s)", &path, &pin);
2337 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
2338 WDP_LOGD("Retrive Added path [%s]", peer_path);
2340 __extract_addr_from_path(peer_path, event.dev_addr);
2342 g_strlcpy(event.wps_pin, pin, WS_PINSTR_LEN + 1);
2343 WDP_LOGD("Retrive pin [%s]", event.wps_pin);
2345 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2346 __ws_peer_property, event.edata);
2348 if (g_pd->callback->prov_disc_resp_cb)
2349 g_pd->callback->prov_disc_resp_cb(&event);
2351 __destroy_dev_data(dev_data);
2353 __WDP_LOG_FUNC_EXIT__;
2356 static void _ws_process_prov_disc_req_enter_pin(GDBusConnection *connection,
2357 const gchar *sender, const gchar *object_path, const gchar *interface,
2358 const gchar *signal, GVariant *parameters, gpointer user_data)
2360 __WDP_LOG_FUNC_ENTER__;
2361 wfd_oem_event_s event;
2362 wfd_oem_dev_data_s *dev_data = NULL;
2363 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2365 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2366 if (!__is_valid_plugin())
2369 dev_data = __create_dev_data();
2371 __WDP_LOG_FUNC_EXIT__;
2375 __set_event_data(WFD_OEM_EVENT_PROV_DISC_REQ,
2376 WFD_OEM_EDATA_TYPE_DEVICE,
2379 event.wps_mode = WFD_OEM_WPS_MODE_KEYPAD;
2381 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
2383 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2384 __ws_peer_property, event.edata);
2386 if (g_pd->callback->prov_disc_req_cb)
2387 g_pd->callback->prov_disc_req_cb(&event);
2389 __destroy_dev_data(dev_data);
2391 __WDP_LOG_FUNC_EXIT__;
2394 static void _ws_process_prov_disc_resp_enter_pin(GDBusConnection *connection,
2395 const gchar *sender, const gchar *object_path, const gchar *interface,
2396 const gchar *signal, GVariant *parameters, gpointer user_data)
2398 __WDP_LOG_FUNC_ENTER__;
2399 wfd_oem_event_s event;
2400 wfd_oem_dev_data_s *dev_data = NULL;
2401 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2403 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2405 if (!__is_valid_plugin())
2408 dev_data = __create_dev_data();
2410 __WDP_LOG_FUNC_EXIT__;
2414 __set_event_data(WFD_OEM_EVENT_PROV_DISC_RESP,
2415 WFD_OEM_EDATA_TYPE_DEVICE,
2419 event.wps_mode = WFD_OEM_WPS_MODE_KEYPAD;
2421 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
2423 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2424 __ws_peer_property, event.edata);
2426 if (g_pd->callback->prov_disc_resp_cb)
2427 g_pd->callback->prov_disc_resp_cb(&event);
2429 __destroy_dev_data(dev_data);
2431 __WDP_LOG_FUNC_EXIT__;
2434 static void _ws_process_prov_disc_pbc_req(GDBusConnection *connection,
2435 const gchar *sender, const gchar *object_path, const gchar *interface,
2436 const gchar *signal, GVariant *parameters, gpointer user_data)
2438 __WDP_LOG_FUNC_ENTER__;
2439 wfd_oem_event_s event;
2440 wfd_oem_dev_data_s *dev_data = NULL;
2441 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2443 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2445 if (!__is_valid_plugin())
2448 dev_data = __create_dev_data();
2450 __WDP_LOG_FUNC_EXIT__;
2453 __set_event_data(WFD_OEM_EVENT_PROV_DISC_REQ,
2454 WFD_OEM_EDATA_TYPE_DEVICE,
2457 event.wps_mode = WFD_OEM_WPS_MODE_PBC;
2459 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
2461 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2462 __ws_peer_property, event.edata);
2464 if (g_pd->callback->prov_disc_req_cb)
2465 g_pd->callback->prov_disc_req_cb(&event);
2467 __destroy_dev_data(dev_data);
2469 __WDP_LOG_FUNC_EXIT__;
2472 static void _ws_process_prov_disc_pbc_resp(GDBusConnection *connection,
2473 const gchar *sender, const gchar *object_path, const gchar *interface,
2474 const gchar *signal, GVariant *parameters, gpointer user_data)
2476 __WDP_LOG_FUNC_ENTER__;
2477 wfd_oem_event_s event;
2478 wfd_oem_dev_data_s *dev_data = NULL;
2479 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2481 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2483 if (!__is_valid_plugin())
2486 dev_data = __create_dev_data();
2488 __WDP_LOG_FUNC_EXIT__;
2491 __set_event_data(WFD_OEM_EVENT_PROV_DISC_RESP,
2492 WFD_OEM_EDATA_TYPE_DEVICE,
2495 event.wps_mode = WFD_OEM_WPS_MODE_PBC;
2497 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
2499 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2500 __ws_peer_property, event.edata);
2502 if (g_pd->callback->prov_disc_resp_cb)
2503 g_pd->callback->prov_disc_resp_cb(&event);
2505 __destroy_dev_data(dev_data);
2507 __WDP_LOG_FUNC_EXIT__;
2510 static void _ws_process_prov_disc_failure(GDBusConnection *connection,
2511 const gchar *sender, const gchar *object_path, const gchar *interface,
2512 const gchar *signal, GVariant *parameters, gpointer user_data)
2514 __WDP_LOG_FUNC_ENTER__;
2515 GVariantIter *iter = NULL;
2516 wfd_oem_event_s event;
2517 wfd_oem_asp_prov_s *edata;
2519 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2521 if (!g_pd || !g_pd->callback) {
2522 WDP_LOGD("Ignoring event");
2523 __WDP_LOG_FUNC_EXIT__;
2527 edata = (wfd_oem_asp_prov_s *) g_try_malloc0(sizeof(wfd_oem_asp_prov_s));
2529 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2530 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2531 WDP_LOGF("Failed to allocate memory for event. [%s]",
2533 __WDP_LOG_FUNC_EXIT__;
2536 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2538 event.edata = (void*) edata;
2539 event.event_id = WFD_OEM_EVENT_PROV_DISC_FAIL;
2541 if (parameters != NULL) {
2542 g_variant_get(parameters, "(a{sv})", &iter);
2544 dbus_property_foreach(iter, __ws_extract_provision_fail_details, &event);
2545 event.edata_type = WFD_OEM_EDATA_TYPE_ASP_PROV;
2546 g_variant_iter_free(iter);
2549 WDP_LOGE("No Properties");
2552 if (g_pd->callback->prov_disc_fail_cb)
2553 g_pd->callback->prov_disc_fail_cb(&event);
2555 if (event.edata_type == WFD_OEM_EDATA_TYPE_ASP_PROV)
2556 g_free(edata->session_information);
2559 __WDP_LOG_FUNC_EXIT__;
2562 static void _ws_process_group_started(GDBusConnection *connection,
2563 const gchar *sender, const gchar *object_path, const gchar *interface,
2564 const gchar *signal, GVariant *parameters, gpointer user_data)
2566 __WDP_LOG_FUNC_ENTER__;
2567 GVariantIter *iter = NULL;
2568 wfd_oem_event_s event;
2569 wfd_oem_group_data_s *edata = NULL;
2571 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2573 if (!g_pd || !g_pd->callback) {
2574 WDP_LOGD("Ignoring event");
2575 __WDP_LOG_FUNC_EXIT__;
2579 edata = (wfd_oem_group_data_s*)calloc(1, sizeof(wfd_oem_group_data_s));
2581 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2582 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2583 WDP_LOGF("Failed to allocate memory for event. [%s]",
2585 __WDP_LOG_FUNC_EXIT__;
2588 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2590 event.edata = (void*) edata;
2591 event.edata_type = WFD_OEM_EDATA_TYPE_GROUP;
2592 event.event_id = WFD_OEM_EVENT_GROUP_CREATED;
2594 if (parameters != NULL) {
2595 g_variant_get(parameters, "(a{sv})", &iter);
2598 dbus_property_foreach(iter, __ws_extract_group_details, &event);
2599 g_variant_iter_free(iter);
2602 WDP_LOGE("No properties");
2605 if (g_pd->callback->group_created_cb)
2606 g_pd->callback->group_created_cb(&event);
2608 g_free(event.edata);
2610 __WDP_LOG_FUNC_EXIT__;
2613 static void _ws_process_go_neg_success(GDBusConnection *connection,
2614 const gchar *sender, const gchar *object_path, const gchar *interface,
2615 const gchar *signal, GVariant *parameters, gpointer user_data)
2617 __WDP_LOG_FUNC_ENTER__;
2618 GVariantIter *iter = NULL;
2619 wfd_oem_event_s event;
2620 wfd_oem_conn_data_s *edata = NULL;
2622 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2624 if (!g_pd || !g_pd->callback) {
2625 WDP_LOGD("Ignoring event");
2626 __WDP_LOG_FUNC_EXIT__;
2630 edata = (wfd_oem_conn_data_s*)calloc(1, sizeof(wfd_oem_conn_data_s));
2632 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2633 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2634 WDP_LOGF("Failed to allocate memory for event. [%s]",
2636 __WDP_LOG_FUNC_EXIT__;
2639 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2641 event.edata = edata;
2642 event.edata_type = WFD_OEM_EDATA_TYPE_CONN;
2643 event.event_id = WFD_OEM_EVENT_GO_NEG_DONE;
2645 if (parameters != NULL) {
2646 g_variant_get(parameters, "(a{sv})", &iter);
2649 dbus_property_foreach(iter, __ws_extract_gonegsuccess_details, &event);
2650 g_variant_iter_free(iter);
2653 WDP_LOGE("No properties");
2656 if (g_pd->callback->go_neg_done_cb)
2657 g_pd->callback->go_neg_done_cb(&event);
2661 __WDP_LOG_FUNC_EXIT__;
2664 static void _ws_process_go_neg_failure(GDBusConnection *connection,
2665 const gchar *sender, const gchar *object_path, const gchar *interface,
2666 const gchar *signal, GVariant *parameters, gpointer user_data)
2668 __WDP_LOG_FUNC_ENTER__;
2669 GVariantIter *iter = NULL;
2670 wfd_oem_event_s event;
2671 wfd_oem_conn_data_s *edata = NULL;
2673 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2675 if (!g_pd || !g_pd->callback) {
2676 WDP_LOGD("Ignoring event");
2677 __WDP_LOG_FUNC_EXIT__;
2681 edata = (wfd_oem_conn_data_s *) g_try_malloc0(sizeof(wfd_oem_conn_data_s));
2683 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2684 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2685 WDP_LOGF("Failed to allocate memory for event. [%s]",
2687 __WDP_LOG_FUNC_EXIT__;
2690 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2692 event.edata = (void*) edata;
2693 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
2694 event.event_id = WFD_OEM_EVENT_GO_NEG_FAIL;
2696 if (parameters != NULL) {
2697 g_variant_get(parameters, "(a{sv})", &iter);
2700 dbus_property_foreach(iter, __ws_extract_gonegfailaure_details, &event);
2701 g_variant_iter_free(iter);
2704 WDP_LOGE("No properties");
2707 if (g_pd->callback->go_neg_fail_cb)
2708 g_pd->callback->go_neg_fail_cb(&event);
2710 g_free(event.edata);
2712 __WDP_LOG_FUNC_EXIT__;
2715 static void __set_wps_mode_for_event(int dev_passwd_id, wfd_oem_event_s *event)
2720 WDP_LOGD("Retrive dev_passwd_id [%d]", dev_passwd_id);
2722 if (dev_passwd_id == WS_DEV_PASSWD_ID_PUSH_BUTTON)
2723 event->wps_mode = WFD_OEM_WPS_MODE_PBC;
2724 else if (dev_passwd_id == WS_DEV_PASSWD_ID_REGISTRAR_SPECIFIED)
2725 event->wps_mode = WFD_OEM_WPS_MODE_DISPLAY;
2726 else if (dev_passwd_id == WS_DEV_PASSWD_ID_USER_SPECIFIED)
2727 event->wps_mode = WFD_OEM_WPS_MODE_KEYPAD;
2729 event->wps_mode = WFD_OEM_WPS_MODE_NONE;
2732 static void _ws_process_go_neg_request(GDBusConnection *connection,
2733 const gchar *sender, const gchar *object_path, const gchar *interface,
2734 const gchar *signal, GVariant *parameters, gpointer user_data)
2736 __WDP_LOG_FUNC_ENTER__;
2737 wfd_oem_event_s event;
2738 wfd_oem_dev_data_s *dev_data = NULL;
2739 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2740 const char *path = NULL;
2741 int dev_passwd_id = 0;
2742 int device_go_intent = 0;
2744 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2746 if (!__is_valid_plugin())
2749 dev_data = __create_dev_data();
2751 __WDP_LOG_FUNC_EXIT__;
2754 __set_event_data(WFD_OEM_EVENT_GO_NEG_REQ,
2755 WFD_OEM_EDATA_TYPE_DEVICE,
2759 g_variant_get(parameters, "(&oqy)", &path, &dev_passwd_id, &device_go_intent);
2760 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
2762 WDP_LOGD("Retrive peer path [%s]", peer_path);
2763 __set_wps_mode_for_event(dev_passwd_id, &event);
2764 WDP_LOGD("Retrive device_go_intent [%d]", device_go_intent);
2765 dev_data->device_go_intent = device_go_intent;
2767 __extract_addr_from_path(peer_path, event.dev_addr);
2769 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2770 __ws_peer_property, event.edata);
2772 if (g_pd->callback->go_neg_req_cb)
2773 g_pd->callback->go_neg_req_cb(&event);
2775 __destroy_dev_data(dev_data);
2777 __WDP_LOG_FUNC_EXIT__;
2779 static void _ws_process_invitation_received(GDBusConnection *connection,
2780 const gchar *sender, const gchar *object_path, const gchar *interface,
2781 const gchar *signal, GVariant *parameters, gpointer user_data)
2783 __WDP_LOG_FUNC_ENTER__;
2784 GVariantIter *iter = NULL;
2785 wfd_oem_event_s event;
2786 wfd_oem_invite_data_s *edata = NULL;
2788 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2790 if (!g_pd || !g_pd->callback) {
2791 WDP_LOGD("Ignoring event");
2792 __WDP_LOG_FUNC_EXIT__;
2796 edata = (wfd_oem_invite_data_s *) g_try_malloc0(sizeof(wfd_oem_invite_data_s));
2798 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2799 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2800 WDP_LOGF("Failed to allocate memory for event. [%s]",
2802 __WDP_LOG_FUNC_EXIT__;
2805 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2807 event.edata = (void*) edata;
2808 event.edata_type = WFD_OEM_EDATA_TYPE_INVITE;
2809 event.event_id = WFD_OEM_EVENT_INVITATION_REQ;
2811 if (parameters != NULL) {
2812 g_variant_get(parameters, "(a{sv})", &iter);
2815 dbus_property_foreach(iter, __ws_extract_invitation_details, &event);
2816 g_variant_iter_free(iter);
2819 WDP_LOGE("No properties");
2821 memcpy(&(event.dev_addr), edata->sa, OEM_MACADDR_LEN);
2823 if (g_pd->callback->invitation_req_cb)
2824 g_pd->callback->invitation_req_cb(&event);
2826 g_free(event.edata);
2828 __WDP_LOG_FUNC_EXIT__;
2831 static void _ws_process_invitation_result(GDBusConnection *connection,
2832 const gchar *sender, const gchar *object_path, const gchar *interface,
2833 const gchar *signal, GVariant *parameters, gpointer user_data)
2835 __WDP_LOG_FUNC_ENTER__;
2836 wfd_oem_event_s event;
2838 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2840 if (!g_pd || !g_pd->callback) {
2841 WDP_LOGD("Ignoring event");
2842 __WDP_LOG_FUNC_EXIT__;
2846 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2848 __WDP_LOG_FUNC_EXIT__;
2851 static void _ws_process_group_finished(GDBusConnection *connection,
2852 const gchar *sender, const gchar *object_path, const gchar *interface,
2853 const gchar *signal, GVariant *parameters, gpointer user_data)
2855 __WDP_LOG_FUNC_ENTER__;
2856 wfd_oem_event_s event;
2859 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2861 if (!g_pd || !g_pd->callback) {
2862 WDP_LOGD("Ignoring event");
2863 __WDP_LOG_FUNC_EXIT__;
2867 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2869 event.event_id = WFD_OEM_EVENT_GROUP_DESTROYED;
2870 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2872 for (i = 0; ws_group_signal_map[i].member != NULL; i++) {
2873 g_dbus_connection_signal_unsubscribe(g_pd->g_dbus, ws_group_signal_map[i].sub_id);
2874 ws_group_signal_map[i].sub_id = 0;
2877 _ws_manage_group_iface_signal(interface, FALSE);
2878 memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
2879 if (g_pd->callback->group_destroyed_cb)
2880 g_pd->callback->group_destroyed_cb(&event);
2884 __WDP_LOG_FUNC_EXIT__;
2887 static void _ws_process_service_discovery_response(GDBusConnection *connection,
2888 const gchar *sender, const gchar *object_path, const gchar *interface,
2889 const gchar *signal, GVariant *parameters, gpointer user_data)
2891 __WDP_LOG_FUNC_ENTER__;
2892 GVariantIter *iter = NULL;
2893 wfd_oem_event_s event;
2895 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2897 if (!g_pd || !g_pd->callback) {
2898 WDP_LOGD("Ignoring event");
2899 __WDP_LOG_FUNC_EXIT__;
2903 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2905 event.event_id = WFD_OEM_EVENT_SERV_DISC_RESP;
2907 if (parameters != NULL) {
2908 g_variant_get(parameters, "(a{sv})", &iter);
2910 dbus_property_foreach(iter, __ws_extract_servicediscoveryresponse_details, &event);
2911 event.edata_type = WFD_OEM_EDATA_TYPE_NEW_SERVICE;
2912 g_variant_iter_free(iter);
2915 WDP_LOGE("No Properties");
2918 if (g_pd->callback->serv_disc_resp_cb)
2919 g_pd->callback->serv_disc_resp_cb(&event);
2921 if (event.edata_type == WFD_OEM_EDATA_TYPE_NEW_SERVICE)
2922 g_list_free((GList*) event.edata);
2924 __WDP_LOG_FUNC_EXIT__;
2927 static void _ws_process_service_asp_response(GDBusConnection *connection,
2928 const gchar *sender, const gchar *object_path, const gchar *interface,
2929 const gchar *signal, GVariant *parameters, gpointer user_data)
2931 __WDP_LOG_FUNC_ENTER__;
2932 GVariantIter *iter = NULL;
2933 wfd_oem_event_s event;
2934 wfd_oem_asp_service_s *service = NULL;
2935 wfd_oem_asp_service_s *tmp = NULL;
2937 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2939 if (!g_pd || !g_pd->callback) {
2940 WDP_LOGD("Ignoring event");
2941 __WDP_LOG_FUNC_EXIT__;
2945 service = (wfd_oem_asp_service_s *) g_try_malloc0(sizeof(wfd_oem_asp_service_s));
2947 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2948 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2949 WDP_LOGF("Failed to allocate memory for event. [%s]",
2951 __WDP_LOG_FUNC_EXIT__;
2954 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2956 event.edata = (void*) service;
2957 event.edata_type = WFD_OEM_EDATA_TYPE_ASP_SERVICE;
2958 event.event_id = WFD_OEM_EVENT_ASP_SERV_RESP;
2960 if (parameters != NULL) {
2961 g_variant_get(parameters, "(a{sv})", &iter);
2963 dbus_property_foreach(iter, __ws_extract_serviceaspresponse_details, &event);
2964 g_variant_iter_free(iter);
2967 WDP_LOGE("No Properties");
2969 GLIST_ITER_START(seek_list, tmp)
2970 if (tmp->tran_id == service->tran_id) {
2971 WDP_LOGD("srv_trans_id matched [%d] search_id [%llu]"
2972 , tmp->tran_id, tmp->search_id);
2973 service->search_id = tmp->search_id;
2980 if (tmp != NULL && tmp->service_info != NULL) {
2981 if (g_pd->callback->asp_serv_resp_cb)
2982 g_pd->callback->asp_serv_resp_cb(&event);
2984 WDP_LOGD("service info is not required, don't notify to user");
2987 g_free(service->service_type);
2988 g_free(service->service_info);
2991 __WDP_LOG_FUNC_EXIT__;
2994 static void _ws_process_persistent_group_added(GDBusConnection *connection,
2995 const gchar *sender, const gchar *object_path, const gchar *interface,
2996 const gchar *signal, GVariant *parameters, gpointer user_data)
2998 __WDP_LOG_FUNC_ENTER__;
2999 wfd_oem_event_s event;
3001 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3003 if (!g_pd || !g_pd->callback) {
3004 WDP_LOGD("Ignoring event");
3005 __WDP_LOG_FUNC_EXIT__;
3009 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3011 __WDP_LOG_FUNC_EXIT__;
3014 static void _ws_process_persistent_group_removed(GDBusConnection *connection,
3015 const gchar *sender, const gchar *object_path, const gchar *interface,
3016 const gchar *signal, GVariant *parameters, gpointer user_data)
3018 __WDP_LOG_FUNC_ENTER__;
3019 wfd_oem_event_s event;
3021 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3023 if (!g_pd || !g_pd->callback) {
3024 WDP_LOGD("Ignoring event");
3025 __WDP_LOG_FUNC_EXIT__;
3029 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3031 __WDP_LOG_FUNC_EXIT__;
3034 static void _ws_process_wps_failed(GDBusConnection *connection,
3035 const gchar *sender, const gchar *object_path, const gchar *interface,
3036 const gchar *signal, GVariant *parameters, gpointer user_data)
3038 __WDP_LOG_FUNC_ENTER__;
3039 GVariantIter *iter = NULL;
3040 wfd_oem_event_s event;
3041 const char *name = NULL;
3043 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3045 if (!g_pd || !g_pd->callback) {
3046 WDP_LOGD("Ignoring event");
3047 __WDP_LOG_FUNC_EXIT__;
3051 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3053 event.event_id = WFD_OEM_EVENT_WPS_FAIL;
3054 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
3056 g_variant_get(parameters, "(&sa{sv})", &name, &iter);
3058 WDP_LOGD("code [%s]", name);
3063 GVariant *value = NULL;
3065 while (g_variant_iter_loop(iter, "{sv}", &key, &value))
3066 CHECK_KEY_VALUE(key, value);
3068 g_variant_iter_free(iter);
3071 if (g_pd->callback->wps_fail_cb)
3072 g_pd->callback->wps_fail_cb(&event);
3074 __WDP_LOG_FUNC_EXIT__;
3077 static void _ws_process_group_formation_failure(GDBusConnection *connection,
3078 const gchar *sender, const gchar *object_path, const gchar *interface,
3079 const gchar *signal, GVariant *parameters, gpointer user_data)
3081 __WDP_LOG_FUNC_ENTER__;
3082 wfd_oem_event_s event;
3084 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3086 if (!g_pd || !g_pd->callback) {
3087 WDP_LOGD("Ignoring event");
3088 __WDP_LOG_FUNC_EXIT__;
3092 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3094 event.event_id = WFD_OEM_EVENT_GROUP_FORMATION_FAILURE;
3095 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
3097 if (g_pd->callback->group_formation_failure_cb)
3098 g_pd->callback->group_formation_failure_cb(&event);
3100 __WDP_LOG_FUNC_EXIT__;
3103 static void _ws_process_invitation_accepted(GDBusConnection *connection,
3104 const gchar *sender, const gchar *object_path, const gchar *interface,
3105 const gchar *signal, GVariant *parameters, gpointer user_data)
3107 __WDP_LOG_FUNC_ENTER__;
3108 GVariantIter *iter = NULL;
3109 wfd_oem_event_s event;
3111 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3113 if (!g_pd || !g_pd->callback) {
3114 WDP_LOGD("Ignoring event");
3115 __WDP_LOG_FUNC_EXIT__;
3119 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3121 event.event_id = WFD_OEM_EVENT_INVITATION_ACCEPTED;
3122 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
3124 if (parameters != NULL) {
3125 g_variant_get(parameters, "(a{sv})", &iter);
3129 GVariant *value = NULL;
3131 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
3132 CHECK_KEY_VALUE(key, value);
3134 if (g_strcmp0(key, "sa") == 0)
3135 if (__ws_unpack_ay(event.dev_addr, value, WS_MACADDR_LEN))
3136 WDP_LOGI("[" MACSTR "]", MAC2STR(event.dev_addr));
3138 g_variant_iter_free(iter);
3142 if (g_pd->callback->invitation_accepted_cb)
3143 g_pd->callback->invitation_accepted_cb(&event);
3145 __WDP_LOG_FUNC_EXIT__;
3148 static void _ws_process_asp_provision_start(GDBusConnection *connection,
3149 const gchar *sender, const gchar *object_path, const gchar *interface,
3150 const gchar *signal, GVariant *parameters, gpointer user_data)
3152 __WDP_LOG_FUNC_ENTER__;
3153 GVariantIter *iter = NULL;
3154 wfd_oem_event_s event;
3155 wfd_oem_asp_prov_s *edata;
3157 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3159 if (!g_pd || !g_pd->callback) {
3160 WDP_LOGD("Ignoring event");
3161 __WDP_LOG_FUNC_EXIT__;
3165 edata = (wfd_oem_asp_prov_s *) g_try_malloc0(sizeof(wfd_oem_asp_prov_s));
3167 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
3168 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
3169 WDP_LOGF("Failed to allocate memory for event. [%s]",
3171 __WDP_LOG_FUNC_EXIT__;
3174 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3176 event.edata = (void*) edata;
3177 event.event_id = WFD_OEM_EVENT_ASP_PROV_START;
3179 if (parameters != NULL) {
3180 g_variant_get(parameters, "(a{sv})", &iter);
3182 dbus_property_foreach(iter, __ws_extract_asp_provision_start_details, &event);
3183 event.edata_type = WFD_OEM_EDATA_TYPE_ASP_PROV;
3184 g_variant_iter_free(iter);
3187 WDP_LOGE("No Properties");
3190 if (g_pd->callback->asp_prov_start_cb)
3191 g_pd->callback->asp_prov_start_cb(&event);
3193 if (event.edata_type == WFD_OEM_EDATA_TYPE_ASP_PROV)
3194 g_free(edata->session_information);
3197 __WDP_LOG_FUNC_EXIT__;
3200 static void _ws_process_asp_provision_done(GDBusConnection *connection,
3201 const gchar *sender, const gchar *object_path, const gchar *interface,
3202 const gchar *signal, GVariant *parameters, gpointer user_data)
3204 __WDP_LOG_FUNC_ENTER__;
3205 GVariantIter *iter = NULL;
3206 wfd_oem_event_s event;
3207 wfd_oem_asp_prov_s *edata;
3209 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3211 if (!g_pd || !g_pd->callback) {
3212 WDP_LOGD("Ignoring event");
3213 __WDP_LOG_FUNC_EXIT__;
3217 edata = (wfd_oem_asp_prov_s *) g_try_malloc0(sizeof(wfd_oem_asp_prov_s));
3219 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
3220 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
3221 WDP_LOGF("Failed to allocate memory for event. [%s]",
3223 __WDP_LOG_FUNC_EXIT__;
3226 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3228 event.edata = (void*) edata;
3229 event.event_id = WFD_OEM_EVENT_ASP_PROV_DONE;
3231 if (parameters != NULL) {
3232 g_variant_get(parameters, "(a{sv})", &iter);
3234 dbus_property_foreach(iter, __ws_extract_asp_provision_done_details, &event);
3235 event.edata_type = WFD_OEM_EDATA_TYPE_ASP_PROV;
3236 g_variant_iter_free(iter);
3239 WDP_LOGE("No Properties");
3242 if (g_pd->callback->asp_prov_done_cb)
3243 g_pd->callback->asp_prov_done_cb(&event);
3247 __WDP_LOG_FUNC_EXIT__;
3252 const char *interface;
3254 void (*function) (GDBusConnection *connection,
3255 const gchar *sender, const gchar *object_path, const gchar *interface,
3256 const gchar *signal, GVariant *parameters, gpointer user_data);
3257 } ws_p2pdevice_signal_map[] = {
3260 SUPPLICANT_P2PDEVICE,
3261 "DeviceFoundProperties",
3262 _ws_process_device_found_properties
3266 SUPPLICANT_P2PDEVICE,
3268 _ws_process_device_lost
3272 SUPPLICANT_P2PDEVICE,
3274 _ws_process_find_stoppped
3278 SUPPLICANT_P2PDEVICE,
3279 "ProvisionDiscoveryRequestDisplayPin",
3280 _ws_process_prov_disc_req_display_pin
3284 SUPPLICANT_P2PDEVICE,
3285 "ProvisionDiscoveryResponseDisplayPin",
3286 _ws_process_prov_disc_resp_display_pin
3290 SUPPLICANT_P2PDEVICE,
3291 "ProvisionDiscoveryRequestEnterPin",
3292 _ws_process_prov_disc_req_enter_pin
3296 SUPPLICANT_P2PDEVICE,
3297 "ProvisionDiscoveryResponseEnterPin",
3298 _ws_process_prov_disc_resp_enter_pin
3302 SUPPLICANT_P2PDEVICE,
3303 "ProvisionDiscoveryPBCRequest",
3304 _ws_process_prov_disc_pbc_req
3308 SUPPLICANT_P2PDEVICE,
3309 "ProvisionDiscoveryPBCResponse",
3310 _ws_process_prov_disc_pbc_resp
3314 SUPPLICANT_P2PDEVICE,
3315 "ProvisionDiscoveryFailure",
3316 _ws_process_prov_disc_failure
3320 SUPPLICANT_P2PDEVICE,
3322 _ws_process_group_started
3326 SUPPLICANT_P2PDEVICE,
3327 "GONegotiationSuccess",
3328 _ws_process_go_neg_success
3332 SUPPLICANT_P2PDEVICE,
3333 "GONegotiationFailure",
3334 _ws_process_go_neg_failure
3338 SUPPLICANT_P2PDEVICE,
3339 "GONegotiationRequest",
3340 _ws_process_go_neg_request
3344 SUPPLICANT_P2PDEVICE,
3345 "InvitationReceived",
3346 _ws_process_invitation_received
3350 SUPPLICANT_P2PDEVICE,
3352 _ws_process_invitation_result
3356 SUPPLICANT_P2PDEVICE,
3358 _ws_process_group_finished
3362 SUPPLICANT_P2PDEVICE,
3363 "ServiceDiscoveryResponse",
3364 _ws_process_service_discovery_response
3368 SUPPLICANT_P2PDEVICE,
3369 "ServiceASPResponse",
3370 _ws_process_service_asp_response
3374 SUPPLICANT_P2PDEVICE,
3375 "ASPProvisionStart",
3376 _ws_process_asp_provision_start
3380 SUPPLICANT_P2PDEVICE,
3382 _ws_process_asp_provision_done
3386 SUPPLICANT_P2PDEVICE,
3387 "PersistentGroupAdded",
3388 _ws_process_persistent_group_added
3392 SUPPLICANT_P2PDEVICE,
3393 "PersistentGroupRemoved",
3394 _ws_process_persistent_group_removed
3398 SUPPLICANT_P2PDEVICE,
3400 _ws_process_wps_failed
3404 SUPPLICANT_P2PDEVICE,
3405 "GroupFormationFailure",
3406 _ws_process_group_formation_failure
3410 SUPPLICANT_P2PDEVICE,
3411 "InvitationAccepted",
3412 _ws_process_invitation_accepted
3422 static void _ws_process_sta_authorized(GDBusConnection *connection,
3423 const gchar *sender, const gchar *object_path, const gchar *interface,
3424 const gchar *signal, GVariant *parameters, gpointer user_data)
3426 __WDP_LOG_FUNC_ENTER__;
3427 wfd_oem_event_s event;
3428 const gchar* mac_str = NULL;
3430 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3432 if (!g_pd || !g_pd->callback) {
3433 WDP_LOGD("Ignoring event");
3434 __WDP_LOG_FUNC_EXIT__;
3438 if (is_peer_joined_notified) {
3439 is_peer_joined_notified = 0;
3440 __WDP_LOG_FUNC_EXIT__;
3444 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3445 g_variant_get(parameters, "(&s)", &mac_str);
3446 __ws_txt_to_mac((unsigned char *)mac_str, event.intf_addr);
3448 event.event_id = WFD_OEM_EVENT_STA_CONNECTED;
3449 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
3451 if (g_pd->callback->sta_connected_cb)
3452 g_pd->callback->sta_connected_cb(&event);
3454 __WDP_LOG_FUNC_EXIT__;
3457 static void _ws_process_sta_deauthorized(GDBusConnection *connection,
3458 const gchar *sender, const gchar *object_path, const gchar *interface,
3459 const gchar *signal, GVariant *parameters, gpointer user_data)
3461 __WDP_LOG_FUNC_ENTER__;
3462 wfd_oem_event_s event;
3463 const gchar* mac_str = NULL;
3465 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3467 if (!g_pd || !g_pd->callback) {
3468 WDP_LOGD("Ignoring event");
3469 __WDP_LOG_FUNC_EXIT__;
3473 if (is_peer_disconnected_notified) {
3474 is_peer_disconnected_notified = 0;
3475 __WDP_LOG_FUNC_EXIT__;
3479 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3480 g_variant_get(parameters, "(&s)", &mac_str);
3481 __ws_txt_to_mac((unsigned char *)mac_str, event.intf_addr);
3483 event.event_id = WFD_OEM_EVENT_STA_DISCONNECTED;
3484 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
3486 if (g_pd->callback->sta_disconnected_cb)
3487 g_pd->callback->sta_disconnected_cb(&event);
3489 __WDP_LOG_FUNC_EXIT__;
3494 const char *interface;
3496 void (*function) (GDBusConnection *connection,
3497 const gchar *sender, const gchar *object_path, const gchar *interface,
3498 const gchar *signal, GVariant *parameters, gpointer user_data);
3499 } ws_interface_signal_map[] = {
3504 _ws_process_sta_authorized
3510 _ws_process_sta_deauthorized
3522 const char *interface;
3524 void (*function) (GDBusConnection *connection,
3525 const gchar *sender, const gchar *object_path, const gchar *interface,
3526 const gchar *signal, GVariant *parameters, gpointer user_data);
3527 } ws_group_interface_signal_map[] = {
3532 _ws_process_sta_authorized
3538 _ws_process_sta_deauthorized
3548 static void __register_p2pdevice_signal(GVariant *value, void *user_data)
3550 __WDP_LOG_FUNC_ENTER__;
3551 ws_dbus_plugin_data_s * pd_data;
3552 static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
3553 const char *path = NULL;
3557 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3558 __WDP_LOG_FUNC_EXIT__;
3562 pd_data = (ws_dbus_plugin_data_s *)g_pd;
3564 g_variant_get(value, "(&o)", &path);
3565 g_strlcpy(interface_path, path, DBUS_OBJECT_PATH_MAX);
3566 g_strlcpy(pd_data->iface_path, path, DBUS_OBJECT_PATH_MAX);
3568 WDP_LOGD("interface object path [%s]", interface_path);
3570 /* subscribe Interface iface signal */
3571 for (i = 0; ws_interface_signal_map[i].member != NULL; i++) {
3572 ws_interface_signal_map[i].sub_id =
3573 g_dbus_connection_signal_subscribe(pd_data->g_dbus,
3574 SUPPLICANT_SERVICE, /* bus name */
3575 ws_interface_signal_map[i].interface, /* interface */
3576 ws_interface_signal_map[i].member, /* member */
3577 pd_data->iface_path, /* object path */
3579 G_DBUS_SIGNAL_FLAGS_NONE,
3580 ws_interface_signal_map[i].function,
3582 WDP_LOGD("Subscribed Interface iface signal [%s]", ws_interface_signal_map[i].member);
3585 /* subscribe P2PDevice iface signal */
3586 for (i = 0; ws_p2pdevice_signal_map[i].member != NULL; i++) {
3587 ws_p2pdevice_signal_map[i].sub_id =
3588 g_dbus_connection_signal_subscribe(pd_data->g_dbus,
3589 SUPPLICANT_SERVICE, /* bus name */
3590 ws_p2pdevice_signal_map[i].interface, /* interface */
3591 ws_p2pdevice_signal_map[i].member, /* member */
3592 pd_data->iface_path, /* object path */
3594 G_DBUS_SIGNAL_FLAGS_NONE,
3595 ws_p2pdevice_signal_map[i].function,
3597 WDP_LOGD("Subscribed P2PDevice iface signal [%s]", ws_p2pdevice_signal_map[i].member);
3600 __WDP_LOG_FUNC_EXIT__;
3603 static int _ws_create_interface(const char *iface_name, handle_reply function, void *user_data)
3605 __WDP_LOG_FUNC_ENTER__;
3606 GDBusConnection *g_dbus = NULL;
3607 GVariantBuilder *builder = NULL;
3608 dbus_method_param_s params;
3613 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3614 __WDP_LOG_FUNC_EXIT__;
3618 g_dbus = g_pd->g_dbus;
3620 WDP_LOGE("DBus connection is NULL");
3621 __WDP_LOG_FUNC_EXIT__;
3624 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
3626 dbus_set_method_param(¶ms, "CreateInterface", SUPPLICANT_PATH, g_dbus);
3628 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
3629 g_variant_builder_add(builder, "{sv}", "Ifname", g_variant_new_string(iface_name));
3630 g_variant_builder_add(builder, "{sv}", "ConfigFile", g_variant_new_string(CONF_FILE_PATH));
3631 params.params = g_variant_new("(a{sv})", builder);
3632 g_variant_builder_unref(builder);
3633 res = dbus_method_call(¶ms, SUPPLICANT_INTERFACE, function, user_data);
3635 WDP_LOGE("Failed to send command to wpa_supplicant");
3637 WDP_LOGD("Succeeded to CreateInterface");
3639 __WDP_LOG_FUNC_EXIT__;
3643 static int _ws_get_interface(const char *iface_name, handle_reply function, void *user_data)
3645 __WDP_LOG_FUNC_ENTER__;
3646 GDBusConnection *g_dbus = NULL;
3647 dbus_method_param_s params;
3651 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3652 __WDP_LOG_FUNC_EXIT__;
3656 g_dbus = g_pd->g_dbus;
3658 WDP_LOGE("DBus connection is NULL");
3659 __WDP_LOG_FUNC_EXIT__;
3663 dbus_set_method_param(¶ms, SUPPLICANT_METHOD_GETINTERFACE,
3664 SUPPLICANT_PATH, g_pd->g_dbus);
3666 params.params = g_variant_new("(s)", iface_name);
3667 DEBUG_G_VARIANT("Params : ", params.params);
3669 res = dbus_method_call(¶ms, SUPPLICANT_INTERFACE,
3670 function, user_data);
3673 WDP_LOGE("Failed to send command to wpa_supplicant");
3675 WDP_LOGD("Succeeded to get interface");
3677 __WDP_LOG_FUNC_EXIT__;
3681 static void __ws_remove_interface(GVariant *value, void *user_data)
3683 __WDP_LOG_FUNC_ENTER__;
3684 GDBusConnection *g_dbus = NULL;
3685 dbus_method_param_s params;
3686 const char *path = NULL;
3687 static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
3691 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3695 g_dbus = g_pd->g_dbus;
3697 WDP_LOGE("DBus connection is NULL");
3701 g_variant_get(value, "(&o)", &path);
3702 g_strlcpy(interface_path, path, DBUS_OBJECT_PATH_MAX);
3703 WDP_LOGD("interface object path [%s]", interface_path);
3705 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
3707 dbus_set_method_param(¶ms, "RemoveInterface", SUPPLICANT_PATH, g_dbus);
3708 params.params = g_variant_new("(o)", interface_path);
3710 res = dbus_method_call(¶ms, SUPPLICANT_INTERFACE, NULL, NULL);
3712 WDP_LOGE("Failed to send command to wpa_supplicant");
3714 WDP_LOGD("Succeeded to RemoveInterface");
3716 __WDP_LOG_FUNC_EXIT__;
3720 static int _ws_init_dbus_connection(void)
3722 __WDP_LOG_FUNC_ENTER__;
3723 GDBusConnection *conn = NULL;
3724 GError *error = NULL;
3729 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3730 __WDP_LOG_FUNC_EXIT__;
3735 WDP_LOGE("no configurable data found");
3736 __WDP_LOG_FUNC_EXIT__;
3740 conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
3743 if (error != NULL) {
3744 WDP_LOGE("Error! Failed to connect to the D-BUS daemon: [%s]",
3746 g_error_free(error);
3748 __WDP_LOG_FUNC_EXIT__;
3752 g_pd->g_dbus = conn;
3754 for (i = 0; ws_supplicant_signal_map[i].member != NULL; i++) {
3755 ws_supplicant_signal_map[i].sub_id =
3756 g_dbus_connection_signal_subscribe(g_pd->g_dbus,
3757 SUPPLICANT_SERVICE, /* bus name */
3758 ws_supplicant_signal_map[i].interface, /* interface */
3759 ws_supplicant_signal_map[i].member, /* member */
3760 SUPPLICANT_PATH, /* object path */
3762 G_DBUS_SIGNAL_FLAGS_NONE,
3763 ws_supplicant_signal_map[i].function,
3765 WDP_LOGD("Subscribed supplicant iface signal [%s]", ws_supplicant_signal_map[i].member);
3768 if (g_strcmp0(config->ifname, config->p2p_ifname) != 0) {
3769 if (_ws_get_interface(config->ifname, NULL, NULL) < 0)
3770 res = _ws_create_interface(config->ifname, NULL, NULL);
3771 if (_ws_get_interface(config->p2p_ifname, __register_p2pdevice_signal, NULL) < 0)
3772 res = _ws_create_interface(config->p2p_ifname, __register_p2pdevice_signal, NULL);
3774 if (_ws_get_interface(config->p2p_ifname, __register_p2pdevice_signal, NULL) < 0)
3775 res = _ws_create_interface(config->p2p_ifname, __register_p2pdevice_signal, NULL);
3779 WDP_LOGE("Failed to subscribe interface signal");
3781 WDP_LOGI("Successfully register signal filters");
3783 __WDP_LOG_FUNC_EXIT__;
3787 static int _ws_deinit_dbus_connection(void)
3789 GDBusConnection *g_dbus = NULL;
3793 WDP_LOGE("Invalid parameter");
3794 __WDP_LOG_FUNC_EXIT__;
3798 g_dbus = g_pd->g_dbus;
3800 WDP_LOGE("DBus connection is NULL");
3801 __WDP_LOG_FUNC_EXIT__;
3805 for (i = 0; ws_supplicant_signal_map[i].member != NULL; i++) {
3806 g_dbus_connection_signal_unsubscribe(g_dbus, ws_supplicant_signal_map[i].sub_id);
3807 ws_supplicant_signal_map[i].sub_id = 0;
3810 for (i = 0; ws_interface_signal_map[i].member != NULL; i++) {
3811 g_dbus_connection_signal_unsubscribe(g_dbus, ws_interface_signal_map[i].sub_id);
3812 ws_interface_signal_map[i].sub_id = 0;
3815 for (i = 0; ws_p2pdevice_signal_map[i].member != NULL; i++) {
3816 g_dbus_connection_signal_unsubscribe(g_dbus, ws_p2pdevice_signal_map[i].sub_id);
3817 ws_p2pdevice_signal_map[i].sub_id = 0;
3820 for (i = 0; ws_group_signal_map[i].member != NULL; i++) {
3821 g_dbus_connection_signal_unsubscribe(g_dbus, ws_group_signal_map[i].sub_id);
3822 ws_group_signal_map[i].sub_id = 0;
3825 memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
3826 memset(g_pd->iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
3828 g_object_unref(g_dbus);
3829 g_pd->g_dbus = NULL;
3830 __WDP_LOG_FUNC_EXIT__;
3834 static void _ws_manage_group_iface_signal(const gchar *group_iface_obj_path,
3835 gboolean is_created)
3837 __WDP_LOG_FUNC_ENTER__;
3838 GDBusConnection *connection;
3842 __WDP_LOG_FUNC_EXIT__;
3846 if (!g_strcmp0(g_pd->iface_path, group_iface_obj_path)) {
3847 WDP_LOGD("group iface is p2p iface, ignore");
3848 __WDP_LOG_FUNC_EXIT__;
3852 connection = g_pd->g_dbus;
3855 /* subscribe Interface iface signal */
3856 for (i = 0; ws_group_interface_signal_map[i].member != NULL; i++) {
3857 ws_group_interface_signal_map[i].sub_id =
3858 g_dbus_connection_signal_subscribe(connection,
3859 SUPPLICANT_SERVICE, /* bus name */
3860 ws_group_interface_signal_map[i].interface, /* interface */
3861 ws_group_interface_signal_map[i].member, /* member */
3862 group_iface_obj_path, /* object path */
3864 G_DBUS_SIGNAL_FLAGS_NONE,
3865 ws_group_interface_signal_map[i].function,
3867 WDP_LOGD("Subscribed Interface iface signal [%s]", ws_group_interface_signal_map[i].member);
3871 for (i = 0; ws_group_interface_signal_map[i].member != NULL; i++) {
3872 g_dbus_connection_signal_unsubscribe(connection, ws_group_interface_signal_map[i].sub_id);
3873 ws_group_interface_signal_map[i].sub_id = 0;
3876 __WDP_LOG_FUNC_EXIT__;
3880 int wfd_plugin_load(wfd_oem_ops_s **ops)
3882 __WDP_LOG_FUNC_ENTER__;
3884 WDP_LOGE("Invalid parameter");
3885 __WDP_LOG_FUNC_EXIT__;
3889 *ops = &supplicant_ops;
3891 __WDP_LOG_FUNC_EXIT__;
3895 static int _ws_reset_plugin(ws_dbus_plugin_data_s *f_pd)
3897 __WDP_LOG_FUNC_ENTER__;
3900 WDP_LOGE("Invalid parameter");
3901 __WDP_LOG_FUNC_EXIT__;
3905 _ws_deinit_dbus_connection();
3907 if (f_pd->activated)
3908 ws_deactivate(f_pd->concurrent);
3912 __WDP_LOG_FUNC_EXIT__;
3916 static int __ws_check_net_interface(char* if_name)
3921 if (if_name == NULL) {
3922 WDP_LOGE("Invalid param");
3926 fd = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
3928 WDP_LOGE("socket create error: %d", fd);
3932 memset(&ifr, 0, sizeof(ifr));
3933 g_strlcpy(ifr.ifr_name, if_name, IFNAMSIZ);
3935 if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) {
3937 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
3938 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
3939 WDP_LOGE("ioctl error: SIOCGIFFLAGS: %s [ %s ]", error_buf, if_name); /* interface is not found. */
3945 if (ifr.ifr_flags & IFF_UP) {
3946 WDP_LOGD("%s interface is up", if_name);
3948 } else if (!(ifr.ifr_flags & IFF_UP)) {
3949 WDP_LOGD("%s interface is down", if_name);
3955 int ws_configure(wfd_oem_config_s *conf)
3957 __WDP_LOG_FUNC_ENTER__;
3960 __WDP_LOG_FUNC_EXIT__;
3967 config = (wfd_oem_config_s *) g_try_malloc0(sizeof(wfd_oem_config_s));
3969 __WDP_LOG_FUNC_EXIT__;
3973 memcpy(config, conf, sizeof(wfd_oem_config_s));
3975 __WDP_LOG_FUNC_EXIT__;
3979 int ws_init(wfd_oem_event_cbs_s *event_cbs)
3981 __WDP_LOG_FUNC_ENTER__;
3983 if (event_cbs == NULL) {
3984 __WDP_LOG_FUNC_EXIT__;
3989 _ws_reset_plugin(g_pd);
3992 g_pd = (ws_dbus_plugin_data_s*) g_try_malloc0(sizeof(ws_dbus_plugin_data_s));
3994 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
3995 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
3996 WDP_LOGE("Failed to allocate memory for plugin data. [%s]", error_buf);
4000 g_pd->callback = event_cbs;
4001 g_pd->initialized = TRUE;
4003 __WDP_LOG_FUNC_EXIT__;
4009 __WDP_LOG_FUNC_ENTER__;
4012 _ws_reset_plugin(g_pd);
4019 __WDP_LOG_FUNC_EXIT__;
4023 gboolean _ws_util_execute_file(const char *file_path,
4024 char *const args[], char *const envs[])
4029 register unsigned int index = 0;
4030 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
4032 while (args[index] != NULL) {
4033 WDP_LOGD("[%s]", args[index]);
4037 if (!(pid = fork())) {
4038 WDP_LOGD("pid(%d), ppid(%d)", getpid(), getppid());
4039 WDP_LOGD("Inside child, exec (%s) command", file_path);
4042 if (execve(file_path, args, envs) == -1) {
4043 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
4044 WDP_LOGE("Fail to execute command (%s)", error_buf);
4047 } else if (pid > 0) {
4048 if (waitpid(pid, &rv, 0) == -1)
4049 WDP_LOGD("wait pid (%u) rv (%d)", pid, rv);
4051 WDP_LOGD("exited, rv=%d", WEXITSTATUS(rv));
4052 else if (WIFSIGNALED(rv))
4053 WDP_LOGD("killed by signal %d", WTERMSIG(rv));
4054 else if (WIFSTOPPED(rv))
4055 WDP_LOGD("stopped by signal %d", WSTOPSIG(rv));
4056 else if (WIFCONTINUED(rv))
4057 WDP_LOGD("continued");
4062 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
4063 WDP_LOGE("failed to fork (%s)", error_buf);
4067 static int __ws_p2p_firmware_start(const char *interface_name)
4069 GError *error = NULL;
4070 GDBusConnection *conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
4072 WDP_LOGE("Failed to get system bus");
4077 GVariant *params = g_variant_new("(sb)", interface_name, FALSE);
4078 GVariant *reply = g_dbus_connection_call_sync(
4080 NETCONFIG_SERVICE, /* bus name */
4081 NETCONFIG_WIFI_PATH, /* object path */
4082 NETCONFIG_WIFI_INTERFACE, /* interface name */
4083 "LoadDriver", /* method name */
4084 params, /* GVariant *params */
4085 NULL, /* reply_type */
4086 G_DBUS_CALL_FLAGS_NONE, /* flags */
4087 SUPPLICANT_TIMEOUT , /* timeout */
4088 NULL, /* cancellable */
4089 &error); /* error */
4091 if (error != NULL) {
4092 WDP_LOGE("Error! Failed to call method: [%s]", error->message);
4093 g_error_free(error);
4094 __WDP_LOG_FUNC_EXIT__;
4098 g_variant_unref(reply);
4099 g_object_unref(conn);
4104 static int __ws_p2p_firmware_stop(const char *interface_name)
4108 rv = hal_wifi_get_backend();
4110 WDP_LOGD("hal_wifi_get_backend() failed, ret: %d", rv);
4114 rv = hal_wifi_stop(interface_name);
4116 WDP_LOGD("hal_wifi_stop() failed, ret: %d", rv);
4120 WDP_LOGI("Successfully removed p2p device driver");
4124 static int __ws_p2p_supplicant_start(void)
4126 gboolean rv = FALSE;
4127 const char *path = "/usr/sbin/p2p_supp.sh";
4128 char *const args[] = { "/usr/sbin/p2p_supp.sh", "start_dbus", NULL };
4129 char *const envs[] = { NULL };
4131 rv = _ws_util_execute_file(path, args, envs);
4134 WDP_LOGE("Failed to start p2p_supp.sh");
4138 WDP_LOGI("Successfully started p2p_supp.sh");
4143 static int __ws_p2p_supplicant_stop(void)
4145 gboolean rv = FALSE;
4146 const char *path = "/usr/sbin/p2p_supp.sh";
4147 char *const args[] = { "/usr/sbin/p2p_supp.sh", "stop", NULL };
4148 char *const envs[] = { NULL };
4150 rv = _ws_util_execute_file(path, args, envs);
4153 WDP_LOGE("Failed to stop p2p_supp.sh");
4157 WDP_LOGI("Successfully stopped p2p_supp.sh");
4161 static int __ws_p2p_on(void)
4164 DBusMessage *reply = NULL;
4165 DBusMessage *message = NULL;
4166 DBusConnection *connection = NULL;
4168 connection = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
4169 if (connection == NULL) {
4170 WDP_LOGE("Failed to get system bus");
4174 message = dbus_message_new_method_call(NETCONFIG_SERVICE,
4175 NETCONFIG_WIFI_PATH, NETCONFIG_WIFI_INTERFACE, "LoadP2pDriver");
4176 if (message == NULL) {
4177 WDP_LOGE("Failed DBus method call");
4178 dbus_connection_unref(connection);
4182 dbus_error_init(&error);
4184 reply = dbus_connection_send_with_reply_and_block(connection, message,
4185 NETCONFIG_DBUS_REPLY_TIMEOUT, &error);
4186 if (dbus_error_is_set(&error) == TRUE) {
4187 if (NULL != strstr(error.message, ".AlreadyExists")) {
4188 /* p2p already enabled */
4190 WDP_LOGE("dbus_connection_send_with_reply_and_block() failed. "
4191 "DBus error [%s: %s]", error.name, error.message);
4193 dbus_error_free(&error);
4196 dbus_error_free(&error);
4200 dbus_message_unref(reply);
4202 dbus_message_unref(message);
4203 dbus_connection_unref(connection);
4208 static int __ws_p2p_off(void)
4211 DBusMessage *reply = NULL;
4212 DBusMessage *message = NULL;
4213 DBusConnection *connection = NULL;
4215 connection = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
4216 if (connection == NULL) {
4217 WDP_LOGE("Failed to get system bus");
4221 message = dbus_message_new_method_call(NETCONFIG_SERVICE,
4222 NETCONFIG_WIFI_PATH, NETCONFIG_WIFI_INTERFACE, "RemoveP2pDriver");
4223 if (message == NULL) {
4224 WDP_LOGE("Failed DBus method call");
4225 dbus_connection_unref(connection);
4229 dbus_error_init(&error);
4231 reply = dbus_connection_send_with_reply_and_block(connection, message,
4232 NETCONFIG_DBUS_REPLY_TIMEOUT, &error);
4233 if (dbus_error_is_set(&error) == TRUE) {
4234 if (NULL != strstr(error.message, ".AlreadyExists")) {
4235 /* p2p already disabled */
4237 WDP_LOGE("dbus_connection_send_with_reply_and_block() failed. "
4238 "DBus error [%s: %s]", error.name, error.message);
4240 dbus_error_free(&error);
4243 dbus_error_free(&error);
4247 dbus_message_unref(reply);
4249 dbus_message_unref(message);
4250 dbus_connection_unref(connection);
4256 int __ws_init_p2pdevice(void)
4258 __WDP_LOG_FUNC_ENTER__;
4259 GDBusConnection *g_dbus = NULL;
4261 GVariant *value = NULL;
4262 GVariant *param = NULL;
4263 GVariantBuilder *builder = NULL;
4264 GVariantBuilder *type_builder = NULL;
4265 dbus_method_param_s params;
4267 unsigned char primary_device_type[8] = {
4268 0x00, 0x00, 0x00, 0x50,
4269 0xf2, 0x04, 0x00, 0x00
4276 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4277 __WDP_LOG_FUNC_EXIT__;
4282 WDP_LOGE("no configurable data found");
4283 __WDP_LOG_FUNC_EXIT__;
4287 primary_device_type[1] = config->pri_dev_type;
4288 primary_device_type[7] = config->sec_dev_type;
4290 for (i = 0; i < WS_DEVTYPE_LEN; i++)
4291 WDP_LOGD("device type[%02x]", primary_device_type[i]);
4293 g_dbus = g_pd->g_dbus;
4295 WDP_LOGE("DBus connection is NULL");
4296 __WDP_LOG_FUNC_EXIT__;
4299 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4301 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
4304 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4305 g_variant_builder_add(builder, "{sv}", "DeviceName",
4306 g_variant_new_string(config->device_name));
4308 g_variant_builder_add(builder, "{sv}", "GOIntent",
4309 g_variant_new_uint32(config->go_intent));
4311 g_variant_builder_add(builder, "{sv}", "PersistentReconnect",
4312 g_variant_new_boolean(config->persistent_reconnect));
4314 g_variant_builder_add(builder, "{sv}", "ListenRegClass",
4315 g_variant_new_uint32(config->listen_reg_class));
4317 g_variant_builder_add(builder, "{sv}", "ListenChannel",
4318 g_variant_new_uint32(config->listen_channel));
4320 g_variant_builder_add(builder, "{sv}", "OperRegClass",
4321 g_variant_new_uint32(config->operating_reg_class));
4323 g_variant_builder_add(builder, "{sv}", "OperChannel",
4324 g_variant_new_uint32(config->operating_channel));
4326 g_variant_builder_add(builder, "{sv}", "SsidPostfix",
4327 g_variant_new_string(config->device_name));
4329 g_variant_builder_add(builder, "{sv}", "NoGroupIface",
4330 g_variant_new_boolean(config->no_group_iface));
4332 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
4333 for (i = 0; i < WS_DEVTYPE_LEN; i++)
4334 g_variant_builder_add(type_builder, "y", primary_device_type[i]);
4335 g_variant_builder_add(builder, "{sv}", "PrimaryDeviceType",
4336 g_variant_new("ay", type_builder));
4337 g_variant_builder_unref(type_builder);
4338 value = g_variant_new("a{sv}", builder);
4339 g_variant_builder_unref(builder);
4341 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
4343 params.params = param;
4344 DEBUG_G_VARIANT("Params : ", params.params);
4346 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
4348 WDP_LOGE("Failed to send command to wpa_supplicant");
4350 WDP_LOGD("Succeeded to initialize p2pdevice");
4351 __WDP_LOG_FUNC_EXIT__;
4355 int __ws_set_config_methods(void)
4357 __WDP_LOG_FUNC_ENTER__;
4358 GDBusConnection *g_dbus = NULL;
4360 GVariant *value = NULL;
4361 GVariant *param = NULL;
4363 dbus_method_param_s params;
4367 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4368 __WDP_LOG_FUNC_EXIT__;
4373 WDP_LOGE("no configurable data found");
4374 __WDP_LOG_FUNC_EXIT__;
4378 g_dbus = g_pd->g_dbus;
4380 WDP_LOGE("DBus connection is NULL");
4381 __WDP_LOG_FUNC_EXIT__;
4384 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4386 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
4389 value = g_variant_new_string(config->config_methods);
4391 param = g_variant_new("(ssv)", SUPPLICANT_WPS, "ConfigMethods", value);
4392 params.params = param;
4394 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
4396 WDP_LOGE("Failed to send command to wpa_supplicant");
4398 WDP_LOGD("Succeeded to set config method(%s)", config->config_methods);
4400 __WDP_LOG_FUNC_EXIT__;
4404 int ws_activate(int concurrent)
4406 __WDP_LOG_FUNC_ENTER__;
4408 int retry_count = 0;
4411 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4412 __WDP_LOG_FUNC_EXIT__;
4417 WDP_LOGE("no configurable data found");
4418 __WDP_LOG_FUNC_EXIT__;
4422 res = __ws_p2p_supplicant_start();
4424 res = __ws_p2p_supplicant_stop();
4425 WDP_LOGI("P2P supplicant stopped with error %d", res);
4426 __WDP_LOG_FUNC_EXIT__;
4430 while (retry_count < WS_CONN_RETRY_COUNT) {
4431 /* load wlan driver */
4432 if (concurrent == 0)
4433 res = __ws_p2p_firmware_start(config->ifname);
4435 WDP_LOGE("Failed to load driver [ret=%d]", res);
4438 WDP_LOGI("P2P firmware started with error %d", res);
4440 if (__ws_check_net_interface(config->ifname) < 0) {
4441 usleep(150000); /* wait for 150ms */
4444 WDP_LOGE("interface is not up: retry, %d", retry_count);
4450 if (retry_count >= WS_CONN_RETRY_COUNT) {
4451 WDP_LOGE("Driver loading is failed [%d]", res);
4452 __WDP_LOG_FUNC_EXIT__;
4455 if (retry_count > 0) {
4456 /* Give driver marginal time to config net */
4457 WDP_LOGE("Driver loading is done. Wait marginal time for driver");
4461 g_pd->concurrent = concurrent;
4463 res = _ws_init_dbus_connection();
4465 _ws_deinit_dbus_connection();
4466 res = __ws_p2p_supplicant_stop();
4467 WDP_LOGI("[/usr/sbin/p2p_supp.sh stop] returns %d", res);
4468 res = __ws_p2p_firmware_stop(config->ifname);
4469 WDP_LOGI("P2P firmware stopped with error %d", res);
4470 __WDP_LOG_FUNC_EXIT__;
4474 g_pd->activated = TRUE;
4475 __ws_init_p2pdevice();
4476 __ws_set_config_methods();
4479 __WDP_LOG_FUNC_EXIT__;
4483 int ws_deactivate(int concurrent)
4485 __WDP_LOG_FUNC_ENTER__;
4486 wfd_oem_asp_service_s *data = NULL;
4490 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4491 __WDP_LOG_FUNC_EXIT__;
4496 WDP_LOGE("no configurable data found");
4497 __WDP_LOG_FUNC_EXIT__;
4501 if (!g_pd->activated) {
4502 WDP_LOGE("Wi-Fi Direct is not activated");
4503 __WDP_LOG_FUNC_EXIT__;
4509 g_pd->concurrent = concurrent;
4511 if (g_strcmp0(config->ifname, config->group_ifname) != 0)
4512 _ws_get_interface(config->group_ifname, __ws_remove_interface, NULL);
4513 if (concurrent == 0)
4514 _ws_get_interface(config->ifname, __ws_remove_interface, NULL);
4516 _ws_deinit_dbus_connection();
4518 if (concurrent == 0) {
4519 res = __ws_p2p_supplicant_stop();
4520 WDP_LOGI("[/usr/sbin/p2p_supp.sh stop] returns %d", res);
4521 res = __ws_p2p_firmware_stop(config->ifname);
4522 WDP_LOGI("P2P firmware stopped with error %d", res);
4524 g_pd->activated = FALSE;
4526 GLIST_ITER_START(seek_list, data)
4529 temp = g_list_next(seek_list);
4530 seek_list = g_list_remove(seek_list, data);
4531 g_free(data->service_type);
4532 g_free(data->service_info);
4537 __WDP_LOG_FUNC_EXIT__;
4542 static gboolean _retry_start_scan(gpointer data)
4544 __WDP_LOG_FUNC_ENTER__;
4546 WDP_LOGD("Succeeded to start scan");
4548 __WDP_LOG_FUNC_EXIT__;
4553 static void __ws_add_seek_params(GVariantBuilder *builder)
4555 GVariantBuilder *outter = NULL;
4556 GVariantBuilder *inner = NULL;
4557 wfd_oem_asp_service_s *data = NULL;
4561 if (seek_list == NULL || g_list_length(seek_list) == 0) {
4562 WDP_LOGD("seek list is NULL");
4565 WDP_LOGD("seek list length [%d]", g_list_length(seek_list));
4567 outter = g_variant_builder_new(G_VARIANT_TYPE("aay"));
4569 GLIST_ITER_START(seek_list, data)
4570 if (data && data->service_type) {
4571 len = strlen(data->service_type) + 1;
4572 WDP_LOGD("data [%s] len [%d]", data->service_type, len);
4573 inner = g_variant_builder_new(G_VARIANT_TYPE("ay"));
4574 for (i = 0; i < len; i++)
4575 g_variant_builder_add(inner, "y", data->service_type[i]);
4576 g_variant_builder_add(outter, "ay", inner);
4577 g_variant_builder_unref(inner);
4580 g_variant_builder_add(builder, "{sv}", "Seek", g_variant_new("aay", outter));
4581 g_variant_builder_unref(outter);
4586 int ws_start_scan(wfd_oem_scan_param_s *param)
4588 __WDP_LOG_FUNC_ENTER__;
4589 GDBusConnection *g_dbus = NULL;
4590 GVariantBuilder *builder = NULL;
4591 GVariant *value = NULL;
4592 dbus_method_param_s params;
4596 WDP_LOGE("Invalid parameter");
4597 __WDP_LOG_FUNC_EXIT__;
4602 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4603 __WDP_LOG_FUNC_EXIT__;
4607 g_dbus = g_pd->g_dbus;
4609 WDP_LOGE("DBus connection is NULL");
4610 __WDP_LOG_FUNC_EXIT__;
4613 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4615 if (param->scan_mode == WFD_OEM_SCAN_MODE_ACTIVE) {
4617 dbus_set_method_param(¶ms, "Find", g_pd->iface_path, g_dbus);
4619 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4621 if (param->scan_time)
4622 g_variant_builder_add(builder, "{sv}", "Timeout",
4623 g_variant_new_int32(param->scan_time));
4624 if (param->scan_type == WFD_OEM_SCAN_TYPE_SOCIAL)
4625 g_variant_builder_add(builder, "{sv}", "DiscoveryType",
4626 g_variant_new_string("social"));
4627 if (seek_list != NULL)
4628 __ws_add_seek_params(builder);
4630 value = g_variant_new("(a{sv})", builder);
4631 g_variant_builder_unref(builder);
4634 dbus_set_method_param(¶ms, "Listen", g_pd->iface_path, g_dbus);
4635 value = g_variant_new("(i)", param->scan_time);
4638 params.params = value;
4639 DEBUG_G_VARIANT("Params : ", params.params);
4641 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4643 WDP_LOGE("Failed to send command to wpa_supplicant");
4645 WDP_LOGD("Succeeded to start scan");
4647 __WDP_LOG_FUNC_EXIT__;
4651 int ws_restart_scan(int freq)
4653 __WDP_LOG_FUNC_ENTER__;
4654 GDBusConnection *g_dbus = NULL;
4655 GVariantBuilder *builder = NULL;
4656 GVariant *value = NULL;
4657 dbus_method_param_s params;
4661 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4662 __WDP_LOG_FUNC_EXIT__;
4666 g_dbus = g_pd->g_dbus;
4668 WDP_LOGE("DBus connection is NULL");
4669 __WDP_LOG_FUNC_EXIT__;
4672 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4674 dbus_set_method_param(¶ms, "Find", g_pd->iface_path, g_dbus);
4676 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4677 g_variant_builder_add(builder, "{sv}", "Timeout", g_variant_new_int32(2));
4678 g_variant_builder_add(builder, "{sv}", "DiscoveryType",
4679 g_variant_new_string("social"));
4680 value = g_variant_new("(a{sv})", builder);
4681 g_variant_builder_unref(builder);
4683 params.params = value;
4684 DEBUG_G_VARIANT("Params : ", params.params);
4686 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4688 WDP_LOGE("Failed to send command to wpa_supplicant");
4690 WDP_LOGD("Succeeded to start scan");
4692 __WDP_LOG_FUNC_EXIT__;
4696 int ws_stop_scan(void)
4698 __WDP_LOG_FUNC_ENTER__;
4699 GDBusConnection *g_dbus = NULL;
4700 dbus_method_param_s params;
4704 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4705 __WDP_LOG_FUNC_EXIT__;
4709 g_dbus = g_pd->g_dbus;
4711 WDP_LOGE("DBus connection is NULL");
4712 __WDP_LOG_FUNC_EXIT__;
4715 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4717 dbus_set_method_param(¶ms, "StopFind", g_pd->iface_path, g_dbus);
4718 params.params = NULL;
4720 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4722 WDP_LOGE("Failed to send command to wpa_supplicant");
4724 WDP_LOGD("Succeeded to stop scan");
4726 __WDP_LOG_FUNC_EXIT__;
4730 int ws_get_visibility(int *visibility)
4732 __WDP_LOG_FUNC_ENTER__;
4734 __WDP_LOG_FUNC_EXIT__;
4738 int ws_set_visibility(int visibility)
4740 __WDP_LOG_FUNC_ENTER__;
4742 __WDP_LOG_FUNC_EXIT__;
4746 int ws_get_scan_result(GList **peers, int *peer_count)
4748 __WDP_LOG_FUNC_ENTER__;
4750 __WDP_LOG_FUNC_EXIT__;
4753 static wfd_oem_device_s *__create_oem_device(void)
4755 wfd_oem_device_s *device =
4756 (wfd_oem_device_s *) g_try_malloc0(sizeof(wfd_oem_device_s));
4758 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
4759 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
4760 WDP_LOGF("Failed to allocate memory for event. [%s]",
4767 int ws_get_peer_info(unsigned char *peer_addr, wfd_oem_device_s **peer)
4769 __WDP_LOG_FUNC_ENTER__;
4770 GDBusConnection *g_dbus = NULL;
4771 wfd_oem_device_s *device = NULL;
4772 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
4775 if (!peer_addr || !peer) {
4776 WDP_LOGE("Invalid parameter");
4777 __WDP_LOG_FUNC_EXIT__;
4782 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4783 __WDP_LOG_FUNC_EXIT__;
4787 g_dbus = g_pd->g_dbus;
4789 WDP_LOGE("DBus connection is NULL");
4790 __WDP_LOG_FUNC_EXIT__;
4794 device = __create_oem_device();
4796 __WDP_LOG_FUNC_EXIT__;
4800 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4801 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4803 WDP_LOGD("get peer path [%s]", peer_path);
4805 res = dbus_property_get_all(peer_path, g_dbus, SUPPLICANT_P2P_PEER,
4806 __ws_get_peer_property, device);
4809 WDP_LOGE("Failed to send command to wpa_supplicant");
4811 g_free(device->vsie);
4813 __WDP_LOG_FUNC_EXIT__;
4816 WDP_LOGD("succeeded to get peer info");
4820 //Memory ownership of dev_data is transferred to method handler
4821 //which uses this function.
4823 __WDP_LOG_FUNC_EXIT__;
4827 int ws_prov_disc_req(unsigned char *peer_addr, wfd_oem_wps_mode_e wps_mode, int join)
4829 __WDP_LOG_FUNC_ENTER__;
4830 GDBusConnection *g_dbus = NULL;
4831 GVariant *value = NULL;
4832 dbus_method_param_s params;
4833 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
4837 WDP_LOGE("Invalid parameter");
4838 __WDP_LOG_FUNC_EXIT__;
4843 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4844 __WDP_LOG_FUNC_EXIT__;
4848 g_dbus = g_pd->g_dbus;
4850 WDP_LOGE("DBus connection is NULL");
4851 __WDP_LOG_FUNC_EXIT__;
4854 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4856 dbus_set_method_param(¶ms, "ProvisionDiscoveryRequest", g_pd->iface_path, g_dbus);
4858 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4859 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4860 WDP_LOGD("get peer path [%s]", peer_path);
4862 value = g_variant_new("(os)", peer_path, __ws_wps_to_txt(wps_mode));
4864 params.params = value;
4865 DEBUG_G_VARIANT("Params : ", params.params);
4867 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4869 WDP_LOGE("Failed to send command to wpa_supplicant");
4871 WDP_LOGD("Succeeded to send prov disc to peer[" MACSTR "]", MAC2STR(peer_addr));
4873 __WDP_LOG_FUNC_EXIT__;
4877 int ws_connect(unsigned char *peer_addr, wfd_oem_conn_param_s *param)
4879 __WDP_LOG_FUNC_ENTER__;
4880 GDBusConnection *g_dbus = NULL;
4881 GVariantBuilder *builder = NULL;
4882 GVariant *value = NULL;
4883 dbus_method_param_s params;
4884 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
4887 if (!peer_addr || !param) {
4888 WDP_LOGE("Invalid parameter");
4889 __WDP_LOG_FUNC_EXIT__;
4894 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4895 __WDP_LOG_FUNC_EXIT__;
4899 g_dbus = g_pd->g_dbus;
4901 WDP_LOGE("DBus connection is NULL");
4902 __WDP_LOG_FUNC_EXIT__;
4905 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4907 dbus_set_method_param(¶ms, "Connect", g_pd->iface_path, g_dbus);
4909 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4910 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4911 WDP_LOGD("get peer path [%s]", peer_path);
4913 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4914 g_variant_builder_add(builder, "{sv}", "peer", g_variant_new_object_path(peer_path));
4915 if (param->conn_flags & WFD_OEM_CONN_TYPE_PERSISTENT)
4916 g_variant_builder_add(builder, "{sv}", "persistent", g_variant_new_boolean(TRUE));
4918 if (param->conn_flags & WFD_OEM_CONN_TYPE_JOIN)
4919 g_variant_builder_add(builder, "{sv}", "join", g_variant_new_boolean(TRUE));
4921 if (param->conn_flags & WFD_OEM_CONN_TYPE_AUTH)
4922 g_variant_builder_add(builder, "{sv}", "autorize_only", g_variant_new_boolean(TRUE));
4924 if (param->wps_pin[0] != '\0')
4925 g_variant_builder_add(builder, "{sv}", "pin", g_variant_new_string(param->wps_pin));
4927 g_variant_builder_add(builder, "{sv}", "wps_method",
4928 g_variant_new_string(__ws_wps_to_txt(param->wps_mode)));
4930 value = g_variant_new("(a{sv})", builder);
4931 g_variant_builder_unref(builder);
4933 params.params = value;
4934 DEBUG_G_VARIANT("Params : ", params.params);
4936 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4938 WDP_LOGE("Failed to send command to wpa_supplicant");
4940 WDP_LOGD("Succeeded to send connection command to peer[" MACSTR "]", MAC2STR(peer_addr));
4942 __WDP_LOG_FUNC_EXIT__;
4946 int ws_disconnect(unsigned char *peer_addr, int is_iface_addr)
4948 __WDP_LOG_FUNC_ENTER__;
4949 GDBusConnection *g_dbus = NULL;
4950 GVariant *value = NULL;
4951 dbus_method_param_s params;
4952 GVariantBuilder *builder = NULL;
4956 WDP_LOGE("Invalid parameter");
4957 __WDP_LOG_FUNC_EXIT__;
4962 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4963 __WDP_LOG_FUNC_EXIT__;
4967 g_dbus = g_pd->g_dbus;
4969 WDP_LOGE("DBus connection is NULL");
4970 __WDP_LOG_FUNC_EXIT__;
4973 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4975 dbus_set_method_param(¶ms, "RemoveClient", g_pd->iface_path, g_dbus);
4976 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4978 if (is_iface_addr) {
4979 char peer_mac_str[WS_MACSTR_LEN] = {'\0', };
4981 g_snprintf(peer_mac_str, WS_MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
4982 WDP_LOGI("peer addr [%s]", peer_mac_str);
4983 g_variant_builder_add(builder, "{sv}", "iface",
4984 g_variant_new_string(peer_mac_str));
4986 char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0', };
4988 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4989 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4990 g_variant_builder_add(builder, "{sv}", "peer",
4991 g_variant_new_object_path(peer_path));
4994 value = g_variant_new("(a{sv})", builder);
4995 g_variant_builder_unref(builder);
4997 params.params = value;
4998 DEBUG_G_VARIANT("Params : ", params.params);
5000 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
5002 WDP_LOGE("Failed to send command to wpa_supplicant");
5004 WDP_LOGD("Succeeded to send disconnection command to peer[" MACSECSTR "]",
5005 MAC2SECSTR(peer_addr));
5007 __WDP_LOG_FUNC_EXIT__;
5011 int ws_reject_connection(unsigned char *peer_addr)
5013 __WDP_LOG_FUNC_ENTER__;
5014 GDBusConnection *g_dbus = NULL;
5015 GVariant *value = NULL;
5016 dbus_method_param_s params;
5017 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
5021 WDP_LOGE("Invalid parameter");
5022 __WDP_LOG_FUNC_EXIT__;
5027 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5028 __WDP_LOG_FUNC_EXIT__;
5032 g_dbus = g_pd->g_dbus;
5034 WDP_LOGE("DBus connection is NULL");
5035 __WDP_LOG_FUNC_EXIT__;
5038 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5040 dbus_set_method_param(¶ms, "RejectPeer", g_pd->iface_path, g_dbus);
5042 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
5043 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
5044 WDP_LOGE("get peer path [%s]", peer_path);
5046 value = g_variant_new("(o)", peer_path);
5048 params.params = value;
5049 DEBUG_G_VARIANT("Params : ", params.params);
5051 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
5053 WDP_LOGE("Failed to send command to wpa_supplicant");
5055 WDP_LOGD("Succeeded to reject peer[" MACSTR "]", MAC2STR(peer_addr));
5058 __WDP_LOG_FUNC_EXIT__;
5062 int ws_cancel_connection(unsigned char *peer_addr)
5064 __WDP_LOG_FUNC_ENTER__;
5068 __WDP_LOG_FUNC_EXIT__;
5072 int ws_get_connected_peers(GList **peers, int *peer_count)
5074 __WDP_LOG_FUNC_ENTER__;
5076 __WDP_LOG_FUNC_EXIT__;
5080 int ws_get_pin(char *pin)
5082 __WDP_LOG_FUNC_ENTER__;
5084 __WDP_LOG_FUNC_EXIT__;
5088 int ws_set_pin(char *pin)
5090 __WDP_LOG_FUNC_ENTER__;
5092 __WDP_LOG_FUNC_EXIT__;
5096 static void __ws_get_pin(GVariant *value, void *user_data)
5098 __WDP_LOG_FUNC_ENTER__;
5099 const char *pin = NULL;
5101 g_variant_get(value, "(&s)", &pin);
5102 g_strlcpy((char *)user_data, pin, OEM_PINSTR_LEN + 1);
5104 __WDP_LOG_FUNC_EXIT__;
5108 int ws_generate_pin(char **pin)
5110 __WDP_LOG_FUNC_ENTER__;
5111 GDBusConnection *g_dbus = NULL;
5112 dbus_method_param_s params;
5113 char n_pin[9] = {0,};
5117 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5121 g_dbus = g_pd->g_dbus;
5123 WDP_LOGE("DBus connection is NULL");
5126 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5128 dbus_set_method_param(¶ms, "GeneratePin", g_pd->iface_path, g_dbus);
5129 params.params = NULL;
5131 res = dbus_method_call(¶ms, SUPPLICANT_WPS, __ws_get_pin, (void *)n_pin);
5133 WDP_LOGE("Failed to send command to wpa_supplicant");
5135 WDP_LOGD("Succeeded to generate_pin [ %s ]", n_pin);
5137 *pin = strndup(n_pin, OEM_PINSTR_LEN);
5138 __WDP_LOG_FUNC_EXIT__;
5142 int ws_get_supported_wps_mode(int *wps_mode)
5144 __WDP_LOG_FUNC_ENTER__;
5146 WDP_LOGE("Invalid parameter");
5147 __WDP_LOG_FUNC_EXIT__;
5151 *wps_mode = wps_config_method;
5152 __WDP_LOG_FUNC_EXIT__;
5156 int _ws_get_persistent_net_id(int *persistent_network_id, const unsigned char *go_dev_mac)
5158 __WDP_LOG_FUNC_ENTER__;
5159 int persistent_group_count = 0;
5163 wfd_oem_persistent_group_s *plist = NULL;
5165 res = ws_get_persistent_groups(&plist, &persistent_group_count);
5167 WDP_LOGE("failed to get persistent groups");
5168 __WDP_LOG_FUNC_EXIT__;
5172 if (persistent_group_count > WS_MAX_PERSISTENT_COUNT) {
5173 WDP_LOGE("persistent group count greater than max Persistent count");
5174 persistent_group_count = WS_MAX_PERSISTENT_COUNT;
5177 WDP_LOGD("Persistent Group Count=%d", persistent_group_count);
5179 for (counter = 0; counter < persistent_group_count ; counter++) {
5180 if (!memcmp(go_dev_mac, plist[counter].go_mac_address, WS_MACADDR_LEN)) {
5181 *persistent_network_id = plist[counter].network_id;
5184 WDP_LOGD("Invite: Persistent GO[" MACSTR "], GO Addr[" MACSTR "]",
5185 MAC2STR(plist[counter].go_mac_address), MAC2STR(go_dev_mac));
5191 WDP_LOGD("persistent network ID : [%d]", *persistent_network_id);
5193 __WDP_LOG_FUNC_EXIT__;
5197 static void __store_group_iface_path(GVariant* value, void* user_data)
5199 __WDP_LOG_FUNC_ENTER__;
5200 ws_dbus_plugin_data_s * pd_data;
5201 const char *path = NULL;
5204 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5208 pd_data = (ws_dbus_plugin_data_s *) g_pd;
5210 g_variant_get(value, "(&o)", &path);
5211 g_strlcpy(pd_data->group_iface_path, path, DBUS_OBJECT_PATH_MAX);
5213 WDP_LOGD("group object path [%s]", pd_data->group_iface_path);
5214 /* subscribe interface p2p signal */
5217 int ws_create_group(wfd_oem_group_param_s *param)
5219 __WDP_LOG_FUNC_ENTER__;
5220 GDBusConnection *g_dbus = NULL;
5221 GVariantBuilder *builder = NULL;
5222 GVariant *value = NULL;
5223 dbus_method_param_s params;
5224 char persistent_group_obj_path[OBJECT_PATH_MAX] = {0,};
5228 WDP_LOGE("Invalid parameter");
5229 __WDP_LOG_FUNC_EXIT__;
5234 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5235 __WDP_LOG_FUNC_EXIT__;
5239 g_dbus = g_pd->g_dbus;
5241 WDP_LOGE("DBus connection is NULL");
5242 __WDP_LOG_FUNC_EXIT__;
5245 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5247 dbus_set_method_param(¶ms, "GroupAdd", g_pd->iface_path, g_dbus);
5249 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
5251 if (param->persistent > 0) {
5252 unsigned char mac_address[WS_MACADDR_LEN] = {0x00, };
5253 int persistent_group_id = -1;
5255 res = _ws_get_local_dev_mac(mac_address);
5257 WDP_LOGE("failed to get local mac address");
5258 __WDP_LOG_FUNC_EXIT__;
5262 res = _ws_get_persistent_net_id(&persistent_group_id, mac_address);
5264 WDP_LOGE("failed to get persistent group ID");
5265 __WDP_LOG_FUNC_EXIT__;
5269 WDP_LOGD("persistent network ID : [%d]", persistent_group_id);
5271 g_variant_builder_add(builder, "{sv}", "persistent",
5272 g_variant_new_boolean(TRUE));
5273 if (persistent_group_id > -1) {
5274 g_snprintf(persistent_group_obj_path, OBJECT_PATH_MAX,
5275 "%s/" SUPPLICANT_PERSISTENT_GROUPS_PART "/%d",
5276 g_pd->iface_path, persistent_group_id);
5277 g_variant_builder_add(builder, "{sv}", "persistent_group_object",
5278 g_variant_new_object_path(persistent_group_obj_path));
5282 g_variant_builder_add(builder, "{sv}", "persistent",
5283 g_variant_new_boolean(FALSE));
5286 if (param->passphrase && strlen(param->passphrase) > 0)
5287 g_variant_builder_add(builder, "{sv}", "passphrase",
5288 g_variant_new_string(param->passphrase));
5290 if (param->ssid && strlen(param->ssid) > 0)
5291 g_variant_builder_add(builder, "{sv}", "ssid",
5292 g_variant_new_string(param->ssid));
5295 g_variant_builder_add(builder, "{sv}", "frequency",
5296 g_variant_new_int32(param->freq));
5298 value = g_variant_new("(a{sv})", builder);
5299 g_variant_builder_unref(builder);
5301 params.params = value;
5302 DEBUG_G_VARIANT("Params : ", params.params);
5304 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE,
5305 __store_group_iface_path, g_pd);
5307 WDP_LOGE("Failed to send command to wpa_supplicant");
5309 WDP_LOGD("Succeeded to add group");
5311 __WDP_LOG_FUNC_EXIT__;
5315 int ws_destroy_group(const char *ifname)
5317 __WDP_LOG_FUNC_ENTER__;
5318 GDBusConnection *g_dbus = NULL;
5319 dbus_method_param_s params;
5323 WDP_LOGE("Invalid parameter");
5328 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5329 __WDP_LOG_FUNC_EXIT__;
5333 g_dbus = g_pd->g_dbus;
5335 WDP_LOGE("DBus connection is NULL");
5336 __WDP_LOG_FUNC_EXIT__;
5340 if (g_pd->group_iface_path[0] == 0) {
5341 WDP_LOGE("group iface path is NULL");
5345 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5347 dbus_set_method_param(¶ms, "Disconnect", g_pd->group_iface_path, g_dbus);
5348 params.params = NULL;
5350 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
5352 WDP_LOGE("Failed to send command to wpa_supplicant");
5353 __WDP_LOG_FUNC_EXIT__;
5357 WDP_LOGD("Succeeded to remove group");
5360 __WDP_LOG_FUNC_EXIT__;
5364 int ws_invite(unsigned char *peer_addr, wfd_oem_invite_param_s *param)
5366 __WDP_LOG_FUNC_ENTER__;
5367 GDBusConnection *g_dbus = NULL;
5368 GVariantBuilder *builder = NULL;
5369 GVariant *value = NULL;
5370 dbus_method_param_s params;
5371 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
5374 if (!peer_addr || !param) {
5375 WDP_LOGE("Invalid parameter");
5380 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5381 __WDP_LOG_FUNC_EXIT__;
5385 g_dbus = g_pd->g_dbus;
5387 WDP_LOGE("DBus connection is NULL");
5388 __WDP_LOG_FUNC_EXIT__;
5391 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5393 dbus_set_method_param(¶ms, "Invite", g_pd->group_iface_path, g_dbus);
5395 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
5396 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
5397 WDP_LOGE("get peer path [%s]", peer_path);
5399 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
5400 g_variant_builder_add(builder, "{sv}", "peer", g_variant_new_object_path(peer_path));
5401 value = g_variant_new("(a{sv})", builder);
5402 g_variant_builder_unref(builder);
5404 params.params = value;
5405 DEBUG_G_VARIANT("Params : ", params.params);
5407 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
5409 WDP_LOGE("Failed to send command to wpa_supplicant");
5411 WDP_LOGD("Succeeded to invite peer[" MACSTR "]", MAC2STR(peer_addr));
5413 __WDP_LOG_FUNC_EXIT__;
5417 /* Only group owner can use this command */
5418 int ws_wps_start(unsigned char *peer_addr, int wps_mode, const char *pin)
5420 __WDP_LOG_FUNC_ENTER__;
5421 GDBusConnection *g_dbus = NULL;
5422 GVariantBuilder *builder = NULL;
5423 GVariant *value = NULL;
5424 GVariant *dev_addr = NULL;
5425 dbus_method_param_s params;
5430 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5431 __WDP_LOG_FUNC_EXIT__;
5435 g_dbus = g_pd->g_dbus;
5437 WDP_LOGE("DBus connection is NULL");
5438 __WDP_LOG_FUNC_EXIT__;
5442 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5444 dbus_set_method_param(¶ms, "Start", g_pd->group_iface_path, g_dbus);
5446 if (peer_addr != NULL) {
5447 builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
5448 for (i = 0; i < WS_MACADDR_LEN; i++)
5449 g_variant_builder_add(builder, "y", peer_addr[i]);
5451 dev_addr = g_variant_new("ay", builder);
5452 g_variant_builder_unref(builder);
5455 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
5456 g_variant_builder_add(builder, "{sv}", "Role", g_variant_new_string("enrollee"));
5457 if (peer_addr != NULL)
5458 g_variant_builder_add(builder, "{sv}", "P2PDeviceAddress", dev_addr);
5460 if (pin != NULL && pin[0] != '\0') {
5461 g_variant_builder_add(builder, "{sv}", "Type", g_variant_new_string("pin"));
5462 g_variant_builder_add(builder, "{sv}", "Pin", g_variant_new_string(pin));
5464 g_variant_builder_add(builder, "{sv}", "Type", g_variant_new_string("pbc"));
5467 value = g_variant_new("(a{sv})", builder);
5468 g_variant_builder_unref(builder);
5470 params.params = value;
5471 DEBUG_G_VARIANT("Params : ", params.params);
5473 res = dbus_method_call(¶ms, SUPPLICANT_WPS, NULL, NULL);
5475 WDP_LOGE("Failed to send command to wpa_supplicant");
5477 WDP_LOGD("Succeeded to run wps");
5479 __WDP_LOG_FUNC_EXIT__;
5483 int ws_enrollee_start(unsigned char *peer_addr, int wps_mode, const char *pin)
5485 __WDP_LOG_FUNC_ENTER__;
5487 WDP_LOGD("Succeeded to start WPS");
5489 __WDP_LOG_FUNC_EXIT__;
5493 int ws_wps_cancel(void)
5495 __WDP_LOG_FUNC_ENTER__;
5496 GDBusConnection *g_dbus = NULL;
5497 dbus_method_param_s params;
5500 g_dbus = g_pd->g_dbus;
5502 WDP_LOGE("DBus connection is NULL");
5503 __WDP_LOG_FUNC_EXIT__;
5506 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5508 dbus_set_method_param(¶ms, "Cancel", g_pd->group_iface_path, g_dbus);
5509 params.params = NULL;
5511 res = dbus_method_call(¶ms, SUPPLICANT_WPS, NULL, NULL);
5513 WDP_LOGE("Failed to send command to wpa_supplicant");
5515 WDP_LOGD("Succeeded to cancel WPS");
5517 __WDP_LOG_FUNC_EXIT__;
5521 int ws_get_dev_name(char *dev_name)
5523 __WDP_LOG_FUNC_ENTER__;
5525 __WDP_LOG_FUNC_EXIT__;
5529 int ws_set_dev_name(char *dev_name)
5531 __WDP_LOG_FUNC_ENTER__;
5532 GDBusConnection *g_dbus = NULL;
5534 GVariant *value = NULL;
5535 GVariant *param = NULL;
5536 GVariantBuilder *builder = NULL;
5537 dbus_method_param_s params;
5541 WDP_LOGE("Invalid parameter");
5542 __WDP_LOG_FUNC_EXIT__;
5547 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5548 __WDP_LOG_FUNC_EXIT__;
5552 g_dbus = g_pd->g_dbus;
5554 WDP_LOGE("DBus connection is NULL");
5555 __WDP_LOG_FUNC_EXIT__;
5558 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5560 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
5563 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
5564 g_variant_builder_add(builder, "{sv}", "DeviceName",
5565 g_variant_new_string(dev_name));
5566 g_variant_builder_add(builder, "{sv}", "SsidPostfix",
5567 g_variant_new_string(dev_name));
5568 value = g_variant_new("a{sv}", builder);
5569 g_variant_builder_unref(builder);
5571 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE,
5572 "P2PDeviceConfig", value);
5574 params.params = param;
5575 DEBUG_G_VARIANT("Params : ", params.params);
5577 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
5579 WDP_LOGE("Failed to send command to wpa_supplicant");
5581 WDP_LOGD("Succeeded to set device name");
5583 __WDP_LOG_FUNC_EXIT__;
5587 int ws_get_dev_mac(char *dev_mac)
5589 __WDP_LOG_FUNC_ENTER__;
5591 __WDP_LOG_FUNC_EXIT__;
5595 int ws_get_dev_type(int *pri_dev_type, int *sec_dev_type)
5597 __WDP_LOG_FUNC_ENTER__;
5599 __WDP_LOG_FUNC_EXIT__;
5603 int ws_set_dev_type(int pri_dev_type, int sec_dev_type)
5605 __WDP_LOG_FUNC_ENTER__;
5607 __WDP_LOG_FUNC_EXIT__;
5611 int ws_get_go_intent(int *go_intent)
5613 __WDP_LOG_FUNC_ENTER__;
5614 GDBusConnection *g_dbus = NULL;
5615 GVariant *param = NULL;
5616 GVariant *reply = NULL;
5617 GError *error = NULL;
5618 GVariantIter *iter = NULL;
5622 WDP_LOGE("Invalid parameter");
5627 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5628 __WDP_LOG_FUNC_EXIT__;
5632 g_dbus = g_pd->g_dbus;
5634 WDP_LOGE("DBus connection is NULL");
5635 __WDP_LOG_FUNC_EXIT__;
5639 param = g_variant_new("(ss)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig");
5640 DEBUG_G_VARIANT("Params : ", param);
5642 reply = g_dbus_connection_call_sync(
5644 SUPPLICANT_SERVICE, /* bus name */
5645 g_pd->iface_path, /* object path */
5646 DBUS_PROPERTIES_INTERFACE, /* interface name */
5647 DBUS_PROPERTIES_METHOD_GET, /* method name */
5648 param, /* GVariant *params */
5649 NULL, /* reply_type */
5650 G_DBUS_CALL_FLAGS_NONE, /* flags */
5651 SUPPLICANT_TIMEOUT , /* timeout */
5652 NULL, /* cancellable */
5653 &error); /* error */
5655 if (error != NULL) {
5656 WDP_LOGE("Error! Failed to get interface State: [%s]",
5658 g_error_free(error);
5660 g_variant_unref(reply);
5661 __WDP_LOG_FUNC_EXIT__;
5665 if (reply != NULL) {
5666 g_variant_get(reply, "(a{sv})", &iter);
5670 GVariant *value = NULL;
5672 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
5673 CHECK_KEY_VALUE(key, value);
5675 if (g_strcmp0(key, "GOIntent") == 0)
5676 g_variant_get(value, "u", go_intent);
5678 g_variant_iter_free(iter);
5680 g_variant_unref(reply);
5682 __WDP_LOG_FUNC_EXIT__;
5686 int ws_set_go_intent(int go_intent)
5688 __WDP_LOG_FUNC_ENTER__;
5689 GDBusConnection *g_dbus = NULL;
5691 GVariant *value = NULL;
5692 GVariant *param = NULL;
5693 GVariantBuilder *builder = NULL;
5694 dbus_method_param_s params;
5698 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5699 __WDP_LOG_FUNC_EXIT__;
5703 g_dbus = g_pd->g_dbus;
5705 WDP_LOGE("DBus connection is NULL");
5706 __WDP_LOG_FUNC_EXIT__;
5709 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5711 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
5714 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
5715 g_variant_builder_add(builder, "{sv}", "GOIntent",
5716 g_variant_new_uint32(go_intent));
5717 value = g_variant_new("a{sv}", builder);
5718 g_variant_builder_unref(builder);
5720 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
5722 params.params = param;
5723 DEBUG_G_VARIANT("Params : ", params.params);
5725 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
5727 WDP_LOGE("Failed to send command to wpa_supplicant");
5729 WDP_LOGE("Succeeded to set go intent");
5730 __WDP_LOG_FUNC_EXIT__;
5734 int ws_set_country(char *ccode)
5736 __WDP_LOG_FUNC_ENTER__;
5737 __WDP_LOG_FUNC_ENTER__;
5738 GDBusConnection *g_dbus = NULL;
5740 GVariant *value = NULL;
5741 GVariant *param = NULL;
5743 dbus_method_param_s params;
5747 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5748 __WDP_LOG_FUNC_EXIT__;
5752 g_dbus = g_pd->g_dbus;
5754 WDP_LOGE("DBus connection is NULL");
5755 __WDP_LOG_FUNC_EXIT__;
5758 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5760 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
5763 value = g_variant_new_string(ccode);
5765 param = g_variant_new("(ssv)", SUPPLICANT_IFACE, "Country", value);
5767 params.params = param;
5768 DEBUG_G_VARIANT("Params : ", params.params);
5770 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
5772 WDP_LOGE("Failed to send command to wpa_supplicant");
5774 WDP_LOGD("Succeeded to set country(%s)", ccode);
5776 __WDP_LOG_FUNC_EXIT__;
5780 void __parsing_networks(const char* key, GVariant* value, void* user_data)
5782 __WDP_LOG_FUNC_ENTER__;
5784 __WDP_LOG_FUNC_EXIT__;
5788 ws_network_info_s *network = (ws_network_info_s *)user_data;
5790 CHECK_KEY_VALUE(key, value);
5792 if (g_strcmp0(key, "ssid") == 0) {
5793 const char *ssid = NULL;
5794 g_variant_get(value, "&s", &ssid);
5795 WDP_LOGD("ssid [%s]", ssid);
5796 g_strlcpy(network->ssid, ssid + 1, WS_SSID_LEN + 1);
5797 network->ssid[strlen(ssid) - 2] = '\0';
5799 } else if (g_strcmp0(key, "bssid") == 0) {
5800 unsigned char *bssid = NULL;
5801 g_variant_get(value, "&s", &bssid);
5802 WDP_LOGD("bssid [%s]", bssid);
5803 __ws_txt_to_mac(bssid, network->bssid);
5805 } else if (g_strcmp0(key, "proto") == 0) {
5806 const char *proto = NULL;
5807 g_variant_get(value, "&s", &proto);
5808 WDP_LOGD("proto [%s]", proto);
5810 if (g_strrstr(proto, WFD_OEM_STR_PROTO_WPA) != NULL)
5811 network->proto |= WFD_OEM_PROTO_WPA;
5812 if (g_strrstr(proto, WFD_OEM_STR_PROTO_RSN) != NULL)
5813 network->proto |= WFD_OEM_PROTO_RSN;
5815 } else if (g_strcmp0(key, "key_mgmt") == 0) {
5816 const char *key_mgmt = NULL;
5817 g_variant_get(value, "&s", &key_mgmt);
5818 WDP_LOGD("key_mgmt [%s]", key_mgmt);
5820 if (g_strrstr(key_mgmt, WFD_OEM_STR_KEY_MGMT_IEEE8021X) != NULL)
5821 network->key_mgmt |= WFD_OEM_KEY_MGMT_IEEE8021X;
5822 if (g_strrstr(key_mgmt, WFD_OEM_STR_KEY_MGMT_PSK) != NULL)
5823 network->key_mgmt |= WFD_OEM_KEY_MGMT_PSK;
5824 if (g_strrstr(key_mgmt, WFD_OEM_STR_KEY_MGMT_NONE) != NULL)
5825 network->key_mgmt |= WFD_OEM_KEY_MGMT_NONE;
5827 } else if (g_strcmp0(key, "pairwise") == 0) {
5828 const char *pairwise = NULL;
5829 g_variant_get(value, "&s", &pairwise);
5830 WDP_LOGD("pairwise [%s]", pairwise);
5832 if (g_strrstr(pairwise, WFD_OEM_STR_CIPHER_NONE) != NULL)
5833 network->pairwise |= WFD_OEM_CIPHER_NONE;
5834 if (g_strrstr(pairwise, WFD_OEM_STR_CIPHER_TKIP) != NULL)
5835 network->pairwise |= WFD_OEM_CIPHER_TKIP;
5836 if (g_strrstr(pairwise, WFD_OEM_STR_CIPHER_CCMP) != NULL)
5837 network->pairwise |= WFD_OEM_CIPHER_CCMP;
5839 } else if (g_strcmp0(key, "group") == 0) {
5840 const char *group = NULL;
5841 g_variant_get(value, "&s", &group);
5842 WDP_LOGD("group [%s]", group);
5844 if (g_strrstr(group, WFD_OEM_STR_CIPHER_NONE) != NULL)
5845 network->group |= WFD_OEM_CIPHER_NONE;
5846 if (g_strrstr(group, WFD_OEM_STR_CIPHER_WEP40) != NULL)
5847 network->group |= WFD_OEM_CIPHER_WEP40;
5848 if (g_strrstr(group, WFD_OEM_STR_CIPHER_WEP104) != NULL)
5849 network->group |= WFD_OEM_CIPHER_WEP104;
5850 if (g_strrstr(group, WFD_OEM_STR_CIPHER_TKIP) != NULL)
5851 network->group |= WFD_OEM_CIPHER_TKIP;
5852 if (g_strrstr(group, WFD_OEM_STR_CIPHER_CCMP) != NULL)
5853 network->group |= WFD_OEM_CIPHER_CCMP;
5855 } else if (g_strcmp0(key, "auth_alg") == 0) {
5856 const char *auth_alg = NULL;
5857 g_variant_get(value, "&s", &auth_alg);
5858 WDP_LOGD("auth_alg [%s]", auth_alg);
5860 if (g_strrstr(auth_alg, WFD_OEM_STR_AUTH_ALG_OPEN) != NULL)
5861 network->auth_alg |= WFD_OEM_AUTH_ALG_OPEN;
5863 } else if (g_strcmp0(key, "mode") == 0) {
5864 const char *mode = NULL;
5865 g_variant_get(value, "&s", &mode);
5866 WDP_LOGD("mode [%s]", mode);
5868 if (g_strrstr(mode, WFD_OEM_STR_MODE_GC) != NULL)
5869 network->mode |= WFD_OEM_PERSISTENT_MODE_GC;
5870 if (g_strrstr(mode, WFD_OEM_STR_MODE_GO) != NULL)
5871 network->mode |= WFD_OEM_PERSISTENT_MODE_GO;
5873 } else if (g_strcmp0(key, "p2p_client_list") == 0) {
5874 const char *p2p_client_list = NULL;
5879 g_variant_get(value, "&s", &p2p_client_list);
5880 WDP_LOGD("p2p_client_list [%s]", p2p_client_list);
5881 ptr = (char *)p2p_client_list;
5882 list_len = strlen(p2p_client_list);
5883 WDP_LOGD("list_len [%d]", list_len);
5884 while (ptr && list_len >= (OEM_MACSTR_LEN - 1)) {
5885 __ws_txt_to_mac((unsigned char *)ptr, (network->p2p_client_list[num]));
5886 ptr += OEM_MACSTR_LEN;
5887 list_len -= OEM_MACSTR_LEN;
5888 if (ptr && ptr[0] == ' ') {
5893 if (num >= OEM_MAX_PEER_NUM)
5896 network->p2p_client_num = num;
5897 WDP_LOGD("p2p_client_num [%d]", network->p2p_client_num);
5902 void __ws_extract_p2pdevice_details(const char *key, GVariant *value, void *user_data)
5904 __WDP_LOG_FUNC_ENTER__;
5905 CHECK_KEY_VALUE(key, value);
5907 if (g_strcmp0(key, "PersistentGroups") == 0) {
5908 GVariantIter *iter = NULL;
5909 const char *path = NULL;
5912 ws_network_info_s *networks = NULL;
5913 networks = (ws_network_info_s *)user_data;
5915 WDP_LOGE("network is NULL");
5916 __WDP_LOG_FUNC_EXIT__;
5920 g_variant_get(value, "ao", &iter);
5921 while (g_variant_iter_loop(iter, "&o", &path)) {
5924 if (num >= WS_MAX_PERSISTENT_COUNT)
5927 WDP_LOGD("Retrive persistent path [%s]", path);
5928 g_strlcpy(networks[num].persistent_path, path, DBUS_OBJECT_PATH_MAX);
5930 loc = strrchr(networks[num].persistent_path, '/');
5932 networks[num].network_id = strtoul(loc+1, NULL, 10);
5934 WDP_LOGD("Retrive persistent path [%s]", networks[num].persistent_path);
5935 dbus_property_get_all(networks[num].persistent_path, g_pd->g_dbus,
5936 SUPPLICANT_P2P_PERSISTENTGROUP, __parsing_networks, &networks[num]);
5940 networks[0].total = num;
5941 WDP_LOGI("total number [%d]", num);
5942 g_variant_iter_free(iter);
5944 __WDP_LOG_FUNC_EXIT__;
5948 int ws_get_persistent_groups(wfd_oem_persistent_group_s **groups, int *group_count)
5950 __WDP_LOG_FUNC_ENTER__;
5951 GDBusConnection *g_dbus = NULL;
5953 ws_network_info_s networks[WS_MAX_PERSISTENT_COUNT];
5954 wfd_oem_persistent_group_s *wfd_persistent_groups = NULL;
5958 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5959 __WDP_LOG_FUNC_EXIT__;
5963 g_dbus = g_pd->g_dbus;
5965 WDP_LOGE("DBus connection is NULL");
5966 __WDP_LOG_FUNC_EXIT__;
5970 memset(&networks, 0x0, WS_MAX_PERSISTENT_COUNT * sizeof(ws_network_info_s));
5971 dbus_property_get_all(g_pd->iface_path, g_dbus, SUPPLICANT_P2PDEVICE,
5972 __ws_extract_p2pdevice_details, &networks[0]);
5974 cnt = networks[0].total;
5976 WDP_LOGD("Persistent Group Count=%d", cnt);
5977 if (cnt > WS_MAX_PERSISTENT_COUNT) {
5978 WDP_LOGE("Persistent group count exceeded or parsing error");
5979 __WDP_LOG_FUNC_EXIT__;
5984 WDP_LOGE("Persistent group count zero");
5987 __WDP_LOG_FUNC_EXIT__;
5991 wfd_persistent_groups = (wfd_oem_persistent_group_s *) g_try_malloc0(cnt * sizeof(wfd_oem_persistent_group_s));
5992 if (wfd_persistent_groups == NULL) {
5993 WDP_LOGE("Failed to allocate memory for wfd_persistent_groups ");
5994 __WDP_LOG_FUNC_EXIT__;
5998 for (i = 0; i < cnt; i++) {
6001 WDP_LOGD("----persistent group [%d]----", i);
6002 WDP_LOGD("network_id [%d]", networks[i].network_id);
6003 WDP_LOGD("ssid [%s]", networks[i].ssid);
6004 WDP_LOGD("bssid ["MACSTR"]", MAC2STR(networks[i].bssid));
6005 WDP_LOGD("p2p_client_num [%d]", networks[i].p2p_client_num);
6006 for (j = 0; j < networks[i].p2p_client_num; j++)
6007 WDP_LOGD("p2p_client_list ["MACSTR"]", MAC2STR(networks[i].p2p_client_list[j]));
6009 wfd_persistent_groups[i].network_id = networks[i].network_id;
6010 g_strlcpy(wfd_persistent_groups[i].ssid, networks[i].ssid, WS_SSID_LEN + 1);
6011 memcpy(wfd_persistent_groups[i].go_mac_address, networks[i].bssid, WS_MACADDR_LEN);
6012 wfd_persistent_groups[i].p2p_client_num = networks[i].p2p_client_num;
6013 if (wfd_persistent_groups[i].p2p_client_num > 0)
6014 memcpy(wfd_persistent_groups[i].p2p_client_list, networks[i].p2p_client_list,
6015 OEM_MACADDR_LEN * OEM_MAX_PEER_NUM * sizeof(char));
6019 *groups = wfd_persistent_groups;
6021 __WDP_LOG_FUNC_EXIT__;
6025 int ws_remove_persistent_group(char *ssid, unsigned char *bssid)
6027 __WDP_LOG_FUNC_ENTER__;
6028 GDBusConnection *g_dbus = NULL;
6030 dbus_method_param_s params;
6031 ws_network_info_s networks[WS_MAX_PERSISTENT_COUNT];
6036 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
6037 __WDP_LOG_FUNC_EXIT__;
6041 g_dbus = g_pd->g_dbus;
6043 WDP_LOGE("DBus connection is NULL");
6044 __WDP_LOG_FUNC_EXIT__;
6047 memset(&networks, 0x0, WS_MAX_PERSISTENT_COUNT * sizeof(ws_network_info_s));
6048 dbus_property_get_all(g_pd->iface_path, g_dbus, SUPPLICANT_P2PDEVICE,
6049 __ws_extract_p2pdevice_details, networks);
6051 cnt = networks[0].total;
6053 WDP_LOGD("Persistent Group Count=%d", cnt);
6054 if (cnt > WS_MAX_PERSISTENT_COUNT) {
6055 WDP_LOGE("Persistent group count exceeded or parsing error");
6056 __WDP_LOG_FUNC_EXIT__;
6060 for (i = 0; i < cnt; i++) {
6063 WDP_LOGD("----persistent group [%d]----", i);
6064 WDP_LOGD("network_id [%d]", networks[i].network_id);
6065 WDP_LOGD("network ssid [%s]", networks[i].ssid);
6066 WDP_LOGD("network bssid ["MACSTR"]", MAC2STR(networks[i].bssid));
6067 WDP_LOGD("network p2p_client_num [%d]", networks[i].p2p_client_num);
6068 for (j = 0; j < networks[i].p2p_client_num; j++)
6069 WDP_LOGD("network p2p_client_list ["MACSTR"]",
6070 MAC2STR(networks[i].p2p_client_list[j]));
6072 WDP_LOGD("ssid [%s]", ssid);
6073 WDP_LOGD("bssid ["MACSTR"]", MAC2STR(bssid));
6075 if (!g_strcmp0(ssid, networks[i].ssid) &&
6076 !memcmp(bssid, networks[i].bssid, WS_MACADDR_LEN)) {
6077 WDP_LOGD("Persistent group owner found [%d: %s]",
6078 networks[i].network_id, ssid);
6080 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6081 dbus_set_method_param(¶ms, "RemovePersistentGroup",
6082 g_pd->iface_path, g_dbus);
6083 params.params = g_variant_new("(o)", networks[i].persistent_path);
6084 DEBUG_G_VARIANT("Params : ", params.params);
6086 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
6088 WDP_LOGE("Failed to send command to wpa_supplicant");
6089 __WDP_LOG_FUNC_EXIT__;
6093 WDP_LOGD("Succeeded to remove persistent group");;
6099 WDP_LOGE("Persistent group not found [%s]", ssid);
6103 __WDP_LOG_FUNC_EXIT__;
6107 int ws_set_persistent_reconnect(unsigned char *bssid, int reconnect)
6109 __WDP_LOG_FUNC_ENTER__;
6110 GDBusConnection *g_dbus = NULL;
6112 GVariant *value = NULL;
6113 GVariant *param = NULL;
6114 GVariantBuilder *builder = NULL;
6115 dbus_method_param_s params;
6119 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
6120 __WDP_LOG_FUNC_EXIT__;
6124 g_dbus = g_pd->g_dbus;
6126 WDP_LOGE("DBus connection is NULL");
6127 __WDP_LOG_FUNC_EXIT__;
6130 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6132 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
6135 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6136 g_variant_builder_add(builder, "{sv}", "PersistentReconnect",
6137 g_variant_new_boolean(reconnect));
6138 value = g_variant_new("a{sv}", builder);
6139 g_variant_builder_unref(builder);
6141 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
6143 params.params = param;
6144 DEBUG_G_VARIANT("Params : ", params.params);
6146 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
6148 WDP_LOGE("Failed to send command to wpa_supplicant");
6150 WDP_LOGD("Succeeded to set persistent reconnect");
6152 __WDP_LOG_FUNC_EXIT__;
6156 static int __ws_compress_query(char *compressed, char *query, int qtype)
6164 token = strtok_r(query, ".", &temp);
6166 if (!strcmp(token, "local")) {
6167 WDP_LOGD("Query conversion done");
6170 } else if (!strncmp(token, "_tcp", 4)) {
6171 memcpy(&compressed[length], WS_TCP_PTR_HEX, 2);
6174 } else if (!strncmp(token, "_udp", 4)) {
6175 memcpy(&compressed[length], WS_UDP_PTR_HEX, 2);
6179 WDP_LOGD("Token: [%s]", token);
6180 token_len = strlen(token);
6181 compressed[length] = token_len;
6184 memcpy(&compressed[length], token, token_len);
6185 length += token_len;
6188 token = strtok_r(NULL, ".", &temp);
6190 if (qtype == WS_QTYPE_PTR || token_num == 2)
6191 memcpy(&compressed[length], WS_PTR_TYPE_HEX, 3);
6192 else if (qtype == WS_QTYPE_TXT || token_num == 3)
6193 memcpy(&compressed[length], WS_TXT_TYPE_HEX, 3);
6196 WDP_LOGD("converted query length [%d] token num [%d]", length, token_num);
6201 static int __ws_compress_rdata(char *compressed, char *rdata, int qtype)
6208 if (qtype == WS_QTYPE_PTR) {
6210 token = strtok_r(rdata, ".", &temp);
6212 WDP_LOGD("Token: %s", token);
6213 token_len = strlen(token);
6214 compressed[length] = token_len;
6217 memcpy(&compressed[length], token, token_len);
6218 length += token_len;
6221 compressed[length] = 0xc0;
6222 compressed[length+1] = 0x27;
6225 } else if (qtype == WS_QTYPE_TXT) {
6227 token = strtok_r(rdata, ",", &temp);
6230 WDP_LOGD("Token: [%s]", token);
6232 token_len = strlen(token);
6233 compressed[length] = token_len;
6236 memcpy(&compressed[length], token, token_len);
6237 length += token_len;
6239 token = strtok_r(NULL, ",", &temp);
6242 WDP_LOGD("RDATA is NULL");
6247 int _convert_bonjour_to_args(char *query, char *rdata, GVariantBuilder *builder)
6249 GVariantBuilder *args = NULL;
6250 char compressed[256] = {0, };
6256 if (!query || !builder) {
6257 WDP_LOGE("Invalid parameter");
6260 if (!rdata || !strlen(rdata)) {
6261 WDP_LOGD("RDATA is NULL\n");
6263 temp = strstr(rdata, query);
6265 if (temp != NULL && temp - rdata > 0)
6266 qtype = WS_QTYPE_PTR;
6268 qtype = WS_QTYPE_TXT;
6272 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("bonjour"));
6274 /* compress query */
6275 length = __ws_compress_query(compressed, query, qtype);
6277 args = g_variant_builder_new(G_VARIANT_TYPE("ay"));
6278 for (i = 0; i < length; i++)
6279 g_variant_builder_add(args, "y", compressed[i]);
6280 g_variant_builder_add(builder, "{sv}", "query", g_variant_new("ay", args));
6281 g_variant_builder_unref(args);
6283 memset(compressed, 0x0, 256);
6288 length = __ws_compress_rdata(compressed, rdata, qtype);
6290 args = g_variant_builder_new(G_VARIANT_TYPE("ay"));
6291 for (i = 0; i < length; i++)
6292 g_variant_builder_add(args, "y", compressed[i]);
6293 g_variant_builder_add(builder, "{sv}", "response", g_variant_new("ay", args));
6294 g_variant_builder_unref(args);
6300 int _check_service_query_exists(wfd_oem_service_s *service)
6303 wfd_oem_service_s *data = NULL;
6305 for (count = 0; count < g_list_length(service_list); count++) {
6306 data = (wfd_oem_service_s*) g_list_nth_data(service_list, count);
6307 if (strncmp(service->query_id, data->query_id, OEM_QUERY_ID_LEN) == 0) {
6308 WDP_LOGD("Query already exists");
6315 static wfd_oem_service_s* _remove_service_query(char * s_type, char *mac_str, char *query_id)
6317 if (NULL == s_type || NULL == mac_str || NULL == query_id)
6321 wfd_oem_service_s *data = NULL;
6323 for (count = 0; count < g_list_length(service_list); count++) {
6324 data = (wfd_oem_service_s*) g_list_nth_data(service_list, count);
6325 if (data && !strncmp(data->service_type, s_type, SERVICE_TYPE_LEN) &&
6326 memcmp(data->dev_addr, mac_str, OEM_MACSTR_LEN - 1) == 0) {
6327 g_strlcpy(query_id, data->query_id, OEM_QUERY_ID_LEN + 1);
6331 if (strlen(query_id) <= 0) {
6332 WDP_LOGD("!! Query ID not found !!");
6336 WDP_LOGD("query id :[%s]", query_id);
6341 void __add_service_query(GVariant *value, void *user_data)
6343 __WDP_LOG_FUNC_ENTER__;
6344 wfd_oem_service_s *service = NULL;
6346 long long unsigned ref = 0;
6352 g_variant_get(value, "(t)", &ref);
6354 service = (wfd_oem_service_s*) g_try_malloc0(sizeof(wfd_oem_service_s));
6356 WDP_LOGE("Failed to allocate memory for service");
6360 memcpy(service, user_data, sizeof(wfd_oem_service_s));
6362 g_snprintf(service->query_id, OEM_QUERY_ID_LEN + 1, "%llx", ref);
6364 res = _check_service_query_exists(service);
6368 service_list = g_list_append(service_list, service);
6370 __WDP_LOG_FUNC_EXIT__;
6375 /* for now, supplicant dbus interface only provides upnp service fully */
6376 int ws_start_service_discovery(unsigned char *mac_addr, int service_type)
6378 __WDP_LOG_FUNC_ENTER__;
6379 GDBusConnection *g_dbus = NULL;
6380 GVariantBuilder *builder = NULL;
6381 GVariant *value = NULL;
6382 wfd_oem_service_s data = {0,};
6383 dbus_method_param_s params;
6384 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
6389 WDP_LOGE("Invalid parameter");
6390 __WDP_LOG_FUNC_EXIT__;
6395 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
6396 __WDP_LOG_FUNC_EXIT__;
6400 g_dbus = g_pd->g_dbus;
6402 WDP_LOGE("DBus connection is NULL");
6403 __WDP_LOG_FUNC_EXIT__;
6406 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6408 dbus_set_method_param(¶ms, "ServiceDiscoveryRequest", g_pd->iface_path, g_dbus);
6410 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6412 if (mac_addr && !ISZEROMACADDR(mac_addr)) {
6413 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
6414 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(mac_addr));
6415 WDP_LOGD("get peer path [%s]", peer_path);
6416 g_variant_builder_add(builder, "{sv}", "peer", g_variant_new_object_path(peer_path));
6419 if (service_type == WFD_OEM_SERVICE_TYPE_ALL) {
6421 char *service_all = "\x02\x00\x00\x01";
6422 GVariantBuilder *query = NULL;
6424 query = g_variant_builder_new(G_VARIANT_TYPE("ay"));
6425 for (i = 0; i < SERVICE_QUERY_LEN; i++)
6426 g_variant_builder_add(query, "y", service_all[i]);
6427 g_variant_builder_add(builder, "{sv}", "query", g_variant_new("ay", query));
6428 g_variant_builder_unref(query);
6429 g_strlcpy(data.service_type, SERV_DISC_REQ_ALL, OEM_SERVICE_TYPE_LEN + 1);
6431 } else if (service_type == WFD_OEM_SERVICE_TYPE_UPNP) {
6433 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("upnp"));
6434 g_variant_builder_add(builder, "{sv}", "version", g_variant_new_int32(10));
6435 g_variant_builder_add(builder, "{sv}", "service", g_variant_new_string("ssdp:all"));
6436 g_strlcpy(data.service_type, SERV_DISC_REQ_UPNP, OEM_SERVICE_TYPE_LEN + 1);
6438 } else if (service_type == WFD_OEM_SERVICE_TYPE_BONJOUR) {
6440 char *service_bonjour = "\x02\x00\x01\x01";
6441 GVariantBuilder *query = NULL;
6443 query = g_variant_builder_new(G_VARIANT_TYPE("ay"));
6444 for (i = 0; i < SERVICE_QUERY_LEN; i++)
6445 g_variant_builder_add(query, "y", service_bonjour[i]);
6446 g_variant_builder_add(builder, "{sv}", "tlv", g_variant_new("ay", query));
6447 g_variant_builder_unref(query);
6448 g_strlcpy(data.service_type, SERV_DISC_REQ_BONJOUR, OEM_SERVICE_TYPE_LEN + 1);
6451 value = g_variant_new("(a{sv})", builder);
6452 g_variant_builder_unref(builder);
6454 params.params = value;
6455 DEBUG_G_VARIANT("Params : ", params.params);
6457 if (ISZEROMACADDR(mac_addr))
6458 snprintf(data.dev_addr, WS_MACSTR_LEN , "%s", SERV_BROADCAST_ADDRESS);
6460 snprintf(data.dev_addr, WS_MACSTR_LEN, MACSTR, MAC2STR(mac_addr));
6462 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, __add_service_query, &data);
6464 WDP_LOGE("Failed to send command to wpa_supplicant");
6466 WDP_LOGD("Succeeded to start service discovery");
6468 __WDP_LOG_FUNC_EXIT__;
6472 int ws_cancel_service_discovery(unsigned char *mac_addr, int service_type)
6474 __WDP_LOG_FUNC_ENTER__;
6475 GDBusConnection *g_dbus = NULL;
6476 dbus_method_param_s params;
6477 wfd_oem_service_s *data = NULL;
6478 char query_id[OEM_QUERY_ID_LEN + 1] = {0, };
6479 char s_type[OEM_SERVICE_TYPE_LEN + 1] = {0, };
6480 char mac_str[18] = {0, };
6481 long long unsigned id;
6486 WDP_LOGE("Invalid parameter");
6487 __WDP_LOG_FUNC_EXIT__;
6492 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
6493 __WDP_LOG_FUNC_EXIT__;
6497 g_dbus = g_pd->g_dbus;
6499 WDP_LOGE("DBus connection is NULL");
6500 __WDP_LOG_FUNC_EXIT__;
6504 if (ISZEROMACADDR(mac_addr)) {
6505 snprintf(mac_str, WS_MACSTR_LEN , "%s", SERV_BROADCAST_ADDRESS);
6507 snprintf(mac_str, WS_MACSTR_LEN, MACSTR, MAC2STR(mac_addr));
6510 switch (service_type) {
6511 case WFD_OEM_SERVICE_TYPE_ALL:
6512 g_strlcpy(s_type, SERV_DISC_REQ_ALL, OEM_SERVICE_TYPE_LEN + 1);
6514 case WFD_OEM_SERVICE_TYPE_BONJOUR:
6515 g_strlcpy(s_type, SERV_DISC_REQ_BONJOUR, OEM_SERVICE_TYPE_LEN + 1);
6517 case WFD_OEM_SERVICE_TYPE_UPNP:
6518 g_strlcpy(s_type, SERV_DISC_REQ_UPNP, OEM_SERVICE_TYPE_LEN + 1);
6521 WDP_LOGE("Invalid Service type");
6522 __WDP_LOG_FUNC_EXIT__;
6526 WDP_LOGD("Cancel service discovery service_type [%d]", service_type);
6527 WDP_LOGD("Cancel service discovery s_type [%s]", s_type);
6529 data = _remove_service_query(s_type, mac_str, query_id);
6531 __WDP_LOG_FUNC_EXIT__;
6534 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6536 dbus_set_method_param(¶ms, "ServiceDiscoveryCancelRequest", g_pd->iface_path, g_dbus);
6537 id = (long long unsigned)strtoul(query_id, NULL, 16);
6538 params.params = g_variant_new("(t)", id);
6540 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
6542 WDP_LOGE("Failed to send command to wpa_supplicant");
6544 WDP_LOGD("Succeeded to cancel service discovery");
6546 service_list = g_list_remove(service_list, data);
6549 __WDP_LOG_FUNC_EXIT__;
6553 int ws_serv_add(wfd_oem_new_service_s *service)
6555 __WDP_LOG_FUNC_ENTER__;
6556 GDBusConnection *g_dbus = NULL;
6557 GVariantBuilder *builder = NULL;
6558 GVariant *value = NULL;
6559 dbus_method_param_s params;
6563 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
6564 __WDP_LOG_FUNC_EXIT__;
6568 g_dbus = g_pd->g_dbus;
6570 WDP_LOGE("DBus connection is NULL");
6571 __WDP_LOG_FUNC_EXIT__;
6574 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6576 dbus_set_method_param(¶ms, "AddService", g_pd->iface_path, g_dbus);
6578 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6580 if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
6582 WDP_LOGD("Service type: WFD_OEM_SERVICE_TYPE_BONJOUR");
6583 WDP_LOGD("Query: %s", service->data.bonjour.query);
6584 WDP_LOGD("RData: %s", service->data.bonjour.rdata);
6586 res = _convert_bonjour_to_args(service->data.bonjour.query,
6587 service->data.bonjour.rdata, builder);
6589 WDP_LOGE("Failed to convert Key string");
6590 g_variant_builder_unref(builder);
6594 } else if (service->protocol == WFD_OEM_SERVICE_TYPE_UPNP) {
6595 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("upnp"));
6596 g_variant_builder_add(builder, "{sv}", "version", g_variant_new_int32(10));
6597 g_variant_builder_add(builder, "{sv}", "service", g_variant_new_string(service->data.upnp.service));
6600 value = g_variant_new("(a{sv})", builder);
6601 g_variant_builder_unref(builder);
6603 params.params = value;
6604 DEBUG_G_VARIANT("Params : ", params.params);
6606 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
6608 WDP_LOGE("Failed to send command to wpa_supplicant");
6610 WDP_LOGD("Succeeded to add service");
6612 __WDP_LOG_FUNC_EXIT__;
6616 int ws_serv_del(wfd_oem_new_service_s *service)
6618 __WDP_LOG_FUNC_ENTER__;
6619 GDBusConnection *g_dbus = NULL;
6620 GVariantBuilder *builder = NULL;
6621 GVariant *value = NULL;
6622 dbus_method_param_s params;
6626 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
6627 __WDP_LOG_FUNC_EXIT__;
6631 g_dbus = g_pd->g_dbus;
6633 WDP_LOGE("DBus connection is NULL");
6634 __WDP_LOG_FUNC_EXIT__;
6637 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6639 dbus_set_method_param(¶ms, "DeleteService", g_pd->iface_path, g_dbus);
6641 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6643 if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
6645 WDP_LOGD("Service type: WFD_OEM_SERVICE_TYPE_BONJOUR");
6646 WDP_LOGD("Query: %s", service->data.bonjour.query);
6648 res = _convert_bonjour_to_args(service->data.bonjour.query,
6651 WDP_LOGE("Failed to convert Key string");
6652 g_variant_builder_unref(builder);
6656 } else if (service->protocol == WFD_OEM_SERVICE_TYPE_UPNP) {
6657 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("upnp"));
6658 g_variant_builder_add(builder, "{sv}", "version", g_variant_new_int32(10));
6659 g_variant_builder_add(builder, "{sv}", "service", g_variant_new_string(service->data.upnp.service));
6662 value = g_variant_new("(a{sv})", builder);
6663 g_variant_builder_unref(builder);
6665 params.params = value;
6666 DEBUG_G_VARIANT("Params : ", params.params);
6668 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
6670 WDP_LOGE("Failed to send command to wpa_supplicant");
6672 WDP_LOGD("Succeeded to del service");
6674 __WDP_LOG_FUNC_EXIT__;
6678 int _ws_disable_display()
6680 __WDP_LOG_FUNC_ENTER__;
6681 GDBusConnection *g_dbus = NULL;
6682 GVariantBuilder *builder = NULL;
6683 GVariant *value = NULL;
6684 GVariant *param = NULL;
6685 dbus_method_param_s params;
6689 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
6690 __WDP_LOG_FUNC_EXIT__;
6694 g_dbus = g_pd->g_dbus;
6696 WDP_LOGE("DBus connection is NULL");
6697 __WDP_LOG_FUNC_EXIT__;
6700 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6702 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, SUPPLICANT_PATH,
6705 builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
6706 value = g_variant_new("ay", builder);
6707 g_variant_builder_unref(builder);
6709 param = g_variant_new("(ssv)", SUPPLICANT_INTERFACE, "WFDIEs", value);
6711 params.params = param;
6712 DEBUG_G_VARIANT("Params : ", params.params);
6714 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
6716 WDP_LOGE("Failed to send command to wpa_supplicant");
6718 WDP_LOGD("Succeeded to disable Wi-Fi display");
6720 __WDP_LOG_FUNC_EXIT__;
6724 int ws_miracast_init(int enable)
6726 __WDP_LOG_FUNC_ENTER__;
6727 wfd_oem_display_s wifi_display;
6730 memset(&wifi_display, 0x0, sizeof(wfd_oem_display_s));
6732 wifi_display.availability = enable;
6733 wifi_display.hdcp_support = 1;
6734 wifi_display.port = 0x07E6;
6735 wifi_display.max_tput = 0x0028;
6737 res = ws_set_display(&wifi_display);
6739 WDP_LOGE("Failed to set miracast parameter(device info)");
6740 __WDP_LOG_FUNC_EXIT__;
6745 res = _ws_disable_display();
6747 WDP_LOGE("Failed to disable wifi display");
6749 WDP_LOGD("Succeeded to disable wifi display");
6751 __WDP_LOG_FUNC_EXIT__;
6755 int ws_set_display(wfd_oem_display_s *wifi_display)
6757 __WDP_LOG_FUNC_ENTER__;
6758 GDBusConnection *g_dbus = NULL;
6760 GVariant *value = NULL;
6761 GVariant *param = NULL;
6762 GVariantBuilder *builder = NULL;
6763 dbus_method_param_s params;
6767 unsigned char ies[WFD_SUBELEM_LEN_DEV_INFO + 3] = {0,};
6769 if (!wifi_display) {
6770 WDP_LOGE("Invalid parameter");
6773 g_dbus = g_pd->g_dbus;
6775 WDP_LOGE("DBus connection is NULL");
6776 __WDP_LOG_FUNC_EXIT__;
6779 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6781 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, SUPPLICANT_PATH,
6784 ies[2] = WFD_SUBELEM_LEN_DEV_INFO;
6785 ies[3] = wifi_display->hdcp_support;
6786 ies[4] = (wifi_display->type) | (wifi_display->availability<<4);
6787 ies[5] = wifi_display->port>>8;
6788 ies[6] = wifi_display->port&0xff;
6789 ies[7] = wifi_display->max_tput>>8;
6790 ies[8] = wifi_display->max_tput&0xff;
6792 builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
6793 for (i = 0; i < WFD_SUBELEM_LEN_DEV_INFO + 3; i++)
6794 g_variant_builder_add(builder, "y", ies[i]);
6795 value = g_variant_new("ay", builder);
6796 g_variant_builder_unref(builder);
6798 param = g_variant_new("(ssv)", SUPPLICANT_INTERFACE, "WFDIEs", value);
6800 params.params = param;
6801 DEBUG_G_VARIANT("Params : ", params.params);
6803 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
6805 WDP_LOGE("Failed to send command to wpa_supplicant");
6807 WDP_LOGD("Succeeded to set Wi-Fi Display");
6809 __WDP_LOG_FUNC_EXIT__;
6813 int ws_refresh(void)
6815 __WDP_LOG_FUNC_ENTER__;
6820 __WDP_LOG_FUNC_EXIT__;
6824 int ws_save_config(void)
6826 __WDP_LOG_FUNC_ENTER__;
6827 GDBusConnection *g_dbus = NULL;
6828 dbus_method_param_s params;
6831 g_dbus = g_pd->g_dbus;
6833 WDP_LOGE("DBus connection is NULL");
6834 __WDP_LOG_FUNC_EXIT__;
6837 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6839 dbus_set_method_param(¶ms, "SaveConfig", g_pd->iface_path, g_dbus);
6840 params.params = NULL;
6842 res = dbus_method_call(¶ms, SUPPLICANT_IFACE, NULL, NULL);
6844 WDP_LOGE("Failed to save config to wpa_supplicant");
6846 WDP_LOGD("Succeeded to save config");
6848 __WDP_LOG_FUNC_EXIT__;
6852 int ws_set_operating_channel(int channel)
6854 __WDP_LOG_FUNC_ENTER__;
6855 GDBusConnection *g_dbus = NULL;
6856 GVariant *value = NULL;
6857 GVariant *param = NULL;
6858 GVariantBuilder *builder = NULL;
6859 dbus_method_param_s params;
6862 g_dbus = g_pd->g_dbus;
6864 WDP_LOGE("DBus connection is NULL");
6865 __WDP_LOG_FUNC_EXIT__;
6869 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6871 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path, g_dbus);
6873 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6874 g_variant_builder_add(builder, "{sv}", "OperChannel", g_variant_new_uint32(channel));
6875 value = g_variant_new("a{sv}", builder);
6876 g_variant_builder_unref(builder);
6878 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
6879 params.params = param;
6881 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
6883 WDP_LOGE("Failed to send command to wpa_supplicant");
6885 WDP_LOGD("Succeeded to set Operating Channel");
6887 __WDP_LOG_FUNC_EXIT__;
6891 int ws_remove_all_network(void)
6893 __WDP_LOG_FUNC_ENTER__;
6894 GDBusConnection *g_dbus = NULL;
6895 dbus_method_param_s params;
6898 g_dbus = g_pd->g_dbus;
6900 WDP_LOGE("DBus connection is NULL");
6901 __WDP_LOG_FUNC_EXIT__;
6904 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6906 dbus_set_method_param(¶ms, "RemoveAllNetworks", g_pd->iface_path, g_dbus);
6907 params.params = NULL;
6909 res = dbus_method_call(¶ms, SUPPLICANT_IFACE, NULL, NULL);
6911 WDP_LOGE("Failed to send [RemoveAllNetworks] command to wpa_supplicant");
6913 WDP_LOGD("Succeeded to remove all networks from supplicant");
6915 WDP_LOGD("Succeeded to remove all network");
6916 __WDP_LOG_FUNC_EXIT__;
6920 int ws_get_wpa_status(int *wpa_status)
6922 __WDP_LOG_FUNC_ENTER__;
6923 GDBusConnection *g_dbus = NULL;
6924 GVariant *param = NULL;
6925 GVariant *reply = NULL;
6926 GError *error = NULL;
6929 WDP_LOGE("Invalid parameter");
6930 __WDP_LOG_FUNC_EXIT__;
6934 *wpa_status = WFD_OEM_WPA_STATE_MAX;
6936 g_dbus = g_pd->g_dbus;
6938 WDP_LOGE("DBus connection is NULL");
6939 __WDP_LOG_FUNC_EXIT__;
6943 param = g_variant_new("(s)", SUPPLICANT_IFACE);
6945 reply = g_dbus_connection_call_sync(
6947 SUPPLICANT_SERVICE, /* bus name */
6948 g_pd->iface_path, /* object path */
6949 DBUS_PROPERTIES_INTERFACE, /* interface name */
6950 DBUS_PROPERTIES_METHOD_GETALL, /* method name */
6951 param, /* GVariant *params */
6952 NULL, /* reply_type */
6953 G_DBUS_CALL_FLAGS_NONE, /* flags */
6954 SUPPLICANT_TIMEOUT , /* timeout */
6955 NULL, /* cancellable */
6956 &error); /* error */
6958 if (error != NULL) {
6959 WDP_LOGE("Error! Failed to get properties: [%s]",
6961 g_error_free(error);
6963 g_variant_unref(reply);
6964 __WDP_LOG_FUNC_EXIT__;
6968 gchar *reply_str = NULL;
6970 reply_str = g_variant_print(reply, TRUE);
6971 WDP_LOGE("reply [%s]", reply_str ? reply_str : "NULL");
6974 if (reply != NULL) {
6975 GVariantIter *iter = NULL;
6976 g_variant_get(reply, "(a{sv})", &iter);
6980 GVariant *value = NULL;
6982 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
6983 if (g_strcmp0(key, "State") == 0) {
6984 const gchar *state = NULL;
6985 g_variant_get(value, "&s", &state);
6986 WDP_LOGI("state : [%s]", state);
6988 if (g_strcmp0(state, "disconnected") == 0)
6989 *wpa_status = WFD_OEM_WPA_STATE_DISCONNECTED;
6990 else if (g_strcmp0(state, "inactive") == 0)
6991 *wpa_status = WFD_OEM_WPA_STATE_INACTIVE;
6992 else if (g_strcmp0(state, "scanning") == 0)
6993 *wpa_status = WFD_OEM_WPA_STATE_SCANNING;
6994 else if (g_strcmp0(state, "authenticating") == 0)
6995 *wpa_status = WFD_OEM_WPA_STATE_AUTHENTICATING;
6996 else if (g_strcmp0(state, "associating") == 0)
6997 *wpa_status = WFD_OEM_WPA_STATE_ASSOCIATING;
6998 else if (g_strcmp0(state, "associated") == 0)
6999 *wpa_status = WFD_OEM_WPA_STATE_ASSOCIATED;
7000 else if (g_strcmp0(state, "4way_handshake") == 0)
7001 *wpa_status = WFD_OEM_WPA_STATE_4WAY_HANDSHAKE;
7002 else if (g_strcmp0(state, "group_handshake") == 0)
7003 *wpa_status = WFD_OEM_WPA_STATE_GROUP_HANDSHAKE;
7004 else if (g_strcmp0(state, "completed") == 0)
7005 *wpa_status = WFD_OEM_WPA_STATE_COMPLETED;
7007 *wpa_status = WFD_OEM_WPA_STATE_MAX;
7010 g_variant_iter_free(iter);
7012 g_variant_unref(reply);
7014 WDP_LOGD("No properties");
7017 WDP_LOGI("wpa_status : [%d]", *wpa_status);
7019 __WDP_LOG_FUNC_EXIT__;
7023 int ws_advertise_service(wfd_oem_asp_service_s *service, int replace)
7025 __WDP_LOG_FUNC_ENTER__;
7026 GDBusConnection *g_dbus = NULL;
7027 GVariantBuilder *builder = NULL;
7028 GVariant *value = NULL;
7029 dbus_method_param_s params;
7030 unsigned int config_method = 0x1108;
7031 int auto_accept = 0;
7035 g_dbus = g_pd->g_dbus;
7037 WDP_LOGE("DBus connection is NULL");
7041 if (service->config_method == 2) {
7042 config_method = WS_CONFIG_METHOD_KEYPAD |
7043 WS_CONFIG_METHOD_DISPLAY;
7044 } else if (service->config_method == 3) {
7045 config_method = WS_CONFIG_METHOD_DISPLAY;
7046 } else if (service->config_method == 4) {
7047 config_method = WS_CONFIG_METHOD_KEYPAD;
7050 if (service->auto_accept) {
7051 if (service->role == 0)
7059 rep = (replace == 1);
7061 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7063 dbus_set_method_param(¶ms, "AddService", g_pd->iface_path, g_dbus);
7065 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
7067 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("asp"));
7068 g_variant_builder_add(builder, "{sv}", "auto_accept", g_variant_new_int32(auto_accept));
7069 g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new_uint32(service->adv_id));
7070 g_variant_builder_add(builder, "{sv}", "svc_state", g_variant_new_uint32(service->status));
7071 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new_uint32(config_method));
7072 g_variant_builder_add(builder, "{sv}", "replace", g_variant_new_boolean(rep));
7073 if (service->service_type != NULL)
7074 g_variant_builder_add(builder, "{sv}", "adv_str",
7075 g_variant_new_string(service->service_type));
7076 if (service->service_info != NULL)
7077 g_variant_builder_add(builder, "{sv}", "svc_info",
7078 g_variant_new_string(service->service_info));
7079 if (service->instance_name != NULL)
7080 g_variant_builder_add(builder, "{sv}", "svc_instance",
7081 g_variant_new_string(service->instance_name));
7083 value = g_variant_new("(a{sv})", builder);
7084 g_variant_builder_unref(builder);
7085 DEBUG_G_VARIANT("Params : ", value);
7087 params.params = value;
7089 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
7091 WDP_LOGE("Failed to send command to wpa_supplicant");
7093 WDP_LOGD("Succeeded to add service");
7095 __WDP_LOG_FUNC_EXIT__;
7099 int ws_cancel_advertise_service(wfd_oem_asp_service_s *service)
7101 __WDP_LOG_FUNC_ENTER__;
7102 GDBusConnection *g_dbus = NULL;
7103 GVariantBuilder *builder = NULL;
7104 GVariant *value = NULL;
7105 dbus_method_param_s params;
7108 g_dbus = g_pd->g_dbus;
7110 WDP_LOGE("DBus connection is NULL");
7113 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7115 dbus_set_method_param(¶ms, "DeleteService", g_pd->iface_path, g_dbus);
7117 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
7119 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("asp"));
7120 g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new_uint32(service->adv_id));
7122 value = g_variant_new("(a{sv})", builder);
7123 g_variant_builder_unref(builder);
7124 DEBUG_G_VARIANT("Params : ", value);
7125 params.params = value;
7127 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
7129 WDP_LOGE("Failed to send command to wpa_supplicant");
7131 WDP_LOGD("Succeeded to del service");
7133 __WDP_LOG_FUNC_EXIT__;
7137 static void __ws_add_seek(wfd_oem_asp_service_s *service)
7139 __WDP_LOG_FUNC_ENTER__;
7140 wfd_oem_asp_service_s *seek = NULL;
7142 WDP_LOGE("invalid parameters");
7146 seek = g_try_malloc0(sizeof(wfd_oem_asp_service_s));
7148 WDP_LOGE("Failed to allocate memory for service");
7152 service->search_id = (intptr_t)seek;
7153 memcpy(seek, service, sizeof(wfd_oem_asp_service_s));
7154 if (service->service_type)
7155 seek->service_type = strdup(service->service_type);
7156 seek_list = g_list_prepend(seek_list, seek);
7158 __WDP_LOG_FUNC_EXIT__;
7162 static wfd_oem_asp_service_s * __ws_get_seek(long long unsigned asp_search_id)
7164 __WDP_LOG_FUNC_ENTER__;
7165 wfd_oem_asp_service_s *seek = NULL;
7168 for (list = seek_list; list != NULL; list = list->next) {
7170 if (seek && (seek->asp_search_id == asp_search_id)) {
7171 WDP_LOGD("List found");
7177 __WDP_LOG_FUNC_EXIT__;
7181 static void __ws_remove_seek(wfd_oem_asp_service_s *service)
7183 __WDP_LOG_FUNC_ENTER__;
7184 wfd_oem_asp_service_s *seek = NULL;
7187 for (list = seek_list; list != NULL; list = list->next) {
7190 if (seek && (seek->asp_search_id == service->asp_search_id)) {
7191 WDP_LOGD("List remove");
7192 seek_list = g_list_remove(seek_list, seek);
7193 g_free(seek->service_type);
7194 g_free(seek->service_info);
7198 __WDP_LOG_FUNC_EXIT__;
7202 static void __get_asp_search_id(GVariant *value, void *args)
7204 __WDP_LOG_FUNC_ENTER__;
7205 wfd_oem_asp_service_s *service = NULL;
7206 wfd_oem_asp_service_s *seek = NULL;
7207 long long unsigned search_id = 0;
7209 g_variant_get(value, "(t)", &search_id);
7211 service = (wfd_oem_asp_service_s *)args;
7213 WDP_LOGE("invalid parameters");
7214 __WDP_LOG_FUNC_EXIT__;
7218 seek = g_try_malloc0(sizeof(wfd_oem_asp_service_s));
7220 WDP_LOGE("Failed to allocate memory for service");
7221 __WDP_LOG_FUNC_EXIT__;
7225 service->search_id = search_id;
7226 memcpy(seek, service, sizeof(wfd_oem_asp_service_s));
7227 if (service->service_type)
7228 seek->service_type = strdup(service->service_type);
7229 if (service->service_info)
7230 seek->service_info = strdup(service->service_info);
7231 seek_list = g_list_append(seek_list, seek);
7233 __WDP_LOG_FUNC_EXIT__;
7237 int ws_seek_service(wfd_oem_asp_service_s *service)
7239 __WDP_LOG_FUNC_ENTER__;
7240 GDBusConnection *g_dbus = NULL;
7242 wfd_oem_asp_service_s *seek = NULL;
7245 g_dbus = g_pd->g_dbus;
7247 WDP_LOGE("DBus connection is NULL");
7248 __WDP_LOG_FUNC_EXIT__;
7251 list = g_list_last(seek_list);
7253 service->tran_id = 1;
7258 service->tran_id = seek->tran_id + 1;
7260 service->tran_id = 1;
7263 if (service->service_info) {
7264 GVariantBuilder *builder = NULL;
7265 GVariant *value = NULL;
7266 dbus_method_param_s params;
7268 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7269 dbus_set_method_param(¶ms, "ServiceDiscoveryRequest",
7270 g_pd->iface_path, g_dbus);
7272 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
7274 g_variant_builder_add(builder, "{sv}", "service_type",
7275 g_variant_new_string("asp"));
7276 g_variant_builder_add(builder, "{sv}", "transaction_id",
7277 g_variant_new_byte(service->tran_id));
7278 if (service->service_type != NULL)
7279 g_variant_builder_add(builder, "{sv}", "svc_str",
7280 g_variant_new_string(service->service_type));
7282 if (service->service_info != NULL)
7283 g_variant_builder_add(builder, "{sv}", "svc_info",
7284 g_variant_new_string(service->service_info));
7286 if (service->instance_name != NULL)
7287 g_variant_builder_add(builder, "{sv}", "svc_instance",
7288 g_variant_new_string(service->instance_name));
7290 value = g_variant_new("(a{sv})", builder);
7291 g_variant_builder_unref(builder);
7293 DEBUG_G_VARIANT("Params : ", value);
7295 params.params = value;
7296 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE,
7297 __get_asp_search_id, service);
7300 __ws_add_seek(service);
7304 WDP_LOGE("Failed to send command to wpa_supplicant");
7306 WDP_LOGD("Succeeded to seek service");
7308 __WDP_LOG_FUNC_EXIT__;
7312 int ws_cancel_seek_service(wfd_oem_asp_service_s *service)
7314 __WDP_LOG_FUNC_ENTER__;
7315 GDBusConnection *g_dbus = NULL;
7316 wfd_oem_asp_service_s *seek = NULL;
7317 dbus_method_param_s params;
7320 g_dbus = g_pd->g_dbus;
7322 WDP_LOGE("DBus connection is NULL");
7323 __WDP_LOG_FUNC_EXIT__;
7327 seek = __ws_get_seek(service->asp_search_id);
7329 WDP_LOGE("seek data is NULL");
7330 __WDP_LOG_FUNC_EXIT__;
7334 if (seek->service_info) {
7336 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7337 dbus_set_method_param(¶ms, "ServiceDiscoveryCancelRequest",
7338 g_pd->iface_path, g_dbus);
7340 params.params = g_variant_new("(t)", service->search_id);
7342 DEBUG_G_VARIANT("Params : ", params.params);
7344 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
7346 WDP_LOGE("Failed to send command to wpa_supplicant");
7348 WDP_LOGD("Succeeded to cancel seek service");
7351 __ws_remove_seek(seek);
7353 __WDP_LOG_FUNC_EXIT__;
7357 int ws_asp_prov_disc_req(wfd_oem_asp_prov_s *asp_params)
7359 __WDP_LOG_FUNC_ENTER__;
7360 GDBusConnection *g_dbus = NULL;
7361 GVariantBuilder *builder = NULL;
7362 GVariantBuilder *mac_builder = NULL;
7363 GVariant *value = NULL;
7364 dbus_method_param_s params;
7365 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
7366 int config_method = 0x1000;
7371 WDP_LOGE("Invalid parameter");
7372 __WDP_LOG_FUNC_EXIT__;
7375 g_dbus = g_pd->g_dbus;
7377 WDP_LOGE("DBus connection is NULL");
7378 __WDP_LOG_FUNC_EXIT__;
7382 if (asp_params->network_config == WFD_OEM_ASP_WPS_TYPE_PIN_DISPLAY)
7383 config_method = 0x8;
7384 else if (asp_params->network_config == WFD_OEM_ASP_WPS_TYPE_PIN_KEYPAD)
7385 config_method = 0x100;
7387 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7389 dbus_set_method_param(¶ms, "ASPProvisionDiscoveryRequest", g_pd->iface_path, g_dbus);
7391 if (asp_params->deferring == 0)
7392 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
7393 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(asp_params->service_mac));
7395 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
7396 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(asp_params->session_mac));
7397 WDP_LOGD("get peer path [%s]", peer_path);
7399 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
7400 g_variant_builder_add(builder, "{sv}", "peer", g_variant_new_object_path(peer_path));
7402 g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new_uint32(asp_params->adv_id));
7403 g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new_uint32(asp_params->session_id));
7404 g_variant_builder_add(builder, "{sv}", "role", g_variant_new_byte(asp_params->network_role));
7405 g_variant_builder_add(builder, "{sv}", "method", g_variant_new_int32(config_method));
7406 if (asp_params->status > 0)
7407 g_variant_builder_add(builder, "{sv}", "status", g_variant_new_int32(asp_params->status));
7408 if (asp_params->session_information)
7409 g_variant_builder_add(builder, "{sv}", "info", g_variant_new_string(asp_params->session_information));
7411 mac_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
7412 for (i = 0; i < OEM_MACADDR_LEN; i++)
7413 g_variant_builder_add(mac_builder, "y", asp_params->service_mac[i]);
7414 g_variant_builder_add(builder, "{sv}", "adv_mac",
7415 g_variant_new("ay", mac_builder));
7416 g_variant_builder_unref(mac_builder);
7418 mac_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
7419 for (i = 0; i < OEM_MACADDR_LEN; i++)
7420 g_variant_builder_add(mac_builder, "y", asp_params->session_mac[i]);
7421 g_variant_builder_add(builder, "{sv}", "session_mac",
7422 g_variant_new("ay", mac_builder));
7423 g_variant_builder_unref(mac_builder);
7425 value = g_variant_new("(a{sv})", builder);
7426 g_variant_builder_unref(builder);
7427 DEBUG_G_VARIANT("Params : ", value);
7429 params.params = value;
7431 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
7433 WDP_LOGE("Failed to send command to wpa_supplicant");
7435 WDP_LOGD("Succeeded to send connection command to peer[" MACSTR "]", MAC2STR(asp_params->service_mac));
7437 __WDP_LOG_FUNC_EXIT__;
7441 int ws_set_eapol_ip_config(int enable)
7443 __WDP_LOG_FUNC_ENTER__;
7444 GDBusConnection *g_dbus = NULL;
7446 GVariant *value = NULL;
7447 GVariant *param = NULL;
7448 GVariantBuilder *builder = NULL;
7449 GVariantBuilder *type_builder = NULL;
7450 dbus_method_param_s params;
7459 unsigned char eapol_ip[IP_END + 1][OEM_IPADDR_LEN + 1] = {0,};
7462 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
7463 __WDP_LOG_FUNC_EXIT__;
7467 g_dbus = g_pd->g_dbus;
7469 WDP_LOGE("DBus connection is NULL");
7470 __WDP_LOG_FUNC_EXIT__;
7473 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7475 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
7478 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
7480 memset(&eapol_ip, 0x0, (IP_END + 1) * (OEM_IPADDR_LEN + 1));
7482 memcpy(eapol_ip[IP_GO], DEFAULT_IP_GO, OEM_IPADDR_LEN);
7483 memcpy(eapol_ip[IP_MASK], DEFAULT_IP_MASK, OEM_IPADDR_LEN);
7484 memcpy(eapol_ip[IP_START], DEFAULT_IP_START, OEM_IPADDR_LEN);
7485 memcpy(eapol_ip[IP_END], DEFAULT_IP_END, OEM_IPADDR_LEN);
7488 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
7489 for (i = 0; i < OEM_IPADDR_LEN; i++)
7490 g_variant_builder_add(type_builder, "y", eapol_ip[IP_GO][i]);
7491 g_variant_builder_add(builder, "{sv}", "IpAddrGo",
7492 g_variant_new("ay", type_builder));
7493 g_variant_builder_unref(type_builder);
7495 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
7496 for (i = 0; i < OEM_IPADDR_LEN; i++)
7497 g_variant_builder_add(type_builder, "y", eapol_ip[IP_MASK][i]);
7498 g_variant_builder_add(builder, "{sv}", "IpAddrMask",
7499 g_variant_new("ay", type_builder));
7500 g_variant_builder_unref(type_builder);
7502 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
7503 for (i = 0; i < OEM_IPADDR_LEN; i++)
7504 g_variant_builder_add(type_builder, "y", eapol_ip[IP_START][i]);
7505 g_variant_builder_add(builder, "{sv}", "IpAddrStart",
7506 g_variant_new("ay", type_builder));
7507 g_variant_builder_unref(type_builder);
7509 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
7510 for (i = 0; i < OEM_IPADDR_LEN; i++)
7511 g_variant_builder_add(type_builder, "y", eapol_ip[IP_END][i]);
7512 g_variant_builder_add(builder, "{sv}", "IpAddrEnd",
7513 g_variant_new("ay", type_builder));
7514 g_variant_builder_unref(type_builder);
7516 value = g_variant_new("a{sv}", builder);
7517 g_variant_builder_unref(builder);
7519 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
7521 params.params = param;
7523 DEBUG_G_VARIANT("Params : ", param);
7524 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
7526 WDP_LOGE("Failed to send command to wpa_supplicant");
7528 WDP_LOGI("Succeeded to set eapol IP");
7530 __WDP_LOG_FUNC_EXIT__;
7534 int ws_add_vsie(wfd_oem_vsie_frames_e frame_id, const char* vsie)
7536 __WDP_LOG_FUNC_ENTER__;
7537 GDBusConnection *g_dbus = NULL;
7538 GVariant *value = NULL;
7539 GVariantBuilder *bytearray_builder = NULL;
7540 dbus_method_param_s params;
7543 size_t vsie_len = 0;
7545 unsigned char *bytearray = NULL;
7546 size_t bytearray_len = 0;
7548 if (frame_id >= WFD_OEM_VSIE_FRAME_MAX ||
7550 WDP_LOGE("Invalid parameter");
7555 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
7556 __WDP_LOG_FUNC_EXIT__;
7560 g_dbus = g_pd->g_dbus;
7562 WDP_LOGE("DBus connection is NULL");
7563 __WDP_LOG_FUNC_EXIT__;
7567 vsie_len = strlen(vsie);
7568 if (vsie_len == 0) {
7569 WDP_LOGE("vsie length is zero");
7570 __WDP_LOG_FUNC_EXIT__;
7574 bytearray_len = (vsie_len % 2) ? ((vsie_len / 2) + 1) : (vsie_len / 2);
7576 bytearray = (unsigned char *) g_try_malloc0(bytearray_len);
7577 if (bytearray == NULL) {
7578 WDP_LOGE("Failed to allocate memory to bytearray");
7579 __WDP_LOG_FUNC_EXIT__;
7583 if (__ws_hex_str_to_bin(vsie, bytearray, bytearray_len) < 0) {
7584 WDP_LOGE("invalid vsie string");
7586 __WDP_LOG_FUNC_EXIT__;
7590 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7591 dbus_set_method_param(¶ms, "VendorElemAdd", g_pd->iface_path,
7594 bytearray_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
7595 for (i = 0; i < bytearray_len; i++)
7596 g_variant_builder_add(bytearray_builder, "y", bytearray[i]);
7598 value = g_variant_new("(iay)", frame_id, bytearray_builder);
7599 g_variant_builder_unref(bytearray_builder);
7601 params.params = value;
7603 res = dbus_method_call(¶ms, SUPPLICANT_IFACE, NULL, NULL);
7605 WDP_LOGE("Failed to send command to wpa_supplicant");
7607 __WDP_LOG_FUNC_EXIT__;
7611 WDP_LOGD("Succeeded to add vsie: Frame ID [%d], VSIE [%s]", frame_id,
7615 __WDP_LOG_FUNC_EXIT__;
7619 int ws_get_vsie(wfd_oem_vsie_frames_e frame_id, char **vsie)
7621 __WDP_LOG_FUNC_ENTER__;
7622 GDBusConnection *g_dbus = NULL;
7623 GVariant *param = NULL;
7624 GVariant *reply = NULL;
7625 GError *error = NULL;
7627 if (frame_id >= WFD_OEM_VSIE_FRAME_MAX ||
7629 WDP_LOGE("Invalid parameter");
7630 __WDP_LOG_FUNC_EXIT__;
7635 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
7636 __WDP_LOG_FUNC_EXIT__;
7640 g_dbus = g_pd->g_dbus;
7642 WDP_LOGE("DBus connection is NULL");
7643 __WDP_LOG_FUNC_EXIT__;
7647 param = g_variant_new("(i)", frame_id);
7649 reply = g_dbus_connection_call_sync(
7651 SUPPLICANT_SERVICE, /* bus name */
7652 g_pd->iface_path, /* object path */
7653 SUPPLICANT_IFACE, /* interface name */
7654 "VendorElemGet", /* method name */
7655 param, /* GVariant *params */
7656 NULL, /* reply_type */
7657 G_DBUS_CALL_FLAGS_NONE, /* flags */
7658 SUPPLICANT_TIMEOUT, /* timeout */
7659 NULL, /* cancellable */
7660 &error); /* error */
7662 if (error != NULL) {
7663 WDP_LOGE("Error! Failed to get vsie: [%s]", error->message);
7664 g_error_free(error);
7666 g_variant_unref(reply);
7667 __WDP_LOG_FUNC_EXIT__;
7671 if (reply != NULL) {
7672 DEBUG_G_VARIANT("Reply : ", reply);
7674 GVariantIter *iter = NULL;
7675 unsigned char *vsie_bytes = NULL;
7678 g_variant_get(reply, "(ay)", &iter);
7680 WDP_LOGD("vsie is not present");
7681 __WDP_LOG_FUNC_EXIT__;
7685 vsie_len = __ws_unpack_ay_malloc(&vsie_bytes, iter);
7686 if (vsie_bytes == NULL) {
7687 WDP_LOGD("vsie_bytes not allocated");
7688 __WDP_LOG_FUNC_EXIT__;
7692 __ws_byte_to_txt(vsie_bytes, vsie, vsie_len);
7695 WDP_LOGE("vsie not allocated.");
7696 __WDP_LOG_FUNC_EXIT__;
7703 WDP_LOGD("Succeeded to get vsie: Frame ID [%d], VSIE [%s]", frame_id,
7705 __WDP_LOG_FUNC_EXIT__;
7709 int ws_remove_vsie(wfd_oem_vsie_frames_e frame_id, const char *vsie)
7711 __WDP_LOG_FUNC_ENTER__;
7712 GDBusConnection *g_dbus = NULL;
7713 GVariantBuilder *bytearray_builder = NULL;
7714 GVariant *value = NULL;
7715 dbus_method_param_s params;
7718 size_t vsie_len = 0;
7720 unsigned char *bytearray = NULL;
7721 size_t bytearray_len = 0;
7723 if (frame_id >= WFD_OEM_VSIE_FRAME_MAX ||
7725 WDP_LOGE("Invalid parameter");
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 vsie_len = strlen(vsie);
7743 if (vsie_len == 0) {
7744 WDP_LOGE("vsie length is zero");
7745 __WDP_LOG_FUNC_EXIT__;
7749 bytearray_len = (vsie_len % 2) ? ((vsie_len / 2) + 1) : (vsie_len / 2);
7751 bytearray = (unsigned char *) g_try_malloc0(bytearray_len);
7752 if (bytearray == NULL) {
7753 WDP_LOGE("Failed to allocate memory to bytearray");
7754 __WDP_LOG_FUNC_EXIT__;
7758 if (__ws_hex_str_to_bin(vsie, bytearray, bytearray_len) < 0) {
7759 WDP_LOGE("invalid vsie string");
7761 __WDP_LOG_FUNC_EXIT__;
7765 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7766 dbus_set_method_param(¶ms, "VendorElemRem", g_pd->iface_path,
7769 bytearray_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
7770 for (i = 0; i < bytearray_len; i++)
7771 g_variant_builder_add(bytearray_builder, "y", bytearray[i]);
7773 value = g_variant_new("(iay)", frame_id, bytearray_builder);
7774 g_variant_builder_unref(bytearray_builder);
7776 params.params = value;
7778 res = dbus_method_call(¶ms, SUPPLICANT_IFACE, NULL, NULL);
7780 WDP_LOGE("Failed to send command to wpa_supplicant");
7782 __WDP_LOG_FUNC_EXIT__;
7786 WDP_LOGD("Succeeded to remove vsie: Frame ID [%d], VSIE [%s]", frame_id,
7789 __WDP_LOG_FUNC_EXIT__;
7793 int ws_set_supported_wps_mode(int wps_mode)
7795 __WDP_LOG_FUNC_ENTER__;
7796 char config_value[DBUS_OBJECT_PATH_MAX+1] = {0,};
7798 int new_wps_mode = wps_mode;
7802 WDP_LOGE("no configurable data found");
7803 __WDP_LOG_FUNC_EXIT__;
7807 if (new_wps_mode == 0) {
7808 WDP_LOGE("Reset to default value");
7809 new_wps_mode = WFD_OEM_WPS_MODE_PBC|WFD_OEM_WPS_MODE_DISPLAY|WFD_OEM_WPS_MODE_KEYPAD;
7812 if (new_wps_mode & WFD_OEM_WPS_MODE_KEYPAD) {
7813 g_strlcat(config_value, "keypad ", sizeof(config_value));
7816 if (new_wps_mode & WFD_OEM_WPS_MODE_PBC) {
7817 g_strlcat(config_value, "virtual_push_button ", sizeof(config_value));
7820 if (new_wps_mode & WFD_OEM_WPS_MODE_DISPLAY) {
7821 g_strlcat(config_value, "physical_display ", sizeof(config_value));
7824 config_value[length-1] = 0;
7825 g_strlcpy(config->config_methods, config_value, OEM_CONFIG_METHOD_LEN);
7826 WDP_LOGD("config_value = %s, length = %d", config_value, length-1);
7827 res = __ws_set_config_methods();
7829 WDP_LOGE("Failed to set config method");
7830 __WDP_LOG_FUNC_EXIT__;
7833 wps_config_method = new_wps_mode;
7834 __WDP_LOG_FUNC_EXIT__;
7838 static int _ws_remove_persistent_group_by_object_path(const char *object_path)
7840 __WDP_LOG_FUNC_ENTER__;
7841 GDBusConnection *g_dbus = NULL;
7842 dbus_method_param_s params;
7846 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
7847 __WDP_LOG_FUNC_EXIT__;
7851 g_dbus = g_pd->g_dbus;
7853 WDP_LOGE("DBus connection is NULL");
7854 __WDP_LOG_FUNC_EXIT__;
7858 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7859 dbus_set_method_param(¶ms, "RemovePersistentGroup",
7860 g_pd->iface_path, g_dbus);
7861 params.params = g_variant_new("(o)", object_path);
7863 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
7865 WDP_LOGE("Failed to send command to wpa_supplicant");
7866 __WDP_LOG_FUNC_EXIT__;
7871 WDP_LOGD("Succeeded to remove persistent group");;
7872 __WDP_LOG_FUNC_EXIT__;
7876 int ws_remove_persistent_device(unsigned char *mac_addr)
7878 __WDP_LOG_FUNC_ENTER__;
7879 GDBusConnection *g_dbus = NULL;
7880 ws_network_info_s networks[WS_MAX_PERSISTENT_COUNT];
7883 int need_delete = 0;
7887 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
7888 __WDP_LOG_FUNC_EXIT__;
7892 g_dbus = g_pd->g_dbus;
7894 WDP_LOGE("DBus connection is NULL");
7895 __WDP_LOG_FUNC_EXIT__;
7898 memset(&networks, 0x0, WS_MAX_PERSISTENT_COUNT * sizeof(ws_network_info_s));
7899 dbus_property_get_all(g_pd->iface_path, g_dbus, SUPPLICANT_P2PDEVICE,
7900 __ws_extract_p2pdevice_details, networks);
7902 cnt = networks[0].total;
7904 WDP_LOGD("Persistent Group Count=%d", cnt);
7905 if (cnt > WS_MAX_PERSISTENT_COUNT) {
7906 WDP_LOGE("Persistent group count exceeded or parsing error");
7907 __WDP_LOG_FUNC_EXIT__;
7911 for (i = 0 ; i < cnt ; i++) {
7915 WDP_LOGD("----persistent group [%d]----", i);
7916 WDP_LOGD("network_id [%d]", networks[i].network_id);
7917 WDP_LOGD("ssid [%s]", networks[i].ssid);
7918 WDP_LOGD("bssid ["MACSTR"]", MAC2STR(networks[i].bssid));
7919 WDP_LOGD("p2p_client_num [%d]", networks[i].p2p_client_num);
7920 for (j = 0; j < networks[i].p2p_client_num; j++) {
7921 WDP_LOGD("p2p_client_list ["MACSTR"]", MAC2STR(networks[i].p2p_client_list[j]));
7924 WDP_LOGD("mac_addr ["MACSTR"]", MAC2STR(mac_addr));
7926 if (memcmp(mac_addr, networks[i].bssid, WS_MACADDR_LEN) == 0) {
7927 WDP_LOGD("Persistent group owner found [%d: "MACSTR"]", networks[i].network_id, MAC2STR(mac_addr));
7931 if (need_delete == 0) {
7932 for (j = 0; j < networks[i].p2p_client_num; j++) {
7933 if (!memcmp(mac_addr, networks[i].p2p_client_list[j], WS_MACADDR_LEN)) {
7934 WDP_LOGD("Persistent group client found [%d: "MACSTR"]", networks[i].network_id, MAC2STR(mac_addr));
7941 res = _ws_remove_persistent_group_by_object_path(networks[i].persistent_path);
7942 WDP_LOGI("persistent group deleted [%s]", networks[i].persistent_path);
7944 WDP_LOGE("Failed to _ws_remove_persistent_group_by_object_path");
7946 WDP_LOGD("Succeeded to _ws_remove_persistent_group_by_object_path");
7951 __WDP_LOG_FUNC_EXIT__;
7955 int ws_remove_all_persistent_device(void)
7957 __WDP_LOG_FUNC_ENTER__;
7958 GDBusConnection *g_dbus = NULL;
7959 dbus_method_param_s params;
7962 g_dbus = g_pd->g_dbus;
7964 WDP_LOGE("DBus connection is NULL");
7965 __WDP_LOG_FUNC_EXIT__;
7968 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7970 dbus_set_method_param(¶ms, "RemoveAllPersistentGroups", g_pd->iface_path, g_dbus);
7971 params.params = NULL;
7973 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
7975 WDP_LOGE("Failed to RemoveAllPersistentGroups");
7977 WDP_LOGD("Succeeded to RemoveAllPersistentGroups");
7981 WDP_LOGD("Succeeded to remove all network");
7982 __WDP_LOG_FUNC_EXIT__;
7986 static void __ws_get_supported_channels_reply(GVariant *reply, void *user_data)
7988 __WDP_LOG_FUNC_ENTER__;
7990 GVariantIter *iter = NULL;
7991 wfd_oem_supported_channels_s *data = (wfd_oem_supported_channels_s *)user_data;
7996 g_variant_get(reply, "(ai)", &iter);
7998 while (g_variant_iter_loop(iter, "i", &channel))
7999 data->channels[data->count++] = channel;
8001 g_variant_iter_free (iter);
8004 WDP_LOGE("Reply is NULL");
8006 __WDP_LOG_FUNC_EXIT__;
8009 int ws_get_supported_channels(wfd_oem_supported_channels_s *data)
8011 __WDP_LOG_FUNC_ENTER__;
8013 dbus_method_param_s params;
8016 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
8017 __WDP_LOG_FUNC_EXIT__;
8021 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
8022 memset(data, 0x0, sizeof(wfd_oem_supported_channels_s));
8024 dbus_set_method_param(¶ms, "GetSupportedChannels", g_pd->iface_path, g_pd->g_dbus);
8025 params.params = NULL;
8027 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE,
8028 __ws_get_supported_channels_reply, data);
8030 WDP_LOGE("Failed to GetSupportedChannels");
8032 WDP_LOGD("Succeeded to GetSupportedChannels");
8035 __WDP_LOG_FUNC_EXIT__;