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 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
158 static GList *service_list;
159 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
161 static GList *seek_list;
163 static void _supplicant_signal_cb(GDBusConnection *connection,
164 const gchar *sender, const gchar *object_path, const gchar *interface,
165 const gchar *signal, GVariant *parameters, gpointer user_data);
167 static void _p2pdevice_signal_cb(GDBusConnection *connection,
168 const gchar *sender, const gchar *object_path, const gchar *interface,
169 const gchar *signal, GVariant *parameters, gpointer user_data);
171 static void _group_signal_cb(GDBusConnection *connection,
172 const gchar *sender, const gchar *object_path, const gchar *interface,
173 const gchar *signal, GVariant *parameters, gpointer user_data);
175 static int __ws_txt_to_mac(unsigned char *txt, unsigned char *mac)
180 WDP_LOGE("Invalid parameter");
185 mac[i++] = (char) strtoul((char *)txt, (char **)&txt, 16);
186 if (!*txt++ || i == 6)
190 if (i != WS_MACADDR_LEN)
193 WDP_LOGD("Converted MAC address [" MACSECSTR "]", MAC2SECSTR(mac));
197 static int __ws_mac_compact_to_normal(char *compact, unsigned char *mac)
199 g_snprintf((char *)mac, OEM_MACSTR_LEN, "%c%c:%c%c:%c%c:%c%c:%c%c:%c%c",
200 compact[0], compact[1], compact[2], compact[3],
201 compact[4], compact[5], compact[6], compact[7],
202 compact[8], compact[9], compact[10], compact[11]);
206 static char *__ws_wps_to_txt(int wps_mode)
209 case WFD_OEM_WPS_MODE_PBC:
210 return WS_DBUS_STR_PBC;
212 case WFD_OEM_WPS_MODE_DISPLAY:
213 return WS_DBUS_STR_DISPLAY;
215 case WFD_OEM_WPS_MODE_KEYPAD:
216 return WS_DBUS_STR_KEYPAD;
218 #if defined(TIZEN_FEATURE_ASP)
219 case WFD_OEM_WPS_MODE_NONE:
220 case WFD_OEM_WPS_MODE_P2PS:
221 return WS_DBUS_STR_P2PS;
222 #endif /* TIZEN_FEATURE_ASP */
228 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
229 static int __ws_byte_to_hex(char *buf, int buf_size, unsigned char *data, int data_len)
233 char *end = buf + buf_size;
237 for (i = 0; i < data_len; i++) {
238 ret = snprintf(pos, end - pos, "%02x", data[i]);
239 if (ret < 0 || ret >= end - pos) {
249 static int __ws_hex_to_num(char *src, int len)
254 if (!src || len < 0) {
255 WDP_LOGE("Invalid parameter");
259 temp = (char*) g_try_malloc0(len+1);
261 WDP_LOGE("Failed to allocate memory");
265 memcpy(temp, src, len);
266 num = strtoul(temp, NULL, 16);
272 static int __ws_segment_to_service(char *segment, wfd_oem_new_service_s **service)
274 wfd_oem_new_service_s *serv_tmp = NULL;
280 if (!segment || !service) {
281 WDP_LOGE("Invalid parameter");
286 WDP_LOGD("Segment: %s", segment);
288 serv_tmp = (wfd_oem_new_service_s*) g_try_malloc0(sizeof(wfd_oem_new_service_s));
290 WDP_LOGE("Failed to allocate memory for service");
294 serv_tmp->protocol = __ws_hex_to_num(ptr, 2);
295 serv_tmp->trans_id = __ws_hex_to_num(ptr+2, 2);
296 serv_tmp->status = __ws_hex_to_num(ptr+4, 2);
298 WDP_LOGD("Protocol[%d], Transaction ID[%d], Status[%d]", serv_tmp->protocol, serv_tmp->trans_id, serv_tmp->status);
300 if (serv_tmp->status != 0) {
301 WDP_LOGE("Service status is not success");
306 if (serv_tmp->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
307 WDP_LOGD("===== Bonjour service =====");
308 char compr[5] = {0, };
309 char query[256] = {0, };
310 char rdata[256] = {0, };
313 while (*ptr != 0 && strncmp(ptr, "c0", 2)) {
314 len = __ws_hex_to_num(ptr, 2);
316 if (len && len <= 0xff) {
317 temp = (char*) calloc(1, len+2);
320 for (i = 0; i < len; i++) {
321 temp[i+1] = (char) __ws_hex_to_num(ptr, 2);
324 strncat(query, temp, len+1);
331 if (!strncmp(ptr, "c0", 2)) {
332 memcpy(compr, ptr, 4);
335 if (!strncmp(ptr, "27", 2)) {
336 WDP_LOGD("Segment ended");
340 dns_type = __ws_hex_to_num(ptr, 4);
342 if (dns_type == 12) {
343 if (!strncmp(compr, "c011", 4))
344 strncat(query, ".local.", 7);
345 else if (!strncmp(compr, "c00c", 4))
346 strncat(query, "._tcp.local.", 12);
347 else if (!strncmp(compr, "c01c", 4))
348 strncat(query, "._udp.local.", 12);
352 serv_tmp->data.bonjour.query = strdup(query + 1);
353 while (*ptr != 0 && strncmp(ptr, "c0", 2)) {
354 len = __ws_hex_to_num(ptr, 2);
356 if (len && len <= 0xff) {
357 temp = (char*) g_try_malloc0(len+2);
360 for (i = 0; i < len; i++) {
361 temp[i+1] = (char) __ws_hex_to_num(ptr, 2);
364 strncat(rdata, temp, len+1);
370 serv_tmp->data.bonjour.rdata = strdup(rdata + 1);
372 WDP_LOGD("Query: %s", serv_tmp->data.bonjour.query);
373 WDP_LOGD("RData: %s", serv_tmp->data.bonjour.rdata);
375 WDP_LOGE("Not supported yet. Only bonjour service supproted [%d]",
385 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
387 static void __ws_path_to_addr(char *peer_path,
388 unsigned char *dev_addr, GVariant *parameter)
390 __WDP_LOG_FUNC_ENTER__;
392 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
393 const char *path = NULL;
396 g_variant_get(parameter, "(&o)", &path);
397 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
398 WDP_LOGD("Retrive Added path [%s]", peer_path);
400 loc = strrchr(peer_path,'/');
402 __ws_mac_compact_to_normal(loc + 1, peer_dev);
404 __ws_txt_to_mac(peer_dev, dev_addr);
405 WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(dev_addr));
407 __WDP_LOG_FUNC_EXIT__;
411 static int __ws_unpack_ay(unsigned char *dst, GVariant *src, int size)
413 GVariantIter *iter = NULL;
417 if (!dst || !src || size == 0) {
418 WDP_LOGE("Invalid parameter");
421 g_variant_get(src, "ay", &iter);
423 WDP_LOGE("failed to get iterator");
427 while (g_variant_iter_loop (iter, "y", &dst[length])) {
432 g_variant_iter_free(iter);
435 WDP_LOGE("array is shorter than size");
442 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
443 static int __parsing_wfd_info(unsigned char *wfd_dev_info,
444 wfd_oem_display_s *display )
446 __WDP_LOG_FUNC_ENTER__;
449 if (!wfd_dev_info || !display) {
450 WDP_LOGE("Invalid parameter");
451 __WDP_LOG_FUNC_EXIT__;
455 wfd_info = (wfd_dev_info[3]<<8 | wfd_dev_info[4]);
457 if (wfd_info & WS_WFD_INFO_PRIMARY_SINK)
458 display->type |= WS_WFD_INFO_PRIMARY_SINK;
459 if (wfd_info & WS_WFD_INFO_SECONDARY_SINK)
460 display->type |= WS_WFD_INFO_SECONDARY_SINK;
462 display->availability = (wfd_info & WS_WFD_INFO_AVAILABILITY) >> 4;
463 display->hdcp_support = (wfd_info & WS_WFD_INFO_HDCP_SUPPORT) >> 8;
465 display->port = (wfd_dev_info[5]<<8 | wfd_dev_info[6]);
466 display->max_tput = (wfd_dev_info[7]<<8 | wfd_dev_info[8]);
468 WDP_LOGD("type [%d],availability [%d],hdcp_support [%d],ctrl_port [%d] "
469 "max_tput[%d]", display->type, display->availability,
470 display->hdcp_support, display->port,display->max_tput);
472 __WDP_LOG_FUNC_EXIT__;
475 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
477 static int _ws_get_local_dev_mac(unsigned char *dev_mac)
479 __WDP_LOG_FUNC_ENTER__;
481 const char *file_path = DEFAULT_MAC_FILE_PATH;
482 char local_mac[OEM_MACSTR_LEN] = {0, };
487 fd = fopen(file_path, "r");
489 WDP_LOGE("Failed to open MAC info file [%s] (%s)",file_path, strerror(errno));
490 __WDP_LOG_FUNC_EXIT__;
495 ptr = fgets((char *)local_mac, WS_MACSTR_LEN, fd);
497 WDP_LOGE("Failed to read file or no data read(%s)", strerror(errno));
499 __WDP_LOG_FUNC_EXIT__;
502 WDP_SECLOGD("Local MAC address [%s]", ptr);
503 WDP_SECLOGD("Local MAC address [%s]", local_mac);
505 res = __ws_txt_to_mac((unsigned char *)local_mac, dev_mac);
507 WDP_LOGE("Failed to convert text to MAC address");
509 __WDP_LOG_FUNC_EXIT__;
513 WDP_LOGD("Local Device MAC address [" MACSECSTR "]", MAC2SECSTR(dev_mac));
516 __WDP_LOG_FUNC_EXIT__;
520 static void _supplicant_signal_cb(GDBusConnection *connection,
521 const gchar *sender, const gchar *object_path, const gchar *interface,
522 const gchar *signal, GVariant *parameters, gpointer user_data)
524 #if defined (TIZEN_DEBUG_DBUS_VALUE)
525 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
526 #endif /* TIZEN_DEBUG_DBUS_VALUE */
529 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
533 if (!g_strcmp0(signal,"InterfaceAdded")) {
534 WDP_LOGD("InterfaceAdded");
536 } else if (!g_strcmp0(signal,"InterfaceRemoved")) {
537 WDP_LOGD("InterfaceRemoved");
538 static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
539 const char *path = NULL;
541 g_variant_get(parameters, "(&o)", &path);
542 g_strlcpy(interface_path, path, DBUS_OBJECT_PATH_MAX);
544 WDP_LOGD("Retrive removed path [%s]", interface_path);
546 if (!g_strcmp0(g_pd->group_iface_path, interface_path)) {
548 WDP_LOGD("p2p group interface removed");
549 memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
551 #if defined(TIZEN_WLAN_CONCURRENT_ENABLE) && defined(TIZEN_MOBILE)
552 else if (!g_strcmp0(g_pd->iface_path, interface_path)) {
554 WDP_LOGD("p2p interface removed");
555 wfd_oem_event_s event;
559 memset(&event, 0x0, sizeof(wfd_oem_event_s));
560 event.event_id = WFD_OEM_EVENT_DEACTIVATED;
561 g_pd->callback(g_pd->user_data, &event);
563 memset(g_pd->iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
565 #endif /* TIZEN_WLAN_CONCURRENT_ENABLE && TIZEN_MOBILE */
566 } else if(!g_strcmp0(signal,"PropertiesChanged")){
567 WDP_LOGD("PropertiesChanged");
571 static void __ws_get_peer_property(const char *key, GVariant *value, void *user_data)
573 __WDP_LOG_FUNC_ENTER__;
575 wfd_oem_device_s *peer = (wfd_oem_device_s *)user_data;
577 __WDP_LOG_FUNC_EXIT__;
580 #if defined (TIZEN_DEBUG_DBUS_VALUE)
581 CHECK_KEY_VALUE(key, value);
582 #endif /* TIZEN_DEBUG_DBUS_VALUE */
584 if (g_strcmp0(key, "DeviceName") == 0) {
585 const char *name = NULL;
587 g_variant_get(value, "&s", &name);
588 g_strlcpy(peer->dev_name, name, WS_SSID_LEN);
589 WDP_LOGD("Device name [%s]", peer->dev_name);
591 } else if (g_strcmp0(key, "config_method") == 0) {
592 int config_methods = 0;
593 g_variant_get(value, "q", &config_methods);
595 if (config_methods & WS_CONFIG_METHOD_DISPLAY)
596 peer->config_methods |= WFD_OEM_WPS_MODE_DISPLAY;
597 if (config_methods & WS_CONFIG_METHOD_PUSHBUTTON)
598 peer->config_methods |= WFD_OEM_WPS_MODE_PBC;
599 if (config_methods & WS_CONFIG_METHOD_KEYPAD)
600 peer->config_methods |= WFD_OEM_WPS_MODE_KEYPAD;
601 WDP_LOGD("Config method [0x%x]", peer->config_methods);
603 } else if (g_strcmp0(key, "level") == 0) {
605 } else if (g_strcmp0(key, "devicecapability") == 0) {
606 unsigned char devicecapability = 0;
608 g_variant_get(value, "y", &devicecapability);
609 peer->dev_flags = (int)devicecapability;
610 WDP_LOGD("Device Capa [0x%02x]", peer->dev_flags);
612 } else if (g_strcmp0(key, "groupcapability") == 0) {
613 unsigned char groupcapability = 0;
615 g_variant_get(value, "y", &groupcapability);
616 WDP_LOGD("Group Capa [0x%02x]", groupcapability);
617 if (groupcapability & WS_GROUP_CAP_GROUP_OWNER) {
618 peer->group_flags = WFD_OEM_GROUP_FLAG_GROUP_OWNER;
619 peer->dev_role = WFD_OEM_DEV_ROLE_GO;
621 if (groupcapability & WS_GROUP_CAP_PERSISTENT_GROUP)
622 peer->group_flags = WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
624 } else if (g_strcmp0(key, "PrimaryDeviceType") == 0) {
625 unsigned char primarydevicetype[WS_DEVTYPE_LEN] = {0,};
627 if(__ws_unpack_ay(primarydevicetype, value, WS_DEVTYPE_LEN)) {
628 peer->pri_dev_type = primarydevicetype[1];
629 peer->sec_dev_type = primarydevicetype[WS_DEVTYPE_LEN -1];
631 } else if (g_strcmp0(key, "SecondaryDeviceTypes") == 0) {
632 } else if (g_strcmp0(key, "VendorExtension") == 0) {
633 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
634 } else if (g_strcmp0(key, "IEs") == 0) {
635 unsigned char ies[WFD_SUBELEM_LEN_DEV_INFO + 3] = {0,};
637 if(__ws_unpack_ay(ies, value, WFD_SUBELEM_LEN_DEV_INFO + 3))
638 __parsing_wfd_info(ies, &(peer->display));
639 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
640 } else if (g_strcmp0(key, "DeviceAddress") == 0) {
642 if (__ws_unpack_ay(peer->dev_addr, value, WS_MACADDR_LEN))
643 WDP_LOGD("Device address [" MACSTR "]", MAC2STR(peer->dev_addr));
645 } else if (g_strcmp0(key, "InterfaceAddress") == 0) {
647 if (__ws_unpack_ay(peer->intf_addr, value, WS_MACADDR_LEN))
648 WDP_LOGD("Interface address [" MACSTR "]", MAC2STR(peer->intf_addr));
650 } else if (g_strcmp0(key, "GODeviceAddress") == 0) {
652 if (__ws_unpack_ay(peer->go_dev_addr, value, WS_MACADDR_LEN))
653 WDP_LOGD("GODevice address [" MACSTR "]", MAC2STR(peer->go_dev_addr));
655 if(!ISZEROMACADDR(peer->go_dev_addr))
656 peer->dev_role = WFD_OEM_DEV_ROLE_GC;
658 WDP_LOGD("Unknown value");
660 __WDP_LOG_FUNC_EXIT__;
664 static void __ws_peer_property(const char *key, GVariant *value, void *user_data)
666 __WDP_LOG_FUNC_ENTER__;
668 __WDP_LOG_FUNC_EXIT__;
672 wfd_oem_dev_data_s *peer = (wfd_oem_dev_data_s *)user_data;
673 #if defined (TIZEN_DEBUG_DBUS_VALUE)
674 CHECK_KEY_VALUE(key, value);
675 #endif /* TIZEN_DEBUG_DBUS_VALUE */
676 if (g_strcmp0(key, "DeviceName") == 0) {
677 const char *name = NULL;
679 g_variant_get(value, "&s", &name);
680 g_strlcpy(peer->name, name, WS_SSID_LEN);
681 WDP_LOGD("Device Name [%s]", peer->name);
683 } else if (g_strcmp0(key, "config_method") == 0) {
684 int config_methods = 0;
686 g_variant_get(value, "q", &config_methods);
688 if (config_methods & WS_CONFIG_METHOD_DISPLAY)
689 peer->config_methods |= WFD_OEM_WPS_MODE_DISPLAY;
690 if (config_methods & WS_CONFIG_METHOD_PUSHBUTTON)
691 peer->config_methods |= WFD_OEM_WPS_MODE_PBC;
692 if (config_methods & WS_CONFIG_METHOD_KEYPAD)
693 peer->config_methods |= WFD_OEM_WPS_MODE_KEYPAD;
694 WDP_LOGD("Config method [0x%x]", peer->config_methods);
696 } else if (g_strcmp0(key, "level") == 0) {
698 } else if (g_strcmp0(key, "devicecapability") == 0) {
699 unsigned char devicecapability = 0;
701 g_variant_get(value, "y", &devicecapability);
702 peer->dev_flags = (int)devicecapability;
703 WDP_LOGD("Device Capa [0x%02x]", peer->dev_flags);
705 } else if (g_strcmp0(key, "groupcapability") == 0) {
706 unsigned char groupcapability = 0;
708 g_variant_get(value, "y", &groupcapability);
709 WDP_LOGD("Group Capa [0x%02x]", groupcapability);
710 if (groupcapability & WS_GROUP_CAP_GROUP_OWNER) {
711 peer->group_flags = WFD_OEM_GROUP_FLAG_GROUP_OWNER;
712 peer->dev_role = WFD_OEM_DEV_ROLE_GO;
714 if (groupcapability & WS_GROUP_CAP_PERSISTENT_GROUP)
715 peer->group_flags = WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
717 } else if (g_strcmp0(key, "PrimaryDeviceType") == 0) {
718 unsigned char primarydevicetype[WS_DEVTYPE_LEN] = {0,};
720 if (__ws_unpack_ay(primarydevicetype, value, WS_DEVTYPE_LEN)) {
721 peer->pri_dev_type = primarydevicetype[1];
722 peer->sec_dev_type = primarydevicetype[WS_DEVTYPE_LEN -1];
724 } else if (g_strcmp0(key, "SecondaryDeviceTypes") == 0) {
725 } else if (g_strcmp0(key, "VendorExtension") == 0) {
726 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
727 } else if (g_strcmp0(key, "IEs") == 0) {
728 unsigned char ies[WFD_SUBELEM_LEN_DEV_INFO + 3] = {0,};
730 if(__ws_unpack_ay(ies, value, WFD_SUBELEM_LEN_DEV_INFO + 3))
731 __parsing_wfd_info(ies, &(peer->display));
732 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
733 } else if (g_strcmp0(key, "DeviceAddress") == 0) {
735 if (__ws_unpack_ay(peer->p2p_dev_addr, value, WS_MACADDR_LEN))
736 WDP_LOGD("Device address [" MACSTR "]", MAC2STR(peer->p2p_dev_addr));
738 } else if (g_strcmp0(key, "InterfaceAddress") == 0) {
740 if (__ws_unpack_ay(peer->p2p_intf_addr, value, WS_MACADDR_LEN))
741 WDP_LOGD("Interface Address [" MACSTR "]", MAC2STR(peer->p2p_intf_addr));
743 } else if (g_strcmp0(key, "GODeviceAddress") == 0) {
745 unsigned char go_dev_addr[OEM_MACADDR_LEN] = {0,};
746 if (__ws_unpack_ay(go_dev_addr, value, WS_MACADDR_LEN))
747 WDP_LOGD("[" MACSTR "]", MAC2STR(go_dev_addr));
749 if(!ISZEROMACADDR(go_dev_addr))
750 peer->dev_role = WFD_OEM_DEV_ROLE_GC;
751 #if defined(TIZEN_FEATURE_ASP)
752 } else if (g_strcmp0(key, "AdvertiseService") == 0) {
753 WDP_LOGD("size [%d]", g_variant_get_size(value));
754 if (g_variant_get_size(value) != 0) {
755 peer->has_asp_services = 1;
757 peer->has_asp_services = 0;
759 #endif /* TIZEN_FEATURE_ASP */
761 WDP_LOGD("Unknown value");
763 __WDP_LOG_FUNC_EXIT__;
767 void __ws_interface_property(const char *key, GVariant *value, void *user_data)
769 __WDP_LOG_FUNC_ENTER__;
770 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
773 #if defined (TIZEN_DEBUG_DBUS_VALUE)
774 CHECK_KEY_VALUE(key, value);
775 #endif /* TIZEN_DEBUG_DBUS_VALUE */
776 if (g_strcmp0(key, "Ifname") == 0) {
777 const char *ifname = NULL;
779 g_variant_get(value, "&s", &ifname);
780 g_strlcpy(event->ifname, ifname, OEM_IFACE_NAME_LEN+1);
781 WDP_LOGD("Ifname [%s]", event->ifname);
784 __WDP_LOG_FUNC_EXIT__;
788 void __ws_group_property(const char *key, GVariant *value, void *user_data)
790 __WDP_LOG_FUNC_ENTER__;
791 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
792 if(!event || !event->edata)
795 wfd_oem_group_data_s *group = (wfd_oem_group_data_s *)event->edata;
796 #if defined (TIZEN_DEBUG_DBUS_VALUE)
797 CHECK_KEY_VALUE(key, value);
798 #endif /* TIZEN_DEBUG_DBUS_VALUE */
799 if (g_strcmp0(key, "Role") == 0) {
800 const char *role = NULL;
802 g_variant_get(value, "&s", &role);
803 WDP_LOGD("Role [%s]", role);
805 if (!strncmp(role, "GO", 2))
806 event->dev_role = WFD_OEM_DEV_ROLE_GO;
807 else if (!strncmp(role, "client", 6))
808 event->dev_role = WFD_OEM_DEV_ROLE_GC;
810 } else if (g_strcmp0(key, "Frequency") == 0) {
813 g_variant_get(value, "q", &frequency);
814 group->freq = (int)frequency;
816 } else if (g_strcmp0(key, "Passphrase") == 0) {
817 const char *passphrase = NULL;
819 g_variant_get(value, "&s", &passphrase);
820 g_strlcpy(group->pass, passphrase, OEM_PASS_PHRASE_LEN+1);
821 WDP_LOGD("passphrase [%s]", group->pass);
823 } else if (g_strcmp0(key, "Group") == 0) {
825 } else if (g_strcmp0(key, "SSID") == 0) {
826 unsigned char ssid[WS_SSID_LEN +1] = {0,};
828 __ws_unpack_ay(ssid, value, WS_SSID_LEN);
829 memcpy(group->ssid, ssid, WS_SSID_LEN+1);
830 WDP_LOGD("ssid [%s]", group->ssid);
832 } else if (g_strcmp0(key, "BSSID") == 0) {
834 if (__ws_unpack_ay(group->go_dev_addr, value, WS_MACADDR_LEN))
835 WDP_LOGD("[" MACSTR "]", MAC2STR(group->go_dev_addr));
838 WDP_LOGD("Unknown value");
840 __WDP_LOG_FUNC_EXIT__;
844 void __ws_extract_invitation_details(const char *key, GVariant *value, void *user_data)
846 __WDP_LOG_FUNC_ENTER__;
847 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
848 if(!event || !event->edata)
851 wfd_oem_invite_data_s *invitation = (wfd_oem_invite_data_s *)event->edata;
852 #if defined (TIZEN_DEBUG_DBUS_VALUE)
853 CHECK_KEY_VALUE(key, value);
854 #endif /* TIZEN_DEBUG_DBUS_VALUE */
855 if (g_strcmp0(key, "sa") == 0) {
856 if (__ws_unpack_ay(invitation->sa, value, WS_MACADDR_LEN))
857 WDP_LOGD("SA [" MACSTR "]", MAC2STR(invitation->sa));
859 } else if (g_strcmp0(key, "go_dev_addr") == 0) {
860 if (__ws_unpack_ay(invitation->go_dev_addr, value, WS_MACADDR_LEN))
861 WDP_LOGD("GO device address [" MACSTR "]", MAC2STR(invitation->go_dev_addr));
863 } else if (g_strcmp0(key, "bssid") == 0) {
864 if (__ws_unpack_ay(invitation->bssid, value, WS_MACADDR_LEN))
865 WDP_LOGD("BSSID [" MACSTR "]", MAC2STR(invitation->bssid));
867 } else if (g_strcmp0(key, "persistent_id") == 0) {
868 g_variant_get(value, "i", &(invitation->persistent_id));
869 WDP_LOGD("persistent id [%d]", invitation->persistent_id);
871 } else if (g_strcmp0(key, "op_freq") == 0) {
872 g_variant_get(value, "i", &(invitation->oper_freq));
873 WDP_LOGD("op freq [%d]", invitation->oper_freq);
875 WDP_LOGD("Unknown value");
877 __WDP_LOG_FUNC_EXIT__;
881 void __ws_extract_group_details(const char *key, GVariant *value, void *user_data)
883 __WDP_LOG_FUNC_ENTER__;
884 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
885 if(!event || !event->edata)
889 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
893 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
894 wfd_oem_group_data_s *group = (wfd_oem_group_data_s *)event->edata;
895 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
896 #if defined (TIZEN_DEBUG_DBUS_VALUE)
897 CHECK_KEY_VALUE(key, value);
898 #endif /* TIZEN_DEBUG_DBUS_VALUE */
899 if (g_strcmp0(key, "interface_object") == 0) {
900 static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
901 const char *i_path = NULL;
903 g_variant_get(value, "&o", &i_path);
904 g_strlcpy(interface_path, i_path, DBUS_OBJECT_PATH_MAX);
905 WDP_LOGD("Retrive Added path [%s]", interface_path);
906 g_strlcpy(g_pd->group_iface_path, interface_path, DBUS_OBJECT_PATH_MAX);
907 dbus_property_get_all(interface_path, g_pd->g_dbus,
908 SUPPLICANT_IFACE, __ws_interface_property, event);
910 } else if (g_strcmp0(key, "role") == 0) {
911 const char *role = NULL;
913 g_variant_get(value, "&s", &role);
914 WDP_LOGD("Role [%s]", role);
916 if (!strncmp(role, "GO", 2))
917 event->dev_role = WFD_OEM_DEV_ROLE_GO;
918 else if (!strncmp(role, "client", 6))
919 event->dev_role = WFD_OEM_DEV_ROLE_GC;
920 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
921 } else if (g_strcmp0(key, "IpAddr") == 0) {
923 if (__ws_unpack_ay(group->ip_addr, value, OEM_IPADDR_LEN))
924 WDP_LOGD("IP address [" IPSTR "]", IP2STR(group->ip_addr));
926 } else if (g_strcmp0(key, "IpAddrMask") == 0) {
928 if (__ws_unpack_ay(group->ip_addr_mask, value, OEM_IPADDR_LEN))
929 WDP_LOGD("IP mask [" IPSTR "]", IP2STR(group->ip_addr_mask));
931 } else if (g_strcmp0(key, "IpAddrGo") == 0) {
933 if (__ws_unpack_ay(group->ip_addr_go, value, OEM_IPADDR_LEN))
934 WDP_LOGD("GO IP address [" IPSTR "]", IP2STR(group->ip_addr_go));
935 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
936 } else if (g_strcmp0(key, "group_object") == 0) {
937 static char group_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
940 g_variant_get(value, "&o", &g_path);
941 g_strlcpy(group_path, g_path, DBUS_OBJECT_PATH_MAX);
942 WDP_LOGD("Retrive group path [%s]", group_path);
943 dbus_property_get_all(group_path, g_pd->g_dbus, SUPPLICANT_P2P_GROUP,
944 __ws_group_property, event);
947 g_dbus_connection_signal_subscribe(
949 SUPPLICANT_SERVICE, /* bus name */
950 SUPPLICANT_P2P_GROUP, /* interface */
952 group_path, /* object path */
954 G_DBUS_SIGNAL_FLAGS_NONE,
958 __WDP_LOG_FUNC_EXIT__;
962 void __ws_extract_gonegfailaure_details(const char *key, GVariant *value, void *user_data)
964 __WDP_LOG_FUNC_ENTER__;
965 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
966 if(!event || !event->edata)
969 wfd_oem_conn_data_s *conn = (wfd_oem_conn_data_s *)event->edata;
970 #if defined (TIZEN_DEBUG_DBUS_VALUE)
971 CHECK_KEY_VALUE(key, value);
972 #endif /* TIZEN_DEBUG_DBUS_VALUE */
973 if (g_strcmp0(key, "peer_object") == 0) {
974 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
977 g_variant_get(value, "&o", &path);
978 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
979 WDP_LOGD("Retrive peer path [%s]", peer_path);
981 } else if (g_strcmp0(key, "status") == 0) {
984 g_variant_get(value, "i", &status);
985 WDP_LOGD("Retrive status [%d]", status);
986 conn->status = status;
988 __WDP_LOG_FUNC_EXIT__;
992 void __ws_extract_gonegsuccess_details(const char *key, GVariant *value, void *user_data)
994 __WDP_LOG_FUNC_ENTER__;
995 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
996 if(!event || !event->edata)
999 wfd_oem_conn_data_s *edata = (wfd_oem_conn_data_s *)event->edata;
1000 #if defined (TIZEN_DEBUG_DBUS_VALUE)
1001 CHECK_KEY_VALUE(key, value);
1002 #endif /* TIZEN_DEBUG_DBUS_VALUE */
1003 if (g_strcmp0(key, "peer_object") == 0) {
1005 } else if (g_strcmp0(key, "status") == 0) {
1007 } else if (g_strcmp0(key, "passphrase") == 0) {
1009 } else if (g_strcmp0(key, "role_go") == 0) {
1011 const char *role = NULL;
1013 g_variant_get(value, "&s", &role);
1014 if (!strncmp(role, "GO", 2))
1015 event->dev_role = WFD_OEM_DEV_ROLE_GO;
1016 else if (!strncmp(role, "client", 6))
1017 event->dev_role = WFD_OEM_DEV_ROLE_GC;
1019 } else if (g_strcmp0(key, "ssid") == 0) {
1020 unsigned char ssid[WS_SSID_LEN +1] = {0,};
1022 __ws_unpack_ay(ssid, value, WS_SSID_LEN);
1023 memcpy(edata->ssid, ssid, WS_SSID_LEN+1);
1024 WDP_LOGD("ssid [%s]", edata->ssid);
1026 } else if (g_strcmp0(key, "peer_device_addr") == 0) {
1028 if(__ws_unpack_ay(edata->peer_device_addr, value, WS_MACADDR_LEN))
1029 WDP_LOGD("Device address[" MACSTR "]", MAC2STR(edata->peer_device_addr));
1031 } else if(g_strcmp0(key, "peer_interface_addr") == 0) {
1033 if(__ws_unpack_ay(edata->peer_intf_addr, value, WS_MACADDR_LEN))
1034 WDP_LOGD("Interface address [" MACSTR "]", MAC2STR(edata->peer_intf_addr));
1036 } else if (g_strcmp0(key, "wps_method") == 0) {
1038 } else if (g_strcmp0(key, "frequency_list") == 0) {
1040 } else if (g_strcmp0(key, "persistent_group") == 0) {
1042 g_variant_get(value, "i", &(edata->persistent_group));
1043 WDP_LOGD("persistent_group [%d]", edata->persistent_group);
1045 } else if (g_strcmp0(key, "peer_config_timeout") == 0) {
1048 __WDP_LOG_FUNC_EXIT__;
1052 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1053 void __ws_extract_peer_service(wfd_oem_event_s *data, unsigned char *service_hex, int tlvs_len)
1055 GList *services = NULL;
1056 wfd_oem_new_service_s *new_service = NULL;
1057 char *segment = NULL;
1063 while(ptr + 2 < WS_MAX_SERVICE_LEN &&
1064 (length = (service_hex[ptr+1]*256) + service_hex[ptr]) > 0) {
1065 segment = (char*) g_try_malloc0(length*2+1);
1067 __ws_byte_to_hex(segment, length * 2 + 1, &service_hex[ptr + 3], length);
1068 res = __ws_segment_to_service(segment, &new_service);
1070 WDP_LOGE("Failed to convert segment as service instance");
1075 services = g_list_append(services, new_service);
1081 data->edata_type = WFD_OEM_EDATA_TYPE_NEW_SERVICE;
1082 data->dev_role = count;
1083 data->edata = (void*) services;
1087 void __ws_extract_servicediscoveryresponse_details(const char *key, GVariant *value, void *user_data)
1089 __WDP_LOG_FUNC_ENTER__;
1090 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1094 #if defined (TIZEN_DEBUG_DBUS_VALUE)
1095 CHECK_KEY_VALUE(key, value);
1096 #endif /* TIZEN_DEBUG_DBUS_VALUE */
1097 if (g_strcmp0(key, "peer_object") == 0) {
1098 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1099 const char *path = NULL;
1102 g_variant_get(value, "&o", &path);
1106 WDP_LOGD("Retrive Added path [%s]", path);
1107 loc = strrchr(path,'/');
1109 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1110 __ws_txt_to_mac(peer_dev, event->dev_addr);
1112 } else if (g_strcmp0(key, "update_indicator")) {
1114 } else if (g_strcmp0(key, "tlvs")) {
1115 GVariantIter *iter = NULL;
1116 unsigned char service_hex[WS_MAX_SERVICE_LEN];
1117 int byte_length = 0;
1119 g_variant_get(value, "ay", &iter);
1121 WDP_LOGE("failed to get iterator");
1125 memset(service_hex, 0x0, WS_MAX_SERVICE_LEN);
1126 while (g_variant_iter_loop (iter, "y", &service_hex[byte_length]))
1128 g_variant_iter_free(iter);
1130 __ws_extract_peer_service(event, service_hex, byte_length);
1133 __WDP_LOG_FUNC_EXIT__;
1135 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1137 #if defined(TIZEN_FEATURE_ASP)
1138 static void __ws_extract_serviceaspresponse_details(const char *key, GVariant *value, void *user_data)
1140 __WDP_LOG_FUNC_ENTER__;
1141 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1142 if(!event || !event->edata)
1145 wfd_oem_asp_service_s *service = (wfd_oem_asp_service_s *)event->edata;
1147 if (g_strcmp0(key, "peer_object") == 0) {
1148 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1149 const char *path = NULL;
1152 g_variant_get(value, "o", &path);
1156 WDP_LOGD("Retrive Added path [%s]", path);
1157 loc = strrchr(path,'/');
1159 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1160 __ws_txt_to_mac(peer_dev, event->dev_addr);
1162 } else if (g_strcmp0(key, "srv_trans_id") == 0) {
1163 unsigned int srv_trans_id = 0;
1164 g_variant_get(value, "u", &srv_trans_id);
1165 service->tran_id = srv_trans_id;
1166 WDP_LOGD("Retrive srv_trans_id [%x]", service->tran_id);
1168 } else if (g_strcmp0(key, "adv_id") == 0) {
1169 unsigned int adv_id = 0;
1170 g_variant_get(value, "u", &adv_id);
1171 service->adv_id = adv_id;
1172 WDP_LOGD("Retrive adv_id [%x]", service->adv_id);
1174 } else if (g_strcmp0(key, "svc_status") == 0) {
1175 unsigned char svc_status = 0;
1176 g_variant_get(value, "u", &svc_status);
1177 service->status = svc_status;
1178 WDP_LOGD("Retrive svc_status [%x]", service->status);
1180 } else if (g_strcmp0(key, "config_methods") == 0) {
1181 unsigned int config_methods = 0;
1182 g_variant_get(value, "q", &config_methods);
1183 service->config_method = config_methods;
1184 WDP_LOGD("Retrive config_methods [%x]", service->config_method);
1186 } else if (g_strcmp0(key, "svc_str") == 0) {
1187 const char *svc_str = NULL;
1188 g_variant_get(value, "s", &svc_str);
1190 service->service_type = g_strdup(svc_str);
1191 WDP_LOGD("Retrive srv_name [%s]", service->service_type);
1193 } else if (g_strcmp0(key, "info") == 0) {
1194 const char *info = NULL;
1195 g_variant_get(value, "s", &info);
1197 service->service_info = g_strdup(info);
1198 WDP_LOGD("Retrive srv_info [%s]", service->service_info);
1200 __WDP_LOG_FUNC_EXIT__;
1203 static void __ws_extract_asp_provision_start_details(const char *key, GVariant *value, void *user_data)
1205 __WDP_LOG_FUNC_ENTER__;
1206 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1207 wfd_oem_asp_prov_s *asp_params = NULL;
1208 if (!event || !event->edata) {
1209 __WDP_LOG_FUNC_EXIT__;
1213 asp_params = (wfd_oem_asp_prov_s *)event->edata;
1215 if (g_strcmp0(key, "peer_object") == 0) {
1216 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1217 const char *path = NULL;
1220 g_variant_get(value, "&o", &path);
1222 __WDP_LOG_FUNC_EXIT__;
1226 WDP_LOGD("Retrive Added path [%s]", path);
1227 loc = strrchr(path,'/');
1229 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1230 __ws_txt_to_mac(peer_dev, event->dev_addr);
1232 } else if (g_strcmp0(key, "adv_id") == 0) {
1233 g_variant_get(value, "u", &asp_params->adv_id);
1234 WDP_LOGD("Retrive adv_id [%u]", asp_params->adv_id);
1236 } else if (g_strcmp0(key, "ses_id") == 0) {
1237 g_variant_get(value, "u", &asp_params->session_id);
1238 WDP_LOGD("Retrive session id [%u]", asp_params->session_id);
1240 } else if (g_strcmp0(key, "dev_passwd_id") == 0) {
1241 g_variant_get(value, "i", &event->wps_mode);
1242 WDP_LOGD("Retrive dev_passwd_id [%d]", event->wps_mode);
1244 } else if (g_strcmp0(key, "conncap") == 0) {
1245 g_variant_get(value, "u", &asp_params->network_role);
1246 WDP_LOGD("Retrive conncap [%x]", asp_params->network_role);
1248 } else if (g_strcmp0(key, "adv_mac") == 0) {
1249 if(__ws_unpack_ay(asp_params->service_mac, value, WS_MACADDR_LEN))
1250 WDP_LOGD("Adv address[" MACSTR "]", MAC2STR(asp_params->service_mac));
1252 } else if (g_strcmp0(key, "ses_mac") == 0) {
1253 if(__ws_unpack_ay(asp_params->session_mac, value, WS_MACADDR_LEN))
1254 WDP_LOGD("session address[" MACSTR "]", MAC2STR(asp_params->session_mac));
1256 } else if (g_strcmp0(key, "session_info") == 0) {
1257 const char *session_info = NULL;
1258 g_variant_get(value, "&s", &session_info);
1259 if (session_info != NULL)
1260 asp_params->session_information = g_strdup(session_info);
1261 WDP_LOGD("Retrive session_info [%s]", asp_params->session_information);
1263 __WDP_LOG_FUNC_EXIT__;
1266 static void __ws_extract_asp_provision_done_details(const char *key, GVariant *value, void *user_data)
1268 __WDP_LOG_FUNC_ENTER__;
1269 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1270 wfd_oem_asp_prov_s *asp_params = NULL;
1271 if (!event || !event->edata) {
1272 __WDP_LOG_FUNC_EXIT__;
1276 asp_params = (wfd_oem_asp_prov_s *)event->edata;
1279 if (g_strcmp0(key, "peer_object") == 0) {
1280 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1281 const char *path = NULL;
1284 g_variant_get(value, "&o", &path);
1286 __WDP_LOG_FUNC_EXIT__;
1290 WDP_LOGD("Retrive Added path [%s]", path);
1291 loc = strrchr(path,'/');
1293 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1294 __ws_txt_to_mac(peer_dev, event->dev_addr);
1296 WDP_LOGD("peer address[" MACSTR "]", MAC2STR(event->dev_addr));
1298 } else if (g_strcmp0(key, "adv_id") == 0) {
1299 g_variant_get(value, "u", &asp_params->adv_id);
1300 WDP_LOGD("Retrive adv_id [%u]", asp_params->adv_id);
1302 } else if (g_strcmp0(key, "ses_id") == 0) {
1303 g_variant_get(value, "u", &asp_params->session_id);
1304 WDP_LOGD("Retrive session id [%u]", asp_params->session_id);
1306 } else if (g_strcmp0(key, "dev_passwd_id") == 0) {
1307 g_variant_get(value, "i", &event->wps_mode);
1308 WDP_LOGD("Retrive dev_passwd_id [%d]", event->wps_mode);
1310 } else if (g_strcmp0(key, "conncap") == 0) {
1311 g_variant_get(value, "u", &asp_params->network_role);
1312 WDP_LOGD("Retrive network role [%x]", asp_params->network_role);
1314 } else if (g_strcmp0(key, "status") == 0) {
1315 g_variant_get(value, "u", &asp_params->status);
1316 WDP_LOGD("Retrive status [%x]", asp_params->status);
1318 } else if (g_strcmp0(key, "persist") == 0) {
1319 g_variant_get(value, "u", &asp_params->persistent_group_id);
1320 asp_params->persist = 1;
1321 WDP_LOGD("Retrive persist [%u]", asp_params->persistent_group_id);
1323 } else if (g_strcmp0(key, "adv_mac") == 0) {
1324 if(__ws_unpack_ay(asp_params->service_mac, value, WS_MACADDR_LEN))
1325 WDP_LOGD("Adv address[" MACSTR "]", MAC2STR(asp_params->service_mac));
1327 } else if (g_strcmp0(key, "ses_mac") == 0) {
1328 if(__ws_unpack_ay(asp_params->session_mac, value, WS_MACADDR_LEN))
1329 WDP_LOGD("session address[" MACSTR "]", MAC2STR(asp_params->session_mac));
1331 } else if (g_strcmp0(key, "group_mac") == 0) {
1332 if(__ws_unpack_ay(asp_params->group_mac, value, WS_MACADDR_LEN))
1333 WDP_LOGD("group address[" MACSTR "]", MAC2STR(asp_params->group_mac));
1335 __WDP_LOG_FUNC_EXIT__;
1338 static void __ws_extract_provision_fail_details(const char *key, GVariant *value, void *user_data)
1340 __WDP_LOG_FUNC_ENTER__;
1341 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1342 wfd_oem_asp_prov_s *asp_params = NULL;
1343 if(!event || !event->edata) {
1344 __WDP_LOG_FUNC_EXIT__;
1348 asp_params = (wfd_oem_asp_prov_s *)event->edata;
1350 if (g_strcmp0(key, "peer_object") == 0) {
1351 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1352 const char *path = NULL;
1355 g_variant_get(value, "&o", &path);
1357 __WDP_LOG_FUNC_EXIT__;
1361 WDP_LOGD("Retrive Added path [%s]", path);
1362 loc = strrchr(path,'/');
1364 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1365 __ws_txt_to_mac(peer_dev, event->dev_addr);
1367 } else if (g_strcmp0(key, "adv_id") == 0) {
1368 g_variant_get(value, "u", &asp_params->adv_id);
1369 WDP_LOGD("Retrive adv_id [%d]", asp_params->adv_id);
1371 } else if (g_strcmp0(key, "status") == 0) {
1372 g_variant_get(value, "i", &asp_params->status);
1373 WDP_LOGD("Retrive status [%d]", asp_params->status);
1375 } else if (g_strcmp0(key, "deferred_session_resp") == 0) {
1376 const char *session_info = NULL;
1377 g_variant_get(value, "&s", &session_info);
1378 if(session_info != NULL)
1379 asp_params->session_information = g_strdup(session_info);
1380 WDP_LOGD("Retrive deferred_session_resp [%s]", asp_params->session_information);
1382 __WDP_LOG_FUNC_EXIT__;
1384 #endif /* TIZEN_FEATURE_ASP */
1386 static int _ws_flush()
1388 __WDP_LOG_FUNC_ENTER__;
1389 GDBusConnection *g_dbus = NULL;
1390 dbus_method_param_s params;
1394 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
1395 __WDP_LOG_FUNC_EXIT__;
1399 g_dbus = g_pd->g_dbus;
1401 WDP_LOGE("DBus connection is NULL");
1402 __WDP_LOG_FUNC_EXIT__;
1405 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
1407 dbus_set_method_param(¶ms, "Flush", g_pd->iface_path, g_dbus);
1408 params.params = NULL;
1410 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
1412 WDP_LOGE("Failed to send command to wpa_supplicant");
1414 WDP_LOGD("Succeeded to flush");
1416 __WDP_LOG_FUNC_EXIT__;
1420 static int _ws_cancel()
1422 __WDP_LOG_FUNC_ENTER__;
1423 GDBusConnection *g_dbus = NULL;
1424 dbus_method_param_s params;
1428 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
1433 g_dbus = g_pd->g_dbus;
1435 WDP_LOGE("DBus connection is NULL");
1438 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
1440 dbus_set_method_param(¶ms, "Cancel", g_pd->iface_path , g_dbus);
1441 params.params = NULL;
1443 res = dbus_method_call(¶ms, SUPPLICANT_WPS, NULL, NULL);
1445 WDP_LOGE("Failed to send command to wpa_supplicant");
1447 WDP_LOGD("Succeeded to cancel");
1449 __WDP_LOG_FUNC_EXIT__;
1453 #if defined(TIZEN_FEATURE_ASP)
1454 int ws_get_advertise_service(const char *peer_path, GList **asp_services)
1456 __WDP_LOG_FUNC_ENTER__;
1457 GDBusConnection *g_dbus = NULL;
1458 GVariant *param = NULL;
1459 GVariant *reply = NULL;
1460 GVariant *temp = NULL;
1461 GError *error = NULL;
1462 GVariantIter *iter = NULL;
1463 wfd_oem_advertise_service_s *service;
1464 wfd_oem_asp_service_s *seek = NULL;
1465 unsigned char desc[7];
1466 unsigned int adv_id;
1467 unsigned int config_method;
1468 unsigned char length;
1474 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
1478 g_dbus = g_pd->g_dbus;
1480 WDP_LOGE("DBus connection is NULL");
1484 param = g_variant_new("(ss)", SUPPLICANT_P2P_PEER, "AdvertiseService");
1485 #if defined (TIZEN_DEBUG_DBUS_VALUE)
1486 DEBUG_PARAMS(param);
1487 #endif /* TIZEN_DEBUG_DBUS_VALUE */
1489 reply = g_dbus_connection_call_sync (
1491 SUPPLICANT_SERVICE, /* bus name */
1492 peer_path, /* object path */
1493 DBUS_PROPERTIES_INTERFACE, /* interface name */
1494 DBUS_PROPERTIES_METHOD_GET, /* method name */
1495 param, /* GVariant *params */
1496 NULL, /* reply_type */
1497 G_DBUS_CALL_FLAGS_NONE, /* flags */
1498 SUPPLICANT_TIMEOUT , /* timeout */
1499 NULL, /* cancellable */
1500 &error); /* error */
1503 WDP_LOGE("Error! Failed to get peer advertise service: [%s]",
1505 g_error_free(error);
1507 g_variant_unref(reply);
1508 __WDP_LOG_FUNC_EXIT__;
1512 if (reply != NULL) {
1514 #if defined (TIZEN_DEBUG_DBUS_VALUE)
1515 DEBUG_PARAMS(reply);
1516 #endif /* TIZEN_DEBUG_DBUS_VALUE */
1518 /* replay will have the format <(<ay>,)>
1519 * So, you need to remove tuple out side of variant and
1520 * variant out side of byte array
1522 temp = g_variant_get_child_value(reply, 0);
1523 temp = g_variant_get_child_value(temp, 0);
1524 g_variant_get(temp, "ay", &iter);
1526 g_variant_unref(reply);
1527 WDP_LOGE("Failed to get iterator");
1532 /* 4byte advertisement ID, 2 byte config method, 1byte length */
1534 memset(desc, 0x0, 7);
1535 while (cnt < 7 && g_variant_iter_loop (iter, "y", &desc[cnt])) {
1539 if (cnt != 7 || desc[6] == 0) {
1540 WDP_LOGE("Invalid descriptor header length cnt [%d]", cnt);
1541 g_variant_unref(reply);
1545 adv_id = desc[3] << 24 | desc[2] << 16 | desc[1] << 8 | desc[0];
1546 config_method = desc[4] << 8 | desc[4];
1549 value = g_try_malloc0(length + 1);
1550 if (value == NULL) {
1551 WDP_LOGE("g_try_malloc0 failed");
1552 g_variant_unref(reply);
1555 WDP_LOGD("adv_id[%u] config_method[%u] length[%hhu]", adv_id, config_method, length);
1558 while (cnt < length && g_variant_iter_loop (iter, "y", &value[cnt])) {
1562 if (cnt != length) {
1563 WDP_LOGE("Length doesn't matched with header value cnt [%d]", cnt);
1564 g_variant_unref(reply);
1570 service = (wfd_oem_advertise_service_s *)
1571 g_try_malloc0(sizeof(wfd_oem_advertise_service_s));
1572 if (service == NULL) {
1573 WDP_LOGE("g_try_malloc0 failed");
1574 g_variant_unref(reply);
1578 service->adv_id = adv_id;
1579 service->config_method = config_method;
1580 service->service_type_length = length;
1581 service->service_type = value;
1583 GLIST_ITER_START(seek_list, seek)
1584 if (g_strcmp0(seek->service_type, service->service_type) == 0) {
1585 WDP_LOGD("service type matched [%s] search_id [%llu]",
1586 service->service_type, seek->search_id);
1591 if(seek != NULL && seek->service_info != NULL) {
1592 WDP_LOGD("service info exists, service discovery will be performed");
1594 WDP_LOGD("service info doesn't exists. Add service to list");
1595 service->search_id = seek->search_id;
1596 *asp_services = g_list_append(*asp_services, service);
1599 g_variant_unref(reply);
1601 __WDP_LOG_FUNC_EXIT__;
1604 #endif /* TIZEN_FEATURE_ASP */
1606 static void _ws_process_device_found(GDBusConnection *connection,
1607 const gchar *object_path, GVariant *parameters)
1609 __WDP_LOG_FUNC_ENTER__;
1610 wfd_oem_event_s event;
1611 wfd_oem_dev_data_s *edata = NULL;
1612 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1614 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
1616 WDP_LOGF("Failed to allocate memory for event. [%s]",
1618 __WDP_LOG_FUNC_EXIT__;
1621 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1623 event.edata = (void*) edata;
1624 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
1625 event.event_id = WFD_OEM_EVENT_PEER_FOUND;
1627 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
1629 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
1630 __ws_peer_property, event.edata);
1632 #if defined(TIZEN_FEATURE_ASP)
1633 if(edata->has_asp_services)
1634 ws_get_advertise_service(peer_path, (GList **)&(event.asp_services));
1635 #endif /* TIZEN_FEATURE_ASP */
1637 g_pd->callback(g_pd->user_data, &event);
1638 #if defined(TIZEN_FEATURE_ASP)
1639 if(event.asp_services != NULL) {
1641 wfd_oem_advertise_service_s *service;
1642 for(l = (GList *)event.asp_services; l != NULL; l = l->next) {
1643 service = (wfd_oem_advertise_service_s *)l->data;
1644 g_free(service->service_type);
1646 event.asp_services = g_list_remove(l, service);
1650 #endif /* TIZEN_FEATURE_ASP */
1651 g_free(event.edata);
1653 __WDP_LOG_FUNC_EXIT__;
1656 static void _ws_process_device_lost(GDBusConnection *connection,
1657 const gchar *object_path, GVariant *parameters)
1659 __WDP_LOG_FUNC_ENTER__;
1660 wfd_oem_event_s event;
1661 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1663 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1665 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
1666 event.event_id = WFD_OEM_EVENT_PEER_DISAPPEARED;
1668 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
1670 g_pd->callback(g_pd->user_data, &event);
1672 __WDP_LOG_FUNC_EXIT__;
1675 static void _ws_process_find_stoppped(GDBusConnection *connection,
1676 const gchar *object_path, GVariant *parameters)
1678 __WDP_LOG_FUNC_ENTER__;
1679 wfd_oem_event_s event;
1681 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1683 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
1684 event.event_id = WFD_OEM_EVENT_DISCOVERY_FINISHED;
1686 g_pd->callback(g_pd->user_data, &event);
1688 __WDP_LOG_FUNC_EXIT__;
1691 static void _ws_process_prov_disc_req_display_pin(GDBusConnection *connection,
1692 const gchar *object_path, GVariant *parameters)
1694 __WDP_LOG_FUNC_ENTER__;
1696 wfd_oem_event_s event;
1697 wfd_oem_dev_data_s *edata = NULL;
1699 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1700 static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
1701 const char *path = NULL;
1702 const char *pin = NULL;
1705 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
1707 WDP_LOGF("Failed to allocate memory for event. [%s]",
1709 __WDP_LOG_FUNC_EXIT__;
1712 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1714 event.edata = (void*) edata;
1715 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
1716 event.event_id = WFD_OEM_EVENT_PROV_DISC_REQ;
1717 event.wps_mode = WFD_OEM_WPS_MODE_DISPLAY;
1719 g_variant_get(parameters, "(&o&s)", &path, &pin);
1720 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
1721 WDP_LOGD("Retrive Added path [%s]", peer_path);
1723 loc = strrchr(peer_path,'/');
1725 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1726 __ws_txt_to_mac(peer_dev, event.dev_addr);
1727 WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(event.dev_addr));
1729 g_strlcpy(event.wps_pin, pin, WS_PINSTR_LEN + 1);
1730 WDP_LOGD("Retrive pin [%s]", event.wps_pin);
1732 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
1733 __ws_peer_property, event.edata);
1735 g_pd->callback(g_pd->user_data, &event);
1736 g_free(event.edata);
1738 __WDP_LOG_FUNC_EXIT__;
1741 static void _ws_process_prov_disc_resp_display_pin(GDBusConnection *connection,
1742 const gchar *object_path, GVariant *parameters)
1744 __WDP_LOG_FUNC_ENTER__;
1746 wfd_oem_event_s event;
1747 wfd_oem_dev_data_s *edata = NULL;
1749 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1750 static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
1751 const char *path = NULL;
1752 const char *pin = NULL;
1755 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
1757 WDP_LOGF("Failed to allocate memory for event. [%s]",
1759 __WDP_LOG_FUNC_EXIT__;
1762 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1764 event.edata = (void*) edata;
1765 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
1766 event.event_id = WFD_OEM_EVENT_PROV_DISC_RESP;
1767 event.wps_mode = WFD_OEM_WPS_MODE_DISPLAY;
1769 g_variant_get(parameters, "(&o&s)", &path, &pin);
1770 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
1771 WDP_LOGD("Retrive Added path [%s]", peer_path);
1773 loc = strrchr(peer_path,'/');
1775 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1776 __ws_txt_to_mac(peer_dev, event.dev_addr);
1777 WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(event.dev_addr));
1779 g_strlcpy(event.wps_pin, pin, WS_PINSTR_LEN + 1);
1780 WDP_LOGD("Retrive pin [%s]", event.wps_pin);
1782 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
1783 __ws_peer_property, event.edata);
1785 g_pd->callback(g_pd->user_data, &event);
1786 g_free(event.edata);
1788 __WDP_LOG_FUNC_EXIT__;
1791 static void _ws_process_prov_disc_req_enter_pin(GDBusConnection *connection,
1792 const gchar *object_path, GVariant *parameters)
1794 __WDP_LOG_FUNC_ENTER__;
1795 wfd_oem_event_s event;
1796 wfd_oem_dev_data_s *edata = NULL;
1797 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1799 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
1801 WDP_LOGF("Failed to allocate memory for event. [%s]",
1803 __WDP_LOG_FUNC_EXIT__;
1806 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1808 event.edata = (void*) edata;
1809 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
1810 event.event_id = WFD_OEM_EVENT_PROV_DISC_REQ;
1811 event.wps_mode = WFD_OEM_WPS_MODE_KEYPAD;
1813 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
1815 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
1816 __ws_peer_property, event.edata);
1818 g_pd->callback(g_pd->user_data, &event);
1819 g_free(event.edata);
1821 __WDP_LOG_FUNC_EXIT__;
1824 static void _ws_process_prov_disc_resp_enter_pin(GDBusConnection *connection,
1825 const gchar *object_path, GVariant *parameters)
1827 __WDP_LOG_FUNC_ENTER__;
1828 wfd_oem_event_s event;
1829 wfd_oem_dev_data_s *edata = NULL;
1830 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1832 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
1834 WDP_LOGF("Failed to allocate memory for event. [%s]",
1836 __WDP_LOG_FUNC_EXIT__;
1839 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1841 event.edata = (void*) edata;
1842 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
1843 event.event_id = WFD_OEM_EVENT_PROV_DISC_RESP;
1844 event.wps_mode = WFD_OEM_WPS_MODE_KEYPAD;
1846 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
1848 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
1849 __ws_peer_property, event.edata);
1851 g_pd->callback(g_pd->user_data, &event);
1852 g_free(event.edata);
1854 __WDP_LOG_FUNC_EXIT__;
1857 static void _ws_process_prov_disc_pbc_req(GDBusConnection *connection,
1858 const gchar *object_path, GVariant *parameters)
1860 __WDP_LOG_FUNC_ENTER__;
1861 wfd_oem_event_s event;
1862 wfd_oem_dev_data_s *edata = NULL;
1863 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1865 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
1867 WDP_LOGF("Failed to allocate memory for event. [%s]",
1869 __WDP_LOG_FUNC_EXIT__;
1872 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1874 event.edata = (void*) edata;
1875 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
1876 event.event_id = WFD_OEM_EVENT_PROV_DISC_REQ;
1877 event.wps_mode = WFD_OEM_WPS_MODE_PBC;
1879 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
1881 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
1882 __ws_peer_property, event.edata);
1884 g_pd->callback(g_pd->user_data, &event);
1885 g_free(event.edata);
1887 __WDP_LOG_FUNC_EXIT__;
1890 static void _ws_process_prov_disc_pbc_resp(GDBusConnection *connection,
1891 const gchar *object_path, GVariant *parameters)
1893 __WDP_LOG_FUNC_ENTER__;
1894 wfd_oem_event_s event;
1895 wfd_oem_dev_data_s *edata = NULL;
1896 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1898 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
1900 WDP_LOGF("Failed to allocate memory for event. [%s]",
1902 __WDP_LOG_FUNC_EXIT__;
1905 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1907 event.edata = (void*) edata;
1908 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
1909 event.event_id = WFD_OEM_EVENT_PROV_DISC_RESP;
1910 event.wps_mode = WFD_OEM_WPS_MODE_PBC;
1912 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
1914 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
1915 __ws_peer_property, event.edata);
1917 g_pd->callback(g_pd->user_data, &event);
1918 g_free(event.edata);
1920 __WDP_LOG_FUNC_EXIT__;
1923 #if defined(TIZEN_FEATURE_ASP)
1924 static void _ws_process_prov_disc_failure(GDBusConnection *connection,
1925 const gchar *object_path, GVariant *parameters)
1927 __WDP_LOG_FUNC_ENTER__;
1928 GVariantIter *iter = NULL;
1929 wfd_oem_event_s event;
1930 wfd_oem_asp_prov_s *edata;
1932 edata = (wfd_oem_asp_prov_s *) g_try_malloc0(sizeof(wfd_oem_asp_prov_s));
1934 WDP_LOGF("Failed to allocate memory for event. [%s]",
1936 __WDP_LOG_FUNC_EXIT__;
1939 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1941 event.edata = (void*) edata;
1942 event.event_id = WFD_OEM_EVENT_PROV_DISC_FAIL;
1944 if (parameters != NULL) {
1945 g_variant_get(parameters, "(a{sv})", &iter);
1947 dbus_property_foreach(iter, __ws_extract_provision_fail_details, &event);
1948 event.edata_type = WFD_OEM_EDATA_TYPE_ASP_PROV;
1949 g_variant_iter_free(iter);
1952 WDP_LOGE("No Properties");
1955 g_pd->callback(g_pd->user_data, &event);
1957 if (event.edata_type == WFD_OEM_EDATA_TYPE_ASP_PROV)
1958 g_free(edata->session_information);
1961 __WDP_LOG_FUNC_EXIT__;
1964 static void _ws_process_prov_disc_failure(GDBusConnection *connection,
1965 const gchar *object_path, GVariant *parameters)
1967 __WDP_LOG_FUNC_ENTER__;
1968 wfd_oem_event_s event;
1969 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1970 static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
1971 const char *path = NULL;
1972 int prov_status = 0;
1975 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1977 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
1978 event.event_id = WFD_OEM_EVENT_PROV_DISC_FAIL;
1980 g_variant_get(parameters, "(&oi)", &path, &prov_status);
1981 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
1982 WDP_LOGD("Retrive Added path [%s]", peer_path);
1983 WDP_LOGD("Retrive Failure stateus [%d]", prov_status);
1985 loc = strrchr(peer_path,'/');
1987 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1988 __ws_txt_to_mac(peer_dev, event.dev_addr);
1989 WDP_LOGE("peer mac [" MACSTR "]", MAC2STR(event.dev_addr));
1991 g_pd->callback(g_pd->user_data, &event);
1993 __WDP_LOG_FUNC_EXIT__;
1995 #endif /* TIZEN_FEATURE_ASP */
1998 static void _ws_process_group_started(GDBusConnection *connection,
1999 const gchar *object_path, GVariant *parameters)
2001 __WDP_LOG_FUNC_ENTER__;
2002 GVariantIter *iter = NULL;
2003 wfd_oem_event_s event;
2004 wfd_oem_group_data_s *edata = NULL;
2006 edata = (wfd_oem_group_data_s*)calloc(1, sizeof(wfd_oem_group_data_s));
2008 WDP_LOGF("Failed to allocate memory for event. [%s]",
2010 __WDP_LOG_FUNC_EXIT__;
2013 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2015 event.edata = (void*) edata;
2016 event.edata_type = WFD_OEM_EDATA_TYPE_GROUP;
2017 event.event_id = WFD_OEM_EVENT_GROUP_CREATED;
2019 if(parameters != NULL){
2020 g_variant_get(parameters, "(a{sv})", &iter);
2023 dbus_property_foreach(iter, __ws_extract_group_details, &event);
2024 g_variant_iter_free(iter);
2027 WDP_LOGE("No properties");
2030 g_pd->callback(g_pd->user_data, &event);
2031 g_free(event.edata);
2033 __WDP_LOG_FUNC_EXIT__;
2036 static void _ws_process_go_neg_success(GDBusConnection *connection,
2037 const gchar *object_path, GVariant *parameters)
2039 __WDP_LOG_FUNC_ENTER__;
2040 GVariantIter *iter = NULL;
2041 wfd_oem_event_s event;
2042 wfd_oem_conn_data_s *edata = NULL;
2044 edata = (wfd_oem_conn_data_s*)calloc(1, sizeof(wfd_oem_conn_data_s));
2046 WDP_LOGF("Failed to allocate memory for event. [%s]",
2048 __WDP_LOG_FUNC_EXIT__;
2051 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2053 event.edata = edata;
2054 event.edata_type = WFD_OEM_EDATA_TYPE_CONN;
2055 event.event_id = WFD_OEM_EVENT_GO_NEG_DONE;
2057 if (parameters != NULL){
2058 g_variant_get(parameters, "(a{sv})", &iter);
2061 dbus_property_foreach(iter, __ws_extract_gonegsuccess_details, &event);
2062 g_variant_iter_free(iter);
2065 WDP_LOGE("No properties");
2068 g_pd->callback(g_pd->user_data, &event);
2071 __WDP_LOG_FUNC_EXIT__;
2074 static void _ws_process_go_neg_failure(GDBusConnection *connection,
2075 const gchar *object_path, GVariant *parameters)
2077 __WDP_LOG_FUNC_ENTER__;
2078 GVariantIter *iter = NULL;
2079 wfd_oem_event_s event;
2080 wfd_oem_conn_data_s *edata = NULL;
2082 edata = (wfd_oem_conn_data_s *) g_try_malloc0(sizeof(wfd_oem_conn_data_s));
2084 WDP_LOGF("Failed to allocate memory for event. [%s]",
2086 __WDP_LOG_FUNC_EXIT__;
2089 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2091 event.edata = (void*) edata;
2092 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
2093 event.event_id = WFD_OEM_EVENT_GO_NEG_FAIL;
2095 if (parameters != NULL) {
2096 g_variant_get(parameters, "(a{sv})", &iter);
2099 dbus_property_foreach(iter, __ws_extract_gonegfailaure_details, &event);
2100 g_variant_iter_free(iter);
2103 WDP_LOGE("No properties");
2106 g_pd->callback(g_pd->user_data, &event);
2107 g_free(event.edata);
2109 __WDP_LOG_FUNC_EXIT__;
2112 static void _ws_process_go_neg_request(GDBusConnection *connection,
2113 const gchar *object_path, GVariant *parameters)
2115 __WDP_LOG_FUNC_ENTER__;
2116 wfd_oem_event_s event;
2117 wfd_oem_dev_data_s *edata = NULL;
2118 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2119 static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
2120 const char *path = NULL;
2123 int dev_passwd_id = 0;
2124 int device_go_intent = 0;
2126 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
2128 WDP_LOGF("Failed to allocate memory for event. [%s]",
2130 __WDP_LOG_FUNC_EXIT__;
2133 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2135 event.edata = (void*) edata;
2136 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
2137 event.event_id = WFD_OEM_EVENT_GO_NEG_REQ;
2139 g_variant_get(parameters, "(&oqy)", &path, &dev_passwd_id, &device_go_intent);
2140 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
2142 WDP_LOGD("Retrive peer path [%s]", peer_path);
2143 WDP_LOGD("Retrive dev_passwd_id [%d]", dev_passwd_id);
2144 WDP_LOGD("Retrive device_go_intent [%d]", device_go_intent);
2146 if (dev_passwd_id == WS_DEV_PASSWD_ID_PUSH_BUTTON)
2147 event.wps_mode = WFD_OEM_WPS_MODE_PBC;
2148 else if (dev_passwd_id == WS_DEV_PASSWD_ID_REGISTRAR_SPECIFIED)
2149 event.wps_mode = WFD_OEM_WPS_MODE_DISPLAY;
2150 else if (dev_passwd_id == WS_DEV_PASSWD_ID_USER_SPECIFIED)
2151 event.wps_mode = WFD_OEM_WPS_MODE_KEYPAD;
2153 event.wps_mode = WFD_OEM_WPS_MODE_NONE;
2154 edata->device_go_intent = device_go_intent;
2156 loc = strrchr(peer_path,'/');
2158 __ws_mac_compact_to_normal(loc + 1, peer_dev);
2159 __ws_txt_to_mac(peer_dev, event.dev_addr);
2160 WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(event.dev_addr));
2162 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2163 __ws_peer_property, event.edata);
2165 g_pd->callback(g_pd->user_data, &event);
2166 g_free(event.edata);
2168 __WDP_LOG_FUNC_EXIT__;
2170 static void _ws_process_invitation_received(GDBusConnection *connection,
2171 const gchar *object_path, GVariant *parameters)
2173 __WDP_LOG_FUNC_ENTER__;
2174 GVariantIter *iter = NULL;
2175 wfd_oem_event_s event;
2176 wfd_oem_invite_data_s *edata = NULL;
2178 edata = (wfd_oem_invite_data_s *) g_try_malloc0(sizeof(wfd_oem_invite_data_s));
2180 WDP_LOGF("Failed to allocate memory for event. [%s]",
2182 __WDP_LOG_FUNC_EXIT__;
2185 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2187 event.edata = (void*) edata;
2188 event.edata_type = WFD_OEM_EDATA_TYPE_INVITE;
2189 event.event_id = WFD_OEM_EVENT_INVITATION_REQ;
2191 if (parameters != NULL) {
2192 g_variant_get(parameters, "(a{sv})", &iter);
2195 dbus_property_foreach(iter, __ws_extract_invitation_details, &event);
2196 g_variant_iter_free(iter);
2199 WDP_LOGE("No properties");
2201 memcpy(&(event.dev_addr), edata->sa, OEM_MACADDR_LEN);
2203 g_pd->callback(g_pd->user_data, &event);
2204 g_free(event.edata);
2206 __WDP_LOG_FUNC_EXIT__;
2209 static void _ws_process_invitation_result(GDBusConnection *connection,
2210 const gchar *object_path, GVariant *parameters)
2212 __WDP_LOG_FUNC_ENTER__;
2213 wfd_oem_event_s event;
2214 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2216 // g_pd->callback(g_pd->user_data, event);
2218 __WDP_LOG_FUNC_EXIT__;
2221 static void _ws_process_group_finished(GDBusConnection *connection,
2222 const gchar *object_path, GVariant *parameters)
2224 __WDP_LOG_FUNC_ENTER__;
2225 wfd_oem_event_s event;
2227 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2229 event.event_id = WFD_OEM_EVENT_GROUP_DESTROYED;
2230 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2232 g_dbus_connection_signal_unsubscribe(g_pd->g_dbus, g_pd->group_sub_id);
2233 memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
2236 g_pd->callback(g_pd->user_data, &event);
2238 __WDP_LOG_FUNC_EXIT__;
2241 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
2242 static void _ws_process_service_discovery_response(GDBusConnection *connection,
2243 const gchar *object_path, GVariant *parameters)
2245 __WDP_LOG_FUNC_ENTER__;
2246 GVariantIter *iter = NULL;
2247 wfd_oem_event_s event;
2249 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2251 event.event_id = WFD_OEM_EVENT_SERV_DISC_RESP;
2253 if(parameters != NULL) {
2254 g_variant_get(parameters, "(a{sv})", &iter);
2256 dbus_property_foreach(iter, __ws_extract_servicediscoveryresponse_details, &event);
2257 event.edata_type = WFD_OEM_EDATA_TYPE_NEW_SERVICE;
2258 g_variant_iter_free(iter);
2261 WDP_LOGE("No Properties");
2264 g_pd->callback(g_pd->user_data, &event);
2266 if (event.edata_type == WFD_OEM_EDATA_TYPE_NEW_SERVICE)
2267 g_list_free((GList*) event.edata);
2269 __WDP_LOG_FUNC_EXIT__;
2271 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
2273 #if defined(TIZEN_FEATURE_ASP)
2274 static void _ws_process_service_asp_response(GDBusConnection *connection,
2275 const gchar *object_path, GVariant *parameters)
2277 __WDP_LOG_FUNC_ENTER__;
2278 GVariantIter *iter = NULL;
2279 wfd_oem_event_s event;
2280 wfd_oem_asp_service_s *service, *tmp;
2282 service = (wfd_oem_asp_service_s *) g_try_malloc0(sizeof(wfd_oem_asp_service_s));
2284 WDP_LOGF("Failed to allocate memory for event. [%s]",
2286 __WDP_LOG_FUNC_EXIT__;
2289 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2291 event.edata = (void*) service;
2292 event.edata_type = WFD_OEM_EDATA_TYPE_ASP_SERVICE;
2293 event.event_id = WFD_OEM_EVENT_ASP_SERV_RESP;
2295 if(parameters != NULL) {
2296 g_variant_get(parameters, "(a{sv})", &iter);
2298 dbus_property_foreach(iter, __ws_extract_serviceaspresponse_details, &event);
2299 g_variant_iter_free(iter);
2302 WDP_LOGE("No Properties");
2304 GLIST_ITER_START(seek_list, tmp)
2305 if(tmp->tran_id == service->tran_id) {
2306 WDP_LOGD("srv_trans_id matched [%d] search_id [%llu]"
2307 ,tmp->tran_id, tmp->search_id);
2308 service->search_id = tmp->search_id;
2315 if(tmp->service_info != NULL)
2316 g_pd->callback(g_pd->user_data, &event);
2318 WDP_LOGD("service info is not required, don't notify to user");
2320 g_free(service->service_type);
2321 g_free(service->service_info);
2324 __WDP_LOG_FUNC_EXIT__;
2326 #endif /* TIZEN_FEATURE_ASP */
2328 static void _ws_process_persistent_group_added(GDBusConnection *connection,
2329 const gchar *object_path, GVariant *parameters)
2331 __WDP_LOG_FUNC_ENTER__;
2332 wfd_oem_event_s event;
2333 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2335 // g_pd->callback(g_pd->user_data, &event);
2337 __WDP_LOG_FUNC_EXIT__;
2340 static void _ws_process_persistent_group_removed(GDBusConnection *connection,
2341 const gchar *object_path, GVariant *parameters)
2343 __WDP_LOG_FUNC_ENTER__;
2344 wfd_oem_event_s event;
2345 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2347 // g_pd->callback(g_pd->user_data, &event);
2349 __WDP_LOG_FUNC_EXIT__;
2352 static void _ws_process_wps_failed(GDBusConnection *connection,
2353 const gchar *object_path, GVariant *parameters)
2355 __WDP_LOG_FUNC_ENTER__;
2356 GVariantIter *iter = NULL;
2357 wfd_oem_event_s event;
2358 const char *name = NULL;
2360 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2362 event.event_id = WFD_OEM_EVENT_WPS_FAIL;
2363 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2365 g_variant_get(parameters, "(&sa{sv})", &name, &iter);
2367 WDP_LOGD("code [%s]", name);
2372 GVariant *value = NULL;
2374 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
2375 #if defined (TIZEN_DEBUG_DBUS_VALUE)
2376 CHECK_KEY_VALUE(key, value);
2377 #endif /* TIZEN_DEBUG_DBUS_VALUE */
2379 g_variant_iter_free(iter);
2382 g_pd->callback(g_pd->user_data, &event);
2384 __WDP_LOG_FUNC_EXIT__;
2387 static void _ws_process_group_formation_failure(GDBusConnection *connection,
2388 const gchar *object_path, GVariant *parameters)
2390 __WDP_LOG_FUNC_ENTER__;
2391 wfd_oem_event_s event;
2393 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2395 event.event_id = WFD_OEM_EVENT_GROUP_FORMATION_FAILURE;
2396 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2398 g_pd->callback(g_pd->user_data, &event);
2400 __WDP_LOG_FUNC_EXIT__;
2403 static void _ws_process_invitation_accepted(GDBusConnection *connection,
2404 const gchar *object_path, GVariant *parameters)
2406 __WDP_LOG_FUNC_ENTER__;
2407 GVariantIter *iter = NULL;
2408 wfd_oem_event_s event;
2410 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2412 event.event_id = WFD_OEM_EVENT_INVITATION_ACCEPTED;
2413 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2415 if (parameters != NULL) {
2416 g_variant_get(parameters, "(a{sv})", &iter);
2420 GVariant *value = NULL;
2422 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
2423 CHECK_KEY_VALUE(key, value);
2424 if(g_strcmp0(key, "sa") == 0)
2425 if (__ws_unpack_ay(event.dev_addr, value, WS_MACADDR_LEN))
2426 WDP_LOGI("[" MACSTR "]", MAC2STR(event.dev_addr));
2428 g_variant_iter_free(iter);
2432 g_pd->callback(g_pd->user_data, &event);
2433 __WDP_LOG_FUNC_EXIT__;
2436 #if defined(TIZEN_FEATURE_ASP)
2437 static void _ws_process_asp_provision_start(GDBusConnection *connection,
2438 const gchar *object_path, GVariant *parameters)
2440 __WDP_LOG_FUNC_ENTER__;
2441 GVariantIter *iter = NULL;
2442 wfd_oem_event_s event;
2443 wfd_oem_asp_prov_s *edata;
2445 edata = (wfd_oem_asp_prov_s *) g_try_malloc0(sizeof(wfd_oem_asp_prov_s));
2447 WDP_LOGF("Failed to allocate memory for event. [%s]",
2449 __WDP_LOG_FUNC_EXIT__;
2452 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2454 event.edata = (void*) edata;
2455 event.event_id = WFD_OEM_EVENT_ASP_PROV_START;
2457 if (parameters != NULL) {
2458 g_variant_get(parameters, "(a{sv})", &iter);
2460 dbus_property_foreach(iter, __ws_extract_asp_provision_start_details, &event);
2461 event.edata_type = WFD_OEM_EDATA_TYPE_ASP_PROV;
2462 g_variant_iter_free(iter);
2465 WDP_LOGE("No Properties");
2468 g_pd->callback(g_pd->user_data, &event);
2470 if (event.edata_type == WFD_OEM_EDATA_TYPE_ASP_PROV)
2471 g_free(edata->session_information);
2474 __WDP_LOG_FUNC_EXIT__;
2477 static void _ws_process_asp_provision_done(GDBusConnection *connection,
2478 const gchar *object_path, GVariant *parameters)
2480 __WDP_LOG_FUNC_ENTER__;
2481 GVariantIter *iter = NULL;
2482 wfd_oem_event_s event;
2483 wfd_oem_asp_prov_s *edata;
2485 edata = (wfd_oem_asp_prov_s *) g_try_malloc0(sizeof(wfd_oem_asp_prov_s));
2487 WDP_LOGF("Failed to allocate memory for event. [%s]",
2489 __WDP_LOG_FUNC_EXIT__;
2492 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2494 event.edata = (void*) edata;
2495 event.event_id = WFD_OEM_EVENT_ASP_PROV_DONE;
2497 if (parameters != NULL) {
2498 g_variant_get(parameters, "(a{sv})", &iter);
2500 dbus_property_foreach(iter, __ws_extract_asp_provision_done_details, &event);
2501 event.edata_type = WFD_OEM_EDATA_TYPE_ASP_PROV;
2502 g_variant_iter_free(iter);
2505 WDP_LOGE("No Properties");
2508 g_pd->callback(g_pd->user_data, &event);
2511 __WDP_LOG_FUNC_EXIT__;
2513 #endif /* TIZEN_FEATURE_ASP */
2516 const char *interface;
2518 void (*function) (GDBusConnection *connection,const gchar *object_path,
2519 GVariant *parameters);
2520 } ws_p2pdevice_signal_map[] = {
2522 SUPPLICANT_P2PDEVICE,
2524 _ws_process_device_found
2527 SUPPLICANT_P2PDEVICE,
2529 _ws_process_device_lost
2532 SUPPLICANT_P2PDEVICE,
2534 _ws_process_find_stoppped
2537 SUPPLICANT_P2PDEVICE,
2538 "ProvisionDiscoveryRequestDisplayPin",
2539 _ws_process_prov_disc_req_display_pin
2542 SUPPLICANT_P2PDEVICE,
2543 "ProvisionDiscoveryResponseDisplayPin",
2544 _ws_process_prov_disc_resp_display_pin
2547 SUPPLICANT_P2PDEVICE,
2548 "ProvisionDiscoveryRequestEnterPin",
2549 _ws_process_prov_disc_req_enter_pin
2552 SUPPLICANT_P2PDEVICE,
2553 "ProvisionDiscoveryResponseEnterPin",
2554 _ws_process_prov_disc_resp_enter_pin
2557 SUPPLICANT_P2PDEVICE,
2558 "ProvisionDiscoveryPBCRequest",
2559 _ws_process_prov_disc_pbc_req
2562 SUPPLICANT_P2PDEVICE,
2563 "ProvisionDiscoveryPBCResponse",
2564 _ws_process_prov_disc_pbc_resp
2567 SUPPLICANT_P2PDEVICE,
2568 "ProvisionDiscoveryFailure",
2569 _ws_process_prov_disc_failure
2572 SUPPLICANT_P2PDEVICE,
2574 _ws_process_group_started
2577 SUPPLICANT_P2PDEVICE,
2578 "GONegotiationSuccess",
2579 _ws_process_go_neg_success
2582 SUPPLICANT_P2PDEVICE,
2583 "GONegotiationFailure",
2584 _ws_process_go_neg_failure
2587 SUPPLICANT_P2PDEVICE,
2588 "GONegotiationRequest",
2589 _ws_process_go_neg_request
2592 SUPPLICANT_P2PDEVICE,
2593 "InvitationReceived",
2594 _ws_process_invitation_received
2597 SUPPLICANT_P2PDEVICE,
2599 _ws_process_invitation_result
2602 SUPPLICANT_P2PDEVICE,
2604 _ws_process_group_finished
2606 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
2608 SUPPLICANT_P2PDEVICE,
2609 "ServiceDiscoveryResponse",
2610 _ws_process_service_discovery_response
2612 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
2613 #if defined(TIZEN_FEATURE_ASP)
2615 SUPPLICANT_P2PDEVICE,
2616 "ServiceASPResponse",
2617 _ws_process_service_asp_response
2620 SUPPLICANT_P2PDEVICE,
2621 "ASPProvisionStart",
2622 _ws_process_asp_provision_start
2625 SUPPLICANT_P2PDEVICE,
2627 _ws_process_asp_provision_done
2629 #endif /* TIZEN_FEATURE_ASP */
2631 SUPPLICANT_P2PDEVICE,
2632 "PersistentGroupAdded",
2633 _ws_process_persistent_group_added
2636 SUPPLICANT_P2PDEVICE,
2637 "PersistentGroupRemoved",
2638 _ws_process_persistent_group_removed
2641 SUPPLICANT_P2PDEVICE,
2643 _ws_process_wps_failed
2646 SUPPLICANT_P2PDEVICE,
2647 "GroupFormationFailure",
2648 _ws_process_group_formation_failure
2651 SUPPLICANT_P2PDEVICE,
2652 "InvitationAccepted",
2653 _ws_process_invitation_accepted
2662 static void _p2pdevice_signal_cb(GDBusConnection *connection,
2663 const gchar *sender, const gchar *object_path, const gchar *interface,
2664 const gchar *signal, GVariant *parameters, gpointer user_data)
2667 #if defined (TIZEN_DEBUG_DBUS_VALUE)
2668 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2669 #endif /* TIZEN_DEBUG_DBUS_VALUE */
2672 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
2676 for (i = 0; ws_p2pdevice_signal_map[i].member != NULL; i++) {
2677 if (!g_strcmp0(signal, ws_p2pdevice_signal_map[i].member) &&
2678 ws_p2pdevice_signal_map[i].function != NULL)
2679 ws_p2pdevice_signal_map[i].function(connection, object_path, parameters);
2684 static void __ws_parse_peer_joined(char *peer_path,
2685 unsigned char *dev_addr, unsigned char *ip_addr, GVariant *parameter)
2687 __WDP_LOG_FUNC_ENTER__;
2690 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
2691 const char *path = NULL;
2693 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
2695 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
2697 g_variant_get(parameter, "(&oay)", &path, &iter);
2698 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
2699 WDP_LOGD("Retrive Added path [%s]", peer_path);
2701 loc = strrchr(peer_path,'/');
2703 __ws_mac_compact_to_normal(loc + 1, peer_dev);
2704 __ws_txt_to_mac(peer_dev, dev_addr);
2705 WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(dev_addr));
2706 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
2707 for(i = 0; i < OEM_IPADDR_LEN; i++)
2708 g_variant_iter_loop (iter, "y", &ip_addr[i]);
2709 g_variant_iter_free(iter);
2711 WDP_LOGD("peer ip [" IPSTR "]", IP2STR(ip_addr));
2712 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
2714 __WDP_LOG_FUNC_EXIT__;
2719 static void _group_signal_cb(GDBusConnection *connection,
2720 const gchar *sender, const gchar *object_path, const gchar *interface,
2721 const gchar *signal, GVariant *parameters, gpointer user_data)
2723 #if defined (TIZEN_DEBUG_DBUS_VALUE)
2724 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2725 #endif /* TIZEN_DEBUG_DBUS_VALUE */
2728 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
2732 if (!g_strcmp0(signal,"PeerJoined")) {
2734 wfd_oem_event_s event;
2735 wfd_oem_dev_data_s *edata = NULL;
2737 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2739 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
2741 WDP_LOGF("Failed to allocate memory for event. [%s]",
2743 __WDP_LOG_FUNC_EXIT__;
2746 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2748 event.edata = (void*) edata;
2749 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
2750 event.event_id = WFD_OEM_EVENT_STA_CONNECTED;
2752 __ws_parse_peer_joined(peer_path, event.dev_addr, event.ip_addr_peer, parameters);
2754 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2755 __ws_peer_property, event.edata);
2757 g_pd->callback(g_pd->user_data, &event);
2760 } else if (!g_strcmp0(signal,"PeerDisconnected")) {
2762 wfd_oem_event_s event;
2764 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2766 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2768 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2769 event.event_id = WFD_OEM_EVENT_STA_DISCONNECTED;
2771 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
2773 g_pd->callback(g_pd->user_data, &event);
2777 static void __register_p2pdevice_signal(GVariant *value, void *user_data)
2779 __WDP_LOG_FUNC_ENTER__;
2780 ws_dbus_plugin_data_s * pd_data;
2781 static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2782 const char *path = NULL;
2785 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
2789 pd_data = (ws_dbus_plugin_data_s *)g_pd;
2791 g_variant_get(value, "(&o)", &path);
2792 g_strlcpy(interface_path, path, DBUS_OBJECT_PATH_MAX);
2793 g_strlcpy(pd_data->iface_path, path, DBUS_OBJECT_PATH_MAX);
2795 WDP_LOGD("interface object path [%s]", interface_path);
2796 /* subscribe interface p2p signal */
2797 WDP_LOGD("register P2PDevice iface signal");
2798 pd_data->p2pdevice_sub_id = g_dbus_connection_signal_subscribe(
2800 SUPPLICANT_SERVICE, /* bus name */
2801 SUPPLICANT_P2PDEVICE, /* interface */
2803 NULL, /* object path */
2805 G_DBUS_SIGNAL_FLAGS_NONE,
2806 _p2pdevice_signal_cb,
2808 __WDP_LOG_FUNC_EXIT__;
2811 static int _ws_create_interface(const char *iface_name, handle_reply function, void *user_data)
2813 __WDP_LOG_FUNC_ENTER__;
2814 GDBusConnection *g_dbus = NULL;
2815 GVariantBuilder *builder = NULL;
2816 dbus_method_param_s params;
2821 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
2825 g_dbus = g_pd->g_dbus;
2827 WDP_LOGE("DBus connection is NULL");
2830 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
2832 dbus_set_method_param(¶ms, "CreateInterface", SUPPLICANT_PATH, g_dbus);
2834 builder = g_variant_builder_new(G_VARIANT_TYPE ("a{sv}"));
2835 g_variant_builder_add(builder, "{sv}", "Ifname", g_variant_new_string(iface_name));
2836 g_variant_builder_add(builder, "{sv}", "ConfigFile", g_variant_new_string(CONF_FILE_PATH));
2837 params.params = g_variant_new("(a{sv})", builder);
2838 g_variant_builder_unref(builder);
2839 res = dbus_method_call(¶ms, SUPPLICANT_INTERFACE, function, user_data);
2841 WDP_LOGE("Failed to send command to wpa_supplicant");
2843 WDP_LOGD("Succeeded to CreateInterface");
2845 __WDP_LOG_FUNC_EXIT__;
2849 static int _ws_get_interface(const char *iface_name, handle_reply function, void *user_data)
2851 __WDP_LOG_FUNC_ENTER__;
2852 GDBusConnection *g_dbus = NULL;
2853 dbus_method_param_s params;
2857 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
2861 g_dbus = g_pd->g_dbus;
2863 WDP_LOGE("DBus connection is NULL");
2867 dbus_set_method_param(¶ms, SUPPLICANT_METHOD_GETINTERFACE,
2868 SUPPLICANT_PATH, g_pd->g_dbus);
2870 params.params = g_variant_new("(s)", iface_name);
2871 #if defined (TIZEN_DEBUG_DBUS_VALUE)
2872 DEBUG_PARAMS(params.params);
2873 #endif /* TIZEN_DEBUG_DBUS_VALUE */
2875 res = dbus_method_call(¶ms, SUPPLICANT_INTERFACE,
2876 function, user_data);
2879 WDP_LOGE("Failed to send command to wpa_supplicant");
2881 WDP_LOGD("Succeeded to get interface");
2883 __WDP_LOG_FUNC_EXIT__;
2887 #if defined (TIZEN_MOBILE) && (TIZEN_WLAN_BOARD_SPRD)
2888 static void __ws_remove_interface(GVariant *value, void *user_data)
2890 __WDP_LOG_FUNC_ENTER__;
2891 GDBusConnection *g_dbus = NULL;
2892 dbus_method_param_s params;
2893 const char *path = NULL;
2894 static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2898 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
2902 g_dbus = g_pd->g_dbus;
2904 WDP_LOGE("DBus connection is NULL");
2908 g_variant_get(value, "(&o)", &path);
2909 g_strlcpy(interface_path, path, DBUS_OBJECT_PATH_MAX);
2910 WDP_LOGD("interface object path [%s]", interface_path);
2912 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
2914 dbus_set_method_param(¶ms, "RemoveInterface", SUPPLICANT_PATH, g_dbus);
2915 params.params = g_variant_new("(o)", interface_path);
2917 res = dbus_method_call(¶ms, SUPPLICANT_INTERFACE, NULL, NULL);
2919 WDP_LOGE("Failed to send command to wpa_supplicant");
2921 WDP_LOGD("Succeeded to RemoveInterface");
2923 __WDP_LOG_FUNC_EXIT__;
2926 #endif /* (TIZEN_MOBILE) && (TIZEN_WLAN_BOARD_SPRD) */
2928 static int _ws_init_dbus_connection(void)
2930 __WDP_LOG_FUNC_ENTER__;
2931 GDBusConnection *conn = NULL;
2932 GError *error = NULL;
2936 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
2940 conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
2944 WDP_LOGE("Error! Failed to connect to the D-BUS daemon: [%s]",
2946 g_error_free(error);
2948 __WDP_LOG_FUNC_EXIT__;
2952 g_pd->g_dbus = conn;
2954 WDP_LOGD("register supplicant signal");
2955 /* subscribe supplicant signal */
2956 g_pd->supp_sub_id = g_dbus_connection_signal_subscribe(
2958 SUPPLICANT_SERVICE, /* bus name */
2959 SUPPLICANT_INTERFACE, /* interface */
2961 SUPPLICANT_PATH, /* object path */
2963 G_DBUS_SIGNAL_FLAGS_NONE,
2964 _supplicant_signal_cb,
2966 #if defined (TIZEN_MOBILE) && (TIZEN_WLAN_BOARD_SPRD)
2967 if(_ws_get_interface(COMMON_IFACE_NAME, NULL, NULL) < 0)
2968 _ws_create_interface(COMMON_IFACE_NAME, NULL, NULL);
2969 if(_ws_get_interface(P2P_IFACE_NAME, __register_p2pdevice_signal, NULL) < 0)
2970 res = _ws_create_interface(P2P_IFACE_NAME, __register_p2pdevice_signal, NULL);
2971 #else /* (TIZEN_MOBILE) && (TIZEN_WLAN_BOARD_SPRD) */
2972 if(_ws_get_interface(COMMON_IFACE_NAME, __register_p2pdevice_signal, NULL) < 0)
2973 res = _ws_create_interface(COMMON_IFACE_NAME, __register_p2pdevice_signal, NULL);
2974 #endif /* (TIZEN_MOBILE) && (TIZEN_WLAN_BOARD_SPRD) */
2977 WDP_LOGE("Failed to subscribe interface signal");
2979 WDP_LOGI("Successfully register signal filters");
2981 __WDP_LOG_FUNC_EXIT__;
2985 static int _ws_deinit_dbus_connection(void)
2987 GDBusConnection *g_dbus = NULL;
2990 WDP_LOGE("Invalid parameter");
2991 __WDP_LOG_FUNC_EXIT__;
2995 g_dbus = g_pd->g_dbus;
2997 WDP_LOGE("DBus connection is NULL");
3001 g_dbus_connection_signal_unsubscribe(g_dbus, g_pd->supp_sub_id);
3002 g_dbus_connection_signal_unsubscribe(g_dbus, g_pd->p2pdevice_sub_id);
3003 g_dbus_connection_signal_unsubscribe(g_dbus, g_pd->group_sub_id);
3005 g_pd->group_iface_sub_id = 0;
3006 g_pd->p2pdevice_sub_id = 0;
3007 g_pd->group_sub_id = 0;
3008 memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
3009 memset(g_pd->iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
3011 g_object_unref(g_dbus);
3015 int wfd_plugin_load(wfd_oem_ops_s **ops)
3018 WDP_LOGE("Invalid parameter");
3022 *ops = &supplicant_ops;
3027 static int _ws_reset_plugin(ws_dbus_plugin_data_s *f_pd)
3029 __WDP_LOG_FUNC_ENTER__;
3032 WDP_LOGE("Invalid parameter");
3033 __WDP_LOG_FUNC_EXIT__;
3037 _ws_deinit_dbus_connection();
3039 if (f_pd->activated)
3040 ws_deactivate(f_pd->concurrent);
3044 __WDP_LOG_FUNC_EXIT__;
3048 #ifndef TIZEN_WIFI_MODULE_BUNDLE
3049 static int __ws_check_net_interface(char* if_name)
3054 if (if_name == NULL) {
3055 WDP_LOGE("Invalid param");
3059 fd = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
3061 WDP_LOGE("socket create error: %d", fd);
3065 memset(&ifr, 0, sizeof(ifr));
3066 strncpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name));
3067 ifr.ifr_name[IFNAMSIZ-1] = '\0';
3069 if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) {
3071 WDP_LOGE("ioctl error: SIOCGIFFLAGS: %s [ %s ]", strerror(errno), if_name); /* interface is not found. */
3077 if (ifr.ifr_flags & IFF_UP) {
3078 WDP_LOGD("%s interface is up", if_name);
3080 } else if (!(ifr.ifr_flags & IFF_UP)) {
3081 WDP_LOGD("%s interface is down", if_name);
3088 int ws_init(wfd_oem_event_cb callback, void *user_data)
3090 __WDP_LOG_FUNC_ENTER__;
3093 _ws_reset_plugin(g_pd);
3096 g_pd = (ws_dbus_plugin_data_s*) g_try_malloc0 (sizeof(ws_dbus_plugin_data_s));
3098 WDP_LOGE("Failed to allocate memory for plugin data. [%s]", strerror(errno));
3102 g_pd->callback = callback;
3103 g_pd->user_data = user_data;
3104 g_pd->initialized = TRUE;
3106 __WDP_LOG_FUNC_EXIT__;
3112 __WDP_LOG_FUNC_ENTER__;
3115 _ws_reset_plugin(g_pd);
3119 __WDP_LOG_FUNC_EXIT__;
3123 gboolean _ws_util_execute_file(const char *file_path,
3124 char *const args[], char *const envs[])
3129 register unsigned int index = 0;
3131 while (args[index] != NULL) {
3132 WDP_LOGD("[%s]", args[index]);
3136 if (!(pid = fork())) {
3137 WDP_LOGD("pid(%d), ppid(%d)", getpid(), getppid());
3138 WDP_LOGD("Inside child, exec (%s) command", file_path);
3141 if (execve(file_path, args, envs) == -1) {
3142 WDP_LOGE("Fail to execute command (%s)", strerror(errno));
3145 } else if (pid > 0) {
3146 if (waitpid(pid, &rv, 0) == -1)
3147 WDP_LOGD("wait pid (%u) rv (%d)", pid, rv);
3148 if (WIFEXITED(rv)) {
3149 WDP_LOGD("exited, rv=%d", WEXITSTATUS(rv));
3150 } else if (WIFSIGNALED(rv)) {
3151 WDP_LOGD("killed by signal %d", WTERMSIG(rv));
3152 } else if (WIFSTOPPED(rv)) {
3153 WDP_LOGD("stopped by signal %d", WSTOPSIG(rv));
3154 } else if (WIFCONTINUED(rv)) {
3155 WDP_LOGD("continued");
3161 WDP_LOGE("failed to fork (%s)", strerror(errno));
3165 #ifndef TIZEN_WIFI_MODULE_BUNDLE
3166 static int __ws_p2p_firmware_start(void)
3168 GError *error = NULL;
3169 GVariant *reply = NULL;
3170 GVariant *param = NULL;
3171 GDBusConnection *connection = NULL;
3172 const char *device = "p2p";
3174 connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
3175 if (connection == NULL) {
3177 WDP_LOGE("Error! Failed to connect to the D-BUS daemon: [%s]",
3179 g_error_free(error);
3181 __WDP_LOG_FUNC_EXIT__;
3184 param = g_variant_new("(s)", device);
3186 reply = g_dbus_connection_call_sync (connection,
3187 NETCONFIG_SERVICE, /* bus name */
3188 NETCONFIG_WIFI_PATH, /* object path */
3189 NETCONFIG_WIFI_INTERFACE ".Firmware", /* interface name */
3190 "Start", /* method name */
3191 param, /* GVariant *params */
3192 NULL, /* reply_type */
3193 G_DBUS_CALL_FLAGS_NONE, /* flags */
3194 NETCONFIG_DBUS_REPLY_TIMEOUT , /* timeout */
3195 NULL, /* cancellable */
3196 &error); /* error */
3199 if(strstr(error->message, ".AlreadyExists") != NULL) {
3200 WDP_LOGD("p2p already enabled");
3201 g_error_free(error);
3204 WDP_LOGE("Error! Failed to call net-config method: [%s]",
3206 g_error_free(error);
3208 g_variant_unref(reply);
3209 g_object_unref(connection);
3210 __WDP_LOG_FUNC_EXIT__;
3215 g_variant_unref(reply);
3216 g_object_unref(connection);
3220 static int __ws_p2p_firmware_stop(void)
3222 GError *error = NULL;
3223 GVariant *reply = NULL;
3224 GVariant *param = NULL;
3225 GDBusConnection *connection = NULL;
3226 const char *device = "p2p";
3228 connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
3229 if (connection == NULL) {
3231 WDP_LOGE("Error! Failed to connect to the D-BUS daemon: [%s]",
3233 g_error_free(error);
3235 __WDP_LOG_FUNC_EXIT__;
3238 param = g_variant_new("(s)", device);
3240 reply = g_dbus_connection_call_sync (connection,
3241 NETCONFIG_SERVICE, /* bus name */
3242 NETCONFIG_WIFI_PATH, /* object path */
3243 NETCONFIG_WIFI_INTERFACE ".Firmware", /* interface name */
3244 "Stop", /* method name */
3245 param, /* GVariant *params */
3246 NULL, /* reply_type */
3247 G_DBUS_CALL_FLAGS_NONE, /* flags */
3248 NETCONFIG_DBUS_REPLY_TIMEOUT , /* timeout */
3249 NULL, /* cancellable */
3250 &error); /* error */
3253 if(strstr(error->message, ".AlreadyExists") != NULL) {
3254 WDP_LOGD("p2p already disabled");
3255 g_error_free(error);
3258 WDP_LOGE("Error! Failed to call net-config method: [%s]",
3260 g_error_free(error);
3262 g_variant_unref(reply);
3263 g_object_unref(connection);
3264 __WDP_LOG_FUNC_EXIT__;
3269 g_variant_unref(reply);
3270 g_object_unref(connection);
3275 static int __ws_p2p_supplicant_start(void)
3277 gboolean rv = FALSE;
3278 const char *path = "/usr/sbin/p2p_supp.sh";
3279 char *const args[] = { "/usr/sbin/p2p_supp.sh", "start_dbus", NULL };
3280 char *const envs[] = { NULL };
3282 rv = _ws_util_execute_file(path, args, envs);
3285 WDP_LOGE("Failed to start p2p_supp.sh");
3289 WDP_LOGI("Successfully started p2p_supp.sh");
3294 static int __ws_p2p_supplicant_stop(void)
3296 gboolean rv = FALSE;
3297 const char *path = "/usr/sbin/p2p_supp.sh";
3298 char *const args[] = { "/usr/sbin/p2p_supp.sh", "stop", NULL };
3299 char *const envs[] = { NULL };
3301 rv = _ws_util_execute_file(path, args, envs);
3304 WDP_LOGE("Failed to stop p2p_supp.sh");
3308 WDP_LOGI("Successfully stopped p2p_supp.sh");
3312 static int __ws_p2p_on(void)
3315 DBusMessage *reply = NULL;
3316 DBusMessage *message = NULL;
3317 DBusConnection *connection = NULL;
3319 connection = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
3320 if (connection == NULL) {
3321 WDP_LOGE("Failed to get system bus");
3325 message = dbus_message_new_method_call(NETCONFIG_SERVICE,
3326 NETCONFIG_WIFI_PATH, NETCONFIG_WIFI_INTERFACE, "LoadP2pDriver");
3327 if (message == NULL) {
3328 WDP_LOGE("Failed DBus method call");
3329 dbus_connection_unref(connection);
3333 dbus_error_init(&error);
3335 reply = dbus_connection_send_with_reply_and_block(connection, message,
3336 NETCONFIG_DBUS_REPLY_TIMEOUT, &error);
3337 if (dbus_error_is_set(&error) == TRUE) {
3338 if (NULL != strstr(error.message, ".AlreadyExists")) {
3339 // p2p already enabled
3341 WDP_LOGE("dbus_connection_send_with_reply_and_block() failed. "
3342 "DBus error [%s: %s]", error.name, error.message);
3344 dbus_error_free(&error);
3347 dbus_error_free(&error);
3351 dbus_message_unref(reply);
3353 dbus_message_unref(message);
3354 dbus_connection_unref(connection);
3359 static int __ws_p2p_off(void)
3362 DBusMessage *reply = NULL;
3363 DBusMessage *message = NULL;
3364 DBusConnection *connection = NULL;
3366 connection = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
3367 if (connection == NULL) {
3368 WDP_LOGE("Failed to get system bus");
3372 message = dbus_message_new_method_call(NETCONFIG_SERVICE,
3373 NETCONFIG_WIFI_PATH, NETCONFIG_WIFI_INTERFACE, "RemoveP2pDriver");
3374 if (message == NULL) {
3375 WDP_LOGE("Failed DBus method call");
3376 dbus_connection_unref(connection);
3380 dbus_error_init(&error);
3382 reply = dbus_connection_send_with_reply_and_block(connection, message,
3383 NETCONFIG_DBUS_REPLY_TIMEOUT, &error);
3384 if (dbus_error_is_set(&error) == TRUE) {
3385 if (NULL != strstr(error.message, ".AlreadyExists")) {
3386 // p2p already disabled
3388 WDP_LOGE("dbus_connection_send_with_reply_and_block() failed. "
3389 "DBus error [%s: %s]", error.name, error.message);
3391 dbus_error_free(&error);
3394 dbus_error_free(&error);
3398 dbus_message_unref(reply);
3400 dbus_message_unref(message);
3401 dbus_connection_unref(connection);
3407 int __ws_init_p2pdevice()
3409 __WDP_LOG_FUNC_ENTER__;
3410 GDBusConnection *g_dbus = NULL;
3412 GVariant *value = NULL;
3413 GVariant *param = NULL;
3414 GVariantBuilder *builder = NULL;
3415 GVariantBuilder *type_builder = NULL;
3416 dbus_method_param_s params;
3418 const char *primary_device_type = PRIMARY_DEVICE_TYPE;
3420 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
3421 const char *ip_addr_go = DEFAULT_IP_GO;
3422 const char *ip_addr_mask = DEFAULT_IP_MASK;
3423 const char *ip_addr_start = DEFAULT_IP_START;
3424 const char *ip_addr_end = DEFAULT_IP_END;
3425 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
3430 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3434 for(i = 0; i < WS_DEVTYPE_LEN; i++)
3435 WDP_LOGD("device type[%02x]", primary_device_type[i]);
3437 g_dbus = g_pd->g_dbus;
3439 WDP_LOGE("DBus connection is NULL");
3442 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
3444 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
3447 builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}"));
3448 g_variant_builder_add (builder, "{sv}", "DeviceName",
3449 g_variant_new_string(DEFAULT_DEVICE_NAME));
3451 g_variant_builder_add (builder, "{sv}", "GOIntent",
3452 g_variant_new_uint32(DEFAULT_GO_INTENT));
3454 g_variant_builder_add (builder, "{sv}", "PersistentReconnect",
3455 g_variant_new_boolean(DEFAULT_PERSISTENT_RECONNECT));
3457 g_variant_builder_add (builder, "{sv}", "ListenRegClass",
3458 g_variant_new_uint32(DEFAULT_LISTEN_REG_CLASS));
3460 g_variant_builder_add (builder, "{sv}", "ListenChannel",
3461 g_variant_new_uint32(DEFAULT_LISTEN_CHANNEL));
3463 g_variant_builder_add (builder, "{sv}", "OperRegClass",
3464 g_variant_new_uint32(DEFAULT_OPER_REG_CLASS));
3466 g_variant_builder_add (builder, "{sv}", "OperChannel",
3467 g_variant_new_uint32(DEFAULT_OPER_CHANNEL));
3469 g_variant_builder_add (builder, "{sv}", "SsidPostfix",
3470 g_variant_new_string(DEFAULT_DEVICE_NAME));
3472 g_variant_builder_add (builder, "{sv}", "NoGroupIface",
3473 g_variant_new_boolean(DEFAULT_NO_GROUP_IFACE));
3475 type_builder = g_variant_builder_new (G_VARIANT_TYPE ("ay"));
3476 for(i = 0; i < WS_DEVTYPE_LEN; i++)
3477 g_variant_builder_add(type_builder, "y", primary_device_type[i]);
3478 g_variant_builder_add (builder, "{sv}", "PrimaryDeviceType",
3479 g_variant_new ("ay", type_builder));
3480 g_variant_builder_unref (type_builder);
3481 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
3482 type_builder = g_variant_builder_new (G_VARIANT_TYPE ("ay"));
3483 for(i = 0; i < OEM_IPADDR_LEN; i++)
3484 g_variant_builder_add(type_builder, "y", ip_addr_go[i]);
3485 g_variant_builder_add (builder, "{sv}", "IpAddrGO",
3486 g_variant_new ("ay", type_builder));
3487 g_variant_builder_unref (type_builder);
3489 type_builder = g_variant_builder_new (G_VARIANT_TYPE ("ay"));
3490 for(i = 0; i < OEM_IPADDR_LEN; i++)
3491 g_variant_builder_add(type_builder, "y", ip_addr_mask[i]);
3492 g_variant_builder_add (builder, "{sv}", "IpAddrMask",
3493 g_variant_new ("ay", type_builder));
3494 g_variant_builder_unref (type_builder);
3496 type_builder = g_variant_builder_new (G_VARIANT_TYPE ("ay"));
3497 for(i = 0; i < OEM_IPADDR_LEN; i++)
3498 g_variant_builder_add(type_builder, "y", ip_addr_start[i]);
3499 g_variant_builder_add (builder, "{sv}", "IpAddrStart",
3500 g_variant_new ("ay", type_builder));
3501 g_variant_builder_unref (type_builder);
3503 type_builder = g_variant_builder_new (G_VARIANT_TYPE ("ay"));
3504 for(i = 0; i < OEM_IPADDR_LEN; i++)
3505 g_variant_builder_add(type_builder, "y", ip_addr_end[i]);
3506 g_variant_builder_add (builder, "{sv}", "IpAddrEnd",
3507 g_variant_new ("ay", type_builder));
3508 g_variant_builder_unref (type_builder);
3509 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
3510 value = g_variant_new ("a{sv}", builder);
3511 g_variant_builder_unref (builder);
3513 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
3515 params.params = param;
3516 #if defined (TIZEN_DEBUG_DBUS_VALUE)
3517 DEBUG_PARAMS(params.params);
3518 #endif /* TIZEN_DEBUG_DBUS_VALUE */
3520 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
3522 WDP_LOGE("Failed to send command to wpa_supplicant");
3524 WDP_LOGD("Succeeded to initialize p2pdevice");
3525 __WDP_LOG_FUNC_EXIT__;
3529 int __ws_set_config_methods()
3531 __WDP_LOG_FUNC_ENTER__;
3532 GDBusConnection *g_dbus = NULL;
3534 GVariant *value = NULL;
3535 GVariant *param = NULL;
3537 dbus_method_param_s params;
3541 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3545 g_dbus = g_pd->g_dbus;
3547 WDP_LOGE("DBus connection is NULL");
3550 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
3552 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
3555 value = g_variant_new_string(DEFAULT_CONFIG_METHOD);
3557 param = g_variant_new("(ssv)", SUPPLICANT_WPS, "ConfigMethods", value);
3558 params.params = param;
3560 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
3562 WDP_LOGE("Failed to send command to wpa_supplicant");
3564 WDP_LOGD("Succeeded to set config method(%s)", DEFAULT_CONFIG_METHOD);
3566 __WDP_LOG_FUNC_EXIT__;
3570 int ws_activate(int concurrent)
3572 __WDP_LOG_FUNC_ENTER__;
3574 int retry_count = 0;
3577 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3581 res = __ws_p2p_supplicant_start();
3583 res = __ws_p2p_supplicant_stop();
3584 WDP_LOGI("P2P supplicant stopped with error %d", res);
3585 __WDP_LOG_FUNC_EXIT__;
3588 #ifndef TIZEN_WIFI_MODULE_BUNDLE
3589 while (retry_count < WS_CONN_RETRY_COUNT) {
3590 /* load wlan driver */
3592 res = __ws_p2p_firmware_start();
3594 WDP_LOGE("Failed to load driver [ret=%d]", res);
3597 WDP_LOGI("P2P firmware started with error %d", res);
3599 if (__ws_check_net_interface(COMMON_IFACE_NAME) < 0) {
3600 usleep(150000); // wait for 150ms
3603 WDP_LOGE("interface is not up: retry, %d", retry_count);
3609 if (retry_count >= WS_CONN_RETRY_COUNT) {
3610 WDP_LOGE("Driver loading is failed", res);
3611 __WDP_LOG_FUNC_EXIT__;
3614 if (retry_count > 0) {
3615 // Give driver marginal time to config net
3616 WDP_LOGE("Driver loading is done. Wait marginal time for driver");
3620 g_pd->concurrent = concurrent;
3622 res = _ws_init_dbus_connection();
3624 res = __ws_p2p_supplicant_stop();
3625 WDP_LOGI("[/usr/sbin/p2p_supp.sh stop] returns %d", res);
3626 #ifndef TIZEN_WIFI_MODULE_BUNDLE
3627 res = __ws_p2p_firmware_stop();
3628 WDP_LOGI("P2P firmware stopped with error %d", res);
3630 __WDP_LOG_FUNC_EXIT__;
3634 g_pd->activated = TRUE;
3635 __ws_init_p2pdevice();
3636 __ws_set_config_methods();
3639 __WDP_LOG_FUNC_EXIT__;
3643 int ws_deactivate(int concurrent)
3645 __WDP_LOG_FUNC_ENTER__;
3646 #if defined(TIZEN_FEATURE_ASP)
3647 wfd_oem_asp_service_s *data = NULL;
3648 #endif /* TIZEN_FEATURE_ASP */
3652 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3656 if (!g_pd->activated) {
3657 WDP_LOGE("Wi-Fi Direct is not activated");
3663 g_pd->concurrent = concurrent;
3664 #if defined (TIZEN_MOBILE) && (TIZEN_WLAN_BOARD_SPRD)
3665 _ws_get_interface(P2P_IFACE_NAME, __ws_remove_interface, NULL);
3667 _ws_get_interface(COMMON_IFACE_NAME, __ws_remove_interface, NULL);
3668 #endif /* (TIZEN_MOBILE) && (TIZEN_WLAN_BOARD_SPRD) */
3670 _ws_deinit_dbus_connection();
3672 if(concurrent == 0) {
3673 res = __ws_p2p_supplicant_stop();
3674 WDP_LOGI("[/usr/sbin/p2p_supp.sh stop] returns %d", res);
3675 #ifndef TIZEN_WIFI_MODULE_BUNDLE
3676 res = __ws_p2p_firmware_stop();
3677 WDP_LOGI("P2P firmware stopped with error %d", res);
3680 g_pd->activated = FALSE;
3682 #if defined(TIZEN_FEATURE_ASP)
3683 GLIST_ITER_START(seek_list, data)
3686 temp = g_list_next(seek_list);
3687 seek_list = g_list_remove(seek_list, data);
3688 g_free(data->service_type);
3689 g_free(data->service_info);
3694 #endif /* TIZEN_FEATURE_ASP */
3695 __WDP_LOG_FUNC_EXIT__;
3700 static gboolean _retry_start_scan(gpointer data)
3702 __WDP_LOG_FUNC_ENTER__;
3704 WDP_LOGD("Succeeded to start scan");
3706 __WDP_LOG_FUNC_EXIT__;
3711 #if defined(TIZEN_FEATURE_ASP)
3712 static void __ws_add_seek_params(GVariantBuilder *builder)
3714 GVariantBuilder *outter = NULL;
3715 GVariantBuilder *inner = NULL;
3716 wfd_oem_asp_service_s *data = NULL;
3720 if(seek_list == NULL || g_list_length(seek_list) == 0) {
3721 WDP_LOGD("seek list is NULL");
3724 WDP_LOGD("seek list length [%d]", g_list_length(seek_list));
3726 outter = g_variant_builder_new(G_VARIANT_TYPE("aay"));
3728 GLIST_ITER_START(seek_list, data)
3729 if (data && data->service_type) {
3730 len = strlen(data->service_type) + 1;
3731 WDP_LOGD("data [%s] len [%d]", data->service_type, len);
3732 inner = g_variant_builder_new(G_VARIANT_TYPE("ay"));
3733 for(i = 0; i < len; i++)
3734 g_variant_builder_add(inner, "y", data->service_type[i]);
3735 g_variant_builder_add(outter, "ay", inner);
3736 g_variant_builder_unref(inner);
3739 g_variant_builder_add (builder, "{sv}", "Seek", g_variant_new ("aay", outter));
3740 g_variant_builder_unref(outter);
3744 #endif /* TIZEN_FEATURE_ASP */
3747 int ws_start_scan(wfd_oem_scan_param_s *param)
3749 __WDP_LOG_FUNC_ENTER__;
3750 GDBusConnection *g_dbus = NULL;
3751 GVariantBuilder *builder = NULL;
3752 GVariant *value = NULL;
3753 dbus_method_param_s params;
3757 WDP_LOGE("Invalid parameter");
3762 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3766 g_dbus = g_pd->g_dbus;
3768 WDP_LOGE("DBus connection is NULL");
3771 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
3773 if (param->scan_mode == WFD_OEM_SCAN_MODE_ACTIVE) {
3775 dbus_set_method_param(¶ms, "Find", g_pd->iface_path, g_dbus);
3777 builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}") );
3779 if (param->scan_time)
3780 g_variant_builder_add (builder, "{sv}", "Timeout",
3781 g_variant_new_int32(param->scan_time));
3782 if (param->scan_type == WFD_OEM_SCAN_TYPE_SOCIAL)
3783 g_variant_builder_add (builder, "{sv}", "DiscoveryType",
3784 g_variant_new_string("social"));
3785 #if defined(TIZEN_FEATURE_ASP)
3786 if(seek_list != NULL)
3787 __ws_add_seek_params(builder);
3788 #endif /* TIZEN_FEATURE_ASP */
3790 value = g_variant_new ("(a{sv})", builder);
3791 g_variant_builder_unref (builder);
3794 dbus_set_method_param(¶ms, "Listen", g_pd->iface_path, g_dbus);
3795 value = g_variant_new ("(i)", param->scan_time);
3798 params.params = value;
3799 #if defined (TIZEN_DEBUG_DBUS_VALUE)
3800 DEBUG_PARAMS(params.params);
3801 #endif /* TIZEN_DEBUG_DBUS_VALUE */
3803 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
3805 WDP_LOGE("Failed to send command to wpa_supplicant");
3807 WDP_LOGD("Succeeded to start scan");
3809 __WDP_LOG_FUNC_EXIT__;
3813 int ws_restart_scan(int freq)
3815 __WDP_LOG_FUNC_ENTER__;
3816 GDBusConnection *g_dbus = NULL;
3817 GVariantBuilder *builder = NULL;
3818 GVariant *value = NULL;
3819 dbus_method_param_s params;
3823 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3827 g_dbus = g_pd->g_dbus;
3829 WDP_LOGE("DBus connection is NULL");
3832 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
3834 dbus_set_method_param(¶ms, "Find", g_pd->iface_path, g_dbus);
3836 builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}") );
3837 g_variant_builder_add (builder, "{sv}", "Timeout", g_variant_new_int32(2));
3838 g_variant_builder_add (builder, "{sv}", "DiscoveryType",
3839 g_variant_new_string("social"));
3840 value = g_variant_new ("(a{sv})", builder);
3841 g_variant_builder_unref (builder);
3843 params.params = value;
3844 #if defined (TIZEN_DEBUG_DBUS_VALUE)
3845 DEBUG_PARAMS(params.params);
3846 #endif /* TIZEN_DEBUG_DBUS_VALUE */
3848 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
3850 WDP_LOGE("Failed to send command to wpa_supplicant");
3852 WDP_LOGD("Succeeded to start scan");
3854 __WDP_LOG_FUNC_EXIT__;
3860 __WDP_LOG_FUNC_ENTER__;
3861 GDBusConnection *g_dbus = NULL;
3862 dbus_method_param_s params;
3866 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3870 g_dbus = g_pd->g_dbus;
3872 WDP_LOGE("DBus connection is NULL");
3875 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
3877 dbus_set_method_param(¶ms, "StopFind", g_pd->iface_path, g_dbus);
3878 params.params = NULL;
3880 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
3882 WDP_LOGE("Failed to send command to wpa_supplicant");
3884 WDP_LOGD("Succeeded to stop scan");
3886 __WDP_LOG_FUNC_EXIT__;
3890 int ws_get_visibility(int *visibility)
3892 __WDP_LOG_FUNC_ENTER__;
3894 __WDP_LOG_FUNC_EXIT__;
3898 int ws_set_visibility(int visibility)
3900 __WDP_LOG_FUNC_ENTER__;
3902 __WDP_LOG_FUNC_EXIT__;
3906 int ws_get_scan_result(GList **peers, int *peer_count)
3908 __WDP_LOG_FUNC_ENTER__;
3910 __WDP_LOG_FUNC_EXIT__;
3914 int ws_get_peer_info(unsigned char *peer_addr, wfd_oem_device_s **peer)
3916 __WDP_LOG_FUNC_ENTER__;
3917 GDBusConnection *g_dbus = NULL;
3918 wfd_oem_device_s *ws_dev = NULL;
3919 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
3922 if (!peer_addr || !peer) {
3923 WDP_LOGE("Invalid parameter");
3928 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3932 g_dbus = g_pd->g_dbus;
3934 WDP_LOGE("DBus connection is NULL");
3938 ws_dev = (wfd_oem_device_s *) g_try_malloc0(sizeof(wfd_oem_device_s));
3940 WDP_LOGF("Failed to allocate memory device. [%s]",
3942 __WDP_LOG_FUNC_EXIT__;
3946 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
3947 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
3949 WDP_LOGD("get peer path [%s]", peer_path);
3951 res = dbus_property_get_all(peer_path, g_dbus, SUPPLICANT_P2P_PEER,
3952 __ws_get_peer_property, ws_dev);
3955 WDP_LOGE("Failed to send command to wpa_supplicant");
3957 __WDP_LOG_FUNC_EXIT__;
3960 WDP_LOGD("succeeded to get peer info");
3963 __WDP_LOG_FUNC_EXIT__;
3967 int ws_prov_disc_req(unsigned char *peer_addr, wfd_oem_wps_mode_e wps_mode, int join)
3969 __WDP_LOG_FUNC_ENTER__;
3970 GDBusConnection *g_dbus = NULL;
3971 GVariant *value = NULL;
3972 dbus_method_param_s params;
3973 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
3977 WDP_LOGE("Invalid parameter");
3978 __WDP_LOG_FUNC_EXIT__;
3983 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3984 __WDP_LOG_FUNC_EXIT__;
3988 g_dbus = g_pd->g_dbus;
3990 WDP_LOGE("DBus connection is NULL");
3991 __WDP_LOG_FUNC_EXIT__;
3994 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
3996 dbus_set_method_param(¶ms, "ProvisionDiscoveryRequest", g_pd->iface_path, g_dbus);
3998 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
3999 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4000 WDP_LOGD("get peer path [%s]", peer_path);
4002 value = g_variant_new ("(os)", peer_path, __ws_wps_to_txt(wps_mode));
4004 params.params = value;
4005 #if defined (TIZEN_DEBUG_DBUS_VALUE)
4006 DEBUG_PARAMS(params.params);
4007 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4009 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4011 WDP_LOGE("Failed to send command to wpa_supplicant");
4013 WDP_LOGD("Succeeded to send prov disc to peer[" MACSTR "]", MAC2STR(peer_addr));
4015 __WDP_LOG_FUNC_EXIT__;
4019 int ws_connect(unsigned char *peer_addr, wfd_oem_conn_param_s *param)
4021 __WDP_LOG_FUNC_ENTER__;
4022 GDBusConnection *g_dbus = NULL;
4023 GVariantBuilder *builder = NULL;
4024 GVariant *value = NULL;
4025 dbus_method_param_s params;
4026 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
4029 if (!peer_addr || !param) {
4030 WDP_LOGE("Invalid parameter");
4031 __WDP_LOG_FUNC_EXIT__;
4036 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4037 __WDP_LOG_FUNC_EXIT__;
4041 g_dbus = g_pd->g_dbus;
4043 WDP_LOGE("DBus connection is NULL");
4044 __WDP_LOG_FUNC_EXIT__;
4047 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4049 dbus_set_method_param(¶ms, "Connect", g_pd->iface_path, g_dbus);
4051 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4052 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4053 WDP_LOGD("get peer path [%s]", peer_path);
4055 builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}") );
4056 g_variant_builder_add (builder, "{sv}", "peer", g_variant_new_object_path(peer_path));
4057 if (param->conn_flags & WFD_OEM_CONN_TYPE_PERSISTENT)
4058 g_variant_builder_add (builder, "{sv}", "persistent", g_variant_new_boolean(TRUE));
4060 if (param->conn_flags & WFD_OEM_CONN_TYPE_JOIN)
4061 g_variant_builder_add (builder, "{sv}", "join", g_variant_new_boolean(TRUE));
4063 if (param->conn_flags& WFD_OEM_CONN_TYPE_AUTH)
4064 g_variant_builder_add (builder, "{sv}", "autorize_only", g_variant_new_boolean(TRUE));
4066 if (param->wps_pin[0] != '\0')
4067 g_variant_builder_add (builder, "{sv}", "pin", g_variant_new_string(param->wps_pin));
4069 g_variant_builder_add (builder, "{sv}", "wps_method",
4070 g_variant_new_string(__ws_wps_to_txt(param->wps_mode)));
4072 value = g_variant_new ("(a{sv})", builder);
4073 g_variant_builder_unref (builder);
4075 params.params = value;
4076 #if defined (TIZEN_DEBUG_DBUS_VALUE)
4077 DEBUG_PARAMS(params.params);
4078 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4080 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4082 WDP_LOGE("Failed to send command to wpa_supplicant");
4084 WDP_LOGD("Succeeded to send connection command to peer[" MACSTR "]", MAC2STR(peer_addr));
4086 __WDP_LOG_FUNC_EXIT__;
4090 int ws_disconnect(unsigned char *peer_addr)
4092 __WDP_LOG_FUNC_ENTER__;
4093 GDBusConnection *g_dbus = NULL;
4094 GVariant *value = NULL;
4095 dbus_method_param_s params;
4096 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
4100 WDP_LOGE("Invalid parameter");
4105 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4109 g_dbus = g_pd->g_dbus;
4111 WDP_LOGE("DBus connection is NULL");
4114 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4116 dbus_set_method_param(¶ms, "RemoveClient", g_pd->iface_path ,g_dbus);
4118 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4119 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4120 WDP_LOGE("get peer path [%s]", peer_path);
4122 value = g_variant_new ("(oi)", peer_path, 0);
4124 params.params = value;
4125 #if defined (TIZEN_DEBUG_DBUS_VALUE)
4126 DEBUG_PARAMS(params.params);
4127 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4129 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4131 WDP_LOGE("Failed to send command to wpa_supplicant");
4133 WDP_LOGD("Succeeded to stop scan");
4135 __WDP_LOG_FUNC_EXIT__;
4139 int ws_reject_connection(unsigned char *peer_addr)
4141 __WDP_LOG_FUNC_ENTER__;
4142 GDBusConnection *g_dbus = NULL;
4143 GVariant *value = NULL;
4144 dbus_method_param_s params;
4145 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
4149 WDP_LOGE("Invalid parameter");
4150 __WDP_LOG_FUNC_EXIT__;
4155 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4156 __WDP_LOG_FUNC_EXIT__;
4160 g_dbus = g_pd->g_dbus;
4162 WDP_LOGE("DBus connection is NULL");
4163 __WDP_LOG_FUNC_EXIT__;
4166 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4168 dbus_set_method_param(¶ms, "RejectPeer", g_pd->iface_path ,g_dbus);
4170 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4171 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4172 WDP_LOGE("get peer path [%s]", peer_path);
4174 value = g_variant_new ("(o)", peer_path);
4176 params.params = value;
4177 #if defined (TIZEN_DEBUG_DBUS_VALUE)
4178 DEBUG_PARAMS(params.params);
4179 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4181 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4183 WDP_LOGE("Failed to send command to wpa_supplicant");
4185 WDP_LOGD("Succeeded to reject peer[" MACSTR "]", MAC2STR(peer_addr));
4188 __WDP_LOG_FUNC_EXIT__;
4192 int ws_cancel_connection(unsigned char *peer_addr)
4194 __WDP_LOG_FUNC_ENTER__;
4198 __WDP_LOG_FUNC_EXIT__;
4202 int ws_get_connected_peers(GList **peers, int *peer_count)
4204 __WDP_LOG_FUNC_ENTER__;
4206 __WDP_LOG_FUNC_EXIT__;
4210 int ws_get_pin(char *pin)
4212 __WDP_LOG_FUNC_ENTER__;
4214 __WDP_LOG_FUNC_EXIT__;
4218 int ws_set_pin(char *pin)
4220 __WDP_LOG_FUNC_ENTER__;
4222 __WDP_LOG_FUNC_EXIT__;
4226 static void __ws_get_pin(GVariant *value, void *user_data)
4228 __WDP_LOG_FUNC_ENTER__;
4229 const char *pin = NULL;
4231 g_variant_get(value, "(&s)", &pin);
4232 g_strlcpy((char *)user_data, pin, OEM_PINSTR_LEN + 1);
4234 __WDP_LOG_FUNC_EXIT__;
4238 int ws_generate_pin(char **pin)
4240 __WDP_LOG_FUNC_ENTER__;
4241 GDBusConnection *g_dbus = NULL;
4242 dbus_method_param_s params;
4243 char n_pin[9] = {0,};
4247 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4251 g_dbus = g_pd->g_dbus;
4253 WDP_LOGE("DBus connection is NULL");
4256 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4258 dbus_set_method_param(¶ms, "GeneratePin", g_pd->iface_path ,g_dbus);
4259 params.params = NULL;
4261 res = dbus_method_call(¶ms, SUPPLICANT_WPS, __ws_get_pin, (void *)n_pin);
4263 WDP_LOGE("Failed to send command to wpa_supplicant");
4265 WDP_LOGD("Succeeded to generate_pin [ %s ]", n_pin);
4267 *pin = strndup(n_pin, OEM_PINSTR_LEN);
4268 __WDP_LOG_FUNC_EXIT__;
4272 int ws_get_supported_wps_mode()
4274 __WDP_LOG_FUNC_ENTER__;
4276 __WDP_LOG_FUNC_EXIT__;
4280 int _ws_get_persistent_net_id(int *persistent_network_id, const unsigned char *go_dev_mac)
4282 __WDP_LOG_FUNC_ENTER__;
4283 int persistent_group_count = 0;
4287 wfd_oem_persistent_group_s *plist = NULL;
4289 res = ws_get_persistent_groups(&plist, &persistent_group_count);
4291 WDP_LOGE("failed to get persistent groups");
4292 __WDP_LOG_FUNC_EXIT__;
4296 if (persistent_group_count > WS_MAX_PERSISTENT_COUNT) {
4297 WDP_LOGE("persistent group count greater than max Persistent count");
4298 persistent_group_count = WS_MAX_PERSISTENT_COUNT;
4301 WDP_LOGD("Persistent Group Count=%d", persistent_group_count);
4303 for (counter = 0; counter < persistent_group_count ; counter++) {
4304 if(!memcmp(go_dev_mac, plist[counter].go_mac_address, WS_MACADDR_LEN)) {
4305 *persistent_network_id = plist[counter].network_id;
4308 WDP_LOGD("Invite: Persistent GO[" MACSTR "], GO Addr[" MACSTR "]",
4309 MAC2STR(plist[counter].go_mac_address), MAC2STR(go_dev_mac));
4315 WDP_LOGD("persistent network ID : [%d]", *persistent_network_id);
4317 __WDP_LOG_FUNC_EXIT__;
4321 static void __store_group_iface_path(GVariant *value, void *user_data) {
4322 __WDP_LOG_FUNC_ENTER__;
4323 ws_dbus_plugin_data_s * pd_data;
4324 const char *path = NULL;
4327 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4331 pd_data = (ws_dbus_plugin_data_s *) g_pd;
4333 g_variant_get(value, "(&o)", &path);
4334 g_strlcpy(pd_data->group_iface_path, path, DBUS_OBJECT_PATH_MAX);
4336 WDP_LOGD("group object path [%s]", pd_data->group_iface_path);
4337 /* subscribe interface p2p signal */
4340 int ws_create_group(wfd_oem_group_param_s *param)
4342 __WDP_LOG_FUNC_ENTER__;
4343 GDBusConnection *g_dbus = NULL;
4344 GVariantBuilder *builder = NULL;
4345 GVariant *value = NULL;
4346 dbus_method_param_s params;
4347 char persistent_group_obj_path[OBJECT_PATH_MAX] = {0,};
4351 WDP_LOGE("Invalid parameter");
4352 __WDP_LOG_FUNC_EXIT__;
4357 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4358 __WDP_LOG_FUNC_EXIT__;
4362 g_dbus = g_pd->g_dbus;
4364 WDP_LOGE("DBus connection is NULL");
4365 __WDP_LOG_FUNC_EXIT__;
4368 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4370 dbus_set_method_param(¶ms, "GroupAdd", g_pd->iface_path, g_dbus);
4372 builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}") );
4374 if (param->persistent > 0) {
4375 unsigned char mac_address[WS_MACADDR_LEN] = {0x00, };
4376 int persistent_group_id = -1;
4378 res = _ws_get_local_dev_mac(mac_address);
4380 WDP_LOGE("failed to get local mac address");
4381 __WDP_LOG_FUNC_EXIT__;
4385 res = _ws_get_persistent_net_id(&persistent_group_id, mac_address);
4387 WDP_LOGE("failed to get persistent group ID");
4388 __WDP_LOG_FUNC_EXIT__;
4392 WDP_LOGD("persistent network ID : [%d]", persistent_group_id);
4394 g_variant_builder_add(builder, "{sv}", "persistent",
4395 g_variant_new_boolean(TRUE));
4396 if(persistent_group_id > -1) {
4397 g_snprintf(persistent_group_obj_path, OBJECT_PATH_MAX,
4398 "%s/" SUPPLICANT_PERSISTENT_GROUPS_PART "/%d",
4399 g_pd->iface_path, persistent_group_id);
4400 g_variant_builder_add(builder, "{sv}", "persistent_group_object",
4401 g_variant_new_object_path(persistent_group_obj_path));
4405 g_variant_builder_add(builder, "{sv}", "persistent",
4406 g_variant_new_boolean(FALSE));
4409 if (param->passphrase && strlen(param->passphrase) > 0)
4410 g_variant_builder_add(builder, "{sv}", "passphrase",
4411 g_variant_new_string(param->passphrase));
4414 g_variant_builder_add(builder, "{sv}", "frequency",
4415 g_variant_new_int32(param->freq));
4417 value = g_variant_new ("(a{sv})", builder);
4418 g_variant_builder_unref (builder);
4420 params.params = value;
4421 #if defined (TIZEN_DEBUG_DBUS_VALUE)
4422 DEBUG_PARAMS(params.params);
4423 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4425 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE,
4426 __store_group_iface_path, g_pd);
4428 WDP_LOGE("Failed to send command to wpa_supplicant");
4430 WDP_LOGD("Succeeded to add group");
4432 __WDP_LOG_FUNC_EXIT__;
4436 int ws_destroy_group(const char *ifname)
4438 __WDP_LOG_FUNC_ENTER__;
4439 GDBusConnection *g_dbus = NULL;
4440 dbus_method_param_s params;
4444 WDP_LOGE("Invalid parameter");
4449 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4453 g_dbus = g_pd->g_dbus;
4455 WDP_LOGE("DBus connection is NULL");
4459 if (g_pd->group_iface_path[0] == 0) {
4460 WDP_LOGE("group iface path is NULL");
4464 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4466 dbus_set_method_param(¶ms, "Disconnect", g_pd->group_iface_path, g_dbus);
4467 params.params = NULL;
4469 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4471 WDP_LOGE("Failed to send command to wpa_supplicant");
4472 __WDP_LOG_FUNC_EXIT__;
4476 WDP_LOGD("Succeeded to remove group");
4479 __WDP_LOG_FUNC_EXIT__;
4483 int ws_invite(unsigned char *peer_addr, wfd_oem_invite_param_s *param)
4485 __WDP_LOG_FUNC_ENTER__;
4486 GDBusConnection *g_dbus = NULL;
4487 GVariantBuilder *builder = NULL;
4488 GVariant *value = NULL;
4489 dbus_method_param_s params;
4490 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
4493 if (!peer_addr || !param) {
4494 WDP_LOGE("Invalid parameter");
4499 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4503 g_dbus = g_pd->g_dbus;
4505 WDP_LOGE("DBus connection is NULL");
4508 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4510 dbus_set_method_param(¶ms, "Invite", g_pd->group_iface_path, g_dbus);
4512 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4513 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4514 WDP_LOGE("get peer path [%s]", peer_path);
4516 builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}") );
4517 g_variant_builder_add (builder, "{sv}", "peer", g_variant_new_object_path(peer_path));
4518 value = g_variant_new ("(a{sv})", builder);
4519 g_variant_builder_unref (builder);
4521 params.params = value;
4522 #if defined (TIZEN_DEBUG_DBUS_VALUE)
4523 DEBUG_PARAMS(params.params);
4524 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4526 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4528 WDP_LOGE("Failed to send command to wpa_supplicant");
4530 WDP_LOGD("Succeeded to invite peer[" MACSTR "]", MAC2STR(peer_addr));
4532 __WDP_LOG_FUNC_EXIT__;
4536 // Only group owner can use this command
4537 int ws_wps_start(unsigned char *peer_addr, int wps_mode, const char *pin)
4539 __WDP_LOG_FUNC_ENTER__;
4540 GDBusConnection *g_dbus = NULL;
4541 GVariantBuilder *builder = NULL;
4542 GVariant *value = NULL;
4543 GVariant *dev_addr = NULL;
4544 dbus_method_param_s params;
4549 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4553 g_dbus = g_pd->g_dbus;
4555 WDP_LOGE("DBus connection is NULL");
4559 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4561 dbus_set_method_param(¶ms, "Start", g_pd->group_iface_path, g_dbus);
4563 if (peer_addr != NULL) {
4564 builder = g_variant_builder_new (G_VARIANT_TYPE ("ay"));
4565 for(i = 0; i < WS_MACADDR_LEN; i++)
4566 g_variant_builder_add(builder, "y", peer_addr[i]);
4568 dev_addr = g_variant_new ("ay", builder);
4569 g_variant_builder_unref (builder);
4572 builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}") );
4573 g_variant_builder_add (builder, "{sv}", "Role", g_variant_new_string("enrollee"));
4574 if (peer_addr != NULL)
4575 g_variant_builder_add (builder, "{sv}", "P2PDeviceAddress", dev_addr);
4577 if (pin != NULL && pin[0] != '\0') {
4578 g_variant_builder_add (builder, "{sv}", "Type", g_variant_new_string("pin"));
4579 g_variant_builder_add (builder, "{sv}", "Pin", g_variant_new_string(pin));
4581 g_variant_builder_add (builder, "{sv}", "Type", g_variant_new_string("pbc"));
4584 value = g_variant_new ("(a{sv})", builder);
4585 g_variant_builder_unref (builder);
4587 params.params = value;
4588 #if defined (TIZEN_DEBUG_DBUS_VALUE)
4589 DEBUG_PARAMS(params.params);
4590 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4592 res = dbus_method_call(¶ms, SUPPLICANT_WPS, NULL, NULL);
4594 WDP_LOGE("Failed to send command to wpa_supplicant");
4596 WDP_LOGD("Succeeded to run wps");
4598 __WDP_LOG_FUNC_EXIT__;
4602 int ws_enrollee_start(unsigned char *peer_addr, int wps_mode, const char *pin)
4604 __WDP_LOG_FUNC_ENTER__;
4606 WDP_LOGD("Succeeded to start WPS");
4608 __WDP_LOG_FUNC_EXIT__;
4614 __WDP_LOG_FUNC_ENTER__;
4615 GDBusConnection *g_dbus = NULL;
4616 dbus_method_param_s params;
4619 g_dbus = g_pd->g_dbus;
4621 WDP_LOGE("DBus connection is NULL");
4624 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4626 dbus_set_method_param(¶ms, "Cancel", g_pd->group_iface_path, g_dbus);
4627 params.params = NULL;
4629 res = dbus_method_call(¶ms, SUPPLICANT_WPS, NULL, NULL);
4631 WDP_LOGE("Failed to send command to wpa_supplicant");
4633 WDP_LOGD("Succeeded to cancel WPS");
4635 __WDP_LOG_FUNC_EXIT__;
4639 int ws_get_dev_name(char *dev_name)
4641 __WDP_LOG_FUNC_ENTER__;
4643 __WDP_LOG_FUNC_EXIT__;
4647 int ws_set_dev_name(char *dev_name)
4649 __WDP_LOG_FUNC_ENTER__;
4650 GDBusConnection *g_dbus = NULL;
4652 GVariant *value = NULL;
4653 GVariant *param = NULL;
4654 GVariantBuilder *builder = NULL;
4655 dbus_method_param_s params;
4659 WDP_LOGE("Invalid parameter");
4664 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4668 g_dbus = g_pd->g_dbus;
4670 WDP_LOGE("DBus connection is NULL");
4673 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4675 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
4678 builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}"));
4679 g_variant_builder_add (builder, "{sv}", "DeviceName",
4680 g_variant_new_string(dev_name));
4681 g_variant_builder_add (builder, "{sv}", "SsidPostfix",
4682 g_variant_new_string(dev_name));
4683 value = g_variant_new ("a{sv}", builder);
4684 g_variant_builder_unref (builder);
4686 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE,
4687 "P2PDeviceConfig", value);
4689 params.params = param;
4690 #if defined (TIZEN_DEBUG_DBUS_VALUE)
4691 DEBUG_PARAMS(params.params);
4692 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4694 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
4696 WDP_LOGE("Failed to send command to wpa_supplicant");
4698 WDP_LOGD("Succeeded to set device name");
4700 __WDP_LOG_FUNC_EXIT__;
4704 int ws_get_dev_mac(char *dev_mac)
4706 __WDP_LOG_FUNC_ENTER__;
4708 __WDP_LOG_FUNC_EXIT__;
4712 int ws_get_dev_type(int *pri_dev_type, int *sec_dev_type)
4714 __WDP_LOG_FUNC_ENTER__;
4716 __WDP_LOG_FUNC_EXIT__;
4720 int ws_set_dev_type(int pri_dev_type, int sec_dev_type)
4722 __WDP_LOG_FUNC_ENTER__;
4724 __WDP_LOG_FUNC_EXIT__;
4728 int ws_get_go_intent(int *go_intent)
4730 __WDP_LOG_FUNC_ENTER__;
4731 GDBusConnection *g_dbus = NULL;
4732 GVariant *param = NULL;
4733 GVariant *reply = NULL;
4734 GError *error = NULL;
4735 GVariantIter *iter = NULL;
4739 WDP_LOGE("Invalid parameter");
4744 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4748 g_dbus = g_pd->g_dbus;
4750 WDP_LOGE("DBus connection is NULL");
4754 param = g_variant_new("(ss)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig");
4755 #if defined (TIZEN_DEBUG_DBUS_VALUE)
4756 DEBUG_PARAMS(param);
4757 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4759 reply = g_dbus_connection_call_sync (
4761 SUPPLICANT_SERVICE, /* bus name */
4762 g_pd->iface_path, /* object path */
4763 DBUS_PROPERTIES_INTERFACE, /* interface name */
4764 DBUS_PROPERTIES_METHOD_GET, /* method name */
4765 param, /* GVariant *params */
4766 NULL, /* reply_type */
4767 G_DBUS_CALL_FLAGS_NONE, /* flags */
4768 SUPPLICANT_TIMEOUT , /* timeout */
4769 NULL, /* cancellable */
4770 &error); /* error */
4773 WDP_LOGE("Error! Failed to get interface State: [%s]",
4775 g_error_free(error);
4777 g_variant_unref(reply);
4778 __WDP_LOG_FUNC_EXIT__;
4782 if (reply != NULL) {
4783 g_variant_get(reply, "(a{sv})", &iter);
4787 GVariant *value = NULL;
4789 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
4790 #if defined (TIZEN_DEBUG_DBUS_VALUE)
4791 CHECK_KEY_VALUE(key, value);
4792 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4793 if(g_strcmp0(key, "GOIntent") == 0)
4794 g_variant_get(value, "u", go_intent);
4796 g_variant_iter_free(iter);
4798 g_variant_unref(reply);
4800 __WDP_LOG_FUNC_EXIT__;
4804 int ws_set_go_intent(int go_intent)
4806 __WDP_LOG_FUNC_ENTER__;
4807 GDBusConnection *g_dbus = NULL;
4809 GVariant *value = NULL;
4810 GVariant *param = NULL;
4811 GVariantBuilder *builder = NULL;
4812 dbus_method_param_s params;
4816 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4820 g_dbus = g_pd->g_dbus;
4822 WDP_LOGE("DBus connection is NULL");
4825 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4827 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
4830 builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}"));
4831 g_variant_builder_add (builder, "{sv}", "GOIntent",
4832 g_variant_new_uint32(go_intent));
4833 value = g_variant_new ("a{sv}", builder);
4834 g_variant_builder_unref (builder);
4836 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
4838 params.params = param;
4839 #if defined (TIZEN_DEBUG_DBUS_VALUE)
4840 DEBUG_PARAMS(params.params);
4841 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4843 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
4845 WDP_LOGE("Failed to send command to wpa_supplicant");
4847 WDP_LOGE("Succeeded to set go intent");
4848 __WDP_LOG_FUNC_EXIT__;
4852 int ws_set_country(char *ccode)
4854 __WDP_LOG_FUNC_ENTER__;
4855 __WDP_LOG_FUNC_ENTER__;
4856 GDBusConnection *g_dbus = NULL;
4858 GVariant *value = NULL;
4859 GVariant *param = NULL;
4861 dbus_method_param_s params;
4865 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4869 g_dbus = g_pd->g_dbus;
4871 WDP_LOGE("DBus connection is NULL");
4874 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4876 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
4879 value = g_variant_new_string(ccode);
4881 param = g_variant_new("(ssv)", SUPPLICANT_IFACE, "Country", value);
4883 params.params = param;
4884 #if defined (TIZEN_DEBUG_DBUS_VALUE)
4885 DEBUG_PARAMS(params.params);
4886 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4888 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
4890 WDP_LOGE("Failed to send command to wpa_supplicant");
4892 WDP_LOGD("Succeeded to set country(%s)", ccode);
4894 __WDP_LOG_FUNC_EXIT__;
4898 void __parsing_networks (const char *key, GVariant *value, void *user_data)
4900 __WDP_LOG_FUNC_ENTER__;
4902 __WDP_LOG_FUNC_EXIT__;
4906 ws_network_info_s *network = (ws_network_info_s *)user_data;
4907 #if defined (TIZEN_DEBUG_DBUS_VALUE)
4908 CHECK_KEY_VALUE(key, value);
4909 #endif /* TIZEN_DEBUG_DBUS_VALUE */
4910 if (g_strcmp0(key, "ssid") == 0) {
4911 const char *ssid = NULL;
4912 g_variant_get(value, "&s", &ssid);
4913 WDP_LOGD("ssid [%s]", ssid);
4914 g_strlcpy(network->ssid, ssid + 1, WS_SSID_LEN + 1);
4915 network->ssid[strlen(ssid) - 2] = '\0';
4917 } else if (g_strcmp0(key, "bssid") == 0) {
4918 unsigned char *bssid = NULL;
4919 g_variant_get(value, "&s", &bssid);
4920 WDP_LOGD("bssid [%s]", bssid);
4921 __ws_txt_to_mac(bssid, network->bssid);
4923 } else if (g_strcmp0(key, "proto") == 0) {
4924 const char *proto = NULL;
4925 g_variant_get(value, "&s", &proto);
4926 WDP_LOGD("proto [%s]", proto);
4928 if (g_strrstr(proto, WFD_OEM_STR_PROTO_WPA) != NULL)
4929 network->proto |= WFD_OEM_PROTO_WPA;
4930 if (g_strrstr(proto, WFD_OEM_STR_PROTO_RSN) != NULL)
4931 network->proto |= WFD_OEM_PROTO_RSN;
4933 } else if (g_strcmp0(key, "key_mgmt") == 0) {
4934 const char *key_mgmt = NULL;
4935 g_variant_get(value, "&s", &key_mgmt);
4936 WDP_LOGD("key_mgmt [%s]", key_mgmt);
4938 if (g_strrstr(key_mgmt, WFD_OEM_STR_KEY_MGMT_IEEE8021X) != NULL)
4939 network->key_mgmt |= WFD_OEM_KEY_MGMT_IEEE8021X;
4940 if (g_strrstr(key_mgmt, WFD_OEM_STR_KEY_MGMT_PSK) != NULL)
4941 network->key_mgmt |= WFD_OEM_KEY_MGMT_PSK;
4942 if (g_strrstr(key_mgmt, WFD_OEM_STR_KEY_MGMT_NONE) != NULL)
4943 network->key_mgmt |= WFD_OEM_KEY_MGMT_NONE;
4945 } else if (g_strcmp0(key, "pairwise") == 0) {
4946 const char *pairwise = NULL;
4947 g_variant_get(value, "&s", &pairwise);
4948 WDP_LOGD("pairwise [%s]", pairwise);
4950 if (g_strrstr(pairwise, WFD_OEM_STR_CIPHER_NONE) != NULL)
4951 network->pairwise |= WFD_OEM_CIPHER_NONE;
4952 if (g_strrstr(pairwise, WFD_OEM_STR_CIPHER_TKIP) != NULL)
4953 network->pairwise |= WFD_OEM_CIPHER_TKIP;
4954 if (g_strrstr(pairwise, WFD_OEM_STR_CIPHER_CCMP) != NULL)
4955 network->pairwise |= WFD_OEM_CIPHER_CCMP;
4957 } else if (g_strcmp0(key, "group") == 0) {
4958 const char *group = NULL;
4959 g_variant_get(value, "&s", &group);
4960 WDP_LOGD("group [%s]", group);
4962 if (g_strrstr(group, WFD_OEM_STR_CIPHER_NONE) != NULL)
4963 network->group |= WFD_OEM_CIPHER_NONE;
4964 if (g_strrstr(group, WFD_OEM_STR_CIPHER_WEP40) != NULL)
4965 network->group |= WFD_OEM_CIPHER_WEP40;
4966 if (g_strrstr(group, WFD_OEM_STR_CIPHER_WEP104) != NULL)
4967 network->group |= WFD_OEM_CIPHER_WEP104;
4968 if (g_strrstr(group, WFD_OEM_STR_CIPHER_TKIP) != NULL)
4969 network->group |= WFD_OEM_CIPHER_TKIP;
4970 if (g_strrstr(group, WFD_OEM_STR_CIPHER_CCMP) != NULL)
4971 network->group |= WFD_OEM_CIPHER_CCMP;
4973 } else if (g_strcmp0(key, "auth_alg") == 0) {
4974 const char *auth_alg = NULL;
4975 g_variant_get(value, "&s", &auth_alg);
4976 WDP_LOGD("auth_alg [%s]", auth_alg);
4978 if (g_strrstr(auth_alg, WFD_OEM_STR_AUTH_ALG_OPEN) != NULL)
4979 network->auth_alg |= WFD_OEM_AUTH_ALG_OPEN;
4981 } else if (g_strcmp0(key, "mode") == 0) {
4982 const char *mode = NULL;
4983 g_variant_get(value, "&s", &mode);
4984 WDP_LOGD("mode [%s]", mode);
4986 if (g_strrstr(mode, WFD_OEM_STR_MODE_GC) != NULL)
4987 network->mode |= WFD_OEM_PERSISTENT_MODE_GC;
4988 if (g_strrstr(mode, WFD_OEM_STR_MODE_GO) != NULL)
4989 network->mode |= WFD_OEM_PERSISTENT_MODE_GO;
4991 } else if (g_strcmp0(key, "p2p_client_list") == 0) {
4992 const char *p2p_client_list = NULL;
4997 g_variant_get(value, "&s", &p2p_client_list);
4998 WDP_LOGD("p2p_client_list [%s]", p2p_client_list);
4999 ptr = (char *)p2p_client_list;
5000 list_len = strlen(p2p_client_list);
5001 WDP_LOGD("list_len [%d]", list_len);
5002 while (ptr && list_len >= (OEM_MACSTR_LEN - 1)) {
5003 __ws_txt_to_mac((unsigned char *)ptr, (network->p2p_client_list[num]));
5004 ptr += OEM_MACSTR_LEN;
5005 list_len -= OEM_MACSTR_LEN;
5006 if (ptr && ptr[0] == ' ') {
5011 if (num >= OEM_MAX_PEER_NUM)
5014 network->p2p_client_num = num;
5015 WDP_LOGD("p2p_client_num [%d]", network->p2p_client_num);
5020 void __ws_extract_p2pdevice_details(const char *key, GVariant *value, void *user_data)
5022 __WDP_LOG_FUNC_ENTER__;
5023 #if defined (TIZEN_DEBUG_DBUS_VALUE)
5024 CHECK_KEY_VALUE(key, value);
5025 #endif /* TIZEN_DEBUG_DBUS_VALUE */
5026 if (g_strcmp0(key, "PersistentGroups") == 0) {
5027 GVariantIter *iter = NULL;
5028 const char *path = NULL;
5031 ws_network_info_s *networks = NULL;
5032 networks = (ws_network_info_s *)user_data;
5034 WDP_LOGE("network is NULL");
5035 __WDP_LOG_FUNC_EXIT__;
5039 g_variant_get(value, "ao", &iter);
5040 while(g_variant_iter_loop(iter, "&o", &path)) {
5043 if(num >= WS_MAX_PERSISTENT_COUNT)
5046 WDP_LOGD("Retrive persistent path [%s]", path);
5047 g_strlcpy(networks[num].persistent_path, path, DBUS_OBJECT_PATH_MAX);
5049 loc = strrchr(networks[num].persistent_path, '/');
5050 networks[num].network_id = strtoul(loc+1, NULL, 10);
5052 WDP_LOGD("Retrive persistent path [%s]", networks[num].persistent_path);
5053 dbus_property_get_all(networks[num].persistent_path, g_pd->g_dbus,
5054 SUPPLICANT_P2P_PERSISTENTGROUP, __parsing_networks, &networks[num]);
5058 networks[0].total = num;
5059 WDP_LOGI("total number [%d]", num);
5060 g_variant_iter_free(iter);
5062 __WDP_LOG_FUNC_EXIT__;
5066 int ws_get_persistent_groups(wfd_oem_persistent_group_s **groups, int *group_count)
5068 __WDP_LOG_FUNC_ENTER__;
5069 GDBusConnection *g_dbus = NULL;
5071 ws_network_info_s networks[WS_MAX_PERSISTENT_COUNT];
5072 wfd_oem_persistent_group_s *wfd_persistent_groups = NULL;
5076 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5077 __WDP_LOG_FUNC_EXIT__;
5081 g_dbus = g_pd->g_dbus;
5083 WDP_LOGE("DBus connection is NULL");
5084 __WDP_LOG_FUNC_EXIT__;
5088 memset(&networks, 0x0, WS_MAX_PERSISTENT_COUNT * sizeof(ws_network_info_s));
5089 dbus_property_get_all(g_pd->iface_path, g_dbus, SUPPLICANT_P2PDEVICE,
5090 __ws_extract_p2pdevice_details, &networks[0]);
5092 cnt = networks[0].total;
5094 WDP_LOGD("Persistent Group Count=%d", cnt);
5095 if (cnt > WS_MAX_PERSISTENT_COUNT) {
5096 WDP_LOGE("Persistent group count exceeded or parsing error");
5097 __WDP_LOG_FUNC_EXIT__;
5102 WDP_LOGE("Persistent group count zero");
5105 __WDP_LOG_FUNC_EXIT__;
5109 wfd_persistent_groups = (wfd_oem_persistent_group_s *) g_try_malloc0(cnt * sizeof(wfd_oem_persistent_group_s));
5110 if (wfd_persistent_groups == NULL) {
5111 WDP_LOGE("Failed to allocate memory for wfd_persistent_groups ");
5112 __WDP_LOG_FUNC_EXIT__;
5116 for (i = 0; i < cnt; i++) {
5119 WDP_LOGD("----persistent group [%d]----", i);
5120 WDP_LOGD("network_id [%d]", networks[i].network_id);
5121 WDP_LOGD("ssid [%s]", networks[i].ssid);
5122 WDP_LOGD("bssid ["MACSTR"]", MAC2STR(networks[i].bssid));
5123 WDP_LOGD("p2p_client_num [%d]", networks[i].p2p_client_num);
5124 for(j = 0; j < networks[i].p2p_client_num; j++)
5125 WDP_LOGD("p2p_client_list ["MACSTR"]", MAC2STR(networks[i].p2p_client_list[j]));
5127 wfd_persistent_groups[i].network_id = networks[i].network_id;
5128 g_strlcpy(wfd_persistent_groups[i].ssid, networks[i].ssid, WS_SSID_LEN + 1);
5129 memcpy(wfd_persistent_groups[i].go_mac_address, networks[i].bssid, WS_MACADDR_LEN);
5130 wfd_persistent_groups[i].p2p_client_num = networks[i].p2p_client_num;
5131 if (wfd_persistent_groups[i].p2p_client_num > 0)
5132 memcpy(wfd_persistent_groups[i].p2p_client_list, networks[i].p2p_client_list,
5133 OEM_MACADDR_LEN * OEM_MAX_PEER_NUM * sizeof(char));
5137 *groups = wfd_persistent_groups;
5139 __WDP_LOG_FUNC_EXIT__;
5143 int ws_remove_persistent_group(char *ssid, unsigned char *bssid)
5145 __WDP_LOG_FUNC_ENTER__;
5146 GDBusConnection *g_dbus = NULL;
5148 dbus_method_param_s params;
5149 ws_network_info_s networks[WS_MAX_PERSISTENT_COUNT];
5154 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5155 __WDP_LOG_FUNC_EXIT__;
5159 g_dbus = g_pd->g_dbus;
5161 WDP_LOGE("DBus connection is NULL");
5162 __WDP_LOG_FUNC_EXIT__;
5165 dbus_property_get_all(g_pd->iface_path, g_dbus, SUPPLICANT_P2PDEVICE,
5166 __ws_extract_p2pdevice_details, networks);
5168 cnt = networks[0].total;
5170 WDP_LOGD("Persistent Group Count=%d", cnt);
5171 if (cnt > WS_MAX_PERSISTENT_COUNT) {
5172 WDP_LOGE("Persistent group count exceeded or parsing error");
5173 __WDP_LOG_FUNC_EXIT__;
5177 for (i = 0; i < cnt; i++) {
5180 WDP_LOGD("----persistent group [%d]----", i);
5181 WDP_LOGD("network_id [%d]", networks[i].network_id);
5182 WDP_LOGD("network ssid [%s]", networks[i].ssid);
5183 WDP_LOGD("network bssid ["MACSTR"]", MAC2STR(networks[i].bssid));
5184 WDP_LOGD("network p2p_client_num [%d]", networks[i].p2p_client_num);
5185 for(j = 0; j < networks[i].p2p_client_num; j++)
5186 WDP_LOGD("network p2p_client_list ["MACSTR"]",
5187 MAC2STR(networks[i].p2p_client_list[j]));
5189 WDP_LOGD("ssid [%s]", ssid);
5190 WDP_LOGD("bssid ["MACSTR"]", MAC2STR(bssid));
5192 if (!g_strcmp0(ssid, networks[i].ssid) &&
5193 !memcmp(bssid, networks[i].bssid, WS_MACADDR_LEN)) {
5194 WDP_LOGD("Persistent group owner found [%d: %s]",
5195 networks[i].network_id, ssid);
5197 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5198 dbus_set_method_param(¶ms, "RemovePersistentGroup",
5199 g_pd->iface_path, g_dbus);
5200 params.params = g_variant_new ("(o)", networks[i].persistent_path);
5201 #if defined (TIZEN_DEBUG_DBUS_VALUE)
5202 DEBUG_PARAMS(params.params);
5203 #endif /* TIZEN_DEBUG_DBUS_VALUE */
5205 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
5207 WDP_LOGE("Failed to send command to wpa_supplicant");
5208 __WDP_LOG_FUNC_EXIT__;
5212 WDP_LOGD("Succeeded to remove persistent group");;
5218 WDP_LOGE("Persistent group not found [%s]", ssid);
5222 __WDP_LOG_FUNC_EXIT__;
5226 int ws_set_persistent_reconnect(unsigned char *bssid, int reconnect)
5228 __WDP_LOG_FUNC_ENTER__;
5229 GDBusConnection *g_dbus = NULL;
5231 GVariant *value = NULL;
5232 GVariant *param = NULL;
5233 GVariantBuilder *builder = NULL;
5234 dbus_method_param_s params;
5238 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5242 g_dbus = g_pd->g_dbus;
5244 WDP_LOGE("DBus connection is NULL");
5247 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5249 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
5252 builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}"));
5253 g_variant_builder_add (builder, "{sv}", "PersistentReconnect",
5254 g_variant_new_boolean(reconnect));
5255 value = g_variant_new ("a{sv}", builder);
5256 g_variant_builder_unref (builder);
5258 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
5260 params.params = param;
5261 #if defined (TIZEN_DEBUG_DBUS_VALUE)
5262 DEBUG_PARAMS(params.params);
5263 #endif /* TIZEN_DEBUG_DBUS_VALUE */
5265 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
5267 WDP_LOGE("Failed to send command to wpa_supplicant");
5269 WDP_LOGD("Succeeded to set persistent reconnect");
5271 __WDP_LOG_FUNC_EXIT__;
5275 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
5276 static int __ws_compress_query(char *compressed, char *query, int qtype)
5284 token = strtok_r(query, ".", &temp);
5286 if (!strcmp(token, "local")) {
5287 WDP_LOGD("Query conversion done");
5290 } else if (!strncmp(token, "_tcp", 4)) {
5291 memcpy(&compressed[length], WS_TCP_PTR_HEX, 2);
5294 } else if (!strncmp(token, "_udp", 4)) {
5295 memcpy(&compressed[length], WS_UDP_PTR_HEX, 2);
5299 WDP_LOGD("Token: [%s]", token);
5300 token_len = strlen(token);
5301 compressed[length] = token_len;
5304 memcpy(&compressed[length], token, token_len);
5308 token = strtok_r(NULL, ".", &temp);
5310 if(qtype == WS_QTYPE_PTR || token_num == 2) {
5311 memcpy(&compressed[length], WS_PTR_TYPE_HEX, 3);
5312 } else if (qtype == WS_QTYPE_TXT || token_num == 3) {
5313 memcpy(&compressed[length], WS_TXT_TYPE_HEX, 3);
5316 WDP_LOGD("converted query length [%d] token num [%d]", length, token_num);
5321 static int __ws_compress_rdata(char *compressed, char *rdata, int qtype)
5328 if (qtype == WS_QTYPE_PTR) {
5330 token = strtok_r(rdata, ".", &temp);
5332 WDP_LOGD("Token: %s", token);
5333 token_len = strlen(token);
5334 compressed[length] = token_len;
5337 memcpy(&compressed[length], token, token_len);
5341 compressed[length] = 0xc0;
5342 compressed[length+1] = 0x27;
5345 } else if (qtype == WS_QTYPE_TXT) {
5347 token = strtok_r(rdata, ",", &temp);
5350 WDP_LOGD("Token: [%s]", token);
5352 token_len = strlen(token);
5353 compressed[length] = token_len;
5356 memcpy(&compressed[length], token, token_len);
5359 token = strtok_r(NULL, ",", &temp);
5362 WDP_LOGD("RDATA is NULL");
5367 int _convert_bonjour_to_args(char *query, char *rdata, GVariantBuilder *builder)
5369 GVariantBuilder *args = NULL;
5370 char compressed[256] = {0, };
5376 if (!query || !builder) {
5377 WDP_LOGE("Invalid parameter");
5380 if (!rdata || !strlen(rdata)) {
5381 WDP_LOGD("RDATA is NULL\n");
5383 temp = strstr(rdata, query);
5385 if(temp != NULL && temp - rdata > 0)
5386 qtype = WS_QTYPE_PTR;
5388 qtype = WS_QTYPE_TXT;
5392 g_variant_builder_add (builder, "{sv}", "service_type", g_variant_new_string("bonjour"));
5394 /* compress query */
5395 length = __ws_compress_query(compressed, query, qtype);
5397 args = g_variant_builder_new (G_VARIANT_TYPE ("ay"));
5398 for (i = 0; i < length; i++)
5399 g_variant_builder_add(args, "y", compressed[i]);
5400 g_variant_builder_add(builder, "{sv}", "query", g_variant_new ("ay", args));
5401 g_variant_builder_unref (args);
5403 memset(compressed, 0x0, 256);
5408 length = __ws_compress_rdata(compressed, rdata, qtype);
5410 args = g_variant_builder_new (G_VARIANT_TYPE ("ay"));
5411 for (i = 0; i < length; i++)
5412 g_variant_builder_add(args, "y", compressed[i]);
5413 g_variant_builder_add(builder, "{sv}", "response", g_variant_new ("ay", args));
5414 g_variant_builder_unref (args);
5420 int _check_service_query_exists(wfd_oem_service_s *service)
5423 wfd_oem_service_s *data = NULL;
5425 for (count = 0; count < g_list_length(service_list); count ++) {
5426 data = (wfd_oem_service_s*) g_list_nth_data(service_list, count);
5427 if (strncmp(service->query_id, data->query_id, OEM_QUERY_ID_LEN) == 0) {
5428 WDP_LOGD("Query already exists");
5435 static wfd_oem_service_s* _remove_service_query(char * s_type, char *mac_str, char *query_id)
5437 if (NULL == s_type || NULL == mac_str || NULL == query_id)
5441 wfd_oem_service_s *data = NULL;
5443 for (count = 0; count < g_list_length(service_list); count ++) {
5444 data = (wfd_oem_service_s*) g_list_nth_data(service_list, count);
5445 if (data && !strncmp(data->service_type, s_type, SERVICE_TYPE_LEN) &&
5446 memcmp(data->dev_addr, mac_str, OEM_MACSTR_LEN - 1) == 0) {
5447 strncpy(query_id, data->query_id, OEM_QUERY_ID_LEN);
5451 if (strlen(query_id) <= 0) {
5452 WDP_LOGD("!! Query ID not found !!");
5456 WDP_LOGD("query id :[0x%s]",query_id);
5461 void __add_service_query(GVariant *value, void *mac_addr)
5463 __WDP_LOG_FUNC_ENTER__;
5464 wfd_oem_service_s *service = NULL;
5466 long long unsigned ref = 0;
5467 unsigned char *mac_address = (unsigned char *)mac_addr;
5468 char mac_str[18] = {0, };
5472 g_variant_get(value, "(t)", &ref);
5474 service = (wfd_oem_service_s*) g_try_malloc0(sizeof(wfd_oem_service_s));
5476 WDP_LOGE("Failed to allocate memory for service");
5480 if (mac_address[0] == 0 && mac_address[1] == 0 && mac_address[2] == 0 &&
5481 mac_address[3] == 0 && mac_address[4] == 0 && mac_address[5] == 0) {
5482 g_snprintf(mac_str, WS_MACSTR_LEN , "%s", SERV_BROADCAST_ADDRESS);
5484 g_snprintf(mac_str, WS_MACSTR_LEN, MACSTR, MAC2STR(mac_address));
5487 g_strlcpy(service->dev_addr, mac_str, OEM_MACSTR_LEN);
5488 g_snprintf(service->query_id, OEM_QUERY_ID_LEN + 1, "0x%llx", ref);
5490 res = _check_service_query_exists(service);
5494 service_list = g_list_append(service_list, service);
5497 __WDP_LOG_FUNC_EXIT__;
5502 /* for now, supplicant dbus interface only provides upnp service fully */
5503 int ws_start_service_discovery(unsigned char *mac_addr, int service_type)
5505 __WDP_LOG_FUNC_ENTER__;
5506 GDBusConnection *g_dbus = NULL;
5507 GVariantBuilder *builder = NULL;
5508 GVariant *value = NULL;
5509 dbus_method_param_s params;
5510 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
5515 WDP_LOGE("Invalid parameter");
5516 __WDP_LOG_FUNC_EXIT__;
5521 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5522 __WDP_LOG_FUNC_EXIT__;
5526 g_dbus = g_pd->g_dbus;
5528 WDP_LOGE("DBus connection is NULL");
5529 __WDP_LOG_FUNC_EXIT__;
5532 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5534 dbus_set_method_param(¶ms, "ServiceDiscoveryRequest", g_pd->iface_path, g_dbus);
5536 builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}") );
5539 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
5540 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(mac_addr));
5541 WDP_LOGD("get peer path [%s]", peer_path);
5542 g_variant_builder_add (builder, "{sv}", "peer", g_variant_new_object_path(peer_path));
5545 if (service_type == WFD_OEM_SERVICE_TYPE_ALL) {
5547 char *service_all = "\x02\x00\x00\x01";
5548 GVariantBuilder *query = NULL;
5550 query = g_variant_builder_new (G_VARIANT_TYPE ("ay"));
5551 for (i = 0; i < SERVICE_QUERY_LEN; i++)
5552 g_variant_builder_add(query, "y", service_all[i]);
5553 g_variant_builder_add (builder, "{sv}", "query", g_variant_new ("ay", query));
5554 g_variant_builder_unref (query);
5556 } else if (service_type == WFD_OEM_SERVICE_TYPE_UPNP) {
5558 g_variant_builder_add (builder, "{sv}", "service_type", g_variant_new_string("upnp"));
5559 g_variant_builder_add (builder, "{sv}", "version", g_variant_new_uint16(TRUE));
5561 } else if (service_type == WFD_OEM_SERVICE_TYPE_BONJOUR) {
5563 char *service_bonjour = "\x02\x00\x01\x01";
5564 GVariantBuilder *query = NULL;
5566 query = g_variant_builder_new (G_VARIANT_TYPE ("ay"));
5567 for (i = 0; i < SERVICE_QUERY_LEN; i++)
5568 g_variant_builder_add(query, "y", service_bonjour[i]);
5569 g_variant_builder_add (builder, "{sv}", "query", g_variant_new ("ay", query));
5570 g_variant_builder_unref (query);
5573 value = g_variant_new ("(a{sv})", builder);
5574 g_variant_builder_unref (builder);
5576 params.params = value;
5577 #if defined (TIZEN_DEBUG_DBUS_VALUE)
5578 DEBUG_PARAMS(params.params);
5579 #endif /* TIZEN_DEBUG_DBUS_VALUE */
5581 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, __add_service_query, mac_addr);
5583 WDP_LOGE("Failed to send command to wpa_supplicant");
5585 WDP_LOGD("Succeeded to start service discovery");
5587 __WDP_LOG_FUNC_EXIT__;
5591 int ws_cancel_service_discovery(unsigned char *mac_addr, int service_type)
5593 __WDP_LOG_FUNC_ENTER__;
5594 GDBusConnection *g_dbus = NULL;
5595 dbus_method_param_s params;
5596 wfd_oem_service_s *data = NULL;
5597 char query_id[OEM_QUERY_ID_LEN + 1] = {0, };
5598 char s_type[OEM_SERVICE_TYPE_LEN + 1] ={0, };
5599 char mac_str[18] = {0, };
5604 WDP_LOGE("Invalid parameter");
5605 __WDP_LOG_FUNC_EXIT__;
5610 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5611 __WDP_LOG_FUNC_EXIT__;
5615 g_dbus = g_pd->g_dbus;
5617 WDP_LOGE("DBus connection is NULL");
5618 __WDP_LOG_FUNC_EXIT__;
5622 if (mac_addr[0] == 0 && mac_addr[1] == 0 && mac_addr[2] == 0 &&
5623 mac_addr[3] == 0 && mac_addr[4] == 0 && mac_addr[5] == 0) {
5624 snprintf(mac_str, WS_MACSTR_LEN , "%s", SERV_BROADCAST_ADDRESS);
5626 snprintf(mac_str, WS_MACSTR_LEN, MACSTR, MAC2STR(mac_addr));
5629 switch(service_type) {
5630 case WFD_OEM_SERVICE_TYPE_ALL:
5631 strncpy(s_type, SERV_DISC_REQ_ALL, OEM_SERVICE_TYPE_LEN);
5633 case WFD_OEM_SERVICE_TYPE_BONJOUR:
5634 strncpy(s_type, SERV_DISC_REQ_BONJOUR, OEM_SERVICE_TYPE_LEN);
5636 case WFD_OEM_SERVICE_TYPE_UPNP:
5637 strncpy(s_type, SERV_DISC_REQ_UPNP, OEM_SERVICE_TYPE_LEN);
5640 WDP_LOGE("Invalid Service type");
5641 __WDP_LOG_FUNC_EXIT__;
5645 WDP_LOGD("Cancel service discovery service_type [%d]", service_type);
5646 WDP_LOGD("Cancel service discovery s_type [%s]", s_type);
5648 data = _remove_service_query(s_type, mac_str, query_id);
5650 __WDP_LOG_FUNC_EXIT__;
5653 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5655 dbus_set_method_param(¶ms, "ServiceDiscoveryCancelRequest", g_pd->iface_path, g_dbus);
5657 params.params = g_variant_new ("(t)", strtoul(query_id, NULL, 16));
5659 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
5661 WDP_LOGE("Failed to send command to wpa_supplicant");
5663 WDP_LOGD("Succeeded to cancel service discovery");
5665 service_list = g_list_remove(service_list, data);
5668 __WDP_LOG_FUNC_EXIT__;
5672 int ws_serv_add(wfd_oem_new_service_s *service)
5674 __WDP_LOG_FUNC_ENTER__;
5675 GDBusConnection *g_dbus = NULL;
5676 GVariantBuilder *builder = NULL;
5677 GVariant *value = NULL;
5678 dbus_method_param_s params;
5682 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5686 g_dbus = g_pd->g_dbus;
5688 WDP_LOGE("DBus connection is NULL");
5691 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5693 dbus_set_method_param(¶ms, "AddService", g_pd->iface_path, g_dbus);
5695 builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}") );
5697 if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
5699 WDP_LOGD("Service type: WFD_OEM_SERVICE_TYPE_BONJOUR");
5700 WDP_LOGD("Query: %s", service->data.bonjour.query);
5701 WDP_LOGD("RData: %s", service->data.bonjour.rdata);
5703 res = _convert_bonjour_to_args(service->data.bonjour.query,
5704 service->data.bonjour.rdata, builder);
5706 WDP_LOGE("Failed to convert Key string");
5707 g_variant_builder_unref (builder);
5711 } else if (service->protocol == WFD_OEM_SERVICE_TYPE_UPNP) {
5712 g_variant_builder_add (builder, "{sv}", "service_type", g_variant_new_string("upnp"));
5713 g_variant_builder_add (builder, "{sv}", "version", g_variant_new_uint16(TRUE));
5714 g_variant_builder_add (builder, "{sv}", "service", g_variant_new_string(service->data.upnp.service));
5717 value = g_variant_new ("(a{sv})", builder);
5718 g_variant_builder_unref (builder);
5720 params.params = value;
5721 #if defined (TIZEN_DEBUG_DBUS_VALUE)
5722 DEBUG_PARAMS(params.params);
5723 #endif /* TIZEN_DEBUG_DBUS_VALUE */
5725 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
5727 WDP_LOGE("Failed to send command to wpa_supplicant");
5729 WDP_LOGD("Succeeded to add service");
5731 __WDP_LOG_FUNC_EXIT__;
5735 int ws_serv_del(wfd_oem_new_service_s *service)
5737 __WDP_LOG_FUNC_ENTER__;
5738 GDBusConnection *g_dbus = NULL;
5739 GVariantBuilder *builder = NULL;
5740 GVariant *value = NULL;
5741 dbus_method_param_s params;
5745 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5749 g_dbus = g_pd->g_dbus;
5751 WDP_LOGE("DBus connection is NULL");
5754 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5756 dbus_set_method_param(¶ms, "DeleteService", g_pd->iface_path, g_dbus);
5758 builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}"));
5760 if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
5762 WDP_LOGD("Service type: WFD_OEM_SERVICE_TYPE_BONJOUR");
5763 WDP_LOGD("Query: %s", service->data.bonjour.query);
5765 res = _convert_bonjour_to_args(service->data.bonjour.query,
5768 WDP_LOGE("Failed to convert Key string");
5769 g_variant_builder_unref (builder);
5773 } else if (service->protocol == WFD_OEM_SERVICE_TYPE_UPNP) {
5774 g_variant_builder_add (builder, "{sv}", "service_type", g_variant_new_string("upnp"));
5775 g_variant_builder_add (builder, "{sv}", "version", g_variant_new_uint16(TRUE));
5776 g_variant_builder_add (builder, "{sv}", "service", g_variant_new_string(service->data.upnp.service));
5779 value = g_variant_new ("(a{sv})", builder);
5780 g_variant_builder_unref (builder);
5782 params.params = value;
5783 #if defined (TIZEN_DEBUG_DBUS_VALUE)
5784 DEBUG_PARAMS(params.params);
5785 #endif /* TIZEN_DEBUG_DBUS_VALUE */
5787 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
5789 WDP_LOGE("Failed to send command to wpa_supplicant");
5791 WDP_LOGD("Succeeded to del service");
5793 __WDP_LOG_FUNC_EXIT__;
5796 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
5798 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
5800 int _ws_disable_display()
5802 __WDP_LOG_FUNC_ENTER__;
5803 GDBusConnection *g_dbus = NULL;
5804 GVariantBuilder *builder = NULL;
5805 GVariant *value = NULL;
5806 GVariant *param = NULL;
5807 dbus_method_param_s params;
5811 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5815 g_dbus = g_pd->g_dbus;
5817 WDP_LOGE("DBus connection is NULL");
5820 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5822 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, SUPPLICANT_PATH,
5825 builder = g_variant_builder_new (G_VARIANT_TYPE ("ay"));
5826 value = g_variant_new ("ay", builder);
5827 g_variant_builder_unref (builder);
5829 param = g_variant_new("(ssv)", SUPPLICANT_INTERFACE, "WFDIEs", value);
5831 params.params = param;
5832 #if defined (TIZEN_DEBUG_DBUS_VALUE)
5833 DEBUG_PARAMS(params.params);
5834 #endif /* TIZEN_DEBUG_DBUS_VALUE */
5836 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
5838 WDP_LOGE("Failed to send command to wpa_supplicant");
5840 WDP_LOGD("Succeeded to disable Wi-Fi display");
5842 __WDP_LOG_FUNC_EXIT__;
5846 int ws_miracast_init(int enable)
5848 __WDP_LOG_FUNC_ENTER__;
5849 wfd_oem_display_s wifi_display;
5852 memset(&wifi_display, 0x0, sizeof(wfd_oem_display_s));
5854 wifi_display.availability = enable;
5855 wifi_display.hdcp_support = 1;
5856 wifi_display.port = 0x07E6;
5857 wifi_display.max_tput = 0x0028;
5859 res = ws_set_display(&wifi_display);
5861 WDP_LOGE("Failed to set miracast parameter(device info)");
5862 __WDP_LOG_FUNC_EXIT__;
5867 res = _ws_disable_display();
5869 WDP_LOGE("Failed to disable wifi display");
5871 WDP_LOGD("Succeeded to disable wifi display");
5873 __WDP_LOG_FUNC_EXIT__;
5877 int ws_set_display(wfd_oem_display_s *wifi_display)
5879 __WDP_LOG_FUNC_ENTER__;
5880 GDBusConnection *g_dbus = NULL;
5882 GVariant *value = NULL;
5883 GVariant *param = NULL;
5884 GVariantBuilder *builder = NULL;
5885 dbus_method_param_s params;
5889 unsigned char ies[WFD_SUBELEM_LEN_DEV_INFO + 3] = {0,};
5891 if (!wifi_display) {
5892 WDP_LOGE("Invalid parameter");
5895 g_dbus = g_pd->g_dbus;
5897 WDP_LOGE("DBus connection is NULL");
5900 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5902 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, SUPPLICANT_PATH,
5905 ies[2] = WFD_SUBELEM_LEN_DEV_INFO;
5906 ies[3] = wifi_display->hdcp_support;
5907 ies[4] = (wifi_display->type) | (wifi_display->availability<<4);
5908 ies[5] = wifi_display->port>>8;
5909 ies[6] = wifi_display->port&0xff;
5910 ies[7] = wifi_display->max_tput>>8;
5911 ies[8] = wifi_display->max_tput&0xff;
5913 builder = g_variant_builder_new (G_VARIANT_TYPE ("ay"));
5914 for(i = 0; i < WFD_SUBELEM_LEN_DEV_INFO + 3; i++)
5915 g_variant_builder_add(builder, "y", ies[i]);
5916 value = g_variant_new ("ay", builder);
5917 g_variant_builder_unref (builder);
5919 param = g_variant_new("(ssv)", SUPPLICANT_INTERFACE, "WFDIEs", value);
5921 params.params = param;
5922 #if defined (TIZEN_DEBUG_DBUS_VALUE)
5923 DEBUG_PARAMS(params.params);
5924 #endif /* TIZEN_DEBUG_DBUS_VALUE */
5926 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
5928 WDP_LOGE("Failed to send command to wpa_supplicant");
5930 WDP_LOGD("Succeeded to set Wi-Fi Display");
5932 __WDP_LOG_FUNC_EXIT__;
5935 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
5939 __WDP_LOG_FUNC_ENTER__;
5944 __WDP_LOG_FUNC_EXIT__;
5948 int ws_save_config(void)
5950 __WDP_LOG_FUNC_ENTER__;
5951 GDBusConnection *g_dbus = NULL;
5952 dbus_method_param_s params;
5955 g_dbus = g_pd->g_dbus;
5957 WDP_LOGE("DBus connection is NULL");
5958 __WDP_LOG_FUNC_EXIT__;
5961 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5963 dbus_set_method_param(¶ms, "SaveConfig", g_pd->iface_path, g_dbus);
5964 params.params = NULL;
5966 res = dbus_method_call(¶ms, SUPPLICANT_IFACE, NULL, NULL);
5968 WDP_LOGE("Failed to save config to wpa_supplicant");
5970 WDP_LOGD("Succeeded to save config");
5972 __WDP_LOG_FUNC_EXIT__;
5976 int ws_set_operating_channel(int channel)
5978 __WDP_LOG_FUNC_ENTER__;
5979 GDBusConnection *g_dbus = NULL;
5980 GVariant *value = NULL;
5981 GVariant *param = NULL;
5982 GVariantBuilder *builder = NULL;
5983 dbus_method_param_s params;
5986 g_dbus = g_pd->g_dbus;
5988 WDP_LOGE("DBus connection is NULL");
5989 __WDP_LOG_FUNC_EXIT__;
5993 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5995 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path, g_dbus);
5997 builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}"));
5998 g_variant_builder_add (builder, "{sv}", "OperChannel", g_variant_new_uint32(channel));
5999 value = g_variant_new ("a{sv}", builder);
6000 g_variant_builder_unref (builder);
6002 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
6003 params.params = param;
6005 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
6007 WDP_LOGE("Failed to send command to wpa_supplicant");
6009 WDP_LOGD("Succeeded to set Operating Channel");
6011 __WDP_LOG_FUNC_EXIT__;
6015 int ws_remove_all_network(void)
6017 __WDP_LOG_FUNC_ENTER__;
6018 GDBusConnection *g_dbus = NULL;
6019 dbus_method_param_s params;
6022 g_dbus = g_pd->g_dbus;
6024 WDP_LOGE("DBus connection is NULL");
6025 __WDP_LOG_FUNC_EXIT__;
6028 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6030 dbus_set_method_param(¶ms, "RemoveAllNetworks", g_pd->iface_path, g_dbus);
6031 params.params = NULL;
6033 res = dbus_method_call(¶ms, SUPPLICANT_IFACE, NULL, NULL);
6035 WDP_LOGE("Failed to send [RemoveAllNetworks] command to wpa_supplicant");
6037 WDP_LOGD("Succeeded to remove all networks from supplicant");
6039 WDP_LOGD("Succeeded to remove all network");
6040 __WDP_LOG_FUNC_EXIT__;
6044 int ws_get_wpa_status(int *wpa_status)
6046 __WDP_LOG_FUNC_ENTER__;
6047 GDBusConnection *g_dbus = NULL;
6048 GVariant *param = NULL;
6049 GVariant *reply = NULL;
6050 GError *error = NULL;
6053 WDP_LOGE("Invalid parameter");
6054 __WDP_LOG_FUNC_EXIT__;
6058 *wpa_status = WFD_OEM_WPA_STATE_MAX;
6060 g_dbus = g_pd->g_dbus;
6062 WDP_LOGE("DBus connection is NULL");
6063 __WDP_LOG_FUNC_EXIT__;
6067 param = g_variant_new("(s)", SUPPLICANT_IFACE);
6069 reply = g_dbus_connection_call_sync (
6071 SUPPLICANT_SERVICE, /* bus name */
6072 g_pd->iface_path, /* object path */
6073 DBUS_PROPERTIES_INTERFACE, /* interface name */
6074 DBUS_PROPERTIES_METHOD_GETALL, /* method name */
6075 param, /* GVariant *params */
6076 NULL, /* reply_type */
6077 G_DBUS_CALL_FLAGS_NONE, /* flags */
6078 SUPPLICANT_TIMEOUT , /* timeout */
6079 NULL, /* cancellable */
6080 &error); /* error */
6083 WDP_LOGE("Error! Failed to get properties: [%s]",
6085 g_error_free(error);
6087 g_variant_unref(reply);
6088 __WDP_LOG_FUNC_EXIT__;
6092 gchar *reply_str = NULL;
6094 reply_str = g_variant_print(reply, TRUE);
6095 WDP_LOGE("reply [%s]", reply_str ? reply_str : "NULL");
6099 GVariantIter *iter = NULL;
6100 g_variant_get(reply, "(a{sv})", &iter);
6104 GVariant *value = NULL;
6106 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
6107 if(g_strcmp0(key, "State") == 0) {
6108 const gchar *state = NULL;
6109 g_variant_get(value, "&s", &state);
6110 WDP_LOGI("state : [%s]", state);
6112 if (g_strcmp0(state, "disconnected") == 0)
6113 *wpa_status = WFD_OEM_WPA_STATE_DISCONNECTED;
6114 else if (g_strcmp0(state, "inactive") == 0)
6115 *wpa_status = WFD_OEM_WPA_STATE_INACTIVE;
6116 else if (g_strcmp0(state, "scanning") == 0)
6117 *wpa_status = WFD_OEM_WPA_STATE_SCANNING;
6118 else if (g_strcmp0(state, "authenticating") == 0)
6119 *wpa_status = WFD_OEM_WPA_STATE_AUTHENTICATING;
6120 else if (g_strcmp0(state, "associating") == 0)
6121 *wpa_status = WFD_OEM_WPA_STATE_ASSOCIATING;
6122 else if (g_strcmp0(state, "associated") == 0)
6123 *wpa_status = WFD_OEM_WPA_STATE_ASSOCIATED;
6124 else if (g_strcmp0(state, "4way_handshake") == 0)
6125 *wpa_status = WFD_OEM_WPA_STATE_4WAY_HANDSHAKE;
6126 else if (g_strcmp0(state, "group_handshake") == 0)
6127 *wpa_status = WFD_OEM_WPA_STATE_GROUP_HANDSHAKE;
6128 else if (g_strcmp0(state, "completed") == 0)
6129 *wpa_status = WFD_OEM_WPA_STATE_COMPLETED;
6131 *wpa_status = WFD_OEM_WPA_STATE_MAX;
6134 g_variant_iter_free(iter);
6136 g_variant_unref(reply);
6138 WDP_LOGD("No properties");
6141 WDP_LOGI("wpa_status : [%d]", *wpa_status);
6143 __WDP_LOG_FUNC_EXIT__;
6147 #if defined(TIZEN_FEATURE_ASP)
6148 int ws_advertise_service(wfd_oem_asp_service_s *service, int replace)
6150 __WDP_LOG_FUNC_ENTER__;
6151 GDBusConnection *g_dbus = NULL;
6152 GVariantBuilder *builder = NULL;
6153 GVariant *value = NULL;
6154 dbus_method_param_s params;
6155 unsigned int config_method = 0x1108;
6156 int auto_accept = 0;
6160 g_dbus = g_pd->g_dbus;
6162 WDP_LOGE("DBus connection is NULL");
6166 if (service->config_method == 2) {
6167 config_method = WS_CONFIG_METHOD_KEYPAD |
6168 WS_CONFIG_METHOD_DISPLAY;
6169 } else if (service->config_method == 3) {
6170 config_method = WS_CONFIG_METHOD_DISPLAY;
6171 } else if (service->config_method == 4) {
6172 config_method = WS_CONFIG_METHOD_KEYPAD;
6175 if(service->auto_accept) {
6176 if(service->role == 0)
6184 rep = (replace == 1);
6186 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6188 dbus_set_method_param(¶ms, "AddService", g_pd->iface_path, g_dbus);
6190 builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}") );
6192 g_variant_builder_add (builder, "{sv}", "service_type", g_variant_new_string("asp"));
6193 g_variant_builder_add (builder, "{sv}", "auto_accept", g_variant_new_int32(auto_accept));
6194 g_variant_builder_add (builder, "{sv}", "adv_id", g_variant_new_uint32(service->adv_id));
6195 g_variant_builder_add (builder, "{sv}", "svc_state", g_variant_new_uint32(service->status));
6196 g_variant_builder_add (builder, "{sv}", "config_method", g_variant_new_uint32(config_method));
6197 g_variant_builder_add (builder, "{sv}", "replace", g_variant_new_boolean(rep));
6198 if(service->service_type != NULL)
6199 g_variant_builder_add (builder, "{sv}", "adv_str", g_variant_new_string(service->service_type));
6200 if(service->service_info != NULL)
6201 g_variant_builder_add (builder, "{sv}", "svc_info", g_variant_new_string(service->service_info));
6203 value = g_variant_new ("(a{sv})", builder);
6204 g_variant_builder_unref (builder);
6205 #if defined (TIZEN_DEBUG_DBUS_VALUE)
6206 WDP_LOGE("params [%s]", g_variant_print(value, TRUE));
6207 #endif /* TIZEN_DEBUG_DBUS_VALUE */
6209 params.params = value;
6211 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
6213 WDP_LOGE("Failed to send command to wpa_supplicant");
6215 WDP_LOGD("Succeeded to add service");
6217 __WDP_LOG_FUNC_EXIT__;
6221 int ws_cancel_advertise_service(wfd_oem_asp_service_s *service)
6223 __WDP_LOG_FUNC_ENTER__;
6224 GDBusConnection *g_dbus = NULL;
6225 GVariantBuilder *builder = NULL;
6226 GVariant *value = NULL;
6227 dbus_method_param_s params;
6230 g_dbus = g_pd->g_dbus;
6232 WDP_LOGE("DBus connection is NULL");
6235 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6237 dbus_set_method_param(¶ms, "DeleteService", g_pd->iface_path, g_dbus);
6239 builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}"));
6241 g_variant_builder_add (builder, "{sv}", "service_type", g_variant_new_string("asp"));
6242 g_variant_builder_add (builder, "{sv}", "adv_id", g_variant_new_uint32(service->adv_id));
6244 value = g_variant_new ("(a{sv})", builder);
6245 g_variant_builder_unref (builder);
6246 #if defined (TIZEN_DEBUG_DBUS_VALUE)
6247 WDP_LOGD("params [%s]", g_variant_print(value, TRUE));
6248 #endif /* TIZEN_DEBUG_DBUS_VALUE */
6249 params.params = value;
6251 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
6253 WDP_LOGE("Failed to send command to wpa_supplicant");
6255 WDP_LOGD("Succeeded to del service");
6257 __WDP_LOG_FUNC_EXIT__;
6261 static void __ws_add_seek(wfd_oem_asp_service_s *service)
6263 __WDP_LOG_FUNC_ENTER__;
6264 wfd_oem_asp_service_s *seek = NULL;
6266 WDP_LOGE("invalid parameters");
6270 seek = g_try_malloc0(sizeof(wfd_oem_asp_service_s));
6272 WDP_LOGE("Failed to allocate memory for service");
6276 service->search_id = (intptr_t)seek;
6277 memcpy(seek, service, sizeof(wfd_oem_asp_service_s));
6278 if(service->service_type)
6279 seek->service_type = strdup(service->service_type);
6280 seek_list = g_list_prepend(seek_list, seek);
6282 __WDP_LOG_FUNC_EXIT__;
6286 static wfd_oem_asp_service_s * __ws_get_seek(long long unsigned search_id)
6288 __WDP_LOG_FUNC_ENTER__;
6289 wfd_oem_asp_service_s *seek = NULL;
6292 for(list = seek_list; list != NULL; list = list->next) {
6294 if(seek && (seek->search_id == search_id)) {
6295 WDP_LOGD("List found");
6301 __WDP_LOG_FUNC_EXIT__;
6305 static void __ws_remove_seek(wfd_oem_asp_service_s *service)
6307 __WDP_LOG_FUNC_ENTER__;
6308 wfd_oem_asp_service_s *seek = NULL;
6311 for(list = seek_list; list != NULL; list = list->next) {
6314 if (seek && (seek->search_id == service->search_id)) {
6315 WDP_LOGD("List remove");
6316 seek_list = g_list_remove(seek_list, seek);
6317 g_free(seek->service_type);
6318 g_free(seek->service_info);
6322 __WDP_LOG_FUNC_EXIT__;
6326 static void __get_asp_search_id(GVariant *value, void *args)
6328 __WDP_LOG_FUNC_ENTER__;
6329 wfd_oem_asp_service_s *service = NULL;
6330 wfd_oem_asp_service_s *seek = NULL;
6331 long long unsigned search_id = 0;
6333 g_variant_get(value, "(t)", &search_id);
6335 service = (wfd_oem_asp_service_s *)args;
6337 WDP_LOGE("invalid parameters");
6338 __WDP_LOG_FUNC_EXIT__;
6342 seek = g_try_malloc0(sizeof(wfd_oem_asp_service_s));
6344 WDP_LOGE("Failed to allocate memory for service");
6345 __WDP_LOG_FUNC_EXIT__;
6349 service->search_id = search_id;
6350 memcpy(seek, service, sizeof(wfd_oem_asp_service_s));
6351 if(service->service_type)
6352 seek->service_type = strdup(service->service_type);
6353 if(service->service_info)
6354 seek->service_info = strdup(service->service_info);
6355 seek_list = g_list_append(seek_list, seek);
6357 __WDP_LOG_FUNC_EXIT__;
6361 int ws_seek_service(wfd_oem_asp_service_s *service)
6363 __WDP_LOG_FUNC_ENTER__;
6364 GDBusConnection *g_dbus = NULL;
6366 wfd_oem_asp_service_s *seek = NULL;
6369 g_dbus = g_pd->g_dbus;
6371 WDP_LOGE("DBus connection is NULL");
6372 __WDP_LOG_FUNC_EXIT__;
6375 list = g_list_last(seek_list);
6377 service->tran_id = 1;
6382 service->tran_id = seek->tran_id + 1;
6384 service->tran_id = 1;
6387 if(service->service_info) {
6388 GVariantBuilder *builder = NULL;
6389 GVariant *value = NULL;
6390 dbus_method_param_s params;
6392 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6393 dbus_set_method_param(¶ms, "ServiceDiscoveryRequest",
6394 g_pd->iface_path, g_dbus);
6396 builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}") );
6398 g_variant_builder_add (builder, "{sv}", "service_type",
6399 g_variant_new_string("asp"));
6400 g_variant_builder_add (builder, "{sv}", "transaction_id",
6401 g_variant_new_byte(service->tran_id));
6402 if(service->service_type != NULL)
6403 g_variant_builder_add (builder, "{sv}", "svc_str",
6404 g_variant_new_string(service->service_type));
6406 if(service->service_info != NULL)
6407 g_variant_builder_add (builder, "{sv}", "svc_info",
6408 g_variant_new_string(service->service_info));
6410 value = g_variant_new ("(a{sv})", builder);
6411 g_variant_builder_unref (builder);
6413 #if defined (TIZEN_DEBUG_DBUS_VALUE)
6414 WDP_LOGD("params [%s]", g_variant_print(value, TRUE));
6415 #endif /* TIZEN_DEBUG_DBUS_VALUE */
6417 params.params = value;
6418 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE,
6419 __get_asp_search_id, service);
6422 __ws_add_seek(service);
6426 WDP_LOGE("Failed to send command to wpa_supplicant");
6428 WDP_LOGD("Succeeded to seek service");
6430 __WDP_LOG_FUNC_EXIT__;
6434 int ws_cancel_seek_service(wfd_oem_asp_service_s *service)
6436 __WDP_LOG_FUNC_ENTER__;
6437 GDBusConnection *g_dbus = NULL;
6438 wfd_oem_asp_service_s *seek = NULL;
6439 dbus_method_param_s params;
6442 g_dbus = g_pd->g_dbus;
6444 WDP_LOGE("DBus connection is NULL");
6445 __WDP_LOG_FUNC_EXIT__;
6449 seek = __ws_get_seek(service->search_id);
6451 WDP_LOGE("seek data is NULL");
6452 __WDP_LOG_FUNC_EXIT__;
6456 if(seek->service_info) {
6458 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6459 dbus_set_method_param(¶ms, "ServiceDiscoveryCancelRequest",
6460 g_pd->iface_path, g_dbus);
6462 params.params = g_variant_new ("(t)", service->search_id);
6464 #if defined (TIZEN_DEBUG_DBUS_VALUE)
6465 WDP_LOGD("params [%s]", g_variant_print(params.params, TRUE));
6466 #endif /* TIZEN_DEBUG_DBUS_VALUE */
6468 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
6470 WDP_LOGE("Failed to send command to wpa_supplicant");
6472 WDP_LOGD("Succeeded to cancel seek service");
6476 __ws_remove_seek(seek);
6478 __WDP_LOG_FUNC_EXIT__;
6482 int ws_asp_prov_disc_req(wfd_oem_asp_prov_s *asp_params)
6484 __WDP_LOG_FUNC_ENTER__;
6485 GDBusConnection *g_dbus = NULL;
6486 GVariantBuilder *builder = NULL;
6487 GVariantBuilder *mac_builder = NULL;
6488 GVariant *value = NULL;
6489 dbus_method_param_s params;
6490 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
6491 int config_method = 0x1000;
6496 WDP_LOGE("Invalid parameter");
6497 __WDP_LOG_FUNC_EXIT__;
6500 g_dbus = g_pd->g_dbus;
6502 WDP_LOGE("DBus connection is NULL");
6503 __WDP_LOG_FUNC_EXIT__;
6507 if(asp_params->network_config == WFD_OEM_ASP_WPS_TYPE_PIN_DISPLAY)
6508 config_method = 0x8;
6509 else if(asp_params->network_config == WFD_OEM_ASP_WPS_TYPE_PIN_KEYPAD)
6510 config_method = 0x100;
6512 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6514 dbus_set_method_param(¶ms, "ASPProvisionDiscoveryRequest", g_pd->iface_path, g_dbus);
6516 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
6517 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(asp_params->service_mac));
6518 WDP_LOGD("get peer path [%s]", peer_path);
6520 builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}") );
6521 g_variant_builder_add (builder, "{sv}", "peer", g_variant_new_object_path(peer_path));
6523 g_variant_builder_add (builder, "{sv}", "adv_id", g_variant_new_uint32(asp_params->adv_id));
6524 g_variant_builder_add (builder, "{sv}", "session_id", g_variant_new_uint32(asp_params->session_id));
6525 g_variant_builder_add (builder, "{sv}", "role", g_variant_new_byte(asp_params->network_role));
6526 g_variant_builder_add (builder, "{sv}", "method", g_variant_new_int32(config_method));
6527 if (asp_params->status > 0)
6528 g_variant_builder_add (builder, "{sv}", "status", g_variant_new_int32(asp_params->status));
6529 if (asp_params->session_information)
6530 g_variant_builder_add (builder, "{sv}", "info", g_variant_new_string(asp_params->session_information));
6532 mac_builder = g_variant_builder_new (G_VARIANT_TYPE ("ay"));
6533 for (i = 0; i < OEM_MACADDR_LEN; i++)
6534 g_variant_builder_add(mac_builder, "y", asp_params->service_mac[i]);
6535 g_variant_builder_add (builder, "{sv}", "adv_mac",
6536 g_variant_new ("ay", mac_builder));
6537 g_variant_builder_unref (mac_builder);
6539 mac_builder = g_variant_builder_new (G_VARIANT_TYPE ("ay"));
6540 for (i = 0; i < OEM_MACADDR_LEN; i++)
6541 g_variant_builder_add(mac_builder, "y", asp_params->session_mac[i]);
6542 g_variant_builder_add (builder, "{sv}", "session_mac",
6543 g_variant_new ("ay", mac_builder));
6544 g_variant_builder_unref (mac_builder);
6546 value = g_variant_new ("(a{sv})", builder);
6547 g_variant_builder_unref (builder);
6548 #if defined (TIZEN_DEBUG_DBUS_VALUE)
6549 WDP_LOGD("params [%s]", g_variant_print(value, TRUE));
6550 #endif /* TIZEN_DEBUG_DBUS_VALUE */
6552 params.params = value;
6554 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
6556 WDP_LOGE("Failed to send command to wpa_supplicant");
6558 WDP_LOGD("Succeeded to send connection command to peer[" MACSTR "]", MAC2STR(asp_params->service_mac));
6560 __WDP_LOG_FUNC_EXIT__;
6563 #endif /* TIZEN_FEATURE_ASP */