[DA patch]Add timeout configuration
[platform/core/connectivity/wifi-direct-manager.git] / src / wifi-direct-manager.c
old mode 100755 (executable)
new mode 100644 (file)
index 7a73c93..a5bdb82
 
 #include <stdio.h>
 #include <stdlib.h>
-#include <dlfcn.h>
-#include <sys/utsname.h>
 #include <time.h>
 #include <errno.h>
+#include <string.h>
 
 #include <glib.h>
 #include <glib-object.h>
+
 #include <wifi-direct.h>
 
 #include "wifi-direct-ipc.h"
 #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"
+#include "wifi-direct-dbus.h"
+
+#if defined TIZEN_ENABLE_PRD
+#include "wifi-direct-prd.h"
+#endif /* TIZEN_ENABLE_PRD */
 
-wfd_manager_s *g_manager;
+wfd_manager_s *g_manager = NULL;
 
 wfd_manager_s *wfd_get_manager()
 {
        return g_manager;
 }
-
+//LCOV_EXCL_START
+/* Stop wfd-manager services, If no client
+   exists and state is deactivated. */
 static gboolean _wfd_exit_timeout_cb(void *user_data)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        wfd_manager_s *manager = (wfd_manager_s*) user_data;
 
        if (!manager) {
-               WDS_LOGE("Invalid parameter");
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
                return TRUE;
        }
 
@@ -70,90 +79,158 @@ static gboolean _wfd_exit_timeout_cb(void *user_data)
        }
 
        if (manager->state == WIFI_DIRECT_STATE_DEACTIVATED) {
-               WDS_LOGD("Terminate Wi-Fi Direct Manager");
-               g_main_quit(manager->main_loop);
+               WDS_LOGD("Terminate Wi-Fi Direct Manager");//LCOV_EXCL_LINE
+               g_main_loop_quit(manager->main_loop);
+               manager->exit_timer = 0;
+               WDS_LOGD("Stop exit timer. State [%d]", manager->state);
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return FALSE;
        }
-       manager->exit_timer = 0;
-       WDS_LOGD( "Stop exit timer. State [%d]", manager->state);
 
-       __WDS_LOG_FUNC_EXIT__;
-       return FALSE;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return TRUE;
+}
+
+void wfd_manager_free_active_client_list(void)
+{
+       GSList *list;
+       wfd_manager_s *manager = wfd_get_manager();
+
+       if (!manager || !manager->client_list)
+               return;
+
+       for (list = manager->client_list; list; list = list->next)
+               g_free(list->data);
+
+       g_slist_free(manager->client_list);
+}
+
+void wfd_manager_add_active_client(const char *client_id)
+{
+       GSList *list = NULL;
+       gboolean if_exists = FALSE;
+       gchar *str = NULL;
+       wfd_manager_s *manager = wfd_get_manager();
+       if (!manager || !client_id)
+               return;
+
+       for (list = manager->client_list; list; list = list->next) {
+               str = list->data;
+               if (str && !g_strcmp0(client_id, str)) {
+                       if_exists = TRUE;
+                       break;
+               }
+       }
+
+       // If not exists in list, add the sender
+       if (if_exists == FALSE) {
+               manager->client_list = g_slist_prepend(manager->client_list,
+                                        g_strdup(client_id));
+               manager->client_count++;
+               WDS_LOGD("Added DBus sender id[%s] count[%d]", client_id,
+                                        manager->client_count);
+       }
 }
 
+void wfd_manager_remove_active_client(const gchar *name,
+                                     const char *old_owner,
+                                     const char *new_owner)
+{
+       GSList *list = NULL;
+       gchar *str = NULL;
+       wfd_manager_s *manager = wfd_get_manager();
+
+       if (!manager)
+               return;
+
+       if (!g_strcmp0(new_owner, "")) {
+               if (manager->client_count > 0) {
+                       for (list = manager->client_list; list; list = list->next) {
+                               str = list->data;
+                               if (str && !g_strcmp0(old_owner, str)) {
+                                       manager->client_list =
+                                                g_slist_remove(manager->client_list, str);
+                                       g_free(str);
+                                       manager->client_count--;
+                                       WDS_LOGD("Removed name[%s] old[%s] new[%s] count[%d]",
+                                                name, old_owner, new_owner, manager->client_count);
+                                       break;
+                               }
+                       }
+               }
+       }
+}
+//LCOV_EXCL_STOP
 static int _wfd_local_init_device(wfd_manager_s *manager)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        wfd_device_s *local = NULL;
        int res = 0;
+       char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
+       wfd_oem_config_s *config;
 
        if (!manager) {
-               WDS_LOGE("Invalid parameter");
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
                return -1;
        }
 
+       config = manager->wfd_oem_conf;
+
        errno = 0;
        local = (wfd_device_s*) g_try_malloc0(sizeof(wfd_device_s));
        if (!local) {
-               WDS_LOGE("Failed to allocate memory for local device [%s]", strerror(errno));
+               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
+               WDS_LOGE("Failed to allocate memory for local device [%s]", error_buf);
                return -1;
        }
 
        res = wfd_util_get_phone_name(local->dev_name);
        if (res < 0) {
-               WDS_LOGE("Failed to get phone name of local device. Use default device name");
-               g_strlcpy(local->dev_name, DEFAULT_DEVICE_NAME, DEV_NAME_LEN + 1);
+               WDS_LOGE("Failed to get phone name of local device. Use default device name");//LCOV_EXCL_LINE
+               if (config)
+                       g_strlcpy(local->dev_name, config->device_name, DEV_NAME_LEN + 1);
+               else
+                       g_strlcpy(local->dev_name, DEFAULT_DEVICE_NAME, DEV_NAME_LEN + 1);
        }
        WDS_LOGD("Local Device name [%s]", local->dev_name);
        wfd_util_set_dev_name_notification();
 
-       res = wfd_util_get_local_dev_mac(local->dev_addr);
-       if (res < 0) {
-               WDS_LOGE("Failed to get local device MAC address");
-       }
-
-       memcpy(local->intf_addr, local->dev_addr, MACADDR_LEN);
-       local->intf_addr[4] ^= 0x80;
-       WDS_LOGD("Local Interface MAC address [" MACSECSTR "]",
-                                       MAC2SECSTR(local->intf_addr));
-
        local->config_methods = WFD_WPS_MODE_PBC | WFD_WPS_MODE_DISPLAY | WFD_WPS_MODE_KEYPAD;
        local->wps_mode = WFD_WPS_MODE_PBC;
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
        local->services = NULL;
        local->service_count = 0;
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
-       // TODO: initialize other local device datas
+       /* TODO: initialize other local device datas */
        manager->local = local;
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return 0;
 }
 
 static int _wfd_local_deinit_device(wfd_manager_s *manager)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
 
        if (!manager) {
-               WDS_LOGE("Invalid parameter");
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
                return -1;
        }
 
        wfd_util_unset_dev_name_notification();
 
-       // TODO: free member of local device
+       /* TODO: free member of local device */
        g_free(manager->local);
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return 0;
 }
 
 int wfd_local_reset_data(wfd_manager_s *manager)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        wfd_device_s *local = NULL;
 
        if (!manager) {
-               WDS_LOGE("Invalid parameter");
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
                return -1;
        }
 
@@ -162,41 +239,40 @@ int wfd_local_reset_data(wfd_manager_s *manager)
        local->dev_role = WFD_DEV_ROLE_NONE;
        local->wps_mode = WFD_WPS_MODE_PBC;
        memset(local->go_dev_addr, 0x0, MACADDR_LEN);
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
-       memset(&(local->display), 0x0, sizeof(wfd_display_s));
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+       if (manager->is_wifi_display_supported)
+               memset(&(local->display), 0x0, sizeof(wfd_display_s));
        memset(local->ip_addr, 0x0, IPADDR_LEN);
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return 0;
 }
 
 int wfd_local_get_dev_name(char *dev_name)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        wfd_device_s *local = g_manager->local;
 
        if (!dev_name) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                return -1;
        }
 
        g_strlcpy(dev_name, local->dev_name, DEV_NAME_LEN + 1);
        WDS_LOGD("Local device name [%s]", dev_name);
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return 0;
 }
 
 int wfd_local_set_dev_name(char *dev_name)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        wfd_device_s *local = g_manager->local;
 
        if (!dev_name) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                return -1;
        }
 
