[wifi-direct-manager] Replaced Socket IPC with DBUS IPC between Library<->Manager 87/61187/2 accepted/tizen/common/20160308.142856 submit/tizen/20160308.040435
authorNishant Chaprana <n.chaprana@samsung.com>
Fri, 4 Mar 2016 12:30:01 +0000 (18:00 +0530)
committerNishant Chaprana <n.chaprana@samsung.com>
Tue, 8 Mar 2016 03:21:38 +0000 (08:51 +0530)
Change-Id: Icc3ce443ad74655584a7bb35d8713d94fcc9c10d
Signed-off-by: Nishant Chaprana <n.chaprana@samsung.com>
24 files changed:
CMakeLists.txt
files/common/wfd-manager.conf [new file with mode: 0644]
include/wifi-direct-client.h [deleted file]
include/wifi-direct-dbus.h [new file with mode: 0644]
include/wifi-direct-error.h [new file with mode: 0644]
include/wifi-direct-iface.h [new file with mode: 0644]
include/wifi-direct-ipc.h
include/wifi-direct-log.h [new file with mode: 0644]
include/wifi-direct-manager.h
include/wifi-direct-state.h
include/wifi-direct-util.h
packaging/wifi-direct-manager.spec
src/wifi-direct-client.c [deleted file]
src/wifi-direct-dbus.c [new file with mode: 0644]
src/wifi-direct-error.c [new file with mode: 0644]
src/wifi-direct-event.c
src/wifi-direct-group.c
src/wifi-direct-iface.c [new file with mode: 0644]
src/wifi-direct-manager.c
src/wifi-direct-peer.c
src/wifi-direct-service.c
src/wifi-direct-session.c
src/wifi-direct-state.c
src/wifi-direct-util.c

index dcdce30..6f1265b 100755 (executable)
@@ -71,12 +71,14 @@ ENDIF(CTRL_IFACE_DBUS)
 SET(SRCS
        ${CMAKE_SOURCE_DIR}/src/wifi-direct-manager.c
        ${CMAKE_SOURCE_DIR}/src/wifi-direct-state.c
-       ${CMAKE_SOURCE_DIR}/src/wifi-direct-client.c
        ${CMAKE_SOURCE_DIR}/src/wifi-direct-peer.c
        ${CMAKE_SOURCE_DIR}/src/wifi-direct-group.c
        ${CMAKE_SOURCE_DIR}/src/wifi-direct-session.c
        ${CMAKE_SOURCE_DIR}/src/wifi-direct-event.c
        ${CMAKE_SOURCE_DIR}/src/wifi-direct-util.c
+       ${CMAKE_SOURCE_DIR}/src/wifi-direct-dbus.c
+       ${CMAKE_SOURCE_DIR}/src/wifi-direct-error.c
+       ${CMAKE_SOURCE_DIR}/src/wifi-direct-iface.c
        ${CMAKE_SOURCE_DIR}/oem/wifi-direct-oem.c
        )
 
@@ -94,6 +96,7 @@ INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/common/wifi-direct-server.sh DESTINATION
 INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/common/p2p_supp.sh DESTINATION sbin)
 INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/common/ccode.conf DESTINATION etc/wifi-direct)
 INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/common/persistent-peer DESTINATION /opt/etc)
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/common/wfd-manager.conf DESTINATION /etc/dbus-1/system.d)
 IF(TIZEN_TV)
        IF(TIZEN_WIFI_MODULE_BUNDLE)
                INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/bundle/p2p_supp.conf DESTINATION etc/wifi-direct)
