Set CONNECTED state back when Device is GC and discovery is stopped
[platform/core/connectivity/wifi-direct-manager.git] / src / wifi-direct-event.c
old mode 100644 (file)
new mode 100755 (executable)
index 82403bd..bbd9645
 #include <stdio.h>
 #include <stdlib.h>
 #include <poll.h>
-#include <time.h>
 #include <unistd.h>
+#include <time.h>
 #include <errno.h>
+#include <string.h>
 
 #include <glib.h>
 
-#include <wifi-direct-internal.h>
+#include <wifi-direct.h>
 
+#include "wifi-direct-ipc.h"
 #include "wifi-direct-manager.h"
 #include "wifi-direct-oem.h"
 #include "wifi-direct-peer.h"
 #include "wifi-direct-group.h"
 #include "wifi-direct-session.h"
 #include "wifi-direct-event.h"
-#include "wifi-direct-client.h"
 #include "wifi-direct-state.h"
 #include "wifi-direct-util.h"
+#include "wifi-direct-error.h"
+#include "wifi-direct-log.h"
+#include "wifi-direct-dbus.h"
+#include "wifi-direct-asp.h"
 
-
-static int _wfd_event_check_socket(int sock)
+static void _wfd_event_reset_state(wfd_manager_s *manager)
 {
-       struct pollfd p_fd;
-       int res = 0;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
 
-       p_fd.fd = sock;
-       p_fd.events = POLLIN | POLLOUT | POLLERR | POLLHUP | POLLNVAL;
-       res = poll((struct pollfd *) &p_fd, 1, 1);
-
-       if (res < 0) {
-               WDS_LOGE("Polling error from socket[%d]. [%s]", sock, strerror(errno));
-               return -1;
-       } else if (res == 0) {
-               WDS_LOGD( "poll timeout. socket is busy\n");
-               return 1;
+       if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
+               wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
+               wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
+       } else if (manager->local->dev_role == WFD_DEV_ROLE_GC) {
+               wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
+               wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
        } else {
-
-               if (p_fd.revents & POLLERR) {
-                       WDS_LOGE("Error! POLLERR from socket[%d]", sock);
-                       return -1;
-               } else if (p_fd.revents & POLLHUP) {
-                       WDS_LOGE("Error! POLLHUP from socket[%d]", sock);
-                       return -1;
-               } else if (p_fd.revents & POLLNVAL) {
-                       WDS_LOGE("Error! POLLNVAL from socket[%d]", sock);
-                       return -1;
-               } else if (p_fd.revents & POLLIN) {
-                       WDS_LOGD("POLLIN from socket [%d]", sock);
-                       return 0;
-               } else if (p_fd.revents & POLLOUT) {
-                       WDS_LOGD("POLLOUT from socket [%d]", sock);
-                       return 0;
-               }
-       }
-
-       WDS_LOGD("Unknown poll event [%d]", p_fd.revents);
-       return -1;
-}
-
-static int _wfd_event_send_to_client(int sock, char *data, int data_len)
-{
-       __WDS_LOG_FUNC_ENTER__;
-       int wbytes = 0;
-       int left_len = data_len;
-       char *ptr = data;
-       int res = 0;
-
-       if (sock < SOCK_FD_MIN || !data || data_len < 0) {
-               WDS_LOGE("Invalid parameter");
-               __WDS_LOG_FUNC_EXIT__;
-               return -1;
-       }
-
-       res = _wfd_event_check_socket(sock);
-       if (res < 0) {
-               WDS_LOGE("Socket error");
-               return -1;
-       } else if (res > 0) {
-               WDS_LOGE("Socket is busy");
-               return -2;
-       }
-
-       errno = 0;
-       while (left_len) {
-               wbytes = write(sock, ptr, left_len);
-               if (wbytes <= 0) {
-                       WDS_LOGE("Failed to write data into socket[%d]. [%s]", sock, strerror(errno));
-                       break;
-               }else if (wbytes < left_len) {
-                       WDS_LOGD("%d bytes left. Continue sending...", left_len - wbytes);
-                       left_len -= wbytes;
-                       ptr += wbytes;
-               } else if (wbytes == left_len) {
-                       WDS_LOGD("Succeeded to write data[%d bytes] into socket [%d]", wbytes, sock);
-                       left_len = 0;
-               } else {
-                       WDS_LOGE("Unknown error occurred. [%s]", strerror(errno));
-                       break;
-               }
+               wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+               wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
        }
-
-       __WDS_LOG_FUNC_EXIT__;
-       if (left_len)
-               return -1;
-       else
-               return 0;
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
 }
 
 static int _wfd_event_update_peer(wfd_manager_s *manager, wfd_oem_dev_data_s *data)
 {
-       __WDS_LOG_FUNC_ENTER__;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
        wfd_device_s *peer = NULL;
 
        if (!manager || !data) {
                WDS_LOGE("Invalid parameter");
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                return -1;
        }
 
@@ -150,424 +85,1733 @@ static int _wfd_event_update_peer(wfd_manager_s *manager, wfd_oem_dev_data_s *da
                peer = wfd_add_peer(manager, data->p2p_dev_addr, data->name);
                if (!peer) {
                        WDS_LOGE("Failed to add peer");
+                       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
                        return -1;
                }
        } else {
                if (strcmp(peer->dev_name, data->name)) {
-                       strncpy(peer->dev_name, data->name, DEV_NAME_LEN);
-                       peer->dev_name[DEV_NAME_LEN] = '\0';
-                       WDS_LOGD("Device name is changed [" MACSTR ": %s]", MAC2STR(peer->dev_addr), peer->dev_name);
+                       g_strlcpy(peer->dev_name, data->name, DEV_NAME_LEN + 1);
+                       WDS_LOGD("Device name is changed [" MACSECSTR ": %s]",
+                                       MAC2SECSTR(peer->dev_addr), peer->dev_name);
                }
        }
-       memcpy(peer->intf_addr, data->p2p_intf_addr, MACADDR_LEN);
        peer->pri_dev_type = data->pri_dev_type;
        peer->sec_dev_type = data->sec_dev_type;
        peer->config_methods = data->config_methods;
        peer->dev_flags = data->dev_flags;
        peer->group_flags = data->group_flags;
        peer->dev_role = data->dev_role;
+       peer->rssi =  data->rssi;
+       WDS_LOGD("Peer RSSI value is %d", peer->rssi);
+
+       if (manager->is_wifi_display_supported)
+               memcpy(&(peer->display), &(data->display), sizeof(wfd_display_s));
+
+       if (data->vsie) {
+               if (peer->vsie)
+                       g_free(peer->vsie);
+               peer->vsie = g_strdup(data->vsie);
+       }
+       WDS_LOGD("Peer name: [%s], vsie: [%s]", peer->dev_name, peer->vsie);
 
+#if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
+       wfd_util_get_current_time(&peer->time);
+#else
        struct timeval tval;
        gettimeofday(&tval, NULL);
        peer->time = tval.tv_sec;
-
+#endif
        WDS_LOGI("Update time [%s - %ld]", peer->dev_name, peer->time);
 
-       __WDS_LOG_FUNC_EXIT__;
+       //We don't free data memory or memory in it.
+       //They're handled by plugin
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
        return 0;
 }
+//LCOV_EXCL_START
+gboolean _wfd_connection_retry(gpointer *data)
+{
+       wfd_session_s *session = (wfd_session_s*) data;
+       if (!session) {
+               WDS_LOGE("Session is NULL");
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return G_SOURCE_REMOVE;
+       }
+
+       switch (session->state) {
+       case SESSION_STATE_STARTED:
+               WDS_LOGD("PD again");
+               wfd_session_start(session);
+       break;
+       case SESSION_STATE_GO_NEG:
+               WDS_LOGD("Negotiation again");
+               wfd_session_connect(session);
+       break;
+       case SESSION_STATE_WPS:
+               WDS_LOGD("WPS again");
+               wfd_session_wps(session);
+       break;
+       default:
+               WDS_LOGE("Invalid session state [%d]", session->state);
+       break;
+       }
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return G_SOURCE_REMOVE;
+}
+
+void wfd_event_deactivated(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_manager_s *manager = wfd_get_manager();
+
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "Deactivation",
+                                    g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE));
+
+       wfd_destroy_session(manager);
+       wfd_destroy_group(manager);
+       wfd_peer_clear_all(manager);
+       wfd_local_reset_data(manager);
 