@@ -204,150 +280,130 @@ int wfd_local_set_dev_name(char *dev_name)
 
        if (g_manager->state >= WIFI_DIRECT_STATE_ACTIVATED) {
                wfd_oem_set_dev_name(g_manager->oem_ops, dev_name);
-               WDS_LOGD("Device name changed.");
+               WDS_LOGD("Device name changed.");//LCOV_EXCL_LINE
        } else {
-               WDS_LOGE("Device name can't changed: state is %d",g_manager->state);
+               WDS_LOGE("Device name can't changed: state is %d", g_manager->state);
        }
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return 0;
 }
 
 int wfd_local_get_dev_mac(char *dev_mac)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        wfd_device_s *local = g_manager->local;
 
        if (!dev_mac) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                return -1;
        }
 
        g_snprintf(dev_mac, MACSTR_LEN, MACSTR, MAC2STR(local->dev_addr));
        WDS_SECLOGD("Local device MAC address [%s]", dev_mac);
 
-       __WDS_LOG_FUNC_EXIT__;
-       return 0;
-}
-
-#if 0
-int wfd_local_get_intf_mac(unsigned char *intf_mac)
-{
-       __WDS_LOG_FUNC_ENTER__;
-       wfd_device_s *local = g_manager->local;
-
-       if (!intf_mac) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       g_snprintf(intf_mac, MACSTR_LEN, MACSTR, MAC2STR(local->intf_addr));
-       WDS_SECLOGD("Local interface MAC address [%s]", intf_mac);
-
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return 0;
 }
-#endif
 
 int wfd_local_get_ip_addr(char *ip_str)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        wfd_device_s *local = g_manager->local;
 
        if (!ip_str) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                return -1;
        }
 
        snprintf(ip_str, IPSTR_LEN, IPSTR, IP2STR(local->ip_addr));
        WDS_SECLOGD("Local IP address [" IPSECSTR "]", IP2SECSTR(local->ip_addr));
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return 0;
 }
 
 int wfd_local_get_supported_wps_mode(int *config_methods)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        wfd_device_s *local = g_manager->local;
 
        if (!config_methods) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                return -1;
        }
 
        *config_methods = local->config_methods;
        WDS_LOGD("Local config method [0x%x]", *config_methods);
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return 0;
 }
 
 int wfd_local_get_wps_mode(int *wps_mode)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        wfd_device_s *local = g_manager->local;
 
        if (!wps_mode) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                return -1;
        }
 
        *wps_mode = local->wps_mode;
        WDS_LOGD("Local wps mode [0x%x]", *wps_mode);
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return 0;
 }
 
 #if 0
 int wfd_local_set_wps_mode(int wps_mode)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        wfd_device_s *local = g_manager->local;
 
        if (!wps_mode) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                return -1;
        }
 
        local->wps_mode = wps_mode;
        WDS_LOGD("Local wps mode [0x%x]", wps_mode);
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return 0;
 }
 #endif
 
 int wfd_manager_get_go_intent(int *go_intent)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        if (!go_intent) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                return -1;
        }
 
        *go_intent = g_manager->go_intent;
        WDS_LOGD("Local GO intent [%d]", *go_intent);
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return 0;
 }
 
 int wfd_manager_set_go_intent(int go_intent)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
 
        if (go_intent < 0 || go_intent > 15) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                return -1;
        }
 
@@ -355,101 +411,146 @@ int wfd_manager_set_go_intent(int go_intent)
        if (g_manager->state >= WIFI_DIRECT_STATE_ACTIVATED)
                wfd_oem_set_go_intent(g_manager->oem_ops, go_intent);
 
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return 0;
+}
+
+int wfd_manager_get_go_intent_per_type(int type, int *go_intent)
+{
+       __WDS_LOG_FUNC_ENTER__;
+       if (!go_intent) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (type < 0 || type >= WFD_MAX_TYPE) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       *go_intent = g_manager->go_intent_per_type[type];
+       WDS_LOGD("Get Go_Intent[%d] : [%d]", type, *go_intent);
+
        __WDS_LOG_FUNC_EXIT__;
        return 0;
 }
 
-int wfd_manager_get_max_station(int *max_station)
+int wfd_manager_set_go_intent_per_type(int type, int go_intent)
 {
        __WDS_LOG_FUNC_ENTER__;
 
-       if (!max_station) {
+       if (go_intent < 0 || go_intent > 15) {
                WDS_LOGE("Invalid parameter");
                __WDS_LOG_FUNC_EXIT__;
                return -1;
        }
 
+       if (type < 0 || type >= WFD_MAX_TYPE) {
+               WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       g_manager->go_intent_per_type[type] = go_intent;
+       WDS_LOGD("Set Go_Intent[%d] : [%d]", type, g_manager->go_intent_per_type[type]);
+
+       __WDS_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int wfd_manager_get_max_station(int *max_station)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       if (!max_station) {
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return -1;
+       }
+
        *max_station = g_manager->max_station;
        WDS_LOGD("Local max station[%d]", *max_station);
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return 0;
 }
 
 int wfd_manager_set_max_station(int max_station)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
 
        if (max_station < 1) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                return -1;
        }
 
        g_manager->max_station = max_station;
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return 0;
 }
 
 int wfd_manager_get_autoconnection(int *autoconnection)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        if (!autoconnection) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                return -1;
        }
 
        *autoconnection = g_manager->autoconnection;
-       WDS_LOGD("Local autoconnection [%s]", *autoconnection ? "TRUE":"FALSE");
+       WDS_LOGD("Local autoconnection [%s]", *autoconnection ? "TRUE" : "FALSE");//LCOV_EXCL_LINE
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return 0;
 }
 
 int wfd_manager_set_autoconnection(int autoconnection)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        if (autoconnection < 0) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                return -1;
        }
 
        g_manager->autoconnection = autoconnection;
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return 0;
 }
 
 int wfd_manager_get_req_wps_mode(int *req_wps_mode)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
 
        if (!req_wps_mode) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                return -1;
        }
 
        *req_wps_mode = g_manager->req_wps_mode;
        WDS_LOGD("Requested wps mode [0x%x]", *req_wps_mode);
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return 0;
 }
 
 int wfd_manager_set_req_wps_mode(int req_wps_mode)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        wfd_device_s *local = g_manager->local;
 
        if (req_wps_mode != WIFI_DIRECT_WPS_TYPE_PBC &&
                        req_wps_mode != WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY &&
                        req_wps_mode != WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                return -1;
        }
 
@@ -462,18 +563,19 @@ int wfd_manager_set_req_wps_mode(int req_wps_mode)
        else
                local->wps_mode = req_wps_mode;
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return 0;
 }
 
 int wfd_manager_local_config_set(wfd_manager_s *manager)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        wfd_device_s *local = NULL;
+       int ip_over_eapol = 0;
        int res = 0;
 
        if (!manager) {
-               WDS_LOGE("Invalid parameter");
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
                return WIFI_DIRECT_ERROR_OPERATION_FAILED;
        }
 
@@ -483,19 +585,31 @@ int wfd_manager_local_config_set(wfd_manager_s *manager)
        WDS_LOGD("Device name set as %s", local->dev_name);
        res = wfd_oem_set_dev_name(manager->oem_ops, local->dev_name);
        if (res < 0) {
-               WDS_LOGE("Failed to set device name");
+               WDS_LOGE("Failed to set device name");//LCOV_EXCL_LINE
                return WIFI_DIRECT_ERROR_OPERATION_FAILED;
        }
 