diff --git a/files/common/wfd-manager.conf b/files/common/wfd-manager.conf
new file mode 100644 (file)
index 0000000..b4c446c
--- /dev/null
@@ -0,0 +1,15 @@
+<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+       "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+       <policy user="root">
+               <allow own="net.wifidirect"/>
+               <allow send_destination="net.wifidirect"/>
+       </policy>
+       <policy context="default">
+               <check send_destination="net.wifidirect" send_interface="net.wifidirect" privilege="http://tizen.org/feature/network.wifi.direct" />
+               <check send_destination="net.wifidirect" send_interface="net.wifidirect.group" privilege="http://tizen.org/feature/network.wifi.direct" />
+               <check send_destination="net.wifidirect" send_interface="net.wifidirect.config" privilege="http://tizen.org/feature/network.wifi.direct" />
+               <check send_destination="net.wifidirect" send_interface="net.wifidirect.service" privilege="http://tizen.org/feature/network.wifi.direct.service_discovery" />
+               <check send_destination="net.wifidirect" send_interface="net.wifidirect.display" privilege="http://tizen.org/feature/network.wifi.direct.display" />
+       </policy>
+</busconfig>
diff --git a/include/wifi-direct-client.h b/include/wifi-direct-client.h
deleted file mode 100644 (file)
index c171a78..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Network Configuration Module
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-/**
- * This file declares wifi direct client functions and structures.
- *
- * @file               wifi-direct-client.h
- * @author     Gibyoung Kim (lastkgb.kim@samsung.com)
- * @version    0.7
- */
-
-#ifndef __WIFI_DIRECT_CLIENT_H__
-#define __WIFI_DIRECT_CLIENT_H__
-
-#define WFD_SERVER_SOCK_PATH "/tmp/wfd_client_socket"
-#define WFD_SERVER_SOCK_MODE (S_IRWXU | S_IRWXG | S_IRWXO)
-#define WFD_MAX_CLIENT 16
-#define WFD_CLIENT_PENDING_SOCKET -999
-
-#define SOCK_FD_MIN 3
-#define WFD_POLL_TIMEOUT 2000
-
-#define WFD_PRIVILEGE "http://tizen.org/privilege/wifidirect"
-
-typedef struct {
-       int ssock;
-       int asock;
-       int client_id;
-       int gsource_id;
-} wfd_client_s;
-
-int wfd_client_handler_deinit(wfd_manager_s *manager);
-int wfd_client_handler_init(wfd_manager_s *manager);
-int wfd_client_send_event(wfd_manager_s *manager, wifi_direct_client_noti_s *noti);
-
-#endif /* __WIFI_DIRECT_CLIENT_H__ */
diff --git a/include/wifi-direct-dbus.h b/include/wifi-direct-dbus.h
new file mode 100644 (file)
index 0000000..90571ed
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file declares wifi direct dbus utility functions.
+ *
+ * @file        wifi-direct-dbus.h
+ * @author      Nishant Chaprana (n.chaprana@samsung.com)
+ * @version     0.1
+ */
+
+#ifndef __WIFI_DIRECT_DBUS_H__
+#define __WIFI_DIRECT_DBUS_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <gio/gio.h>
+
+#define WFD_MANAGER_SERVICE                     "net.wifidirect"
+#define WFD_MANAGER_PATH                        "/net/wifidirect"
+#define WFD_MANAGER_MANAGE_INTERFACE            WFD_MANAGER_SERVICE
+#define WFD_MANAGER_GROUP_INTERFACE             WFD_MANAGER_SERVICE ".group"
+#define WFD_MANAGER_CONFIG_INTERFACE            WFD_MANAGER_SERVICE ".config"
+#define WFD_MANAGER_SERVICE_INTERFACE           WFD_MANAGER_SERVICE ".service"
+#define WFD_MANAGER_DISPLAY_INTERFACE           WFD_MANAGER_SERVICE ".display"
+
+#define WFD_MANAGER_DBUS_REPLY_TIMEOUT          10 * 1000
+#define WFD_MANAGER_DBUS_REPLY_TIMEOUT_SYNC     10 * 1000
+#define DBUS_OBJECT_PATH_MAX                    150
+
+#define DBUS_DEBUG_VARIANT(parameters) \
+       do {\
+               gchar *parameters_debug_str = NULL;\
+               if (parameters)\
+                       parameters_debug_str = g_variant_print(parameters, TRUE);\
+               WDS_LOGD("signal params [%s]", parameters_debug_str ? parameters_debug_str : "NULL");\
+               g_free(parameters_debug_str);\
+       } while (0)
+
+gboolean wfd_manager_dbus_init(void);
+
+void wfd_manager_dbus_deinit(void);
+
+guint wfd_manager_dbus_iface_register(const gchar* iface_name,
+                                     const gchar* iface_path,
+                                     const gchar *xml_data,
+                                     const GDBusInterfaceVTable *interface_vtable);
+
+gboolean wfd_manager_dbus_iface_unregister(guint reg_id);
+
+gboolean wfd_manager_dbus_emit_signal(const gchar *interface_name,
+                                     const gchar *signal_name,
+                                     GVariant *parameters);
+
+GVariant* wfd_manager_dbus_pack_ay(const unsigned char *src, int size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __NETCONFIG_NETDBUS_H__ */
diff --git a/include/wifi-direct-error.h b/include/wifi-direct-error.h
new file mode 100644 (file)
index 0000000..c435e4c
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file declares wifi direct manager dbus error functions.
+ *
+ * @file        wifi-direct-error.h
+ * @author      Nishant Chaprana (n.chaprana@samsung.com)
+ * @version     0.1
+ */
+
+#ifndef __WIFI_DIRECT_ERROR_H__
+#define __WIFI_DIRECT_ERROR_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <tizen.h>
+#include <wifi-direct.h>
+
+#define WFD_MANAGER_ERROR_INTERFACE WFD_MANAGER_SERVICE ".Error"
+
+void wfd_error_set_gerror(wifi_direct_error_e error_code, GError **error);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __WIFI_DIRECT_ERROR_H__ */
diff --git a/include/wifi-direct-iface.h b/include/wifi-direct-iface.h
new file mode 100644 (file)
index 0000000..3a83407
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file declares wifi direct dbus interface management functions.
+ *
+ * @file        wifi-direct-iface.h
+ * @author      Nishant Chaprana (n.chaprana@samsung.com)
+ * @version     0.1
+ */
+
+#ifndef __WIFI_DIRECT_IFACE_H__
+#define __WIFI_DIRECT_IFACE_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+gboolean wfd_manager_dbus_register(void);
+void wfd_manager_dbus_unregister(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __WIFI_DIRECT_IFACE_H__ */
index 31c755d..f2bc77a 100755 (executable)
@@ -22,6 +22,8 @@
 #ifndef __WIFI_DIRECT_IPC_H__
 #define __WIFI_DIRECT_IPC_H__
 
+#include "wifi-direct-error.h"
+
 #define true 1
 #define false 0
 
@@ -59,142 +61,128 @@ typedef unsigned int ipv4_addr_t;
 #define VCONFKEY_SUBNET_MASK "memory/private/wifi_direct_manager/p2p_subnet_mask"
 #define VCONFKEY_GATEWAY "memory/private/wifi_direct_manager/p2p_gateway"
 
-typedef enum
-{
-       WIFI_DIRECT_CMD_INVALID,
-       WIFI_DIRECT_CMD_REGISTER,
-       WIFI_DIRECT_CMD_INIT_ASYNC_SOCKET,
-       WIFI_DIRECT_CMD_DEREGISTER,
-       WIFI_DIRECT_CMD_GET_LINK_STATUS,
-       WIFI_DIRECT_CMD_ACTIVATE,
-       WIFI_DIRECT_CMD_DEACTIVATE,
-       WIFI_DIRECT_CMD_START_DISCOVERY,
-       WIFI_DIRECT_CMD_START_DISCOVERY_SPECIFIC_CHANNEL,
-       WIFI_DIRECT_CMD_CANCEL_DISCOVERY,
-       WIFI_DIRECT_CMD_IS_LISTENING_ONLY,      // 10
-       WIFI_DIRECT_CMD_GET_DISCOVERY_RESULT,
-
-       WIFI_DIRECT_CMD_CONNECT,
-       WIFI_DIRECT_CMD_SEND_CONNECT_REQ,
-       WIFI_DIRECT_CMD_CANCEL_CONNECT, // deprecated
-       WIFI_DIRECT_CMD_CANCEL_CONNECTION,
-       WIFI_DIRECT_CMD_REJECT_CONNECTION,
-       WIFI_DIRECT_CMD_DISCONNECT,
-       WIFI_DIRECT_CMD_DISCONNECT_ALL,
-       WIFI_DIRECT_CMD_GET_CONNECTED_PEERS_INFO,
-
-       WIFI_DIRECT_CMD_CREATE_GROUP,   // 20
-       WIFI_DIRECT_CMD_DESTROY_GROUP,
-       WIFI_DIRECT_CMD_IS_GROUPOWNER,
-       WIFI_DIRECT_CMD_IS_AUTONOMOUS_GROUP,
-
-       WIFI_DIRECT_CMD_GET_SSID,
-       WIFI_DIRECT_CMD_SET_SSID,
-       WIFI_DIRECT_CMD_GET_IP_ADDR,
-       WIFI_DIRECT_CMD_GET_MAC_ADDR,
-       WIFI_DIRECT_CMD_GET_CONFIG,
-       WIFI_DIRECT_CMD_SET_CONFIG,
-
-       WIFI_DIRECT_CMD_ACTIVATE_PUSHBUTTON,    // 30
-       WIFI_DIRECT_CMD_SET_WPS_PIN,
-       WIFI_DIRECT_CMD_GET_WPS_PIN,
-       WIFI_DIRECT_CMD_GENERATE_WPS_PIN,
-       WIFI_DIRECT_CMD_SET_WPA,
-       WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE,
-       WIFI_DIRECT_CMD_GET_LOCAL_WPS_MODE,
-       WIFI_DIRECT_CMD_GET_REQ_WPS_MODE,
-       WIFI_DIRECT_CMD_SET_REQ_WPS_MODE,
-
-       WIFI_DIRECT_CMD_SET_GO_INTENT,
-       WIFI_DIRECT_CMD_GET_GO_INTENT,  // 40
-       WIFI_DIRECT_CMD_SET_MAX_CLIENT,
-       WIFI_DIRECT_CMD_GET_MAX_CLIENT,
-       WIFI_DIRECT_CMD_SET_AUTOCONNECTION_MODE,
-       WIFI_DIRECT_CMD_IS_AUTOCONNECTION_MODE,
-       WIFI_DIRECT_CMD_IS_DISCOVERABLE,
-
-       WIFI_DIRECT_CMD_GET_OPERATING_CHANNEL,
-       WIFI_DIRECT_CMD_ACTIVATE_PERSISTENT_GROUP,
-       WIFI_DIRECT_CMD_DEACTIVATE_PERSISTENT_GROUP,
-       WIFI_DIRECT_CMD_IS_PERSISTENT_GROUP_ACTIVATED,
-       WIFI_DIRECT_CMD_GET_PERSISTENT_GROUP_INFO,      // 50
-       WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP,
-       WIFI_DIRECT_CMD_GET_DEVICE_NAME,
-       WIFI_DIRECT_CMD_SET_DEVICE_NAME,
-
-       WIFI_DIRECT_CMD_SET_OEM_LOGLEVEL,
-       WIFI_DIRECT_CMD_GET_PEER_INFO,
-       WIFI_DIRECT_CMD_SET_PASSPHRASE,
-       WIFI_DIRECT_CMD_GET_PASSPHRASE,
-       WIFI_DIRECT_CMD_SET_AUTOCONNECTION_PEER,
-
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
-       WIFI_DIRECT_CMD_REGISTER_LOCAL_SERVICE,
-       WIFI_DIRECT_CMD_DEREGISTER_LOCAL_SERVICE,
-       WIFI_DIRECT_CMD_START_SERVICE_DISCOVERY,
-       WIFI_DIRECT_CMD_CANCEL_SERVICE_DISCOVERY,       //60
-
-       WIFI_DIRECT_CMD_REGISTER_SERVICE,
-       WIFI_DIRECT_CMD_DEREGISTER_SERVICE,
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
-
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
-       WIFI_DIRECT_CMD_INIT_MIRACAST,
-       WIFI_DIRECT_CMD_INIT_DISPLAY,
-       WIFI_DIRECT_CMD_DEINIT_DISPLAY,
-       WIFI_DIRECT_CMD_SET_DISPLAY,
-       WIFI_DIRECT_CMD_SET_DISPLAY_AVAILABILITY,
-       WIFI_DIRECT_CMD_GET_PEER_DISPLAY_TYPE,
-       WIFI_DIRECT_CMD_GET_PEER_DISPLAY_AVAILABILITY,
-       WIFI_DIRECT_CMD_GET_PEER_DISPLAY_HDCP,
-       WIFI_DIRECT_CMD_GET_PEER_DISPLAY_PORT,
-       WIFI_DIRECT_CMD_GET_PEER_DISPLAY_THROUGHPUT,
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
-
-
-
-       WIFI_DIRECT_CMD_MAX
-} wifi_direct_cmd_e;
-
 /**
- * Wi-Fi Direct client event for IPC
+ * Wi-Fi Direct connection state
  */
-typedef enum
-{
-       WIFI_DIRECT_CLI_EVENT_INVALID = -1,                                     /**< */
-
-       WIFI_DIRECT_CLI_EVENT_ACTIVATION,                                               /**< */
-       WIFI_DIRECT_CLI_EVENT_DEACTIVATION,                                     /**< */
-
-       WIFI_DIRECT_CLI_EVENT_DISCOVER_START,                           /**< 80211 scan*/
-       WIFI_DIRECT_CLI_EVENT_DISCOVER_START_LISTEN_ONLY,       /**< listen only mode*/
-       WIFI_DIRECT_CLI_EVENT_DISCOVER_START_SEARCH_LISTEN,     /**< search, listen*/
-       WIFI_DIRECT_CLI_EVENT_DISCOVER_END,                                     /**< */
-       WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS,                     /**< */
-       WIFI_DIRECT_CLI_EVENT_DISCOVER_LOST_PEERS,                      /**< */
+typedef enum {
+       WFD_EVENT_CONNECTION_REQ,  /**< Connection is requested */
+       WFD_EVENT_CONNECTION_WPS_REQ,  /**< WPS is requested */
+       WFD_EVENT_CONNECTION_IN_PROGRESS,  /**< Connection in progress */
+       WFD_EVENT_CONNECTION_RSP,  /**< Connected */
+       WFD_EVENT_DISASSOCIATION_IND,  /**< Disconnected by remote Group Client */
+       WFD_EVENT_DISCONNECTION_RSP,  /**< Disconnected by local device */
+       WFD_EVENT_DISCONNECTION_IND,  /**< Disconnected by remote Group Owner */
+       WFD_EVENT_GROUP_CREATED,  /**< Group is created */
+       WFD_EVENT_GROUP_DESTROYED,  /**< Group is destroyed */
+} wfd_connection_event_e;
 
-       WIFI_DIRECT_CLI_EVENT_CONNECTION_START,                         /**< */
-       WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ,                           /**< */
-       WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP,                           /**< */
-       WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ,                       /**< */
+/**
+ * @brief Enumeration for Wi-Fi Direct secondary device type.
+ * @since_tizen 2.3
+ */
+typedef enum {
+       WFD_SECONDARY_DEVICE_TYPE_COMPUTER_PC = 1,  /**< PC */
+       WFD_SECONDARY_DEVICE_TYPE_COMPUTER_SERVER = 2,  /**< Server */
+       WFD_SECONDARY_DEVICE_TYPE_COMPUTER_MEDIA_CENTER = 3,  /**< Media Center */
+       WFD_SECONDARY_DEVICE_TYPE_COMPUTER_UMPC = 4,  /**< UMPC */
+       WFD_SECONDARY_DEVICE_TYPE_COMPUTER_NOTEBOOK = 5,  /**< Notebook */
+       WFD_SECONDARY_DEVICE_TYPE_COMPUTER_DESKTOP = 6,  /**< Desktop */
+       WFD_SECONDARY_DEVICE_TYPE_COMPUTER_MID = 7,  /**< MID */
+       WFD_SECONDARY_DEVICE_TYPE_COMPUTER_NETBOOK = 8,  /**< Netbook */
+       WFD_SECONDARY_DEVICE_TYPE_INPUT_KEYBOARD = 1,  /**< Keyboard */
+       WFD_SECONDARY_DEVICE_TYPE_INPUT_MOUSE = 2,  /**< Mouse */
+       WFD_SECONDARY_DEVICE_TYPE_INPUT_JOYSTICK = 3,  /**< Joystick */
+       WFD_SECONDARY_DEVICE_TYPE_INPUT_TRACKBALL = 4,  /**< Trackball */
+       WFD_SECONDARY_DEVICE_TYPE_INPUT_CONTROLLER = 5,  /**< Controller */
+       WFD_SECONDARY_DEVICE_TYPE_INPUT_REMOTE = 6,  /**< Remote */
+       WFD_SECONDARY_DEVICE_TYPE_INPUT_TOUCHSCREEN = 7,  /**< Touchscreen */
+       WFD_SECONDARY_DEVICE_TYPE_INPUT_BIOMETRIC_READER = 8,  /**< Biometric reader */
+       WFD_SECONDARY_DEVICE_TYPE_INPUT_BARCODE_READER = 9,  /**< Barcode reader */
+       WFD_SECONDARY_DEVICE_TYPE_PRINTER_PRINTER = 1,  /**< Printer */
+       WFD_SECONDARY_DEVICE_TYPE_PRINTER_SCANNER = 2,  /**< Scanner */
+       WFD_SECONDARY_DEVICE_TYPE_PRINTER_FAX = 3,  /**< Fax */
+       WFD_SECONDARY_DEVICE_TYPE_PRINTER_COPIER = 4,  /**< Copier */
+       WFD_SECONDARY_DEVICE_TYPE_PRINTER_ALL_IN_ONE = 5,  /**< All-in-one */
+       WFD_SECONDARY_DEVICE_TYPE_CAMERA_DIGITAL_STILL = 1,  /**< Digital still camera */
+       WFD_SECONDARY_DEVICE_TYPE_CAMERA_VIDEO = 2,  /**< Video camera */
+       WFD_SECONDARY_DEVICE_TYPE_CAMERA_WEBCAM = 3,  /**< Webcam */
+       WFD_SECONDARY_DEVICE_TYPE_CAMERA_SECURITY = 4,     /**< Security camera */
+       WFD_SECONDARY_DEVICE_TYPE_STORAGE_NAS = 1,  /**< NAS */
+       WFD_SECONDARY_DEVICE_TYPE_NETWORK_INFRA_AP = 1,  /**< AP */
+       WFD_SECONDARY_DEVICE_TYPE_NETWORK_INFRA_ROUTER = 2,  /**< Router */
+       WFD_SECONDARY_DEVICE_TYPE_NETWORK_INFRA_SWITCH = 3,  /**< Switch */
+       WFD_SECONDARY_DEVICE_TYPE_NETWORK_INFRA_GATEWAY = 4,  /**< Gateway */
+       WFD_SECONDARY_DEVICE_TYPE_DISPLAY_TV = 1,  /**< TV */
+       WFD_SECONDARY_DEVICE_TYPE_DISPLAY_PIC_FRAME = 2,  /**< Picture frame */
+       WFD_SECONDARY_DEVICE_TYPE_DISPLAY_PROJECTOR = 3,  /**< Projector */
+       WFD_SECONDARY_DEVICE_TYPE_DISPLAY_MONITOR = 4,  /**< Monitor */
+       WFD_SECONDARY_DEVICE_TYPE_MULTIMEDIA_DAR = 1,  /**< DAR */
+       WFD_SECONDARY_DEVICE_TYPE_MULTIMEDIA_PVR = 2,  /**< PVR */
+       WFD_SECONDARY_DEVICE_TYPE_MULTIMEDIA_MCX = 3,  /**< MCX */
+       WFD_SECONDARY_DEVICE_TYPE_MULTIMEDIA_STB = 4,  /**< Set-top box */
+       WFD_SECONDARY_DEVICE_TYPE_MULTIMEDIA_MS_MA_ME = 5,  /**< Media Server / Media Adapter / Media Extender */
+       WFD_SECONDARY_DEVICE_TYPE_MULTIMEDIA_PVP = 6,  /**< Portable video player */
+       WFD_SECONDARY_DEVICE_TYPE_GAME_XBOX = 1,  /**< Xbox */
+       WFD_SECONDARY_DEVICE_TYPE_GAME_XBOX_360 = 2,  /**< Xbox 360 */
+       WFD_SECONDARY_DEVICE_TYPE_GAME_PS = 3,  /**< Playstation */
+       WFD_SECONDARY_DEVICE_TYPE_GAME_CONSOLE = 4,  /**< Console */
+       WFD_SECONDARY_DEVICE_TYPE_GAME_PORTABLE = 5,  /**< Portable */
+       WFD_SECONDARY_DEVICE_TYPE_TELEPHONE_WINDOWS_MOBILE = 1,  /**< Windows Mobile */
+       WFD_SECONDARY_DEVICE_TYPE_TELEPHONE_PHONE_SINGLE = 2,  /**< Phone - single mode */
+       WFD_SECONDARY_DEVICE_TYPE_TELEPHONE_PHONE_DUAL = 3,  /**< Phone - dual mode */
+       WFD_SECONDARY_DEVICE_TYPE_TELEPHONE_SMARTPHONE_SINGLE = 4,  /**< Smart Phone - single mode */
+       WFD_SECONDARY_DEVICE_TYPE_TELEPHONE_SMARTPHONE_DUAL = 5,  /**< Smart Phone - dual mode */
+       WFD_SECONDARY_DEVICE_TYPE_AUDIO_TUNER = 1,  /**< Tuner */
+       WFD_SECONDARY_DEVICE_TYPE_AUDIO_SPEAKER = 2,  /**< Speaker */
+       WFD_SECONDARY_DEVICE_TYPE_AUDIO_PMP = 3, /**< Portable Music Player */
+       WFD_SECONDARY_DEVICE_TYPE_AUDIO_HEADSET = 4,  /**< Headset */
+       WFD_SECONDARY_DEVICE_TYPE_AUDIO_HEADPHONE = 5,  /**< Headphone */
+       WFD_SECONDARY_DEVICE_TYPE_AUDIO_MIC = 6,  /**< Microphone */
+} wfd_secondary_device_type_e;
 
-       WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP,                                /**< */
-       WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND,                                /**< */
-       WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND,                               /**< */
+/**
+ * @brief Enumeration for Wi-Fi Direct primary device type.
+ * @since_tizen 2.3
+ */
+typedef enum {
+       WFD_PRIMARY_DEVICE_TYPE_COMPUTER = 1,  /**< Computer */
+       WFD_PRIMARY_DEVICE_TYPE_INPUT_DEVICE = 2,  /**< Input device */
+       WFD_PRIMARY_DEVICE_TYPE_PRINTER = 3,  /**< Printer */
+       WFD_PRIMARY_DEVICE_TYPE_CAMERA = 4,  /**< Camera */
+       WFD_PRIMARY_DEVICE_TYPE_STORAGE = 5,  /**< Storage */
+       WFD_PRIMARY_DEVICE_TYPE_NETWORK_INFRA = 6,  /**< Network Infrastructure */
+       WFD_PRIMARY_DEVICE_TYPE_DISPLAY = 7,  /**< Display */
+       WFD_PRIMARY_DEVICE_TYPE_MULTIMEDIA_DEVICE = 8,  /**< Multimedia device */
+       WFD_PRIMARY_DEVICE_TYPE_GAME_DEVICE = 9,  /**< Game device */
+       WFD_PRIMARY_DEVICE_TYPE_TELEPHONE = 10,  /**< Telephone */
+       WFD_PRIMARY_DEVICE_TYPE_AUDIO = 11,  /**< Audio */
+       WFD_PRIMARY_DEVICE_TYPE_OTHER =  255  /**< Others */
+} wfd_primary_device_type_e;
 
-       WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP,                         /**< */
-       WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP,                                /**< */
+/**
+ * @brief Enumeration for Wi-Fi WPS type.
+ * @since_tizen 2.3
+ */
+typedef enum {
+       WFD_WPS_TYPE_NONE = 0x00,  /**< No WPS type */
+       WFD_WPS_TYPE_PBC = 0x01,  /**< Push Button Configuration */
+       WFD_WPS_TYPE_PIN_DISPLAY = 0x02,  /**< Display PIN code */
+       WFD_WPS_TYPE_PIN_KEYPAD = 0x04,  /**< Provide the keypad to input the PIN */
+} wfd_wps_type_e;
 
-       WIFI_DIRECT_CLI_EVENT_IP_LEASED_IND,                            /**< */
 
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
-       WIFI_DIRECT_CLI_EVENT_SERVICE_DISCOVERY_STARTED,
-       WIFI_DIRECT_CLI_EVENT_SERVICE_DISCOVERY_FOUND,
-       WIFI_DIRECT_CLI_EVENT_SERVICE_DISCOVERY_FINISHED,
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
+/**
+ * @brief Enumeration for Wi-Fi Direct Discovery Channel.
+ * @since_tizen 2.3
+ */
+typedef enum {
+       WFD_DISCOVERY_FULL_SCAN = 0,  /**< Scan full channel*/
+       WFD_DISCOVERY_SOCIAL_CHANNEL = 1611,  /**< Scan social channel*/
+       WFD_DISCOVERY_CHANNEL1 = 1,  /**< Scan channel 1*/
+       WFD_DISCOVERY_CHANNEL6 = 6,  /**< Scan channel 6*/
+       WFD_DISCOVERY_CHANNEL11 = 11,  /**< Scan channel 11*/
+} wfd_discovery_channel_e;
 
-       WIFI_DIRECT_CLI_EVENT_MAX,
-} wfd_client_event_e;
 
 /**
  * Wi-Fi Direct configuration data structure for IPC
@@ -203,15 +191,15 @@ typedef struct
 {
        char device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN + 1];
        int channel;
-       wifi_direct_wps_type_e wps_config;
+       wfd_wps_type_e wps_config;
        int max_clients;
-       bool hide_SSID;
+       gboolean hide_SSID;
        int group_owner_intent;
-       bool want_persistent_group;
-       bool listen_only;
-       bool auto_connection;
-       wifi_direct_primary_device_type_e primary_dev_type;
-       wifi_direct_secondary_device_type_e secondary_dev_type;
+       gboolean want_persistent_group;
+       gboolean listen_only;
+       gboolean auto_connection;
+       wfd_primary_device_type_e primary_dev_type;
+       wfd_secondary_device_type_e secondary_dev_type;
 } wfd_config_data_s;
 
 
@@ -224,19 +212,15 @@ typedef struct
        unsigned char mac_address[6];
        unsigned char intf_address[6];
        int channel;
-       bool is_connected;
-       bool is_group_owner;
-       bool is_persistent_go;
+       gboolean is_connected;
+       gboolean is_group_owner;
+       gboolean is_persistent_go;
        unsigned int category;
        unsigned int subcategory;
-
        unsigned int services;
-
        unsigned int wps_device_pwd_id;
        unsigned int wps_cfg_methods;
-
-       bool is_wfd_device;
-
+       gboolean is_wfd_device;
 } wfd_discovery_entry_s;
 
 
@@ -250,16 +234,14 @@ typedef struct
        unsigned char mac_address[6];
        unsigned char intf_address[6];
        int channel;
-       bool is_p2p;
+       gboolean is_p2p;
        unsigned short category;
        unsigned short subcategory;
-
        unsigned int services;
-
-       bool is_wfd_device;
-
+       gboolean is_wfd_device;
 } wfd_connected_peer_info_s;
 
+
 typedef struct
 {
        int network_id;
@@ -267,42 +249,4 @@ typedef struct
        unsigned char go_mac_address[6];
 } wfd_persistent_group_info_s;
 
-typedef struct
-{
-       int int1;
-       int int2;
-       int int3;
-       unsigned char mac_addr[6];
-} wifi_direct_client_request_data_s;
-
-
-typedef struct
-{
-       wifi_direct_cmd_e cmd;
-       int client_id;
-       unsigned int cmd_data_len;
-       wifi_direct_client_request_data_s data;
-} wifi_direct_client_request_s;
-
-typedef struct
-{
-       wifi_direct_cmd_e cmd;
-       wifi_direct_error_e result;
-       int client_id;
-       int param1;
-       char param2[64];
-       char param3[32];
-       int data_length;
-} wifi_direct_client_response_s;
-
-typedef struct
-{
-       wfd_client_event_e event;
-       wifi_direct_error_e error;
-       int type;
-       char param1[64];
-       char param2[256];
-} wifi_direct_client_noti_s;
-
-
 #endif /* __WIFI_DIRECT_IPC_H__ */
diff --git a/include/wifi-direct-log.h b/include/wifi-direct-log.h
new file mode 100644 (file)
index 0000000..e36616a
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file declares macros for logging.
+ *
+ * @file       wifi-direct-log.h
+ * @author     Nishant Chaprana (n.chaprana@samsung.com)
+ * @version    0.1
+ */
+
+#ifndef __WIFI_DIRECT_LOG_H__
+#define __WIFI_DIRECT_LOG_H__
+
+#ifdef USE_DLOG
+#include <dlog.h>
+
+#undef LOG_TAG
+#define LOG_TAG "WIFI_DIRECT_MANAGER"
+
+#define WDS_LOGV(format, args...) LOGV(format, ##args)
+#define WDS_LOGD(format, args...) LOGD(format, ##args)
+#define WDS_LOGI(format, args...) LOGI(format, ##args)
+#define WDS_LOGW(format, args...) LOGW(format, ##args)
+#define WDS_LOGE(format, args...) LOGE(format, ##args)
+#define WDS_LOGF(format, args...) LOGF(format, ##args)
+
+#define __WDS_LOG_FUNC_ENTER__ LOGD("Enter")
+#define __WDS_LOG_FUNC_EXIT__ LOGD("Quit")
+
+#define WDS_SECLOGI(format, args...) SECURE_LOG(LOG_INFO, LOG_TAG, format, ##args)
+#define WDS_SECLOGD(format, args...) SECURE_LOG(LOG_DEBUG, LOG_TAG, format, ##args)
+
+#else /* USE_DLOG */
+
+#define WDS_LOGV(format, args...)
+#define WDS_LOGD(format, args...)
+#define WDS_LOGI(format, args...)
+#define WDS_LOGW(format, args...)
+#define WDS_LOGE(format, args...)
+#define WDS_LOGF(format, args...)
+
+#define __WDS_LOG_FUNC_ENTER__
+#define __WDS_LOG_FUNC_EXIT__
+
+#define WDS_SECLOGI(format, args...)
+#define WDS_SECLOGD(format, args...)
+
+#endif /* USE_DLOG */
+#endif /* __WIFI_DIRECT_LOG_H__ */
index 579ad63..2d99091 100755 (executable)
 #define PASSPHRASE_LEN_MAX 63
 #define PASSPHRASE_LEN_MIN 8
 
-#if 0
-typedef enum {
-       WFD_STATE_DEACTIVATED,
-       WFD_STATE_ACTIVATED,
-       WFD_STATE_IDLE,                 // passive scaning
-       WFD_STATE_SCANNING,             // active scanning
-       WFD_STATE_CONNECTING,
-       WFD_STATE_CONNECTED,
-} wfd_state_e;
-#endif
-
 typedef enum {
        WFD_WPS_MODE_NONE,
        WFD_WPS_MODE_PBC = 0x1,
@@ -114,7 +103,6 @@ typedef enum {
 } wfd_ip_type_e;
 
 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
-
 typedef enum {
        WFD_DISPLAY_TYPE_SOURCE,
        WFD_DISPLAY_TYPE_PRISINK,
@@ -178,13 +166,7 @@ typedef struct {
 typedef struct {
        GMainLoop *main_loop;
 
-       int serv_sock;
-       unsigned int client_handle;     // for accept clients
-       GList *clients;
-       unsigned int client_count;
-
        wifi_direct_state_e state;
-       unsigned int exit_timer;
 
        wfd_device_s *local;
        int go_intent;
@@ -246,5 +228,7 @@ wfd_device_s *wfd_manager_get_peer_by_addr(wfd_manager_s *manager, unsigned char
 int wfd_manager_set_display_device(int type, int port, int hdcp);
 int wfd_manager_set_session_availability(int availability);
 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+int wfd_manager_start_discovery(wfd_manager_s *manager, int mode, int timeout, const char* type, int channel);
+int wfd_manager_cancel_discovery(wfd_manager_s *manager);
 
 #endif /* __WIFI_DIRECT_MANAGER_H__ */
index 472b47f..4d804ba 100644 (file)
@@ -28,7 +28,6 @@
 #ifndef __WIFI_DIRECT_STATE_H__
 #define __WIFI_DIRECT_STATE_H__
 
-
 int wfd_state_set(wfd_manager_s *manager, int state);
 int wfd_state_get(wfd_manager_s *manager, int *state);
 
index 16ddb0f..196056d 100755 (executable)
 
 #define SOCK_FD_MIN 3
 
-#ifdef USE_DLOG
-#include <dlog.h>
-
-#undef LOG_TAG
-#define LOG_TAG "WIFI_DIRECT_MANAGER"
-
-#define WDS_LOGV(format, args...) LOGV(format, ##args)
-#define WDS_LOGD(format, args...) LOGD(format, ##args)
-#define WDS_LOGI(format, args...) LOGI(format, ##args)
-#define WDS_LOGW(format, args...) LOGW(format, ##args)
-#define WDS_LOGE(format, args...) LOGE(format, ##args)
-#define WDS_LOGF(format, args...) LOGF(format, ##args)
-
-#define __WDS_LOG_FUNC_ENTER__ LOGD("Enter")
-#define __WDS_LOG_FUNC_EXIT__ LOGD("Quit")
-
-#define WDS_SECLOGI(format, args...) SECURE_LOG(LOG_INFO, LOG_TAG, format, ##args)
-#define WDS_SECLOGD(format, args...) SECURE_LOG(LOG_DEBUG, LOG_TAG, format, ##args)
-
-#else /* USE_DLOG */
-
-#define WDS_LOGV(format, args...)
-#define WDS_LOGD(format, args...)
-#define WDS_LOGI(format, args...)
-#define WDS_LOGW(format, args...)
-#define WDS_LOGE(format, args...)
-#define WDS_LOGF(format, args...)
-
-#define __WDS_LOG_FUNC_ENTER__
-#define __WDS_LOG_FUNC_EXIT__
-
-#define WDS_SECLOGI(format, args...)
-#define WDS_SECLOGD(format, args...)
-
-#endif /* USE_DLOG */
-
 #if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
 int wfd_util_get_current_time(unsigned long *cur_time);
 #endif
index d65b0ea..8d199ed 100755 (executable)
@@ -1,6 +1,6 @@
 Name:          wifi-direct-manager
 Summary:       Wi-Fi Direct manger
-Version:       1.2.139
+Version:       1.2.140
 Release:       1
 Group:      Network & Connectivity/Wireless
 License:    Apache-2.0
@@ -26,7 +26,7 @@ Requires: toybox-symlinks-dhcpd
 Requires: toybox-symlinks-dhcp
 
 %description
-Wi-Fi Direct manager
+Manager for handling wifi-direct functionalities
 
 %package -n wifi-direct-plugin-wpasupplicant
 Summary:    Wifi direct plugin for wpa supplicant
@@ -34,14 +34,14 @@ Group:      Network & Connectivity/Wireless
 Requires:   %{name} = %{version}-%{release}
 
 %description -n wifi-direct-plugin-wpasupplicant
-Wifi direct plugin for wpa supplicant
+Wi-Fi direct manager plugin to abstract wpa_supplicant
 
 
 %prep
 %setup -q
+chmod 644 %{SOURCE0}
 
 %build
-
 export CFLAGS="$CFLAGS -DTIZEN_DEBUG_ENABLE"
 export CXXFLAGS="$CXXFLAGS -DTIZEN_DEBUG_ENABLE"
 export FFLAGS="$FFLAGS -DTIZEN_DEBUG_ENABLE"
@@ -104,8 +104,6 @@ make %{?_smp_mflags}
 rm -rf %{buildroot}
 
 %make_install
-#%__strip %{buildroot}%{_libdir}/wifi-direct-plugin-wpasupplicant.so
-#%__strip %{buildroot}%{_bindir}/wfd-manager
 
 #License
 mkdir -p %{buildroot}%{_datadir}/license
@@ -149,6 +147,7 @@ chmod 755 /usr/sbin/p2p_supp.sh
 /opt/etc/p2p_supp.conf
 /usr/etc/wifi-direct/ccode.conf
 /opt/etc/persistent-peer
+%config %{_sysconfdir}/dbus-1/system.d/*.conf
 %{_bindir}/dhcpd-notify.sh
 %{_bindir}/wifi-direct-server.sh
 %{_bindir}/wifi-direct-dhcp.sh
@@ -157,6 +156,7 @@ chmod 755 /usr/sbin/p2p_supp.sh
 %attr(755,-,-) %{_bindir}/wifi-direct-server.sh
 %attr(755,-,-) %{_bindir}/wifi-direct-dhcp.sh
 %attr(755,-,-) /usr/etc/wifi-direct/udhcp_script.non-autoip
+%attr(644,-,-) %{_sysconfdir}/dbus-1/system.d/*.conf
 %attr(755,-,-) %{_sbindir}/p2p_supp.sh
 %attr(644,-,-) %{_datadir}/license/%{name}
 
diff --git a/src/wifi-direct-client.c b/src/wifi-direct-client.c
deleted file mode 100755 (executable)
index 4da1ac8..0000000
+++ /dev/null
@@ -1,2262 +0,0 @@
-/*
- * Network Configuration Module
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-/**
- * This file implements wifi direct client functions.
- *
- * @file               wifi-direct-client.c
- * @author     Gibyoung Kim (lastkgb.kim@samsung.com)
- * @version    0.7
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <sys/un.h>
-#include <poll.h>
-#include <unistd.h>
-#include <errno.h>
-
-#include <glib.h>
-#include <vconf.h>
-
-#include <wifi-direct.h>
-#include <cynara-client.h>
-#include <cynara-creds-socket.h>
-#include <cynara-session.h>
-
-
-#include "wifi-direct-ipc.h"
-#include "wifi-direct-manager.h"
-#include "wifi-direct-oem.h"
-#include "wifi-direct-session.h"
-#include "wifi-direct-group.h"
-#include "wifi-direct-client.h"
-#include "wifi-direct-util.h"
-#include "wifi-direct-state.h"
-#include "wifi-direct-peer.h"
-
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
-#include "wifi-direct-service.h"
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
-
-static cynara *wfd_cynara_handle = NULL;
-
-static int _wfd_deregister_client(void *data, int client_id);
-static gboolean wfd_client_process_request(GIOChannel *source,
-                                                                       GIOCondition condition,
-                                                                       gpointer user_data);
-
-static int _wfd_check_client_privilege(int client_sock, int cmd);
-
-char *wfd_server_print_cmd(wifi_direct_cmd_e cmd)
-{
-       switch (cmd)
-       {
-       case WIFI_DIRECT_CMD_REGISTER:
-               return "WIFI_DIRECT_CMD_REGISTER";
-       case WIFI_DIRECT_CMD_INIT_ASYNC_SOCKET:
-               return "WIFI_DIRECT_CMD_INIT_ASYNC_SOCKET";
-       case WIFI_DIRECT_CMD_DEREGISTER:
-               return "WIFI_DIRECT_CMD_DEREGISTER";
-       case WIFI_DIRECT_CMD_ACTIVATE:
-               return "WIFI_DIRECT_CMD_ACTIVATE";
-       case WIFI_DIRECT_CMD_DEACTIVATE:
-               return "WIFI_DIRECT_CMD_DEACTIVATE";
-       case WIFI_DIRECT_CMD_START_DISCOVERY:
-               return "WIFI_DIRECT_CMD_START_DISCOVERY";
-       case WIFI_DIRECT_CMD_START_DISCOVERY_SPECIFIC_CHANNEL:
-               return "WIFI_DIRECT_CMD_START_DISCOVERY_SPECIFIC_CHANNEL";
-       case WIFI_DIRECT_CMD_CANCEL_DISCOVERY:
-               return "WIFI_DIRECT_CMD_CANCEL_DISCOVERY";
-       case WIFI_DIRECT_CMD_GET_DISCOVERY_RESULT:
-               return "WIFI_DIRECT_CMD_GET_DISCOVERY_RESULT";
-       case WIFI_DIRECT_CMD_GET_LINK_STATUS:
-               return "WIFI_DIRECT_CMD_GET_LINK_STATUS";
-       case WIFI_DIRECT_CMD_CONNECT:
-               return "WIFI_DIRECT_CMD_CONNECT";
-       case WIFI_DIRECT_CMD_CANCEL_CONNECTION:
-               return "WIFI_DIRECT_CMD_CANCEL_CONNECTION";
-       case WIFI_DIRECT_CMD_REJECT_CONNECTION:
-               return "WIFI_DIRECT_CMD_REJECT_CONNECTION";
-
-       case WIFI_DIRECT_CMD_DISCONNECT_ALL:
-               return "WIFI_DIRECT_CMD_DISCONNECT_ALL";
-       case WIFI_DIRECT_CMD_CREATE_GROUP:
-               return "WIFI_DIRECT_CMD_CREATE_GROUP";
-       case WIFI_DIRECT_CMD_IS_GROUPOWNER:
-               return "WIFI_DIRECT_CMD_IS_GROUPOWNER";
-       case WIFI_DIRECT_CMD_GET_SSID:
-               return "WIFI_DIRECT_CMD_GET_SSID";
-       case WIFI_DIRECT_CMD_SET_SSID:
-               return "WIFI_DIRECT_CMD_SET_SSID";
-       case WIFI_DIRECT_CMD_GET_IP_ADDR:
-               return "WIFI_DIRECT_CMD_GET_IP_ADDR";
-       case WIFI_DIRECT_CMD_GET_CONFIG:
-               return "WIFI_DIRECT_CMD_GET_CONFIG";
-       case WIFI_DIRECT_CMD_SET_CONFIG:
-               return "WIFI_DIRECT_CMD_SET_CONFIG";
-       case WIFI_DIRECT_CMD_SEND_CONNECT_REQ:
-               return "WIFI_DIRECT_CMD_SEND_CONNECT_REQ";
-
-       case WIFI_DIRECT_CMD_ACTIVATE_PUSHBUTTON:
-               return "WIFI_DIRECT_CMD_ACTIVATE_PUSHBUTTON";
-       case WIFI_DIRECT_CMD_SET_WPS_PIN:
-               return "WIFI_DIRECT_CMD_SET_WPS_PIN";
-       case WIFI_DIRECT_CMD_GET_WPS_PIN:
-               return "WIFI_DIRECT_CMD_GET_WPS_PIN";
-       case WIFI_DIRECT_CMD_GENERATE_WPS_PIN:
-               return "WIFI_DIRECT_CMD_GENERATE_WPS_PIN";
-       case WIFI_DIRECT_CMD_SET_WPA:
-               return "WIFI_DIRECT_CMD_SET_WPA";
-       case WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE:
-               return "WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE";
-       case WIFI_DIRECT_CMD_GET_LOCAL_WPS_MODE:
-               return "WIFI_DIRECT_CMD_GET_LOCAL_WPS_MODE";
-       case WIFI_DIRECT_CMD_GET_REQ_WPS_MODE:
-               return "WIFI_DIRECT_CMD_GET_REQ_WPS_MODE";
-       case WIFI_DIRECT_CMD_SET_REQ_WPS_MODE:
-               return "WIFI_DIRECT_CMD_SET_REQ_WPS_MODE";
-       case WIFI_DIRECT_CMD_GET_CONNECTED_PEERS_INFO:
-               return "WIFI_DIRECT_CMD_GET_CONNECTED_PEERS_INFO";
-       case WIFI_DIRECT_CMD_DESTROY_GROUP:
-               return "WIFI_DIRECT_CMD_DESTROY_GROUP";
-
-       case WIFI_DIRECT_CMD_DISCONNECT:
-               return "WIFI_DIRECT_CMD_DISCONNECT";
-       case WIFI_DIRECT_CMD_SET_GO_INTENT:
-               return "WIFI_DIRECT_CMD_SET_GO_INTENT";
-       case WIFI_DIRECT_CMD_GET_GO_INTENT:
-               return "WIFI_DIRECT_CMD_GET_GO_INTENT";
-       case WIFI_DIRECT_CMD_GET_MAC_ADDR:
-               return "WIFI_DIRECT_CMD_GET_MAC_ADDR";
-       case WIFI_DIRECT_CMD_IS_AUTONOMOUS_GROUP:
-               return "WIFI_DIRECT_CMD_IS_AUTONOMOUS_GROUP";
-       case WIFI_DIRECT_CMD_SET_MAX_CLIENT:
-               return "WIFI_DIRECT_CMD_SET_MAX_CLIENT";
-       case WIFI_DIRECT_CMD_GET_MAX_CLIENT:
-               return "WIFI_DIRECT_CMD_GET_MAX_CLIENT";
-       case WIFI_DIRECT_CMD_SET_AUTOCONNECTION_MODE:
-               return "WIFI_DIRECT_CMD_SET_AUTOCONNECTION_MODE";
-
-       case WIFI_DIRECT_CMD_IS_AUTOCONNECTION_MODE:
-               return "WIFI_DIRECT_CMD_IS_AUTOCONNECTION_MODE";
-       case WIFI_DIRECT_CMD_IS_DISCOVERABLE:
-               return "WIFI_DIRECT_CMD_IS_DISCOVERABLE";
-       case WIFI_DIRECT_CMD_IS_LISTENING_ONLY:
-               return "WIFI_DIRECT_CMD_IS_LISTENING_ONLY";
-       case WIFI_DIRECT_CMD_GET_OPERATING_CHANNEL:
-               return "WIFI_DIRECT_CMD_GET_OPERATING_CHANNEL";
-       case WIFI_DIRECT_CMD_ACTIVATE_PERSISTENT_GROUP:
-               return "WIFI_DIRECT_CMD_ACTIVATE_PERSISTENT_GROUP";
-       case WIFI_DIRECT_CMD_DEACTIVATE_PERSISTENT_GROUP:
-               return "WIFI_DIRECT_CMD_DEACTIVATE_PERSISTENT_GROUP";
-       case WIFI_DIRECT_CMD_IS_PERSISTENT_GROUP_ACTIVATED:
-               return "WIFI_DIRECT_CMD_IS_PERSISTENT_GROUP_ACTIVATED";
-       case WIFI_DIRECT_CMD_GET_PERSISTENT_GROUP_INFO:
-               return "WIFI_DIRECT_CMD_GET_PERSISTENT_GROUP_INFO";
-       case WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP:
-               return "WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP";
-       case WIFI_DIRECT_CMD_GET_DEVICE_NAME:
-               return "WIFI_DIRECT_CMD_GET_DEVICE_NAME";
-
-       case WIFI_DIRECT_CMD_SET_DEVICE_NAME:
-               return "WIFI_DIRECT_CMD_SET_DEVICE_NAME";
-       case WIFI_DIRECT_CMD_SET_OEM_LOGLEVEL:
-               return "WIFI_DIRECT_CMD_SET_OEM_LOGLEVEL";
-       case WIFI_DIRECT_CMD_GET_PEER_INFO:
-               return "WIFI_DIRECT_CMD_GET_PEER_INFO";
-
-       case WIFI_DIRECT_CMD_SET_PASSPHRASE:
-               return "WIFI_DIRECT_CMD_SET_PASSPHRASE";
-       case WIFI_DIRECT_CMD_GET_PASSPHRASE:
-               return "WIFI_DIRECT_CMD_GET_PASSPHRASE";
-       case WIFI_DIRECT_CMD_SET_AUTOCONNECTION_PEER:
-               return "WIFI_DIRECT_CMD_SET_AUTOCONNECTION_PEER";
-
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
-       case WIFI_DIRECT_CMD_REGISTER_LOCAL_SERVICE:
-               return "WIFI_DIRECT_CMD_REGISTER_LOCAL_SERVICE";
-       case WIFI_DIRECT_CMD_DEREGISTER_LOCAL_SERVICE:
-               return "WIFI_DIRECT_CMD_DEREGISTER_LOCAL_SERVICE";
-       case WIFI_DIRECT_CMD_START_SERVICE_DISCOVERY:
-               return "WIFI_DIRECT_CMD_START_SERVICE_DISCOVERY";
-       case WIFI_DIRECT_CMD_CANCEL_SERVICE_DISCOVERY:
-               return "WIFI_DIRECT_CMD_CANCEL_SERVICE_DISCOVERY";
-       case WIFI_DIRECT_CMD_REGISTER_SERVICE:
-               return "WIFI_DIRECT_CMD_REGISTER_SERVICE";
-       case WIFI_DIRECT_CMD_DEREGISTER_SERVICE:
-               return "WIFI_DIRECT_CMD_DEREGISTER_SERVICE";
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
-
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
-       case WIFI_DIRECT_CMD_INIT_MIRACAST:
-               return "WIFI_DIRECT_CMD_INIT_MIRACAST";
-       case WIFI_DIRECT_CMD_INIT_DISPLAY:
-               return "WIFI_DIRECT_CMD_INIT_DISPLAY";
-       case WIFI_DIRECT_CMD_DEINIT_DISPLAY:
-               return "WIFI_DIRECT_CMD_DEINIT_DISPLAY";
-       case WIFI_DIRECT_CMD_SET_DISPLAY:
-               return "WIFI_DIRECT_CMD_SET_DISPLAY";
-       case WIFI_DIRECT_CMD_SET_DISPLAY_AVAILABILITY:
-               return "WIFI_DIRECT_CMD_SET_DISPLAY_AVAILABILITY";
-       case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_TYPE:
-               return "WIFI_DIRECT_CMD_GET_PEER_DISPLAY_TYPE";
-       case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_AVAILABILITY:
-               return "WIFI_DIRECT_CMD_GET_PEER_DISPLAY_AVAILABILITY";
-       case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_HDCP:
-               return "WIFI_DIRECT_CMD_GET_PEER_DISPLAY_HDCP";
-       case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_PORT:
-               return "WIFI_DIRECT_CMD_GET_PEER_DISPLAY_PORT";
-       case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_THROUGHPUT:
-               return "WIFI_DIRECT_CMD_GET_PEER_DISPLAY_THROUGHPUT";
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
-
-       default:
-               return "WIFI_DIRECT_CMD_INVALID";
-
-       }
-}
-
-static wfd_client_s *_wfd_client_find_by_id(GList *clients, int client_id)
-{
-       __WDS_LOG_FUNC_ENTER__;
-       wfd_client_s *client = NULL;
-       GList *temp = NULL;
-
-       if (!clients || client_id < 0) {
-               WDS_LOGE("Invalid parameter(client_id:%d)", client_id);
-               __WDS_LOG_FUNC_EXIT__;
-               return NULL;
-       }
-
-       temp = g_list_first(clients);
-       while (temp) {
-               client = (wfd_client_s*) temp->data;
-               if (client->client_id == client_id) {
-                       WDS_LOGD("Client found. [%d]", client_id);
-                       break;
-               }
-               temp = g_list_next(temp);
-               client = NULL;
-       }
-
-       __WDS_LOG_FUNC_EXIT__;
-       return client;
-}
-
-static int _wfd_client_check_socket(int sock)
-{
-       __WDS_LOG_FUNC_ENTER__;
-       struct pollfd p_fd;
-       int res = 0;
-
-       p_fd.fd = sock;
-       p_fd.events = POLLIN | POLLOUT | POLLERR | POLLHUP | POLLNVAL;
-       res = poll((struct pollfd *) &p_fd, 1, 1);
-
-       if (res < 0) {
-               WDS_LOGE("Polling error from socket[%d]. [%s]", sock, strerror(errno));
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       } else if (res == 0) {
-               WDS_LOGD( "poll timeout. socket is busy\n");
-               __WDS_LOG_FUNC_EXIT__;
-               return 1;
-       } else {
-
-               if (p_fd.revents & POLLERR) {
-                       WDS_LOGE("Error! POLLERR from socket[%d]", sock);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return -1;
-               } else if (p_fd.revents & POLLHUP) {
-                       WDS_LOGE("Error! POLLHUP from socket[%d]", sock);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return -1;
-               } else if (p_fd.revents & POLLNVAL) {
-                       WDS_LOGE("Error! POLLNVAL from socket[%d]", sock);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return -1;
-               } else if (p_fd.revents & POLLIN) {
-                       WDS_LOGD("POLLIN from socket [%d]", sock);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return 0;
-               } else if (p_fd.revents & POLLOUT) {
-                       WDS_LOGD("POLLOUT from socket [%d]", sock);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return 0;
-               }
-       }
-
-       WDS_LOGD("Unknown poll event [%d]", p_fd.revents);
-       __WDS_LOG_FUNC_EXIT__;
-       return -1;
-}
-
-static int _wfd_send_to_client(int sock, char *data, int data_len)
-{
-       __WDS_LOG_FUNC_ENTER__;
-       int wbytes = 0;
-       int left_len = data_len;
-       char *ptr = data;
-       int res = 0;
-
-       if (sock < SOCK_FD_MIN || !data || data_len < 0) {
-               WDS_LOGE("Invalid parameter");
-               return -1;
-       }
-
-       res = _wfd_client_check_socket(sock);
-       if (res < 0) {
-               WDS_LOGE("Socket error");
-               return -1;
-       } else if (res > 0) {
-               WDS_LOGE("Socket is busy");
-               return -2;
-       }
-
-       errno = 0;
-       while (left_len) {
-               wbytes = write(sock, ptr, left_len);
-               if (wbytes <= 0) {
-                       WDS_LOGE("Failed to write data into socket[%d]. [error=%s]", sock, strerror(errno));
-                       break;
-               }else if (wbytes < left_len) {
-                       WDS_LOGD("%d bytes left. Continue sending...", left_len - wbytes);
-                       left_len -= wbytes;
-                       ptr += wbytes;
-               } else if (wbytes == left_len) {
-                       WDS_LOGD("Succeeded to write data[%d bytes] into socket [%d]", wbytes, sock);
-                       left_len = 0;
-               } else {
-                       WDS_LOGE("Unknown error occurred. [%s]", strerror(errno));
-                       break;
-               }
-       }
-
-       __WDS_LOG_FUNC_EXIT__;
-       if (left_len)
-               return -1;
-       else
-               return 0;
-}
-
-static int _wfd_read_from_client(int sock, char *data, int data_len)
-{
-       __WDS_LOG_FUNC_ENTER__;
-       int rbytes = 0;
-       int total_rbytes = 0;
-       int res = 0;
-
-       if(sock < SOCK_FD_MIN || !data || data_len <= 0) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       res = _wfd_client_check_socket(sock);
-       if (res < 0) {
-               WDS_LOGE("Socket error");
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       } else if (res > 0) {
-               WDS_LOGE("Socket is busy");
-               __WDS_LOG_FUNC_EXIT__;
-               return -2;
-       }
-
-       while(data_len) {
-               errno = 0;
-               rbytes = read(sock, data, data_len);
-               if (rbytes <= 0) {
-                       WDS_LOGE("Failed to read data from socket[%d]", sock);
-                       return -1;
-               }
-               total_rbytes += rbytes;
-               data += rbytes;
-               data_len -= rbytes;
-       }
-
-       __WDS_LOG_FUNC_EXIT__;
-       return total_rbytes;
-}
-
-int wfd_client_send_event(wfd_manager_s *manager, wifi_direct_client_noti_s *noti)
-{
-       __WDS_LOG_FUNC_ENTER__;
-       int cnt = 0;
-       int res = 0;
-       wfd_client_s *client = NULL;
-       GList *temp = NULL;
-
-       if (!manager || !noti) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       temp = g_list_first(manager->clients);
-       while (temp) {
-               client = temp->data;
-               res = _wfd_send_to_client(client->asock, (char*) noti, sizeof(wifi_direct_client_noti_s));
-               if (res < 0) {
-                       WDS_LOGE("Failed to send Notification[%d] to client [%d]", noti->event, client->client_id);
-                       temp = g_list_next(temp);
-                       _wfd_deregister_client(manager, client->client_id);
-               } else {
-                       WDS_LOGD("Succeeded to send Notification [%d:%d] to client [%d]", noti->event,
-                                                                       noti->error, client->client_id);
-                       temp = g_list_next(temp);
-                       cnt++;
-               }
-               client = NULL;
-       }
-       WDS_LOGD("Notification[%d:%d] sent to %d clients, Not Sent [%d]",
-                                       noti->event, noti->error, cnt, manager->client_count - cnt);
-
-
-       __WDS_LOG_FUNC_EXIT__;
-       return 0;
-}
-
-static int _wfd_register_client(void *data, int sock)
-{
-       __WDS_LOG_FUNC_ENTER__;
-       int rbytes = 0;
-       wifi_direct_client_request_s req;
-       wifi_direct_client_response_s rsp;
-       wfd_manager_s *manager = (wfd_manager_s*) data;
-       wfd_client_s *client = NULL;
-       int res = 0;
-
-       if (sock < SOCK_FD_MIN) {
-               WDS_LOGE("Invalid argument");
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       errno = 0;
-       rbytes = read(sock, (char*) &req, sizeof(wifi_direct_client_request_s));
-       if (rbytes <= 0) {
-               WDS_LOGE("Failed to read socket data from client. [%s]", strerror(errno));
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       if (req.cmd == WIFI_DIRECT_CMD_REGISTER) {
-               // TODO: check validity of command
-               client = _wfd_client_find_by_id(manager->clients, req.client_id);
-               if (client) {
-                       WDS_LOGE("Client already exist. client_id [%d]", sock);
-                       res = WIFI_DIRECT_ERROR_NOT_PERMITTED; // WIFI_DIRECT_ERROR_ALREADY_EXIST
-                       goto send_response;
-               }
-
-               if (_wfd_check_client_privilege(sock, req.cmd) != WIFI_DIRECT_ERROR_NONE) {
-                       rsp.result = WIFI_DIRECT_ERROR_AUTH_FAILED;
-                       goto done;
-               }
-
-               client = (wfd_client_s*) g_try_malloc0(sizeof(wfd_client_s));
-               if (!client) {
-                       WDS_LOGE("Failed to allocate memory");
-                       __WDS_LOG_FUNC_EXIT__;
-                       return -1;
-               }
-               client->client_id = sock;
-               client->ssock = sock;
-               client->asock = WFD_CLIENT_PENDING_SOCKET;
-
-               GIOChannel *gio = NULL;
-               gio = g_io_channel_unix_new(sock);
-               client->gsource_id = g_io_add_watch(gio, G_IO_IN | G_IO_ERR | G_IO_HUP,
-                                                       (GIOFunc) wfd_client_process_request, NULL);
-               g_io_channel_unref(gio);
-
-               manager->clients = g_list_prepend(manager->clients, (gpointer) client);
-               manager->client_count++;
-               WDS_LOGD("Client [%d] is added. %d client alive", client->client_id, manager->client_count);
-
-               res = WIFI_DIRECT_ERROR_NONE;
-               WDS_LOGD("New client[%d] added. Total count [%d]", client->client_id, manager->client_count);
-       } else if (req.cmd == WIFI_DIRECT_CMD_INIT_ASYNC_SOCKET) {
-               client = _wfd_client_find_by_id(manager->clients, req.client_id);
-               if (!client) {
-                       WDS_LOGE("Client not found. client_id[%d]", req.client_id);
-                       res = WIFI_DIRECT_ERROR_NOT_PERMITTED; // WIFI_DIRECT_ERROR_UNKNOWN_CLIENT
-                       goto done;
-               }
-
-               if (_wfd_check_client_privilege(sock, req.cmd) != WIFI_DIRECT_ERROR_NONE) {
-                       res = WIFI_DIRECT_ERROR_AUTH_FAILED;
-                       goto done;
-               }
-
-               client->asock = sock;
-               WDS_LOGD("Async socket[%d] for New client[%d] added.", sock, client->client_id);
-               goto done;
-       } else {
-               WDS_LOGE("Unknown command from client. [%d]", req.cmd);
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-send_response:
-       rsp.cmd = req.cmd;
-       rsp.client_id = client->client_id;
-       rsp.result = res;
-       res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(wifi_direct_client_response_s));
-       if (res < 0) {
-               WDS_LOGE("Failed to send response to client");
-               _wfd_deregister_client(manager, req.client_id);
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-done:
-       __WDS_LOG_FUNC_EXIT__;
-       return 0;
-}
-
-static int _wfd_deregister_client(void *data, int client_id)
-{
-       __WDS_LOG_FUNC_ENTER__;
-       wfd_client_s *client = NULL;
-       wfd_manager_s *manager = (wfd_manager_s*) data;
-
-       client =  _wfd_client_find_by_id(manager->clients, client_id);
-       if (!client) {
-               WDS_LOGE("Failed to find client[%d]", client_id);
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       if (client->asock == WFD_CLIENT_PENDING_SOCKET) {
-               WDS_LOGE("This client[%d] is initializing(pending)...", client->client_id);
-               __WDS_LOG_FUNC_EXIT__;
-               return 1;
-       }
-
-       manager->clients = g_list_remove(manager->clients, client);
-       manager->client_count--;
-       WDS_LOGD("Client [%d] is removed. %d client left", client->client_id, manager->client_count);
-
-       if (client->asock >= SOCK_FD_MIN)
-               close(client->asock);
-       client->asock = -1;
-       if (client->ssock >= SOCK_FD_MIN)
-               close(client->ssock);
-       client->ssock = -1;
-       g_source_remove(client->gsource_id);
-       client->gsource_id = 0;
-
-       g_free(client);
-
-       __WDS_LOG_FUNC_EXIT__;
-       return 0;
-}
-
-static int _wfd_create_server_socket(wfd_manager_s *manager)
-{
-       __WDS_LOG_FUNC_ENTER__;
-       int sock;
-       struct sockaddr_un saddr;
-       int sock_opt = 1;
-       int res = 0;
-
-       if (!manager) {
-               WDS_LOGE("Invalid parameter(NULL)");
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       /* Server socket initialization */
-       unlink(WFD_SERVER_SOCK_PATH);
-
-       errno = 0;
-       sock = socket(AF_UNIX, SOCK_STREAM, 0);
-       if (sock < SOCK_FD_MIN) {
-               WDS_LOGE("Failed to create server socket. [%s]", strerror(errno));
-               if (sock >= 0)
-                       close(sock);
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       errno = 0;
-       res = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &sock_opt, sizeof(sock_opt));
-       if (res == -1) {
-               WDS_LOGE("Failed to set socket option. [%s]", strerror(errno));
-               close(sock);
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       memset(&saddr, 0x00, sizeof(saddr));
-       saddr.sun_family = AF_UNIX;
-       snprintf(saddr.sun_path, sizeof(saddr.sun_path), WFD_SERVER_SOCK_PATH);
-
-       errno = 0;
-       res = bind(sock, (struct sockaddr*) &saddr, sizeof(saddr));
-       if (res == -1) {
-               WDS_LOGE("Failed to bind server socket. [%s]", strerror(errno));
-               close(sock);
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       errno = 0;
-       res = chmod(WFD_SERVER_SOCK_PATH, WFD_SERVER_SOCK_MODE);
-       if (res == -1) {
-               WDS_LOGE("Failed to change mode of server socket file. [%s]", strerror(errno));
-               close(sock);
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       errno = 0;
-       res = listen(sock, WFD_MAX_CLIENT);
-       if (res == -1) {
-               WDS_LOGE("Failed to listen server socket. [%s]", strerror(errno));
-               close(sock);
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       manager->serv_sock = sock;
-       WDS_LOGD("Succeeded to create server socket. [%d]", sock);
-
-       __WDS_LOG_FUNC_EXIT__;
-       return 0;
-}
-
-static gboolean _wfd_accept_client(GIOChannel *source,
-                                  GIOCondition condition,
-                                  gpointer user_data)
-{
-       __WDS_LOG_FUNC_ENTER__;
-       wfd_manager_s *manager = wfd_get_manager();
-       int cli_sock = -1;
-       socklen_t cli_len = 0;
-       int res = 0;
-
-       if (!manager || manager->serv_sock < 0) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
-               return FALSE;
-       }
-
-       errno = 0;
-       cli_sock = accept(manager->serv_sock, NULL, &cli_len);
-       if (cli_sock == -1) {
-               WDS_LOGE("Failed to accept client. [%s]", strerror(errno));
-               __WDS_LOG_FUNC_EXIT__;
-               return FALSE;
-       }
-
-       res = _wfd_register_client(manager, cli_sock);
-       if (res < 0) {
-               WDS_LOGE("Failed to register client.");
-               close(cli_sock);
-               __WDS_LOG_FUNC_EXIT__;
-               return TRUE;
-       }
-
-       __WDS_LOG_FUNC_EXIT__;
-       return TRUE;
-}
-
-int wfd_client_handler_init(wfd_manager_s *manager)
-{
-       __WDS_LOG_FUNC_ENTER__;
-       GList *clients = manager->clients;
-       int res = 0;
-
-       if (clients) {
-               g_list_free(clients);
-               clients = NULL;
-       }
-
-       res = cynara_initialize(&wfd_cynara_handle, NULL);
-       if (res == CYNARA_API_SUCCESS) {
-               WDS_LOGD("cynara handle is successfully initialized.");
-       } else {
-               WDS_LOGE("Failed to initialize cynara handle");
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       res = _wfd_create_server_socket(manager);
-       if (res < 0) {
-               WDS_LOGE("Failed to create server socket");
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       GIOChannel *gio = g_io_channel_unix_new(manager->serv_sock);
-       manager->client_handle = g_io_add_watch(gio, G_IO_IN,
-                                                       (GIOFunc) _wfd_accept_client, NULL);
-       g_io_channel_unref(gio);
-
-       __WDS_LOG_FUNC_EXIT__;
-       return 0;
-}
-
-int wfd_client_handler_deinit(wfd_manager_s *manager)
-{
-       __WDS_LOG_FUNC_ENTER__;
-       GList *temp = NULL;
-       wfd_client_s *client = NULL;
-
-       if (manager->serv_sock >= SOCK_FD_MIN)
-               close(manager->serv_sock);
-       manager->serv_sock = -1;
-       g_source_remove(manager->client_handle);
-       manager->client_handle = 0;
-
-       temp = g_list_first(manager->clients);
-       while(temp) {
-               client = temp->data;
-               if(client != NULL) {
-                       if (client->ssock >= SOCK_FD_MIN)
-                               close(client->ssock);
-                       client->ssock = -1;
-                       if (client->asock >= SOCK_FD_MIN)
-                               close(client->asock);
-                       client->asock = -1;
-                       g_source_remove(client->gsource_id);
-                       client->gsource_id = 0;
-                       g_free(client);
-               }
-               temp = g_list_next(temp);
-       }
-
-       if (manager->clients) {
-               g_list_free(manager->clients);
-               manager->clients = NULL;
-       }
-
-       manager->client_count = 0;
-       manager->clients = NULL;
-
-       cynara_finish(wfd_cynara_handle);
-       wfd_cynara_handle = NULL;
-
-       __WDS_LOG_FUNC_EXIT__;
-       return 0;
-}
-
-static int __wfd_cynara_check(int client_sock, const char *privilege)
-{
-       __WDS_LOG_FUNC_ENTER__;
-
-       char *client_session = NULL;
-       char *clientSmack = NULL;
-       char *uid = NULL;
-       int ret = CYNARA_API_SUCCESS;
-       pid_t pid;
-
-       ret = cynara_creds_socket_get_pid(client_sock, &pid);
-       if (ret == CYNARA_API_SUCCESS) {
-               WDS_LOGD("PID is [%d].", pid);
-       } else {
-               WDS_LOGE("Failed to get pid");
-               __WDS_LOG_FUNC_EXIT__;
-               return ret;
-       }
-
-       ret =  cynara_creds_socket_get_client(client_sock, CLIENT_METHOD_SMACK, &clientSmack);
-       if (ret == CYNARA_API_SUCCESS) {
-               WDS_LOGD("cynara cred is [%s].", clientSmack);
-       } else {
-               WDS_LOGE("Failed to initialize cynara cred");
-               __WDS_LOG_FUNC_EXIT__;
-               return ret;
-       }
-
-       ret =  cynara_creds_socket_get_user(client_sock, USER_METHOD_UID, &uid);
-       if (ret == CYNARA_API_SUCCESS) {
-               WDS_LOGD("cynara UID is [%s].", uid);
-       } else {
-               WDS_LOGE("Failed to initialize cynara UID");
-               free(clientSmack);
-               __WDS_LOG_FUNC_EXIT__;
-               return ret;
-       }
-
-       client_session = cynara_session_from_pid(pid);
-       if(client_session != NULL) {
-               WDS_LOGD("cynara session is [%s].", client_session);
-               ret = cynara_check(wfd_cynara_handle, clientSmack, client_session, uid, privilege);
-       } else {
-               ret = cynara_check(wfd_cynara_handle, clientSmack, "", uid, privilege);
-       }
-
-       g_free(uid);
-       g_free(clientSmack);
-       g_free(client_session);
-       __WDS_LOG_FUNC_EXIT__;
-       return ret;
-}
-
-static int _wfd_check_client_privilege(int client_sock, int cmd)
-{
-       __WDS_LOG_FUNC_ENTER__;
-       int ret = 0;
-
-       switch (cmd) {
-       case WIFI_DIRECT_CMD_ACTIVATE:
-       case WIFI_DIRECT_CMD_DEACTIVATE:
-       case WIFI_DIRECT_CMD_CONNECT:
-       case WIFI_DIRECT_CMD_CANCEL_CONNECT:
-       case WIFI_DIRECT_CMD_CANCEL_CONNECTION:
-       case WIFI_DIRECT_CMD_SEND_CONNECT_REQ:
-       case WIFI_DIRECT_CMD_REJECT_CONNECTION:
-       case WIFI_DIRECT_CMD_DISCONNECT:
-       case WIFI_DIRECT_CMD_DISCONNECT_ALL:
-       case WIFI_DIRECT_CMD_ACTIVATE_PUSHBUTTON:
-       case WIFI_DIRECT_CMD_CREATE_GROUP:
-       case WIFI_DIRECT_CMD_DESTROY_GROUP:
-       case WIFI_DIRECT_CMD_ACTIVATE_PERSISTENT_GROUP:
-       case WIFI_DIRECT_CMD_DEACTIVATE_PERSISTENT_GROUP:
-       case WIFI_DIRECT_CMD_IS_PERSISTENT_GROUP_ACTIVATED:
-       case WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP:
-       case WIFI_DIRECT_CMD_SET_GO_INTENT:
-       case WIFI_DIRECT_CMD_GENERATE_WPS_PIN:
-       case WIFI_DIRECT_CMD_SET_WPS_PIN:
-       case WIFI_DIRECT_CMD_SET_DEVICE_NAME:
-       case WIFI_DIRECT_CMD_SET_SSID:
-       case WIFI_DIRECT_CMD_SET_MAX_CLIENT:
-       case WIFI_DIRECT_CMD_SET_PASSPHRASE:
-       case WIFI_DIRECT_CMD_SET_AUTOCONNECTION_PEER:
-
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
-       case WIFI_DIRECT_CMD_INIT_MIRACAST:
-
-       case WIFI_DIRECT_CMD_INIT_DISPLAY:
-       case WIFI_DIRECT_CMD_DEINIT_DISPLAY:
-       case WIFI_DIRECT_CMD_SET_DISPLAY:
-       case WIFI_DIRECT_CMD_SET_DISPLAY_AVAILABILITY:
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
-
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
-       case WIFI_DIRECT_CMD_REGISTER_LOCAL_SERVICE:
-       case WIFI_DIRECT_CMD_DEREGISTER_LOCAL_SERVICE:
-       case WIFI_DIRECT_CMD_REGISTER_SERVICE:
-       case WIFI_DIRECT_CMD_DEREGISTER_SERVICE:
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
-
-       case WIFI_DIRECT_CMD_START_DISCOVERY:
-       case WIFI_DIRECT_CMD_START_DISCOVERY_SPECIFIC_CHANNEL:
-       case WIFI_DIRECT_CMD_CANCEL_DISCOVERY:
-
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
-       case WIFI_DIRECT_CMD_START_SERVICE_DISCOVERY:
-       case WIFI_DIRECT_CMD_CANCEL_SERVICE_DISCOVERY:
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
-
-       case WIFI_DIRECT_CMD_REGISTER:
-       case WIFI_DIRECT_CMD_DEREGISTER:
-       case WIFI_DIRECT_CMD_INIT_ASYNC_SOCKET:
-       case WIFI_DIRECT_CMD_GET_LINK_STATUS:
-       case WIFI_DIRECT_CMD_GET_DEVICE_NAME:
-       case WIFI_DIRECT_CMD_GET_SSID:
-       case WIFI_DIRECT_CMD_GET_OPERATING_CHANNEL:
-       case WIFI_DIRECT_CMD_GET_GO_INTENT:
-       case WIFI_DIRECT_CMD_GET_MAX_CLIENT:
-       case WIFI_DIRECT_CMD_GET_IP_ADDR:
-       case WIFI_DIRECT_CMD_GET_MAC_ADDR:
-       case WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE:
-       case WIFI_DIRECT_CMD_GET_REQ_WPS_MODE:
-       case WIFI_DIRECT_CMD_GET_LOCAL_WPS_MODE:
-       case WIFI_DIRECT_CMD_GET_WPS_PIN:
-       case WIFI_DIRECT_CMD_GET_DISCOVERY_RESULT:
-       case WIFI_DIRECT_CMD_GET_CONNECTED_PEERS_INFO:
-       case WIFI_DIRECT_CMD_GET_PERSISTENT_GROUP_INFO:
-       case WIFI_DIRECT_CMD_IS_DISCOVERABLE:
-       case WIFI_DIRECT_CMD_IS_LISTENING_ONLY:
-       case WIFI_DIRECT_CMD_IS_GROUPOWNER:
-       case WIFI_DIRECT_CMD_IS_AUTONOMOUS_GROUP:
-       case WIFI_DIRECT_CMD_IS_AUTOCONNECTION_MODE:
-       case WIFI_DIRECT_CMD_GET_PEER_INFO:
-       case WIFI_DIRECT_CMD_GET_PASSPHRASE:
-
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
-       case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_TYPE:
-       case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_AVAILABILITY:
-       case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_HDCP:
-       case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_PORT:
-       case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_THROUGHPUT:
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
-
-       case WIFI_DIRECT_CMD_SET_REQ_WPS_MODE:
-       case WIFI_DIRECT_CMD_SET_AUTOCONNECTION_MODE:
-        ret = __wfd_cynara_check(client_sock, WFD_PRIVILEGE);
-               break;
-       default:
-               WDS_LOGE("Unknown command[%d]", cmd);
-               __WDS_LOG_FUNC_EXIT__;
-               return WIFI_DIRECT_ERROR_AUTH_FAILED;
-       }
-
-       if(ret == CYNARA_API_ACCESS_ALLOWED) {
-               WDS_LOGD("Cynara: API Access Validation Success");
-               __WDS_LOG_FUNC_EXIT__;
-               return WIFI_DIRECT_ERROR_NONE;
-       } else if(ret == CYNARA_API_ACCESS_DENIED) {
-               WDS_LOGE("Access denied to client id [%d]", client_sock);
-               __WDS_LOG_FUNC_EXIT__;
-               return WIFI_DIRECT_ERROR_PERMISSION_DENIED;
-       } else {
-               WDS_LOGE("Cynara, exception[%d]", ret);
-               __WDS_LOG_FUNC_EXIT__;
-               return WIFI_DIRECT_ERROR_AUTH_FAILED;
-       }
-}
-
-static gboolean wfd_client_process_request(GIOChannel *source,
-                                          GIOCondition condition,
-                                          gpointer user_data)
-{
-       __WDS_LOG_FUNC_ENTER__;
-       int sock = g_io_channel_unix_get_fd(source);
-       wifi_direct_client_request_s req;
-       wifi_direct_client_response_s rsp;
-       wifi_direct_client_noti_s noti;
-       char *extra_rsp = NULL;
-       wfd_manager_s *manager = wfd_get_manager();
-       int res = 0;
-
-       if (sock < SOCK_FD_MIN) {
-               WDS_LOGE("Invalid argument");
-               __WDS_LOG_FUNC_EXIT__;
-               return FALSE;
-       }
-
-       memset(&req, 0x0, sizeof(wifi_direct_client_request_s));
-       memset(&rsp, 0x0, sizeof(wifi_direct_client_response_s));
-       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-
-       res = _wfd_read_from_client(sock, (char*) &req, sizeof(req));
-       if (res < 0) {
-               WDS_LOGE("Client socket Hanged up");
-               _wfd_deregister_client(manager, req.client_id);
-               __WDS_LOG_FUNC_EXIT__;
-               return FALSE;
-       } else if (res == 0) {
-               WDS_LOGE("Client socket busy");
-               __WDS_LOG_FUNC_EXIT__;
-               return TRUE;
-       }
-       WDS_LOGI("Client request [%d:%s], %d bytes read from socket[%d]", req.cmd, wfd_server_print_cmd(req.cmd), res, sock);
-
-       rsp.cmd = req.cmd;
-       rsp.client_id = req.client_id;
-       rsp.result = WIFI_DIRECT_ERROR_NONE;
-       noti.event = WIFI_DIRECT_CLI_EVENT_INVALID;
-
-       if (_wfd_check_client_privilege(sock, req.cmd) != WIFI_DIRECT_ERROR_NONE) {
-               rsp.result = WIFI_DIRECT_ERROR_AUTH_FAILED;
-               goto send_response;
-       }
-
-       switch (req.cmd) {
-       case WIFI_DIRECT_CMD_DEREGISTER:        // manager
-               _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
-
-               res = _wfd_deregister_client(manager, req.client_id);
-               if (res < 0) {
-                       WDS_LOGE("Failed to deregister client[%d]", sock);
-               }
-
-               goto done;
-               break;
-       case WIFI_DIRECT_CMD_ACTIVATE:  // manager (event)
-               if (manager->state > WIFI_DIRECT_STATE_DEACTIVATED) {
-                       rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                       break;
-               }
-               rsp.result = wfd_util_wifi_direct_activatable();
-               if (rsp.result < 0)
-                       break;
-
-               res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
-               if (res < 0) {
-                       WDS_LOGE("Failed to send response to client");
-                       _wfd_deregister_client(manager, req.client_id);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return FALSE;
-               }
-
-               noti.event = WIFI_DIRECT_CLI_EVENT_ACTIVATION;
-               noti.error = wfd_manager_activate(manager);
-               goto send_notification;
-               break;
-       case WIFI_DIRECT_CMD_DEACTIVATE:        // manager (event)
-               if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
-                       rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                       break;
-               }
-
-               res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
-               if (res < 0) {
-                       WDS_LOGE("Failed to send response to client");
-                       _wfd_deregister_client(manager, req.client_id);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return FALSE;
-               }
-               noti.event = WIFI_DIRECT_CLI_EVENT_DEACTIVATION;
-               noti.error = wfd_manager_deactivate(manager);
-               goto send_notification;
-               break;
-       case WIFI_DIRECT_CMD_GET_LINK_STATUS:
-               rsp.param1 = manager->state;
-               break;
-       case WIFI_DIRECT_CMD_START_DISCOVERY:
-               {
-                       if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
-                                       manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
-                                       manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
-                               WDS_LOGE("Wi-Fi Direct is not available status for scanning.");
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               break;
-                       }
-
-                       if (req.data.int1 && (manager->local->dev_role == WFD_DEV_ROLE_GO)) {
-                               WDS_LOGW("Wi-Fi Direct device is already visible, do not start listen");
-                               rsp.result = WIFI_DIRECT_ERROR_NONE;
-                               break;
-                       }
-
-                       wfd_oem_scan_param_s param;
-                       memset(&param, 0x0, sizeof(wfd_oem_scan_param_s));
-                       if (req.data.int1)      // listen_only
-                               param.scan_mode = WFD_OEM_SCAN_MODE_PASSIVE;
-                       else
-                               param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
-                       param.scan_time = req.data.int2;        // timeout
-                       if (manager->local->dev_role == WFD_DEV_ROLE_GO)
-                               param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
-
-                       res = wfd_oem_start_scan(manager->oem_ops, &param);
-                       if (res < 0) {
-                               WDS_LOGE("Failed to start scan");
-                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                               break;
-                       }
-                       WDS_LOGD("Succeeded to start scan");
-                       if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
-                               wfd_state_set(manager, WIFI_DIRECT_STATE_DISCOVERING);
-                               wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DISCOVERING);
-                       }
-
-                       if (req.data.int1) {
-                               noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START_LISTEN_ONLY;
-                               manager->scan_mode = WFD_SCAN_MODE_PASSIVE;
-                       } else {
-                               noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START;
-                               manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
-                       }
-                       noti.error = WIFI_DIRECT_ERROR_NONE;
-               }
-               break;
-       case WIFI_DIRECT_CMD_START_DISCOVERY_SPECIFIC_CHANNEL:
-               {
-                       if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
-                                       manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
-                                       manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
-                               WDS_LOGE("Wi-Fi Direct is not available status for scanning.");
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               break;
-                       }
-
-                       wfd_oem_scan_param_s param;
-                       memset(&param, 0x0, sizeof(wfd_oem_scan_param_s));
-                       param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
-                       param.scan_time = req.data.int1;        // timeout
-                       int channel = req.data.int2;    // channel
-
-                       if (channel == WIFI_DIRECT_DISCOVERY_FULL_SCAN) {
-                               param.scan_type = WFD_OEM_SCAN_TYPE_FULL;
-                       } else if (channel == WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL) {
-                               param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
-                       } else if (channel == WIFI_DIRECT_DISCOVERY_CHANNEL1) {
-                               param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL1;
-                               param.freq = 2412;
-                       } else if (channel == WIFI_DIRECT_DISCOVERY_CHANNEL6) {
-                               param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL6;
-                               param.freq = 2437;
-                       } else if (channel == WIFI_DIRECT_DISCOVERY_CHANNEL11) {
-                               param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL11;
-                               param.freq = 2462;
-                       } else {
-                               param.scan_type = WFD_OEM_SCAN_TYPE_SPECIFIC;
-                               param.freq = wfd_util_channel_to_freq(channel);
-                       }
-
-                       WDS_LOGD("timeout[%d], frequency[%d] ", param.scan_time, param.freq);
-                       res = wfd_oem_start_scan(manager->oem_ops, &param);
-                       if (res < 0) {
-                               WDS_LOGE("Failed to start specific scan");
-                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                               break;
-                       }
-                       WDS_LOGD("Succeeded to start specific scan");
-                       if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
-                               wfd_state_set(manager, WIFI_DIRECT_STATE_DISCOVERING);
-                               wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DISCOVERING);
-                       }
-
-                       if (channel == WIFI_DIRECT_DISCOVERY_FULL_SCAN)
-                               noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START;
-                       else
-                               noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START_SEARCH_LISTEN;
-                       noti.error = WIFI_DIRECT_ERROR_NONE;
-                       manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
-               }
-               break;
-       case WIFI_DIRECT_CMD_CANCEL_DISCOVERY:
-               if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
-                               manager->state != WIFI_DIRECT_STATE_DISCOVERING) {
-                       rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                       break;
-               }
-
-               res = wfd_oem_stop_scan(manager->oem_ops);
-               if (res < 0) {
-                       WDS_LOGE("Failed to stop scan");
-                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       break;
-               }
-
-               manager->scan_mode = WFD_SCAN_MODE_NONE;
-               WDS_LOGE("Succeeded to stop scan");
-
-               noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;
-               noti.error = WIFI_DIRECT_ERROR_NONE;
-               if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
-                       wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
-                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
-               } else {
-                       wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
-                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
-               }
-
-               break;
-       case WIFI_DIRECT_CMD_IS_LISTENING_ONLY:
-               rsp.param1 = manager->scan_mode == WFD_SCAN_MODE_PASSIVE;
-               break;
-       case WIFI_DIRECT_CMD_GET_DISCOVERY_RESULT:
-               {
-                       wfd_discovery_entry_s *peers = NULL;
-                       int peer_cnt = 0;
-                       peer_cnt = wfd_manager_get_peers(manager, &peers);
-                       WDS_LOGD("Peer count [%d], Peer list [%x]", peer_cnt, peers);
-                       if (peer_cnt < 0) {
-                               WDS_LOGE("Failed to get scan result");
-                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                               break;
-                       }
-                       rsp.param1 = peer_cnt;
-                       rsp.result = WIFI_DIRECT_ERROR_NONE;
-
-                       rsp.data_length = peer_cnt * sizeof(wfd_discovery_entry_s);
-                       extra_rsp = (char*) peers;
-                       WDS_LOGD("extra_rsp length [%d], extra_rsp [%x]", rsp.data_length, extra_rsp);
-               }
-               break;
-       case WIFI_DIRECT_CMD_CONNECT: //session (event)
-               {
-                       if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
-                                       manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
-                                       manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               goto send_response;
-                       }
-
-                       wfd_group_s *group = (wfd_group_s*) manager->group;
-                       if (group && group->member_count >= manager->max_station) {
-                               rsp.result = WIFI_DIRECT_ERROR_TOO_MANY_CLIENT;
-                               goto send_response;
-                       }
-
-                       res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
-                       if (res < 0) {
-                               WDS_LOGE("Failed to send response to client");
-                               _wfd_deregister_client(manager, req.client_id);
-                               __WDS_LOG_FUNC_EXIT__;
-                               return FALSE;
-                       }
-
-                       res = wfd_manager_connect(manager, req.data.mac_addr);
-                       if (res < 0) {
-                               noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
-                               noti.error = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       } else {
-                               noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_START;
-                               noti.error = WIFI_DIRECT_ERROR_NONE;
-                       }
-                       g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(req.data.mac_addr));
-                       goto send_notification;
-               }
-               break;
-       case WIFI_DIRECT_CMD_SEND_CONNECT_REQ:
-               {
-                       if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               goto send_response;
-                       }
-
-                       wfd_group_s *group = (wfd_group_s*) manager->group;
-                       if (group && group->member_count >= manager->max_station) {
-                               rsp.result = WIFI_DIRECT_ERROR_TOO_MANY_CLIENT;
-                               goto send_response;
-                       }
-
-                       res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
-                       if (res < 0) {
-                               WDS_LOGE("Failed to send response to client");
-                               _wfd_deregister_client(manager, req.client_id);
-                               __WDS_LOG_FUNC_EXIT__;
-                               return FALSE;
-                       }
-
-                       res = wfd_manager_accept_connection(manager, req.data.mac_addr);
-                       if (res < 0) {
-                               noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
-                               noti.error = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       } else {
-                               noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_START;
-                               noti.error = WIFI_DIRECT_ERROR_NONE;
-                       }
-                       g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(req.data.mac_addr));
-                       goto send_notification;
-               }
-               break;
-       case WIFI_DIRECT_CMD_CANCEL_CONNECT:    // deprecated
-               {
-                       wfd_session_s *session = (wfd_session_s*) manager->session;
-                       res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
-                       if (res < 0) {
-                               WDS_LOGE("Failed to send response to client");
-                               _wfd_deregister_client(manager, req.client_id);
-                               __WDS_LOG_FUNC_EXIT__;
-                               return FALSE;
-                       }
-
-                       res = wfd_oem_cancel_connection(manager->oem_ops, NULL);
-                       if (res < 0)
-                               WDS_LOGE("Failed to cancel connection");
-
-                       res = wfd_oem_destroy_group(manager->oem_ops, GROUP_IFNAME);
-                       if (res < 0)
-                               WDS_LOGE("Failed to destroy group");
-
-                       wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
-                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
-
-                       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
-                       noti.error = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       if (session)
-                               g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(session->peer->dev_addr));
-                       goto send_notification;
-               }
-               break;
-       case WIFI_DIRECT_CMD_CANCEL_CONNECTION:
-               {
-                       if (!manager->session && manager->state != WIFI_DIRECT_STATE_CONNECTING) {
-                               WDS_LOGE("It's not CONNECTING state");
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               break;
-                       }
-
-                       res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
-                       if (res < 0) {
-                               WDS_LOGE("Failed to send response to client");
-                               _wfd_deregister_client(manager, req.client_id);
-                               __WDS_LOG_FUNC_EXIT__;
-                               return FALSE;
-                       }
-
-                       res = wfd_manager_cancel_connection(manager, req.data.mac_addr);
-                       if (res < 0)
-                               WDS_LOGE("Failed to cancel connection");
-
-                       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
-                       noti.error = WIFI_DIRECT_ERROR_CONNECTION_CANCELED;
-                       g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(req.data.mac_addr));
-                       goto send_notification;
-               }
-               break;
-       case WIFI_DIRECT_CMD_REJECT_CONNECTION:
-               {
-                       wfd_session_s *session = (wfd_session_s*) manager->session;
-
-                       if (!session || manager->state != WIFI_DIRECT_STATE_CONNECTING) {
-                               WDS_LOGE("It's not permitted with this state [%d]", manager->state);
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               break;
-                       }
-
-                       if (session->direction != SESSION_DIRECTION_INCOMING) {
-                               WDS_LOGE("Only incomming session can be rejected");
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               break;
-                       }
-
-                       res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
-                       if (res < 0) {
-                               WDS_LOGE("Failed to send response to client");
-                               _wfd_deregister_client(manager, req.client_id);
-                               __WDS_LOG_FUNC_EXIT__;
-                               return FALSE;
-                       }
-
-                       res = wfd_manager_reject_connection(manager, req.data.mac_addr);
-                       if (res < 0) {
-                               WDS_LOGE("Failed to reject connection");
-                               // TODO: check whether to set state and break
-                       }
-
-                       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
-                       noti.error = WIFI_DIRECT_ERROR_CONNECTION_CANCELED;
-                       g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(req.data.mac_addr));
-                       goto send_notification;
-               }
-               break;
-       case WIFI_DIRECT_CMD_DISCONNECT:        // group, session
-               {
-                       if (!manager->group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
-                               if (WIFI_DIRECT_STATE_DISCOVERING == manager->state) {
-                                       res = wfd_oem_stop_scan(manager->oem_ops);
-                                       if (res < 0) {
-                                               WDS_LOGE("Failed to stop scan");
-                                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                                               break;
-                                       }
-                                       WDS_LOGI("Succeeded to stop scan");
-                                       if (WFD_DEV_ROLE_GO == manager->local->dev_role) {
-                                               wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
-                                               wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
-                                       } else {
-                                               wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
-                                               wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
-                                       }
-                               } else {
-                                       WDS_LOGE("It's not permitted with this state [%d]", manager->state);
-                                       rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                                       break;
-                               }
-                       }
-
-                       res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
-                       if (res < 0) {
-                               WDS_LOGE("Failed to send response to client");
-                               _wfd_deregister_client(manager, req.client_id);
-                               __WDS_LOG_FUNC_EXIT__;
-                               return FALSE;
-                       }
-
-                       noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
-                       noti.error = wfd_manager_disconnect(manager, req.data.mac_addr);
-                       g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(req.data.mac_addr));
-                       goto send_notification;
-               }
-               break;
-       case WIFI_DIRECT_CMD_DISCONNECT_ALL:
-               {
-                       if (!manager->group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
-                               if (WIFI_DIRECT_STATE_DISCOVERING == manager->state) {
-                                       res = wfd_oem_stop_scan(manager->oem_ops);
-                                       if (res < 0) {
-                                               WDS_LOGE("Failed to stop scan");
-                                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                                               break;
-                                       }
-                                       WDS_LOGI("Succeeded to stop scan");
-                                       if (WFD_DEV_ROLE_GO == manager->local->dev_role) {
-                                               wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
-                                               wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
-                                       } else {
-                                               wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
-                                               wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
-                                       }
-                               } else {
-                                       WDS_LOGE("It's not permitted with this state [%d]", manager->state);
-                                       rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                                       break;
-                               }
-                       }
-
-                       res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
-                       if (res < 0) {
-                               WDS_LOGE("Failed to send response to client");
-                               _wfd_deregister_client(manager, req.client_id);
-                               __WDS_LOG_FUNC_EXIT__;
-                               return FALSE;
-                       }
-
-                       noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
-                       noti.error = wfd_manager_disconnect_all(manager);
-                       goto send_notification;
-               }
-               break;
-       case WIFI_DIRECT_CMD_GET_CONNECTED_PEERS_INFO:
-               {
-                       // even though status is not CONNECTED, this command can be excuted only when group exist
-                       if (!manager->group && manager->state < WIFI_DIRECT_STATE_CONNECTED) {
-                               WDS_LOGD("It's not connected state [%d]", manager->state);
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               break;
-                       }
-
-                       wfd_connected_peer_info_s *peers = NULL;
-                       int peer_cnt = 0;
-                       peer_cnt = wfd_manager_get_connected_peers(manager, &peers);
-                       WDS_LOGD("Peer count [%d], Peer list [%x]", peer_cnt, peers);
-                       if (peer_cnt < 0) {
-                               WDS_LOGE("Failed to get scan result");
-                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                               break;
-                       }
-                       rsp.param1 = peer_cnt;
-                       rsp.result = WIFI_DIRECT_ERROR_NONE;
-
-                       rsp.data_length = peer_cnt * sizeof(wfd_connected_peer_info_s);
-                       extra_rsp = (char*) peers;
-                       WDS_LOGD("extra_rsp length [%d], extra_rsp [%x]", rsp.data_length, extra_rsp);
-               }
-               break;
-       case WIFI_DIRECT_CMD_CREATE_GROUP:      // group
-               {
-                       wfd_group_s *group = manager->group;
-                       wfd_oem_group_param_s param;
-                       if (group || manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
-                               WDS_LOGE("Group already exist or not a proper state");
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               break;
-                       }
-#ifdef TIZEN_WLAN_BOARD_SPRD
-                       group = wfd_create_pending_group(manager, manager->local->dev_addr);
-#else
-                       group = wfd_create_pending_group(manager, manager->local->intf_addr);
-#endif
-                       if (!group) {
-                               WDS_LOGE("Failed to create pending group");
-                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                               break;
-                       }
-                       group->flags |= WFD_GROUP_FLAG_AUTONOMOUS;
-                       manager->group = group;
-                       WDS_LOGD("Succeeded to create pending group");
-
-                       memset(&param, 0x0, sizeof(param));
-
-                       param.persistent = (manager->local->group_flags &
-                                       WFD_GROUP_FLAG_PERSISTENT);
-                       memcpy(&(param.passphrase), manager->local->passphrase,
-                                       sizeof(param.passphrase));
-#ifndef TIZEN_WLAN_BOARD_SPRD
-                       param.freq = WFD_FREQ_2G;
-#endif
-                       res = wfd_oem_create_group(manager->oem_ops, &param);
-                       if (res < 0) {
-                               WDS_LOGE("Failed to create group");
-                               wfd_destroy_group(manager, GROUP_IFNAME);
-                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       }
-
-                       memset(manager->local->passphrase, 0x0, PASSPHRASE_LEN_MAX + 1);
-               }
-               break;
-       case WIFI_DIRECT_CMD_DESTROY_GROUP:
-               {
-                       wfd_group_s *group = manager->group;
-                       if (!group && manager->state < WIFI_DIRECT_STATE_CONNECTED) {
-                               WDS_LOGE("Group not exist");
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               break;
-                       }
-
-                       res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
-                       if (res < 0) {
-                               WDS_LOGE("Failed to destroy group");
-                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                               break;
-                       }
-
-                       res = wfd_destroy_group(manager, group->ifname);
-                       if (res < 0)
-                               WDS_LOGE("Failed to destroy group");
-
-                       wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
-                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
-
-                       noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP;
-                       noti.error = WIFI_DIRECT_ERROR_NONE;
-               }
-               break;
-       case WIFI_DIRECT_CMD_IS_GROUPOWNER:
-               {
-                       wfd_device_s *local = manager->local;
-                       rsp.param1 = local->dev_role == WFD_DEV_ROLE_GO;
-                       WDS_LOGI("Is group owner : [%s]", rsp.param1 ? "Yes" : "No");
-               }
-               break;
-       case WIFI_DIRECT_CMD_IS_AUTONOMOUS_GROUP:
-               {
-                       if ((rsp.param1 = wfd_group_is_autonomous(manager->group)) < 0) {
-                               rsp.param1 = FALSE;
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               break;
-                       }
-
-                       WDS_LOGI("Is autonomous group : [%s]", rsp.param1 ? "Yes" : "No");
-               }
-               break;
-       case WIFI_DIRECT_CMD_GET_OPERATING_CHANNEL:
-               {
-                       wfd_group_s *group = manager->group;
-                       if (!group) {
-                               WDS_LOGE("Group not exist");
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               break;
-                       }
-                       rsp.param1 = wfd_util_freq_to_channel(group->freq);
-                       // TODO: check channel value
-               }
-               break;
-       case WIFI_DIRECT_CMD_GET_PERSISTENT_GROUP_INFO: // group
-               {
-                       if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
-                               WDS_LOGE("Wi-Fi Direct is not activated.");
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               break;
-                       }
-
-                       int persistent_group_count = 0;
-                       wfd_persistent_group_info_s *plist;
-
-                       res = wfd_oem_get_persistent_groups(manager->oem_ops, (wfd_oem_persistent_group_s**) &plist, &persistent_group_count);
-                       if (res < 0) {
-                               WDS_LOGE("Error!! wfd_oem_get_persistent_group_info() failed..");
-                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                               break;
-                       }
-
-                       rsp.param1 = persistent_group_count;
-                       rsp.result = WIFI_DIRECT_ERROR_NONE;
-                       rsp.data_length = persistent_group_count * sizeof(wfd_persistent_group_info_s);
-                       extra_rsp = (char*) plist;
-                       WDS_LOGD("extra_rsp length [%d], extra_rsp [%x]", rsp.data_length, extra_rsp);
-               }
-               break;
-       case WIFI_DIRECT_CMD_ACTIVATE_PERSISTENT_GROUP:
-               {
-                       manager->local->group_flags |= WFD_GROUP_FLAG_PERSISTENT;
-               }
-               break;
-       case WIFI_DIRECT_CMD_DEACTIVATE_PERSISTENT_GROUP:
-               {
-                       manager->local->group_flags &= ~(WFD_GROUP_FLAG_PERSISTENT);
-               }
-               break;
-       case WIFI_DIRECT_CMD_IS_PERSISTENT_GROUP_ACTIVATED:
-               {
-                       rsp.param1 = ((manager->local->group_flags & WFD_GROUP_FLAG_PERSISTENT) == WFD_GROUP_FLAG_PERSISTENT);
-                       WDS_LOGI("Is persistent group : [%s]", rsp.param1 ? "Yes" : "No");
-               }
-               break;
-       case WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP:   // group
-               {
-                       wfd_persistent_group_info_s persistent_group;
-
-                       if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
-                               WDS_LOGE("Wi-Fi Direct is not activated.");
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               _wfd_read_from_client(sock, (char*) &persistent_group, sizeof(wfd_persistent_group_info_s));
-                               break;
-                       }
-
-                       res = _wfd_read_from_client(sock, (char*) &persistent_group, sizeof(wfd_persistent_group_info_s));
-                       if (res == -2) {
-                               WDS_LOGE("Client socket Hanged up");
-                               _wfd_deregister_client(manager, sock);
-                               return FALSE;
-                       } else if (res == -1) {
-                               WDS_LOGE("Failed to read socket [%d]", sock);
-                               return TRUE;
-                       }
-                       WDS_LOGD("Remove persistent group [%s]", persistent_group.ssid);
-                       WDS_LOGD("Remove persistent group [" MACSTR "]", MAC2STR(persistent_group.go_mac_address));
-
-                       res = wfd_oem_remove_persistent_group(manager->oem_ops,
-                                                                       persistent_group.ssid, persistent_group.go_mac_address);
-                       if (res < 0) {
-                               WDS_LOGE("Failed to remove persistent group");
-                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       }
-               }
-               break;
-       case WIFI_DIRECT_CMD_GET_SSID:
-       case WIFI_DIRECT_CMD_GET_DEVICE_NAME:   // manager (sync)
-               res = wfd_local_get_dev_name(rsp.param2);
-               if (res < 0) {
-                       WDS_LOGE("Failed to get device name");
-                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-               }
-               break;
-       case WIFI_DIRECT_CMD_SET_SSID:
-       case WIFI_DIRECT_CMD_SET_DEVICE_NAME:   // manager (sync)
-               {
-                       char dev_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN] = {0, };
-                       res = _wfd_read_from_client(sock, dev_name, WIFI_DIRECT_MAX_DEVICE_NAME_LEN);
-                       if (res < 0) {
-                               WDS_LOGE("Failed to set device name");
-                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                               break;
-                       }
-
-                       res = wfd_local_set_dev_name(dev_name);
-                       if (res < 0) {
-                               WDS_LOGE("Failed to set device name");
-                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       }
-               }
-               break;
-       case WIFI_DIRECT_CMD_GET_MAC_ADDR:      // manager (sync)
-
-               res = wfd_local_get_dev_mac(rsp.param2);
-               if (res < 0) {
-                       WDS_LOGE("Failed to get device mac");
-                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       break;
-               }
-               break;
-       case WIFI_DIRECT_CMD_GET_IP_ADDR:       // group
-               if (manager->state < WIFI_DIRECT_STATE_CONNECTED) {
-                       WDS_LOGE("Device is not connected yet");
-                       rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                       break;
-               }
-
-               res = wfd_local_get_ip_addr(rsp.param2);
-               if (res < 0) {
-                       WDS_LOGE("Failed to get local IP address");
-                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-               }
-               break;
-       case WIFI_DIRECT_CMD_GET_GO_INTENT:     // manager (sync)
-               res = wfd_manager_get_go_intent(&rsp.param1);
-               if (res < 0) {
-                       WDS_LOGE("Failed to get GO intent");
-                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-               }
-               break;
-       case WIFI_DIRECT_CMD_SET_GO_INTENT:     // manager (sync)
-               res = wfd_manager_set_go_intent(req.data.int1);
-               if (res < 0) {
-                       WDS_LOGE("Failed to set GO intent");
-                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-               }
-               break;
-       case WIFI_DIRECT_CMD_GET_MAX_CLIENT:
-               res = wfd_manager_get_max_station(&rsp.param1);
-               if (res < 0) {
-                       WDS_LOGE("Failed to get max station");
-                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-               }
-               break;
-       case WIFI_DIRECT_CMD_SET_MAX_CLIENT:
-               res = wfd_manager_set_max_station(req.data.int1);
-               if (res < 0) {
-                       WDS_LOGE("Failed to set max station");
-                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-               }
-               break;
-       case WIFI_DIRECT_CMD_IS_AUTOCONNECTION_MODE:
-               res = wfd_manager_get_autoconnection(&rsp.param1);
-               if (res < 0) {
-                       WDS_LOGE("Failed to get autoconnection");
-                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-               }
-               break;
-       case WIFI_DIRECT_CMD_SET_AUTOCONNECTION_MODE:   // manager (sync)
-               res = wfd_manager_set_autoconnection(req.data.int1);
-               if (res < 0) {
-                       WDS_LOGE("Failed to set autoconnection");
-                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-               }
-               break;
-       case WIFI_DIRECT_CMD_IS_DISCOVERABLE:
-               {
-                       wfd_device_s *local = manager->local;
-
-                       if (manager->state == WIFI_DIRECT_STATE_DISCOVERING ||
-                                       local->dev_role == WFD_DEV_ROLE_GO)
-                               rsp.param1 = TRUE;
-                       else
-                               rsp.param1 = FALSE;
-
-                       WDS_LOGI("Is discoverable : [%s]", rsp.param1 ? "Yes" : "No");
-               }
-               break;
-       case WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE:    // manager (sync)
-               res = wfd_local_get_supported_wps_mode(&rsp.param1);
-               if (res < 0) {
-                       WDS_LOGE("Failed to get supported wps mode");
-                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-               }
-               break;
-       case WIFI_DIRECT_CMD_GET_LOCAL_WPS_MODE:
-               res = wfd_local_get_wps_mode(&rsp.param1);
-               if (res < 0) {
-                       WDS_LOGE("Failed to get wps mode");
-                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-               }
-               break;
-       case WIFI_DIRECT_CMD_GET_REQ_WPS_MODE:
-               res = wfd_manager_get_req_wps_mode(&rsp.param1);
-               if (res < 0) {
-                       WDS_LOGE("Failed to get request wps mode");
-                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-               }
-               break;
-       case WIFI_DIRECT_CMD_SET_REQ_WPS_MODE:
-               res = wfd_manager_set_req_wps_mode(req.data.int1);
-               if (res < 0) {
-                       WDS_LOGE("Failed to set request wps mode");
-                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-               }
-               break;
-       case WIFI_DIRECT_CMD_ACTIVATE_PUSHBUTTON:
-               if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
-                       WDS_LOGE("Wi-Fi Direct is not Group Owner.");
-                       rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                       break;
-               }
-
-               res = wfd_oem_wps_start(manager->oem_ops, NULL, WFD_WPS_MODE_PBC, NULL);
-               if (res < 0) {
-                       WDS_LOGE("Failed to start wps");
-                       rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-               }
-               break;
-       case WIFI_DIRECT_CMD_GET_WPS_PIN:       // session
-               {
-                       wfd_session_s *session = (wfd_session_s*) manager->session;
-                       if (!session || manager->auto_pin[0] != 0) {
-                               WDS_LOGE("Session not exist");
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               break;
-                       }
-
-                       if (session->wps_pin[0] == '\0') {
-                               WDS_LOGE("WPS PIN is not set");
-                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                               break;
-                       }
-                       g_snprintf(rsp.param2, sizeof(rsp.param2), "%s", session->wps_pin);
-               }
-               break;
-       case WIFI_DIRECT_CMD_SET_WPS_PIN:       // session
-               {
-                       char *pin = NULL;
-                       wfd_session_s *session = (wfd_session_s*) manager->session;
-                       if (!session) {
-                               WDS_LOGE("Session not exist");
-                               pin = manager->auto_pin;
-                       } else {
-                               pin = session->wps_pin;
-                       }
-                       res = _wfd_read_from_client(sock, pin, PINSTR_LEN);
-                       if (res == -2) {
-                               WDS_LOGE("Client socket Hanged up");
-                               _wfd_deregister_client(manager, sock);
-                               return FALSE;
-                       } else if (res == -1) {
-                               WDS_LOGE("Failed to read socket [%d]", sock);
-                               return TRUE;
-                       }
-                       pin[PINSTR_LEN] = '\0';
-                       WDS_LOGD("PIN string [%s]", pin);
-               }
-               break;
-       case WIFI_DIRECT_CMD_GENERATE_WPS_PIN:  // manager
-               // TODO: implement in plugin
-               break;
-
-
-       case WIFI_DIRECT_CMD_GET_PEER_INFO:
-               {
-                       wfd_discovery_entry_s *peer = NULL;
-                       int res = 0;
-                       res = wfd_manager_get_peer_info(manager,req.data.mac_addr, &peer);
-                       if (res < 0 || !peer) {
-                               WDS_LOGE("Failed to get peer info");
-                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                               if(peer)
-                                       free(peer);
-                               break;
-                       }
-                       rsp.result = WIFI_DIRECT_ERROR_NONE;
-
-                       rsp.data_length = sizeof(wfd_discovery_entry_s);
-                       extra_rsp = (char*) peer;
-                       WDS_LOGD("extra_rsp length [%d], extra_rsp [%x]", rsp.data_length, extra_rsp);
-               }
-               break;
-       case WIFI_DIRECT_CMD_SET_PASSPHRASE:
-               {
-                       char passphrase[PASSPHRASE_LEN_MAX + 1] = {0,};
-                       int passphrase_len = 0;
-                       wfd_group_s *group = manager->group;
-
-                       if (group) {
-                               WDS_LOGE("Group already exists");
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               _wfd_read_from_client(sock, passphrase, PASSPHRASE_LEN_MAX + 1);
-                               break;
-                       }
-
-                       res = _wfd_read_from_client(sock, passphrase, PASSPHRASE_LEN_MAX + 1);
-                       if (res == -2) {
-                               WDS_LOGE("Client socket Hanged up");
-                               _wfd_deregister_client(manager, sock);
-                               return FALSE;
-                       } else if (res == -1) {
-                               WDS_LOGE("Failed to read socket [%d]", sock);
-                               return TRUE;
-                       }
-                       passphrase[PASSPHRASE_LEN_MAX] = '\0';
-                       passphrase_len = strlen(passphrase);
-
-                       if (passphrase_len < PASSPHRASE_LEN_MIN || passphrase_len > PASSPHRASE_LEN_MAX) {
-                               WDS_LOGE("Passphrase length incorrect [%s]:[%d]", passphrase, passphrase_len);
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               break;
-                       }
-
-                       g_strlcpy(manager->local->passphrase, passphrase, PASSPHRASE_LEN_MAX + 1);
-                       WDS_LOGI("Passphrase string [%s]", manager->local->passphrase);
-               }
-               break;
-       case WIFI_DIRECT_CMD_GET_PASSPHRASE:
-               {
-                       wfd_group_s *group = manager->group;
-                       if (!group) {
-                               WDS_LOGE("Group not exist");
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               break;
-                       }
-                       if (group->role == WFD_DEV_ROLE_GC) {
-                               WDS_LOGE("Device is not GO");
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               break;
-                       }
-                       g_strlcpy(rsp.param2, group->passphrase, PASSPHRASE_LEN_MAX + 1);
-                       WDS_LOGI("group->pass : [%s]", group->passphrase);
-               }
-               break;
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
-       case WIFI_DIRECT_CMD_REGISTER_SERVICE:
-               {
-                       int service_type = req.data.int1;
-                       char *info_str = NULL;
-
-                       info_str = (char*) g_try_malloc0(req.cmd_data_len);
-                       if (!info_str) {
-                               WDS_LOGE("Failed to allocate memory for info string");
-                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                               break;
-                       }
-
-                       res = _wfd_read_from_client(sock, info_str, req.cmd_data_len);
-                       if (res < 0) {
-                               WDS_LOGE("Failed to read from socket");
-                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                               g_free(info_str);
-                               break;
-                       }
-                       info_str[req.cmd_data_len] = '\0';
-                       WDS_LOGD("Register service [%d: %s]", service_type, info_str);
-
-                       if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
-                               WDS_LOGE("Wi-Fi Direct is not activated.");
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               g_free(info_str);
-                               break;
-                       }
-
-                       res = wfd_service_add(service_type, info_str, &rsp.param1);
-                       if (res < 0) {
-                               WDS_LOGE("Failed to add service");
-                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       }
-
-                       g_free(info_str);
-               }
-               break;
-
-       case WIFI_DIRECT_CMD_DEREGISTER_SERVICE:
-               {
-                       int service_id = req.data.int1;
-
-                       if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
-                               WDS_LOGE("Wi-Fi Direct is not activated.");
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               break;
-                       }
-
-                       res = wfd_service_del(service_id);
-                       if (res < 0) {
-                               WDS_LOGE("Failed to delete service");
-                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       }
-               }
-               break;
-
-       case WIFI_DIRECT_CMD_START_SERVICE_DISCOVERY:
-               {
-                       if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
-                               WDS_LOGE("Wi-Fi Direct is not activated.");
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               break;
-                       }
-
-                       int service_type = req.data.int1;
-                       WDS_LOGD("Service type [%d]", service_type);
-
-                       res = wfd_oem_start_service_discovery(manager->oem_ops, req.data.mac_addr, service_type);
-                       if (res < 0) {
-                               WDS_LOGE("Failed to start service discovery");
-                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       }
-
-                       noti.event = WIFI_DIRECT_CLI_EVENT_SERVICE_DISCOVERY_STARTED;
-                       noti.error = WIFI_DIRECT_ERROR_NONE;
-               }
-               break;
-
-       case WIFI_DIRECT_CMD_CANCEL_SERVICE_DISCOVERY:
-               {
-                       int service_type;
-
-                       if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
-                               WDS_LOGE("Wi-Fi Direct is not activated.");
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               break;
-                       }
-
-                       service_type = req.data.int1;
-                       WDS_LOGD("Service type [%d]", service_type);
-
-                       res = wfd_oem_cancel_service_discovery(manager->oem_ops, req.data.mac_addr, service_type);
-                       if (res < 0) {
-                               WDS_LOGE("Failed to cancel service discovery");
-                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       }
-               }
-               break;
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
-
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
-       case WIFI_DIRECT_CMD_INIT_MIRACAST:
-               {
-                       if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
-                               WDS_LOGE("Wi-Fi Direct is not activated.");
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               break;
-                       }
-
-                       int miracast_enable = req.data.int1;
-                       WDS_LOGD("Miracast enable [%d]", miracast_enable);
-/* TODO*/
-#if 0
-                       res = wfd_oem_miracast_init(manager->oem_ops, miracast_enable);
-                       if (res < 0) {
-                               WDS_LOGE("Failed to initialize miracast");
-                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-
-                       } else {
-
-                               if(miracast_enable) {
-                                       manager->local->display.type = WIFI_DISPLAY_DEFAULT_TYPE;
-                                       manager->local->display.port = WIFI_DISPLAY_DEFAULT_PORT;
-                                       manager->local->display.availability = WIFI_DISPLAY_DEFAULT_AVAIL;
-                                       manager->local->display.hdcp_support = WIFI_DISPLAY_DEFAULT_HDCP;
-                                       manager->local->display.max_tput = WIFI_DISPLAY_DEFAULT_TPUT;
-                               } else {
-                                       memset(&(manager->local->display), 0x0, sizeof(wfd_display_type_e));
-                               }
-                               int screen_mirroring_status;
-                               if (vconf_get_int(VCONFKEY_SCREEN_MIRRORING_STATE, &screen_mirroring_status) < 0)
-                                       WDS_LOGE("Failed to get vconf VCONFKEY_SCREEN_MIRRORING_STATE\n");
-                               WDS_LOGD("screen_mirroring_status: %d\n", screen_mirroring_status);
-
-                               if (miracast_enable == TRUE) {
-
-                                       /* set go intent 14 so that can be Group Owner. value 15 can cause connection fail when nego with peer has 15 go intent value.  */
-                                       res = wfd_manager_set_go_intent(14);
-                                       if (res < 0)
-                                               WDS_LOGE("Failed to set GO intent");
-
-                                       /* set vconf of Screen Mirroring state. This is necessary to avoid 5 min. auto-deactivation in case of applications using Screen Mirroring. */
-                                       if(screen_mirroring_status < VCONFKEY_SCREEN_MIRRORING_ACTIVATED)
-                                       {
-                                               if (vconf_set_int(VCONFKEY_SCREEN_MIRRORING_STATE, VCONFKEY_SCREEN_MIRRORING_ACTIVATED) < 0)
-                                                       WDS_LOGE("Failed to get vconf VCONFKEY_SCREEN_MIRRORING_STATE\n");
-                                       }
-
-                               } else {
-
-                                       /* set go intent to default value */
-                                       res = wfd_manager_set_go_intent(7);
-                                       if (res < 0)
-                                               WDS_LOGE("Failed to set GO intent");
-
-                                       /* set vconf of Screen Mirroring state. This is necessary in case of applications using Screen Mirroring. */
-                                       if(screen_mirroring_status < VCONFKEY_SCREEN_MIRRORING_CONNECTED)
-                                       {
-                                               if (vconf_set_int(VCONFKEY_SCREEN_MIRRORING_STATE, VCONFKEY_SCREEN_MIRRORING_DEACTIVATED) < 0)
-                                                       WDS_LOGE("Failed to get vconf VCONFKEY_SCREEN_MIRRORING_STATE\n");
-                                       }
-                               }
-
-                       }
-       #endif
-               }
-               break;
-       case WIFI_DIRECT_CMD_INIT_DISPLAY:
-               {
-                       if(manager->state < WIFI_DIRECT_STATE_ACTIVATED || manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               break;
-                       }
-
-                       wfd_device_s * device = manager->local;
-
-                       res = wfd_oem_miracast_init(manager->oem_ops, true);
-                       if (res < 0) {
-                               WDS_LOGE("Failed to initialize display");
-                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       } else {
-                               device->display.type = WIFI_DISPLAY_DEFAULT_TYPE;
-                               device->display.port = WIFI_DISPLAY_DEFAULT_PORT;
-                               device->display.availability = WIFI_DISPLAY_DEFAULT_AVAIL;
-                               device->display.hdcp_support = WIFI_DISPLAY_DEFAULT_HDCP;
-                               device->display.max_tput = WIFI_DISPLAY_DEFAULT_TPUT;
-                       }
-               }
-               break;
-       case WIFI_DIRECT_CMD_DEINIT_DISPLAY:
-               {
-                       if(manager->state < WIFI_DIRECT_STATE_ACTIVATED || manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               break;
-                       }
-
-                       wfd_device_s * device = manager->local;
-
-                       res = wfd_oem_miracast_init(manager->oem_ops, false);
-                       if (res < 0) {
-                               WDS_LOGE("Failed to deinitialize display");
-                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-
-                       }
-                       memset(&(device->display), 0x0, sizeof(wfd_display_type_e));
-               }
-               break;
-       case WIFI_DIRECT_CMD_SET_DISPLAY:
-               {
-                       if(manager->state < WIFI_DIRECT_STATE_ACTIVATED || manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               break;
-                       }
-
-                       int type = req.data.int1;       // type
-                       int port = req.data.int2;       // port
-                       int hdcp = req.data.int3;       // hdcp
-
-                       res = wfd_manager_set_display_device(type, port, hdcp);
-                       if (res < 0) {
-                               WDS_LOGE("Failed to set display device settings");
-                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                       }
-               }
-               break;
-       case WIFI_DIRECT_CMD_SET_DISPLAY_AVAILABILITY:
-               {
-                       if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
-                               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                               break;
-                       }
-                       res = wfd_manager_set_session_availability(req.data.int1);
-                       if (res < 0) {
-                               WDS_LOGE("Failed to set session availability");
-                               rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-                               break;
-                       }
-               }
-               break;
-       case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_TYPE:
-       {
-               if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
-                       rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                       break;
-               }
-
-               wfd_device_s *peer = NULL;
-
-               peer = wfd_manager_get_peer_by_addr(manager, req.data.mac_addr);
-               if(peer) {
-                       rsp.param1 = peer->display.type;
-               } else {
-                       WDS_LOGE("Failed to get peer");
-                       rsp.result = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
-                       break;
-               }
-       }
-       break;
-       case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_AVAILABILITY:
-       {
-               if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
-                       rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                       break;
-               }
-
-               wfd_device_s *peer = NULL;
-
-               peer = wfd_manager_get_peer_by_addr(manager, req.data.mac_addr);
-               if(peer) {
-                       rsp.param1 = peer->display.availability;
-               } else {
-                       WDS_LOGE("Failed to get peer");
-                       rsp.result = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
-                       break;
-               }
-       }
-       break;
-       case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_HDCP:
-       {
-               if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
-                       rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                       break;
-               }
-
-               wfd_device_s *peer = NULL;
-
-               peer = wfd_manager_get_peer_by_addr(manager, req.data.mac_addr);
-               if(peer) {
-                       rsp.param1 = peer->display.hdcp_support;
-               } else {
-                       WDS_LOGE("Failed to get peer");
-                       rsp.result = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
-                       break;
-               }
-       }
-       break;
-       case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_PORT:
-       {
-               if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
-                       rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                       break;
-               }
-
-               wfd_device_s *peer = NULL;
-
-               peer = wfd_manager_get_peer_by_addr(manager, req.data.mac_addr);
-               if(peer) {
-                       rsp.param1 = peer->display.port;
-               } else {
-                       WDS_LOGE("Failed to get peer");
-                       rsp.result = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
-                       break;
-               }
-       }
-       break;
-       case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_THROUGHPUT:
-       {
-               if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
-                       rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-                       break;
-               }
-
-               wfd_device_s *peer = NULL;
-
-               peer = wfd_manager_get_peer_by_addr(manager, req.data.mac_addr);
-               if(peer) {
-                       rsp.param1 = peer->display.max_tput;
-               } else {
-                       WDS_LOGE("Failed to get peer");
-                       rsp.result = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
-                       break;
-               }
-       }
-       break;
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
-       default:
-               WDS_LOGE("Unknown command[%d]", req.cmd);
-               rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
-               break;
-       }
-
-send_response:
-       res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
-       if (res < 0) {
-               WDS_LOGE("Failed to send response to client");
-               g_free(extra_rsp);
-               _wfd_deregister_client(manager, req.client_id);
-               __WDS_LOG_FUNC_EXIT__;
-               return FALSE;
-       }
-
-       if (rsp.data_length > 0) {
-               res = _wfd_send_to_client(sock, (char*) extra_rsp, rsp.data_length);
-               if (res < 0) {
-                       WDS_LOGE("Failed to send extra response data to client");
-                       g_free(extra_rsp);
-                       _wfd_deregister_client(manager, req.client_id);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return FALSE;
-               }
-               g_free(extra_rsp);
-               extra_rsp = NULL;
-       }
-
-send_notification:
-       if (noti.event > WIFI_DIRECT_CLI_EVENT_INVALID && noti.event < WIFI_DIRECT_CLI_EVENT_MAX) {
-               res = wfd_client_send_event(manager, &noti);
-               if (res < 0) {
-                       WDS_LOGE("Failed to send Notification to client");
-                       g_free(extra_rsp);
-                       __WDS_LOG_FUNC_EXIT__;
-                       return FALSE;
-               }
-               WDS_LOGD("Succeeded to send Notification[%d] to client", noti.event);
-       }
-
-done:
-       g_free(extra_rsp);
-       __WDS_LOG_FUNC_EXIT__;
-       return TRUE;
-}
-
diff --git a/src/wifi-direct-dbus.c b/src/wifi-direct-dbus.c
new file mode 100644 (file)
index 0000000..16f0f14
--- /dev/null
@@ -0,0 +1,219 @@
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file implements wifi direct dbus utility functions.
+ *
+ * @file        wifi-direct-dbus.c
+ * @author      Nishant Chaprana (n.chaprana@samsung.com)
+ * @version     0.1
+ */
+
+#include "wifi-direct-dbus.h"
+#include "wifi-direct-log.h"
+
+static GDBusConnection *connection = NULL;
+static guint g_owner_id = 0;  //Name Owner ID
+
+static GDBusConnection *__dbus_get_gdbus_conn(void)
+{
+       return connection;
+}
+
+static void __on_name_acquired(GDBusConnection *connection,
+                              const gchar *name,
+                              gpointer user_data)
+{
+       WDS_LOGD("on_name_acquired: %s", name);
+}
+
+static void __on_name_lost(GDBusConnection *connection,
+                          const gchar *name,
+                          gpointer user_data)
+{
+       WDS_LOGD("on_name_lost: %s", name);
+}
+
+guint wfd_manager_dbus_iface_register(const gchar* iface_name,
+                                     const gchar* iface_path,
+                                     const gchar *xml_data,
+                                     const GDBusInterfaceVTable *interface_vtable)
+{
+       GDBusNodeInfo *node_info = NULL;
+       GDBusInterfaceInfo *interface_info = NULL;
+       GError *Error = NULL;
+       guint reg_id = 0;
+       GDBusConnection *connection = NULL;
+
+       connection = __dbus_get_gdbus_conn();
+       if (connection == NULL) {
+               WDS_LOGE("Dbus connection not yet initiated");
+               return 0;
+       }
+
+       if (!iface_name || !iface_path || !xml_data || !interface_vtable) {
+               WDS_LOGE("Invalid Parameters");
+               return 0;
+       }
+
+       node_info = g_dbus_node_info_new_for_xml(xml_data, &Error);
+       if (node_info == NULL) {
+               WDS_LOGE("Failed to get node info, Error: %s", Error->message);
+               g_clear_error(&Error);
+               return 0;
+       }
+
+       /* Register interface */
+       interface_info = g_dbus_node_info_lookup_interface(node_info, iface_name);
+       if (interface_info == NULL) {
+               WDS_LOGE("Failed to get interface info");
+               g_dbus_node_info_unref(node_info);
+               return 0;
+       }
+
+       reg_id = g_dbus_connection_register_object(connection, iface_path,
+                       interface_info, interface_vtable,
+                       NULL, NULL, &Error);
+       if (reg_id == 0) {
+               WDS_LOGE("Failed to register: %s", Error->message);
+               g_clear_error(&Error);
+               g_dbus_node_info_unref(node_info);
+               return 0;
+       }
+
+       WDS_LOGD("Interface Registration ID [%d], Interface Name [%s]", reg_id, iface_name);
+
+       g_dbus_node_info_unref(node_info);
+       return reg_id;
+}
+
+gboolean wfd_manager_dbus_iface_unregister(guint reg_id)
+{
+       GDBusConnection *connection = NULL;
+
+       connection = __dbus_get_gdbus_conn();
+       if (connection == NULL) {
+               WDS_LOGE("Dbus connection not yet initiated");
+               return FALSE;
+       }
+
+       if(reg_id > 0) {
+               if(g_dbus_connection_unregister_object (connection, reg_id) == FALSE)
+                       WDS_LOGE("netconfig network migration unregister object");
+       }
+
+       return TRUE;
+}
+
+gboolean wfd_manager_dbus_init(void)
+{
+       GError *Error = NULL;
+
+       if (connection != NULL) {
+               WDS_LOGE("Conenciton already present");
+               return TRUE;
+       }
+
+       connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &Error);
+       if(connection == NULL) {
+               WDS_LOGE("Failed to get connection, Error[%s]", Error->message);
+               g_error_free(Error);
+               return FALSE;
+       }
+
+       g_owner_id = g_bus_own_name_on_connection(connection,
+                                                 WFD_MANAGER_SERVICE,
+                                                 G_BUS_NAME_OWNER_FLAGS_NONE,
+                                                 __on_name_acquired,
+                                                 __on_name_lost,
+                                                 NULL,
+                                                 NULL);
+       if (g_owner_id == 0) {
+               WDS_LOGE("Failed to get bus name");
+               return FALSE;
+       }
+       WDS_LOGD("DBus Owner id is [%d]", g_owner_id);
+
+       connection = connection;
+       return TRUE;
+}
+
+void wfd_manager_dbus_deinit(void)
+{
+       if (connection == NULL || g_owner_id == 0)
+               return;
+
+       g_object_unref(connection);
+       g_bus_unown_name(g_owner_id);
+}
+
+gboolean wfd_manager_dbus_emit_signal(const gchar *interface_name,
+                                     const gchar *signal_name,
+                                     GVariant *parameters)
+{
+       gboolean rv = FALSE;
+       GError *error = NULL;
+       GDBusConnection *connection;
+
+       connection = __dbus_get_gdbus_conn();
+       if (connection == NULL) {
+               WDS_LOGE("GDBusconnection is NULL");
+               return 0;
+       }
+
+       DBUS_DEBUG_VARIANT(parameters);
+
+       rv = g_dbus_connection_emit_signal(connection,
+                                          NULL,
+                                          WFD_MANAGER_PATH,
+                                          interface_name,
+                                          signal_name,
+                                          parameters,
+                                          &error);
+       if (rv != TRUE) {
+               WDS_LOGE("Failed to get node info, Error: %s", error->message);
+               g_error_free(error);
+       } else {
+               WDS_LOGD("[%s] signal sent on [%s] interface", signal_name, interface_name);
+       }
+
+       return rv;
+}
+
+GVariant* wfd_manager_dbus_pack_ay(const unsigned char *src, int size)
+{
+       GVariantBuilder *builder = NULL;
+       GVariant *iter = NULL;
+       int i = 0;
+
+       if (!src) {
+               WDS_LOGE("Invalid parameter");
+               return NULL;
+       }
+
+       builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
+
+       for(i = 0; i < size; i++)
+               g_variant_builder_add(builder, "y", src[i]);
+
+       iter = g_variant_new("ay", builder);
+
+       g_variant_builder_unref (builder);
+       return iter;
+}
diff --git a/src/wifi-direct-error.c b/src/wifi-direct-error.c
new file mode 100644 (file)
index 0000000..abb52c1
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file implements wifi direct manager dbus error functions.
+ *
+ * @file        wifi-direct-error.c
+ * @author      Nishant Chaprana (n.chaprana@samsung.com)
+ * @version     0.1
+ */
+
+#include <glib.h>
+#include "wifi-direct-error.h"
+#include "wifi-direct-dbus.h"
+#include "wifi-direct-log.h"
+
+#define WFD_MANAGER_QUARK (g_quark_from_string ("wifi-direct-manager"))
+
+static void wfd_error_invalid_parameter(GError **error)
+{
+       g_set_error(error,
+                       WFD_MANAGER_QUARK,
+                       WIFI_DIRECT_ERROR_INVALID_PARAMETER,
+                       WFD_MANAGER_ERROR_INTERFACE ".InvalidParameter");
+}
+
+static void wfd_error_not_permitted(GError **error)
+{
+       g_set_error(error,
+                       WFD_MANAGER_QUARK,
+                       WIFI_DIRECT_ERROR_NOT_PERMITTED,
+                       WFD_MANAGER_ERROR_INTERFACE ".NotPermitted");
+}
+
+static void wfd_error_operation_failed(GError **error)
+{
+       g_set_error(error,
+                       WFD_MANAGER_QUARK,
+                       WIFI_DIRECT_ERROR_OPERATION_FAILED,
+                       WFD_MANAGER_ERROR_INTERFACE ".OperationFailed");
+}
+
+void wfd_error_set_gerror(wifi_direct_error_e error_code, GError **error) {
+       switch(error_code) {
+       case WIFI_DIRECT_ERROR_INVALID_PARAMETER:
+               wfd_error_invalid_parameter(error);
+               break;
+       case WIFI_DIRECT_ERROR_NOT_PERMITTED:
+               wfd_error_not_permitted(error);
+               break;
+       case WIFI_DIRECT_ERROR_OPERATION_FAILED:
+               wfd_error_operation_failed(error);
+               break;
+       default:
+               WDS_LOGD("Error Not handled [%d]", error_code);
+       }
+}
index 4eae516..3b85065 100755 (executable)
 #include "wifi-direct-group.h"
 #include "wifi-direct-session.h"
 #include "wifi-direct-event.h"
