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 "wfd-plugin-wpasupplicant.h"
51 #include "dbus/wfd-plugin-supplicant-dbus.h"
53 #if defined(TIZEN_FEATURE_ASP)
54 #define GLIST_ITER_START(arg_list, elem)\
56 temp = g_list_first(arg_list);\
59 temp = g_list_next(temp);\
61 #define GLIST_ITER_END() }
64 #define NETCONFIG_SERVICE "net.netconfig"
65 #define NETCONFIG_WIFI_INTERFACE "net.netconfig.wifi"
66 #define NETCONFIG_WIFI_PATH "/net/netconfig/wifi"
68 #define NETCONFIG_DBUS_REPLY_TIMEOUT (10 * 1000)
70 #if defined TIZEN_MOBILE
71 #define DEFAULT_MAC_FILE_PATH tzplatform_mkpath(TZ_SYS_ETC, ".mac.info")
74 #if defined TIZEN_WIFI_MODULE_BUNDLE
75 #define DEFAULT_MAC_FILE_PATH "/sys/class/net/wlan0/address"
78 #ifndef DEFAULT_MAC_FILE_PATH
79 #define DEFAULT_MAC_FILE_PATH "/sys/class/net/p2p0/address"
82 static wfd_oem_ops_s supplicant_ops = {
85 .activate = ws_activate,
86 .deactivate = ws_deactivate,
88 .start_scan = ws_start_scan,
89 .stop_scan = ws_stop_scan,
90 .get_visibility = ws_get_visibility,
91 .set_visibility = ws_set_visibility,
92 .get_scan_result = ws_get_scan_result,
93 .get_peer_info = ws_get_peer_info,
95 .prov_disc_req = ws_prov_disc_req,
97 .connect = ws_connect,
98 .disconnect = ws_disconnect,
99 .reject_connection = ws_reject_connection,
100 .cancel_connection = ws_cancel_connection,
102 .get_connected_peers = ws_get_connected_peers,
103 .get_pin = ws_get_pin,
104 .set_pin = ws_set_pin,
105 .generate_pin = ws_generate_pin,
106 .get_supported_wps_mode = ws_get_supported_wps_mode,
108 .create_group = ws_create_group,
109 .destroy_group = ws_destroy_group,
111 .wps_start = ws_wps_start,
112 .enrollee_start = ws_enrollee_start,
113 .wps_cancel = ws_wps_cancel,
115 .get_dev_name = ws_get_dev_name,
116 .set_dev_name = ws_set_dev_name,
117 .get_dev_mac = ws_get_dev_mac,
118 .get_dev_type = ws_get_dev_type,
119 .set_dev_type = ws_set_dev_type,
120 .get_go_intent = ws_get_go_intent,
121 .set_go_intent = ws_set_go_intent,
122 .set_country = ws_set_country,
123 .get_persistent_groups = ws_get_persistent_groups,
124 .remove_persistent_group = ws_remove_persistent_group,
125 .set_persistent_reconnect = ws_set_persistent_reconnect,
127 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
128 .start_service_discovery = ws_start_service_discovery,
129 .cancel_service_discovery = ws_cancel_service_discovery,
131 .serv_add = ws_serv_add,
132 .serv_del = ws_serv_del,
133 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
135 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
136 .miracast_init = ws_miracast_init,
137 .set_display = ws_set_display,
138 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
140 .refresh = ws_refresh,
141 .save_config = ws_save_config,
142 .set_operating_channel = ws_set_operating_channel,
143 .remove_all_network = ws_remove_all_network,
144 .get_wpa_status = ws_get_wpa_status,
146 #if defined(TIZEN_FEATURE_ASP)
147 .advertise_service = ws_advertise_service,
148 .cancel_advertise_service = ws_cancel_advertise_service,
149 .seek_service = ws_seek_service,
150 .cancel_seek_service = ws_cancel_seek_service,
151 .asp_prov_disc_req = ws_asp_prov_disc_req,
152 #endif /* TIZEN_FEATURE_ASP */
155 static ws_dbus_plugin_data_s *g_pd;
157 static int is_peer_joined_notified = 0;
158 static int is_peer_disconnected_notified = 0;
160 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
161 static GList *service_list;
162 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
164 static GList *seek_list;
166 static void _supplicant_signal_cb(GDBusConnection *connection,
167 const gchar *sender, const gchar *object_path, const gchar *interface,
168 const gchar *signal, GVariant *parameters, gpointer user_data);
170 static void _p2pdevice_signal_cb(GDBusConnection *connection,
171 const gchar *sender, const gchar *object_path, const gchar *interface,
172 const gchar *signal, GVariant *parameters, gpointer user_data);
174 static void _group_signal_cb(GDBusConnection *connection,
175 const gchar *sender, const gchar *object_path, const gchar *interface,
176 const gchar *signal, GVariant *parameters, gpointer user_data);
178 static void _interface_signal_cb(GDBusConnection *connection,
179 const gchar *sender, const gchar *object_path, const gchar *interface,
180 const gchar *signal, GVariant *parameters, gpointer user_data);
182 static int __ws_txt_to_mac(unsigned char *txt, unsigned char *mac)
187 WDP_LOGE("Invalid parameter");
192 mac[i++] = (char) strtoul((char *)txt, (char **)&txt, 16);
193 if (!*txt++ || i == 6)
197 if (i != WS_MACADDR_LEN)
200 WDP_LOGD("Converted MAC address [" MACSECSTR "]", MAC2SECSTR(mac));
204 static int __ws_mac_compact_to_normal(char *compact, unsigned char *mac)
206 g_snprintf((char *)mac, OEM_MACSTR_LEN, "%c%c:%c%c:%c%c:%c%c:%c%c:%c%c",
207 compact[0], compact[1], compact[2], compact[3],
208 compact[4], compact[5], compact[6], compact[7],
209 compact[8], compact[9], compact[10], compact[11]);
213 static char *__ws_wps_to_txt(int wps_mode)
216 case WFD_OEM_WPS_MODE_PBC:
217 return WS_DBUS_STR_PBC;
219 case WFD_OEM_WPS_MODE_DISPLAY:
220 return WS_DBUS_STR_DISPLAY;
222 case WFD_OEM_WPS_MODE_KEYPAD:
223 return WS_DBUS_STR_KEYPAD;
225 #if defined(TIZEN_FEATURE_ASP)
226 case WFD_OEM_WPS_MODE_NONE:
227 case WFD_OEM_WPS_MODE_P2PS:
228 return WS_DBUS_STR_P2PS;
229 #endif /* TIZEN_FEATURE_ASP */
235 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
236 static int __ws_byte_to_hex(char *buf, int buf_size, unsigned char *data, int data_len)
240 char *end = buf + buf_size;
244 for (i = 0; i < data_len; i++) {
245 ret = snprintf(pos, end - pos, "%02x", data[i]);
246 if (ret < 0 || ret >= end - pos) {
256 static int __ws_hex_to_num(char *src, int len)
261 if (!src || len < 0) {
262 WDP_LOGE("Invalid parameter");
266 temp = (char*) g_try_malloc0(len+1);
268 WDP_LOGE("Failed to allocate memory");
272 memcpy(temp, src, len);
273 num = strtoul(temp, NULL, 16);
279 static int __ws_segment_to_service(char *segment, wfd_oem_new_service_s **service)
281 wfd_oem_new_service_s *serv_tmp = NULL;
287 if (!segment || !service) {
288 WDP_LOGE("Invalid parameter");
293 WDP_LOGD("Segment: %s", segment);
295 serv_tmp = (wfd_oem_new_service_s*) g_try_malloc0(sizeof(wfd_oem_new_service_s));
297 WDP_LOGE("Failed to allocate memory for service");
301 serv_tmp->protocol = __ws_hex_to_num(ptr, 2);
302 serv_tmp->trans_id = __ws_hex_to_num(ptr+2, 2);
303 serv_tmp->status = __ws_hex_to_num(ptr+4, 2);
305 WDP_LOGD("Protocol[%d], Transaction ID[%d], Status[%d]", serv_tmp->protocol, serv_tmp->trans_id, serv_tmp->status);
307 if (serv_tmp->status != 0) {
308 WDP_LOGE("Service status is not success");
313 if (serv_tmp->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
314 WDP_LOGD("===== Bonjour service =====");
315 char compr[5] = {0, };
316 char query[256] = {0, };
317 char rdata[256] = {0, };
320 while (*ptr != 0 && strncmp(ptr, "c0", 2)) {
321 len = __ws_hex_to_num(ptr, 2);
323 if (len && len <= 0xff) {
324 temp = (char*) calloc(1, len+2);
327 for (i = 0; i < len; i++) {
328 temp[i+1] = (char) __ws_hex_to_num(ptr, 2);
331 strncat(query, temp, len+1);
338 if (!strncmp(ptr, "c0", 2)) {
339 memcpy(compr, ptr, 4);
342 if (!strncmp(ptr, "27", 2)) {
343 WDP_LOGD("Segment ended");
347 dns_type = __ws_hex_to_num(ptr, 4);
349 if (dns_type == 12) {
350 if (!strncmp(compr, "c011", 4))
351 strncat(query, ".local.", 7);
352 else if (!strncmp(compr, "c00c", 4))
353 strncat(query, "._tcp.local.", 12);
354 else if (!strncmp(compr, "c01c", 4))
355 strncat(query, "._udp.local.", 12);
359 serv_tmp->data.bonjour.query = strdup(query + 1);
360 while (*ptr != 0 && strncmp(ptr, "c0", 2)) {
361 len = __ws_hex_to_num(ptr, 2);
363 if (len && len <= 0xff) {
364 temp = (char*) g_try_malloc0(len+2);
367 for (i = 0; i < len; i++) {
368 temp[i+1] = (char) __ws_hex_to_num(ptr, 2);
371 strncat(rdata, temp, len+1);
377 serv_tmp->data.bonjour.rdata = strdup(rdata + 1);
379 WDP_LOGD("Query: %s", serv_tmp->data.bonjour.query);
380 WDP_LOGD("RData: %s", serv_tmp->data.bonjour.rdata);
382 WDP_LOGE("Not supported yet. Only bonjour service supproted [%d]",
392 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
394 static void __ws_path_to_addr(char *peer_path,
395 unsigned char *dev_addr, GVariant *parameter)
397 __WDP_LOG_FUNC_ENTER__;
399 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
400 const char *path = NULL;
403 g_variant_get(parameter, "(&o)", &path);
404 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
405 WDP_LOGD("Retrive Added path [%s]", peer_path);
407 loc = strrchr(peer_path, '/');
409 __ws_mac_compact_to_normal(loc + 1, peer_dev);
411 __ws_txt_to_mac(peer_dev, dev_addr);
412 WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(dev_addr));
414 __WDP_LOG_FUNC_EXIT__;
418 static int __ws_unpack_ay(unsigned char *dst, GVariant *src, int size)
420 GVariantIter *iter = NULL;
424 if (!dst || !src || size == 0) {
425 WDP_LOGE("Invalid parameter");
428 g_variant_get(src, "ay", &iter);
430 WDP_LOGE("failed to get iterator");
434 while (g_variant_iter_loop(iter, "y", &dst[length])) {
439 g_variant_iter_free(iter);
442 WDP_LOGE("array is shorter than size");
449 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
450 static int __parsing_wfd_info(unsigned char *wfd_dev_info,
451 wfd_oem_display_s* display)
453 __WDP_LOG_FUNC_ENTER__;
456 if (!wfd_dev_info || !display) {
457 WDP_LOGE("Invalid parameter");
458 __WDP_LOG_FUNC_EXIT__;
462 wfd_info = (wfd_dev_info[3]<<8 | wfd_dev_info[4]);
464 if (wfd_info & WS_WFD_INFO_PRIMARY_SINK)
465 display->type |= WS_WFD_INFO_PRIMARY_SINK;
466 if (wfd_info & WS_WFD_INFO_SECONDARY_SINK)
467 display->type |= WS_WFD_INFO_SECONDARY_SINK;
469 display->availability = (wfd_info & WS_WFD_INFO_AVAILABILITY) >> 4;
470 display->hdcp_support = (wfd_info & WS_WFD_INFO_HDCP_SUPPORT) >> 8;
472 display->port = (wfd_dev_info[5]<<8 | wfd_dev_info[6]);
473 display->max_tput = (wfd_dev_info[7]<<8 | wfd_dev_info[8]);
475 WDP_LOGD("type [%d],availability [%d],hdcp_support [%d],ctrl_port [%d] "
476 "max_tput[%d]", display->type, display->availability,
477 display->hdcp_support, display->port, display->max_tput);
479 __WDP_LOG_FUNC_EXIT__;
482 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
484 static int _ws_get_local_dev_mac(unsigned char *dev_mac)
486 __WDP_LOG_FUNC_ENTER__;
488 const char *file_path = DEFAULT_MAC_FILE_PATH;
489 char local_mac[OEM_MACSTR_LEN] = {0, };
494 fd = fopen(file_path, "r");
496 WDP_LOGE("Failed to open MAC info file [%s] (%s)", file_path, strerror(errno));
497 __WDP_LOG_FUNC_EXIT__;
502 ptr = fgets((char *)local_mac, WS_MACSTR_LEN, fd);
504 WDP_LOGE("Failed to read file or no data read(%s)", strerror(errno));
506 __WDP_LOG_FUNC_EXIT__;
509 WDP_SECLOGD("Local MAC address [%s]", ptr);
510 WDP_SECLOGD("Local MAC address [%s]", local_mac);
512 res = __ws_txt_to_mac((unsigned char *)local_mac, dev_mac);
514 WDP_LOGE("Failed to convert text to MAC address");
516 __WDP_LOG_FUNC_EXIT__;
520 WDP_LOGD("Local Device MAC address [" MACSECSTR "]", MAC2SECSTR(dev_mac));
523 __WDP_LOG_FUNC_EXIT__;
527 static void _supplicant_signal_cb(GDBusConnection *connection,
528 const gchar *sender, const gchar *object_path, const gchar *interface,
529 const gchar *signal, GVariant *parameters, gpointer user_data)
531 #if defined(TIZEN_DEBUG_DBUS_VALUE)
532 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
533 #endif /* TIZEN_DEBUG_DBUS_VALUE */
536 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
540 if (!g_strcmp0(signal, "InterfaceAdded")) {
541 WDP_LOGD("InterfaceAdded");
543 } else if (!g_strcmp0(signal, "InterfaceRemoved")) {
544 WDP_LOGD("InterfaceRemoved");
545 static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
546 const char *path = NULL;
548 g_variant_get(parameters, "(&o)", &path);
549 g_strlcpy(interface_path, path, DBUS_OBJECT_PATH_MAX);
551 WDP_LOGD("Retrive removed path [%s]", interface_path);
553 if (!g_strcmp0(g_pd->group_iface_path, interface_path)) {
555 WDP_LOGD("p2p group interface removed");
556 memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
558 #if defined(TIZEN_WLAN_CONCURRENT_ENABLE) && defined(TIZEN_MOBILE)
559 else if (!g_strcmp0(g_pd->iface_path, interface_path)) {
561 WDP_LOGD("p2p interface removed");
562 wfd_oem_event_s event;
566 memset(&event, 0x0, sizeof(wfd_oem_event_s));
567 event.event_id = WFD_OEM_EVENT_DEACTIVATED;
568 g_pd->callback(g_pd->user_data, &event);
570 memset(g_pd->iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
572 #endif /* TIZEN_WLAN_CONCURRENT_ENABLE && TIZEN_MOBILE */
573 } else if (!g_strcmp0(signal, "PropertiesChanged")) {
574 WDP_LOGD("PropertiesChanged");
578 static void __ws_get_peer_property(const char *key, GVariant *value, void *user_data)
580 __WDP_LOG_FUNC_ENTER__;
582 wfd_oem_device_s *peer = (wfd_oem_device_s *)user_data;
584 __WDP_LOG_FUNC_EXIT__;
587 #if defined(TIZEN_DEBUG_DBUS_VALUE)
588 CHECK_KEY_VALUE(key, value);
589 #endif /* TIZEN_DEBUG_DBUS_VALUE */
591 if (g_strcmp0(key, "DeviceName") == 0) {
592 const char *name = NULL;
594 g_variant_get(value, "&s", &name);
595 g_strlcpy(peer->dev_name, name, WS_SSID_LEN);
596 WDP_LOGD("Device name [%s]", peer->dev_name);
598 } else if (g_strcmp0(key, "config_method") == 0) {
599 int config_methods = 0;
600 g_variant_get(value, "q", &config_methods);
602 if (config_methods & WS_CONFIG_METHOD_DISPLAY)
603 peer->config_methods |= WFD_OEM_WPS_MODE_DISPLAY;
604 if (config_methods & WS_CONFIG_METHOD_PUSHBUTTON)
605 peer->config_methods |= WFD_OEM_WPS_MODE_PBC;
606 if (config_methods & WS_CONFIG_METHOD_KEYPAD)
607 peer->config_methods |= WFD_OEM_WPS_MODE_KEYPAD;
608 WDP_LOGD("Config method [0x%x]", peer->config_methods);
610 } else if (g_strcmp0(key, "level") == 0) {
612 } else if (g_strcmp0(key, "devicecapability") == 0) {
613 unsigned char devicecapability = 0;
615 g_variant_get(value, "y", &devicecapability);
616 peer->dev_flags = (int)devicecapability;
617 WDP_LOGD("Device Capa [0x%02x]", peer->dev_flags);
619 } else if (g_strcmp0(key, "groupcapability") == 0) {
620 unsigned char groupcapability = 0;
622 g_variant_get(value, "y", &groupcapability);
623 WDP_LOGD("Group Capa [0x%02x]", groupcapability);
624 if (groupcapability & WS_GROUP_CAP_GROUP_OWNER) {
625 peer->group_flags = WFD_OEM_GROUP_FLAG_GROUP_OWNER;
626 peer->dev_role = WFD_OEM_DEV_ROLE_GO;
628 if (groupcapability & WS_GROUP_CAP_PERSISTENT_GROUP)
629 peer->group_flags = WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
631 } else if (g_strcmp0(key, "PrimaryDeviceType") == 0) {
632 unsigned char primarydevicetype[WS_DEVTYPE_LEN] = {0,};
634 if (__ws_unpack_ay(primarydevicetype, value, WS_DEVTYPE_LEN)) {
635 peer->pri_dev_type = primarydevicetype[1];
636 peer->sec_dev_type = primarydevicetype[WS_DEVTYPE_LEN -1];
638 } else if (g_strcmp0(key, "SecondaryDeviceTypes") == 0) {
639 } else if (g_strcmp0(key, "VendorExtension") == 0) {
640 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
641 } else if (g_strcmp0(key, "IEs") == 0) {
642 unsigned char ies[WFD_SUBELEM_LEN_DEV_INFO + 3] = {0,};
644 if (__ws_unpack_ay(ies, value, WFD_SUBELEM_LEN_DEV_INFO + 3))
645 __parsing_wfd_info(ies, &(peer->display));
646 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
647 } else if (g_strcmp0(key, "DeviceAddress") == 0) {
649 if (__ws_unpack_ay(peer->dev_addr, value, WS_MACADDR_LEN))
650 WDP_LOGD("Device address [" MACSTR "]", MAC2STR(peer->dev_addr));
652 } else if (g_strcmp0(key, "InterfaceAddress") == 0) {
654 if (__ws_unpack_ay(peer->intf_addr, value, WS_MACADDR_LEN))
655 WDP_LOGD("Interface address [" MACSTR "]", MAC2STR(peer->intf_addr));
657 } else if (g_strcmp0(key, "GODeviceAddress") == 0) {
659 if (__ws_unpack_ay(peer->go_dev_addr, value, WS_MACADDR_LEN))
660 WDP_LOGD("GODevice address [" MACSTR "]", MAC2STR(peer->go_dev_addr));
662 if (!ISZEROMACADDR(peer->go_dev_addr))
663 peer->dev_role = WFD_OEM_DEV_ROLE_GC;
665 WDP_LOGD("Unknown value");
667 __WDP_LOG_FUNC_EXIT__;
671 static void __ws_peer_property(const char *key, GVariant *value, void *user_data)
673 __WDP_LOG_FUNC_ENTER__;
675 __WDP_LOG_FUNC_EXIT__;
679 wfd_oem_dev_data_s *peer = (wfd_oem_dev_data_s *)user_data;
680 #if defined(TIZEN_DEBUG_DBUS_VALUE)
681 CHECK_KEY_VALUE(key, value);
682 #endif /* TIZEN_DEBUG_DBUS_VALUE */
683 if (g_strcmp0(key, "DeviceName") == 0) {
684 const char *name = NULL;
686 g_variant_get(value, "&s", &name);
687 g_strlcpy(peer->name, name, WS_SSID_LEN);
688 WDP_LOGD("Device Name [%s]", peer->name);
690 } else if (g_strcmp0(key, "config_method") == 0) {
691 int config_methods = 0;
693 g_variant_get(value, "q", &config_methods);
695 if (config_methods & WS_CONFIG_METHOD_DISPLAY)
696 peer->config_methods |= WFD_OEM_WPS_MODE_DISPLAY;
697 if (config_methods & WS_CONFIG_METHOD_PUSHBUTTON)
698 peer->config_methods |= WFD_OEM_WPS_MODE_PBC;
699 if (config_methods & WS_CONFIG_METHOD_KEYPAD)
700 peer->config_methods |= WFD_OEM_WPS_MODE_KEYPAD;
701 WDP_LOGD("Config method [0x%x]", peer->config_methods);
703 } else if (g_strcmp0(key, "level") == 0) {
705 } else if (g_strcmp0(key, "devicecapability") == 0) {
706 unsigned char devicecapability = 0;
708 g_variant_get(value, "y", &devicecapability);
709 peer->dev_flags = (int)devicecapability;
710 WDP_LOGD("Device Capa [0x%02x]", peer->dev_flags);
712 } else if (g_strcmp0(key, "groupcapability") == 0) {
713 unsigned char groupcapability = 0;
715 g_variant_get(value, "y", &groupcapability);
716 WDP_LOGD("Group Capa [0x%02x]", groupcapability);
717 if (groupcapability & WS_GROUP_CAP_GROUP_OWNER) {
718 peer->group_flags = WFD_OEM_GROUP_FLAG_GROUP_OWNER;
719 peer->dev_role = WFD_OEM_DEV_ROLE_GO;
721 if (groupcapability & WS_GROUP_CAP_PERSISTENT_GROUP)
722 peer->group_flags = WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
724 } else if (g_strcmp0(key, "PrimaryDeviceType") == 0) {
725 unsigned char primarydevicetype[WS_DEVTYPE_LEN] = {0,};
727 if (__ws_unpack_ay(primarydevicetype, value, WS_DEVTYPE_LEN)) {
728 peer->pri_dev_type = primarydevicetype[1];
729 peer->sec_dev_type = primarydevicetype[WS_DEVTYPE_LEN -1];
731 } else if (g_strcmp0(key, "SecondaryDeviceTypes") == 0) {
732 } else if (g_strcmp0(key, "VendorExtension") == 0) {
733 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
734 } else if (g_strcmp0(key, "IEs") == 0) {
735 unsigned char ies[WFD_SUBELEM_LEN_DEV_INFO + 3] = {0,};
737 if (__ws_unpack_ay(ies, value, WFD_SUBELEM_LEN_DEV_INFO + 3))
738 __parsing_wfd_info(ies, &(peer->display));
739 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
740 } else if (g_strcmp0(key, "DeviceAddress") == 0) {
742 if (__ws_unpack_ay(peer->p2p_dev_addr, value, WS_MACADDR_LEN))
743 WDP_LOGD("Device address [" MACSTR "]", MAC2STR(peer->p2p_dev_addr));
745 } else if (g_strcmp0(key, "InterfaceAddress") == 0) {
747 if (__ws_unpack_ay(peer->p2p_intf_addr, value, WS_MACADDR_LEN))
748 WDP_LOGD("Interface Address [" MACSTR "]", MAC2STR(peer->p2p_intf_addr));
750 } else if (g_strcmp0(key, "GODeviceAddress") == 0) {
752 unsigned char go_dev_addr[OEM_MACADDR_LEN] = {0,};
753 if (__ws_unpack_ay(go_dev_addr, value, WS_MACADDR_LEN))
754 WDP_LOGD("[" MACSTR "]", MAC2STR(go_dev_addr));
756 if (!ISZEROMACADDR(go_dev_addr))
757 peer->dev_role = WFD_OEM_DEV_ROLE_GC;
758 #if defined(TIZEN_FEATURE_ASP)
759 } else if (g_strcmp0(key, "AdvertiseService") == 0) {
760 WDP_LOGD("size [%d]", g_variant_get_size(value));
761 if (g_variant_get_size(value) != 0)
762 peer->has_asp_services = 1;
764 peer->has_asp_services = 0;
766 #endif /* TIZEN_FEATURE_ASP */
768 WDP_LOGD("Unknown value");
770 __WDP_LOG_FUNC_EXIT__;
774 void __ws_interface_property(const char *key, GVariant *value, void *user_data)
776 __WDP_LOG_FUNC_ENTER__;
777 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
780 #if defined(TIZEN_DEBUG_DBUS_VALUE)
781 CHECK_KEY_VALUE(key, value);
782 #endif /* TIZEN_DEBUG_DBUS_VALUE */
783 if (g_strcmp0(key, "Ifname") == 0) {
784 const char *ifname = NULL;
786 g_variant_get(value, "&s", &ifname);
787 g_strlcpy(event->ifname, ifname, OEM_IFACE_NAME_LEN+1);
788 WDP_LOGD("Ifname [%s]", event->ifname);
791 __WDP_LOG_FUNC_EXIT__;
795 void __ws_group_property(const char *key, GVariant *value, void *user_data)
797 __WDP_LOG_FUNC_ENTER__;
798 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
799 if (!event || !event->edata)
802 wfd_oem_group_data_s *group = (wfd_oem_group_data_s *)event->edata;
803 #if defined(TIZEN_DEBUG_DBUS_VALUE)
804 CHECK_KEY_VALUE(key, value);
805 #endif /* TIZEN_DEBUG_DBUS_VALUE */
806 if (g_strcmp0(key, "Role") == 0) {
807 const char *role = NULL;
809 g_variant_get(value, "&s", &role);
810 WDP_LOGD("Role [%s]", role);
812 if (!strncmp(role, "GO", 2))
813 event->dev_role = WFD_OEM_DEV_ROLE_GO;
814 else if (!strncmp(role, "client", 6))
815 event->dev_role = WFD_OEM_DEV_ROLE_GC;
817 } else if (g_strcmp0(key, "Frequency") == 0) {
820 g_variant_get(value, "q", &frequency);
821 group->freq = (int)frequency;
823 } else if (g_strcmp0(key, "Passphrase") == 0) {
824 const char *passphrase = NULL;
826 g_variant_get(value, "&s", &passphrase);
827 g_strlcpy(group->pass, passphrase, OEM_PASS_PHRASE_LEN+1);
828 WDP_LOGD("passphrase [%s]", group->pass);
830 } else if (g_strcmp0(key, "Group") == 0) {
832 } else if (g_strcmp0(key, "SSID") == 0) {
833 unsigned char ssid[WS_SSID_LEN +1] = {0,};
835 __ws_unpack_ay(ssid, value, WS_SSID_LEN);
836 memcpy(group->ssid, ssid, WS_SSID_LEN+1);
837 WDP_LOGD("ssid [%s]", group->ssid);
839 } else if (g_strcmp0(key, "BSSID") == 0) {
841 if (__ws_unpack_ay(group->go_dev_addr, value, WS_MACADDR_LEN))
842 WDP_LOGD("[" MACSTR "]", MAC2STR(group->go_dev_addr));
845 WDP_LOGD("Unknown value");
847 __WDP_LOG_FUNC_EXIT__;
851 void __ws_extract_invitation_details(const char *key, GVariant *value, void *user_data)
853 __WDP_LOG_FUNC_ENTER__;
854 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
855 if (!event || !event->edata)
858 wfd_oem_invite_data_s *invitation = (wfd_oem_invite_data_s *)event->edata;
859 #if defined(TIZEN_DEBUG_DBUS_VALUE)
860 CHECK_KEY_VALUE(key, value);
861 #endif /* TIZEN_DEBUG_DBUS_VALUE */
862 if (g_strcmp0(key, "sa") == 0) {
863 if (__ws_unpack_ay(invitation->sa, value, WS_MACADDR_LEN))
864 WDP_LOGD("SA [" MACSTR "]", MAC2STR(invitation->sa));
866 } else if (g_strcmp0(key, "go_dev_addr") == 0) {
867 if (__ws_unpack_ay(invitation->go_dev_addr, value, WS_MACADDR_LEN))
868 WDP_LOGD("GO device address [" MACSTR "]", MAC2STR(invitation->go_dev_addr));
870 } else if (g_strcmp0(key, "bssid") == 0) {
871 if (__ws_unpack_ay(invitation->bssid, value, WS_MACADDR_LEN))
872 WDP_LOGD("BSSID [" MACSTR "]", MAC2STR(invitation->bssid));
874 } else if (g_strcmp0(key, "persistent_id") == 0) {
875 g_variant_get(value, "i", &(invitation->persistent_id));
876 WDP_LOGD("persistent id [%d]", invitation->persistent_id);
878 } else if (g_strcmp0(key, "op_freq") == 0) {
879 g_variant_get(value, "i", &(invitation->oper_freq));
880 WDP_LOGD("op freq [%d]", invitation->oper_freq);
882 WDP_LOGD("Unknown value");
884 __WDP_LOG_FUNC_EXIT__;
888 void __ws_extract_group_details(const char *key, GVariant *value, void *user_data)
890 __WDP_LOG_FUNC_ENTER__;
891 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
892 if (!event || !event->edata)
896 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
900 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
901 wfd_oem_group_data_s *group = (wfd_oem_group_data_s *)event->edata;
902 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
903 #if defined(TIZEN_DEBUG_DBUS_VALUE)
904 CHECK_KEY_VALUE(key, value);
905 #endif /* TIZEN_DEBUG_DBUS_VALUE */
906 if (g_strcmp0(key, "interface_object") == 0) {
907 static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
908 const char *i_path = NULL;
910 g_variant_get(value, "&o", &i_path);
911 g_strlcpy(interface_path, i_path, DBUS_OBJECT_PATH_MAX);
912 WDP_LOGD("Retrive Added path [%s]", interface_path);
913 g_strlcpy(g_pd->group_iface_path, interface_path, DBUS_OBJECT_PATH_MAX);
914 dbus_property_get_all(interface_path, g_pd->g_dbus,
915 SUPPLICANT_IFACE, __ws_interface_property, event);
917 } else if (g_strcmp0(key, "role") == 0) {
918 const char *role = NULL;
920 g_variant_get(value, "&s", &role);
921 WDP_LOGD("Role [%s]", role);
923 if (!strncmp(role, "GO", 2))
924 event->dev_role = WFD_OEM_DEV_ROLE_GO;
925 else if (!strncmp(role, "client", 6))
926 event->dev_role = WFD_OEM_DEV_ROLE_GC;
927 } else if (g_strcmp0(key, "persistent") == 0) {
928 g_variant_get(value, "b", &group->is_persistent);
929 WDP_LOGD("Is Persistent : [%s]", group->is_persistent ? "YES" : "NO");
931 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
932 } else if (g_strcmp0(key, "IpAddr") == 0) {
934 if (__ws_unpack_ay(group->ip_addr, value, OEM_IPADDR_LEN))
935 WDP_LOGD("IP address [" IPSTR "]", IP2STR(group->ip_addr));
937 } else if (g_strcmp0(key, "IpAddrMask") == 0) {
939 if (__ws_unpack_ay(group->ip_addr_mask, value, OEM_IPADDR_LEN))
940 WDP_LOGD("IP mask [" IPSTR "]", IP2STR(group->ip_addr_mask));
942 } else if (g_strcmp0(key, "IpAddrGo") == 0) {
944 if (__ws_unpack_ay(group->ip_addr_go, value, OEM_IPADDR_LEN))
945 WDP_LOGD("GO IP address [" IPSTR "]", IP2STR(group->ip_addr_go));
946 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
947 } else if (g_strcmp0(key, "group_object") == 0) {
948 static char group_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
951 g_variant_get(value, "&o", &g_path);
952 g_strlcpy(group_path, g_path, DBUS_OBJECT_PATH_MAX);
953 WDP_LOGD("Retrive group path [%s]", group_path);
954 dbus_property_get_all(group_path, g_pd->g_dbus, SUPPLICANT_P2P_GROUP,
955 __ws_group_property, event);
958 g_dbus_connection_signal_subscribe(
960 SUPPLICANT_SERVICE, /* bus name */
961 SUPPLICANT_P2P_GROUP, /* interface */
963 group_path, /* object path */
965 G_DBUS_SIGNAL_FLAGS_NONE,
969 __WDP_LOG_FUNC_EXIT__;
973 void __ws_extract_gonegfailaure_details(const char *key, GVariant *value, void *user_data)
975 __WDP_LOG_FUNC_ENTER__;
976 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
977 if (!event || !event->edata)
980 wfd_oem_conn_data_s *conn = (wfd_oem_conn_data_s *)event->edata;
981 #if defined(TIZEN_DEBUG_DBUS_VALUE)
982 CHECK_KEY_VALUE(key, value);
983 #endif /* TIZEN_DEBUG_DBUS_VALUE */
984 if (g_strcmp0(key, "peer_object") == 0) {
985 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
988 g_variant_get(value, "&o", &path);
989 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
990 WDP_LOGD("Retrive peer path [%s]", peer_path);
992 } else if (g_strcmp0(key, "status") == 0) {
995 g_variant_get(value, "i", &status);
996 WDP_LOGD("Retrive status [%d]", status);
997 conn->status = status;
999 __WDP_LOG_FUNC_EXIT__;
1003 void __ws_extract_gonegsuccess_details(const char *key, GVariant *value, void *user_data)
1005 __WDP_LOG_FUNC_ENTER__;
1006 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1007 if (!event || !event->edata)
1010 wfd_oem_conn_data_s *edata = (wfd_oem_conn_data_s *)event->edata;
1011 #if defined(TIZEN_DEBUG_DBUS_VALUE)
1012 CHECK_KEY_VALUE(key, value);
1013 #endif /* TIZEN_DEBUG_DBUS_VALUE */
1014 if (g_strcmp0(key, "peer_object") == 0) {
1016 } else if (g_strcmp0(key, "status") == 0) {
1018 } else if (g_strcmp0(key, "passphrase") == 0) {
1020 } else if (g_strcmp0(key, "role_go") == 0) {
1021 /* local device role */
1022 const char *role = NULL;
1024 g_variant_get(value, "&s", &role);
1025 if (!strncmp(role, "GO", 2))
1026 event->dev_role = WFD_OEM_DEV_ROLE_GO;
1027 else if (!strncmp(role, "client", 6))
1028 event->dev_role = WFD_OEM_DEV_ROLE_GC;
1030 } else if (g_strcmp0(key, "ssid") == 0) {
1031 unsigned char ssid[WS_SSID_LEN +1] = {0,};
1033 __ws_unpack_ay(ssid, value, WS_SSID_LEN);
1034 memcpy(edata->ssid, ssid, WS_SSID_LEN+1);
1035 WDP_LOGD("ssid [%s]", edata->ssid);
1037 } else if (g_strcmp0(key, "peer_device_addr") == 0) {
1039 if (__ws_unpack_ay(edata->peer_device_addr, value, WS_MACADDR_LEN))
1040 WDP_LOGD("Device address[" MACSTR "]", MAC2STR(edata->peer_device_addr));
1042 } else if (g_strcmp0(key, "peer_interface_addr") == 0) {
1044 if (__ws_unpack_ay(edata->peer_intf_addr, value, WS_MACADDR_LEN))
1045 WDP_LOGD("Interface address [" MACSTR "]", MAC2STR(edata->peer_intf_addr));
1047 } else if (g_strcmp0(key, "wps_method") == 0) {
1049 } else if (g_strcmp0(key, "frequency_list") == 0) {
1051 } else if (g_strcmp0(key, "persistent_group") == 0) {
1053 g_variant_get(value, "i", &(edata->persistent_group));
1054 WDP_LOGD("persistent_group [%d]", edata->persistent_group);
1056 } else if (g_strcmp0(key, "peer_config_timeout") == 0) {
1059 __WDP_LOG_FUNC_EXIT__;
1063 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1064 void __ws_extract_peer_service(wfd_oem_event_s *data, unsigned char *service_hex, int tlvs_len)
1066 GList *services = NULL;
1067 wfd_oem_new_service_s *new_service = NULL;
1068 char *segment = NULL;
1074 while (ptr + 2 < WS_MAX_SERVICE_LEN &&
1075 (length = (service_hex[ptr+1]*256) + service_hex[ptr]) > 0) {
1076 segment = (char*) g_try_malloc0(length*2+1);
1078 __ws_byte_to_hex(segment, length * 2 + 1, &service_hex[ptr + 3], length);
1079 res = __ws_segment_to_service(segment, &new_service);
1081 WDP_LOGE("Failed to convert segment as service instance");
1086 services = g_list_append(services, new_service);
1092 data->edata_type = WFD_OEM_EDATA_TYPE_NEW_SERVICE;
1093 data->dev_role = count;
1094 data->edata = (void*) services;
1098 void __ws_extract_servicediscoveryresponse_details(const char *key, GVariant *value, void *user_data)
1100 __WDP_LOG_FUNC_ENTER__;
1101 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1105 #if defined(TIZEN_DEBUG_DBUS_VALUE)
1106 CHECK_KEY_VALUE(key, value);
1107 #endif /* TIZEN_DEBUG_DBUS_VALUE */
1108 if (g_strcmp0(key, "peer_object") == 0) {
1109 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1110 const char *path = NULL;
1113 g_variant_get(value, "&o", &path);
1117 WDP_LOGD("Retrive Added path [%s]", path);
1118 loc = strrchr(path, '/');
1120 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1121 __ws_txt_to_mac(peer_dev, event->dev_addr);
1123 } else if (g_strcmp0(key, "update_indicator")) {
1125 } else if (g_strcmp0(key, "tlvs")) {
1126 GVariantIter *iter = NULL;
1127 unsigned char service_hex[WS_MAX_SERVICE_LEN];
1128 int byte_length = 0;
1130 g_variant_get(value, "ay", &iter);
1132 WDP_LOGE("failed to get iterator");
1136 memset(service_hex, 0x0, WS_MAX_SERVICE_LEN);
1137 while (g_variant_iter_loop(iter, "y", &service_hex[byte_length]))
1139 g_variant_iter_free(iter);
1141 __ws_extract_peer_service(event, service_hex, byte_length);
1144 __WDP_LOG_FUNC_EXIT__;
1146 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1148 #if defined(TIZEN_FEATURE_ASP)
1149 static void __ws_extract_serviceaspresponse_details(const char *key, GVariant *value, void *user_data)
1151 __WDP_LOG_FUNC_ENTER__;
1152 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1153 if (!event || !event->edata)
1156 wfd_oem_asp_service_s *service = (wfd_oem_asp_service_s *)event->edata;
1158 if (g_strcmp0(key, "peer_object") == 0) {
1159 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1160 const char *path = NULL;
1163 g_variant_get(value, "o", &path);
1167 WDP_LOGD("Retrive Added path [%s]", path);
1168 loc = strrchr(path, '/');
1170 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1171 __ws_txt_to_mac(peer_dev, event->dev_addr);
1173 } else if (g_strcmp0(key, "srv_trans_id") == 0) {
1174 unsigned int srv_trans_id = 0;
1175 g_variant_get(value, "u", &srv_trans_id);
1176 service->tran_id = srv_trans_id;
1177 WDP_LOGD("Retrive srv_trans_id [%x]", service->tran_id);
1179 } else if (g_strcmp0(key, "adv_id") == 0) {
1180 unsigned int adv_id = 0;
1181 g_variant_get(value, "u", &adv_id);
1182 service->adv_id = adv_id;
1183 WDP_LOGD("Retrive adv_id [%x]", service->adv_id);
1185 } else if (g_strcmp0(key, "svc_status") == 0) {
1186 unsigned char svc_status = 0;
1187 g_variant_get(value, "u", &svc_status);
1188 service->status = svc_status;
1189 WDP_LOGD("Retrive svc_status [%x]", service->status);
1191 } else if (g_strcmp0(key, "config_methods") == 0) {
1192 unsigned int config_methods = 0;
1193 g_variant_get(value, "q", &config_methods);
1194 service->config_method = config_methods;
1195 WDP_LOGD("Retrive config_methods [%x]", service->config_method);
1197 } else if (g_strcmp0(key, "svc_str") == 0) {
1198 const char *svc_str = NULL;
1199 g_variant_get(value, "s", &svc_str);
1200 if (svc_str != NULL)
1201 service->service_type = g_strdup(svc_str);
1202 WDP_LOGD("Retrive srv_name [%s]", service->service_type);
1204 } else if (g_strcmp0(key, "info") == 0) {
1205 const char *info = NULL;
1206 g_variant_get(value, "s", &info);
1208 service->service_info = g_strdup(info);
1209 WDP_LOGD("Retrive srv_info [%s]", service->service_info);
1211 __WDP_LOG_FUNC_EXIT__;
1214 static void __ws_extract_asp_provision_start_details(const char *key, GVariant *value, void *user_data)
1216 __WDP_LOG_FUNC_ENTER__;
1217 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1218 wfd_oem_asp_prov_s *asp_params = NULL;
1219 if (!event || !event->edata) {
1220 __WDP_LOG_FUNC_EXIT__;
1224 asp_params = (wfd_oem_asp_prov_s *)event->edata;
1226 if (g_strcmp0(key, "peer_object") == 0) {
1227 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1228 const char *path = NULL;
1231 g_variant_get(value, "&o", &path);
1233 __WDP_LOG_FUNC_EXIT__;
1237 WDP_LOGD("Retrive Added path [%s]", path);
1238 loc = strrchr(path, '/');
1240 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1241 __ws_txt_to_mac(peer_dev, event->dev_addr);
1243 } else if (g_strcmp0(key, "adv_id") == 0) {
1244 g_variant_get(value, "u", &asp_params->adv_id);
1245 WDP_LOGD("Retrive adv_id [%u]", asp_params->adv_id);
1247 } else if (g_strcmp0(key, "ses_id") == 0) {
1248 g_variant_get(value, "u", &asp_params->session_id);
1249 WDP_LOGD("Retrive session id [%u]", asp_params->session_id);
1251 } else if (g_strcmp0(key, "dev_passwd_id") == 0) {
1252 g_variant_get(value, "i", &event->wps_mode);
1253 WDP_LOGD("Retrive dev_passwd_id [%d]", event->wps_mode);
1255 } else if (g_strcmp0(key, "conncap") == 0) {
1256 g_variant_get(value, "u", &asp_params->network_role);
1257 WDP_LOGD("Retrive conncap [%x]", asp_params->network_role);
1259 } else if (g_strcmp0(key, "adv_mac") == 0) {
1260 if (__ws_unpack_ay(asp_params->service_mac, value, WS_MACADDR_LEN))
1261 WDP_LOGD("Adv address[" MACSTR "]", MAC2STR(asp_params->service_mac));
1263 } else if (g_strcmp0(key, "ses_mac") == 0) {
1264 if (__ws_unpack_ay(asp_params->session_mac, value, WS_MACADDR_LEN))
1265 WDP_LOGD("session address[" MACSTR "]", MAC2STR(asp_params->session_mac));
1267 } else if (g_strcmp0(key, "session_info") == 0) {
1268 const char *session_info = NULL;
1269 g_variant_get(value, "&s", &session_info);
1270 if (session_info != NULL)
1271 asp_params->session_information = g_strdup(session_info);
1272 WDP_LOGD("Retrive session_info [%s]", asp_params->session_information);
1274 __WDP_LOG_FUNC_EXIT__;
1277 static void __ws_extract_asp_provision_done_details(const char *key, GVariant *value, void *user_data)
1279 __WDP_LOG_FUNC_ENTER__;
1280 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1281 wfd_oem_asp_prov_s *asp_params = NULL;
1282 if (!event || !event->edata) {
1283 __WDP_LOG_FUNC_EXIT__;
1287 asp_params = (wfd_oem_asp_prov_s *)event->edata;
1290 if (g_strcmp0(key, "peer_object") == 0) {
1291 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1292 const char *path = NULL;
1295 g_variant_get(value, "&o", &path);
1297 __WDP_LOG_FUNC_EXIT__;
1301 WDP_LOGD("Retrive Added path [%s]", path);
1302 loc = strrchr(path, '/');
1304 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1305 __ws_txt_to_mac(peer_dev, event->dev_addr);
1307 WDP_LOGD("peer address[" MACSTR "]", MAC2STR(event->dev_addr));
1309 } else if (g_strcmp0(key, "adv_id") == 0) {
1310 g_variant_get(value, "u", &asp_params->adv_id);
1311 WDP_LOGD("Retrive adv_id [%u]", asp_params->adv_id);
1313 } else if (g_strcmp0(key, "ses_id") == 0) {
1314 g_variant_get(value, "u", &asp_params->session_id);
1315 WDP_LOGD("Retrive session id [%u]", asp_params->session_id);
1317 } else if (g_strcmp0(key, "dev_passwd_id") == 0) {
1318 g_variant_get(value, "i", &event->wps_mode);
1319 WDP_LOGD("Retrive dev_passwd_id [%d]", event->wps_mode);
1321 } else if (g_strcmp0(key, "conncap") == 0) {
1322 g_variant_get(value, "u", &asp_params->network_role);
1323 WDP_LOGD("Retrive network role [%x]", asp_params->network_role);
1325 } else if (g_strcmp0(key, "status") == 0) {
1326 g_variant_get(value, "u", &asp_params->status);
1327 WDP_LOGD("Retrive status [%x]", asp_params->status);
1329 } else if (g_strcmp0(key, "persist") == 0) {
1330 g_variant_get(value, "u", &asp_params->persistent_group_id);
1331 asp_params->persist = 1;
1332 WDP_LOGD("Retrive persist [%u]", asp_params->persistent_group_id);
1334 } else if (g_strcmp0(key, "adv_mac") == 0) {
1335 if (__ws_unpack_ay(asp_params->service_mac, value, WS_MACADDR_LEN))
1336 WDP_LOGD("Adv address[" MACSTR "]", MAC2STR(asp_params->service_mac));
1338 } else if (g_strcmp0(key, "ses_mac") == 0) {
1339 if (__ws_unpack_ay(asp_params->session_mac, value, WS_MACADDR_LEN))
1340 WDP_LOGD("session address[" MACSTR "]", MAC2STR(asp_params->session_mac));
1342 } else if (g_strcmp0(key, "group_mac") == 0) {
1343 if (__ws_unpack_ay(asp_params->group_mac, value, WS_MACADDR_LEN))
1344 WDP_LOGD("group address[" MACSTR "]", MAC2STR(asp_params->group_mac));
1346 __WDP_LOG_FUNC_EXIT__;
1349 static void __ws_extract_provision_fail_details(const char *key, GVariant *value, void *user_data)
1351 __WDP_LOG_FUNC_ENTER__;
1352 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1353 wfd_oem_asp_prov_s *asp_params = NULL;
1354 if (!event || !event->edata) {
1355 __WDP_LOG_FUNC_EXIT__;
1359 asp_params = (wfd_oem_asp_prov_s *)event->edata;
1361 if (g_strcmp0(key, "peer_object") == 0) {
1362 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1363 const char *path = NULL;
1366 g_variant_get(value, "&o", &path);
1368 __WDP_LOG_FUNC_EXIT__;
1372 WDP_LOGD("Retrive Added path [%s]", path);
1373 loc = strrchr(path, '/');
1375 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1376 __ws_txt_to_mac(peer_dev, event->dev_addr);
1378 } else if (g_strcmp0(key, "adv_id") == 0) {
1379 g_variant_get(value, "u", &asp_params->adv_id);
1380 WDP_LOGD("Retrive adv_id [%d]", asp_params->adv_id);
1382 } else if (g_strcmp0(key, "status") == 0) {
1383 g_variant_get(value, "i", &asp_params->status);
1384 WDP_LOGD("Retrive status [%d]", asp_params->status);
1386 } else if (g_strcmp0(key, "deferred_session_resp") == 0) {
1387 const char *session_info = NULL;
1388 g_variant_get(value, "&s", &session_info);
1389 if (session_info != NULL)
1390 asp_params->session_information = g_strdup(session_info);
1391 WDP_LOGD("Retrive deferred_session_resp [%s]", asp_params->session_information);
1393 __WDP_LOG_FUNC_EXIT__;
1395 #endif /* TIZEN_FEATURE_ASP */
1397 static int _ws_flush()
1399 __WDP_LOG_FUNC_ENTER__;
1400 GDBusConnection *g_dbus = NULL;
1401 dbus_method_param_s params;
1405 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
1406 __WDP_LOG_FUNC_EXIT__;
1410 g_dbus = g_pd->g_dbus;
1412 WDP_LOGE("DBus connection is NULL");
1413 __WDP_LOG_FUNC_EXIT__;
1416 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
1418 dbus_set_method_param(¶ms, "Flush", g_pd->iface_path, g_dbus);
1419 params.params = NULL;
1421 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
1423 WDP_LOGE("Failed to send command to wpa_supplicant");
1425 WDP_LOGD("Succeeded to flush");
1427 __WDP_LOG_FUNC_EXIT__;
1431 static int _ws_cancel()
1433 __WDP_LOG_FUNC_ENTER__;
1434 GDBusConnection *g_dbus = NULL;
1435 dbus_method_param_s params;
1439 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
1444 g_dbus = g_pd->g_dbus;
1446 WDP_LOGE("DBus connection is NULL");
1449 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
1451 dbus_set_method_param(¶ms, "Cancel", g_pd->iface_path , g_dbus);
1452 params.params = NULL;
1454 res = dbus_method_call(¶ms, SUPPLICANT_WPS, NULL, NULL);
1456 WDP_LOGE("Failed to send command to wpa_supplicant");
1458 WDP_LOGD("Succeeded to cancel");
1460 __WDP_LOG_FUNC_EXIT__;
1464 #if defined(TIZEN_FEATURE_ASP)
1465 int ws_get_advertise_service(const char *peer_path, GList **asp_services)
1467 __WDP_LOG_FUNC_ENTER__;
1468 GDBusConnection *g_dbus = NULL;
1469 GVariant *param = NULL;
1470 GVariant *reply = NULL;
1471 GVariant *temp = NULL;
1472 GError *error = NULL;
1473 GVariantIter *iter = NULL;
1474 wfd_oem_advertise_service_s *service;
1475 wfd_oem_asp_service_s *seek = NULL;
1476 unsigned char desc[7];
1477 unsigned int adv_id;
1478 unsigned int config_method;
1479 unsigned char length;
1485 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
1489 g_dbus = g_pd->g_dbus;
1491 WDP_LOGE("DBus connection is NULL");
1495 param = g_variant_new("(ss)", SUPPLICANT_P2P_PEER, "AdvertiseService");
1496 #if defined(TIZEN_DEBUG_DBUS_VALUE)
1497 DEBUG_PARAMS(param);
1498 #endif /* TIZEN_DEBUG_DBUS_VALUE */
1500 reply = g_dbus_connection_call_sync(
1502 SUPPLICANT_SERVICE, /* bus name */
1503 peer_path, /* object path */
1504 DBUS_PROPERTIES_INTERFACE, /* interface name */
1505 DBUS_PROPERTIES_METHOD_GET, /* method name */
1506 param, /* GVariant *params */
1507 NULL, /* reply_type */
1508 G_DBUS_CALL_FLAGS_NONE, /* flags */
1509 SUPPLICANT_TIMEOUT , /* timeout */
1510 NULL, /* cancellable */
1511 &error); /* error */
1513 if (error != NULL) {
1514 WDP_LOGE("Error! Failed to get peer advertise service: [%s]",
1516 g_error_free(error);
1518 g_variant_unref(reply);
1519 __WDP_LOG_FUNC_EXIT__;
1523 if (reply != NULL) {
1525 #if defined(TIZEN_DEBUG_DBUS_VALUE)
1526 DEBUG_PARAMS(reply);
1527 #endif /* TIZEN_DEBUG_DBUS_VALUE */
1529 /* replay will have the format <(<ay>,)>
1530 * So, you need to remove tuple out side of variant and
1531 * variant out side of byte array
1533 temp = g_variant_get_child_value(reply, 0);
1534 temp = g_variant_get_child_value(temp, 0);
1535 g_variant_get(temp, "ay", &iter);
1537 g_variant_unref(reply);
1538 WDP_LOGE("Failed to get iterator");
1543 /* 4byte advertisement ID, 2 byte config method, 1byte length */
1546 memset(desc, 0x0, 7);
1547 while (cnt < 7 && g_variant_iter_loop(iter, "y", &desc[cnt]))
1550 if (cnt != 7 || desc[6] == 0) {
1551 WDP_LOGE("Invalid descriptor header length cnt [%d]", cnt);
1552 g_variant_unref(reply);
1556 adv_id = desc[3] << 24 | desc[2] << 16 | desc[1] << 8 | desc[0];
1557 config_method = desc[4] << 8 | desc[4];
1560 value = g_try_malloc0(length + 1);
1561 if (value == NULL) {
1562 WDP_LOGE("g_try_malloc0 failed");
1563 g_variant_unref(reply);
1566 WDP_LOGD("adv_id[%u] config_method[%u] length[%hhu]", adv_id, config_method, length);
1569 while (cnt < length && g_variant_iter_loop(iter, "y", &value[cnt]))
1572 if (cnt != length) {
1573 WDP_LOGE("Length doesn't matched with header value cnt [%d]", cnt);
1574 g_variant_unref(reply);
1580 service = (wfd_oem_advertise_service_s *)
1581 g_try_malloc0(sizeof(wfd_oem_advertise_service_s));
1582 if (service == NULL) {
1583 WDP_LOGE("g_try_malloc0 failed");
1584 g_variant_unref(reply);
1588 service->adv_id = adv_id;
1589 service->config_method = config_method;
1590 service->service_type_length = length;
1591 service->service_type = value;
1593 GLIST_ITER_START(seek_list, seek)
1594 if (g_strcmp0(seek->service_type, service->service_type) == 0) {
1595 WDP_LOGD("service type matched [%s] search_id [%llu]",
1596 service->service_type, seek->search_id);
1601 if (seek != NULL && seek->service_info != NULL) {
1602 WDP_LOGD("service info exists, service discovery will be performed");
1604 WDP_LOGD("service info doesn't exists. Add service to list");
1605 service->search_id = seek->search_id;
1606 *asp_services = g_list_append(*asp_services, service);
1609 g_variant_unref(reply);
1611 __WDP_LOG_FUNC_EXIT__;
1614 #endif /* TIZEN_FEATURE_ASP */
1616 static void _ws_process_device_found(GDBusConnection *connection,
1617 const gchar *object_path, GVariant *parameters)
1619 __WDP_LOG_FUNC_ENTER__;
1620 wfd_oem_event_s event;
1621 wfd_oem_dev_data_s *edata = NULL;
1622 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1624 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
1626 WDP_LOGF("Failed to allocate memory for event. [%s]",
1628 __WDP_LOG_FUNC_EXIT__;
1631 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1633 event.edata = (void*) edata;
1634 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
1635 event.event_id = WFD_OEM_EVENT_PEER_FOUND;
1637 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
1639 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
1640 __ws_peer_property, event.edata);
1642 #if defined(TIZEN_FEATURE_ASP)
1643 if (edata->has_asp_services)
1644 ws_get_advertise_service(peer_path, (GList **)&(event.asp_services));
1645 #endif /* TIZEN_FEATURE_ASP */
1647 g_pd->callback(g_pd->user_data, &event);
1648 #if defined(TIZEN_FEATURE_ASP)
1649 if (event.asp_services != NULL) {
1651 wfd_oem_advertise_service_s *service;
1652 for (l = (GList *)event.asp_services; l != NULL; l = l->next) {
1653 service = (wfd_oem_advertise_service_s *)l->data;
1654 g_free(service->service_type);
1656 event.asp_services = g_list_remove(l, service);
1660 #endif /* TIZEN_FEATURE_ASP */
1661 g_free(event.edata);
1663 __WDP_LOG_FUNC_EXIT__;
1666 static void _ws_process_device_lost(GDBusConnection *connection,
1667 const gchar *object_path, GVariant *parameters)
1669 __WDP_LOG_FUNC_ENTER__;
1670 wfd_oem_event_s event;
1671 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1673 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1675 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
1676 event.event_id = WFD_OEM_EVENT_PEER_DISAPPEARED;
1678 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
1680 g_pd->callback(g_pd->user_data, &event);
1682 __WDP_LOG_FUNC_EXIT__;
1685 static void _ws_process_find_stoppped(GDBusConnection *connection,
1686 const gchar *object_path, GVariant *parameters)
1688 __WDP_LOG_FUNC_ENTER__;
1689 wfd_oem_event_s event;
1691 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1693 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
1694 event.event_id = WFD_OEM_EVENT_DISCOVERY_FINISHED;
1696 g_pd->callback(g_pd->user_data, &event);
1698 __WDP_LOG_FUNC_EXIT__;
1701 static void _ws_process_prov_disc_req_display_pin(GDBusConnection *connection,
1702 const gchar *object_path, GVariant *parameters)
1704 __WDP_LOG_FUNC_ENTER__;
1706 wfd_oem_event_s event;
1707 wfd_oem_dev_data_s *edata = NULL;
1709 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1710 static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
1711 const char *path = NULL;
1712 const char *pin = NULL;
1715 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
1717 WDP_LOGF("Failed to allocate memory for event. [%s]",
1719 __WDP_LOG_FUNC_EXIT__;
1722 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1724 event.edata = (void*) edata;
1725 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
1726 event.event_id = WFD_OEM_EVENT_PROV_DISC_REQ;
1727 event.wps_mode = WFD_OEM_WPS_MODE_DISPLAY;
1729 g_variant_get(parameters, "(&o&s)", &path, &pin);
1730 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
1731 WDP_LOGD("Retrive Added path [%s]", peer_path);
1733 loc = strrchr(peer_path, '/');
1735 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1736 __ws_txt_to_mac(peer_dev, event.dev_addr);
1737 WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(event.dev_addr));
1739 g_strlcpy(event.wps_pin, pin, WS_PINSTR_LEN + 1);
1740 WDP_LOGD("Retrive pin [%s]", event.wps_pin);
1742 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
1743 __ws_peer_property, event.edata);
1745 g_pd->callback(g_pd->user_data, &event);
1746 g_free(event.edata);
1748 __WDP_LOG_FUNC_EXIT__;
1751 static void _ws_process_prov_disc_resp_display_pin(GDBusConnection *connection,
1752 const gchar *object_path, GVariant *parameters)
1754 __WDP_LOG_FUNC_ENTER__;
1756 wfd_oem_event_s event;
1757 wfd_oem_dev_data_s *edata = NULL;
1759 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1760 static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
1761 const char *path = NULL;
1762 const char *pin = NULL;
1765 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
1767 WDP_LOGF("Failed to allocate memory for event. [%s]",
1769 __WDP_LOG_FUNC_EXIT__;
1772 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1774 event.edata = (void*) edata;
1775 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
1776 event.event_id = WFD_OEM_EVENT_PROV_DISC_RESP;
1777 event.wps_mode = WFD_OEM_WPS_MODE_DISPLAY;
1779 g_variant_get(parameters, "(&o&s)", &path, &pin);
1780 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
1781 WDP_LOGD("Retrive Added path [%s]", peer_path);
1783 loc = strrchr(peer_path, '/');
1785 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1786 __ws_txt_to_mac(peer_dev, event.dev_addr);
1787 WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(event.dev_addr));
1789 g_strlcpy(event.wps_pin, pin, WS_PINSTR_LEN + 1);
1790 WDP_LOGD("Retrive pin [%s]", event.wps_pin);
1792 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
1793 __ws_peer_property, event.edata);
1795 g_pd->callback(g_pd->user_data, &event);
1796 g_free(event.edata);
1798 __WDP_LOG_FUNC_EXIT__;
1801 static void _ws_process_prov_disc_req_enter_pin(GDBusConnection *connection,
1802 const gchar *object_path, GVariant *parameters)
1804 __WDP_LOG_FUNC_ENTER__;
1805 wfd_oem_event_s event;
1806 wfd_oem_dev_data_s *edata = NULL;
1807 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1809 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
1811 WDP_LOGF("Failed to allocate memory for event. [%s]",
1813 __WDP_LOG_FUNC_EXIT__;
1816 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1818 event.edata = (void*) edata;
1819 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
1820 event.event_id = WFD_OEM_EVENT_PROV_DISC_REQ;
1821 event.wps_mode = WFD_OEM_WPS_MODE_KEYPAD;
1823 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
1825 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
1826 __ws_peer_property, event.edata);
1828 g_pd->callback(g_pd->user_data, &event);
1829 g_free(event.edata);
1831 __WDP_LOG_FUNC_EXIT__;
1834 static void _ws_process_prov_disc_resp_enter_pin(GDBusConnection *connection,
1835 const gchar *object_path, GVariant *parameters)
1837 __WDP_LOG_FUNC_ENTER__;
1838 wfd_oem_event_s event;
1839 wfd_oem_dev_data_s *edata = NULL;
1840 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1842 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
1844 WDP_LOGF("Failed to allocate memory for event. [%s]",
1846 __WDP_LOG_FUNC_EXIT__;
1849 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1851 event.edata = (void*) edata;
1852 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
1853 event.event_id = WFD_OEM_EVENT_PROV_DISC_RESP;
1854 event.wps_mode = WFD_OEM_WPS_MODE_KEYPAD;
1856 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
1858 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
1859 __ws_peer_property, event.edata);
1861 g_pd->callback(g_pd->user_data, &event);
1862 g_free(event.edata);
1864 __WDP_LOG_FUNC_EXIT__;
1867 static void _ws_process_prov_disc_pbc_req(GDBusConnection *connection,
1868 const gchar *object_path, GVariant *parameters)
1870 __WDP_LOG_FUNC_ENTER__;
1871 wfd_oem_event_s event;
1872 wfd_oem_dev_data_s *edata = NULL;
1873 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1875 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
1877 WDP_LOGF("Failed to allocate memory for event. [%s]",
1879 __WDP_LOG_FUNC_EXIT__;
1882 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1884 event.edata = (void*) edata;
1885 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
1886 event.event_id = WFD_OEM_EVENT_PROV_DISC_REQ;
1887 event.wps_mode = WFD_OEM_WPS_MODE_PBC;
1889 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
1891 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
1892 __ws_peer_property, event.edata);
1894 g_pd->callback(g_pd->user_data, &event);
1895 g_free(event.edata);
1897 __WDP_LOG_FUNC_EXIT__;
1900 static void _ws_process_prov_disc_pbc_resp(GDBusConnection *connection,
1901 const gchar *object_path, GVariant *parameters)
1903 __WDP_LOG_FUNC_ENTER__;
1904 wfd_oem_event_s event;
1905 wfd_oem_dev_data_s *edata = NULL;
1906 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1908 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
1910 WDP_LOGF("Failed to allocate memory for event. [%s]",
1912 __WDP_LOG_FUNC_EXIT__;
1915 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1917 event.edata = (void*) edata;
1918 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
1919 event.event_id = WFD_OEM_EVENT_PROV_DISC_RESP;
1920 event.wps_mode = WFD_OEM_WPS_MODE_PBC;
1922 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
1924 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
1925 __ws_peer_property, event.edata);
1927 g_pd->callback(g_pd->user_data, &event);
1928 g_free(event.edata);
1930 __WDP_LOG_FUNC_EXIT__;
1933 #if defined(TIZEN_FEATURE_ASP)
1934 static void _ws_process_prov_disc_failure(GDBusConnection *connection,
1935 const gchar *object_path, GVariant *parameters)
1937 __WDP_LOG_FUNC_ENTER__;
1938 GVariantIter *iter = NULL;
1939 wfd_oem_event_s event;
1940 wfd_oem_asp_prov_s *edata;
1942 edata = (wfd_oem_asp_prov_s *) g_try_malloc0(sizeof(wfd_oem_asp_prov_s));
1944 WDP_LOGF("Failed to allocate memory for event. [%s]",
1946 __WDP_LOG_FUNC_EXIT__;
1949 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1951 event.edata = (void*) edata;
1952 event.event_id = WFD_OEM_EVENT_PROV_DISC_FAIL;
1954 if (parameters != NULL) {
1955 g_variant_get(parameters, "(a{sv})", &iter);
1957 dbus_property_foreach(iter, __ws_extract_provision_fail_details, &event);
1958 event.edata_type = WFD_OEM_EDATA_TYPE_ASP_PROV;
1959 g_variant_iter_free(iter);
1962 WDP_LOGE("No Properties");
1965 g_pd->callback(g_pd->user_data, &event);
1967 if (event.edata_type == WFD_OEM_EDATA_TYPE_ASP_PROV)
1968 g_free(edata->session_information);
1971 __WDP_LOG_FUNC_EXIT__;
1974 static void _ws_process_prov_disc_failure(GDBusConnection *connection,
1975 const gchar *object_path, GVariant *parameters)
1977 __WDP_LOG_FUNC_ENTER__;
1978 wfd_oem_event_s event;
1979 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1980 static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
1981 const char *path = NULL;
1982 int prov_status = 0;
1985 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1987 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
1988 event.event_id = WFD_OEM_EVENT_PROV_DISC_FAIL;
1990 g_variant_get(parameters, "(&oi)", &path, &prov_status);
1991 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
1992 WDP_LOGD("Retrive Added path [%s]", peer_path);
1993 WDP_LOGD("Retrive Failure stateus [%d]", prov_status);
1995 loc = strrchr(peer_path, '/');
1997 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1998 __ws_txt_to_mac(peer_dev, event.dev_addr);
1999 WDP_LOGE("peer mac [" MACSTR "]", MAC2STR(event.dev_addr));
2001 g_pd->callback(g_pd->user_data, &event);
2003 __WDP_LOG_FUNC_EXIT__;
2005 #endif /* TIZEN_FEATURE_ASP */
2008 static void _ws_process_group_started(GDBusConnection *connection,
2009 const gchar *object_path, GVariant *parameters)
2011 __WDP_LOG_FUNC_ENTER__;
2012 GVariantIter *iter = NULL;
2013 wfd_oem_event_s event;
2014 wfd_oem_group_data_s *edata = NULL;
2016 edata = (wfd_oem_group_data_s*)calloc(1, sizeof(wfd_oem_group_data_s));
2018 WDP_LOGF("Failed to allocate memory for event. [%s]",
2020 __WDP_LOG_FUNC_EXIT__;
2023 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2025 event.edata = (void*) edata;
2026 event.edata_type = WFD_OEM_EDATA_TYPE_GROUP;
2027 event.event_id = WFD_OEM_EVENT_GROUP_CREATED;
2029 if (parameters != NULL) {
2030 g_variant_get(parameters, "(a{sv})", &iter);
2033 dbus_property_foreach(iter, __ws_extract_group_details, &event);
2034 g_variant_iter_free(iter);
2037 WDP_LOGE("No properties");
2040 g_pd->callback(g_pd->user_data, &event);
2041 g_free(event.edata);
2043 __WDP_LOG_FUNC_EXIT__;
2046 static void _ws_process_go_neg_success(GDBusConnection *connection,
2047 const gchar *object_path, GVariant *parameters)
2049 __WDP_LOG_FUNC_ENTER__;
2050 GVariantIter *iter = NULL;
2051 wfd_oem_event_s event;
2052 wfd_oem_conn_data_s *edata = NULL;
2054 edata = (wfd_oem_conn_data_s*)calloc(1, sizeof(wfd_oem_conn_data_s));
2056 WDP_LOGF("Failed to allocate memory for event. [%s]",
2058 __WDP_LOG_FUNC_EXIT__;
2061 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2063 event.edata = edata;
2064 event.edata_type = WFD_OEM_EDATA_TYPE_CONN;
2065 event.event_id = WFD_OEM_EVENT_GO_NEG_DONE;
2067 if (parameters != NULL) {
2068 g_variant_get(parameters, "(a{sv})", &iter);
2071 dbus_property_foreach(iter, __ws_extract_gonegsuccess_details, &event);
2072 g_variant_iter_free(iter);
2075 WDP_LOGE("No properties");
2078 g_pd->callback(g_pd->user_data, &event);
2081 __WDP_LOG_FUNC_EXIT__;
2084 static void _ws_process_go_neg_failure(GDBusConnection *connection,
2085 const gchar *object_path, GVariant *parameters)
2087 __WDP_LOG_FUNC_ENTER__;
2088 GVariantIter *iter = NULL;
2089 wfd_oem_event_s event;
2090 wfd_oem_conn_data_s *edata = NULL;
2092 edata = (wfd_oem_conn_data_s *) g_try_malloc0(sizeof(wfd_oem_conn_data_s));
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_GO_NEG_FAIL;
2105 if (parameters != NULL) {
2106 g_variant_get(parameters, "(a{sv})", &iter);
2109 dbus_property_foreach(iter, __ws_extract_gonegfailaure_details, &event);
2110 g_variant_iter_free(iter);
2113 WDP_LOGE("No properties");
2116 g_pd->callback(g_pd->user_data, &event);
2117 g_free(event.edata);
2119 __WDP_LOG_FUNC_EXIT__;
2122 static void _ws_process_go_neg_request(GDBusConnection *connection,
2123 const gchar *object_path, GVariant *parameters)
2125 __WDP_LOG_FUNC_ENTER__;
2126 wfd_oem_event_s event;
2127 wfd_oem_dev_data_s *edata = NULL;
2128 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2129 static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
2130 const char *path = NULL;
2133 int dev_passwd_id = 0;
2134 int device_go_intent = 0;
2136 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
2138 WDP_LOGF("Failed to allocate memory for event. [%s]",
2140 __WDP_LOG_FUNC_EXIT__;
2143 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2145 event.edata = (void*) edata;
2146 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
2147 event.event_id = WFD_OEM_EVENT_GO_NEG_REQ;
2149 g_variant_get(parameters, "(&oqy)", &path, &dev_passwd_id, &device_go_intent);
2150 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
2152 WDP_LOGD("Retrive peer path [%s]", peer_path);
2153 WDP_LOGD("Retrive dev_passwd_id [%d]", dev_passwd_id);
2154 WDP_LOGD("Retrive device_go_intent [%d]", device_go_intent);
2156 if (dev_passwd_id == WS_DEV_PASSWD_ID_PUSH_BUTTON)
2157 event.wps_mode = WFD_OEM_WPS_MODE_PBC;
2158 else if (dev_passwd_id == WS_DEV_PASSWD_ID_REGISTRAR_SPECIFIED)
2159 event.wps_mode = WFD_OEM_WPS_MODE_DISPLAY;
2160 else if (dev_passwd_id == WS_DEV_PASSWD_ID_USER_SPECIFIED)
2161 event.wps_mode = WFD_OEM_WPS_MODE_KEYPAD;
2163 event.wps_mode = WFD_OEM_WPS_MODE_NONE;
2164 edata->device_go_intent = device_go_intent;
2166 loc = strrchr(peer_path, '/');
2168 __ws_mac_compact_to_normal(loc + 1, peer_dev);
2169 __ws_txt_to_mac(peer_dev, event.dev_addr);
2170 WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(event.dev_addr));
2172 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2173 __ws_peer_property, event.edata);
2175 g_pd->callback(g_pd->user_data, &event);
2176 g_free(event.edata);
2178 __WDP_LOG_FUNC_EXIT__;
2180 static void _ws_process_invitation_received(GDBusConnection *connection,
2181 const gchar *object_path, GVariant *parameters)
2183 __WDP_LOG_FUNC_ENTER__;
2184 GVariantIter *iter = NULL;
2185 wfd_oem_event_s event;
2186 wfd_oem_invite_data_s *edata = NULL;
2188 edata = (wfd_oem_invite_data_s *) g_try_malloc0(sizeof(wfd_oem_invite_data_s));
2190 WDP_LOGF("Failed to allocate memory for event. [%s]",
2192 __WDP_LOG_FUNC_EXIT__;
2195 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2197 event.edata = (void*) edata;
2198 event.edata_type = WFD_OEM_EDATA_TYPE_INVITE;
2199 event.event_id = WFD_OEM_EVENT_INVITATION_REQ;
2201 if (parameters != NULL) {
2202 g_variant_get(parameters, "(a{sv})", &iter);
2205 dbus_property_foreach(iter, __ws_extract_invitation_details, &event);
2206 g_variant_iter_free(iter);
2209 WDP_LOGE("No properties");
2211 memcpy(&(event.dev_addr), edata->sa, OEM_MACADDR_LEN);
2213 g_pd->callback(g_pd->user_data, &event);
2214 g_free(event.edata);
2216 __WDP_LOG_FUNC_EXIT__;
2219 static void _ws_process_invitation_result(GDBusConnection *connection,
2220 const gchar *object_path, GVariant *parameters)
2222 __WDP_LOG_FUNC_ENTER__;
2223 wfd_oem_event_s event;
2224 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2226 __WDP_LOG_FUNC_EXIT__;
2229 static void _ws_process_group_finished(GDBusConnection *connection,
2230 const gchar *object_path, GVariant *parameters)
2232 __WDP_LOG_FUNC_ENTER__;
2233 wfd_oem_event_s event;
2235 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2237 event.event_id = WFD_OEM_EVENT_GROUP_DESTROYED;
2238 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2240 g_dbus_connection_signal_unsubscribe(g_pd->g_dbus, g_pd->group_sub_id);
2241 memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
2244 g_pd->callback(g_pd->user_data, &event);
2246 __WDP_LOG_FUNC_EXIT__;
2249 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
2250 static void _ws_process_service_discovery_response(GDBusConnection *connection,
2251 const gchar *object_path, GVariant *parameters)
2253 __WDP_LOG_FUNC_ENTER__;
2254 GVariantIter *iter = NULL;
2255 wfd_oem_event_s event;
2257 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2259 event.event_id = WFD_OEM_EVENT_SERV_DISC_RESP;
2261 if (parameters != NULL) {
2262 g_variant_get(parameters, "(a{sv})", &iter);
2264 dbus_property_foreach(iter, __ws_extract_servicediscoveryresponse_details, &event);
2265 event.edata_type = WFD_OEM_EDATA_TYPE_NEW_SERVICE;
2266 g_variant_iter_free(iter);
2269 WDP_LOGE("No Properties");
2272 g_pd->callback(g_pd->user_data, &event);
2274 if (event.edata_type == WFD_OEM_EDATA_TYPE_NEW_SERVICE)
2275 g_list_free((GList*) event.edata);
2277 __WDP_LOG_FUNC_EXIT__;
2279 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
2281 #if defined(TIZEN_FEATURE_ASP)
2282 static void _ws_process_service_asp_response(GDBusConnection *connection,
2283 const gchar *object_path, GVariant *parameters)
2285 __WDP_LOG_FUNC_ENTER__;
2286 GVariantIter *iter = NULL;
2287 wfd_oem_event_s event;
2288 wfd_oem_asp_service_s *service, *tmp;
2290 service = (wfd_oem_asp_service_s *) g_try_malloc0(sizeof(wfd_oem_asp_service_s));
2292 WDP_LOGF("Failed to allocate memory for event. [%s]",
2294 __WDP_LOG_FUNC_EXIT__;
2297 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2299 event.edata = (void*) service;
2300 event.edata_type = WFD_OEM_EDATA_TYPE_ASP_SERVICE;
2301 event.event_id = WFD_OEM_EVENT_ASP_SERV_RESP;
2303 if (parameters != NULL) {
2304 g_variant_get(parameters, "(a{sv})", &iter);
2306 dbus_property_foreach(iter, __ws_extract_serviceaspresponse_details, &event);
2307 g_variant_iter_free(iter);
2310 WDP_LOGE("No Properties");
2312 GLIST_ITER_START(seek_list, tmp)
2313 if (tmp->tran_id == service->tran_id) {
2314 WDP_LOGD("srv_trans_id matched [%d] search_id [%llu]"
2315 , tmp->tran_id, tmp->search_id);
2316 service->search_id = tmp->search_id;
2323 if (tmp->service_info != NULL)
2324 g_pd->callback(g_pd->user_data, &event);
2326 WDP_LOGD("service info is not required, don't notify to user");
2328 g_free(service->service_type);
2329 g_free(service->service_info);
2332 __WDP_LOG_FUNC_EXIT__;
2334 #endif /* TIZEN_FEATURE_ASP */
2336 static void _ws_process_persistent_group_added(GDBusConnection *connection,
2337 const gchar *object_path, GVariant *parameters)
2339 __WDP_LOG_FUNC_ENTER__;
2340 wfd_oem_event_s event;
2341 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2343 __WDP_LOG_FUNC_EXIT__;
2346 static void _ws_process_persistent_group_removed(GDBusConnection *connection,
2347 const gchar *object_path, GVariant *parameters)
2349 __WDP_LOG_FUNC_ENTER__;
2350 wfd_oem_event_s event;
2351 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2353 __WDP_LOG_FUNC_EXIT__;
2356 static void _ws_process_wps_failed(GDBusConnection *connection,
2357 const gchar *object_path, GVariant *parameters)
2359 __WDP_LOG_FUNC_ENTER__;
2360 GVariantIter *iter = NULL;
2361 wfd_oem_event_s event;
2362 const char *name = NULL;
2364 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2366 event.event_id = WFD_OEM_EVENT_WPS_FAIL;
2367 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2369 g_variant_get(parameters, "(&sa{sv})", &name, &iter);
2371 WDP_LOGD("code [%s]", name);
2376 GVariant *value = NULL;
2378 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
2379 #if defined(TIZEN_DEBUG_DBUS_VALUE)
2380 CHECK_KEY_VALUE(key, value);
2381 #endif /* TIZEN_DEBUG_DBUS_VALUE */
2383 g_variant_iter_free(iter);
2386 g_pd->callback(g_pd->user_data, &event);
2388 __WDP_LOG_FUNC_EXIT__;
2391 static void _ws_process_group_formation_failure(GDBusConnection *connection,
2392 const gchar *object_path, GVariant *parameters)
2394 __WDP_LOG_FUNC_ENTER__;
2395 wfd_oem_event_s event;
2397 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2399 event.event_id = WFD_OEM_EVENT_GROUP_FORMATION_FAILURE;
2400 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2402 g_pd->callback(g_pd->user_data, &event);
2404 __WDP_LOG_FUNC_EXIT__;
2407 static void _ws_process_invitation_accepted(GDBusConnection *connection,
2408 const gchar *object_path, GVariant *parameters)
2410 __WDP_LOG_FUNC_ENTER__;
2411 GVariantIter *iter = NULL;
2412 wfd_oem_event_s event;
2414 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2416 event.event_id = WFD_OEM_EVENT_INVITATION_ACCEPTED;
2417 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2419 if (parameters != NULL) {
2420 g_variant_get(parameters, "(a{sv})", &iter);
2424 GVariant *value = NULL;
2426 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
2427 CHECK_KEY_VALUE(key, value);
2428 if (g_strcmp0(key, "sa") == 0)
2429 if (__ws_unpack_ay(event.dev_addr, value, WS_MACADDR_LEN))
2430 WDP_LOGI("[" MACSTR "]", MAC2STR(event.dev_addr));
2432 g_variant_iter_free(iter);
2436 g_pd->callback(g_pd->user_data, &event);
2437 __WDP_LOG_FUNC_EXIT__;
2440 #if defined(TIZEN_FEATURE_ASP)
2441 static void _ws_process_asp_provision_start(GDBusConnection *connection,
2442 const gchar *object_path, GVariant *parameters)
2444 __WDP_LOG_FUNC_ENTER__;
2445 GVariantIter *iter = NULL;
2446 wfd_oem_event_s event;
2447 wfd_oem_asp_prov_s *edata;
2449 edata = (wfd_oem_asp_prov_s *) g_try_malloc0(sizeof(wfd_oem_asp_prov_s));
2451 WDP_LOGF("Failed to allocate memory for event. [%s]",
2453 __WDP_LOG_FUNC_EXIT__;
2456 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2458 event.edata = (void*) edata;
2459 event.event_id = WFD_OEM_EVENT_ASP_PROV_START;
2461 if (parameters != NULL) {
2462 g_variant_get(parameters, "(a{sv})", &iter);
2464 dbus_property_foreach(iter, __ws_extract_asp_provision_start_details, &event);
2465 event.edata_type = WFD_OEM_EDATA_TYPE_ASP_PROV;
2466 g_variant_iter_free(iter);
2469 WDP_LOGE("No Properties");
2472 g_pd->callback(g_pd->user_data, &event);
2474 if (event.edata_type == WFD_OEM_EDATA_TYPE_ASP_PROV)
2475 g_free(edata->session_information);
2478 __WDP_LOG_FUNC_EXIT__;
2481 static void _ws_process_asp_provision_done(GDBusConnection *connection,
2482 const gchar *object_path, GVariant *parameters)
2484 __WDP_LOG_FUNC_ENTER__;
2485 GVariantIter *iter = NULL;
2486 wfd_oem_event_s event;
2487 wfd_oem_asp_prov_s *edata;
2489 edata = (wfd_oem_asp_prov_s *) g_try_malloc0(sizeof(wfd_oem_asp_prov_s));
2491 WDP_LOGF("Failed to allocate memory for event. [%s]",
2493 __WDP_LOG_FUNC_EXIT__;
2496 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2498 event.edata = (void*) edata;
2499 event.event_id = WFD_OEM_EVENT_ASP_PROV_DONE;
2501 if (parameters != NULL) {
2502 g_variant_get(parameters, "(a{sv})", &iter);
2504 dbus_property_foreach(iter, __ws_extract_asp_provision_done_details, &event);
2505 event.edata_type = WFD_OEM_EDATA_TYPE_ASP_PROV;
2506 g_variant_iter_free(iter);
2509 WDP_LOGE("No Properties");
2512 g_pd->callback(g_pd->user_data, &event);
2515 __WDP_LOG_FUNC_EXIT__;
2517 #endif /* TIZEN_FEATURE_ASP */
2520 const char *interface;
2522 void (*function) (GDBusConnection *connection, const gchar *object_path,
2523 GVariant *parameters);
2524 } ws_p2pdevice_signal_map[] = {
2526 SUPPLICANT_P2PDEVICE,
2528 _ws_process_device_found
2531 SUPPLICANT_P2PDEVICE,
2533 _ws_process_device_lost
2536 SUPPLICANT_P2PDEVICE,
2538 _ws_process_find_stoppped
2541 SUPPLICANT_P2PDEVICE,
2542 "ProvisionDiscoveryRequestDisplayPin",
2543 _ws_process_prov_disc_req_display_pin
2546 SUPPLICANT_P2PDEVICE,
2547 "ProvisionDiscoveryResponseDisplayPin",
2548 _ws_process_prov_disc_resp_display_pin
2551 SUPPLICANT_P2PDEVICE,
2552 "ProvisionDiscoveryRequestEnterPin",
2553 _ws_process_prov_disc_req_enter_pin
2556 SUPPLICANT_P2PDEVICE,
2557 "ProvisionDiscoveryResponseEnterPin",
2558 _ws_process_prov_disc_resp_enter_pin
2561 SUPPLICANT_P2PDEVICE,
2562 "ProvisionDiscoveryPBCRequest",
2563 _ws_process_prov_disc_pbc_req
2566 SUPPLICANT_P2PDEVICE,
2567 "ProvisionDiscoveryPBCResponse",
2568 _ws_process_prov_disc_pbc_resp
2571 SUPPLICANT_P2PDEVICE,
2572 "ProvisionDiscoveryFailure",
2573 _ws_process_prov_disc_failure
2576 SUPPLICANT_P2PDEVICE,
2578 _ws_process_group_started
2581 SUPPLICANT_P2PDEVICE,
2582 "GONegotiationSuccess",
2583 _ws_process_go_neg_success
2586 SUPPLICANT_P2PDEVICE,
2587 "GONegotiationFailure",
2588 _ws_process_go_neg_failure
2591 SUPPLICANT_P2PDEVICE,
2592 "GONegotiationRequest",
2593 _ws_process_go_neg_request
2596 SUPPLICANT_P2PDEVICE,
2597 "InvitationReceived",
2598 _ws_process_invitation_received
2601 SUPPLICANT_P2PDEVICE,
2603 _ws_process_invitation_result
2606 SUPPLICANT_P2PDEVICE,
2608 _ws_process_group_finished
2610 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
2612 SUPPLICANT_P2PDEVICE,
2613 "ServiceDiscoveryResponse",
2614 _ws_process_service_discovery_response
2616 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
2617 #if defined(TIZEN_FEATURE_ASP)
2619 SUPPLICANT_P2PDEVICE,
2620 "ServiceASPResponse",
2621 _ws_process_service_asp_response
2624 SUPPLICANT_P2PDEVICE,
2625 "ASPProvisionStart",
2626 _ws_process_asp_provision_start
2629 SUPPLICANT_P2PDEVICE,
2631 _ws_process_asp_provision_done
2633 #endif /* TIZEN_FEATURE_ASP */
2635 SUPPLICANT_P2PDEVICE,
2636 "PersistentGroupAdded",
2637 _ws_process_persistent_group_added
2640 SUPPLICANT_P2PDEVICE,
2641 "PersistentGroupRemoved",
2642 _ws_process_persistent_group_removed
2645 SUPPLICANT_P2PDEVICE,
2647 _ws_process_wps_failed
2650 SUPPLICANT_P2PDEVICE,
2651 "GroupFormationFailure",
2652 _ws_process_group_formation_failure
2655 SUPPLICANT_P2PDEVICE,
2656 "InvitationAccepted",
2657 _ws_process_invitation_accepted
2666 static void _p2pdevice_signal_cb(GDBusConnection *connection,
2667 const gchar *sender, const gchar *object_path, const gchar *interface,
2668 const gchar *signal, GVariant *parameters, gpointer user_data)
2671 #if defined(TIZEN_DEBUG_DBUS_VALUE)
2672 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2673 #endif /* TIZEN_DEBUG_DBUS_VALUE */
2676 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
2680 for (i = 0; ws_p2pdevice_signal_map[i].member != NULL; i++) {
2681 if (!g_strcmp0(signal, ws_p2pdevice_signal_map[i].member) &&
2682 ws_p2pdevice_signal_map[i].function != NULL)
2683 ws_p2pdevice_signal_map[i].function(connection, object_path, parameters);
2688 static void _ws_process_sta_authorized(GDBusConnection *connection,
2689 const gchar *object_path, GVariant *parameters)
2691 __WDP_LOG_FUNC_ENTER__;
2692 wfd_oem_event_s event;
2693 const gchar* mac_str = NULL;
2695 if (is_peer_joined_notified) {
2696 is_peer_joined_notified = 0;
2697 __WDP_LOG_FUNC_EXIT__;
2701 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2702 g_variant_get(parameters, "(&s)", &mac_str);
2703 __ws_txt_to_mac((unsigned char *)mac_str, event.intf_addr);
2705 event.event_id = WFD_OEM_EVENT_STA_CONNECTED;
2706 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2708 g_pd->callback(g_pd->user_data, &event);
2709 __WDP_LOG_FUNC_EXIT__;
2712 static void _ws_process_sta_deauthorized(GDBusConnection *connection,
2713 const gchar *object_path, GVariant *parameters)
2715 __WDP_LOG_FUNC_ENTER__;
2716 wfd_oem_event_s event;
2717 const gchar* mac_str = NULL;
2719 if (is_peer_disconnected_notified) {
2720 is_peer_disconnected_notified = 0;
2721 __WDP_LOG_FUNC_EXIT__;
2725 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2726 g_variant_get(parameters, "(&s)", &mac_str);
2727 __ws_txt_to_mac((unsigned char *)mac_str, event.intf_addr);
2729 event.event_id = WFD_OEM_EVENT_STA_DISCONNECTED;
2730 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2732 g_pd->callback(g_pd->user_data, &event);
2733 __WDP_LOG_FUNC_EXIT__;
2737 const char *interface;
2739 void (*function) (GDBusConnection *connection, const gchar *object_path,
2740 GVariant *parameters);
2741 } ws_interface_signal_map[] = {
2743 SUPPLICANT_INTERFACE,
2745 _ws_process_sta_authorized
2748 SUPPLICANT_INTERFACE,
2750 _ws_process_sta_deauthorized
2759 static void _interface_signal_cb(GDBusConnection *connection,
2760 const gchar *sender, const gchar *object_path, const gchar *interface,
2761 const gchar *signal, GVariant *parameters, gpointer user_data)
2764 #if defined(TIZEN_DEBUG_DBUS_VALUE)
2765 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2766 #endif /* TIZEN_DEBUG_DBUS_VALUE */
2769 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
2770 __WDP_LOG_FUNC_EXIT__;
2774 for (i = 0; ws_interface_signal_map[i].member != NULL; i++) {
2775 if (!g_strcmp0(signal, ws_interface_signal_map[i].member) &&
2776 ws_interface_signal_map[i].function != NULL)
2777 ws_interface_signal_map[i].function(connection, object_path, parameters);
2782 static void __ws_parse_peer_joined(char *peer_path,
2783 unsigned char *dev_addr, unsigned char *ip_addr, GVariant *parameter)
2785 __WDP_LOG_FUNC_ENTER__;
2788 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
2789 const char *path = NULL;
2791 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
2793 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
2795 g_variant_get(parameter, "(&oay)", &path, &iter);
2796 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
2797 WDP_LOGD("Retrive Added path [%s]", peer_path);
2799 loc = strrchr(peer_path, '/');
2801 __ws_mac_compact_to_normal(loc + 1, peer_dev);
2802 __ws_txt_to_mac(peer_dev, dev_addr);
2803 WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(dev_addr));
2804 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
2805 for (i = 0; i < OEM_IPADDR_LEN; i++)
2806 g_variant_iter_loop(iter, "y", &ip_addr[i]);
2807 g_variant_iter_free(iter);
2809 WDP_LOGD("peer ip [" IPSTR "]", IP2STR(ip_addr));
2810 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
2812 __WDP_LOG_FUNC_EXIT__;
2817 static void _group_signal_cb(GDBusConnection *connection,
2818 const gchar *sender, const gchar *object_path, const gchar *interface,
2819 const gchar *signal, GVariant *parameters, gpointer user_data)
2821 #if defined(TIZEN_DEBUG_DBUS_VALUE)
2822 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2823 #endif /* TIZEN_DEBUG_DBUS_VALUE */
2826 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
2830 if (!g_strcmp0(signal, "PeerJoined")) {
2832 wfd_oem_event_s event;
2833 wfd_oem_dev_data_s *edata = NULL;
2835 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2837 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
2839 WDP_LOGF("Failed to allocate memory for event. [%s]",
2841 __WDP_LOG_FUNC_EXIT__;
2844 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2846 event.edata = (void*) edata;
2847 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
2848 event.event_id = WFD_OEM_EVENT_STA_CONNECTED;
2850 __ws_parse_peer_joined(peer_path, event.dev_addr, event.ip_addr_peer, parameters);
2852 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2853 __ws_peer_property, event.edata);
2855 g_pd->callback(g_pd->user_data, &event);
2856 is_peer_joined_notified = 1;
2860 } else if (!g_strcmp0(signal, "PeerDisconnected")) {
2862 wfd_oem_event_s event;
2864 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2866 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2868 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2869 event.event_id = WFD_OEM_EVENT_STA_DISCONNECTED;
2871 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
2873 g_pd->callback(g_pd->user_data, &event);
2874 is_peer_disconnected_notified = 1;
2878 static void __register_p2pdevice_signal(GVariant *value, void *user_data)
2880 __WDP_LOG_FUNC_ENTER__;
2881 ws_dbus_plugin_data_s * pd_data;
2882 static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2883 const char *path = NULL;
2886 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
2890 pd_data = (ws_dbus_plugin_data_s *)g_pd;
2892 g_variant_get(value, "(&o)", &path);
2893 g_strlcpy(interface_path, path, DBUS_OBJECT_PATH_MAX);
2894 g_strlcpy(pd_data->iface_path, path, DBUS_OBJECT_PATH_MAX);
2896 WDP_LOGD("interface object path [%s]", interface_path);
2898 /* subscribe Interface iface signal */
2899 WDP_LOGD("Register Interface iface signal");
2900 pd_data->p2pdevice_sub_id = g_dbus_connection_signal_subscribe(
2902 SUPPLICANT_SERVICE, /* bus name */
2903 SUPPLICANT_IFACE, /* interface */
2905 NULL, /* object path */
2907 G_DBUS_SIGNAL_FLAGS_NONE,
2908 _interface_signal_cb,
2911 /* subscribe P2PDevice iface signal */
2912 WDP_LOGD("register P2PDevice iface signal");
2913 pd_data->p2pdevice_sub_id = g_dbus_connection_signal_subscribe(
2915 SUPPLICANT_SERVICE, /* bus name */
2916 SUPPLICANT_P2PDEVICE, /* interface */
2918 NULL, /* object path */
2920 G_DBUS_SIGNAL_FLAGS_NONE,
2921 _p2pdevice_signal_cb,
2923 __WDP_LOG_FUNC_EXIT__;
2926 static int _ws_create_interface(const char *iface_name, handle_reply function, void *user_data)
2928 __WDP_LOG_FUNC_ENTER__;
2929 GDBusConnection *g_dbus = NULL;
2930 GVariantBuilder *builder = NULL;
2931 dbus_method_param_s params;
2936 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
2940 g_dbus = g_pd->g_dbus;
2942 WDP_LOGE("DBus connection is NULL");
2945 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
2947 dbus_set_method_param(¶ms, "CreateInterface", SUPPLICANT_PATH, g_dbus);
2949 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
2950 g_variant_builder_add(builder, "{sv}", "Ifname", g_variant_new_string(iface_name));
2951 g_variant_builder_add(builder, "{sv}", "ConfigFile", g_variant_new_string(CONF_FILE_PATH));
2952 params.params = g_variant_new("(a{sv})", builder);
2953 g_variant_builder_unref(builder);
2954 res = dbus_method_call(¶ms, SUPPLICANT_INTERFACE, function, user_data);
2956 WDP_LOGE("Failed to send command to wpa_supplicant");
2958 WDP_LOGD("Succeeded to CreateInterface");
2960 __WDP_LOG_FUNC_EXIT__;
2964 static int _ws_get_interface(const char *iface_name, handle_reply function, void *user_data)
2966 __WDP_LOG_FUNC_ENTER__;
2967 GDBusConnection *g_dbus = NULL;
2968 dbus_method_param_s params;
2972 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
2976 g_dbus = g_pd->g_dbus;
2978 WDP_LOGE("DBus connection is NULL");
2982 dbus_set_method_param(¶ms, SUPPLICANT_METHOD_GETINTERFACE,
2983 SUPPLICANT_PATH, g_pd->g_dbus);
2985 params.params = g_variant_new("(s)", iface_name);
2986 #if defined(TIZEN_DEBUG_DBUS_VALUE)
2987 DEBUG_PARAMS(params.params);
2988 #endif /* TIZEN_DEBUG_DBUS_VALUE */
2990 res = dbus_method_call(¶ms, SUPPLICANT_INTERFACE,
2991 function, user_data);
2994 WDP_LOGE("Failed to send command to wpa_supplicant");
2996 WDP_LOGD("Succeeded to get interface");
2998 __WDP_LOG_FUNC_EXIT__;
3002 #if defined(TIZEN_MOBILE) && (TIZEN_WLAN_BOARD_SPRD)
3003 static void __ws_remove_interface(GVariant *value, void *user_data)
3005 __WDP_LOG_FUNC_ENTER__;
3006 GDBusConnection *g_dbus = NULL;
3007 dbus_method_param_s params;
3008 const char *path = NULL;
3009 static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
3013 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3017 g_dbus = g_pd->g_dbus;
3019 WDP_LOGE("DBus connection is NULL");
3023 g_variant_get(value, "(&o)", &path);
3024 g_strlcpy(interface_path, path, DBUS_OBJECT_PATH_MAX);
3025 WDP_LOGD("interface object path [%s]", interface_path);
3027 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
3029 dbus_set_method_param(¶ms, "RemoveInterface", SUPPLICANT_PATH, g_dbus);
3030 params.params = g_variant_new("(o)", interface_path);
3032 res = dbus_method_call(¶ms, SUPPLICANT_INTERFACE, NULL, NULL);
3034 WDP_LOGE("Failed to send command to wpa_supplicant");
3036 WDP_LOGD("Succeeded to RemoveInterface");
3038 __WDP_LOG_FUNC_EXIT__;
3041 #endif /* (TIZEN_MOBILE) && (TIZEN_WLAN_BOARD_SPRD) */
3043 static int _ws_init_dbus_connection(void)
3045 __WDP_LOG_FUNC_ENTER__;
3046 GDBusConnection *conn = NULL;
3047 GError *error = NULL;
3051 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3055 conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
3058 if (error != NULL) {
3059 WDP_LOGE("Error! Failed to connect to the D-BUS daemon: [%s]",
3061 g_error_free(error);
3063 __WDP_LOG_FUNC_EXIT__;
3067 g_pd->g_dbus = conn;
3069 WDP_LOGD("register supplicant signal");
3070 /* subscribe supplicant signal */
3071 g_pd->supp_sub_id = g_dbus_connection_signal_subscribe(
3073 SUPPLICANT_SERVICE, /* bus name */
3074 SUPPLICANT_INTERFACE, /* interface */
3076 SUPPLICANT_PATH, /* object path */
3078 G_DBUS_SIGNAL_FLAGS_NONE,
3079 _supplicant_signal_cb,
3081 #if defined(TIZEN_MOBILE) && (TIZEN_WLAN_BOARD_SPRD)
3082 if (_ws_get_interface(COMMON_IFACE_NAME, NULL, NULL) < 0)
3083 _ws_create_interface(COMMON_IFACE_NAME, NULL, NULL);
3084 if (_ws_get_interface(P2P_IFACE_NAME, __register_p2pdevice_signal, NULL) < 0)
3085 res = _ws_create_interface(P2P_IFACE_NAME, __register_p2pdevice_signal, NULL);
3086 #else /* (TIZEN_MOBILE) && (TIZEN_WLAN_BOARD_SPRD) */
3087 if (_ws_get_interface(COMMON_IFACE_NAME, __register_p2pdevice_signal, NULL) < 0)
3088 res = _ws_create_interface(COMMON_IFACE_NAME, __register_p2pdevice_signal, NULL);
3089 #endif /* (TIZEN_MOBILE) && (TIZEN_WLAN_BOARD_SPRD) */
3092 WDP_LOGE("Failed to subscribe interface signal");
3094 WDP_LOGI("Successfully register signal filters");
3096 __WDP_LOG_FUNC_EXIT__;
3100 static int _ws_deinit_dbus_connection(void)
3102 GDBusConnection *g_dbus = NULL;
3105 WDP_LOGE("Invalid parameter");
3106 __WDP_LOG_FUNC_EXIT__;
3110 g_dbus = g_pd->g_dbus;
3112 WDP_LOGE("DBus connection is NULL");
3116 g_dbus_connection_signal_unsubscribe(g_dbus, g_pd->supp_sub_id);
3117 g_dbus_connection_signal_unsubscribe(g_dbus, g_pd->p2pdevice_sub_id);
3118 g_dbus_connection_signal_unsubscribe(g_dbus, g_pd->group_sub_id);
3120 g_pd->group_iface_sub_id = 0;
3121 g_pd->p2pdevice_sub_id = 0;
3122 g_pd->group_sub_id = 0;
3123 memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
3124 memset(g_pd->iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
3126 g_object_unref(g_dbus);
3130 int wfd_plugin_load(wfd_oem_ops_s **ops)
3133 WDP_LOGE("Invalid parameter");
3137 *ops = &supplicant_ops;
3142 static int _ws_reset_plugin(ws_dbus_plugin_data_s *f_pd)
3144 __WDP_LOG_FUNC_ENTER__;
3147 WDP_LOGE("Invalid parameter");
3148 __WDP_LOG_FUNC_EXIT__;
3152 _ws_deinit_dbus_connection();
3154 if (f_pd->activated)
3155 ws_deactivate(f_pd->concurrent);
3159 __WDP_LOG_FUNC_EXIT__;
3163 #ifndef TIZEN_WIFI_MODULE_BUNDLE
3164 static int __ws_check_net_interface(char* if_name)
3169 if (if_name == NULL) {
3170 WDP_LOGE("Invalid param");
3174 fd = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
3176 WDP_LOGE("socket create error: %d", fd);
3180 memset(&ifr, 0, sizeof(ifr));
3181 strncpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name));
3182 ifr.ifr_name[IFNAMSIZ-1] = '\0';
3184 if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) {
3186 WDP_LOGE("ioctl error: SIOCGIFFLAGS: %s [ %s ]", strerror(errno), if_name); /* interface is not found. */
3192 if (ifr.ifr_flags & IFF_UP) {
3193 WDP_LOGD("%s interface is up", if_name);
3195 } else if (!(ifr.ifr_flags & IFF_UP)) {
3196 WDP_LOGD("%s interface is down", if_name);
3203 int ws_init(wfd_oem_event_cb callback, void *user_data)
3205 __WDP_LOG_FUNC_ENTER__;
3208 _ws_reset_plugin(g_pd);
3211 g_pd = (ws_dbus_plugin_data_s*) g_try_malloc0(sizeof(ws_dbus_plugin_data_s));
3213 WDP_LOGE("Failed to allocate memory for plugin data. [%s]", strerror(errno));
3217 g_pd->callback = callback;
3218 g_pd->user_data = user_data;
3219 g_pd->initialized = TRUE;
3221 __WDP_LOG_FUNC_EXIT__;
3227 __WDP_LOG_FUNC_ENTER__;
3230 _ws_reset_plugin(g_pd);
3234 __WDP_LOG_FUNC_EXIT__;
3238 gboolean _ws_util_execute_file(const char *file_path,
3239 char *const args[], char *const envs[])
3244 register unsigned int index = 0;
3246 while (args[index] != NULL) {
3247 WDP_LOGD("[%s]", args[index]);
3251 if (!(pid = fork())) {
3252 WDP_LOGD("pid(%d), ppid(%d)", getpid(), getppid());
3253 WDP_LOGD("Inside child, exec (%s) command", file_path);
3256 if (execve(file_path, args, envs) == -1) {
3257 WDP_LOGE("Fail to execute command (%s)", strerror(errno));
3260 } else if (pid > 0) {
3261 if (waitpid(pid, &rv, 0) == -1)
3262 WDP_LOGD("wait pid (%u) rv (%d)", pid, rv);
3264 WDP_LOGD("exited, rv=%d", WEXITSTATUS(rv));
3265 else if (WIFSIGNALED(rv))
3266 WDP_LOGD("killed by signal %d", WTERMSIG(rv));
3267 else if (WIFSTOPPED(rv))
3268 WDP_LOGD("stopped by signal %d", WSTOPSIG(rv));
3269 else if (WIFCONTINUED(rv))
3270 WDP_LOGD("continued");
3275 WDP_LOGE("failed to fork (%s)", strerror(errno));
3279 #ifndef TIZEN_WIFI_MODULE_BUNDLE
3280 static int __ws_p2p_firmware_start(void)
3282 gboolean rv = FALSE;
3283 const char *path = "/usr/bin/wlan.sh";
3284 char *const args[] = { "/usr/bin/wlan.sh", "p2p", NULL };
3285 char *const envs[] = { NULL };
3287 rv = _ws_util_execute_file(path, args, envs);
3291 WDP_LOGI("Successfully loaded p2p device driver");
3295 static int __ws_p2p_firmware_stop(void)
3297 gboolean rv = FALSE;
3298 const char *path = "/usr/bin/wlan.sh";
3299 char *const args[] = { "/usr/bin/wlan.sh", "stop", NULL };
3300 char *const envs[] = { NULL };
3301 rv = _ws_util_execute_file(path, args, envs);
3305 WDP_LOGI("Successfully removed p2p device driver");
3310 static int __ws_p2p_supplicant_start(void)
3312 gboolean rv = FALSE;
3313 const char *path = "/usr/sbin/p2p_supp.sh";
3314 char *const args[] = { "/usr/sbin/p2p_supp.sh", "start_dbus", NULL };
3315 char *const envs[] = { NULL };
3317 rv = _ws_util_execute_file(path, args, envs);
3320 WDP_LOGE("Failed to start p2p_supp.sh");
3324 WDP_LOGI("Successfully started p2p_supp.sh");
3329 static int __ws_p2p_supplicant_stop(void)
3331 gboolean rv = FALSE;
3332 const char *path = "/usr/sbin/p2p_supp.sh";
3333 char *const args[] = { "/usr/sbin/p2p_supp.sh", "stop", NULL };
3334 char *const envs[] = { NULL };
3336 rv = _ws_util_execute_file(path, args, envs);
3339 WDP_LOGE("Failed to stop p2p_supp.sh");
3343 WDP_LOGI("Successfully stopped p2p_supp.sh");
3347 static int __ws_p2p_on(void)
3350 DBusMessage *reply = NULL;
3351 DBusMessage *message = NULL;
3352 DBusConnection *connection = NULL;
3354 connection = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
3355 if (connection == NULL) {
3356 WDP_LOGE("Failed to get system bus");
3360 message = dbus_message_new_method_call(NETCONFIG_SERVICE,
3361 NETCONFIG_WIFI_PATH, NETCONFIG_WIFI_INTERFACE, "LoadP2pDriver");
3362 if (message == NULL) {
3363 WDP_LOGE("Failed DBus method call");
3364 dbus_connection_unref(connection);
3368 dbus_error_init(&error);
3370 reply = dbus_connection_send_with_reply_and_block(connection, message,
3371 NETCONFIG_DBUS_REPLY_TIMEOUT, &error);
3372 if (dbus_error_is_set(&error) == TRUE) {
3373 if (NULL != strstr(error.message, ".AlreadyExists")) {
3374 /* p2p already enabled */
3376 WDP_LOGE("dbus_connection_send_with_reply_and_block() failed. "
3377 "DBus error [%s: %s]", error.name, error.message);
3379 dbus_error_free(&error);
3382 dbus_error_free(&error);
3386 dbus_message_unref(reply);
3388 dbus_message_unref(message);
3389 dbus_connection_unref(connection);
3394 static int __ws_p2p_off(void)
3397 DBusMessage *reply = NULL;
3398 DBusMessage *message = NULL;
3399 DBusConnection *connection = NULL;
3401 connection = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
3402 if (connection == NULL) {
3403 WDP_LOGE("Failed to get system bus");
3407 message = dbus_message_new_method_call(NETCONFIG_SERVICE,
3408 NETCONFIG_WIFI_PATH, NETCONFIG_WIFI_INTERFACE, "RemoveP2pDriver");
3409 if (message == NULL) {
3410 WDP_LOGE("Failed DBus method call");
3411 dbus_connection_unref(connection);
3415 dbus_error_init(&error);
3417 reply = dbus_connection_send_with_reply_and_block(connection, message,
3418 NETCONFIG_DBUS_REPLY_TIMEOUT, &error);
3419 if (dbus_error_is_set(&error) == TRUE) {
3420 if (NULL != strstr(error.message, ".AlreadyExists")) {
3421 /* p2p already disabled */
3423 WDP_LOGE("dbus_connection_send_with_reply_and_block() failed. "
3424 "DBus error [%s: %s]", error.name, error.message);
3426 dbus_error_free(&error);
3429 dbus_error_free(&error);
3433 dbus_message_unref(reply);
3435 dbus_message_unref(message);
3436 dbus_connection_unref(connection);
3442 int __ws_init_p2pdevice()
3444 __WDP_LOG_FUNC_ENTER__;
3445 GDBusConnection *g_dbus = NULL;
3447 GVariant *value = NULL;
3448 GVariant *param = NULL;
3449 GVariantBuilder *builder = NULL;
3450 GVariantBuilder *type_builder = NULL;
3451 dbus_method_param_s params;
3453 const char *primary_device_type = PRIMARY_DEVICE_TYPE;
3455 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
3456 const char *ip_addr_go = DEFAULT_IP_GO;
3457 const char *ip_addr_mask = DEFAULT_IP_MASK;
3458 const char *ip_addr_start = DEFAULT_IP_START;
3459 const char *ip_addr_end = DEFAULT_IP_END;
3460 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
3465 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3469 for (i = 0; i < WS_DEVTYPE_LEN; i++)
3470 WDP_LOGD("device type[%02x]", primary_device_type[i]);
3472 g_dbus = g_pd->g_dbus;
3474 WDP_LOGE("DBus connection is NULL");
3477 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
3479 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
3482 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
3483 g_variant_builder_add(builder, "{sv}", "DeviceName",
3484 g_variant_new_string(DEFAULT_DEVICE_NAME));
3486 g_variant_builder_add(builder, "{sv}", "GOIntent",
3487 g_variant_new_uint32(DEFAULT_GO_INTENT));
3489 g_variant_builder_add(builder, "{sv}", "PersistentReconnect",
3490 g_variant_new_boolean(DEFAULT_PERSISTENT_RECONNECT));
3492 g_variant_builder_add(builder, "{sv}", "ListenRegClass",
3493 g_variant_new_uint32(DEFAULT_LISTEN_REG_CLASS));
3495 g_variant_builder_add(builder, "{sv}", "ListenChannel",
3496 g_variant_new_uint32(DEFAULT_LISTEN_CHANNEL));
3498 g_variant_builder_add(builder, "{sv}", "OperRegClass",
3499 g_variant_new_uint32(DEFAULT_OPER_REG_CLASS));
3501 g_variant_builder_add(builder, "{sv}", "OperChannel",
3502 g_variant_new_uint32(DEFAULT_OPER_CHANNEL));
3504 g_variant_builder_add(builder, "{sv}", "SsidPostfix",
3505 g_variant_new_string(DEFAULT_DEVICE_NAME));
3507 g_variant_builder_add(builder, "{sv}", "NoGroupIface",
3508 g_variant_new_boolean(DEFAULT_NO_GROUP_IFACE));
3510 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
3511 for (i = 0; i < WS_DEVTYPE_LEN; i++)
3512 g_variant_builder_add(type_builder, "y", primary_device_type[i]);
3513 g_variant_builder_add(builder, "{sv}", "PrimaryDeviceType",
3514 g_variant_new("ay", type_builder));
3515 g_variant_builder_unref(type_builder);
3516 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
3517 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
3518 for (i = 0; i < OEM_IPADDR_LEN; i++)
3519 g_variant_builder_add(type_builder, "y", ip_addr_go[i]);
3520 g_variant_builder_add(builder, "{sv}", "IpAddrGO",
3521 g_variant_new("ay", type_builder));
3522 g_variant_builder_unref(type_builder);
3524 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
3525 for (i = 0; i < OEM_IPADDR_LEN; i++)
3526 g_variant_builder_add(type_builder, "y", ip_addr_mask[i]);
3527 g_variant_builder_add(builder, "{sv}", "IpAddrMask",
3528 g_variant_new("ay", type_builder));
3529 g_variant_builder_unref(type_builder);
3531 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
3532 for (i = 0; i < OEM_IPADDR_LEN; i++)
3533 g_variant_builder_add(type_builder, "y", ip_addr_start[i]);
3534 g_variant_builder_add(builder, "{sv}", "IpAddrStart",
3535 g_variant_new("ay", type_builder));
3536 g_variant_builder_unref(type_builder);
3538 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
3539 for (i = 0; i < OEM_IPADDR_LEN; i++)
3540 g_variant_builder_add(type_builder, "y", ip_addr_end[i]);
3541 g_variant_builder_add(builder, "{sv}", "IpAddrEnd",
3542 g_variant_new("ay", type_builder));
3543 g_variant_builder_unref(type_builder);
3544 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
3545 value = g_variant_new("a{sv}", builder);
3546 g_variant_builder_unref(builder);
3548 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
3550 params.params = param;
3551 #if defined(TIZEN_DEBUG_DBUS_VALUE)
3552 DEBUG_PARAMS(params.params);
3553 #endif /* TIZEN_DEBUG_DBUS_VALUE */
3555 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
3557 WDP_LOGE("Failed to send command to wpa_supplicant");
3559 WDP_LOGD("Succeeded to initialize p2pdevice");
3560 __WDP_LOG_FUNC_EXIT__;
3564 int __ws_set_config_methods()
3566 __WDP_LOG_FUNC_ENTER__;
3567 GDBusConnection *g_dbus = NULL;
3569 GVariant *value = NULL;
3570 GVariant *param = NULL;
3572 dbus_method_param_s params;
3576 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3580 g_dbus = g_pd->g_dbus;
3582 WDP_LOGE("DBus connection is NULL");
3585 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
3587 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
3590 value = g_variant_new_string(DEFAULT_CONFIG_METHOD);
3592 param = g_variant_new("(ssv)", SUPPLICANT_WPS, "ConfigMethods", value);
3593 params.params = param;
3595 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
3597 WDP_LOGE("Failed to send command to wpa_supplicant");
3599 WDP_LOGD("Succeeded to set config method(%s)", DEFAULT_CONFIG_METHOD);
3601 __WDP_LOG_FUNC_EXIT__;
3605 int ws_activate(int concurrent)
3607 __WDP_LOG_FUNC_ENTER__;
3609 int retry_count = 0;
3612 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3616 res = __ws_p2p_supplicant_start();
3618 res = __ws_p2p_supplicant_stop();
3619 WDP_LOGI("P2P supplicant stopped with error %d", res);
3620 __WDP_LOG_FUNC_EXIT__;
3623 #ifndef TIZEN_WIFI_MODULE_BUNDLE
3624 while (retry_count < WS_CONN_RETRY_COUNT) {
3625 /* load wlan driver */
3626 if (concurrent == 0)
3627 res = __ws_p2p_firmware_start();
3629 WDP_LOGE("Failed to load driver [ret=%d]", res);
3632 WDP_LOGI("P2P firmware started with error %d", res);
3634 if (__ws_check_net_interface(COMMON_IFACE_NAME) < 0) {
3635 usleep(150000); /* wait for 150ms */
3638 WDP_LOGE("interface is not up: retry, %d", retry_count);
3644 if (retry_count >= WS_CONN_RETRY_COUNT) {
3645 WDP_LOGE("Driver loading is failed", res);
3646 __WDP_LOG_FUNC_EXIT__;
3649 if (retry_count > 0) {
3650 /* Give driver marginal time to config net */
3651 WDP_LOGE("Driver loading is done. Wait marginal time for driver");
3655 g_pd->concurrent = concurrent;
3657 res = _ws_init_dbus_connection();
3659 res = __ws_p2p_supplicant_stop();
3660 WDP_LOGI("[/usr/sbin/p2p_supp.sh stop] returns %d", res);
3661 #ifndef TIZEN_WIFI_MODULE_BUNDLE
3662 res = __ws_p2p_firmware_stop();
3663 WDP_LOGI("P2P firmware stopped with error %d", res);
3665 __WDP_LOG_FUNC_EXIT__;
3669 g_pd->activated = TRUE;
3670 __ws_init_p2pdevice();
3671 __ws_set_config_methods();
3674 __WDP_LOG_FUNC_EXIT__;
3678 int ws_deactivate(int concurrent)
3680 __WDP_LOG_FUNC_ENTER__;
3681 #if defined(TIZEN_FEATURE_ASP)
3682 wfd_oem_asp_service_s *data = NULL;
3683 #endif /* TIZEN_FEATURE_ASP */
3687 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3691 if (!g_pd->activated) {
3692 WDP_LOGE("Wi-Fi Direct is not activated");
3698 g_pd->concurrent = concurrent;
3699 #if defined(TIZEN_MOBILE) && (TIZEN_WLAN_BOARD_SPRD)
3700 _ws_get_interface(P2P_IFACE_NAME, __ws_remove_interface, NULL);
3701 if (concurrent == 0)
3702 _ws_get_interface(COMMON_IFACE_NAME, __ws_remove_interface, NULL);
3703 #endif /* (TIZEN_MOBILE) && (TIZEN_WLAN_BOARD_SPRD) */
3705 _ws_deinit_dbus_connection();
3707 if (concurrent == 0) {
3708 res = __ws_p2p_supplicant_stop();
3709 WDP_LOGI("[/usr/sbin/p2p_supp.sh stop] returns %d", res);
3710 #ifndef TIZEN_WIFI_MODULE_BUNDLE
3711 res = __ws_p2p_firmware_stop();
3712 WDP_LOGI("P2P firmware stopped with error %d", res);
3715 g_pd->activated = FALSE;
3717 #if defined(TIZEN_FEATURE_ASP)
3718 GLIST_ITER_START(seek_list, data)
3721 temp = g_list_next(seek_list);
3722 seek_list = g_list_remove(seek_list, data);
3723 g_free(data->service_type);
3724 g_free(data->service_info);
3729 #endif /* TIZEN_FEATURE_ASP */
3730 __WDP_LOG_FUNC_EXIT__;
3735 static gboolean _retry_start_scan(gpointer data)
3737 __WDP_LOG_FUNC_ENTER__;
3739 WDP_LOGD("Succeeded to start scan");
3741 __WDP_LOG_FUNC_EXIT__;
3746 #if defined(TIZEN_FEATURE_ASP)
3747 static void __ws_add_seek_params(GVariantBuilder *builder)
3749 GVariantBuilder *outter = NULL;
3750 GVariantBuilder *inner = NULL;
3751 wfd_oem_asp_service_s *data = NULL;
3755 if (seek_list == NULL || g_list_length(seek_list) == 0) {
3756 WDP_LOGD("seek list is NULL");
3759 WDP_LOGD("seek list length [%d]", g_list_length(seek_list));
3761 outter = g_variant_builder_new(G_VARIANT_TYPE("aay"));
3763 GLIST_ITER_START(seek_list, data)
3764 if (data && data->service_type) {
3765 len = strlen(data->service_type) + 1;
3766 WDP_LOGD("data [%s] len [%d]", data->service_type, len);
3767 inner = g_variant_builder_new(G_VARIANT_TYPE("ay"));
3768 for (i = 0; i < len; i++)
3769 g_variant_builder_add(inner, "y", data->service_type[i]);
3770 g_variant_builder_add(outter, "ay", inner);
3771 g_variant_builder_unref(inner);
3774 g_variant_builder_add(builder, "{sv}", "Seek", g_variant_new("aay", outter));
3775 g_variant_builder_unref(outter);
3779 #endif /* TIZEN_FEATURE_ASP */
3782 int ws_start_scan(wfd_oem_scan_param_s *param)
3784 __WDP_LOG_FUNC_ENTER__;
3785 GDBusConnection *g_dbus = NULL;
3786 GVariantBuilder *builder = NULL;
3787 GVariant *value = NULL;
3788 dbus_method_param_s params;
3792 WDP_LOGE("Invalid parameter");
3797 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3801 g_dbus = g_pd->g_dbus;
3803 WDP_LOGE("DBus connection is NULL");
3806 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
3808 if (param->scan_mode == WFD_OEM_SCAN_MODE_ACTIVE) {
3810 dbus_set_method_param(¶ms, "Find", g_pd->iface_path, g_dbus);
3812 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
3814 if (param->scan_time)
3815 g_variant_builder_add(builder, "{sv}", "Timeout",
3816 g_variant_new_int32(param->scan_time));
3817 if (param->scan_type == WFD_OEM_SCAN_TYPE_SOCIAL)
3818 g_variant_builder_add(builder, "{sv}", "DiscoveryType",
3819 g_variant_new_string("social"));
3820 #if defined(TIZEN_FEATURE_ASP)
3821 if (seek_list != NULL)
3822 __ws_add_seek_params(builder);
3823 #endif /* TIZEN_FEATURE_ASP */
3825 value = g_variant_new("(a{sv})", builder);
3826 g_variant_builder_unref(builder);
3829 dbus_set_method_param(¶ms, "Listen", g_pd->iface_path, g_dbus);
3830 value = g_variant_new("(i)", param->scan_time);
3833 params.params = value;
3834 #if defined(TIZEN_DEBUG_DBUS_VALUE)
3835 DEBUG_PARAMS(params.params);
3836 #endif /* TIZEN_DEBUG_DBUS_VALUE */
3838 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
3840 WDP_LOGE("Failed to send command to wpa_supplicant");
3842 WDP_LOGD("Succeeded to start scan");
3844 __WDP_LOG_FUNC_EXIT__;
3848 int ws_restart_scan(int freq)
3850 __WDP_LOG_FUNC_ENTER__;
3851 GDBusConnection *g_dbus = NULL;
3852 GVariantBuilder *builder = NULL;
3853 GVariant *value = NULL;
3854 dbus_method_param_s params;
3858 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3862 g_dbus = g_pd->g_dbus;
3864 WDP_LOGE("DBus connection is NULL");
3867 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
3869 dbus_set_method_param(¶ms, "Find", g_pd->iface_path, g_dbus);
3871 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
3872 g_variant_builder_add(builder, "{sv}", "Timeout", g_variant_new_int32(2));
3873 g_variant_builder_add(builder, "{sv}", "DiscoveryType",
3874 g_variant_new_string("social"));
3875 value = g_variant_new("(a{sv})", builder);
3876 g_variant_builder_unref(builder);
3878 params.params = value;
3879 #if defined(TIZEN_DEBUG_DBUS_VALUE)
3880 DEBUG_PARAMS(params.params);
3881 #endif /* TIZEN_DEBUG_DBUS_VALUE */
3883 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
3885 WDP_LOGE("Failed to send command to wpa_supplicant");
3887 WDP_LOGD("Succeeded to start scan");
3889 __WDP_LOG_FUNC_EXIT__;
3895 __WDP_LOG_FUNC_ENTER__;
3896 GDBusConnection *g_dbus = NULL;
3897 dbus_method_param_s params;
3901 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3905 g_dbus = g_pd->g_dbus;
3907 WDP_LOGE("DBus connection is NULL");
3910 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
3912 dbus_set_method_param(¶ms, "StopFind", g_pd->iface_path, g_dbus);
3913 params.params = NULL;
3915 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
3917 WDP_LOGE("Failed to send command to wpa_supplicant");
3919 WDP_LOGD("Succeeded to stop scan");
3921 __WDP_LOG_FUNC_EXIT__;
3925 int ws_get_visibility(int *visibility)
3927 __WDP_LOG_FUNC_ENTER__;
3929 __WDP_LOG_FUNC_EXIT__;
3933 int ws_set_visibility(int visibility)
3935 __WDP_LOG_FUNC_ENTER__;
3937 __WDP_LOG_FUNC_EXIT__;
3941 int ws_get_scan_result(GList **peers, int *peer_count)
3943 __WDP_LOG_FUNC_ENTER__;
3945 __WDP_LOG_FUNC_EXIT__;
3949 int ws_get_peer_info(unsigned char *peer_addr, wfd_oem_device_s **peer)
3951 __WDP_LOG_FUNC_ENTER__;
3952 GDBusConnection *g_dbus = NULL;
3953 wfd_oem_device_s *ws_dev = NULL;
3954 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
3957 if (!peer_addr || !peer) {
3958 WDP_LOGE("Invalid parameter");
3963 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3967 g_dbus = g_pd->g_dbus;
3969 WDP_LOGE("DBus connection is NULL");
3973 ws_dev = (wfd_oem_device_s *) g_try_malloc0(sizeof(wfd_oem_device_s));
3975 WDP_LOGF("Failed to allocate memory device. [%s]",
3977 __WDP_LOG_FUNC_EXIT__;
3981 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
3982 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
3984 WDP_LOGD("get peer path [%s]", peer_path);
3986 res = dbus_property_get_all(peer_path, g_dbus, SUPPLICANT_P2P_PEER,
3987 __ws_get_peer_property, ws_dev);
3990 WDP_LOGE("Failed to send command to wpa_supplicant");
3992 __WDP_LOG_FUNC_EXIT__;
3995 WDP_LOGD("succeeded to get peer info");
3998 __WDP_LOG_FUNC_EXIT__;
4002 int ws_prov_disc_req(unsigned char *peer_addr, wfd_oem_wps_mode_e wps_mode, int join)
4004 __WDP_LOG_FUNC_ENTER__;
4005 GDBusConnection *g_dbus = NULL;
4006 GVariant *value = NULL;
4007 dbus_method_param_s params;
4008 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
4012 WDP_LOGE("Invalid parameter");
4013 __WDP_LOG_FUNC_EXIT__;
4018 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4019 __WDP_LOG_FUNC_EXIT__;
4023 g_dbus = g_pd->g_dbus;
4025 WDP_LOGE("DBus connection is NULL");
4026 __WDP_LOG_FUNC_EXIT__;
4029 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4031 dbus_set_method_param(¶ms, "ProvisionDiscoveryRequest", g_pd->iface_path, g_dbus);
4033 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4034 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4035 WDP_LOGD("get peer path [%s]", peer_path);
4037 value = g_variant_new("(os)", peer_path, __ws_wps_to_txt(wps_mode));
4039 params.params = value;
4040 #if defined(TIZEN_DEBUG_DBUS_VALUE)
4041 DEBUG_PARAMS(params.params);
4042 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4044 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4046 WDP_LOGE("Failed to send command to wpa_supplicant");
4048 WDP_LOGD("Succeeded to send prov disc to peer[" MACSTR "]", MAC2STR(peer_addr));
4050 __WDP_LOG_FUNC_EXIT__;
4054 int ws_connect(unsigned char *peer_addr, wfd_oem_conn_param_s *param)
4056 __WDP_LOG_FUNC_ENTER__;
4057 GDBusConnection *g_dbus = NULL;
4058 GVariantBuilder *builder = NULL;
4059 GVariant *value = NULL;
4060 dbus_method_param_s params;
4061 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
4064 if (!peer_addr || !param) {
4065 WDP_LOGE("Invalid parameter");
4066 __WDP_LOG_FUNC_EXIT__;
4071 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4072 __WDP_LOG_FUNC_EXIT__;
4076 g_dbus = g_pd->g_dbus;
4078 WDP_LOGE("DBus connection is NULL");
4079 __WDP_LOG_FUNC_EXIT__;
4082 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4084 dbus_set_method_param(¶ms, "Connect", g_pd->iface_path, g_dbus);
4086 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4087 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4088 WDP_LOGD("get peer path [%s]", peer_path);
4090 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4091 g_variant_builder_add(builder, "{sv}", "peer", g_variant_new_object_path(peer_path));
4092 if (param->conn_flags & WFD_OEM_CONN_TYPE_PERSISTENT)
4093 g_variant_builder_add(builder, "{sv}", "persistent", g_variant_new_boolean(TRUE));
4095 if (param->conn_flags & WFD_OEM_CONN_TYPE_JOIN)
4096 g_variant_builder_add(builder, "{sv}", "join", g_variant_new_boolean(TRUE));
4098 if (param->conn_flags & WFD_OEM_CONN_TYPE_AUTH)
4099 g_variant_builder_add(builder, "{sv}", "autorize_only", g_variant_new_boolean(TRUE));
4101 if (param->wps_pin[0] != '\0')
4102 g_variant_builder_add(builder, "{sv}", "pin", g_variant_new_string(param->wps_pin));
4104 g_variant_builder_add(builder, "{sv}", "wps_method",
4105 g_variant_new_string(__ws_wps_to_txt(param->wps_mode)));
4107 value = g_variant_new("(a{sv})", builder);
4108 g_variant_builder_unref(builder);
4110 params.params = value;
4111 #if defined(TIZEN_DEBUG_DBUS_VALUE)
4112 DEBUG_PARAMS(params.params);
4113 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4115 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4117 WDP_LOGE("Failed to send command to wpa_supplicant");
4119 WDP_LOGD("Succeeded to send connection command to peer[" MACSTR "]", MAC2STR(peer_addr));
4121 __WDP_LOG_FUNC_EXIT__;
4125 int ws_disconnect(unsigned char *peer_addr, int is_iface_addr)
4127 __WDP_LOG_FUNC_ENTER__;
4128 GDBusConnection *g_dbus = NULL;
4129 GVariant *value = NULL;
4130 dbus_method_param_s params;
4131 GVariantBuilder *builder = NULL;
4135 WDP_LOGE("Invalid parameter");
4140 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4144 g_dbus = g_pd->g_dbus;
4146 WDP_LOGE("DBus connection is NULL");
4149 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4151 dbus_set_method_param(¶ms, "RemoveClient", g_pd->iface_path, g_dbus);
4152 builder = g_variant_builder_new(G_VARIANT_TYPE ("a{sv}"));
4154 if (is_iface_addr) {
4155 char peer_mac_str[WS_MACSTR_LEN] = {'\0', };
4157 g_snprintf(peer_mac_str, WS_MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
4158 WDP_LOGI("peer addr [%s]", peer_mac_str);
4159 g_variant_builder_add(builder, "{sv}", "iface",
4160 g_variant_new_string(peer_mac_str));
4162 char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0', };
4164 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4165 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4166 g_variant_builder_add (builder, "{sv}", "peer",
4167 g_variant_new_object_path(peer_path));
4170 value = g_variant_new ("(a{sv})", builder);
4171 g_variant_builder_unref (builder);
4173 params.params = value;
4174 #if defined(TIZEN_DEBUG_DBUS_VALUE)
4175 DEBUG_PARAMS(params.params);
4176 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4178 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4180 WDP_LOGE("Failed to send command to wpa_supplicant");
4182 WDP_LOGD("Succeeded to send disconnection command to peer[" MACSECSTR "]",
4183 MAC2SECSTR(peer_addr));
4185 __WDP_LOG_FUNC_EXIT__;
4189 int ws_reject_connection(unsigned char *peer_addr)
4191 __WDP_LOG_FUNC_ENTER__;
4192 GDBusConnection *g_dbus = NULL;
4193 GVariant *value = NULL;
4194 dbus_method_param_s params;
4195 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
4199 WDP_LOGE("Invalid parameter");
4200 __WDP_LOG_FUNC_EXIT__;
4205 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4206 __WDP_LOG_FUNC_EXIT__;
4210 g_dbus = g_pd->g_dbus;
4212 WDP_LOGE("DBus connection is NULL");
4213 __WDP_LOG_FUNC_EXIT__;
4216 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4218 dbus_set_method_param(¶ms, "RejectPeer", g_pd->iface_path, g_dbus);
4220 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4221 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4222 WDP_LOGE("get peer path [%s]", peer_path);
4224 value = g_variant_new("(o)", peer_path);
4226 params.params = value;
4227 #if defined(TIZEN_DEBUG_DBUS_VALUE)
4228 DEBUG_PARAMS(params.params);
4229 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4231 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4233 WDP_LOGE("Failed to send command to wpa_supplicant");
4235 WDP_LOGD("Succeeded to reject peer[" MACSTR "]", MAC2STR(peer_addr));
4238 __WDP_LOG_FUNC_EXIT__;
4242 int ws_cancel_connection(unsigned char *peer_addr)
4244 __WDP_LOG_FUNC_ENTER__;
4248 __WDP_LOG_FUNC_EXIT__;
4252 int ws_get_connected_peers(GList **peers, int *peer_count)
4254 __WDP_LOG_FUNC_ENTER__;
4256 __WDP_LOG_FUNC_EXIT__;
4260 int ws_get_pin(char *pin)
4262 __WDP_LOG_FUNC_ENTER__;
4264 __WDP_LOG_FUNC_EXIT__;
4268 int ws_set_pin(char *pin)
4270 __WDP_LOG_FUNC_ENTER__;
4272 __WDP_LOG_FUNC_EXIT__;
4276 static void __ws_get_pin(GVariant *value, void *user_data)
4278 __WDP_LOG_FUNC_ENTER__;
4279 const char *pin = NULL;
4281 g_variant_get(value, "(&s)", &pin);
4282 g_strlcpy((char *)user_data, pin, OEM_PINSTR_LEN + 1);
4284 __WDP_LOG_FUNC_EXIT__;
4288 int ws_generate_pin(char **pin)
4290 __WDP_LOG_FUNC_ENTER__;
4291 GDBusConnection *g_dbus = NULL;
4292 dbus_method_param_s params;
4293 char n_pin[9] = {0,};
4297 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4301 g_dbus = g_pd->g_dbus;
4303 WDP_LOGE("DBus connection is NULL");
4306 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4308 dbus_set_method_param(¶ms, "GeneratePin", g_pd->iface_path, g_dbus);
4309 params.params = NULL;
4311 res = dbus_method_call(¶ms, SUPPLICANT_WPS, __ws_get_pin, (void *)n_pin);
4313 WDP_LOGE("Failed to send command to wpa_supplicant");
4315 WDP_LOGD("Succeeded to generate_pin [ %s ]", n_pin);
4317 *pin = strndup(n_pin, OEM_PINSTR_LEN);
4318 __WDP_LOG_FUNC_EXIT__;
4322 int ws_get_supported_wps_mode()
4324 __WDP_LOG_FUNC_ENTER__;
4326 __WDP_LOG_FUNC_EXIT__;
4330 int _ws_get_persistent_net_id(int *persistent_network_id, const unsigned char *go_dev_mac)
4332 __WDP_LOG_FUNC_ENTER__;
4333 int persistent_group_count = 0;
4337 wfd_oem_persistent_group_s *plist = NULL;
4339 res = ws_get_persistent_groups(&plist, &persistent_group_count);
4341 WDP_LOGE("failed to get persistent groups");
4342 __WDP_LOG_FUNC_EXIT__;
4346 if (persistent_group_count > WS_MAX_PERSISTENT_COUNT) {
4347 WDP_LOGE("persistent group count greater than max Persistent count");
4348 persistent_group_count = WS_MAX_PERSISTENT_COUNT;
4351 WDP_LOGD("Persistent Group Count=%d", persistent_group_count);
4353 for (counter = 0; counter < persistent_group_count ; counter++) {
4354 if (!memcmp(go_dev_mac, plist[counter].go_mac_address, WS_MACADDR_LEN)) {
4355 *persistent_network_id = plist[counter].network_id;
4358 WDP_LOGD("Invite: Persistent GO[" MACSTR "], GO Addr[" MACSTR "]",
4359 MAC2STR(plist[counter].go_mac_address), MAC2STR(go_dev_mac));
4365 WDP_LOGD("persistent network ID : [%d]", *persistent_network_id);
4367 __WDP_LOG_FUNC_EXIT__;
4371 static void __store_group_iface_path(GVariant* value, void* user_data)
4373 __WDP_LOG_FUNC_ENTER__;
4374 ws_dbus_plugin_data_s * pd_data;
4375 const char *path = NULL;
4378 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4382 pd_data = (ws_dbus_plugin_data_s *) g_pd;
4384 g_variant_get(value, "(&o)", &path);
4385 g_strlcpy(pd_data->group_iface_path, path, DBUS_OBJECT_PATH_MAX);
4387 WDP_LOGD("group object path [%s]", pd_data->group_iface_path);
4388 /* subscribe interface p2p signal */
4391 int ws_create_group(wfd_oem_group_param_s *param)
4393 __WDP_LOG_FUNC_ENTER__;
4394 GDBusConnection *g_dbus = NULL;
4395 GVariantBuilder *builder = NULL;
4396 GVariant *value = NULL;
4397 dbus_method_param_s params;
4398 char persistent_group_obj_path[OBJECT_PATH_MAX] = {0,};
4402 WDP_LOGE("Invalid parameter");
4403 __WDP_LOG_FUNC_EXIT__;
4408 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4409 __WDP_LOG_FUNC_EXIT__;
4413 g_dbus = g_pd->g_dbus;
4415 WDP_LOGE("DBus connection is NULL");
4416 __WDP_LOG_FUNC_EXIT__;
4419 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4421 dbus_set_method_param(¶ms, "GroupAdd", g_pd->iface_path, g_dbus);
4423 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4425 if (param->persistent > 0) {
4426 unsigned char mac_address[WS_MACADDR_LEN] = {0x00, };
4427 int persistent_group_id = -1;
4429 res = _ws_get_local_dev_mac(mac_address);
4431 WDP_LOGE("failed to get local mac address");
4432 __WDP_LOG_FUNC_EXIT__;
4436 res = _ws_get_persistent_net_id(&persistent_group_id, mac_address);
4438 WDP_LOGE("failed to get persistent group ID");
4439 __WDP_LOG_FUNC_EXIT__;
4443 WDP_LOGD("persistent network ID : [%d]", persistent_group_id);
4445 g_variant_builder_add(builder, "{sv}", "persistent",
4446 g_variant_new_boolean(TRUE));
4447 if (persistent_group_id > -1) {
4448 g_snprintf(persistent_group_obj_path, OBJECT_PATH_MAX,
4449 "%s/" SUPPLICANT_PERSISTENT_GROUPS_PART "/%d",
4450 g_pd->iface_path, persistent_group_id);
4451 g_variant_builder_add(builder, "{sv}", "persistent_group_object",
4452 g_variant_new_object_path(persistent_group_obj_path));
4456 g_variant_builder_add(builder, "{sv}", "persistent",
4457 g_variant_new_boolean(FALSE));
4460 if (param->passphrase && strlen(param->passphrase) > 0)
4461 g_variant_builder_add(builder, "{sv}", "passphrase",
4462 g_variant_new_string(param->passphrase));
4465 g_variant_builder_add(builder, "{sv}", "frequency",
4466 g_variant_new_int32(param->freq));
4468 value = g_variant_new("(a{sv})", builder);
4469 g_variant_builder_unref(builder);
4471 params.params = value;
4472 #if defined(TIZEN_DEBUG_DBUS_VALUE)
4473 DEBUG_PARAMS(params.params);
4474 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4476 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE,
4477 __store_group_iface_path, g_pd);
4479 WDP_LOGE("Failed to send command to wpa_supplicant");
4481 WDP_LOGD("Succeeded to add group");
4483 __WDP_LOG_FUNC_EXIT__;
4487 int ws_destroy_group(const char *ifname)
4489 __WDP_LOG_FUNC_ENTER__;
4490 GDBusConnection *g_dbus = NULL;
4491 dbus_method_param_s params;
4495 WDP_LOGE("Invalid parameter");
4500 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4504 g_dbus = g_pd->g_dbus;
4506 WDP_LOGE("DBus connection is NULL");
4510 if (g_pd->group_iface_path[0] == 0) {
4511 WDP_LOGE("group iface path is NULL");
4515 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4517 dbus_set_method_param(¶ms, "Disconnect", g_pd->group_iface_path, g_dbus);
4518 params.params = NULL;
4520 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4522 WDP_LOGE("Failed to send command to wpa_supplicant");
4523 __WDP_LOG_FUNC_EXIT__;
4527 WDP_LOGD("Succeeded to remove group");
4530 __WDP_LOG_FUNC_EXIT__;
4534 int ws_invite(unsigned char *peer_addr, wfd_oem_invite_param_s *param)
4536 __WDP_LOG_FUNC_ENTER__;
4537 GDBusConnection *g_dbus = NULL;
4538 GVariantBuilder *builder = NULL;
4539 GVariant *value = NULL;
4540 dbus_method_param_s params;
4541 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
4544 if (!peer_addr || !param) {
4545 WDP_LOGE("Invalid parameter");
4550 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4554 g_dbus = g_pd->g_dbus;
4556 WDP_LOGE("DBus connection is NULL");
4559 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4561 dbus_set_method_param(¶ms, "Invite", g_pd->group_iface_path, g_dbus);
4563 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4564 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4565 WDP_LOGE("get peer path [%s]", peer_path);
4567 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4568 g_variant_builder_add(builder, "{sv}", "peer", g_variant_new_object_path(peer_path));
4569 value = g_variant_new("(a{sv})", builder);
4570 g_variant_builder_unref(builder);
4572 params.params = value;
4573 #if defined(TIZEN_DEBUG_DBUS_VALUE)
4574 DEBUG_PARAMS(params.params);
4575 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4577 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4579 WDP_LOGE("Failed to send command to wpa_supplicant");
4581 WDP_LOGD("Succeeded to invite peer[" MACSTR "]", MAC2STR(peer_addr));
4583 __WDP_LOG_FUNC_EXIT__;
4587 /* Only group owner can use this command */
4588 int ws_wps_start(unsigned char *peer_addr, int wps_mode, const char *pin)
4590 __WDP_LOG_FUNC_ENTER__;
4591 GDBusConnection *g_dbus = NULL;
4592 GVariantBuilder *builder = NULL;
4593 GVariant *value = NULL;
4594 GVariant *dev_addr = NULL;
4595 dbus_method_param_s params;
4600 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4604 g_dbus = g_pd->g_dbus;
4606 WDP_LOGE("DBus connection is NULL");
4610 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4612 dbus_set_method_param(¶ms, "Start", g_pd->group_iface_path, g_dbus);
4614 if (peer_addr != NULL) {
4615 builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
4616 for (i = 0; i < WS_MACADDR_LEN; i++)
4617 g_variant_builder_add(builder, "y", peer_addr[i]);
4619 dev_addr = g_variant_new("ay", builder);
4620 g_variant_builder_unref(builder);
4623 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4624 g_variant_builder_add(builder, "{sv}", "Role", g_variant_new_string("enrollee"));
4625 if (peer_addr != NULL)
4626 g_variant_builder_add(builder, "{sv}", "P2PDeviceAddress", dev_addr);
4628 if (pin != NULL && pin[0] != '\0') {
4629 g_variant_builder_add(builder, "{sv}", "Type", g_variant_new_string("pin"));
4630 g_variant_builder_add(builder, "{sv}", "Pin", g_variant_new_string(pin));
4632 g_variant_builder_add(builder, "{sv}", "Type", g_variant_new_string("pbc"));
4635 value = g_variant_new("(a{sv})", builder);
4636 g_variant_builder_unref(builder);
4638 params.params = value;
4639 #if defined(TIZEN_DEBUG_DBUS_VALUE)
4640 DEBUG_PARAMS(params.params);
4641 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4643 res = dbus_method_call(¶ms, SUPPLICANT_WPS, NULL, NULL);
4645 WDP_LOGE("Failed to send command to wpa_supplicant");
4647 WDP_LOGD("Succeeded to run wps");
4649 __WDP_LOG_FUNC_EXIT__;
4653 int ws_enrollee_start(unsigned char *peer_addr, int wps_mode, const char *pin)
4655 __WDP_LOG_FUNC_ENTER__;
4657 WDP_LOGD("Succeeded to start WPS");
4659 __WDP_LOG_FUNC_EXIT__;
4665 __WDP_LOG_FUNC_ENTER__;
4666 GDBusConnection *g_dbus = NULL;
4667 dbus_method_param_s params;
4670 g_dbus = g_pd->g_dbus;
4672 WDP_LOGE("DBus connection is NULL");
4675 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4677 dbus_set_method_param(¶ms, "Cancel", g_pd->group_iface_path, g_dbus);
4678 params.params = NULL;
4680 res = dbus_method_call(¶ms, SUPPLICANT_WPS, NULL, NULL);
4682 WDP_LOGE("Failed to send command to wpa_supplicant");
4684 WDP_LOGD("Succeeded to cancel WPS");
4686 __WDP_LOG_FUNC_EXIT__;
4690 int ws_get_dev_name(char *dev_name)
4692 __WDP_LOG_FUNC_ENTER__;
4694 __WDP_LOG_FUNC_EXIT__;
4698 int ws_set_dev_name(char *dev_name)
4700 __WDP_LOG_FUNC_ENTER__;
4701 GDBusConnection *g_dbus = NULL;
4703 GVariant *value = NULL;
4704 GVariant *param = NULL;
4705 GVariantBuilder *builder = NULL;
4706 dbus_method_param_s params;
4710 WDP_LOGE("Invalid parameter");
4715 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4719 g_dbus = g_pd->g_dbus;
4721 WDP_LOGE("DBus connection is NULL");
4724 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4726 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
4729 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4730 g_variant_builder_add(builder, "{sv}", "DeviceName",
4731 g_variant_new_string(dev_name));
4732 g_variant_builder_add(builder, "{sv}", "SsidPostfix",
4733 g_variant_new_string(dev_name));
4734 value = g_variant_new("a{sv}", builder);
4735 g_variant_builder_unref(builder);
4737 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE,
4738 "P2PDeviceConfig", value);
4740 params.params = param;
4741 #if defined(TIZEN_DEBUG_DBUS_VALUE)
4742 DEBUG_PARAMS(params.params);
4743 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4745 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
4747 WDP_LOGE("Failed to send command to wpa_supplicant");
4749 WDP_LOGD("Succeeded to set device name");
4751 __WDP_LOG_FUNC_EXIT__;
4755 int ws_get_dev_mac(char *dev_mac)
4757 __WDP_LOG_FUNC_ENTER__;
4759 __WDP_LOG_FUNC_EXIT__;
4763 int ws_get_dev_type(int *pri_dev_type, int *sec_dev_type)
4765 __WDP_LOG_FUNC_ENTER__;
4767 __WDP_LOG_FUNC_EXIT__;
4771 int ws_set_dev_type(int pri_dev_type, int sec_dev_type)
4773 __WDP_LOG_FUNC_ENTER__;
4775 __WDP_LOG_FUNC_EXIT__;
4779 int ws_get_go_intent(int *go_intent)
4781 __WDP_LOG_FUNC_ENTER__;
4782 GDBusConnection *g_dbus = NULL;
4783 GVariant *param = NULL;
4784 GVariant *reply = NULL;
4785 GError *error = NULL;
4786 GVariantIter *iter = NULL;
4790 WDP_LOGE("Invalid parameter");
4795 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4799 g_dbus = g_pd->g_dbus;
4801 WDP_LOGE("DBus connection is NULL");
4805 param = g_variant_new("(ss)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig");
4806 #if defined(TIZEN_DEBUG_DBUS_VALUE)
4807 DEBUG_PARAMS(param);
4808 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4810 reply = g_dbus_connection_call_sync(
4812 SUPPLICANT_SERVICE, /* bus name */
4813 g_pd->iface_path, /* object path */
4814 DBUS_PROPERTIES_INTERFACE, /* interface name */
4815 DBUS_PROPERTIES_METHOD_GET, /* method name */
4816 param, /* GVariant *params */
4817 NULL, /* reply_type */
4818 G_DBUS_CALL_FLAGS_NONE, /* flags */
4819 SUPPLICANT_TIMEOUT , /* timeout */
4820 NULL, /* cancellable */
4821 &error); /* error */
4823 if (error != NULL) {
4824 WDP_LOGE("Error! Failed to get interface State: [%s]",
4826 g_error_free(error);
4828 g_variant_unref(reply);
4829 __WDP_LOG_FUNC_EXIT__;
4833 if (reply != NULL) {
4834 g_variant_get(reply, "(a{sv})", &iter);
4838 GVariant *value = NULL;
4840 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
4841 #if defined(TIZEN_DEBUG_DBUS_VALUE)
4842 CHECK_KEY_VALUE(key, value);
4843 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4844 if (g_strcmp0(key, "GOIntent") == 0)
4845 g_variant_get(value, "u", go_intent);
4847 g_variant_iter_free(iter);
4849 g_variant_unref(reply);
4851 __WDP_LOG_FUNC_EXIT__;
4855 int ws_set_go_intent(int go_intent)
4857 __WDP_LOG_FUNC_ENTER__;
4858 GDBusConnection *g_dbus = NULL;
4860 GVariant *value = NULL;
4861 GVariant *param = NULL;
4862 GVariantBuilder *builder = NULL;
4863 dbus_method_param_s params;
4867 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4871 g_dbus = g_pd->g_dbus;
4873 WDP_LOGE("DBus connection is NULL");
4876 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4878 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
4881 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4882 g_variant_builder_add(builder, "{sv}", "GOIntent",
4883 g_variant_new_uint32(go_intent));
4884 value = g_variant_new("a{sv}", builder);
4885 g_variant_builder_unref(builder);
4887 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
4889 params.params = param;
4890 #if defined(TIZEN_DEBUG_DBUS_VALUE)
4891 DEBUG_PARAMS(params.params);
4892 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4894 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
4896 WDP_LOGE("Failed to send command to wpa_supplicant");
4898 WDP_LOGE("Succeeded to set go intent");
4899 __WDP_LOG_FUNC_EXIT__;
4903 int ws_set_country(char *ccode)
4905 __WDP_LOG_FUNC_ENTER__;
4906 __WDP_LOG_FUNC_ENTER__;
4907 GDBusConnection *g_dbus = NULL;
4909 GVariant *value = NULL;
4910 GVariant *param = NULL;
4912 dbus_method_param_s params;
4916 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4920 g_dbus = g_pd->g_dbus;
4922 WDP_LOGE("DBus connection is NULL");
4925 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4927 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
4930 value = g_variant_new_string(ccode);
4932 param = g_variant_new("(ssv)", SUPPLICANT_IFACE, "Country", value);
4934 params.params = param;
4935 #if defined(TIZEN_DEBUG_DBUS_VALUE)
4936 DEBUG_PARAMS(params.params);
4937 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4939 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
4941 WDP_LOGE("Failed to send command to wpa_supplicant");
4943 WDP_LOGD("Succeeded to set country(%s)", ccode);
4945 __WDP_LOG_FUNC_EXIT__;
4949 void __parsing_networks(const char* key, GVariant* value, void* user_data)
4951 __WDP_LOG_FUNC_ENTER__;
4953 __WDP_LOG_FUNC_EXIT__;
4957 ws_network_info_s *network = (ws_network_info_s *)user_data;
4958 #if defined(TIZEN_DEBUG_DBUS_VALUE)
4959 CHECK_KEY_VALUE(key, value);
4960 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4961 if (g_strcmp0(key, "ssid") == 0) {
4962 const char *ssid = NULL;
4963 g_variant_get(value, "&s", &ssid);
4964 WDP_LOGD("ssid [%s]", ssid);
4965 g_strlcpy(network->ssid, ssid + 1, WS_SSID_LEN + 1);
4966 network->ssid[strlen(ssid) - 2] = '\0';
4968 } else if (g_strcmp0(key, "bssid") == 0) {
4969 unsigned char *bssid = NULL;
4970 g_variant_get(value, "&s", &bssid);
4971 WDP_LOGD("bssid [%s]", bssid);
4972 __ws_txt_to_mac(bssid, network->bssid);
4974 } else if (g_strcmp0(key, "proto") == 0) {
4975 const char *proto = NULL;
4976 g_variant_get(value, "&s", &proto);
4977 WDP_LOGD("proto [%s]", proto);
4979 if (g_strrstr(proto, WFD_OEM_STR_PROTO_WPA) != NULL)
4980 network->proto |= WFD_OEM_PROTO_WPA;
4981 if (g_strrstr(proto, WFD_OEM_STR_PROTO_RSN) != NULL)
4982 network->proto |= WFD_OEM_PROTO_RSN;
4984 } else if (g_strcmp0(key, "key_mgmt") == 0) {
4985 const char *key_mgmt = NULL;
4986 g_variant_get(value, "&s", &key_mgmt);
4987 WDP_LOGD("key_mgmt [%s]", key_mgmt);
4989 if (g_strrstr(key_mgmt, WFD_OEM_STR_KEY_MGMT_IEEE8021X) != NULL)
4990 network->key_mgmt |= WFD_OEM_KEY_MGMT_IEEE8021X;
4991 if (g_strrstr(key_mgmt, WFD_OEM_STR_KEY_MGMT_PSK) != NULL)
4992 network->key_mgmt |= WFD_OEM_KEY_MGMT_PSK;
4993 if (g_strrstr(key_mgmt, WFD_OEM_STR_KEY_MGMT_NONE) != NULL)
4994 network->key_mgmt |= WFD_OEM_KEY_MGMT_NONE;
4996 } else if (g_strcmp0(key, "pairwise") == 0) {
4997 const char *pairwise = NULL;
4998 g_variant_get(value, "&s", &pairwise);
4999 WDP_LOGD("pairwise [%s]", pairwise);
5001 if (g_strrstr(pairwise, WFD_OEM_STR_CIPHER_NONE) != NULL)
5002 network->pairwise |= WFD_OEM_CIPHER_NONE;
5003 if (g_strrstr(pairwise, WFD_OEM_STR_CIPHER_TKIP) != NULL)
5004 network->pairwise |= WFD_OEM_CIPHER_TKIP;
5005 if (g_strrstr(pairwise, WFD_OEM_STR_CIPHER_CCMP) != NULL)
5006 network->pairwise |= WFD_OEM_CIPHER_CCMP;
5008 } else if (g_strcmp0(key, "group") == 0) {
5009 const char *group = NULL;
5010 g_variant_get(value, "&s", &group);
5011 WDP_LOGD("group [%s]", group);
5013 if (g_strrstr(group, WFD_OEM_STR_CIPHER_NONE) != NULL)
5014 network->group |= WFD_OEM_CIPHER_NONE;
5015 if (g_strrstr(group, WFD_OEM_STR_CIPHER_WEP40) != NULL)
5016 network->group |= WFD_OEM_CIPHER_WEP40;
5017 if (g_strrstr(group, WFD_OEM_STR_CIPHER_WEP104) != NULL)
5018 network->group |= WFD_OEM_CIPHER_WEP104;
5019 if (g_strrstr(group, WFD_OEM_STR_CIPHER_TKIP) != NULL)
5020 network->group |= WFD_OEM_CIPHER_TKIP;
5021 if (g_strrstr(group, WFD_OEM_STR_CIPHER_CCMP) != NULL)
5022 network->group |= WFD_OEM_CIPHER_CCMP;
5024 } else if (g_strcmp0(key, "auth_alg") == 0) {
5025 const char *auth_alg = NULL;
5026 g_variant_get(value, "&s", &auth_alg);
5027 WDP_LOGD("auth_alg [%s]", auth_alg);
5029 if (g_strrstr(auth_alg, WFD_OEM_STR_AUTH_ALG_OPEN) != NULL)
5030 network->auth_alg |= WFD_OEM_AUTH_ALG_OPEN;
5032 } else if (g_strcmp0(key, "mode") == 0) {
5033 const char *mode = NULL;
5034 g_variant_get(value, "&s", &mode);
5035 WDP_LOGD("mode [%s]", mode);
5037 if (g_strrstr(mode, WFD_OEM_STR_MODE_GC) != NULL)
5038 network->mode |= WFD_OEM_PERSISTENT_MODE_GC;
5039 if (g_strrstr(mode, WFD_OEM_STR_MODE_GO) != NULL)
5040 network->mode |= WFD_OEM_PERSISTENT_MODE_GO;
5042 } else if (g_strcmp0(key, "p2p_client_list") == 0) {
5043 const char *p2p_client_list = NULL;
5048 g_variant_get(value, "&s", &p2p_client_list);
5049 WDP_LOGD("p2p_client_list [%s]", p2p_client_list);
5050 ptr = (char *)p2p_client_list;
5051 list_len = strlen(p2p_client_list);
5052 WDP_LOGD("list_len [%d]", list_len);
5053 while (ptr && list_len >= (OEM_MACSTR_LEN - 1)) {
5054 __ws_txt_to_mac((unsigned char *)ptr, (network->p2p_client_list[num]));
5055 ptr += OEM_MACSTR_LEN;
5056 list_len -= OEM_MACSTR_LEN;
5057 if (ptr && ptr[0] == ' ') {
5062 if (num >= OEM_MAX_PEER_NUM)
5065 network->p2p_client_num = num;
5066 WDP_LOGD("p2p_client_num [%d]", network->p2p_client_num);
5071 void __ws_extract_p2pdevice_details(const char *key, GVariant *value, void *user_data)
5073 __WDP_LOG_FUNC_ENTER__;
5074 #if defined(TIZEN_DEBUG_DBUS_VALUE)
5075 CHECK_KEY_VALUE(key, value);
5076 #endif /* TIZEN_DEBUG_DBUS_VALUE */
5077 if (g_strcmp0(key, "PersistentGroups") == 0) {
5078 GVariantIter *iter = NULL;
5079 const char *path = NULL;
5082 ws_network_info_s *networks = NULL;
5083 networks = (ws_network_info_s *)user_data;
5085 WDP_LOGE("network is NULL");
5086 __WDP_LOG_FUNC_EXIT__;
5090 g_variant_get(value, "ao", &iter);
5091 while (g_variant_iter_loop(iter, "&o", &path)) {
5094 if (num >= WS_MAX_PERSISTENT_COUNT)
5097 WDP_LOGD("Retrive persistent path [%s]", path);
5098 g_strlcpy(networks[num].persistent_path, path, DBUS_OBJECT_PATH_MAX);
5100 loc = strrchr(networks[num].persistent_path, '/');
5101 networks[num].network_id = strtoul(loc+1, NULL, 10);
5103 WDP_LOGD("Retrive persistent path [%s]", networks[num].persistent_path);
5104 dbus_property_get_all(networks[num].persistent_path, g_pd->g_dbus,
5105 SUPPLICANT_P2P_PERSISTENTGROUP, __parsing_networks, &networks[num]);
5109 networks[0].total = num;
5110 WDP_LOGI("total number [%d]", num);
5111 g_variant_iter_free(iter);
5113 __WDP_LOG_FUNC_EXIT__;
5117 int ws_get_persistent_groups(wfd_oem_persistent_group_s **groups, int *group_count)
5119 __WDP_LOG_FUNC_ENTER__;
5120 GDBusConnection *g_dbus = NULL;
5122 ws_network_info_s networks[WS_MAX_PERSISTENT_COUNT];
5123 wfd_oem_persistent_group_s *wfd_persistent_groups = NULL;
5127 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5128 __WDP_LOG_FUNC_EXIT__;
5132 g_dbus = g_pd->g_dbus;
5134 WDP_LOGE("DBus connection is NULL");
5135 __WDP_LOG_FUNC_EXIT__;
5139 memset(&networks, 0x0, WS_MAX_PERSISTENT_COUNT * sizeof(ws_network_info_s));
5140 dbus_property_get_all(g_pd->iface_path, g_dbus, SUPPLICANT_P2PDEVICE,
5141 __ws_extract_p2pdevice_details, &networks[0]);
5143 cnt = networks[0].total;
5145 WDP_LOGD("Persistent Group Count=%d", cnt);
5146 if (cnt > WS_MAX_PERSISTENT_COUNT) {
5147 WDP_LOGE("Persistent group count exceeded or parsing error");
5148 __WDP_LOG_FUNC_EXIT__;
5153 WDP_LOGE("Persistent group count zero");
5156 __WDP_LOG_FUNC_EXIT__;
5160 wfd_persistent_groups = (wfd_oem_persistent_group_s *) g_try_malloc0(cnt * sizeof(wfd_oem_persistent_group_s));
5161 if (wfd_persistent_groups == NULL) {
5162 WDP_LOGE("Failed to allocate memory for wfd_persistent_groups ");
5163 __WDP_LOG_FUNC_EXIT__;
5167 for (i = 0; i < cnt; i++) {
5170 WDP_LOGD("----persistent group [%d]----", i);
5171 WDP_LOGD("network_id [%d]", networks[i].network_id);
5172 WDP_LOGD("ssid [%s]", networks[i].ssid);
5173 WDP_LOGD("bssid ["MACSTR"]", MAC2STR(networks[i].bssid));
5174 WDP_LOGD("p2p_client_num [%d]", networks[i].p2p_client_num);
5175 for (j = 0; j < networks[i].p2p_client_num; j++)
5176 WDP_LOGD("p2p_client_list ["MACSTR"]", MAC2STR(networks[i].p2p_client_list[j]));
5178 wfd_persistent_groups[i].network_id = networks[i].network_id;
5179 g_strlcpy(wfd_persistent_groups[i].ssid, networks[i].ssid, WS_SSID_LEN + 1);
5180 memcpy(wfd_persistent_groups[i].go_mac_address, networks[i].bssid, WS_MACADDR_LEN);
5181 wfd_persistent_groups[i].p2p_client_num = networks[i].p2p_client_num;
5182 if (wfd_persistent_groups[i].p2p_client_num > 0)
5183 memcpy(wfd_persistent_groups[i].p2p_client_list, networks[i].p2p_client_list,
5184 OEM_MACADDR_LEN * OEM_MAX_PEER_NUM * sizeof(char));
5188 *groups = wfd_persistent_groups;
5190 __WDP_LOG_FUNC_EXIT__;
5194 int ws_remove_persistent_group(char *ssid, unsigned char *bssid)
5196 __WDP_LOG_FUNC_ENTER__;
5197 GDBusConnection *g_dbus = NULL;
5199 dbus_method_param_s params;
5200 ws_network_info_s networks[WS_MAX_PERSISTENT_COUNT];
5205 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5206 __WDP_LOG_FUNC_EXIT__;
5210 g_dbus = g_pd->g_dbus;
5212 WDP_LOGE("DBus connection is NULL");
5213 __WDP_LOG_FUNC_EXIT__;
5216 dbus_property_get_all(g_pd->iface_path, g_dbus, SUPPLICANT_P2PDEVICE,
5217 __ws_extract_p2pdevice_details, networks);
5219 cnt = networks[0].total;
5221 WDP_LOGD("Persistent Group Count=%d", cnt);
5222 if (cnt > WS_MAX_PERSISTENT_COUNT) {
5223 WDP_LOGE("Persistent group count exceeded or parsing error");
5224 __WDP_LOG_FUNC_EXIT__;
5228 for (i = 0; i < cnt; i++) {
5231 WDP_LOGD("----persistent group [%d]----", i);
5232 WDP_LOGD("network_id [%d]", networks[i].network_id);
5233 WDP_LOGD("network ssid [%s]", networks[i].ssid);
5234 WDP_LOGD("network bssid ["MACSTR"]", MAC2STR(networks[i].bssid));
5235 WDP_LOGD("network p2p_client_num [%d]", networks[i].p2p_client_num);
5236 for (j = 0; j < networks[i].p2p_client_num; j++)
5237 WDP_LOGD("network p2p_client_list ["MACSTR"]",
5238 MAC2STR(networks[i].p2p_client_list[j]));
5240 WDP_LOGD("ssid [%s]", ssid);
5241 WDP_LOGD("bssid ["MACSTR"]", MAC2STR(bssid));
5243 if (!g_strcmp0(ssid, networks[i].ssid) &&
5244 !memcmp(bssid, networks[i].bssid, WS_MACADDR_LEN)) {
5245 WDP_LOGD("Persistent group owner found [%d: %s]",
5246 networks[i].network_id, ssid);
5248 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5249 dbus_set_method_param(¶ms, "RemovePersistentGroup",
5250 g_pd->iface_path, g_dbus);
5251 params.params = g_variant_new("(o)", networks[i].persistent_path);
5252 #if defined(TIZEN_DEBUG_DBUS_VALUE)
5253 DEBUG_PARAMS(params.params);
5254 #endif /* TIZEN_DEBUG_DBUS_VALUE */
5256 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
5258 WDP_LOGE("Failed to send command to wpa_supplicant");
5259 __WDP_LOG_FUNC_EXIT__;
5263 WDP_LOGD("Succeeded to remove persistent group");;
5269 WDP_LOGE("Persistent group not found [%s]", ssid);
5273 __WDP_LOG_FUNC_EXIT__;
5277 int ws_set_persistent_reconnect(unsigned char *bssid, int reconnect)
5279 __WDP_LOG_FUNC_ENTER__;
5280 GDBusConnection *g_dbus = NULL;
5282 GVariant *value = NULL;
5283 GVariant *param = NULL;
5284 GVariantBuilder *builder = NULL;
5285 dbus_method_param_s params;
5289 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5293 g_dbus = g_pd->g_dbus;
5295 WDP_LOGE("DBus connection is NULL");
5298 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5300 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
5303 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
5304 g_variant_builder_add(builder, "{sv}", "PersistentReconnect",
5305 g_variant_new_boolean(reconnect));
5306 value = g_variant_new("a{sv}", builder);
5307 g_variant_builder_unref(builder);
5309 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
5311 params.params = param;
5312 #if defined(TIZEN_DEBUG_DBUS_VALUE)
5313 DEBUG_PARAMS(params.params);
5314 #endif /* TIZEN_DEBUG_DBUS_VALUE */
5316 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
5318 WDP_LOGE("Failed to send command to wpa_supplicant");
5320 WDP_LOGD("Succeeded to set persistent reconnect");
5322 __WDP_LOG_FUNC_EXIT__;
5326 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
5327 static int __ws_compress_query(char *compressed, char *query, int qtype)
5335 token = strtok_r(query, ".", &temp);
5337 if (!strcmp(token, "local")) {
5338 WDP_LOGD("Query conversion done");
5341 } else if (!strncmp(token, "_tcp", 4)) {
5342 memcpy(&compressed[length], WS_TCP_PTR_HEX, 2);
5345 } else if (!strncmp(token, "_udp", 4)) {
5346 memcpy(&compressed[length], WS_UDP_PTR_HEX, 2);
5350 WDP_LOGD("Token: [%s]", token);
5351 token_len = strlen(token);
5352 compressed[length] = token_len;
5355 memcpy(&compressed[length], token, token_len);
5356 length += token_len;
5359 token = strtok_r(NULL, ".", &temp);
5361 if (qtype == WS_QTYPE_PTR || token_num == 2)
5362 memcpy(&compressed[length], WS_PTR_TYPE_HEX, 3);
5363 else if (qtype == WS_QTYPE_TXT || token_num == 3)
5364 memcpy(&compressed[length], WS_TXT_TYPE_HEX, 3);
5367 WDP_LOGD("converted query length [%d] token num [%d]", length, token_num);
5372 static int __ws_compress_rdata(char *compressed, char *rdata, int qtype)
5379 if (qtype == WS_QTYPE_PTR) {
5381 token = strtok_r(rdata, ".", &temp);
5383 WDP_LOGD("Token: %s", token);
5384 token_len = strlen(token);
5385 compressed[length] = token_len;
5388 memcpy(&compressed[length], token, token_len);
5389 length += token_len;
5392 compressed[length] = 0xc0;
5393 compressed[length+1] = 0x27;
5396 } else if (qtype == WS_QTYPE_TXT) {
5398 token = strtok_r(rdata, ", ", &temp);
5401 WDP_LOGD("Token: [%s]", token);
5403 token_len = strlen(token);
5404 compressed[length] = token_len;
5407 memcpy(&compressed[length], token, token_len);
5408 length += token_len;
5410 token = strtok_r(NULL, ", ", &temp);
5413 WDP_LOGD("RDATA is NULL");
5418 int _convert_bonjour_to_args(char *query, char *rdata, GVariantBuilder *builder)
5420 GVariantBuilder *args = NULL;
5421 char compressed[256] = {0, };
5427 if (!query || !builder) {
5428 WDP_LOGE("Invalid parameter");
5431 if (!rdata || !strlen(rdata)) {
5432 WDP_LOGD("RDATA is NULL\n");
5434 temp = strstr(rdata, query);
5436 if (temp != NULL && temp - rdata > 0)
5437 qtype = WS_QTYPE_PTR;
5439 qtype = WS_QTYPE_TXT;
5443 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("bonjour"));
5445 /* compress query */
5446 length = __ws_compress_query(compressed, query, qtype);
5448 args = g_variant_builder_new(G_VARIANT_TYPE("ay"));
5449 for (i = 0; i < length; i++)
5450 g_variant_builder_add(args, "y", compressed[i]);
5451 g_variant_builder_add(builder, "{sv}", "query", g_variant_new("ay", args));
5452 g_variant_builder_unref(args);
5454 memset(compressed, 0x0, 256);
5459 length = __ws_compress_rdata(compressed, rdata, qtype);
5461 args = g_variant_builder_new(G_VARIANT_TYPE("ay"));
5462 for (i = 0; i < length; i++)
5463 g_variant_builder_add(args, "y", compressed[i]);
5464 g_variant_builder_add(builder, "{sv}", "response", g_variant_new("ay", args));
5465 g_variant_builder_unref(args);
5471 int _check_service_query_exists(wfd_oem_service_s *service)
5474 wfd_oem_service_s *data = NULL;
5476 for (count = 0; count < g_list_length(service_list); count++) {
5477 data = (wfd_oem_service_s*) g_list_nth_data(service_list, count);
5478 if (strncmp(service->query_id, data->query_id, OEM_QUERY_ID_LEN) == 0) {
5479 WDP_LOGD("Query already exists");
5486 static wfd_oem_service_s* _remove_service_query(char * s_type, char *mac_str, char *query_id)
5488 if (NULL == s_type || NULL == mac_str || NULL == query_id)
5492 wfd_oem_service_s *data = NULL;
5494 for (count = 0; count < g_list_length(service_list); count++) {
5495 data = (wfd_oem_service_s*) g_list_nth_data(service_list, count);
5496 if (data && !strncmp(data->service_type, s_type, SERVICE_TYPE_LEN) &&
5497 memcmp(data->dev_addr, mac_str, OEM_MACSTR_LEN - 1) == 0) {
5498 strncpy(query_id, data->query_id, OEM_QUERY_ID_LEN);
5502 if (strlen(query_id) <= 0) {
5503 WDP_LOGD("!! Query ID not found !!");
5507 WDP_LOGD("query id :[0x%s]", query_id);
5512 void __add_service_query(GVariant *value, void *mac_addr)
5514 __WDP_LOG_FUNC_ENTER__;
5515 wfd_oem_service_s *service = NULL;
5517 long long unsigned ref = 0;
5518 unsigned char *mac_address = (unsigned char *)mac_addr;
5519 char mac_str[18] = {0, };
5523 g_variant_get(value, "(t)", &ref);
5525 service = (wfd_oem_service_s*) g_try_malloc0(sizeof(wfd_oem_service_s));
5527 WDP_LOGE("Failed to allocate memory for service");
5531 if (mac_address[0] == 0 && mac_address[1] == 0 && mac_address[2] == 0 &&
5532 mac_address[3] == 0 && mac_address[4] == 0 && mac_address[5] == 0) {
5533 g_snprintf(mac_str, WS_MACSTR_LEN , "%s", SERV_BROADCAST_ADDRESS);
5535 g_snprintf(mac_str, WS_MACSTR_LEN, MACSTR, MAC2STR(mac_address));
5538 g_strlcpy(service->dev_addr, mac_str, OEM_MACSTR_LEN);
5539 g_snprintf(service->query_id, OEM_QUERY_ID_LEN + 1, "0x%llx", ref);
5541 res = _check_service_query_exists(service);
5545 service_list = g_list_append(service_list, service);
5547 __WDP_LOG_FUNC_EXIT__;
5552 /* for now, supplicant dbus interface only provides upnp service fully */
5553 int ws_start_service_discovery(unsigned char *mac_addr, int service_type)
5555 __WDP_LOG_FUNC_ENTER__;
5556 GDBusConnection *g_dbus = NULL;
5557 GVariantBuilder *builder = NULL;
5558 GVariant *value = NULL;
5559 dbus_method_param_s params;
5560 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
5565 WDP_LOGE("Invalid parameter");
5566 __WDP_LOG_FUNC_EXIT__;
5571 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5572 __WDP_LOG_FUNC_EXIT__;
5576 g_dbus = g_pd->g_dbus;
5578 WDP_LOGE("DBus connection is NULL");
5579 __WDP_LOG_FUNC_EXIT__;
5582 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5584 dbus_set_method_param(¶ms, "ServiceDiscoveryRequest", g_pd->iface_path, g_dbus);
5586 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
5589 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
5590 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(mac_addr));
5591 WDP_LOGD("get peer path [%s]", peer_path);
5592 g_variant_builder_add(builder, "{sv}", "peer", g_variant_new_object_path(peer_path));
5595 if (service_type == WFD_OEM_SERVICE_TYPE_ALL) {
5597 char *service_all = "\x02\x00\x00\x01";
5598 GVariantBuilder *query = NULL;
5600 query = g_variant_builder_new(G_VARIANT_TYPE("ay"));
5601 for (i = 0; i < SERVICE_QUERY_LEN; i++)
5602 g_variant_builder_add(query, "y", service_all[i]);
5603 g_variant_builder_add(builder, "{sv}", "query", g_variant_new("ay", query));
5604 g_variant_builder_unref(query);
5606 } else if (service_type == WFD_OEM_SERVICE_TYPE_UPNP) {
5608 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("upnp"));
5609 g_variant_builder_add(builder, "{sv}", "version", g_variant_new_uint16(TRUE));
5611 } else if (service_type == WFD_OEM_SERVICE_TYPE_BONJOUR) {
5613 char *service_bonjour = "\x02\x00\x01\x01";
5614 GVariantBuilder *query = NULL;
5616 query = g_variant_builder_new(G_VARIANT_TYPE("ay"));
5617 for (i = 0; i < SERVICE_QUERY_LEN; i++)
5618 g_variant_builder_add(query, "y", service_bonjour[i]);
5619 g_variant_builder_add(builder, "{sv}", "query", g_variant_new("ay", query));
5620 g_variant_builder_unref(query);
5623 value = g_variant_new("(a{sv})", builder);
5624 g_variant_builder_unref(builder);
5626 params.params = value;
5627 #if defined(TIZEN_DEBUG_DBUS_VALUE)
5628 DEBUG_PARAMS(params.params);
5629 #endif /* TIZEN_DEBUG_DBUS_VALUE */
5631 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, __add_service_query, mac_addr);
5633 WDP_LOGE("Failed to send command to wpa_supplicant");
5635 WDP_LOGD("Succeeded to start service discovery");
5637 __WDP_LOG_FUNC_EXIT__;
5641 int ws_cancel_service_discovery(unsigned char *mac_addr, int service_type)
5643 __WDP_LOG_FUNC_ENTER__;
5644 GDBusConnection *g_dbus = NULL;
5645 dbus_method_param_s params;
5646 wfd_oem_service_s *data = NULL;
5647 char query_id[OEM_QUERY_ID_LEN + 1] = {0, };
5648 char s_type[OEM_SERVICE_TYPE_LEN + 1] = {0, };
5649 char mac_str[18] = {0, };
5654 WDP_LOGE("Invalid parameter");
5655 __WDP_LOG_FUNC_EXIT__;
5660 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5661 __WDP_LOG_FUNC_EXIT__;
5665 g_dbus = g_pd->g_dbus;
5667 WDP_LOGE("DBus connection is NULL");
5668 __WDP_LOG_FUNC_EXIT__;
5672 if (mac_addr[0] == 0 && mac_addr[1] == 0 && mac_addr[2] == 0 &&
5673 mac_addr[3] == 0 && mac_addr[4] == 0 && mac_addr[5] == 0) {
5674 snprintf(mac_str, WS_MACSTR_LEN , "%s", SERV_BROADCAST_ADDRESS);
5676 snprintf(mac_str, WS_MACSTR_LEN, MACSTR, MAC2STR(mac_addr));
5679 switch (service_type) {
5680 case WFD_OEM_SERVICE_TYPE_ALL:
5681 strncpy(s_type, SERV_DISC_REQ_ALL, OEM_SERVICE_TYPE_LEN);
5683 case WFD_OEM_SERVICE_TYPE_BONJOUR:
5684 strncpy(s_type, SERV_DISC_REQ_BONJOUR, OEM_SERVICE_TYPE_LEN);
5686 case WFD_OEM_SERVICE_TYPE_UPNP:
5687 strncpy(s_type, SERV_DISC_REQ_UPNP, OEM_SERVICE_TYPE_LEN);
5690 WDP_LOGE("Invalid Service type");
5691 __WDP_LOG_FUNC_EXIT__;
5695 WDP_LOGD("Cancel service discovery service_type [%d]", service_type);
5696 WDP_LOGD("Cancel service discovery s_type [%s]", s_type);
5698 data = _remove_service_query(s_type, mac_str, query_id);
5700 __WDP_LOG_FUNC_EXIT__;
5703 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5705 dbus_set_method_param(¶ms, "ServiceDiscoveryCancelRequest", g_pd->iface_path, g_dbus);
5707 params.params = g_variant_new("(t)", strtoul(query_id, NULL, 16));
5709 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
5711 WDP_LOGE("Failed to send command to wpa_supplicant");
5713 WDP_LOGD("Succeeded to cancel service discovery");
5715 service_list = g_list_remove(service_list, data);
5718 __WDP_LOG_FUNC_EXIT__;
5722 int ws_serv_add(wfd_oem_new_service_s *service)
5724 __WDP_LOG_FUNC_ENTER__;
5725 GDBusConnection *g_dbus = NULL;
5726 GVariantBuilder *builder = NULL;
5727 GVariant *value = NULL;
5728 dbus_method_param_s params;
5732 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5736 g_dbus = g_pd->g_dbus;
5738 WDP_LOGE("DBus connection is NULL");
5741 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5743 dbus_set_method_param(¶ms, "AddService", g_pd->iface_path, g_dbus);
5745 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
5747 if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
5749 WDP_LOGD("Service type: WFD_OEM_SERVICE_TYPE_BONJOUR");
5750 WDP_LOGD("Query: %s", service->data.bonjour.query);
5751 WDP_LOGD("RData: %s", service->data.bonjour.rdata);
5753 res = _convert_bonjour_to_args(service->data.bonjour.query,
5754 service->data.bonjour.rdata, builder);
5756 WDP_LOGE("Failed to convert Key string");
5757 g_variant_builder_unref(builder);
5761 } else if (service->protocol == WFD_OEM_SERVICE_TYPE_UPNP) {
5762 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("upnp"));
5763 g_variant_builder_add(builder, "{sv}", "version", g_variant_new_uint16(TRUE));
5764 g_variant_builder_add(builder, "{sv}", "service", g_variant_new_string(service->data.upnp.service));
5767 value = g_variant_new("(a{sv})", builder);
5768 g_variant_builder_unref(builder);
5770 params.params = value;
5771 #if defined(TIZEN_DEBUG_DBUS_VALUE)
5772 DEBUG_PARAMS(params.params);
5773 #endif /* TIZEN_DEBUG_DBUS_VALUE */
5775 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
5777 WDP_LOGE("Failed to send command to wpa_supplicant");
5779 WDP_LOGD("Succeeded to add service");
5781 __WDP_LOG_FUNC_EXIT__;
5785 int ws_serv_del(wfd_oem_new_service_s *service)
5787 __WDP_LOG_FUNC_ENTER__;
5788 GDBusConnection *g_dbus = NULL;
5789 GVariantBuilder *builder = NULL;
5790 GVariant *value = NULL;
5791 dbus_method_param_s params;
5795 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5799 g_dbus = g_pd->g_dbus;
5801 WDP_LOGE("DBus connection is NULL");
5804 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5806 dbus_set_method_param(¶ms, "DeleteService", g_pd->iface_path, g_dbus);
5808 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
5810 if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
5812 WDP_LOGD("Service type: WFD_OEM_SERVICE_TYPE_BONJOUR");
5813 WDP_LOGD("Query: %s", service->data.bonjour.query);
5815 res = _convert_bonjour_to_args(service->data.bonjour.query,
5818 WDP_LOGE("Failed to convert Key string");
5819 g_variant_builder_unref(builder);
5823 } else if (service->protocol == WFD_OEM_SERVICE_TYPE_UPNP) {
5824 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("upnp"));
5825 g_variant_builder_add(builder, "{sv}", "version", g_variant_new_uint16(TRUE));
5826 g_variant_builder_add(builder, "{sv}", "service", g_variant_new_string(service->data.upnp.service));
5829 value = g_variant_new("(a{sv})", builder);
5830 g_variant_builder_unref(builder);
5832 params.params = value;
5833 #if defined(TIZEN_DEBUG_DBUS_VALUE)
5834 DEBUG_PARAMS(params.params);
5835 #endif /* TIZEN_DEBUG_DBUS_VALUE */
5837 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
5839 WDP_LOGE("Failed to send command to wpa_supplicant");
5841 WDP_LOGD("Succeeded to del service");
5843 __WDP_LOG_FUNC_EXIT__;
5846 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
5848 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
5850 int _ws_disable_display()
5852 __WDP_LOG_FUNC_ENTER__;
5853 GDBusConnection *g_dbus = NULL;
5854 GVariantBuilder *builder = NULL;
5855 GVariant *value = NULL;
5856 GVariant *param = NULL;
5857 dbus_method_param_s params;
5861 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5865 g_dbus = g_pd->g_dbus;
5867 WDP_LOGE("DBus connection is NULL");
5870 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5872 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, SUPPLICANT_PATH,
5875 builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
5876 value = g_variant_new("ay", builder);
5877 g_variant_builder_unref(builder);
5879 param = g_variant_new("(ssv)", SUPPLICANT_INTERFACE, "WFDIEs", value);
5881 params.params = param;
5882 #if defined(TIZEN_DEBUG_DBUS_VALUE)
5883 DEBUG_PARAMS(params.params);
5884 #endif /* TIZEN_DEBUG_DBUS_VALUE */
5886 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
5888 WDP_LOGE("Failed to send command to wpa_supplicant");
5890 WDP_LOGD("Succeeded to disable Wi-Fi display");
5892 __WDP_LOG_FUNC_EXIT__;
5896 int ws_miracast_init(int enable)
5898 __WDP_LOG_FUNC_ENTER__;
5899 wfd_oem_display_s wifi_display;
5902 memset(&wifi_display, 0x0, sizeof(wfd_oem_display_s));
5904 wifi_display.availability = enable;
5905 wifi_display.hdcp_support = 1;
5906 wifi_display.port = 0x07E6;
5907 wifi_display.max_tput = 0x0028;
5909 res = ws_set_display(&wifi_display);
5911 WDP_LOGE("Failed to set miracast parameter(device info)");
5912 __WDP_LOG_FUNC_EXIT__;
5917 res = _ws_disable_display();
5919 WDP_LOGE("Failed to disable wifi display");
5921 WDP_LOGD("Succeeded to disable wifi display");
5923 __WDP_LOG_FUNC_EXIT__;
5927 int ws_set_display(wfd_oem_display_s *wifi_display)
5929 __WDP_LOG_FUNC_ENTER__;
5930 GDBusConnection *g_dbus = NULL;
5932 GVariant *value = NULL;
5933 GVariant *param = NULL;
5934 GVariantBuilder *builder = NULL;
5935 dbus_method_param_s params;
5939 unsigned char ies[WFD_SUBELEM_LEN_DEV_INFO + 3] = {0,};
5941 if (!wifi_display) {
5942 WDP_LOGE("Invalid parameter");
5945 g_dbus = g_pd->g_dbus;
5947 WDP_LOGE("DBus connection is NULL");
5950 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5952 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, SUPPLICANT_PATH,
5955 ies[2] = WFD_SUBELEM_LEN_DEV_INFO;
5956 ies[3] = wifi_display->hdcp_support;
5957 ies[4] = (wifi_display->type) | (wifi_display->availability<<4);
5958 ies[5] = wifi_display->port>>8;
5959 ies[6] = wifi_display->port&0xff;
5960 ies[7] = wifi_display->max_tput>>8;
5961 ies[8] = wifi_display->max_tput&0xff;
5963 builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
5964 for (i = 0; i < WFD_SUBELEM_LEN_DEV_INFO + 3; i++)
5965 g_variant_builder_add(builder, "y", ies[i]);
5966 value = g_variant_new("ay", builder);
5967 g_variant_builder_unref(builder);
5969 param = g_variant_new("(ssv)", SUPPLICANT_INTERFACE, "WFDIEs", value);
5971 params.params = param;
5972 #if defined(TIZEN_DEBUG_DBUS_VALUE)
5973 DEBUG_PARAMS(params.params);
5974 #endif /* TIZEN_DEBUG_DBUS_VALUE */
5976 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
5978 WDP_LOGE("Failed to send command to wpa_supplicant");
5980 WDP_LOGD("Succeeded to set Wi-Fi Display");
5982 __WDP_LOG_FUNC_EXIT__;
5985 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
5989 __WDP_LOG_FUNC_ENTER__;
5994 __WDP_LOG_FUNC_EXIT__;
5998 int ws_save_config(void)
6000 __WDP_LOG_FUNC_ENTER__;
6001 GDBusConnection *g_dbus = NULL;
6002 dbus_method_param_s params;
6005 g_dbus = g_pd->g_dbus;
6007 WDP_LOGE("DBus connection is NULL");
6008 __WDP_LOG_FUNC_EXIT__;
6011 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6013 dbus_set_method_param(¶ms, "SaveConfig", g_pd->iface_path, g_dbus);
6014 params.params = NULL;
6016 res = dbus_method_call(¶ms, SUPPLICANT_IFACE, NULL, NULL);
6018 WDP_LOGE("Failed to save config to wpa_supplicant");
6020 WDP_LOGD("Succeeded to save config");
6022 __WDP_LOG_FUNC_EXIT__;
6026 int ws_set_operating_channel(int channel)
6028 __WDP_LOG_FUNC_ENTER__;
6029 GDBusConnection *g_dbus = NULL;
6030 GVariant *value = NULL;
6031 GVariant *param = NULL;
6032 GVariantBuilder *builder = NULL;
6033 dbus_method_param_s params;
6036 g_dbus = g_pd->g_dbus;
6038 WDP_LOGE("DBus connection is NULL");
6039 __WDP_LOG_FUNC_EXIT__;
6043 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6045 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path, g_dbus);
6047 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6048 g_variant_builder_add(builder, "{sv}", "OperChannel", g_variant_new_uint32(channel));
6049 value = g_variant_new("a{sv}", builder);
6050 g_variant_builder_unref(builder);
6052 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
6053 params.params = param;
6055 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
6057 WDP_LOGE("Failed to send command to wpa_supplicant");
6059 WDP_LOGD("Succeeded to set Operating Channel");
6061 __WDP_LOG_FUNC_EXIT__;
6065 int ws_remove_all_network(void)
6067 __WDP_LOG_FUNC_ENTER__;
6068 GDBusConnection *g_dbus = NULL;
6069 dbus_method_param_s params;
6072 g_dbus = g_pd->g_dbus;
6074 WDP_LOGE("DBus connection is NULL");
6075 __WDP_LOG_FUNC_EXIT__;
6078 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6080 dbus_set_method_param(¶ms, "RemoveAllNetworks", g_pd->iface_path, g_dbus);
6081 params.params = NULL;
6083 res = dbus_method_call(¶ms, SUPPLICANT_IFACE, NULL, NULL);
6085 WDP_LOGE("Failed to send [RemoveAllNetworks] command to wpa_supplicant");
6087 WDP_LOGD("Succeeded to remove all networks from supplicant");
6089 WDP_LOGD("Succeeded to remove all network");
6090 __WDP_LOG_FUNC_EXIT__;
6094 int ws_get_wpa_status(int *wpa_status)
6096 __WDP_LOG_FUNC_ENTER__;
6097 GDBusConnection *g_dbus = NULL;
6098 GVariant *param = NULL;
6099 GVariant *reply = NULL;
6100 GError *error = NULL;
6103 WDP_LOGE("Invalid parameter");
6104 __WDP_LOG_FUNC_EXIT__;
6108 *wpa_status = WFD_OEM_WPA_STATE_MAX;
6110 g_dbus = g_pd->g_dbus;
6112 WDP_LOGE("DBus connection is NULL");
6113 __WDP_LOG_FUNC_EXIT__;
6117 param = g_variant_new("(s)", SUPPLICANT_IFACE);
6119 reply = g_dbus_connection_call_sync(
6121 SUPPLICANT_SERVICE, /* bus name */
6122 g_pd->iface_path, /* object path */
6123 DBUS_PROPERTIES_INTERFACE, /* interface name */
6124 DBUS_PROPERTIES_METHOD_GETALL, /* method name */
6125 param, /* GVariant *params */
6126 NULL, /* reply_type */
6127 G_DBUS_CALL_FLAGS_NONE, /* flags */
6128 SUPPLICANT_TIMEOUT , /* timeout */
6129 NULL, /* cancellable */
6130 &error); /* error */
6132 if (error != NULL) {
6133 WDP_LOGE("Error! Failed to get properties: [%s]",
6135 g_error_free(error);
6137 g_variant_unref(reply);
6138 __WDP_LOG_FUNC_EXIT__;
6142 gchar *reply_str = NULL;
6144 reply_str = g_variant_print(reply, TRUE);
6145 WDP_LOGE("reply [%s]", reply_str ? reply_str : "NULL");
6148 if (reply != NULL) {
6149 GVariantIter *iter = NULL;
6150 g_variant_get(reply, "(a{sv})", &iter);
6154 GVariant *value = NULL;
6156 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
6157 if (g_strcmp0(key, "State") == 0) {
6158 const gchar *state = NULL;
6159 g_variant_get(value, "&s", &state);
6160 WDP_LOGI("state : [%s]", state);
6162 if (g_strcmp0(state, "disconnected") == 0)
6163 *wpa_status = WFD_OEM_WPA_STATE_DISCONNECTED;
6164 else if (g_strcmp0(state, "inactive") == 0)
6165 *wpa_status = WFD_OEM_WPA_STATE_INACTIVE;
6166 else if (g_strcmp0(state, "scanning") == 0)
6167 *wpa_status = WFD_OEM_WPA_STATE_SCANNING;
6168 else if (g_strcmp0(state, "authenticating") == 0)
6169 *wpa_status = WFD_OEM_WPA_STATE_AUTHENTICATING;
6170 else if (g_strcmp0(state, "associating") == 0)
6171 *wpa_status = WFD_OEM_WPA_STATE_ASSOCIATING;
6172 else if (g_strcmp0(state, "associated") == 0)
6173 *wpa_status = WFD_OEM_WPA_STATE_ASSOCIATED;
6174 else if (g_strcmp0(state, "4way_handshake") == 0)
6175 *wpa_status = WFD_OEM_WPA_STATE_4WAY_HANDSHAKE;
6176 else if (g_strcmp0(state, "group_handshake") == 0)
6177 *wpa_status = WFD_OEM_WPA_STATE_GROUP_HANDSHAKE;
6178 else if (g_strcmp0(state, "completed") == 0)
6179 *wpa_status = WFD_OEM_WPA_STATE_COMPLETED;
6181 *wpa_status = WFD_OEM_WPA_STATE_MAX;
6184 g_variant_iter_free(iter);
6186 g_variant_unref(reply);
6188 WDP_LOGD("No properties");
6191 WDP_LOGI("wpa_status : [%d]", *wpa_status);
6193 __WDP_LOG_FUNC_EXIT__;
6197 #if defined(TIZEN_FEATURE_ASP)
6198 int ws_advertise_service(wfd_oem_asp_service_s *service, int replace)
6200 __WDP_LOG_FUNC_ENTER__;
6201 GDBusConnection *g_dbus = NULL;
6202 GVariantBuilder *builder = NULL;
6203 GVariant *value = NULL;
6204 dbus_method_param_s params;
6205 unsigned int config_method = 0x1108;
6206 int auto_accept = 0;
6210 g_dbus = g_pd->g_dbus;
6212 WDP_LOGE("DBus connection is NULL");
6216 if (service->config_method == 2) {
6217 config_method = WS_CONFIG_METHOD_KEYPAD |
6218 WS_CONFIG_METHOD_DISPLAY;
6219 } else if (service->config_method == 3) {
6220 config_method = WS_CONFIG_METHOD_DISPLAY;
6221 } else if (service->config_method == 4) {
6222 config_method = WS_CONFIG_METHOD_KEYPAD;
6225 if (service->auto_accept) {
6226 if (service->role == 0)
6234 rep = (replace == 1);
6236 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6238 dbus_set_method_param(¶ms, "AddService", g_pd->iface_path, g_dbus);
6240 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6242 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("asp"));
6243 g_variant_builder_add(builder, "{sv}", "auto_accept", g_variant_new_int32(auto_accept));
6244 g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new_uint32(service->adv_id));
6245 g_variant_builder_add(builder, "{sv}", "svc_state", g_variant_new_uint32(service->status));
6246 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new_uint32(config_method));
6247 g_variant_builder_add(builder, "{sv}", "replace", g_variant_new_boolean(rep));
6248 if (service->service_type != NULL)
6249 g_variant_builder_add(builder, "{sv}", "adv_str", g_variant_new_string(service->service_type));
6250 if (service->service_info != NULL)
6251 g_variant_builder_add(builder, "{sv}", "svc_info", g_variant_new_string(service->service_info));
6253 value = g_variant_new("(a{sv})", builder);
6254 g_variant_builder_unref(builder);
6255 #if defined(TIZEN_DEBUG_DBUS_VALUE)
6256 WDP_LOGE("params [%s]", g_variant_print(value, TRUE));
6257 #endif /* TIZEN_DEBUG_DBUS_VALUE */
6259 params.params = value;
6261 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
6263 WDP_LOGE("Failed to send command to wpa_supplicant");
6265 WDP_LOGD("Succeeded to add service");
6267 __WDP_LOG_FUNC_EXIT__;
6271 int ws_cancel_advertise_service(wfd_oem_asp_service_s *service)
6273 __WDP_LOG_FUNC_ENTER__;
6274 GDBusConnection *g_dbus = NULL;
6275 GVariantBuilder *builder = NULL;
6276 GVariant *value = NULL;
6277 dbus_method_param_s params;
6280 g_dbus = g_pd->g_dbus;
6282 WDP_LOGE("DBus connection is NULL");
6285 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6287 dbus_set_method_param(¶ms, "DeleteService", g_pd->iface_path, g_dbus);
6289 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6291 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("asp"));
6292 g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new_uint32(service->adv_id));
6294 value = g_variant_new("(a{sv})", builder);
6295 g_variant_builder_unref(builder);
6296 #if defined(TIZEN_DEBUG_DBUS_VALUE)
6297 WDP_LOGD("params [%s]", g_variant_print(value, TRUE));
6298 #endif /* TIZEN_DEBUG_DBUS_VALUE */
6299 params.params = value;
6301 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
6303 WDP_LOGE("Failed to send command to wpa_supplicant");
6305 WDP_LOGD("Succeeded to del service");
6307 __WDP_LOG_FUNC_EXIT__;
6311 static void __ws_add_seek(wfd_oem_asp_service_s *service)
6313 __WDP_LOG_FUNC_ENTER__;
6314 wfd_oem_asp_service_s *seek = NULL;
6316 WDP_LOGE("invalid parameters");
6320 seek = g_try_malloc0(sizeof(wfd_oem_asp_service_s));
6322 WDP_LOGE("Failed to allocate memory for service");
6326 service->search_id = (intptr_t)seek;
6327 memcpy(seek, service, sizeof(wfd_oem_asp_service_s));
6328 if (service->service_type)
6329 seek->service_type = strdup(service->service_type);
6330 seek_list = g_list_prepend(seek_list, seek);
6332 __WDP_LOG_FUNC_EXIT__;
6336 static wfd_oem_asp_service_s * __ws_get_seek(long long unsigned search_id)
6338 __WDP_LOG_FUNC_ENTER__;
6339 wfd_oem_asp_service_s *seek = NULL;
6342 for (list = seek_list; list != NULL; list = list->next) {
6344 if (seek && (seek->search_id == search_id)) {
6345 WDP_LOGD("List found");
6351 __WDP_LOG_FUNC_EXIT__;
6355 static void __ws_remove_seek(wfd_oem_asp_service_s *service)
6357 __WDP_LOG_FUNC_ENTER__;
6358 wfd_oem_asp_service_s *seek = NULL;
6361 for (list = seek_list; list != NULL; list = list->next) {
6364 if (seek && (seek->search_id == service->search_id)) {
6365 WDP_LOGD("List remove");
6366 seek_list = g_list_remove(seek_list, seek);
6367 g_free(seek->service_type);
6368 g_free(seek->service_info);
6372 __WDP_LOG_FUNC_EXIT__;
6376 static void __get_asp_search_id(GVariant *value, void *args)
6378 __WDP_LOG_FUNC_ENTER__;
6379 wfd_oem_asp_service_s *service = NULL;
6380 wfd_oem_asp_service_s *seek = NULL;
6381 long long unsigned search_id = 0;
6383 g_variant_get(value, "(t)", &search_id);
6385 service = (wfd_oem_asp_service_s *)args;
6387 WDP_LOGE("invalid parameters");
6388 __WDP_LOG_FUNC_EXIT__;
6392 seek = g_try_malloc0(sizeof(wfd_oem_asp_service_s));
6394 WDP_LOGE("Failed to allocate memory for service");
6395 __WDP_LOG_FUNC_EXIT__;
6399 service->search_id = search_id;
6400 memcpy(seek, service, sizeof(wfd_oem_asp_service_s));
6401 if (service->service_type)
6402 seek->service_type = strdup(service->service_type);
6403 if (service->service_info)
6404 seek->service_info = strdup(service->service_info);
6405 seek_list = g_list_append(seek_list, seek);
6407 __WDP_LOG_FUNC_EXIT__;
6411 int ws_seek_service(wfd_oem_asp_service_s *service)
6413 __WDP_LOG_FUNC_ENTER__;
6414 GDBusConnection *g_dbus = NULL;
6416 wfd_oem_asp_service_s *seek = NULL;
6419 g_dbus = g_pd->g_dbus;
6421 WDP_LOGE("DBus connection is NULL");
6422 __WDP_LOG_FUNC_EXIT__;
6425 list = g_list_last(seek_list);
6427 service->tran_id = 1;
6432 service->tran_id = seek->tran_id + 1;
6434 service->tran_id = 1;
6437 if (service->service_info) {
6438 GVariantBuilder *builder = NULL;
6439 GVariant *value = NULL;
6440 dbus_method_param_s params;
6442 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6443 dbus_set_method_param(¶ms, "ServiceDiscoveryRequest",
6444 g_pd->iface_path, g_dbus);
6446 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6448 g_variant_builder_add(builder, "{sv}", "service_type",
6449 g_variant_new_string("asp"));
6450 g_variant_builder_add(builder, "{sv}", "transaction_id",
6451 g_variant_new_byte(service->tran_id));
6452 if (service->service_type != NULL)
6453 g_variant_builder_add(builder, "{sv}", "svc_str",
6454 g_variant_new_string(service->service_type));
6456 if (service->service_info != NULL)
6457 g_variant_builder_add(builder, "{sv}", "svc_info",
6458 g_variant_new_string(service->service_info));
6460 value = g_variant_new("(a{sv})", builder);
6461 g_variant_builder_unref(builder);
6463 #if defined(TIZEN_DEBUG_DBUS_VALUE)
6464 WDP_LOGD("params [%s]", g_variant_print(value, TRUE));
6465 #endif /* TIZEN_DEBUG_DBUS_VALUE */
6467 params.params = value;
6468 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE,
6469 __get_asp_search_id, service);
6472 __ws_add_seek(service);
6476 WDP_LOGE("Failed to send command to wpa_supplicant");
6478 WDP_LOGD("Succeeded to seek service");
6480 __WDP_LOG_FUNC_EXIT__;
6484 int ws_cancel_seek_service(wfd_oem_asp_service_s *service)
6486 __WDP_LOG_FUNC_ENTER__;
6487 GDBusConnection *g_dbus = NULL;
6488 wfd_oem_asp_service_s *seek = NULL;
6489 dbus_method_param_s params;
6492 g_dbus = g_pd->g_dbus;
6494 WDP_LOGE("DBus connection is NULL");
6495 __WDP_LOG_FUNC_EXIT__;
6499 seek = __ws_get_seek(service->search_id);
6501 WDP_LOGE("seek data is NULL");
6502 __WDP_LOG_FUNC_EXIT__;
6506 if (seek->service_info) {
6508 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6509 dbus_set_method_param(¶ms, "ServiceDiscoveryCancelRequest",
6510 g_pd->iface_path, g_dbus);
6512 params.params = g_variant_new("(t)", service->search_id);
6514 #if defined(TIZEN_DEBUG_DBUS_VALUE)
6515 WDP_LOGD("params [%s]", g_variant_print(params.params, TRUE));
6516 #endif /* TIZEN_DEBUG_DBUS_VALUE */
6518 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
6520 WDP_LOGE("Failed to send command to wpa_supplicant");
6522 WDP_LOGD("Succeeded to cancel seek service");
6525 __ws_remove_seek(seek);
6527 __WDP_LOG_FUNC_EXIT__;
6531 int ws_asp_prov_disc_req(wfd_oem_asp_prov_s *asp_params)
6533 __WDP_LOG_FUNC_ENTER__;
6534 GDBusConnection *g_dbus = NULL;
6535 GVariantBuilder *builder = NULL;
6536 GVariantBuilder *mac_builder = NULL;
6537 GVariant *value = NULL;
6538 dbus_method_param_s params;
6539 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
6540 int config_method = 0x1000;
6545 WDP_LOGE("Invalid parameter");
6546 __WDP_LOG_FUNC_EXIT__;
6549 g_dbus = g_pd->g_dbus;
6551 WDP_LOGE("DBus connection is NULL");
6552 __WDP_LOG_FUNC_EXIT__;
6556 if (asp_params->network_config == WFD_OEM_ASP_WPS_TYPE_PIN_DISPLAY)
6557 config_method = 0x8;
6558 else if (asp_params->network_config == WFD_OEM_ASP_WPS_TYPE_PIN_KEYPAD)
6559 config_method = 0x100;
6561 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6563 dbus_set_method_param(¶ms, "ASPProvisionDiscoveryRequest", g_pd->iface_path, g_dbus);
6565 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
6566 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(asp_params->service_mac));
6567 WDP_LOGD("get peer path [%s]", peer_path);
6569 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6570 g_variant_builder_add(builder, "{sv}", "peer", g_variant_new_object_path(peer_path));
6572 g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new_uint32(asp_params->adv_id));
6573 g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new_uint32(asp_params->session_id));
6574 g_variant_builder_add(builder, "{sv}", "role", g_variant_new_byte(asp_params->network_role));
6575 g_variant_builder_add(builder, "{sv}", "method", g_variant_new_int32(config_method));
6576 if (asp_params->status > 0)
6577 g_variant_builder_add(builder, "{sv}", "status", g_variant_new_int32(asp_params->status));
6578 if (asp_params->session_information)
6579 g_variant_builder_add(builder, "{sv}", "info", g_variant_new_string(asp_params->session_information));
6581 mac_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
6582 for (i = 0; i < OEM_MACADDR_LEN; i++)
6583 g_variant_builder_add(mac_builder, "y", asp_params->service_mac[i]);
6584 g_variant_builder_add(builder, "{sv}", "adv_mac",
6585 g_variant_new("ay", mac_builder));
6586 g_variant_builder_unref(mac_builder);
6588 mac_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
6589 for (i = 0; i < OEM_MACADDR_LEN; i++)
6590 g_variant_builder_add(mac_builder, "y", asp_params->session_mac[i]);
6591 g_variant_builder_add(builder, "{sv}", "session_mac",
6592 g_variant_new("ay", mac_builder));
6593 g_variant_builder_unref(mac_builder);
6595 value = g_variant_new("(a{sv})", builder);
6596 g_variant_builder_unref(builder);
6597 #if defined(TIZEN_DEBUG_DBUS_VALUE)
6598 WDP_LOGD("params [%s]", g_variant_print(value, TRUE));
6599 #endif /* TIZEN_DEBUG_DBUS_VALUE */
6601 params.params = value;
6603 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
6605 WDP_LOGE("Failed to send command to wpa_supplicant");
6607 WDP_LOGD("Succeeded to send connection command to peer[" MACSTR "]", MAC2STR(asp_params->service_mac));
6609 __WDP_LOG_FUNC_EXIT__;
6612 #endif /* TIZEN_FEATURE_ASP */