+       local->pri_dev_type = DEFAULT_PRIMARY_DEVICE_TYPE;
+       local->sec_dev_type = DEFAULT_SECONDARY_DEVICE_TYPE;
        res = wfd_oem_set_dev_type(manager->oem_ops, local->pri_dev_type, local->sec_dev_type);
        if (res < 0) {
-               WDS_LOGE("Failed to set device type");
+               WDS_LOGE("Failed to set device type");//LCOV_EXCL_LINE
                return WIFI_DIRECT_ERROR_OPERATION_FAILED;
        }
 
        res = wfd_oem_set_go_intent(manager->oem_ops, manager->go_intent);
        if (res < 0) {
-               WDS_LOGE("Failed to set go intent");
+               WDS_LOGE("Failed to set go intent");//LCOV_EXCL_LINE
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+
+       if (manager->is_ip_over_eapol)
+               ip_over_eapol = 1;
+       else
+               ip_over_eapol = 0;
+       res = wfd_oem_set_eapol_ip_config(manager->oem_ops, ip_over_eapol);
+       if (res < 0) {
+               WDS_LOGE("Failed to set eapol ip config");//LCOV_EXCL_LINE
                return WIFI_DIRECT_ERROR_OPERATION_FAILED;
        }
 
@@ -504,153 +618,170 @@ int wfd_manager_local_config_set(wfd_manager_s *manager)
 
 int wfd_manager_activate(wfd_manager_s *manager)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        int prev_state = 0;
        int res = 0;
 
        if (!manager) {
-               WDS_LOGE("Invalid parameter");
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
                return WIFI_DIRECT_ERROR_OPERATION_FAILED;
        }
 
        if (manager->state > WIFI_DIRECT_STATE_ACTIVATING) {
-               WDS_LOGE("Already activated");
+               WDS_LOGE("Already activated");//LCOV_EXCL_LINE
                return 1;
        }
 
+       if (manager->state == WIFI_DIRECT_STATE_ACTIVATING) {
+               WDS_LOGE("In progress");//LCOV_EXCL_LINE
+               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)
+       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATING);
        res = wfd_util_check_wifi_state();
        if (res < 0) {
-               WDS_LOGE("Failed to get wifi state");
+               WDS_LOGE("Failed to get wifi state");//LCOV_EXCL_LINE
                return WIFI_DIRECT_ERROR_OPERATION_FAILED;
        } else if (res == 0) {
-#endif /* TIZEN_WLAN_CONCURRENT_ENABLE && TIZEN_MOBILE */
-       res = wfd_oem_activate(manager->oem_ops, 0);
-       if (res < 0) {
-               WDS_LOGE("Failed to activate");
-               wfd_state_set(manager, prev_state);
-               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
-       }
-#if defined(TIZEN_WLAN_CONCURRENT_ENABLE) && defined(TIZEN_MOBILE)
+               res = wfd_oem_activate(manager->oem_ops, 0);
+               if (res < 0) {
+                       WDS_LOGE("Failed to activate");//LCOV_EXCL_LINE
+                       wfd_state_set(manager, prev_state);
+                       wfd_util_set_wifi_direct_state(prev_state);
+                       return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+               }
        } else {
                res = wfd_oem_activate(manager->oem_ops, res);
                if (res < 0) {
-                       WDS_LOGE("Failed to activate");
+                       WDS_LOGE("Failed to activate");//LCOV_EXCL_LINE
                        wfd_state_set(manager, prev_state);
+                       wfd_util_set_wifi_direct_state(prev_state);
                        return WIFI_DIRECT_ERROR_OPERATION_FAILED;
                }
        }
-#endif /* TIZEN_WLAN_CONCURRENT_ENABLE && TIZEN_MOBILE */
-       WDS_LOGE("Succeeded to activate");
+       WDS_LOGE("Succeeded to activate");//LCOV_EXCL_LINE
 
        wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
        wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
 
        wfd_manager_local_config_set(manager);
-       wfd_util_set_country();
-
-       wfd_util_start_wifi_direct_popup();
+       if (manager->is_connection_agent)
+               wfd_util_start_wifi_direct_popup();
 
        res = wfd_util_get_local_dev_mac(manager->local->dev_addr);
-       if (res < 0) {
-               WDS_LOGE("Failed to get local device MAC address");
-       }
-
-       memcpy(manager->local->intf_addr, manager->local->dev_addr, MACADDR_LEN);
-       manager->local->intf_addr[4] ^= 0x80;
-       WDS_LOGD("Local Interface MAC address [" MACSECSTR "]",
-                                       MAC2SECSTR(manager->local->intf_addr));
+       if (res < 0)
+               WDS_LOGE("Failed to get local device MAC address");//LCOV_EXCL_LINE
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return WIFI_DIRECT_ERROR_NONE;
 }
 
 int wfd_manager_deactivate(wfd_manager_s *manager)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        int prev_state = 0;
        int res = 0;
+       wfd_group_s *group = NULL;
 
        if (!manager) {
-               WDS_LOGE("Invalid parameter");
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
                return WIFI_DIRECT_ERROR_OPERATION_FAILED;
        }
 
-       if (manager->state < WIFI_DIRECT_STATE_ACTIVATING) {
-               WDS_LOGE("Already deactivated");
-               return WIFI_DIRECT_ERROR_NOT_PERMITTED;
-       }
-
        wfd_state_get(manager, &prev_state);
        wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATING);
+       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATING);
 
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
-       res = wfd_oem_miracast_init(manager->oem_ops, false);
-       if (res < 0)
-               WDS_LOGE("Failed to initialize miracast");
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+       if (manager->is_wifi_display_supported) {
+               res = wfd_oem_miracast_init(manager->oem_ops, false);
+               if (res < 0)
+                       WDS_LOGE("Failed to initialize miracast");//LCOV_EXCL_LINE
+       }
 
-       res = wfd_oem_destroy_group(manager->oem_ops, GROUP_IFNAME);
-       if (res < 0)
-               WDS_LOGE("Failed to destroy group before deactivation");
+       group = (wfd_group_s*) manager->group;
+       if (group && group->pending == FALSE) {
+               res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
+               if (res < 0)
+                       WDS_LOGE("Failed to destroy group before deactivation");//LCOV_EXCL_LINE
+       }
 
-#if defined(TIZEN_WLAN_CONCURRENT_ENABLE) && defined(TIZEN_MOBILE)
        res = wfd_util_check_wifi_state();
        if (res < 0) {
-               WDS_LOGE("Failed to get wifi state");
+               WDS_LOGE("Failed to get wifi state");//LCOV_EXCL_LINE
                return WIFI_DIRECT_ERROR_OPERATION_FAILED;
        } else if (res == 0) {
-#endif /* TIZEN_WLAN_CONCURRENT_ENABLE && TIZEN_MOBILE */
                res = wfd_oem_deactivate(manager->oem_ops, 0);
                if (res < 0) {
-                       WDS_LOGE("Failed to deactivate");
+                       WDS_LOGE("Failed to deactivate");//LCOV_EXCL_LINE
                        wfd_state_set(manager, prev_state);
+                       wfd_util_set_wifi_direct_state(prev_state);
                        return WIFI_DIRECT_ERROR_OPERATION_FAILED;
                }
-#if defined(TIZEN_WLAN_CONCURRENT_ENABLE) && defined(TIZEN_MOBILE)
        } else {
-               // FIXME: We should do something to stop p2p feature of Driver
+               /* FIXME: We should do something to stop p2p feature of Driver */
                res = wfd_oem_deactivate(manager->oem_ops, res);
                if (res < 0) {
-                       WDS_LOGE("Failed to deactivate");
+                       WDS_LOGE("Failed to deactivate");//LCOV_EXCL_LINE
                        wfd_state_set(manager, prev_state);
+                       wfd_util_set_wifi_direct_state(prev_state);
                        return WIFI_DIRECT_ERROR_OPERATION_FAILED;
                }
-               WDS_LOGE("Do not need to deactivate Wi-Fi");
+               WDS_LOGE("Do not need to deactivate Wi-Fi");//LCOV_EXCL_LINE
        }
-#endif /* TIZEN_WLAN_CONCURRENT_ENABLE && TIZEN_MOBILE */
-       WDS_LOGE("Succeeded to deactivate");
+
+       WDS_LOGE("Succeeded to deactivate");//LCOV_EXCL_LINE
 
        wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATED);
        wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATED);
 
        manager->req_wps_mode = WFD_WPS_MODE_PBC;
 
-       wfd_destroy_group(manager, GROUP_IFNAME);
        wfd_destroy_session(manager);
+       wfd_destroy_group(manager);
        wfd_peer_clear_all(manager);
        wfd_local_reset_data(manager);
 
-       __WDS_LOG_FUNC_EXIT__;
+       if (manager->is_connection_agent)
+               wfd_util_stop_wifi_direct_popup();
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return WIFI_DIRECT_ERROR_NONE;
 }
 
 int wfd_manager_connect(wfd_manager_s *manager, unsigned char *peer_addr)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        wfd_session_s *session = NULL;
        int res = 0;
 
        if (!manager || !peer_addr) {
-               WDS_LOGE("Invalid parameter");
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
                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__;//LCOV_EXCL_LINE
+               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__;//LCOV_EXCL_LINE
+               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_LOGE("Session already exist and it's not an invitation session");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                return WIFI_DIRECT_ERROR_NOT_PERMITTED;
        }
 