-#include "wifi-direct-client.h"
 #include "wifi-direct-state.h"
 #include "wifi-direct-util.h"
+#include "wifi-direct-error.h"
+#include "wifi-direct-log.h"
+#include "wifi-direct-dbus.h"
 
 
 static int _wfd_event_update_peer(wfd_manager_s *manager, wfd_oem_dev_data_s *data)
@@ -135,18 +137,9 @@ static void __wfd_process_deactivated(wfd_manager_s *manager, wfd_oem_event_s *e
 {
        __WDS_LOG_FUNC_ENTER__;
 
-       wifi_direct_client_noti_s noti;
-
-       if (event == NULL || manager == NULL) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
-
-       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-       noti.event = WIFI_DIRECT_CLI_EVENT_DEACTIVATION;
-       noti.error = WIFI_DIRECT_ERROR_NONE;
-       wfd_client_send_event(manager, &noti);
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "Deactivation",
+                                    g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE));
 
        wfd_destroy_group(manager, GROUP_IFNAME);
        wfd_destroy_session(manager);
@@ -169,15 +162,8 @@ static void __wfd_process_peer_found(wfd_manager_s *manager, wfd_oem_event_s *ev
        __WDS_LOG_FUNC_ENTER__;
 
        wfd_oem_dev_data_s *edata = NULL;
-       wifi_direct_client_noti_s noti;
        int res = 0;
 
-       if (event == NULL || manager == NULL) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
-
        edata = (wfd_oem_dev_data_s*) event->edata;
        if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
                WDS_LOGE("Invalid event data");
@@ -195,11 +181,11 @@ static void __wfd_process_peer_found(wfd_manager_s *manager, wfd_oem_event_s *ev
        if (manager->state > WIFI_DIRECT_STATE_ACTIVATING &&
                        manager->state != WIFI_DIRECT_STATE_CONNECTING &&
                        manager->state != WIFI_DIRECT_STATE_DISCONNECTING) {
-               memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-               snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(edata->p2p_dev_addr));
-               noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS;
-               noti.error = WIFI_DIRECT_ERROR_NONE;
-               wfd_client_send_event(manager, &noti);
+               char peer_mac_address[MACSTR_LEN+1] = {0, };
+               snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(edata->p2p_dev_addr));
+               wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                            "PeerFound",
+                                            g_variant_new("(s)", peer_mac_address));
        }
 
        __WDS_LOG_FUNC_EXIT__;
