#include <unistd.h>
#include <time.h>
#include <errno.h>
+#include <string.h>
#include <glib.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 void _wfd_event_reset_state(wfd_manager_s *manager)
+{
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+ if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
+ wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
+ wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
+ } else if (manager->local->dev_role == WFD_DEV_ROLE_GC) {
+ wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
+ wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
+ } else {
+ wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+ wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+ }
+ __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;
}
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 {
MAC2SECSTR(peer->dev_addr), peer->dev_name);
}
}
-#ifndef CTRL_IFACE_DBUS
- memcpy(peer->intf_addr, data->p2p_intf_addr, MACADDR_LEN);
-#endif /* CTRL_IFACE_DBUS */
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;
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
- memcpy(&(peer->display), &(data->display), sizeof(wfd_display_s));
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+ 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);
#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;
}
-
- gboolean _wfd_connection_retry(gpointer *data)
+//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;
- }
-
+ 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;
}
- static void __wfd_process_deactivated(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
-
- wifi_direct_client_noti_s noti;
+void wfd_event_deactivated(wfd_oem_event_s *event)
+{
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- return;
- }
+ wfd_manager_s *manager = wfd_get_manager();
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_DEACTIVATION;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- wfd_client_send_event(manager, ¬i);
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Deactivation",
+ g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE));
- wfd_destroy_group(manager, GROUP_IFNAME);
wfd_destroy_session(manager);
+ wfd_destroy_group(manager);
wfd_peer_clear_all(manager);
wfd_local_reset_data(manager);
wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATED);
manager->req_wps_mode = WFD_WPS_MODE_PBC;
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ if (manager->is_connection_agent)
+ wfd_util_stop_wifi_direct_popup();
- static void __wfd_process_peer_found(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
+ __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__;//LCOV_EXCL_LINE
+ wfd_manager_s *manager = wfd_get_manager();
wfd_oem_dev_data_s *edata = NULL;
- wifi_direct_client_noti_s noti;
+ char peer_mac_address[MACSTR_LEN+1] = {0, };
int res = 0;
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- return;
- }
-
edata = (wfd_oem_dev_data_s*) event->edata;
if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
- WDS_LOGE("Invalid event data");
+ 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");
+ 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) {
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(edata->p2p_dev_addr));
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- wfd_client_send_event(manager, ¬i);
- }
+ 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));
+ }
+
+ 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;
+
+ 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);
+ }
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ 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);
+ }
+ }
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return;
+}
- static void __wfd_process_peer_disappeared(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
+void wfd_event_peer_disappeared(wfd_oem_event_s *event)
+{
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
- wifi_direct_client_noti_s noti;
+ 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, };
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- return;
+ 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;
+ }
}
wfd_remove_peer(manager, event->dev_addr);
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_LOST_PEERS;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- wfd_client_send_event(manager, ¬i);
-
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ 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));
- static void __wfd_process_discovery_finished(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return;
+}
- wifi_direct_client_noti_s noti;
+void wfd_event_discovery_finished(wfd_oem_event_s *event)
+{
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- return;
- }
+ 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;
}
if (manager->scan_mode == WFD_SCAN_MODE_PASSIVE) {
- WDS_LOGE("During passive scan, Discover Finished event will not notified");
+ WDS_LOGE("During passive scan, Discover Finished event will not notified");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return;
}
- 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_event_reset_state(manager);
manager->scan_mode = WFD_SCAN_MODE_NONE;
- memset(¬i, 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, ¬i);
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "DiscoveryFinished",
+ NULL);
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return;
+}
- static void __wfd_process_prov_disc_req(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
+void wfd_event_prov_disc_req(wfd_oem_event_s *event)
+{
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
- wfd_device_s *peer = NULL;
- int res = 0;
+ 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 (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
+ 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;
+ }
+
+ 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;
}
-#ifdef CTRL_IFACE_DBUS
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");
+ WDS_LOGE("Invalid event data");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return;
}
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;
-#else /* CTRL_IFACE_DBUS */
- peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
- if (!peer) {
- WDS_LOGD("Prov_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");
+
+ if (WFD_DEV_ROLE_GO != manager->local->dev_role) {
+ WDS_LOGI("Own device is not GO, updated peer data only.");//LCOV_EXCL_LINE
+
+ 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;
}
- peer->state = WFD_PEER_STATE_CONNECTING;
- wfd_update_peer(manager, peer);
}
- wfd_update_peer_time(manager, event->dev_addr);
-#endif /* CTRL_IFACE_DBUS */
+
+ 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");
+ WDS_LOGE("Failed to process event of session");//LCOV_EXCL_LINE
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return;
+}
- static void __wfd_process_prov_disc_resp(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
+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 (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- return;
- }
-
-#ifdef CTRL_IFACE_DBUS
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");
+ WDS_LOGE("Invalid event data");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return;
}
peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
if (peer)
peer->state = WFD_PEER_STATE_CONNECTING;
-#else /* CTRL_IFACE_DBUS */
- peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
- if (!peer) {
- WDS_LOGD("Prov_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;
- }
- peer->state = WFD_PEER_STATE_CONNECTING;
- wfd_update_peer(manager, peer);
- }
- wfd_update_peer_time(manager, event->dev_addr);
-#endif /* CTRL_IFACE_DBUS */
res = wfd_session_process_event(manager, event);
if (res < 0)
- WDS_LOGE("Failed to process event of session");
+ WDS_LOGE("Failed to process event of session");//LCOV_EXCL_LINE
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return;
+}
- static void __wfd_process_prov_disc_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
+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;
+}
+
+void wfd_event_prov_disc_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;
- wifi_direct_client_noti_s noti;
unsigned char *peer_addr = NULL;
-
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- return;
- }
+ char peer_mac_address[MACSTR_LEN+1] = {0, };
session = (wfd_session_s*) manager->session;
if (!session) {
- WDS_LOGE("Unexpected event. Session not exist");
+ 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");
+ WDS_LOGE("Session do not have peer");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return;
}
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
- snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
- wfd_client_send_event(manager, ¬i);
+ 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(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
+ param.scan_mode = WFD_OEM_SCAN_MODE_PASSIVE;
+ wfd_oem_start_scan(manager->oem_ops, ¶m);
+ __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));
+ 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 && !group->member_count && (wfd_group_is_autonomous(group) == FALSE)) {
- wfd_destroy_group(manager, GROUP_IFNAME);
+ 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);
wfd_oem_start_scan(manager->oem_ops, ¶m);
manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
#endif
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
-
- static void __wfd_process_go_neg_req(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return;
+}
- wfd_session_s *session = NULL;
- wifi_direct_client_noti_s noti;
+void wfd_event_go_neg_req(wfd_oem_event_s *event)
+{
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
+ 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;
}
-#ifdef CTRL_IFACE_DBUS
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");
+ WDS_LOGE("Invalid event data");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return;
}
- if (_wfd_event_update_peer(manager, edata) < 0) {
- WDS_LOGE("Failed to update peer data");
- return;
- }
-#else /* CTRL_IFACE_DBUS */
- wfd_oem_conn_data_s *edata = NULL;
- wfd_device_s *peer = NULL;
-
- edata = (wfd_oem_conn_data_s*) event->edata;
- if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_CONN) {
- WDS_LOGE("Invalid connection event data");
+ 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;
}
- 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;
- }
- }
-
- if (edata->wps_mode == 0)
- edata->wps_mode = 1;
-#endif /* CTRL_IFACE_DBUS */
-
- session = (wfd_session_s*) manager->session;
- if (!session) {
- session = wfd_create_session(manager, event->dev_addr,
-#ifdef CTRL_IFACE_DBUS
- event->wps_mode, SESSION_DIRECTION_INCOMING);
-#else /* CTRL_IFACE_DBUS */
- edata->wps_mode, SESSION_DIRECTION_INCOMING);
-#endif /* CTRL_IFACE_DBUS */
- if (!session) {
- WDS_LOGE("Failed to create session");
- return;
- }
- session->type = SESSION_TYPE_NORMAL;
- session->state = SESSION_STATE_GO_NEG;
- wfd_session_timer(session, 1);
- wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
-
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- g_snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
- wfd_client_send_event(manager, ¬i);
- } else {
- wfd_session_process_event(manager, event);
- }
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ wfd_session_process_event(manager, event);
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return;
+}
- static void __wfd_process_go_neg_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
+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;
- wifi_direct_client_noti_s noti;
unsigned char *peer_addr = NULL;
-
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- return;
- }
+ char peer_mac_address[MACSTR_LEN] = {0, };
session = (wfd_session_s*) manager->session;
if (!session) {
- WDS_LOGE("Unexpected event. Session not exist");
+ 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");
+ 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 && edata->status < 0 && session->connecting_120) {
+ 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");
+ WDS_LOGD("Connection will be retried");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return;
}
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
- snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
- wfd_client_send_event(manager, ¬i);
+ snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Connection",
+ g_variant_new("(iis)",
+ WIFI_DIRECT_ERROR_CONNECTION_FAILED,
+ WFD_EVENT_CONNECTION_RSP,
+ peer_mac_address));
- wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
- wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+ 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_destroy_group(manager, GROUP_IFNAME);
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;
+}
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
-
- static void __wfd_process_go_neg_done(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
+void wfd_event_go_neg_done(wfd_oem_event_s *event)
+{
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
-#ifdef CTRL_IFACE_DBUS
+ wfd_manager_s *manager = wfd_get_manager();
wfd_session_s *session = NULL;
wfd_oem_conn_data_s *edata = NULL;
wfd_device_s *peer = NULL;
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- return;
- }
-
edata = (wfd_oem_conn_data_s*) event->edata;
if (edata == NULL) {
- WDS_LOGE("Invalid event data");
+ WDS_LOGE("Invalid event data");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return;
}
session = (wfd_session_s*) manager->session;
- if(session && session->peer) {
+ if (session && session->peer) {
peer = session->peer;
memcpy(peer->intf_addr, edata->peer_intf_addr, MACADDR_LEN);
}
- manager->local->dev_role = event->dev_role;
+
wfd_session_process_event(manager, event);
-#endif /* CTRL_IFACE_DBUS */
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return;
+}
- static void __wfd_process_wps_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
+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;
- wifi_direct_client_noti_s noti;
unsigned char *peer_addr = NULL;
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- return;
- }
-
session = (wfd_session_s*) manager->session;
if (!session) {
- WDS_LOGE("Unexpected event. Session not exist");
+ 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");
+ WDS_LOGE("Session do not have peer");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return;
}
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
- snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
- wfd_client_send_event(manager, ¬i);
+ 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_group_is_autonomous(group) == FALSE)) {
- wfd_destroy_group(manager, GROUP_IFNAME);
+ 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);
wfd_oem_start_scan(manager->oem_ops, ¶m);
manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
#endif
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return;
+}
- static void __wfd_process_wps_done(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
+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__;
- return;
- }
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return;
+}
- static void __wfd_process_key_neg_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
+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;
- wifi_direct_client_noti_s noti;
unsigned char *peer_addr = NULL;
-
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- return;
- }
+ char peer_mac_address[MACSTR_LEN+1] = {0, };
session = (wfd_session_s*) manager->session;
if (!session) {
- WDS_LOGE("Unexpected event. Session not exist");
+ 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");
+ WDS_LOGE("Session do not has peer");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return;
}
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
- snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
- wfd_client_send_event(manager, ¬i);
+ 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_group_is_autonomous(group) == FALSE)) {
- wfd_destroy_group(manager, GROUP_IFNAME);
+ 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);
wfd_oem_start_scan(manager->oem_ops, ¶m);
manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
#endif
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
-
- static void __wfd_process_key_neg_done(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
-
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return;
+}
- static void __wfd_process_conn_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
+void wfd_event_key_neg_done(wfd_oem_event_s *event)
+{
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return;
+}
- static void __wfd_process_conn_done(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
+void wfd_event_conn_fail(wfd_oem_event_s *event)
+{
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return;
+}
- static void __wfd_process_group_created(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
+void wfd_event_conn_done(wfd_oem_event_s *event)
+{
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
- wfd_group_s *group = NULL;
- wfd_session_s *session = NULL;
- wifi_direct_client_noti_s noti;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return;
+}
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- return;
- }
+void wfd_event_group_created(wfd_oem_event_s *event)
+{
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
- group = (wfd_group_s*) manager->group;
- session = (wfd_session_s*)manager->session;
-#ifdef CTRL_IFACE_DBUS
- if(event->dev_role == WFD_DEV_ROLE_GC && !group) {
+ 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");
+ WDS_LOGE("Failed to create pending group");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return;
}
+
manager->group = group;
}
-#endif /* CTRL_IFACE_DBUS */
- if (!group) {
- if (!session) {
- WDS_LOGE("Unexpected Event. Group should be removed(Client)");
- wfd_oem_destroy_group(manager->oem_ops, event->ifname);
- return;
- }
- group = wfd_create_group(manager, event);
- if (!group) {
- WDS_LOGE("Failed to create group");
- return;
- }
- } else {
- if (!session && !(group->flags & WFD_GROUP_FLAG_AUTONOMOUS)) {
- WDS_LOGE("Unexpected Event. Group should be removed(Owner)");
- wfd_oem_destroy_group(manager->oem_ops, group->ifname);
- return;
- }
+ wfd_group_complete(manager, event);
- if (group->pending) {
- wfd_group_complete(manager, event);
- } else {
- WDS_LOGE("Unexpected event. Group already exist");
+ 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;
}
- }
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- if (group->role == WFD_DEV_ROLE_GC && session) {
-#ifdef CTRL_IFACE_DBUS
- if(session->peer && session->peer->ip_type == WFD_IP_TYPE_OVER_EAPOL)
- wfd_util_ip_over_eap_assign(session->peer, event->ifname);
-#else /* CTRL_IFACE_DBUS */
- wfd_destroy_session(manager);
-#endif /* CTRL_IFACE_DBUS */
+ 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) {
- noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP;
- wfd_client_send_event(manager, ¬i);
+ 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;
+}
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
-
- static void __wfd_process_group_destroyed(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
+void wfd_event_group_destroyed(wfd_oem_event_s *event)
+{
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
- wifi_direct_client_noti_s noti;
+ 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 (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- return;
- }
+ if (peer_addr != NULL)
+ g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+ else
+ g_snprintf(peer_mac_address, MACSTR_LEN, "%s", "");
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING && manager->session){
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
- unsigned char *peer_addr = wfd_session_get_peer_addr(manager->session);
- if(peer_addr != NULL)
- g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "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) {
- noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP;
- noti.error = WIFI_DIRECT_ERROR_NONE;
+ if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Disconnection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+ WFD_EVENT_DISCONNECTION_RSP,
+ peer_mac_address));
+ } else {
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
+ "Destroyed", NULL);
+ }
} else {
- WDS_LOGD("Unexpected event(GROUP_DESTROYED). Ignore it");
+ WDS_LOGD("Unexpected event(GROUP_DESTROYED). Ignore it");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return;
}
- wfd_client_send_event(manager, ¬i);
wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
- wfd_destroy_group(manager, event->ifname);
wfd_destroy_session(manager);
+ wfd_destroy_group(manager);
manager->local->dev_role = WFD_DEV_ROLE_NONE;
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return;
+}
- static void __wfd_process_invitation_req(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
+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;
- wifi_direct_client_noti_s noti;
int res = 0;
-
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- return;
- }
+ 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");
+ 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");
+ WDS_LOGE("Failed to add peer for invitation");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return;
}
}
memcpy(peer->intf_addr, edata->bssid, MACADDR_LEN);
wfd_update_peer_time(manager, event->dev_addr);
- session = wfd_create_session(manager, event->dev_addr,
- manager->req_wps_mode, SESSION_DIRECTION_INCOMING);
+ 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");
+ 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");
+ WDS_LOGE("Failed to start session");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return;
}
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
- wfd_client_send_event(manager, ¬i);
+ 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));
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ 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));
- static void __wfd_process_invitation_res(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return;
+}
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+void wfd_event_invitation_res(wfd_oem_event_s *event)
+{
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
- static void __wfd_process_sta_connected(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return;
+}
- wfd_session_s *session = NULL;
- wfd_device_s *peer = NULL;
- wfd_group_s *group = NULL;
- wifi_direct_client_noti_s noti;
+void wfd_event_sta_connected(wfd_oem_event_s *event)
+{
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- return;
+ 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);
+ }
}
- // FIXME: Move this code to plugin
- if (!memcmp(event->intf_addr, manager->local->intf_addr, MACADDR_LEN)) {
- WDS_LOGD("Ignore this event");
+ 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) {
- WDS_LOGD("Unexpected event. Session is NULL [peer: " MACSECSTR "]",
- MAC2SECSTR(event->dev_addr));
- wfd_oem_destroy_group(manager->oem_ops, GROUP_IFNAME);
- wfd_destroy_group(manager, GROUP_IFNAME);
- wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
- wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
- return;
+ 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");
+ 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");
+ 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;
-#ifndef CTRL_IFACE_DBUS
- memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
-#endif /* CTRL_IFACE_DBUS */
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);
- memset(¬i, 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, ¬i);
-#ifdef CTRL_IFACE_DBUS
+ 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->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)
- wfd_util_ip_over_eap_lease(peer);
- else
-#endif /* CTRL_IFACE_DBUS */
- wfd_util_dhcps_wait_ip_leased(peer);
+ 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__;
- return;
- }
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return;
+}
- static void __wfd_process_sta_disconnected(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
+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;
- wifi_direct_client_noti_s noti;
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;
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
+ group = (wfd_group_s*) manager->group;
+ if (!group) {
+ WDS_LOGE("Group not found");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return;
}
- group = (wfd_group_s*) manager->group;
- if (!group) {
- WDS_LOGE("Group not found");
+ 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;
}
-#ifdef CTRL_IFACE_DBUS
peer = wfd_group_find_member_by_addr(group, event->dev_addr);
-#else /* CTRL_IFACE_DBUS */
- peer = wfd_group_find_member_by_addr(group, event->intf_addr);
-#endif /* DBUS_IFACE */
if (!peer) {
- WDS_LOGE("Failed to find connected 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");
+ 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);
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
-
- /* If state is not DISCONNECTING, connection is finished by peer */
- if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
- wfd_group_remove_member(group, peer_addr);
- if (group->member_count)
- noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;
- else
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
- /* If there is no member, GO should be destroyed */
-#ifdef TIZEN_TV
- /* If GO is Auto GO, then it should not be removed when no member left */
- if (!group->member_count && (wfd_group_is_autonomous(group) == FALSE)) {
-#else /* TIZEN_TV */
- if (!group->member_count) {
-#endif /* TIZEN_TV */
- wfd_oem_destroy_group(manager->oem_ops, group->ifname);
- wfd_destroy_group(manager, group->ifname);
+ 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_DISCONNECTING) {
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+
} 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 !!!");
- noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;
- noti.error = WIFI_DIRECT_ERROR_NONE;
+ 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...");
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
+ 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");
+ WDS_LOGE("Unexpected Peer State. Ignore it");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return;
}
- g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
} else {
- WDS_LOGE("Unexpected event. Ignore it");
+ WDS_LOGE("Unexpected event. Ignore it");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return;
}
- wfd_client_send_event(manager, ¬i);
- wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
- wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
- wfd_destroy_session(manager);
+ /* If there is no member, GO should be destroyed */
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ 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);
+ }
- static void __wfd_process_connected(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
+ wfd_destroy_session(manager);
+ _wfd_event_reset_state(manager);
- wfd_session_s *session = NULL;
- wfd_device_s *peer = NULL;
- wfd_group_s *group = NULL;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return;
+}
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- return;
- }
+void wfd_event_terminating(wfd_oem_event_s *event)
+{
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
- // FIXME: Move this code to plugin
- if (!memcmp(event->intf_addr, manager->local->intf_addr, MACADDR_LEN)) {
- WDS_LOGD("Ignore this event");
- return;
- }
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return;
+}
- session = (wfd_session_s*) manager->session;
+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_LOGD("Unexpected event. Session is NULL [peer: " MACSECSTR "]",
- MAC2SECSTR(event->dev_addr));
- wfd_oem_destroy_group(manager->oem_ops, GROUP_IFNAME);
- wfd_destroy_group(manager, GROUP_IFNAME);
- wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
- wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+ WDS_LOGE("Unexpected event. Session not exist");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return;
}
- peer = wfd_session_get_peer(session);
- if (!peer) {
- WDS_LOGE("Peer not found");
+ 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;
}
- 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;
- }
- manager->group = group;
+ 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_group_add_member(group, peer->dev_addr);
- session->state = SESSION_STATE_COMPLETED;
-#ifndef CTRL_IFACE_DBUS
- memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
-#endif /* CTRL_IFACE_DBUS */
- peer->state = WFD_PEER_STATE_CONNECTED;
+ 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;
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ wfd_oem_refresh(manager->oem_ops);
- static void __wfd_process_disconnected(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return;
+}
- wfd_group_s *group = NULL;
- wfd_device_s *peer = NULL;
- wifi_direct_client_noti_s noti;
- unsigned char peer_addr[MACADDR_LEN] = {0, };
+/**
+ * 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)
+{
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- return;
- }
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
- group = (wfd_group_s*) manager->group;
- if (!group) {
- WDS_LOGE("Group not found");
- return;
- }
+ 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, };
-#ifdef CTRL_IFACE_DBUS
- peer = wfd_group_find_member_by_addr(group, event->dev_addr);
-#else /* CTRL_IFACE_DBUS */
- peer = wfd_group_find_member_by_addr(group, event->intf_addr);
-#endif /* DBUS_IFACE */
+ peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
if (!peer) {
- WDS_LOGE("Failed to find connected peer");
- peer = wfd_session_get_peer(manager->session);
+ 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 find connecting peer");
+ WDS_LOGE("Failed to add peer for invitation");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return;
}
}
- memcpy(peer_addr, peer->dev_addr, MACADDR_LEN);
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
-
- /* If state is not DISCONNECTING, connection is finished by peer */
- if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
- wfd_group_remove_member(group, peer_addr);
- if (group->member_count)
- noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;
- else
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
- /* If there is no member, GO should be destroyed */
-#ifdef TIZEN_TV
- /* If GO is Auto GO, then it should not be removed when no member left */
- if (!group->member_count && (wfd_group_is_autonomous(group) == FALSE)) {
-#else /* TIZEN_TV */
- if (!group->member_count) {
-#endif /* TIZEN_TV */
- wfd_oem_destroy_group(manager->oem_ops, group->ifname);
- wfd_destroy_group(manager, group->ifname);
- }
- } else if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
- } 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 !!!");
- noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- } else if (WFD_PEER_STATE_CONNECTING == peer->state) {
- WDS_LOGD("Peer is Connecting...");
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
- } else {
- WDS_LOGE("Unexpected Peer State. Ignore it");
+ /**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;
}
- g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
- } else {
- WDS_LOGE("Unexpected event. Ignore it");
- return;
}
- wfd_client_send_event(manager, ¬i);
- wfd_destroy_group(manager, GROUP_IFNAME);
- wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
- wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
- wfd_destroy_session(manager);
+ session->state = SESSION_STATE_WPS;
+ wfd_session_timer(session, 1);
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ 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));
- static void __wfd_process_terminating(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
+ wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
+ wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
- static void __wfd_process_serv_disc_resp(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
+ __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
- wifi_direct_client_noti_s noti;
+ wfd_manager_s *manager = wfd_get_manager();
+ int service_type;
+ char response_data[256] = {0, };
+ char peer_mac_address[MACSTR_LEN+1] = {0, };
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
+ if (!manager->is_service_discovery_supported) {
+ WDS_LOGD("service discovery not supported");//LCOV_EXCL_LINE
return;
}
WDS_LOGD("%d service data found", event->dev_role);
temp = g_list_first(services);
- while(temp && count < event->dev_role) {
+ while (temp && count < event->dev_role) {
service = (wfd_oem_new_service_s*) temp->data;
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_SERVICE_DISCOVERY_FOUND;
- noti.type = service->protocol;
+ service_type = service->protocol;
if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
- g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
- g_snprintf(noti.param2, 256, "%s|%s", service->data.bonjour.query, service->data.bonjour.rdata);
+ g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
+ g_snprintf(response_data, 256, "%s|%s", service->data.bonjour.query, service->data.bonjour.rdata);
WDS_LOGD("Found service: [%d: %s] - [" MACSECSTR "]", service->protocol,
service->data.bonjour.query, MAC2SECSTR(event->dev_addr));
- } else if (service->protocol == WFD_OEM_SERVICE_TYPE_BT_ADDR) {
- g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
- g_snprintf(noti.param2, MACSTR_LEN, "%s", service->data.vendor.data2);
- WDS_LOGD("Found service: [%d: %s] - [" MACSECSTR "]", service->protocol,
- service->data.vendor.data2, MAC2SECSTR(event->dev_addr));
} else {
- WDS_LOGD("Found service is not supported");
+ WDS_LOGD("Found service is not supported");//LCOV_EXCL_LINE
goto next;
}
- wfd_client_send_event(manager, ¬i);
+
+ 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++;
}
- } else if (event->edata_type == WFD_OEM_EDATA_TYPE_SERVICE) {
- wfd_oem_service_data_s *edata = (wfd_oem_service_data_s*) event->edata;
+ }
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return;
+}
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_SERVICE_DISCOVERY_FOUND;
- if(!edata) {
- noti.type = -1;
- } else {
- noti.type = edata->type;
- g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
- switch(edata->type) {
- case WFD_OEM_SERVICE_TYPE_BT_ADDR:
- g_snprintf(noti.param2, MACSTR_LEN, MACSTR, MAC2STR(edata->data));
- return;
- case WFD_OEM_SERVICE_TYPE_CONTACT_INFO:
- g_snprintf(noti.param2, MACSTR_LEN, "%s", edata->value);
- return;
- default:
- WDS_LOGE("Unknown type [type ID: %d]", edata->type);
- }
- }
- wfd_client_send_event(manager, ¬i);
- }
-
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
-
- static void __wfd_process_serv_disc_started(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
- __WDS_LOG_FUNC_ENTER__;
-
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
-
-static struct {
- const int event_id;
- void (*function) (wfd_manager_s *manager, wfd_oem_event_s *event);
-} wfd_oem_event_map[] = {
- {
- WFD_OEM_EVENT_DEACTIVATED,
- __wfd_process_deactivated
- },
- {
- WFD_OEM_EVENT_PEER_FOUND,
- __wfd_process_peer_found
- },
- {
- WFD_OEM_EVENT_PEER_DISAPPEARED,
- __wfd_process_peer_disappeared
- },
- {
- WFD_OEM_EVENT_DISCOVERY_FINISHED,
- __wfd_process_discovery_finished
- },
- {
- WFD_OEM_EVENT_PROV_DISC_REQ,
- __wfd_process_prov_disc_req
- },
- {
- WFD_OEM_EVENT_PROV_DISC_RESP,
- __wfd_process_prov_disc_resp
- },
- {
- WFD_OEM_EVENT_PROV_DISC_FAIL,
- __wfd_process_prov_disc_fail
- },
- {
- WFD_OEM_EVENT_GO_NEG_REQ,
- __wfd_process_go_neg_req
- },
- {
- WFD_OEM_EVENT_GO_NEG_FAIL,
- __wfd_process_go_neg_fail
- },
- {
- WFD_OEM_EVENT_GO_NEG_DONE,
- __wfd_process_go_neg_done
- },
- {
- WFD_OEM_EVENT_WPS_FAIL,
- __wfd_process_wps_fail
- },
- {
- WFD_OEM_EVENT_WPS_DONE,
- __wfd_process_wps_done
- },
- {
- WFD_OEM_EVENT_KEY_NEG_FAIL,
- __wfd_process_key_neg_fail
- },
- {
- WFD_OEM_EVENT_KEY_NEG_DONE,
- __wfd_process_key_neg_done
- },
- {
- WFD_OEM_EVENT_CONN_FAIL,
- __wfd_process_conn_fail
- },
- {
- WFD_OEM_EVENT_CONN_DONE,
- __wfd_process_conn_done
- },
- {
- WFD_OEM_EVENT_GROUP_CREATED,
- __wfd_process_group_created
- },
- {
- WFD_OEM_EVENT_GROUP_DESTROYED,
- __wfd_process_group_destroyed
- },
- {
- WFD_OEM_EVENT_INVITATION_REQ,
- __wfd_process_invitation_req
- },
- {
- WFD_OEM_EVENT_INVITATION_RES,
- __wfd_process_invitation_res
- },
- {
- WFD_OEM_EVENT_STA_CONNECTED,
- __wfd_process_sta_connected
- },
- {
- WFD_OEM_EVENT_STA_DISCONNECTED,
- __wfd_process_sta_disconnected
- },
- {
- WFD_OEM_EVENT_CONNECTED,
- __wfd_process_connected
- },
- {
- WFD_OEM_EVENT_DISCONNECTED,
- __wfd_process_disconnected
- },
- {
- WFD_OEM_EVENT_TERMINATING,
- __wfd_process_terminating
- },
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
- {
- WFD_OEM_EVENT_SERV_DISC_RESP,
- __wfd_process_serv_disc_resp
- },
- {
- WFD_OEM_EVENT_SERV_DISC_STARTED,
- __wfd_process_serv_disc_started
- },
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
- {
- WFD_OEM_EVENT_MAX,
- NULL
- }
- };
-
- int wfd_process_event(void *user_data, void *data)
- {
- __WDS_LOG_FUNC_ENTER__;
- wfd_manager_s *manager = NULL;
- wfd_oem_event_s *event = NULL;
- int i = 0;
-
- if (!user_data || !data) {
- WDS_LOGE("Invalid parameter");
+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;
}
- manager = (wfd_manager_s*) user_data;
- event = (wfd_oem_event_s*) data;
- WDS_LOGD("Event[%d] from " MACSECSTR, event->event_id,
- MAC2SECSTR(event->dev_addr));
- for(i = 0; wfd_oem_event_map[i].function != NULL; i++) {
- if(event->event_id == wfd_oem_event_map[i].event_id)
- wfd_oem_event_map[i].function(manager, event);
+ 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__;
+ __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