@@ -658,7 +789,8 @@ int wfd_manager_connect(wfd_manager_s *manager, unsigned char *peer_addr)
                session = wfd_create_session(manager, peer_addr,
                                        manager->req_wps_mode, SESSION_DIRECTION_OUTGOING);
                if (!session) {
-                       WDS_LOGE("Failed to create new session");
+                       WDS_LOGE("Failed to create new session");//LCOV_EXCL_LINE
+                       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                        return WIFI_DIRECT_ERROR_OPERATION_FAILED;
                }
        }
@@ -671,72 +803,189 @@ int wfd_manager_connect(wfd_manager_s *manager, unsigned char *peer_addr)
                res = wfd_session_start(session);
        }
        if (res < 0) {
-               WDS_LOGE("Failed to start session");
+               WDS_LOGE("Failed to start session");//LCOV_EXCL_LINE
                wfd_destroy_session(manager);
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                return WIFI_DIRECT_ERROR_OPERATION_FAILED;
        }
        wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
+       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return WIFI_DIRECT_ERROR_NONE;
+}
+
+int wfd_manager_asp_connect_session(wfd_manager_s *manager, void *params)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+       wfd_session_s *session = NULL;
+       wfd_oem_asp_prov_s *prov_params = NULL;
+       int req_wps_mode = WFD_WPS_MODE_P2PS;
+       int res = 0;
+
+       prov_params = (wfd_oem_asp_prov_s *)params;
+       if (!manager || !prov_params) {
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+
+       session = (wfd_session_s*) manager->session;
+       if (session) {
+               WDS_LOGE("Session already exists");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+       }
+
+       if (prov_params->network_config == WFD_OEM_ASP_WPS_TYPE_PIN_DISPLAY)
+               req_wps_mode = WFD_WPS_MODE_DISPLAY;
+       else if (prov_params->network_config == WFD_OEM_ASP_WPS_TYPE_PIN_KEYPAD)
+               req_wps_mode = WFD_WPS_MODE_KEYPAD;
+       else
+               req_wps_mode = WFD_WPS_MODE_P2PS;
+
+       session = wfd_create_session(manager, prov_params->service_mac,
+                       req_wps_mode, SESSION_DIRECTION_OUTGOING);
+       if (!session) {
+               WDS_LOGE("Failed to create new session");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+
+       res = wfd_session_asp_session_start(session, prov_params);
+       if (res < 0) {
+               WDS_LOGE("Failed to start session");//LCOV_EXCL_LINE
+               wfd_destroy_session(manager);
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+
+       wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
+       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return WIFI_DIRECT_ERROR_NONE;
+}
+
+int wfd_manager_asp_confirm_session(wfd_manager_s *manager, void *params, int confirmed)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+       wfd_session_s *session = NULL;
+       wfd_oem_asp_prov_s *prov_params = NULL;
+       int res = 0;
+
+       prov_params = (wfd_oem_asp_prov_s *)params;
+       if (!manager || !prov_params) {
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+
+       session = (wfd_session_s*) manager->session;
+       if (!session) {
+               WDS_LOGE("Session not exists");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+       }
+
+
+       WDS_LOGD("confirm session [%u] with peer [" MACSTR "]", prov_params->session_id,
+                       MAC2STR(prov_params->session_mac));
+
+       WDS_LOGD("created session [%u] with peer [" MACSTR "]", session->session_id,
+                       MAC2STR(session->session_mac));
+
+       if (session->session_id != prov_params->session_id ||
+                       memcmp(&(session->session_mac), prov_params->session_mac, MACADDR_LEN) != 0) {
+               WDS_LOGE("Session MAC or ID not matched");//LCOV_EXCL_LINE
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+
+       if (confirmed)
+               prov_params->status = 12;
+       else
+               prov_params->status = 11;
+       prov_params->deferring = 1;
+
+       res = wfd_oem_asp_prov_disc_req(manager->oem_ops, prov_params);
+       if (res < 0) {
+               WDS_LOGE("Failed to start session");//LCOV_EXCL_LINE
+               wfd_destroy_session(manager);
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
+       wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
+       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return WIFI_DIRECT_ERROR_NONE;
 }
 
 int wfd_manager_accept_connection(wfd_manager_s *manager, unsigned char *peer_addr)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        wfd_session_s *session = NULL;
        wfd_device_s *peer = NULL;
        int res = 0;
 
        if (!manager || !peer_addr) {
-               WDS_LOGE("Invalid parameter");
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
                return WIFI_DIRECT_ERROR_OPERATION_FAILED;
        }
 
        session = (wfd_session_s*) manager->session;
        if (!session) {
-               WDS_LOGE("Session not found");
+               WDS_LOGE("Session not found");//LCOV_EXCL_LINE
                return WIFI_DIRECT_ERROR_NOT_PERMITTED;
        }
 
        peer = wfd_peer_find_by_dev_addr(manager, peer_addr);
        if (!peer) {
-               WDS_LOGE("Peer is NULL");
+               WDS_LOGE("Peer is NULL");//LCOV_EXCL_LINE
                return WIFI_DIRECT_ERROR_OPERATION_FAILED;
        }
 
-       // TODO: check peer_addr with session's peer_addr
+       if (memcmp(session->peer->dev_addr, peer_addr, MACADDR_LEN) != 0) {
+               WDS_LOGE("Peer and ongoing session peer are different");//LCOV_EXCL_LINE
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+       }
 
        if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
-               WDS_LOGD("My device is GO and peer want to join my group, so WPS will be started");
+               WDS_LOGD("My device is GO and peer want to join my group, so WPS will be started");//LCOV_EXCL_LINE
                res = wfd_session_wps(session);
        } else if (peer->dev_role == WFD_DEV_ROLE_GO) {
-               WDS_LOGD("Peer device is GO, so Prov_Disc or Join will be started");
+               WDS_LOGD("Peer device is GO, so Prov_Disc or Join will be started");//LCOV_EXCL_LINE
                if (session->type == SESSION_TYPE_INVITE) {
                        if (session->state == SESSION_STATE_CREATED) {
-                               WDS_LOGD("Invitation session. PD will be started");
+                               WDS_LOGD("Invitation session. PD will be started");//LCOV_EXCL_LINE
                                res = wfd_session_start(session);
                        } else {
-                               WDS_LOGD("Invitation session. Join will be started");
+                               WDS_LOGD("Invitation session. Join will be started");//LCOV_EXCL_LINE
                                res = wfd_session_join(session);
                        }
                } else {
+                       /**
+                        * TODO: Add autoconnection peer matching logic.
+                        */
                        if (manager->autoconnection && (manager->auto_pin[0] != 0))
                                g_strlcpy(session->wps_pin, manager->auto_pin, PINSTR_LEN + 1);
 
-                       WDS_LOGD("Peer device is GO, so WPS will be started");
+                       WDS_LOGD("Peer device is GO, so WPS will be started");//LCOV_EXCL_LINE
                        res = wfd_session_connect(session);
                }
        } else {
+               /**
+                * TODO: Add autoconnection peer matching logic.
+                */
                /* We should wait GO_NEGO_REQ from peer(MO) in autoconnection mode. */
                /* Otherwise, GO Nego is sometimes failed. */
                if (manager->autoconnection == FALSE) {
-                       WDS_LOGD("My device is Device, so Negotiation will be started");
+                       WDS_LOGD("My device is Device, so Negotiation will be started");//LCOV_EXCL_LINE
                        res = wfd_session_connect(session);
                }
        }
        if (res < 0) {
-               WDS_LOGE("Failed to start session");
+               WDS_LOGE("Failed to start session");//LCOV_EXCL_LINE
                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);
@@ -747,77 +996,87 @@ int wfd_manager_accept_connection(wfd_manager_s *manager, unsigned char *peer_ad
                return WIFI_DIRECT_ERROR_OPERATION_FAILED;
        }
        wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
+       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return WIFI_DIRECT_ERROR_NONE;
 }
 
 
 int wfd_manager_cancel_connection(wfd_manager_s *manager, unsigned char *peer_addr)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        wfd_group_s *group = NULL;
+       int member_cnt = 0;
        int res = 0;
 
        if (!manager || !peer_addr) {
-               WDS_LOGE("Invalid parameter");
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
                return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
        }
 
+       if (!manager->session && manager->state != WIFI_DIRECT_STATE_CONNECTING) {
+               WDS_LOGE("It's not CONNECTING state");//LCOV_EXCL_LINE
+               return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+       }
+
        res = wfd_session_cancel(manager->session, peer_addr);
        if (res < 0) {
-               WDS_LOGE("Failed to cancel session");
+               WDS_LOGE("Failed to cancel session");//LCOV_EXCL_LINE
                return WIFI_DIRECT_ERROR_OPERATION_FAILED;
        }
 
-       if (manager->local->dev_role != WFD_DEV_ROLE_GO)
-               wfd_oem_destroy_group(manager->oem_ops, GROUP_IFNAME);
-
        group = (wfd_group_s*) manager->group;
-       if (group) {
-               wfd_group_remove_member(group, peer_addr);
-               if ((wfd_group_is_autonomous(manager->group) != TRUE) && !group->member_count) {
-                       wfd_oem_destroy_group(manager->oem_ops, group->ifname);
-                       wfd_destroy_group(manager, group->ifname);
-               } else {
-                       wfd_oem_disconnect(manager->oem_ops, peer_addr);
-               }
-       }
+       if (group)
+               member_cnt = wfd_group_remove_member(group, peer_addr);
+       else
+               manager->local->dev_role = WFD_DEV_ROLE_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);
+               if (member_cnt)
+                       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_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return WIFI_DIRECT_ERROR_NONE;
 }
 
 
 int wfd_manager_reject_connection(wfd_manager_s *manager, unsigned char *peer_addr)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        wfd_session_s *session = NULL;
        int res = 0;
 
        if (!manager || !peer_addr) {
-               WDS_LOGE("Invalid parameter");
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
                return WIFI_DIRECT_ERROR_OPERATION_FAILED;
        }
 
        session = (wfd_session_s*) manager->session;
        if (!session) {
-               WDS_LOGE("Session not found");
+               WDS_LOGE("Session not found");//LCOV_EXCL_LINE
+               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");//LCOV_EXCL_LINE
                return WIFI_DIRECT_ERROR_NOT_PERMITTED;
        }
 
        res = wfd_session_reject(session, peer_addr);
        if (res < 0) {
-               WDS_LOGE("Failed to reject connection");
-               // TODO: check whether set state and break
+               WDS_LOGE("Failed to reject connection");//LCOV_EXCL_LINE
+               /* TODO: check whether set state and break */
        }
        wfd_destroy_session(manager);
 