@@ -210,15 +196,9 @@ static void __wfd_process_peer_disappeared(wfd_manager_s *manager, wfd_oem_event
 {
        __WDS_LOG_FUNC_ENTER__;
 
-       wifi_direct_client_noti_s noti;
        wfd_session_s *session = NULL;
        wfd_device_s *peer = NULL;
-
-       if (event == NULL || manager == NULL) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
 
        session = manager->session;
        if(session != NULL && session->peer != NULL) {
@@ -233,11 +213,10 @@ static void __wfd_process_peer_disappeared(wfd_manager_s *manager, wfd_oem_event
 
        wfd_remove_peer(manager, event->dev_addr);
 
-       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-       snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
-       noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_LOST_PEERS;
-       noti.error = WIFI_DIRECT_ERROR_NONE;
-       wfd_client_send_event(manager, &noti);
+       snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "PeerLost",
+                                    g_variant_new("(s)", peer_mac_address));
 
        __WDS_LOG_FUNC_EXIT__;
        return;
@@ -247,14 +226,6 @@ static void __wfd_process_discovery_finished(wfd_manager_s *manager, wfd_oem_eve
 {
        __WDS_LOG_FUNC_ENTER__;
 
-       wifi_direct_client_noti_s noti;
-
-       if (event == NULL || manager == NULL) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
-
        if (manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
                        manager->state != WIFI_DIRECT_STATE_ACTIVATED) {
                WDS_LOGE("Notify finding stopped when discovering or activated. [%d]", manager->state);
@@ -277,10 +248,9 @@ static void __wfd_process_discovery_finished(wfd_manager_s *manager, wfd_oem_eve
        }
        manager->scan_mode = WFD_SCAN_MODE_NONE;
 
-       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-       noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;
-       noti.error = WIFI_DIRECT_ERROR_NONE;
-       wfd_client_send_event(manager, &noti);
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "DiscoveryFinished",
+                                    NULL);
 
        __WDS_LOG_FUNC_EXIT__;
        return;
@@ -292,14 +262,8 @@ static void __wfd_process_prov_disc_req(wfd_manager_s *manager, wfd_oem_event_s
 
        wfd_device_s *peer = NULL;
        int res = 0;
-
-       if (event == NULL || manager == NULL) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
-
        wfd_group_s *group = (wfd_group_s*) manager->group;
+
        if (group && group->role == WFD_DEV_ROLE_GC &&
                                                event->event_id == WFD_OEM_EVENT_PROV_DISC_REQ) {
                WDS_LOGD("Device has GC role - ignore this provision request");
@@ -352,12 +316,6 @@ static void __wfd_process_prov_disc_resp(wfd_manager_s *manager, wfd_oem_event_s
        wfd_device_s *peer = NULL;
        int res = 0;
 
-       if (event == NULL || manager == NULL) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
-
 #ifdef CTRL_IFACE_DBUS
        wfd_oem_dev_data_s *edata = NULL;
 
@@ -401,14 +359,8 @@ static void __wfd_process_prov_disc_fail(wfd_manager_s *manager, wfd_oem_event_s
        __WDS_LOG_FUNC_ENTER__;
 
        wfd_session_s *session = NULL;
-       wifi_direct_client_noti_s noti;
        unsigned char *peer_addr = NULL;
-
-       if (event == NULL || manager == NULL) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
 
        session = (wfd_session_s*) manager->session;
        if (!session) {
@@ -424,11 +376,12 @@ static void __wfd_process_prov_disc_fail(wfd_manager_s *manager, wfd_oem_event_s
                return;
        }
 
-       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
-       noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
-       snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
-       wfd_client_send_event(manager, &noti);
+       snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "Connection",
+                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
+                                                           WFD_EVENT_CONNECTION_RSP,
+                                                           peer_mac_address));
 
        if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
                wfd_group_s *group = (wfd_group_s*) manager->group;
@@ -468,14 +421,6 @@ static void __wfd_process_go_neg_req(wfd_manager_s *manager, wfd_oem_event_s *ev
        __WDS_LOG_FUNC_ENTER__;
 
        wfd_session_s *session = NULL;
-       wifi_direct_client_noti_s noti;
-
-       if (event == NULL || manager == NULL) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
-
        wfd_group_s *group = (wfd_group_s*) manager->group;
        if (group && group->role == WFD_DEV_ROLE_GC) {
                WDS_LOGD("Device has GC role - ignore this go neg request");
@@ -544,11 +489,13 @@ static void __wfd_process_go_neg_req(wfd_manager_s *manager, wfd_oem_event_s *ev
                wfd_session_timer(session, 1);
                wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
 
-               memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-               noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ;
-               noti.error = WIFI_DIRECT_ERROR_NONE;
-               g_snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
-               wfd_client_send_event(manager, &noti);
+               char peer_mac_address[MACSTR_LEN+1] = {0, };
+               g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
+               wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                            "Connection",
+                                            g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                                   WFD_EVENT_CONNECTION_REQ,
+                                                                   peer_mac_address));
        } else {
                wfd_session_process_event(manager, event);
        }
@@ -562,14 +509,8 @@ static void __wfd_process_go_neg_req(wfd_manager_s *manager, wfd_oem_event_s *ev
 
        wfd_session_s *session = NULL;
        wfd_oem_conn_data_s *edata = NULL;
-       wifi_direct_client_noti_s noti;
        unsigned char *peer_addr = NULL;
-
-       if (event == NULL || manager == NULL) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
+       char peer_mac_address[MACSTR_LEN] = {0, };
 
        session = (wfd_session_s*) manager->session;
        if (!session) {
@@ -603,11 +544,12 @@ static void __wfd_process_go_neg_req(wfd_manager_s *manager, wfd_oem_event_s *ev
                return;
        }
 
-       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
-       noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
-       snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
-       wfd_client_send_event(manager, &noti);
+       snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "Connection",
+                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
+                                                           WFD_EVENT_CONNECTION_RSP,
+                                                           peer_mac_address));
 
        wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
        wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
@@ -628,12 +570,6 @@ static void __wfd_process_go_neg_done(wfd_manager_s *manager, wfd_oem_event_s *e
        wfd_oem_conn_data_s *edata = NULL;
        wfd_device_s *peer = NULL;
 
-       if (event == NULL || manager == NULL) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
-
        edata = (wfd_oem_conn_data_s*) event->edata;
        if (edata == NULL) {
                WDS_LOGE("Invalid event data");
@@ -658,15 +594,8 @@ static void __wfd_process_wps_fail(wfd_manager_s *manager, wfd_oem_event_s *even
        __WDS_LOG_FUNC_ENTER__;
 
        wfd_session_s *session = NULL;
-       wifi_direct_client_noti_s noti;
        unsigned char *peer_addr = NULL;
 
-       if (event == NULL || manager == NULL) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
-
        session = (wfd_session_s*) manager->session;
        if (!session) {
                WDS_LOGE("Unexpected event. Session not exist");
@@ -681,11 +610,13 @@ static void __wfd_process_wps_fail(wfd_manager_s *manager, wfd_oem_event_s *even
                return;
        }
 
-       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
-       noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
-       snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
-       wfd_client_send_event(manager, &noti);
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
+       g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "Connection",
+                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
+                                                           WFD_EVENT_CONNECTION_RSP,
+                                                           peer_mac_address));
 
        if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
                wfd_group_s *group = (wfd_group_s*) manager->group;
@@ -720,29 +651,23 @@ static void __wfd_process_wps_fail(wfd_manager_s *manager, wfd_oem_event_s *even
        return;
 }
 
- static void __wfd_process_wps_done(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
+static void __wfd_process_wps_done(wfd_manager_s *manager, wfd_oem_event_s *event)
+{
        __WDS_LOG_FUNC_ENTER__;
 
        wfd_session_process_event(manager, event);
 
        __WDS_LOG_FUNC_EXIT__;
        return;
- }
+}
 
 static void __wfd_process_key_neg_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
 {
        __WDS_LOG_FUNC_ENTER__;
 
        wfd_session_s *session = NULL;
-       wifi_direct_client_noti_s noti;
        unsigned char *peer_addr = NULL;
-
-       if (event == NULL || manager == NULL) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
 
        session = (wfd_session_s*) manager->session;
        if (!session) {
@@ -758,11 +683,12 @@ static void __wfd_process_key_neg_fail(wfd_manager_s *manager, wfd_oem_event_s *
                return;
        }
 
-       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
-       noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
-       snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
-       wfd_client_send_event(manager, &noti);
+       g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "Connection",
+                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
+                                                           WFD_EVENT_CONNECTION_RSP,
+                                                           peer_mac_address));
 
        if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
                wfd_group_s *group = (wfd_group_s*) manager->group;
@@ -827,13 +753,6 @@ static void __wfd_process_group_created(wfd_manager_s *manager, wfd_oem_event_s
 
        wfd_group_s *group = NULL;
        wfd_session_s *session = NULL;
-       wifi_direct_client_noti_s noti;
-
-       if (event == NULL || manager == NULL) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
 
        group = (wfd_group_s*) manager->group;
        session = (wfd_session_s*)manager->session;
@@ -880,7 +799,6 @@ static void __wfd_process_group_created(wfd_manager_s *manager, wfd_oem_event_s
                }
        }
 
-       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
        if (group->role == WFD_DEV_ROLE_GC && session) {
 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
                wfd_device_s *peer = session->peer;
@@ -892,13 +810,16 @@ static void __wfd_process_group_created(wfd_manager_s *manager, wfd_oem_event_s
                wfd_update_peer(manager, peer);
 
                if(peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
+                       char peer_mac_address[MACSTR_LEN+1] = {0, };
 
                        wfd_util_ip_over_eap_assign(peer, event->ifname);
 
-                       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
-                       noti.error = WIFI_DIRECT_ERROR_NONE;
-                       snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
-                       wfd_client_send_event(manager, &noti);
+                       g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "Connection",
+                                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                                           WFD_EVENT_CONNECTION_RSP,
+                                                                           peer_mac_address));
 
                        wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
                        wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
@@ -909,8 +830,8 @@ static void __wfd_process_group_created(wfd_manager_s *manager, wfd_oem_event_s
                wfd_peer_clear_all(manager);
        } else {
                if (group->flags & WFD_GROUP_FLAG_AUTONOMOUS) {
-                       noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP;
-                       wfd_client_send_event(manager, &noti);
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
+                                                    "Created", NULL);
                        wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
                        wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
                }
@@ -923,36 +844,44 @@ static void __wfd_process_group_destroyed(wfd_manager_s *manager, wfd_oem_event_
 {
        __WDS_LOG_FUNC_ENTER__;
 
-       wifi_direct_client_noti_s noti;
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
+       unsigned char *peer_addr = wfd_session_get_peer_addr(manager->session);
 
-       if (event == NULL || manager == NULL) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
+       if (peer_addr != NULL)
+               g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+       else
+               g_snprintf(peer_mac_address, MACSTR_LEN, "%s", "");
 
-       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
        if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
-               noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
-               noti.error = WIFI_DIRECT_ERROR_NONE;
+               wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                            "Disconnection",
+                                            g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                                   WFD_EVENT_DISCONNECTION_RSP,
+                                                                   peer_mac_address));
+
        } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING && manager->session){
-               noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
-               noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
-               unsigned char *peer_addr = wfd_session_get_peer_addr(manager->session);
-               if(peer_addr != NULL)
-                       g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+               wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                            "Connection",
+                                            g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
+                                                                   WFD_EVENT_CONNECTION_RSP,
+                                                                   peer_mac_address));
+
        } else if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
-               if(manager->local->dev_role != WFD_DEV_ROLE_GO)
-                       noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
-               else
-                       noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP;
-               noti.error = WIFI_DIRECT_ERROR_NONE;
+               if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "Disconnection",
+                                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                                           WFD_EVENT_DISCONNECTION_RSP,
+                                                                           peer_mac_address));
+               } else {
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
+                                                    "Destroyed", NULL);
+               }
        } else {
                WDS_LOGD("Unexpected event(GROUP_DESTROYED). Ignore it");
                __WDS_LOG_FUNC_EXIT__;
                return;
        }
-       wfd_client_send_event(manager, &noti);
 
        wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
        wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
@@ -971,14 +900,8 @@ static void __wfd_process_invitation_req(wfd_manager_s *manager, wfd_oem_event_s
        wfd_device_s *peer = NULL;
        wfd_session_s *session = NULL;
        wfd_oem_invite_data_s *edata = NULL;
-       wifi_direct_client_noti_s noti;
        int res = 0;
-
-       if (event == NULL || manager == NULL) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
 
        peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
        if (!peer) {
@@ -1015,11 +938,12 @@ static void __wfd_process_invitation_req(wfd_manager_s *manager, wfd_oem_event_s
                return;
        }
 
-       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ;
-       noti.error = WIFI_DIRECT_ERROR_NONE;
-       snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
-       wfd_client_send_event(manager, &noti);
+       g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "Connection",
+                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                           WFD_EVENT_CONNECTION_REQ,
+                                                           peer_mac_address));
 
        __WDS_LOG_FUNC_EXIT__;
        return;
@@ -1040,13 +964,7 @@ static void __wfd_process_sta_connected(wfd_manager_s *manager, wfd_oem_event_s
        wfd_session_s *session = NULL;
        wfd_device_s *peer = NULL;
        wfd_group_s *group = NULL;
-       wifi_direct_client_noti_s noti;
-
-       if (event == NULL || manager == NULL) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
 
        // FIXME: Move this code to plugin
        if (!memcmp(event->intf_addr, manager->local->intf_addr, MACADDR_LEN)) {
@@ -1095,11 +1013,13 @@ static void __wfd_process_sta_connected(wfd_manager_s *manager, wfd_oem_event_s
        wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
        wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
 
-       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
-       noti.error = WIFI_DIRECT_ERROR_NONE;
-       snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
-       wfd_client_send_event(manager, &noti);
+       g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "Connection",
+                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                           WFD_EVENT_CONNECTION_RSP,
+                                                           peer_mac_address));
+
 #ifdef CTRL_IFACE_DBUS
        wfd_update_peer(manager, peer);
 #endif /* CTRL_IFACE_DBUS */
@@ -1112,15 +1032,17 @@ static void __wfd_process_sta_connected(wfd_manager_s *manager, wfd_oem_event_s
                WDS_LOGE("Peer's GO IP [" IPSTR "]", IP2STR((char*) &peer->go_ip_addr));
        }
        if(peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
+               char peer_mac_address[MACSTR_LEN+1] = {0,};
+               char assigned_ip_address[IPSTR_LEN+1] = {0,};
+
                memcpy(peer->ip_addr, peer->client_ip_addr, IPADDR_LEN);
 
-               wifi_direct_client_noti_s noti;
-               memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-               noti.event = WIFI_DIRECT_CLI_EVENT_IP_LEASED_IND;
-               noti.error = WIFI_DIRECT_ERROR_NONE;
-               snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
-               snprintf(noti.param2, IPSTR_LEN, IPSTR, IP2STR(peer->ip_addr));
-               wfd_client_send_event(manager, &noti);
+               g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
+               g_snprintf(assigned_ip_address, IPSTR_LEN, IPSTR, IP2STR(peer->ip_addr));
+               wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "PeerIPAssigned",
+                                    g_variant_new("(ss)", peer_mac_address,
+                                                          assigned_ip_address));
        } else
 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
        wfd_util_dhcps_wait_ip_leased(peer);
@@ -1136,14 +1058,8 @@ static void __wfd_process_sta_disconnected(wfd_manager_s *manager, wfd_oem_event
 
        wfd_group_s *group = NULL;
        wfd_device_s *peer = NULL;
-       wifi_direct_client_noti_s noti;
        unsigned char peer_addr[MACADDR_LEN] = {0, };
-
-       if (event == NULL || manager == NULL) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
 
        group = (wfd_group_s*) manager->group;
        if (!group) {
@@ -1182,21 +1098,33 @@ static void __wfd_process_sta_disconnected(wfd_manager_s *manager, wfd_oem_event
 #endif /* CTRL_DBUS_IFACE */
        }
        memcpy(peer_addr, peer->dev_addr, MACADDR_LEN);
-       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
 
        /* If state is not DISCONNECTING, connection is finished by peer */
        if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
                wfd_group_remove_member(group, peer_addr);
-               if (group->member_count)
-                       noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;
-               else
-                       noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND;
-               noti.error = WIFI_DIRECT_ERROR_NONE;
-               g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+               g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+               if (group->member_count) {
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "Disconnection",
+                                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                                           WFD_EVENT_DISASSOCIATION_IND,
+                                                                           peer_mac_address));
+               } else {
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "Disconnection",
+                                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                                           WFD_EVENT_DISCONNECTION_IND,
+                                                                           peer_mac_address));
+               }
+
        } else if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
