#include "wifi-direct-error.h"
#include "wifi-direct-log.h"
#include "wifi-direct-dbus.h"
-
+#include "wifi-direct-asp.h"
static int _wfd_event_update_peer(wfd_manager_s *manager, wfd_oem_dev_data_s *data)
{
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 !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
wfd_util_get_current_time(&peer->time);
g_variant_new("(s)", peer_mac_address));
}
-#if defined(TIZEN_FEATURE_ASP)
+ 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);
+ }
- 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);
+ 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);
+ }
}
-#endif
__WDS_LOG_FUNC_EXIT__;
return;
}
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;
return;
}
-#ifdef CTRL_IFACE_DBUS
+ 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");
+ __WDS_LOG_FUNC_EXIT__;
+ return;
+ }
+
wfd_oem_dev_data_s *edata = NULL;
edata = (wfd_oem_dev_data_s*) event->edata;
res = _wfd_event_update_peer(manager, edata);
peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
-#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");
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
- wfd_update_peer(manager, peer);
- }
- wfd_update_peer_time(manager, event->dev_addr);
-#endif /* CTRL_IFACE_DBUS */
if (WFD_DEV_ROLE_GO != manager->local->dev_role) {
WDS_LOGI("TV is not GO, updated peer data only.");
}
}
- if (peer) {
- if (WFD_PEER_STATE_DISCOVERED < peer->state) {
- WDS_LOGD("Peer already connected/connecting, ignore this provision request");
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
-
+ if (peer)
peer->state = WFD_PEER_STATE_CONNECTING;
- }
res = wfd_session_process_event(manager, event);
if (res < 0)
wfd_device_s *peer = NULL;
int res = 0;
-#ifdef CTRL_IFACE_DBUS
wfd_oem_dev_data_s *edata = NULL;
edata = (wfd_oem_dev_data_s*) event->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");
- __WDS_LOG_FUNC_EXIT__;
- 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)
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.");
+ wfd_asp_connect_status(session->session_mac,
+ session->session_id,
+ ASP_CONNECT_STATUS_REQUEST_DEFERRED,
+ NULL);
+ is_deferred = true;
+ }
+ }
+ __WDS_LOG_FUNC_EXIT__;
+ return is_deferred;
+}
+
void wfd_event_prov_disc_fail(wfd_oem_event_s *event)
{
__WDS_LOG_FUNC_ENTER__;
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(¶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__;
+ return;
+ }
+ }
+
snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
"Connection",
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.");
+ 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;
return;
}
-#ifdef CTRL_IFACE_DBUS
wfd_oem_dev_data_s *edata = NULL;
int res = 0;
__WDS_LOG_FUNC_EXIT__;
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");
- __WDS_LOG_FUNC_EXIT__;
- 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");
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
- }
-
- if (edata->wps_mode == 0)
- edata->wps_mode = 1;
-
- event->wps_mode = edata->wps_mode;
-#endif /* CTRL_IFACE_DBUS */
wfd_session_process_event(manager, event);
__WDS_LOG_FUNC_EXIT__;
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);
{
__WDS_LOG_FUNC_ENTER__;
-#ifdef CTRL_IFACE_DBUS
wfd_manager_s *manager = wfd_get_manager();
wfd_session_s *session = NULL;
wfd_oem_conn_data_s *edata = NULL;
}
wfd_session_process_event(manager, event);
-#endif /* CTRL_IFACE_DBUS */
__WDS_LOG_FUNC_EXIT__;
return;
}
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;
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;
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);
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,
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_LOG_FUNC_EXIT__;
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) {
return;
}
- g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
+ 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,
}
session = (wfd_session_s*) manager->session;
- if (!session) {
- 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);
+ 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__;
+ 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__;
+ return;
}
- wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
- wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
- __WDS_LOG_FUNC_EXIT__;
- return;
}
peer = wfd_session_get_peer(session);
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_EVENT_CONNECTION_RSP,
peer_mac_address));
-#ifdef CTRL_IFACE_DBUS
wfd_update_peer(manager, peer);
-#endif /* CTRL_IFACE_DBUS */
#ifdef TIZEN_FEATURE_IP_OVER_EAPOL
if (event->ip_addr_peer[3]) {
peer->ip_type = WFD_IP_TYPE_OVER_EAPOL;
"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
#endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
wfd_util_dhcps_wait_ip_leased(peer);
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");
peer = wfd_session_get_peer(manager->session);
return;
}
-#ifdef CTRL_IFACE_DBUS
/**
* If no peer connected and
* disconnected event is not for connecting peer
__WDS_LOG_FUNC_EXIT__;
return;
}
-#endif /* CTRL_DBUS_IFACE */
}
memcpy(peer_addr, peer->dev_addr, MACADDR_LEN);
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_LOG_FUNC_EXIT__;
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);
__WDS_LOG_FUNC_EXIT__;
}
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
void wfd_event_serv_disc_resp(wfd_oem_event_s *event)
{
__WDS_LOG_FUNC_ENTER__;
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");
+ return;
+ }
+
wfd_update_peer_time(manager, event->dev_addr);
if (event->edata_type == WFD_OEM_EDATA_TYPE_NEW_SERVICE) {
__WDS_LOG_FUNC_EXIT__;
return;
}
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
-#if defined(TIZEN_FEATURE_ASP)
void wfd_event_asp_serv_resp(wfd_oem_event_s *event)
{
__WDS_LOG_FUNC_ENTER__;
+ 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.");
+ __WDS_LOG_FUNC_EXIT__;
+ return;
+ }
+
service = (wfd_oem_asp_service_s *)event->edata;
if (service == NULL) {
WDS_LOGE("P2P service found event has NULL information");
return;
}
+int __wfd_handle_asp_prov(wfd_manager_s *manager, wfd_oem_event_s *event)
+{
+ __WDS_LOG_FUNC_ENTER__;
+
+ 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");
+ __WDS_LOG_FUNC_EXIT__;
+ 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");
+ __WDS_LOG_FUNC_EXIT__;
+ 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__;
+ return 0;
+}
+
+int __wfd_handle_asp_prov_done(wfd_session_s *session, wfd_oem_event_s *event)
+{
+ __WDS_LOG_FUNC_ENTER__;
+
+ 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");
+ __WDS_LOG_FUNC_EXIT__;
+ 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");
+ __WDS_LOG_FUNC_EXIT__;
+ 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.");
+
+ } else {
+ WDS_LOGE("Unhandled event");
+ __WDS_LOG_FUNC_EXIT__;
+ res = -1;
+ }
+
+ __WDS_LOG_FUNC_EXIT__;
+ return res;
+}
+
void wfd_event_asp_prov_start(wfd_oem_event_s *event)
{
__WDS_LOG_FUNC_ENTER__;
+ 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");
+ __WDS_LOG_FUNC_EXIT__;
+ return;
+ }
+
+ if (!manager->is_asp_supported) {
+ WDS_LOGD("ASP is not supported.");
+ __WDS_LOG_FUNC_EXIT__;
+ 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");
+ __WDS_LOG_FUNC_EXIT__;
+ 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__;
return;
}
{
__WDS_LOG_FUNC_ENTER__;
+ 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");
+ __WDS_LOG_FUNC_EXIT__;
+ return;
+ }
+
+ if (!manager->is_asp_supported) {
+ WDS_LOGD("ASP is not supported.");
+ __WDS_LOG_FUNC_EXIT__;
+ 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");
+ wfd_destroy_session(manager);
+ wfd_asp_connect_status(prov_params->session_mac,
+ prov_params->session_id,
+ ASP_CONNECT_STATUS_REQUEST_FAILED,
+ NULL);
+ wfd_oem_refresh(manager->oem_ops);
+ __WDS_LOG_FUNC_EXIT__;
+ 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.");
+ wfd_destroy_session(manager);
+ wfd_oem_refresh(manager->oem_ops);
+ wfd_asp_connect_status(prov_params->session_mac,
+ prov_params->session_id,
+ ASP_CONNECT_STATUS_REQUEST_FAILED,
+ NULL);
+ __WDS_LOG_FUNC_EXIT__;
+ 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.");
+ wfd_destroy_session(manager);
+ wfd_oem_refresh(manager->oem_ops);
+
+ wfd_asp_connect_status(prov_params->session_mac,
+ prov_params->session_id,
+ ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
+ NULL);
+ __WDS_LOG_FUNC_EXIT__;
+ return;
+ }
+
+ WDS_LOGD("Provision done succeeded.");
__WDS_LOG_FUNC_EXIT__;
return;
}
-#endif /* TIZEN_FEATURE_ASP */
void wfd_event_init(wfd_oem_event_cbs_s *event_cbs)
{
event_cbs->terminating_cb = wfd_event_terminating;
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
event_cbs->serv_disc_resp_cb = wfd_event_serv_disc_resp;
event_cbs->serv_disc_started_cb = wfd_event_serv_disc_started;
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
event_cbs->group_formation_failure_cb = wfd_event_group_formation_failure;
event_cbs->invitation_accepted_cb = wfd_event_invitation_accepted;
-#if defined(TIZEN_FEATURE_ASP)
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;
-#endif /* TIZEN_FEATURE_ASP */
event_cbs->extra_data = NULL;