-int wfd_process_event(void *user_data, void *data)
+       wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATED);
+       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATED);
+       manager->req_wps_mode = WFD_WPS_MODE_PBC;
+
+       if (manager->is_connection_agent)
+               wfd_util_stop_wifi_direct_popup();
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+//LCOV_EXCL_STOP
+void wfd_event_peer_found(wfd_oem_event_s *event)
 {
-       __WDS_LOG_FUNC_ENTER__;
-       wfd_manager_s *manager = (wfd_manager_s*) user_data;
-       wfd_oem_event_s *event = (wfd_oem_event_s*) data;
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_oem_dev_data_s *edata = NULL;
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
        int res = 0;
 
-       if (!manager || !event) {
-               WDS_LOGE("Invalid parameter");
-               return -1;
+       edata = (wfd_oem_dev_data_s*) event->edata;
+       if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
+               WDS_LOGE("Invalid event data");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       res = _wfd_event_update_peer(manager, edata);
+       if (res < 0) {
+               WDS_LOGE("Failed to update peer data");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       if (manager->state > WIFI_DIRECT_STATE_ACTIVATING &&
+                       manager->state != WIFI_DIRECT_STATE_CONNECTING &&
+                       manager->state != WIFI_DIRECT_STATE_DISCONNECTING) {
+               snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(edata->p2p_dev_addr));
+               wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                            "PeerFound",
+                                            g_variant_new("(s)", peer_mac_address));
        }
 
-       WDS_LOGD("Event[%d] from " MACSTR, event->event_id, MAC2STR(event->dev_addr));
+       if (manager->is_asp_supported) {
+               GList *list;
+               GVariantBuilder *builder = NULL;
+               GVariant *params = NULL;
+               wfd_oem_advertise_service_s *service;
+
+               for (list = (GList *)event->asp_services; list != NULL; list = list->next) {
+                       service = (wfd_oem_advertise_service_s *)list->data;
 
-       switch (event->event_id) {
-       case WFD_OEM_EVENT_DEACTIVATED:
-               manager->req_wps_mode = WFD_WPS_MODE_PBC;
-               break;
-       case WFD_OEM_EVENT_PEER_FOUND:
-       {
-               wfd_oem_dev_data_s *edata = (wfd_oem_dev_data_s*) event->edata;
-               res = _wfd_event_update_peer(manager, edata);
-               if (res < 0) {
-                       WDS_LOGE("Failed to update peer data");
-                       break;
+                       builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+                       g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("t", service->search_id));
+                       g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", peer_mac_address));
+                       g_variant_builder_add(builder, "{sv}", "device_name", g_variant_new("s", edata->name));
+                       g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
+                       g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
+                       if (service->service_type)
+                               g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type));
+                       params = g_variant_new("(a{sv})", builder);
+                       g_variant_builder_unref(builder);
+
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
+                                                        "SearchResult",
+                                                        params);
                }
 
-               if (manager->state > WIFI_DIRECT_STATE_ACTIVATING &&
-                               manager->state != WIFI_DIRECT_STATE_CONNECTING &&
-                               manager->state != WIFI_DIRECT_STATE_DISCONNECTING) {
-                       wifi_direct_client_noti_s noti;
-                       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-                       noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS;
-                       noti.error = WIFI_DIRECT_ERROR_NONE;
-                       wfd_client_send_event(manager, &noti);
+               for (list = (GList *)event->asp2_services; list != NULL; list = list->next) {
+                       service = (wfd_oem_advertise_service_s *)list->data;
+
+                       builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+                       g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("t", service->search_id));
+                       g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", peer_mac_address));
+                       g_variant_builder_add(builder, "{sv}", "device_name", g_variant_new("s", edata->name));
+                       g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
+                       g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
+                       if (service->service_type)
+                               g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type));
+                       if (service->instance_name)
+                               g_variant_builder_add(builder, "{sv}", "instance_name", g_variant_new("s", service->instance_name));
+                       params = g_variant_new("(a{sv})", builder);
+                       g_variant_builder_unref(builder);
+
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
+                                                        "SearchResult",
+                                                        params);
                }
        }