-               noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
-               noti.error = WIFI_DIRECT_ERROR_NONE;
-               g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+               g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+               wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                            "Disconnection",
+                                            g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                                   WFD_EVENT_DISCONNECTION_RSP,
+                                                                   peer_mac_address));
+
        } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING &&
                        /* Some devices(GO) send disconnection message before connection completed.
                         * This message should be ignored when device is not GO */
@@ -1204,24 +1132,31 @@ static void __wfd_process_sta_disconnected(wfd_manager_s *manager, wfd_oem_event
                if (WFD_PEER_STATE_CONNECTED == peer->state) {
                        WDS_LOGD("Peer is already Connected !!!");
                        wfd_group_remove_member(group, peer_addr);
-                       noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;
-                       noti.error = WIFI_DIRECT_ERROR_NONE;
+                       g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "Disconnection",
+                                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                                           WFD_EVENT_DISASSOCIATION_IND,
+                                                                           peer_mac_address));
+
                } else if (WFD_PEER_STATE_CONNECTING == peer->state) {
                        WDS_LOGD("Peer is Connecting...");
-                       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
-                       noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
+                       g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "Connection",
+                                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
+                                                                           WFD_EVENT_CONNECTION_RSP,
+                                                                           peer_mac_address));
                } else {
                        WDS_LOGE("Unexpected Peer State. Ignore it");
                        __WDS_LOG_FUNC_EXIT__;
                        return;
                }