@@ -829,64 +1088,60 @@ int wfd_manager_reject_connection(wfd_manager_s *manager, unsigned char *peer_ad
                wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
        }
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return WIFI_DIRECT_ERROR_NONE;
 }
 
 
 int wfd_manager_disconnect(wfd_manager_s *manager, unsigned char *peer_addr)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        wfd_group_s *group = NULL;
        wfd_device_s *peer = NULL;
        int res = 0;
 
        if (!manager) {
-               WDS_LOGE("Invalid parameter");
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
                return WIFI_DIRECT_ERROR_OPERATION_FAILED;
        }
 
        if (!peer_addr) {
-               WDS_LOGE("Invalid parameter");
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
                return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
        }
 
        group = (wfd_group_s*) manager->group;
        if (!group) {
-               WDS_LOGE("Group not found");
+               WDS_LOGE("Group not found");//LCOV_EXCL_LINE
                return WIFI_DIRECT_ERROR_NOT_PERMITTED;
        }
 
        peer = wfd_group_find_member_by_addr(group, peer_addr);
        if (!peer) {
-               WDS_LOGE("Connected peer not found");
+               WDS_LOGE("Connected peer not found");//LCOV_EXCL_LINE
                return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
        }
 
        wfd_state_set(manager, WIFI_DIRECT_STATE_DISCONNECTING);
+       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DISCONNECTING);
 
        if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
-#ifdef CTRL_IFACE_DBUS
-               /* dbus using device address to identify the peer */
-               res = wfd_oem_disconnect(manager->oem_ops, peer->dev_addr);
-#else /* CTRL_IFACE_DBUS */
-               res = wfd_oem_disconnect(manager->oem_ops, peer->intf_addr);
-#endif /* CTRL_IFACE_DBUS */
+               if (peer->is_p2p)
+                       res = wfd_oem_disconnect(manager->oem_ops, peer->dev_addr, 0);
+               else
+                       res = wfd_oem_disconnect(manager->oem_ops, peer->intf_addr, 1);
        } else {
                res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
        }
+
        if (res < 0) {
-               WDS_LOGE("Failed to disconnect peer");
+               WDS_LOGE("Failed to disconnect peer");//LCOV_EXCL_LINE
                res = WIFI_DIRECT_ERROR_OPERATION_FAILED;
                goto failed;
        }
-       WDS_LOGE("Succeeded to disconnect peer");
+       WDS_LOGE("Succeeded to disconnect peer");//LCOV_EXCL_LINE
 
        wfd_group_remove_member(group, peer_addr);
-       if (!group->member_count) {
-               wfd_oem_destroy_group(manager->oem_ops, group->ifname);
-               wfd_destroy_group(manager, group->ifname);
-       }
 
        if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
                wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
@@ -896,7 +1151,7 @@ int wfd_manager_disconnect(wfd_manager_s *manager, unsigned char *peer_addr)
                wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
        }
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return WIFI_DIRECT_ERROR_NONE;
 
 failed:
@@ -908,43 +1163,44 @@ failed:
                wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
        }
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return res;
 }
 
 int wfd_manager_disconnect_all(wfd_manager_s *manager)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        wfd_group_s *group = NULL;
        int res = 0;
 
        if (!manager) {
-               WDS_LOGE("Invalid parameter");
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
                return WIFI_DIRECT_ERROR_OPERATION_FAILED;
        }
 
        group = (wfd_group_s*) manager->group;
        if (!group) {
-               WDS_LOGE("Group not found");
+               WDS_LOGE("Group not found");//LCOV_EXCL_LINE
                return WIFI_DIRECT_ERROR_NOT_PERMITTED;
        }
 
        wfd_state_set(manager, WIFI_DIRECT_STATE_DISCONNECTING);
+       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DISCONNECTING);
 
        res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
        if (res < 0) {
-               WDS_LOGE("Failed to destroy group");
+               WDS_LOGE("Failed to destroy group");//LCOV_EXCL_LINE
                res = WIFI_DIRECT_ERROR_OPERATION_FAILED;
                goto failed;
        }
-       WDS_LOGE("Succeeded to disconnect all peer");
+       WDS_LOGE("Succeeded to disconnect all peer");//LCOV_EXCL_LINE
 
-       wfd_destroy_group(manager, group->ifname);
+       wfd_destroy_group(manager);
 
        wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
        wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return WIFI_DIRECT_ERROR_NONE;
 
 failed:
@@ -956,20 +1212,21 @@ failed:
                wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
        }
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return res;
 }
 
 int wfd_manager_get_peer_info(wfd_manager_s *manager, unsigned char *addr, wfd_discovery_entry_s **peer)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        wfd_device_s *peer_dev = NULL;
        wfd_discovery_entry_s *peer_info;
        wfd_oem_device_s *oem_dev = NULL;
        int res = 0;
+       char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
 
        if (!manager || !addr) {
-               WDS_LOGE("Invalid parameter");
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
                return -1;
        }
 
