2 * Network Configuration Module
4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
21 * This file implements wifi direct wpasupplicant dbus plugin functions.
23 * @file wfd-plugin-dbus-wpasupplicant.c
24 * @author Jiung Yu (jiung.yu@samsung.com)
31 #include <sys/types.h>
33 #include <sys/socket.h>
40 #include <sys/ioctl.h>
46 #include <tzplatform_config.h>
48 #include "wifi-direct-oem.h"
49 #include "wfd-plugin-log.h"
50 #include "dbus/wfd-plugin-supplicant-dbus.h"
51 #include "wfd-plugin-wpasupplicant.h"
53 #define GLIST_ITER_START(arg_list, elem)\
55 temp = g_list_first(arg_list);\
58 temp = g_list_next(temp);\
60 #define GLIST_ITER_END() }
62 #define NETCONFIG_SERVICE "net.netconfig"
63 #define NETCONFIG_WIFI_INTERFACE "net.netconfig.wifi"
64 #define NETCONFIG_WIFI_PATH "/net/netconfig/wifi"
66 #define NETCONFIG_DBUS_REPLY_TIMEOUT (10 * 1000)
68 #define CONF_FILE_PATH tzplatform_mkpath(TZ_SYS_ETC, "wpa_supplicant/wpa_supplicant.conf")
69 #define MAX_FILE_PATH_LEN 256
71 static wfd_oem_ops_s supplicant_ops = {
72 .configure = ws_configure,
75 .activate = ws_activate,
76 .deactivate = ws_deactivate,
78 .start_scan = ws_start_scan,
79 .stop_scan = ws_stop_scan,
80 .get_visibility = ws_get_visibility,
81 .set_visibility = ws_set_visibility,
82 .get_scan_result = ws_get_scan_result,
83 .get_peer_info = ws_get_peer_info,
85 .prov_disc_req = ws_prov_disc_req,
87 .connect = ws_connect,
88 .disconnect = ws_disconnect,
89 .reject_connection = ws_reject_connection,
90 .cancel_connection = ws_cancel_connection,
92 .get_connected_peers = ws_get_connected_peers,
93 .get_pin = ws_get_pin,
94 .set_pin = ws_set_pin,
95 .generate_pin = ws_generate_pin,
96 .get_supported_wps_mode = ws_get_supported_wps_mode,
98 .create_group = ws_create_group,
99 .destroy_group = ws_destroy_group,
101 .wps_start = ws_wps_start,
102 .enrollee_start = ws_enrollee_start,
103 .wps_cancel = ws_wps_cancel,
105 .get_dev_name = ws_get_dev_name,
106 .set_dev_name = ws_set_dev_name,
107 .get_dev_mac = ws_get_dev_mac,
108 .get_dev_type = ws_get_dev_type,
109 .set_dev_type = ws_set_dev_type,
110 .get_go_intent = ws_get_go_intent,
111 .set_go_intent = ws_set_go_intent,
112 .set_country = ws_set_country,
113 .get_persistent_groups = ws_get_persistent_groups,
114 .remove_persistent_group = ws_remove_persistent_group,
115 .set_persistent_reconnect = ws_set_persistent_reconnect,
117 .start_service_discovery = ws_start_service_discovery,
118 .cancel_service_discovery = ws_cancel_service_discovery,
120 .serv_add = ws_serv_add,
121 .serv_del = ws_serv_del,
123 .miracast_init = ws_miracast_init,
124 .set_display = ws_set_display,
126 .refresh = ws_refresh,
127 .save_config = ws_save_config,
128 .set_operating_channel = ws_set_operating_channel,
129 .remove_all_network = ws_remove_all_network,
130 .get_wpa_status = ws_get_wpa_status,
132 .advertise_service = ws_advertise_service,
133 .cancel_advertise_service = ws_cancel_advertise_service,
134 .seek_service = ws_seek_service,
135 .cancel_seek_service = ws_cancel_seek_service,
136 .asp_prov_disc_req = ws_asp_prov_disc_req,
138 .set_eapol_ip_config = ws_set_eapol_ip_config,
140 .add_vsie = ws_add_vsie,
141 .get_vsie = ws_get_vsie,
142 .remove_vsie = ws_remove_vsie,
143 .set_supported_wps_mode = ws_set_supported_wps_mode,
144 .remove_persistent_device = ws_remove_persistent_device,
145 .remove_all_persistent_device = ws_remove_all_persistent_device,
147 .get_supported_channels = ws_get_supported_channels,
152 static ws_dbus_plugin_data_s *g_pd;
153 static wfd_oem_config_s *config = NULL;
154 static int is_peer_joined_notified = 0;
155 static int is_peer_disconnected_notified = 0;
156 static int wps_config_method = WFD_OEM_WPS_MODE_PBC|WFD_OEM_WPS_MODE_DISPLAY|WFD_OEM_WPS_MODE_KEYPAD;
158 static GList *service_list;
159 static GList *seek_list;
161 static int __ws_txt_to_mac(unsigned char *txt, unsigned char *mac)
166 WDP_LOGE("Invalid parameter");
171 mac[i++] = (char) strtoul((char *)txt, (char **)&txt, 16);
172 if (!*txt++ || i == 6)
176 if (i != WS_MACADDR_LEN)
179 WDP_LOGD("Converted MAC address [" MACSECSTR "]", MAC2SECSTR(mac));
183 static int __ws_mac_compact_to_normal(char *compact, unsigned char *mac)
185 g_snprintf((char *)mac, OEM_MACSTR_LEN, "%c%c:%c%c:%c%c:%c%c:%c%c:%c%c",
186 compact[0], compact[1], compact[2], compact[3],
187 compact[4], compact[5], compact[6], compact[7],
188 compact[8], compact[9], compact[10], compact[11]);
192 static const char *__ws_wps_to_txt(int wps_mode)
195 case WFD_OEM_WPS_MODE_PBC:
196 return WS_DBUS_STR_PBC;
197 case WFD_OEM_WPS_MODE_DISPLAY:
198 return WS_DBUS_STR_DISPLAY;
199 case WFD_OEM_WPS_MODE_KEYPAD:
200 return WS_DBUS_STR_KEYPAD;
201 case WFD_OEM_WPS_MODE_NONE:
202 case WFD_OEM_WPS_MODE_P2PS:
203 return WS_DBUS_STR_P2PS;
209 static int __ws_hex_char_to_num(char c)
211 if (c >= '0' && c <= '9')
214 if (c >= 'a' && c <= 'f')
217 if (c >= 'A' && c <= 'F')
223 static int __ws_hex_to_byte(const char *hex)
227 a = __ws_hex_char_to_num(*hex++);
231 b = __ws_hex_char_to_num(*hex++);
238 static int __ws_hex_str_to_bin(const char *hex, unsigned char *buf, size_t len)
242 const char *ipos = hex;
243 unsigned char *opos = buf;
245 for (i = 0; i < len; i++) {
246 a = __ws_hex_to_byte(ipos);
257 static int __ws_byte_to_hex(char *buf, int buf_size, unsigned char *data, int data_len)
261 char *end = buf + buf_size;
265 for (i = 0; i < data_len; i++) {
266 ret = snprintf(pos, end - pos, "%02x", data[i]);
267 if (ret < 0 || ret >= end - pos) {
277 static int __ws_hex_to_num(char *src, int len)
282 if (!src || len < 0) {
283 WDP_LOGE("Invalid parameter");
287 temp = (char*) g_try_malloc0(len+1);
289 WDP_LOGE("Failed to allocate memory");
293 memcpy(temp, src, len);
294 num = strtoul(temp, NULL, 16);
300 static int __ws_segment_to_service(char *segment, wfd_oem_new_service_s **service)
302 wfd_oem_new_service_s *serv_tmp = NULL;
307 if (!segment || !service) {
308 WDP_LOGE("Invalid parameter");
313 WDP_LOGD("Segment: %s", segment);
315 serv_tmp = (wfd_oem_new_service_s*) g_try_malloc0(sizeof(wfd_oem_new_service_s));
317 WDP_LOGE("Failed to allocate memory for service");
321 serv_tmp->protocol = __ws_hex_to_num(ptr, 2);
322 serv_tmp->trans_id = __ws_hex_to_num(ptr+2, 2);
323 serv_tmp->status = __ws_hex_to_num(ptr+4, 2);
325 WDP_LOGD("Protocol[%d], Transaction ID[%d], Status[%d]", serv_tmp->protocol, serv_tmp->trans_id, serv_tmp->status);
327 if (serv_tmp->status != 0) {
328 WDP_LOGE("Service status is not success");
333 if (serv_tmp->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
334 WDP_LOGD("===== Bonjour service =====");
335 char compr[5] = {0, };
336 char query[256] = {0, };
337 char rdata[256] = {0, };
340 while (*ptr != 0 && strncmp(ptr, "c0", 2)) {
341 unsigned long int size = 0;
342 char temp_str[3] = {0,};
343 memcpy(temp_str, ptr, 2);
344 size = strtoul(temp_str, NULL, 16);
347 temp = (char*) calloc(1, size + 2);
350 for (i = 0; i < size; i++) {
351 temp[i+1] = (char) __ws_hex_to_num(ptr, 2);
354 g_strlcat(query, temp, sizeof(query));
361 if (!strncmp(ptr, "c0", 2)) {
362 memcpy(compr, ptr, 4);
365 if (!strncmp(ptr, "27", 2)) {
366 WDP_LOGD("Segment ended");
370 dns_type = __ws_hex_to_num(ptr, 4);
372 if (dns_type == 12) {
373 if (!strncmp(compr, "c011", 4))
374 g_strlcat(query, ".local.", sizeof(query));
375 else if (!strncmp(compr, "c00c", 4))
376 g_strlcat(query, "._tcp.local.", sizeof(query));
377 else if (!strncmp(compr, "c01c", 4))
378 g_strlcat(query, "._udp.local.", sizeof(query));
382 serv_tmp->data.bonjour.query = strdup(query + 1);
383 while (*ptr != 0 && strncmp(ptr, "c0", 2)) {
384 unsigned long int size = 0;
385 char temp_str[3] = {0,};
386 memcpy(temp_str, ptr, 2);
387 size = strtoul(temp_str, NULL, 16);
390 temp = (char*) g_try_malloc0(size + 2);
393 for (i = 0; i < size; i++) {
394 temp[i+1] = (char) __ws_hex_to_num(ptr, 2);
397 g_strlcat(rdata, temp, sizeof(rdata));
403 serv_tmp->data.bonjour.rdata = strdup(rdata + 1);
405 WDP_LOGD("Query: %s", serv_tmp->data.bonjour.query);
406 WDP_LOGD("RData: %s", serv_tmp->data.bonjour.rdata);
408 WDP_LOGE("Not supported yet. Only bonjour service supproted [%d]",
419 static void __ws_path_to_addr(char *peer_path,
420 unsigned char *dev_addr, GVariant *parameter)
422 __WDP_LOG_FUNC_ENTER__;
424 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
425 const char *path = NULL;
428 g_variant_get(parameter, "(&o)", &path);
429 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
430 WDP_LOGD("Retrive Added path [%s]", peer_path);
432 loc = strrchr(peer_path, '/');
434 __ws_mac_compact_to_normal(loc + 1, peer_dev);
436 __ws_txt_to_mac(peer_dev, dev_addr);
437 WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(dev_addr));
439 __WDP_LOG_FUNC_EXIT__;
443 static int __ws_unpack_ay(unsigned char *dst, GVariant *src, int size)
445 GVariantIter *iter = NULL;
448 if (!dst || !src || size == 0) {
449 WDP_LOGE("Invalid parameter");
452 g_variant_get(src, "ay", &iter);
454 WDP_LOGE("failed to get iterator");
458 while (g_variant_iter_loop(iter, "y", &dst[length])) {
463 g_variant_iter_free(iter);
468 static int __ws_byte_to_txt(const unsigned char *src, char **dst, int src_len)
470 __WDP_LOG_FUNC_ENTER__;
477 WDP_LOGE("Invalid parameter.");
478 __WDP_LOG_FUNC_EXIT__;
482 *dst = (char *) g_try_malloc0((2*src_len)+1);
484 WDP_LOGE("failed to allocate memory to buffer.");
485 __WDP_LOG_FUNC_EXIT__;
491 for (i = 0; i < src_len; i++) {
492 snprintf(buf, 3, "%02x", src[i]);
497 __WDP_LOG_FUNC_EXIT__;
501 static int __ws_unpack_ay_malloc(unsigned char **dst, GVariantIter *iter)
503 GVariantIter *iter_copy = NULL;
506 unsigned char *tmp_dst = NULL;
508 if (!dst || *dst || !iter) {
509 WDP_LOGE("Invalid parameter");
513 iter_copy = g_variant_iter_copy(iter);
515 while (g_variant_iter_loop(iter, "y", &tmp))
517 g_variant_iter_free(iter);
519 tmp_dst = (unsigned char *)g_try_malloc0(length + 1);
521 WDP_LOGE("failed to allocate memory");
522 g_variant_iter_free(iter_copy);
527 while (g_variant_iter_loop(iter_copy, "y", &tmp_dst[length]))
529 g_variant_iter_free(iter_copy);
535 tmp_dst[length] = '\0';
539 WDP_LOGD("Length [%d]", length);
543 static int __parsing_wfd_info(unsigned char *wfd_dev_info,
544 wfd_oem_display_s* display)
546 __WDP_LOG_FUNC_ENTER__;
549 if (!wfd_dev_info || !display) {
550 WDP_LOGE("Invalid parameter");
551 __WDP_LOG_FUNC_EXIT__;
555 wfd_info = (wfd_dev_info[3]<<8 | wfd_dev_info[4]);
557 if (wfd_info & WS_WFD_INFO_PRIMARY_SINK)
558 display->type |= WS_WFD_INFO_PRIMARY_SINK;
559 if (wfd_info & WS_WFD_INFO_SECONDARY_SINK)
560 display->type |= WS_WFD_INFO_SECONDARY_SINK;
562 display->availability = (wfd_info & WS_WFD_INFO_AVAILABILITY) >> 4;
563 display->hdcp_support = (wfd_info & WS_WFD_INFO_HDCP_SUPPORT) >> 8;
565 display->port = (wfd_dev_info[5]<<8 | wfd_dev_info[6]);
566 display->max_tput = (wfd_dev_info[7]<<8 | wfd_dev_info[8]);
568 WDP_LOGD("type [%d],availability [%d],hdcp_support [%d],ctrl_port [%d] "
569 "max_tput[%d]", display->type, display->availability,
570 display->hdcp_support, display->port, display->max_tput);
572 __WDP_LOG_FUNC_EXIT__;
576 static int _ws_get_local_dev_mac(unsigned char *dev_mac)
578 __WDP_LOG_FUNC_ENTER__;
580 char file_path[MAX_FILE_PATH_LEN] = {0, };
581 char local_mac[OEM_MACSTR_LEN] = {0, };
584 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
587 g_snprintf(file_path, sizeof(file_path),
588 "/sys/class/net/%s/address", config->p2p_ifname);
590 fd = fopen(file_path, "r");
592 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
593 WDP_LOGE("Failed to open MAC info file [%s] (%s)", file_path, error_buf);
594 __WDP_LOG_FUNC_EXIT__;
599 ptr = fgets((char *)local_mac, WS_MACSTR_LEN, fd);
601 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
602 WDP_LOGE("Failed to read file or no data read(%s)", error_buf);
604 __WDP_LOG_FUNC_EXIT__;
607 WDP_SECLOGD("Local MAC address [%s]", ptr);
608 WDP_SECLOGD("Local MAC address [%s]", local_mac);
610 res = __ws_txt_to_mac((unsigned char *)local_mac, dev_mac);
612 WDP_LOGE("Failed to convert text to MAC address");
614 __WDP_LOG_FUNC_EXIT__;
618 WDP_LOGD("Local Device MAC address [" MACSECSTR "]", MAC2SECSTR(dev_mac));
621 __WDP_LOG_FUNC_EXIT__;
625 static void _ws_process_interface_removed(GDBusConnection *connection,
626 const gchar *sender, const gchar *object_path, const gchar *interface,
627 const gchar *signal, GVariant *parameters, gpointer user_data)
629 __WDP_LOG_FUNC_ENTER__;
630 static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
631 const char *path = NULL;
633 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
636 WDP_LOGD("Ignoring event");
637 __WDP_LOG_FUNC_EXIT__;
641 g_variant_get(parameters, "(&o)", &path);
642 g_strlcpy(interface_path, path, DBUS_OBJECT_PATH_MAX);
644 WDP_LOGD("Retrive removed path [%s]", interface_path);
646 if (!g_strcmp0(g_pd->group_iface_path, interface_path)) {
647 WDP_LOGD("p2p group interface removed");
648 memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
649 } else if (!g_strcmp0(g_pd->iface_path, interface_path)) {
651 WDP_LOGD("p2p interface removed");
652 wfd_oem_event_s event;
656 memset(&event, 0x0, sizeof(wfd_oem_event_s));
657 event.event_id = WFD_OEM_EVENT_DEACTIVATED;
658 if (g_pd->callback && g_pd->callback->deactivated_cb)
659 g_pd->callback->deactivated_cb(&event);
661 memset(g_pd->iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
663 __WDP_LOG_FUNC_EXIT__;
668 const char *interface;
670 void (*function) (GDBusConnection *connection,
671 const gchar *sender, const gchar *object_path, const gchar *interface,
672 const gchar *signal, GVariant *parameters, gpointer user_data);
673 } ws_supplicant_signal_map[] = {
676 SUPPLICANT_INTERFACE,
678 _ws_process_interface_removed
688 static void __ws_get_peer_property(const char *key, GVariant *value, void *user_data)
690 __WDP_LOG_FUNC_ENTER__;
692 wfd_oem_device_s *peer = (wfd_oem_device_s *)user_data;
694 __WDP_LOG_FUNC_EXIT__;
698 CHECK_KEY_VALUE(key, value);
700 if (g_strcmp0(key, "DeviceName") == 0) {
701 const char *name = NULL;
703 g_variant_get(value, "&s", &name);
704 g_strlcpy(peer->dev_name, name, WS_SSID_LEN + 1);
705 WDP_LOGD("Device name [%s]", peer->dev_name);
707 } else if (g_strcmp0(key, "config_method") == 0) {
708 int config_methods = 0;
709 g_variant_get(value, "q", &config_methods);
711 if (config_methods & WS_CONFIG_METHOD_DISPLAY)
712 peer->config_methods |= WFD_OEM_WPS_MODE_DISPLAY;
713 if (config_methods & WS_CONFIG_METHOD_PUSHBUTTON)
714 peer->config_methods |= WFD_OEM_WPS_MODE_PBC;
715 if (config_methods & WS_CONFIG_METHOD_KEYPAD)
716 peer->config_methods |= WFD_OEM_WPS_MODE_KEYPAD;
717 WDP_LOGD("Config method [0x%x]", peer->config_methods);
719 } else if (g_strcmp0(key, "level") == 0) {
722 g_variant_get(value, "i", &rssi);
724 WDP_LOGD("Peer RSSI [%d]", peer->rssi);
726 } else if (g_strcmp0(key, "devicecapability") == 0) {
727 unsigned char devicecapability = 0;
729 g_variant_get(value, "y", &devicecapability);
730 peer->dev_flags = (int)devicecapability;
731 WDP_LOGD("Device Capa [0x%02x]", peer->dev_flags);
733 } else if (g_strcmp0(key, "groupcapability") == 0) {
734 unsigned char groupcapability = 0;
736 g_variant_get(value, "y", &groupcapability);
737 WDP_LOGD("Group Capa [0x%02x]", groupcapability);
738 if (groupcapability & WS_GROUP_CAP_GROUP_OWNER) {
739 peer->group_flags = WFD_OEM_GROUP_FLAG_GROUP_OWNER;
740 peer->dev_role = WFD_OEM_DEV_ROLE_GO;
742 if (groupcapability & WS_GROUP_CAP_PERSISTENT_GROUP)
743 peer->group_flags = WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
745 } else if (g_strcmp0(key, "PrimaryDeviceType") == 0) {
746 unsigned char primarydevicetype[WS_DEVTYPE_LEN] = {0,};
748 if (__ws_unpack_ay(primarydevicetype, value, WS_DEVTYPE_LEN)) {
749 peer->pri_dev_type = primarydevicetype[1];
750 peer->sec_dev_type = primarydevicetype[WS_DEVTYPE_LEN -1];
752 } else if (g_strcmp0(key, "SecondaryDeviceTypes") == 0) {
753 } else if (g_strcmp0(key, "VendorExtension") == 0) {
754 } else if (g_strcmp0(key, "IEs") == 0) {
755 unsigned char ies[WFD_SUBELEM_LEN_DEV_INFO + 3] = {0,};
757 if (__ws_unpack_ay(ies, value, WFD_SUBELEM_LEN_DEV_INFO + 3))
758 __parsing_wfd_info(ies, &(peer->display));
759 } else if (g_strcmp0(key, "DeviceAddress") == 0) {
761 if (__ws_unpack_ay(peer->dev_addr, value, WS_MACADDR_LEN))
762 WDP_LOGD("Device address [" MACSTR "]", MAC2STR(peer->dev_addr));
764 } else if (g_strcmp0(key, "InterfaceAddress") == 0) {
766 if (__ws_unpack_ay(peer->intf_addr, value, WS_MACADDR_LEN))
767 WDP_LOGD("Interface address [" MACSTR "]", MAC2STR(peer->intf_addr));
769 } else if (g_strcmp0(key, "GODeviceAddress") == 0) {
771 if (__ws_unpack_ay(peer->go_dev_addr, value, WS_MACADDR_LEN))
772 WDP_LOGD("GODevice address [" MACSTR "]", MAC2STR(peer->go_dev_addr));
774 if (!ISZEROMACADDR(peer->go_dev_addr))
775 peer->dev_role = WFD_OEM_DEV_ROLE_GC;
777 } else if (g_strcmp0(key, "VSIE") == 0) {
779 unsigned char vsie[OEM_VSIE_MAX_LEN] = {0,};
781 vsie_len = __ws_unpack_ay(vsie, value, OEM_VSIE_MAX_LEN);
783 __ws_byte_to_txt(vsie, (char **)&(peer->vsie), vsie_len);
784 WDP_LOGD("VSIE [%s]", peer->vsie);
788 WDP_LOGD("Unknown value");
790 __WDP_LOG_FUNC_EXIT__;
794 static void __ws_peer_property(const char *key, GVariant *value, void *user_data)
796 __WDP_LOG_FUNC_ENTER__;
798 __WDP_LOG_FUNC_EXIT__;
802 wfd_oem_dev_data_s *peer = (wfd_oem_dev_data_s *)user_data;
804 CHECK_KEY_VALUE(key, value);
806 if (g_strcmp0(key, "DeviceName") == 0) {
807 const char *name = NULL;
809 g_variant_get(value, "&s", &name);
810 g_strlcpy(peer->name, name, WS_SSID_LEN + 1);
811 WDP_LOGD("Device Name [%s]", peer->name);
813 } else if (g_strcmp0(key, "config_method") == 0) {
814 int config_methods = 0;
816 g_variant_get(value, "q", &config_methods);
818 if (config_methods & WS_CONFIG_METHOD_DISPLAY)
819 peer->config_methods |= WFD_OEM_WPS_MODE_DISPLAY;
820 if (config_methods & WS_CONFIG_METHOD_PUSHBUTTON)
821 peer->config_methods |= WFD_OEM_WPS_MODE_PBC;
822 if (config_methods & WS_CONFIG_METHOD_KEYPAD)
823 peer->config_methods |= WFD_OEM_WPS_MODE_KEYPAD;
824 WDP_LOGD("Config method [0x%x]", peer->config_methods);
826 } else if (g_strcmp0(key, "level") == 0) {
829 g_variant_get(value, "i", &rssi);
831 WDP_LOGD("Peer RSSI [%d]", peer->rssi);
833 } else if (g_strcmp0(key, "devicecapability") == 0) {
834 unsigned char devicecapability = 0;
836 g_variant_get(value, "y", &devicecapability);
837 peer->dev_flags = (int)devicecapability;
838 WDP_LOGD("Device Capa [0x%02x]", peer->dev_flags);
840 } else if (g_strcmp0(key, "groupcapability") == 0) {
841 unsigned char groupcapability = 0;
843 g_variant_get(value, "y", &groupcapability);
844 WDP_LOGD("Group Capa [0x%02x]", groupcapability);
845 if (groupcapability & WS_GROUP_CAP_GROUP_OWNER) {
846 peer->group_flags = WFD_OEM_GROUP_FLAG_GROUP_OWNER;
847 peer->dev_role = WFD_OEM_DEV_ROLE_GO;
849 if (groupcapability & WS_GROUP_CAP_PERSISTENT_GROUP)
850 peer->group_flags = WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
852 } else if (g_strcmp0(key, "PrimaryDeviceType") == 0) {
853 unsigned char primarydevicetype[WS_DEVTYPE_LEN] = {0,};
855 if (__ws_unpack_ay(primarydevicetype, value, WS_DEVTYPE_LEN)) {
856 peer->pri_dev_type = primarydevicetype[1];
857 peer->sec_dev_type = primarydevicetype[WS_DEVTYPE_LEN -1];
859 } else if (g_strcmp0(key, "SecondaryDeviceTypes") == 0) {
860 } else if (g_strcmp0(key, "VendorExtension") == 0) {
861 } else if (g_strcmp0(key, "IEs") == 0) {
862 unsigned char ies[WFD_SUBELEM_LEN_DEV_INFO + 3] = {0,};
864 if (__ws_unpack_ay(ies, value, WFD_SUBELEM_LEN_DEV_INFO + 3))
865 __parsing_wfd_info(ies, &(peer->display));
866 } else if (g_strcmp0(key, "DeviceAddress") == 0) {
868 if (__ws_unpack_ay(peer->p2p_dev_addr, value, WS_MACADDR_LEN))
869 WDP_LOGD("Device address [" MACSTR "]", MAC2STR(peer->p2p_dev_addr));
871 } else if (g_strcmp0(key, "InterfaceAddress") == 0) {
873 if (__ws_unpack_ay(peer->p2p_intf_addr, value, WS_MACADDR_LEN))
874 WDP_LOGD("Interface Address [" MACSTR "]", MAC2STR(peer->p2p_intf_addr));
876 } else if (g_strcmp0(key, "GODeviceAddress") == 0) {
878 unsigned char go_dev_addr[OEM_MACADDR_LEN] = {0,};
879 if (__ws_unpack_ay(go_dev_addr, value, WS_MACADDR_LEN))
880 WDP_LOGD("[" MACSTR "]", MAC2STR(go_dev_addr));
882 if (!ISZEROMACADDR(go_dev_addr))
883 peer->dev_role = WFD_OEM_DEV_ROLE_GC;
885 } else if (g_strcmp0(key, "AdvertiseService") == 0) {
886 if (value != NULL && g_variant_get_size(value) != 0)
887 peer->has_asp_services = 1;
889 peer->has_asp_services = 0;
891 } else if (g_strcmp0(key, "AdvertiseASPService") == 0) {
892 if (value != NULL && g_variant_get_size(value) != 0)
893 peer->has_asp2_services = 1;
895 peer->has_asp2_services = 0;
897 } else if (g_strcmp0(key, "VSIE") == 0) {
899 unsigned char vsie[OEM_VSIE_MAX_LEN] = {0,};
901 vsie_len = __ws_unpack_ay(vsie, value, OEM_VSIE_MAX_LEN);
903 __ws_byte_to_txt(vsie, (char **)&(peer->vsie), vsie_len);
904 WDP_LOGD("VSIE [%s]", peer->vsie);
908 WDP_LOGD("Unknown value");
910 __WDP_LOG_FUNC_EXIT__;
914 void __ws_interface_property(const char *key, GVariant *value, void *user_data)
916 __WDP_LOG_FUNC_ENTER__;
917 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
921 CHECK_KEY_VALUE(key, value);
923 if (g_strcmp0(key, "Ifname") == 0) {
924 const char *ifname = NULL;
926 g_variant_get(value, "&s", &ifname);
927 g_strlcpy(event->ifname, ifname, OEM_IFACE_NAME_LEN+1);
928 WDP_LOGD("Ifname [%s]", event->ifname);
931 __WDP_LOG_FUNC_EXIT__;
935 void __ws_group_property(const char *key, GVariant *value, void *user_data)
937 __WDP_LOG_FUNC_ENTER__;
938 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
939 if (!event || !event->edata)
942 wfd_oem_group_data_s *group = (wfd_oem_group_data_s *)event->edata;
944 CHECK_KEY_VALUE(key, value);
946 if (g_strcmp0(key, "Role") == 0) {
947 const char *role = NULL;
949 g_variant_get(value, "&s", &role);
950 WDP_LOGD("Role [%s]", role);
952 if (!strncmp(role, "GO", 2))
953 event->dev_role = WFD_OEM_DEV_ROLE_GO;
954 else if (!strncmp(role, "client", 6))
955 event->dev_role = WFD_OEM_DEV_ROLE_GC;
957 } else if (g_strcmp0(key, "Frequency") == 0) {
960 g_variant_get(value, "q", &frequency);
961 group->freq = (int)frequency;
963 } else if (g_strcmp0(key, "Passphrase") == 0) {
964 const char *passphrase = NULL;
966 g_variant_get(value, "&s", &passphrase);
967 g_strlcpy(group->pass, passphrase, OEM_PASS_PHRASE_LEN+1);
968 WDP_LOGD("passphrase [%s]", group->pass);
970 } else if (g_strcmp0(key, "Group") == 0) {
972 } else if (g_strcmp0(key, "SSID") == 0) {
973 unsigned char ssid[WS_SSID_LEN +1] = {0,};
975 __ws_unpack_ay(ssid, value, WS_SSID_LEN);
976 memcpy(group->ssid, ssid, WS_SSID_LEN+1);
977 WDP_LOGD("ssid [%s]", group->ssid);
979 } else if (g_strcmp0(key, "BSSID") == 0) {
981 if (__ws_unpack_ay(group->go_dev_addr, value, WS_MACADDR_LEN))
982 WDP_LOGD("[" MACSTR "]", MAC2STR(group->go_dev_addr));
985 WDP_LOGD("Unknown value");
987 __WDP_LOG_FUNC_EXIT__;
991 void __ws_extract_invitation_details(const char *key, GVariant *value, void *user_data)
993 __WDP_LOG_FUNC_ENTER__;
994 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
995 if (!event || !event->edata)
998 wfd_oem_invite_data_s *invitation = (wfd_oem_invite_data_s *)event->edata;
1000 CHECK_KEY_VALUE(key, value);
1002 if (g_strcmp0(key, "sa") == 0) {
1003 if (__ws_unpack_ay(invitation->sa, value, WS_MACADDR_LEN))
1004 WDP_LOGD("SA [" MACSTR "]", MAC2STR(invitation->sa));
1006 } else if (g_strcmp0(key, "go_dev_addr") == 0) {
1007 if (__ws_unpack_ay(invitation->go_dev_addr, value, WS_MACADDR_LEN))
1008 WDP_LOGD("GO device address [" MACSTR "]", MAC2STR(invitation->go_dev_addr));
1010 } else if (g_strcmp0(key, "bssid") == 0) {
1011 if (__ws_unpack_ay(invitation->bssid, value, WS_MACADDR_LEN))
1012 WDP_LOGD("BSSID [" MACSTR "]", MAC2STR(invitation->bssid));
1014 } else if (g_strcmp0(key, "persistent_id") == 0) {
1015 g_variant_get(value, "i", &(invitation->persistent_id));
1016 WDP_LOGD("persistent id [%d]", invitation->persistent_id);
1018 } else if (g_strcmp0(key, "op_freq") == 0) {
1019 g_variant_get(value, "i", &(invitation->oper_freq));
1020 WDP_LOGD("op freq [%d]", invitation->oper_freq);
1022 WDP_LOGD("Unknown value");
1024 __WDP_LOG_FUNC_EXIT__;
1028 static void __ws_parse_peer_joined(char *peer_path,
1029 unsigned char *dev_addr, unsigned char *ip_addr, GVariant *parameter)
1031 __WDP_LOG_FUNC_ENTER__;
1034 gboolean iter_res = TRUE;
1035 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1036 const char *path = NULL;
1040 g_variant_get(parameter, "(&oay)", &path, &iter);
1041 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
1042 WDP_LOGD("Retrive Added path [%s]", peer_path);
1044 loc = strrchr(peer_path, '/');
1046 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1047 __ws_txt_to_mac(peer_dev, dev_addr);
1048 WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(dev_addr));
1049 for (i = 0; iter_res && i < OEM_IPADDR_LEN; i++)
1050 iter_res = g_variant_iter_loop(iter, "y", &ip_addr[i]);
1051 g_variant_iter_free(iter);
1053 WDP_LOGD("peer ip [" IPSTR "]", IP2STR(ip_addr));
1055 __WDP_LOG_FUNC_EXIT__;
1059 static void _ws_process_peer_joined(GDBusConnection *connection,
1060 const gchar *sender, const gchar *object_path, const gchar *interface,
1061 const gchar *signal, GVariant *parameters, gpointer user_data)
1063 __WDP_LOG_FUNC_ENTER__;
1064 wfd_oem_event_s event;
1065 wfd_oem_dev_data_s *edata = NULL;
1066 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1068 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
1070 if (!g_pd || !g_pd->callback) {
1071 WDP_LOGD("Ignoring event");
1072 __WDP_LOG_FUNC_EXIT__;
1076 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
1078 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
1079 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1080 WDP_LOGF("Failed to allocate memory for event. [%s]",
1082 __WDP_LOG_FUNC_EXIT__;
1085 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1087 event.edata = (void*) edata;
1088 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
1089 event.event_id = WFD_OEM_EVENT_STA_CONNECTED;
1091 __ws_parse_peer_joined(peer_path, event.dev_addr, event.ip_addr_peer, parameters);
1093 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
1094 __ws_peer_property, event.edata);
1096 if (g_pd->callback->sta_connected_cb)
1097 g_pd->callback->sta_connected_cb(&event);
1099 is_peer_joined_notified = 1;
1102 __WDP_LOG_FUNC_EXIT__;
1105 static void _ws_process_peer_disconnected(GDBusConnection *connection,
1106 const gchar *sender, const gchar *object_path, const gchar *interface,
1107 const gchar *signal, GVariant *parameters, gpointer user_data)
1109 __WDP_LOG_FUNC_ENTER__;
1110 wfd_oem_event_s event;
1111 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1113 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
1115 if (!g_pd || !g_pd->callback) {
1116 WDP_LOGD("Ignoring event");
1117 __WDP_LOG_FUNC_EXIT__;
1121 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1123 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
1124 event.event_id = WFD_OEM_EVENT_STA_DISCONNECTED;
1126 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
1128 if (g_pd->callback->sta_disconnected_cb)
1129 g_pd->callback->sta_disconnected_cb(&event);
1131 is_peer_disconnected_notified = 1;
1132 __WDP_LOG_FUNC_EXIT__;
1137 const char *interface;
1139 void (*function) (GDBusConnection *connection,
1140 const gchar *sender, const gchar *object_path, const gchar *interface,
1141 const gchar *signal, GVariant *parameters, gpointer user_data);
1142 } ws_group_signal_map[] = {
1145 SUPPLICANT_P2P_GROUP,
1147 _ws_process_peer_joined
1151 SUPPLICANT_P2P_GROUP,
1153 _ws_process_peer_disconnected
1163 void __ws_extract_group_details(const char *key, GVariant *value, void *user_data)
1165 __WDP_LOG_FUNC_ENTER__;
1166 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1167 if (!event || !event->edata)
1171 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
1172 __WDP_LOG_FUNC_EXIT__;
1176 wfd_oem_group_data_s *group = (wfd_oem_group_data_s *)event->edata;
1178 CHECK_KEY_VALUE(key, value);
1180 if (g_strcmp0(key, "interface_object") == 0) {
1181 static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1182 const char *i_path = NULL;
1184 g_variant_get(value, "&o", &i_path);
1185 g_strlcpy(interface_path, i_path, DBUS_OBJECT_PATH_MAX);
1186 WDP_LOGD("Retrive Added path [%s]", interface_path);
1187 g_strlcpy(g_pd->group_iface_path, interface_path, DBUS_OBJECT_PATH_MAX);
1188 dbus_property_get_all(interface_path, g_pd->g_dbus,
1189 SUPPLICANT_IFACE, __ws_interface_property, event);
1191 } else if (g_strcmp0(key, "role") == 0) {
1192 const char *role = NULL;
1194 g_variant_get(value, "&s", &role);
1195 WDP_LOGD("Role [%s]", role);
1197 if (!strncmp(role, "GO", 2))
1198 event->dev_role = WFD_OEM_DEV_ROLE_GO;
1199 else if (!strncmp(role, "client", 6))
1200 event->dev_role = WFD_OEM_DEV_ROLE_GC;
1201 } else if (g_strcmp0(key, "persistent") == 0) {
1202 g_variant_get(value, "b", &group->is_persistent);
1203 WDP_LOGD("Is Persistent : [%s]", group->is_persistent ? "YES" : "NO");
1205 } else if (g_strcmp0(key, "IpAddr") == 0) {
1207 if (__ws_unpack_ay(group->ip_addr, value, OEM_IPADDR_LEN))
1208 WDP_LOGD("IP address [" IPSTR "]", IP2STR(group->ip_addr));
1210 } else if (g_strcmp0(key, "IpAddrMask") == 0) {
1212 if (__ws_unpack_ay(group->ip_addr_mask, value, OEM_IPADDR_LEN))
1213 WDP_LOGD("IP mask [" IPSTR "]", IP2STR(group->ip_addr_mask));
1215 } else if (g_strcmp0(key, "IpAddrGo") == 0) {
1217 if (__ws_unpack_ay(group->ip_addr_go, value, OEM_IPADDR_LEN))
1218 WDP_LOGD("GO IP address [" IPSTR "]", IP2STR(group->ip_addr_go));
1219 } else if (g_strcmp0(key, "group_object") == 0) {
1220 static char group_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1224 g_variant_get(value, "&o", &g_path);
1225 g_strlcpy(group_path, g_path, DBUS_OBJECT_PATH_MAX);
1226 WDP_LOGD("Retrive group path [%s]", group_path);
1227 dbus_property_get_all(group_path, g_pd->g_dbus, SUPPLICANT_P2P_GROUP,
1228 __ws_group_property, event);
1230 for (i = 0; ws_group_signal_map[i].member != NULL; i++) {
1231 ws_group_signal_map[i].sub_id =
1232 g_dbus_connection_signal_subscribe(g_pd->g_dbus,
1233 SUPPLICANT_SERVICE, /* bus name */
1234 ws_group_signal_map[i].interface, /* interface */
1235 ws_group_signal_map[i].member, /* member */
1236 group_path, /* object path */
1238 G_DBUS_SIGNAL_FLAGS_NONE,
1239 ws_group_signal_map[i].function,
1241 WDP_LOGD("Subscribed Group iface signal [%s]", ws_group_signal_map[i].member);
1244 __WDP_LOG_FUNC_EXIT__;
1248 void __ws_extract_gonegfailaure_details(const char *key, GVariant *value, void *user_data)
1250 __WDP_LOG_FUNC_ENTER__;
1251 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1252 if (!event || !event->edata)
1255 wfd_oem_conn_data_s *conn = (wfd_oem_conn_data_s *)event->edata;
1257 CHECK_KEY_VALUE(key, value);
1259 if (g_strcmp0(key, "peer_object") == 0) {
1260 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1263 g_variant_get(value, "&o", &path);
1264 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
1265 WDP_LOGD("Retrive peer path [%s]", peer_path);
1267 } else if (g_strcmp0(key, "status") == 0) {
1270 g_variant_get(value, "i", &status);
1271 WDP_LOGD("Retrive status [%d]", status);
1272 conn->status = status;
1274 __WDP_LOG_FUNC_EXIT__;
1278 void __ws_extract_gonegsuccess_details(const char *key, GVariant *value, void *user_data)
1280 __WDP_LOG_FUNC_ENTER__;
1281 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1282 if (!event || !event->edata)
1285 wfd_oem_conn_data_s *edata = (wfd_oem_conn_data_s *)event->edata;
1287 CHECK_KEY_VALUE(key, value);
1289 if (g_strcmp0(key, "peer_object") == 0) {
1291 } else if (g_strcmp0(key, "status") == 0) {
1293 } else if (g_strcmp0(key, "passphrase") == 0) {
1295 } else if (g_strcmp0(key, "role_go") == 0) {
1296 /* local device role */
1297 const char *role = NULL;
1299 g_variant_get(value, "&s", &role);
1300 if (!strncmp(role, "GO", 2))
1301 event->dev_role = WFD_OEM_DEV_ROLE_GO;
1302 else if (!strncmp(role, "client", 6))
1303 event->dev_role = WFD_OEM_DEV_ROLE_GC;
1305 } else if (g_strcmp0(key, "ssid") == 0) {
1306 unsigned char ssid[WS_SSID_LEN +1] = {0,};
1308 __ws_unpack_ay(ssid, value, WS_SSID_LEN);
1309 memcpy(edata->ssid, ssid, WS_SSID_LEN+1);
1310 WDP_LOGD("ssid [%s]", edata->ssid);
1312 } else if (g_strcmp0(key, "peer_device_addr") == 0) {
1314 if (__ws_unpack_ay(edata->peer_device_addr, value, WS_MACADDR_LEN))
1315 WDP_LOGD("Device address[" MACSTR "]", MAC2STR(edata->peer_device_addr));
1317 } else if (g_strcmp0(key, "peer_interface_addr") == 0) {
1319 if (__ws_unpack_ay(edata->peer_intf_addr, value, WS_MACADDR_LEN))
1320 WDP_LOGD("Interface address [" MACSTR "]", MAC2STR(edata->peer_intf_addr));
1322 } else if (g_strcmp0(key, "wps_method") == 0) {
1324 } else if (g_strcmp0(key, "frequency_list") == 0) {
1326 } else if (g_strcmp0(key, "persistent_group") == 0) {
1328 g_variant_get(value, "i", &(edata->persistent_group));
1329 WDP_LOGD("persistent_group [%d]", edata->persistent_group);
1331 } else if (g_strcmp0(key, "peer_config_timeout") == 0) {
1334 __WDP_LOG_FUNC_EXIT__;
1338 void __ws_extract_peer_service(wfd_oem_event_s *data, unsigned char *service_hex, int tlvs_len)
1340 GList *services = NULL;
1341 wfd_oem_new_service_s *new_service = NULL;
1342 char *segment = NULL;
1348 while (ptr + 2 < WS_MAX_SERVICE_LEN &&
1349 (length = (service_hex[ptr+1]*256) + service_hex[ptr]) > 0) {
1350 segment = (char*) g_try_malloc0(length*2+1);
1352 __ws_byte_to_hex(segment, length * 2 + 1, &service_hex[ptr + 3], length);
1353 res = __ws_segment_to_service(segment, &new_service);
1355 WDP_LOGE("Failed to convert segment as service instance");
1360 services = g_list_append(services, new_service);
1366 data->edata_type = WFD_OEM_EDATA_TYPE_NEW_SERVICE;
1367 data->dev_role = count;
1368 data->edata = (void*) services;
1372 void __ws_extract_servicediscoveryresponse_details(const char *key, GVariant *value, void *user_data)
1374 __WDP_LOG_FUNC_ENTER__;
1375 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1380 CHECK_KEY_VALUE(key, value);
1382 if (g_strcmp0(key, "peer_object") == 0) {
1383 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1384 const char *path = NULL;
1387 g_variant_get(value, "&o", &path);
1391 WDP_LOGD("Retrive Added path [%s]", path);
1392 loc = strrchr(path, '/');
1394 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1395 __ws_txt_to_mac(peer_dev, event->dev_addr);
1397 } else if (g_strcmp0(key, "update_indicator") == 0) {
1399 } else if (g_strcmp0(key, "tlvs") == 0) {
1400 GVariantIter *iter = NULL;
1401 unsigned char service_hex[WS_MAX_SERVICE_LEN];
1402 int byte_length = 0;
1404 g_variant_get(value, "ay", &iter);
1406 WDP_LOGE("failed to get iterator");
1410 memset(service_hex, 0x0, WS_MAX_SERVICE_LEN);
1411 while (g_variant_iter_loop(iter, "y", &service_hex[byte_length]))
1413 g_variant_iter_free(iter);
1415 __ws_extract_peer_service(event, service_hex, byte_length);
1418 __WDP_LOG_FUNC_EXIT__;
1421 static void __ws_extract_serviceaspresponse_details(const char *key, GVariant *value, void *user_data)
1423 __WDP_LOG_FUNC_ENTER__;
1424 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1425 if (!event || !event->edata)
1428 wfd_oem_asp_service_s *service = (wfd_oem_asp_service_s *)event->edata;
1430 if (g_strcmp0(key, "peer_object") == 0) {
1431 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1432 const char *path = NULL;
1435 g_variant_get(value, "&o", &path);
1439 WDP_LOGD("Retrive Added path [%s]", path);
1440 loc = strrchr(path, '/');
1442 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1443 __ws_txt_to_mac(peer_dev, event->dev_addr);
1445 } else if (g_strcmp0(key, "srv_trans_id") == 0) {
1446 unsigned int srv_trans_id = 0;
1447 g_variant_get(value, "u", &srv_trans_id);
1448 service->tran_id = srv_trans_id;
1449 WDP_LOGD("Retrive srv_trans_id [%x]", service->tran_id);
1451 } else if (g_strcmp0(key, "adv_id") == 0) {
1452 unsigned int adv_id = 0;
1453 g_variant_get(value, "u", &adv_id);
1454 service->adv_id = adv_id;
1455 WDP_LOGD("Retrive adv_id [%x]", service->adv_id);
1457 } else if (g_strcmp0(key, "svc_status") == 0) {
1458 unsigned char svc_status = 0;
1459 g_variant_get(value, "u", &svc_status);
1460 service->status = svc_status;
1461 WDP_LOGD("Retrive svc_status [%x]", service->status);
1463 } else if (g_strcmp0(key, "config_methods") == 0) {
1464 unsigned int config_methods = 0;
1465 g_variant_get(value, "q", &config_methods);
1466 service->config_method = config_methods;
1467 WDP_LOGD("Retrive config_methods [%x]", service->config_method);
1469 } else if (g_strcmp0(key, "svc_str") == 0) {
1470 const char *svc_str = NULL;
1471 g_variant_get(value, "&s", &svc_str);
1472 if (svc_str != NULL)
1473 service->service_type = g_strdup(svc_str);
1474 WDP_LOGD("Retrive srv_name [%s]", service->service_type);
1476 } else if (g_strcmp0(key, "info") == 0) {
1477 const char *info = NULL;
1478 g_variant_get(value, "&s", &info);
1480 service->service_info = g_strdup(info);
1481 WDP_LOGD("Retrive srv_info [%s]", service->service_info);
1483 __WDP_LOG_FUNC_EXIT__;
1486 static void __ws_extract_asp_provision_start_details(const char *key, GVariant *value, void *user_data)
1488 __WDP_LOG_FUNC_ENTER__;
1489 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1490 wfd_oem_asp_prov_s *asp_params = NULL;
1491 if (!event || !event->edata) {
1492 __WDP_LOG_FUNC_EXIT__;
1496 asp_params = (wfd_oem_asp_prov_s *)event->edata;
1498 if (g_strcmp0(key, "peer_object") == 0) {
1499 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1500 const char *path = NULL;
1503 g_variant_get(value, "&o", &path);
1505 __WDP_LOG_FUNC_EXIT__;
1509 WDP_LOGD("Retrive Added path [%s]", path);
1510 loc = strrchr(path, '/');
1512 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1513 __ws_txt_to_mac(peer_dev, event->dev_addr);
1515 } else if (g_strcmp0(key, "adv_id") == 0) {
1516 g_variant_get(value, "u", &asp_params->adv_id);
1517 WDP_LOGD("Retrive adv_id [%u]", asp_params->adv_id);
1519 } else if (g_strcmp0(key, "ses_id") == 0) {
1520 g_variant_get(value, "u", &asp_params->session_id);
1521 WDP_LOGD("Retrive session id [%u]", asp_params->session_id);
1523 } else if (g_strcmp0(key, "dev_passwd_id") == 0) {
1524 g_variant_get(value, "i", &event->wps_mode);
1525 WDP_LOGD("Retrive dev_passwd_id [%d]", event->wps_mode);
1527 } else if (g_strcmp0(key, "conncap") == 0) {
1528 g_variant_get(value, "u", &asp_params->network_role);
1529 WDP_LOGD("Retrive conncap [%x]", asp_params->network_role);
1531 } else if (g_strcmp0(key, "adv_mac") == 0) {
1532 if (__ws_unpack_ay(asp_params->service_mac, value, WS_MACADDR_LEN))
1533 WDP_LOGD("Adv address[" MACSTR "]", MAC2STR(asp_params->service_mac));
1535 } else if (g_strcmp0(key, "ses_mac") == 0) {
1536 if (__ws_unpack_ay(asp_params->session_mac, value, WS_MACADDR_LEN))
1537 WDP_LOGD("session address[" MACSTR "]", MAC2STR(asp_params->session_mac));
1539 } else if (g_strcmp0(key, "session_info") == 0) {
1540 const char *session_info = NULL;
1541 g_variant_get(value, "&s", &session_info);
1542 if (session_info != NULL)
1543 asp_params->session_information = g_strdup(session_info);
1544 WDP_LOGD("Retrive session_info [%s]", asp_params->session_information);
1546 __WDP_LOG_FUNC_EXIT__;
1549 static void __ws_extract_asp_provision_done_details(const char *key, GVariant *value, void *user_data)
1551 __WDP_LOG_FUNC_ENTER__;
1552 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1553 wfd_oem_asp_prov_s *asp_params = NULL;
1554 if (!event || !event->edata) {
1555 __WDP_LOG_FUNC_EXIT__;
1559 asp_params = (wfd_oem_asp_prov_s *)event->edata;
1562 if (g_strcmp0(key, "peer_object") == 0) {
1563 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1564 const char *path = NULL;
1567 g_variant_get(value, "&o", &path);
1569 __WDP_LOG_FUNC_EXIT__;
1573 WDP_LOGD("Retrive Added path [%s]", path);
1574 loc = strrchr(path, '/');
1576 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1577 __ws_txt_to_mac(peer_dev, event->dev_addr);
1579 WDP_LOGD("peer address[" MACSTR "]", MAC2STR(event->dev_addr));
1581 } else if (g_strcmp0(key, "adv_id") == 0) {
1582 g_variant_get(value, "u", &asp_params->adv_id);
1583 WDP_LOGD("Retrive adv_id [%u]", asp_params->adv_id);
1585 } else if (g_strcmp0(key, "ses_id") == 0) {
1586 g_variant_get(value, "u", &asp_params->session_id);
1587 WDP_LOGD("Retrive session id [%u]", asp_params->session_id);
1589 } else if (g_strcmp0(key, "dev_passwd_id") == 0) {
1590 g_variant_get(value, "i", &event->wps_mode);
1591 WDP_LOGD("Retrive dev_passwd_id [%d]", event->wps_mode);
1593 } else if (g_strcmp0(key, "conncap") == 0) {
1594 g_variant_get(value, "u", &asp_params->network_role);
1595 WDP_LOGD("Retrive network role [%x]", asp_params->network_role);
1597 } else if (g_strcmp0(key, "status") == 0) {
1598 g_variant_get(value, "u", &asp_params->status);
1599 WDP_LOGD("Retrive status [%x]", asp_params->status);
1601 } else if (g_strcmp0(key, "persist") == 0) {
1602 g_variant_get(value, "u", &asp_params->persistent_group_id);
1603 asp_params->persist = 1;
1604 WDP_LOGD("Retrive persist [%u]", asp_params->persistent_group_id);
1606 } else if (g_strcmp0(key, "adv_mac") == 0) {
1607 if (__ws_unpack_ay(asp_params->service_mac, value, WS_MACADDR_LEN))
1608 WDP_LOGD("Adv address[" MACSTR "]", MAC2STR(asp_params->service_mac));
1610 } else if (g_strcmp0(key, "ses_mac") == 0) {
1611 if (__ws_unpack_ay(asp_params->session_mac, value, WS_MACADDR_LEN))
1612 WDP_LOGD("session address[" MACSTR "]", MAC2STR(asp_params->session_mac));
1614 } else if (g_strcmp0(key, "group_mac") == 0) {
1615 if (__ws_unpack_ay(asp_params->group_mac, value, WS_MACADDR_LEN))
1616 WDP_LOGD("group address[" MACSTR "]", MAC2STR(asp_params->group_mac));
1618 __WDP_LOG_FUNC_EXIT__;
1621 static void __ws_extract_provision_fail_details(const char *key, GVariant *value, void *user_data)
1623 __WDP_LOG_FUNC_ENTER__;
1624 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1625 wfd_oem_asp_prov_s *asp_params = NULL;
1626 if (!event || !event->edata) {
1627 __WDP_LOG_FUNC_EXIT__;
1631 asp_params = (wfd_oem_asp_prov_s *)event->edata;
1633 if (g_strcmp0(key, "peer_object") == 0) {
1634 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1635 const char *path = NULL;
1638 g_variant_get(value, "&o", &path);
1640 __WDP_LOG_FUNC_EXIT__;
1644 WDP_LOGD("Retrive Added path [%s]", path);
1645 loc = strrchr(path, '/');
1647 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1648 __ws_txt_to_mac(peer_dev, event->dev_addr);
1650 } else if (g_strcmp0(key, "adv_id") == 0) {
1651 g_variant_get(value, "u", &asp_params->adv_id);
1652 WDP_LOGD("Retrive adv_id [%d]", asp_params->adv_id);
1654 } else if (g_strcmp0(key, "status") == 0) {
1655 g_variant_get(value, "i", &asp_params->status);
1656 WDP_LOGD("Retrive status [%d]", asp_params->status);
1658 } else if (g_strcmp0(key, "deferred_session_resp") == 0) {
1659 const char *session_info = NULL;
1660 g_variant_get(value, "&s", &session_info);
1661 if (session_info != NULL)
1662 asp_params->session_information = g_strdup(session_info);
1663 WDP_LOGD("Retrive deferred_session_resp [%s]", asp_params->session_information);
1665 __WDP_LOG_FUNC_EXIT__;
1668 static int _ws_flush(void)
1670 __WDP_LOG_FUNC_ENTER__;
1671 GDBusConnection *g_dbus = NULL;
1672 dbus_method_param_s params;
1676 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
1677 __WDP_LOG_FUNC_EXIT__;
1681 g_dbus = g_pd->g_dbus;
1683 WDP_LOGE("DBus connection is NULL");
1684 __WDP_LOG_FUNC_EXIT__;
1687 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
1689 dbus_set_method_param(¶ms, "Flush", g_pd->iface_path, g_dbus);
1690 params.params = NULL;
1692 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
1694 WDP_LOGE("Failed to send command to wpa_supplicant");
1696 WDP_LOGD("Succeeded to flush");
1698 __WDP_LOG_FUNC_EXIT__;
1702 static int _ws_cancel(void)
1704 __WDP_LOG_FUNC_ENTER__;
1705 GDBusConnection *g_dbus = NULL;
1706 dbus_method_param_s params;
1710 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
1711 __WDP_LOG_FUNC_EXIT__;
1716 g_dbus = g_pd->g_dbus;
1718 WDP_LOGE("DBus connection is NULL");
1719 __WDP_LOG_FUNC_EXIT__;
1722 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
1724 dbus_set_method_param(¶ms, "Cancel", g_pd->iface_path , g_dbus);
1725 params.params = NULL;
1727 res = dbus_method_call(¶ms, SUPPLICANT_WPS, NULL, NULL);
1729 WDP_LOGE("Failed to send command to wpa_supplicant");
1731 WDP_LOGD("Succeeded to cancel");
1733 __WDP_LOG_FUNC_EXIT__;
1737 int ws_get_advertise_service(const char *peer_path, GList **asp_services)
1739 __WDP_LOG_FUNC_ENTER__;
1740 GDBusConnection *g_dbus = NULL;
1741 GVariant *param = NULL;
1742 GVariant *reply = NULL;
1743 GVariant *temp1 = NULL;
1744 GVariant *temp2 = NULL;
1745 GError *error = NULL;
1746 GVariantIter *iter = NULL;
1747 wfd_oem_advertise_service_s *service;
1748 wfd_oem_asp_service_s *seek = NULL;
1749 unsigned char desc[7];
1750 unsigned int adv_id;
1751 unsigned int config_method;
1752 unsigned char length;
1758 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
1762 g_dbus = g_pd->g_dbus;
1764 WDP_LOGE("DBus connection is NULL");
1768 param = g_variant_new("(ss)", SUPPLICANT_P2P_PEER, "AdvertiseService");
1769 DEBUG_G_VARIANT("Params : ", param);
1771 reply = g_dbus_connection_call_sync(
1773 SUPPLICANT_SERVICE, /* bus name */
1774 peer_path, /* object path */
1775 DBUS_PROPERTIES_INTERFACE, /* interface name */
1776 DBUS_PROPERTIES_METHOD_GET, /* method name */
1777 param, /* GVariant *params */
1778 NULL, /* reply_type */
1779 G_DBUS_CALL_FLAGS_NONE, /* flags */
1780 SUPPLICANT_TIMEOUT , /* timeout */
1781 NULL, /* cancellable */
1782 &error); /* error */
1784 if (error != NULL) {
1785 WDP_LOGE("Error! Failed to get peer advertise service: [%s]",
1787 g_error_free(error);
1789 g_variant_unref(reply);
1790 __WDP_LOG_FUNC_EXIT__;
1794 if (reply != NULL) {
1795 DEBUG_G_VARIANT("Reply : ", reply);
1797 /* replay will have the format <(<ay>,)>
1798 * So, you need to remove tuple out side of variant and
1799 * variant out side of byte array
1801 temp1 = g_variant_get_child_value(reply, 0);
1802 temp2 = g_variant_get_child_value(temp1, 0);
1803 g_variant_get(temp2, "ay", &iter);
1805 g_variant_unref(reply);
1806 WDP_LOGE("Failed to get iterator");
1809 g_variant_unref(temp2);
1810 g_variant_unref(temp1);
1813 /* 4byte advertisement ID, 2 byte config method, 1byte length */
1816 memset(desc, 0x0, 7);
1817 while (cnt < 7 && g_variant_iter_loop(iter, "y", &desc[cnt]))
1820 if (cnt != 7 || desc[6] == 0) {
1821 WDP_LOGE("Invalid descriptor header length cnt [%d]", cnt);
1822 g_variant_unref(reply);
1826 adv_id = desc[3] << 24 | desc[2] << 16 | desc[1] << 8 | desc[0];
1827 config_method = desc[4] << 8 | desc[4];
1830 value = g_try_malloc0(length + 1);
1831 if (value == NULL) {
1832 WDP_LOGE("g_try_malloc0 failed");
1833 g_variant_unref(reply);
1836 WDP_LOGD("adv_id[%u] config_method[%u] length[%hhu]", adv_id, config_method, length);
1839 while (cnt < length && g_variant_iter_loop(iter, "y", &value[cnt]))
1842 if (cnt != length) {
1843 WDP_LOGE("Length doesn't matched with header value cnt [%d]", cnt);
1844 g_variant_unref(reply);
1850 service = (wfd_oem_advertise_service_s *)
1851 g_try_malloc0(sizeof(wfd_oem_advertise_service_s));
1852 if (service == NULL) {
1853 WDP_LOGE("g_try_malloc0 failed");
1854 g_variant_unref(reply);
1858 service->adv_id = adv_id;
1859 service->config_method = config_method;
1860 service->service_type_length = length;
1861 service->service_type = value;
1863 GLIST_ITER_START(seek_list, seek)
1864 if (g_strcmp0(seek->service_type, service->service_type) == 0) {
1865 WDP_LOGD("service type matched [%s] search_id [%llu]",
1866 service->service_type, seek->search_id);
1872 if (seek != NULL && seek->service_info != NULL) {
1873 WDP_LOGD("service info exists, service discovery will be performed");
1875 WDP_LOGD("service info doesn't exists. Add service to list");
1877 service->search_id = seek->search_id;
1878 *asp_services = g_list_append(*asp_services, service);
1881 g_variant_unref(reply);
1883 __WDP_LOG_FUNC_EXIT__;
1888 int ws_get_advertise_asp_service(const char *peer_path, GList **asp_services)
1890 __WDP_LOG_FUNC_ENTER__;
1891 GDBusConnection *g_dbus = NULL;
1892 GVariant *param = NULL;
1893 GVariant *reply = NULL;
1894 GVariant *temp1 = NULL;
1895 GVariant *temp2 = NULL;
1896 GError *error = NULL;
1897 GVariantIter *iter = NULL;
1898 wfd_oem_advertise_service_s *service;
1899 wfd_oem_asp_service_s *seek = NULL;
1900 unsigned char desc[7];
1901 unsigned int adv_id;
1902 unsigned int config_method;
1903 unsigned char length;
1904 char *service_type = NULL;
1905 char *instance_name = NULL;
1906 unsigned char instance_length = 0;
1911 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
1915 g_dbus = g_pd->g_dbus;
1917 WDP_LOGE("DBus connection is NULL");
1921 param = g_variant_new("(ss)", SUPPLICANT_P2P_PEER, "AdvertiseASPService");
1922 DEBUG_G_VARIANT("Params : ", param);
1924 reply = g_dbus_connection_call_sync(
1926 SUPPLICANT_SERVICE, /* bus name */
1927 peer_path, /* object path */
1928 DBUS_PROPERTIES_INTERFACE, /* interface name */
1929 DBUS_PROPERTIES_METHOD_GET, /* method name */
1930 param, /* GVariant *params */
1931 NULL, /* reply_type */
1932 G_DBUS_CALL_FLAGS_NONE, /* flags */
1933 SUPPLICANT_TIMEOUT , /* timeout */
1934 NULL, /* cancellable */
1935 &error); /* error */
1937 if (error != NULL) {
1938 WDP_LOGE("Error! Failed to get peer advertise service: [%s]",
1940 g_error_free(error);
1942 g_variant_unref(reply);
1943 __WDP_LOG_FUNC_EXIT__;
1947 if (reply != NULL) {
1948 DEBUG_G_VARIANT("Reply : ", reply);
1950 /* replay will have the format <(<ay>,)>
1951 * So, you need to remove tuple out side of variant and
1952 * variant out side of byte array
1954 temp1 = g_variant_get_child_value(reply, 0);
1955 temp2 = g_variant_get_child_value(temp1, 0);
1956 g_variant_get(temp2, "ay", &iter);
1958 g_variant_unref(reply);
1959 WDP_LOGE("Failed to get iterator");
1962 g_variant_unref(temp2);
1963 g_variant_unref(temp1);
1966 /* 4byte advertisement ID, 2 byte config method, 1byte length */
1969 memset(desc, 0x0, 7);
1970 while (cnt < 7 && g_variant_iter_loop(iter, "y", &desc[cnt]))
1973 if (cnt != 7 || desc[6] == 0) {
1974 WDP_LOGE("Invalid descriptor header length cnt [%d]", cnt);
1975 g_variant_unref(reply);
1979 adv_id = desc[3] << 24 | desc[2] << 16 | desc[1] << 8 | desc[0];
1980 config_method = desc[4] << 8 | desc[4];
1982 service_type = g_try_malloc0(length + 1);
1983 if (service_type == NULL) {
1984 WDP_LOGE("g_try_malloc0 failed");
1985 g_variant_unref(reply);
1988 WDP_LOGD("adv_id[%u] config_method[%u] length[%hhu]", adv_id, config_method, length);
1991 while (cnt < length + 1 && g_variant_iter_loop(iter, "y", &service_type[cnt]))
1994 if (cnt != length + 1) {
1995 WDP_LOGE("Length doesn't matched with header value cnt [%d]", cnt);
1996 g_variant_unref(reply);
1997 g_free(service_type);
2001 instance_length = (unsigned char)service_type[length];
2002 service_type[length] = '\0';
2004 if (instance_length != 0) {
2005 instance_name = g_try_malloc0(instance_length + 1);
2006 if (instance_name == NULL) {
2007 WDP_LOGE("g_try_malloc0 failed");
2008 g_variant_unref(reply);
2009 g_free(service_type);
2012 WDP_LOGD("instnace name length[%hhu]", instance_length);
2015 while (cnt < instance_length && g_variant_iter_loop(iter, "y", &instance_name[cnt]))
2018 if (cnt != instance_length) {
2019 WDP_LOGE("Length doesn't matched with header value cnt [%d]", cnt);
2020 g_variant_unref(reply);
2021 g_free(service_type);
2022 g_free(instance_name);
2028 service = (wfd_oem_advertise_service_s *)
2029 g_try_malloc0(sizeof(wfd_oem_advertise_service_s));
2030 if (service == NULL) {
2031 WDP_LOGE("g_try_malloc0 failed");
2032 g_variant_unref(reply);
2033 g_free(service_type);
2034 g_free(instance_name);
2037 service->adv_id = adv_id;
2038 service->config_method = config_method;
2039 service->service_type_length = length;
2040 service->service_type = service_type;
2041 service->instance_name_length = instance_length;
2042 service->instance_name = instance_name;
2044 GLIST_ITER_START(seek_list, seek)
2045 if (g_strcmp0(seek->service_type, service->service_type) == 0) {
2046 /* TODO: We need to support for instance name also hear */
2047 WDP_LOGD("service type matched [%s] search_id [%llu]",
2048 service->service_type, seek->search_id);
2054 if (seek != NULL && seek->service_info != NULL) {
2055 WDP_LOGD("service info exists, service discovery will be performed");
2057 WDP_LOGD("service info doesn't exists. Add service to list");
2059 service->search_id = seek->search_id;
2060 *asp_services = g_list_append(*asp_services, service);
2063 g_variant_unref(reply);
2065 __WDP_LOG_FUNC_EXIT__;
2069 static void _ws_process_device_found_properties(GDBusConnection *connection,
2070 const gchar *sender, const gchar *object_path, const gchar *interface,
2071 const gchar *signal, GVariant *parameters, gpointer user_data)
2073 __WDP_LOG_FUNC_ENTER__;
2074 wfd_oem_event_s event;
2075 wfd_oem_dev_data_s *edata = NULL;
2076 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2077 static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
2079 GVariantIter *iter = NULL;
2080 const char *path = NULL;
2082 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2084 if (!g_pd || !g_pd->callback) {
2085 WDP_LOGD("Ignoring event");
2086 __WDP_LOG_FUNC_EXIT__;
2090 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
2092 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2093 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2094 WDP_LOGF("Failed to allocate memory for event. [%s]",
2096 __WDP_LOG_FUNC_EXIT__;
2099 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2101 event.edata = (void*) edata;
2102 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
2103 event.event_id = WFD_OEM_EVENT_PEER_FOUND;
2105 g_variant_get(parameters, "(&oa{sv})", &path, &iter);
2106 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
2107 WDP_LOGD("Retrive Added path [%s]", peer_path);
2109 loc = strrchr(peer_path, '/');
2111 __ws_mac_compact_to_normal(loc + 1, peer_dev);
2112 __ws_txt_to_mac(peer_dev, event.dev_addr);
2113 WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(event.dev_addr));
2117 GVariant *value = NULL;
2119 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
2120 CHECK_KEY_VALUE(key, value);
2122 __ws_peer_property(key, value, (void *) event.edata);
2124 g_variant_iter_free(iter);
2127 if (edata->has_asp_services)
2128 ws_get_advertise_service(peer_path, (GList **)&(event.asp_services));
2129 if (edata->has_asp2_services)
2130 ws_get_advertise_asp_service(peer_path, (GList **)&(event.asp2_services));
2132 if (g_pd->callback->peer_found_cb)
2133 g_pd->callback->peer_found_cb(&event);
2135 if (event.asp_services != NULL) {
2137 wfd_oem_advertise_service_s *service;
2138 for (l = (GList *)event.asp_services; l != NULL; l = l->next) {
2139 service = (wfd_oem_advertise_service_s *)l->data;
2140 event.asp_services = g_list_remove(l, service);
2141 g_free(service->service_type);
2145 if (event.asp2_services != NULL) {
2147 wfd_oem_advertise_service_s *service;
2148 for (l = (GList *)event.asp2_services; l != NULL; l = l->next) {
2149 service = (wfd_oem_advertise_service_s *)l->data;
2150 event.asp_services = g_list_remove(l, service);
2151 g_free(service->service_type);
2152 g_free(service->instance_name);
2156 g_free(event.edata);
2158 __WDP_LOG_FUNC_EXIT__;
2161 static void _ws_process_device_lost(GDBusConnection *connection,
2162 const gchar *sender, const gchar *object_path, const gchar *interface,
2163 const gchar *signal, GVariant *parameters, gpointer user_data)
2165 __WDP_LOG_FUNC_ENTER__;
2166 wfd_oem_event_s event;
2167 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2169 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2171 if (!g_pd || !g_pd->callback) {
2172 WDP_LOGD("Ignoring event");
2173 __WDP_LOG_FUNC_EXIT__;
2177 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2179 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2180 event.event_id = WFD_OEM_EVENT_PEER_DISAPPEARED;
2182 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
2184 if (g_pd->callback->peer_disappeared_cb)
2185 g_pd->callback->peer_disappeared_cb(&event);
2188 __WDP_LOG_FUNC_EXIT__;
2191 static void _ws_process_find_stoppped(GDBusConnection *connection,
2192 const gchar *sender, const gchar *object_path, const gchar *interface,
2193 const gchar *signal, GVariant *parameters, gpointer user_data)
2195 __WDP_LOG_FUNC_ENTER__;
2196 wfd_oem_event_s event;
2198 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2200 if (!g_pd || !g_pd->callback) {
2201 WDP_LOGD("Ignoring event");
2202 __WDP_LOG_FUNC_EXIT__;
2206 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2208 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2209 event.event_id = WFD_OEM_EVENT_DISCOVERY_FINISHED;
2211 if (g_pd->callback->discovery_finished_cb)
2212 g_pd->callback->discovery_finished_cb(&event);
2214 __WDP_LOG_FUNC_EXIT__;
2217 static void _ws_process_prov_disc_req_display_pin(GDBusConnection *connection,
2218 const gchar *sender, const gchar *object_path, const gchar *interface,
2219 const gchar *signal, GVariant *parameters, gpointer user_data)
2221 __WDP_LOG_FUNC_ENTER__;
2222 wfd_oem_event_s event;
2223 wfd_oem_dev_data_s *edata = NULL;
2224 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2225 static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
2226 const char *path = NULL;
2227 const char *pin = NULL;
2230 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2232 if (!g_pd || !g_pd->callback) {
2233 WDP_LOGD("Ignoring event");
2234 __WDP_LOG_FUNC_EXIT__;
2238 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
2240 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2241 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2242 WDP_LOGF("Failed to allocate memory for event. [%s]",
2244 __WDP_LOG_FUNC_EXIT__;
2247 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2249 event.edata = (void*) edata;
2250 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
2251 event.event_id = WFD_OEM_EVENT_PROV_DISC_REQ;
2252 event.wps_mode = WFD_OEM_WPS_MODE_DISPLAY;
2254 g_variant_get(parameters, "(&o&s)", &path, &pin);
2255 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
2256 WDP_LOGD("Retrive Added path [%s]", peer_path);
2258 loc = strrchr(peer_path, '/');
2260 __ws_mac_compact_to_normal(loc + 1, peer_dev);
2261 __ws_txt_to_mac(peer_dev, event.dev_addr);
2262 WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(event.dev_addr));
2264 g_strlcpy(event.wps_pin, pin, WS_PINSTR_LEN + 1);
2265 WDP_LOGD("Retrive pin [%s]", event.wps_pin);
2267 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2268 __ws_peer_property, event.edata);
2270 if (g_pd->callback->prov_disc_req_cb)
2271 g_pd->callback->prov_disc_req_cb(&event);
2273 g_free(event.edata);
2275 __WDP_LOG_FUNC_EXIT__;
2278 static void _ws_process_prov_disc_resp_display_pin(GDBusConnection *connection,
2279 const gchar *sender, const gchar *object_path, const gchar *interface,
2280 const gchar *signal, GVariant *parameters, gpointer user_data)
2282 __WDP_LOG_FUNC_ENTER__;
2283 wfd_oem_event_s event;
2284 wfd_oem_dev_data_s *edata = NULL;
2285 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2286 static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
2287 const char *path = NULL;
2288 const char *pin = NULL;
2291 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2293 if (!g_pd || !g_pd->callback) {
2294 WDP_LOGD("Ignoring event");
2295 __WDP_LOG_FUNC_EXIT__;
2299 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
2301 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2302 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2303 WDP_LOGF("Failed to allocate memory for event. [%s]",
2305 __WDP_LOG_FUNC_EXIT__;
2308 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2310 event.edata = (void*) edata;
2311 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
2312 event.event_id = WFD_OEM_EVENT_PROV_DISC_RESP;
2313 event.wps_mode = WFD_OEM_WPS_MODE_DISPLAY;
2315 g_variant_get(parameters, "(&o&s)", &path, &pin);
2316 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
2317 WDP_LOGD("Retrive Added path [%s]", peer_path);
2319 loc = strrchr(peer_path, '/');
2321 __ws_mac_compact_to_normal(loc + 1, peer_dev);
2322 __ws_txt_to_mac(peer_dev, event.dev_addr);
2323 WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(event.dev_addr));
2325 g_strlcpy(event.wps_pin, pin, WS_PINSTR_LEN + 1);
2326 WDP_LOGD("Retrive pin [%s]", event.wps_pin);
2328 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2329 __ws_peer_property, event.edata);
2331 if (g_pd->callback->prov_disc_resp_cb)
2332 g_pd->callback->prov_disc_resp_cb(&event);
2334 g_free(event.edata);
2336 __WDP_LOG_FUNC_EXIT__;
2339 static void _ws_process_prov_disc_req_enter_pin(GDBusConnection *connection,
2340 const gchar *sender, const gchar *object_path, const gchar *interface,
2341 const gchar *signal, GVariant *parameters, gpointer user_data)
2343 __WDP_LOG_FUNC_ENTER__;
2344 wfd_oem_event_s event;
2345 wfd_oem_dev_data_s *edata = NULL;
2346 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2348 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2350 if (!g_pd || !g_pd->callback) {
2351 WDP_LOGD("Ignoring event");
2352 __WDP_LOG_FUNC_EXIT__;
2356 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
2358 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2359 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2360 WDP_LOGF("Failed to allocate memory for event. [%s]",
2362 __WDP_LOG_FUNC_EXIT__;
2365 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2367 event.edata = (void*) edata;
2368 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
2369 event.event_id = WFD_OEM_EVENT_PROV_DISC_REQ;
2370 event.wps_mode = WFD_OEM_WPS_MODE_KEYPAD;
2372 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
2374 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2375 __ws_peer_property, event.edata);
2377 if (g_pd->callback->prov_disc_req_cb)
2378 g_pd->callback->prov_disc_req_cb(&event);
2380 g_free(event.edata);
2382 __WDP_LOG_FUNC_EXIT__;
2385 static void _ws_process_prov_disc_resp_enter_pin(GDBusConnection *connection,
2386 const gchar *sender, const gchar *object_path, const gchar *interface,
2387 const gchar *signal, GVariant *parameters, gpointer user_data)
2389 __WDP_LOG_FUNC_ENTER__;
2390 wfd_oem_event_s event;
2391 wfd_oem_dev_data_s *edata = NULL;
2392 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2394 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2396 if (!g_pd || !g_pd->callback) {
2397 WDP_LOGD("Ignoring event");
2398 __WDP_LOG_FUNC_EXIT__;
2402 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
2404 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2405 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2406 WDP_LOGF("Failed to allocate memory for event. [%s]",
2408 __WDP_LOG_FUNC_EXIT__;
2411 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2413 event.edata = (void*) edata;
2414 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
2415 event.event_id = WFD_OEM_EVENT_PROV_DISC_RESP;
2416 event.wps_mode = WFD_OEM_WPS_MODE_KEYPAD;
2418 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
2420 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2421 __ws_peer_property, event.edata);
2423 if (g_pd->callback->prov_disc_resp_cb)
2424 g_pd->callback->prov_disc_resp_cb(&event);
2426 g_free(event.edata);
2428 __WDP_LOG_FUNC_EXIT__;
2431 static void _ws_process_prov_disc_pbc_req(GDBusConnection *connection,
2432 const gchar *sender, const gchar *object_path, const gchar *interface,
2433 const gchar *signal, GVariant *parameters, gpointer user_data)
2435 __WDP_LOG_FUNC_ENTER__;
2436 wfd_oem_event_s event;
2437 wfd_oem_dev_data_s *edata = NULL;
2438 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2440 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2442 if (!g_pd || !g_pd->callback) {
2443 WDP_LOGD("Ignoring event");
2444 __WDP_LOG_FUNC_EXIT__;
2448 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
2450 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2451 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2452 WDP_LOGF("Failed to allocate memory for event. [%s]",
2454 __WDP_LOG_FUNC_EXIT__;
2457 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2459 event.edata = (void*) edata;
2460 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
2461 event.event_id = WFD_OEM_EVENT_PROV_DISC_REQ;
2462 event.wps_mode = WFD_OEM_WPS_MODE_PBC;
2464 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
2466 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2467 __ws_peer_property, event.edata);
2469 if (g_pd->callback->prov_disc_req_cb)
2470 g_pd->callback->prov_disc_req_cb(&event);
2472 g_free(event.edata);
2474 __WDP_LOG_FUNC_EXIT__;
2477 static void _ws_process_prov_disc_pbc_resp(GDBusConnection *connection,
2478 const gchar *sender, const gchar *object_path, const gchar *interface,
2479 const gchar *signal, GVariant *parameters, gpointer user_data)
2481 __WDP_LOG_FUNC_ENTER__;
2482 wfd_oem_event_s event;
2483 wfd_oem_dev_data_s *edata = NULL;
2484 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2486 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2488 if (!g_pd || !g_pd->callback) {
2489 WDP_LOGD("Ignoring event");
2490 __WDP_LOG_FUNC_EXIT__;
2494 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
2496 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2497 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2498 WDP_LOGF("Failed to allocate memory for event. [%s]",
2500 __WDP_LOG_FUNC_EXIT__;
2503 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2505 event.edata = (void*) edata;
2506 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
2507 event.event_id = WFD_OEM_EVENT_PROV_DISC_RESP;
2508 event.wps_mode = WFD_OEM_WPS_MODE_PBC;
2510 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
2512 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2513 __ws_peer_property, event.edata);
2515 if (g_pd->callback->prov_disc_resp_cb)
2516 g_pd->callback->prov_disc_resp_cb(&event);
2518 g_free(event.edata);
2520 __WDP_LOG_FUNC_EXIT__;
2523 static void _ws_process_prov_disc_failure(GDBusConnection *connection,
2524 const gchar *sender, const gchar *object_path, const gchar *interface,
2525 const gchar *signal, GVariant *parameters, gpointer user_data)
2527 __WDP_LOG_FUNC_ENTER__;
2528 GVariantIter *iter = NULL;
2529 wfd_oem_event_s event;
2530 wfd_oem_asp_prov_s *edata;
2532 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2534 if (!g_pd || !g_pd->callback) {
2535 WDP_LOGD("Ignoring event");
2536 __WDP_LOG_FUNC_EXIT__;
2540 edata = (wfd_oem_asp_prov_s *) g_try_malloc0(sizeof(wfd_oem_asp_prov_s));
2542 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2543 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2544 WDP_LOGF("Failed to allocate memory for event. [%s]",
2546 __WDP_LOG_FUNC_EXIT__;
2549 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2551 event.edata = (void*) edata;
2552 event.event_id = WFD_OEM_EVENT_PROV_DISC_FAIL;
2554 if (parameters != NULL) {
2555 g_variant_get(parameters, "(a{sv})", &iter);
2557 dbus_property_foreach(iter, __ws_extract_provision_fail_details, &event);
2558 event.edata_type = WFD_OEM_EDATA_TYPE_ASP_PROV;
2559 g_variant_iter_free(iter);
2562 WDP_LOGE("No Properties");
2565 if (g_pd->callback->prov_disc_fail_cb)
2566 g_pd->callback->prov_disc_fail_cb(&event);
2568 if (event.edata_type == WFD_OEM_EDATA_TYPE_ASP_PROV)
2569 g_free(edata->session_information);
2572 __WDP_LOG_FUNC_EXIT__;
2575 static void _ws_process_group_started(GDBusConnection *connection,
2576 const gchar *sender, const gchar *object_path, const gchar *interface,
2577 const gchar *signal, GVariant *parameters, gpointer user_data)
2579 __WDP_LOG_FUNC_ENTER__;
2580 GVariantIter *iter = NULL;
2581 wfd_oem_event_s event;
2582 wfd_oem_group_data_s *edata = NULL;
2584 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2586 if (!g_pd || !g_pd->callback) {
2587 WDP_LOGD("Ignoring event");
2588 __WDP_LOG_FUNC_EXIT__;
2592 edata = (wfd_oem_group_data_s*)calloc(1, sizeof(wfd_oem_group_data_s));
2594 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2595 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2596 WDP_LOGF("Failed to allocate memory for event. [%s]",
2598 __WDP_LOG_FUNC_EXIT__;
2601 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2603 event.edata = (void*) edata;
2604 event.edata_type = WFD_OEM_EDATA_TYPE_GROUP;
2605 event.event_id = WFD_OEM_EVENT_GROUP_CREATED;
2607 if (parameters != NULL) {
2608 g_variant_get(parameters, "(a{sv})", &iter);
2611 dbus_property_foreach(iter, __ws_extract_group_details, &event);
2612 g_variant_iter_free(iter);
2615 WDP_LOGE("No properties");
2618 if (g_pd->callback->group_created_cb)
2619 g_pd->callback->group_created_cb(&event);
2621 g_free(event.edata);
2623 __WDP_LOG_FUNC_EXIT__;
2626 static void _ws_process_go_neg_success(GDBusConnection *connection,
2627 const gchar *sender, const gchar *object_path, const gchar *interface,
2628 const gchar *signal, GVariant *parameters, gpointer user_data)
2630 __WDP_LOG_FUNC_ENTER__;
2631 GVariantIter *iter = NULL;
2632 wfd_oem_event_s event;
2633 wfd_oem_conn_data_s *edata = NULL;
2635 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2637 if (!g_pd || !g_pd->callback) {
2638 WDP_LOGD("Ignoring event");
2639 __WDP_LOG_FUNC_EXIT__;
2643 edata = (wfd_oem_conn_data_s*)calloc(1, sizeof(wfd_oem_conn_data_s));
2645 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2646 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2647 WDP_LOGF("Failed to allocate memory for event. [%s]",
2649 __WDP_LOG_FUNC_EXIT__;
2652 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2654 event.edata = edata;
2655 event.edata_type = WFD_OEM_EDATA_TYPE_CONN;
2656 event.event_id = WFD_OEM_EVENT_GO_NEG_DONE;
2658 if (parameters != NULL) {
2659 g_variant_get(parameters, "(a{sv})", &iter);
2662 dbus_property_foreach(iter, __ws_extract_gonegsuccess_details, &event);
2663 g_variant_iter_free(iter);
2666 WDP_LOGE("No properties");
2669 if (g_pd->callback->go_neg_done_cb)
2670 g_pd->callback->go_neg_done_cb(&event);
2674 __WDP_LOG_FUNC_EXIT__;
2677 static void _ws_process_go_neg_failure(GDBusConnection *connection,
2678 const gchar *sender, const gchar *object_path, const gchar *interface,
2679 const gchar *signal, GVariant *parameters, gpointer user_data)
2681 __WDP_LOG_FUNC_ENTER__;
2682 GVariantIter *iter = NULL;
2683 wfd_oem_event_s event;
2684 wfd_oem_conn_data_s *edata = NULL;
2686 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2688 if (!g_pd || !g_pd->callback) {
2689 WDP_LOGD("Ignoring event");
2690 __WDP_LOG_FUNC_EXIT__;
2694 edata = (wfd_oem_conn_data_s *) g_try_malloc0(sizeof(wfd_oem_conn_data_s));
2696 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2697 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2698 WDP_LOGF("Failed to allocate memory for event. [%s]",
2700 __WDP_LOG_FUNC_EXIT__;
2703 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2705 event.edata = (void*) edata;
2706 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
2707 event.event_id = WFD_OEM_EVENT_GO_NEG_FAIL;
2709 if (parameters != NULL) {
2710 g_variant_get(parameters, "(a{sv})", &iter);
2713 dbus_property_foreach(iter, __ws_extract_gonegfailaure_details, &event);
2714 g_variant_iter_free(iter);
2717 WDP_LOGE("No properties");
2720 if (g_pd->callback->go_neg_fail_cb)
2721 g_pd->callback->go_neg_fail_cb(&event);
2723 g_free(event.edata);
2725 __WDP_LOG_FUNC_EXIT__;
2728 static void _ws_process_go_neg_request(GDBusConnection *connection,
2729 const gchar *sender, const gchar *object_path, const gchar *interface,
2730 const gchar *signal, GVariant *parameters, gpointer user_data)
2732 __WDP_LOG_FUNC_ENTER__;
2733 wfd_oem_event_s event;
2734 wfd_oem_dev_data_s *edata = NULL;
2735 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2736 static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
2737 const char *path = NULL;
2739 int dev_passwd_id = 0;
2740 int device_go_intent = 0;
2742 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2744 if (!g_pd || !g_pd->callback) {
2745 WDP_LOGD("Ignoring event");
2746 __WDP_LOG_FUNC_EXIT__;
2750 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
2752 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2753 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2754 WDP_LOGF("Failed to allocate memory for event. [%s]",
2756 __WDP_LOG_FUNC_EXIT__;
2759 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2761 event.edata = (void*) edata;
2762 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
2763 event.event_id = WFD_OEM_EVENT_GO_NEG_REQ;
2765 g_variant_get(parameters, "(&oqy)", &path, &dev_passwd_id, &device_go_intent);
2766 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
2768 WDP_LOGD("Retrive peer path [%s]", peer_path);
2769 WDP_LOGD("Retrive dev_passwd_id [%d]", dev_passwd_id);
2770 WDP_LOGD("Retrive device_go_intent [%d]", device_go_intent);
2772 if (dev_passwd_id == WS_DEV_PASSWD_ID_PUSH_BUTTON)
2773 event.wps_mode = WFD_OEM_WPS_MODE_PBC;
2774 else if (dev_passwd_id == WS_DEV_PASSWD_ID_REGISTRAR_SPECIFIED)
2775 event.wps_mode = WFD_OEM_WPS_MODE_DISPLAY;
2776 else if (dev_passwd_id == WS_DEV_PASSWD_ID_USER_SPECIFIED)
2777 event.wps_mode = WFD_OEM_WPS_MODE_KEYPAD;
2779 event.wps_mode = WFD_OEM_WPS_MODE_NONE;
2780 edata->device_go_intent = device_go_intent;
2782 loc = strrchr(peer_path, '/');
2784 __ws_mac_compact_to_normal(loc + 1, peer_dev);
2785 __ws_txt_to_mac(peer_dev, event.dev_addr);
2786 WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(event.dev_addr));
2788 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2789 __ws_peer_property, event.edata);
2791 if (g_pd->callback->go_neg_req_cb)
2792 g_pd->callback->go_neg_req_cb(&event);
2794 g_free(event.edata);
2796 __WDP_LOG_FUNC_EXIT__;
2798 static void _ws_process_invitation_received(GDBusConnection *connection,
2799 const gchar *sender, const gchar *object_path, const gchar *interface,
2800 const gchar *signal, GVariant *parameters, gpointer user_data)
2802 __WDP_LOG_FUNC_ENTER__;
2803 GVariantIter *iter = NULL;
2804 wfd_oem_event_s event;
2805 wfd_oem_invite_data_s *edata = NULL;
2807 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2809 if (!g_pd || !g_pd->callback) {
2810 WDP_LOGD("Ignoring event");
2811 __WDP_LOG_FUNC_EXIT__;
2815 edata = (wfd_oem_invite_data_s *) g_try_malloc0(sizeof(wfd_oem_invite_data_s));
2817 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2818 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2819 WDP_LOGF("Failed to allocate memory for event. [%s]",
2821 __WDP_LOG_FUNC_EXIT__;
2824 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2826 event.edata = (void*) edata;
2827 event.edata_type = WFD_OEM_EDATA_TYPE_INVITE;
2828 event.event_id = WFD_OEM_EVENT_INVITATION_REQ;
2830 if (parameters != NULL) {
2831 g_variant_get(parameters, "(a{sv})", &iter);
2834 dbus_property_foreach(iter, __ws_extract_invitation_details, &event);
2835 g_variant_iter_free(iter);
2838 WDP_LOGE("No properties");
2840 memcpy(&(event.dev_addr), edata->sa, OEM_MACADDR_LEN);
2842 if (g_pd->callback->invitation_req_cb)
2843 g_pd->callback->invitation_req_cb(&event);
2845 g_free(event.edata);
2847 __WDP_LOG_FUNC_EXIT__;
2850 static void _ws_process_invitation_result(GDBusConnection *connection,
2851 const gchar *sender, const gchar *object_path, const gchar *interface,
2852 const gchar *signal, GVariant *parameters, gpointer user_data)
2854 __WDP_LOG_FUNC_ENTER__;
2855 wfd_oem_event_s event;
2857 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2859 if (!g_pd || !g_pd->callback) {
2860 WDP_LOGD("Ignoring event");
2861 __WDP_LOG_FUNC_EXIT__;
2865 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2867 __WDP_LOG_FUNC_EXIT__;
2870 static void _ws_process_group_finished(GDBusConnection *connection,
2871 const gchar *sender, const gchar *object_path, const gchar *interface,
2872 const gchar *signal, GVariant *parameters, gpointer user_data)
2874 __WDP_LOG_FUNC_ENTER__;
2875 wfd_oem_event_s event;
2878 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2880 if (!g_pd || !g_pd->callback) {
2881 WDP_LOGD("Ignoring event");
2882 __WDP_LOG_FUNC_EXIT__;
2886 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2888 event.event_id = WFD_OEM_EVENT_GROUP_DESTROYED;
2889 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2891 for (i = 0; ws_group_signal_map[i].member != NULL; i++) {
2892 g_dbus_connection_signal_unsubscribe(g_pd->g_dbus, ws_group_signal_map[i].sub_id);
2893 ws_group_signal_map[i].sub_id = 0;
2895 memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
2898 if (g_pd->callback->group_destroyed_cb)
2899 g_pd->callback->group_destroyed_cb(&event);
2901 __WDP_LOG_FUNC_EXIT__;
2904 static void _ws_process_service_discovery_response(GDBusConnection *connection,
2905 const gchar *sender, const gchar *object_path, const gchar *interface,
2906 const gchar *signal, GVariant *parameters, gpointer user_data)
2908 __WDP_LOG_FUNC_ENTER__;
2909 GVariantIter *iter = NULL;
2910 wfd_oem_event_s event;
2912 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2914 if (!g_pd || !g_pd->callback) {
2915 WDP_LOGD("Ignoring event");
2916 __WDP_LOG_FUNC_EXIT__;
2920 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2922 event.event_id = WFD_OEM_EVENT_SERV_DISC_RESP;
2924 if (parameters != NULL) {
2925 g_variant_get(parameters, "(a{sv})", &iter);
2927 dbus_property_foreach(iter, __ws_extract_servicediscoveryresponse_details, &event);
2928 event.edata_type = WFD_OEM_EDATA_TYPE_NEW_SERVICE;
2929 g_variant_iter_free(iter);
2932 WDP_LOGE("No Properties");
2935 if (g_pd->callback->serv_disc_resp_cb)
2936 g_pd->callback->serv_disc_resp_cb(&event);
2938 if (event.edata_type == WFD_OEM_EDATA_TYPE_NEW_SERVICE)
2939 g_list_free((GList*) event.edata);
2941 __WDP_LOG_FUNC_EXIT__;
2944 static void _ws_process_service_asp_response(GDBusConnection *connection,
2945 const gchar *sender, const gchar *object_path, const gchar *interface,
2946 const gchar *signal, GVariant *parameters, gpointer user_data)
2948 __WDP_LOG_FUNC_ENTER__;
2949 GVariantIter *iter = NULL;
2950 wfd_oem_event_s event;
2951 wfd_oem_asp_service_s *service = NULL;
2952 wfd_oem_asp_service_s *tmp = NULL;
2954 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2956 if (!g_pd || !g_pd->callback) {
2957 WDP_LOGD("Ignoring event");
2958 __WDP_LOG_FUNC_EXIT__;
2962 service = (wfd_oem_asp_service_s *) g_try_malloc0(sizeof(wfd_oem_asp_service_s));
2964 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
2965 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
2966 WDP_LOGF("Failed to allocate memory for event. [%s]",
2968 __WDP_LOG_FUNC_EXIT__;
2971 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2973 event.edata = (void*) service;
2974 event.edata_type = WFD_OEM_EDATA_TYPE_ASP_SERVICE;
2975 event.event_id = WFD_OEM_EVENT_ASP_SERV_RESP;
2977 if (parameters != NULL) {
2978 g_variant_get(parameters, "(a{sv})", &iter);
2980 dbus_property_foreach(iter, __ws_extract_serviceaspresponse_details, &event);
2981 g_variant_iter_free(iter);
2984 WDP_LOGE("No Properties");
2986 GLIST_ITER_START(seek_list, tmp)
2987 if (tmp->tran_id == service->tran_id) {
2988 WDP_LOGD("srv_trans_id matched [%d] search_id [%llu]"
2989 , tmp->tran_id, tmp->search_id);
2990 service->search_id = tmp->search_id;
2997 if (tmp != NULL && tmp->service_info != NULL) {
2998 if (g_pd->callback->asp_serv_resp_cb)
2999 g_pd->callback->asp_serv_resp_cb(&event);
3001 WDP_LOGD("service info is not required, don't notify to user");
3004 g_free(service->service_type);
3005 g_free(service->service_info);
3008 __WDP_LOG_FUNC_EXIT__;
3011 static void _ws_process_persistent_group_added(GDBusConnection *connection,
3012 const gchar *sender, const gchar *object_path, const gchar *interface,
3013 const gchar *signal, GVariant *parameters, gpointer user_data)
3015 __WDP_LOG_FUNC_ENTER__;
3016 wfd_oem_event_s event;
3018 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3020 if (!g_pd || !g_pd->callback) {
3021 WDP_LOGD("Ignoring event");
3022 __WDP_LOG_FUNC_EXIT__;
3026 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3028 __WDP_LOG_FUNC_EXIT__;
3031 static void _ws_process_persistent_group_removed(GDBusConnection *connection,
3032 const gchar *sender, const gchar *object_path, const gchar *interface,
3033 const gchar *signal, GVariant *parameters, gpointer user_data)
3035 __WDP_LOG_FUNC_ENTER__;
3036 wfd_oem_event_s event;
3038 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3040 if (!g_pd || !g_pd->callback) {
3041 WDP_LOGD("Ignoring event");
3042 __WDP_LOG_FUNC_EXIT__;
3046 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3048 __WDP_LOG_FUNC_EXIT__;
3051 static void _ws_process_wps_failed(GDBusConnection *connection,
3052 const gchar *sender, const gchar *object_path, const gchar *interface,
3053 const gchar *signal, GVariant *parameters, gpointer user_data)
3055 __WDP_LOG_FUNC_ENTER__;
3056 GVariantIter *iter = NULL;
3057 wfd_oem_event_s event;
3058 const char *name = NULL;
3060 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3062 if (!g_pd || !g_pd->callback) {
3063 WDP_LOGD("Ignoring event");
3064 __WDP_LOG_FUNC_EXIT__;
3068 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3070 event.event_id = WFD_OEM_EVENT_WPS_FAIL;
3071 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
3073 g_variant_get(parameters, "(&sa{sv})", &name, &iter);
3075 WDP_LOGD("code [%s]", name);
3080 GVariant *value = NULL;
3082 while (g_variant_iter_loop(iter, "{sv}", &key, &value))
3083 CHECK_KEY_VALUE(key, value);
3085 g_variant_iter_free(iter);
3088 if (g_pd->callback->wps_fail_cb)
3089 g_pd->callback->wps_fail_cb(&event);
3091 __WDP_LOG_FUNC_EXIT__;
3094 static void _ws_process_group_formation_failure(GDBusConnection *connection,
3095 const gchar *sender, const gchar *object_path, const gchar *interface,
3096 const gchar *signal, GVariant *parameters, gpointer user_data)
3098 __WDP_LOG_FUNC_ENTER__;
3099 wfd_oem_event_s event;
3101 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3103 if (!g_pd || !g_pd->callback) {
3104 WDP_LOGD("Ignoring event");
3105 __WDP_LOG_FUNC_EXIT__;
3109 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3111 event.event_id = WFD_OEM_EVENT_GROUP_FORMATION_FAILURE;
3112 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
3114 if (g_pd->callback->group_formation_failure_cb)
3115 g_pd->callback->group_formation_failure_cb(&event);
3117 __WDP_LOG_FUNC_EXIT__;
3120 static void _ws_process_invitation_accepted(GDBusConnection *connection,
3121 const gchar *sender, const gchar *object_path, const gchar *interface,
3122 const gchar *signal, GVariant *parameters, gpointer user_data)
3124 __WDP_LOG_FUNC_ENTER__;
3125 GVariantIter *iter = NULL;
3126 wfd_oem_event_s event;
3128 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3130 if (!g_pd || !g_pd->callback) {
3131 WDP_LOGD("Ignoring event");
3132 __WDP_LOG_FUNC_EXIT__;
3136 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3138 event.event_id = WFD_OEM_EVENT_INVITATION_ACCEPTED;
3139 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
3141 if (parameters != NULL) {
3142 g_variant_get(parameters, "(a{sv})", &iter);
3146 GVariant *value = NULL;
3148 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
3149 CHECK_KEY_VALUE(key, value);
3151 if (g_strcmp0(key, "sa") == 0)
3152 if (__ws_unpack_ay(event.dev_addr, value, WS_MACADDR_LEN))
3153 WDP_LOGI("[" MACSTR "]", MAC2STR(event.dev_addr));
3155 g_variant_iter_free(iter);
3159 if (g_pd->callback->invitation_accepted_cb)
3160 g_pd->callback->invitation_accepted_cb(&event);
3162 __WDP_LOG_FUNC_EXIT__;
3165 static void _ws_process_asp_provision_start(GDBusConnection *connection,
3166 const gchar *sender, const gchar *object_path, const gchar *interface,
3167 const gchar *signal, GVariant *parameters, gpointer user_data)
3169 __WDP_LOG_FUNC_ENTER__;
3170 GVariantIter *iter = NULL;
3171 wfd_oem_event_s event;
3172 wfd_oem_asp_prov_s *edata;
3174 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3176 if (!g_pd || !g_pd->callback) {
3177 WDP_LOGD("Ignoring event");
3178 __WDP_LOG_FUNC_EXIT__;
3182 edata = (wfd_oem_asp_prov_s *) g_try_malloc0(sizeof(wfd_oem_asp_prov_s));
3184 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
3185 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
3186 WDP_LOGF("Failed to allocate memory for event. [%s]",
3188 __WDP_LOG_FUNC_EXIT__;
3191 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3193 event.edata = (void*) edata;
3194 event.event_id = WFD_OEM_EVENT_ASP_PROV_START;
3196 if (parameters != NULL) {
3197 g_variant_get(parameters, "(a{sv})", &iter);
3199 dbus_property_foreach(iter, __ws_extract_asp_provision_start_details, &event);
3200 event.edata_type = WFD_OEM_EDATA_TYPE_ASP_PROV;
3201 g_variant_iter_free(iter);
3204 WDP_LOGE("No Properties");
3207 if (g_pd->callback->asp_prov_start_cb)
3208 g_pd->callback->asp_prov_start_cb(&event);
3210 if (event.edata_type == WFD_OEM_EDATA_TYPE_ASP_PROV)
3211 g_free(edata->session_information);
3214 __WDP_LOG_FUNC_EXIT__;
3217 static void _ws_process_asp_provision_done(GDBusConnection *connection,
3218 const gchar *sender, const gchar *object_path, const gchar *interface,
3219 const gchar *signal, GVariant *parameters, gpointer user_data)
3221 __WDP_LOG_FUNC_ENTER__;
3222 GVariantIter *iter = NULL;
3223 wfd_oem_event_s event;
3224 wfd_oem_asp_prov_s *edata;
3226 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3228 if (!g_pd || !g_pd->callback) {
3229 WDP_LOGD("Ignoring event");
3230 __WDP_LOG_FUNC_EXIT__;
3234 edata = (wfd_oem_asp_prov_s *) g_try_malloc0(sizeof(wfd_oem_asp_prov_s));
3236 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
3237 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
3238 WDP_LOGF("Failed to allocate memory for event. [%s]",
3240 __WDP_LOG_FUNC_EXIT__;
3243 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3245 event.edata = (void*) edata;
3246 event.event_id = WFD_OEM_EVENT_ASP_PROV_DONE;
3248 if (parameters != NULL) {
3249 g_variant_get(parameters, "(a{sv})", &iter);
3251 dbus_property_foreach(iter, __ws_extract_asp_provision_done_details, &event);
3252 event.edata_type = WFD_OEM_EDATA_TYPE_ASP_PROV;
3253 g_variant_iter_free(iter);
3256 WDP_LOGE("No Properties");
3259 if (g_pd->callback->asp_prov_done_cb)
3260 g_pd->callback->asp_prov_done_cb(&event);
3264 __WDP_LOG_FUNC_EXIT__;
3269 const char *interface;
3271 void (*function) (GDBusConnection *connection,
3272 const gchar *sender, const gchar *object_path, const gchar *interface,
3273 const gchar *signal, GVariant *parameters, gpointer user_data);
3274 } ws_p2pdevice_signal_map[] = {
3277 SUPPLICANT_P2PDEVICE,
3278 "DeviceFoundProperties",
3279 _ws_process_device_found_properties
3283 SUPPLICANT_P2PDEVICE,
3285 _ws_process_device_lost
3289 SUPPLICANT_P2PDEVICE,
3291 _ws_process_find_stoppped
3295 SUPPLICANT_P2PDEVICE,
3296 "ProvisionDiscoveryRequestDisplayPin",
3297 _ws_process_prov_disc_req_display_pin
3301 SUPPLICANT_P2PDEVICE,
3302 "ProvisionDiscoveryResponseDisplayPin",
3303 _ws_process_prov_disc_resp_display_pin
3307 SUPPLICANT_P2PDEVICE,
3308 "ProvisionDiscoveryRequestEnterPin",
3309 _ws_process_prov_disc_req_enter_pin
3313 SUPPLICANT_P2PDEVICE,
3314 "ProvisionDiscoveryResponseEnterPin",
3315 _ws_process_prov_disc_resp_enter_pin
3319 SUPPLICANT_P2PDEVICE,
3320 "ProvisionDiscoveryPBCRequest",
3321 _ws_process_prov_disc_pbc_req
3325 SUPPLICANT_P2PDEVICE,
3326 "ProvisionDiscoveryPBCResponse",
3327 _ws_process_prov_disc_pbc_resp
3331 SUPPLICANT_P2PDEVICE,
3332 "ProvisionDiscoveryFailure",
3333 _ws_process_prov_disc_failure
3337 SUPPLICANT_P2PDEVICE,
3339 _ws_process_group_started
3343 SUPPLICANT_P2PDEVICE,
3344 "GONegotiationSuccess",
3345 _ws_process_go_neg_success
3349 SUPPLICANT_P2PDEVICE,
3350 "GONegotiationFailure",
3351 _ws_process_go_neg_failure
3355 SUPPLICANT_P2PDEVICE,
3356 "GONegotiationRequest",
3357 _ws_process_go_neg_request
3361 SUPPLICANT_P2PDEVICE,
3362 "InvitationReceived",
3363 _ws_process_invitation_received
3367 SUPPLICANT_P2PDEVICE,
3369 _ws_process_invitation_result
3373 SUPPLICANT_P2PDEVICE,
3375 _ws_process_group_finished
3379 SUPPLICANT_P2PDEVICE,
3380 "ServiceDiscoveryResponse",
3381 _ws_process_service_discovery_response
3385 SUPPLICANT_P2PDEVICE,
3386 "ServiceASPResponse",
3387 _ws_process_service_asp_response
3391 SUPPLICANT_P2PDEVICE,
3392 "ASPProvisionStart",
3393 _ws_process_asp_provision_start
3397 SUPPLICANT_P2PDEVICE,
3399 _ws_process_asp_provision_done
3403 SUPPLICANT_P2PDEVICE,
3404 "PersistentGroupAdded",
3405 _ws_process_persistent_group_added
3409 SUPPLICANT_P2PDEVICE,
3410 "PersistentGroupRemoved",
3411 _ws_process_persistent_group_removed
3415 SUPPLICANT_P2PDEVICE,
3417 _ws_process_wps_failed
3421 SUPPLICANT_P2PDEVICE,
3422 "GroupFormationFailure",
3423 _ws_process_group_formation_failure
3427 SUPPLICANT_P2PDEVICE,
3428 "InvitationAccepted",
3429 _ws_process_invitation_accepted
3439 static void _ws_process_sta_authorized(GDBusConnection *connection,
3440 const gchar *sender, const gchar *object_path, const gchar *interface,
3441 const gchar *signal, GVariant *parameters, gpointer user_data)
3443 __WDP_LOG_FUNC_ENTER__;
3444 wfd_oem_event_s event;
3445 const gchar* mac_str = NULL;
3447 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3449 if (!g_pd || !g_pd->callback) {
3450 WDP_LOGD("Ignoring event");
3451 __WDP_LOG_FUNC_EXIT__;
3455 if (is_peer_joined_notified) {
3456 is_peer_joined_notified = 0;
3457 __WDP_LOG_FUNC_EXIT__;
3461 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3462 g_variant_get(parameters, "(&s)", &mac_str);
3463 __ws_txt_to_mac((unsigned char *)mac_str, event.intf_addr);
3465 event.event_id = WFD_OEM_EVENT_STA_CONNECTED;
3466 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
3468 if (g_pd->callback->sta_connected_cb)
3469 g_pd->callback->sta_connected_cb(&event);
3471 __WDP_LOG_FUNC_EXIT__;
3474 static void _ws_process_sta_deauthorized(GDBusConnection *connection,
3475 const gchar *sender, const gchar *object_path, const gchar *interface,
3476 const gchar *signal, GVariant *parameters, gpointer user_data)
3478 __WDP_LOG_FUNC_ENTER__;
3479 wfd_oem_event_s event;
3480 const gchar* mac_str = NULL;
3482 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
3484 if (!g_pd || !g_pd->callback) {
3485 WDP_LOGD("Ignoring event");
3486 __WDP_LOG_FUNC_EXIT__;
3490 if (is_peer_disconnected_notified) {
3491 is_peer_disconnected_notified = 0;
3492 __WDP_LOG_FUNC_EXIT__;
3496 memset(&event, 0x0, sizeof(wfd_oem_event_s));
3497 g_variant_get(parameters, "(&s)", &mac_str);
3498 __ws_txt_to_mac((unsigned char *)mac_str, event.intf_addr);
3500 event.event_id = WFD_OEM_EVENT_STA_DISCONNECTED;
3501 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
3503 if (g_pd->callback->sta_disconnected_cb)
3504 g_pd->callback->sta_disconnected_cb(&event);
3506 __WDP_LOG_FUNC_EXIT__;
3511 const char *interface;
3513 void (*function) (GDBusConnection *connection,
3514 const gchar *sender, const gchar *object_path, const gchar *interface,
3515 const gchar *signal, GVariant *parameters, gpointer user_data);
3516 } ws_interface_signal_map[] = {
3521 _ws_process_sta_authorized
3527 _ws_process_sta_deauthorized
3537 static void __register_p2pdevice_signal(GVariant *value, void *user_data)
3539 __WDP_LOG_FUNC_ENTER__;
3540 ws_dbus_plugin_data_s * pd_data;
3541 static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
3542 const char *path = NULL;
3546 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3547 __WDP_LOG_FUNC_EXIT__;
3551 pd_data = (ws_dbus_plugin_data_s *)g_pd;
3553 g_variant_get(value, "(&o)", &path);
3554 g_strlcpy(interface_path, path, DBUS_OBJECT_PATH_MAX);
3555 g_strlcpy(pd_data->iface_path, path, DBUS_OBJECT_PATH_MAX);
3557 WDP_LOGD("interface object path [%s]", interface_path);
3559 /* subscribe Interface iface signal */
3560 for (i = 0; ws_interface_signal_map[i].member != NULL; i++) {
3561 ws_interface_signal_map[i].sub_id =
3562 g_dbus_connection_signal_subscribe(pd_data->g_dbus,
3563 SUPPLICANT_SERVICE, /* bus name */
3564 ws_interface_signal_map[i].interface, /* interface */
3565 ws_interface_signal_map[i].member, /* member */
3566 pd_data->iface_path, /* object path */
3568 G_DBUS_SIGNAL_FLAGS_NONE,
3569 ws_interface_signal_map[i].function,
3571 WDP_LOGD("Subscribed Interface iface signal [%s]", ws_interface_signal_map[i].member);
3574 /* subscribe P2PDevice iface signal */
3575 for (i = 0; ws_p2pdevice_signal_map[i].member != NULL; i++) {
3576 ws_p2pdevice_signal_map[i].sub_id =
3577 g_dbus_connection_signal_subscribe(pd_data->g_dbus,
3578 SUPPLICANT_SERVICE, /* bus name */
3579 ws_p2pdevice_signal_map[i].interface, /* interface */
3580 ws_p2pdevice_signal_map[i].member, /* member */
3581 pd_data->iface_path, /* object path */
3583 G_DBUS_SIGNAL_FLAGS_NONE,
3584 ws_p2pdevice_signal_map[i].function,
3586 WDP_LOGD("Subscribed P2PDevice iface signal [%s]", ws_p2pdevice_signal_map[i].member);
3589 __WDP_LOG_FUNC_EXIT__;
3592 static int _ws_create_interface(const char *iface_name, handle_reply function, void *user_data)
3594 __WDP_LOG_FUNC_ENTER__;
3595 GDBusConnection *g_dbus = NULL;
3596 GVariantBuilder *builder = NULL;
3597 dbus_method_param_s params;
3602 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3603 __WDP_LOG_FUNC_EXIT__;
3607 g_dbus = g_pd->g_dbus;
3609 WDP_LOGE("DBus connection is NULL");
3610 __WDP_LOG_FUNC_EXIT__;
3613 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
3615 dbus_set_method_param(¶ms, "CreateInterface", SUPPLICANT_PATH, g_dbus);
3617 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
3618 g_variant_builder_add(builder, "{sv}", "Ifname", g_variant_new_string(iface_name));
3619 g_variant_builder_add(builder, "{sv}", "ConfigFile", g_variant_new_string(CONF_FILE_PATH));
3620 params.params = g_variant_new("(a{sv})", builder);
3621 g_variant_builder_unref(builder);
3622 res = dbus_method_call(¶ms, SUPPLICANT_INTERFACE, function, user_data);
3624 WDP_LOGE("Failed to send command to wpa_supplicant");
3626 WDP_LOGD("Succeeded to CreateInterface");
3628 __WDP_LOG_FUNC_EXIT__;
3632 static int _ws_get_interface(const char *iface_name, handle_reply function, void *user_data)
3634 __WDP_LOG_FUNC_ENTER__;
3635 GDBusConnection *g_dbus = NULL;
3636 dbus_method_param_s params;
3640 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3641 __WDP_LOG_FUNC_EXIT__;
3645 g_dbus = g_pd->g_dbus;
3647 WDP_LOGE("DBus connection is NULL");
3648 __WDP_LOG_FUNC_EXIT__;
3652 dbus_set_method_param(¶ms, SUPPLICANT_METHOD_GETINTERFACE,
3653 SUPPLICANT_PATH, g_pd->g_dbus);
3655 params.params = g_variant_new("(s)", iface_name);
3656 DEBUG_G_VARIANT("Params : ", params.params);
3658 res = dbus_method_call(¶ms, SUPPLICANT_INTERFACE,
3659 function, user_data);
3662 WDP_LOGE("Failed to send command to wpa_supplicant");
3664 WDP_LOGD("Succeeded to get interface");
3666 __WDP_LOG_FUNC_EXIT__;
3670 static void __ws_remove_interface(GVariant *value, void *user_data)
3672 __WDP_LOG_FUNC_ENTER__;
3673 GDBusConnection *g_dbus = NULL;
3674 dbus_method_param_s params;
3675 const char *path = NULL;
3676 static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
3680 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3684 g_dbus = g_pd->g_dbus;
3686 WDP_LOGE("DBus connection is NULL");
3690 g_variant_get(value, "(&o)", &path);
3691 g_strlcpy(interface_path, path, DBUS_OBJECT_PATH_MAX);
3692 WDP_LOGD("interface object path [%s]", interface_path);
3694 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
3696 dbus_set_method_param(¶ms, "RemoveInterface", SUPPLICANT_PATH, g_dbus);
3697 params.params = g_variant_new("(o)", interface_path);
3699 res = dbus_method_call(¶ms, SUPPLICANT_INTERFACE, NULL, NULL);
3701 WDP_LOGE("Failed to send command to wpa_supplicant");
3703 WDP_LOGD("Succeeded to RemoveInterface");
3705 __WDP_LOG_FUNC_EXIT__;
3709 static int _ws_init_dbus_connection(void)
3711 __WDP_LOG_FUNC_ENTER__;
3712 GDBusConnection *conn = NULL;
3713 GError *error = NULL;
3718 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3719 __WDP_LOG_FUNC_EXIT__;
3724 WDP_LOGE("no configurable data found");
3725 __WDP_LOG_FUNC_EXIT__;
3729 conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
3732 if (error != NULL) {
3733 WDP_LOGE("Error! Failed to connect to the D-BUS daemon: [%s]",
3735 g_error_free(error);
3737 __WDP_LOG_FUNC_EXIT__;
3741 g_pd->g_dbus = conn;
3743 for (i = 0; ws_supplicant_signal_map[i].member != NULL; i++) {
3744 ws_supplicant_signal_map[i].sub_id =
3745 g_dbus_connection_signal_subscribe(g_pd->g_dbus,
3746 SUPPLICANT_SERVICE, /* bus name */
3747 ws_supplicant_signal_map[i].interface, /* interface */
3748 ws_supplicant_signal_map[i].member, /* member */
3749 SUPPLICANT_PATH, /* object path */
3751 G_DBUS_SIGNAL_FLAGS_NONE,
3752 ws_supplicant_signal_map[i].function,
3754 WDP_LOGD("Subscribed supplicant iface signal [%s]", ws_supplicant_signal_map[i].member);
3757 if (g_strcmp0(config->ifname, config->p2p_ifname) != 0) {
3758 if (_ws_get_interface(config->ifname, NULL, NULL) < 0)
3759 res = _ws_create_interface(config->ifname, NULL, NULL);
3760 if (_ws_get_interface(config->p2p_ifname, __register_p2pdevice_signal, NULL) < 0)
3761 res = _ws_create_interface(config->p2p_ifname, __register_p2pdevice_signal, NULL);
3763 if (_ws_get_interface(config->p2p_ifname, __register_p2pdevice_signal, NULL) < 0)
3764 res = _ws_create_interface(config->p2p_ifname, __register_p2pdevice_signal, NULL);
3768 WDP_LOGE("Failed to subscribe interface signal");
3770 WDP_LOGI("Successfully register signal filters");
3772 __WDP_LOG_FUNC_EXIT__;
3776 static int _ws_deinit_dbus_connection(void)
3778 GDBusConnection *g_dbus = NULL;
3782 WDP_LOGE("Invalid parameter");
3783 __WDP_LOG_FUNC_EXIT__;
3787 g_dbus = g_pd->g_dbus;
3789 WDP_LOGE("DBus connection is NULL");
3790 __WDP_LOG_FUNC_EXIT__;
3794 for (i = 0; ws_supplicant_signal_map[i].member != NULL; i++) {
3795 g_dbus_connection_signal_unsubscribe(g_dbus, ws_supplicant_signal_map[i].sub_id);
3796 ws_supplicant_signal_map[i].sub_id = 0;
3799 for (i = 0; ws_interface_signal_map[i].member != NULL; i++) {
3800 g_dbus_connection_signal_unsubscribe(g_dbus, ws_interface_signal_map[i].sub_id);
3801 ws_interface_signal_map[i].sub_id = 0;
3804 for (i = 0; ws_p2pdevice_signal_map[i].member != NULL; i++) {
3805 g_dbus_connection_signal_unsubscribe(g_dbus, ws_p2pdevice_signal_map[i].sub_id);
3806 ws_p2pdevice_signal_map[i].sub_id = 0;
3809 for (i = 0; ws_group_signal_map[i].member != NULL; i++) {
3810 g_dbus_connection_signal_unsubscribe(g_dbus, ws_group_signal_map[i].sub_id);
3811 ws_group_signal_map[i].sub_id = 0;
3814 memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
3815 memset(g_pd->iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
3817 g_object_unref(g_dbus);
3818 __WDP_LOG_FUNC_EXIT__;
3822 int wfd_plugin_load(wfd_oem_ops_s **ops)
3824 __WDP_LOG_FUNC_ENTER__;
3826 WDP_LOGE("Invalid parameter");
3827 __WDP_LOG_FUNC_EXIT__;
3831 *ops = &supplicant_ops;
3833 __WDP_LOG_FUNC_EXIT__;
3837 static int _ws_reset_plugin(ws_dbus_plugin_data_s *f_pd)
3839 __WDP_LOG_FUNC_ENTER__;
3842 WDP_LOGE("Invalid parameter");
3843 __WDP_LOG_FUNC_EXIT__;
3847 _ws_deinit_dbus_connection();
3849 if (f_pd->activated)
3850 ws_deactivate(f_pd->concurrent);
3854 __WDP_LOG_FUNC_EXIT__;
3858 static int __ws_check_net_interface(char* if_name)
3863 if (if_name == NULL) {
3864 WDP_LOGE("Invalid param");
3868 fd = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
3870 WDP_LOGE("socket create error: %d", fd);
3874 memset(&ifr, 0, sizeof(ifr));
3875 g_strlcpy(ifr.ifr_name, if_name, IFNAMSIZ);
3877 if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) {
3879 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
3880 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
3881 WDP_LOGE("ioctl error: SIOCGIFFLAGS: %s [ %s ]", error_buf, if_name); /* interface is not found. */
3887 if (ifr.ifr_flags & IFF_UP) {
3888 WDP_LOGD("%s interface is up", if_name);
3890 } else if (!(ifr.ifr_flags & IFF_UP)) {
3891 WDP_LOGD("%s interface is down", if_name);
3897 int ws_configure(wfd_oem_config_s *conf)
3899 __WDP_LOG_FUNC_ENTER__;
3902 __WDP_LOG_FUNC_EXIT__;
3909 config = (wfd_oem_config_s *) g_try_malloc0(sizeof(wfd_oem_config_s));
3911 __WDP_LOG_FUNC_EXIT__;
3915 memcpy(config, conf, sizeof(wfd_oem_config_s));
3917 __WDP_LOG_FUNC_EXIT__;
3921 int ws_init(wfd_oem_event_cbs_s *event_cbs)
3923 __WDP_LOG_FUNC_ENTER__;
3925 if (event_cbs == NULL) {
3926 __WDP_LOG_FUNC_EXIT__;
3931 _ws_reset_plugin(g_pd);
3934 g_pd = (ws_dbus_plugin_data_s*) g_try_malloc0(sizeof(ws_dbus_plugin_data_s));
3936 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
3937 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
3938 WDP_LOGE("Failed to allocate memory for plugin data. [%s]", error_buf);
3942 g_pd->callback = event_cbs;
3943 g_pd->initialized = TRUE;
3945 __WDP_LOG_FUNC_EXIT__;
3951 __WDP_LOG_FUNC_ENTER__;
3954 _ws_reset_plugin(g_pd);
3961 __WDP_LOG_FUNC_EXIT__;
3965 gboolean _ws_util_execute_file(const char *file_path,
3966 char *const args[], char *const envs[])
3971 register unsigned int index = 0;
3972 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
3974 while (args[index] != NULL) {
3975 WDP_LOGD("[%s]", args[index]);
3979 if (!(pid = fork())) {
3980 WDP_LOGD("pid(%d), ppid(%d)", getpid(), getppid());
3981 WDP_LOGD("Inside child, exec (%s) command", file_path);
3984 if (execve(file_path, args, envs) == -1) {
3985 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
3986 WDP_LOGE("Fail to execute command (%s)", error_buf);
3989 } else if (pid > 0) {
3990 if (waitpid(pid, &rv, 0) == -1)
3991 WDP_LOGD("wait pid (%u) rv (%d)", pid, rv);
3993 WDP_LOGD("exited, rv=%d", WEXITSTATUS(rv));
3994 else if (WIFSIGNALED(rv))
3995 WDP_LOGD("killed by signal %d", WTERMSIG(rv));
3996 else if (WIFSTOPPED(rv))
3997 WDP_LOGD("stopped by signal %d", WSTOPSIG(rv));
3998 else if (WIFCONTINUED(rv))
3999 WDP_LOGD("continued");
4004 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
4005 WDP_LOGE("failed to fork (%s)", error_buf);
4009 static int __ws_p2p_firmware_start(const char *interface_name)
4011 gboolean rv = FALSE;
4012 const char *path = "/usr/bin/wlan.sh";
4013 char *const args[] = { "/usr/bin/wlan.sh", "p2p", (char *)interface_name, NULL };
4014 char *const envs[] = { NULL };
4016 rv = _ws_util_execute_file(path, args, envs);
4020 WDP_LOGI("Successfully loaded p2p device driver");
4024 static int __ws_p2p_firmware_stop(const char *interface_name)
4026 gboolean rv = FALSE;
4027 const char *path = "/usr/bin/wlan.sh";
4028 char *const args[] = { "/usr/bin/wlan.sh", "stop", (char *)interface_name, NULL };
4029 char *const envs[] = { NULL };
4030 rv = _ws_util_execute_file(path, args, envs);
4034 WDP_LOGI("Successfully removed p2p device driver");
4038 static int __ws_p2p_supplicant_start(void)
4040 gboolean rv = FALSE;
4041 const char *path = "/usr/sbin/p2p_supp.sh";
4042 char *const args[] = { "/usr/sbin/p2p_supp.sh", "start_dbus", NULL };
4043 char *const envs[] = { NULL };
4045 rv = _ws_util_execute_file(path, args, envs);
4048 WDP_LOGE("Failed to start p2p_supp.sh");
4052 WDP_LOGI("Successfully started p2p_supp.sh");
4057 static int __ws_p2p_supplicant_stop(void)
4059 gboolean rv = FALSE;
4060 const char *path = "/usr/sbin/p2p_supp.sh";
4061 char *const args[] = { "/usr/sbin/p2p_supp.sh", "stop", NULL };
4062 char *const envs[] = { NULL };
4064 rv = _ws_util_execute_file(path, args, envs);
4067 WDP_LOGE("Failed to stop p2p_supp.sh");
4071 WDP_LOGI("Successfully stopped p2p_supp.sh");
4075 static int __ws_p2p_on(void)
4078 DBusMessage *reply = NULL;
4079 DBusMessage *message = NULL;
4080 DBusConnection *connection = NULL;
4082 connection = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
4083 if (connection == NULL) {
4084 WDP_LOGE("Failed to get system bus");
4088 message = dbus_message_new_method_call(NETCONFIG_SERVICE,
4089 NETCONFIG_WIFI_PATH, NETCONFIG_WIFI_INTERFACE, "LoadP2pDriver");
4090 if (message == NULL) {
4091 WDP_LOGE("Failed DBus method call");
4092 dbus_connection_unref(connection);
4096 dbus_error_init(&error);
4098 reply = dbus_connection_send_with_reply_and_block(connection, message,
4099 NETCONFIG_DBUS_REPLY_TIMEOUT, &error);
4100 if (dbus_error_is_set(&error) == TRUE) {
4101 if (NULL != strstr(error.message, ".AlreadyExists")) {
4102 /* p2p already enabled */
4104 WDP_LOGE("dbus_connection_send_with_reply_and_block() failed. "
4105 "DBus error [%s: %s]", error.name, error.message);
4107 dbus_error_free(&error);
4110 dbus_error_free(&error);
4114 dbus_message_unref(reply);
4116 dbus_message_unref(message);
4117 dbus_connection_unref(connection);
4122 static int __ws_p2p_off(void)
4125 DBusMessage *reply = NULL;
4126 DBusMessage *message = NULL;
4127 DBusConnection *connection = NULL;
4129 connection = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
4130 if (connection == NULL) {
4131 WDP_LOGE("Failed to get system bus");
4135 message = dbus_message_new_method_call(NETCONFIG_SERVICE,
4136 NETCONFIG_WIFI_PATH, NETCONFIG_WIFI_INTERFACE, "RemoveP2pDriver");
4137 if (message == NULL) {
4138 WDP_LOGE("Failed DBus method call");
4139 dbus_connection_unref(connection);
4143 dbus_error_init(&error);
4145 reply = dbus_connection_send_with_reply_and_block(connection, message,
4146 NETCONFIG_DBUS_REPLY_TIMEOUT, &error);
4147 if (dbus_error_is_set(&error) == TRUE) {
4148 if (NULL != strstr(error.message, ".AlreadyExists")) {
4149 /* p2p already disabled */
4151 WDP_LOGE("dbus_connection_send_with_reply_and_block() failed. "
4152 "DBus error [%s: %s]", error.name, error.message);
4154 dbus_error_free(&error);
4157 dbus_error_free(&error);
4161 dbus_message_unref(reply);
4163 dbus_message_unref(message);
4164 dbus_connection_unref(connection);
4170 int __ws_init_p2pdevice(void)
4172 __WDP_LOG_FUNC_ENTER__;
4173 GDBusConnection *g_dbus = NULL;
4175 GVariant *value = NULL;
4176 GVariant *param = NULL;
4177 GVariantBuilder *builder = NULL;
4178 GVariantBuilder *type_builder = NULL;
4179 dbus_method_param_s params;
4181 unsigned char primary_device_type[8] = {
4182 0x00, 0x00, 0x00, 0x50,
4183 0xf2, 0x04, 0x00, 0x00
4190 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4191 __WDP_LOG_FUNC_EXIT__;
4196 WDP_LOGE("no configurable data found");
4197 __WDP_LOG_FUNC_EXIT__;
4201 primary_device_type[1] = config->pri_dev_type;
4202 primary_device_type[7] = config->sec_dev_type;
4204 for (i = 0; i < WS_DEVTYPE_LEN; i++)
4205 WDP_LOGD("device type[%02x]", primary_device_type[i]);
4207 g_dbus = g_pd->g_dbus;
4209 WDP_LOGE("DBus connection is NULL");
4210 __WDP_LOG_FUNC_EXIT__;
4213 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4215 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
4218 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4219 g_variant_builder_add(builder, "{sv}", "DeviceName",
4220 g_variant_new_string(config->device_name));
4222 g_variant_builder_add(builder, "{sv}", "GOIntent",
4223 g_variant_new_uint32(config->go_intent));
4225 g_variant_builder_add(builder, "{sv}", "PersistentReconnect",
4226 g_variant_new_boolean(config->persistent_reconnect));
4228 g_variant_builder_add(builder, "{sv}", "ListenRegClass",
4229 g_variant_new_uint32(config->listen_reg_class));
4231 g_variant_builder_add(builder, "{sv}", "ListenChannel",
4232 g_variant_new_uint32(config->listen_channel));
4234 g_variant_builder_add(builder, "{sv}", "OperRegClass",
4235 g_variant_new_uint32(config->operating_reg_class));
4237 g_variant_builder_add(builder, "{sv}", "OperChannel",
4238 g_variant_new_uint32(config->operating_channel));
4240 g_variant_builder_add(builder, "{sv}", "SsidPostfix",
4241 g_variant_new_string(config->device_name));
4243 g_variant_builder_add(builder, "{sv}", "NoGroupIface",
4244 g_variant_new_boolean(config->no_group_iface));
4246 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
4247 for (i = 0; i < WS_DEVTYPE_LEN; i++)
4248 g_variant_builder_add(type_builder, "y", primary_device_type[i]);
4249 g_variant_builder_add(builder, "{sv}", "PrimaryDeviceType",
4250 g_variant_new("ay", type_builder));
4251 g_variant_builder_unref(type_builder);
4252 value = g_variant_new("a{sv}", builder);
4253 g_variant_builder_unref(builder);
4255 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
4257 params.params = param;
4258 DEBUG_G_VARIANT("Params : ", params.params);
4260 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
4262 WDP_LOGE("Failed to send command to wpa_supplicant");
4264 WDP_LOGD("Succeeded to initialize p2pdevice");
4265 __WDP_LOG_FUNC_EXIT__;
4269 int __ws_set_config_methods(void)
4271 __WDP_LOG_FUNC_ENTER__;
4272 GDBusConnection *g_dbus = NULL;
4274 GVariant *value = NULL;
4275 GVariant *param = NULL;
4277 dbus_method_param_s params;
4281 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4282 __WDP_LOG_FUNC_EXIT__;
4287 WDP_LOGE("no configurable data found");
4288 __WDP_LOG_FUNC_EXIT__;
4292 g_dbus = g_pd->g_dbus;
4294 WDP_LOGE("DBus connection is NULL");
4295 __WDP_LOG_FUNC_EXIT__;
4298 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4300 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
4303 value = g_variant_new_string(config->config_methods);
4305 param = g_variant_new("(ssv)", SUPPLICANT_WPS, "ConfigMethods", value);
4306 params.params = param;
4308 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
4310 WDP_LOGE("Failed to send command to wpa_supplicant");
4312 WDP_LOGD("Succeeded to set config method(%s)", config->config_methods);
4314 __WDP_LOG_FUNC_EXIT__;
4318 int ws_activate(int concurrent)
4320 __WDP_LOG_FUNC_ENTER__;
4322 int retry_count = 0;
4325 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4326 __WDP_LOG_FUNC_EXIT__;
4331 WDP_LOGE("no configurable data found");
4332 __WDP_LOG_FUNC_EXIT__;
4336 res = __ws_p2p_supplicant_start();
4338 res = __ws_p2p_supplicant_stop();
4339 WDP_LOGI("P2P supplicant stopped with error %d", res);
4340 __WDP_LOG_FUNC_EXIT__;
4344 while (retry_count < WS_CONN_RETRY_COUNT) {
4345 /* load wlan driver */
4346 if (concurrent == 0)
4347 res = __ws_p2p_firmware_start(config->ifname);
4349 WDP_LOGE("Failed to load driver [ret=%d]", res);
4352 WDP_LOGI("P2P firmware started with error %d", res);
4354 if (__ws_check_net_interface(config->ifname) < 0) {
4355 usleep(150000); /* wait for 150ms */
4358 WDP_LOGE("interface is not up: retry, %d", retry_count);
4364 if (retry_count >= WS_CONN_RETRY_COUNT) {
4365 WDP_LOGE("Driver loading is failed [%d]", res);
4366 __WDP_LOG_FUNC_EXIT__;
4369 if (retry_count > 0) {
4370 /* Give driver marginal time to config net */
4371 WDP_LOGE("Driver loading is done. Wait marginal time for driver");
4375 g_pd->concurrent = concurrent;
4377 res = _ws_init_dbus_connection();
4379 res = __ws_p2p_supplicant_stop();
4380 WDP_LOGI("[/usr/sbin/p2p_supp.sh stop] returns %d", res);
4381 res = __ws_p2p_firmware_stop(config->ifname);
4382 WDP_LOGI("P2P firmware stopped with error %d", res);
4383 __WDP_LOG_FUNC_EXIT__;
4387 g_pd->activated = TRUE;
4388 __ws_init_p2pdevice();
4389 __ws_set_config_methods();
4392 __WDP_LOG_FUNC_EXIT__;
4396 int ws_deactivate(int concurrent)
4398 __WDP_LOG_FUNC_ENTER__;
4399 wfd_oem_asp_service_s *data = NULL;
4403 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4404 __WDP_LOG_FUNC_EXIT__;
4409 WDP_LOGE("no configurable data found");
4410 __WDP_LOG_FUNC_EXIT__;
4414 if (!g_pd->activated) {
4415 WDP_LOGE("Wi-Fi Direct is not activated");
4416 __WDP_LOG_FUNC_EXIT__;
4422 g_pd->concurrent = concurrent;
4424 if (g_strcmp0(config->ifname, config->group_ifname) != 0)
4425 _ws_get_interface(config->group_ifname, __ws_remove_interface, NULL);
4426 if (concurrent == 0)
4427 _ws_get_interface(config->ifname, __ws_remove_interface, NULL);
4429 _ws_deinit_dbus_connection();
4431 if (concurrent == 0) {
4432 res = __ws_p2p_supplicant_stop();
4433 WDP_LOGI("[/usr/sbin/p2p_supp.sh stop] returns %d", res);
4434 res = __ws_p2p_firmware_stop(config->ifname);
4435 WDP_LOGI("P2P firmware stopped with error %d", res);
4437 g_pd->activated = FALSE;
4439 GLIST_ITER_START(seek_list, data)
4442 temp = g_list_next(seek_list);
4443 seek_list = g_list_remove(seek_list, data);
4444 g_free(data->service_type);
4445 g_free(data->service_info);
4450 __WDP_LOG_FUNC_EXIT__;
4455 static gboolean _retry_start_scan(gpointer data)
4457 __WDP_LOG_FUNC_ENTER__;
4459 WDP_LOGD("Succeeded to start scan");
4461 __WDP_LOG_FUNC_EXIT__;
4466 static void __ws_add_seek_params(GVariantBuilder *builder)
4468 GVariantBuilder *outter = NULL;
4469 GVariantBuilder *inner = NULL;
4470 wfd_oem_asp_service_s *data = NULL;
4474 if (seek_list == NULL || g_list_length(seek_list) == 0) {
4475 WDP_LOGD("seek list is NULL");
4478 WDP_LOGD("seek list length [%d]", g_list_length(seek_list));
4480 outter = g_variant_builder_new(G_VARIANT_TYPE("aay"));
4482 GLIST_ITER_START(seek_list, data)
4483 if (data && data->service_type) {
4484 len = strlen(data->service_type) + 1;
4485 WDP_LOGD("data [%s] len [%d]", data->service_type, len);
4486 inner = g_variant_builder_new(G_VARIANT_TYPE("ay"));
4487 for (i = 0; i < len; i++)
4488 g_variant_builder_add(inner, "y", data->service_type[i]);
4489 g_variant_builder_add(outter, "ay", inner);
4490 g_variant_builder_unref(inner);
4493 g_variant_builder_add(builder, "{sv}", "Seek", g_variant_new("aay", outter));
4494 g_variant_builder_unref(outter);
4499 int ws_start_scan(wfd_oem_scan_param_s *param)
4501 __WDP_LOG_FUNC_ENTER__;
4502 GDBusConnection *g_dbus = NULL;
4503 GVariantBuilder *builder = NULL;
4504 GVariant *value = NULL;
4505 dbus_method_param_s params;
4509 WDP_LOGE("Invalid parameter");
4510 __WDP_LOG_FUNC_EXIT__;
4515 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4516 __WDP_LOG_FUNC_EXIT__;
4520 g_dbus = g_pd->g_dbus;
4522 WDP_LOGE("DBus connection is NULL");
4523 __WDP_LOG_FUNC_EXIT__;
4526 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4528 if (param->scan_mode == WFD_OEM_SCAN_MODE_ACTIVE) {
4530 dbus_set_method_param(¶ms, "Find", g_pd->iface_path, g_dbus);
4532 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4534 if (param->scan_time)
4535 g_variant_builder_add(builder, "{sv}", "Timeout",
4536 g_variant_new_int32(param->scan_time));
4537 if (param->scan_type == WFD_OEM_SCAN_TYPE_SOCIAL)
4538 g_variant_builder_add(builder, "{sv}", "DiscoveryType",
4539 g_variant_new_string("social"));
4540 if (seek_list != NULL)
4541 __ws_add_seek_params(builder);
4543 value = g_variant_new("(a{sv})", builder);
4544 g_variant_builder_unref(builder);
4547 dbus_set_method_param(¶ms, "Listen", g_pd->iface_path, g_dbus);
4548 value = g_variant_new("(i)", param->scan_time);
4551 params.params = value;
4552 DEBUG_G_VARIANT("Params : ", params.params);
4554 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4556 WDP_LOGE("Failed to send command to wpa_supplicant");
4558 WDP_LOGD("Succeeded to start scan");
4560 __WDP_LOG_FUNC_EXIT__;
4564 int ws_restart_scan(int freq)
4566 __WDP_LOG_FUNC_ENTER__;
4567 GDBusConnection *g_dbus = NULL;
4568 GVariantBuilder *builder = NULL;
4569 GVariant *value = NULL;
4570 dbus_method_param_s params;
4574 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4575 __WDP_LOG_FUNC_EXIT__;
4579 g_dbus = g_pd->g_dbus;
4581 WDP_LOGE("DBus connection is NULL");
4582 __WDP_LOG_FUNC_EXIT__;
4585 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4587 dbus_set_method_param(¶ms, "Find", g_pd->iface_path, g_dbus);
4589 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4590 g_variant_builder_add(builder, "{sv}", "Timeout", g_variant_new_int32(2));
4591 g_variant_builder_add(builder, "{sv}", "DiscoveryType",
4592 g_variant_new_string("social"));
4593 value = g_variant_new("(a{sv})", builder);
4594 g_variant_builder_unref(builder);
4596 params.params = value;
4597 DEBUG_G_VARIANT("Params : ", params.params);
4599 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4601 WDP_LOGE("Failed to send command to wpa_supplicant");
4603 WDP_LOGD("Succeeded to start scan");
4605 __WDP_LOG_FUNC_EXIT__;
4609 int ws_stop_scan(void)
4611 __WDP_LOG_FUNC_ENTER__;
4612 GDBusConnection *g_dbus = NULL;
4613 dbus_method_param_s params;
4617 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4618 __WDP_LOG_FUNC_EXIT__;
4622 g_dbus = g_pd->g_dbus;
4624 WDP_LOGE("DBus connection is NULL");
4625 __WDP_LOG_FUNC_EXIT__;
4628 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4630 dbus_set_method_param(¶ms, "StopFind", g_pd->iface_path, g_dbus);
4631 params.params = NULL;
4633 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4635 WDP_LOGE("Failed to send command to wpa_supplicant");
4637 WDP_LOGD("Succeeded to stop scan");
4639 __WDP_LOG_FUNC_EXIT__;
4643 int ws_get_visibility(int *visibility)
4645 __WDP_LOG_FUNC_ENTER__;
4647 __WDP_LOG_FUNC_EXIT__;
4651 int ws_set_visibility(int visibility)
4653 __WDP_LOG_FUNC_ENTER__;
4655 __WDP_LOG_FUNC_EXIT__;
4659 int ws_get_scan_result(GList **peers, int *peer_count)
4661 __WDP_LOG_FUNC_ENTER__;
4663 __WDP_LOG_FUNC_EXIT__;
4667 int ws_get_peer_info(unsigned char *peer_addr, wfd_oem_device_s **peer)
4669 __WDP_LOG_FUNC_ENTER__;
4670 GDBusConnection *g_dbus = NULL;
4671 wfd_oem_device_s *ws_dev = NULL;
4672 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
4675 if (!peer_addr || !peer) {
4676 WDP_LOGE("Invalid parameter");
4677 __WDP_LOG_FUNC_EXIT__;
4682 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4683 __WDP_LOG_FUNC_EXIT__;
4687 g_dbus = g_pd->g_dbus;
4689 WDP_LOGE("DBus connection is NULL");
4690 __WDP_LOG_FUNC_EXIT__;
4694 ws_dev = (wfd_oem_device_s *) g_try_malloc0(sizeof(wfd_oem_device_s));
4696 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
4697 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
4698 WDP_LOGF("Failed to allocate memory device. [%s]",
4700 __WDP_LOG_FUNC_EXIT__;
4704 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4705 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4707 WDP_LOGD("get peer path [%s]", peer_path);
4709 res = dbus_property_get_all(peer_path, g_dbus, SUPPLICANT_P2P_PEER,
4710 __ws_get_peer_property, ws_dev);
4713 WDP_LOGE("Failed to send command to wpa_supplicant");
4715 __WDP_LOG_FUNC_EXIT__;
4718 WDP_LOGD("succeeded to get peer info");
4721 __WDP_LOG_FUNC_EXIT__;
4725 int ws_prov_disc_req(unsigned char *peer_addr, wfd_oem_wps_mode_e wps_mode, int join)
4727 __WDP_LOG_FUNC_ENTER__;
4728 GDBusConnection *g_dbus = NULL;
4729 GVariant *value = NULL;
4730 dbus_method_param_s params;
4731 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
4735 WDP_LOGE("Invalid parameter");
4736 __WDP_LOG_FUNC_EXIT__;
4741 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4742 __WDP_LOG_FUNC_EXIT__;
4746 g_dbus = g_pd->g_dbus;
4748 WDP_LOGE("DBus connection is NULL");
4749 __WDP_LOG_FUNC_EXIT__;
4752 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4754 dbus_set_method_param(¶ms, "ProvisionDiscoveryRequest", g_pd->iface_path, g_dbus);
4756 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4757 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4758 WDP_LOGD("get peer path [%s]", peer_path);
4760 value = g_variant_new("(os)", peer_path, __ws_wps_to_txt(wps_mode));
4762 params.params = value;
4763 DEBUG_G_VARIANT("Params : ", params.params);
4765 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4767 WDP_LOGE("Failed to send command to wpa_supplicant");
4769 WDP_LOGD("Succeeded to send prov disc to peer[" MACSTR "]", MAC2STR(peer_addr));
4771 __WDP_LOG_FUNC_EXIT__;
4775 int ws_connect(unsigned char *peer_addr, wfd_oem_conn_param_s *param)
4777 __WDP_LOG_FUNC_ENTER__;
4778 GDBusConnection *g_dbus = NULL;
4779 GVariantBuilder *builder = NULL;
4780 GVariant *value = NULL;
4781 dbus_method_param_s params;
4782 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
4785 if (!peer_addr || !param) {
4786 WDP_LOGE("Invalid parameter");
4787 __WDP_LOG_FUNC_EXIT__;
4792 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4793 __WDP_LOG_FUNC_EXIT__;
4797 g_dbus = g_pd->g_dbus;
4799 WDP_LOGE("DBus connection is NULL");
4800 __WDP_LOG_FUNC_EXIT__;
4803 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4805 dbus_set_method_param(¶ms, "Connect", g_pd->iface_path, g_dbus);
4807 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4808 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4809 WDP_LOGD("get peer path [%s]", peer_path);
4811 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4812 g_variant_builder_add(builder, "{sv}", "peer", g_variant_new_object_path(peer_path));
4813 if (param->conn_flags & WFD_OEM_CONN_TYPE_PERSISTENT)
4814 g_variant_builder_add(builder, "{sv}", "persistent", g_variant_new_boolean(TRUE));
4816 if (param->conn_flags & WFD_OEM_CONN_TYPE_JOIN)
4817 g_variant_builder_add(builder, "{sv}", "join", g_variant_new_boolean(TRUE));
4819 if (param->conn_flags & WFD_OEM_CONN_TYPE_AUTH)
4820 g_variant_builder_add(builder, "{sv}", "autorize_only", g_variant_new_boolean(TRUE));
4822 if (param->wps_pin[0] != '\0')
4823 g_variant_builder_add(builder, "{sv}", "pin", g_variant_new_string(param->wps_pin));
4825 g_variant_builder_add(builder, "{sv}", "wps_method",
4826 g_variant_new_string(__ws_wps_to_txt(param->wps_mode)));
4828 value = g_variant_new("(a{sv})", builder);
4829 g_variant_builder_unref(builder);
4831 params.params = value;
4832 DEBUG_G_VARIANT("Params : ", params.params);
4834 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4836 WDP_LOGE("Failed to send command to wpa_supplicant");
4838 WDP_LOGD("Succeeded to send connection command to peer[" MACSTR "]", MAC2STR(peer_addr));
4840 __WDP_LOG_FUNC_EXIT__;
4844 int ws_disconnect(unsigned char *peer_addr, int is_iface_addr)
4846 __WDP_LOG_FUNC_ENTER__;
4847 GDBusConnection *g_dbus = NULL;
4848 GVariant *value = NULL;
4849 dbus_method_param_s params;
4850 GVariantBuilder *builder = NULL;
4854 WDP_LOGE("Invalid parameter");
4855 __WDP_LOG_FUNC_EXIT__;
4860 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4861 __WDP_LOG_FUNC_EXIT__;
4865 g_dbus = g_pd->g_dbus;
4867 WDP_LOGE("DBus connection is NULL");
4868 __WDP_LOG_FUNC_EXIT__;
4871 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4873 dbus_set_method_param(¶ms, "RemoveClient", g_pd->iface_path, g_dbus);
4874 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4876 if (is_iface_addr) {
4877 char peer_mac_str[WS_MACSTR_LEN] = {'\0', };
4879 g_snprintf(peer_mac_str, WS_MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
4880 WDP_LOGI("peer addr [%s]", peer_mac_str);
4881 g_variant_builder_add(builder, "{sv}", "iface",
4882 g_variant_new_string(peer_mac_str));
4884 char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0', };
4886 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4887 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4888 g_variant_builder_add(builder, "{sv}", "peer",
4889 g_variant_new_object_path(peer_path));
4892 value = g_variant_new("(a{sv})", builder);
4893 g_variant_builder_unref(builder);
4895 params.params = value;
4896 DEBUG_G_VARIANT("Params : ", params.params);
4898 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4900 WDP_LOGE("Failed to send command to wpa_supplicant");
4902 WDP_LOGD("Succeeded to send disconnection command to peer[" MACSECSTR "]",
4903 MAC2SECSTR(peer_addr));
4905 __WDP_LOG_FUNC_EXIT__;
4909 int ws_reject_connection(unsigned char *peer_addr)
4911 __WDP_LOG_FUNC_ENTER__;
4912 GDBusConnection *g_dbus = NULL;
4913 GVariant *value = NULL;
4914 dbus_method_param_s params;
4915 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
4919 WDP_LOGE("Invalid parameter");
4920 __WDP_LOG_FUNC_EXIT__;
4925 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4926 __WDP_LOG_FUNC_EXIT__;
4930 g_dbus = g_pd->g_dbus;
4932 WDP_LOGE("DBus connection is NULL");
4933 __WDP_LOG_FUNC_EXIT__;
4936 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4938 dbus_set_method_param(¶ms, "RejectPeer", g_pd->iface_path, g_dbus);
4940 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4941 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4942 WDP_LOGE("get peer path [%s]", peer_path);
4944 value = g_variant_new("(o)", peer_path);
4946 params.params = value;
4947 DEBUG_G_VARIANT("Params : ", params.params);
4949 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4951 WDP_LOGE("Failed to send command to wpa_supplicant");
4953 WDP_LOGD("Succeeded to reject peer[" MACSTR "]", MAC2STR(peer_addr));
4956 __WDP_LOG_FUNC_EXIT__;
4960 int ws_cancel_connection(unsigned char *peer_addr)
4962 __WDP_LOG_FUNC_ENTER__;
4966 __WDP_LOG_FUNC_EXIT__;
4970 int ws_get_connected_peers(GList **peers, int *peer_count)
4972 __WDP_LOG_FUNC_ENTER__;
4974 __WDP_LOG_FUNC_EXIT__;
4978 int ws_get_pin(char *pin)
4980 __WDP_LOG_FUNC_ENTER__;
4982 __WDP_LOG_FUNC_EXIT__;
4986 int ws_set_pin(char *pin)
4988 __WDP_LOG_FUNC_ENTER__;
4990 __WDP_LOG_FUNC_EXIT__;
4994 static void __ws_get_pin(GVariant *value, void *user_data)
4996 __WDP_LOG_FUNC_ENTER__;
4997 const char *pin = NULL;
4999 g_variant_get(value, "(&s)", &pin);
5000 g_strlcpy((char *)user_data, pin, OEM_PINSTR_LEN + 1);
5002 __WDP_LOG_FUNC_EXIT__;
5006 int ws_generate_pin(char **pin)
5008 __WDP_LOG_FUNC_ENTER__;
5009 GDBusConnection *g_dbus = NULL;
5010 dbus_method_param_s params;
5011 char n_pin[9] = {0,};
5015 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5019 g_dbus = g_pd->g_dbus;
5021 WDP_LOGE("DBus connection is NULL");
5024 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5026 dbus_set_method_param(¶ms, "GeneratePin", g_pd->iface_path, g_dbus);
5027 params.params = NULL;
5029 res = dbus_method_call(¶ms, SUPPLICANT_WPS, __ws_get_pin, (void *)n_pin);
5031 WDP_LOGE("Failed to send command to wpa_supplicant");
5033 WDP_LOGD("Succeeded to generate_pin [ %s ]", n_pin);
5035 *pin = strndup(n_pin, OEM_PINSTR_LEN);
5036 __WDP_LOG_FUNC_EXIT__;
5040 int ws_get_supported_wps_mode(int *wps_mode)
5042 __WDP_LOG_FUNC_ENTER__;
5044 WDP_LOGE("Invalid parameter");
5045 __WDP_LOG_FUNC_EXIT__;
5049 *wps_mode = wps_config_method;
5050 __WDP_LOG_FUNC_EXIT__;
5054 int _ws_get_persistent_net_id(int *persistent_network_id, const unsigned char *go_dev_mac)
5056 __WDP_LOG_FUNC_ENTER__;
5057 int persistent_group_count = 0;
5061 wfd_oem_persistent_group_s *plist = NULL;
5063 res = ws_get_persistent_groups(&plist, &persistent_group_count);
5065 WDP_LOGE("failed to get persistent groups");
5066 __WDP_LOG_FUNC_EXIT__;
5070 if (persistent_group_count > WS_MAX_PERSISTENT_COUNT) {
5071 WDP_LOGE("persistent group count greater than max Persistent count");
5072 persistent_group_count = WS_MAX_PERSISTENT_COUNT;
5075 WDP_LOGD("Persistent Group Count=%d", persistent_group_count);
5077 for (counter = 0; counter < persistent_group_count ; counter++) {
5078 if (!memcmp(go_dev_mac, plist[counter].go_mac_address, WS_MACADDR_LEN)) {
5079 *persistent_network_id = plist[counter].network_id;
5082 WDP_LOGD("Invite: Persistent GO[" MACSTR "], GO Addr[" MACSTR "]",
5083 MAC2STR(plist[counter].go_mac_address), MAC2STR(go_dev_mac));
5089 WDP_LOGD("persistent network ID : [%d]", *persistent_network_id);
5091 __WDP_LOG_FUNC_EXIT__;
5095 static void __store_group_iface_path(GVariant* value, void* user_data)
5097 __WDP_LOG_FUNC_ENTER__;
5098 ws_dbus_plugin_data_s * pd_data;
5099 const char *path = NULL;
5102 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5106 pd_data = (ws_dbus_plugin_data_s *) g_pd;
5108 g_variant_get(value, "(&o)", &path);
5109 g_strlcpy(pd_data->group_iface_path, path, DBUS_OBJECT_PATH_MAX);
5111 WDP_LOGD("group object path [%s]", pd_data->group_iface_path);
5112 /* subscribe interface p2p signal */
5115 int ws_create_group(wfd_oem_group_param_s *param)
5117 __WDP_LOG_FUNC_ENTER__;
5118 GDBusConnection *g_dbus = NULL;
5119 GVariantBuilder *builder = NULL;
5120 GVariant *value = NULL;
5121 dbus_method_param_s params;
5122 char persistent_group_obj_path[OBJECT_PATH_MAX] = {0,};
5126 WDP_LOGE("Invalid parameter");
5127 __WDP_LOG_FUNC_EXIT__;
5132 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5133 __WDP_LOG_FUNC_EXIT__;
5137 g_dbus = g_pd->g_dbus;
5139 WDP_LOGE("DBus connection is NULL");
5140 __WDP_LOG_FUNC_EXIT__;
5143 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5145 dbus_set_method_param(¶ms, "GroupAdd", g_pd->iface_path, g_dbus);
5147 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
5149 if (param->persistent > 0) {
5150 unsigned char mac_address[WS_MACADDR_LEN] = {0x00, };
5151 int persistent_group_id = -1;
5153 res = _ws_get_local_dev_mac(mac_address);
5155 WDP_LOGE("failed to get local mac address");
5156 __WDP_LOG_FUNC_EXIT__;
5160 res = _ws_get_persistent_net_id(&persistent_group_id, mac_address);
5162 WDP_LOGE("failed to get persistent group ID");
5163 __WDP_LOG_FUNC_EXIT__;
5167 WDP_LOGD("persistent network ID : [%d]", persistent_group_id);
5169 g_variant_builder_add(builder, "{sv}", "persistent",
5170 g_variant_new_boolean(TRUE));
5171 if (persistent_group_id > -1) {
5172 g_snprintf(persistent_group_obj_path, OBJECT_PATH_MAX,
5173 "%s/" SUPPLICANT_PERSISTENT_GROUPS_PART "/%d",
5174 g_pd->iface_path, persistent_group_id);
5175 g_variant_builder_add(builder, "{sv}", "persistent_group_object",
5176 g_variant_new_object_path(persistent_group_obj_path));
5180 g_variant_builder_add(builder, "{sv}", "persistent",
5181 g_variant_new_boolean(FALSE));
5184 if (param->passphrase && strlen(param->passphrase) > 0)
5185 g_variant_builder_add(builder, "{sv}", "passphrase",
5186 g_variant_new_string(param->passphrase));
5188 if (param->ssid && strlen(param->ssid) > 0)
5189 g_variant_builder_add(builder, "{sv}", "ssid",
5190 g_variant_new_string(param->ssid));
5193 g_variant_builder_add(builder, "{sv}", "frequency",
5194 g_variant_new_int32(param->freq));
5196 value = g_variant_new("(a{sv})", builder);
5197 g_variant_builder_unref(builder);
5199 params.params = value;
5200 DEBUG_G_VARIANT("Params : ", params.params);
5202 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE,
5203 __store_group_iface_path, g_pd);
5205 WDP_LOGE("Failed to send command to wpa_supplicant");
5207 WDP_LOGD("Succeeded to add group");
5209 __WDP_LOG_FUNC_EXIT__;
5213 int ws_destroy_group(const char *ifname)
5215 __WDP_LOG_FUNC_ENTER__;
5216 GDBusConnection *g_dbus = NULL;
5217 dbus_method_param_s params;
5221 WDP_LOGE("Invalid parameter");
5226 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5227 __WDP_LOG_FUNC_EXIT__;
5231 g_dbus = g_pd->g_dbus;
5233 WDP_LOGE("DBus connection is NULL");
5234 __WDP_LOG_FUNC_EXIT__;
5238 if (g_pd->group_iface_path[0] == 0) {
5239 WDP_LOGE("group iface path is NULL");
5243 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5245 dbus_set_method_param(¶ms, "Disconnect", g_pd->group_iface_path, g_dbus);
5246 params.params = NULL;
5248 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
5250 WDP_LOGE("Failed to send command to wpa_supplicant");
5251 __WDP_LOG_FUNC_EXIT__;
5255 WDP_LOGD("Succeeded to remove group");
5258 __WDP_LOG_FUNC_EXIT__;
5262 int ws_invite(unsigned char *peer_addr, wfd_oem_invite_param_s *param)
5264 __WDP_LOG_FUNC_ENTER__;
5265 GDBusConnection *g_dbus = NULL;
5266 GVariantBuilder *builder = NULL;
5267 GVariant *value = NULL;
5268 dbus_method_param_s params;
5269 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
5272 if (!peer_addr || !param) {
5273 WDP_LOGE("Invalid parameter");
5278 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5279 __WDP_LOG_FUNC_EXIT__;
5283 g_dbus = g_pd->g_dbus;
5285 WDP_LOGE("DBus connection is NULL");
5286 __WDP_LOG_FUNC_EXIT__;
5289 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5291 dbus_set_method_param(¶ms, "Invite", g_pd->group_iface_path, g_dbus);
5293 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
5294 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
5295 WDP_LOGE("get peer path [%s]", peer_path);
5297 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
5298 g_variant_builder_add(builder, "{sv}", "peer", g_variant_new_object_path(peer_path));
5299 value = g_variant_new("(a{sv})", builder);
5300 g_variant_builder_unref(builder);
5302 params.params = value;
5303 DEBUG_G_VARIANT("Params : ", params.params);
5305 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
5307 WDP_LOGE("Failed to send command to wpa_supplicant");
5309 WDP_LOGD("Succeeded to invite peer[" MACSTR "]", MAC2STR(peer_addr));
5311 __WDP_LOG_FUNC_EXIT__;
5315 /* Only group owner can use this command */
5316 int ws_wps_start(unsigned char *peer_addr, int wps_mode, const char *pin)
5318 __WDP_LOG_FUNC_ENTER__;
5319 GDBusConnection *g_dbus = NULL;
5320 GVariantBuilder *builder = NULL;
5321 GVariant *value = NULL;
5322 GVariant *dev_addr = NULL;
5323 dbus_method_param_s params;
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 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5342 dbus_set_method_param(¶ms, "Start", g_pd->group_iface_path, g_dbus);
5344 if (peer_addr != NULL) {
5345 builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
5346 for (i = 0; i < WS_MACADDR_LEN; i++)
5347 g_variant_builder_add(builder, "y", peer_addr[i]);
5349 dev_addr = g_variant_new("ay", builder);
5350 g_variant_builder_unref(builder);
5353 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
5354 g_variant_builder_add(builder, "{sv}", "Role", g_variant_new_string("enrollee"));
5355 if (peer_addr != NULL)
5356 g_variant_builder_add(builder, "{sv}", "P2PDeviceAddress", dev_addr);
5358 if (pin != NULL && pin[0] != '\0') {
5359 g_variant_builder_add(builder, "{sv}", "Type", g_variant_new_string("pin"));
5360 g_variant_builder_add(builder, "{sv}", "Pin", g_variant_new_string(pin));
5362 g_variant_builder_add(builder, "{sv}", "Type", g_variant_new_string("pbc"));
5365 value = g_variant_new("(a{sv})", builder);
5366 g_variant_builder_unref(builder);
5368 params.params = value;
5369 DEBUG_G_VARIANT("Params : ", params.params);
5371 res = dbus_method_call(¶ms, SUPPLICANT_WPS, NULL, NULL);
5373 WDP_LOGE("Failed to send command to wpa_supplicant");
5375 WDP_LOGD("Succeeded to run wps");
5377 __WDP_LOG_FUNC_EXIT__;
5381 int ws_enrollee_start(unsigned char *peer_addr, int wps_mode, const char *pin)
5383 __WDP_LOG_FUNC_ENTER__;
5385 WDP_LOGD("Succeeded to start WPS");
5387 __WDP_LOG_FUNC_EXIT__;
5391 int ws_wps_cancel(void)
5393 __WDP_LOG_FUNC_ENTER__;
5394 GDBusConnection *g_dbus = NULL;
5395 dbus_method_param_s params;
5398 g_dbus = g_pd->g_dbus;
5400 WDP_LOGE("DBus connection is NULL");
5401 __WDP_LOG_FUNC_EXIT__;
5404 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5406 dbus_set_method_param(¶ms, "Cancel", g_pd->group_iface_path, g_dbus);
5407 params.params = NULL;
5409 res = dbus_method_call(¶ms, SUPPLICANT_WPS, NULL, NULL);
5411 WDP_LOGE("Failed to send command to wpa_supplicant");
5413 WDP_LOGD("Succeeded to cancel WPS");
5415 __WDP_LOG_FUNC_EXIT__;
5419 int ws_get_dev_name(char *dev_name)
5421 __WDP_LOG_FUNC_ENTER__;
5423 __WDP_LOG_FUNC_EXIT__;
5427 int ws_set_dev_name(char *dev_name)
5429 __WDP_LOG_FUNC_ENTER__;
5430 GDBusConnection *g_dbus = NULL;
5432 GVariant *value = NULL;
5433 GVariant *param = NULL;
5434 GVariantBuilder *builder = NULL;
5435 dbus_method_param_s params;
5439 WDP_LOGE("Invalid parameter");
5440 __WDP_LOG_FUNC_EXIT__;
5445 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5446 __WDP_LOG_FUNC_EXIT__;
5450 g_dbus = g_pd->g_dbus;
5452 WDP_LOGE("DBus connection is NULL");
5453 __WDP_LOG_FUNC_EXIT__;
5456 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5458 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
5461 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
5462 g_variant_builder_add(builder, "{sv}", "DeviceName",
5463 g_variant_new_string(dev_name));
5464 g_variant_builder_add(builder, "{sv}", "SsidPostfix",
5465 g_variant_new_string(dev_name));
5466 value = g_variant_new("a{sv}", builder);
5467 g_variant_builder_unref(builder);
5469 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE,
5470 "P2PDeviceConfig", value);
5472 params.params = param;
5473 DEBUG_G_VARIANT("Params : ", params.params);
5475 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
5477 WDP_LOGE("Failed to send command to wpa_supplicant");
5479 WDP_LOGD("Succeeded to set device name");
5481 __WDP_LOG_FUNC_EXIT__;
5485 int ws_get_dev_mac(char *dev_mac)
5487 __WDP_LOG_FUNC_ENTER__;
5489 __WDP_LOG_FUNC_EXIT__;
5493 int ws_get_dev_type(int *pri_dev_type, int *sec_dev_type)
5495 __WDP_LOG_FUNC_ENTER__;
5497 __WDP_LOG_FUNC_EXIT__;
5501 int ws_set_dev_type(int pri_dev_type, int sec_dev_type)
5503 __WDP_LOG_FUNC_ENTER__;
5505 __WDP_LOG_FUNC_EXIT__;
5509 int ws_get_go_intent(int *go_intent)
5511 __WDP_LOG_FUNC_ENTER__;
5512 GDBusConnection *g_dbus = NULL;
5513 GVariant *param = NULL;
5514 GVariant *reply = NULL;
5515 GError *error = NULL;
5516 GVariantIter *iter = NULL;
5520 WDP_LOGE("Invalid parameter");
5525 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5526 __WDP_LOG_FUNC_EXIT__;
5530 g_dbus = g_pd->g_dbus;
5532 WDP_LOGE("DBus connection is NULL");
5533 __WDP_LOG_FUNC_EXIT__;
5537 param = g_variant_new("(ss)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig");
5538 DEBUG_G_VARIANT("Params : ", param);
5540 reply = g_dbus_connection_call_sync(
5542 SUPPLICANT_SERVICE, /* bus name */
5543 g_pd->iface_path, /* object path */
5544 DBUS_PROPERTIES_INTERFACE, /* interface name */
5545 DBUS_PROPERTIES_METHOD_GET, /* method name */
5546 param, /* GVariant *params */
5547 NULL, /* reply_type */
5548 G_DBUS_CALL_FLAGS_NONE, /* flags */
5549 SUPPLICANT_TIMEOUT , /* timeout */
5550 NULL, /* cancellable */
5551 &error); /* error */
5553 if (error != NULL) {
5554 WDP_LOGE("Error! Failed to get interface State: [%s]",
5556 g_error_free(error);
5558 g_variant_unref(reply);
5559 __WDP_LOG_FUNC_EXIT__;
5563 if (reply != NULL) {
5564 g_variant_get(reply, "(a{sv})", &iter);
5568 GVariant *value = NULL;
5570 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
5571 CHECK_KEY_VALUE(key, value);
5573 if (g_strcmp0(key, "GOIntent") == 0)
5574 g_variant_get(value, "u", go_intent);
5576 g_variant_iter_free(iter);
5578 g_variant_unref(reply);
5580 __WDP_LOG_FUNC_EXIT__;
5584 int ws_set_go_intent(int go_intent)
5586 __WDP_LOG_FUNC_ENTER__;
5587 GDBusConnection *g_dbus = NULL;
5589 GVariant *value = NULL;
5590 GVariant *param = NULL;
5591 GVariantBuilder *builder = NULL;
5592 dbus_method_param_s params;
5596 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5597 __WDP_LOG_FUNC_EXIT__;
5601 g_dbus = g_pd->g_dbus;
5603 WDP_LOGE("DBus connection is NULL");
5604 __WDP_LOG_FUNC_EXIT__;
5607 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5609 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
5612 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
5613 g_variant_builder_add(builder, "{sv}", "GOIntent",
5614 g_variant_new_uint32(go_intent));
5615 value = g_variant_new("a{sv}", builder);
5616 g_variant_builder_unref(builder);
5618 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
5620 params.params = param;
5621 DEBUG_G_VARIANT("Params : ", params.params);
5623 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
5625 WDP_LOGE("Failed to send command to wpa_supplicant");
5627 WDP_LOGE("Succeeded to set go intent");
5628 __WDP_LOG_FUNC_EXIT__;
5632 int ws_set_country(char *ccode)
5634 __WDP_LOG_FUNC_ENTER__;
5635 __WDP_LOG_FUNC_ENTER__;
5636 GDBusConnection *g_dbus = NULL;
5638 GVariant *value = NULL;
5639 GVariant *param = NULL;
5641 dbus_method_param_s params;
5645 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5646 __WDP_LOG_FUNC_EXIT__;
5650 g_dbus = g_pd->g_dbus;
5652 WDP_LOGE("DBus connection is NULL");
5653 __WDP_LOG_FUNC_EXIT__;
5656 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5658 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
5661 value = g_variant_new_string(ccode);
5663 param = g_variant_new("(ssv)", SUPPLICANT_IFACE, "Country", value);
5665 params.params = param;
5666 DEBUG_G_VARIANT("Params : ", params.params);
5668 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
5670 WDP_LOGE("Failed to send command to wpa_supplicant");
5672 WDP_LOGD("Succeeded to set country(%s)", ccode);
5674 __WDP_LOG_FUNC_EXIT__;
5678 void __parsing_networks(const char* key, GVariant* value, void* user_data)
5680 __WDP_LOG_FUNC_ENTER__;
5682 __WDP_LOG_FUNC_EXIT__;
5686 ws_network_info_s *network = (ws_network_info_s *)user_data;
5688 CHECK_KEY_VALUE(key, value);
5690 if (g_strcmp0(key, "ssid") == 0) {
5691 const char *ssid = NULL;
5692 g_variant_get(value, "&s", &ssid);
5693 WDP_LOGD("ssid [%s]", ssid);
5694 g_strlcpy(network->ssid, ssid + 1, WS_SSID_LEN + 1);
5695 network->ssid[strlen(ssid) - 2] = '\0';
5697 } else if (g_strcmp0(key, "bssid") == 0) {
5698 unsigned char *bssid = NULL;
5699 g_variant_get(value, "&s", &bssid);
5700 WDP_LOGD("bssid [%s]", bssid);
5701 __ws_txt_to_mac(bssid, network->bssid);
5703 } else if (g_strcmp0(key, "proto") == 0) {
5704 const char *proto = NULL;
5705 g_variant_get(value, "&s", &proto);
5706 WDP_LOGD("proto [%s]", proto);
5708 if (g_strrstr(proto, WFD_OEM_STR_PROTO_WPA) != NULL)
5709 network->proto |= WFD_OEM_PROTO_WPA;
5710 if (g_strrstr(proto, WFD_OEM_STR_PROTO_RSN) != NULL)
5711 network->proto |= WFD_OEM_PROTO_RSN;
5713 } else if (g_strcmp0(key, "key_mgmt") == 0) {
5714 const char *key_mgmt = NULL;
5715 g_variant_get(value, "&s", &key_mgmt);
5716 WDP_LOGD("key_mgmt [%s]", key_mgmt);
5718 if (g_strrstr(key_mgmt, WFD_OEM_STR_KEY_MGMT_IEEE8021X) != NULL)
5719 network->key_mgmt |= WFD_OEM_KEY_MGMT_IEEE8021X;
5720 if (g_strrstr(key_mgmt, WFD_OEM_STR_KEY_MGMT_PSK) != NULL)
5721 network->key_mgmt |= WFD_OEM_KEY_MGMT_PSK;
5722 if (g_strrstr(key_mgmt, WFD_OEM_STR_KEY_MGMT_NONE) != NULL)
5723 network->key_mgmt |= WFD_OEM_KEY_MGMT_NONE;
5725 } else if (g_strcmp0(key, "pairwise") == 0) {
5726 const char *pairwise = NULL;
5727 g_variant_get(value, "&s", &pairwise);
5728 WDP_LOGD("pairwise [%s]", pairwise);
5730 if (g_strrstr(pairwise, WFD_OEM_STR_CIPHER_NONE) != NULL)
5731 network->pairwise |= WFD_OEM_CIPHER_NONE;
5732 if (g_strrstr(pairwise, WFD_OEM_STR_CIPHER_TKIP) != NULL)
5733 network->pairwise |= WFD_OEM_CIPHER_TKIP;
5734 if (g_strrstr(pairwise, WFD_OEM_STR_CIPHER_CCMP) != NULL)
5735 network->pairwise |= WFD_OEM_CIPHER_CCMP;
5737 } else if (g_strcmp0(key, "group") == 0) {
5738 const char *group = NULL;
5739 g_variant_get(value, "&s", &group);
5740 WDP_LOGD("group [%s]", group);
5742 if (g_strrstr(group, WFD_OEM_STR_CIPHER_NONE) != NULL)
5743 network->group |= WFD_OEM_CIPHER_NONE;
5744 if (g_strrstr(group, WFD_OEM_STR_CIPHER_WEP40) != NULL)
5745 network->group |= WFD_OEM_CIPHER_WEP40;
5746 if (g_strrstr(group, WFD_OEM_STR_CIPHER_WEP104) != NULL)
5747 network->group |= WFD_OEM_CIPHER_WEP104;
5748 if (g_strrstr(group, WFD_OEM_STR_CIPHER_TKIP) != NULL)
5749 network->group |= WFD_OEM_CIPHER_TKIP;
5750 if (g_strrstr(group, WFD_OEM_STR_CIPHER_CCMP) != NULL)
5751 network->group |= WFD_OEM_CIPHER_CCMP;
5753 } else if (g_strcmp0(key, "auth_alg") == 0) {
5754 const char *auth_alg = NULL;
5755 g_variant_get(value, "&s", &auth_alg);
5756 WDP_LOGD("auth_alg [%s]", auth_alg);
5758 if (g_strrstr(auth_alg, WFD_OEM_STR_AUTH_ALG_OPEN) != NULL)
5759 network->auth_alg |= WFD_OEM_AUTH_ALG_OPEN;
5761 } else if (g_strcmp0(key, "mode") == 0) {
5762 const char *mode = NULL;
5763 g_variant_get(value, "&s", &mode);
5764 WDP_LOGD("mode [%s]", mode);
5766 if (g_strrstr(mode, WFD_OEM_STR_MODE_GC) != NULL)
5767 network->mode |= WFD_OEM_PERSISTENT_MODE_GC;
5768 if (g_strrstr(mode, WFD_OEM_STR_MODE_GO) != NULL)
5769 network->mode |= WFD_OEM_PERSISTENT_MODE_GO;
5771 } else if (g_strcmp0(key, "p2p_client_list") == 0) {
5772 const char *p2p_client_list = NULL;
5777 g_variant_get(value, "&s", &p2p_client_list);
5778 WDP_LOGD("p2p_client_list [%s]", p2p_client_list);
5779 ptr = (char *)p2p_client_list;
5780 list_len = strlen(p2p_client_list);
5781 WDP_LOGD("list_len [%d]", list_len);
5782 while (ptr && list_len >= (OEM_MACSTR_LEN - 1)) {
5783 __ws_txt_to_mac((unsigned char *)ptr, (network->p2p_client_list[num]));
5784 ptr += OEM_MACSTR_LEN;
5785 list_len -= OEM_MACSTR_LEN;
5786 if (ptr && ptr[0] == ' ') {
5791 if (num >= OEM_MAX_PEER_NUM)
5794 network->p2p_client_num = num;
5795 WDP_LOGD("p2p_client_num [%d]", network->p2p_client_num);
5800 void __ws_extract_p2pdevice_details(const char *key, GVariant *value, void *user_data)
5802 __WDP_LOG_FUNC_ENTER__;
5803 CHECK_KEY_VALUE(key, value);
5805 if (g_strcmp0(key, "PersistentGroups") == 0) {
5806 GVariantIter *iter = NULL;
5807 const char *path = NULL;
5810 ws_network_info_s *networks = NULL;
5811 networks = (ws_network_info_s *)user_data;
5813 WDP_LOGE("network is NULL");
5814 __WDP_LOG_FUNC_EXIT__;
5818 g_variant_get(value, "ao", &iter);
5819 while (g_variant_iter_loop(iter, "&o", &path)) {
5822 if (num >= WS_MAX_PERSISTENT_COUNT)
5825 WDP_LOGD("Retrive persistent path [%s]", path);
5826 g_strlcpy(networks[num].persistent_path, path, DBUS_OBJECT_PATH_MAX);
5828 loc = strrchr(networks[num].persistent_path, '/');
5830 networks[num].network_id = strtoul(loc+1, NULL, 10);
5832 WDP_LOGD("Retrive persistent path [%s]", networks[num].persistent_path);
5833 dbus_property_get_all(networks[num].persistent_path, g_pd->g_dbus,
5834 SUPPLICANT_P2P_PERSISTENTGROUP, __parsing_networks, &networks[num]);
5838 networks[0].total = num;
5839 WDP_LOGI("total number [%d]", num);
5840 g_variant_iter_free(iter);
5842 __WDP_LOG_FUNC_EXIT__;
5846 int ws_get_persistent_groups(wfd_oem_persistent_group_s **groups, int *group_count)
5848 __WDP_LOG_FUNC_ENTER__;
5849 GDBusConnection *g_dbus = NULL;
5851 ws_network_info_s networks[WS_MAX_PERSISTENT_COUNT];
5852 wfd_oem_persistent_group_s *wfd_persistent_groups = NULL;
5856 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5857 __WDP_LOG_FUNC_EXIT__;
5861 g_dbus = g_pd->g_dbus;
5863 WDP_LOGE("DBus connection is NULL");
5864 __WDP_LOG_FUNC_EXIT__;
5868 memset(&networks, 0x0, WS_MAX_PERSISTENT_COUNT * sizeof(ws_network_info_s));
5869 dbus_property_get_all(g_pd->iface_path, g_dbus, SUPPLICANT_P2PDEVICE,
5870 __ws_extract_p2pdevice_details, &networks[0]);
5872 cnt = networks[0].total;
5874 WDP_LOGD("Persistent Group Count=%d", cnt);
5875 if (cnt > WS_MAX_PERSISTENT_COUNT) {
5876 WDP_LOGE("Persistent group count exceeded or parsing error");
5877 __WDP_LOG_FUNC_EXIT__;
5882 WDP_LOGE("Persistent group count zero");
5885 __WDP_LOG_FUNC_EXIT__;
5889 wfd_persistent_groups = (wfd_oem_persistent_group_s *) g_try_malloc0(cnt * sizeof(wfd_oem_persistent_group_s));
5890 if (wfd_persistent_groups == NULL) {
5891 WDP_LOGE("Failed to allocate memory for wfd_persistent_groups ");
5892 __WDP_LOG_FUNC_EXIT__;
5896 for (i = 0; i < cnt; i++) {
5899 WDP_LOGD("----persistent group [%d]----", i);
5900 WDP_LOGD("network_id [%d]", networks[i].network_id);
5901 WDP_LOGD("ssid [%s]", networks[i].ssid);
5902 WDP_LOGD("bssid ["MACSTR"]", MAC2STR(networks[i].bssid));
5903 WDP_LOGD("p2p_client_num [%d]", networks[i].p2p_client_num);
5904 for (j = 0; j < networks[i].p2p_client_num; j++)
5905 WDP_LOGD("p2p_client_list ["MACSTR"]", MAC2STR(networks[i].p2p_client_list[j]));
5907 wfd_persistent_groups[i].network_id = networks[i].network_id;
5908 g_strlcpy(wfd_persistent_groups[i].ssid, networks[i].ssid, WS_SSID_LEN + 1);
5909 memcpy(wfd_persistent_groups[i].go_mac_address, networks[i].bssid, WS_MACADDR_LEN);
5910 wfd_persistent_groups[i].p2p_client_num = networks[i].p2p_client_num;
5911 if (wfd_persistent_groups[i].p2p_client_num > 0)
5912 memcpy(wfd_persistent_groups[i].p2p_client_list, networks[i].p2p_client_list,
5913 OEM_MACADDR_LEN * OEM_MAX_PEER_NUM * sizeof(char));
5917 *groups = wfd_persistent_groups;
5919 __WDP_LOG_FUNC_EXIT__;
5923 int ws_remove_persistent_group(char *ssid, unsigned char *bssid)
5925 __WDP_LOG_FUNC_ENTER__;
5926 GDBusConnection *g_dbus = NULL;
5928 dbus_method_param_s params;
5929 ws_network_info_s networks[WS_MAX_PERSISTENT_COUNT];
5934 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5935 __WDP_LOG_FUNC_EXIT__;
5939 g_dbus = g_pd->g_dbus;
5941 WDP_LOGE("DBus connection is NULL");
5942 __WDP_LOG_FUNC_EXIT__;
5945 memset(&networks, 0x0, WS_MAX_PERSISTENT_COUNT * sizeof(ws_network_info_s));
5946 dbus_property_get_all(g_pd->iface_path, g_dbus, SUPPLICANT_P2PDEVICE,
5947 __ws_extract_p2pdevice_details, networks);
5949 cnt = networks[0].total;
5951 WDP_LOGD("Persistent Group Count=%d", cnt);
5952 if (cnt > WS_MAX_PERSISTENT_COUNT) {
5953 WDP_LOGE("Persistent group count exceeded or parsing error");
5954 __WDP_LOG_FUNC_EXIT__;
5958 for (i = 0; i < cnt; i++) {
5961 WDP_LOGD("----persistent group [%d]----", i);
5962 WDP_LOGD("network_id [%d]", networks[i].network_id);
5963 WDP_LOGD("network ssid [%s]", networks[i].ssid);
5964 WDP_LOGD("network bssid ["MACSTR"]", MAC2STR(networks[i].bssid));
5965 WDP_LOGD("network p2p_client_num [%d]", networks[i].p2p_client_num);
5966 for (j = 0; j < networks[i].p2p_client_num; j++)
5967 WDP_LOGD("network p2p_client_list ["MACSTR"]",
5968 MAC2STR(networks[i].p2p_client_list[j]));
5970 WDP_LOGD("ssid [%s]", ssid);
5971 WDP_LOGD("bssid ["MACSTR"]", MAC2STR(bssid));
5973 if (!g_strcmp0(ssid, networks[i].ssid) &&
5974 !memcmp(bssid, networks[i].bssid, WS_MACADDR_LEN)) {
5975 WDP_LOGD("Persistent group owner found [%d: %s]",
5976 networks[i].network_id, ssid);
5978 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5979 dbus_set_method_param(¶ms, "RemovePersistentGroup",
5980 g_pd->iface_path, g_dbus);
5981 params.params = g_variant_new("(o)", networks[i].persistent_path);
5982 DEBUG_G_VARIANT("Params : ", params.params);
5984 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
5986 WDP_LOGE("Failed to send command to wpa_supplicant");
5987 __WDP_LOG_FUNC_EXIT__;
5991 WDP_LOGD("Succeeded to remove persistent group");;
5997 WDP_LOGE("Persistent group not found [%s]", ssid);
6001 __WDP_LOG_FUNC_EXIT__;
6005 int ws_set_persistent_reconnect(unsigned char *bssid, int reconnect)
6007 __WDP_LOG_FUNC_ENTER__;
6008 GDBusConnection *g_dbus = NULL;
6010 GVariant *value = NULL;
6011 GVariant *param = NULL;
6012 GVariantBuilder *builder = NULL;
6013 dbus_method_param_s params;
6017 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
6018 __WDP_LOG_FUNC_EXIT__;
6022 g_dbus = g_pd->g_dbus;
6024 WDP_LOGE("DBus connection is NULL");
6025 __WDP_LOG_FUNC_EXIT__;
6028 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6030 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
6033 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6034 g_variant_builder_add(builder, "{sv}", "PersistentReconnect",
6035 g_variant_new_boolean(reconnect));
6036 value = g_variant_new("a{sv}", builder);
6037 g_variant_builder_unref(builder);
6039 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
6041 params.params = param;
6042 DEBUG_G_VARIANT("Params : ", params.params);
6044 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
6046 WDP_LOGE("Failed to send command to wpa_supplicant");
6048 WDP_LOGD("Succeeded to set persistent reconnect");
6050 __WDP_LOG_FUNC_EXIT__;
6054 static int __ws_compress_query(char *compressed, char *query, int qtype)
6062 token = strtok_r(query, ".", &temp);
6064 if (!strcmp(token, "local")) {
6065 WDP_LOGD("Query conversion done");
6068 } else if (!strncmp(token, "_tcp", 4)) {
6069 memcpy(&compressed[length], WS_TCP_PTR_HEX, 2);
6072 } else if (!strncmp(token, "_udp", 4)) {
6073 memcpy(&compressed[length], WS_UDP_PTR_HEX, 2);
6077 WDP_LOGD("Token: [%s]", token);
6078 token_len = strlen(token);
6079 compressed[length] = token_len;
6082 memcpy(&compressed[length], token, token_len);
6083 length += token_len;
6086 token = strtok_r(NULL, ".", &temp);
6088 if (qtype == WS_QTYPE_PTR || token_num == 2)
6089 memcpy(&compressed[length], WS_PTR_TYPE_HEX, 3);
6090 else if (qtype == WS_QTYPE_TXT || token_num == 3)
6091 memcpy(&compressed[length], WS_TXT_TYPE_HEX, 3);
6094 WDP_LOGD("converted query length [%d] token num [%d]", length, token_num);
6099 static int __ws_compress_rdata(char *compressed, char *rdata, int qtype)
6106 if (qtype == WS_QTYPE_PTR) {
6108 token = strtok_r(rdata, ".", &temp);
6110 WDP_LOGD("Token: %s", token);
6111 token_len = strlen(token);
6112 compressed[length] = token_len;
6115 memcpy(&compressed[length], token, token_len);
6116 length += token_len;
6119 compressed[length] = 0xc0;
6120 compressed[length+1] = 0x27;
6123 } else if (qtype == WS_QTYPE_TXT) {
6125 token = strtok_r(rdata, ",", &temp);
6128 WDP_LOGD("Token: [%s]", token);
6130 token_len = strlen(token);
6131 compressed[length] = token_len;
6134 memcpy(&compressed[length], token, token_len);
6135 length += token_len;
6137 token = strtok_r(NULL, ",", &temp);
6140 WDP_LOGD("RDATA is NULL");
6145 int _convert_bonjour_to_args(char *query, char *rdata, GVariantBuilder *builder)
6147 GVariantBuilder *args = NULL;
6148 char compressed[256] = {0, };
6154 if (!query || !builder) {
6155 WDP_LOGE("Invalid parameter");
6158 if (!rdata || !strlen(rdata)) {
6159 WDP_LOGD("RDATA is NULL\n");
6161 temp = strstr(rdata, query);
6163 if (temp != NULL && temp - rdata > 0)
6164 qtype = WS_QTYPE_PTR;
6166 qtype = WS_QTYPE_TXT;
6170 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("bonjour"));
6172 /* compress query */
6173 length = __ws_compress_query(compressed, query, qtype);
6175 args = g_variant_builder_new(G_VARIANT_TYPE("ay"));
6176 for (i = 0; i < length; i++)
6177 g_variant_builder_add(args, "y", compressed[i]);
6178 g_variant_builder_add(builder, "{sv}", "query", g_variant_new("ay", args));
6179 g_variant_builder_unref(args);
6181 memset(compressed, 0x0, 256);
6186 length = __ws_compress_rdata(compressed, rdata, qtype);
6188 args = g_variant_builder_new(G_VARIANT_TYPE("ay"));
6189 for (i = 0; i < length; i++)
6190 g_variant_builder_add(args, "y", compressed[i]);
6191 g_variant_builder_add(builder, "{sv}", "response", g_variant_new("ay", args));
6192 g_variant_builder_unref(args);
6198 int _check_service_query_exists(wfd_oem_service_s *service)
6201 wfd_oem_service_s *data = NULL;
6203 for (count = 0; count < g_list_length(service_list); count++) {
6204 data = (wfd_oem_service_s*) g_list_nth_data(service_list, count);
6205 if (strncmp(service->query_id, data->query_id, OEM_QUERY_ID_LEN) == 0) {
6206 WDP_LOGD("Query already exists");
6213 static wfd_oem_service_s* _remove_service_query(char * s_type, char *mac_str, char *query_id)
6215 if (NULL == s_type || NULL == mac_str || NULL == query_id)
6219 wfd_oem_service_s *data = NULL;
6221 for (count = 0; count < g_list_length(service_list); count++) {
6222 data = (wfd_oem_service_s*) g_list_nth_data(service_list, count);
6223 if (data && !strncmp(data->service_type, s_type, SERVICE_TYPE_LEN) &&
6224 memcmp(data->dev_addr, mac_str, OEM_MACSTR_LEN - 1) == 0) {
6225 g_strlcpy(query_id, data->query_id, OEM_QUERY_ID_LEN + 1);
6229 if (strlen(query_id) <= 0) {
6230 WDP_LOGD("!! Query ID not found !!");
6234 WDP_LOGD("query id :[0x%s]", query_id);
6239 void __add_service_query(GVariant *value, void *mac_addr)
6241 __WDP_LOG_FUNC_ENTER__;
6242 wfd_oem_service_s *service = NULL;
6244 long long unsigned ref = 0;
6245 unsigned char *mac_address = (unsigned char *)mac_addr;
6246 char mac_str[18] = {0, };
6250 g_variant_get(value, "(t)", &ref);
6252 service = (wfd_oem_service_s*) g_try_malloc0(sizeof(wfd_oem_service_s));
6254 WDP_LOGE("Failed to allocate memory for service");
6258 if (mac_address[0] == 0 && mac_address[1] == 0 && mac_address[2] == 0 &&
6259 mac_address[3] == 0 && mac_address[4] == 0 && mac_address[5] == 0) {
6260 g_snprintf(mac_str, WS_MACSTR_LEN , "%s", SERV_BROADCAST_ADDRESS);
6262 g_snprintf(mac_str, WS_MACSTR_LEN, MACSTR, MAC2STR(mac_address));
6265 g_strlcpy(service->dev_addr, mac_str, OEM_MACSTR_LEN);
6266 g_snprintf(service->query_id, OEM_QUERY_ID_LEN + 1, "0x%llx", ref);
6268 res = _check_service_query_exists(service);
6272 service_list = g_list_append(service_list, service);
6274 __WDP_LOG_FUNC_EXIT__;
6279 /* for now, supplicant dbus interface only provides upnp service fully */
6280 int ws_start_service_discovery(unsigned char *mac_addr, int service_type)
6282 __WDP_LOG_FUNC_ENTER__;
6283 GDBusConnection *g_dbus = NULL;
6284 GVariantBuilder *builder = NULL;
6285 GVariant *value = NULL;
6286 dbus_method_param_s params;
6287 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
6292 WDP_LOGE("Invalid parameter");
6293 __WDP_LOG_FUNC_EXIT__;
6298 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
6299 __WDP_LOG_FUNC_EXIT__;
6303 g_dbus = g_pd->g_dbus;
6305 WDP_LOGE("DBus connection is NULL");
6306 __WDP_LOG_FUNC_EXIT__;
6309 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6311 dbus_set_method_param(¶ms, "ServiceDiscoveryRequest", g_pd->iface_path, g_dbus);
6313 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6316 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
6317 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(mac_addr));
6318 WDP_LOGD("get peer path [%s]", peer_path);
6319 g_variant_builder_add(builder, "{sv}", "peer", g_variant_new_object_path(peer_path));
6322 if (service_type == WFD_OEM_SERVICE_TYPE_ALL) {
6324 char *service_all = "\x02\x00\x00\x01";
6325 GVariantBuilder *query = NULL;
6327 query = g_variant_builder_new(G_VARIANT_TYPE("ay"));
6328 for (i = 0; i < SERVICE_QUERY_LEN; i++)
6329 g_variant_builder_add(query, "y", service_all[i]);
6330 g_variant_builder_add(builder, "{sv}", "query", g_variant_new("ay", query));
6331 g_variant_builder_unref(query);
6333 } else if (service_type == WFD_OEM_SERVICE_TYPE_UPNP) {
6335 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("upnp"));
6336 g_variant_builder_add(builder, "{sv}", "version", g_variant_new_uint16(TRUE));
6338 } else if (service_type == WFD_OEM_SERVICE_TYPE_BONJOUR) {
6340 char *service_bonjour = "\x02\x00\x01\x01";
6341 GVariantBuilder *query = NULL;
6343 query = g_variant_builder_new(G_VARIANT_TYPE("ay"));
6344 for (i = 0; i < SERVICE_QUERY_LEN; i++)
6345 g_variant_builder_add(query, "y", service_bonjour[i]);
6346 g_variant_builder_add(builder, "{sv}", "query", g_variant_new("ay", query));
6347 g_variant_builder_unref(query);
6350 value = g_variant_new("(a{sv})", builder);
6351 g_variant_builder_unref(builder);
6353 params.params = value;
6354 DEBUG_G_VARIANT("Params : ", params.params);
6356 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, __add_service_query, mac_addr);
6358 WDP_LOGE("Failed to send command to wpa_supplicant");
6360 WDP_LOGD("Succeeded to start service discovery");
6362 __WDP_LOG_FUNC_EXIT__;
6366 int ws_cancel_service_discovery(unsigned char *mac_addr, int service_type)
6368 __WDP_LOG_FUNC_ENTER__;
6369 GDBusConnection *g_dbus = NULL;
6370 dbus_method_param_s params;
6371 wfd_oem_service_s *data = NULL;
6372 char query_id[OEM_QUERY_ID_LEN + 1] = {0, };
6373 char s_type[OEM_SERVICE_TYPE_LEN + 1] = {0, };
6374 char mac_str[18] = {0, };
6379 WDP_LOGE("Invalid parameter");
6380 __WDP_LOG_FUNC_EXIT__;
6385 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
6386 __WDP_LOG_FUNC_EXIT__;
6390 g_dbus = g_pd->g_dbus;
6392 WDP_LOGE("DBus connection is NULL");
6393 __WDP_LOG_FUNC_EXIT__;
6397 if (mac_addr[0] == 0 && mac_addr[1] == 0 && mac_addr[2] == 0 &&
6398 mac_addr[3] == 0 && mac_addr[4] == 0 && mac_addr[5] == 0) {
6399 snprintf(mac_str, WS_MACSTR_LEN , "%s", SERV_BROADCAST_ADDRESS);
6401 snprintf(mac_str, WS_MACSTR_LEN, MACSTR, MAC2STR(mac_addr));
6404 switch (service_type) {
6405 case WFD_OEM_SERVICE_TYPE_ALL:
6406 g_strlcpy(s_type, SERV_DISC_REQ_ALL, OEM_SERVICE_TYPE_LEN + 1);
6408 case WFD_OEM_SERVICE_TYPE_BONJOUR:
6409 g_strlcpy(s_type, SERV_DISC_REQ_BONJOUR, OEM_SERVICE_TYPE_LEN + 1);
6411 case WFD_OEM_SERVICE_TYPE_UPNP:
6412 g_strlcpy(s_type, SERV_DISC_REQ_UPNP, OEM_SERVICE_TYPE_LEN + 1);
6415 WDP_LOGE("Invalid Service type");
6416 __WDP_LOG_FUNC_EXIT__;
6420 WDP_LOGD("Cancel service discovery service_type [%d]", service_type);
6421 WDP_LOGD("Cancel service discovery s_type [%s]", s_type);
6423 data = _remove_service_query(s_type, mac_str, query_id);
6425 __WDP_LOG_FUNC_EXIT__;
6428 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6430 dbus_set_method_param(¶ms, "ServiceDiscoveryCancelRequest", g_pd->iface_path, g_dbus);
6432 params.params = g_variant_new("(t)", strtoul(query_id, NULL, 16));
6434 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
6436 WDP_LOGE("Failed to send command to wpa_supplicant");
6438 WDP_LOGD("Succeeded to cancel service discovery");
6440 service_list = g_list_remove(service_list, data);
6443 __WDP_LOG_FUNC_EXIT__;
6447 int ws_serv_add(wfd_oem_new_service_s *service)
6449 __WDP_LOG_FUNC_ENTER__;
6450 GDBusConnection *g_dbus = NULL;
6451 GVariantBuilder *builder = NULL;
6452 GVariant *value = NULL;
6453 dbus_method_param_s params;
6457 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
6458 __WDP_LOG_FUNC_EXIT__;
6462 g_dbus = g_pd->g_dbus;
6464 WDP_LOGE("DBus connection is NULL");
6465 __WDP_LOG_FUNC_EXIT__;
6468 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6470 dbus_set_method_param(¶ms, "AddService", g_pd->iface_path, g_dbus);
6472 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6474 if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
6476 WDP_LOGD("Service type: WFD_OEM_SERVICE_TYPE_BONJOUR");
6477 WDP_LOGD("Query: %s", service->data.bonjour.query);
6478 WDP_LOGD("RData: %s", service->data.bonjour.rdata);
6480 res = _convert_bonjour_to_args(service->data.bonjour.query,
6481 service->data.bonjour.rdata, builder);
6483 WDP_LOGE("Failed to convert Key string");
6484 g_variant_builder_unref(builder);
6488 } else if (service->protocol == WFD_OEM_SERVICE_TYPE_UPNP) {
6489 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("upnp"));
6490 g_variant_builder_add(builder, "{sv}", "version", g_variant_new_uint16(TRUE));
6491 g_variant_builder_add(builder, "{sv}", "service", g_variant_new_string(service->data.upnp.service));
6494 value = g_variant_new("(a{sv})", builder);
6495 g_variant_builder_unref(builder);
6497 params.params = value;
6498 DEBUG_G_VARIANT("Params : ", params.params);
6500 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
6502 WDP_LOGE("Failed to send command to wpa_supplicant");
6504 WDP_LOGD("Succeeded to add service");
6506 __WDP_LOG_FUNC_EXIT__;
6510 int ws_serv_del(wfd_oem_new_service_s *service)
6512 __WDP_LOG_FUNC_ENTER__;
6513 GDBusConnection *g_dbus = NULL;
6514 GVariantBuilder *builder = NULL;
6515 GVariant *value = NULL;
6516 dbus_method_param_s params;
6520 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
6521 __WDP_LOG_FUNC_EXIT__;
6525 g_dbus = g_pd->g_dbus;
6527 WDP_LOGE("DBus connection is NULL");
6528 __WDP_LOG_FUNC_EXIT__;
6531 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6533 dbus_set_method_param(¶ms, "DeleteService", g_pd->iface_path, g_dbus);
6535 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6537 if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
6539 WDP_LOGD("Service type: WFD_OEM_SERVICE_TYPE_BONJOUR");
6540 WDP_LOGD("Query: %s", service->data.bonjour.query);
6542 res = _convert_bonjour_to_args(service->data.bonjour.query,
6545 WDP_LOGE("Failed to convert Key string");
6546 g_variant_builder_unref(builder);
6550 } else if (service->protocol == WFD_OEM_SERVICE_TYPE_UPNP) {
6551 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("upnp"));
6552 g_variant_builder_add(builder, "{sv}", "version", g_variant_new_uint16(TRUE));
6553 g_variant_builder_add(builder, "{sv}", "service", g_variant_new_string(service->data.upnp.service));
6556 value = g_variant_new("(a{sv})", builder);
6557 g_variant_builder_unref(builder);
6559 params.params = value;
6560 DEBUG_G_VARIANT("Params : ", params.params);
6562 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
6564 WDP_LOGE("Failed to send command to wpa_supplicant");
6566 WDP_LOGD("Succeeded to del service");
6568 __WDP_LOG_FUNC_EXIT__;
6572 int _ws_disable_display()
6574 __WDP_LOG_FUNC_ENTER__;
6575 GDBusConnection *g_dbus = NULL;
6576 GVariantBuilder *builder = NULL;
6577 GVariant *value = NULL;
6578 GVariant *param = NULL;
6579 dbus_method_param_s params;
6583 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
6584 __WDP_LOG_FUNC_EXIT__;
6588 g_dbus = g_pd->g_dbus;
6590 WDP_LOGE("DBus connection is NULL");
6591 __WDP_LOG_FUNC_EXIT__;
6594 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6596 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, SUPPLICANT_PATH,
6599 builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
6600 value = g_variant_new("ay", builder);
6601 g_variant_builder_unref(builder);
6603 param = g_variant_new("(ssv)", SUPPLICANT_INTERFACE, "WFDIEs", value);
6605 params.params = param;
6606 DEBUG_G_VARIANT("Params : ", params.params);
6608 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
6610 WDP_LOGE("Failed to send command to wpa_supplicant");
6612 WDP_LOGD("Succeeded to disable Wi-Fi display");
6614 __WDP_LOG_FUNC_EXIT__;
6618 int ws_miracast_init(int enable)
6620 __WDP_LOG_FUNC_ENTER__;
6621 wfd_oem_display_s wifi_display;
6624 memset(&wifi_display, 0x0, sizeof(wfd_oem_display_s));
6626 wifi_display.availability = enable;
6627 wifi_display.hdcp_support = 1;
6628 wifi_display.port = 0x07E6;
6629 wifi_display.max_tput = 0x0028;
6631 res = ws_set_display(&wifi_display);
6633 WDP_LOGE("Failed to set miracast parameter(device info)");
6634 __WDP_LOG_FUNC_EXIT__;
6639 res = _ws_disable_display();
6641 WDP_LOGE("Failed to disable wifi display");
6643 WDP_LOGD("Succeeded to disable wifi display");
6645 __WDP_LOG_FUNC_EXIT__;
6649 int ws_set_display(wfd_oem_display_s *wifi_display)
6651 __WDP_LOG_FUNC_ENTER__;
6652 GDBusConnection *g_dbus = NULL;
6654 GVariant *value = NULL;
6655 GVariant *param = NULL;
6656 GVariantBuilder *builder = NULL;
6657 dbus_method_param_s params;
6661 unsigned char ies[WFD_SUBELEM_LEN_DEV_INFO + 3] = {0,};
6663 if (!wifi_display) {
6664 WDP_LOGE("Invalid parameter");
6667 g_dbus = g_pd->g_dbus;
6669 WDP_LOGE("DBus connection is NULL");
6670 __WDP_LOG_FUNC_EXIT__;
6673 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6675 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, SUPPLICANT_PATH,
6678 ies[2] = WFD_SUBELEM_LEN_DEV_INFO;
6679 ies[3] = wifi_display->hdcp_support;
6680 ies[4] = (wifi_display->type) | (wifi_display->availability<<4);
6681 ies[5] = wifi_display->port>>8;
6682 ies[6] = wifi_display->port&0xff;
6683 ies[7] = wifi_display->max_tput>>8;
6684 ies[8] = wifi_display->max_tput&0xff;
6686 builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
6687 for (i = 0; i < WFD_SUBELEM_LEN_DEV_INFO + 3; i++)
6688 g_variant_builder_add(builder, "y", ies[i]);
6689 value = g_variant_new("ay", builder);
6690 g_variant_builder_unref(builder);
6692 param = g_variant_new("(ssv)", SUPPLICANT_INTERFACE, "WFDIEs", value);
6694 params.params = param;
6695 DEBUG_G_VARIANT("Params : ", params.params);
6697 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
6699 WDP_LOGE("Failed to send command to wpa_supplicant");
6701 WDP_LOGD("Succeeded to set Wi-Fi Display");
6703 __WDP_LOG_FUNC_EXIT__;
6707 int ws_refresh(void)
6709 __WDP_LOG_FUNC_ENTER__;
6714 __WDP_LOG_FUNC_EXIT__;
6718 int ws_save_config(void)
6720 __WDP_LOG_FUNC_ENTER__;
6721 GDBusConnection *g_dbus = NULL;
6722 dbus_method_param_s params;
6725 g_dbus = g_pd->g_dbus;
6727 WDP_LOGE("DBus connection is NULL");
6728 __WDP_LOG_FUNC_EXIT__;
6731 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6733 dbus_set_method_param(¶ms, "SaveConfig", g_pd->iface_path, g_dbus);
6734 params.params = NULL;
6736 res = dbus_method_call(¶ms, SUPPLICANT_IFACE, NULL, NULL);
6738 WDP_LOGE("Failed to save config to wpa_supplicant");
6740 WDP_LOGD("Succeeded to save config");
6742 __WDP_LOG_FUNC_EXIT__;
6746 int ws_set_operating_channel(int channel)
6748 __WDP_LOG_FUNC_ENTER__;
6749 GDBusConnection *g_dbus = NULL;
6750 GVariant *value = NULL;
6751 GVariant *param = NULL;
6752 GVariantBuilder *builder = NULL;
6753 dbus_method_param_s params;
6756 g_dbus = g_pd->g_dbus;
6758 WDP_LOGE("DBus connection is NULL");
6759 __WDP_LOG_FUNC_EXIT__;
6763 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6765 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path, g_dbus);
6767 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6768 g_variant_builder_add(builder, "{sv}", "OperChannel", g_variant_new_uint32(channel));
6769 value = g_variant_new("a{sv}", builder);
6770 g_variant_builder_unref(builder);
6772 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
6773 params.params = param;
6775 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
6777 WDP_LOGE("Failed to send command to wpa_supplicant");
6779 WDP_LOGD("Succeeded to set Operating Channel");
6781 __WDP_LOG_FUNC_EXIT__;
6785 int ws_remove_all_network(void)
6787 __WDP_LOG_FUNC_ENTER__;
6788 GDBusConnection *g_dbus = NULL;
6789 dbus_method_param_s params;
6792 g_dbus = g_pd->g_dbus;
6794 WDP_LOGE("DBus connection is NULL");
6795 __WDP_LOG_FUNC_EXIT__;
6798 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6800 dbus_set_method_param(¶ms, "RemoveAllNetworks", g_pd->iface_path, g_dbus);
6801 params.params = NULL;
6803 res = dbus_method_call(¶ms, SUPPLICANT_IFACE, NULL, NULL);
6805 WDP_LOGE("Failed to send [RemoveAllNetworks] command to wpa_supplicant");
6807 WDP_LOGD("Succeeded to remove all networks from supplicant");
6809 WDP_LOGD("Succeeded to remove all network");
6810 __WDP_LOG_FUNC_EXIT__;
6814 int ws_get_wpa_status(int *wpa_status)
6816 __WDP_LOG_FUNC_ENTER__;
6817 GDBusConnection *g_dbus = NULL;
6818 GVariant *param = NULL;
6819 GVariant *reply = NULL;
6820 GError *error = NULL;
6823 WDP_LOGE("Invalid parameter");
6824 __WDP_LOG_FUNC_EXIT__;
6828 *wpa_status = WFD_OEM_WPA_STATE_MAX;
6830 g_dbus = g_pd->g_dbus;
6832 WDP_LOGE("DBus connection is NULL");
6833 __WDP_LOG_FUNC_EXIT__;
6837 param = g_variant_new("(s)", SUPPLICANT_IFACE);
6839 reply = g_dbus_connection_call_sync(
6841 SUPPLICANT_SERVICE, /* bus name */
6842 g_pd->iface_path, /* object path */
6843 DBUS_PROPERTIES_INTERFACE, /* interface name */
6844 DBUS_PROPERTIES_METHOD_GETALL, /* method name */
6845 param, /* GVariant *params */
6846 NULL, /* reply_type */
6847 G_DBUS_CALL_FLAGS_NONE, /* flags */
6848 SUPPLICANT_TIMEOUT , /* timeout */
6849 NULL, /* cancellable */
6850 &error); /* error */
6852 if (error != NULL) {
6853 WDP_LOGE("Error! Failed to get properties: [%s]",
6855 g_error_free(error);
6857 g_variant_unref(reply);
6858 __WDP_LOG_FUNC_EXIT__;
6862 gchar *reply_str = NULL;
6864 reply_str = g_variant_print(reply, TRUE);
6865 WDP_LOGE("reply [%s]", reply_str ? reply_str : "NULL");
6868 if (reply != NULL) {
6869 GVariantIter *iter = NULL;
6870 g_variant_get(reply, "(a{sv})", &iter);
6874 GVariant *value = NULL;
6876 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
6877 if (g_strcmp0(key, "State") == 0) {
6878 const gchar *state = NULL;
6879 g_variant_get(value, "&s", &state);
6880 WDP_LOGI("state : [%s]", state);
6882 if (g_strcmp0(state, "disconnected") == 0)
6883 *wpa_status = WFD_OEM_WPA_STATE_DISCONNECTED;
6884 else if (g_strcmp0(state, "inactive") == 0)
6885 *wpa_status = WFD_OEM_WPA_STATE_INACTIVE;
6886 else if (g_strcmp0(state, "scanning") == 0)
6887 *wpa_status = WFD_OEM_WPA_STATE_SCANNING;
6888 else if (g_strcmp0(state, "authenticating") == 0)
6889 *wpa_status = WFD_OEM_WPA_STATE_AUTHENTICATING;
6890 else if (g_strcmp0(state, "associating") == 0)
6891 *wpa_status = WFD_OEM_WPA_STATE_ASSOCIATING;
6892 else if (g_strcmp0(state, "associated") == 0)
6893 *wpa_status = WFD_OEM_WPA_STATE_ASSOCIATED;
6894 else if (g_strcmp0(state, "4way_handshake") == 0)
6895 *wpa_status = WFD_OEM_WPA_STATE_4WAY_HANDSHAKE;
6896 else if (g_strcmp0(state, "group_handshake") == 0)
6897 *wpa_status = WFD_OEM_WPA_STATE_GROUP_HANDSHAKE;
6898 else if (g_strcmp0(state, "completed") == 0)
6899 *wpa_status = WFD_OEM_WPA_STATE_COMPLETED;
6901 *wpa_status = WFD_OEM_WPA_STATE_MAX;
6904 g_variant_iter_free(iter);
6906 g_variant_unref(reply);
6908 WDP_LOGD("No properties");
6911 WDP_LOGI("wpa_status : [%d]", *wpa_status);
6913 __WDP_LOG_FUNC_EXIT__;
6917 int ws_advertise_service(wfd_oem_asp_service_s *service, int replace)
6919 __WDP_LOG_FUNC_ENTER__;
6920 GDBusConnection *g_dbus = NULL;
6921 GVariantBuilder *builder = NULL;
6922 GVariant *value = NULL;
6923 dbus_method_param_s params;
6924 unsigned int config_method = 0x1108;
6925 int auto_accept = 0;
6929 g_dbus = g_pd->g_dbus;
6931 WDP_LOGE("DBus connection is NULL");
6935 if (service->config_method == 2) {
6936 config_method = WS_CONFIG_METHOD_KEYPAD |
6937 WS_CONFIG_METHOD_DISPLAY;
6938 } else if (service->config_method == 3) {
6939 config_method = WS_CONFIG_METHOD_DISPLAY;
6940 } else if (service->config_method == 4) {
6941 config_method = WS_CONFIG_METHOD_KEYPAD;
6944 if (service->auto_accept) {
6945 if (service->role == 0)
6953 rep = (replace == 1);
6955 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6957 dbus_set_method_param(¶ms, "AddService", g_pd->iface_path, g_dbus);
6959 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6961 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("asp"));
6962 g_variant_builder_add(builder, "{sv}", "auto_accept", g_variant_new_int32(auto_accept));
6963 g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new_uint32(service->adv_id));
6964 g_variant_builder_add(builder, "{sv}", "svc_state", g_variant_new_uint32(service->status));
6965 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new_uint32(config_method));
6966 g_variant_builder_add(builder, "{sv}", "replace", g_variant_new_boolean(rep));
6967 if (service->service_type != NULL)
6968 g_variant_builder_add(builder, "{sv}", "adv_str",
6969 g_variant_new_string(service->service_type));
6970 if (service->service_info != NULL)
6971 g_variant_builder_add(builder, "{sv}", "svc_info",
6972 g_variant_new_string(service->service_info));
6973 if (service->instance_name != NULL)
6974 g_variant_builder_add(builder, "{sv}", "svc_instance",
6975 g_variant_new_string(service->instance_name));
6977 value = g_variant_new("(a{sv})", builder);
6978 g_variant_builder_unref(builder);
6979 DEBUG_G_VARIANT("Params : ", value);
6981 params.params = value;
6983 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
6985 WDP_LOGE("Failed to send command to wpa_supplicant");
6987 WDP_LOGD("Succeeded to add service");
6989 __WDP_LOG_FUNC_EXIT__;
6993 int ws_cancel_advertise_service(wfd_oem_asp_service_s *service)
6995 __WDP_LOG_FUNC_ENTER__;
6996 GDBusConnection *g_dbus = NULL;
6997 GVariantBuilder *builder = NULL;
6998 GVariant *value = NULL;
6999 dbus_method_param_s params;
7002 g_dbus = g_pd->g_dbus;
7004 WDP_LOGE("DBus connection is NULL");
7007 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7009 dbus_set_method_param(¶ms, "DeleteService", g_pd->iface_path, g_dbus);
7011 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
7013 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("asp"));
7014 g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new_uint32(service->adv_id));
7016 value = g_variant_new("(a{sv})", builder);
7017 g_variant_builder_unref(builder);
7018 DEBUG_G_VARIANT("Params : ", value);
7019 params.params = value;
7021 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
7023 WDP_LOGE("Failed to send command to wpa_supplicant");
7025 WDP_LOGD("Succeeded to del service");
7027 __WDP_LOG_FUNC_EXIT__;
7031 static void __ws_add_seek(wfd_oem_asp_service_s *service)
7033 __WDP_LOG_FUNC_ENTER__;
7034 wfd_oem_asp_service_s *seek = NULL;
7036 WDP_LOGE("invalid parameters");
7040 seek = g_try_malloc0(sizeof(wfd_oem_asp_service_s));
7042 WDP_LOGE("Failed to allocate memory for service");
7046 service->search_id = (intptr_t)seek;
7047 memcpy(seek, service, sizeof(wfd_oem_asp_service_s));
7048 if (service->service_type)
7049 seek->service_type = strdup(service->service_type);
7050 seek_list = g_list_prepend(seek_list, seek);
7052 __WDP_LOG_FUNC_EXIT__;
7056 static wfd_oem_asp_service_s * __ws_get_seek(long long unsigned asp_search_id)
7058 __WDP_LOG_FUNC_ENTER__;
7059 wfd_oem_asp_service_s *seek = NULL;
7062 for (list = seek_list; list != NULL; list = list->next) {
7064 if (seek && (seek->asp_search_id == asp_search_id)) {
7065 WDP_LOGD("List found");
7071 __WDP_LOG_FUNC_EXIT__;
7075 static void __ws_remove_seek(wfd_oem_asp_service_s *service)
7077 __WDP_LOG_FUNC_ENTER__;
7078 wfd_oem_asp_service_s *seek = NULL;
7081 for (list = seek_list; list != NULL; list = list->next) {
7084 if (seek && (seek->asp_search_id == service->asp_search_id)) {
7085 WDP_LOGD("List remove");
7086 seek_list = g_list_remove(seek_list, seek);
7087 g_free(seek->service_type);
7088 g_free(seek->service_info);
7092 __WDP_LOG_FUNC_EXIT__;
7096 static void __get_asp_search_id(GVariant *value, void *args)
7098 __WDP_LOG_FUNC_ENTER__;
7099 wfd_oem_asp_service_s *service = NULL;
7100 wfd_oem_asp_service_s *seek = NULL;
7101 long long unsigned search_id = 0;
7103 g_variant_get(value, "(t)", &search_id);
7105 service = (wfd_oem_asp_service_s *)args;
7107 WDP_LOGE("invalid parameters");
7108 __WDP_LOG_FUNC_EXIT__;
7112 seek = g_try_malloc0(sizeof(wfd_oem_asp_service_s));
7114 WDP_LOGE("Failed to allocate memory for service");
7115 __WDP_LOG_FUNC_EXIT__;
7119 service->search_id = search_id;
7120 memcpy(seek, service, sizeof(wfd_oem_asp_service_s));
7121 if (service->service_type)
7122 seek->service_type = strdup(service->service_type);
7123 if (service->service_info)
7124 seek->service_info = strdup(service->service_info);
7125 seek_list = g_list_append(seek_list, seek);
7127 __WDP_LOG_FUNC_EXIT__;
7131 int ws_seek_service(wfd_oem_asp_service_s *service)
7133 __WDP_LOG_FUNC_ENTER__;
7134 GDBusConnection *g_dbus = NULL;
7136 wfd_oem_asp_service_s *seek = NULL;
7139 g_dbus = g_pd->g_dbus;
7141 WDP_LOGE("DBus connection is NULL");
7142 __WDP_LOG_FUNC_EXIT__;
7145 list = g_list_last(seek_list);
7147 service->tran_id = 1;
7152 service->tran_id = seek->tran_id + 1;
7154 service->tran_id = 1;
7157 if (service->service_info) {
7158 GVariantBuilder *builder = NULL;
7159 GVariant *value = NULL;
7160 dbus_method_param_s params;
7162 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7163 dbus_set_method_param(¶ms, "ServiceDiscoveryRequest",
7164 g_pd->iface_path, g_dbus);
7166 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
7168 g_variant_builder_add(builder, "{sv}", "service_type",
7169 g_variant_new_string("asp"));
7170 g_variant_builder_add(builder, "{sv}", "transaction_id",
7171 g_variant_new_byte(service->tran_id));
7172 if (service->service_type != NULL)
7173 g_variant_builder_add(builder, "{sv}", "svc_str",
7174 g_variant_new_string(service->service_type));
7176 if (service->service_info != NULL)
7177 g_variant_builder_add(builder, "{sv}", "svc_info",
7178 g_variant_new_string(service->service_info));
7180 if (service->instance_name != NULL)
7181 g_variant_builder_add(builder, "{sv}", "svc_instance",
7182 g_variant_new_string(service->instance_name));
7184 value = g_variant_new("(a{sv})", builder);
7185 g_variant_builder_unref(builder);
7187 DEBUG_G_VARIANT("Params : ", value);
7189 params.params = value;
7190 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE,
7191 __get_asp_search_id, service);
7194 __ws_add_seek(service);
7198 WDP_LOGE("Failed to send command to wpa_supplicant");
7200 WDP_LOGD("Succeeded to seek service");
7202 __WDP_LOG_FUNC_EXIT__;
7206 int ws_cancel_seek_service(wfd_oem_asp_service_s *service)
7208 __WDP_LOG_FUNC_ENTER__;
7209 GDBusConnection *g_dbus = NULL;
7210 wfd_oem_asp_service_s *seek = NULL;
7211 dbus_method_param_s params;
7214 g_dbus = g_pd->g_dbus;
7216 WDP_LOGE("DBus connection is NULL");
7217 __WDP_LOG_FUNC_EXIT__;
7221 seek = __ws_get_seek(service->asp_search_id);
7223 WDP_LOGE("seek data is NULL");
7224 __WDP_LOG_FUNC_EXIT__;
7228 if (seek->service_info) {
7230 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7231 dbus_set_method_param(¶ms, "ServiceDiscoveryCancelRequest",
7232 g_pd->iface_path, g_dbus);
7234 params.params = g_variant_new("(t)", service->search_id);
7236 DEBUG_G_VARIANT("Params : ", params.params);
7238 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
7240 WDP_LOGE("Failed to send command to wpa_supplicant");
7242 WDP_LOGD("Succeeded to cancel seek service");
7245 __ws_remove_seek(seek);
7247 __WDP_LOG_FUNC_EXIT__;
7251 int ws_asp_prov_disc_req(wfd_oem_asp_prov_s *asp_params)
7253 __WDP_LOG_FUNC_ENTER__;
7254 GDBusConnection *g_dbus = NULL;
7255 GVariantBuilder *builder = NULL;
7256 GVariantBuilder *mac_builder = NULL;
7257 GVariant *value = NULL;
7258 dbus_method_param_s params;
7259 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
7260 int config_method = 0x1000;
7265 WDP_LOGE("Invalid parameter");
7266 __WDP_LOG_FUNC_EXIT__;
7269 g_dbus = g_pd->g_dbus;
7271 WDP_LOGE("DBus connection is NULL");
7272 __WDP_LOG_FUNC_EXIT__;
7276 if (asp_params->network_config == WFD_OEM_ASP_WPS_TYPE_PIN_DISPLAY)
7277 config_method = 0x8;
7278 else if (asp_params->network_config == WFD_OEM_ASP_WPS_TYPE_PIN_KEYPAD)
7279 config_method = 0x100;
7281 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7283 dbus_set_method_param(¶ms, "ASPProvisionDiscoveryRequest", g_pd->iface_path, g_dbus);
7285 if (asp_params->deferring == 0)
7286 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
7287 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(asp_params->service_mac));
7289 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
7290 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(asp_params->session_mac));
7291 WDP_LOGD("get peer path [%s]", peer_path);
7293 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
7294 g_variant_builder_add(builder, "{sv}", "peer", g_variant_new_object_path(peer_path));
7296 g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new_uint32(asp_params->adv_id));
7297 g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new_uint32(asp_params->session_id));
7298 g_variant_builder_add(builder, "{sv}", "role", g_variant_new_byte(asp_params->network_role));
7299 g_variant_builder_add(builder, "{sv}", "method", g_variant_new_int32(config_method));
7300 if (asp_params->status > 0)
7301 g_variant_builder_add(builder, "{sv}", "status", g_variant_new_int32(asp_params->status));
7302 if (asp_params->session_information)
7303 g_variant_builder_add(builder, "{sv}", "info", g_variant_new_string(asp_params->session_information));
7305 mac_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
7306 for (i = 0; i < OEM_MACADDR_LEN; i++)
7307 g_variant_builder_add(mac_builder, "y", asp_params->service_mac[i]);
7308 g_variant_builder_add(builder, "{sv}", "adv_mac",
7309 g_variant_new("ay", mac_builder));
7310 g_variant_builder_unref(mac_builder);
7312 mac_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
7313 for (i = 0; i < OEM_MACADDR_LEN; i++)
7314 g_variant_builder_add(mac_builder, "y", asp_params->session_mac[i]);
7315 g_variant_builder_add(builder, "{sv}", "session_mac",
7316 g_variant_new("ay", mac_builder));
7317 g_variant_builder_unref(mac_builder);
7319 value = g_variant_new("(a{sv})", builder);
7320 g_variant_builder_unref(builder);
7321 DEBUG_G_VARIANT("Params : ", value);
7323 params.params = value;
7325 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
7327 WDP_LOGE("Failed to send command to wpa_supplicant");
7329 WDP_LOGD("Succeeded to send connection command to peer[" MACSTR "]", MAC2STR(asp_params->service_mac));
7331 __WDP_LOG_FUNC_EXIT__;
7335 int ws_set_eapol_ip_config(int enable)
7337 __WDP_LOG_FUNC_ENTER__;
7338 GDBusConnection *g_dbus = NULL;
7340 GVariant *value = NULL;
7341 GVariant *param = NULL;
7342 GVariantBuilder *builder = NULL;
7343 GVariantBuilder *type_builder = NULL;
7344 dbus_method_param_s params;
7353 unsigned char eapol_ip[IP_END + 1][OEM_IPADDR_LEN + 1] = {0,};
7356 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
7357 __WDP_LOG_FUNC_EXIT__;
7361 g_dbus = g_pd->g_dbus;
7363 WDP_LOGE("DBus connection is NULL");
7364 __WDP_LOG_FUNC_EXIT__;
7367 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7369 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
7372 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
7374 memset(&eapol_ip, 0x0, (IP_END + 1) * (OEM_IPADDR_LEN + 1));
7376 memcpy(eapol_ip[IP_GO], DEFAULT_IP_GO, OEM_IPADDR_LEN);
7377 memcpy(eapol_ip[IP_MASK], DEFAULT_IP_MASK, OEM_IPADDR_LEN);
7378 memcpy(eapol_ip[IP_START], DEFAULT_IP_START, OEM_IPADDR_LEN);
7379 memcpy(eapol_ip[IP_END], DEFAULT_IP_END, OEM_IPADDR_LEN);
7382 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
7383 for (i = 0; i < OEM_IPADDR_LEN; i++)
7384 g_variant_builder_add(type_builder, "y", eapol_ip[IP_GO][i]);
7385 g_variant_builder_add(builder, "{sv}", "IpAddrGo",
7386 g_variant_new("ay", type_builder));
7387 g_variant_builder_unref(type_builder);
7389 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
7390 for (i = 0; i < OEM_IPADDR_LEN; i++)
7391 g_variant_builder_add(type_builder, "y", eapol_ip[IP_MASK][i]);
7392 g_variant_builder_add(builder, "{sv}", "IpAddrMask",
7393 g_variant_new("ay", type_builder));
7394 g_variant_builder_unref(type_builder);
7396 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
7397 for (i = 0; i < OEM_IPADDR_LEN; i++)
7398 g_variant_builder_add(type_builder, "y", eapol_ip[IP_START][i]);
7399 g_variant_builder_add(builder, "{sv}", "IpAddrStart",
7400 g_variant_new("ay", type_builder));
7401 g_variant_builder_unref(type_builder);
7403 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
7404 for (i = 0; i < OEM_IPADDR_LEN; i++)
7405 g_variant_builder_add(type_builder, "y", eapol_ip[IP_END][i]);
7406 g_variant_builder_add(builder, "{sv}", "IpAddrEnd",
7407 g_variant_new("ay", type_builder));
7408 g_variant_builder_unref(type_builder);
7410 value = g_variant_new("a{sv}", builder);
7411 g_variant_builder_unref(builder);
7413 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
7415 params.params = param;
7417 DEBUG_G_VARIANT("Params : ", param);
7418 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
7420 WDP_LOGE("Failed to send command to wpa_supplicant");
7422 WDP_LOGI("Succeeded to set eapol IP");
7424 __WDP_LOG_FUNC_EXIT__;
7428 int ws_add_vsie(wfd_oem_vsie_frames_e frame_id, const char* vsie)
7430 __WDP_LOG_FUNC_ENTER__;
7431 GDBusConnection *g_dbus = NULL;
7432 GVariant *value = NULL;
7433 GVariantBuilder *bytearray_builder = NULL;
7434 dbus_method_param_s params;
7437 size_t vsie_len = 0;
7439 unsigned char *bytearray = NULL;
7440 size_t bytearray_len = 0;
7442 if (frame_id >= WFD_OEM_VSIE_FRAME_MAX ||
7444 WDP_LOGE("Invalid parameter");
7449 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
7450 __WDP_LOG_FUNC_EXIT__;
7454 g_dbus = g_pd->g_dbus;
7456 WDP_LOGE("DBus connection is NULL");
7457 __WDP_LOG_FUNC_EXIT__;
7461 vsie_len = strlen(vsie);
7462 if (vsie_len == 0) {
7463 WDP_LOGE("vsie length is zero");
7464 __WDP_LOG_FUNC_EXIT__;
7468 bytearray_len = (vsie_len % 2) ? ((vsie_len / 2) + 1) : (vsie_len / 2);
7470 bytearray = (unsigned char *) g_try_malloc0(bytearray_len);
7471 if (bytearray == NULL) {
7472 WDP_LOGE("Failed to allocate memory to bytearray");
7473 __WDP_LOG_FUNC_EXIT__;
7477 if (__ws_hex_str_to_bin(vsie, bytearray, bytearray_len) < 0) {
7478 WDP_LOGE("invalid vsie string");
7480 __WDP_LOG_FUNC_EXIT__;
7484 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7485 dbus_set_method_param(¶ms, "VendorElemAdd", g_pd->iface_path,
7488 bytearray_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
7489 for (i = 0; i < bytearray_len; i++)
7490 g_variant_builder_add(bytearray_builder, "y", bytearray[i]);
7492 value = g_variant_new("(iay)", frame_id, bytearray_builder);
7493 g_variant_builder_unref(bytearray_builder);
7495 params.params = value;
7497 res = dbus_method_call(¶ms, SUPPLICANT_IFACE, NULL, NULL);
7499 WDP_LOGE("Failed to send command to wpa_supplicant");
7501 __WDP_LOG_FUNC_EXIT__;
7505 WDP_LOGD("Succeeded to add vsie: Frame ID [%d], VSIE [%s]", frame_id,
7509 __WDP_LOG_FUNC_EXIT__;
7513 int ws_get_vsie(wfd_oem_vsie_frames_e frame_id, char **vsie)
7515 __WDP_LOG_FUNC_ENTER__;
7516 GDBusConnection *g_dbus = NULL;
7517 GVariant *param = NULL;
7518 GVariant *reply = NULL;
7519 GError *error = NULL;
7521 if (frame_id >= WFD_OEM_VSIE_FRAME_MAX ||
7523 WDP_LOGE("Invalid parameter");
7524 __WDP_LOG_FUNC_EXIT__;
7529 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
7530 __WDP_LOG_FUNC_EXIT__;
7534 g_dbus = g_pd->g_dbus;
7536 WDP_LOGE("DBus connection is NULL");
7537 __WDP_LOG_FUNC_EXIT__;
7541 param = g_variant_new("(i)", frame_id);
7543 reply = g_dbus_connection_call_sync(
7545 SUPPLICANT_SERVICE, /* bus name */
7546 g_pd->iface_path, /* object path */
7547 SUPPLICANT_IFACE, /* interface name */
7548 "VendorElemGet", /* method name */
7549 param, /* GVariant *params */
7550 NULL, /* reply_type */
7551 G_DBUS_CALL_FLAGS_NONE, /* flags */
7552 SUPPLICANT_TIMEOUT, /* timeout */
7553 NULL, /* cancellable */
7554 &error); /* error */
7556 if (error != NULL) {
7557 WDP_LOGE("Error! Failed to get vsie: [%s]", error->message);
7558 g_error_free(error);
7560 g_variant_unref(reply);
7561 __WDP_LOG_FUNC_EXIT__;
7565 if (reply != NULL) {
7566 DEBUG_G_VARIANT("Reply : ", reply);
7568 GVariantIter *iter = NULL;
7569 unsigned char *vsie_bytes = NULL;
7572 g_variant_get(reply, "(ay)", &iter);
7574 WDP_LOGD("vsie is not present");
7575 __WDP_LOG_FUNC_EXIT__;
7579 vsie_len = __ws_unpack_ay_malloc(&vsie_bytes, iter);
7580 if (vsie_bytes == NULL) {
7581 WDP_LOGD("vsie_bytes not allocated");
7582 __WDP_LOG_FUNC_EXIT__;
7586 __ws_byte_to_txt(vsie_bytes, vsie, vsie_len);
7589 WDP_LOGE("vsie not allocated.");
7590 __WDP_LOG_FUNC_EXIT__;
7597 WDP_LOGD("Succeeded to get vsie: Frame ID [%d], VSIE [%s]", frame_id,
7599 __WDP_LOG_FUNC_EXIT__;
7603 int ws_remove_vsie(wfd_oem_vsie_frames_e frame_id, const char *vsie)
7605 __WDP_LOG_FUNC_ENTER__;
7606 GDBusConnection *g_dbus = NULL;
7607 GVariantBuilder *bytearray_builder = NULL;
7608 GVariant *value = NULL;
7609 dbus_method_param_s params;
7612 size_t vsie_len = 0;
7614 unsigned char *bytearray = NULL;
7615 size_t bytearray_len = 0;
7617 if (frame_id >= WFD_OEM_VSIE_FRAME_MAX ||
7619 WDP_LOGE("Invalid parameter");
7624 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
7625 __WDP_LOG_FUNC_EXIT__;
7629 g_dbus = g_pd->g_dbus;
7631 WDP_LOGE("DBus connection is NULL");
7632 __WDP_LOG_FUNC_EXIT__;
7636 vsie_len = strlen(vsie);
7637 if (vsie_len == 0) {
7638 WDP_LOGE("vsie length is zero");
7639 __WDP_LOG_FUNC_EXIT__;
7643 bytearray_len = (vsie_len % 2) ? ((vsie_len / 2) + 1) : (vsie_len / 2);
7645 bytearray = (unsigned char *) g_try_malloc0(bytearray_len);
7646 if (bytearray == NULL) {
7647 WDP_LOGE("Failed to allocate memory to bytearray");
7648 __WDP_LOG_FUNC_EXIT__;
7652 if (__ws_hex_str_to_bin(vsie, bytearray, bytearray_len) < 0) {
7653 WDP_LOGE("invalid vsie string");
7655 __WDP_LOG_FUNC_EXIT__;
7659 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7660 dbus_set_method_param(¶ms, "VendorElemRem", g_pd->iface_path,
7663 bytearray_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
7664 for (i = 0; i < bytearray_len; i++)
7665 g_variant_builder_add(bytearray_builder, "y", bytearray[i]);
7667 value = g_variant_new("(iay)", frame_id, bytearray_builder);
7668 g_variant_builder_unref(bytearray_builder);
7670 params.params = value;
7672 res = dbus_method_call(¶ms, SUPPLICANT_IFACE, NULL, NULL);
7674 WDP_LOGE("Failed to send command to wpa_supplicant");
7676 __WDP_LOG_FUNC_EXIT__;
7680 WDP_LOGD("Succeeded to remove vsie: Frame ID [%d], VSIE [%s]", frame_id,
7683 __WDP_LOG_FUNC_EXIT__;
7687 int ws_set_supported_wps_mode(int wps_mode)
7689 __WDP_LOG_FUNC_ENTER__;
7690 char config_value[DBUS_OBJECT_PATH_MAX+1] = {0,};
7692 int new_wps_mode = wps_mode;
7696 WDP_LOGE("no configurable data found");
7697 __WDP_LOG_FUNC_EXIT__;
7701 if (new_wps_mode == 0) {
7702 WDP_LOGE("Reset to default value");
7703 new_wps_mode = WFD_OEM_WPS_MODE_PBC|WFD_OEM_WPS_MODE_DISPLAY|WFD_OEM_WPS_MODE_KEYPAD;
7706 if (new_wps_mode & WFD_OEM_WPS_MODE_KEYPAD) {
7707 g_strlcat(config_value, "keypad ", sizeof(config_value));
7710 if (new_wps_mode & WFD_OEM_WPS_MODE_PBC) {
7711 g_strlcat(config_value, "virtual_push_button ", sizeof(config_value));
7714 if (new_wps_mode & WFD_OEM_WPS_MODE_DISPLAY) {
7715 g_strlcat(config_value, "physical_display ", sizeof(config_value));
7718 config_value[length-1] = 0;
7719 g_strlcpy(config->config_methods, config_value, OEM_CONFIG_METHOD_LEN);
7720 WDP_LOGD("config_value = %s, length = %d", config_value, length-1);
7721 res = __ws_set_config_methods();
7723 WDP_LOGE("Failed to set config method");
7724 __WDP_LOG_FUNC_EXIT__;
7727 wps_config_method = new_wps_mode;
7728 __WDP_LOG_FUNC_EXIT__;
7732 static int _ws_remove_persistent_group_by_object_path(const char *object_path)
7734 __WDP_LOG_FUNC_ENTER__;
7735 GDBusConnection *g_dbus = NULL;
7736 dbus_method_param_s params;
7740 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
7741 __WDP_LOG_FUNC_EXIT__;
7745 g_dbus = g_pd->g_dbus;
7747 WDP_LOGE("DBus connection is NULL");
7748 __WDP_LOG_FUNC_EXIT__;
7752 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7753 dbus_set_method_param(¶ms, "RemovePersistentGroup",
7754 g_pd->iface_path, g_dbus);
7755 params.params = g_variant_new("(o)", object_path);
7757 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
7759 WDP_LOGE("Failed to send command to wpa_supplicant");
7760 __WDP_LOG_FUNC_EXIT__;
7765 WDP_LOGD("Succeeded to remove persistent group");;
7766 __WDP_LOG_FUNC_EXIT__;
7770 int ws_remove_persistent_device(unsigned char *mac_addr)
7772 __WDP_LOG_FUNC_ENTER__;
7773 GDBusConnection *g_dbus = NULL;
7774 ws_network_info_s networks[WS_MAX_PERSISTENT_COUNT];
7777 int need_delete = 0;
7781 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
7782 __WDP_LOG_FUNC_EXIT__;
7786 g_dbus = g_pd->g_dbus;
7788 WDP_LOGE("DBus connection is NULL");
7789 __WDP_LOG_FUNC_EXIT__;
7792 memset(&networks, 0x0, WS_MAX_PERSISTENT_COUNT * sizeof(ws_network_info_s));
7793 dbus_property_get_all(g_pd->iface_path, g_dbus, SUPPLICANT_P2PDEVICE,
7794 __ws_extract_p2pdevice_details, networks);
7796 cnt = networks[0].total;
7798 WDP_LOGD("Persistent Group Count=%d", cnt);
7799 if (cnt > WS_MAX_PERSISTENT_COUNT) {
7800 WDP_LOGE("Persistent group count exceeded or parsing error");
7801 __WDP_LOG_FUNC_EXIT__;
7805 for (i = 0 ; i < cnt ; i++) {
7809 WDP_LOGD("----persistent group [%d]----", i);
7810 WDP_LOGD("network_id [%d]", networks[i].network_id);
7811 WDP_LOGD("ssid [%s]", networks[i].ssid);
7812 WDP_LOGD("bssid ["MACSTR"]", MAC2STR(networks[i].bssid));
7813 WDP_LOGD("p2p_client_num [%d]", networks[i].p2p_client_num);
7814 for (j = 0; j < networks[i].p2p_client_num; j++) {
7815 WDP_LOGD("p2p_client_list ["MACSTR"]", MAC2STR(networks[i].p2p_client_list[j]));
7818 WDP_LOGD("mac_addr ["MACSTR"]", MAC2STR(mac_addr));
7820 if (memcmp(mac_addr, networks[i].bssid, WS_MACADDR_LEN) == 0) {
7821 WDP_LOGD("Persistent group owner found [%d: "MACSTR"]", networks[i].network_id, MAC2STR(mac_addr));
7825 if (need_delete == 0) {
7826 for (j = 0; j < networks[i].p2p_client_num; j++) {
7827 if (!memcmp(mac_addr, networks[i].p2p_client_list[j], WS_MACADDR_LEN)) {
7828 WDP_LOGD("Persistent group client found [%d: "MACSTR"]", networks[i].network_id, MAC2STR(mac_addr));
7835 res = _ws_remove_persistent_group_by_object_path(networks[i].persistent_path);
7836 WDP_LOGI("persistent group deleted [%s]", networks[i].persistent_path);
7838 WDP_LOGE("Failed to _ws_remove_persistent_group_by_object_path");
7840 WDP_LOGD("Succeeded to _ws_remove_persistent_group_by_object_path");
7845 __WDP_LOG_FUNC_EXIT__;
7849 int ws_remove_all_persistent_device(void)
7851 __WDP_LOG_FUNC_ENTER__;
7852 GDBusConnection *g_dbus = NULL;
7853 dbus_method_param_s params;
7856 g_dbus = g_pd->g_dbus;
7858 WDP_LOGE("DBus connection is NULL");
7859 __WDP_LOG_FUNC_EXIT__;
7862 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7864 dbus_set_method_param(¶ms, "RemoveAllPersistentGroups", g_pd->iface_path, g_dbus);
7865 params.params = NULL;
7867 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
7869 WDP_LOGE("Failed to RemoveAllPersistentGroups");
7871 WDP_LOGD("Succeeded to RemoveAllPersistentGroups");
7875 WDP_LOGD("Succeeded to remove all network");
7876 __WDP_LOG_FUNC_EXIT__;
7880 static void __ws_get_supported_channels_reply(GVariant *reply, void *user_data)
7882 __WDP_LOG_FUNC_ENTER__;
7884 GVariantIter *iter = NULL;
7885 wfd_oem_supported_channels_s *data = (wfd_oem_supported_channels_s *)user_data;
7890 g_variant_get(reply, "(ai)", &iter);
7892 while (g_variant_iter_loop(iter, "i", &channel))
7893 data->channels[data->count++] = channel;
7895 g_variant_iter_free (iter);
7898 WDP_LOGE("Reply is NULL");
7900 __WDP_LOG_FUNC_EXIT__;
7903 int ws_get_supported_channels(wfd_oem_supported_channels_s *data)
7905 __WDP_LOG_FUNC_ENTER__;
7907 dbus_method_param_s params;
7910 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
7911 __WDP_LOG_FUNC_EXIT__;
7915 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
7916 memset(data, 0x0, sizeof(wfd_oem_supported_channels_s));
7918 dbus_set_method_param(¶ms, "GetSupportedChannels", g_pd->iface_path, g_pd->g_dbus);
7919 params.params = NULL;
7921 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE,
7922 __ws_get_supported_channels_reply, data);
7924 WDP_LOGE("Failed to GetSupportedChannels");
7926 WDP_LOGD("Succeeded to GetSupportedChannels");
7929 __WDP_LOG_FUNC_EXIT__;