-               g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
        } else {
                WDS_LOGE("Unexpected event. Ignore it");
                __WDS_LOG_FUNC_EXIT__;
                return;
        }
-       wfd_client_send_event(manager, &noti);
 
        if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
                wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
@@ -1244,13 +1179,13 @@ static void __wfd_process_sta_disconnected(wfd_manager_s *manager, wfd_oem_event
        return;
 }
 
- static void __wfd_process_terminating(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
+static void __wfd_process_terminating(wfd_manager_s *manager, wfd_oem_event_s *event)
+{
        __WDS_LOG_FUNC_ENTER__;
 
        __WDS_LOG_FUNC_EXIT__;
        return;
- }
+}
 
 static void __wfd_process_group_formation_failure(wfd_manager_s *manager, wfd_oem_event_s *event)
 {
@@ -1270,12 +1205,14 @@ static void __wfd_process_group_formation_failure(wfd_manager_s *manager, wfd_oe
                return;
        }
 
-       wifi_direct_client_noti_s noti;
-       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
-       noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
-       snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
-       wfd_client_send_event(manager, &noti);
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
+       g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "Connection",
+                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
+                                                           WFD_EVENT_CONNECTION_RSP,
+                                                           peer_mac_address));
+
        wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
        wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
        wfd_destroy_session(manager);
@@ -1290,14 +1227,9 @@ static void __wfd_process_group_formation_failure(wfd_manager_s *manager, wfd_oe
 static void __wfd_process_serv_disc_resp(wfd_manager_s *manager, wfd_oem_event_s *event)
 {
        __WDS_LOG_FUNC_ENTER__;
-
-       wifi_direct_client_noti_s noti;
-
-       if (event == NULL || manager == NULL) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
-               return;
-       }
+       int service_type;
+       char response_data[256] = {0, };
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
 
        wfd_update_peer_time(manager, event->dev_addr);
 
@@ -1312,19 +1244,22 @@ static void __wfd_process_serv_disc_resp(wfd_manager_s *manager, wfd_oem_event_s
                temp = g_list_first(services);
                while(temp && count < event->dev_role) {
                        service = (wfd_oem_new_service_s*) temp->data;
-                       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-                       noti.event = WIFI_DIRECT_CLI_EVENT_SERVICE_DISCOVERY_FOUND;
-                       noti.type = service->protocol;
+                       service_type = service->protocol;
                        if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
-                               g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
-                               g_snprintf(noti.param2, 256, "%s|%s", service->data.bonjour.query, service->data.bonjour.rdata);
+                               g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
+                               g_snprintf(response_data, 256, "%s|%s", service->data.bonjour.query, service->data.bonjour.rdata);
                                WDS_LOGD("Found service: [%d: %s] - [" MACSECSTR "]", service->protocol,
                                                        service->data.bonjour.query, MAC2SECSTR(event->dev_addr));
                        } else {
                                WDS_LOGD("Found service is not supported");
                                goto next;
                        }
-                       wfd_client_send_event(manager, &noti);
+
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
+                                                    "DiscoveryFound",
+                                                    g_variant_new("(iss)", service_type,
+                                                                           response_data,
+                                                                           peer_mac_address));
 next:
                        temp = g_list_next(temp);
                        service = NULL;
@@ -1333,18 +1268,21 @@ next:
        } else if (event->edata_type == WFD_OEM_EDATA_TYPE_SERVICE) {
                wfd_oem_service_data_s *edata = (wfd_oem_service_data_s*) event->edata;
 
-               memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-               noti.event = WIFI_DIRECT_CLI_EVENT_SERVICE_DISCOVERY_FOUND;
                if(!edata) {
-                       noti.type = -1;
+                       service_type = -1;
                } else {
-                       noti.type = edata->type;
-                       g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
+                       service_type = edata->type;
+                       g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
                        switch(edata->type) {
                                WDS_LOGE("Unknown type [type ID: %d]", edata->type);
                        }
                }
-               wfd_client_send_event(manager, &noti);
+
+               wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
+                                            "DiscoveryFound",
+                                            g_variant_new("(iss)", service_type,
+                                                                   response_data,
+                                                                   peer_mac_address));
        }
 
        __WDS_LOG_FUNC_EXIT__;
index ecee9d2..4340342 100755 (executable)
@@ -41,7 +41,8 @@
 #include "wifi-direct-group.h"
 #include "wifi-direct-util.h"
 #include "wifi-direct-session.h"
-#include "wifi-direct-client.h"
+#include "wifi-direct-log.h"
+
 
 // Check the group instance which has same interface name, before using this function
 wfd_group_s *wfd_create_group(void *data, wfd_oem_event_s *group_info)