@@ -982,19 +1239,23 @@ int wfd_manager_get_peer_info(wfd_manager_s *manager, unsigned char *addr, wfd_d
        time = tval.tv_sec;
 #endif
        WDS_LOGI("Current time [%ld]", time);
-
+//LCOV_EXCL_START
+       //wfd_manager_get_peer_info takes responsibility of the oem_dev' memory ownership.
        res = wfd_oem_get_peer_info(manager->oem_ops, addr, &oem_dev);
        if (res < 0 || !oem_dev) {
-               WDS_LOGE("Failed to get peer information");
+               WDS_LOGE("Failed to get peer information");//LCOV_EXCL_LINE
                return -1;
        }
 
        peer_dev = wfd_peer_find_by_addr(manager, addr);
-       if(!peer_dev) {
+       if (!peer_dev) {
                peer_dev = (wfd_device_s*) g_try_malloc0(sizeof(wfd_device_s));
                if (!peer_dev) {
-                       WDS_LOGE("Failed to allocate memory for peer device. [%s]", strerror(errno));
-                       free(oem_dev);
+                       strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
+                       WDS_LOGE("Failed to allocate memory for peer device. [%s]", error_buf);
+                       if (oem_dev->vsie)
+                               g_free(oem_dev->vsie);
+                       g_free(oem_dev);
                        return -1;
                }
                memcpy(peer_dev->dev_addr, addr, MACADDR_LEN);
@@ -1004,8 +1265,10 @@ int wfd_manager_get_peer_info(wfd_manager_s *manager, unsigned char *addr, wfd_d
                WDS_LOGD("peer_count[%d]", manager->peer_count);
        } else {
                if (oem_dev->age > 30 && peer_dev->state == WFD_PEER_STATE_DISCOVERED) {
-                       WDS_LOGE("Too old age to update peer");
-                       free(oem_dev);
+                       WDS_LOGE("Too old age to update peer");//LCOV_EXCL_LINE
+                       if (oem_dev->vsie)
+                               g_free(oem_dev->vsie);
+                       g_free(oem_dev);
                        return -1;
                }
        }
@@ -1021,18 +1284,25 @@ int wfd_manager_get_peer_info(wfd_manager_s *manager, unsigned char *addr, wfd_d
        peer_dev->group_flags = oem_dev->group_flags;
        peer_dev->wps_mode =  oem_dev->wps_mode;
 
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
-       memcpy(&(peer_dev->display), &(oem_dev->display), sizeof(wfd_display_s));
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+       if (manager->is_wifi_display_supported)
+               memcpy(&(peer_dev->display), &(oem_dev->display), sizeof(wfd_display_s));
 
        peer_dev->time = time;
        peer_dev->channel = oem_dev->channel;
 
-       free(oem_dev);
+       if (oem_dev->vsie) {
+               if (peer_dev->vsie)
+                       g_free(peer_dev->vsie);
+               peer_dev->vsie = g_strdup(oem_dev->vsie);
+               g_free(oem_dev->vsie);
+       }
+
+       g_free(oem_dev);
 
        peer_info = (wfd_discovery_entry_s*) g_try_malloc0(sizeof(wfd_discovery_entry_s));
        if (!(peer_info)) {
-               WDS_LOGE("Failed to allocate memory for peer data. [%s]", strerror(errno));
+               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
+               WDS_LOGE("Failed to allocate memory for peer data. [%s]", error_buf);
                return -1;
        }
 
@@ -1040,9 +1310,7 @@ int wfd_manager_get_peer_info(wfd_manager_s *manager, unsigned char *addr, wfd_d
        memcpy(peer_info->mac_address, peer_dev->dev_addr, MACADDR_LEN);
        memcpy(peer_info->intf_address, peer_dev->intf_addr, MACADDR_LEN);
        peer_info->channel = peer_dev->channel;
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
        peer_info->services = 0;
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
        peer_info->is_group_owner = peer_dev->dev_role == WFD_DEV_ROLE_GO;
        peer_info->is_persistent_go = peer_dev->group_flags & WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
        peer_info->is_connected = peer_dev->dev_role == WFD_DEV_ROLE_GC;
@@ -1051,30 +1319,33 @@ int wfd_manager_get_peer_info(wfd_manager_s *manager, unsigned char *addr, wfd_d
        peer_info->category = peer_dev->pri_dev_type;
        peer_info->subcategory = peer_dev->sec_dev_type;
 
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
-       if (peer_dev->display.availability && peer_dev->display.port)
-               peer_info->is_wfd_device = 1;
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+       if (manager->is_wifi_display_supported)
+               if (peer_dev->display.availability && peer_dev->display.port)
+                       peer_info->is_wfd_device = 1;
 
-       *peer = peer_info;
+       if (peer_dev->vsie)
+               peer_info->vsie = g_strdup(peer_dev->vsie);
 
-       __WDS_LOG_FUNC_EXIT__;
+       *peer = peer_info;
+//LCOV_EXCL_STOP
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return res;
 }
 
 
 int wfd_manager_get_peers(wfd_manager_s *manager, wfd_discovery_entry_s **peers_data)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        GList *temp = NULL;
        wfd_device_s *peer = NULL;
        wfd_discovery_entry_s *peers = NULL;
        int peer_count = 0;
        int count = 0;
        int res = 0;
+       char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
 
        if (!manager || !peers_data) {
-               WDS_LOGE("Invalid parameter");
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
                return -1;
        }
 
@@ -1089,7 +1360,7 @@ int wfd_manager_get_peers(wfd_manager_s *manager, wfd_discovery_entry_s **peers_
        WDS_LOGI("Current time [%ld]", time);
 
        peer_count = manager->peer_count;
-       WDS_LOGI("peer count [%ld]", peer_count);
+       WDS_LOGI("peer count [%d]", peer_count);
        if (peer_count < 0)
                return -1;
        else if (peer_count == 0)
@@ -1098,7 +1369,8 @@ int wfd_manager_get_peers(wfd_manager_s *manager, wfd_discovery_entry_s **peers_
        errno = 0;
        peers = (wfd_discovery_entry_s*) g_try_malloc0_n(peer_count, sizeof(wfd_discovery_entry_s));
        if (!peers) {
-               WDS_LOGE("Failed to allocate memory for peer data. [%s]", strerror(errno));
+               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
+               WDS_LOGE("Failed to allocate memory for peer data. [%s]", error_buf);
                return -1;
        }
 
@@ -1115,7 +1387,7 @@ int wfd_manager_get_peers(wfd_manager_s *manager, wfd_discovery_entry_s **peers_
                                temp = g_list_next(temp);
                                manager->peers = g_list_remove(manager->peers, peer);
                                manager->peer_count--;
-                               g_free(peer);
+                               wfd_peer_destroy(peer);
                                peer = NULL;
                                continue;
                        }
@@ -1125,9 +1397,7 @@ int wfd_manager_get_peers(wfd_manager_s *manager, wfd_discovery_entry_s **peers_
                memcpy(peers[count].mac_address, peer->dev_addr, MACADDR_LEN);
                memcpy(peers[count].intf_address, peer->intf_addr, MACADDR_LEN);
                peers[count].channel = peer->channel;
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
                peers[count].services = 0;
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
                peers[count].is_group_owner = peer->dev_role == WFD_DEV_ROLE_GO;
                peers[count].is_persistent_go = peer->group_flags & WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
                peers[count].is_connected = peer->dev_role == WFD_DEV_ROLE_GC;
@@ -1136,10 +1406,10 @@ int wfd_manager_get_peers(wfd_manager_s *manager, wfd_discovery_entry_s **peers_
                peers[count].category = peer->pri_dev_type;
                peers[count].subcategory = peer->sec_dev_type;
 
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
-               if (peer->display.availability && peer->display.port)
-                       peers[count].is_wfd_device = 1;
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+
+               if (manager->is_wifi_display_supported)
+                       if (peer->display.availability && peer->display.port)
+                               peers[count].is_wfd_device = 1;
                count++;
                WDS_LOGD("%dth peer [%s]", count, peer->dev_name);
 next:
@@ -1151,41 +1421,43 @@ next:
 
        *peers_data = peers;
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return count;
 }
 
 int wfd_manager_get_connected_peers(wfd_manager_s *manager, wfd_connected_peer_info_s **peers_data)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        wfd_connected_peer_info_s *peers = NULL;
        wfd_group_s *group = NULL;
        wfd_device_s *peer = NULL;
        GList *temp = NULL;
        int peer_count = 0;
        int count = 0;
+       char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
 
        if (!manager || !peers_data) {
-               WDS_LOGE("Invalid parameter");
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
                return -1;
        }
 
        group = manager->group;
        if (!group) {
-               WDS_LOGE("Group not exist");
+               WDS_LOGE("Group not exist");//LCOV_EXCL_LINE
                return -1;
        }
 
        peer_count = group->member_count;
        if (peer_count == 0) {
-               WDS_LOGD("Member not exist");
+               WDS_LOGD("Member not exist");//LCOV_EXCL_LINE
                return 0;
        }
 
        errno = 0;
        peers = (wfd_connected_peer_info_s*) g_try_malloc0_n(peer_count, sizeof(wfd_connected_peer_info_s));
        if (!peers) {
-               WDS_LOGE("Failed to allocate memory for connected peer data. [%s]", strerror(errno));
+               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
+               WDS_LOGE("Failed to allocate memory for connected peer data. [%s]", error_buf);
                return -1;
        }
 
@@ -1200,16 +1472,12 @@ int wfd_manager_get_connected_peers(wfd_manager_s *manager, wfd_connected_peer_i
                        peers[count].category = peer->pri_dev_type;
                        peers[count].subcategory = peer->sec_dev_type;
                        peers[count].channel = peer->channel;
-                       peers[count].is_p2p = 1;
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
+                       peers[count].is_p2p = peer->is_p2p;
                        peers[count].services = 0;
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
-
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
-                       if (peer->display.availability && peer->display.port)
-                               peers[count].is_wfd_device = 1;
 
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+                       if (manager->is_wifi_display_supported)
+                               if (peer->display.availability && peer->display.port)
+                                       peers[count].is_wfd_device = 1;
 
                        WDS_LOGD("%dth member converted[%s]", count, peers[count].device_name);
                        count++;
@@ -1221,61 +1489,78 @@ int wfd_manager_get_connected_peers(wfd_manager_s *manager, wfd_connected_peer_i
 
        *peers_data = peers;
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return count;
 }
 
+wfd_device_s *wfd_manager_get_connected_peer_by_addr(wfd_manager_s *manager, unsigned char *peer_addr)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+       wfd_device_s *peer = NULL;
+
+       if (peer_addr == NULL) {
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return peer;
+       }
+
+       if (manager->group)
+               peer = wfd_group_find_member_by_addr(manager->group, peer_addr);
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return peer;
+}
+
 #if 0
 wfd_device_s *wfd_manager_find_connected_peer(wfd_manager_s *manager, unsigned char *peer_addr)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        wfd_device_s *peer = NULL;
 
        if (!manager || !peer_addr) {
-               WDS_LOGE("Invalid parameter");
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
                return NULL;
        }
 
        peer = wfd_group_find_member_by_addr(manager->group, peer_addr);
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return peer;
 }
 #endif
 
 int wfd_manager_get_goup_ifname(char **ifname)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        wfd_group_s *group = g_manager->group;
 
        if (!ifname) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                return -1;
        }
 
        if (!group) {
-               WDS_LOGE("Group not exist");
+               WDS_LOGE("Group not exist");//LCOV_EXCL_LINE
                return -1;
        }
 
        *ifname = group->ifname;
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return 0;
 }
 
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
 int wfd_manager_set_display_device(int type, int port, int hdcp)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        wfd_device_s * device = g_manager->local;
        wfd_oem_display_s display;
        int res = 0;
 
        if (!device) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                return -1;
        }
 
@@ -1290,7 +1575,7 @@ int wfd_manager_set_display_device(int type, int port, int hdcp)
 
        res = wfd_oem_set_display(g_manager->oem_ops, (wfd_oem_display_s*)&display);
        if (res < 0) {
-               WDS_LOGE("Failed to set wifi display");
+               WDS_LOGE("Failed to set wifi display");//LCOV_EXCL_LINE
                return -1;
        }
 
@@ -1298,20 +1583,20 @@ int wfd_manager_set_display_device(int type, int port, int hdcp)
        device->display.port = port;
        device->display.hdcp_support = hdcp;
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return res;
 }
 
 int wfd_manager_set_session_availability(int availability)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
        wfd_device_s * device = g_manager->local;
        wfd_oem_display_s display;
        int res = 0;
 
        if (!device) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                return -1;
        }
 
@@ -1326,226 +1611,291 @@ int wfd_manager_set_session_availability(int availability)
 
        res = wfd_oem_set_display(g_manager->oem_ops, (wfd_oem_display_s*)&display);
        if (res < 0) {
-               WDS_LOGE("Failed to set wifi display session availability");
+               WDS_LOGE("Failed to set wifi display session availability");//LCOV_EXCL_LINE
                return -1;
        }
 
        device->display.availability = availability;
 
-       __WDS_LOG_FUNC_EXIT__;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return res;
 }
 
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
-
-wfd_device_s *wfd_manager_get_peer_by_addr(wfd_manager_s *manager, unsigned char *peer_addr)
+int wfd_manager_get_display_device(int *type, int *port, int *hdcp)
 {
-       __WDS_LOG_FUNC_ENTER__;
-       wfd_device_s *peer = NULL;
-       if(manager->group) {
-               peer = wfd_group_find_member_by_addr(manager->group, peer_addr);
-       }
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+       wfd_device_s *device = g_manager->local;
+       int res = 0;
 
-       if(peer) {
-               return peer;
+       if (!device || !type || !port || !hdcp) {
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return -1;
        }
 
-       peer = wfd_peer_find_by_addr(manager, peer_addr);
+       *type = device->display.type;
+       *port = device->display.port;
+       *hdcp = device->display.hdcp_support;
 
-       __WDS_LOG_FUNC_EXIT__;
-       return peer;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return res;
 }
 
-static wfd_manager_s *wfd_manager_init()
+int wfd_manager_get_session_availability(int *availability)
 {
-       __WDS_LOG_FUNC_ENTER__;
-       wfd_manager_s *manager = NULL;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+       wfd_device_s *device = g_manager->local;
        int res = 0;
 
-       manager = (wfd_manager_s*) g_try_malloc0(sizeof(wfd_manager_s));
-       if (!manager) {
-               WDS_LOGE("Failed to allocate memory for wfd_manager structure");
-               return NULL;
+       if (!device || !availability) {
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return -1;
        }
 
-       manager->go_intent = 7;
-       manager->req_wps_mode = WFD_WPS_MODE_PBC;
-       manager->max_station = 8;
-       res = _wfd_local_init_device(manager);
+       *availability = device->display.availability;
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return res;
+}
+
+int wfd_manager_start_discovery(wfd_manager_s *manager, int mode, int timeout,
+                               const char* type, int channel, int frequency)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+       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], channel [%d], frequency [%d]",
+                mode, timeout, type, channel, frequency);
+
+       if (manager->local->dev_role == WFD_DEV_ROLE_GO)
+               param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
+
+       switch (channel) {
+       case WFD_DISCOVERY_FULL_SCAN:
+               param.scan_type = WFD_OEM_SCAN_TYPE_FULL;
+               break;
+       case WFD_DISCOVERY_SOCIAL_CHANNEL:
+               param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
+               break;
+       case WFD_DISCOVERY_CHANNEL1:
+               param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL1;
+               param.freq = 2412;
+               break;
+       case WFD_DISCOVERY_CHANNEL6:
+               param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL6;
+               param.freq = 2437;
+               break;
+       case WFD_DISCOVERY_CHANNEL11:
+               param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL11;
+               param.freq = 2462;
+               break;
+       default:
+               param.scan_type = WFD_OEM_SCAN_TYPE_SPECIFIC;
+               if (frequency > 0)
+                       param.freq = frequency;
+               else
+                       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 initialize local device");
-               g_free(manager);
-               return NULL;            // really stop manager?
+               WDS_LOGE("Failed to start scan");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
        }
-       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");
+       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_LOG_FUNC_EXIT__;
-       return manager;
+       WDS_LOGD("Succeeded to start scan");//LCOV_EXCL_LINE
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return WIFI_DIRECT_ERROR_NONE;
 }
 
