wfd_group_s *group = (wfd_group_s*) manager->group;
if (group && group->role == WFD_DEV_ROLE_GC &&
- event->event_id == WFD_OEM_EVENT_PROV_DISC_REQ) {
+ event->event_id == WFD_OEM_EVENT_PROV_DISC_REQ) {
WDS_LOGD("Device has GC role - ignore this provision request");
__WDS_LOG_FUNC_EXIT__;
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_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 */
+ if (WFD_DEV_ROLE_GO != manager->local->dev_role) {
+ WDS_LOGI("TV is not GO, updated peer data only.");
+
+ 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__;
+ return;
+ }
+ }
+
+ 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_LOG_FUNC_ENTER__;
- wfd_session_s *session = NULL;
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");
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);
+ event->wps_mode = edata->wps_mode;
#endif /* CTRL_IFACE_DBUS */
- if (!session) {
- WDS_LOGE("Failed to create session");
- __WDS_LOG_FUNC_EXIT__;
- 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);
- char peer_mac_address[MACSTR_LEN+1] = {0, };
- g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
- wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
- "Connection",
- g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
- WFD_EVENT_CONNECTION_REQ,
- peer_mac_address));
- } else {
- wfd_session_process_event(manager, event);
- }
+ wfd_session_process_event(manager, event);
__WDS_LOG_FUNC_EXIT__;
return;
}
{
int req_wps_mode = WFD_WPS_MODE_NONE;
- if (event->wps_mode == WFD_WPS_MODE_DISPLAY) {
+ if (event->wps_mode == WFD_WPS_MODE_DISPLAY)
req_wps_mode = WFD_WPS_MODE_KEYPAD;
- } else if (event->wps_mode == WFD_WPS_MODE_KEYPAD) {
+ else if (event->wps_mode == WFD_WPS_MODE_KEYPAD)
req_wps_mode = WFD_WPS_MODE_DISPLAY;
- } else {
+ else
req_wps_mode = WFD_WPS_MODE_PBC;
- }
/* Only peer initiated connection or invitation session can be allowed */
if (session) {
}
/* Update session */
- if (event->wps_mode == WFD_WPS_MODE_DISPLAY) {
+ if (event->wps_mode == WFD_WPS_MODE_DISPLAY)
g_strlcpy(session->wps_pin, event->wps_pin, PINSTR_LEN + 1);
- }
+
session->state = SESSION_STATE_STARTED;
- if (session->type == SESSION_TYPE_INVITE) {
+ if (session->type == SESSION_TYPE_INVITE)
WDS_LOGD("Invitation session");
- } else if (WFD_DEV_ROLE_GO == manager->local->dev_role) {
+ else if (WFD_DEV_ROLE_GO == manager->local->dev_role)
session->type = SESSION_TYPE_JOIN;
- } else {
+ else
session->type = SESSION_TYPE_NORMAL;
- }
+
wfd_session_timer(session, 1);
/* Update local device */
} else {
session->req_wps_mode = WFD_WPS_MODE_PBC;
}
+
session->state = SESSION_STATE_STARTED;
wfd_session_timer(session, 1);
WDS_LOGD("Start connection corresponding to OEM event [%d]", event->event_id);
res = wfd_session_connect(session);
}
+
+ if (res < 0)
+ _wfd_notify_session_failed(manager, event->dev_addr);
}
- if (res < 0)
- _wfd_notify_session_failed(manager, event->dev_addr);
break;
case WFD_OEM_EVENT_GO_NEG_REQ:
+ {
if (!session) {
- // TODO: check whether connection is started by negotiation not by prov_disc
- WDS_LOGE("Unexpected event. Session not exist [peer: " MACSECSTR "]",
- MAC2SECSTR(event->dev_addr));
- break;
+ session = wfd_create_session(manager, event->dev_addr,
+ event->wps_mode, SESSION_DIRECTION_INCOMING);
+ if (!session) {
+ WDS_LOGE("Failed to create session");
+ __WDS_LOG_FUNC_EXIT__;
+ break;
+ }
+
+ session->type = SESSION_TYPE_NORMAL;
+ session->state = SESSION_STATE_GO_NEG;
+ wfd_session_timer(session, 1);
+ wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
+
+ char peer_mac_address[MACSTR_LEN+1] = {0, };
+ g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Connection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+ WFD_EVENT_CONNECTION_REQ,
+ peer_mac_address));
} else {
/* Sometimes, Provision Discovery response is not received.
* At this time, connection should be triggered by GO Negotiation request event */
if (res < 0)
_wfd_notify_session_failed(manager, event->dev_addr);
}
- break;
+ }
+ break;
case WFD_OEM_EVENT_GO_NEG_DONE:
+ {
if (!session) {
WDS_LOGE("Unexpected event. Session is NULL [peer: " MACSECSTR "]",
- MAC2SECSTR(event->dev_addr));
+ MAC2SECSTR(event->dev_addr));
break;
} else {
manager->local->dev_role = event->dev_role;
session->state = SESSION_STATE_WPS;
}
-
- break;
+ }
+ break;
case WFD_OEM_EVENT_WPS_DONE:
+ {
if (!session) {
WDS_LOGE("Unexpected event. Session is NULL [peer: " MACSECSTR "]",
- MAC2SECSTR(event->dev_addr));
+ MAC2SECSTR(event->dev_addr));
break;
} else {
session->state = SESSION_STATE_KEY_NEG;
}
-
- break;
+ }
+ break;
case WFD_OEM_EVENT_STA_CONNECTED:
+ {
if (!session) {
WDS_LOGE("Unexpected event. Session is NULL [peer: " MACSECSTR "]",
- MAC2SECSTR(event->dev_addr));
+ MAC2SECSTR(event->dev_addr));
break;
} else {
session->state = SESSION_STATE_COMPLETED;
}
-
- break;
+ }
+ break;
default:
break;
}