diff --git a/src/wifi-direct-iface.c b/src/wifi-direct-iface.c
new file mode 100644 (file)
index 0000000..93f7b82
--- /dev/null
@@ -0,0 +1,1824 @@
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file implements wifi direct manager interface functions.
+ *
+ * @file        wifi-direct-iface.c
+ * @author      Nishant Chaprana (n.chaprana@samsung.com)
+ * @version     0.1
+ */
+
+#include <stdlib.h>
+
+#include <wifi-direct.h>
+
+#include "wifi-direct-dbus.h"
+#include "wifi-direct-iface.h"
+#include "wifi-direct-ipc.h"
+#include "wifi-direct-error.h"
+#include "wifi-direct-log.h"
+#include "wifi-direct-manager.h"
+#include "wifi-direct-oem.h"
+#include "wifi-direct-session.h"
+#include "wifi-direct-util.h"
+#include "wifi-direct-group.h"
+#include "wifi-direct-state.h"
+#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
+#include "wifi-direct-service.h"
+#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
+
+static int macaddr_atoe(const char *p, unsigned char mac[])
+{
+       int i = 0;
+
+       for (;;) {
+               mac[i++] = (char) strtoul(p, (char **) &p, 16);
+               if (!*p++ || i == 6)
+                       break;
+       }
+
+       return (i == 6);
+}
+
+// introspection xml to register interfaces
+const gchar wfd_manager_introspection_xml[] = {
+       "<node name='/net/wifidirect'>"
+               "<interface name='net.wifidirect'>"
+                       "<method name='Activate'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='Deactivate'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='StartDiscovery'>"
+                               "<arg type='a{sv}' name='parameters' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='StopDiscovery'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='GetDiscoveredPeers'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='aa{sv}' name='peer_details_list' direction='out'/>"
+                       "</method>"
+                       "<method name='Connect'>"
+                               "<arg type='s' name='mac_address' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='Disconnect'>"
+                               "<arg type='s' name='mac_address' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='CancelConnection'>"
+                               "<arg type='s' name='mac_address' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='AcceptConnection'>"
+                               "<arg type='s' name='mac_address' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='RejectConnection'>"
+                               "<arg type='s' name='mac_address' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='DisconnectAll'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='GetConnectedPeers'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='aa{sv}' name='peer_details_list' direction='out'/>"
+                       "</method>"
+                       "<method name='IsDiscoverable'>"
+                               "<arg type='b' name='result' direction='out'/>"
+                       "</method>"
+                       "<method name='IsListeningOnly'>"
+                               "<arg type='b' name='result' direction='out'/>"
+                       "</method>"
+                       "<method name='GetPeerInfo'>"
+                               "<arg type='s' name='mac_address' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='a{sv}' name='peer_details' direction='out'/>"
+                       "</method>"
+                       "<method name='GetState'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='i' name='state' direction='out'/>"
+                       "</method>"
+                       "<signal name='Activation'>"
+                               "<arg type='i' name='error_code'/>"
+                       "</signal>"
+                       "<signal name='Deactivation'>"
+                               "<arg type='i' name='error_code'/>"
+                       "</signal>"
+                       "<signal name='Connection'>"
+                               "<arg type='i' name='error_code'/>"
+                               "<arg type='i' name='connection_state'/>"
+                               "<arg type='s' name='peer_mac_address'/>"
+                       "</signal>"
+                       "<signal name='Disconnection'>"
+                               "<arg type='i' name='error_code'/>"
+                               "<arg type='i' name='connection_state'/>"
+                               "<arg type='s' name='peer_mac_address'/>"
+                       "</signal>"
+                       "<signal name='ListenStarted'>"
+                       "</signal>"
+                       "<signal name='DiscoveryStarted'>"
+                       "</signal>"
+                       "<signal name='DiscoveryFinished'>"
+                       "</signal>"
+                       "<signal name='PeerFound'>"
+                               "<arg type='s' name='peer_mac_address'/>"
+                       "</signal>"
+                       "<signal name='PeerLost'>"
+                               "<arg type='s' name='peer_mac_address'/>"
+                       "</signal>"
+                       "<signal name='PeerIPAssigned'>"
+                               "<arg type='s' name='peer_mac_address'/>"
+                               "<arg type='s' name='assigned_ip_address'/>"
+                       "</signal>"
+               "</interface>"
+               "<interface name='net.wifidirect.group'>"
+                       "<method name='CreateGroup'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='DestroyGroup'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='IsGroupOwner'>"
+                               "<arg type='b' name='result' direction='out'/>"
+                       "</method>"
+                       "<method name='IsAutoGroup'>"
+                               "<arg type='b' name='result' direction='out'/>"
+                       "</method>"
+                       "<method name='ActivatePushButton'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='GetPersistentGroups'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='aa{sv}' name='result' direction='out'/>"
+                       "</method>"
+                       "<method name='RemovePersistentGroup'>"
+                               "<arg type='s' name='mac_address' direction='in'/>"
+                               "<arg type='s' name='ssid' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='SetPassphrase'>"
+                               "<arg type='s' name='passphrase' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='GetPassphrase'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='s' name='passphrase' direction='out'/>"
+                       "</method>"
+                       "<method name='SetPersistentGroupEnabled'>"
+                               "<arg type='b' name='enable' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='IsPersistentGroupEnabled'>"
+                               "<arg type='b' name='result' direction='out'/>"
+                       "</method>"
+                       "<signal name='Created'>"
+                       "</signal>"
+                       "<signal name='Destroyed'>"
+                       "</signal>"
+               "</interface>"
+               "<interface name='net.wifidirect.config'>"
+                       "<method name='GetDeviceName'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='s' name='device_name' direction='out'/>"
+                       "</method>"
+                       "<method name='SetDeviceName'>"
+                               "<arg type='s' name='device_name' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='SetWpsPin'>"
+                               "<arg type='s' name='wps_pin' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='GetWpsPin'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='s' name='wps_pin' direction='out'/>"
+                       "</method>"
+                       "<method name='GenerateWpsPin'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='s' name='wps_pin' direction='out'/>"
+                       "</method>"
+                       "<method name='GetSupportedWpsMode'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='i' name='config_methods' direction='out'/>"
+                       "</method>"
+                       "<method name='GetReqWpsMode'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='i' name='req_wps_mode' direction='out'/>"
+                       "</method>"
+                       "<method name='SetReqWpsMode'>"
+                               "<arg type='i' name='req_wps_mode' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='GetLocalWpsMode'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='i' name='local_wps_mode' direction='out'/>"
+                       "</method>"
+                       "<method name='GetIPAddress'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='s' name='local_ip_address' direction='out'/>"
+                       "</method>"
+                       "<method name='GetMacAddress'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='s' name='local_mac_address' direction='out'/>"
+                       "</method>"
+                       "<method name='GetGoIntent'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='i' name='go_intent' direction='out'/>"
+                       "</method>"
+                       "<method name='SetGoIntent'>"
+                               "<arg type='i' name='go_intent' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='GetMaxClient'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='i' name='max_client' direction='out'/>"
+                       "</method>"
+                       "<method name='SetMaxClient'>"
+                               "<arg type='i' name='max_client' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='SetAutoConnectionMode'>"
+                               "<arg type='b' name='auto_connection_mode' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='IsAutoConnectionMode'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='b' name='result' direction='out'/>"
+                       "</method>"
+                       "<method name='GetOperatingChannel'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='i' name='operating_channel' direction='out'/>"
+                       "</method>"
+                       "<method name='SetAutoConnectionPeer'>"
+                               "<arg type='s' name='peer_mac_address' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+               "</interface>"
+#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
+               "<interface name='net.wifidirect.service'>"
+                       "<method name='StartDiscovery'>"
+                               "<arg type='i' name='service_type' direction='in'/>"
+                               "<arg type='s' name='mac_addr' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='StopDiscovery'>"
+                               "<arg type='i' name='service_type' direction='in'/>"
+                               "<arg type='s' name='mac_addr' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='Register'>"
+                               "<arg type='i' name='service_type' direction='in'/>"
+                               "<arg type='s' name='info_string' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='i' name='service_id' direction='out'/>"
+                       "</method>"
+                       "<method name='Deregister'>"
+                               "<arg type='i' name='service_id' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<signal name='DiscoveryStarted'>"
+                       "</signal>"
+                       "<signal name='DiscoveryFound'>"
+                               "<arg type='i' name='service_type'/>"
+                               "<arg type='s' name='response_data'/>"
+                               "<arg type='s' name='peer_mac_address'/>"
+                       "</signal>"
+                       "<signal name='DiscoveryFinished'>"
+                       "</signal>"
+               "</interface>"
+#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
+#ifdef TIZEN_FEATURE_WIFI_DISPLAY
+               "<interface name='net.wifidirect.display'>"
+                       "<method name='Init'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='Deinit'>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='SetConfig'>"
+                               "<arg type='i' name='type' direction='in'/>"
+                               "<arg type='i' name='port' direction='in'/>"
+                               "<arg type='i' name='hdcp' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='SetAvailiability'>"
+                               "<arg type='i' name='availability' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                       "</method>"
+                       "<method name='GetPeerType'>"
+                               "<arg type='s' name='peer_mac_addr' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='i' name='result' direction='out'/>"
+                       "</method>"
+                       "<method name='GetPeerAvailability'>"
+                               "<arg type='s' name='peer_mac_addr' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='i' name='result' direction='out'/>"
+                       "</method>"
+                       "<method name='GetPeerHdcp'>"
+                               "<arg type='s' name='peer_mac_addr' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='i' name='result' direction='out'/>"
+                       "</method>"
+                       "<method name='GetPeerPort'>"
+                               "<arg type='s' name='peer_mac_addr' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='i' name='result' direction='out'/>"
+                       "</method>"
+                       "<method name='GetPeerThroughput'>"
+                               "<arg type='s' name='peer_mac_addr' direction='in'/>"
+                               "<arg type='i' name='error_code' direction='out'/>"
+                               "<arg type='i' name='result' direction='out'/>"
+                       "</method>"
+               "</interface>"
+#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+       "</node>"
+};
+
+static int __wfd_manager_manage_iface_handler(const gchar *method_name,
+                                             GVariant    *parameters,
+                                             GVariant    **return_parameters)
+{
+       int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       wfd_manager_s *manager = wfd_get_manager();
+
+       if (!g_strcmp0(method_name, "Activate")) {
+               ret = wfd_manager_activate(manager);
+               if (ret == WIFI_DIRECT_ERROR_NONE)
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "Activation",
+                                                    g_variant_new("(i)", ret));
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "Deactivate")) {
+               ret = wfd_manager_deactivate(manager);
+               if (ret == WIFI_DIRECT_ERROR_NONE)
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "Deactivation",
+                                                    g_variant_new("(i)", ret));
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "StartDiscovery")) {
+               gboolean mode = FALSE;
+               gint32 timeout = 0;
+               guint32 channel = 0;
+               const gchar *type = NULL;
+               GVariantIter *iter = NULL;
+               gchar *key = NULL;
+               GVariant *var = NULL;
+
+               g_variant_get(parameters, "(a{sv})", &iter);
+               while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
+                       if (!g_strcmp0(key, "Mode"))
+                               g_variant_get(var, "b", &mode);
+                       else if (!g_strcmp0(key, "Timeout"))
+                               g_variant_get(var, "i", &timeout);
+                       else if (!g_strcmp0(key, "Type"))
+                               g_variant_get(var, "&s", &type);
+                       else if (!g_strcmp0(key, "Channel"))
+                               g_variant_get(var, "i", &channel);
+                       else
+                               ;/* Do Nothing */
+               }
+               g_variant_iter_free(iter);
+
+               ret = wfd_manager_start_discovery(manager, mode, timeout, type, channel);
+               if (ret == WIFI_DIRECT_ERROR_NONE) {
+                       if (mode == WFD_OEM_SCAN_MODE_PASSIVE) {
+                               wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                            "ListenStarted",
+                                                            NULL);
+                       } else {
+                               wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                            "DiscoveryStarted",
+                                                            NULL);
+                       }
+               }
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "StopDiscovery")) {
+               int mode =  manager->scan_mode;
+               ret = wfd_manager_cancel_discovery(manager);
+               if (ret == WIFI_DIRECT_ERROR_NONE && mode == WFD_SCAN_MODE_PASSIVE)
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "DiscoveryFinished",
+                                                    NULL);
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "GetDiscoveredPeers")) {
+               wfd_discovery_entry_s *peers = NULL;
+               GVariantBuilder *builder_peers = NULL;
+               int peer_cnt = 0;
+               int i = 0;
+
+               builder_peers = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
+
+               peer_cnt = wfd_manager_get_peers(manager, &peers);
+               WDS_LOGD("Peer count [%d], Peer list [%p]", peer_cnt, peers);
+               if (peer_cnt < 0) {
+                       WDS_LOGE("Failed to get scan result");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
+                       g_variant_builder_unref(builder_peers);
+                       goto done;
+               }
+
+               if (peer_cnt > 255)
+                       peer_cnt = 255;
+
+               for (i = 0; i < peer_cnt; i++) {
+                       GVariantBuilder builder_peer;
+                       g_variant_builder_init(&builder_peer, G_VARIANT_TYPE("a{sv}"));
+
+                       g_variant_builder_add(&builder_peer, "{sv}",
+                                       "DeviceName",
+                                       g_variant_new_string(peers[i].device_name));
+                       g_variant_builder_add(&builder_peer, "{sv}",
+                                       "DeviceAddress",
+                                       wfd_manager_dbus_pack_ay(peers[i].mac_address, MACADDR_LEN));
+                       g_variant_builder_add(&builder_peer, "{sv}",
+                                       "InterfaceAddress",
+                                       wfd_manager_dbus_pack_ay(peers[i].intf_address, MACADDR_LEN));
+                       g_variant_builder_add(&builder_peer, "{sv}",
+                                       "Channel",
+                                       g_variant_new_uint16(peers[i].channel));
+#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
+                       g_variant_builder_add(&builder_peer, "{sv}",
+                                       "Services",
+                                       g_variant_new_uint16(peers[i].services));
+#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
+                       g_variant_builder_add(&builder_peer, "{sv}",
+                                       "IsGroupOwner",
+                                       g_variant_new_boolean(peers[i].is_group_owner));
+                       g_variant_builder_add(&builder_peer, "{sv}",
+                                       "IsPersistentGO",
+                                       g_variant_new_boolean(peers[i].is_persistent_go));
+                       g_variant_builder_add(&builder_peer, "{sv}",
+                                       "IsConnected",
+                                       g_variant_new_boolean(peers[i].is_connected));
+                       g_variant_builder_add(&builder_peer, "{sv}",
+                                       "WpsDevicePwdID",
+                                       g_variant_new_uint16(peers[i].wps_device_pwd_id));
+                       g_variant_builder_add(&builder_peer, "{sv}",
+                                       "WpsCfgMethods",
+                                       g_variant_new_uint16(peers[i].wps_cfg_methods));
+                       g_variant_builder_add(&builder_peer, "{sv}",
+                                       "Category",
+                                       g_variant_new_uint16(peers[i].category));
+                       g_variant_builder_add(&builder_peer, "{sv}",
+                                       "SubCategory",
+                                       g_variant_new_uint16(peers[i].subcategory));
+#ifdef TIZEN_FEATURE_WIFI_DISPLAY
+                       g_variant_builder_add(&builder_peer, "{sv}",
+                                       "IsWfdDevice",
+                                       g_variant_new_boolean(peers[i].is_wfd_device));
+#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+
+                       WDS_LOGD("%dth peer [%s]", i, peers[i].device_name);
+                       g_variant_builder_add_value(builder_peers, g_variant_builder_end(&builder_peer));
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
+               g_variant_builder_unref(builder_peers);
+
+       } else if (!g_strcmp0(method_name, "Connect")) {
+               const char *peer_mac_address = NULL;
+               unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+               g_variant_get(parameters, "(&s)", &peer_mac_address);
+               macaddr_atoe(peer_mac_address, mac_addr);
+
+               ret = wfd_manager_connect(manager, mac_addr);
+               if (ret == WIFI_DIRECT_ERROR_NONE)
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "Connection",
+                                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                                           WFD_EVENT_CONNECTION_IN_PROGRESS,
+                                                                           peer_mac_address));
+
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "Disconnect")) {
+               const char *peer_mac_address = NULL;
+               unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+               g_variant_get(parameters, "(&s)", &peer_mac_address);
+               macaddr_atoe(peer_mac_address, mac_addr);
+
+               ret = wfd_manager_disconnect(manager, mac_addr);
+               if (ret == WIFI_DIRECT_ERROR_NONE)
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "Disconnection",
+                                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                                           WFD_EVENT_DISCONNECTION_RSP,
+                                                                           peer_mac_address));
+
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "CancelConnection")) {
+               const char *peer_mac_address = NULL;
+               unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+               g_variant_get(parameters, "(&s)", &peer_mac_address);
+               macaddr_atoe(peer_mac_address, mac_addr);
+
+               ret = wfd_manager_cancel_connection(manager, mac_addr);
+               if (ret == WIFI_DIRECT_ERROR_NONE)
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "Connection",
+                                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_CANCELED,
+                                                                           WFD_EVENT_CONNECTION_RSP,
+                                                                           peer_mac_address));
+
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "AcceptConnection")) {
+               const char *peer_mac_address = NULL;
+               unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+               g_variant_get(parameters, "(&s)", &peer_mac_address);
+               macaddr_atoe(peer_mac_address, mac_addr);
+
+               ret = wfd_manager_accept_connection(manager, mac_addr);
+               if (ret == WIFI_DIRECT_ERROR_NONE) {
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "Connection",
+                                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                                           WFD_EVENT_CONNECTION_IN_PROGRESS,
+                                                                           peer_mac_address));
+               } else {
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "Connection",
+                                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_OPERATION_FAILED,
+                                                                           WFD_EVENT_CONNECTION_RSP,
+                                                                           peer_mac_address));
+               }
+
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "RejectConnection")) {
+               const char *peer_mac_address = NULL;
+               unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+               g_variant_get(parameters, "(&s)", &peer_mac_address);
+               macaddr_atoe(peer_mac_address, mac_addr);
+
+               ret = wfd_manager_reject_connection(manager, mac_addr);
+               if (ret == WIFI_DIRECT_ERROR_NONE)
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "Connection",
+                                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_CANCELED,
+                                                                           WFD_EVENT_CONNECTION_RSP,
+                                                                           peer_mac_address));
+
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "DisconnectAll")) {
+               ret = wfd_manager_disconnect_all(manager);
+               if (ret == WIFI_DIRECT_ERROR_NONE)
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "Disconnection",
+                                                    g_variant_new("(iis)", ret,
+                                                                           WFD_EVENT_DISCONNECTION_RSP,
+                                                                           ""));
+
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "GetConnectedPeers")) {
+               wfd_connected_peer_info_s *peers = NULL;
+               GVariantBuilder *builder_peers = NULL;
+               int peer_cnt = 0;
+               int i = 0;
+
+               builder_peers = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
+
+               // even though status is not CONNECTED, this command can be excuted only when group exist
+               if (!manager->group && manager->state < WIFI_DIRECT_STATE_CONNECTED) {
+                       WDS_LOGD("It's not connected state [%d]", manager->state);
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
+                       g_variant_builder_unref(builder_peers);
+                       goto done;
+               }
+
+               peer_cnt = wfd_manager_get_connected_peers(manager, &peers);
+               WDS_LOGD("Peer count [%d], Peer list [%x]", peer_cnt, peers);
+               if (peer_cnt < 0) {
+                       WDS_LOGE("Failed to get scan result");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
+                       g_variant_builder_unref(builder_peers);
+                       goto done;
+               }
+
+               for (i = 0; i < peer_cnt; i++) {
+                       GVariantBuilder builder_peer;
+                       g_variant_builder_init(&builder_peer, G_VARIANT_TYPE("a{sv}"));
+
+                       g_variant_builder_add(&builder_peer, "{sv}",
+                                       "DeviceName",
+                                       g_variant_new_string(peers[i].device_name));
+                       g_variant_builder_add(&builder_peer, "{sv}",
+                                       "DeviceAddress",
+                                       wfd_manager_dbus_pack_ay(peers[i].mac_address, MACADDR_LEN));
+                       g_variant_builder_add(&builder_peer, "{sv}",
+                                       "InterfaceAddress",
+                                       wfd_manager_dbus_pack_ay(peers[i].intf_address, MACADDR_LEN));
+                       g_variant_builder_add(&builder_peer, "{sv}",
+                                       "IPAddress",
+                                       wfd_manager_dbus_pack_ay(peers[i].ip_address, IPADDR_LEN));
+                       g_variant_builder_add(&builder_peer, "{sv}",
+                                       "Channel",
+                                       g_variant_new_uint16(peers[i].channel));
+#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
+                       g_variant_builder_add(&builder_peer, "{sv}",
+                                       "Services",
+                                       g_variant_new_uint16(peers[i].services));
+#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
+                       g_variant_builder_add(&builder_peer, "{sv}",
+                                       "Category",
+                                       g_variant_new_uint16(peers[i].category));
+                       g_variant_builder_add(&builder_peer, "{sv}",
+                                       "SubCategory",
+                                       g_variant_new_uint16(peers[i].subcategory));
+                       g_variant_builder_add(&builder_peer, "{sv}",
+                                       "IsP2P",
+                                       g_variant_new_boolean(peers[i].is_p2p));
+#ifdef TIZEN_FEATURE_WIFI_DISPLAY
+                       g_variant_builder_add(&builder_peer, "{sv}",
+                                       "IsWfdDevice",
+                                       g_variant_new_boolean(peers[i].is_wfd_device));
+#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+
+                       WDS_LOGD("%dth peer [%s]", i, peers[i].device_name);
+                       g_variant_builder_add_value(builder_peers, g_variant_builder_end(&builder_peer));
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
+               g_variant_builder_unref(builder_peers);
+
+       } else if (!g_strcmp0(method_name, "IsDiscoverable")) {
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(b)",
+                                                  (manager->state == WIFI_DIRECT_STATE_DISCOVERING ||
+                                                   wfd_group_is_autonomous(manager->group) == TRUE));
+
+       } else if (!g_strcmp0(method_name, "IsListeningOnly")) {
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(b)", (manager->scan_mode == WFD_SCAN_MODE_PASSIVE));
+
+       } else if (!g_strcmp0(method_name, "GetPeerInfo")) {
+               wfd_discovery_entry_s *peer = NULL;
+               GVariantBuilder *builder_peer = NULL;
+               const char *peer_mac_address = NULL;
+               unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+               g_variant_get(parameters, "(&s)", &peer_mac_address);
+               macaddr_atoe(peer_mac_address, mac_addr);
+
+               builder_peer = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+
+               ret = wfd_manager_get_peer_info(manager, mac_addr, &peer);
+               if (ret < 0 || !peer) {
+                       WDS_LOGE("Failed to get peer info");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(ia{sv})", ret, builder_peer);
+                       g_free(peer);
+                       goto done;
+               }
+
+               g_variant_builder_add(builder_peer, "{sv}",
+                               "DeviceName",
+                               g_variant_new_string(peer->device_name));
+               g_variant_builder_add(builder_peer, "{sv}",
+                               "DeviceAddress",
+                               wfd_manager_dbus_pack_ay(peer->mac_address, MACADDR_LEN));
+               g_variant_builder_add(builder_peer, "{sv}",
+                               "InterfaceAddress",
+                               wfd_manager_dbus_pack_ay(peer->intf_address, MACADDR_LEN));
+               g_variant_builder_add(builder_peer, "{sv}",
+                               "Channel",
+                               g_variant_new_uint16(peer->channel));
+#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
+               g_variant_builder_add(builder_peer, "{sv}",
+                               "Services",
+                               g_variant_new_uint16(peer->services));
+#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
+               g_variant_builder_add(builder_peer, "{sv}",
+                               "IsGroupOwner",
+                               g_variant_new_boolean(peer->is_group_owner));
+               g_variant_builder_add(builder_peer, "{sv}",
+                               "IsPersistentGO",
+                               g_variant_new_boolean(peer->is_persistent_go));
+               g_variant_builder_add(builder_peer, "{sv}",
+                               "IsConnected",
+                               g_variant_new_boolean(peer->is_connected));
+               g_variant_builder_add(builder_peer, "{sv}",
+                               "WpsDevicePwdID",
+                               g_variant_new_uint16(peer->wps_device_pwd_id));
+               g_variant_builder_add(builder_peer, "{sv}",
+                               "WpsCfgMethods",
+                               g_variant_new_uint16(peer->wps_cfg_methods));
+               g_variant_builder_add(builder_peer, "{sv}",
+                               "Category",
+                               g_variant_new_uint16(peer->category));
+               g_variant_builder_add(builder_peer, "{sv}",
+                               "SubCategory",
+                               g_variant_new_uint16(peer->subcategory));
+#ifdef TIZEN_FEATURE_WIFI_DISPLAY
+               g_variant_builder_add(builder_peer, "{sv}",
+                               "IsWfdDevice",
+                               g_variant_new_boolean(peer->is_wfd_device));
+#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(ia{sv})", ret, builder_peer);
+               g_variant_builder_unref(builder_peer);
+               g_free(peer);
+
+       } else if (!g_strcmp0(method_name, "GetState")) {
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(ii)", ret, manager->state);
+
+       } else {
+               WDS_LOGD("method not handled");
+               ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+
+done:
+       return ret;
+}
+
+static int __wfd_manager_group_iface_handler(const gchar *method_name,
+                                            GVariant    *parameters,
+                                            GVariant    **return_parameters)
+{
+       int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       wfd_manager_s *manager = wfd_get_manager();
+       WDS_LOGD("%s", method_name);
+
+       if (!g_strcmp0(method_name, "CreateGroup")) {
+               wfd_group_s *group = manager->group;
+               wfd_oem_group_param_s param;
+
+               if (group || manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+                       WDS_LOGE("Group already exist or not a proper state");
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+#ifdef TIZEN_WLAN_BOARD_SPRD
+               group = wfd_create_pending_group(manager, manager->local->dev_addr);
+#else
+               group = wfd_create_pending_group(manager, manager->local->intf_addr);
+#endif
+               if (!group) {
+                       WDS_LOGE("Failed to create pending group");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+               group->flags |= WFD_GROUP_FLAG_AUTONOMOUS;
+               manager->group = group;
+
+               memset(&param, 0x0, sizeof(param));
+
+               param.persistent = (manager->local->group_flags &
+                                       WFD_GROUP_FLAG_PERSISTENT);
+               memcpy(&(param.passphrase), manager->local->passphrase,
+                                       sizeof(param.passphrase));
+
+#ifndef TIZEN_WLAN_BOARD_SPRD
+               param.freq = WFD_FREQ_2G;
+#endif
+
+               ret = wfd_oem_create_group(manager->oem_ops, &param);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to create group");
+                       wfd_destroy_group(manager, GROUP_IFNAME);
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(i)", ret);
+               }
+
+               WDS_LOGD("Succeeded to create pending group");
+               memset(manager->local->passphrase, 0x0, PASSPHRASE_LEN_MAX + 1);
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "DestroyGroup")) {
+               wfd_group_s *group = manager->group;
+               if (!group && manager->state < WIFI_DIRECT_STATE_CONNECTED) {
+                       WDS_LOGE("Group not exist");
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               ret = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to destroy group");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               ret = wfd_destroy_group(manager, group->ifname);
+               if (ret < 0)
+                       WDS_LOGE("Failed to destroy group");
+
+               wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+               wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+
+               wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
+                               "Destroyed", NULL);
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "IsGroupOwner")) {
+               gboolean result;
+               wfd_device_s *local = manager->local;
+               result = local->dev_role == WFD_DEV_ROLE_GO;
+               WDS_LOGI("Is group owner : [%s]", result ? "Yes" : "No");
+               *return_parameters = g_variant_new("(b)", result);
+               ret = WIFI_DIRECT_ERROR_NONE;
+
+       } else if (!g_strcmp0(method_name, "IsAutoGroup")) {
+               int result;
+               if ((result = wfd_group_is_autonomous(manager->group)) < 0) {
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       goto done;
+               }
+               WDS_LOGI("Is autonomous group : [%s]", result ? "Yes" : "No");
+               *return_parameters = g_variant_new("(b)", result);
+               ret = WIFI_DIRECT_ERROR_NONE;
+
+       } else if (!g_strcmp0(method_name, "ActivatePushButton")) {
+               if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
+                       WDS_LOGE("Wi-Fi Direct is not Group Owner.");
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               ret = wfd_oem_wps_start(manager->oem_ops, NULL,
+                               WFD_WPS_MODE_PBC, NULL);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to start wps");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "GetPersistentGroups")) {
+               int persistent_group_count = 0;
+               wfd_persistent_group_info_s *plist;
+               GVariantBuilder *builder_groups = NULL;
+               int i = 0;
+
+               builder_groups = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
+
+               if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+                       WDS_LOGE("Wi-Fi Direct is not activated.");
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(iaa{sv})", ret, builder_groups);
+                       g_variant_builder_unref(builder_groups);
+                       goto done;
+               }
+
+               ret = wfd_oem_get_persistent_groups(manager->oem_ops,
+                               (wfd_oem_persistent_group_s**) &plist, &persistent_group_count);
+               if (ret < 0) {
+                       WDS_LOGE("Error!! wfd_oem_get_persistent_group_info() failed..");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(iaa{sv})", ret, builder_groups);
+                       g_variant_builder_unref(builder_groups);
+                       goto done;
+               }
+
+               for (i = 0; i < persistent_group_count; i++) {
+                       GVariantBuilder builder_group;
+                       g_variant_builder_init(&builder_group, G_VARIANT_TYPE("a{sv}"));
+
+                       g_variant_builder_add(&builder_group, "{sv}",
+                                       "NetworkID",
+                                       g_variant_new_uint32(plist[i].network_id));
+                       g_variant_builder_add(&builder_group, "{sv}",
+                                       "SSID",
+                                       g_variant_new_string(plist[i].ssid));
+                       g_variant_builder_add(&builder_group, "{sv}",
+                                       "GOMacAddress",
+                                       wfd_manager_dbus_pack_ay(plist[i].go_mac_address, MACADDR_LEN));
+
+                       WDS_LOGD("%dth peer [%s]", i, plist[i].ssid);
+                       g_variant_builder_add_value(builder_groups, g_variant_builder_end(&builder_group));
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(iaa{sv})", ret, builder_groups);
+               g_variant_builder_unref(builder_groups);
+
+       } else if (!g_strcmp0(method_name, "RemovePersistentGroup")) {
+               gchar *ssid;
+               gchar *mac_address;
+               unsigned char go_mac_address[6];
+               if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+                       WDS_LOGE("Wi-Fi Direct is not activated.");
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               g_variant_get(parameters, "(&s&s)", &mac_address, &ssid);
+               macaddr_atoe(mac_address, go_mac_address);
+               WDS_LOGD("Remove persistent group [%s][" MACSTR "]", ssid, MAC2STR(go_mac_address));
+
+               ret = wfd_oem_remove_persistent_group(manager->oem_ops, ssid,
+                               go_mac_address);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to remove persistent group");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "SetPassphrase")) {
+               gchar *passphrase;
+               int passphrase_len = 0;
+               wfd_group_s *group = manager->group;
+
+               if (group) {
+                       WDS_LOGE("Group already exists");
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               g_variant_get(parameters, "(&s)", &passphrase);
+               passphrase_len = strlen(passphrase);
+
+               if (passphrase_len < PASSPHRASE_LEN_MIN ||
+                               passphrase_len > PASSPHRASE_LEN_MAX) {
+                       WDS_LOGE("Passphrase length incorrect [%s]:[%d]",
+                                       passphrase, passphrase_len);
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               g_strlcpy(manager->local->passphrase, passphrase, PASSPHRASE_LEN_MAX + 1);
+               WDS_LOGI("Passphrase string [%s]", manager->local->passphrase);
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "GetPassphrase")) {
+               wfd_group_s *group = manager->group;
+               if (!group) {
+                       WDS_LOGE("Group not exist");
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(is)", ret, "");
+                       goto done;
+               }
+
+               if (group->role == WFD_DEV_ROLE_GC) {
+                       WDS_LOGE("Device is not GO");
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(is)", ret, "");
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(is)", ret, group->passphrase);
+               WDS_LOGI("group->pass : [%s]", group->passphrase);
+
+       } else if (!g_strcmp0(method_name, "SetPersistentGroupEnabled")) {
+               gboolean enabled;
+
+               g_variant_get(parameters, "(b)", &enabled);
+               WDS_LOGI("Activate Persistent Group : [%s]",
+                               enabled ? "True" : "False");
+               if (enabled)
+                       manager->local->group_flags |= WFD_GROUP_FLAG_PERSISTENT;
+               else
+                       manager->local->group_flags &= ~(WFD_GROUP_FLAG_PERSISTENT);
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "IsPersistentGroupEnabled")) {
+               gboolean result;
+               result = ((manager->local->group_flags &
+                                       WFD_GROUP_FLAG_PERSISTENT)
+                               == WFD_GROUP_FLAG_PERSISTENT);
+               WDS_LOGI("Is persistent group : [%s]", result ? "Yes" : "No");
+               *return_parameters = g_variant_new("(b)", result);
+               ret = WIFI_DIRECT_ERROR_NONE;
+
+       } else {
+               WDS_LOGD("method not handled");
+               ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+
+done:
+       return ret;
+}
+
+static int __wfd_manager_config_iface_handler(const gchar *method_name,
+                                             GVariant    *parameters,
+                                             GVariant    **return_parameters)
+{
+       int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       wfd_manager_s *manager = wfd_get_manager();
+       WDS_LOGD("%s", method_name);
+
+       if (!g_strcmp0(method_name, "GetDeviceName")) {
+               char device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN+1] = {0, };
+
+               ret = wfd_local_get_dev_name(device_name);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to get device name");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(is)", ret, "");
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(is)", ret, device_name);
+
+       } else if (!g_strcmp0(method_name, "SetDeviceName")) {
+               const char *device_name = NULL;
+               g_variant_get(parameters, "(&s)", &device_name);
+
+               ret = wfd_local_set_dev_name((char *)device_name);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to set device name");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "GetWpsPin")) {
+               wfd_session_s *session = (wfd_session_s*) manager->session;
+               if (!session || manager->auto_pin[0] != 0) {
+                       WDS_LOGE("Session not exist");
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(is)", ret, "");
+                       goto done;
+               }
+
+               if (session->wps_pin[0] == '\0') {
+                       WDS_LOGE("WPS PIN is not set");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(is)", ret, "");
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(is)", ret, session->wps_pin);
+
+       } else if (!g_strcmp0(method_name, "SetWpsPin")) {
+               const char *pin = NULL;
+               wfd_session_s *session = (wfd_session_s*) manager->session;
+
+               g_variant_get(parameters, "(&s)", &pin);
+
+               if (!session) {
+                       WDS_LOGE("Session not exist");
+                       g_strlcpy(manager->auto_pin, pin, strlen(pin) + 1);
+               } else {
+                       g_strlcpy(session->wps_pin, pin, strlen(pin) + 1);
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "GetSupportedWpsMode")) {
+               int config_methods = 0;
+
+               ret = wfd_local_get_supported_wps_mode(&config_methods);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to get supported wps mode");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(ii)", ret, config_methods);
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(ii)", ret, config_methods);
+
+       } else if (!g_strcmp0(method_name, "GetReqWpsMode")) {
+               int wps_mode = 0;
+
+               ret = wfd_manager_get_req_wps_mode(&wps_mode);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to get request wps mode");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(ii)", ret, wps_mode);
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(ii)", ret, wps_mode);
+
+       } else if (!g_strcmp0(method_name, "SetReqWpsMode")) {
+               int type = 0;
+
+               g_variant_get(parameters, "(i)", &type);
+               ret = wfd_manager_set_req_wps_mode(type);
+               if(ret < 0) {
+                       WDS_LOGE("Failed to set request wps mode");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "GetLocalWpsMode")) {
+               int wps_mode = 0;
+
+               ret = wfd_local_get_wps_mode(&wps_mode);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to get request wps mode");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(ii)", ret, 0);
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(ii)", ret, wps_mode);
+
+       } else if (!g_strcmp0(method_name, "GetIPAddress")) {
+               unsigned char ip_addr[IPADDR_LEN] = {0,};
+               char ip_addr_str[IPSTR_LEN+1] = {0, };
+
+               if (manager->state < WIFI_DIRECT_STATE_CONNECTED) {
+                       WDS_LOGE("Device is not connected yet");
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       g_snprintf(ip_addr_str, IPSTR_LEN, IPSTR, IP2STR(ip_addr));
+                       *return_parameters = g_variant_new("(is)", ret, ip_addr_str);
+                       goto done;
+               }
+
+               ret = wfd_local_get_ip_addr((char *)ip_addr);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to get local IP address");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       g_snprintf(ip_addr_str, IPSTR_LEN, IPSTR, IP2STR(ip_addr));
+                       *return_parameters = g_variant_new("(is)", ret, ip_addr_str);
+                       goto done;
+               }
+
+               g_snprintf(ip_addr_str, IPSTR_LEN, IPSTR, IP2STR(ip_addr));
+               *return_parameters = g_variant_new("(is)", ret, ip_addr_str);
+               WDS_LOGI("IP addr : [%s]", ip_addr_str);
+
+       } else if (!g_strcmp0(method_name, "GetMacAddress")) {
+               char device_mac[MACSTR_LEN+1] = {0, };
+
+               ret = wfd_local_get_dev_mac(device_mac);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to get device mac");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(is)", "");
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(is)", ret, device_mac);
+
+       } else if (!g_strcmp0(method_name, "GetGoIntent")) {
+               int go_intent = 0;
+
+               ret = wfd_manager_get_go_intent(&go_intent);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to get GO intent");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(ii)", ret, 0);
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(ii)", ret, go_intent);
+
+       } else if (!g_strcmp0(method_name, "SetGoIntent")) {
+               int go_intent = 0;
+
+               g_variant_get(parameters, "(i)", &go_intent);
+               ret = wfd_manager_set_go_intent(go_intent);
+               if(ret < 0) {
+                       WDS_LOGE("Failed to set GO intent");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "GetMaxClient")) {
+               int max_client = 0;
+
+               ret = wfd_manager_get_max_station(&max_client);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to get max station");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(ii)", ret, 0);
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(ii)", ret, max_client);
+
+       } else if (!g_strcmp0(method_name, "SetMaxClient")) {
+               int max_client = 0;
+               g_variant_get(parameters, "(i)", &max_client);
+
+               ret = wfd_manager_set_max_station(max_client);
+               if(ret < 0) {
+                       WDS_LOGE("Failed to set max station");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "SetAutoConnectionMode")) {
+               gboolean mode = FALSE;
+
+               g_variant_get(parameters, "(b)", &mode);
+               ret = wfd_manager_set_autoconnection(mode);
+               if(ret < 0) {
+                       WDS_LOGE("Failed to set autoconnection");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "IsAutoConnectionMode")) {
+               int mode = 0;
+
+               ret = wfd_manager_get_autoconnection(&mode);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to get autoconnection");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(ib)", ret, FALSE);
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(ib)", ret, mode);
+
+       } else if (!g_strcmp0(method_name, "GetOperatingChannel")) {
+               int channel = 0;
+
+               wfd_group_s *group = manager->group;
+               if (!group) {
+                       WDS_LOGE("Group not exist");
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(ii)", ret, 0);
+                       goto done;
+               }
+
+               channel = wfd_util_freq_to_channel(group->freq);
+               if (channel < 0) {
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(ii)", ret, 0);
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(ii)", ret, channel);
+
+       } else if (!g_strcmp0(method_name, "SetAutoConnectionPeer")) {
+               ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else {
+               WDS_LOGD("method not handled");
+               ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+
+done:
+       return ret;
+}
+
+#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
+static int __wfd_manager_service_iface_handler(const gchar *method_name,
+                                              GVariant    *parameters,
+                                              GVariant    **return_parameters)
+{
+       int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       wfd_manager_s *manager = wfd_get_manager();
+       WDS_LOGD("%s", method_name);
+
+       if (!g_strcmp0(method_name, "StartDiscovery")) {
+               const char *mac_address = NULL;
+               int service_type;
+               unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+               if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+                       WDS_LOGE("Wi-Fi Direct is not activated.");
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               g_variant_get(parameters, "(i&s)", &service_type, &mac_address);
+               WDS_LOGD("Service type [%d]", service_type);
+               macaddr_atoe(mac_address, mac_addr);
+
+               ret = wfd_oem_start_service_discovery(manager->oem_ops,
+                               mac_addr, service_type);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to start service discovery");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(i)", ret);
+
+               wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
+                               "DiscoveryStarted", NULL);
+
+       } else if (!g_strcmp0(method_name, "StopDiscovery")) {
+               const char *mac_address = NULL;
+               int service_type;
+               unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+               if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+                       WDS_LOGE("Wi-Fi Direct is not activated.");
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               g_variant_get(parameters, "(i&s)", &service_type, &mac_address);
+               WDS_LOGD("Service type [%d]", service_type);
+               macaddr_atoe(mac_address, mac_addr);
+
+               ret = wfd_oem_cancel_service_discovery(manager->oem_ops,
+                               mac_addr, service_type);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to cancel service discovery");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "Register")) {
+               int service_type;
+               int service_id = 0;
+               const char *info_str = NULL;
+
+               if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+                       WDS_LOGE("Wi-Fi Direct is not activated.");
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(ii)", ret, service_id);
+                       goto done;
+               }
+
+               g_variant_get(parameters, "(i&s)", &service_type, &info_str);
+               WDS_LOGD("Register service [%d: %s]", service_type, info_str);
+
+               ret = wfd_service_add(service_type, (char *)info_str, &service_id);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to add service");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(ii)", ret, service_id);
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(ii)", ret, service_id);
+
+       } else if (!g_strcmp0(method_name, "Deregister")) {
+               int service_id = 0;
+
+               if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+                       WDS_LOGE("Wi-Fi Direct is not activated.");
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               g_variant_get(parameters, "(i)", &service_id);
+               WDS_LOGD("Service id [%d]", service_id);
+
+               ret = wfd_service_del(service_id);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to delete service");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else {
+               WDS_LOGD("method not handled");
+               ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+
+done:
+       return ret;
+}
+#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
+
+#ifdef TIZEN_FEATURE_WIFI_DISPLAY
+static int __wfd_manager_display_iface_handler(const gchar *method_name,
+                                              GVariant    *parameters,
+                                              GVariant    **return_parameters)
+{
+       int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       wfd_manager_s *manager = wfd_get_manager();
+       WDS_LOGD("%s", method_name);
+
+       if (!g_strcmp0(method_name, "Init")) {
+               if(manager->state < WIFI_DIRECT_STATE_ACTIVATED ||
+                               manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               wfd_device_s * device = manager->local;
+
+               ret = wfd_oem_miracast_init(manager->oem_ops, TRUE);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to initialize display");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               device->display.type = WIFI_DISPLAY_DEFAULT_TYPE;
+               device->display.port = WIFI_DISPLAY_DEFAULT_PORT;
+               device->display.availability = WIFI_DISPLAY_DEFAULT_AVAIL;
+               device->display.hdcp_support = WIFI_DISPLAY_DEFAULT_HDCP;
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "Deinit")) {
+               if(manager->state < WIFI_DIRECT_STATE_ACTIVATED ||
+                               manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               wfd_device_s * device = manager->local;
+
+               ret = wfd_oem_miracast_init(manager->oem_ops, FALSE);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to deinitialize display");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               memset(&(device->display), 0x0, sizeof(wfd_display_type_e));
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "SetConfig")) {
+               int type, port, hdcp;
+               g_variant_get(parameters, "(iii)", &type, &port, &hdcp);
+
+               if(manager->state < WIFI_DIRECT_STATE_ACTIVATED ||
+                               manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               WDS_LOGD("type %d port %d hdcp %d", type, port, hdcp);
+
+               ret = wfd_manager_set_display_device(type, port, hdcp);
+               if(ret < 0) {
+                       WDS_LOGE("Failed to set display device settings");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "SetAvailiability")) {
+               int availability;
+               g_variant_get(parameters, "(i)", &availability);
+
+               if(manager->state < WIFI_DIRECT_STATE_ACTIVATED ||
+                               manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               ret = wfd_manager_set_session_availability(availability);
+               if (ret < 0) {
+                       WDS_LOGE("Failed to set session availability");
+                       ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       *return_parameters = g_variant_new("(i)", ret);
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(i)", ret);
+
+       } else if (!g_strcmp0(method_name, "GetPeerType")) {
+               wfd_device_s *peer = NULL;
+               const char *mac_address = NULL;
+               unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+               g_variant_get(parameters, "(&s)", &mac_address);
+               macaddr_atoe(mac_address, mac_addr);
+
+               if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(ii)", ret, 0);
+                       goto done;
+               }
+
+               peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
+               if(!peer) {
+                       WDS_LOGE("Failed to get peer");
+                       ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
+                       *return_parameters = g_variant_new("(ii)", ret, 0);
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(ii)", ret, peer->display.type);
+
+       } else if (!g_strcmp0(method_name, "GetPeerAvailability")) {
+               wfd_device_s *peer = NULL;
+               const char *mac_address = NULL;
+               unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+               g_variant_get(parameters, "(&s)", &mac_address);
+               macaddr_atoe(mac_address, mac_addr);
+
+               if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(ii)", ret, 0);
+                       goto done;
+               }
+
+               peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
+               if(peer) {
+                       WDS_LOGE("Failed to get peer");
+                       ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
+                       *return_parameters = g_variant_new("(ii)", ret, 0);
+                       goto done;
+               }
+
+               *return_parameters = g_variant_new("(ii)", ret, peer->display.availability);
+               ret = WIFI_DIRECT_ERROR_NONE;
+
+       } else if (!g_strcmp0(method_name, "GetPeerHdcp")) {
+               wfd_device_s *peer = NULL;
+               const char *mac_address = NULL;
+               unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+               g_variant_get(parameters, "(&s)", &mac_address);
+               macaddr_atoe(mac_address, mac_addr);
+
+               if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(ii)", ret, 0);
+                       goto done;
+               }
+
+               peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
+               if(peer) {
+                       WDS_LOGE("Failed to get peer");
+                       ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
+                       *return_parameters = g_variant_new("(ii)", ret, 0);
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(ii)", ret, peer->display.hdcp_support);
+
+       } else if (!g_strcmp0(method_name, "GetPeerPort")) {
+               wfd_device_s *peer = NULL;
+               const char *mac_address = NULL;
+               unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+               g_variant_get(parameters, "(&s)", &mac_address);
+               macaddr_atoe(mac_address, mac_addr);
+
+               if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(ii)", ret, 0);
+                       goto done;
+               }
+
+               peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
+               if(peer) {
+                       WDS_LOGE("Failed to get peer");
+                       ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
+                       *return_parameters = g_variant_new("(ii)", ret, 0);
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(ii)", ret, peer->display.port);
+
+       } else if (!g_strcmp0(method_name, "GetPeerThroughput")) {
+               wfd_device_s *peer = NULL;
+               const char *mac_address = NULL;
+               unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+               g_variant_get(parameters, "(&s)", &mac_address);
+               macaddr_atoe(mac_address, mac_addr);
+
+               if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+                       ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+                       *return_parameters = g_variant_new("(ii)", ret, 0);
+                       goto done;
+               }
+
+               peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
+               if(peer) {
+                       WDS_LOGE("Failed to get peer");
+                       ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
+                       *return_parameters = g_variant_new("(ii)", ret, 0);
+                       goto done;
+               }
+
+               ret = WIFI_DIRECT_ERROR_NONE;
+               *return_parameters = g_variant_new("(ii)", ret, peer->display.max_tput);
+
+       } else {
+               WDS_LOGD("method not handled");
+               ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+
+done:
+       return ret;
+}
+#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+
+static struct {
+       guint reg_id;
+       const gchar *iface_name;
+        int (*function) (const gchar *method_name,
+                        GVariant    *parameters,
+                        GVariant    **return_parameters);
+} wfd_manager_iface_map[] = {
+       {
+               0,
+               WFD_MANAGER_MANAGE_INTERFACE,
+               __wfd_manager_manage_iface_handler
+       },
+       {
+               0,
+               WFD_MANAGER_GROUP_INTERFACE,
+               __wfd_manager_group_iface_handler
+       },
+       {
+               0,
+               WFD_MANAGER_CONFIG_INTERFACE,
+               __wfd_manager_config_iface_handler
+       },
+#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
+       {
+               0,
+               WFD_MANAGER_SERVICE_INTERFACE,
+               __wfd_manager_service_iface_handler
+       },
+#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
+#ifdef TIZEN_FEATURE_WIFI_DISPLAY
+       {
+               0,
+               WFD_MANAGER_DISPLAY_INTERFACE,
+               __wfd_manager_display_iface_handler
+       },
+#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+       {
+               0,
+               NULL,
+               NULL
+       }
+};
+
+// GDBus method handler
+static void wfd_manager_method_call_handler (GDBusConnection       *connection,
+                                            const gchar           *sender,
+                                            const gchar           *object_path,
+                                            const gchar           *interface_name,
+                                            const gchar           *method_name,
+                                            GVariant              *parameters,
+                                            GDBusMethodInvocation *invocation,
+                                            gpointer               user_data)
+{
+       int count = 0;
+       GVariant *return_parameters = NULL;
+
+       /* Method Call */
+       WDS_LOGD("interface : [%s], method : [%s]", interface_name, method_name);
+       WDS_LOGD("param [%s]", parameters ? g_variant_print(parameters, TRUE) : "NULL");
+
+       while (wfd_manager_iface_map[count].iface_name != NULL) {
+               if (!g_strcmp0(interface_name, wfd_manager_iface_map[count].iface_name)) {
+
+                       wfd_manager_iface_map[count].function(method_name,
+                                                             parameters,
+                                                             &return_parameters);
+                       break;
+               }
+               count++;
+       }
+
+       g_dbus_method_invocation_return_value(invocation, return_parameters);
+}
+
+static const GDBusInterfaceVTable wfd_manager_interface_vtable =
+                               {wfd_manager_method_call_handler, NULL, NULL};
+
+void wfd_manager_dbus_unregister(void)
+{
+       int count = 0;
+
+       while (wfd_manager_iface_map[count].iface_name != NULL) {
+               wfd_manager_dbus_iface_unregister(wfd_manager_iface_map[count].reg_id);
+               count++;
+       }
+
+       wfd_manager_dbus_deinit();
+}
+
+gboolean wfd_manager_dbus_register(void)
+{
+       int count = 0;
+
+       if (wfd_manager_dbus_init() == 0)
+               return FALSE;
+
+       while (wfd_manager_iface_map[count].iface_name != NULL) {
+               wfd_manager_iface_map[count].reg_id =
+                       wfd_manager_dbus_iface_register(wfd_manager_iface_map[count].iface_name,
+                                                       WFD_MANAGER_PATH,
+                                                       wfd_manager_introspection_xml,
+                                                       &wfd_manager_interface_vtable);
+
+               WDS_LOGD("Registered Interface [%d, %s]",
+                                       wfd_manager_iface_map[count].reg_id,
+                                       wfd_manager_iface_map[count].iface_name);
+
+               count++;
+       }
+
+       return TRUE;
+}
index d8e2bec..2996052 100755 (executable)
 #include "wifi-direct-group.h"
 #include "wifi-direct-peer.h"
 #include "wifi-direct-state.h"
-#include "wifi-direct-client.h"
 #include "wifi-direct-event.h"
 #include "wifi-direct-util.h"
+#include "wifi-direct-log.h"
+#include "wifi-direct-error.h"
+#include "wifi-direct-iface.h"
+
 
 wfd_manager_s *g_manager;
 
@@ -55,32 +58,6 @@ wfd_manager_s *wfd_get_manager()
        return g_manager;
 }
 
