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_PROFILE_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 #define G_PD_CALLBACK(user_data, event)\
160 g_pd->callback(user_data, event);\
163 static int is_peer_joined_notified = 0;
164 static int is_peer_disconnected_notified = 0;
166 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
167 static GList *service_list;
168 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
170 static GList *seek_list;
172 static void _supplicant_signal_cb(GDBusConnection *connection,
173 const gchar *sender, const gchar *object_path, const gchar *interface,
174 const gchar *signal, GVariant *parameters, gpointer user_data);
176 static void _p2pdevice_signal_cb(GDBusConnection *connection,
177 const gchar *sender, const gchar *object_path, const gchar *interface,
178 const gchar *signal, GVariant *parameters, gpointer user_data);
180 static void _group_signal_cb(GDBusConnection *connection,
181 const gchar *sender, const gchar *object_path, const gchar *interface,
182 const gchar *signal, GVariant *parameters, gpointer user_data);
184 static void _interface_signal_cb(GDBusConnection *connection,
185 const gchar *sender, const gchar *object_path, const gchar *interface,
186 const gchar *signal, GVariant *parameters, gpointer user_data);
188 static int __ws_txt_to_mac(unsigned char *txt, unsigned char *mac)
193 WDP_LOGE("Invalid parameter");
198 mac[i++] = (char) strtoul((char *)txt, (char **)&txt, 16);
199 if (!*txt++ || i == 6)
203 if (i != WS_MACADDR_LEN)
206 WDP_LOGD("Converted MAC address [" MACSECSTR "]", MAC2SECSTR(mac));
210 static int __ws_mac_compact_to_normal(char *compact, unsigned char *mac)
212 g_snprintf((char *)mac, OEM_MACSTR_LEN, "%c%c:%c%c:%c%c:%c%c:%c%c:%c%c",
213 compact[0], compact[1], compact[2], compact[3],
214 compact[4], compact[5], compact[6], compact[7],
215 compact[8], compact[9], compact[10], compact[11]);
219 static const char *__ws_wps_to_txt(int wps_mode)
222 case WFD_OEM_WPS_MODE_PBC:
223 return WS_DBUS_STR_PBC;
224 case WFD_OEM_WPS_MODE_DISPLAY:
225 return WS_DBUS_STR_DISPLAY;
226 case WFD_OEM_WPS_MODE_KEYPAD:
227 return WS_DBUS_STR_KEYPAD;
228 #if defined(TIZEN_FEATURE_ASP)
229 case WFD_OEM_WPS_MODE_NONE:
230 case WFD_OEM_WPS_MODE_P2PS:
231 return WS_DBUS_STR_P2PS;
232 #endif /* TIZEN_FEATURE_ASP */
237 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
238 static int __ws_byte_to_hex(char *buf, int buf_size, unsigned char *data, int data_len)
242 char *end = buf + buf_size;
246 for (i = 0; i < data_len; i++) {
247 ret = snprintf(pos, end - pos, "%02x", data[i]);
248 if (ret < 0 || ret >= end - pos) {
258 static int __ws_hex_to_num(char *src, int len)
263 if (!src || len < 0) {
264 WDP_LOGE("Invalid parameter");
268 temp = (char*) g_try_malloc0(len+1);
270 WDP_LOGE("Failed to allocate memory");
274 memcpy(temp, src, len);
275 num = strtoul(temp, NULL, 16);
281 static int __ws_segment_to_service(char *segment, wfd_oem_new_service_s **service)
283 wfd_oem_new_service_s *serv_tmp = NULL;
288 if (!segment || !service) {
289 WDP_LOGE("Invalid parameter");
294 WDP_LOGD("Segment: %s", segment);
296 serv_tmp = (wfd_oem_new_service_s*) g_try_malloc0(sizeof(wfd_oem_new_service_s));
298 WDP_LOGE("Failed to allocate memory for service");
302 serv_tmp->protocol = __ws_hex_to_num(ptr, 2);
303 serv_tmp->trans_id = __ws_hex_to_num(ptr+2, 2);
304 serv_tmp->status = __ws_hex_to_num(ptr+4, 2);
306 WDP_LOGD("Protocol[%d], Transaction ID[%d], Status[%d]", serv_tmp->protocol, serv_tmp->trans_id, serv_tmp->status);
308 if (serv_tmp->status != 0) {
309 WDP_LOGE("Service status is not success");
314 if (serv_tmp->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
315 WDP_LOGD("===== Bonjour service =====");
316 char compr[5] = {0, };
317 char query[256] = {0, };
318 char rdata[256] = {0, };
321 while (*ptr != 0 && strncmp(ptr, "c0", 2)) {
322 unsigned long int size = 0;
323 char temp_str[3] = {0,};
324 memcpy(temp_str, ptr, 2);
325 size = strtoul(temp_str, NULL, 16);
328 temp = (char*) calloc(1, size + 2);
331 for (i = 0; i < size; i++) {
332 temp[i+1] = (char) __ws_hex_to_num(ptr, 2);
335 strncat(query, temp, size + 1);
342 if (!strncmp(ptr, "c0", 2)) {
343 memcpy(compr, ptr, 4);
346 if (!strncmp(ptr, "27", 2)) {
347 WDP_LOGD("Segment ended");
351 dns_type = __ws_hex_to_num(ptr, 4);
353 if (dns_type == 12) {
354 if (!strncmp(compr, "c011", 4))
355 strncat(query, ".local.", 7);
356 else if (!strncmp(compr, "c00c", 4))
357 strncat(query, "._tcp.local.", 12);
358 else if (!strncmp(compr, "c01c", 4))
359 strncat(query, "._udp.local.", 12);
363 serv_tmp->data.bonjour.query = strdup(query + 1);
364 while (*ptr != 0 && strncmp(ptr, "c0", 2)) {
365 unsigned long int size = 0;
366 char temp_str[3] = {0,};
367 memcpy(temp_str, ptr, 2);
368 size = strtoul(temp_str, NULL, 16);
371 temp = (char*) g_try_malloc0(size + 2);
374 for (i = 0; i < size; i++) {
375 temp[i+1] = (char) __ws_hex_to_num(ptr, 2);
378 strncat(rdata, temp, size + 1);
384 serv_tmp->data.bonjour.rdata = strdup(rdata + 1);
386 WDP_LOGD("Query: %s", serv_tmp->data.bonjour.query);
387 WDP_LOGD("RData: %s", serv_tmp->data.bonjour.rdata);
389 WDP_LOGE("Not supported yet. Only bonjour service supproted [%d]",
399 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
401 static void __ws_path_to_addr(char *peer_path,
402 unsigned char *dev_addr, GVariant *parameter)
404 __WDP_LOG_FUNC_ENTER__;
406 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
407 const char *path = NULL;
410 g_variant_get(parameter, "(&o)", &path);
411 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
412 WDP_LOGD("Retrive Added path [%s]", peer_path);
414 loc = strrchr(peer_path, '/');
416 __ws_mac_compact_to_normal(loc + 1, peer_dev);
418 __ws_txt_to_mac(peer_dev, dev_addr);
419 WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(dev_addr));
421 __WDP_LOG_FUNC_EXIT__;
425 static int __ws_unpack_ay(unsigned char *dst, GVariant *src, int size)
427 GVariantIter *iter = NULL;
431 if (!dst || !src || size == 0) {
432 WDP_LOGE("Invalid parameter");
435 g_variant_get(src, "ay", &iter);
437 WDP_LOGE("failed to get iterator");
441 while (g_variant_iter_loop(iter, "y", &dst[length])) {
446 g_variant_iter_free(iter);
449 WDP_LOGE("array is shorter than size");
456 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
457 static int __parsing_wfd_info(unsigned char *wfd_dev_info,
458 wfd_oem_display_s* display)
460 __WDP_LOG_FUNC_ENTER__;
463 if (!wfd_dev_info || !display) {
464 WDP_LOGE("Invalid parameter");
465 __WDP_LOG_FUNC_EXIT__;
469 wfd_info = (wfd_dev_info[3]<<8 | wfd_dev_info[4]);
471 if (wfd_info & WS_WFD_INFO_PRIMARY_SINK)
472 display->type |= WS_WFD_INFO_PRIMARY_SINK;
473 if (wfd_info & WS_WFD_INFO_SECONDARY_SINK)
474 display->type |= WS_WFD_INFO_SECONDARY_SINK;
476 display->availability = (wfd_info & WS_WFD_INFO_AVAILABILITY) >> 4;
477 display->hdcp_support = (wfd_info & WS_WFD_INFO_HDCP_SUPPORT) >> 8;
479 display->port = (wfd_dev_info[5]<<8 | wfd_dev_info[6]);
480 display->max_tput = (wfd_dev_info[7]<<8 | wfd_dev_info[8]);
482 WDP_LOGD("type [%d],availability [%d],hdcp_support [%d],ctrl_port [%d] "
483 "max_tput[%d]", display->type, display->availability,
484 display->hdcp_support, display->port, display->max_tput);
486 __WDP_LOG_FUNC_EXIT__;
489 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
491 static int _ws_get_local_dev_mac(unsigned char *dev_mac)
493 __WDP_LOG_FUNC_ENTER__;
495 const char *file_path = DEFAULT_MAC_FILE_PATH;
496 char local_mac[OEM_MACSTR_LEN] = {0, };
501 fd = fopen(file_path, "r");
503 WDP_LOGE("Failed to open MAC info file [%s] (%s)", file_path, strerror(errno));
504 __WDP_LOG_FUNC_EXIT__;
509 ptr = fgets((char *)local_mac, WS_MACSTR_LEN, fd);
511 WDP_LOGE("Failed to read file or no data read(%s)", strerror(errno));
513 __WDP_LOG_FUNC_EXIT__;
516 WDP_SECLOGD("Local MAC address [%s]", ptr);
517 WDP_SECLOGD("Local MAC address [%s]", local_mac);
519 res = __ws_txt_to_mac((unsigned char *)local_mac, dev_mac);
521 WDP_LOGE("Failed to convert text to MAC address");
523 __WDP_LOG_FUNC_EXIT__;
527 WDP_LOGD("Local Device MAC address [" MACSECSTR "]", MAC2SECSTR(dev_mac));
530 __WDP_LOG_FUNC_EXIT__;
534 static void _supplicant_signal_cb(GDBusConnection *connection,
535 const gchar *sender, const gchar *object_path, const gchar *interface,
536 const gchar *signal, GVariant *parameters, gpointer user_data)
538 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
541 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
545 if (!g_strcmp0(signal, "InterfaceAdded")) {
546 WDP_LOGD("InterfaceAdded");
548 } else if (!g_strcmp0(signal, "InterfaceRemoved")) {
549 WDP_LOGD("InterfaceRemoved");
550 static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
551 const char *path = NULL;
553 g_variant_get(parameters, "(&o)", &path);
554 g_strlcpy(interface_path, path, DBUS_OBJECT_PATH_MAX);
556 WDP_LOGD("Retrive removed path [%s]", interface_path);
558 if (!g_strcmp0(g_pd->group_iface_path, interface_path)) {
560 WDP_LOGD("p2p group interface removed");
561 memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
563 #if defined(TIZEN_WLAN_CONCURRENT_ENABLE) && defined(TIZEN_PROFILE_MOBILE)
564 else if (!g_strcmp0(g_pd->iface_path, interface_path)) {
566 WDP_LOGD("p2p interface removed");
567 wfd_oem_event_s event;
571 memset(&event, 0x0, sizeof(wfd_oem_event_s));
572 event.event_id = WFD_OEM_EVENT_DEACTIVATED;
573 G_PD_CALLBACK(g_pd->user_data, &event);
575 memset(g_pd->iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
577 #endif /* TIZEN_WLAN_CONCURRENT_ENABLE && TIZEN_PROFILE_MOBILE */
578 } else if (!g_strcmp0(signal, "PropertiesChanged")) {
579 WDP_LOGD("PropertiesChanged");
583 static void __ws_get_peer_property(const char *key, GVariant *value, void *user_data)
585 __WDP_LOG_FUNC_ENTER__;
587 wfd_oem_device_s *peer = (wfd_oem_device_s *)user_data;
589 __WDP_LOG_FUNC_EXIT__;
593 CHECK_KEY_VALUE(key, value);
595 if (g_strcmp0(key, "DeviceName") == 0) {
596 const char *name = NULL;
598 g_variant_get(value, "&s", &name);
599 g_strlcpy(peer->dev_name, name, WS_SSID_LEN);
600 WDP_LOGD("Device name [%s]", peer->dev_name);
602 } else if (g_strcmp0(key, "config_method") == 0) {
603 int config_methods = 0;
604 g_variant_get(value, "q", &config_methods);
606 if (config_methods & WS_CONFIG_METHOD_DISPLAY)
607 peer->config_methods |= WFD_OEM_WPS_MODE_DISPLAY;
608 if (config_methods & WS_CONFIG_METHOD_PUSHBUTTON)
609 peer->config_methods |= WFD_OEM_WPS_MODE_PBC;
610 if (config_methods & WS_CONFIG_METHOD_KEYPAD)
611 peer->config_methods |= WFD_OEM_WPS_MODE_KEYPAD;
612 WDP_LOGD("Config method [0x%x]", peer->config_methods);
614 } else if (g_strcmp0(key, "level") == 0) {
616 } else if (g_strcmp0(key, "devicecapability") == 0) {
617 unsigned char devicecapability = 0;
619 g_variant_get(value, "y", &devicecapability);
620 peer->dev_flags = (int)devicecapability;
621 WDP_LOGD("Device Capa [0x%02x]", peer->dev_flags);
623 } else if (g_strcmp0(key, "groupcapability") == 0) {
624 unsigned char groupcapability = 0;
626 g_variant_get(value, "y", &groupcapability);
627 WDP_LOGD("Group Capa [0x%02x]", groupcapability);
628 if (groupcapability & WS_GROUP_CAP_GROUP_OWNER) {
629 peer->group_flags = WFD_OEM_GROUP_FLAG_GROUP_OWNER;
630 peer->dev_role = WFD_OEM_DEV_ROLE_GO;
632 if (groupcapability & WS_GROUP_CAP_PERSISTENT_GROUP)
633 peer->group_flags = WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
635 } else if (g_strcmp0(key, "PrimaryDeviceType") == 0) {
636 unsigned char primarydevicetype[WS_DEVTYPE_LEN] = {0,};
638 if (__ws_unpack_ay(primarydevicetype, value, WS_DEVTYPE_LEN)) {
639 peer->pri_dev_type = primarydevicetype[1];
640 peer->sec_dev_type = primarydevicetype[WS_DEVTYPE_LEN -1];
642 } else if (g_strcmp0(key, "SecondaryDeviceTypes") == 0) {
643 } else if (g_strcmp0(key, "VendorExtension") == 0) {
644 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
645 } else if (g_strcmp0(key, "IEs") == 0) {
646 unsigned char ies[WFD_SUBELEM_LEN_DEV_INFO + 3] = {0,};
648 if (__ws_unpack_ay(ies, value, WFD_SUBELEM_LEN_DEV_INFO + 3))
649 __parsing_wfd_info(ies, &(peer->display));
650 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
651 } else if (g_strcmp0(key, "DeviceAddress") == 0) {
653 if (__ws_unpack_ay(peer->dev_addr, value, WS_MACADDR_LEN))
654 WDP_LOGD("Device address [" MACSTR "]", MAC2STR(peer->dev_addr));
656 } else if (g_strcmp0(key, "InterfaceAddress") == 0) {
658 if (__ws_unpack_ay(peer->intf_addr, value, WS_MACADDR_LEN))
659 WDP_LOGD("Interface address [" MACSTR "]", MAC2STR(peer->intf_addr));
661 } else if (g_strcmp0(key, "GODeviceAddress") == 0) {
663 if (__ws_unpack_ay(peer->go_dev_addr, value, WS_MACADDR_LEN))
664 WDP_LOGD("GODevice address [" MACSTR "]", MAC2STR(peer->go_dev_addr));
666 if (!ISZEROMACADDR(peer->go_dev_addr))
667 peer->dev_role = WFD_OEM_DEV_ROLE_GC;
669 WDP_LOGD("Unknown value");
671 __WDP_LOG_FUNC_EXIT__;
675 static void __ws_peer_property(const char *key, GVariant *value, void *user_data)
677 __WDP_LOG_FUNC_ENTER__;
679 __WDP_LOG_FUNC_EXIT__;
683 wfd_oem_dev_data_s *peer = (wfd_oem_dev_data_s *)user_data;
685 CHECK_KEY_VALUE(key, value);
687 if (g_strcmp0(key, "DeviceName") == 0) {
688 const char *name = NULL;
690 g_variant_get(value, "&s", &name);
691 g_strlcpy(peer->name, name, WS_SSID_LEN);
692 WDP_LOGD("Device Name [%s]", peer->name);
694 } else if (g_strcmp0(key, "config_method") == 0) {
695 int config_methods = 0;
697 g_variant_get(value, "q", &config_methods);
699 if (config_methods & WS_CONFIG_METHOD_DISPLAY)
700 peer->config_methods |= WFD_OEM_WPS_MODE_DISPLAY;
701 if (config_methods & WS_CONFIG_METHOD_PUSHBUTTON)
702 peer->config_methods |= WFD_OEM_WPS_MODE_PBC;
703 if (config_methods & WS_CONFIG_METHOD_KEYPAD)
704 peer->config_methods |= WFD_OEM_WPS_MODE_KEYPAD;
705 WDP_LOGD("Config method [0x%x]", peer->config_methods);
707 } else if (g_strcmp0(key, "level") == 0) {
709 } else if (g_strcmp0(key, "devicecapability") == 0) {
710 unsigned char devicecapability = 0;
712 g_variant_get(value, "y", &devicecapability);
713 peer->dev_flags = (int)devicecapability;
714 WDP_LOGD("Device Capa [0x%02x]", peer->dev_flags);
716 } else if (g_strcmp0(key, "groupcapability") == 0) {
717 unsigned char groupcapability = 0;
719 g_variant_get(value, "y", &groupcapability);
720 WDP_LOGD("Group Capa [0x%02x]", groupcapability);
721 if (groupcapability & WS_GROUP_CAP_GROUP_OWNER) {
722 peer->group_flags = WFD_OEM_GROUP_FLAG_GROUP_OWNER;
723 peer->dev_role = WFD_OEM_DEV_ROLE_GO;
725 if (groupcapability & WS_GROUP_CAP_PERSISTENT_GROUP)
726 peer->group_flags = WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
728 } else if (g_strcmp0(key, "PrimaryDeviceType") == 0) {
729 unsigned char primarydevicetype[WS_DEVTYPE_LEN] = {0,};
731 if (__ws_unpack_ay(primarydevicetype, value, WS_DEVTYPE_LEN)) {
732 peer->pri_dev_type = primarydevicetype[1];
733 peer->sec_dev_type = primarydevicetype[WS_DEVTYPE_LEN -1];
735 } else if (g_strcmp0(key, "SecondaryDeviceTypes") == 0) {
736 } else if (g_strcmp0(key, "VendorExtension") == 0) {
737 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
738 } else if (g_strcmp0(key, "IEs") == 0) {
739 unsigned char ies[WFD_SUBELEM_LEN_DEV_INFO + 3] = {0,};
741 if (__ws_unpack_ay(ies, value, WFD_SUBELEM_LEN_DEV_INFO + 3))
742 __parsing_wfd_info(ies, &(peer->display));
743 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
744 } else if (g_strcmp0(key, "DeviceAddress") == 0) {
746 if (__ws_unpack_ay(peer->p2p_dev_addr, value, WS_MACADDR_LEN))
747 WDP_LOGD("Device address [" MACSTR "]", MAC2STR(peer->p2p_dev_addr));
749 } else if (g_strcmp0(key, "InterfaceAddress") == 0) {
751 if (__ws_unpack_ay(peer->p2p_intf_addr, value, WS_MACADDR_LEN))
752 WDP_LOGD("Interface Address [" MACSTR "]", MAC2STR(peer->p2p_intf_addr));
754 } else if (g_strcmp0(key, "GODeviceAddress") == 0) {
756 unsigned char go_dev_addr[OEM_MACADDR_LEN] = {0,};
757 if (__ws_unpack_ay(go_dev_addr, value, WS_MACADDR_LEN))
758 WDP_LOGD("[" MACSTR "]", MAC2STR(go_dev_addr));
760 if (!ISZEROMACADDR(go_dev_addr))
761 peer->dev_role = WFD_OEM_DEV_ROLE_GC;
762 #if defined(TIZEN_FEATURE_ASP)
763 } else if (g_strcmp0(key, "AdvertiseService") == 0) {
764 if (value != NULL && g_variant_get_size(value) != 0)
765 peer->has_asp_services = 1;
767 peer->has_asp_services = 0;
769 #endif /* TIZEN_FEATURE_ASP */
771 WDP_LOGD("Unknown value");
773 __WDP_LOG_FUNC_EXIT__;
777 void __ws_interface_property(const char *key, GVariant *value, void *user_data)
779 __WDP_LOG_FUNC_ENTER__;
780 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
784 CHECK_KEY_VALUE(key, value);
786 if (g_strcmp0(key, "Ifname") == 0) {
787 const char *ifname = NULL;
789 g_variant_get(value, "&s", &ifname);
790 g_strlcpy(event->ifname, ifname, OEM_IFACE_NAME_LEN+1);
791 WDP_LOGD("Ifname [%s]", event->ifname);
794 __WDP_LOG_FUNC_EXIT__;
798 void __ws_group_property(const char *key, GVariant *value, void *user_data)
800 __WDP_LOG_FUNC_ENTER__;
801 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
802 if (!event || !event->edata)
805 wfd_oem_group_data_s *group = (wfd_oem_group_data_s *)event->edata;
807 CHECK_KEY_VALUE(key, value);
809 if (g_strcmp0(key, "Role") == 0) {
810 const char *role = NULL;
812 g_variant_get(value, "&s", &role);
813 WDP_LOGD("Role [%s]", role);
815 if (!strncmp(role, "GO", 2))
816 event->dev_role = WFD_OEM_DEV_ROLE_GO;
817 else if (!strncmp(role, "client", 6))
818 event->dev_role = WFD_OEM_DEV_ROLE_GC;
820 } else if (g_strcmp0(key, "Frequency") == 0) {
823 g_variant_get(value, "q", &frequency);
824 group->freq = (int)frequency;
826 } else if (g_strcmp0(key, "Passphrase") == 0) {
827 const char *passphrase = NULL;
829 g_variant_get(value, "&s", &passphrase);
830 g_strlcpy(group->pass, passphrase, OEM_PASS_PHRASE_LEN+1);
831 WDP_LOGD("passphrase [%s]", group->pass);
833 } else if (g_strcmp0(key, "Group") == 0) {
835 } else if (g_strcmp0(key, "SSID") == 0) {
836 unsigned char ssid[WS_SSID_LEN +1] = {0,};
838 __ws_unpack_ay(ssid, value, WS_SSID_LEN);
839 memcpy(group->ssid, ssid, WS_SSID_LEN+1);
840 WDP_LOGD("ssid [%s]", group->ssid);
842 } else if (g_strcmp0(key, "BSSID") == 0) {
844 if (__ws_unpack_ay(group->go_dev_addr, value, WS_MACADDR_LEN))
845 WDP_LOGD("[" MACSTR "]", MAC2STR(group->go_dev_addr));
848 WDP_LOGD("Unknown value");
850 __WDP_LOG_FUNC_EXIT__;
854 void __ws_extract_invitation_details(const char *key, GVariant *value, void *user_data)
856 __WDP_LOG_FUNC_ENTER__;
857 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
858 if (!event || !event->edata)
861 wfd_oem_invite_data_s *invitation = (wfd_oem_invite_data_s *)event->edata;
863 CHECK_KEY_VALUE(key, value);
865 if (g_strcmp0(key, "sa") == 0) {
866 if (__ws_unpack_ay(invitation->sa, value, WS_MACADDR_LEN))
867 WDP_LOGD("SA [" MACSTR "]", MAC2STR(invitation->sa));
869 } else if (g_strcmp0(key, "go_dev_addr") == 0) {
870 if (__ws_unpack_ay(invitation->go_dev_addr, value, WS_MACADDR_LEN))
871 WDP_LOGD("GO device address [" MACSTR "]", MAC2STR(invitation->go_dev_addr));
873 } else if (g_strcmp0(key, "bssid") == 0) {
874 if (__ws_unpack_ay(invitation->bssid, value, WS_MACADDR_LEN))
875 WDP_LOGD("BSSID [" MACSTR "]", MAC2STR(invitation->bssid));
877 } else if (g_strcmp0(key, "persistent_id") == 0) {
878 g_variant_get(value, "i", &(invitation->persistent_id));
879 WDP_LOGD("persistent id [%d]", invitation->persistent_id);
881 } else if (g_strcmp0(key, "op_freq") == 0) {
882 g_variant_get(value, "i", &(invitation->oper_freq));
883 WDP_LOGD("op freq [%d]", invitation->oper_freq);
885 WDP_LOGD("Unknown value");
887 __WDP_LOG_FUNC_EXIT__;
891 void __ws_extract_group_details(const char *key, GVariant *value, void *user_data)
893 __WDP_LOG_FUNC_ENTER__;
894 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
895 if (!event || !event->edata)
899 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
903 wfd_oem_group_data_s *group = (wfd_oem_group_data_s *)event->edata;
905 CHECK_KEY_VALUE(key, value);
907 if (g_strcmp0(key, "interface_object") == 0) {
908 static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
909 const char *i_path = NULL;
911 g_variant_get(value, "&o", &i_path);
912 g_strlcpy(interface_path, i_path, DBUS_OBJECT_PATH_MAX);
913 WDP_LOGD("Retrive Added path [%s]", interface_path);
914 g_strlcpy(g_pd->group_iface_path, interface_path, DBUS_OBJECT_PATH_MAX);
915 dbus_property_get_all(interface_path, g_pd->g_dbus,
916 SUPPLICANT_IFACE, __ws_interface_property, event);
918 } else if (g_strcmp0(key, "role") == 0) {
919 const char *role = NULL;
921 g_variant_get(value, "&s", &role);
922 WDP_LOGD("Role [%s]", role);
924 if (!strncmp(role, "GO", 2))
925 event->dev_role = WFD_OEM_DEV_ROLE_GO;
926 else if (!strncmp(role, "client", 6))
927 event->dev_role = WFD_OEM_DEV_ROLE_GC;
928 } else if (g_strcmp0(key, "persistent") == 0) {
929 g_variant_get(value, "b", &group->is_persistent);
930 WDP_LOGD("Is Persistent : [%s]", group->is_persistent ? "YES" : "NO");
932 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
933 } else if (g_strcmp0(key, "IpAddr") == 0) {
935 if (__ws_unpack_ay(group->ip_addr, value, OEM_IPADDR_LEN))
936 WDP_LOGD("IP address [" IPSTR "]", IP2STR(group->ip_addr));
938 } else if (g_strcmp0(key, "IpAddrMask") == 0) {
940 if (__ws_unpack_ay(group->ip_addr_mask, value, OEM_IPADDR_LEN))
941 WDP_LOGD("IP mask [" IPSTR "]", IP2STR(group->ip_addr_mask));
943 } else if (g_strcmp0(key, "IpAddrGo") == 0) {
945 if (__ws_unpack_ay(group->ip_addr_go, value, OEM_IPADDR_LEN))
946 WDP_LOGD("GO IP address [" IPSTR "]", IP2STR(group->ip_addr_go));
947 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
948 } else if (g_strcmp0(key, "group_object") == 0) {
949 static char group_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
952 g_variant_get(value, "&o", &g_path);
953 g_strlcpy(group_path, g_path, DBUS_OBJECT_PATH_MAX);
954 WDP_LOGD("Retrive group path [%s]", group_path);
955 dbus_property_get_all(group_path, g_pd->g_dbus, SUPPLICANT_P2P_GROUP,
956 __ws_group_property, event);
959 g_dbus_connection_signal_subscribe(
961 SUPPLICANT_SERVICE, /* bus name */
962 SUPPLICANT_P2P_GROUP, /* interface */
964 group_path, /* object path */
966 G_DBUS_SIGNAL_FLAGS_NONE,
969 WDP_LOGD("Subscribed group iface signal: [%d]", g_pd->group_sub_id);
971 __WDP_LOG_FUNC_EXIT__;
975 void __ws_extract_gonegfailaure_details(const char *key, GVariant *value, void *user_data)
977 __WDP_LOG_FUNC_ENTER__;
978 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
979 if (!event || !event->edata)
982 wfd_oem_conn_data_s *conn = (wfd_oem_conn_data_s *)event->edata;
984 CHECK_KEY_VALUE(key, value);
986 if (g_strcmp0(key, "peer_object") == 0) {
987 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
990 g_variant_get(value, "&o", &path);
991 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
992 WDP_LOGD("Retrive peer path [%s]", peer_path);
994 } else if (g_strcmp0(key, "status") == 0) {
997 g_variant_get(value, "i", &status);
998 WDP_LOGD("Retrive status [%d]", status);
999 conn->status = status;
1001 __WDP_LOG_FUNC_EXIT__;
1005 void __ws_extract_gonegsuccess_details(const char *key, GVariant *value, void *user_data)
1007 __WDP_LOG_FUNC_ENTER__;
1008 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1009 if (!event || !event->edata)
1012 wfd_oem_conn_data_s *edata = (wfd_oem_conn_data_s *)event->edata;
1014 CHECK_KEY_VALUE(key, value);
1016 if (g_strcmp0(key, "peer_object") == 0) {
1018 } else if (g_strcmp0(key, "status") == 0) {
1020 } else if (g_strcmp0(key, "passphrase") == 0) {
1022 } else if (g_strcmp0(key, "role_go") == 0) {
1023 /* local device role */
1024 const char *role = NULL;
1026 g_variant_get(value, "&s", &role);
1027 if (!strncmp(role, "GO", 2))
1028 event->dev_role = WFD_OEM_DEV_ROLE_GO;
1029 else if (!strncmp(role, "client", 6))
1030 event->dev_role = WFD_OEM_DEV_ROLE_GC;
1032 } else if (g_strcmp0(key, "ssid") == 0) {
1033 unsigned char ssid[WS_SSID_LEN +1] = {0,};
1035 __ws_unpack_ay(ssid, value, WS_SSID_LEN);
1036 memcpy(edata->ssid, ssid, WS_SSID_LEN+1);
1037 WDP_LOGD("ssid [%s]", edata->ssid);
1039 } else if (g_strcmp0(key, "peer_device_addr") == 0) {
1041 if (__ws_unpack_ay(edata->peer_device_addr, value, WS_MACADDR_LEN))
1042 WDP_LOGD("Device address[" MACSTR "]", MAC2STR(edata->peer_device_addr));
1044 } else if (g_strcmp0(key, "peer_interface_addr") == 0) {
1046 if (__ws_unpack_ay(edata->peer_intf_addr, value, WS_MACADDR_LEN))
1047 WDP_LOGD("Interface address [" MACSTR "]", MAC2STR(edata->peer_intf_addr));
1049 } else if (g_strcmp0(key, "wps_method") == 0) {
1051 } else if (g_strcmp0(key, "frequency_list") == 0) {
1053 } else if (g_strcmp0(key, "persistent_group") == 0) {
1055 g_variant_get(value, "i", &(edata->persistent_group));
1056 WDP_LOGD("persistent_group [%d]", edata->persistent_group);
1058 } else if (g_strcmp0(key, "peer_config_timeout") == 0) {
1061 __WDP_LOG_FUNC_EXIT__;
1065 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1066 void __ws_extract_peer_service(wfd_oem_event_s *data, unsigned char *service_hex, int tlvs_len)
1068 GList *services = NULL;
1069 wfd_oem_new_service_s *new_service = NULL;
1070 char *segment = NULL;
1076 while (ptr + 2 < WS_MAX_SERVICE_LEN &&
1077 (length = (service_hex[ptr+1]*256) + service_hex[ptr]) > 0) {
1078 segment = (char*) g_try_malloc0(length*2+1);
1080 __ws_byte_to_hex(segment, length * 2 + 1, &service_hex[ptr + 3], length);
1081 res = __ws_segment_to_service(segment, &new_service);
1083 WDP_LOGE("Failed to convert segment as service instance");
1088 services = g_list_append(services, new_service);
1094 data->edata_type = WFD_OEM_EDATA_TYPE_NEW_SERVICE;
1095 data->dev_role = count;
1096 data->edata = (void*) services;
1100 void __ws_extract_servicediscoveryresponse_details(const char *key, GVariant *value, void *user_data)
1102 __WDP_LOG_FUNC_ENTER__;
1103 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1108 CHECK_KEY_VALUE(key, value);
1110 if (g_strcmp0(key, "peer_object") == 0) {
1111 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1112 const char *path = NULL;
1115 g_variant_get(value, "&o", &path);
1119 WDP_LOGD("Retrive Added path [%s]", path);
1120 loc = strrchr(path, '/');
1122 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1123 __ws_txt_to_mac(peer_dev, event->dev_addr);
1125 } else if (g_strcmp0(key, "update_indicator")) {
1127 } else if (g_strcmp0(key, "tlvs")) {
1128 GVariantIter *iter = NULL;
1129 unsigned char service_hex[WS_MAX_SERVICE_LEN];
1130 int byte_length = 0;
1132 g_variant_get(value, "ay", &iter);
1134 WDP_LOGE("failed to get iterator");
1138 memset(service_hex, 0x0, WS_MAX_SERVICE_LEN);
1139 while (g_variant_iter_loop(iter, "y", &service_hex[byte_length]))
1141 g_variant_iter_free(iter);
1143 __ws_extract_peer_service(event, service_hex, byte_length);
1146 __WDP_LOG_FUNC_EXIT__;
1148 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1150 #if defined(TIZEN_FEATURE_ASP)
1151 static void __ws_extract_serviceaspresponse_details(const char *key, GVariant *value, void *user_data)
1153 __WDP_LOG_FUNC_ENTER__;
1154 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1155 if (!event || !event->edata)
1158 wfd_oem_asp_service_s *service = (wfd_oem_asp_service_s *)event->edata;
1160 if (g_strcmp0(key, "peer_object") == 0) {
1161 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1162 const char *path = NULL;
1165 g_variant_get(value, "&o", &path);
1169 WDP_LOGD("Retrive Added path [%s]", path);
1170 loc = strrchr(path, '/');
1172 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1173 __ws_txt_to_mac(peer_dev, event->dev_addr);
1175 } else if (g_strcmp0(key, "srv_trans_id") == 0) {
1176 unsigned int srv_trans_id = 0;
1177 g_variant_get(value, "u", &srv_trans_id);
1178 service->tran_id = srv_trans_id;
1179 WDP_LOGD("Retrive srv_trans_id [%x]", service->tran_id);
1181 } else if (g_strcmp0(key, "adv_id") == 0) {
1182 unsigned int adv_id = 0;
1183 g_variant_get(value, "u", &adv_id);
1184 service->adv_id = adv_id;
1185 WDP_LOGD("Retrive adv_id [%x]", service->adv_id);
1187 } else if (g_strcmp0(key, "svc_status") == 0) {
1188 unsigned char svc_status = 0;
1189 g_variant_get(value, "u", &svc_status);
1190 service->status = svc_status;
1191 WDP_LOGD("Retrive svc_status [%x]", service->status);
1193 } else if (g_strcmp0(key, "config_methods") == 0) {
1194 unsigned int config_methods = 0;
1195 g_variant_get(value, "q", &config_methods);
1196 service->config_method = config_methods;
1197 WDP_LOGD("Retrive config_methods [%x]", service->config_method);
1199 } else if (g_strcmp0(key, "svc_str") == 0) {
1200 const char *svc_str = NULL;
1201 g_variant_get(value, "&s", &svc_str);
1202 if (svc_str != NULL)
1203 service->service_type = g_strdup(svc_str);
1204 WDP_LOGD("Retrive srv_name [%s]", service->service_type);
1206 } else if (g_strcmp0(key, "info") == 0) {
1207 const char *info = NULL;
1208 g_variant_get(value, "&s", &info);
1210 service->service_info = g_strdup(info);
1211 WDP_LOGD("Retrive srv_info [%s]", service->service_info);
1213 __WDP_LOG_FUNC_EXIT__;
1216 static void __ws_extract_asp_provision_start_details(const char *key, GVariant *value, void *user_data)
1218 __WDP_LOG_FUNC_ENTER__;
1219 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1220 wfd_oem_asp_prov_s *asp_params = NULL;
1221 if (!event || !event->edata) {
1222 __WDP_LOG_FUNC_EXIT__;
1226 asp_params = (wfd_oem_asp_prov_s *)event->edata;
1228 if (g_strcmp0(key, "peer_object") == 0) {
1229 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1230 const char *path = NULL;
1233 g_variant_get(value, "&o", &path);
1235 __WDP_LOG_FUNC_EXIT__;
1239 WDP_LOGD("Retrive Added path [%s]", path);
1240 loc = strrchr(path, '/');
1242 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1243 __ws_txt_to_mac(peer_dev, event->dev_addr);
1245 } else if (g_strcmp0(key, "adv_id") == 0) {
1246 g_variant_get(value, "u", &asp_params->adv_id);
1247 WDP_LOGD("Retrive adv_id [%u]", asp_params->adv_id);
1249 } else if (g_strcmp0(key, "ses_id") == 0) {
1250 g_variant_get(value, "u", &asp_params->session_id);
1251 WDP_LOGD("Retrive session id [%u]", asp_params->session_id);
1253 } else if (g_strcmp0(key, "dev_passwd_id") == 0) {
1254 g_variant_get(value, "i", &event->wps_mode);
1255 WDP_LOGD("Retrive dev_passwd_id [%d]", event->wps_mode);
1257 } else if (g_strcmp0(key, "conncap") == 0) {
1258 g_variant_get(value, "u", &asp_params->network_role);
1259 WDP_LOGD("Retrive conncap [%x]", asp_params->network_role);
1261 } else if (g_strcmp0(key, "adv_mac") == 0) {
1262 if (__ws_unpack_ay(asp_params->service_mac, value, WS_MACADDR_LEN))
1263 WDP_LOGD("Adv address[" MACSTR "]", MAC2STR(asp_params->service_mac));
1265 } else if (g_strcmp0(key, "ses_mac") == 0) {
1266 if (__ws_unpack_ay(asp_params->session_mac, value, WS_MACADDR_LEN))
1267 WDP_LOGD("session address[" MACSTR "]", MAC2STR(asp_params->session_mac));
1269 } else if (g_strcmp0(key, "session_info") == 0) {
1270 const char *session_info = NULL;
1271 g_variant_get(value, "&s", &session_info);
1272 if (session_info != NULL)
1273 asp_params->session_information = g_strdup(session_info);
1274 WDP_LOGD("Retrive session_info [%s]", asp_params->session_information);
1276 __WDP_LOG_FUNC_EXIT__;
1279 static void __ws_extract_asp_provision_done_details(const char *key, GVariant *value, void *user_data)
1281 __WDP_LOG_FUNC_ENTER__;
1282 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1283 wfd_oem_asp_prov_s *asp_params = NULL;
1284 if (!event || !event->edata) {
1285 __WDP_LOG_FUNC_EXIT__;
1289 asp_params = (wfd_oem_asp_prov_s *)event->edata;
1292 if (g_strcmp0(key, "peer_object") == 0) {
1293 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1294 const char *path = NULL;
1297 g_variant_get(value, "&o", &path);
1299 __WDP_LOG_FUNC_EXIT__;
1303 WDP_LOGD("Retrive Added path [%s]", path);
1304 loc = strrchr(path, '/');
1306 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1307 __ws_txt_to_mac(peer_dev, event->dev_addr);
1309 WDP_LOGD("peer address[" MACSTR "]", MAC2STR(event->dev_addr));
1311 } else if (g_strcmp0(key, "adv_id") == 0) {
1312 g_variant_get(value, "u", &asp_params->adv_id);
1313 WDP_LOGD("Retrive adv_id [%u]", asp_params->adv_id);
1315 } else if (g_strcmp0(key, "ses_id") == 0) {
1316 g_variant_get(value, "u", &asp_params->session_id);
1317 WDP_LOGD("Retrive session id [%u]", asp_params->session_id);
1319 } else if (g_strcmp0(key, "dev_passwd_id") == 0) {
1320 g_variant_get(value, "i", &event->wps_mode);
1321 WDP_LOGD("Retrive dev_passwd_id [%d]", event->wps_mode);
1323 } else if (g_strcmp0(key, "conncap") == 0) {
1324 g_variant_get(value, "u", &asp_params->network_role);
1325 WDP_LOGD("Retrive network role [%x]", asp_params->network_role);
1327 } else if (g_strcmp0(key, "status") == 0) {
1328 g_variant_get(value, "u", &asp_params->status);
1329 WDP_LOGD("Retrive status [%x]", asp_params->status);
1331 } else if (g_strcmp0(key, "persist") == 0) {
1332 g_variant_get(value, "u", &asp_params->persistent_group_id);
1333 asp_params->persist = 1;
1334 WDP_LOGD("Retrive persist [%u]", asp_params->persistent_group_id);
1336 } else if (g_strcmp0(key, "adv_mac") == 0) {
1337 if (__ws_unpack_ay(asp_params->service_mac, value, WS_MACADDR_LEN))
1338 WDP_LOGD("Adv address[" MACSTR "]", MAC2STR(asp_params->service_mac));
1340 } else if (g_strcmp0(key, "ses_mac") == 0) {
1341 if (__ws_unpack_ay(asp_params->session_mac, value, WS_MACADDR_LEN))
1342 WDP_LOGD("session address[" MACSTR "]", MAC2STR(asp_params->session_mac));
1344 } else if (g_strcmp0(key, "group_mac") == 0) {
1345 if (__ws_unpack_ay(asp_params->group_mac, value, WS_MACADDR_LEN))
1346 WDP_LOGD("group address[" MACSTR "]", MAC2STR(asp_params->group_mac));
1348 __WDP_LOG_FUNC_EXIT__;
1351 static void __ws_extract_provision_fail_details(const char *key, GVariant *value, void *user_data)
1353 __WDP_LOG_FUNC_ENTER__;
1354 wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
1355 wfd_oem_asp_prov_s *asp_params = NULL;
1356 if (!event || !event->edata) {
1357 __WDP_LOG_FUNC_EXIT__;
1361 asp_params = (wfd_oem_asp_prov_s *)event->edata;
1363 if (g_strcmp0(key, "peer_object") == 0) {
1364 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
1365 const char *path = NULL;
1368 g_variant_get(value, "&o", &path);
1370 __WDP_LOG_FUNC_EXIT__;
1374 WDP_LOGD("Retrive Added path [%s]", path);
1375 loc = strrchr(path, '/');
1377 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1378 __ws_txt_to_mac(peer_dev, event->dev_addr);
1380 } else if (g_strcmp0(key, "adv_id") == 0) {
1381 g_variant_get(value, "u", &asp_params->adv_id);
1382 WDP_LOGD("Retrive adv_id [%d]", asp_params->adv_id);
1384 } else if (g_strcmp0(key, "status") == 0) {
1385 g_variant_get(value, "i", &asp_params->status);
1386 WDP_LOGD("Retrive status [%d]", asp_params->status);
1388 } else if (g_strcmp0(key, "deferred_session_resp") == 0) {
1389 const char *session_info = NULL;
1390 g_variant_get(value, "&s", &session_info);
1391 if (session_info != NULL)
1392 asp_params->session_information = g_strdup(session_info);
1393 WDP_LOGD("Retrive deferred_session_resp [%s]", asp_params->session_information);
1395 __WDP_LOG_FUNC_EXIT__;
1397 #endif /* TIZEN_FEATURE_ASP */
1399 static int _ws_flush()
1401 __WDP_LOG_FUNC_ENTER__;
1402 GDBusConnection *g_dbus = NULL;
1403 dbus_method_param_s params;
1407 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
1408 __WDP_LOG_FUNC_EXIT__;
1412 g_dbus = g_pd->g_dbus;
1414 WDP_LOGE("DBus connection is NULL");
1415 __WDP_LOG_FUNC_EXIT__;
1418 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
1420 dbus_set_method_param(¶ms, "Flush", g_pd->iface_path, g_dbus);
1421 params.params = NULL;
1423 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
1425 WDP_LOGE("Failed to send command to wpa_supplicant");
1427 WDP_LOGD("Succeeded to flush");
1429 __WDP_LOG_FUNC_EXIT__;
1433 static int _ws_cancel()
1435 __WDP_LOG_FUNC_ENTER__;
1436 GDBusConnection *g_dbus = NULL;
1437 dbus_method_param_s params;
1441 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
1446 g_dbus = g_pd->g_dbus;
1448 WDP_LOGE("DBus connection is NULL");
1451 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
1453 dbus_set_method_param(¶ms, "Cancel", g_pd->iface_path , g_dbus);
1454 params.params = NULL;
1456 res = dbus_method_call(¶ms, SUPPLICANT_WPS, NULL, NULL);
1458 WDP_LOGE("Failed to send command to wpa_supplicant");
1460 WDP_LOGD("Succeeded to cancel");
1462 __WDP_LOG_FUNC_EXIT__;
1466 #if defined(TIZEN_FEATURE_ASP)
1467 int ws_get_advertise_service(const char *peer_path, GList **asp_services)
1469 __WDP_LOG_FUNC_ENTER__;
1470 GDBusConnection *g_dbus = NULL;
1471 GVariant *param = NULL;
1472 GVariant *reply = NULL;
1473 GVariant *temp = NULL;
1474 GError *error = NULL;
1475 GVariantIter *iter = NULL;
1476 wfd_oem_advertise_service_s *service;
1477 wfd_oem_asp_service_s *seek = NULL;
1478 unsigned char desc[7];
1479 unsigned int adv_id;
1480 unsigned int config_method;
1481 unsigned char length;
1487 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
1491 g_dbus = g_pd->g_dbus;
1493 WDP_LOGE("DBus connection is NULL");
1497 param = g_variant_new("(ss)", SUPPLICANT_P2P_PEER, "AdvertiseService");
1498 DEBUG_G_VARIANT("Params : ", param);
1500 reply = g_dbus_connection_call_sync(
1502 SUPPLICANT_SERVICE, /* bus name */
1503 peer_path, /* object path */
1504 DBUS_PROPERTIES_INTERFACE, /* interface name */
1505 DBUS_PROPERTIES_METHOD_GET, /* method name */
1506 param, /* GVariant *params */
1507 NULL, /* reply_type */
1508 G_DBUS_CALL_FLAGS_NONE, /* flags */
1509 SUPPLICANT_TIMEOUT , /* timeout */
1510 NULL, /* cancellable */
1511 &error); /* error */
1513 if (error != NULL) {
1514 WDP_LOGE("Error! Failed to get peer advertise service: [%s]",
1516 g_error_free(error);
1518 g_variant_unref(reply);
1519 __WDP_LOG_FUNC_EXIT__;
1523 if (reply != NULL) {
1524 DEBUG_G_VARIANT("Reply : ", reply);
1526 /* replay will have the format <(<ay>,)>
1527 * So, you need to remove tuple out side of variant and
1528 * variant out side of byte array
1530 temp = g_variant_get_child_value(reply, 0);
1531 temp = g_variant_get_child_value(temp, 0);
1532 g_variant_get(temp, "ay", &iter);
1534 g_variant_unref(reply);
1535 WDP_LOGE("Failed to get iterator");
1540 /* 4byte advertisement ID, 2 byte config method, 1byte length */
1543 memset(desc, 0x0, 7);
1544 while (cnt < 7 && g_variant_iter_loop(iter, "y", &desc[cnt]))
1547 if (cnt != 7 || desc[6] == 0) {
1548 WDP_LOGE("Invalid descriptor header length cnt [%d]", cnt);
1549 g_variant_unref(reply);
1553 adv_id = desc[3] << 24 | desc[2] << 16 | desc[1] << 8 | desc[0];
1554 config_method = desc[4] << 8 | desc[4];
1557 value = g_try_malloc0(length + 1);
1558 if (value == NULL) {
1559 WDP_LOGE("g_try_malloc0 failed");
1560 g_variant_unref(reply);
1563 WDP_LOGD("adv_id[%u] config_method[%u] length[%hhu]", adv_id, config_method, length);
1566 while (cnt < length && g_variant_iter_loop(iter, "y", &value[cnt]))
1569 if (cnt != length) {
1570 WDP_LOGE("Length doesn't matched with header value cnt [%d]", cnt);
1571 g_variant_unref(reply);
1577 service = (wfd_oem_advertise_service_s *)
1578 g_try_malloc0(sizeof(wfd_oem_advertise_service_s));
1579 if (service == NULL) {
1580 WDP_LOGE("g_try_malloc0 failed");
1581 g_variant_unref(reply);
1585 service->adv_id = adv_id;
1586 service->config_method = config_method;
1587 service->service_type_length = length;
1588 service->service_type = value;
1590 GLIST_ITER_START(seek_list, seek)
1591 if (g_strcmp0(seek->service_type, service->service_type) == 0) {
1592 WDP_LOGD("service type matched [%s] search_id [%llu]",
1593 service->service_type, seek->search_id);
1599 if (seek != NULL && seek->service_info != NULL) {
1600 WDP_LOGD("service info exists, service discovery will be performed");
1602 WDP_LOGD("service info doesn't exists. Add service to list");
1604 service->search_id = seek->search_id;
1605 *asp_services = g_list_append(*asp_services, service);
1608 g_variant_unref(reply);
1610 __WDP_LOG_FUNC_EXIT__;
1613 #endif /* TIZEN_FEATURE_ASP */
1615 static void _ws_process_device_found_properties(GDBusConnection *connection,
1616 const gchar *object_path, GVariant *parameters)
1618 __WDP_LOG_FUNC_ENTER__;
1619 wfd_oem_event_s event;
1620 wfd_oem_dev_data_s *edata = NULL;
1621 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1622 static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
1624 GVariantIter *iter = NULL;
1625 const char *path = NULL;
1627 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
1629 WDP_LOGF("Failed to allocate memory for event. [%s]",
1631 __WDP_LOG_FUNC_EXIT__;
1634 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1636 event.edata = (void*) edata;
1637 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
1638 event.event_id = WFD_OEM_EVENT_PEER_FOUND;
1640 g_variant_get(parameters, "(&oa{sv})", &path, &iter);
1641 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
1642 WDP_LOGD("Retrive Added path [%s]", peer_path);
1644 loc = strrchr(peer_path, '/');
1646 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1647 __ws_txt_to_mac(peer_dev, event.dev_addr);
1648 WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(event.dev_addr));
1652 GVariant *value = NULL;
1654 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
1655 CHECK_KEY_VALUE(key, value);
1657 __ws_peer_property(key, value, (void *) event.edata);
1659 g_variant_iter_free(iter);
1662 #if defined(TIZEN_FEATURE_ASP)
1663 if (edata->has_asp_services)
1664 ws_get_advertise_service(peer_path, (GList **)&(event.asp_services));
1665 #endif /* TIZEN_FEATURE_ASP */
1667 G_PD_CALLBACK(g_pd->user_data, &event);
1668 #if defined(TIZEN_FEATURE_ASP)
1669 if (event.asp_services != NULL) {
1671 wfd_oem_advertise_service_s *service;
1672 for (l = (GList *)event.asp_services; l != NULL; l = l->next) {
1673 service = (wfd_oem_advertise_service_s *)l->data;
1674 event.asp_services = g_list_remove(l, service);
1675 g_free(service->service_type);
1679 #endif /* TIZEN_FEATURE_ASP */
1680 g_free(event.edata);
1682 __WDP_LOG_FUNC_EXIT__;
1685 static void _ws_process_device_lost(GDBusConnection *connection,
1686 const gchar *object_path, GVariant *parameters)
1688 __WDP_LOG_FUNC_ENTER__;
1689 wfd_oem_event_s event;
1690 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1692 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1694 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
1695 event.event_id = WFD_OEM_EVENT_PEER_DISAPPEARED;
1697 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
1699 G_PD_CALLBACK(g_pd->user_data, &event);
1701 __WDP_LOG_FUNC_EXIT__;
1704 static void _ws_process_find_stoppped(GDBusConnection *connection,
1705 const gchar *object_path, GVariant *parameters)
1707 __WDP_LOG_FUNC_ENTER__;
1708 wfd_oem_event_s event;
1710 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1712 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
1713 event.event_id = WFD_OEM_EVENT_DISCOVERY_FINISHED;
1715 G_PD_CALLBACK(g_pd->user_data, &event);
1717 __WDP_LOG_FUNC_EXIT__;
1720 static void _ws_process_prov_disc_req_display_pin(GDBusConnection *connection,
1721 const gchar *object_path, GVariant *parameters)
1723 __WDP_LOG_FUNC_ENTER__;
1725 wfd_oem_event_s event;
1726 wfd_oem_dev_data_s *edata = NULL;
1728 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1729 static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
1730 const char *path = NULL;
1731 const char *pin = NULL;
1734 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
1736 WDP_LOGF("Failed to allocate memory for event. [%s]",
1738 __WDP_LOG_FUNC_EXIT__;
1741 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1743 event.edata = (void*) edata;
1744 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
1745 event.event_id = WFD_OEM_EVENT_PROV_DISC_REQ;
1746 event.wps_mode = WFD_OEM_WPS_MODE_DISPLAY;
1748 g_variant_get(parameters, "(&o&s)", &path, &pin);
1749 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
1750 WDP_LOGD("Retrive Added path [%s]", peer_path);
1752 loc = strrchr(peer_path, '/');
1754 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1755 __ws_txt_to_mac(peer_dev, event.dev_addr);
1756 WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(event.dev_addr));
1758 g_strlcpy(event.wps_pin, pin, WS_PINSTR_LEN + 1);
1759 WDP_LOGD("Retrive pin [%s]", event.wps_pin);
1761 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
1762 __ws_peer_property, event.edata);
1764 G_PD_CALLBACK(g_pd->user_data, &event);
1765 g_free(event.edata);
1767 __WDP_LOG_FUNC_EXIT__;
1770 static void _ws_process_prov_disc_resp_display_pin(GDBusConnection *connection,
1771 const gchar *object_path, GVariant *parameters)
1773 __WDP_LOG_FUNC_ENTER__;
1775 wfd_oem_event_s event;
1776 wfd_oem_dev_data_s *edata = NULL;
1778 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1779 static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
1780 const char *path = NULL;
1781 const char *pin = NULL;
1784 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
1786 WDP_LOGF("Failed to allocate memory for event. [%s]",
1788 __WDP_LOG_FUNC_EXIT__;
1791 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1793 event.edata = (void*) edata;
1794 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
1795 event.event_id = WFD_OEM_EVENT_PROV_DISC_RESP;
1796 event.wps_mode = WFD_OEM_WPS_MODE_DISPLAY;
1798 g_variant_get(parameters, "(&o&s)", &path, &pin);
1799 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
1800 WDP_LOGD("Retrive Added path [%s]", peer_path);
1802 loc = strrchr(peer_path, '/');
1804 __ws_mac_compact_to_normal(loc + 1, peer_dev);
1805 __ws_txt_to_mac(peer_dev, event.dev_addr);
1806 WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(event.dev_addr));
1808 g_strlcpy(event.wps_pin, pin, WS_PINSTR_LEN + 1);
1809 WDP_LOGD("Retrive pin [%s]", event.wps_pin);
1811 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
1812 __ws_peer_property, event.edata);
1814 G_PD_CALLBACK(g_pd->user_data, &event);
1815 g_free(event.edata);
1817 __WDP_LOG_FUNC_EXIT__;
1820 static void _ws_process_prov_disc_req_enter_pin(GDBusConnection *connection,
1821 const gchar *object_path, GVariant *parameters)
1823 __WDP_LOG_FUNC_ENTER__;
1824 wfd_oem_event_s event;
1825 wfd_oem_dev_data_s *edata = NULL;
1826 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1828 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
1830 WDP_LOGF("Failed to allocate memory for event. [%s]",
1832 __WDP_LOG_FUNC_EXIT__;
1835 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1837 event.edata = (void*) edata;
1838 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
1839 event.event_id = WFD_OEM_EVENT_PROV_DISC_REQ;
1840 event.wps_mode = WFD_OEM_WPS_MODE_KEYPAD;
1842 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
1844 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
1845 __ws_peer_property, event.edata);
1847 G_PD_CALLBACK(g_pd->user_data, &event);
1848 g_free(event.edata);
1850 __WDP_LOG_FUNC_EXIT__;
1853 static void _ws_process_prov_disc_resp_enter_pin(GDBusConnection *connection,
1854 const gchar *object_path, GVariant *parameters)
1856 __WDP_LOG_FUNC_ENTER__;
1857 wfd_oem_event_s event;
1858 wfd_oem_dev_data_s *edata = NULL;
1859 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1861 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
1863 WDP_LOGF("Failed to allocate memory for event. [%s]",
1865 __WDP_LOG_FUNC_EXIT__;
1868 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1870 event.edata = (void*) edata;
1871 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
1872 event.event_id = WFD_OEM_EVENT_PROV_DISC_RESP;
1873 event.wps_mode = WFD_OEM_WPS_MODE_KEYPAD;
1875 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
1877 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
1878 __ws_peer_property, event.edata);
1880 G_PD_CALLBACK(g_pd->user_data, &event);
1881 g_free(event.edata);
1883 __WDP_LOG_FUNC_EXIT__;
1886 static void _ws_process_prov_disc_pbc_req(GDBusConnection *connection,
1887 const gchar *object_path, GVariant *parameters)
1889 __WDP_LOG_FUNC_ENTER__;
1890 wfd_oem_event_s event;
1891 wfd_oem_dev_data_s *edata = NULL;
1892 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1894 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
1896 WDP_LOGF("Failed to allocate memory for event. [%s]",
1898 __WDP_LOG_FUNC_EXIT__;
1901 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1903 event.edata = (void*) edata;
1904 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
1905 event.event_id = WFD_OEM_EVENT_PROV_DISC_REQ;
1906 event.wps_mode = WFD_OEM_WPS_MODE_PBC;
1908 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
1910 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
1911 __ws_peer_property, event.edata);
1913 G_PD_CALLBACK(g_pd->user_data, &event);
1914 g_free(event.edata);
1916 __WDP_LOG_FUNC_EXIT__;
1919 static void _ws_process_prov_disc_pbc_resp(GDBusConnection *connection,
1920 const gchar *object_path, GVariant *parameters)
1922 __WDP_LOG_FUNC_ENTER__;
1923 wfd_oem_event_s event;
1924 wfd_oem_dev_data_s *edata = NULL;
1925 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1927 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
1929 WDP_LOGF("Failed to allocate memory for event. [%s]",
1931 __WDP_LOG_FUNC_EXIT__;
1934 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1936 event.edata = (void*) edata;
1937 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
1938 event.event_id = WFD_OEM_EVENT_PROV_DISC_RESP;
1939 event.wps_mode = WFD_OEM_WPS_MODE_PBC;
1941 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
1943 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
1944 __ws_peer_property, event.edata);
1946 G_PD_CALLBACK(g_pd->user_data, &event);
1947 g_free(event.edata);
1949 __WDP_LOG_FUNC_EXIT__;
1952 #if defined(TIZEN_FEATURE_ASP)
1953 static void _ws_process_prov_disc_failure(GDBusConnection *connection,
1954 const gchar *object_path, GVariant *parameters)
1956 __WDP_LOG_FUNC_ENTER__;
1957 GVariantIter *iter = NULL;
1958 wfd_oem_event_s event;
1959 wfd_oem_asp_prov_s *edata;
1961 edata = (wfd_oem_asp_prov_s *) g_try_malloc0(sizeof(wfd_oem_asp_prov_s));
1963 WDP_LOGF("Failed to allocate memory for event. [%s]",
1965 __WDP_LOG_FUNC_EXIT__;
1968 memset(&event, 0x0, sizeof(wfd_oem_event_s));
1970 event.edata = (void*) edata;
1971 event.event_id = WFD_OEM_EVENT_PROV_DISC_FAIL;
1973 if (parameters != NULL) {
1974 g_variant_get(parameters, "(a{sv})", &iter);
1976 dbus_property_foreach(iter, __ws_extract_provision_fail_details, &event);
1977 event.edata_type = WFD_OEM_EDATA_TYPE_ASP_PROV;
1978 g_variant_iter_free(iter);
1981 WDP_LOGE("No Properties");
1984 G_PD_CALLBACK(g_pd->user_data, &event);
1986 if (event.edata_type == WFD_OEM_EDATA_TYPE_ASP_PROV)
1987 g_free(edata->session_information);
1990 __WDP_LOG_FUNC_EXIT__;
1993 static void _ws_process_prov_disc_failure(GDBusConnection *connection,
1994 const gchar *object_path, GVariant *parameters)
1996 __WDP_LOG_FUNC_ENTER__;
1997 wfd_oem_event_s event;
1998 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
1999 static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
2000 const char *path = NULL;
2001 int prov_status = 0;
2004 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2006 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
2007 event.event_id = WFD_OEM_EVENT_PROV_DISC_FAIL;
2009 g_variant_get(parameters, "(&oi)", &path, &prov_status);
2010 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
2011 WDP_LOGD("Retrive Added path [%s]", peer_path);
2012 WDP_LOGD("Retrive Failure stateus [%d]", prov_status);
2014 loc = strrchr(peer_path, '/');
2016 __ws_mac_compact_to_normal(loc + 1, peer_dev);
2017 __ws_txt_to_mac(peer_dev, event.dev_addr);
2018 WDP_LOGE("peer mac [" MACSTR "]", MAC2STR(event.dev_addr));
2020 G_PD_CALLBACK(g_pd->user_data, &event);
2022 __WDP_LOG_FUNC_EXIT__;
2024 #endif /* TIZEN_FEATURE_ASP */
2027 static void _ws_process_group_started(GDBusConnection *connection,
2028 const gchar *object_path, GVariant *parameters)
2030 __WDP_LOG_FUNC_ENTER__;
2031 GVariantIter *iter = NULL;
2032 wfd_oem_event_s event;
2033 wfd_oem_group_data_s *edata = NULL;
2035 edata = (wfd_oem_group_data_s*)calloc(1, sizeof(wfd_oem_group_data_s));
2037 WDP_LOGF("Failed to allocate memory for event. [%s]",
2039 __WDP_LOG_FUNC_EXIT__;
2042 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2044 event.edata = (void*) edata;
2045 event.edata_type = WFD_OEM_EDATA_TYPE_GROUP;
2046 event.event_id = WFD_OEM_EVENT_GROUP_CREATED;
2048 if (parameters != NULL) {
2049 g_variant_get(parameters, "(a{sv})", &iter);
2052 dbus_property_foreach(iter, __ws_extract_group_details, &event);
2053 g_variant_iter_free(iter);
2056 WDP_LOGE("No properties");
2059 G_PD_CALLBACK(g_pd->user_data, &event);
2060 g_free(event.edata);
2062 __WDP_LOG_FUNC_EXIT__;
2065 static void _ws_process_go_neg_success(GDBusConnection *connection,
2066 const gchar *object_path, GVariant *parameters)
2068 __WDP_LOG_FUNC_ENTER__;
2069 GVariantIter *iter = NULL;
2070 wfd_oem_event_s event;
2071 wfd_oem_conn_data_s *edata = NULL;
2073 edata = (wfd_oem_conn_data_s*)calloc(1, sizeof(wfd_oem_conn_data_s));
2075 WDP_LOGF("Failed to allocate memory for event. [%s]",
2077 __WDP_LOG_FUNC_EXIT__;
2080 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2082 event.edata = edata;
2083 event.edata_type = WFD_OEM_EDATA_TYPE_CONN;
2084 event.event_id = WFD_OEM_EVENT_GO_NEG_DONE;
2086 if (parameters != NULL) {
2087 g_variant_get(parameters, "(a{sv})", &iter);
2090 dbus_property_foreach(iter, __ws_extract_gonegsuccess_details, &event);
2091 g_variant_iter_free(iter);
2094 WDP_LOGE("No properties");
2097 G_PD_CALLBACK(g_pd->user_data, &event);
2100 __WDP_LOG_FUNC_EXIT__;
2103 static void _ws_process_go_neg_failure(GDBusConnection *connection,
2104 const gchar *object_path, GVariant *parameters)
2106 __WDP_LOG_FUNC_ENTER__;
2107 GVariantIter *iter = NULL;
2108 wfd_oem_event_s event;
2109 wfd_oem_conn_data_s *edata = NULL;
2111 edata = (wfd_oem_conn_data_s *) g_try_malloc0(sizeof(wfd_oem_conn_data_s));
2113 WDP_LOGF("Failed to allocate memory for event. [%s]",
2115 __WDP_LOG_FUNC_EXIT__;
2118 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2120 event.edata = (void*) edata;
2121 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
2122 event.event_id = WFD_OEM_EVENT_GO_NEG_FAIL;
2124 if (parameters != NULL) {
2125 g_variant_get(parameters, "(a{sv})", &iter);
2128 dbus_property_foreach(iter, __ws_extract_gonegfailaure_details, &event);
2129 g_variant_iter_free(iter);
2132 WDP_LOGE("No properties");
2135 G_PD_CALLBACK(g_pd->user_data, &event);
2136 g_free(event.edata);
2138 __WDP_LOG_FUNC_EXIT__;
2141 static void _ws_process_go_neg_request(GDBusConnection *connection,
2142 const gchar *object_path, GVariant *parameters)
2144 __WDP_LOG_FUNC_ENTER__;
2145 wfd_oem_event_s event;
2146 wfd_oem_dev_data_s *edata = NULL;
2147 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2148 static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
2149 const char *path = NULL;
2152 int dev_passwd_id = 0;
2153 int device_go_intent = 0;
2155 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
2157 WDP_LOGF("Failed to allocate memory for event. [%s]",
2159 __WDP_LOG_FUNC_EXIT__;
2162 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2164 event.edata = (void*) edata;
2165 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
2166 event.event_id = WFD_OEM_EVENT_GO_NEG_REQ;
2168 g_variant_get(parameters, "(&oqy)", &path, &dev_passwd_id, &device_go_intent);
2169 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
2171 WDP_LOGD("Retrive peer path [%s]", peer_path);
2172 WDP_LOGD("Retrive dev_passwd_id [%d]", dev_passwd_id);
2173 WDP_LOGD("Retrive device_go_intent [%d]", device_go_intent);
2175 if (dev_passwd_id == WS_DEV_PASSWD_ID_PUSH_BUTTON)
2176 event.wps_mode = WFD_OEM_WPS_MODE_PBC;
2177 else if (dev_passwd_id == WS_DEV_PASSWD_ID_REGISTRAR_SPECIFIED)
2178 event.wps_mode = WFD_OEM_WPS_MODE_DISPLAY;
2179 else if (dev_passwd_id == WS_DEV_PASSWD_ID_USER_SPECIFIED)
2180 event.wps_mode = WFD_OEM_WPS_MODE_KEYPAD;
2182 event.wps_mode = WFD_OEM_WPS_MODE_NONE;
2183 edata->device_go_intent = device_go_intent;
2185 loc = strrchr(peer_path, '/');
2187 __ws_mac_compact_to_normal(loc + 1, peer_dev);
2188 __ws_txt_to_mac(peer_dev, event.dev_addr);
2189 WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(event.dev_addr));
2191 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2192 __ws_peer_property, event.edata);
2194 G_PD_CALLBACK(g_pd->user_data, &event);
2195 g_free(event.edata);
2197 __WDP_LOG_FUNC_EXIT__;
2199 static void _ws_process_invitation_received(GDBusConnection *connection,
2200 const gchar *object_path, GVariant *parameters)
2202 __WDP_LOG_FUNC_ENTER__;
2203 GVariantIter *iter = NULL;
2204 wfd_oem_event_s event;
2205 wfd_oem_invite_data_s *edata = NULL;
2207 edata = (wfd_oem_invite_data_s *) g_try_malloc0(sizeof(wfd_oem_invite_data_s));
2209 WDP_LOGF("Failed to allocate memory for event. [%s]",
2211 __WDP_LOG_FUNC_EXIT__;
2214 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2216 event.edata = (void*) edata;
2217 event.edata_type = WFD_OEM_EDATA_TYPE_INVITE;
2218 event.event_id = WFD_OEM_EVENT_INVITATION_REQ;
2220 if (parameters != NULL) {
2221 g_variant_get(parameters, "(a{sv})", &iter);
2224 dbus_property_foreach(iter, __ws_extract_invitation_details, &event);
2225 g_variant_iter_free(iter);
2228 WDP_LOGE("No properties");
2230 memcpy(&(event.dev_addr), edata->sa, OEM_MACADDR_LEN);
2232 G_PD_CALLBACK(g_pd->user_data, &event);
2233 g_free(event.edata);
2235 __WDP_LOG_FUNC_EXIT__;
2238 static void _ws_process_invitation_result(GDBusConnection *connection,
2239 const gchar *object_path, GVariant *parameters)
2241 __WDP_LOG_FUNC_ENTER__;
2242 wfd_oem_event_s event;
2243 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2245 __WDP_LOG_FUNC_EXIT__;
2248 static void _ws_process_group_finished(GDBusConnection *connection,
2249 const gchar *object_path, GVariant *parameters)
2251 __WDP_LOG_FUNC_ENTER__;
2252 wfd_oem_event_s event;
2254 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2256 event.event_id = WFD_OEM_EVENT_GROUP_DESTROYED;
2257 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2259 g_dbus_connection_signal_unsubscribe(g_pd->g_dbus, g_pd->group_sub_id);
2260 memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
2263 G_PD_CALLBACK(g_pd->user_data, &event);
2265 __WDP_LOG_FUNC_EXIT__;
2268 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
2269 static void _ws_process_service_discovery_response(GDBusConnection *connection,
2270 const gchar *object_path, GVariant *parameters)
2272 __WDP_LOG_FUNC_ENTER__;
2273 GVariantIter *iter = NULL;
2274 wfd_oem_event_s event;
2276 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2278 event.event_id = WFD_OEM_EVENT_SERV_DISC_RESP;
2280 if (parameters != NULL) {
2281 g_variant_get(parameters, "(a{sv})", &iter);
2283 dbus_property_foreach(iter, __ws_extract_servicediscoveryresponse_details, &event);
2284 event.edata_type = WFD_OEM_EDATA_TYPE_NEW_SERVICE;
2285 g_variant_iter_free(iter);
2288 WDP_LOGE("No Properties");
2291 G_PD_CALLBACK(g_pd->user_data, &event);
2293 if (event.edata_type == WFD_OEM_EDATA_TYPE_NEW_SERVICE)
2294 g_list_free((GList*) event.edata);
2296 __WDP_LOG_FUNC_EXIT__;
2298 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
2300 #if defined(TIZEN_FEATURE_ASP)
2301 static void _ws_process_service_asp_response(GDBusConnection *connection,
2302 const gchar *object_path, GVariant *parameters)
2304 __WDP_LOG_FUNC_ENTER__;
2305 GVariantIter *iter = NULL;
2306 wfd_oem_event_s event;
2307 wfd_oem_asp_service_s *service = NULL;
2308 wfd_oem_asp_service_s *tmp = NULL;
2310 service = (wfd_oem_asp_service_s *) g_try_malloc0(sizeof(wfd_oem_asp_service_s));
2312 WDP_LOGF("Failed to allocate memory for event. [%s]",
2314 __WDP_LOG_FUNC_EXIT__;
2317 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2319 event.edata = (void*) service;
2320 event.edata_type = WFD_OEM_EDATA_TYPE_ASP_SERVICE;
2321 event.event_id = WFD_OEM_EVENT_ASP_SERV_RESP;
2323 if (parameters != NULL) {
2324 g_variant_get(parameters, "(a{sv})", &iter);
2326 dbus_property_foreach(iter, __ws_extract_serviceaspresponse_details, &event);
2327 g_variant_iter_free(iter);
2330 WDP_LOGE("No Properties");
2332 GLIST_ITER_START(seek_list, tmp)
2333 if (tmp->tran_id == service->tran_id) {
2334 WDP_LOGD("srv_trans_id matched [%d] search_id [%llu]"
2335 , tmp->tran_id, tmp->search_id);
2336 service->search_id = tmp->search_id;
2343 if (tmp != NULL && tmp->service_info != NULL)
2344 G_PD_CALLBACK(g_pd->user_data, &event);
2346 WDP_LOGD("service info is not required, don't notify to user");
2348 g_free(service->service_type);
2349 g_free(service->service_info);
2352 __WDP_LOG_FUNC_EXIT__;
2354 #endif /* TIZEN_FEATURE_ASP */
2356 static void _ws_process_persistent_group_added(GDBusConnection *connection,
2357 const gchar *object_path, GVariant *parameters)
2359 __WDP_LOG_FUNC_ENTER__;
2360 wfd_oem_event_s event;
2361 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2363 __WDP_LOG_FUNC_EXIT__;
2366 static void _ws_process_persistent_group_removed(GDBusConnection *connection,
2367 const gchar *object_path, GVariant *parameters)
2369 __WDP_LOG_FUNC_ENTER__;
2370 wfd_oem_event_s event;
2371 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2373 __WDP_LOG_FUNC_EXIT__;
2376 static void _ws_process_wps_failed(GDBusConnection *connection,
2377 const gchar *object_path, GVariant *parameters)
2379 __WDP_LOG_FUNC_ENTER__;
2380 GVariantIter *iter = NULL;
2381 wfd_oem_event_s event;
2382 const char *name = NULL;
2384 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2386 event.event_id = WFD_OEM_EVENT_WPS_FAIL;
2387 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2389 g_variant_get(parameters, "(&sa{sv})", &name, &iter);
2391 WDP_LOGD("code [%s]", name);
2396 GVariant *value = NULL;
2398 while (g_variant_iter_loop(iter, "{sv}", &key, &value))
2399 CHECK_KEY_VALUE(key, value);
2401 g_variant_iter_free(iter);
2404 G_PD_CALLBACK(g_pd->user_data, &event);
2406 __WDP_LOG_FUNC_EXIT__;
2409 static void _ws_process_group_formation_failure(GDBusConnection *connection,
2410 const gchar *object_path, GVariant *parameters)
2412 __WDP_LOG_FUNC_ENTER__;
2413 wfd_oem_event_s event;
2415 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2417 event.event_id = WFD_OEM_EVENT_GROUP_FORMATION_FAILURE;
2418 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2420 G_PD_CALLBACK(g_pd->user_data, &event);
2422 __WDP_LOG_FUNC_EXIT__;
2425 static void _ws_process_invitation_accepted(GDBusConnection *connection,
2426 const gchar *object_path, GVariant *parameters)
2428 __WDP_LOG_FUNC_ENTER__;
2429 GVariantIter *iter = NULL;
2430 wfd_oem_event_s event;
2432 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2434 event.event_id = WFD_OEM_EVENT_INVITATION_ACCEPTED;
2435 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2437 if (parameters != NULL) {
2438 g_variant_get(parameters, "(a{sv})", &iter);
2442 GVariant *value = NULL;
2444 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
2445 CHECK_KEY_VALUE(key, value);
2447 if (g_strcmp0(key, "sa") == 0)
2448 if (__ws_unpack_ay(event.dev_addr, value, WS_MACADDR_LEN))
2449 WDP_LOGI("[" MACSTR "]", MAC2STR(event.dev_addr));
2451 g_variant_iter_free(iter);
2455 G_PD_CALLBACK(g_pd->user_data, &event);
2456 __WDP_LOG_FUNC_EXIT__;
2459 #if defined(TIZEN_FEATURE_ASP)
2460 static void _ws_process_asp_provision_start(GDBusConnection *connection,
2461 const gchar *object_path, GVariant *parameters)
2463 __WDP_LOG_FUNC_ENTER__;
2464 GVariantIter *iter = NULL;
2465 wfd_oem_event_s event;
2466 wfd_oem_asp_prov_s *edata;
2468 edata = (wfd_oem_asp_prov_s *) g_try_malloc0(sizeof(wfd_oem_asp_prov_s));
2470 WDP_LOGF("Failed to allocate memory for event. [%s]",
2472 __WDP_LOG_FUNC_EXIT__;
2475 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2477 event.edata = (void*) edata;
2478 event.event_id = WFD_OEM_EVENT_ASP_PROV_START;
2480 if (parameters != NULL) {
2481 g_variant_get(parameters, "(a{sv})", &iter);
2483 dbus_property_foreach(iter, __ws_extract_asp_provision_start_details, &event);
2484 event.edata_type = WFD_OEM_EDATA_TYPE_ASP_PROV;
2485 g_variant_iter_free(iter);
2488 WDP_LOGE("No Properties");
2491 G_PD_CALLBACK(g_pd->user_data, &event);
2493 if (event.edata_type == WFD_OEM_EDATA_TYPE_ASP_PROV)
2494 g_free(edata->session_information);
2497 __WDP_LOG_FUNC_EXIT__;
2500 static void _ws_process_asp_provision_done(GDBusConnection *connection,
2501 const gchar *object_path, GVariant *parameters)
2503 __WDP_LOG_FUNC_ENTER__;
2504 GVariantIter *iter = NULL;
2505 wfd_oem_event_s event;
2506 wfd_oem_asp_prov_s *edata;
2508 edata = (wfd_oem_asp_prov_s *) g_try_malloc0(sizeof(wfd_oem_asp_prov_s));
2510 WDP_LOGF("Failed to allocate memory for event. [%s]",
2512 __WDP_LOG_FUNC_EXIT__;
2515 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2517 event.edata = (void*) edata;
2518 event.event_id = WFD_OEM_EVENT_ASP_PROV_DONE;
2520 if (parameters != NULL) {
2521 g_variant_get(parameters, "(a{sv})", &iter);
2523 dbus_property_foreach(iter, __ws_extract_asp_provision_done_details, &event);
2524 event.edata_type = WFD_OEM_EDATA_TYPE_ASP_PROV;
2525 g_variant_iter_free(iter);
2528 WDP_LOGE("No Properties");
2531 G_PD_CALLBACK(g_pd->user_data, &event);
2534 __WDP_LOG_FUNC_EXIT__;
2536 #endif /* TIZEN_FEATURE_ASP */
2539 const char *interface;
2541 void (*function) (GDBusConnection *connection, const gchar *object_path,
2542 GVariant *parameters);
2543 } ws_p2pdevice_signal_map[] = {
2545 SUPPLICANT_P2PDEVICE,
2546 "DeviceFoundProperties",
2547 _ws_process_device_found_properties
2550 SUPPLICANT_P2PDEVICE,
2552 _ws_process_device_lost
2555 SUPPLICANT_P2PDEVICE,
2557 _ws_process_find_stoppped
2560 SUPPLICANT_P2PDEVICE,
2561 "ProvisionDiscoveryRequestDisplayPin",
2562 _ws_process_prov_disc_req_display_pin
2565 SUPPLICANT_P2PDEVICE,
2566 "ProvisionDiscoveryResponseDisplayPin",
2567 _ws_process_prov_disc_resp_display_pin
2570 SUPPLICANT_P2PDEVICE,
2571 "ProvisionDiscoveryRequestEnterPin",
2572 _ws_process_prov_disc_req_enter_pin
2575 SUPPLICANT_P2PDEVICE,
2576 "ProvisionDiscoveryResponseEnterPin",
2577 _ws_process_prov_disc_resp_enter_pin
2580 SUPPLICANT_P2PDEVICE,
2581 "ProvisionDiscoveryPBCRequest",
2582 _ws_process_prov_disc_pbc_req
2585 SUPPLICANT_P2PDEVICE,
2586 "ProvisionDiscoveryPBCResponse",
2587 _ws_process_prov_disc_pbc_resp
2590 SUPPLICANT_P2PDEVICE,
2591 "ProvisionDiscoveryFailure",
2592 _ws_process_prov_disc_failure
2595 SUPPLICANT_P2PDEVICE,
2597 _ws_process_group_started
2600 SUPPLICANT_P2PDEVICE,
2601 "GONegotiationSuccess",
2602 _ws_process_go_neg_success
2605 SUPPLICANT_P2PDEVICE,
2606 "GONegotiationFailure",
2607 _ws_process_go_neg_failure
2610 SUPPLICANT_P2PDEVICE,
2611 "GONegotiationRequest",
2612 _ws_process_go_neg_request
2615 SUPPLICANT_P2PDEVICE,
2616 "InvitationReceived",
2617 _ws_process_invitation_received
2620 SUPPLICANT_P2PDEVICE,
2622 _ws_process_invitation_result
2625 SUPPLICANT_P2PDEVICE,
2627 _ws_process_group_finished
2629 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
2631 SUPPLICANT_P2PDEVICE,
2632 "ServiceDiscoveryResponse",
2633 _ws_process_service_discovery_response
2635 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
2636 #if defined(TIZEN_FEATURE_ASP)
2638 SUPPLICANT_P2PDEVICE,
2639 "ServiceASPResponse",
2640 _ws_process_service_asp_response
2643 SUPPLICANT_P2PDEVICE,
2644 "ASPProvisionStart",
2645 _ws_process_asp_provision_start
2648 SUPPLICANT_P2PDEVICE,
2650 _ws_process_asp_provision_done
2652 #endif /* TIZEN_FEATURE_ASP */
2654 SUPPLICANT_P2PDEVICE,
2655 "PersistentGroupAdded",
2656 _ws_process_persistent_group_added
2659 SUPPLICANT_P2PDEVICE,
2660 "PersistentGroupRemoved",
2661 _ws_process_persistent_group_removed
2664 SUPPLICANT_P2PDEVICE,
2666 _ws_process_wps_failed
2669 SUPPLICANT_P2PDEVICE,
2670 "GroupFormationFailure",
2671 _ws_process_group_formation_failure
2674 SUPPLICANT_P2PDEVICE,
2675 "InvitationAccepted",
2676 _ws_process_invitation_accepted
2685 static void _p2pdevice_signal_cb(GDBusConnection *connection,
2686 const gchar *sender, const gchar *object_path, const gchar *interface,
2687 const gchar *signal, GVariant *parameters, gpointer user_data)
2690 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2693 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
2697 for (i = 0; ws_p2pdevice_signal_map[i].member != NULL; i++) {
2698 if (!g_strcmp0(signal, ws_p2pdevice_signal_map[i].member) &&
2699 ws_p2pdevice_signal_map[i].function != NULL)
2700 ws_p2pdevice_signal_map[i].function(connection, object_path, parameters);
2705 static void _ws_process_sta_authorized(GDBusConnection *connection,
2706 const gchar *object_path, GVariant *parameters)
2708 __WDP_LOG_FUNC_ENTER__;
2709 wfd_oem_event_s event;
2710 const gchar* mac_str = NULL;
2712 if (is_peer_joined_notified) {
2713 is_peer_joined_notified = 0;
2714 __WDP_LOG_FUNC_EXIT__;
2718 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2719 g_variant_get(parameters, "(&s)", &mac_str);
2720 __ws_txt_to_mac((unsigned char *)mac_str, event.intf_addr);
2722 event.event_id = WFD_OEM_EVENT_STA_CONNECTED;
2723 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2725 G_PD_CALLBACK(g_pd->user_data, &event);
2726 __WDP_LOG_FUNC_EXIT__;
2729 static void _ws_process_sta_deauthorized(GDBusConnection *connection,
2730 const gchar *object_path, GVariant *parameters)
2732 __WDP_LOG_FUNC_ENTER__;
2733 wfd_oem_event_s event;
2734 const gchar* mac_str = NULL;
2736 if (is_peer_disconnected_notified) {
2737 is_peer_disconnected_notified = 0;
2738 __WDP_LOG_FUNC_EXIT__;
2742 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2743 g_variant_get(parameters, "(&s)", &mac_str);
2744 __ws_txt_to_mac((unsigned char *)mac_str, event.intf_addr);
2746 event.event_id = WFD_OEM_EVENT_STA_DISCONNECTED;
2747 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2749 G_PD_CALLBACK(g_pd->user_data, &event);
2750 __WDP_LOG_FUNC_EXIT__;
2754 const char *interface;
2756 void (*function) (GDBusConnection *connection, const gchar *object_path,
2757 GVariant *parameters);
2758 } ws_interface_signal_map[] = {
2760 SUPPLICANT_INTERFACE,
2762 _ws_process_sta_authorized
2765 SUPPLICANT_INTERFACE,
2767 _ws_process_sta_deauthorized
2776 static void _interface_signal_cb(GDBusConnection *connection,
2777 const gchar *sender, const gchar *object_path, const gchar *interface,
2778 const gchar *signal, GVariant *parameters, gpointer user_data)
2781 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2784 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
2785 __WDP_LOG_FUNC_EXIT__;
2789 for (i = 0; ws_interface_signal_map[i].member != NULL; i++) {
2790 if (!g_strcmp0(signal, ws_interface_signal_map[i].member) &&
2791 ws_interface_signal_map[i].function != NULL)
2792 ws_interface_signal_map[i].function(connection, object_path, parameters);
2797 static void __ws_parse_peer_joined(char *peer_path,
2798 unsigned char *dev_addr, unsigned char *ip_addr, GVariant *parameter)
2800 __WDP_LOG_FUNC_ENTER__;
2803 static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
2804 const char *path = NULL;
2806 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
2808 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
2810 g_variant_get(parameter, "(&oay)", &path, &iter);
2811 g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
2812 WDP_LOGD("Retrive Added path [%s]", peer_path);
2814 loc = strrchr(peer_path, '/');
2816 __ws_mac_compact_to_normal(loc + 1, peer_dev);
2817 __ws_txt_to_mac(peer_dev, dev_addr);
2818 WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(dev_addr));
2819 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
2820 for (i = 0; i < OEM_IPADDR_LEN; i++)
2821 g_variant_iter_loop(iter, "y", &ip_addr[i]);
2822 g_variant_iter_free(iter);
2824 WDP_LOGD("peer ip [" IPSTR "]", IP2STR(ip_addr));
2825 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
2827 __WDP_LOG_FUNC_EXIT__;
2832 static void _group_signal_cb(GDBusConnection *connection,
2833 const gchar *sender, const gchar *object_path, const gchar *interface,
2834 const gchar *signal, GVariant *parameters, gpointer user_data)
2836 DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
2839 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
2843 if (!g_strcmp0(signal, "PeerJoined")) {
2845 wfd_oem_event_s event;
2846 wfd_oem_dev_data_s *edata = NULL;
2848 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2850 edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
2852 WDP_LOGF("Failed to allocate memory for event. [%s]",
2854 __WDP_LOG_FUNC_EXIT__;
2857 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2859 event.edata = (void*) edata;
2860 event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
2861 event.event_id = WFD_OEM_EVENT_STA_CONNECTED;
2863 __ws_parse_peer_joined(peer_path, event.dev_addr, event.ip_addr_peer, parameters);
2865 dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
2866 __ws_peer_property, event.edata);
2868 G_PD_CALLBACK(g_pd->user_data, &event);
2869 is_peer_joined_notified = 1;
2873 } else if (!g_strcmp0(signal, "PeerDisconnected")) {
2875 wfd_oem_event_s event;
2877 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2879 memset(&event, 0x0, sizeof(wfd_oem_event_s));
2881 event.edata_type = WFD_OEM_EDATA_TYPE_NONE;
2882 event.event_id = WFD_OEM_EVENT_STA_DISCONNECTED;
2884 __ws_path_to_addr(peer_path, event.dev_addr, parameters);
2886 G_PD_CALLBACK(g_pd->user_data, &event);
2887 is_peer_disconnected_notified = 1;
2891 static void __register_p2pdevice_signal(GVariant *value, void *user_data)
2893 __WDP_LOG_FUNC_ENTER__;
2894 ws_dbus_plugin_data_s * pd_data;
2895 static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
2896 const char *path = NULL;
2899 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
2903 pd_data = (ws_dbus_plugin_data_s *)g_pd;
2905 g_variant_get(value, "(&o)", &path);
2906 g_strlcpy(interface_path, path, DBUS_OBJECT_PATH_MAX);
2907 g_strlcpy(pd_data->iface_path, path, DBUS_OBJECT_PATH_MAX);
2909 WDP_LOGD("interface object path [%s]", interface_path);
2911 /* subscribe Interface iface signal */
2912 pd_data->iface_sub_id = g_dbus_connection_signal_subscribe(
2914 SUPPLICANT_SERVICE, /* bus name */
2915 SUPPLICANT_IFACE, /* interface */
2917 NULL, /* object path */
2919 G_DBUS_SIGNAL_FLAGS_NONE,
2920 _interface_signal_cb,
2922 WDP_LOGD("Subscribed Interface iface signal: [%d]", pd_data->iface_sub_id);
2924 /* subscribe P2PDevice iface signal */
2925 pd_data->p2pdevice_sub_id = g_dbus_connection_signal_subscribe(
2927 SUPPLICANT_SERVICE, /* bus name */
2928 SUPPLICANT_P2PDEVICE, /* interface */
2930 NULL, /* object path */
2932 G_DBUS_SIGNAL_FLAGS_NONE,
2933 _p2pdevice_signal_cb,
2935 WDP_LOGD("Subscribed P2PDevice iface signal: [%d]", pd_data->p2pdevice_sub_id);
2936 __WDP_LOG_FUNC_EXIT__;
2939 static int _ws_create_interface(const char *iface_name, handle_reply function, void *user_data)
2941 __WDP_LOG_FUNC_ENTER__;
2942 GDBusConnection *g_dbus = NULL;
2943 GVariantBuilder *builder = NULL;
2944 dbus_method_param_s params;
2949 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
2953 g_dbus = g_pd->g_dbus;
2955 WDP_LOGE("DBus connection is NULL");
2958 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
2960 dbus_set_method_param(¶ms, "CreateInterface", SUPPLICANT_PATH, g_dbus);
2962 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
2963 g_variant_builder_add(builder, "{sv}", "Ifname", g_variant_new_string(iface_name));
2964 g_variant_builder_add(builder, "{sv}", "ConfigFile", g_variant_new_string(CONF_FILE_PATH));
2965 params.params = g_variant_new("(a{sv})", builder);
2966 g_variant_builder_unref(builder);
2967 res = dbus_method_call(¶ms, SUPPLICANT_INTERFACE, function, user_data);
2969 WDP_LOGE("Failed to send command to wpa_supplicant");
2971 WDP_LOGD("Succeeded to CreateInterface");
2973 __WDP_LOG_FUNC_EXIT__;
2977 static int _ws_get_interface(const char *iface_name, handle_reply function, void *user_data)
2979 __WDP_LOG_FUNC_ENTER__;
2980 GDBusConnection *g_dbus = NULL;
2981 dbus_method_param_s params;
2985 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
2989 g_dbus = g_pd->g_dbus;
2991 WDP_LOGE("DBus connection is NULL");
2995 dbus_set_method_param(¶ms, SUPPLICANT_METHOD_GETINTERFACE,
2996 SUPPLICANT_PATH, g_pd->g_dbus);
2998 params.params = g_variant_new("(s)", iface_name);
2999 DEBUG_G_VARIANT("Params : ", params.params);
3001 res = dbus_method_call(¶ms, SUPPLICANT_INTERFACE,
3002 function, user_data);
3005 WDP_LOGE("Failed to send command to wpa_supplicant");
3007 WDP_LOGD("Succeeded to get interface");
3009 __WDP_LOG_FUNC_EXIT__;
3013 #if defined(TIZEN_PROFILE_MOBILE) && (TIZEN_WLAN_BOARD_SPRD)
3014 static void __ws_remove_interface(GVariant *value, void *user_data)
3016 __WDP_LOG_FUNC_ENTER__;
3017 GDBusConnection *g_dbus = NULL;
3018 dbus_method_param_s params;
3019 const char *path = NULL;
3020 static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
3024 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3028 g_dbus = g_pd->g_dbus;
3030 WDP_LOGE("DBus connection is NULL");
3034 g_variant_get(value, "(&o)", &path);
3035 g_strlcpy(interface_path, path, DBUS_OBJECT_PATH_MAX);
3036 WDP_LOGD("interface object path [%s]", interface_path);
3038 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
3040 dbus_set_method_param(¶ms, "RemoveInterface", SUPPLICANT_PATH, g_dbus);
3041 params.params = g_variant_new("(o)", interface_path);
3043 res = dbus_method_call(¶ms, SUPPLICANT_INTERFACE, NULL, NULL);
3045 WDP_LOGE("Failed to send command to wpa_supplicant");
3047 WDP_LOGD("Succeeded to RemoveInterface");
3049 __WDP_LOG_FUNC_EXIT__;
3052 #endif /* (TIZEN_PROFILE_MOBILE) && (TIZEN_WLAN_BOARD_SPRD) */
3054 static int _ws_init_dbus_connection(void)
3056 __WDP_LOG_FUNC_ENTER__;
3057 GDBusConnection *conn = NULL;
3058 GError *error = NULL;
3062 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3066 conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
3069 if (error != NULL) {
3070 WDP_LOGE("Error! Failed to connect to the D-BUS daemon: [%s]",
3072 g_error_free(error);
3074 __WDP_LOG_FUNC_EXIT__;
3078 g_pd->g_dbus = conn;
3080 /* subscribe supplicant signal */
3081 g_pd->supp_sub_id = g_dbus_connection_signal_subscribe(
3083 SUPPLICANT_SERVICE, /* bus name */
3084 SUPPLICANT_INTERFACE, /* interface */
3086 SUPPLICANT_PATH, /* object path */
3088 G_DBUS_SIGNAL_FLAGS_NONE,
3089 _supplicant_signal_cb,
3091 WDP_LOGD("Subscribed supplicant iface signal: [%d]", g_pd->supp_sub_id);
3093 #if defined(TIZEN_PROFILE_MOBILE) && (TIZEN_WLAN_BOARD_SPRD)
3094 if (_ws_get_interface(COMMON_IFACE_NAME, NULL, NULL) < 0)
3095 _ws_create_interface(COMMON_IFACE_NAME, NULL, NULL);
3096 if (_ws_get_interface(P2P_IFACE_NAME, __register_p2pdevice_signal, NULL) < 0)
3097 res = _ws_create_interface(P2P_IFACE_NAME, __register_p2pdevice_signal, NULL);
3098 #else /* (TIZEN_PROFILE_MOBILE) && (TIZEN_WLAN_BOARD_SPRD) */
3099 if (_ws_get_interface(COMMON_IFACE_NAME, __register_p2pdevice_signal, NULL) < 0)
3100 res = _ws_create_interface(COMMON_IFACE_NAME, __register_p2pdevice_signal, NULL);
3101 #endif /* (TIZEN_PROFILE_MOBILE) && (TIZEN_WLAN_BOARD_SPRD) */
3104 WDP_LOGE("Failed to subscribe interface signal");
3106 WDP_LOGI("Successfully register signal filters");
3108 __WDP_LOG_FUNC_EXIT__;
3112 static int _ws_deinit_dbus_connection(void)
3114 GDBusConnection *g_dbus = NULL;
3117 WDP_LOGE("Invalid parameter");
3118 __WDP_LOG_FUNC_EXIT__;
3122 g_dbus = g_pd->g_dbus;
3124 WDP_LOGE("DBus connection is NULL");
3128 g_dbus_connection_signal_unsubscribe(g_dbus, g_pd->supp_sub_id);
3129 g_dbus_connection_signal_unsubscribe(g_dbus, g_pd->iface_sub_id);
3130 g_dbus_connection_signal_unsubscribe(g_dbus, g_pd->p2pdevice_sub_id);
3131 g_dbus_connection_signal_unsubscribe(g_dbus, g_pd->group_sub_id);
3133 g_pd->group_iface_sub_id = 0;
3134 g_pd->iface_sub_id = 0;
3135 g_pd->p2pdevice_sub_id = 0;
3136 g_pd->group_sub_id = 0;
3137 memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
3138 memset(g_pd->iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
3140 g_object_unref(g_dbus);
3144 int wfd_plugin_load(wfd_oem_ops_s **ops)
3147 WDP_LOGE("Invalid parameter");
3151 *ops = &supplicant_ops;
3156 static int _ws_reset_plugin(ws_dbus_plugin_data_s *f_pd)
3158 __WDP_LOG_FUNC_ENTER__;
3161 WDP_LOGE("Invalid parameter");
3162 __WDP_LOG_FUNC_EXIT__;
3166 _ws_deinit_dbus_connection();
3168 if (f_pd->activated)
3169 ws_deactivate(f_pd->concurrent);
3173 __WDP_LOG_FUNC_EXIT__;
3177 #ifndef TIZEN_WIFI_MODULE_BUNDLE
3178 static int __ws_check_net_interface(char* if_name)
3183 if (if_name == NULL) {
3184 WDP_LOGE("Invalid param");
3188 fd = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
3190 WDP_LOGE("socket create error: %d", fd);
3194 memset(&ifr, 0, sizeof(ifr));
3195 strncpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name));
3196 ifr.ifr_name[IFNAMSIZ-1] = '\0';
3198 if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) {
3200 WDP_LOGE("ioctl error: SIOCGIFFLAGS: %s [ %s ]", strerror(errno), if_name); /* interface is not found. */
3206 if (ifr.ifr_flags & IFF_UP) {
3207 WDP_LOGD("%s interface is up", if_name);
3209 } else if (!(ifr.ifr_flags & IFF_UP)) {
3210 WDP_LOGD("%s interface is down", if_name);
3217 int ws_init(wfd_oem_event_cb callback, void *user_data)
3219 __WDP_LOG_FUNC_ENTER__;
3222 _ws_reset_plugin(g_pd);
3225 g_pd = (ws_dbus_plugin_data_s*) g_try_malloc0(sizeof(ws_dbus_plugin_data_s));
3227 WDP_LOGE("Failed to allocate memory for plugin data. [%s]", strerror(errno));
3231 g_pd->callback = callback;
3232 g_pd->user_data = user_data;
3233 g_pd->initialized = TRUE;
3235 __WDP_LOG_FUNC_EXIT__;
3241 __WDP_LOG_FUNC_ENTER__;
3244 _ws_reset_plugin(g_pd);
3248 __WDP_LOG_FUNC_EXIT__;
3252 gboolean _ws_util_execute_file(const char *file_path,
3253 char *const args[], char *const envs[])
3258 register unsigned int index = 0;
3260 while (args[index] != NULL) {
3261 WDP_LOGD("[%s]", args[index]);
3265 if (!(pid = fork())) {
3266 WDP_LOGD("pid(%d), ppid(%d)", getpid(), getppid());
3267 WDP_LOGD("Inside child, exec (%s) command", file_path);
3270 if (execve(file_path, args, envs) == -1) {
3271 WDP_LOGE("Fail to execute command (%s)", strerror(errno));
3274 } else if (pid > 0) {
3275 if (waitpid(pid, &rv, 0) == -1)
3276 WDP_LOGD("wait pid (%u) rv (%d)", pid, rv);
3278 WDP_LOGD("exited, rv=%d", WEXITSTATUS(rv));
3279 else if (WIFSIGNALED(rv))
3280 WDP_LOGD("killed by signal %d", WTERMSIG(rv));
3281 else if (WIFSTOPPED(rv))
3282 WDP_LOGD("stopped by signal %d", WSTOPSIG(rv));
3283 else if (WIFCONTINUED(rv))
3284 WDP_LOGD("continued");
3289 WDP_LOGE("failed to fork (%s)", strerror(errno));
3293 #ifndef TIZEN_WIFI_MODULE_BUNDLE
3294 static int __ws_p2p_firmware_start(void)
3296 gboolean rv = FALSE;
3297 const char *path = "/usr/bin/wlan.sh";
3298 char *const args[] = { "/usr/bin/wlan.sh", "p2p", NULL };
3299 char *const envs[] = { NULL };
3301 rv = _ws_util_execute_file(path, args, envs);
3305 WDP_LOGI("Successfully loaded p2p device driver");
3309 static int __ws_p2p_firmware_stop(void)
3311 gboolean rv = FALSE;
3312 const char *path = "/usr/bin/wlan.sh";
3313 char *const args[] = { "/usr/bin/wlan.sh", "stop", NULL };
3314 char *const envs[] = { NULL };
3315 rv = _ws_util_execute_file(path, args, envs);
3319 WDP_LOGI("Successfully removed p2p device driver");
3324 static int __ws_p2p_supplicant_start(void)
3326 gboolean rv = FALSE;
3327 const char *path = "/usr/sbin/p2p_supp.sh";
3328 char *const args[] = { "/usr/sbin/p2p_supp.sh", "start_dbus", NULL };
3329 char *const envs[] = { NULL };
3331 rv = _ws_util_execute_file(path, args, envs);
3334 WDP_LOGE("Failed to start p2p_supp.sh");
3338 WDP_LOGI("Successfully started p2p_supp.sh");
3343 static int __ws_p2p_supplicant_stop(void)
3345 gboolean rv = FALSE;
3346 const char *path = "/usr/sbin/p2p_supp.sh";
3347 char *const args[] = { "/usr/sbin/p2p_supp.sh", "stop", NULL };
3348 char *const envs[] = { NULL };
3350 rv = _ws_util_execute_file(path, args, envs);
3353 WDP_LOGE("Failed to stop p2p_supp.sh");
3357 WDP_LOGI("Successfully stopped p2p_supp.sh");
3361 static int __ws_p2p_on(void)
3364 DBusMessage *reply = NULL;
3365 DBusMessage *message = NULL;
3366 DBusConnection *connection = NULL;
3368 connection = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
3369 if (connection == NULL) {
3370 WDP_LOGE("Failed to get system bus");
3374 message = dbus_message_new_method_call(NETCONFIG_SERVICE,
3375 NETCONFIG_WIFI_PATH, NETCONFIG_WIFI_INTERFACE, "LoadP2pDriver");
3376 if (message == NULL) {
3377 WDP_LOGE("Failed DBus method call");
3378 dbus_connection_unref(connection);
3382 dbus_error_init(&error);
3384 reply = dbus_connection_send_with_reply_and_block(connection, message,
3385 NETCONFIG_DBUS_REPLY_TIMEOUT, &error);
3386 if (dbus_error_is_set(&error) == TRUE) {
3387 if (NULL != strstr(error.message, ".AlreadyExists")) {
3388 /* p2p already enabled */
3390 WDP_LOGE("dbus_connection_send_with_reply_and_block() failed. "
3391 "DBus error [%s: %s]", error.name, error.message);
3393 dbus_error_free(&error);
3396 dbus_error_free(&error);
3400 dbus_message_unref(reply);
3402 dbus_message_unref(message);
3403 dbus_connection_unref(connection);
3408 static int __ws_p2p_off(void)
3411 DBusMessage *reply = NULL;
3412 DBusMessage *message = NULL;
3413 DBusConnection *connection = NULL;
3415 connection = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
3416 if (connection == NULL) {
3417 WDP_LOGE("Failed to get system bus");
3421 message = dbus_message_new_method_call(NETCONFIG_SERVICE,
3422 NETCONFIG_WIFI_PATH, NETCONFIG_WIFI_INTERFACE, "RemoveP2pDriver");
3423 if (message == NULL) {
3424 WDP_LOGE("Failed DBus method call");
3425 dbus_connection_unref(connection);
3429 dbus_error_init(&error);
3431 reply = dbus_connection_send_with_reply_and_block(connection, message,
3432 NETCONFIG_DBUS_REPLY_TIMEOUT, &error);
3433 if (dbus_error_is_set(&error) == TRUE) {
3434 if (NULL != strstr(error.message, ".AlreadyExists")) {
3435 /* p2p already disabled */
3437 WDP_LOGE("dbus_connection_send_with_reply_and_block() failed. "
3438 "DBus error [%s: %s]", error.name, error.message);
3440 dbus_error_free(&error);
3443 dbus_error_free(&error);
3447 dbus_message_unref(reply);
3449 dbus_message_unref(message);
3450 dbus_connection_unref(connection);
3456 int __ws_init_p2pdevice()
3458 __WDP_LOG_FUNC_ENTER__;
3459 GDBusConnection *g_dbus = NULL;
3461 GVariant *value = NULL;
3462 GVariant *param = NULL;
3463 GVariantBuilder *builder = NULL;
3464 GVariantBuilder *type_builder = NULL;
3465 dbus_method_param_s params;
3467 const char *primary_device_type = PRIMARY_DEVICE_TYPE;
3469 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
3470 const char *ip_addr_go = DEFAULT_IP_GO;
3471 const char *ip_addr_mask = DEFAULT_IP_MASK;
3472 const char *ip_addr_start = DEFAULT_IP_START;
3473 const char *ip_addr_end = DEFAULT_IP_END;
3474 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
3479 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3483 for (i = 0; i < WS_DEVTYPE_LEN; i++)
3484 WDP_LOGD("device type[%02x]", primary_device_type[i]);
3486 g_dbus = g_pd->g_dbus;
3488 WDP_LOGE("DBus connection is NULL");
3491 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
3493 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
3496 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
3497 g_variant_builder_add(builder, "{sv}", "DeviceName",
3498 g_variant_new_string(DEFAULT_DEVICE_NAME));
3500 g_variant_builder_add(builder, "{sv}", "GOIntent",
3501 g_variant_new_uint32(DEFAULT_GO_INTENT));
3503 g_variant_builder_add(builder, "{sv}", "PersistentReconnect",
3504 g_variant_new_boolean(DEFAULT_PERSISTENT_RECONNECT));
3506 g_variant_builder_add(builder, "{sv}", "ListenRegClass",
3507 g_variant_new_uint32(DEFAULT_LISTEN_REG_CLASS));
3509 g_variant_builder_add(builder, "{sv}", "ListenChannel",
3510 g_variant_new_uint32(DEFAULT_LISTEN_CHANNEL));
3512 g_variant_builder_add(builder, "{sv}", "OperRegClass",
3513 g_variant_new_uint32(DEFAULT_OPER_REG_CLASS));
3515 g_variant_builder_add(builder, "{sv}", "OperChannel",
3516 g_variant_new_uint32(DEFAULT_OPER_CHANNEL));
3518 g_variant_builder_add(builder, "{sv}", "SsidPostfix",
3519 g_variant_new_string(DEFAULT_DEVICE_NAME));
3521 g_variant_builder_add(builder, "{sv}", "NoGroupIface",
3522 g_variant_new_boolean(DEFAULT_NO_GROUP_IFACE));
3524 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
3525 for (i = 0; i < WS_DEVTYPE_LEN; i++)
3526 g_variant_builder_add(type_builder, "y", primary_device_type[i]);
3527 g_variant_builder_add(builder, "{sv}", "PrimaryDeviceType",
3528 g_variant_new("ay", type_builder));
3529 g_variant_builder_unref(type_builder);
3530 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
3531 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
3532 for (i = 0; i < OEM_IPADDR_LEN; i++)
3533 g_variant_builder_add(type_builder, "y", ip_addr_go[i]);
3534 g_variant_builder_add(builder, "{sv}", "IpAddrGO",
3535 g_variant_new("ay", type_builder));
3536 g_variant_builder_unref(type_builder);
3538 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
3539 for (i = 0; i < OEM_IPADDR_LEN; i++)
3540 g_variant_builder_add(type_builder, "y", ip_addr_mask[i]);
3541 g_variant_builder_add(builder, "{sv}", "IpAddrMask",
3542 g_variant_new("ay", type_builder));
3543 g_variant_builder_unref(type_builder);
3545 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
3546 for (i = 0; i < OEM_IPADDR_LEN; i++)
3547 g_variant_builder_add(type_builder, "y", ip_addr_start[i]);
3548 g_variant_builder_add(builder, "{sv}", "IpAddrStart",
3549 g_variant_new("ay", type_builder));
3550 g_variant_builder_unref(type_builder);
3552 type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
3553 for (i = 0; i < OEM_IPADDR_LEN; i++)
3554 g_variant_builder_add(type_builder, "y", ip_addr_end[i]);
3555 g_variant_builder_add(builder, "{sv}", "IpAddrEnd",
3556 g_variant_new("ay", type_builder));
3557 g_variant_builder_unref(type_builder);
3558 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
3559 value = g_variant_new("a{sv}", builder);
3560 g_variant_builder_unref(builder);
3562 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
3564 params.params = param;
3565 DEBUG_G_VARIANT("Params : ", params.params);
3567 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
3569 WDP_LOGE("Failed to send command to wpa_supplicant");
3571 WDP_LOGD("Succeeded to initialize p2pdevice");
3572 __WDP_LOG_FUNC_EXIT__;
3576 int __ws_set_config_methods()
3578 __WDP_LOG_FUNC_ENTER__;
3579 GDBusConnection *g_dbus = NULL;
3581 GVariant *value = NULL;
3582 GVariant *param = NULL;
3584 dbus_method_param_s params;
3588 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3592 g_dbus = g_pd->g_dbus;
3594 WDP_LOGE("DBus connection is NULL");
3597 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
3599 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
3602 value = g_variant_new_string(DEFAULT_CONFIG_METHOD);
3604 param = g_variant_new("(ssv)", SUPPLICANT_WPS, "ConfigMethods", value);
3605 params.params = param;
3607 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
3609 WDP_LOGE("Failed to send command to wpa_supplicant");
3611 WDP_LOGD("Succeeded to set config method(%s)", DEFAULT_CONFIG_METHOD);
3613 __WDP_LOG_FUNC_EXIT__;
3617 int ws_activate(int concurrent)
3619 __WDP_LOG_FUNC_ENTER__;
3621 int retry_count = 0;
3624 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3628 res = __ws_p2p_supplicant_start();
3630 res = __ws_p2p_supplicant_stop();
3631 WDP_LOGI("P2P supplicant stopped with error %d", res);
3632 __WDP_LOG_FUNC_EXIT__;
3635 #ifndef TIZEN_WIFI_MODULE_BUNDLE
3636 while (retry_count < WS_CONN_RETRY_COUNT) {
3637 /* load wlan driver */
3638 if (concurrent == 0)
3639 res = __ws_p2p_firmware_start();
3641 WDP_LOGE("Failed to load driver [ret=%d]", res);
3644 WDP_LOGI("P2P firmware started with error %d", res);
3646 if (__ws_check_net_interface(COMMON_IFACE_NAME) < 0) {
3647 usleep(150000); /* wait for 150ms */
3650 WDP_LOGE("interface is not up: retry, %d", retry_count);
3656 if (retry_count >= WS_CONN_RETRY_COUNT) {
3657 WDP_LOGE("Driver loading is failed", res);
3658 __WDP_LOG_FUNC_EXIT__;
3661 if (retry_count > 0) {
3662 /* Give driver marginal time to config net */
3663 WDP_LOGE("Driver loading is done. Wait marginal time for driver");
3667 g_pd->concurrent = concurrent;
3669 res = _ws_init_dbus_connection();
3671 res = __ws_p2p_supplicant_stop();
3672 WDP_LOGI("[/usr/sbin/p2p_supp.sh stop] returns %d", res);
3673 #ifndef TIZEN_WIFI_MODULE_BUNDLE
3674 res = __ws_p2p_firmware_stop();
3675 WDP_LOGI("P2P firmware stopped with error %d", res);
3677 __WDP_LOG_FUNC_EXIT__;
3681 g_pd->activated = TRUE;
3682 __ws_init_p2pdevice();
3683 __ws_set_config_methods();
3686 __WDP_LOG_FUNC_EXIT__;
3690 int ws_deactivate(int concurrent)
3692 __WDP_LOG_FUNC_ENTER__;
3693 #if defined(TIZEN_FEATURE_ASP)
3694 wfd_oem_asp_service_s *data = NULL;
3695 #endif /* TIZEN_FEATURE_ASP */
3699 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3703 if (!g_pd->activated) {
3704 WDP_LOGE("Wi-Fi Direct is not activated");
3710 g_pd->concurrent = concurrent;
3711 #if defined(TIZEN_PROFILE_MOBILE) && (TIZEN_WLAN_BOARD_SPRD)
3712 _ws_get_interface(P2P_IFACE_NAME, __ws_remove_interface, NULL);
3713 if (concurrent == 0)
3714 _ws_get_interface(COMMON_IFACE_NAME, __ws_remove_interface, NULL);
3715 #endif /* (TIZEN_PROFILE_MOBILE) && (TIZEN_WLAN_BOARD_SPRD) */
3717 _ws_deinit_dbus_connection();
3719 if (concurrent == 0) {
3720 res = __ws_p2p_supplicant_stop();
3721 WDP_LOGI("[/usr/sbin/p2p_supp.sh stop] returns %d", res);
3722 #ifndef TIZEN_WIFI_MODULE_BUNDLE
3723 res = __ws_p2p_firmware_stop();
3724 WDP_LOGI("P2P firmware stopped with error %d", res);
3727 g_pd->activated = FALSE;
3729 #if defined(TIZEN_FEATURE_ASP)
3730 GLIST_ITER_START(seek_list, data)
3733 temp = g_list_next(seek_list);
3734 seek_list = g_list_remove(seek_list, data);
3735 g_free(data->service_type);
3736 g_free(data->service_info);
3741 #endif /* TIZEN_FEATURE_ASP */
3742 __WDP_LOG_FUNC_EXIT__;
3747 static gboolean _retry_start_scan(gpointer data)
3749 __WDP_LOG_FUNC_ENTER__;
3751 WDP_LOGD("Succeeded to start scan");
3753 __WDP_LOG_FUNC_EXIT__;
3758 #if defined(TIZEN_FEATURE_ASP)
3759 static void __ws_add_seek_params(GVariantBuilder *builder)
3761 GVariantBuilder *outter = NULL;
3762 GVariantBuilder *inner = NULL;
3763 wfd_oem_asp_service_s *data = NULL;
3767 if (seek_list == NULL || g_list_length(seek_list) == 0) {
3768 WDP_LOGD("seek list is NULL");
3771 WDP_LOGD("seek list length [%d]", g_list_length(seek_list));
3773 outter = g_variant_builder_new(G_VARIANT_TYPE("aay"));
3775 GLIST_ITER_START(seek_list, data)
3776 if (data && data->service_type) {
3777 len = strlen(data->service_type) + 1;
3778 WDP_LOGD("data [%s] len [%d]", data->service_type, len);
3779 inner = g_variant_builder_new(G_VARIANT_TYPE("ay"));
3780 for (i = 0; i < len; i++)
3781 g_variant_builder_add(inner, "y", data->service_type[i]);
3782 g_variant_builder_add(outter, "ay", inner);
3783 g_variant_builder_unref(inner);
3786 g_variant_builder_add(builder, "{sv}", "Seek", g_variant_new("aay", outter));
3787 g_variant_builder_unref(outter);
3791 #endif /* TIZEN_FEATURE_ASP */
3794 int ws_start_scan(wfd_oem_scan_param_s *param)
3796 __WDP_LOG_FUNC_ENTER__;
3797 GDBusConnection *g_dbus = NULL;
3798 GVariantBuilder *builder = NULL;
3799 GVariant *value = NULL;
3800 dbus_method_param_s params;
3804 WDP_LOGE("Invalid parameter");
3809 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3813 g_dbus = g_pd->g_dbus;
3815 WDP_LOGE("DBus connection is NULL");
3818 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
3820 if (param->scan_mode == WFD_OEM_SCAN_MODE_ACTIVE) {
3822 dbus_set_method_param(¶ms, "Find", g_pd->iface_path, g_dbus);
3824 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
3826 if (param->scan_time)
3827 g_variant_builder_add(builder, "{sv}", "Timeout",
3828 g_variant_new_int32(param->scan_time));
3829 if (param->scan_type == WFD_OEM_SCAN_TYPE_SOCIAL)
3830 g_variant_builder_add(builder, "{sv}", "DiscoveryType",
3831 g_variant_new_string("social"));
3832 #if defined(TIZEN_FEATURE_ASP)
3833 if (seek_list != NULL)
3834 __ws_add_seek_params(builder);
3835 #endif /* TIZEN_FEATURE_ASP */
3837 value = g_variant_new("(a{sv})", builder);
3838 g_variant_builder_unref(builder);
3841 dbus_set_method_param(¶ms, "Listen", g_pd->iface_path, g_dbus);
3842 value = g_variant_new("(i)", param->scan_time);
3845 params.params = value;
3846 DEBUG_G_VARIANT("Params : ", params.params);
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__;
3858 int ws_restart_scan(int freq)
3860 __WDP_LOG_FUNC_ENTER__;
3861 GDBusConnection *g_dbus = NULL;
3862 GVariantBuilder *builder = NULL;
3863 GVariant *value = NULL;
3864 dbus_method_param_s params;
3868 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3872 g_dbus = g_pd->g_dbus;
3874 WDP_LOGE("DBus connection is NULL");
3877 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
3879 dbus_set_method_param(¶ms, "Find", g_pd->iface_path, g_dbus);
3881 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
3882 g_variant_builder_add(builder, "{sv}", "Timeout", g_variant_new_int32(2));
3883 g_variant_builder_add(builder, "{sv}", "DiscoveryType",
3884 g_variant_new_string("social"));
3885 value = g_variant_new("(a{sv})", builder);
3886 g_variant_builder_unref(builder);
3888 params.params = value;
3889 DEBUG_G_VARIANT("Params : ", params.params);
3891 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
3893 WDP_LOGE("Failed to send command to wpa_supplicant");
3895 WDP_LOGD("Succeeded to start scan");
3897 __WDP_LOG_FUNC_EXIT__;
3903 __WDP_LOG_FUNC_ENTER__;
3904 GDBusConnection *g_dbus = NULL;
3905 dbus_method_param_s params;
3909 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3913 g_dbus = g_pd->g_dbus;
3915 WDP_LOGE("DBus connection is NULL");
3918 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
3920 dbus_set_method_param(¶ms, "StopFind", g_pd->iface_path, g_dbus);
3921 params.params = NULL;
3923 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
3925 WDP_LOGE("Failed to send command to wpa_supplicant");
3927 WDP_LOGD("Succeeded to stop scan");
3929 __WDP_LOG_FUNC_EXIT__;
3933 int ws_get_visibility(int *visibility)
3935 __WDP_LOG_FUNC_ENTER__;
3937 __WDP_LOG_FUNC_EXIT__;
3941 int ws_set_visibility(int visibility)
3943 __WDP_LOG_FUNC_ENTER__;
3945 __WDP_LOG_FUNC_EXIT__;
3949 int ws_get_scan_result(GList **peers, int *peer_count)
3951 __WDP_LOG_FUNC_ENTER__;
3953 __WDP_LOG_FUNC_EXIT__;
3957 int ws_get_peer_info(unsigned char *peer_addr, wfd_oem_device_s **peer)
3959 __WDP_LOG_FUNC_ENTER__;
3960 GDBusConnection *g_dbus = NULL;
3961 wfd_oem_device_s *ws_dev = NULL;
3962 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
3965 if (!peer_addr || !peer) {
3966 WDP_LOGE("Invalid parameter");
3971 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
3975 g_dbus = g_pd->g_dbus;
3977 WDP_LOGE("DBus connection is NULL");
3981 ws_dev = (wfd_oem_device_s *) g_try_malloc0(sizeof(wfd_oem_device_s));
3983 WDP_LOGF("Failed to allocate memory device. [%s]",
3985 __WDP_LOG_FUNC_EXIT__;
3989 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
3990 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
3992 WDP_LOGD("get peer path [%s]", peer_path);
3994 res = dbus_property_get_all(peer_path, g_dbus, SUPPLICANT_P2P_PEER,
3995 __ws_get_peer_property, ws_dev);
3998 WDP_LOGE("Failed to send command to wpa_supplicant");
4000 __WDP_LOG_FUNC_EXIT__;
4003 WDP_LOGD("succeeded to get peer info");
4006 __WDP_LOG_FUNC_EXIT__;
4010 int ws_prov_disc_req(unsigned char *peer_addr, wfd_oem_wps_mode_e wps_mode, int join)
4012 __WDP_LOG_FUNC_ENTER__;
4013 GDBusConnection *g_dbus = NULL;
4014 GVariant *value = NULL;
4015 dbus_method_param_s params;
4016 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
4020 WDP_LOGE("Invalid parameter");
4021 __WDP_LOG_FUNC_EXIT__;
4026 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4027 __WDP_LOG_FUNC_EXIT__;
4031 g_dbus = g_pd->g_dbus;
4033 WDP_LOGE("DBus connection is NULL");
4034 __WDP_LOG_FUNC_EXIT__;
4037 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4039 dbus_set_method_param(¶ms, "ProvisionDiscoveryRequest", g_pd->iface_path, g_dbus);
4041 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4042 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4043 WDP_LOGD("get peer path [%s]", peer_path);
4045 value = g_variant_new("(os)", peer_path, __ws_wps_to_txt(wps_mode));
4047 params.params = value;
4048 DEBUG_G_VARIANT("Params : ", params.params);
4050 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4052 WDP_LOGE("Failed to send command to wpa_supplicant");
4054 WDP_LOGD("Succeeded to send prov disc to peer[" MACSTR "]", MAC2STR(peer_addr));
4056 __WDP_LOG_FUNC_EXIT__;
4060 int ws_connect(unsigned char *peer_addr, wfd_oem_conn_param_s *param)
4062 __WDP_LOG_FUNC_ENTER__;
4063 GDBusConnection *g_dbus = NULL;
4064 GVariantBuilder *builder = NULL;
4065 GVariant *value = NULL;
4066 dbus_method_param_s params;
4067 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
4070 if (!peer_addr || !param) {
4071 WDP_LOGE("Invalid parameter");
4072 __WDP_LOG_FUNC_EXIT__;
4077 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4078 __WDP_LOG_FUNC_EXIT__;
4082 g_dbus = g_pd->g_dbus;
4084 WDP_LOGE("DBus connection is NULL");
4085 __WDP_LOG_FUNC_EXIT__;
4088 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4090 dbus_set_method_param(¶ms, "Connect", g_pd->iface_path, g_dbus);
4092 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4093 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4094 WDP_LOGD("get peer path [%s]", peer_path);
4096 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4097 g_variant_builder_add(builder, "{sv}", "peer", g_variant_new_object_path(peer_path));
4098 if (param->conn_flags & WFD_OEM_CONN_TYPE_PERSISTENT)
4099 g_variant_builder_add(builder, "{sv}", "persistent", g_variant_new_boolean(TRUE));
4101 if (param->conn_flags & WFD_OEM_CONN_TYPE_JOIN)
4102 g_variant_builder_add(builder, "{sv}", "join", g_variant_new_boolean(TRUE));
4104 if (param->conn_flags & WFD_OEM_CONN_TYPE_AUTH)
4105 g_variant_builder_add(builder, "{sv}", "autorize_only", g_variant_new_boolean(TRUE));
4107 if (param->wps_pin[0] != '\0')
4108 g_variant_builder_add(builder, "{sv}", "pin", g_variant_new_string(param->wps_pin));
4110 g_variant_builder_add(builder, "{sv}", "wps_method",
4111 g_variant_new_string(__ws_wps_to_txt(param->wps_mode)));
4113 value = g_variant_new("(a{sv})", builder);
4114 g_variant_builder_unref(builder);
4116 params.params = value;
4117 DEBUG_G_VARIANT("Params : ", params.params);
4119 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4121 WDP_LOGE("Failed to send command to wpa_supplicant");
4123 WDP_LOGD("Succeeded to send connection command to peer[" MACSTR "]", MAC2STR(peer_addr));
4125 __WDP_LOG_FUNC_EXIT__;
4129 int ws_disconnect(unsigned char *peer_addr, int is_iface_addr)
4131 __WDP_LOG_FUNC_ENTER__;
4132 GDBusConnection *g_dbus = NULL;
4133 GVariant *value = NULL;
4134 dbus_method_param_s params;
4135 GVariantBuilder *builder = NULL;
4139 WDP_LOGE("Invalid parameter");
4144 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4148 g_dbus = g_pd->g_dbus;
4150 WDP_LOGE("DBus connection is NULL");
4153 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4155 dbus_set_method_param(¶ms, "RemoveClient", g_pd->iface_path, g_dbus);
4156 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4158 if (is_iface_addr) {
4159 char peer_mac_str[WS_MACSTR_LEN] = {'\0', };
4161 g_snprintf(peer_mac_str, WS_MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
4162 WDP_LOGI("peer addr [%s]", peer_mac_str);
4163 g_variant_builder_add(builder, "{sv}", "iface",
4164 g_variant_new_string(peer_mac_str));
4166 char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0', };
4168 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4169 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4170 g_variant_builder_add(builder, "{sv}", "peer",
4171 g_variant_new_object_path(peer_path));
4174 value = g_variant_new("(a{sv})", builder);
4175 g_variant_builder_unref(builder);
4177 params.params = value;
4178 DEBUG_G_VARIANT("Params : ", params.params);
4180 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4182 WDP_LOGE("Failed to send command to wpa_supplicant");
4184 WDP_LOGD("Succeeded to send disconnection command to peer[" MACSECSTR "]",
4185 MAC2SECSTR(peer_addr));
4187 __WDP_LOG_FUNC_EXIT__;
4191 int ws_reject_connection(unsigned char *peer_addr)
4193 __WDP_LOG_FUNC_ENTER__;
4194 GDBusConnection *g_dbus = NULL;
4195 GVariant *value = NULL;
4196 dbus_method_param_s params;
4197 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
4201 WDP_LOGE("Invalid parameter");
4202 __WDP_LOG_FUNC_EXIT__;
4207 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4208 __WDP_LOG_FUNC_EXIT__;
4212 g_dbus = g_pd->g_dbus;
4214 WDP_LOGE("DBus connection is NULL");
4215 __WDP_LOG_FUNC_EXIT__;
4218 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4220 dbus_set_method_param(¶ms, "RejectPeer", g_pd->iface_path, g_dbus);
4222 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4223 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4224 WDP_LOGE("get peer path [%s]", peer_path);
4226 value = g_variant_new("(o)", peer_path);
4228 params.params = value;
4229 DEBUG_G_VARIANT("Params : ", params.params);
4231 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4233 WDP_LOGE("Failed to send command to wpa_supplicant");
4235 WDP_LOGD("Succeeded to reject peer[" MACSTR "]", MAC2STR(peer_addr));
4238 __WDP_LOG_FUNC_EXIT__;
4242 int ws_cancel_connection(unsigned char *peer_addr)
4244 __WDP_LOG_FUNC_ENTER__;
4248 __WDP_LOG_FUNC_EXIT__;
4252 int ws_get_connected_peers(GList **peers, int *peer_count)
4254 __WDP_LOG_FUNC_ENTER__;
4256 __WDP_LOG_FUNC_EXIT__;
4260 int ws_get_pin(char *pin)
4262 __WDP_LOG_FUNC_ENTER__;
4264 __WDP_LOG_FUNC_EXIT__;
4268 int ws_set_pin(char *pin)
4270 __WDP_LOG_FUNC_ENTER__;
4272 __WDP_LOG_FUNC_EXIT__;
4276 static void __ws_get_pin(GVariant *value, void *user_data)
4278 __WDP_LOG_FUNC_ENTER__;
4279 const char *pin = NULL;
4281 g_variant_get(value, "(&s)", &pin);
4282 g_strlcpy((char *)user_data, pin, OEM_PINSTR_LEN + 1);
4284 __WDP_LOG_FUNC_EXIT__;
4288 int ws_generate_pin(char **pin)
4290 __WDP_LOG_FUNC_ENTER__;
4291 GDBusConnection *g_dbus = NULL;
4292 dbus_method_param_s params;
4293 char n_pin[9] = {0,};
4297 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4301 g_dbus = g_pd->g_dbus;
4303 WDP_LOGE("DBus connection is NULL");
4306 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4308 dbus_set_method_param(¶ms, "GeneratePin", g_pd->iface_path, g_dbus);
4309 params.params = NULL;
4311 res = dbus_method_call(¶ms, SUPPLICANT_WPS, __ws_get_pin, (void *)n_pin);
4313 WDP_LOGE("Failed to send command to wpa_supplicant");
4315 WDP_LOGD("Succeeded to generate_pin [ %s ]", n_pin);
4317 *pin = strndup(n_pin, OEM_PINSTR_LEN);
4318 __WDP_LOG_FUNC_EXIT__;
4322 int ws_get_supported_wps_mode()
4324 __WDP_LOG_FUNC_ENTER__;
4326 __WDP_LOG_FUNC_EXIT__;
4330 int _ws_get_persistent_net_id(int *persistent_network_id, const unsigned char *go_dev_mac)
4332 __WDP_LOG_FUNC_ENTER__;
4333 int persistent_group_count = 0;
4337 wfd_oem_persistent_group_s *plist = NULL;
4339 res = ws_get_persistent_groups(&plist, &persistent_group_count);
4341 WDP_LOGE("failed to get persistent groups");
4342 __WDP_LOG_FUNC_EXIT__;
4346 if (persistent_group_count > WS_MAX_PERSISTENT_COUNT) {
4347 WDP_LOGE("persistent group count greater than max Persistent count");
4348 persistent_group_count = WS_MAX_PERSISTENT_COUNT;
4351 WDP_LOGD("Persistent Group Count=%d", persistent_group_count);
4353 for (counter = 0; counter < persistent_group_count ; counter++) {
4354 if (!memcmp(go_dev_mac, plist[counter].go_mac_address, WS_MACADDR_LEN)) {
4355 *persistent_network_id = plist[counter].network_id;
4358 WDP_LOGD("Invite: Persistent GO[" MACSTR "], GO Addr[" MACSTR "]",
4359 MAC2STR(plist[counter].go_mac_address), MAC2STR(go_dev_mac));
4365 WDP_LOGD("persistent network ID : [%d]", *persistent_network_id);
4367 __WDP_LOG_FUNC_EXIT__;
4371 static void __store_group_iface_path(GVariant* value, void* user_data)
4373 __WDP_LOG_FUNC_ENTER__;
4374 ws_dbus_plugin_data_s * pd_data;
4375 const char *path = NULL;
4378 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4382 pd_data = (ws_dbus_plugin_data_s *) g_pd;
4384 g_variant_get(value, "(&o)", &path);
4385 g_strlcpy(pd_data->group_iface_path, path, DBUS_OBJECT_PATH_MAX);
4387 WDP_LOGD("group object path [%s]", pd_data->group_iface_path);
4388 /* subscribe interface p2p signal */
4391 int ws_create_group(wfd_oem_group_param_s *param)
4393 __WDP_LOG_FUNC_ENTER__;
4394 GDBusConnection *g_dbus = NULL;
4395 GVariantBuilder *builder = NULL;
4396 GVariant *value = NULL;
4397 dbus_method_param_s params;
4398 char persistent_group_obj_path[OBJECT_PATH_MAX] = {0,};
4402 WDP_LOGE("Invalid parameter");
4403 __WDP_LOG_FUNC_EXIT__;
4408 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4409 __WDP_LOG_FUNC_EXIT__;
4413 g_dbus = g_pd->g_dbus;
4415 WDP_LOGE("DBus connection is NULL");
4416 __WDP_LOG_FUNC_EXIT__;
4419 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4421 dbus_set_method_param(¶ms, "GroupAdd", g_pd->iface_path, g_dbus);
4423 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4425 if (param->persistent > 0) {
4426 unsigned char mac_address[WS_MACADDR_LEN] = {0x00, };
4427 int persistent_group_id = -1;
4429 res = _ws_get_local_dev_mac(mac_address);
4431 WDP_LOGE("failed to get local mac address");
4432 __WDP_LOG_FUNC_EXIT__;
4436 res = _ws_get_persistent_net_id(&persistent_group_id, mac_address);
4438 WDP_LOGE("failed to get persistent group ID");
4439 __WDP_LOG_FUNC_EXIT__;
4443 WDP_LOGD("persistent network ID : [%d]", persistent_group_id);
4445 g_variant_builder_add(builder, "{sv}", "persistent",
4446 g_variant_new_boolean(TRUE));
4447 if (persistent_group_id > -1) {
4448 g_snprintf(persistent_group_obj_path, OBJECT_PATH_MAX,
4449 "%s/" SUPPLICANT_PERSISTENT_GROUPS_PART "/%d",
4450 g_pd->iface_path, persistent_group_id);
4451 g_variant_builder_add(builder, "{sv}", "persistent_group_object",
4452 g_variant_new_object_path(persistent_group_obj_path));
4456 g_variant_builder_add(builder, "{sv}", "persistent",
4457 g_variant_new_boolean(FALSE));
4460 if (param->passphrase && strlen(param->passphrase) > 0)
4461 g_variant_builder_add(builder, "{sv}", "passphrase",
4462 g_variant_new_string(param->passphrase));
4465 g_variant_builder_add(builder, "{sv}", "frequency",
4466 g_variant_new_int32(param->freq));
4468 value = g_variant_new("(a{sv})", builder);
4469 g_variant_builder_unref(builder);
4471 params.params = value;
4472 DEBUG_G_VARIANT("Params : ", params.params);
4474 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE,
4475 __store_group_iface_path, g_pd);
4477 WDP_LOGE("Failed to send command to wpa_supplicant");
4479 WDP_LOGD("Succeeded to add group");
4481 __WDP_LOG_FUNC_EXIT__;
4485 int ws_destroy_group(const char *ifname)
4487 __WDP_LOG_FUNC_ENTER__;
4488 GDBusConnection *g_dbus = NULL;
4489 dbus_method_param_s params;
4493 WDP_LOGE("Invalid parameter");
4498 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4502 g_dbus = g_pd->g_dbus;
4504 WDP_LOGE("DBus connection is NULL");
4508 if (g_pd->group_iface_path[0] == 0) {
4509 WDP_LOGE("group iface path is NULL");
4513 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4515 dbus_set_method_param(¶ms, "Disconnect", g_pd->group_iface_path, g_dbus);
4516 params.params = NULL;
4518 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4520 WDP_LOGE("Failed to send command to wpa_supplicant");
4521 __WDP_LOG_FUNC_EXIT__;
4525 WDP_LOGD("Succeeded to remove group");
4528 __WDP_LOG_FUNC_EXIT__;
4532 int ws_invite(unsigned char *peer_addr, wfd_oem_invite_param_s *param)
4534 __WDP_LOG_FUNC_ENTER__;
4535 GDBusConnection *g_dbus = NULL;
4536 GVariantBuilder *builder = NULL;
4537 GVariant *value = NULL;
4538 dbus_method_param_s params;
4539 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
4542 if (!peer_addr || !param) {
4543 WDP_LOGE("Invalid parameter");
4548 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4552 g_dbus = g_pd->g_dbus;
4554 WDP_LOGE("DBus connection is NULL");
4557 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4559 dbus_set_method_param(¶ms, "Invite", g_pd->group_iface_path, g_dbus);
4561 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
4562 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(peer_addr));
4563 WDP_LOGE("get peer path [%s]", peer_path);
4565 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4566 g_variant_builder_add(builder, "{sv}", "peer", g_variant_new_object_path(peer_path));
4567 value = g_variant_new("(a{sv})", builder);
4568 g_variant_builder_unref(builder);
4570 params.params = value;
4571 DEBUG_G_VARIANT("Params : ", params.params);
4573 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
4575 WDP_LOGE("Failed to send command to wpa_supplicant");
4577 WDP_LOGD("Succeeded to invite peer[" MACSTR "]", MAC2STR(peer_addr));
4579 __WDP_LOG_FUNC_EXIT__;
4583 /* Only group owner can use this command */
4584 int ws_wps_start(unsigned char *peer_addr, int wps_mode, const char *pin)
4586 __WDP_LOG_FUNC_ENTER__;
4587 GDBusConnection *g_dbus = NULL;
4588 GVariantBuilder *builder = NULL;
4589 GVariant *value = NULL;
4590 GVariant *dev_addr = NULL;
4591 dbus_method_param_s params;
4596 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4600 g_dbus = g_pd->g_dbus;
4602 WDP_LOGE("DBus connection is NULL");
4606 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4608 dbus_set_method_param(¶ms, "Start", g_pd->group_iface_path, g_dbus);
4610 if (peer_addr != NULL) {
4611 builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
4612 for (i = 0; i < WS_MACADDR_LEN; i++)
4613 g_variant_builder_add(builder, "y", peer_addr[i]);
4615 dev_addr = g_variant_new("ay", builder);
4616 g_variant_builder_unref(builder);
4619 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4620 g_variant_builder_add(builder, "{sv}", "Role", g_variant_new_string("enrollee"));
4621 if (peer_addr != NULL)
4622 g_variant_builder_add(builder, "{sv}", "P2PDeviceAddress", dev_addr);
4624 if (pin != NULL && pin[0] != '\0') {
4625 g_variant_builder_add(builder, "{sv}", "Type", g_variant_new_string("pin"));
4626 g_variant_builder_add(builder, "{sv}", "Pin", g_variant_new_string(pin));
4628 g_variant_builder_add(builder, "{sv}", "Type", g_variant_new_string("pbc"));
4631 value = g_variant_new("(a{sv})", builder);
4632 g_variant_builder_unref(builder);
4634 params.params = value;
4635 DEBUG_G_VARIANT("Params : ", params.params);
4637 res = dbus_method_call(¶ms, SUPPLICANT_WPS, NULL, NULL);
4639 WDP_LOGE("Failed to send command to wpa_supplicant");
4641 WDP_LOGD("Succeeded to run wps");
4643 __WDP_LOG_FUNC_EXIT__;
4647 int ws_enrollee_start(unsigned char *peer_addr, int wps_mode, const char *pin)
4649 __WDP_LOG_FUNC_ENTER__;
4651 WDP_LOGD("Succeeded to start WPS");
4653 __WDP_LOG_FUNC_EXIT__;
4659 __WDP_LOG_FUNC_ENTER__;
4660 GDBusConnection *g_dbus = NULL;
4661 dbus_method_param_s params;
4664 g_dbus = g_pd->g_dbus;
4666 WDP_LOGE("DBus connection is NULL");
4669 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4671 dbus_set_method_param(¶ms, "Cancel", g_pd->group_iface_path, g_dbus);
4672 params.params = NULL;
4674 res = dbus_method_call(¶ms, SUPPLICANT_WPS, NULL, NULL);
4676 WDP_LOGE("Failed to send command to wpa_supplicant");
4678 WDP_LOGD("Succeeded to cancel WPS");
4680 __WDP_LOG_FUNC_EXIT__;
4684 int ws_get_dev_name(char *dev_name)
4686 __WDP_LOG_FUNC_ENTER__;
4688 __WDP_LOG_FUNC_EXIT__;
4692 int ws_set_dev_name(char *dev_name)
4694 __WDP_LOG_FUNC_ENTER__;
4695 GDBusConnection *g_dbus = NULL;
4697 GVariant *value = NULL;
4698 GVariant *param = NULL;
4699 GVariantBuilder *builder = NULL;
4700 dbus_method_param_s params;
4704 WDP_LOGE("Invalid parameter");
4709 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4713 g_dbus = g_pd->g_dbus;
4715 WDP_LOGE("DBus connection is NULL");
4718 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4720 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
4723 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4724 g_variant_builder_add(builder, "{sv}", "DeviceName",
4725 g_variant_new_string(dev_name));
4726 g_variant_builder_add(builder, "{sv}", "SsidPostfix",
4727 g_variant_new_string(dev_name));
4728 value = g_variant_new("a{sv}", builder);
4729 g_variant_builder_unref(builder);
4731 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE,
4732 "P2PDeviceConfig", value);
4734 params.params = param;
4735 DEBUG_G_VARIANT("Params : ", params.params);
4737 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
4739 WDP_LOGE("Failed to send command to wpa_supplicant");
4741 WDP_LOGD("Succeeded to set device name");
4743 __WDP_LOG_FUNC_EXIT__;
4747 int ws_get_dev_mac(char *dev_mac)
4749 __WDP_LOG_FUNC_ENTER__;
4751 __WDP_LOG_FUNC_EXIT__;
4755 int ws_get_dev_type(int *pri_dev_type, int *sec_dev_type)
4757 __WDP_LOG_FUNC_ENTER__;
4759 __WDP_LOG_FUNC_EXIT__;
4763 int ws_set_dev_type(int pri_dev_type, int sec_dev_type)
4765 __WDP_LOG_FUNC_ENTER__;
4767 __WDP_LOG_FUNC_EXIT__;
4771 int ws_get_go_intent(int *go_intent)
4773 __WDP_LOG_FUNC_ENTER__;
4774 GDBusConnection *g_dbus = NULL;
4775 GVariant *param = NULL;
4776 GVariant *reply = NULL;
4777 GError *error = NULL;
4778 GVariantIter *iter = NULL;
4782 WDP_LOGE("Invalid parameter");
4787 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4791 g_dbus = g_pd->g_dbus;
4793 WDP_LOGE("DBus connection is NULL");
4797 param = g_variant_new("(ss)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig");
4798 DEBUG_G_VARIANT("Params : ", param);
4800 reply = g_dbus_connection_call_sync(
4802 SUPPLICANT_SERVICE, /* bus name */
4803 g_pd->iface_path, /* object path */
4804 DBUS_PROPERTIES_INTERFACE, /* interface name */
4805 DBUS_PROPERTIES_METHOD_GET, /* method name */
4806 param, /* GVariant *params */
4807 NULL, /* reply_type */
4808 G_DBUS_CALL_FLAGS_NONE, /* flags */
4809 SUPPLICANT_TIMEOUT , /* timeout */
4810 NULL, /* cancellable */
4811 &error); /* error */
4813 if (error != NULL) {
4814 WDP_LOGE("Error! Failed to get interface State: [%s]",
4816 g_error_free(error);
4818 g_variant_unref(reply);
4819 __WDP_LOG_FUNC_EXIT__;
4823 if (reply != NULL) {
4824 g_variant_get(reply, "(a{sv})", &iter);
4828 GVariant *value = NULL;
4830 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
4831 CHECK_KEY_VALUE(key, value);
4833 if (g_strcmp0(key, "GOIntent") == 0)
4834 g_variant_get(value, "u", go_intent);
4836 g_variant_iter_free(iter);
4838 g_variant_unref(reply);
4840 __WDP_LOG_FUNC_EXIT__;
4844 int ws_set_go_intent(int go_intent)
4846 __WDP_LOG_FUNC_ENTER__;
4847 GDBusConnection *g_dbus = NULL;
4849 GVariant *value = NULL;
4850 GVariant *param = NULL;
4851 GVariantBuilder *builder = NULL;
4852 dbus_method_param_s params;
4856 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4860 g_dbus = g_pd->g_dbus;
4862 WDP_LOGE("DBus connection is NULL");
4865 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4867 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
4870 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
4871 g_variant_builder_add(builder, "{sv}", "GOIntent",
4872 g_variant_new_uint32(go_intent));
4873 value = g_variant_new("a{sv}", builder);
4874 g_variant_builder_unref(builder);
4876 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
4878 params.params = param;
4879 DEBUG_G_VARIANT("Params : ", params.params);
4881 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
4883 WDP_LOGE("Failed to send command to wpa_supplicant");
4885 WDP_LOGE("Succeeded to set go intent");
4886 __WDP_LOG_FUNC_EXIT__;
4890 int ws_set_country(char *ccode)
4892 __WDP_LOG_FUNC_ENTER__;
4893 __WDP_LOG_FUNC_ENTER__;
4894 GDBusConnection *g_dbus = NULL;
4896 GVariant *value = NULL;
4897 GVariant *param = NULL;
4899 dbus_method_param_s params;
4903 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
4907 g_dbus = g_pd->g_dbus;
4909 WDP_LOGE("DBus connection is NULL");
4912 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
4914 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
4917 value = g_variant_new_string(ccode);
4919 param = g_variant_new("(ssv)", SUPPLICANT_IFACE, "Country", value);
4921 params.params = param;
4922 DEBUG_G_VARIANT("Params : ", params.params);
4924 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
4926 WDP_LOGE("Failed to send command to wpa_supplicant");
4928 WDP_LOGD("Succeeded to set country(%s)", ccode);
4930 __WDP_LOG_FUNC_EXIT__;
4934 void __parsing_networks(const char* key, GVariant* value, void* user_data)
4936 __WDP_LOG_FUNC_ENTER__;
4938 __WDP_LOG_FUNC_EXIT__;
4942 ws_network_info_s *network = (ws_network_info_s *)user_data;
4944 CHECK_KEY_VALUE(key, value);
4946 if (g_strcmp0(key, "ssid") == 0) {
4947 const char *ssid = NULL;
4948 g_variant_get(value, "&s", &ssid);
4949 WDP_LOGD("ssid [%s]", ssid);
4950 g_strlcpy(network->ssid, ssid + 1, WS_SSID_LEN + 1);
4951 network->ssid[strlen(ssid) - 2] = '\0';
4953 } else if (g_strcmp0(key, "bssid") == 0) {
4954 unsigned char *bssid = NULL;
4955 g_variant_get(value, "&s", &bssid);
4956 WDP_LOGD("bssid [%s]", bssid);
4957 __ws_txt_to_mac(bssid, network->bssid);
4959 } else if (g_strcmp0(key, "proto") == 0) {
4960 const char *proto = NULL;
4961 g_variant_get(value, "&s", &proto);
4962 WDP_LOGD("proto [%s]", proto);
4964 if (g_strrstr(proto, WFD_OEM_STR_PROTO_WPA) != NULL)
4965 network->proto |= WFD_OEM_PROTO_WPA;
4966 if (g_strrstr(proto, WFD_OEM_STR_PROTO_RSN) != NULL)
4967 network->proto |= WFD_OEM_PROTO_RSN;
4969 } else if (g_strcmp0(key, "key_mgmt") == 0) {
4970 const char *key_mgmt = NULL;
4971 g_variant_get(value, "&s", &key_mgmt);
4972 WDP_LOGD("key_mgmt [%s]", key_mgmt);
4974 if (g_strrstr(key_mgmt, WFD_OEM_STR_KEY_MGMT_IEEE8021X) != NULL)
4975 network->key_mgmt |= WFD_OEM_KEY_MGMT_IEEE8021X;
4976 if (g_strrstr(key_mgmt, WFD_OEM_STR_KEY_MGMT_PSK) != NULL)
4977 network->key_mgmt |= WFD_OEM_KEY_MGMT_PSK;
4978 if (g_strrstr(key_mgmt, WFD_OEM_STR_KEY_MGMT_NONE) != NULL)
4979 network->key_mgmt |= WFD_OEM_KEY_MGMT_NONE;
4981 } else if (g_strcmp0(key, "pairwise") == 0) {
4982 const char *pairwise = NULL;
4983 g_variant_get(value, "&s", &pairwise);
4984 WDP_LOGD("pairwise [%s]", pairwise);
4986 if (g_strrstr(pairwise, WFD_OEM_STR_CIPHER_NONE) != NULL)
4987 network->pairwise |= WFD_OEM_CIPHER_NONE;
4988 if (g_strrstr(pairwise, WFD_OEM_STR_CIPHER_TKIP) != NULL)
4989 network->pairwise |= WFD_OEM_CIPHER_TKIP;
4990 if (g_strrstr(pairwise, WFD_OEM_STR_CIPHER_CCMP) != NULL)
4991 network->pairwise |= WFD_OEM_CIPHER_CCMP;
4993 } else if (g_strcmp0(key, "group") == 0) {
4994 const char *group = NULL;
4995 g_variant_get(value, "&s", &group);
4996 WDP_LOGD("group [%s]", group);
4998 if (g_strrstr(group, WFD_OEM_STR_CIPHER_NONE) != NULL)
4999 network->group |= WFD_OEM_CIPHER_NONE;
5000 if (g_strrstr(group, WFD_OEM_STR_CIPHER_WEP40) != NULL)
5001 network->group |= WFD_OEM_CIPHER_WEP40;
5002 if (g_strrstr(group, WFD_OEM_STR_CIPHER_WEP104) != NULL)
5003 network->group |= WFD_OEM_CIPHER_WEP104;
5004 if (g_strrstr(group, WFD_OEM_STR_CIPHER_TKIP) != NULL)
5005 network->group |= WFD_OEM_CIPHER_TKIP;
5006 if (g_strrstr(group, WFD_OEM_STR_CIPHER_CCMP) != NULL)
5007 network->group |= WFD_OEM_CIPHER_CCMP;
5009 } else if (g_strcmp0(key, "auth_alg") == 0) {
5010 const char *auth_alg = NULL;
5011 g_variant_get(value, "&s", &auth_alg);
5012 WDP_LOGD("auth_alg [%s]", auth_alg);
5014 if (g_strrstr(auth_alg, WFD_OEM_STR_AUTH_ALG_OPEN) != NULL)
5015 network->auth_alg |= WFD_OEM_AUTH_ALG_OPEN;
5017 } else if (g_strcmp0(key, "mode") == 0) {
5018 const char *mode = NULL;
5019 g_variant_get(value, "&s", &mode);
5020 WDP_LOGD("mode [%s]", mode);
5022 if (g_strrstr(mode, WFD_OEM_STR_MODE_GC) != NULL)
5023 network->mode |= WFD_OEM_PERSISTENT_MODE_GC;
5024 if (g_strrstr(mode, WFD_OEM_STR_MODE_GO) != NULL)
5025 network->mode |= WFD_OEM_PERSISTENT_MODE_GO;
5027 } else if (g_strcmp0(key, "p2p_client_list") == 0) {
5028 const char *p2p_client_list = NULL;
5033 g_variant_get(value, "&s", &p2p_client_list);
5034 WDP_LOGD("p2p_client_list [%s]", p2p_client_list);
5035 ptr = (char *)p2p_client_list;
5036 list_len = strlen(p2p_client_list);
5037 WDP_LOGD("list_len [%d]", list_len);
5038 while (ptr && list_len >= (OEM_MACSTR_LEN - 1)) {
5039 __ws_txt_to_mac((unsigned char *)ptr, (network->p2p_client_list[num]));
5040 ptr += OEM_MACSTR_LEN;
5041 list_len -= OEM_MACSTR_LEN;
5042 if (ptr && ptr[0] == ' ') {
5047 if (num >= OEM_MAX_PEER_NUM)
5050 network->p2p_client_num = num;
5051 WDP_LOGD("p2p_client_num [%d]", network->p2p_client_num);
5056 void __ws_extract_p2pdevice_details(const char *key, GVariant *value, void *user_data)
5058 __WDP_LOG_FUNC_ENTER__;
5059 CHECK_KEY_VALUE(key, value);
5061 if (g_strcmp0(key, "PersistentGroups") == 0) {
5062 GVariantIter *iter = NULL;
5063 const char *path = NULL;
5066 ws_network_info_s *networks = NULL;
5067 networks = (ws_network_info_s *)user_data;
5069 WDP_LOGE("network is NULL");
5070 __WDP_LOG_FUNC_EXIT__;
5074 g_variant_get(value, "ao", &iter);
5075 while (g_variant_iter_loop(iter, "&o", &path)) {
5078 if (num >= WS_MAX_PERSISTENT_COUNT)
5081 WDP_LOGD("Retrive persistent path [%s]", path);
5082 g_strlcpy(networks[num].persistent_path, path, DBUS_OBJECT_PATH_MAX);
5084 loc = strrchr(networks[num].persistent_path, '/');
5086 networks[num].network_id = strtoul(loc+1, NULL, 10);
5088 WDP_LOGD("Retrive persistent path [%s]", networks[num].persistent_path);
5089 dbus_property_get_all(networks[num].persistent_path, g_pd->g_dbus,
5090 SUPPLICANT_P2P_PERSISTENTGROUP, __parsing_networks, &networks[num]);
5094 networks[0].total = num;
5095 WDP_LOGI("total number [%d]", num);
5096 g_variant_iter_free(iter);
5098 __WDP_LOG_FUNC_EXIT__;
5102 int ws_get_persistent_groups(wfd_oem_persistent_group_s **groups, int *group_count)
5104 __WDP_LOG_FUNC_ENTER__;
5105 GDBusConnection *g_dbus = NULL;
5107 ws_network_info_s networks[WS_MAX_PERSISTENT_COUNT];
5108 wfd_oem_persistent_group_s *wfd_persistent_groups = NULL;
5112 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5113 __WDP_LOG_FUNC_EXIT__;
5117 g_dbus = g_pd->g_dbus;
5119 WDP_LOGE("DBus connection is NULL");
5120 __WDP_LOG_FUNC_EXIT__;
5124 memset(&networks, 0x0, WS_MAX_PERSISTENT_COUNT * sizeof(ws_network_info_s));
5125 dbus_property_get_all(g_pd->iface_path, g_dbus, SUPPLICANT_P2PDEVICE,
5126 __ws_extract_p2pdevice_details, &networks[0]);
5128 cnt = networks[0].total;
5130 WDP_LOGD("Persistent Group Count=%d", cnt);
5131 if (cnt > WS_MAX_PERSISTENT_COUNT) {
5132 WDP_LOGE("Persistent group count exceeded or parsing error");
5133 __WDP_LOG_FUNC_EXIT__;
5138 WDP_LOGE("Persistent group count zero");
5141 __WDP_LOG_FUNC_EXIT__;
5145 wfd_persistent_groups = (wfd_oem_persistent_group_s *) g_try_malloc0(cnt * sizeof(wfd_oem_persistent_group_s));
5146 if (wfd_persistent_groups == NULL) {
5147 WDP_LOGE("Failed to allocate memory for wfd_persistent_groups ");
5148 __WDP_LOG_FUNC_EXIT__;
5152 for (i = 0; i < cnt; i++) {
5155 WDP_LOGD("----persistent group [%d]----", i);
5156 WDP_LOGD("network_id [%d]", networks[i].network_id);
5157 WDP_LOGD("ssid [%s]", networks[i].ssid);
5158 WDP_LOGD("bssid ["MACSTR"]", MAC2STR(networks[i].bssid));
5159 WDP_LOGD("p2p_client_num [%d]", networks[i].p2p_client_num);
5160 for (j = 0; j < networks[i].p2p_client_num; j++)
5161 WDP_LOGD("p2p_client_list ["MACSTR"]", MAC2STR(networks[i].p2p_client_list[j]));
5163 wfd_persistent_groups[i].network_id = networks[i].network_id;
5164 g_strlcpy(wfd_persistent_groups[i].ssid, networks[i].ssid, WS_SSID_LEN + 1);
5165 memcpy(wfd_persistent_groups[i].go_mac_address, networks[i].bssid, WS_MACADDR_LEN);
5166 wfd_persistent_groups[i].p2p_client_num = networks[i].p2p_client_num;
5167 if (wfd_persistent_groups[i].p2p_client_num > 0)
5168 memcpy(wfd_persistent_groups[i].p2p_client_list, networks[i].p2p_client_list,
5169 OEM_MACADDR_LEN * OEM_MAX_PEER_NUM * sizeof(char));
5173 *groups = wfd_persistent_groups;
5175 __WDP_LOG_FUNC_EXIT__;
5179 int ws_remove_persistent_group(char *ssid, unsigned char *bssid)
5181 __WDP_LOG_FUNC_ENTER__;
5182 GDBusConnection *g_dbus = NULL;
5184 dbus_method_param_s params;
5185 ws_network_info_s networks[WS_MAX_PERSISTENT_COUNT];
5190 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5191 __WDP_LOG_FUNC_EXIT__;
5195 g_dbus = g_pd->g_dbus;
5197 WDP_LOGE("DBus connection is NULL");
5198 __WDP_LOG_FUNC_EXIT__;
5201 dbus_property_get_all(g_pd->iface_path, g_dbus, SUPPLICANT_P2PDEVICE,
5202 __ws_extract_p2pdevice_details, networks);
5204 cnt = networks[0].total;
5206 WDP_LOGD("Persistent Group Count=%d", cnt);
5207 if (cnt > WS_MAX_PERSISTENT_COUNT) {
5208 WDP_LOGE("Persistent group count exceeded or parsing error");
5209 __WDP_LOG_FUNC_EXIT__;
5213 for (i = 0; i < cnt; i++) {
5216 WDP_LOGD("----persistent group [%d]----", i);
5217 WDP_LOGD("network_id [%d]", networks[i].network_id);
5218 WDP_LOGD("network ssid [%s]", networks[i].ssid);
5219 WDP_LOGD("network bssid ["MACSTR"]", MAC2STR(networks[i].bssid));
5220 WDP_LOGD("network p2p_client_num [%d]", networks[i].p2p_client_num);
5221 for (j = 0; j < networks[i].p2p_client_num; j++)
5222 WDP_LOGD("network p2p_client_list ["MACSTR"]",
5223 MAC2STR(networks[i].p2p_client_list[j]));
5225 WDP_LOGD("ssid [%s]", ssid);
5226 WDP_LOGD("bssid ["MACSTR"]", MAC2STR(bssid));
5228 if (!g_strcmp0(ssid, networks[i].ssid) &&
5229 !memcmp(bssid, networks[i].bssid, WS_MACADDR_LEN)) {
5230 WDP_LOGD("Persistent group owner found [%d: %s]",
5231 networks[i].network_id, ssid);
5233 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5234 dbus_set_method_param(¶ms, "RemovePersistentGroup",
5235 g_pd->iface_path, g_dbus);
5236 params.params = g_variant_new("(o)", networks[i].persistent_path);
5237 DEBUG_G_VARIANT("Params : ", params.params);
5239 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
5241 WDP_LOGE("Failed to send command to wpa_supplicant");
5242 __WDP_LOG_FUNC_EXIT__;
5246 WDP_LOGD("Succeeded to remove persistent group");;
5252 WDP_LOGE("Persistent group not found [%s]", ssid);
5256 __WDP_LOG_FUNC_EXIT__;
5260 int ws_set_persistent_reconnect(unsigned char *bssid, int reconnect)
5262 __WDP_LOG_FUNC_ENTER__;
5263 GDBusConnection *g_dbus = NULL;
5265 GVariant *value = NULL;
5266 GVariant *param = NULL;
5267 GVariantBuilder *builder = NULL;
5268 dbus_method_param_s params;
5272 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5276 g_dbus = g_pd->g_dbus;
5278 WDP_LOGE("DBus connection is NULL");
5281 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5283 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
5286 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
5287 g_variant_builder_add(builder, "{sv}", "PersistentReconnect",
5288 g_variant_new_boolean(reconnect));
5289 value = g_variant_new("a{sv}", builder);
5290 g_variant_builder_unref(builder);
5292 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
5294 params.params = param;
5295 DEBUG_G_VARIANT("Params : ", params.params);
5297 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
5299 WDP_LOGE("Failed to send command to wpa_supplicant");
5301 WDP_LOGD("Succeeded to set persistent reconnect");
5303 __WDP_LOG_FUNC_EXIT__;
5307 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
5308 static int __ws_compress_query(char *compressed, char *query, int qtype)
5316 token = strtok_r(query, ".", &temp);
5318 if (!strcmp(token, "local")) {
5319 WDP_LOGD("Query conversion done");
5322 } else if (!strncmp(token, "_tcp", 4)) {
5323 memcpy(&compressed[length], WS_TCP_PTR_HEX, 2);
5326 } else if (!strncmp(token, "_udp", 4)) {
5327 memcpy(&compressed[length], WS_UDP_PTR_HEX, 2);
5331 WDP_LOGD("Token: [%s]", token);
5332 token_len = strlen(token);
5333 compressed[length] = token_len;
5336 memcpy(&compressed[length], token, token_len);
5337 length += token_len;
5340 token = strtok_r(NULL, ".", &temp);
5342 if (qtype == WS_QTYPE_PTR || token_num == 2)
5343 memcpy(&compressed[length], WS_PTR_TYPE_HEX, 3);
5344 else if (qtype == WS_QTYPE_TXT || token_num == 3)
5345 memcpy(&compressed[length], WS_TXT_TYPE_HEX, 3);
5348 WDP_LOGD("converted query length [%d] token num [%d]", length, token_num);
5353 static int __ws_compress_rdata(char *compressed, char *rdata, int qtype)
5360 if (qtype == WS_QTYPE_PTR) {
5362 token = strtok_r(rdata, ".", &temp);
5364 WDP_LOGD("Token: %s", token);
5365 token_len = strlen(token);
5366 compressed[length] = token_len;
5369 memcpy(&compressed[length], token, token_len);
5370 length += token_len;
5373 compressed[length] = 0xc0;
5374 compressed[length+1] = 0x27;
5377 } else if (qtype == WS_QTYPE_TXT) {
5379 token = strtok_r(rdata, ", ", &temp);
5382 WDP_LOGD("Token: [%s]", token);
5384 token_len = strlen(token);
5385 compressed[length] = token_len;
5388 memcpy(&compressed[length], token, token_len);
5389 length += token_len;
5391 token = strtok_r(NULL, ", ", &temp);
5394 WDP_LOGD("RDATA is NULL");
5399 int _convert_bonjour_to_args(char *query, char *rdata, GVariantBuilder *builder)
5401 GVariantBuilder *args = NULL;
5402 char compressed[256] = {0, };
5408 if (!query || !builder) {
5409 WDP_LOGE("Invalid parameter");
5412 if (!rdata || !strlen(rdata)) {
5413 WDP_LOGD("RDATA is NULL\n");
5415 temp = strstr(rdata, query);
5417 if (temp != NULL && temp - rdata > 0)
5418 qtype = WS_QTYPE_PTR;
5420 qtype = WS_QTYPE_TXT;
5424 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("bonjour"));
5426 /* compress query */
5427 length = __ws_compress_query(compressed, query, qtype);
5429 args = g_variant_builder_new(G_VARIANT_TYPE("ay"));
5430 for (i = 0; i < length; i++)
5431 g_variant_builder_add(args, "y", compressed[i]);
5432 g_variant_builder_add(builder, "{sv}", "query", g_variant_new("ay", args));
5433 g_variant_builder_unref(args);
5435 memset(compressed, 0x0, 256);
5440 length = __ws_compress_rdata(compressed, rdata, qtype);
5442 args = g_variant_builder_new(G_VARIANT_TYPE("ay"));
5443 for (i = 0; i < length; i++)
5444 g_variant_builder_add(args, "y", compressed[i]);
5445 g_variant_builder_add(builder, "{sv}", "response", g_variant_new("ay", args));
5446 g_variant_builder_unref(args);
5452 int _check_service_query_exists(wfd_oem_service_s *service)
5455 wfd_oem_service_s *data = NULL;
5457 for (count = 0; count < g_list_length(service_list); count++) {
5458 data = (wfd_oem_service_s*) g_list_nth_data(service_list, count);
5459 if (strncmp(service->query_id, data->query_id, OEM_QUERY_ID_LEN) == 0) {
5460 WDP_LOGD("Query already exists");
5467 static wfd_oem_service_s* _remove_service_query(char * s_type, char *mac_str, char *query_id)
5469 if (NULL == s_type || NULL == mac_str || NULL == query_id)
5473 wfd_oem_service_s *data = NULL;
5475 for (count = 0; count < g_list_length(service_list); count++) {
5476 data = (wfd_oem_service_s*) g_list_nth_data(service_list, count);
5477 if (data && !strncmp(data->service_type, s_type, SERVICE_TYPE_LEN) &&
5478 memcmp(data->dev_addr, mac_str, OEM_MACSTR_LEN - 1) == 0) {
5479 strncpy(query_id, data->query_id, OEM_QUERY_ID_LEN);
5483 if (strlen(query_id) <= 0) {
5484 WDP_LOGD("!! Query ID not found !!");
5488 WDP_LOGD("query id :[0x%s]", query_id);
5493 void __add_service_query(GVariant *value, void *mac_addr)
5495 __WDP_LOG_FUNC_ENTER__;
5496 wfd_oem_service_s *service = NULL;
5498 long long unsigned ref = 0;
5499 unsigned char *mac_address = (unsigned char *)mac_addr;
5500 char mac_str[18] = {0, };
5504 g_variant_get(value, "(t)", &ref);
5506 service = (wfd_oem_service_s*) g_try_malloc0(sizeof(wfd_oem_service_s));
5508 WDP_LOGE("Failed to allocate memory for service");
5512 if (mac_address[0] == 0 && mac_address[1] == 0 && mac_address[2] == 0 &&
5513 mac_address[3] == 0 && mac_address[4] == 0 && mac_address[5] == 0) {
5514 g_snprintf(mac_str, WS_MACSTR_LEN , "%s", SERV_BROADCAST_ADDRESS);
5516 g_snprintf(mac_str, WS_MACSTR_LEN, MACSTR, MAC2STR(mac_address));
5519 g_strlcpy(service->dev_addr, mac_str, OEM_MACSTR_LEN);
5520 g_snprintf(service->query_id, OEM_QUERY_ID_LEN + 1, "0x%llx", ref);
5522 res = _check_service_query_exists(service);
5526 service_list = g_list_append(service_list, service);
5528 __WDP_LOG_FUNC_EXIT__;
5533 /* for now, supplicant dbus interface only provides upnp service fully */
5534 int ws_start_service_discovery(unsigned char *mac_addr, int service_type)
5536 __WDP_LOG_FUNC_ENTER__;
5537 GDBusConnection *g_dbus = NULL;
5538 GVariantBuilder *builder = NULL;
5539 GVariant *value = NULL;
5540 dbus_method_param_s params;
5541 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
5546 WDP_LOGE("Invalid parameter");
5547 __WDP_LOG_FUNC_EXIT__;
5552 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5553 __WDP_LOG_FUNC_EXIT__;
5557 g_dbus = g_pd->g_dbus;
5559 WDP_LOGE("DBus connection is NULL");
5560 __WDP_LOG_FUNC_EXIT__;
5563 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5565 dbus_set_method_param(¶ms, "ServiceDiscoveryRequest", g_pd->iface_path, g_dbus);
5567 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
5570 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
5571 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(mac_addr));
5572 WDP_LOGD("get peer path [%s]", peer_path);
5573 g_variant_builder_add(builder, "{sv}", "peer", g_variant_new_object_path(peer_path));
5576 if (service_type == WFD_OEM_SERVICE_TYPE_ALL) {
5578 char *service_all = "\x02\x00\x00\x01";
5579 GVariantBuilder *query = NULL;
5581 query = g_variant_builder_new(G_VARIANT_TYPE("ay"));
5582 for (i = 0; i < SERVICE_QUERY_LEN; i++)
5583 g_variant_builder_add(query, "y", service_all[i]);
5584 g_variant_builder_add(builder, "{sv}", "query", g_variant_new("ay", query));
5585 g_variant_builder_unref(query);
5587 } else if (service_type == WFD_OEM_SERVICE_TYPE_UPNP) {
5589 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("upnp"));
5590 g_variant_builder_add(builder, "{sv}", "version", g_variant_new_uint16(TRUE));
5592 } else if (service_type == WFD_OEM_SERVICE_TYPE_BONJOUR) {
5594 char *service_bonjour = "\x02\x00\x01\x01";
5595 GVariantBuilder *query = NULL;
5597 query = g_variant_builder_new(G_VARIANT_TYPE("ay"));
5598 for (i = 0; i < SERVICE_QUERY_LEN; i++)
5599 g_variant_builder_add(query, "y", service_bonjour[i]);
5600 g_variant_builder_add(builder, "{sv}", "query", g_variant_new("ay", query));
5601 g_variant_builder_unref(query);
5604 value = g_variant_new("(a{sv})", builder);
5605 g_variant_builder_unref(builder);
5607 params.params = value;
5608 DEBUG_G_VARIANT("Params : ", params.params);
5610 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, __add_service_query, mac_addr);
5612 WDP_LOGE("Failed to send command to wpa_supplicant");
5614 WDP_LOGD("Succeeded to start service discovery");
5616 __WDP_LOG_FUNC_EXIT__;
5620 int ws_cancel_service_discovery(unsigned char *mac_addr, int service_type)
5622 __WDP_LOG_FUNC_ENTER__;
5623 GDBusConnection *g_dbus = NULL;
5624 dbus_method_param_s params;
5625 wfd_oem_service_s *data = NULL;
5626 char query_id[OEM_QUERY_ID_LEN + 1] = {0, };
5627 char s_type[OEM_SERVICE_TYPE_LEN + 1] = {0, };
5628 char mac_str[18] = {0, };
5633 WDP_LOGE("Invalid parameter");
5634 __WDP_LOG_FUNC_EXIT__;
5639 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5640 __WDP_LOG_FUNC_EXIT__;
5644 g_dbus = g_pd->g_dbus;
5646 WDP_LOGE("DBus connection is NULL");
5647 __WDP_LOG_FUNC_EXIT__;
5651 if (mac_addr[0] == 0 && mac_addr[1] == 0 && mac_addr[2] == 0 &&
5652 mac_addr[3] == 0 && mac_addr[4] == 0 && mac_addr[5] == 0) {
5653 snprintf(mac_str, WS_MACSTR_LEN , "%s", SERV_BROADCAST_ADDRESS);
5655 snprintf(mac_str, WS_MACSTR_LEN, MACSTR, MAC2STR(mac_addr));
5658 switch (service_type) {
5659 case WFD_OEM_SERVICE_TYPE_ALL:
5660 strncpy(s_type, SERV_DISC_REQ_ALL, OEM_SERVICE_TYPE_LEN);
5662 case WFD_OEM_SERVICE_TYPE_BONJOUR:
5663 strncpy(s_type, SERV_DISC_REQ_BONJOUR, OEM_SERVICE_TYPE_LEN);
5665 case WFD_OEM_SERVICE_TYPE_UPNP:
5666 strncpy(s_type, SERV_DISC_REQ_UPNP, OEM_SERVICE_TYPE_LEN);
5669 WDP_LOGE("Invalid Service type");
5670 __WDP_LOG_FUNC_EXIT__;
5674 WDP_LOGD("Cancel service discovery service_type [%d]", service_type);
5675 WDP_LOGD("Cancel service discovery s_type [%s]", s_type);
5677 data = _remove_service_query(s_type, mac_str, query_id);
5679 __WDP_LOG_FUNC_EXIT__;
5682 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5684 dbus_set_method_param(¶ms, "ServiceDiscoveryCancelRequest", g_pd->iface_path, g_dbus);
5686 params.params = g_variant_new("(t)", strtoul(query_id, NULL, 16));
5688 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
5690 WDP_LOGE("Failed to send command to wpa_supplicant");
5692 WDP_LOGD("Succeeded to cancel service discovery");
5694 service_list = g_list_remove(service_list, data);
5697 __WDP_LOG_FUNC_EXIT__;
5701 int ws_serv_add(wfd_oem_new_service_s *service)
5703 __WDP_LOG_FUNC_ENTER__;
5704 GDBusConnection *g_dbus = NULL;
5705 GVariantBuilder *builder = NULL;
5706 GVariant *value = NULL;
5707 dbus_method_param_s params;
5711 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5715 g_dbus = g_pd->g_dbus;
5717 WDP_LOGE("DBus connection is NULL");
5720 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5722 dbus_set_method_param(¶ms, "AddService", g_pd->iface_path, g_dbus);
5724 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
5726 if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
5728 WDP_LOGD("Service type: WFD_OEM_SERVICE_TYPE_BONJOUR");
5729 WDP_LOGD("Query: %s", service->data.bonjour.query);
5730 WDP_LOGD("RData: %s", service->data.bonjour.rdata);
5732 res = _convert_bonjour_to_args(service->data.bonjour.query,
5733 service->data.bonjour.rdata, builder);
5735 WDP_LOGE("Failed to convert Key string");
5736 g_variant_builder_unref(builder);
5740 } else if (service->protocol == WFD_OEM_SERVICE_TYPE_UPNP) {
5741 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("upnp"));
5742 g_variant_builder_add(builder, "{sv}", "version", g_variant_new_uint16(TRUE));
5743 g_variant_builder_add(builder, "{sv}", "service", g_variant_new_string(service->data.upnp.service));
5746 value = g_variant_new("(a{sv})", builder);
5747 g_variant_builder_unref(builder);
5749 params.params = value;
5750 DEBUG_G_VARIANT("Params : ", params.params);
5752 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
5754 WDP_LOGE("Failed to send command to wpa_supplicant");
5756 WDP_LOGD("Succeeded to add service");
5758 __WDP_LOG_FUNC_EXIT__;
5762 int ws_serv_del(wfd_oem_new_service_s *service)
5764 __WDP_LOG_FUNC_ENTER__;
5765 GDBusConnection *g_dbus = NULL;
5766 GVariantBuilder *builder = NULL;
5767 GVariant *value = NULL;
5768 dbus_method_param_s params;
5772 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5776 g_dbus = g_pd->g_dbus;
5778 WDP_LOGE("DBus connection is NULL");
5781 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5783 dbus_set_method_param(¶ms, "DeleteService", g_pd->iface_path, g_dbus);
5785 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
5787 if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
5789 WDP_LOGD("Service type: WFD_OEM_SERVICE_TYPE_BONJOUR");
5790 WDP_LOGD("Query: %s", service->data.bonjour.query);
5792 res = _convert_bonjour_to_args(service->data.bonjour.query,
5795 WDP_LOGE("Failed to convert Key string");
5796 g_variant_builder_unref(builder);
5800 } else if (service->protocol == WFD_OEM_SERVICE_TYPE_UPNP) {
5801 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("upnp"));
5802 g_variant_builder_add(builder, "{sv}", "version", g_variant_new_uint16(TRUE));
5803 g_variant_builder_add(builder, "{sv}", "service", g_variant_new_string(service->data.upnp.service));
5806 value = g_variant_new("(a{sv})", builder);
5807 g_variant_builder_unref(builder);
5809 params.params = value;
5810 DEBUG_G_VARIANT("Params : ", params.params);
5812 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
5814 WDP_LOGE("Failed to send command to wpa_supplicant");
5816 WDP_LOGD("Succeeded to del service");
5818 __WDP_LOG_FUNC_EXIT__;
5821 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
5823 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
5825 int _ws_disable_display()
5827 __WDP_LOG_FUNC_ENTER__;
5828 GDBusConnection *g_dbus = NULL;
5829 GVariantBuilder *builder = NULL;
5830 GVariant *value = NULL;
5831 GVariant *param = NULL;
5832 dbus_method_param_s params;
5836 WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
5840 g_dbus = g_pd->g_dbus;
5842 WDP_LOGE("DBus connection is NULL");
5845 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5847 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, SUPPLICANT_PATH,
5850 builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
5851 value = g_variant_new("ay", builder);
5852 g_variant_builder_unref(builder);
5854 param = g_variant_new("(ssv)", SUPPLICANT_INTERFACE, "WFDIEs", value);
5856 params.params = param;
5857 DEBUG_G_VARIANT("Params : ", params.params);
5859 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
5861 WDP_LOGE("Failed to send command to wpa_supplicant");
5863 WDP_LOGD("Succeeded to disable Wi-Fi display");
5865 __WDP_LOG_FUNC_EXIT__;
5869 int ws_miracast_init(int enable)
5871 __WDP_LOG_FUNC_ENTER__;
5872 wfd_oem_display_s wifi_display;
5875 memset(&wifi_display, 0x0, sizeof(wfd_oem_display_s));
5877 wifi_display.availability = enable;
5878 wifi_display.hdcp_support = 1;
5879 wifi_display.port = 0x07E6;
5880 wifi_display.max_tput = 0x0028;
5882 res = ws_set_display(&wifi_display);
5884 WDP_LOGE("Failed to set miracast parameter(device info)");
5885 __WDP_LOG_FUNC_EXIT__;
5890 res = _ws_disable_display();
5892 WDP_LOGE("Failed to disable wifi display");
5894 WDP_LOGD("Succeeded to disable wifi display");
5896 __WDP_LOG_FUNC_EXIT__;
5900 int ws_set_display(wfd_oem_display_s *wifi_display)
5902 __WDP_LOG_FUNC_ENTER__;
5903 GDBusConnection *g_dbus = NULL;
5905 GVariant *value = NULL;
5906 GVariant *param = NULL;
5907 GVariantBuilder *builder = NULL;
5908 dbus_method_param_s params;
5912 unsigned char ies[WFD_SUBELEM_LEN_DEV_INFO + 3] = {0,};
5914 if (!wifi_display) {
5915 WDP_LOGE("Invalid parameter");
5918 g_dbus = g_pd->g_dbus;
5920 WDP_LOGE("DBus connection is NULL");
5923 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5925 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, SUPPLICANT_PATH,
5928 ies[2] = WFD_SUBELEM_LEN_DEV_INFO;
5929 ies[3] = wifi_display->hdcp_support;
5930 ies[4] = (wifi_display->type) | (wifi_display->availability<<4);
5931 ies[5] = wifi_display->port>>8;
5932 ies[6] = wifi_display->port&0xff;
5933 ies[7] = wifi_display->max_tput>>8;
5934 ies[8] = wifi_display->max_tput&0xff;
5936 builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
5937 for (i = 0; i < WFD_SUBELEM_LEN_DEV_INFO + 3; i++)
5938 g_variant_builder_add(builder, "y", ies[i]);
5939 value = g_variant_new("ay", builder);
5940 g_variant_builder_unref(builder);
5942 param = g_variant_new("(ssv)", SUPPLICANT_INTERFACE, "WFDIEs", value);
5944 params.params = param;
5945 DEBUG_G_VARIANT("Params : ", params.params);
5947 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
5949 WDP_LOGE("Failed to send command to wpa_supplicant");
5951 WDP_LOGD("Succeeded to set Wi-Fi Display");
5953 __WDP_LOG_FUNC_EXIT__;
5956 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
5960 __WDP_LOG_FUNC_ENTER__;
5965 __WDP_LOG_FUNC_EXIT__;
5969 int ws_save_config(void)
5971 __WDP_LOG_FUNC_ENTER__;
5972 GDBusConnection *g_dbus = NULL;
5973 dbus_method_param_s params;
5976 g_dbus = g_pd->g_dbus;
5978 WDP_LOGE("DBus connection is NULL");
5979 __WDP_LOG_FUNC_EXIT__;
5982 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
5984 dbus_set_method_param(¶ms, "SaveConfig", g_pd->iface_path, g_dbus);
5985 params.params = NULL;
5987 res = dbus_method_call(¶ms, SUPPLICANT_IFACE, NULL, NULL);
5989 WDP_LOGE("Failed to save config to wpa_supplicant");
5991 WDP_LOGD("Succeeded to save config");
5993 __WDP_LOG_FUNC_EXIT__;
5997 int ws_set_operating_channel(int channel)
5999 __WDP_LOG_FUNC_ENTER__;
6000 GDBusConnection *g_dbus = NULL;
6001 GVariant *value = NULL;
6002 GVariant *param = NULL;
6003 GVariantBuilder *builder = NULL;
6004 dbus_method_param_s params;
6007 g_dbus = g_pd->g_dbus;
6009 WDP_LOGE("DBus connection is NULL");
6010 __WDP_LOG_FUNC_EXIT__;
6014 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6016 dbus_set_method_param(¶ms, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path, g_dbus);
6018 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6019 g_variant_builder_add(builder, "{sv}", "OperChannel", g_variant_new_uint32(channel));
6020 value = g_variant_new("a{sv}", builder);
6021 g_variant_builder_unref(builder);
6023 param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
6024 params.params = param;
6026 res = dbus_method_call(¶ms, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
6028 WDP_LOGE("Failed to send command to wpa_supplicant");
6030 WDP_LOGD("Succeeded to set Operating Channel");
6032 __WDP_LOG_FUNC_EXIT__;
6036 int ws_remove_all_network(void)
6038 __WDP_LOG_FUNC_ENTER__;
6039 GDBusConnection *g_dbus = NULL;
6040 dbus_method_param_s params;
6043 g_dbus = g_pd->g_dbus;
6045 WDP_LOGE("DBus connection is NULL");
6046 __WDP_LOG_FUNC_EXIT__;
6049 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6051 dbus_set_method_param(¶ms, "RemoveAllNetworks", g_pd->iface_path, g_dbus);
6052 params.params = NULL;
6054 res = dbus_method_call(¶ms, SUPPLICANT_IFACE, NULL, NULL);
6056 WDP_LOGE("Failed to send [RemoveAllNetworks] command to wpa_supplicant");
6058 WDP_LOGD("Succeeded to remove all networks from supplicant");
6060 WDP_LOGD("Succeeded to remove all network");
6061 __WDP_LOG_FUNC_EXIT__;
6065 int ws_get_wpa_status(int *wpa_status)
6067 __WDP_LOG_FUNC_ENTER__;
6068 GDBusConnection *g_dbus = NULL;
6069 GVariant *param = NULL;
6070 GVariant *reply = NULL;
6071 GError *error = NULL;
6074 WDP_LOGE("Invalid parameter");
6075 __WDP_LOG_FUNC_EXIT__;
6079 *wpa_status = WFD_OEM_WPA_STATE_MAX;
6081 g_dbus = g_pd->g_dbus;
6083 WDP_LOGE("DBus connection is NULL");
6084 __WDP_LOG_FUNC_EXIT__;
6088 param = g_variant_new("(s)", SUPPLICANT_IFACE);
6090 reply = g_dbus_connection_call_sync(
6092 SUPPLICANT_SERVICE, /* bus name */
6093 g_pd->iface_path, /* object path */
6094 DBUS_PROPERTIES_INTERFACE, /* interface name */
6095 DBUS_PROPERTIES_METHOD_GETALL, /* method name */
6096 param, /* GVariant *params */
6097 NULL, /* reply_type */
6098 G_DBUS_CALL_FLAGS_NONE, /* flags */
6099 SUPPLICANT_TIMEOUT , /* timeout */
6100 NULL, /* cancellable */
6101 &error); /* error */
6103 if (error != NULL) {
6104 WDP_LOGE("Error! Failed to get properties: [%s]",
6106 g_error_free(error);
6108 g_variant_unref(reply);
6109 __WDP_LOG_FUNC_EXIT__;
6113 gchar *reply_str = NULL;
6115 reply_str = g_variant_print(reply, TRUE);
6116 WDP_LOGE("reply [%s]", reply_str ? reply_str : "NULL");
6119 if (reply != NULL) {
6120 GVariantIter *iter = NULL;
6121 g_variant_get(reply, "(a{sv})", &iter);
6125 GVariant *value = NULL;
6127 while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
6128 if (g_strcmp0(key, "State") == 0) {
6129 const gchar *state = NULL;
6130 g_variant_get(value, "&s", &state);
6131 WDP_LOGI("state : [%s]", state);
6133 if (g_strcmp0(state, "disconnected") == 0)
6134 *wpa_status = WFD_OEM_WPA_STATE_DISCONNECTED;
6135 else if (g_strcmp0(state, "inactive") == 0)
6136 *wpa_status = WFD_OEM_WPA_STATE_INACTIVE;
6137 else if (g_strcmp0(state, "scanning") == 0)
6138 *wpa_status = WFD_OEM_WPA_STATE_SCANNING;
6139 else if (g_strcmp0(state, "authenticating") == 0)
6140 *wpa_status = WFD_OEM_WPA_STATE_AUTHENTICATING;
6141 else if (g_strcmp0(state, "associating") == 0)
6142 *wpa_status = WFD_OEM_WPA_STATE_ASSOCIATING;
6143 else if (g_strcmp0(state, "associated") == 0)
6144 *wpa_status = WFD_OEM_WPA_STATE_ASSOCIATED;
6145 else if (g_strcmp0(state, "4way_handshake") == 0)
6146 *wpa_status = WFD_OEM_WPA_STATE_4WAY_HANDSHAKE;
6147 else if (g_strcmp0(state, "group_handshake") == 0)
6148 *wpa_status = WFD_OEM_WPA_STATE_GROUP_HANDSHAKE;
6149 else if (g_strcmp0(state, "completed") == 0)
6150 *wpa_status = WFD_OEM_WPA_STATE_COMPLETED;
6152 *wpa_status = WFD_OEM_WPA_STATE_MAX;
6155 g_variant_iter_free(iter);
6157 g_variant_unref(reply);
6159 WDP_LOGD("No properties");
6162 WDP_LOGI("wpa_status : [%d]", *wpa_status);
6164 __WDP_LOG_FUNC_EXIT__;
6168 #if defined(TIZEN_FEATURE_ASP)
6169 int ws_advertise_service(wfd_oem_asp_service_s *service, int replace)
6171 __WDP_LOG_FUNC_ENTER__;
6172 GDBusConnection *g_dbus = NULL;
6173 GVariantBuilder *builder = NULL;
6174 GVariant *value = NULL;
6175 dbus_method_param_s params;
6176 unsigned int config_method = 0x1108;
6177 int auto_accept = 0;
6181 g_dbus = g_pd->g_dbus;
6183 WDP_LOGE("DBus connection is NULL");
6187 if (service->config_method == 2) {
6188 config_method = WS_CONFIG_METHOD_KEYPAD |
6189 WS_CONFIG_METHOD_DISPLAY;
6190 } else if (service->config_method == 3) {
6191 config_method = WS_CONFIG_METHOD_DISPLAY;
6192 } else if (service->config_method == 4) {
6193 config_method = WS_CONFIG_METHOD_KEYPAD;
6196 if (service->auto_accept) {
6197 if (service->role == 0)
6205 rep = (replace == 1);
6207 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6209 dbus_set_method_param(¶ms, "AddService", g_pd->iface_path, g_dbus);
6211 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6213 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("asp"));
6214 g_variant_builder_add(builder, "{sv}", "auto_accept", g_variant_new_int32(auto_accept));
6215 g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new_uint32(service->adv_id));
6216 g_variant_builder_add(builder, "{sv}", "svc_state", g_variant_new_uint32(service->status));
6217 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new_uint32(config_method));
6218 g_variant_builder_add(builder, "{sv}", "replace", g_variant_new_boolean(rep));
6219 if (service->service_type != NULL)
6220 g_variant_builder_add(builder, "{sv}", "adv_str", g_variant_new_string(service->service_type));
6221 if (service->service_info != NULL)
6222 g_variant_builder_add(builder, "{sv}", "svc_info", g_variant_new_string(service->service_info));
6224 value = g_variant_new("(a{sv})", builder);
6225 g_variant_builder_unref(builder);
6226 DEBUG_G_VARIANT("Params : ", value);
6228 params.params = value;
6230 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
6232 WDP_LOGE("Failed to send command to wpa_supplicant");
6234 WDP_LOGD("Succeeded to add service");
6236 __WDP_LOG_FUNC_EXIT__;
6240 int ws_cancel_advertise_service(wfd_oem_asp_service_s *service)
6242 __WDP_LOG_FUNC_ENTER__;
6243 GDBusConnection *g_dbus = NULL;
6244 GVariantBuilder *builder = NULL;
6245 GVariant *value = NULL;
6246 dbus_method_param_s params;
6249 g_dbus = g_pd->g_dbus;
6251 WDP_LOGE("DBus connection is NULL");
6254 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6256 dbus_set_method_param(¶ms, "DeleteService", g_pd->iface_path, g_dbus);
6258 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6260 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("asp"));
6261 g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new_uint32(service->adv_id));
6263 value = g_variant_new("(a{sv})", builder);
6264 g_variant_builder_unref(builder);
6265 DEBUG_G_VARIANT("Params : ", value);
6266 params.params = value;
6268 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
6270 WDP_LOGE("Failed to send command to wpa_supplicant");
6272 WDP_LOGD("Succeeded to del service");
6274 __WDP_LOG_FUNC_EXIT__;
6278 static void __ws_add_seek(wfd_oem_asp_service_s *service)
6280 __WDP_LOG_FUNC_ENTER__;
6281 wfd_oem_asp_service_s *seek = NULL;
6283 WDP_LOGE("invalid parameters");
6287 seek = g_try_malloc0(sizeof(wfd_oem_asp_service_s));
6289 WDP_LOGE("Failed to allocate memory for service");
6293 service->search_id = (intptr_t)seek;
6294 memcpy(seek, service, sizeof(wfd_oem_asp_service_s));
6295 if (service->service_type)
6296 seek->service_type = strdup(service->service_type);
6297 seek_list = g_list_prepend(seek_list, seek);
6299 __WDP_LOG_FUNC_EXIT__;
6303 static wfd_oem_asp_service_s * __ws_get_seek(long long unsigned search_id)
6305 __WDP_LOG_FUNC_ENTER__;
6306 wfd_oem_asp_service_s *seek = NULL;
6309 for (list = seek_list; list != NULL; list = list->next) {
6311 if (seek && (seek->search_id == search_id)) {
6312 WDP_LOGD("List found");
6318 __WDP_LOG_FUNC_EXIT__;
6322 static void __ws_remove_seek(wfd_oem_asp_service_s *service)
6324 __WDP_LOG_FUNC_ENTER__;
6325 wfd_oem_asp_service_s *seek = NULL;
6328 for (list = seek_list; list != NULL; list = list->next) {
6331 if (seek && (seek->search_id == service->search_id)) {
6332 WDP_LOGD("List remove");
6333 seek_list = g_list_remove(seek_list, seek);
6334 g_free(seek->service_type);
6335 g_free(seek->service_info);
6339 __WDP_LOG_FUNC_EXIT__;
6343 static void __get_asp_search_id(GVariant *value, void *args)
6345 __WDP_LOG_FUNC_ENTER__;
6346 wfd_oem_asp_service_s *service = NULL;
6347 wfd_oem_asp_service_s *seek = NULL;
6348 long long unsigned search_id = 0;
6350 g_variant_get(value, "(t)", &search_id);
6352 service = (wfd_oem_asp_service_s *)args;
6354 WDP_LOGE("invalid parameters");
6355 __WDP_LOG_FUNC_EXIT__;
6359 seek = g_try_malloc0(sizeof(wfd_oem_asp_service_s));
6361 WDP_LOGE("Failed to allocate memory for service");
6362 __WDP_LOG_FUNC_EXIT__;
6366 service->search_id = search_id;
6367 memcpy(seek, service, sizeof(wfd_oem_asp_service_s));
6368 if (service->service_type)
6369 seek->service_type = strdup(service->service_type);
6370 if (service->service_info)
6371 seek->service_info = strdup(service->service_info);
6372 seek_list = g_list_append(seek_list, seek);
6374 __WDP_LOG_FUNC_EXIT__;
6378 int ws_seek_service(wfd_oem_asp_service_s *service)
6380 __WDP_LOG_FUNC_ENTER__;
6381 GDBusConnection *g_dbus = NULL;
6383 wfd_oem_asp_service_s *seek = NULL;
6386 g_dbus = g_pd->g_dbus;
6388 WDP_LOGE("DBus connection is NULL");
6389 __WDP_LOG_FUNC_EXIT__;
6392 list = g_list_last(seek_list);
6394 service->tran_id = 1;
6399 service->tran_id = seek->tran_id + 1;
6401 service->tran_id = 1;
6404 if (service->service_info) {
6405 GVariantBuilder *builder = NULL;
6406 GVariant *value = NULL;
6407 dbus_method_param_s params;
6409 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6410 dbus_set_method_param(¶ms, "ServiceDiscoveryRequest",
6411 g_pd->iface_path, g_dbus);
6413 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6415 g_variant_builder_add(builder, "{sv}", "service_type",
6416 g_variant_new_string("asp"));
6417 g_variant_builder_add(builder, "{sv}", "transaction_id",
6418 g_variant_new_byte(service->tran_id));
6419 if (service->service_type != NULL)
6420 g_variant_builder_add(builder, "{sv}", "svc_str",
6421 g_variant_new_string(service->service_type));
6423 if (service->service_info != NULL)
6424 g_variant_builder_add(builder, "{sv}", "svc_info",
6425 g_variant_new_string(service->service_info));
6427 value = g_variant_new("(a{sv})", builder);
6428 g_variant_builder_unref(builder);
6430 DEBUG_G_VARIANT("Params : ", value);
6432 params.params = value;
6433 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE,
6434 __get_asp_search_id, service);
6437 __ws_add_seek(service);
6441 WDP_LOGE("Failed to send command to wpa_supplicant");
6443 WDP_LOGD("Succeeded to seek service");
6445 __WDP_LOG_FUNC_EXIT__;
6449 int ws_cancel_seek_service(wfd_oem_asp_service_s *service)
6451 __WDP_LOG_FUNC_ENTER__;
6452 GDBusConnection *g_dbus = NULL;
6453 wfd_oem_asp_service_s *seek = NULL;
6454 dbus_method_param_s params;
6457 g_dbus = g_pd->g_dbus;
6459 WDP_LOGE("DBus connection is NULL");
6460 __WDP_LOG_FUNC_EXIT__;
6464 seek = __ws_get_seek(service->search_id);
6466 WDP_LOGE("seek data is NULL");
6467 __WDP_LOG_FUNC_EXIT__;
6471 if (seek->service_info) {
6473 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6474 dbus_set_method_param(¶ms, "ServiceDiscoveryCancelRequest",
6475 g_pd->iface_path, g_dbus);
6477 params.params = g_variant_new("(t)", service->search_id);
6479 DEBUG_G_VARIANT("Params : ", params.params);
6481 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
6483 WDP_LOGE("Failed to send command to wpa_supplicant");
6485 WDP_LOGD("Succeeded to cancel seek service");
6488 __ws_remove_seek(seek);
6490 __WDP_LOG_FUNC_EXIT__;
6494 int ws_asp_prov_disc_req(wfd_oem_asp_prov_s *asp_params)
6496 __WDP_LOG_FUNC_ENTER__;
6497 GDBusConnection *g_dbus = NULL;
6498 GVariantBuilder *builder = NULL;
6499 GVariantBuilder *mac_builder = NULL;
6500 GVariant *value = NULL;
6501 dbus_method_param_s params;
6502 static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
6503 int config_method = 0x1000;
6508 WDP_LOGE("Invalid parameter");
6509 __WDP_LOG_FUNC_EXIT__;
6512 g_dbus = g_pd->g_dbus;
6514 WDP_LOGE("DBus connection is NULL");
6515 __WDP_LOG_FUNC_EXIT__;
6519 if (asp_params->network_config == WFD_OEM_ASP_WPS_TYPE_PIN_DISPLAY)
6520 config_method = 0x8;
6521 else if (asp_params->network_config == WFD_OEM_ASP_WPS_TYPE_PIN_KEYPAD)
6522 config_method = 0x100;
6524 memset(¶ms, 0x0, sizeof(dbus_method_param_s));
6526 dbus_set_method_param(¶ms, "ASPProvisionDiscoveryRequest", g_pd->iface_path, g_dbus);
6528 g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
6529 COMPACT_MACSTR, g_pd->iface_path, MAC2STR(asp_params->service_mac));
6530 WDP_LOGD("get peer path [%s]", peer_path);
6532 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
6533 g_variant_builder_add(builder, "{sv}", "peer", g_variant_new_object_path(peer_path));
6535 g_variant_builder_add(builder, "{sv}", "adv_id", g_variant_new_uint32(asp_params->adv_id));
6536 g_variant_builder_add(builder, "{sv}", "session_id", g_variant_new_uint32(asp_params->session_id));
6537 g_variant_builder_add(builder, "{sv}", "role", g_variant_new_byte(asp_params->network_role));
6538 g_variant_builder_add(builder, "{sv}", "method", g_variant_new_int32(config_method));
6539 if (asp_params->status > 0)
6540 g_variant_builder_add(builder, "{sv}", "status", g_variant_new_int32(asp_params->status));
6541 if (asp_params->session_information)
6542 g_variant_builder_add(builder, "{sv}", "info", g_variant_new_string(asp_params->session_information));
6544 mac_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
6545 for (i = 0; i < OEM_MACADDR_LEN; i++)
6546 g_variant_builder_add(mac_builder, "y", asp_params->service_mac[i]);
6547 g_variant_builder_add(builder, "{sv}", "adv_mac",
6548 g_variant_new("ay", mac_builder));
6549 g_variant_builder_unref(mac_builder);
6551 mac_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
6552 for (i = 0; i < OEM_MACADDR_LEN; i++)
6553 g_variant_builder_add(mac_builder, "y", asp_params->session_mac[i]);
6554 g_variant_builder_add(builder, "{sv}", "session_mac",
6555 g_variant_new("ay", mac_builder));
6556 g_variant_builder_unref(mac_builder);
6558 value = g_variant_new("(a{sv})", builder);
6559 g_variant_builder_unref(builder);
6560 DEBUG_G_VARIANT("Params : ", value);
6562 params.params = value;
6564 res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
6566 WDP_LOGE("Failed to send command to wpa_supplicant");
6568 WDP_LOGD("Succeeded to send connection command to peer[" MACSTR "]", MAC2STR(asp_params->service_mac));
6570 __WDP_LOG_FUNC_EXIT__;
6573 #endif /* TIZEN_FEATURE_ASP */