-       break;
-       case WFD_OEM_EVENT_PROV_DISC_REQ:
-       case WFD_OEM_EVENT_PROV_DISC_RESP:
-       case WFD_OEM_EVENT_PROV_DISC_DISPLAY:
-       case WFD_OEM_EVENT_PROV_DISC_KEYPAD:
-       {
-               wfd_device_s *peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
-               if (!peer) {
-                       WDS_LOGD("Porv_disc from unknown peer. Add new peer");
-                       peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
-                       if (!peer) {
-                               WDS_LOGE("Failed to add peer for invitation");
-                               return -1;
-                       }
-                       peer->state = WFD_PEER_STATE_CONNECTING;
-                       wfd_update_peer(manager, peer);
-               }
-               wfd_update_peer_time(manager, event->dev_addr);
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+void wfd_event_peer_disappeared(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_session_s *session = NULL;
+       wfd_device_s *peer = NULL;
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
 
-               res = wfd_session_process_event(manager, event);
-               if (res < 0) {
-                       WDS_LOGE("Failed to process event of session");
-                       break;
+       session = manager->session;
+       if (session != NULL && session->peer != NULL) {
+               peer = session->peer;
+               WDS_LOGD("session peer [" MACSTR "] lost peer ["  MACSTR "]", MAC2STR(peer->dev_addr),
+                                               MAC2STR(event->dev_addr));
+               if (memcmp(peer->dev_addr, event->dev_addr, MACADDR_LEN) == 0) {
+                       WDS_LOGD("peer already in connection");//LCOV_EXCL_LINE
+                       return;
                }
        }
-       break;
-       case WFD_OEM_EVENT_PEER_DISAPPEARED:
-       {
-               wfd_remove_peer(manager, event->dev_addr);
-               wifi_direct_client_noti_s noti;
-               memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-               noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS;
-               noti.error = WIFI_DIRECT_ERROR_NONE;
-               wfd_client_send_event(manager, &noti);
-       }
-       break;
-       case WFD_OEM_EVENT_DISCOVERY_FINISHED:
-       {
-               if (manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
-                               manager->state != WIFI_DIRECT_STATE_ACTIVATED) {
-                       WDS_LOGE("Notify finding stoped when discovering or activated. [%d]", manager->state);
-                       break;
-               }
 
-               if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
-                       wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
-                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
-               } else {
-                       wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
-                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
-               }
-               manager->scan_mode = WFD_SCAN_MODE_NONE;
+       wfd_remove_peer(manager, event->dev_addr);
 
-               wifi_direct_client_noti_s noti;
-               memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-               noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;
-               noti.error = WIFI_DIRECT_ERROR_NONE;
-               wfd_client_send_event(manager, &noti);
+       snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "PeerLost",
+                                    g_variant_new("(s)", peer_mac_address));
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+void wfd_event_discovery_finished(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_manager_s *manager = wfd_get_manager();
+
+       if (manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
+                       manager->state != WIFI_DIRECT_STATE_ACTIVATED) {
+               WDS_LOGE("Notify finding stopped when discovering or activated. [%d]", manager->state);
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
        }
-       break;
-       case WFD_OEM_EVENT_INVITATION_REQ:
-       {
-               wfd_device_s *peer = NULL;
-               wfd_session_s *session = NULL;
-               wfd_oem_invite_data_s *edata = (wfd_oem_invite_data_s*) event->edata;
 
-               peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
-               if (!peer) {
-                       WDS_LOGD("Invitation from unknown peer. Add new peer");
-                       peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
-                       if (!peer) {
-                               WDS_LOGE("Failed to add peer for invitation");
-                               return -1;
-                       }
-               }
-               peer->dev_role = WFD_DEV_ROLE_GO;
-               memcpy(peer->intf_addr, edata->bssid, MACADDR_LEN);
-               wfd_update_peer_time(manager, event->dev_addr);
+       if (manager->scan_mode == WFD_SCAN_MODE_PASSIVE) {
+               WDS_LOGE("During passive scan, Discover Finished event will not notified");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
 
-               session = wfd_create_session(manager, event->dev_addr,
-                                               manager->req_wps_mode, SESSION_DIRECTION_INCOMING);
-               if (!session) {
-                       WDS_LOGE("Failed to create session");
-                       return -1;
-               }
-               session->type = SESSION_TYPE_INVITE;
-               wfd_session_timer(session, 1);
+       _wfd_event_reset_state(manager);
+       manager->scan_mode = WFD_SCAN_MODE_NONE;
 
-               wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "DiscoveryFinished",
+                                    NULL);
 
-               wifi_direct_client_noti_s noti;
-               memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-               noti.event = WIFI_DIRECT_CLI_EVENT_INVITATION_REQ;
-               noti.error = WIFI_DIRECT_ERROR_NONE;
-               snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
-               wfd_client_send_event(manager, &noti);
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+void wfd_event_prov_disc_req(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_device_s *peer = NULL;
+       wfd_device_s *member = NULL;
+       int res = 0;
+       wfd_group_s *group = (wfd_group_s*) manager->group;
+
+       if (group && group->role == WFD_DEV_ROLE_GC) {
+               WDS_LOGD("Device has GC role - ignore this provision request");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
        }
-       break;
-       case WFD_OEM_EVENT_GO_NEG_REQ:
-       case WFD_OEM_EVENT_GO_NEG_DONE:
-       case WFD_OEM_EVENT_WPS_DONE:
-               wfd_session_process_event(manager, event);
-       break;
-       case WFD_OEM_EVENT_CONNECTED:
-       case WFD_OEM_EVENT_STA_CONNECTED:
-       {
-               // FIXME: Move this code to plugin
-               if (!memcmp(event->intf_addr, manager->local->intf_addr, MACADDR_LEN)) {
-                       WDS_LOGD("Ignore this event");
-                       break;
-               }
 
-               wfd_session_s *session = (wfd_session_s*) manager->session;
-               if (!session) {
-                       WDS_LOGE("Unexpected event. Session is NULL [peer: " MACSTR "]",
-                                                                               MAC2STR(event->dev_addr));
-                       return -1;
-               } 
-               // TODO: check whether here is complete location. How about Group Created event
-               session->state = SESSION_STATE_COMPLETED;
+       member = wfd_group_find_member_by_addr(group,  event->dev_addr);
+       if (member) {
+               /* PD request can be arrived from peer device
+                * when connection is timeout to close connection */
+               WDS_LOGE("Unexpected Event - Member already exist");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
 
-               wfd_group_s *group = (wfd_group_s*) manager->group;
-               if (!group) {
-                       group = wfd_create_pending_group(manager, event->intf_addr);
-                       if (!group) {
-                               WDS_LOGE("Failed to create pending group");
-                               return -1;
-                       }
-                       manager->group = group;
-               }
+       wfd_oem_dev_data_s *edata = NULL;
 
-               wfd_device_s *peer = session->peer;
-               if (!peer) {
-                       WDS_LOGE("Peer not found");
-                       // TODO: remove pending group
-                       return -1;
-               }
-               memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
-               session->state = SESSION_STATE_COMPLETED;
-               peer->state = WFD_PEER_STATE_CONNECTED;
-               group->members = g_list_prepend(group->members, peer);
-               group->member_count++;
+       edata = (wfd_oem_dev_data_s*) event->edata;
+       if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
+               WDS_LOGE("Invalid event data");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
 
-               manager->peers = g_list_remove(manager->peers, peer);
-               manager->peer_count--;
+       res = _wfd_event_update_peer(manager, edata);
+       peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
 
-               if (event->event_id == WFD_OEM_EVENT_STA_CONNECTED) {   // GO
-                       wifi_direct_client_noti_s noti;
-                       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-                       noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
-                       noti.error = WIFI_DIRECT_ERROR_NONE;
-                       snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
-                       wfd_client_send_event(manager, &noti);
+       if (WFD_DEV_ROLE_GO != manager->local->dev_role) {
+               WDS_LOGI("Own device is not GO, updated peer data only.");//LCOV_EXCL_LINE
 
-                       wfd_util_dhcps_wait_ip_leased(peer);
-                       wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
-                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
-                       wfd_destroy_session(manager);
+               manager->local->wps_mode = event->wps_mode;
+               if (event->wps_mode == WFD_WPS_MODE_PBC ||
+                               event->wps_mode == WFD_WPS_MODE_KEYPAD) {
+                       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+                       return;
                }
        }
-       break;
-       case WFD_OEM_EVENT_DISCONNECTED:
-       case WFD_OEM_EVENT_STA_DISCONNECTED:
-       {
-               wfd_group_s *group = NULL;
-               wfd_device_s *peer = NULL;
-               group = (wfd_group_s*) manager->group;
-               if (!group) {
-                       WDS_LOGE("Group not found");
-                       break;
-               }
 
-               peer = wfd_group_find_peer_by_intf_addr(group, event->intf_addr);
-               if (!peer) {
-                       WDS_LOGE("Failed to find peer by interface address");
-                       break;
-               }
-
-               group->members = g_list_remove(group->members, peer);
-               group->member_count--;
-
-               wifi_direct_client_noti_s noti;
-               memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-               /* If state is not DISCONNECTING, connection is finished by peer */
-               if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
-                       if (group->member_count)
-                               noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;
-                       else
-                               noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND;
-                       noti.error = WIFI_DIRECT_ERROR_NONE;
-                       snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
-                       wfd_client_send_event(manager, &noti);
-               } else if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
-                       noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
-                       noti.error = WIFI_DIRECT_ERROR_NONE;
-                       snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
-                       wfd_client_send_event(manager, &noti);
-               }
-
-               if (group->role == WFD_DEV_ROLE_GO) {
-                       wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
-                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
-               } else {
-                       wfd_destroy_group(manager, GROUP_IFNAME);
-                       wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
-                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
-               }
+       if (peer)
+               peer->state = WFD_PEER_STATE_CONNECTING;
+
+       res = wfd_session_process_event(manager, event);
+       if (res < 0)
+               WDS_LOGE("Failed to process event of session");//LCOV_EXCL_LINE
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
 
-               if (!group->member_count && group->role == WFD_DEV_ROLE_GO)
-                       wfd_oem_destroy_group(manager->oem_ops, group->ifname);
+void wfd_event_prov_disc_resp(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_device_s *peer = NULL;
+       int res = 0;
 
-               if (peer)
-                       free(peer);
+       wfd_oem_dev_data_s *edata = NULL;
+
+       edata = (wfd_oem_dev_data_s*) event->edata;
+       if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
+               WDS_LOGE("Invalid event data");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
        }
-       break;
-       case WFD_OEM_EVENT_GROUP_CREATED:
-       {
-               wfd_oem_group_data_s *edata = NULL;
-               edata = event->edata;
 
-               wfd_group_s *group = NULL;
-               group = (wfd_group_s*) manager->group;
-               if (!group) {
-                       group = wfd_create_group(manager, event->ifname, event->dev_role, edata->go_dev_addr /* event->intf_addr */);
-                       if (!group) {
-                               WDS_LOGE("Failed to create group");
-                               break;
-                       }
-               } else {
-                       if (group->pending) {
-                               wfd_group_complete(manager, event->ifname, event->dev_role, edata->go_dev_addr);
-                       } else {
-                               // TODO: ignore it
-                               WDS_LOGE("Unexpected event. Group already exist");
-                               break;
-                       }
+       res = _wfd_event_update_peer(manager, edata);
+       peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
+       if (peer)
+               peer->state = WFD_PEER_STATE_CONNECTING;
+
+       res = wfd_session_process_event(manager, event);
+       if (res < 0)
+               WDS_LOGE("Failed to process event of session");//LCOV_EXCL_LINE
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+static bool __asp_prov_disc_deferred(wfd_session_s *session, void *event_data)
+{
+       wfd_oem_asp_prov_s *prov_params = (wfd_oem_asp_prov_s *)event_data;
+       bool is_deferred = false;
+
+       if (prov_params && !ISZEROMACADDR(session->session_mac)) {
+               /* This connection is for ASP session */
+               if (prov_params->status == WFD_OEM_SC_FAIL_INVALID_PARAMS) {
+                       WDS_LOGD("ASP prov disc deferred. wait response.");//LCOV_EXCL_LINE
+                       wfd_asp_connect_status(session->session_mac,
+                                                               session->session_id,
+                                                               ASP_CONNECT_STATUS_REQUEST_DEFERRED,
+                                                               NULL);
+                       is_deferred = true;
                }
+       }
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return is_deferred;
+}
 
-               strncpy(group->ssid, edata->ssid, DEV_NAME_LEN);
-               group->ssid[DEV_NAME_LEN-1] = '\0';
-               strncpy(group->pass,edata->pass, PASSPHRASE_LEN);
-               group->pass[PASSPHRASE_LEN] = '\0';
-               group->freq = edata->freq;
-               manager->group = group;
-               manager->local->dev_role = event->dev_role;
+void wfd_event_prov_disc_fail(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
 
-               wifi_direct_client_noti_s noti;
-               memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-               if (group->role == WFD_DEV_ROLE_GC) {
-                       if (!manager->session) {
-                               WDS_LOGE("Unexpected Event. Group should be removed(Client)");
-                               wfd_oem_destroy_group(manager->oem_ops, group->ifname);
-                               break;
-                       }
-                       wfd_peer_clear_all(manager);
-                       wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
-                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
-                       wfd_destroy_session(manager);
-                       manager->local->dev_role = WFD_DEV_ROLE_GC;
-               } else {
-                       if (group->flags & WFD_GROUP_FLAG_AUTONOMOUS) {
-                               noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP;
-                               wfd_client_send_event(manager, &noti);
-                       } else if (!manager->session) {
-                               WDS_LOGE("Unexpected Event. Group should be removed(Owner)");
-                               wfd_oem_destroy_group(manager->oem_ops, group->ifname);
-                               break;
-                       }
-                       wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
-                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
-                       manager->local->dev_role = WFD_DEV_ROLE_GO;
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_session_s *session = NULL;
+       unsigned char *peer_addr = NULL;
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
+
+       session = (wfd_session_s*) manager->session;
+       if (!session) {
+               WDS_LOGE("Unexpected event. Session not exist");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       peer_addr = wfd_session_get_peer_addr(session);
+       if (!peer_addr) {
+               WDS_LOGE("Session do not have peer");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       if (manager->is_asp_supported) {
+               if (__asp_prov_disc_deferred(session, event->edata)) {
+                       /* start listen to wait for provision discovery request from peer */
+                       wfd_oem_scan_param_s param;
+                       memset(&param, 0x0, sizeof(wfd_oem_scan_param_s));
+                       param.scan_mode = WFD_OEM_SCAN_MODE_PASSIVE;
+                       wfd_oem_start_scan(manager->oem_ops, &param);
+                       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+                       return;
                }
        }
-       break;
-       case WFD_OEM_EVENT_GROUP_DESTROYED:
-       {
+
+       snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "Connection",
+                                    g_variant_new("(iis)",
+                                                  WIFI_DIRECT_ERROR_CONNECTION_FAILED,
+                                                  WFD_EVENT_CONNECTION_RSP,
+                                                  peer_mac_address));
+       if (wfd_asp_is_asp_session(session)) {
+               WDS_LOGD("ASP prov disc failed. remove session.");//LCOV_EXCL_LINE
+               wfd_asp_connect_status(session->session_mac,
+                                                       session->session_id,
+                                                       ASP_CONNECT_STATUS_REQUEST_FAILED,
+                                                       NULL);
+       }
+
+       if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
                wfd_group_s *group = (wfd_group_s*) manager->group;
-               if (!group) {
-                       WDS_LOGE("Unexpected event. Group not found. But set state");
+               if (group && !group->member_count &&
+                   wfd_util_is_remove_group_allowed()) {
+                       wfd_destroy_group(manager);
+
                        wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
                        wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
-                       break;
-               }
-
-               if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING &&
-                               group->role == WFD_DEV_ROLE_GO) {
-                       wifi_direct_client_noti_s noti;
-                       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-                       noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
-                       noti.error = WIFI_DIRECT_ERROR_NONE;
-                       wfd_client_send_event(manager, &noti);
                } else {
-                       wifi_direct_client_noti_s noti;
-                       memset(&noti, 0x0, sizeof(wifi_direct_client_noti_s));
-                       noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP;
-                       noti.error = WIFI_DIRECT_ERROR_NONE;
-                       wfd_client_send_event(manager, &noti);
-               }
-
-               res = wfd_destroy_group(manager, event->ifname);
-               if (res < 0) {
-                       WDS_LOGE("Failed to destroy group");
-                       break;
+                       wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
+                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
                }
-
-               wfd_destroy_session(manager);
-               manager->local->dev_role = WFD_DEV_ROLE_NONE;
-               memset(manager->local->ip_addr, 0x0, IPADDR_LEN);
+       } else {
                wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
                wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
        }
-       break;
-       case WFD_OEM_EVENT_PROV_DISC_FAIL:
-       case WFD_OEM_EVENT_GO_NEG_FAIL:
-       case WFD_OEM_EVENT_WPS_FAIL:
-       case WFD_OEM_EVENT_KEY_NEG_FAIL:
-       {
-               wfd_session_s *session = (wfd_session_s*) manager->session;
-               if (!session) {
-                       WDS_LOGE("Unexpected event. Session not exist");
-                       break;
-               }
 
-               unsigned char *peer_addr = wfd_session_get_peer_addr(session);
-               if (!peer_addr) {
-                       WDS_LOGE("Session do not has peer");
-                       break;
-               }
+       wfd_destroy_session(manager);
 
-               wfd_destroy_session(manager);
-               if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
-                       wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
-                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
-               } else {
-                       wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
-                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+       wfd_oem_refresh(manager->oem_ops);
+#if 0
+       /* After connection failed, scan again */
+       wfd_oem_scan_param_s param;
+       memset(&param, 0x0, sizeof(wfd_oem_scan_param_s));
+       param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
+       param.scan_time = 2;
+       param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
+       wfd_oem_start_scan(manager->oem_ops, &param);
+       manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
+#endif
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+void wfd_event_go_neg_req(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_group_s *group = (wfd_group_s*) manager->group;
+       if (group && group->role == WFD_DEV_ROLE_GC) {
+               WDS_LOGD("Device has GC role - ignore this go neg request");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       wfd_oem_dev_data_s *edata = NULL;
+       int res = 0;
+
+       edata = (wfd_oem_dev_data_s*) event->edata;
+       if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
+               WDS_LOGE("Invalid event data");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       res = _wfd_event_update_peer(manager, edata);
+       if (res < 0) {
+               WDS_LOGE("Failed to update peer data");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       wfd_session_process_event(manager, event);
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+void wfd_event_go_neg_fail(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_session_s *session = NULL;
+       wfd_oem_conn_data_s *edata = NULL;
+       unsigned char *peer_addr = NULL;
+       char peer_mac_address[MACSTR_LEN] = {0, };
+
+       session = (wfd_session_s*) manager->session;
+       if (!session) {
+               WDS_LOGE("Unexpected event. Session not exist");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       peer_addr = wfd_session_get_peer_addr(session);
+       if (!peer_addr) {
+               WDS_LOGE("Session do not have peer");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       edata = (wfd_oem_conn_data_s*) event->edata;
+       if (!edata) {
+               WDS_LOGE("Invalid p2p connection data");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       if (edata->status < 0 && session->connecting_120) {
+               if (session->retry_gsrc) {
+                       g_source_remove(session->retry_gsrc);
+                       session->retry_gsrc = 0;
                }
+               session->retry_gsrc = g_idle_add((GSourceFunc) _wfd_connection_retry, session);
+               WDS_LOGD("Connection will be retried");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "Connection",
+                                    g_variant_new("(iis)",
+                                                  WIFI_DIRECT_ERROR_CONNECTION_FAILED,
+                                                  WFD_EVENT_CONNECTION_RSP,
+                                                  peer_mac_address));
 
-               /* After connection failed, scan again */
-               wfd_oem_scan_param_s param;
-               memset(&param, 0x0, sizeof(wfd_oem_scan_param_s));
-               param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
-               param.scan_time = 2;
-               param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
-               wfd_oem_start_scan(manager->oem_ops, &param);
-               manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
+       if (wfd_asp_is_asp_session(session)) {
+               wfd_asp_connect_status(session->session_mac,
+                               session->session_id,
+                               ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
+                               NULL);
        }
-       break;
-       default:
-               WDS_LOGE("Unknown event [event ID: %d]", event->event_id);
-       break;
+
+       wfd_destroy_session(manager);
+       wfd_destroy_group(manager);
+       manager->local->dev_role = WFD_DEV_ROLE_NONE;
+       _wfd_event_reset_state(manager);
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+void wfd_event_go_neg_done(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_session_s *session = NULL;
+       wfd_oem_conn_data_s *edata = NULL;
+       wfd_device_s *peer = NULL;
+
+       edata = (wfd_oem_conn_data_s*) event->edata;
+       if (edata == NULL) {
+               WDS_LOGE("Invalid event data");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
        }
 
-       __WDS_LOG_FUNC_EXIT__;
-       return 0;
+       session = (wfd_session_s*) manager->session;
+       if (session && session->peer) {
+               peer = session->peer;
+               memcpy(peer->intf_addr, edata->peer_intf_addr, MACADDR_LEN);
+       }
+
+       wfd_session_process_event(manager, event);
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
 }
 
+void wfd_event_wps_fail(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_session_s *session = NULL;
+       unsigned char *peer_addr = NULL;
+
+       session = (wfd_session_s*) manager->session;
+       if (!session) {
+               WDS_LOGE("Unexpected event. Session not exist");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       peer_addr = wfd_session_get_peer_addr(session);
+       if (!peer_addr) {
+               WDS_LOGE("Session do not have peer");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
+       g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "Connection",
+                                    g_variant_new("(iis)",
+                                                  WIFI_DIRECT_ERROR_CONNECTION_FAILED,
+                                                  WFD_EVENT_CONNECTION_RSP,
+                                                  peer_mac_address));
+       if (wfd_asp_is_asp_session(session)) {
+               wfd_asp_connect_status(session->session_mac,
+                                                       session->session_id,
+                                                       ASP_CONNECT_STATUS_GROUP_FORMATION_STARTED,
+                                                       NULL);
+       }
+
+       if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
+               wfd_group_s *group = (wfd_group_s*) manager->group;
+               if (group && !group->member_count &&
+                   wfd_util_is_remove_group_allowed()) {
+                       wfd_destroy_group(manager);
+
+                       wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+               } else {
+                       wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
+                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
+               }
+       } else {
+               wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+               wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+       }
+
+       wfd_destroy_session(manager);
+
+       wfd_oem_refresh(manager->oem_ops);
+#if 0
+       /* After connection failed, scan again */
+       wfd_oem_scan_param_s param;
+       memset(&param, 0x0, sizeof(wfd_oem_scan_param_s));
+       param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
+       param.scan_time = 2;
+       param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
+       wfd_oem_start_scan(manager->oem_ops, &param);
+       manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
+#endif
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+void wfd_event_wps_done(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_session_process_event(manager, event);
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+void wfd_event_key_neg_fail(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_session_s *session = NULL;
+       unsigned char *peer_addr = NULL;
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
+
+       session = (wfd_session_s*) manager->session;
+       if (!session) {
+               WDS_LOGE("Unexpected event. Session not exist");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       peer_addr = wfd_session_get_peer_addr(session);
+       if (!peer_addr) {
+               WDS_LOGE("Session do not has peer");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "Connection",
+                                    g_variant_new("(iis)",
+                                                  WIFI_DIRECT_ERROR_CONNECTION_FAILED,
+                                                  WFD_EVENT_CONNECTION_RSP,
+                                                  peer_mac_address));
+       if (wfd_asp_is_asp_session(session)) {
+               wfd_asp_connect_status(session->session_mac,
+                                                       session->session_id,
+                                                       ASP_CONNECT_STATUS_GROUP_FORMATION_STARTED,
+                                                       NULL);
+       }
+
+       if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
+               wfd_group_s *group = (wfd_group_s*) manager->group;
+               if (group && !group->member_count &&
+                   wfd_util_is_remove_group_allowed()) {
+                       wfd_destroy_group(manager);
+
+                       wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+               } else {
+                       wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
+                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
+               }
+       } else {
+               wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+               wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+       }
+
+       wfd_destroy_session(manager);
+
+       wfd_oem_refresh(manager->oem_ops);
+#if 0
+       /* After connection failed, scan again */
+       wfd_oem_scan_param_s param;
+       memset(&param, 0x0, sizeof(wfd_oem_scan_param_s));
+       param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
+       param.scan_time = 2;
+       param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
+       wfd_oem_start_scan(manager->oem_ops, &param);
+       manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
+#endif
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+void wfd_event_key_neg_done(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+void wfd_event_conn_fail(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+void wfd_event_conn_done(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+void wfd_event_group_created(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_group_s *group = (wfd_group_s*) manager->group;
+       wfd_session_s *session = (wfd_session_s*) manager->session;
+
+       if (!group) {
+               group = wfd_create_pending_group(manager, event->intf_addr);
+               if (!group) {
+                       WDS_LOGE("Failed to create pending group");//LCOV_EXCL_LINE
+                       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+                       return;
+               }
+
+               manager->group = group;
+       }
+
+       wfd_group_complete(manager, event);
+
+       if (group->role == WFD_DEV_ROLE_GC && session) {
+               wfd_device_s *peer = session->peer;
+               if (peer == NULL) {
+                       WDS_LOGE("Unexpected event. Peer doesn't exist");//LCOV_EXCL_LINE
+                       return;
+               }
+
+               wfd_update_peer(manager, peer);
+
+               if (peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
+                       char peer_mac_address[MACSTR_LEN+1] = {0, };
+
+                       wfd_util_ip_over_eap_assign(peer, event->ifname);
+
+                       g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "Connection",
+                                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                                           WFD_EVENT_CONNECTION_RSP,
+                                                                           peer_mac_address));
+                       if (wfd_asp_is_asp_session(session)) {
+                               wfd_asp_connect_status(session->session_mac,
+                                                                       session->session_id,
+                                                                       ASP_CONNECT_STATUS_GROUP_FORMATION_COMPLETED,
+                                                                       NULL);
+                               wfd_asp_session_peer_ip(session->session_mac, session->session_id,
+                                               session->service_mac, peer->ip_addr);
+                       }
+                       wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
+                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
+
+                       wfd_destroy_session(manager);
+               }
+               wfd_peer_clear_all(manager);
+       } else {
+               if (group->flags & WFD_GROUP_FLAG_AUTONOMOUS) {
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
+                                                    "Created", NULL);
+                       wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
+                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
+               }
+       }
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+void wfd_event_group_destroyed(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_manager_s *manager = wfd_get_manager();
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
+       unsigned char *peer_addr = wfd_session_get_peer_addr(manager->session);
+
+       if (peer_addr != NULL)
+               g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+       else
+               g_snprintf(peer_mac_address, MACSTR_LEN, "%s", "");
+
+       if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
+               wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                            "Disconnection",
+                                            g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                                   WFD_EVENT_DISCONNECTION_RSP,
+                                                                   peer_mac_address));
+
+       } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING && manager->session) {
+               wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                            "Connection",
+                                            g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
+                                                                   WFD_EVENT_CONNECTION_RSP,
+                                                                   peer_mac_address));
+               wfd_session_s *session = manager->session;
+               if (wfd_asp_is_asp_session(session)) {
+                       wfd_asp_connect_status(session->session_mac,
+                                       session->session_id,
+                                       ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
+                                       NULL);
+               }
+       } else if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
+               if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "Disconnection",
+                                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                                           WFD_EVENT_DISCONNECTION_RSP,
+                                                                           peer_mac_address));
+               } else {
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
+                                                    "Destroyed", NULL);
+               }
+       } else {
+               WDS_LOGD("Unexpected event(GROUP_DESTROYED). Ignore it");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+       wfd_destroy_session(manager);
+       wfd_destroy_group(manager);
+       manager->local->dev_role = WFD_DEV_ROLE_NONE;
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+void wfd_event_invitation_req(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_device_s *peer = NULL;
+       wfd_session_s *session = NULL;
+       wfd_oem_invite_data_s *edata = NULL;
+       int res = 0;
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
+
+       peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
+       if (!peer) {
+               WDS_LOGD("Invitation from unknown peer. Add new peer");//LCOV_EXCL_LINE
+               peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
+               if (!peer) {
+                       WDS_LOGE("Failed to add peer for invitation");//LCOV_EXCL_LINE
+                       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+                       return;
+               }
+       }
+       peer->dev_role = WFD_DEV_ROLE_GO;
+
+       edata = (wfd_oem_invite_data_s*) event->edata;
+       memcpy(peer->intf_addr, edata->bssid, MACADDR_LEN);
+       wfd_update_peer_time(manager, event->dev_addr);
+
+       if (!ISZEROMACADDR(edata->go_dev_addr))
+               session = wfd_create_session(manager, edata->go_dev_addr,
+                                            manager->req_wps_mode,
+                                            SESSION_DIRECTION_INCOMING);
+       else
+               session = wfd_create_session(manager, event->dev_addr,
+                                            manager->req_wps_mode,
+                                            SESSION_DIRECTION_INCOMING);
+       if (!session) {
+               WDS_LOGE("Failed to create session");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+       session->type = SESSION_TYPE_INVITE;
+       wfd_session_timer(session, 1);
+
+       wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
+       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
+
+       res = wfd_session_start(session);
+       if (res < 0) {
+               WDS_LOGE("Failed to start session");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       if (!ISZEROMACADDR(edata->go_dev_addr))
+               g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR,
+                          MAC2STR(edata->go_dev_addr));
+       else
+               g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR,
+                          MAC2STR(event->dev_addr));
+
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "Connection",
+                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                           WFD_EVENT_CONNECTION_REQ,
+                                                           peer_mac_address));
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+void wfd_event_invitation_res(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+void wfd_event_sta_connected(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_session_s *session = (wfd_session_s*) manager->session;
+       wfd_group_s *group = (wfd_group_s*) manager->group;
+       wfd_device_s *peer = NULL;
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
+
+       if(session) {
+               WDS_LOGD("event->dev addr : [" MACSTR "]", MAC2STR(event->dev_addr));
+               if (session->peer && memcmp(event->dev_addr, session->peer->dev_addr, MACADDR_LEN)) {
+                       WDS_LOGE("Session Device and connected device do not match.Destroy previous session.");
+                       wfd_destroy_session(manager);
+               }
+       }
+
+       if (ISZEROMACADDR(event->dev_addr)) {
+               WDS_LOGD("Legacy Peer Connected [Peer: " MACSTR "]", MAC2STR(event->intf_addr));
+
+               peer = wfd_peer_find_by_addr(manager, event->intf_addr);
+               if (!peer) {
+                       WDS_LOGI("Add legacy peer");//LCOV_EXCL_LINE
+                       peer = wfd_add_peer(manager, event->intf_addr, "LEGACY-PEER");
+                       if (!peer) {
+                               WDS_LOGE("Failed to add Legacy peer.");//LCOV_EXCL_LINE
+                               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+                               return;
+                       }
+               }
+
+               if (wfd_group_add_member(group, peer->dev_addr) == -1) {
+                       WDS_LOGE("Failed to add Legacy peer.");//LCOV_EXCL_LINE
+                       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+                       return;
+               }
+
+               memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
+               peer->state = WFD_PEER_STATE_CONNECTED;
+               peer->is_p2p = FALSE;
+
+               g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
+               wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                            "Connection",
+                                            g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                                   WFD_EVENT_CONNECTION_RSP,
+                                                                   peer_mac_address));
+
+               wfd_util_dhcps_wait_ip_leased(peer);
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       session = (wfd_session_s*) manager->session;
+       if (!session && group) {
+               if (group->flags & WFD_GROUP_FLAG_PERSISTENT) {
+                       session = wfd_create_session(manager, event->dev_addr,
+                                                    event->wps_mode,
+                                                    SESSION_DIRECTION_INCOMING);
+                       if (!session) {
+                               WDS_LOGE("Failed to create session with peer [" MACSTR "]",
+                                        MAC2STR(event->dev_addr));
+                               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+                               return;
+                       }
+               } else {
+                       WDS_LOGD("Unexpected event. Session is NULL [peer: " MACSECSTR "]",
+                                MAC2SECSTR(event->dev_addr));
+                       if (group) {
+                               wfd_oem_destroy_group(manager->oem_ops, group->ifname);
+                               wfd_destroy_group(manager);
+                       }
+
+                       wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+                       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+                       return;
+               }
+       }
+
+       peer = wfd_session_get_peer(session);
+       if (!peer) {
+               WDS_LOGE("Peer not found");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+       WDS_LOGD("peer->dev addr : [" MACSTR "]", MAC2STR(session->peer->dev_addr));
+
+       group = (wfd_group_s*) manager->group;
+       if (!group) {
+               group = wfd_create_pending_group(manager, event->intf_addr);
+               if (!group) {
+                       WDS_LOGE("Failed to create pending group");//LCOV_EXCL_LINE
+                       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+                       return;
+               }
+               manager->group = group;
+       }
+       wfd_group_add_member(group, peer->dev_addr);
+
+       session->state = SESSION_STATE_COMPLETED;
+       peer->state = WFD_PEER_STATE_CONNECTED;
+
+       wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
+       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
+
+       g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "Connection",
+                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                           WFD_EVENT_CONNECTION_RSP,
+                                                           peer_mac_address));
+
+       wfd_update_peer(manager, peer);
+       if (event->ip_addr_peer[3]) {
+               peer->ip_type = WFD_IP_TYPE_OVER_EAPOL;
+               memcpy(peer->client_ip_addr, event->ip_addr_peer, IPADDR_LEN);
+               WDS_LOGE("Peer's client IP [" IPSTR "]", IP2STR((char*) &peer->client_ip_addr));
+               memcpy(peer->go_ip_addr, manager->local->ip_addr, IPADDR_LEN);
+               WDS_LOGE("Peer's GO IP [" IPSTR "]", IP2STR((char*) &peer->go_ip_addr));
+       }
+       if (peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
+               char peer_mac_address[MACSTR_LEN+1] = {0,};
+               char assigned_ip_address[IPSTR_LEN+1] = {0,};
+
+               memcpy(peer->ip_addr, peer->client_ip_addr, IPADDR_LEN);
+
+               g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
+               g_snprintf(assigned_ip_address, IPSTR_LEN, IPSTR, IP2STR(peer->ip_addr));
+               wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "PeerIPAssigned",
+                                    g_variant_new("(ss)", peer_mac_address,
+                                                          assigned_ip_address));
+               if (wfd_asp_is_asp_session(session)) {
+                       wfd_asp_connect_status(session->session_mac,
+                                                               session->session_id,
+                                                               ASP_CONNECT_STATUS_GROUP_FORMATION_COMPLETED,
+                                                               NULL);
+
+                       wfd_asp_session_peer_ip(session->session_mac, session->session_id,
+                                       session->service_mac, peer->ip_addr);
+               }
+       } else {
+               wfd_util_dhcps_wait_ip_leased(peer);
+       }
+       wfd_destroy_session(manager);
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+void wfd_event_sta_disconnected(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_group_s *group = NULL;
+       wfd_device_s *peer = NULL;
+       unsigned char peer_addr[MACADDR_LEN] = {0, };
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
+       char peer_dev_name[DEV_NAME_LEN+1] = {0, };
+       int member_cnt;
+
+       group = (wfd_group_s*) manager->group;
+       if (!group) {
+               WDS_LOGE("Group not found");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       if (ISZEROMACADDR(event->dev_addr)) {
+               WDS_LOGD("Legacy Peer Disconnected [Peer: " MACSTR "]", MAC2STR(event->intf_addr));
+               g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->intf_addr));
+               wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                            "Disconnection",
+                                            g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                                   WFD_EVENT_DISCONNECTION_IND,
+                                                                   peer_mac_address));
+
+               wfd_group_remove_member(group, event->intf_addr);
+
+               if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
+                       wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
+                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
+               } else {
+                       wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+                       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+               }
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       peer = wfd_group_find_member_by_addr(group, event->dev_addr);
+       if (!peer) {
+               WDS_LOGE("Failed to find connected peer");//LCOV_EXCL_LINE
+               peer = wfd_session_get_peer(manager->session);
+               if (!peer) {
+                       WDS_LOGE("Failed to find connecting peer");//LCOV_EXCL_LINE
+                       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+                       return;
+               }
+
+               /**
+                * If no peer connected and
+                * disconnected event is not for connecting peer
+                * then event should be ignored.
+                * This situation can arrise when own device is GO and
+                * some connected peer sent disassociation.
+                */
+               if (memcmp(peer->dev_addr, event->dev_addr, MACADDR_LEN)) {
+                       WDS_LOGE("Unexpected event, Ignore it...");//LCOV_EXCL_LINE
+                       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+                       return;
+               }
+       }
+       memcpy(peer_addr, peer->dev_addr, MACADDR_LEN);
+       g_strlcpy(peer_dev_name, peer->dev_name, DEV_NAME_LEN+1);
+
+       /**
+        * If state is not DISCONNECTING, connection is finished by peer.
+        *  Required the check also, when Device is Group Owner and state is DISCOVERING.
+        */
+       if (manager->state >= WIFI_DIRECT_STATE_CONNECTED ||
+                               (manager->state == WIFI_DIRECT_STATE_DISCOVERING &&
+                                manager->local->dev_role == WFD_DEV_ROLE_GO)) {
+               member_cnt = wfd_group_remove_member(group, peer_addr);
+               g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+               if (member_cnt) {
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "DisconnectionInd",
+                                                    g_variant_new("(iiss)", WIFI_DIRECT_ERROR_NONE,
+                                                                           WFD_EVENT_DISASSOCIATION_IND,
+                                                                           peer_mac_address, peer_dev_name));
+               } else {
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "DisconnectionInd",
+                                                    g_variant_new("(iiss)", WIFI_DIRECT_ERROR_NONE,
+                                                                           WFD_EVENT_DISCONNECTION_IND,
+                                                                           peer_mac_address, peer_dev_name));
+               }
+
+       } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING &&
+                       /* Some devices(GO) send disconnection message before connection completed.
+                        * This message should be ignored when device is not GO */
+                       manager->local->dev_role == WFD_DEV_ROLE_GO) {
+               if (WFD_PEER_STATE_CONNECTED == peer->state) {
+                       WDS_LOGD("Peer is already Connected !!!");//LCOV_EXCL_LINE
+                       wfd_group_remove_member(group, peer_addr);
+                       g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "DisconnectionInd",
+                                                    g_variant_new("(iiss)", WIFI_DIRECT_ERROR_NONE,
+                                                                           WFD_EVENT_DISASSOCIATION_IND,
+                                                                           peer_mac_address, peer_dev_name));
+
+               } else if (WFD_PEER_STATE_CONNECTING == peer->state) {
+                       WDS_LOGD("Peer is Connecting...");//LCOV_EXCL_LINE
+                       g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                                    "Connection",
+                                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
+                                                                           WFD_EVENT_CONNECTION_RSP,
+                                                                           peer_mac_address));
+                       wfd_session_s *session = manager->session;
+                       if (wfd_asp_is_asp_session(session)) {
+                               wfd_asp_connect_status(session->session_mac,
+                                                                       session->session_id,
+                                                                       ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
+                                                                       NULL);
+                       }
+               } else {
+                       WDS_LOGE("Unexpected Peer State. Ignore it");//LCOV_EXCL_LINE
+                       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+                       return;
+               }
+       } else {
+               WDS_LOGE("Unexpected event. Ignore it");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       /* If there is no member, GO should be destroyed */
+
+       group = (wfd_group_s*)manager->group;
+       if (group && !group->member_count && wfd_util_is_remove_group_allowed()) {
+               wfd_oem_destroy_group(manager->oem_ops, group->ifname);
+               wfd_destroy_group(manager);
+               wfd_peer_clear_all(manager);
+       }
+
+       wfd_destroy_session(manager);
+       _wfd_event_reset_state(manager);
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+void wfd_event_terminating(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+void wfd_event_group_formation_failure(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_session_s *session = (wfd_session_s*) manager->session;
+       if (!session) {
+               WDS_LOGE("Unexpected event. Session not exist");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       unsigned char *peer_addr = wfd_session_get_peer_addr(session);
+       if (!peer_addr) {
+               WDS_LOGE("Session do not has peer");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
+       g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                    "Connection",
+                                    g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
+                                                           WFD_EVENT_CONNECTION_RSP,
+                                                           peer_mac_address));
+
+       if (wfd_asp_is_asp_session(session)) {
+               wfd_asp_connect_status(session->session_mac,
+                                                       session->session_id,
+                                                       ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
+                                                       NULL);
+       }
+
+       wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+       wfd_destroy_session(manager);
+       manager->local->dev_role = WFD_DEV_ROLE_NONE;
+
+       wfd_oem_refresh(manager->oem_ops);
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+/**
+ * This event is generated by supplicant when persitent invite is auto accepted
+ * so that wfd-manager can get indication that a peer will be connected in near future.
+ * session is started for that peer, so that it is not ignored when connected.
+ */
+void wfd_event_invitation_accepted(wfd_oem_event_s *event)
+{
+
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_session_s *session = (wfd_session_s*) manager->session;
+       wfd_device_s *peer = NULL;
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
+
+       peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
+       if (!peer) {
+               WDS_LOGI("Invitation from unknown peer. Add new peer");//LCOV_EXCL_LINE
+               peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
+               if (!peer) {
+                       WDS_LOGE("Failed to add peer for invitation");//LCOV_EXCL_LINE
+                       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+                       return;
+               }
+       }
+       /**By default, peer device information is complete but there's some exception
+       * if DEV-FOUND event was not preceding before connection start event.
+       */
+       wfd_update_peer(manager, peer);
+       peer->dev_role = WFD_DEV_ROLE_GO;
+
+       if (!session) {
+               session = wfd_create_session(manager, event->dev_addr,
+                                       event->wps_mode, SESSION_DIRECTION_INCOMING);
+               if (!session) {
+                       WDS_LOGE("Failed to create session with peer [" MACSTR "]",
+                                                       MAC2STR(event->dev_addr));
+                       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+                       return;
+               }
+       }
+
+       session->state = SESSION_STATE_WPS;
+       wfd_session_timer(session, 1);
+
+       g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+                                        "Connection",
+                                        g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+                                                               WFD_EVENT_CONNECTION_IN_PROGRESS,
+                                                               peer_mac_address));
+
+       wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
+       wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+}
+
+void wfd_event_serv_disc_resp(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_manager_s *manager = wfd_get_manager();
+       int service_type;
+       char response_data[256] = {0, };
+       char peer_mac_address[MACSTR_LEN+1] = {0, };
+
+       if (!manager->is_service_discovery_supported) {
+               WDS_LOGD("service discovery not supported");//LCOV_EXCL_LINE
+               return;
+       }
+
+       wfd_update_peer_time(manager, event->dev_addr);
+
+       if (event->edata_type == WFD_OEM_EDATA_TYPE_NEW_SERVICE) {
+               wfd_oem_new_service_s *service = NULL;;
+               GList *temp = NULL;
+               GList *services = (GList*) event->edata;
+               int count = 0;
+
+               WDS_LOGD("%d service data found", event->dev_role);
+
+               temp = g_list_first(services);
+               while (temp && count < event->dev_role) {
+                       service = (wfd_oem_new_service_s*) temp->data;
+                       service_type = service->protocol;
+                       if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
+                               g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
+                               g_snprintf(response_data, 256, "%s|%s", service->data.bonjour.query, service->data.bonjour.rdata);
+                               WDS_LOGD("Found service: [%d: %s] - [" MACSECSTR "]", service->protocol,
+                                                       service->data.bonjour.query, MAC2SECSTR(event->dev_addr));
+                       } else {
+                               WDS_LOGD("Found service is not supported");//LCOV_EXCL_LINE
+                               goto next;
+                       }
+
+                       wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
+                                                    "DiscoveryFound",
+                                                    g_variant_new("(iss)", service_type,
+                                                                           response_data,
+                                                                           peer_mac_address));
+next:
+                       temp = g_list_next(temp);
+                       service = NULL;
+                       count++;
+               }
+       }
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+void wfd_event_serv_disc_started(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+
+void wfd_event_asp_serv_resp(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_oem_asp_service_s *service = NULL;
+       GVariantBuilder *builder = NULL;
+       GVariant *params = NULL;
+
+       if (manager && !manager->is_asp_supported) {
+               WDS_LOGD("ASP is not supported.");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       service = (wfd_oem_asp_service_s *)event->edata;
+       if (service == NULL) {
+               WDS_LOGE("P2P service found event has NULL information");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+       g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("u", service->search_id));
+       g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", event->dev_addr));
+       g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
+       g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
+       if (service->service_type)
+               g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type));
+       if (service->service_info)
+               g_variant_builder_add(builder, "{sv}", "service_info", g_variant_new("s", service->service_info));
+       g_variant_builder_add(builder, "{sv}", "status", g_variant_new("y", service->status));
+       params = g_variant_new("(a{sv})", builder);
+       g_variant_builder_unref(builder);
+
+       wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
+                                    "SearchResult",
+                                    params);
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+int __wfd_handle_asp_prov(wfd_manager_s *manager, wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_session_s *session = NULL;
+       wfd_oem_asp_prov_s *prov_params = NULL;
+       int res = 0;
+
+       prov_params = (wfd_oem_asp_prov_s *)event->edata;
+       if (prov_params == NULL) {
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return -1;
+       }
+
+       res = wfd_session_process_event(manager, event);
+       session = (wfd_session_s *)manager->session;
+       if (res < 0 || session == NULL) {
+               WDS_LOGE("Failed to process event of session");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return -1;
+       }
+       session->session_id = prov_params->session_id;
+       memcpy(session->session_mac, prov_params->session_mac, MACADDR_LEN);
+       memcpy(session->service_mac, prov_params->service_mac, MACADDR_LEN);
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return 0;
+}
+
+int __wfd_handle_asp_prov_done(wfd_session_s *session, wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_oem_asp_prov_s *prov_params = NULL;
+       prov_params = (wfd_oem_asp_prov_s *)event->edata;
+       int res = 0;
+
+       if (prov_params->persist &&
+       (prov_params->network_role || prov_params->network_config)) {
+               WDS_LOGE("Persistent group is used but "
+                               "conncap/dev_passwd_id are present");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return -1;
+       }
+
+       if (!prov_params->persist &&
+       (!prov_params->network_role && !prov_params->network_config)) {
+               WDS_LOGE("Persistent group not used but "
+                               "conncap/dev_passwd_id are missing");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return -1;
+       }
+
+       if (session->wps_mode == WFD_OEM_WPS_MODE_P2PS)
+               g_strlcpy(session->wps_pin, OEM_DEFAULT_P2PS_PIN, OEM_PINSTR_LEN + 1);
+
+       if (prov_params->persist) {
+               res = wfd_session_asp_persistent_connect(session, prov_params->persistent_group_id);
+       } else if (prov_params->network_role == WFD_OEM_ASP_SESSION_ROLE_NEW) {
+               res = wfd_session_asp_connect(session, WFD_OEM_ASP_SESSION_ROLE_NEW);
+       } else if (prov_params->network_role == WFD_OEM_ASP_SESSION_ROLE_CLIENT) {
+               res = wfd_session_asp_connect(session, WFD_OEM_ASP_SESSION_ROLE_CLIENT);
+       } else if (prov_params->network_role == WFD_OEM_ASP_SESSION_ROLE_GO) {
+               res = wfd_session_asp_connect(session, WFD_OEM_ASP_SESSION_ROLE_GO);
+               WDS_LOGD("don't need to take action.");//LCOV_EXCL_LINE
+
+       } else {
+               WDS_LOGE("Unhandled event");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               res = -1;
+       }
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return res;
+}
+
+void wfd_event_asp_prov_start(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_session_s *session = NULL;
+       wfd_oem_asp_prov_s *prov_params = NULL;
+       int res = 0;
+
+       if (manager == NULL || event == NULL || event->edata == NULL) {
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       if (!manager->is_asp_supported) {
+               WDS_LOGD("ASP is not supported.");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       prov_params = (wfd_oem_asp_prov_s *)event->edata;
+       res = __wfd_handle_asp_prov(manager, event);
+       session = (wfd_session_s *)manager->session;
+       if (res < 0 || session == NULL) {
+               WDS_LOGE("Failed to process event of session");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       WDS_LOGD("created session [%u] with peer [" MACSTR "]", session->session_id,
+                       MAC2STR(session->session_mac));
+
+       /* Incomming Session, auto_accept = TRUE emit request Received */
+       /* generate SessionConfigRequest if event->wps_mode is not P2PS  and return*/
+
+       wfd_session_timer(session, 1);
+       wfd_asp_session_request(prov_params);
+       wfd_asp_connect_status(prov_params->session_mac,
+                                               prov_params->session_id,
+                                               ASP_CONNECT_STATUS_REQUEST_RECEIVED,
+                                               NULL);
+
+       wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+
+void wfd_event_asp_prov_done(wfd_oem_event_s *event)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       wfd_manager_s *manager = wfd_get_manager();
+       wfd_session_s *session = NULL;
+       wfd_oem_asp_prov_s *prov_params;
+       int res = 0;
+
+       if (manager == NULL || event == NULL || event->edata == NULL) {
+               WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       if (!manager->is_asp_supported) {
+               WDS_LOGD("ASP is not supported.");//LCOV_EXCL_LINE
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       prov_params = (wfd_oem_asp_prov_s *)event->edata;
+       /* Incomming Session, auto_accept = TRUE emit request Received */
+       /* generate SessionConfigRequest if event->wps_mode is not P2PS  and return*/
+       if (manager->session == NULL) {
+               wfd_asp_session_request(prov_params);
+               wfd_asp_connect_status(prov_params->session_mac,
+                                                       prov_params->session_id,
+                                                       ASP_CONNECT_STATUS_REQUEST_RECEIVED,
+                                                       NULL);
+       }
+
+       res = __wfd_handle_asp_prov(manager, event);
+       session = (wfd_session_s *)manager->session;
+       if (res < 0 || session == NULL) {
+               WDS_LOGE("Failed to process event of session");//LCOV_EXCL_LINE
+               wfd_destroy_session(manager);
+               wfd_oem_refresh(manager->oem_ops);
+               _wfd_event_reset_state(manager);
+               wfd_asp_connect_status(prov_params->session_mac,
+                                                       prov_params->session_id,
+                                                       ASP_CONNECT_STATUS_REQUEST_FAILED,
+                                                       NULL);
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       if (prov_params->status != WFD_OEM_SC_SUCCESS &&
+                       prov_params->status != WFD_OEM_SC_SUCCESS_ACCEPTED_BY_USER) {
+               WDS_LOGD("ASP-PROV failed. remove session.");//LCOV_EXCL_LINE
+               wfd_destroy_session(manager);
+               wfd_oem_refresh(manager->oem_ops);
+               _wfd_event_reset_state(manager);
+               wfd_asp_connect_status(prov_params->session_mac,
+                                                       prov_params->session_id,
+                                                       ASP_CONNECT_STATUS_REQUEST_FAILED,
+                                                       NULL);
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       wfd_asp_connect_status(prov_params->session_mac,
+                                               prov_params->session_id,
+                                               ASP_CONNECT_STATUS_REQUEST_ACCEPTED,
+                                               NULL);
+
+       wfd_asp_connect_status(prov_params->session_mac,
+                                               prov_params->session_id,
+                                               ASP_CONNECT_STATUS_GROUP_FORMATION_STARTED,
+                                               NULL);
+       res = __wfd_handle_asp_prov_done(session, event);
+       if (res < 0) {
+               WDS_LOGE("Connect failed. remove session.");//LCOV_EXCL_LINE
+               wfd_destroy_session(manager);
+               wfd_oem_refresh(manager->oem_ops);
+               _wfd_event_reset_state(manager);
+
+               wfd_asp_connect_status(prov_params->session_mac,
+                                                       prov_params->session_id,
+                                                       ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
+                                                       NULL);
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       WDS_LOGD("Provision done succeeded.");//LCOV_EXCL_LINE
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+//LCOV_EXCL_START
+void wfd_event_init(wfd_oem_event_cbs_s *event_cbs)
+{
+       __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+       if (!event_cbs) {
+               __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+               return;
+       }
+
+       event_cbs->deactivated_cb = wfd_event_deactivated;
+       event_cbs->peer_found_cb = wfd_event_peer_found;
+       event_cbs->peer_disappeared_cb = wfd_event_peer_disappeared;
+       event_cbs->discovery_finished_cb = wfd_event_discovery_finished;
+
+       event_cbs->prov_disc_req_cb = wfd_event_prov_disc_req;
+       event_cbs->prov_disc_resp_cb = wfd_event_prov_disc_resp;
+       event_cbs->prov_disc_fail_cb = wfd_event_prov_disc_fail;
+
+       event_cbs->go_neg_req_cb = wfd_event_go_neg_req;
+       event_cbs->go_neg_fail_cb = wfd_event_go_neg_fail;
+       event_cbs->go_neg_done_cb = wfd_event_go_neg_done;
+
+       event_cbs->wps_fail_cb = wfd_event_wps_fail;
+       event_cbs->wps_done_cb = wfd_event_wps_done;
+       event_cbs->key_neg_fail_cb = wfd_event_key_neg_fail;
+       event_cbs->key_neg_done_cb = wfd_event_key_neg_done;
+
+       event_cbs->conn_fail_cb = wfd_event_conn_fail;
+       event_cbs->conn_done_cb = wfd_event_conn_done;
+
+       event_cbs->group_created_cb = wfd_event_group_created;
+       event_cbs->group_destroyed_cb = wfd_event_group_destroyed;
+
+       event_cbs->invitation_req_cb = wfd_event_invitation_req;
+       event_cbs->invitation_resp_cb = wfd_event_invitation_res;
+       event_cbs->sta_connected_cb = wfd_event_sta_connected;
+       event_cbs->sta_disconnected_cb = wfd_event_sta_disconnected;
+
+       event_cbs->terminating_cb = wfd_event_terminating;
+
+       event_cbs->serv_disc_resp_cb = wfd_event_serv_disc_resp;
+       event_cbs->serv_disc_started_cb = wfd_event_serv_disc_started;
+
+       event_cbs->group_formation_failure_cb = wfd_event_group_formation_failure;
+       event_cbs->invitation_accepted_cb = wfd_event_invitation_accepted;
+
+       event_cbs->asp_serv_resp_cb = wfd_event_asp_serv_resp;
+       event_cbs->asp_prov_start_cb = wfd_event_asp_prov_start;
+       event_cbs->asp_prov_done_cb = wfd_event_asp_prov_done;
+
+       event_cbs->extra_data = NULL;
+
+       __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+       return;
+}
+//LCOV_EXCL_STOP