-int wfd_manager_deinit(wfd_manager_s *manager)
+int wfd_manager_cancel_discovery(wfd_manager_s *manager)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+       int res = 0;
 
-       if (!manager) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
+       res = wfd_oem_stop_scan(manager->oem_ops);
+       if (res < 0) {
+               WDS_LOGE("Failed to stop scan");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return WIFI_DIRECT_ERROR_OPERATION_FAILED;
        }
 
-       if (manager->exit_timer > 0)
-               g_source_remove(manager->exit_timer);
-       manager->exit_timer = 0;
+       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 if (manager->local->dev_role == WFD_DEV_ROLE_GC) {
+               wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
+               wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
+       } else {
+               wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+               wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+       }
 
-       _wfd_local_deinit_device(manager);
+       WDS_LOGD("Succeeded to stop scan");//LCOV_EXCL_LINE
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return WIFI_DIRECT_ERROR_NONE;
+}
 
-       g_free(manager);
+wfd_device_s *wfd_manager_get_peer_by_addr(wfd_manager_s *manager, unsigned char *peer_addr)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+       wfd_device_s *peer = NULL;
+       if (manager->group)
+               peer = wfd_group_find_member_by_addr(manager->group, peer_addr);
 
-       __WDS_LOG_FUNC_EXIT__;
-       return 0;
+       if (peer)
+               return peer;
+
+       peer = wfd_peer_find_by_addr(manager, peer_addr);
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return peer;
 }
 
