Fix Wi-Fi activation issue after booting
[platform/core/connectivity/wifi-direct-manager.git] / plugin / wpasupplicant / ctrl_iface_dbus / wfd-plugin-wpasupplicant.c
index e65588b..f720a5a 100644 (file)
 #include <gio/gio.h>
 
 #include <tzplatform_config.h>
+#include <hal-wifi.h>
 
 #include "wifi-direct-oem.h"
 #include "wfd-plugin-log.h"
 #include "dbus/wfd-plugin-supplicant-dbus.h"
 #include "wfd-plugin-wpasupplicant.h"
 
-#if defined(TIZEN_FEATURE_ASP)
 #define GLIST_ITER_START(arg_list, elem)\
        GList *temp = NULL;\
        temp = g_list_first(arg_list);\
@@ -59,7 +59,6 @@
                temp = g_list_next(temp);\
 
 #define GLIST_ITER_END() }
-#endif
 
 #define NETCONFIG_SERVICE "net.netconfig"
 #define NETCONFIG_WIFI_INTERFACE "net.netconfig.wifi"
 #define NETCONFIG_DBUS_REPLY_TIMEOUT (10 * 1000)
 
 #define CONF_FILE_PATH tzplatform_mkpath(TZ_SYS_ETC, "wpa_supplicant/wpa_supplicant.conf")
-
-#ifndef DEFAULT_MAC_FILE_PATH
-#define DEFAULT_MAC_FILE_PATH "/sys/class/net/p2p0/address"
-#endif
+#define MAX_FILE_PATH_LEN 256
 
 static wfd_oem_ops_s supplicant_ops = {
+       .configure = ws_configure,
        .init = ws_init,
        .deinit = ws_deinit,
        .activate = ws_activate,
@@ -118,13 +115,11 @@ static wfd_oem_ops_s supplicant_ops = {
        .remove_persistent_group = ws_remove_persistent_group,
        .set_persistent_reconnect = ws_set_persistent_reconnect,
 
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
        .start_service_discovery = ws_start_service_discovery,
        .cancel_service_discovery = ws_cancel_service_discovery,
 
        .serv_add = ws_serv_add,
        .serv_del = ws_serv_del,
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
 
        .miracast_init = ws_miracast_init,
        .set_display = ws_set_display,
@@ -135,28 +130,33 @@ static wfd_oem_ops_s supplicant_ops = {
        .remove_all_network = ws_remove_all_network,
        .get_wpa_status = ws_get_wpa_status,
 
-#if defined(TIZEN_FEATURE_ASP)
        .advertise_service = ws_advertise_service,
        .cancel_advertise_service = ws_cancel_advertise_service,
        .seek_service = ws_seek_service,
        .cancel_seek_service = ws_cancel_seek_service,
        .asp_prov_disc_req = ws_asp_prov_disc_req,
-#endif /* TIZEN_FEATURE_ASP */
+
+       .set_eapol_ip_config = ws_set_eapol_ip_config,
 
        .add_vsie = ws_add_vsie,
        .get_vsie = ws_get_vsie,
        .remove_vsie = ws_remove_vsie,
+       .set_supported_wps_mode = ws_set_supported_wps_mode,
+       .remove_persistent_device = ws_remove_persistent_device,
+       .remove_all_persistent_device = ws_remove_all_persistent_device,
+
+       .get_supported_channels = ws_get_supported_channels,
 
        .extra_data = NULL
 };
 
 static ws_dbus_plugin_data_s *g_pd;
+static wfd_oem_config_s *config = NULL;
 static int is_peer_joined_notified = 0;
 static int is_peer_disconnected_notified = 0;
+static int wps_config_method = WFD_OEM_WPS_MODE_PBC|WFD_OEM_WPS_MODE_DISPLAY|WFD_OEM_WPS_MODE_KEYPAD;
 
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
 static GList *service_list;
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
 static GList *seek_list;
 
 static int __ws_txt_to_mac(unsigned char *txt, unsigned char *mac)
@@ -199,11 +199,9 @@ static const char *__ws_wps_to_txt(int wps_mode)
                return WS_DBUS_STR_DISPLAY;
        case WFD_OEM_WPS_MODE_KEYPAD:
                return WS_DBUS_STR_KEYPAD;
-#if defined(TIZEN_FEATURE_ASP)
        case WFD_OEM_WPS_MODE_NONE:
        case WFD_OEM_WPS_MODE_P2PS:
                return WS_DBUS_STR_P2PS;
-#endif /* TIZEN_FEATURE_ASP */
        default:
                return "";
        }
@@ -257,7 +255,6 @@ static int __ws_hex_str_to_bin(const char *hex, unsigned char *buf, size_t len)
        return 0;
 }
 
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
 static int __ws_byte_to_hex(char *buf, int buf_size, unsigned char *data, int data_len)
 {
        int i;
@@ -330,7 +327,7 @@ static int __ws_segment_to_service(char *segment, wfd_oem_new_service_s **servic
 
        if (serv_tmp->status != 0) {
                WDP_LOGE("Service status is not success");
-               free(serv_tmp);
+               g_free(serv_tmp);
                return -1;
        }
 
@@ -355,7 +352,7 @@ static int __ws_segment_to_service(char *segment, wfd_oem_new_service_s **servic
                                                temp[i+1] = (char) __ws_hex_to_num(ptr, 2);
                                                ptr += 2;
                                        }
-                                       strncat(query, temp, size + 1);
+                                       g_strlcat(query, temp, sizeof(query));
                                        g_free(temp);
                                        temp = NULL;
                                }
@@ -375,11 +372,11 @@ static int __ws_segment_to_service(char *segment, wfd_oem_new_service_s **servic
                                ptr += 6;
                                if (dns_type == 12) {
                                        if (!strncmp(compr, "c011", 4))
-                                               strncat(query, ".local.", 7);
+                                               g_strlcat(query, ".local.", sizeof(query));
                                        else if (!strncmp(compr, "c00c", 4))
-                                               strncat(query, "._tcp.local.", 12);
+                                               g_strlcat(query, "._tcp.local.", sizeof(query));
                                        else if (!strncmp(compr, "c01c", 4))
-                                               strncat(query, "._udp.local.", 12);
+                                               g_strlcat(query, "._udp.local.", sizeof(query));
                                }
                        }
                }
@@ -398,7 +395,7 @@ static int __ws_segment_to_service(char *segment, wfd_oem_new_service_s **servic
                                                temp[i+1] = (char) __ws_hex_to_num(ptr, 2);
                                                ptr += 2;
                                        }
-                                       strncat(rdata, temp, size + 1);
+                                       g_strlcat(rdata, temp, sizeof(rdata));
                                        g_free(temp);
                                        temp = NULL;
                                }
@@ -419,27 +416,35 @@ static int __ws_segment_to_service(char *segment, wfd_oem_new_service_s **servic
 
        return 0;
 }
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
+
+static void __extract_addr_from_path(char *peer_path, unsigned char *dev_addr)
+{
+       static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
+       char *loc = NULL;
+
+       if (!peer_path || !dev_addr)
+               return;
+
+       loc = strrchr(peer_path, '/');
+       if (loc != NULL)
+               __ws_mac_compact_to_normal(loc + 1, peer_dev);
+
+       __ws_txt_to_mac(peer_dev, dev_addr);
+       WDP_LOGD("dev addr [" MACSTR "]", MAC2STR(dev_addr));
+}
 
 static void __ws_path_to_addr(char *peer_path,
                unsigned char *dev_addr, GVariant *parameter)
 {
        __WDP_LOG_FUNC_ENTER__;
 
-       static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
        const char *path = NULL;
-       char *loc = NULL;
 
        g_variant_get(parameter, "(&o)", &path);
        g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
        WDP_LOGD("Retrive Added path [%s]", peer_path);
 
-       loc = strrchr(peer_path, '/');
-       if (loc != NULL)
-               __ws_mac_compact_to_normal(loc + 1, peer_dev);
-
-       __ws_txt_to_mac(peer_dev, dev_addr);
-       WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(dev_addr));
+       __extract_addr_from_path(peer_path, dev_addr);
 
        __WDP_LOG_FUNC_EXIT__;
        return;
@@ -449,7 +454,6 @@ static int __ws_unpack_ay(unsigned char *dst, GVariant *src, int size)
 {
        GVariantIter *iter = NULL;
        int length = 0;
-       int res = 1;
 
        if (!dst || !src || size == 0) {
                WDP_LOGE("Invalid parameter");
@@ -468,12 +472,7 @@ static int __ws_unpack_ay(unsigned char *dst, GVariant *src, int size)
        }
        g_variant_iter_free(iter);
 
-       if (length < size) {
-               WDP_LOGE("array is shorter than size");
-               res = -1;
-       }
-
-       return res;
+       return length;
 }
 
 static int __ws_byte_to_txt(const unsigned char *src, char **dst, int src_len)
@@ -530,6 +529,7 @@ static int __ws_unpack_ay_malloc(unsigned char **dst, GVariantIter *iter)
        tmp_dst = (unsigned char *)g_try_malloc0(length + 1);
        if (!tmp_dst) {
                WDP_LOGE("failed to allocate memory");
+               g_variant_iter_free(iter_copy);
                return 0;
        }
 