-static gboolean _wfd_exit_timeout_cb(void *user_data)
-{
-       __WDS_LOG_FUNC_ENTER__;
-       wfd_manager_s *manager = (wfd_manager_s*) user_data;
-
-       if (!manager) {
-               WDS_LOGE("Invalid parameter");
-               return TRUE;
-       }
-
-       if (manager->client_count > 0) {
-               WDS_LOGD("Client count [%d]", manager->client_count);
-               return TRUE;
-       }
-
-       if (manager->state == WIFI_DIRECT_STATE_DEACTIVATED) {
-               WDS_LOGD("Terminate Wi-Fi Direct Manager");
-               g_main_quit(manager->main_loop);
-       }
-       manager->exit_timer = 0;
-       WDS_LOGD( "Stop exit timer. State [%d]", manager->state);
-
-       __WDS_LOG_FUNC_EXIT__;
-       return FALSE;
-}
-
 static int _wfd_local_init_device(wfd_manager_s *manager)
 {
        __WDS_LOG_FUNC_ENTER__;
@@ -519,6 +496,15 @@ int wfd_manager_activate(wfd_manager_s *manager)
                return 1;
        }
 
+       if (manager->state == WIFI_DIRECT_STATE_ACTIVATING) {
+               WDS_LOGE("In progress");
+               return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+       }
+
+       res = wfd_util_wifi_direct_activatable();
+       if (res < 0)
+               return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+
        wfd_state_get(manager, &prev_state);
        wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATING);
 #if defined(TIZEN_WLAN_CONCURRENT_ENABLE) && defined(TIZEN_MOBILE)
@@ -653,9 +639,23 @@ int wfd_manager_connect(wfd_manager_s *manager, unsigned char *peer_addr)
                return WIFI_DIRECT_ERROR_OPERATION_FAILED;
        }
 
+       if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
+                       manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
+                       manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
+               __WDS_LOG_FUNC_EXIT__;
+               return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+       }
+
+       wfd_group_s *group = (wfd_group_s*) manager->group;
+       if (group && group->member_count >= manager->max_station) {
+               __WDS_LOG_FUNC_EXIT__;
+               return WIFI_DIRECT_ERROR_TOO_MANY_CLIENT;
+       }
+
        session = (wfd_session_s*) manager->session;
        if (session && session->type != SESSION_TYPE_INVITE) {
                WDS_LOGE("Session already exist and it's not an invitation session");
+               __WDS_LOG_FUNC_EXIT__;
                return WIFI_DIRECT_ERROR_NOT_PERMITTED;
        }
 
@@ -664,6 +664,7 @@ int wfd_manager_connect(wfd_manager_s *manager, unsigned char *peer_addr)
                                        manager->req_wps_mode, SESSION_DIRECTION_OUTGOING);
                if (!session) {
                        WDS_LOGE("Failed to create new session");
+                       __WDS_LOG_FUNC_EXIT__;
                        return WIFI_DIRECT_ERROR_OPERATION_FAILED;
                }
        }
@@ -678,6 +679,7 @@ int wfd_manager_connect(wfd_manager_s *manager, unsigned char *peer_addr)
        if (res < 0) {
                WDS_LOGE("Failed to start session");
                wfd_destroy_session(manager);
+               __WDS_LOG_FUNC_EXIT__;
                return WIFI_DIRECT_ERROR_OPERATION_FAILED;
        }
        wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
@@ -769,6 +771,11 @@ int wfd_manager_cancel_connection(wfd_manager_s *manager, unsigned char *peer_ad
                return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
        }
 
+       if (!manager->session && manager->state != WIFI_DIRECT_STATE_CONNECTING) {
+               WDS_LOGE("It's not CONNECTING state");
+               return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+       }
+
        res = wfd_session_cancel(manager->session, peer_addr);
        if (res < 0) {
                WDS_LOGE("Failed to cancel session");
@@ -820,6 +827,16 @@ int wfd_manager_reject_connection(wfd_manager_s *manager, unsigned char *peer_ad
                return WIFI_DIRECT_ERROR_NOT_PERMITTED;
        }
 
+       if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
+               WDS_LOGE("It's not permitted with this state [%d]", manager->state);
+               return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+       }
+
+       if (session->direction != SESSION_DIRECTION_INCOMING) {
+               WDS_LOGE("Only incomming session can be rejected");
+               return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+       }
+
        res = wfd_session_reject(session, peer_addr);
        if (res < 0) {
                WDS_LOGE("Failed to reject connection");
@@ -857,6 +874,28 @@ int wfd_manager_disconnect(wfd_manager_s *manager, unsigned char *peer_addr)
                return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
        }
 
+       if (!manager->group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
+               if (WIFI_DIRECT_STATE_DISCOVERING == manager->state) {
+                       res = wfd_oem_stop_scan(manager->oem_ops);
+                       if (res < 0) {
+                               WDS_LOGE("Failed to stop scan");
+                               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+                       }
+                       WDS_LOGI("Succeeded to stop scan");
+
+                       if (WFD_DEV_ROLE_GO == manager->local->dev_role) {
+                               wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
+                               wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
+                       } else {
+                               wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+                               wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+                       }
+               } else {
+                       WDS_LOGE("It's not permitted with this state [%d]", manager->state);
+                       return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+               }
+       }
+
        group = (wfd_group_s*) manager->group;
        if (!group) {
                WDS_LOGE("Group not found");
@@ -1344,6 +1383,97 @@ int wfd_manager_set_session_availability(int availability)
 
 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
 
+int wfd_manager_start_discovery(wfd_manager_s *manager, int mode, int timeout,
+                               const char* type, int channel)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       int res = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       wfd_oem_scan_param_s param;
+       memset(&param, 0x0, sizeof(wfd_oem_scan_param_s));
+
+       WDS_LOGI("Mode: [%d], Timeout: [%d], type: [%s]", mode, timeout, type, channel);
+
+       if (manager->local->dev_role == WFD_DEV_ROLE_GO)
+               param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
+
+       if (channel == WFD_DISCOVERY_FULL_SCAN) {
+               param.scan_type = WFD_OEM_SCAN_TYPE_FULL;
+       } else if (channel == WFD_DISCOVERY_SOCIAL_CHANNEL) {
+               param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
+       } else if (channel == WFD_DISCOVERY_CHANNEL1) {
+               param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL1;
+               param.freq = 2412;
+       } else if (channel == WFD_DISCOVERY_CHANNEL6) {
+               param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL6;
+               param.freq = 2437;
+       } else if (channel == WFD_DISCOVERY_CHANNEL11) {
+               param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL11;
+               param.freq = 2462;
+       } else {
+               param.scan_type = WFD_OEM_SCAN_TYPE_SPECIFIC;
+               param.freq = wfd_util_channel_to_freq(channel);
+       }
+
+       if (mode)
+               param.scan_mode = WFD_OEM_SCAN_MODE_PASSIVE;
+       else
+               param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
+
+       param.scan_time = timeout;
+
+       res = wfd_oem_start_scan(manager->oem_ops, &param);
+       if (res < 0) {
+               WDS_LOGE("Failed to start scan");
+               __WDS_LOG_FUNC_EXIT__;
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+
+       if (mode)
+               manager->scan_mode = WFD_SCAN_MODE_PASSIVE;
+       else
+               manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
+
+       if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
+               wfd_state_set(manager, WIFI_DIRECT_STATE_DISCOVERING);
+               wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DISCOVERING);
+       }
+
+       WDS_LOGD("Succeeded to start scan");
+       __WDS_LOG_FUNC_EXIT__;
+       return WIFI_DIRECT_ERROR_NONE;
+}
+
+int wfd_manager_cancel_discovery(wfd_manager_s *manager)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       int res = 0;
+
+       if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
+                       manager->state != WIFI_DIRECT_STATE_DISCOVERING) {
+               __WDS_LOG_FUNC_EXIT__;
+               return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+       }
+
+       res = wfd_oem_stop_scan(manager->oem_ops);
+       if (res < 0) {
+               WDS_LOGE("Failed to stop scan");
+               __WDS_LOG_FUNC_EXIT__;
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+
+       if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
+               wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
+               wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
+       } else {
+               wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+               wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+       }
+
+       WDS_LOGD("Succeeded to stop scan");
+       __WDS_LOG_FUNC_EXIT__;
+       return WIFI_DIRECT_ERROR_NONE;
+}
+
 wfd_device_s *wfd_manager_get_peer_by_addr(wfd_manager_s *manager, unsigned char *peer_addr)
 {
        __WDS_LOG_FUNC_ENTER__;
@@ -1385,10 +1515,6 @@ static wfd_manager_s *wfd_manager_init()
        }
        WDS_LOGD("Succeeded to initialize local device");
 
-       manager->exit_timer = g_timeout_add(120000,
-                                               (GSourceFunc) _wfd_exit_timeout_cb, manager);
-       WDS_LOGD("Exit timer started");
-
        __WDS_LOG_FUNC_EXIT__;
        return manager;
 }
@@ -1403,10 +1529,6 @@ int wfd_manager_deinit(wfd_manager_s *manager)
                return -1;
        }
 
-       if (manager->exit_timer > 0)
-               g_source_remove(manager->exit_timer);
-       manager->exit_timer = 0;
-
        _wfd_local_deinit_device(manager);
 
        g_free(manager);
@@ -1497,7 +1619,6 @@ int main(int argc, char *argv[])
 {
        __WDS_LOG_FUNC_ENTER__;
        GMainLoop *main_loop = NULL;
-       int res = 0;
 
 #if !GLIB_CHECK_VERSION(2,32,0)
        if (!g_thread_supported())
@@ -1511,6 +1632,9 @@ int main(int argc, char *argv[])
        // TODO: Parsing argument
        /* Wi-Fi direct connection for S-Beam can be optimized using argument */
 
+       /**
+        * wfd-manager initialization
+        */
        g_manager = wfd_manager_init();
        if (!g_manager) {
                WDS_LOGE("Failed to initialize wifi-direct manager");
@@ -1519,6 +1643,9 @@ int main(int argc, char *argv[])
        }
        WDS_LOGD("Succeeded to initialize manager");
 
+       /**
+        * wfd_manager_plugin initialization
+        */
        g_manager->plugin_handle = wfd_plugin_init(g_manager);
        if (!g_manager->plugin_handle) {
                WDS_LOGE("Failed to initialize plugin");
@@ -1528,15 +1655,7 @@ int main(int argc, char *argv[])
        }
        WDS_LOGD("Succeeded to load plugin");
 
-       res = wfd_client_handler_init(g_manager);
-       if (res < 0) {
-               WDS_LOGE("Failed to initialize client handler");
-               wfd_plugin_deinit(g_manager);
-               wfd_manager_deinit(g_manager);
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-       WDS_LOGD("Succeeded to initialize client handler");
+       wfd_manager_dbus_register();
 
        main_loop = g_main_loop_new(NULL, FALSE);
        if (main_loop == NULL) {
@@ -1545,10 +1664,10 @@ int main(int argc, char *argv[])
                return -1;
        }
        g_manager->main_loop = main_loop;
-
        g_main_loop_run(main_loop);
 
-       wfd_client_handler_deinit(g_manager);
+       wfd_manager_dbus_unregister();
+
        wfd_plugin_deinit(g_manager);
        wfd_manager_deinit(g_manager);
 
index 2ca17ad..c9f9e3e 100644 (file)
@@ -39,6 +39,7 @@
 #include "wifi-direct-util.h"
 #include "wifi-direct-peer.h"
 #include "wifi-direct-session.h"
+#include "wifi-direct-log.h"
 
 
 wfd_device_s *wfd_add_peer(void *data, unsigned char *dev_addr, char *dev_name)
index 23db0e0..5d5825c 100755 (executable)
@@ -12,6 +12,7 @@
 #include "wifi-direct-oem.h"
 #include "wifi-direct-service.h"
 #include "wifi-direct-util.h"
+#include "wifi-direct-log.h"
 
 
 int wfd_service_add(int type, char *info_str, int *service_id)
index e42c31c..b24e3aa 100644 (file)
 #include "wifi-direct-oem.h"
 #include "wifi-direct-util.h"
 #include "wifi-direct-session.h"
-#include "wifi-direct-client.h"
 #include "wifi-direct-state.h"
+#include "wifi-direct-error.h"
+#include "wifi-direct-log.h"
+#include "wifi-direct-dbus.h"
 
 
 static gboolean _session_timeout_cb(gpointer *user_data)
@@ -49,8 +51,8 @@ static gboolean _session_timeout_cb(gpointer *user_data)
        __WDS_LOG_FUNC_ENTER__;
        wfd_manager_s *manager = wfd_get_manager();
        wfd_session_s *session = (wfd_session_s*) manager->session;
-       wifi_direct_client_noti_s noti;
        unsigned char *peer_addr = NULL;
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
 
        if (!session) {
                WDS_LOGE("Invalid parameter");
@@ -61,13 +63,16 @@ static gboolean _session_timeout_cb(gpointer *user_data)
        WDS_LOGD("Session timer expired");
 
        peer_addr = wfd_session_get_peer_addr(session);
-
-       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
-       noti.error = WIFI_DIRECT_ERROR_CONNECTION_TIME_OUT;
        if(peer_addr != NULL)
-               g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
-       wfd_client_send_event(manager, &noti);
+               g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+       else
+               g_snprintf(peer_mac_address, MACSTR_LEN, "%s", "");
+
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "Connection",
+                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_TIME_OUT,
+                                                           WFD_EVENT_CONNECTION_RSP,
+                                                           peer_mac_address));
 
        wfd_session_cancel(session, peer_addr);
 
@@ -86,11 +91,14 @@ static gboolean _session_timeout_cb(gpointer *user_data)
 static void _wfd_notify_session_failed(wfd_manager_s *manager, unsigned char *peer_addr)
 {
        __WDS_LOG_FUNC_ENTER__;
-       wifi_direct_client_noti_s noti;
-       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
-       noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
-       snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
+
+       snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "Connection",
+                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
+                                                           WFD_EVENT_CONNECTION_RSP,
+                                                           peer_mac_address));
 
        if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
                wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
@@ -100,7 +108,6 @@ static void _wfd_notify_session_failed(wfd_manager_s *manager, unsigned char *pe
                wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
        }
 
-       wfd_client_send_event(manager, &noti);
        __WDS_LOG_FUNC_EXIT__;
 }
 
@@ -742,11 +749,14 @@ int wfd_session_process_event(wfd_manager_s *manager, wfd_oem_event_s *event)
                if (session->type == SESSION_TYPE_INVITE) {
                        WDS_LOGD("Start WPS corresponding to OEM event [%d]", event->event_id);
                        if (session->wps_mode != WFD_WPS_MODE_PBC) {
-                               wifi_direct_client_noti_s noti;
-                               memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-                               noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ;
-                               g_snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
-                               wfd_client_send_event(manager, &noti);
+                               char peer_mac_address[MACSTR_LEN+1] = {0, };
+
+                               g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
+                               wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                            "Connection",
+                                                            g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                                                   WFD_EVENT_CONNECTION_WPS_REQ,
+                                                                                   peer_mac_address));
                                if (session->wps_mode == WFD_WPS_MODE_KEYPAD) {
                                        /* We have to wait until user type PIN using Keypad */
                                        break;
@@ -756,12 +766,14 @@ int wfd_session_process_event(wfd_manager_s *manager, wfd_oem_event_s *event)
                        if (res < 0)
                                _wfd_notify_session_failed(manager, event->dev_addr);
                } else {
-                       wifi_direct_client_noti_s noti;
-                       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-                       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ;
-                       noti.error = WIFI_DIRECT_ERROR_NONE;
-                       snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
-                       wfd_client_send_event(manager, &noti);
+                       char peer_mac_address[MACSTR_LEN+1] = {0, };
+
+                       g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "Connection",
+                                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                                           WFD_EVENT_CONNECTION_REQ,
+                                                                           peer_mac_address));
                }
        }
        break;
@@ -801,11 +813,14 @@ int wfd_session_process_event(wfd_manager_s *manager, wfd_oem_event_s *event)
                WDS_LOGD("Local WPS mode is %d", session->wps_mode);
 
                if (session->wps_mode != WFD_WPS_MODE_PBC) {
-                       wifi_direct_client_noti_s noti;
-                       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-                       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ;
-                       g_snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
-                       wfd_client_send_event(manager, &noti);
+                       char peer_mac_address[MACSTR_LEN+1] = {0, };
+
+                       g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "Connection",
+                                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                                           WFD_EVENT_CONNECTION_WPS_REQ,
+                                                                           peer_mac_address));
                        if (session->wps_mode == WFD_WPS_MODE_KEYPAD) {
                                /* We have to wait until user type PIN using Keypad */
                                break;
index f2d4c4c..7435eff 100644 (file)
@@ -33,6 +33,8 @@
 #include "wifi-direct-manager.h"
 #include "wifi-direct-state.h"
 #include "wifi-direct-util.h"
+#include "wifi-direct-log.h"
+
 
 static char *_wfd_state_string(int state)
 {
index a6d82da..3f52d63 100755 (executable)
 #include "wifi-direct-ipc.h"
 #include "wifi-direct-manager.h"
 #include "wifi-direct-state.h"
-#include "wifi-direct-client.h"
 #include "wifi-direct-util.h"
 #include "wifi-direct-oem.h"
 #include "wifi-direct-group.h"
 #include "wifi-direct-session.h"
+#include "wifi-direct-error.h"
+#include "wifi-direct-log.h"
+#include "wifi-direct-dbus.h"
 
 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
 #include <linux/unistd.h>
@@ -432,12 +434,15 @@ int wfd_util_wifi_direct_activatable()
        res_wifi = wfd_util_check_wifi_state();
        if (res_wifi < 0) {
                WDS_LOGE("Failed to check Wi-Fi state");
+               __WDS_LOG_FUNC_EXIT__;
                return WIFI_DIRECT_ERROR_OPERATION_FAILED;
        } else if (res_wifi > 0) {
                WDS_LOGE("Wi-Fi is On");
+               __WDS_LOG_FUNC_EXIT__;
                return WIFI_DIRECT_ERROR_WIFI_USED;
        } else {
                WDS_LOGE("Wi-Fi is Off");
+               __WDS_LOG_FUNC_EXIT__;
                return WIFI_DIRECT_ERROR_NONE;
        }
 #endif
@@ -448,16 +453,20 @@ int wfd_util_wifi_direct_activatable()
        res_mobap = wfd_util_check_mobile_ap_state();
        if (res_mobap < 0) {
                WDS_LOGE("Failed to check Mobile AP state");
+               __WDS_LOG_FUNC_EXIT__;
                return WIFI_DIRECT_ERROR_OPERATION_FAILED;
        } else if (res_mobap > 0) {
                WDS_LOGE("Mobile AP is On");
+               __WDS_LOG_FUNC_EXIT__;
                return WIFI_DIRECT_ERROR_MOBILE_AP_USED;
        } else {
                WDS_LOGE("Mobile AP is Off");
+               __WDS_LOG_FUNC_EXIT__;
                return WIFI_DIRECT_ERROR_NONE;
        }
 #endif
 
+       __WDS_LOG_FUNC_EXIT__;
        return WIFI_DIRECT_ERROR_NONE;
 }
 
@@ -661,14 +670,14 @@ int _connect_remote_device(char *ip_str)
 static void _dhcps_ip_leased_cb(keynode_t *key, void* data)
 {
        __WDS_LOG_FUNC_ENTER__;
-       wfd_manager_s *manager = wfd_get_manager();
        wfd_device_s *peer = (wfd_device_s*) data;
-       wifi_direct_client_noti_s noti;
        FILE *fp = NULL;
        char buf[MAX_DHCP_DUMP_SIZE];
        char ip_str[IPSTR_LEN] = {0, };
        char intf_str[MACSTR_LEN];
        unsigned char intf_addr[MACADDR_LEN];
+       char peer_mac_address[MACSTR_LEN+1] = {0,};
+       char assigned_ip_address[IPSTR_LEN+1] = {0,};
        int n = 0;
 
        if (!peer) {
@@ -676,7 +685,6 @@ static void _dhcps_ip_leased_cb(keynode_t *key, void* data)
                return;
        }
        WDS_LOGD("DHCP server: IP leased");
-       memset(&noti, 0, sizeof(wifi_direct_client_noti_s));
 
        errno = 0;
        fp = fopen(DHCP_DUMP_FILE, "r");
@@ -697,10 +705,12 @@ static void _dhcps_ip_leased_cb(keynode_t *key, void* data)
                        WDS_LOGD("Peer intf mac found");
                        _txt_to_ip(ip_str, peer->ip_addr);
                        _connect_remote_device(ip_str);
-                       noti.event = WIFI_DIRECT_CLI_EVENT_IP_LEASED_IND;
-                       snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
-                       snprintf(noti.param2, IPSTR_LEN, IPSTR, IP2STR(peer->ip_addr));
-                       wfd_client_send_event(manager, &noti);
+                       g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
+                       g_snprintf(assigned_ip_address, IPSTR_LEN, IPSTR, IP2STR(peer->ip_addr));
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "PeerIPAssigned",
+                                                    g_variant_new("(ss)", peer_mac_address,
+                                                                          assigned_ip_address));
                        break;
                } else {
                        WDS_LOGD("Different interface address peer[" MACSECSTR "] vs dhcp[" MACSECSTR "]",
@@ -770,12 +780,14 @@ static gboolean _polling_ip(gpointer user_data)
        wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
        wfd_destroy_session(manager);
 
-       wifi_direct_client_noti_s noti;
-       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
-       noti.error = WIFI_DIRECT_ERROR_NONE;
-       snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
-       wfd_client_send_event(manager, &noti);
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
+
+       g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "Connection",
+                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                           WFD_EVENT_CONNECTION_RSP,
+                                                           peer_mac_address));
 
        __WDS_LOG_FUNC_EXIT__;
        return FALSE;
@@ -1131,7 +1143,7 @@ int wfd_util_static_ip_unset(const char *ifname)
        __WDS_LOG_FUNC_ENTER__;
        int res = 0;
        unsigned char ip_addr[IPADDR_LEN];
-       char error_buf[MAX_SIZE_ERROR_BUFFER] = {};
+       char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
 
        int if_index;
        int nl_sock = -1;