-static void *wfd_plugin_init(wfd_manager_s *manager)
+static wfd_manager_s *wfd_manager_init()
 {
-       __WDS_LOG_FUNC_ENTER__;
-       void *handle;
-       struct utsname kernel_info;
-       int res;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+       wfd_manager_s *manager = NULL;
+       int res = 0;
 
+       manager = (wfd_manager_s*) g_try_malloc0(sizeof(wfd_manager_s));
        if (!manager) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
+               WDS_LOGE("Failed to allocate memory for wfd_manager structure");//LCOV_EXCL_LINE
                return NULL;
        }
 
-       res = uname(&kernel_info);
-       if (res) {
-               WDS_LOGE("Failed to detect target type");
-               __WDS_LOG_FUNC_EXIT__;
+       manager->wfd_oem_conf = (wfd_oem_config_s*) g_try_malloc0(sizeof(wfd_oem_config_s));
+       if (!manager->wfd_oem_conf) {
+               g_free(manager);
+               WDS_LOGE("Failed to allocate memory for wfd_oem_conf structure");//LCOV_EXCL_LINE
                return NULL;
        }
-       WDS_LOGD("Node name [%s], HW ID [%s]", kernel_info.nodename, kernel_info.machine);
-
-       errno = 0;
 
-#if defined(TIZEN_ARCH_64)
-               handle = dlopen(SUPPL_PLUGIN_64BIT_PATH, RTLD_NOW);
-#else
-               handle = dlopen(SUPPL_PLUGIN_PATH, RTLD_NOW);
-#endif
-       if (!handle) {
-               WDS_LOGE("Failed to open shared object. [%s]", dlerror());
-               __WDS_LOG_FUNC_EXIT__;
-               return NULL;
-       }
+       manager->go_intent = 7;
+       manager->req_wps_mode = WFD_WPS_MODE_PBC;
+       manager->max_station = 8;
+       manager->session_timer = 120;
+       manager->auto_group_remove_enable = TRUE;
 
-       errno = 0;
-       int (*plugin_load)(wfd_oem_ops_s **ops) = NULL;
-       plugin_load = (int (*)(wfd_oem_ops_s **ops)) dlsym(handle, "wfd_plugin_load");
-       if (!plugin_load) {
-               WDS_LOGE( "Failed to load symbol. Error = [%s]", strerror(errno));
-               dlclose(handle);
-               __WDS_LOG_FUNC_EXIT__;
-               return NULL;
-       }
+       manager->go_intent_per_type[WFD_DISPLAY_TYPE_SOURCE] = WFD_GO_INTENT_DISPLY_SOURCE;
+       manager->go_intent_per_type[WFD_DISPLAY_TYPE_PRISINK] = WFD_GO_INTENT_MAX;
+       manager->go_intent_per_type[WFD_DISPLAY_TYPE_SECSINK] = WFD_GO_INTENT_MAX;
+       manager->go_intent_per_type[WFD_DISPLAY_TYPE_DUAL] = WFD_GO_INTENT_MAX;
+       manager->go_intent_per_type[WFD_DISPLAY_TYPE_NONE] = WFD_GO_INTENT_MAX;
 
-       wfd_oem_ops_s *temp_ops;
-       (*plugin_load)(&temp_ops);
-       manager->oem_ops = temp_ops;
+       wfd_util_check_features(manager);
+       wfd_util_load_wfd_conf(manager);
 
-       res = wfd_oem_init(temp_ops, (wfd_oem_event_cb) wfd_process_event, manager);
+       res = _wfd_local_init_device(manager);
        if (res < 0) {
-               WDS_LOGE("Failed to initialize OEM");
-               dlclose(handle);
-               __WDS_LOG_FUNC_EXIT__;
-               return NULL;
+               WDS_LOGE("Failed to initialize local device");//LCOV_EXCL_LINE
+               g_free(manager->wfd_oem_conf);
+               g_free(manager);
+               return NULL;            /* really stop manager? */
        }
-       WDS_LOGD("Succeeded to initialize OEM");
+       WDS_LOGD("Succeeded to initialize local device");//LCOV_EXCL_LINE
 
-       __WDS_LOG_FUNC_EXIT__;
-       return handle;
+       manager->client_count = 0;
+       manager->client_list = NULL;
+       if (manager->is_on_demand) {
+               manager->exit_timer = g_timeout_add(120000,
+                                                       (GSourceFunc) _wfd_exit_timeout_cb, manager);
+               WDS_LOGD("Exit timer started");//LCOV_EXCL_LINE
+       }
+
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return manager;
 }
 
-static int wfd_plugin_deinit(wfd_manager_s *manager)
+int wfd_manager_deinit(wfd_manager_s *manager)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
 
-       if (!manager || !manager->plugin_handle) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
+       if (!manager) {
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                return -1;
        }
 
-       dlclose(manager->plugin_handle);
-       manager->plugin_handle = NULL;
+       if (manager->is_on_demand && manager->exit_timer > 0) {
+               g_source_remove(manager->exit_timer);
+               manager->exit_timer = 0;
+       }
 
-       __WDS_LOG_FUNC_EXIT__;
+       _wfd_local_deinit_device(manager);
+
+       g_free(manager->wfd_oem_conf);
+       g_free(manager);
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return 0;
 }
 
-int main(int argc, char *argv[])
+int wfd_manager_load()
 {
-       __WDS_LOG_FUNC_ENTER__;
-       GMainLoop *main_loop = NULL;
        int res = 0;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
 
-#if !GLIB_CHECK_VERSION(2,32,0)
-       if (!g_thread_supported())
-               g_thread_init(NULL);
-#endif
-
-#if !GLIB_CHECK_VERSION(2,36,0)
-       g_type_init();
-#endif
-
-       // TODO: Parsing argument
+       /* 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");
-               __WDS_LOG_FUNC_EXIT__;
+               WDS_LOGE("Failed to initialize wifi-direct manager");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                return -1;
        }
-       WDS_LOGD("Succeeded to initialize manager");
+       WDS_LOGD("Succeeded to initialize manager");//LCOV_EXCL_LINE
 
-       g_manager->plugin_handle = wfd_plugin_init(g_manager);
-       if (!g_manager->plugin_handle) {
-               WDS_LOGE("Failed to initialize plugin");
-               wfd_manager_deinit(g_manager);
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-       WDS_LOGD("Succeeded to load plugin");
+       res = wfd_util_get_local_dev_mac(g_manager->local->dev_addr);
+       if (res < 0)
+               WDS_LOGE("Failed to get local device MAC address");//LCOV_EXCL_LINE
 
-       res = wfd_client_handler_init(g_manager);
-       if (res < 0) {
-               WDS_LOGE("Failed to initialize client handler");
-               wfd_plugin_deinit(g_manager);
+       if (wfd_manager_iface_init() != 0) {
+               WDS_LOGE("Failed to initialize iface");//LCOV_EXCL_LINE
                wfd_manager_deinit(g_manager);
-               __WDS_LOG_FUNC_EXIT__;
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                return -1;
        }
-       WDS_LOGD("Succeeded to initialize client handler");
+       WDS_LOGD("Succeeded to load iface");//LCOV_EXCL_LINE
 
-       main_loop = g_main_loop_new(NULL, FALSE);
-       if (main_loop == NULL) {
-               WDS_LOGE("Failed to create GMainLoop structure");
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-       g_manager->main_loop = main_loop;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return 0;
+}
 
-       g_main_loop_run(main_loop);
+void wfd_manager_unload()
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
 
-       wfd_client_handler_deinit(g_manager);
-       wfd_plugin_deinit(g_manager);
+       wfd_manager_iface_deinit();
        wfd_manager_deinit(g_manager);
+       g_manager = NULL;
 
-       __WDS_LOG_FUNC_EXIT__;
-       return 0;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
 }