@@ -587,13 +587,16 @@ static int _ws_get_local_dev_mac(unsigned char *dev_mac)
 {
        __WDP_LOG_FUNC_ENTER__;
        FILE *fd = NULL;
-       const char *file_path = DEFAULT_MAC_FILE_PATH;
+       char file_path[MAX_FILE_PATH_LEN] = {0, };
        char local_mac[OEM_MACSTR_LEN] = {0, };
        char *ptr = NULL;
        int res = 0;
        char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
 
        errno = 0;
+       g_snprintf(file_path, sizeof(file_path),
+                       "/sys/class/net/%s/address", config->p2p_ifname);
+
        fd = fopen(file_path, "r");
        if (!fd) {
                strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
@@ -629,6 +632,9 @@ static int _ws_get_local_dev_mac(unsigned char *dev_mac)
        return 0;
 }
 
+static void _ws_manage_group_iface_signal(const gchar *group_iface_obj_path,
+               gboolean is_created);
+
 static void _ws_process_interface_removed(GDBusConnection *connection,
                const gchar *sender, const gchar *object_path, const gchar *interface,
                const gchar *signal, GVariant *parameters, gpointer user_data)
@@ -653,9 +659,7 @@ static void _ws_process_interface_removed(GDBusConnection *connection,
        if (!g_strcmp0(g_pd->group_iface_path, interface_path)) {
                WDP_LOGD("p2p group interface removed");
                memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
-       }
-#if defined(TIZEN_PROFILE_MOBILE)
-       else if (!g_strcmp0(g_pd->iface_path, interface_path)) {
+       } else if (!g_strcmp0(g_pd->iface_path, interface_path)) {
 
                WDP_LOGD("p2p interface removed");
                wfd_oem_event_s event;
@@ -669,7 +673,6 @@ static void _ws_process_interface_removed(GDBusConnection *connection,
 
                memset(g_pd->iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
        }
-#endif /* TIZEN_PROFILE_MOBILE */
        __WDP_LOG_FUNC_EXIT__;
 }
 
@@ -711,7 +714,7 @@ static void __ws_get_peer_property(const char *key, GVariant *value, void *user_
                const char *name = NULL;
 
                g_variant_get(value, "&s", &name);
-               g_strlcpy(peer->dev_name, name, WS_SSID_LEN);
+               g_strlcpy(peer->dev_name, name, WS_SSID_LEN + 1);
                WDP_LOGD("Device name [%s]", peer->dev_name);
 
        } else if (g_strcmp0(key, "config_method") == 0) {
@@ -783,6 +786,17 @@ static void __ws_get_peer_property(const char *key, GVariant *value, void *user_
 
                if (!ISZEROMACADDR(peer->go_dev_addr))
                        peer->dev_role = WFD_OEM_DEV_ROLE_GC;
+
+       } else if (g_strcmp0(key, "VSIE") == 0) {
+               int vsie_len;
+               unsigned char vsie[OEM_VSIE_MAX_LEN] = {0,};
+
+               vsie_len = __ws_unpack_ay(vsie, value, OEM_VSIE_MAX_LEN);
+               if (vsie_len > 0) {
+                       __ws_byte_to_txt(vsie, (char **)&(peer->vsie), vsie_len);
+                       WDP_LOGD("VSIE [%s]", peer->vsie);
+               }
+
        } else {
                WDP_LOGD("Unknown value");
        }
@@ -806,7 +820,7 @@ static void __ws_peer_property(const char *key, GVariant *value, void *user_data
                const char *name = NULL;
 
                g_variant_get(value, "&s", &name);
-               g_strlcpy(peer->name, name, WS_SSID_LEN);
+               g_strlcpy(peer->name, name, WS_SSID_LEN + 1);
                WDP_LOGD("Device Name [%s]", peer->name);
 
        } else if (g_strcmp0(key, "config_method") == 0) {
@@ -880,19 +894,29 @@ static void __ws_peer_property(const char *key, GVariant *value, void *user_data
 
                if (!ISZEROMACADDR(go_dev_addr))
                        peer->dev_role = WFD_OEM_DEV_ROLE_GC;
-#if defined(TIZEN_FEATURE_ASP)
+
        } else if (g_strcmp0(key, "AdvertiseService") == 0) {
                if (value != NULL && g_variant_get_size(value) != 0)
                        peer->has_asp_services = 1;
                else
                        peer->has_asp_services = 0;
+
        } else if (g_strcmp0(key, "AdvertiseASPService") == 0) {
                if (value != NULL && g_variant_get_size(value) != 0)
                        peer->has_asp2_services = 1;
                else
                        peer->has_asp2_services = 0;
 
-#endif /* TIZEN_FEATURE_ASP */
+       } else if (g_strcmp0(key, "VSIE") == 0) {
+               int vsie_len;
+               unsigned char vsie[OEM_VSIE_MAX_LEN] = {0,};
+
+               vsie_len = __ws_unpack_ay(vsie, value, OEM_VSIE_MAX_LEN);
+               if (vsie_len > 0) {
+                       __ws_byte_to_txt(vsie, (char **)&(peer->vsie), vsie_len);
+                       WDP_LOGD("VSIE [%s]", peer->vsie);
+               }
+
        } else {
                WDP_LOGD("Unknown value");
        }
@@ -1020,65 +1044,98 @@ static void __ws_parse_peer_joined(char *peer_path,
        __WDP_LOG_FUNC_ENTER__;
 
        GVariantIter *iter;
-       static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
+       gboolean iter_res = TRUE;
        const char *path = NULL;
-       char *loc = NULL;
-#ifdef TIZEN_FEATURE_IP_OVER_EAPOL
        int i = 0;
-#endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
 
        g_variant_get(parameter, "(&oay)", &path, &iter);
        g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
        WDP_LOGD("Retrive Added path [%s]", peer_path);
 
-       loc = strrchr(peer_path, '/');
-       if (loc != NULL)
-               __ws_mac_compact_to_normal(loc + 1, peer_dev);
-       __ws_txt_to_mac(peer_dev, dev_addr);
-       WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(dev_addr));
-#ifdef TIZEN_FEATURE_IP_OVER_EAPOL
-       for (i = 0; i < OEM_IPADDR_LEN; i++)
-               g_variant_iter_loop(iter, "y", &ip_addr[i]);
+       __extract_addr_from_path(peer_path, dev_addr);
+
+       for (i = 0; iter_res &&  i < OEM_IPADDR_LEN; i++)
+               iter_res = g_variant_iter_loop(iter, "y", &ip_addr[i]);
        g_variant_iter_free(iter);
 
        WDP_LOGD("peer ip [" IPSTR "]", IP2STR(ip_addr));
-#endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
 
        __WDP_LOG_FUNC_EXIT__;
        return;
 }
 
+static gboolean __is_valid_plugin(void)
+{
+       gboolean is_valid = (g_pd && g_pd->callback);
+
+       if (!is_valid)
+               WDP_LOGD("Ignoring event");
+
+       return is_valid;
+}
+
+static wfd_oem_dev_data_s *__create_dev_data(void)
+{
+       wfd_oem_dev_data_s *dev_data =
+                       (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
+       if (!dev_data) {
+               char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
+               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
+               WDP_LOGF("Failed to allocate memory for event. [%s]",
+                               error_buf);
+       }
+
+       return dev_data;
+}
+
+static void __set_event_data(int event_id, int edata_type, void *data, wfd_oem_event_s *event)
+{
+       if (!event)
+               return;
+
+       memset(event, 0x0, sizeof(wfd_oem_event_s));
+
+       event->edata = data;
+       event->edata_type = edata_type;
+       event->event_id = event_id;
+
+       return;
+}
+
+static void __destroy_dev_data(wfd_oem_dev_data_s *dev_data)
+{
+       if (!dev_data)
+               return;
+
+       if (dev_data->vsie)
+               g_free(dev_data->vsie);
+       g_free(dev_data);
+}
+
 static void _ws_process_peer_joined(GDBusConnection *connection,
                const gchar *sender, const gchar *object_path, const gchar *interface,
                const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_event_s event;
-       wfd_oem_dev_data_s *edata = NULL;
+       wfd_oem_dev_data_s *dev_data = NULL;
        static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
 
        DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
 
-       if (!g_pd || !g_pd->callback) {
-               WDP_LOGD("Ignoring event");
-               __WDP_LOG_FUNC_EXIT__;
+       if (!__is_valid_plugin())
                return;
-       }
 
-       edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
-       if (!edata) {
-               char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
-               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-               WDP_LOGF("Failed to allocate memory for event. [%s]",
-                               error_buf);
+       dev_data = __create_dev_data();
+       if (!dev_data) {
                __WDP_LOG_FUNC_EXIT__;
                return;
        }
-       memset(&event, 0x0, sizeof(wfd_oem_event_s));
 
-       event.edata = (void*) edata;
-       event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
-       event.event_id = WFD_OEM_EVENT_STA_CONNECTED;
+       __set_event_data(WFD_OEM_EVENT_STA_CONNECTED,
+                       WFD_OEM_EDATA_TYPE_DEVICE,
+                       (void *)dev_data,
+                       &event);
 
        __ws_parse_peer_joined(peer_path, event.dev_addr, event.ip_addr_peer, parameters);
 
@@ -1090,7 +1147,8 @@ static void _ws_process_peer_joined(GDBusConnection *connection,
 
        is_peer_joined_notified = 1;
 
-       g_free(edata);
+       __destroy_dev_data(dev_data);
+
        __WDP_LOG_FUNC_EXIT__;
 }
 
@@ -1177,9 +1235,12 @@ void __ws_extract_group_details(const char *key, GVariant *value, void *user_dat
                g_strlcpy(interface_path, i_path, DBUS_OBJECT_PATH_MAX);
                WDP_LOGD("Retrive Added path [%s]", interface_path);
                g_strlcpy(g_pd->group_iface_path, interface_path, DBUS_OBJECT_PATH_MAX);
+
                dbus_property_get_all(interface_path, g_pd->g_dbus,
                                SUPPLICANT_IFACE, __ws_interface_property, event);
 
+               _ws_manage_group_iface_signal(interface_path, TRUE);
+
        } else if (g_strcmp0(key, "role") == 0) {
                const char *role = NULL;
 
@@ -1194,7 +1255,6 @@ void __ws_extract_group_details(const char *key, GVariant *value, void *user_dat
                g_variant_get(value, "b", &group->is_persistent);
                WDP_LOGD("Is Persistent : [%s]", group->is_persistent ? "YES" : "NO");
 
-#ifdef TIZEN_FEATURE_IP_OVER_EAPOL
        } else if (g_strcmp0(key, "IpAddr") == 0) {
 
                if (__ws_unpack_ay(group->ip_addr, value, OEM_IPADDR_LEN))
@@ -1209,7 +1269,6 @@ void __ws_extract_group_details(const char *key, GVariant *value, void *user_dat
 
                if (__ws_unpack_ay(group->ip_addr_go, value, OEM_IPADDR_LEN))
                        WDP_LOGD("GO IP address [" IPSTR "]", IP2STR(group->ip_addr_go));
-#endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
        } else if (g_strcmp0(key, "group_object") == 0) {
                static char group_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
                const char *g_path;
@@ -1329,7 +1388,6 @@ void __ws_extract_gonegsuccess_details(const char *key, GVariant *value, void *u
        return;
 }
 
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
 void __ws_extract_peer_service(wfd_oem_event_s *data, unsigned char *service_hex, int tlvs_len)
 {
        GList *services = NULL;
@@ -1412,9 +1470,7 @@ void __ws_extract_servicediscoveryresponse_details(const char *key, GVariant *va
 
        __WDP_LOG_FUNC_EXIT__;
 }
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
 
-#if defined(TIZEN_FEATURE_ASP)
 static void __ws_extract_serviceaspresponse_details(const char *key, GVariant *value, void *user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
@@ -1661,7 +1717,6 @@ static void __ws_extract_provision_fail_details(const char *key, GVariant *value
        }
        __WDP_LOG_FUNC_EXIT__;
 }
-#endif /* TIZEN_FEATURE_ASP */
 
 static int _ws_flush(void)
 {
@@ -1732,14 +1787,14 @@ static int _ws_cancel(void)
        return 0;
 }
 
-#if defined(TIZEN_FEATURE_ASP)
 int ws_get_advertise_service(const char *peer_path, GList **asp_services)
 {
        __WDP_LOG_FUNC_ENTER__;
        GDBusConnection *g_dbus = NULL;
        GVariant *param = NULL;
        GVariant *reply = NULL;
-       GVariant *temp = NULL;
+       GVariant *temp1 = NULL;
+       GVariant *temp2 = NULL;
        GError *error = NULL;
        GVariantIter *iter = NULL;
        wfd_oem_advertise_service_s *service;
@@ -1796,14 +1851,16 @@ int ws_get_advertise_service(const char *peer_path, GList **asp_services)
                 * So, you need to remove tuple out side of variant and
                 * variant out side of byte array
                 * */
-               temp = g_variant_get_child_value(reply, 0);
-               temp = g_variant_get_child_value(temp, 0);
-               g_variant_get(temp, "ay", &iter);
+               temp1 = g_variant_get_child_value(reply, 0);
+               temp2 = g_variant_get_child_value(temp1, 0);
+               g_variant_get(temp2, "ay", &iter);
                if (iter == NULL) {
                        g_variant_unref(reply);
                        WDP_LOGE("Failed to get iterator");
                        return -1;
                }
+               g_variant_unref(temp2);
+               g_variant_unref(temp1);
 
                while (1) {
                        /* 4byte advertisement ID, 2 byte config method, 1byte length */
@@ -1887,7 +1944,8 @@ int ws_get_advertise_asp_service(const char *peer_path, GList **asp_services)
        GDBusConnection *g_dbus = NULL;
        GVariant *param = NULL;
        GVariant *reply = NULL;
-       GVariant *temp = NULL;
+       GVariant *temp1 = NULL;
+       GVariant *temp2 = NULL;
        GError *error = NULL;
        GVariantIter *iter = NULL;
        wfd_oem_advertise_service_s *service;
@@ -1946,14 +2004,16 @@ int ws_get_advertise_asp_service(const char *peer_path, GList **asp_services)
                 * So, you need to remove tuple out side of variant and
                 * variant out side of byte array
                 * */
-               temp = g_variant_get_child_value(reply, 0);
-               temp = g_variant_get_child_value(temp, 0);
-               g_variant_get(temp, "ay", &iter);
+               temp1 = g_variant_get_child_value(reply, 0);
+               temp2 = g_variant_get_child_value(temp1, 0);
+               g_variant_get(temp2, "ay", &iter);
                if (iter == NULL) {
                        g_variant_unref(reply);
                        WDP_LOGE("Failed to get iterator");
                        return -1;
                }
+               g_variant_unref(temp2);
+               g_variant_unref(temp1);
 
                while (1) {
                        /* 4byte advertisement ID, 2 byte config method, 1byte length */
@@ -2058,7 +2118,6 @@ GLIST_ITER_END()
        __WDP_LOG_FUNC_EXIT__;
        return res;
 }
-#endif /* TIZEN_FEATURE_ASP */
 
 static void _ws_process_device_found_properties(GDBusConnection *connection,
                const gchar *sender, const gchar *object_path, const gchar *interface,
@@ -2066,45 +2125,32 @@ static void _ws_process_device_found_properties(GDBusConnection *connection,
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_event_s event;
-       wfd_oem_dev_data_s *edata = NULL;
+       wfd_oem_dev_data_s *dev_data = NULL;
        static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
-       static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
-       char *loc = NULL;
        GVariantIter *iter = NULL;
        const char *path = NULL;
 
        DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
 
-       if (!g_pd || !g_pd->callback) {
-               WDP_LOGD("Ignoring event");
-               __WDP_LOG_FUNC_EXIT__;
+       if (!__is_valid_plugin())
                return;
-       }
 
-       edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
-       if (!edata) {
-               char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
-               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-               WDP_LOGF("Failed to allocate memory for event. [%s]",
-                               error_buf);
+       dev_data = __create_dev_data();
+       if (!dev_data) {
                __WDP_LOG_FUNC_EXIT__;
                return;
        }
-       memset(&event, 0x0, sizeof(wfd_oem_event_s));
 
-       event.edata = (void*) edata;
-       event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
-       event.event_id = WFD_OEM_EVENT_PEER_FOUND;
+       __set_event_data(WFD_OEM_EVENT_PEER_FOUND,
+                       WFD_OEM_EDATA_TYPE_DEVICE,
+                       (void *)dev_data,
+                       &event);
 
        g_variant_get(parameters, "(&oa{sv})", &path, &iter);
        g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
        WDP_LOGD("Retrive Added path [%s]", peer_path);
 
-       loc = strrchr(peer_path, '/');
-       if (loc != NULL)
-               __ws_mac_compact_to_normal(loc + 1, peer_dev);
-       __ws_txt_to_mac(peer_dev, event.dev_addr);
-       WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(event.dev_addr));
+       __extract_addr_from_path(peer_path, event.dev_addr);
 
        if (iter != NULL) {
                gchar *key = NULL;
@@ -2113,22 +2159,19 @@ static void _ws_process_device_found_properties(GDBusConnection *connection,
                while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
                        CHECK_KEY_VALUE(key, value);
 
-                       __ws_peer_property(key, value, (void *) event.edata);
+                       __ws_peer_property(key, value, (void *)event.edata);
                }
                g_variant_iter_free(iter);
        }
 
-#if defined(TIZEN_FEATURE_ASP)
-       if (edata->has_asp_services)
+       if (dev_data->has_asp_services)
                ws_get_advertise_service(peer_path, (GList **)&(event.asp_services));
-       if (edata->has_asp2_services)
+       if (dev_data->has_asp2_services)
                ws_get_advertise_asp_service(peer_path, (GList **)&(event.asp2_services));
-#endif /* TIZEN_FEATURE_ASP */
 
        if (g_pd->callback->peer_found_cb)
                g_pd->callback->peer_found_cb(&event);
 
-#if defined(TIZEN_FEATURE_ASP)
        if (event.asp_services != NULL) {
                GList *l;
                wfd_oem_advertise_service_s *service;
@@ -2150,8 +2193,8 @@ static void _ws_process_device_found_properties(GDBusConnection *connection,
                        g_free(service);
                }
        }
-#endif /* TIZEN_FEATURE_ASP */
-       g_free(event.edata);
+
+       __destroy_dev_data(dev_data);
 
        __WDP_LOG_FUNC_EXIT__;
 }
@@ -2218,46 +2261,32 @@ static void _ws_process_prov_disc_req_display_pin(GDBusConnection *connection,
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_event_s event;
-       wfd_oem_dev_data_s *edata = NULL;
+       wfd_oem_dev_data_s *dev_data = NULL;
        static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
-       static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
        const char *path = NULL;
        const char *pin = NULL;
-       char *loc = NULL;
-
        DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
 
-       if (!g_pd || !g_pd->callback) {
-               WDP_LOGD("Ignoring event");
-               __WDP_LOG_FUNC_EXIT__;
+       if (!__is_valid_plugin())
                return;
-       }
 
-       edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
-       if (!edata) {
-               char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
-               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-               WDP_LOGF("Failed to allocate memory for event. [%s]",
-                               error_buf);
+       dev_data = __create_dev_data();
+       if (!dev_data) {
                __WDP_LOG_FUNC_EXIT__;
                return;
        }
-       memset(&event, 0x0, sizeof(wfd_oem_event_s));
 
-       event.edata = (void*) edata;
-       event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
-       event.event_id = WFD_OEM_EVENT_PROV_DISC_REQ;
+       __set_event_data(WFD_OEM_EVENT_PROV_DISC_REQ,
+                       WFD_OEM_EDATA_TYPE_DEVICE,
+                       (void *)dev_data,
+                       &event);
        event.wps_mode = WFD_OEM_WPS_MODE_DISPLAY;
 
        g_variant_get(parameters, "(&o&s)", &path, &pin);
        g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
        WDP_LOGD("Retrive Added path [%s]", peer_path);
 
-       loc = strrchr(peer_path, '/');
-       if (loc != NULL)
-               __ws_mac_compact_to_normal(loc + 1, peer_dev);
-       __ws_txt_to_mac(peer_dev, event.dev_addr);
-       WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(event.dev_addr));
+       __extract_addr_from_path(peer_path, event.dev_addr);
 
        g_strlcpy(event.wps_pin, pin, WS_PINSTR_LEN + 1);
        WDP_LOGD("Retrive pin [%s]", event.wps_pin);
@@ -2268,7 +2297,7 @@ static void _ws_process_prov_disc_req_display_pin(GDBusConnection *connection,
        if (g_pd->callback->prov_disc_req_cb)
                g_pd->callback->prov_disc_req_cb(&event);
 
-       g_free(event.edata);
+       __destroy_dev_data(dev_data);
 
        __WDP_LOG_FUNC_EXIT__;
 }
@@ -2279,46 +2308,33 @@ static void _ws_process_prov_disc_resp_display_pin(GDBusConnection *connection,
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_event_s event;
-       wfd_oem_dev_data_s *edata = NULL;
+       wfd_oem_dev_data_s *dev_data = NULL;
        static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
-       static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
        const char *path = NULL;
        const char *pin = NULL;
-       char *loc = NULL;
 
        DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
 
-       if (!g_pd || !g_pd->callback) {
-               WDP_LOGD("Ignoring event");
-               __WDP_LOG_FUNC_EXIT__;
+       if (!__is_valid_plugin())
                return;
-       }
 
-       edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
-       if (!edata) {
-               char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
-               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-               WDP_LOGF("Failed to allocate memory for event. [%s]",
-                               error_buf);
+       dev_data = __create_dev_data();
+       if (!dev_data) {
                __WDP_LOG_FUNC_EXIT__;
                return;
        }
-       memset(&event, 0x0, sizeof(wfd_oem_event_s));
 
-       event.edata = (void*) edata;
-       event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
-       event.event_id = WFD_OEM_EVENT_PROV_DISC_RESP;
+       __set_event_data(WFD_OEM_EVENT_PROV_DISC_RESP,
+                       WFD_OEM_EDATA_TYPE_DEVICE,
+                       (void *)dev_data,
+                       &event);
        event.wps_mode = WFD_OEM_WPS_MODE_DISPLAY;
 
        g_variant_get(parameters, "(&o&s)", &path, &pin);
        g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
        WDP_LOGD("Retrive Added path [%s]", peer_path);
 
-       loc = strrchr(peer_path, '/');
-       if (loc != NULL)
-               __ws_mac_compact_to_normal(loc + 1, peer_dev);
-       __ws_txt_to_mac(peer_dev, event.dev_addr);
-       WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(event.dev_addr));
+       __extract_addr_from_path(peer_path, event.dev_addr);
 
        g_strlcpy(event.wps_pin, pin, WS_PINSTR_LEN + 1);
        WDP_LOGD("Retrive pin [%s]", event.wps_pin);
@@ -2329,7 +2345,7 @@ static void _ws_process_prov_disc_resp_display_pin(GDBusConnection *connection,
        if (g_pd->callback->prov_disc_resp_cb)
                g_pd->callback->prov_disc_resp_cb(&event);
 
-       g_free(event.edata);
+       __destroy_dev_data(dev_data);
 
        __WDP_LOG_FUNC_EXIT__;
 }
@@ -2340,31 +2356,23 @@ static void _ws_process_prov_disc_req_enter_pin(GDBusConnection *connection,
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_event_s event;
-       wfd_oem_dev_data_s *edata = NULL;
+       wfd_oem_dev_data_s *dev_data = NULL;
        static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
 
        DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
-
-       if (!g_pd || !g_pd->callback) {
-               WDP_LOGD("Ignoring event");
-               __WDP_LOG_FUNC_EXIT__;
+       if (!__is_valid_plugin())
                return;
-       }
 
-       edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
-       if (!edata) {
-               char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
-               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-               WDP_LOGF("Failed to allocate memory for event. [%s]",
-                               error_buf);
+       dev_data = __create_dev_data();
+       if (!dev_data) {
                __WDP_LOG_FUNC_EXIT__;
                return;
        }
-       memset(&event, 0x0, sizeof(wfd_oem_event_s));
 
-       event.edata = (void*) edata;
-       event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
-       event.event_id = WFD_OEM_EVENT_PROV_DISC_REQ;
+       __set_event_data(WFD_OEM_EVENT_PROV_DISC_REQ,
+                       WFD_OEM_EDATA_TYPE_DEVICE,
+                       (void *)dev_data,
+                       &event);
        event.wps_mode = WFD_OEM_WPS_MODE_KEYPAD;
 
        __ws_path_to_addr(peer_path, event.dev_addr, parameters);
@@ -2375,7 +2383,7 @@ static void _ws_process_prov_disc_req_enter_pin(GDBusConnection *connection,
        if (g_pd->callback->prov_disc_req_cb)
                g_pd->callback->prov_disc_req_cb(&event);
 
-       g_free(event.edata);
+       __destroy_dev_data(dev_data);
 
        __WDP_LOG_FUNC_EXIT__;
 }
@@ -2386,31 +2394,25 @@ static void _ws_process_prov_disc_resp_enter_pin(GDBusConnection *connection,
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_event_s event;
-       wfd_oem_dev_data_s *edata = NULL;
+       wfd_oem_dev_data_s *dev_data = NULL;
        static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
 
        DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
 
-       if (!g_pd || !g_pd->callback) {
-               WDP_LOGD("Ignoring event");
-               __WDP_LOG_FUNC_EXIT__;
+       if (!__is_valid_plugin())
                return;
-       }
 
-       edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
-       if (!edata) {
-               char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
-               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-               WDP_LOGF("Failed to allocate memory for event. [%s]",
-                               error_buf);
+       dev_data = __create_dev_data();
+       if (!dev_data) {
                __WDP_LOG_FUNC_EXIT__;
                return;
        }
-       memset(&event, 0x0, sizeof(wfd_oem_event_s));
 
-       event.edata = (void*) edata;
-       event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
-       event.event_id = WFD_OEM_EVENT_PROV_DISC_RESP;
+       __set_event_data(WFD_OEM_EVENT_PROV_DISC_RESP,
+                       WFD_OEM_EDATA_TYPE_DEVICE,
+                       (void *)dev_data,
+                       &event);
+
        event.wps_mode = WFD_OEM_WPS_MODE_KEYPAD;
 
        __ws_path_to_addr(peer_path, event.dev_addr, parameters);
@@ -2421,7 +2423,7 @@ static void _ws_process_prov_disc_resp_enter_pin(GDBusConnection *connection,
        if (g_pd->callback->prov_disc_resp_cb)
                g_pd->callback->prov_disc_resp_cb(&event);
 
-       g_free(event.edata);
+       __destroy_dev_data(dev_data);
 
        __WDP_LOG_FUNC_EXIT__;
 }
@@ -2432,31 +2434,23 @@ static void _ws_process_prov_disc_pbc_req(GDBusConnection *connection,
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_event_s event;
-       wfd_oem_dev_data_s *edata = NULL;
+       wfd_oem_dev_data_s *dev_data = NULL;
        static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
 
        DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
 
-       if (!g_pd || !g_pd->callback) {
-               WDP_LOGD("Ignoring event");
-               __WDP_LOG_FUNC_EXIT__;
+       if (!__is_valid_plugin())
                return;
-       }
 
-       edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
-       if (!edata) {
-               char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
-               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-               WDP_LOGF("Failed to allocate memory for event. [%s]",
-                               error_buf);
+       dev_data = __create_dev_data();
+       if (!dev_data) {
                __WDP_LOG_FUNC_EXIT__;
                return;
        }
-       memset(&event, 0x0, sizeof(wfd_oem_event_s));
-
-       event.edata = (void*) edata;
-       event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
-       event.event_id = WFD_OEM_EVENT_PROV_DISC_REQ;
+       __set_event_data(WFD_OEM_EVENT_PROV_DISC_REQ,
+                       WFD_OEM_EDATA_TYPE_DEVICE,
+                       (void *)dev_data,
+                       &event);
        event.wps_mode = WFD_OEM_WPS_MODE_PBC;
 
        __ws_path_to_addr(peer_path, event.dev_addr, parameters);
@@ -2467,7 +2461,7 @@ static void _ws_process_prov_disc_pbc_req(GDBusConnection *connection,
        if (g_pd->callback->prov_disc_req_cb)
                g_pd->callback->prov_disc_req_cb(&event);
 
-       g_free(event.edata);
+       __destroy_dev_data(dev_data);
 
        __WDP_LOG_FUNC_EXIT__;
 }
@@ -2478,31 +2472,23 @@ static void _ws_process_prov_disc_pbc_resp(GDBusConnection *connection,
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_event_s event;
-       wfd_oem_dev_data_s *edata = NULL;
+       wfd_oem_dev_data_s *dev_data = NULL;
        static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
 
        DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
 
-       if (!g_pd || !g_pd->callback) {
-               WDP_LOGD("Ignoring event");
-               __WDP_LOG_FUNC_EXIT__;
+       if (!__is_valid_plugin())
                return;
-       }
 
-       edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
-       if (!edata) {
-               char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
-               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-               WDP_LOGF("Failed to allocate memory for event. [%s]",
-                               error_buf);
+       dev_data = __create_dev_data();
+       if (!dev_data) {
                __WDP_LOG_FUNC_EXIT__;
                return;
        }
-       memset(&event, 0x0, sizeof(wfd_oem_event_s));
-
-       event.edata = (void*) edata;
-       event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
-       event.event_id = WFD_OEM_EVENT_PROV_DISC_RESP;
+       __set_event_data(WFD_OEM_EVENT_PROV_DISC_RESP,
+                       WFD_OEM_EDATA_TYPE_DEVICE,
+                       (void *)dev_data,
+                       &event);
        event.wps_mode = WFD_OEM_WPS_MODE_PBC;
 
        __ws_path_to_addr(peer_path, event.dev_addr, parameters);
@@ -2513,12 +2499,11 @@ static void _ws_process_prov_disc_pbc_resp(GDBusConnection *connection,
        if (g_pd->callback->prov_disc_resp_cb)
                g_pd->callback->prov_disc_resp_cb(&event);
 
-       g_free(event.edata);
+       __destroy_dev_data(dev_data);
 
        __WDP_LOG_FUNC_EXIT__;
 }
 
-#if defined(TIZEN_FEATURE_ASP)
 static void _ws_process_prov_disc_failure(GDBusConnection *connection,
                const gchar *sender, const gchar *object_path, const gchar *interface,
                const gchar *signal, GVariant *parameters, gpointer user_data)
@@ -2570,50 +2555,6 @@ static void _ws_process_prov_disc_failure(GDBusConnection *connection,
 
        __WDP_LOG_FUNC_EXIT__;
 }
-#else
-static void _ws_process_prov_disc_failure(GDBusConnection *connection,
-               const gchar *sender, const gchar *object_path, const gchar *interface,
-               const gchar *signal, GVariant *parameters, gpointer user_data)
-{
-       __WDP_LOG_FUNC_ENTER__;
-       wfd_oem_event_s event;
-       static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
-       static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
-       const char *path = NULL;
-       int prov_status = 0;
-       char *loc = NULL;
-
-       DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
-
-       if (!g_pd || !g_pd->callback) {
-               WDP_LOGD("Ignoring event");
-               __WDP_LOG_FUNC_EXIT__;
-               return;
-       }
-
-       memset(&event, 0x0, sizeof(wfd_oem_event_s));
-
-       event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
-       event.event_id = WFD_OEM_EVENT_PROV_DISC_FAIL;
-
-       g_variant_get(parameters, "(&oi)", &path, &prov_status);
-       g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
-       WDP_LOGD("Retrive Added path [%s]", peer_path);
-       WDP_LOGD("Retrive Failure stateus [%d]", prov_status);
-
-       loc = strrchr(peer_path, '/');
-       if (loc != NULL)
-               __ws_mac_compact_to_normal(loc + 1, peer_dev);
-       __ws_txt_to_mac(peer_dev, event.dev_addr);
-       WDP_LOGE("peer mac [" MACSTR "]", MAC2STR(event.dev_addr));
-
-       if (g_pd->callback->prov_disc_fail_cb)
-               g_pd->callback->prov_disc_fail_cb(&event);
-
-       __WDP_LOG_FUNC_EXIT__;
-}
-#endif /* TIZEN_FEATURE_ASP */
-
 
 static void _ws_process_group_started(GDBusConnection *connection,
                const gchar *sender, const gchar *object_path, const gchar *interface,
@@ -2768,65 +2709,59 @@ static void _ws_process_go_neg_failure(GDBusConnection *connection,
        __WDP_LOG_FUNC_EXIT__;
 }
 
+static void __set_wps_mode_for_event(int dev_passwd_id, wfd_oem_event_s *event)
+{
+       if (!event)
+               return;
+
+       WDP_LOGD("Retrive dev_passwd_id [%d]", dev_passwd_id);
+
+       if (dev_passwd_id == WS_DEV_PASSWD_ID_PUSH_BUTTON)
+               event->wps_mode = WFD_OEM_WPS_MODE_PBC;
+       else if (dev_passwd_id == WS_DEV_PASSWD_ID_REGISTRAR_SPECIFIED)
+               event->wps_mode = WFD_OEM_WPS_MODE_DISPLAY;
+       else if (dev_passwd_id == WS_DEV_PASSWD_ID_USER_SPECIFIED)
+               event->wps_mode = WFD_OEM_WPS_MODE_KEYPAD;
+       else
+               event->wps_mode = WFD_OEM_WPS_MODE_NONE;
+}
+
 static void _ws_process_go_neg_request(GDBusConnection *connection,
                const gchar *sender, const gchar *object_path, const gchar *interface,
                const gchar *signal, GVariant *parameters, gpointer user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_event_s event;
-       wfd_oem_dev_data_s *edata = NULL;
+       wfd_oem_dev_data_s *dev_data = NULL;
        static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
-       static unsigned char peer_dev[OEM_MACSTR_LEN] = {'\0',};
        const char *path = NULL;
-       char * loc = NULL;
        int dev_passwd_id = 0;
        int device_go_intent = 0;
 
        DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
 
-       if (!g_pd || !g_pd->callback) {
-               WDP_LOGD("Ignoring event");
-               __WDP_LOG_FUNC_EXIT__;
+       if (!__is_valid_plugin())
                return;
-       }
 
-       edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
-       if (!edata) {
-               char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
-               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-               WDP_LOGF("Failed to allocate memory for event. [%s]",
-                               error_buf);
+       dev_data = __create_dev_data();
+       if (!dev_data) {
                __WDP_LOG_FUNC_EXIT__;
                return;
        }
-       memset(&event, 0x0, sizeof(wfd_oem_event_s));
-
-       event.edata = (void*) edata;
-       event.edata_type = WFD_OEM_EDATA_TYPE_DEVICE;
-       event.event_id = WFD_OEM_EVENT_GO_NEG_REQ;
+       __set_event_data(WFD_OEM_EVENT_GO_NEG_REQ,
+                       WFD_OEM_EDATA_TYPE_DEVICE,
+                       (void *)dev_data,
+                       &event);
 
        g_variant_get(parameters, "(&oqy)", &path, &dev_passwd_id, &device_go_intent);
        g_strlcpy(peer_path, path, DBUS_OBJECT_PATH_MAX);
 
        WDP_LOGD("Retrive peer path [%s]", peer_path);
-       WDP_LOGD("Retrive dev_passwd_id [%d]", dev_passwd_id);
+       __set_wps_mode_for_event(dev_passwd_id, &event);
        WDP_LOGD("Retrive device_go_intent [%d]", device_go_intent);
+       dev_data->device_go_intent = device_go_intent;
 
-       if (dev_passwd_id == WS_DEV_PASSWD_ID_PUSH_BUTTON)
-               event.wps_mode = WFD_OEM_WPS_MODE_PBC;
-       else if (dev_passwd_id == WS_DEV_PASSWD_ID_REGISTRAR_SPECIFIED)
-               event.wps_mode = WFD_OEM_WPS_MODE_DISPLAY;
-       else if (dev_passwd_id == WS_DEV_PASSWD_ID_USER_SPECIFIED)
-               event.wps_mode = WFD_OEM_WPS_MODE_KEYPAD;
-       else
-               event.wps_mode = WFD_OEM_WPS_MODE_NONE;
-       edata->device_go_intent = device_go_intent;
-
-       loc = strrchr(peer_path, '/');
-       if (loc != NULL)
-               __ws_mac_compact_to_normal(loc + 1, peer_dev);
-       __ws_txt_to_mac(peer_dev, event.dev_addr);
-       WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(event.dev_addr));
+       __extract_addr_from_path(peer_path, event.dev_addr);
 
        dbus_property_get_all(peer_path, g_pd->g_dbus, SUPPLICANT_P2P_PEER,
                        __ws_peer_property, event.edata);
@@ -2834,7 +2769,7 @@ static void _ws_process_go_neg_request(GDBusConnection *connection,
        if (g_pd->callback->go_neg_req_cb)
                g_pd->callback->go_neg_req_cb(&event);
 
-       g_free(event.edata);
+       __destroy_dev_data(dev_data);
 
        __WDP_LOG_FUNC_EXIT__;
 }
@@ -2935,6 +2870,8 @@ static void _ws_process_group_finished(GDBusConnection *connection,
                g_dbus_connection_signal_unsubscribe(g_pd->g_dbus, ws_group_signal_map[i].sub_id);
                ws_group_signal_map[i].sub_id = 0;
        }
+
+       _ws_manage_group_iface_signal(interface, FALSE);
        memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
        _ws_flush();
 
@@ -2944,7 +2881,6 @@ static void _ws_process_group_finished(GDBusConnection *connection,
        __WDP_LOG_FUNC_EXIT__;
 }
 
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
 static void _ws_process_service_discovery_response(GDBusConnection *connection,
                const gchar *sender, const gchar *object_path, const gchar *interface,
                const gchar *signal, GVariant *parameters, gpointer user_data)
@@ -2984,9 +2920,7 @@ static void _ws_process_service_discovery_response(GDBusConnection *connection,
 
        __WDP_LOG_FUNC_EXIT__;
 }
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
 
-#if defined(TIZEN_FEATURE_ASP)
 static void _ws_process_service_asp_response(GDBusConnection *connection,
                const gchar *sender, const gchar *object_path, const gchar *interface,
                const gchar *signal, GVariant *parameters, gpointer user_data)
@@ -3053,7 +2987,6 @@ GLIST_ITER_END()
 
        __WDP_LOG_FUNC_EXIT__;
 }
-#endif /* TIZEN_FEATURE_ASP */
 
 static void _ws_process_persistent_group_added(GDBusConnection *connection,
                const gchar *sender, const gchar *object_path, const gchar *interface,
@@ -3209,7 +3142,6 @@ static void _ws_process_invitation_accepted(GDBusConnection *connection,
        __WDP_LOG_FUNC_EXIT__;
 }
 
-#if defined(TIZEN_FEATURE_ASP)
 static void _ws_process_asp_provision_start(GDBusConnection *connection,
                const gchar *sender, const gchar *object_path, const gchar *interface,
                const gchar *signal, GVariant *parameters, gpointer user_data)
@@ -3311,7 +3243,6 @@ static void _ws_process_asp_provision_done(GDBusConnection *connection,
 
        __WDP_LOG_FUNC_EXIT__;
 }
-#endif /* TIZEN_FEATURE_ASP */
 
 static struct {
        int sub_id;
@@ -3423,15 +3354,12 @@ static struct {
                "GroupFinished",
                _ws_process_group_finished
        },
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
        {
                0,
                SUPPLICANT_P2PDEVICE,
                "ServiceDiscoveryResponse",
                _ws_process_service_discovery_response
        },
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
-#if defined(TIZEN_FEATURE_ASP)
        {
                0,
                SUPPLICANT_P2PDEVICE,
@@ -3450,7 +3378,6 @@ static struct {
                "ASPProvisionDone",
                _ws_process_asp_provision_done
        },
-#endif /* TIZEN_FEATURE_ASP */
        {
                0,
                SUPPLICANT_P2PDEVICE,
@@ -3587,6 +3514,34 @@ static struct {
        }
 };
 
+static struct {
+       int sub_id;
+       const char *interface;
+       const char *member;
+       void (*function) (GDBusConnection *connection,
+                       const gchar *sender, const gchar *object_path, const gchar *interface,
+                       const gchar *signal, GVariant *parameters, gpointer user_data);
+} ws_group_interface_signal_map[] = {
+       {
+               0,
+               SUPPLICANT_IFACE,
+               "StaAuthorized",
+               _ws_process_sta_authorized
+       },
+       {
+               0,
+               SUPPLICANT_IFACE,
+               "StaDeauthorized",
+               _ws_process_sta_deauthorized
+       },
+       {
+               0,
+               NULL,
+               NULL,
+               NULL
+       }
+};
+
 static void __register_p2pdevice_signal(GVariant *value, void *user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
@@ -3679,7 +3634,7 @@ static int _ws_create_interface(const char *iface_name, handle_reply function, v
                WDP_LOGD("Succeeded to CreateInterface");
 
        __WDP_LOG_FUNC_EXIT__;
-       return 0;
+       return res;
 }
 
 static int _ws_get_interface(const char *iface_name, handle_reply function, void *user_data)
@@ -3720,7 +3675,6 @@ static int _ws_get_interface(const char *iface_name, handle_reply function, void
        return res;
 }
 
-#if defined(TIZEN_PROFILE_MOBILE) && (TIZEN_WLAN_BOARD_SPRD)
 static void __ws_remove_interface(GVariant *value, void *user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
@@ -3759,7 +3713,6 @@ static void __ws_remove_interface(GVariant *value, void *user_data)
        __WDP_LOG_FUNC_EXIT__;
        return;
 }
-#endif /* (TIZEN_PROFILE_MOBILE) && (TIZEN_WLAN_BOARD_SPRD) */
 
 static int _ws_init_dbus_connection(void)
 {
@@ -3775,6 +3728,12 @@ static int _ws_init_dbus_connection(void)
                return -1;
        }
 
+       if (!config) {
+               WDP_LOGE("no configurable data found");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
        conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
 
        if (conn == NULL) {
@@ -3803,15 +3762,15 @@ static int _ws_init_dbus_connection(void)
                WDP_LOGD("Subscribed supplicant iface signal [%s]", ws_supplicant_signal_map[i].member);
        }
 
-#if defined(TIZEN_PROFILE_MOBILE) && (TIZEN_WLAN_BOARD_SPRD)
-       if (_ws_get_interface(COMMON_IFACE_NAME, NULL, NULL) < 0)
-               _ws_create_interface(COMMON_IFACE_NAME, NULL, NULL);
-       if (_ws_get_interface(P2P_IFACE_NAME, __register_p2pdevice_signal, NULL) < 0)
-               res = _ws_create_interface(P2P_IFACE_NAME, __register_p2pdevice_signal, NULL);
-#else /* (TIZEN_PROFILE_MOBILE) && (TIZEN_WLAN_BOARD_SPRD) */
-       if (_ws_get_interface(COMMON_IFACE_NAME, __register_p2pdevice_signal, NULL) < 0)
-               res = _ws_create_interface(COMMON_IFACE_NAME, __register_p2pdevice_signal, NULL);
-#endif /* (TIZEN_PROFILE_MOBILE) && (TIZEN_WLAN_BOARD_SPRD) */
+       if (g_strcmp0(config->ifname, config->p2p_ifname) != 0) {
+               if (_ws_get_interface(config->ifname, NULL, NULL) < 0)
+                       res = _ws_create_interface(config->ifname, NULL, NULL);
+               if (_ws_get_interface(config->p2p_ifname, __register_p2pdevice_signal, NULL) < 0)
+                       res = _ws_create_interface(config->p2p_ifname, __register_p2pdevice_signal, NULL);
+       } else {
+               if (_ws_get_interface(config->p2p_ifname, __register_p2pdevice_signal, NULL) < 0)
+                       res = _ws_create_interface(config->p2p_ifname, __register_p2pdevice_signal, NULL);
+       }
 
        if (res < 0)
                WDP_LOGE("Failed to subscribe interface signal");
@@ -3868,6 +3827,52 @@ static int _ws_deinit_dbus_connection(void)
        return 0;
 }
 
+static void _ws_manage_group_iface_signal(const gchar *group_iface_obj_path,
+               gboolean is_created)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       GDBusConnection *connection;
+
+       if (!g_pd) {
+               WDP_LOGD("Ignore");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
+       if (!g_strcmp0(g_pd->iface_path, group_iface_obj_path)) {
+               WDP_LOGD("group iface is p2p iface, ignore");
+               __WDP_LOG_FUNC_EXIT__;
+               return;
+       }
+
+       connection = g_pd->g_dbus;
+       int i;
+       if (is_created) {
+               /* subscribe Interface iface signal */
+               for (i = 0; ws_group_interface_signal_map[i].member != NULL; i++) {
+                       ws_group_interface_signal_map[i].sub_id =
+                               g_dbus_connection_signal_subscribe(connection,
+                                               SUPPLICANT_SERVICE, /* bus name */
+                                               ws_group_interface_signal_map[i].interface, /* interface */
+                                               ws_group_interface_signal_map[i].member, /* member */
+                                               group_iface_obj_path, /* object path */
+                                               NULL, /* arg0 */
+                                               G_DBUS_SIGNAL_FLAGS_NONE,
+                                               ws_group_interface_signal_map[i].function,
+                                               NULL, NULL);
+                       WDP_LOGD("Subscribed Interface iface signal [%s]", ws_group_interface_signal_map[i].member);
+               }
+
+       } else {
+               for (i = 0; ws_group_interface_signal_map[i].member != NULL; i++) {
+                       g_dbus_connection_signal_unsubscribe(connection, ws_group_interface_signal_map[i].sub_id);
+                       ws_group_interface_signal_map[i].sub_id = 0;
+               }
+       }
+       __WDP_LOG_FUNC_EXIT__;
+       return;
+}
+
 int wfd_plugin_load(wfd_oem_ops_s **ops)
 {
        __WDP_LOG_FUNC_ENTER__;
@@ -3921,8 +3926,7 @@ static int __ws_check_net_interface(char* if_name)
        }
 
        memset(&ifr, 0, sizeof(ifr));
-       strncpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name));
-       ifr.ifr_name[IFNAMSIZ-1] = '\0';
+       g_strlcpy(ifr.ifr_name, if_name, IFNAMSIZ);
 
        if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) {
                close(fd);
@@ -3944,6 +3948,30 @@ static int __ws_check_net_interface(char* if_name)
        return 0;
 }
 
+int ws_configure(wfd_oem_config_s *conf)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       if (conf == NULL) {
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (config)
+               g_free(config);
+
+       config = (wfd_oem_config_s *) g_try_malloc0(sizeof(wfd_oem_config_s));
+       if (!config) {
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       memcpy(config, conf, sizeof(wfd_oem_config_s));
+
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
 int ws_init(wfd_oem_event_cbs_s *event_cbs)
 {
        __WDP_LOG_FUNC_ENTER__;
@@ -3981,6 +4009,9 @@ int ws_deinit(void)
                g_pd = NULL;
        }
 
+       if (config)
+               g_free(config);
+
        __WDP_LOG_FUNC_EXIT__;
        return 0;
 }
@@ -4029,30 +4060,58 @@ gboolean _ws_util_execute_file(const char *file_path,
        return FALSE;
 }
 
-static int __ws_p2p_firmware_start(void)
+static int __ws_p2p_firmware_start(const char *interface_name)
 {
-       gboolean rv = FALSE;
-       const char *path = "/usr/bin/wlan.sh";
-       char *const args[] = { "/usr/bin/wlan.sh", "p2p", NULL };
-       char *const envs[] = { NULL };
+       GError *error = NULL;
+       GDBusConnection *conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+       if (conn == NULL) {
+               WDP_LOGE("Failed to get system bus");
+       return -1;
+       }
 
-       rv = _ws_util_execute_file(path, args, envs);
-       if (rv != TRUE)
-               return -1;
+       error = NULL;
+       GVariant *params = g_variant_new("(sb)", interface_name, FALSE);
+       GVariant *reply = g_dbus_connection_call_sync(
+               conn,
+               NETCONFIG_SERVICE, /* bus name */
+               NETCONFIG_WIFI_PATH, /* object path */
+               NETCONFIG_WIFI_INTERFACE, /* interface name */
+               "LoadDriver", /* method name */
+               params, /* GVariant *params */
+               NULL, /* reply_type */
+               G_DBUS_CALL_FLAGS_NONE, /* flags */
+               SUPPLICANT_TIMEOUT , /* timeout */
+               NULL, /* cancellable */
+               &error); /* error */
+
+       if (error != NULL) {
+               WDP_LOGE("Error! Failed to call method: [%s]", error->message);
+               g_error_free(error);
+               __WDP_LOG_FUNC_EXIT__;
+       }
+
+       if (reply)
+               g_variant_unref(reply);
+       g_object_unref(conn);
 
-       WDP_LOGI("Successfully loaded p2p device driver");
        return 0;
 }
 
-static int __ws_p2p_firmware_stop(void)
+static int __ws_p2p_firmware_stop(const char *interface_name)
 {
-       gboolean rv = FALSE;
-       const char *path = "/usr/bin/wlan.sh";
-       char *const args[] = { "/usr/bin/wlan.sh", "stop", NULL };
-       char *const envs[] = { NULL };
-       rv = _ws_util_execute_file(path, args, envs);
-       if (rv < 0)
+       int rv = 0;
+
+       rv = hal_wifi_get_backend();
+       if (rv < 0) {
+               WDP_LOGD("hal_wifi_get_backend() failed, ret: %d", rv);
                return -1;
+       }
+
+       rv = hal_wifi_stop(interface_name);
+       if (rv < 0) {
+               WDP_LOGD("hal_wifi_stop() failed, ret: %d", rv);
+               return -1;
+       }
 
        WDP_LOGI("Successfully removed p2p device driver");
        return 0;
@@ -4201,14 +4260,11 @@ int __ws_init_p2pdevice(void)
        GVariantBuilder *type_builder = NULL;
        dbus_method_param_s params;
 
-       const char *primary_device_type = PRIMARY_DEVICE_TYPE;
+       unsigned char primary_device_type[8] = {
+               0x00, 0x00, 0x00, 0x50,
+               0xf2, 0x04, 0x00, 0x00
+       };
 
-#ifdef TIZEN_FEATURE_IP_OVER_EAPOL
-       const char *ip_addr_go = DEFAULT_IP_GO;
-       const char *ip_addr_mask = DEFAULT_IP_MASK;
-       const char *ip_addr_start = DEFAULT_IP_START;
-       const char *ip_addr_end = DEFAULT_IP_END;
-#endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
        int i = 0;
        int res = 0;
 
@@ -4218,6 +4274,15 @@ int __ws_init_p2pdevice(void)
                return -1;
        }
 
+       if (!config) {
+               WDP_LOGE("no configurable data found");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       primary_device_type[1] = config->pri_dev_type;
+       primary_device_type[7] = config->sec_dev_type;
+
        for (i = 0; i < WS_DEVTYPE_LEN; i++)
                WDP_LOGD("device type[%02x]", primary_device_type[i]);
 
@@ -4234,31 +4299,31 @@ int __ws_init_p2pdevice(void)
 
        builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
        g_variant_builder_add(builder, "{sv}", "DeviceName",
-                                       g_variant_new_string(DEFAULT_DEVICE_NAME));
+                                       g_variant_new_string(config->device_name));
 
        g_variant_builder_add(builder, "{sv}", "GOIntent",
-                                       g_variant_new_uint32(DEFAULT_GO_INTENT));
+                                       g_variant_new_uint32(config->go_intent));
 
        g_variant_builder_add(builder, "{sv}", "PersistentReconnect",
-                                       g_variant_new_boolean(DEFAULT_PERSISTENT_RECONNECT));
+                                       g_variant_new_boolean(config->persistent_reconnect));
 
        g_variant_builder_add(builder, "{sv}", "ListenRegClass",
-                                       g_variant_new_uint32(DEFAULT_LISTEN_REG_CLASS));
+                                       g_variant_new_uint32(config->listen_reg_class));
 
        g_variant_builder_add(builder, "{sv}", "ListenChannel",
-                                       g_variant_new_uint32(DEFAULT_LISTEN_CHANNEL));
+                                       g_variant_new_uint32(config->listen_channel));
 
        g_variant_builder_add(builder, "{sv}", "OperRegClass",
-                                       g_variant_new_uint32(DEFAULT_OPER_REG_CLASS));
+                                       g_variant_new_uint32(config->operating_reg_class));
 
        g_variant_builder_add(builder, "{sv}", "OperChannel",
-                                       g_variant_new_uint32(DEFAULT_OPER_CHANNEL));
+                                       g_variant_new_uint32(config->operating_channel));
 
        g_variant_builder_add(builder, "{sv}", "SsidPostfix",
-                                       g_variant_new_string(DEFAULT_DEVICE_NAME));
+                                       g_variant_new_string(config->device_name));
 
        g_variant_builder_add(builder, "{sv}", "NoGroupIface",
-                                       g_variant_new_boolean(DEFAULT_NO_GROUP_IFACE));
+                                       g_variant_new_boolean(config->no_group_iface));
 
        type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
        for (i = 0; i < WS_DEVTYPE_LEN; i++)
@@ -4266,35 +4331,6 @@ int __ws_init_p2pdevice(void)
        g_variant_builder_add(builder, "{sv}", "PrimaryDeviceType",
                        g_variant_new("ay", type_builder));
        g_variant_builder_unref(type_builder);
-#ifdef TIZEN_FEATURE_IP_OVER_EAPOL
-       type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
-       for (i = 0; i < OEM_IPADDR_LEN; i++)
-               g_variant_builder_add(type_builder, "y", ip_addr_go[i]);
-       g_variant_builder_add(builder, "{sv}", "IpAddrGO",
-                       g_variant_new("ay", type_builder));
-       g_variant_builder_unref(type_builder);
-
-       type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
-       for (i = 0; i < OEM_IPADDR_LEN; i++)
-               g_variant_builder_add(type_builder, "y", ip_addr_mask[i]);
-       g_variant_builder_add(builder, "{sv}", "IpAddrMask",
-                       g_variant_new("ay", type_builder));
-       g_variant_builder_unref(type_builder);
-
-       type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
-       for (i = 0; i < OEM_IPADDR_LEN; i++)
-               g_variant_builder_add(type_builder, "y", ip_addr_start[i]);
-       g_variant_builder_add(builder, "{sv}", "IpAddrStart",
-                       g_variant_new("ay", type_builder));
-       g_variant_builder_unref(type_builder);
-
-       type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
-       for (i = 0; i < OEM_IPADDR_LEN; i++)
-               g_variant_builder_add(type_builder, "y", ip_addr_end[i]);
-       g_variant_builder_add(builder, "{sv}", "IpAddrEnd",
-                       g_variant_new("ay", type_builder));
-       g_variant_builder_unref(type_builder);
-#endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
        value = g_variant_new("a{sv}", builder);
        g_variant_builder_unref(builder);
 
@@ -4329,6 +4365,12 @@ int __ws_set_config_methods(void)
                return -1;
        }
 
+       if (!config) {
+               WDP_LOGE("no configurable data found");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
        g_dbus = g_pd->g_dbus;
        if (!g_dbus) {
                WDP_LOGE("DBus connection is NULL");
@@ -4340,7 +4382,7 @@ int __ws_set_config_methods(void)
        dbus_set_method_param(&params, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
                         g_dbus);
 
-       value = g_variant_new_string(DEFAULT_CONFIG_METHOD);
+       value = g_variant_new_string(config->config_methods);
 
        param = g_variant_new("(ssv)", SUPPLICANT_WPS, "ConfigMethods", value);
        params.params = param;
@@ -4349,7 +4391,7 @@ int __ws_set_config_methods(void)
        if (res < 0)
                WDP_LOGE("Failed to send command to wpa_supplicant");
        else
-               WDP_LOGD("Succeeded to set config method(%s)", DEFAULT_CONFIG_METHOD);
+               WDP_LOGD("Succeeded to set config method(%s)", config->config_methods);
 
        __WDP_LOG_FUNC_EXIT__;
        return res;
@@ -4367,6 +4409,12 @@ int ws_activate(int concurrent)
                return -1;
        }
 
+       if (!config) {
+               WDP_LOGE("no configurable data found");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
        res = __ws_p2p_supplicant_start();
        if (res < 0) {
                res = __ws_p2p_supplicant_stop();
@@ -4378,14 +4426,14 @@ int ws_activate(int concurrent)
        while (retry_count < WS_CONN_RETRY_COUNT) {
                /* load wlan driver */
                if (concurrent == 0)
-                       res = __ws_p2p_firmware_start();
+                       res = __ws_p2p_firmware_start(config->ifname);
                if (res < 0) {
                        WDP_LOGE("Failed to load driver [ret=%d]", res);
                        return -1;
                }
                WDP_LOGI("P2P firmware started with error %d", res);
 
-               if (__ws_check_net_interface(COMMON_IFACE_NAME) < 0) {
+               if (__ws_check_net_interface(config->ifname) < 0) {
                        usleep(150000); /* wait for 150ms */
                        concurrent = 0;
                        retry_count++;
@@ -4396,7 +4444,7 @@ int ws_activate(int concurrent)
        }
 
        if (retry_count >= WS_CONN_RETRY_COUNT) {
-               WDP_LOGE("Driver loading is failed", res);
+               WDP_LOGE("Driver loading is failed [%d]", res);
                __WDP_LOG_FUNC_EXIT__;
                return -1;
        }
@@ -4412,7 +4460,7 @@ int ws_activate(int concurrent)
        if (res < 0) {
                res = __ws_p2p_supplicant_stop();
                WDP_LOGI("[/usr/sbin/p2p_supp.sh stop] returns %d", res);
-               res = __ws_p2p_firmware_stop();
+               res = __ws_p2p_firmware_stop(config->ifname);
                WDP_LOGI("P2P firmware stopped with error %d", res);
                __WDP_LOG_FUNC_EXIT__;
                return -1;
@@ -4430,43 +4478,46 @@ int ws_activate(int concurrent)
 int ws_deactivate(int concurrent)
 {
        __WDP_LOG_FUNC_ENTER__;
-#if defined(TIZEN_FEATURE_ASP)
        wfd_oem_asp_service_s *data = NULL;
-#endif /* TIZEN_FEATURE_ASP */
-       int res = 0;
+       int res = -1;
 
        if (!g_pd) {
                WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
                __WDP_LOG_FUNC_EXIT__;
-               return -1;
+               return res;
+       }
+
+       if (!config) {
+               WDP_LOGE("no configurable data found");
+               __WDP_LOG_FUNC_EXIT__;
+               return res;
        }
 
        if (!g_pd->activated) {
                WDP_LOGE("Wi-Fi Direct is not activated");
                __WDP_LOG_FUNC_EXIT__;
-               return -1;
+               return res;
        }
 
        ws_stop_scan();
 
        g_pd->concurrent = concurrent;
-#if defined(TIZEN_PROFILE_MOBILE) && (TIZEN_WLAN_BOARD_SPRD)
-       _ws_get_interface(P2P_IFACE_NAME, __ws_remove_interface, NULL);
+
+       if (g_strcmp0(config->ifname, config->group_ifname) != 0)
+               _ws_get_interface(config->group_ifname, __ws_remove_interface, NULL);
        if (concurrent == 0)
-               _ws_get_interface(COMMON_IFACE_NAME, __ws_remove_interface, NULL);
-#endif /* (TIZEN_PROFILE_MOBILE) && (TIZEN_WLAN_BOARD_SPRD) */
+               _ws_get_interface(config->ifname, __ws_remove_interface, NULL);
 
        _ws_deinit_dbus_connection();
 
        if (concurrent == 0) {
                res = __ws_p2p_supplicant_stop();
                WDP_LOGI("[/usr/sbin/p2p_supp.sh stop] returns %d", res);
-               res = __ws_p2p_firmware_stop();
+               res = __ws_p2p_firmware_stop(config->ifname);
                WDP_LOGI("P2P firmware stopped with error %d", res);
        }
        g_pd->activated = FALSE;
 
-#if defined(TIZEN_FEATURE_ASP)
        GLIST_ITER_START(seek_list, data)
 
        if (data) {
@@ -4478,7 +4529,6 @@ int ws_deactivate(int concurrent)
        }
 
        GLIST_ITER_END()
-#endif /* TIZEN_FEATURE_ASP */
        __WDP_LOG_FUNC_EXIT__;
        return 0;
 }
@@ -4495,7 +4545,6 @@ static gboolean _retry_start_scan(gpointer data)
 }
 #endif
 
-#if defined(TIZEN_FEATURE_ASP)
 static void __ws_add_seek_params(GVariantBuilder *builder)
 {
        GVariantBuilder *outter = NULL;
@@ -4528,7 +4577,6 @@ GLIST_ITER_END()
 
        return;
 }
-#endif /* TIZEN_FEATURE_ASP */
 
 int ws_start_scan(wfd_oem_scan_param_s *param)
 {
@@ -4571,10 +4619,8 @@ int ws_start_scan(wfd_oem_scan_param_s *param)
                        if (param->scan_type == WFD_OEM_SCAN_TYPE_SOCIAL)
                                g_variant_builder_add(builder, "{sv}", "DiscoveryType",
                                                        g_variant_new_string("social"));
-#if defined(TIZEN_FEATURE_ASP)
                        if (seek_list != NULL)
                                __ws_add_seek_params(builder);
-#endif /* TIZEN_FEATURE_ASP */
 
                        value = g_variant_new("(a{sv})", builder);
                        g_variant_builder_unref(builder);
@@ -4699,12 +4745,25 @@ int ws_get_scan_result(GList **peers, int *peer_count)
        __WDP_LOG_FUNC_EXIT__;
        return 0;
 }
+static wfd_oem_device_s *__create_oem_device(void)
+{
+       wfd_oem_device_s *device =
+                       (wfd_oem_device_s *) g_try_malloc0(sizeof(wfd_oem_device_s));
+       if (!device) {
+               char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
+               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
+               WDP_LOGF("Failed to allocate memory for event. [%s]",
+                          error_buf);
+       }
+
+       return device;
+}
 
 int ws_get_peer_info(unsigned char *peer_addr, wfd_oem_device_s **peer)
 {
        __WDP_LOG_FUNC_ENTER__;
        GDBusConnection *g_dbus = NULL;
-       wfd_oem_device_s *ws_dev = NULL;
+       wfd_oem_device_s *device = NULL;
        static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
        int res = 0;
 
@@ -4727,12 +4786,8 @@ int ws_get_peer_info(unsigned char *peer_addr, wfd_oem_device_s **peer)
                return -1;
        }
 
-       ws_dev = (wfd_oem_device_s *) g_try_malloc0(sizeof(wfd_oem_device_s));
-       if (!ws_dev) {
-               char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
-               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-               WDP_LOGF("Failed to allocate memory device. [%s]",
-                               error_buf);
+       device = __create_oem_device();
+       if (!device) {
                __WDP_LOG_FUNC_EXIT__;
                return -1;
        }
@@ -4743,17 +4798,23 @@ int ws_get_peer_info(unsigned char *peer_addr, wfd_oem_device_s **peer)
        WDP_LOGD("get peer path [%s]", peer_path);
 
        res = dbus_property_get_all(peer_path, g_dbus, SUPPLICANT_P2P_PEER,
-                               __ws_get_peer_property, ws_dev);
+                               __ws_get_peer_property, device);
 
        if (res < 0) {
-                       WDP_LOGE("Failed to send command to wpa_supplicant");
-                       g_free(ws_dev);
-                       __WDP_LOG_FUNC_EXIT__;
-                       return -1;
+               WDP_LOGE("Failed to send command to wpa_supplicant");
+               if (device->vsie)
+                       g_free(device->vsie);
+               g_free(device);
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
        } else {
                WDP_LOGD("succeeded to get peer info");
-               *peer = ws_dev;
+               *peer = device;
        }
+
+       //Memory ownership of dev_data is transferred to method handler
+       //which uses this function.
+
        __WDP_LOG_FUNC_EXIT__;
        return 0;
 }
@@ -5076,7 +5137,13 @@ int ws_generate_pin(char **pin)
 int ws_get_supported_wps_mode(int *wps_mode)
 {
        __WDP_LOG_FUNC_ENTER__;
+       if (!wps_mode) {
+               WDP_LOGE("Invalid parameter");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
 
+       *wps_mode = wps_config_method;
        __WDP_LOG_FUNC_EXIT__;
        return 0;
 }
@@ -5972,6 +6039,7 @@ int ws_remove_persistent_group(char *ssid, unsigned char *bssid)
                __WDP_LOG_FUNC_EXIT__;
                return -1;
        }
+       memset(&networks, 0x0, WS_MAX_PERSISTENT_COUNT * sizeof(ws_network_info_s));
        dbus_property_get_all(g_pd->iface_path, g_dbus, SUPPLICANT_P2PDEVICE,
                        __ws_extract_p2pdevice_details, networks);
 
@@ -6080,7 +6148,6 @@ int ws_set_persistent_reconnect(unsigned char *bssid, int reconnect)
        return res;
 }
 
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
 static int __ws_compress_query(char *compressed, char *query, int qtype)
 {
        char *token = NULL;
@@ -6252,7 +6319,7 @@ static wfd_oem_service_s* _remove_service_query(char * s_type, char *mac_str, ch
                data = (wfd_oem_service_s*) g_list_nth_data(service_list, count);
                if (data && !strncmp(data->service_type, s_type, SERVICE_TYPE_LEN) &&
                                memcmp(data->dev_addr, mac_str, OEM_MACSTR_LEN - 1) == 0) {
-                       strncpy(query_id, data->query_id, OEM_QUERY_ID_LEN);
+                       g_strlcpy(query_id, data->query_id, OEM_QUERY_ID_LEN + 1);
                        break;
                }
        }
@@ -6261,22 +6328,22 @@ static wfd_oem_service_s* _remove_service_query(char * s_type, char *mac_str, ch
                return NULL;
        }
 
-       WDP_LOGD("query id :[0x%s]", query_id);
+       WDP_LOGD("query id :[%s]", query_id);
 
        return data;
 }
 
-void __add_service_query(GVariant *value, void *mac_addr)
+void __add_service_query(GVariant *value, void *user_data)
 {
        __WDP_LOG_FUNC_ENTER__;
        wfd_oem_service_s *service = NULL;
 
        long long unsigned ref = 0;
-       unsigned char *mac_address = (unsigned char *)mac_addr;
-       char mac_str[18] = {0, };
-
        int res = 0;
 
+       if (!user_data)
+               return;
+
        g_variant_get(value, "(t)", &ref);
 
        service = (wfd_oem_service_s*) g_try_malloc0(sizeof(wfd_oem_service_s));
@@ -6285,19 +6352,13 @@ void __add_service_query(GVariant *value, void *mac_addr)
                return;
        }
 
-       if (mac_address[0] == 0 && mac_address[1] == 0 && mac_address[2] == 0 &&
-                       mac_address[3] == 0 && mac_address[4] == 0 && mac_address[5] == 0) {
-               g_snprintf(mac_str, WS_MACSTR_LEN , "%s", SERV_BROADCAST_ADDRESS);
-       } else {
-               g_snprintf(mac_str, WS_MACSTR_LEN, MACSTR, MAC2STR(mac_address));
-       }
+       memcpy(service, user_data, sizeof(wfd_oem_service_s));
 
-       g_strlcpy(service->dev_addr, mac_str, OEM_MACSTR_LEN);
-       g_snprintf(service->query_id, OEM_QUERY_ID_LEN + 1, "0x%llx", ref);
+       g_snprintf(service->query_id, OEM_QUERY_ID_LEN + 1, "%llx", ref);
 
        res = _check_service_query_exists(service);
        if (res)
-               free(service);
+               g_free(service);
        else
                service_list = g_list_append(service_list, service);
 
@@ -6313,6 +6374,7 @@ int ws_start_service_discovery(unsigned char *mac_addr, int service_type)
        GDBusConnection *g_dbus = NULL;
        GVariantBuilder *builder = NULL;
        GVariant *value = NULL;
+       wfd_oem_service_s data = {0,};
        dbus_method_param_s params;
        static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
        int i = 0;
@@ -6342,7 +6404,7 @@ int ws_start_service_discovery(unsigned char *mac_addr, int service_type)
 
        builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
 
-       if (mac_addr) {
+       if (mac_addr && !ISZEROMACADDR(mac_addr)) {
                g_snprintf(peer_path, DBUS_OBJECT_PATH_MAX, "%s/Peers/"
                                COMPACT_MACSTR, g_pd->iface_path, MAC2STR(mac_addr));
                WDP_LOGD("get peer path [%s]", peer_path);
@@ -6359,11 +6421,14 @@ int ws_start_service_discovery(unsigned char *mac_addr, int service_type)
                        g_variant_builder_add(query, "y", service_all[i]);
                g_variant_builder_add(builder, "{sv}", "query", g_variant_new("ay", query));
                g_variant_builder_unref(query);
+               g_strlcpy(data.service_type, SERV_DISC_REQ_ALL, OEM_SERVICE_TYPE_LEN + 1);
 
-               } else if (service_type == WFD_OEM_SERVICE_TYPE_UPNP) {
+       } else if (service_type == WFD_OEM_SERVICE_TYPE_UPNP) {
 
                g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("upnp"));
-               g_variant_builder_add(builder, "{sv}", "version", g_variant_new_uint16(TRUE));
+               g_variant_builder_add(builder, "{sv}", "version", g_variant_new_int32(10));
+               g_variant_builder_add(builder, "{sv}", "service", g_variant_new_string("ssdp:all"));
+               g_strlcpy(data.service_type, SERV_DISC_REQ_UPNP, OEM_SERVICE_TYPE_LEN + 1);
 
        } else if (service_type == WFD_OEM_SERVICE_TYPE_BONJOUR) {
 
@@ -6373,8 +6438,9 @@ int ws_start_service_discovery(unsigned char *mac_addr, int service_type)
                query = g_variant_builder_new(G_VARIANT_TYPE("ay"));
                for (i = 0; i < SERVICE_QUERY_LEN; i++)
                        g_variant_builder_add(query, "y", service_bonjour[i]);
-               g_variant_builder_add(builder, "{sv}", "query", g_variant_new("ay", query));
+               g_variant_builder_add(builder, "{sv}", "tlv", g_variant_new("ay", query));
                g_variant_builder_unref(query);
+               g_strlcpy(data.service_type, SERV_DISC_REQ_BONJOUR, OEM_SERVICE_TYPE_LEN + 1);
        }
 
        value = g_variant_new("(a{sv})", builder);
@@ -6383,7 +6449,12 @@ int ws_start_service_discovery(unsigned char *mac_addr, int service_type)
        params.params = value;
        DEBUG_G_VARIANT("Params : ", params.params);
 
-       res = dbus_method_call(&params, SUPPLICANT_P2PDEVICE, __add_service_query, mac_addr);
+       if (ISZEROMACADDR(mac_addr))
+               snprintf(data.dev_addr, WS_MACSTR_LEN , "%s", SERV_BROADCAST_ADDRESS);
+       else
+               snprintf(data.dev_addr, WS_MACSTR_LEN, MACSTR, MAC2STR(mac_addr));
+
+       res = dbus_method_call(&params, SUPPLICANT_P2PDEVICE, __add_service_query, &data);
        if (res < 0)
                WDP_LOGE("Failed to send command to wpa_supplicant");
        else
@@ -6402,6 +6473,7 @@ int ws_cancel_service_discovery(unsigned char *mac_addr, int service_type)
        char query_id[OEM_QUERY_ID_LEN + 1] = {0, };
        char s_type[OEM_SERVICE_TYPE_LEN + 1] = {0, };
        char mac_str[18] = {0, };
+       long long unsigned id;
 
        int res = 0;
 
@@ -6424,8 +6496,7 @@ int ws_cancel_service_discovery(unsigned char *mac_addr, int service_type)
                return -1;
        }
 
-       if (mac_addr[0] == 0 && mac_addr[1] == 0 && mac_addr[2] == 0 &&
-               mac_addr[3] == 0 && mac_addr[4] == 0 && mac_addr[5] == 0) {
+       if (ISZEROMACADDR(mac_addr)) {
                snprintf(mac_str, WS_MACSTR_LEN , "%s", SERV_BROADCAST_ADDRESS);
        } else {
                snprintf(mac_str, WS_MACSTR_LEN, MACSTR, MAC2STR(mac_addr));
@@ -6433,13 +6504,13 @@ int ws_cancel_service_discovery(unsigned char *mac_addr, int service_type)
 
        switch (service_type) {
        case WFD_OEM_SERVICE_TYPE_ALL:
-               strncpy(s_type, SERV_DISC_REQ_ALL, OEM_SERVICE_TYPE_LEN);
+               g_strlcpy(s_type, SERV_DISC_REQ_ALL, OEM_SERVICE_TYPE_LEN + 1);
        break;
        case WFD_OEM_SERVICE_TYPE_BONJOUR:
-               strncpy(s_type, SERV_DISC_REQ_BONJOUR, OEM_SERVICE_TYPE_LEN);
+               g_strlcpy(s_type, SERV_DISC_REQ_BONJOUR, OEM_SERVICE_TYPE_LEN + 1);
        break;
        case WFD_OEM_SERVICE_TYPE_UPNP:
-               strncpy(s_type, SERV_DISC_REQ_UPNP, OEM_SERVICE_TYPE_LEN);
+               g_strlcpy(s_type, SERV_DISC_REQ_UPNP, OEM_SERVICE_TYPE_LEN + 1);
        break;
        default:
                WDP_LOGE("Invalid Service type");
@@ -6458,8 +6529,8 @@ int ws_cancel_service_discovery(unsigned char *mac_addr, int service_type)
        memset(&params, 0x0, sizeof(dbus_method_param_s));
 
        dbus_set_method_param(&params, "ServiceDiscoveryCancelRequest", g_pd->iface_path, g_dbus);
-
-       params.params = g_variant_new("(t)", strtoul(query_id, NULL, 16));
+       id = (long long unsigned)strtoul(query_id, NULL, 16);
+       params.params = g_variant_new("(t)", id);
 
        res = dbus_method_call(&params, SUPPLICANT_P2PDEVICE, NULL, NULL);
        if (res < 0)
@@ -6517,7 +6588,7 @@ int ws_serv_add(wfd_oem_new_service_s *service)
 
        } else if (service->protocol == WFD_OEM_SERVICE_TYPE_UPNP) {
                g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("upnp"));
-               g_variant_builder_add(builder, "{sv}", "version", g_variant_new_uint16(TRUE));
+               g_variant_builder_add(builder, "{sv}", "version", g_variant_new_int32(10));
                g_variant_builder_add(builder, "{sv}", "service", g_variant_new_string(service->data.upnp.service));
        }
 
@@ -6579,7 +6650,7 @@ int ws_serv_del(wfd_oem_new_service_s *service)
 
        } else if (service->protocol == WFD_OEM_SERVICE_TYPE_UPNP) {
                g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new_string("upnp"));
-               g_variant_builder_add(builder, "{sv}", "version", g_variant_new_uint16(TRUE));
+               g_variant_builder_add(builder, "{sv}", "version", g_variant_new_int32(10));
                g_variant_builder_add(builder, "{sv}", "service", g_variant_new_string(service->data.upnp.service));
        }
 
@@ -6598,7 +6669,6 @@ int ws_serv_del(wfd_oem_new_service_s *service)
        __WDP_LOG_FUNC_EXIT__;
        return 0;
 }
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
 
 int _ws_disable_display()
 {
@@ -6945,7 +7015,6 @@ int ws_get_wpa_status(int *wpa_status)
        return 0;
 }
 
-#if defined(TIZEN_FEATURE_ASP)
 int ws_advertise_service(wfd_oem_asp_service_s *service, int replace)
 {
        __WDP_LOG_FUNC_ENTER__;
@@ -7363,7 +7432,99 @@ int ws_asp_prov_disc_req(wfd_oem_asp_prov_s *asp_params)
        __WDP_LOG_FUNC_EXIT__;
        return res;
 }
-#endif /* TIZEN_FEATURE_ASP */
+
+int ws_set_eapol_ip_config(int enable)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       GDBusConnection *g_dbus = NULL;
+
+       GVariant *value = NULL;
+       GVariant *param = NULL;
+       GVariantBuilder *builder = NULL;
+       GVariantBuilder *type_builder = NULL;
+       dbus_method_param_s params;
+       int res = 0;
+       int i = 0;
+       enum {
+               IP_GO,
+               IP_MASK,
+               IP_START,
+               IP_END,
+       };
+       unsigned char eapol_ip[IP_END + 1][OEM_IPADDR_LEN + 1] = {0,};
+
+       if (!g_pd) {
+               WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       g_dbus = g_pd->g_dbus;
+       if (!g_dbus) {
+               WDP_LOGE("DBus connection is NULL");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       memset(&params, 0x0, sizeof(dbus_method_param_s));
+
+       dbus_set_method_param(&params, DBUS_PROPERTIES_METHOD_SET, g_pd->iface_path,
+                        g_dbus);
+
+       builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+
+       memset(&eapol_ip, 0x0, (IP_END + 1) * (OEM_IPADDR_LEN + 1));
+       if (enable == 1) {
+               memcpy(eapol_ip[IP_GO], DEFAULT_IP_GO, OEM_IPADDR_LEN);
+               memcpy(eapol_ip[IP_MASK], DEFAULT_IP_MASK, OEM_IPADDR_LEN);
+               memcpy(eapol_ip[IP_START], DEFAULT_IP_START, OEM_IPADDR_LEN);
+               memcpy(eapol_ip[IP_END], DEFAULT_IP_END, OEM_IPADDR_LEN);
+       }
+
+       type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
+       for (i = 0; i < OEM_IPADDR_LEN; i++)
+               g_variant_builder_add(type_builder, "y", eapol_ip[IP_GO][i]);
+       g_variant_builder_add(builder, "{sv}", "IpAddrGo",
+                       g_variant_new("ay", type_builder));
+       g_variant_builder_unref(type_builder);
+
+       type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
+       for (i = 0; i < OEM_IPADDR_LEN; i++)
+               g_variant_builder_add(type_builder, "y", eapol_ip[IP_MASK][i]);
+       g_variant_builder_add(builder, "{sv}", "IpAddrMask",
+                       g_variant_new("ay", type_builder));
+       g_variant_builder_unref(type_builder);
+
+       type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
+       for (i = 0; i < OEM_IPADDR_LEN; i++)
+               g_variant_builder_add(type_builder, "y", eapol_ip[IP_START][i]);
+       g_variant_builder_add(builder, "{sv}", "IpAddrStart",
+                       g_variant_new("ay", type_builder));
+       g_variant_builder_unref(type_builder);
+
+       type_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
+       for (i = 0; i < OEM_IPADDR_LEN; i++)
+               g_variant_builder_add(type_builder, "y", eapol_ip[IP_END][i]);
+       g_variant_builder_add(builder, "{sv}", "IpAddrEnd",
+                       g_variant_new("ay", type_builder));
+       g_variant_builder_unref(type_builder);
+
+       value = g_variant_new("a{sv}", builder);
+       g_variant_builder_unref(builder);
+
+       param = g_variant_new("(ssv)", SUPPLICANT_P2PDEVICE, "P2PDeviceConfig", value);
+
+       params.params = param;
+
+       DEBUG_G_VARIANT("Params : ", param);
+       res = dbus_method_call(&params, DBUS_PROPERTIES_INTERFACE, NULL, NULL);
+       if (res < 0) {
+               WDP_LOGE("Failed to send command to wpa_supplicant");
+       } else {
+               WDP_LOGI("Succeeded to set eapol IP");
+       }
+       __WDP_LOG_FUNC_EXIT__;
+       return res;
+}
 
 int ws_add_vsie(wfd_oem_vsie_frames_e frame_id, const char* vsie)
 {
@@ -7623,3 +7784,249 @@ int ws_remove_vsie(wfd_oem_vsie_frames_e frame_id, const char *vsie)
        __WDP_LOG_FUNC_EXIT__;
        return 0;
 }
+
+int ws_set_supported_wps_mode(int wps_mode)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       char config_value[DBUS_OBJECT_PATH_MAX+1] = {0,};
+       int length = 0;
+       int new_wps_mode = wps_mode;
+       int res = 0;
+
+       if (!config) {
+               WDP_LOGE("no configurable data found");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       if (new_wps_mode == 0) {
+               WDP_LOGE("Reset to default value");
+               new_wps_mode = WFD_OEM_WPS_MODE_PBC|WFD_OEM_WPS_MODE_DISPLAY|WFD_OEM_WPS_MODE_KEYPAD;
+       }
+
+       if (new_wps_mode & WFD_OEM_WPS_MODE_KEYPAD) {
+               g_strlcat(config_value, "keypad ", sizeof(config_value));
+               length += 7;
+       }
+       if (new_wps_mode & WFD_OEM_WPS_MODE_PBC) {
+               g_strlcat(config_value, "virtual_push_button ", sizeof(config_value));
+               length += 20;
+       }
+       if (new_wps_mode & WFD_OEM_WPS_MODE_DISPLAY) {
+               g_strlcat(config_value, "physical_display ", sizeof(config_value));
+               length += 17;
+       }
+       config_value[length-1] = 0;
+       g_strlcpy(config->config_methods, config_value, OEM_CONFIG_METHOD_LEN);
+       WDP_LOGD("config_value = %s, length = %d", config_value, length-1);
+       res = __ws_set_config_methods();
+       if (res < 0) {
+               WDP_LOGE("Failed to set config method");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       wps_config_method = new_wps_mode;
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+static int _ws_remove_persistent_group_by_object_path(const char *object_path)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       GDBusConnection *g_dbus = NULL;
+       dbus_method_param_s params;
+       int res = 0;
+
+       if (!g_pd) {
+               WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       g_dbus = g_pd->g_dbus;
+       if (!g_dbus) {
+               WDP_LOGE("DBus connection is NULL");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       memset(&params, 0x0, sizeof(dbus_method_param_s));
+       dbus_set_method_param(&params, "RemovePersistentGroup",
+                       g_pd->iface_path, g_dbus);
+       params.params = g_variant_new("(o)", object_path);
+
+       res = dbus_method_call(&params, SUPPLICANT_P2PDEVICE, NULL, NULL);
+       if (res < 0) {
+               WDP_LOGE("Failed to send command to wpa_supplicant");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       ws_save_config();
+       WDP_LOGD("Succeeded to remove persistent group");;
+       __WDP_LOG_FUNC_EXIT__;
+       return 0;
+}
+
+int ws_remove_persistent_device(unsigned char *mac_addr)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       GDBusConnection *g_dbus = NULL;
+       ws_network_info_s networks[WS_MAX_PERSISTENT_COUNT];
+       int i = 0;
+       int cnt = 0;
+       int need_delete = 0;
+       int res = 0;
+
+       if (!g_pd) {
+               WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       g_dbus = g_pd->g_dbus;
+       if (!g_dbus) {
+               WDP_LOGE("DBus connection is NULL");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       memset(&networks, 0x0, WS_MAX_PERSISTENT_COUNT * sizeof(ws_network_info_s));
+       dbus_property_get_all(g_pd->iface_path, g_dbus, SUPPLICANT_P2PDEVICE,
+                       __ws_extract_p2pdevice_details, networks);
+
+       cnt = networks[0].total;
+
+       WDP_LOGD("Persistent Group Count=%d", cnt);
+       if (cnt > WS_MAX_PERSISTENT_COUNT) {
+               WDP_LOGE("Persistent group count exceeded or parsing error");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       for (i = 0 ; i < cnt ; i++) {
+               int j = 0;
+               need_delete = 0;
+
+               WDP_LOGD("----persistent group [%d]----", i);
+               WDP_LOGD("network_id [%d]", networks[i].network_id);
+               WDP_LOGD("ssid [%s]", networks[i].ssid);
+               WDP_LOGD("bssid ["MACSTR"]", MAC2STR(networks[i].bssid));
+               WDP_LOGD("p2p_client_num [%d]", networks[i].p2p_client_num);
+               for (j = 0; j < networks[i].p2p_client_num; j++) {
+                       WDP_LOGD("p2p_client_list ["MACSTR"]", MAC2STR(networks[i].p2p_client_list[j]));
+               }
+
+               WDP_LOGD("mac_addr ["MACSTR"]", MAC2STR(mac_addr));
+
+               if (memcmp(mac_addr, networks[i].bssid, WS_MACADDR_LEN) == 0) {
+                       WDP_LOGD("Persistent group owner found [%d: "MACSTR"]", networks[i].network_id, MAC2STR(mac_addr));
+                       need_delete = 1;
+               }
+
+               if (need_delete == 0) {
+                       for (j = 0; j < networks[i].p2p_client_num; j++) {
+                               if (!memcmp(mac_addr, networks[i].p2p_client_list[j], WS_MACADDR_LEN)) {
+                                       WDP_LOGD("Persistent group client found [%d: "MACSTR"]", networks[i].network_id, MAC2STR(mac_addr));
+                                       need_delete = 1;
+                               }
+                       }
+               }
+
+               if (need_delete) {
+                       res = _ws_remove_persistent_group_by_object_path(networks[i].persistent_path);
+                       WDP_LOGI("persistent group deleted [%s]", networks[i].persistent_path);
+                       if (res < 0) {
+                               WDP_LOGE("Failed to _ws_remove_persistent_group_by_object_path");
+                       } else {
+                               WDP_LOGD("Succeeded to _ws_remove_persistent_group_by_object_path");
+                       }
+               }
+       }
+
+       __WDP_LOG_FUNC_EXIT__;
+       return res;
+}
+
+int ws_remove_all_persistent_device(void)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       GDBusConnection *g_dbus = NULL;
+       dbus_method_param_s params;
+       int res = 0;
+
+       g_dbus = g_pd->g_dbus;
+       if (!g_dbus) {
+               WDP_LOGE("DBus connection is NULL");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+       memset(&params, 0x0, sizeof(dbus_method_param_s));
+
+       dbus_set_method_param(&params, "RemoveAllPersistentGroups", g_pd->iface_path, g_dbus);
+       params.params = NULL;
+
+       res = dbus_method_call(&params, SUPPLICANT_P2PDEVICE, NULL, NULL);
+       if (res < 0) {
+               WDP_LOGE("Failed to RemoveAllPersistentGroups");
+       } else {
+               WDP_LOGD("Succeeded to RemoveAllPersistentGroups");
+       }
+
+       ws_save_config();
+       WDP_LOGD("Succeeded to remove all network");
+       __WDP_LOG_FUNC_EXIT__;
+       return res;
+}
+
+static void __ws_get_supported_channels_reply(GVariant *reply, void *user_data)
+{
+       __WDP_LOG_FUNC_ENTER__;
+
+       GVariantIter *iter = NULL;
+       wfd_oem_supported_channels_s *data = (wfd_oem_supported_channels_s *)user_data;
+
+       if (reply) {
+               int channel = 0;
+
+               g_variant_get(reply, "(ai)", &iter);
+
+               while (g_variant_iter_loop(iter, "i", &channel))
+                       data->channels[data->count++] = channel;
+
+               g_variant_iter_free (iter);
+
+       } else {
+               WDP_LOGE("Reply is NULL");
+       }
+       __WDP_LOG_FUNC_EXIT__;
+}
+
+int ws_get_supported_channels(wfd_oem_supported_channels_s *data)
+{
+       __WDP_LOG_FUNC_ENTER__;
+       int res = 0;
+       dbus_method_param_s params;
+
+       if (!g_pd) {
+               WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+               __WDP_LOG_FUNC_EXIT__;
+               return -1;
+       }
+
+       memset(&params, 0x0, sizeof(dbus_method_param_s));
+       memset(data, 0x0, sizeof(wfd_oem_supported_channels_s));
+
+       dbus_set_method_param(&params, "GetSupportedChannels", g_pd->iface_path, g_pd->g_dbus);
+       params.params = NULL;
+
+       res = dbus_method_call(&params, SUPPLICANT_P2PDEVICE,
+                       __ws_get_supported_channels_reply, data);
+       if (res < 0) {
+               WDP_LOGE("Failed to GetSupportedChannels");
+       } else {
+               WDP_LOGD("Succeeded to GetSupportedChannels");
+       }
+
+       __WDP_LOG_FUNC_EXIT__;
+       return res;
+}