2 * Network Configuration Module
4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
21 * This file implements wifi direct event functions.
23 * @file wifi-direct-event.c
24 * @author Gibyoung Kim (lastkgb.kim@samsung.com)
37 #include <wifi-direct.h>
39 #include "wifi-direct-ipc.h"
40 #include "wifi-direct-manager.h"
41 #include "wifi-direct-oem.h"
42 #include "wifi-direct-peer.h"
43 #include "wifi-direct-group.h"
44 #include "wifi-direct-session.h"
45 #include "wifi-direct-event.h"
46 #include "wifi-direct-state.h"
47 #include "wifi-direct-util.h"
48 #include "wifi-direct-error.h"
49 #include "wifi-direct-log.h"
50 #include "wifi-direct-dbus.h"
51 #if defined(TIZEN_FEATURE_ASP)
52 #include "wifi-direct-asp.h"
53 #endif /* TIZEN_FEATURE_ASP */
55 static int _wfd_event_update_peer(wfd_manager_s *manager, wfd_oem_dev_data_s *data)
57 __WDS_LOG_FUNC_ENTER__;
59 wfd_device_s *peer = NULL;
61 if (!manager || !data) {
62 WDS_LOGE("Invalid parameter");
63 __WDS_LOG_FUNC_EXIT__;
67 peer = wfd_peer_find_by_dev_addr(manager, data->p2p_dev_addr);
69 peer = wfd_add_peer(manager, data->p2p_dev_addr, data->name);
71 WDS_LOGE("Failed to add peer");
72 __WDS_LOG_FUNC_EXIT__;
76 if (strcmp(peer->dev_name, data->name)) {
77 g_strlcpy(peer->dev_name, data->name, DEV_NAME_LEN + 1);
78 WDS_LOGD("Device name is changed [" MACSECSTR ": %s]",
79 MAC2SECSTR(peer->dev_addr), peer->dev_name);
82 #ifndef CTRL_IFACE_DBUS
83 memcpy(peer->intf_addr, data->p2p_intf_addr, MACADDR_LEN);
84 #endif /* CTRL_IFACE_DBUS */
85 peer->pri_dev_type = data->pri_dev_type;
86 peer->sec_dev_type = data->sec_dev_type;
87 peer->config_methods = data->config_methods;
88 peer->dev_flags = data->dev_flags;
89 peer->group_flags = data->group_flags;
90 peer->dev_role = data->dev_role;
91 peer->rssi = data->rssi;
92 WDS_LOGD("Peer RSSI value is %d", peer->rssi);
94 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
95 memcpy(&(peer->display), &(data->display), sizeof(wfd_display_s));
96 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
98 #if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
99 wfd_util_get_current_time(&peer->time);
102 gettimeofday(&tval, NULL);
103 peer->time = tval.tv_sec;
105 WDS_LOGI("Update time [%s - %ld]", peer->dev_name, peer->time);
107 __WDS_LOG_FUNC_EXIT__;
111 gboolean _wfd_connection_retry(gpointer *data)
113 wfd_session_s *session = (wfd_session_s*) data;
115 WDS_LOGE("Session is NULL");
116 __WDS_LOG_FUNC_EXIT__;
117 return G_SOURCE_REMOVE;
120 switch (session->state) {
121 case SESSION_STATE_STARTED:
122 WDS_LOGD("PD again");
123 wfd_session_start(session);
125 case SESSION_STATE_GO_NEG:
126 WDS_LOGD("Negotiation again");
127 wfd_session_connect(session);
129 case SESSION_STATE_WPS:
130 WDS_LOGD("WPS again");
131 wfd_session_wps(session);
134 WDS_LOGE("Invalid session state [%d]", session->state);
137 __WDS_LOG_FUNC_EXIT__;
138 return G_SOURCE_REMOVE;
141 void wfd_event_deactivated(wfd_oem_event_s *event)
143 __WDS_LOG_FUNC_ENTER__;
145 wfd_manager_s *manager = wfd_get_manager();
147 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
149 g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE));
151 wfd_destroy_group(manager);
152 wfd_destroy_session(manager);
153 wfd_peer_clear_all(manager);
154 wfd_local_reset_data(manager);
156 wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATED);
157 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATED);
158 manager->req_wps_mode = WFD_WPS_MODE_PBC;
160 #ifdef TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT
161 wfd_util_stop_wifi_direct_popup();
162 #endif /* TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT */
163 __WDS_LOG_FUNC_EXIT__;
167 void wfd_event_peer_found(wfd_oem_event_s *event)
169 __WDS_LOG_FUNC_ENTER__;
171 wfd_manager_s *manager = wfd_get_manager();
172 wfd_oem_dev_data_s *edata = NULL;
173 char peer_mac_address[MACSTR_LEN+1] = {0, };
176 edata = (wfd_oem_dev_data_s*) event->edata;
177 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
178 WDS_LOGE("Invalid event data");
179 __WDS_LOG_FUNC_EXIT__;
183 res = _wfd_event_update_peer(manager, edata);
185 WDS_LOGE("Failed to update peer data");
186 __WDS_LOG_FUNC_EXIT__;
190 if (manager->state > WIFI_DIRECT_STATE_ACTIVATING &&
191 manager->state != WIFI_DIRECT_STATE_CONNECTING &&
192 manager->state != WIFI_DIRECT_STATE_DISCONNECTING) {
193 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(edata->p2p_dev_addr));
194 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
196 g_variant_new("(s)", peer_mac_address));
199 #if defined(TIZEN_FEATURE_ASP)
202 GVariantBuilder *builder = NULL;
203 GVariant *params = NULL;
204 wfd_oem_advertise_service_s *service;
206 for (list = (GList *)event->asp_services; list != NULL; list = list->next) {
207 service = (wfd_oem_advertise_service_s *)list->data;
209 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
210 g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("t", service->search_id));
211 g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", peer_mac_address));
212 g_variant_builder_add(builder, "{sv}", "device_name", g_variant_new("s", edata->name));
213 g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
214 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
215 if (service->service_type)
216 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type));
217 params = g_variant_new("(a{sv})", builder);
218 g_variant_builder_unref(builder);
220 wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
225 for (list = (GList *)event->asp2_services; list != NULL; list = list->next) {
226 service = (wfd_oem_advertise_service_s *)list->data;
228 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
229 g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("t", service->search_id));
230 g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", peer_mac_address));
231 g_variant_builder_add(builder, "{sv}", "device_name", g_variant_new("s", edata->name));
232 g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
233 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
234 if (service->service_type)
235 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type));
236 if (service->instance_name)
237 g_variant_builder_add(builder, "{sv}", "instance_name", g_variant_new("s", service->instance_name));
238 params = g_variant_new("(a{sv})", builder);
239 g_variant_builder_unref(builder);
241 wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
246 __WDS_LOG_FUNC_EXIT__;
250 void wfd_event_peer_disappeared(wfd_oem_event_s *event)
252 __WDS_LOG_FUNC_ENTER__;
254 wfd_manager_s *manager = wfd_get_manager();
255 wfd_session_s *session = NULL;
256 wfd_device_s *peer = NULL;
257 char peer_mac_address[MACSTR_LEN+1] = {0, };
259 session = manager->session;
260 if (session != NULL && session->peer != NULL) {
261 peer = session->peer;
262 WDS_LOGD("session peer [" MACSTR "] lost peer [" MACSTR "]", MAC2STR(peer->dev_addr),
263 MAC2STR(event->dev_addr));
264 if (memcmp(peer->dev_addr, event->dev_addr, MACADDR_LEN) == 0) {
265 WDS_LOGD("peer already in connection");
270 wfd_remove_peer(manager, event->dev_addr);
272 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
273 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
275 g_variant_new("(s)", peer_mac_address));
277 __WDS_LOG_FUNC_EXIT__;
281 void wfd_event_discovery_finished(wfd_oem_event_s *event)
283 __WDS_LOG_FUNC_ENTER__;
285 wfd_manager_s *manager = wfd_get_manager();
287 if (manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
288 manager->state != WIFI_DIRECT_STATE_ACTIVATED) {
289 WDS_LOGE("Notify finding stopped when discovering or activated. [%d]", manager->state);
290 __WDS_LOG_FUNC_EXIT__;
294 if (manager->scan_mode == WFD_SCAN_MODE_PASSIVE) {
295 WDS_LOGE("During passive scan, Discover Finished event will not notified");
296 __WDS_LOG_FUNC_EXIT__;
300 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
301 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
302 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
304 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
305 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
307 manager->scan_mode = WFD_SCAN_MODE_NONE;
309 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
313 __WDS_LOG_FUNC_EXIT__;
317 void wfd_event_prov_disc_req(wfd_oem_event_s *event)
319 __WDS_LOG_FUNC_ENTER__;
321 wfd_manager_s *manager = wfd_get_manager();
322 wfd_device_s *peer = NULL;
324 wfd_group_s *group = (wfd_group_s*) manager->group;
326 if (group && group->role == WFD_DEV_ROLE_GC) {
327 WDS_LOGD("Device has GC role - ignore this provision request");
328 __WDS_LOG_FUNC_EXIT__;
332 #ifdef CTRL_IFACE_DBUS
333 wfd_oem_dev_data_s *edata = NULL;
335 edata = (wfd_oem_dev_data_s*) event->edata;
336 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
337 WDS_LOGE("Invalid event data");
338 __WDS_LOG_FUNC_EXIT__;
342 res = _wfd_event_update_peer(manager, edata);
343 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
344 #else /* CTRL_IFACE_DBUS */
345 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
347 WDS_LOGD("Prov_disc from unknown peer. Add new peer");
348 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
350 WDS_LOGE("Failed to add peer for invitation");
351 __WDS_LOG_FUNC_EXIT__;
354 wfd_update_peer(manager, peer);
356 wfd_update_peer_time(manager, event->dev_addr);
357 #endif /* CTRL_IFACE_DBUS */
359 if (WFD_DEV_ROLE_GO != manager->local->dev_role) {
360 WDS_LOGI("TV is not GO, updated peer data only.");
362 manager->local->wps_mode = event->wps_mode;
363 if (event->wps_mode == WFD_WPS_MODE_PBC ||
364 event->wps_mode == WFD_WPS_MODE_KEYPAD) {
365 __WDS_LOG_FUNC_EXIT__;
371 if (WFD_PEER_STATE_DISCOVERED < peer->state) {
372 WDS_LOGD("Peer already connected/connecting, ignore this provision request");
373 __WDS_LOG_FUNC_EXIT__;
377 peer->state = WFD_PEER_STATE_CONNECTING;
380 res = wfd_session_process_event(manager, event);
382 WDS_LOGE("Failed to process event of session");
384 __WDS_LOG_FUNC_EXIT__;
388 void wfd_event_prov_disc_resp(wfd_oem_event_s *event)
390 __WDS_LOG_FUNC_ENTER__;
392 wfd_manager_s *manager = wfd_get_manager();
393 wfd_device_s *peer = NULL;
396 #ifdef CTRL_IFACE_DBUS
397 wfd_oem_dev_data_s *edata = NULL;
399 edata = (wfd_oem_dev_data_s*) event->edata;
400 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
401 WDS_LOGE("Invalid event data");
402 __WDS_LOG_FUNC_EXIT__;
406 res = _wfd_event_update_peer(manager, edata);
407 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
409 peer->state = WFD_PEER_STATE_CONNECTING;
410 #else /* CTRL_IFACE_DBUS */
411 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
413 WDS_LOGD("Prov_disc from unknown peer. Add new peer");
414 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
416 WDS_LOGE("Failed to add peer for invitation");
417 __WDS_LOG_FUNC_EXIT__;
420 peer->state = WFD_PEER_STATE_CONNECTING;
421 wfd_update_peer(manager, peer);
423 wfd_update_peer_time(manager, event->dev_addr);
424 #endif /* CTRL_IFACE_DBUS */
426 res = wfd_session_process_event(manager, event);
428 WDS_LOGE("Failed to process event of session");
430 __WDS_LOG_FUNC_EXIT__;
434 void wfd_event_prov_disc_fail(wfd_oem_event_s *event)
436 __WDS_LOG_FUNC_ENTER__;
438 wfd_manager_s *manager = wfd_get_manager();
439 wfd_session_s *session = NULL;
440 unsigned char *peer_addr = NULL;
441 char peer_mac_address[MACSTR_LEN+1] = {0, };
442 #if defined(TIZEN_FEATURE_ASP)
443 wfd_oem_asp_prov_s *prov_params = NULL;
444 prov_params = (wfd_oem_asp_prov_s *)event->edata;
447 session = (wfd_session_s*) manager->session;
449 WDS_LOGE("Unexpected event. Session not exist");
450 __WDS_LOG_FUNC_EXIT__;
454 peer_addr = wfd_session_get_peer_addr(session);
456 WDS_LOGE("Session do not have peer");
457 __WDS_LOG_FUNC_EXIT__;
460 #if defined(TIZEN_FEATURE_ASP)
461 if (!ISZEROMACADDR(session->session_mac)) {
462 /* This connection is for ASP session */
463 if (prov_params->status == WFD_OEM_SC_FAIL_INVALID_PARAMS) {
464 wfd_oem_scan_param_s param;
466 WDS_LOGD("ASP prov disc deferred. wait response.");
467 wfd_asp_connect_status(session->session_mac,
469 ASP_CONNECT_STATUS_REQUEST_DEFERRED,
471 /* start listen to wait for provision discovery request from peer */
472 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
473 param.scan_mode = WFD_OEM_SCAN_MODE_PASSIVE;
474 wfd_oem_start_scan(manager->oem_ops, ¶m);
475 __WDS_LOG_FUNC_EXIT__;
480 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
481 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
483 g_variant_new("(iis)",
484 WIFI_DIRECT_ERROR_CONNECTION_FAILED,
485 WFD_EVENT_CONNECTION_RSP,
487 #if defined(TIZEN_FEATURE_ASP)
488 WDS_LOGD("ASP prov disc failed. remove session.");
489 wfd_asp_connect_status(session->session_mac,
491 ASP_CONNECT_STATUS_REQUEST_FAILED,
495 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
496 wfd_group_s *group = (wfd_group_s*) manager->group;
497 if (group && !group->member_count &&
498 wfd_util_is_remove_group_allowed()) {
499 wfd_destroy_group(manager);
501 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
502 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
504 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
505 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
508 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
509 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
512 wfd_destroy_session(manager);
514 wfd_oem_refresh(manager->oem_ops);
516 /* After connection failed, scan again */
517 wfd_oem_scan_param_s param;
518 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
519 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
521 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
522 wfd_oem_start_scan(manager->oem_ops, ¶m);
523 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
525 __WDS_LOG_FUNC_EXIT__;
529 void wfd_event_go_neg_req(wfd_oem_event_s *event)
531 __WDS_LOG_FUNC_ENTER__;
533 wfd_manager_s *manager = wfd_get_manager();
534 wfd_group_s *group = (wfd_group_s*) manager->group;
535 if (group && group->role == WFD_DEV_ROLE_GC) {
536 WDS_LOGD("Device has GC role - ignore this go neg request");
537 __WDS_LOG_FUNC_EXIT__;
541 #ifdef CTRL_IFACE_DBUS
542 wfd_oem_dev_data_s *edata = NULL;
545 edata = (wfd_oem_dev_data_s*) event->edata;
546 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
547 WDS_LOGE("Invalid event data");
548 __WDS_LOG_FUNC_EXIT__;
552 res = _wfd_event_update_peer(manager, edata);
554 WDS_LOGE("Failed to update peer data");
555 __WDS_LOG_FUNC_EXIT__;
558 #else /* CTRL_IFACE_DBUS */
559 wfd_oem_conn_data_s *edata = NULL;
560 wfd_device_s *peer = NULL;
562 edata = (wfd_oem_conn_data_s*) event->edata;
563 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_CONN) {
564 WDS_LOGE("Invalid connection event data");
565 __WDS_LOG_FUNC_EXIT__;
569 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
571 WDS_LOGD("Invitation from unknown peer. Add new peer");
572 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
574 WDS_LOGE("Failed to add peer for invitation");
575 __WDS_LOG_FUNC_EXIT__;
580 if (edata->wps_mode == 0)
583 event->wps_mode = edata->wps_mode;
584 #endif /* CTRL_IFACE_DBUS */
586 wfd_session_process_event(manager, event);
587 __WDS_LOG_FUNC_EXIT__;
591 void wfd_event_go_neg_fail(wfd_oem_event_s *event)
593 __WDS_LOG_FUNC_ENTER__;
595 wfd_manager_s *manager = wfd_get_manager();
596 wfd_session_s *session = NULL;
597 wfd_oem_conn_data_s *edata = NULL;
598 unsigned char *peer_addr = NULL;
599 char peer_mac_address[MACSTR_LEN] = {0, };
601 session = (wfd_session_s*) manager->session;
603 WDS_LOGE("Unexpected event. Session not exist");
604 __WDS_LOG_FUNC_EXIT__;
608 peer_addr = wfd_session_get_peer_addr(session);
610 WDS_LOGE("Session do not have peer");
611 __WDS_LOG_FUNC_EXIT__;
615 edata = (wfd_oem_conn_data_s*) event->edata;
617 WDS_LOGE("Invalid p2p connection data");
618 __WDS_LOG_FUNC_EXIT__;
622 if (edata->status < 0 && session->connecting_120) {
623 if (session->retry_gsrc) {
624 g_source_remove(session->retry_gsrc);
625 session->retry_gsrc = 0;
627 session->retry_gsrc = g_idle_add((GSourceFunc) _wfd_connection_retry, session);
628 WDS_LOGD("Connection will be retried");
629 __WDS_LOG_FUNC_EXIT__;
633 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
634 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
636 g_variant_new("(iis)",
637 WIFI_DIRECT_ERROR_CONNECTION_FAILED,
638 WFD_EVENT_CONNECTION_RSP,
641 #if defined(TIZEN_FEATURE_ASP)
642 if (!ISZEROMACADDR(session->session_mac))
643 wfd_asp_connect_status(session->session_mac,
645 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
649 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
650 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
652 wfd_destroy_group(manager);
653 wfd_destroy_session(manager);
654 manager->local->dev_role = WFD_DEV_ROLE_NONE;
655 __WDS_LOG_FUNC_EXIT__;
659 void wfd_event_go_neg_done(wfd_oem_event_s *event)
661 __WDS_LOG_FUNC_ENTER__;
663 #ifdef CTRL_IFACE_DBUS
664 wfd_manager_s *manager = wfd_get_manager();
665 wfd_session_s *session = NULL;
666 wfd_oem_conn_data_s *edata = NULL;
667 wfd_device_s *peer = NULL;
669 edata = (wfd_oem_conn_data_s*) event->edata;
671 WDS_LOGE("Invalid event data");
672 __WDS_LOG_FUNC_EXIT__;
676 session = (wfd_session_s*) manager->session;
677 if (session && session->peer) {
678 peer = session->peer;
679 memcpy(peer->intf_addr, edata->peer_intf_addr, MACADDR_LEN);
682 wfd_session_process_event(manager, event);
683 #endif /* CTRL_IFACE_DBUS */
684 __WDS_LOG_FUNC_EXIT__;
688 void wfd_event_wps_fail(wfd_oem_event_s *event)
690 __WDS_LOG_FUNC_ENTER__;
692 wfd_manager_s *manager = wfd_get_manager();
693 wfd_session_s *session = NULL;
694 unsigned char *peer_addr = NULL;
696 session = (wfd_session_s*) manager->session;
698 WDS_LOGE("Unexpected event. Session not exist");
699 __WDS_LOG_FUNC_EXIT__;
703 peer_addr = wfd_session_get_peer_addr(session);
705 WDS_LOGE("Session do not have peer");
706 __WDS_LOG_FUNC_EXIT__;
710 char peer_mac_address[MACSTR_LEN+1] = {0, };
711 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
712 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
714 g_variant_new("(iis)",
715 WIFI_DIRECT_ERROR_CONNECTION_FAILED,
716 WFD_EVENT_CONNECTION_RSP,
718 #if defined(TIZEN_FEATURE_ASP)
719 if (!ISZEROMACADDR(session->session_mac))
720 wfd_asp_connect_status(session->session_mac,
722 ASP_CONNECT_STATUS_GROUP_FORMATION_STARTED,
725 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
726 wfd_group_s *group = (wfd_group_s*) manager->group;
727 if (group && !group->member_count &&
728 wfd_util_is_remove_group_allowed()) {
729 wfd_destroy_group(manager);
731 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
732 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
734 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
735 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
738 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
739 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
742 wfd_destroy_session(manager);
744 wfd_oem_refresh(manager->oem_ops);
746 /* After connection failed, scan again */
747 wfd_oem_scan_param_s param;
748 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
749 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
751 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
752 wfd_oem_start_scan(manager->oem_ops, ¶m);
753 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
755 __WDS_LOG_FUNC_EXIT__;
759 void wfd_event_wps_done(wfd_oem_event_s *event)
761 __WDS_LOG_FUNC_ENTER__;
763 wfd_manager_s *manager = wfd_get_manager();
764 wfd_session_process_event(manager, event);
766 __WDS_LOG_FUNC_EXIT__;
770 void wfd_event_key_neg_fail(wfd_oem_event_s *event)
772 __WDS_LOG_FUNC_ENTER__;
774 wfd_manager_s *manager = wfd_get_manager();
775 wfd_session_s *session = NULL;
776 unsigned char *peer_addr = NULL;
777 char peer_mac_address[MACSTR_LEN+1] = {0, };
779 session = (wfd_session_s*) manager->session;
781 WDS_LOGE("Unexpected event. Session not exist");
782 __WDS_LOG_FUNC_EXIT__;
786 peer_addr = wfd_session_get_peer_addr(session);
788 WDS_LOGE("Session do not has peer");
789 __WDS_LOG_FUNC_EXIT__;
793 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
794 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
796 g_variant_new("(iis)",
797 WIFI_DIRECT_ERROR_CONNECTION_FAILED,
798 WFD_EVENT_CONNECTION_RSP,
800 #if defined(TIZEN_FEATURE_ASP)
801 if (!ISZEROMACADDR(session->session_mac))
802 wfd_asp_connect_status(session->session_mac,
804 ASP_CONNECT_STATUS_GROUP_FORMATION_STARTED,
807 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
808 wfd_group_s *group = (wfd_group_s*) manager->group;
809 if (group && !group->member_count &&
810 wfd_util_is_remove_group_allowed()) {
811 wfd_destroy_group(manager);
813 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
814 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
816 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
817 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
820 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
821 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
824 wfd_destroy_session(manager);
826 wfd_oem_refresh(manager->oem_ops);
828 /* After connection failed, scan again */
829 wfd_oem_scan_param_s param;
830 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
831 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
833 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
834 wfd_oem_start_scan(manager->oem_ops, ¶m);
835 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
837 __WDS_LOG_FUNC_EXIT__;
841 void wfd_event_key_neg_done(wfd_oem_event_s *event)
843 __WDS_LOG_FUNC_ENTER__;
845 __WDS_LOG_FUNC_EXIT__;
849 void wfd_event_conn_fail(wfd_oem_event_s *event)
851 __WDS_LOG_FUNC_ENTER__;
853 __WDS_LOG_FUNC_EXIT__;
857 void wfd_event_conn_done(wfd_oem_event_s *event)
859 __WDS_LOG_FUNC_ENTER__;
861 __WDS_LOG_FUNC_EXIT__;
865 void wfd_event_group_created(wfd_oem_event_s *event)
867 __WDS_LOG_FUNC_ENTER__;
869 wfd_manager_s *manager = wfd_get_manager();
870 wfd_group_s *group = (wfd_group_s*) manager->group;
871 wfd_session_s *session = (wfd_session_s*) manager->session;
874 group = wfd_create_pending_group(manager, event->intf_addr);
876 WDS_LOGE("Failed to create pending group");
877 __WDS_LOG_FUNC_EXIT__;
881 manager->group = group;
884 wfd_group_complete(manager, event);
886 if (group->role == WFD_DEV_ROLE_GC && session) {
887 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
888 wfd_device_s *peer = session->peer;
890 WDS_LOGE("Unexpected event. Peer doesn't exist");
894 wfd_update_peer(manager, peer);
896 if (peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
897 char peer_mac_address[MACSTR_LEN+1] = {0, };
899 wfd_util_ip_over_eap_assign(peer, event->ifname);
901 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
902 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
904 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
905 WFD_EVENT_CONNECTION_RSP,
907 #if defined(TIZEN_FEATURE_ASP)
908 if (!ISZEROMACADDR(session->session_mac)) {
909 wfd_asp_connect_status(session->session_mac,
911 ASP_CONNECT_STATUS_GROUP_FORMATION_COMPLETED,
913 wfd_asp_session_peer_ip(session->session_mac, session->session_id,
914 session->service_mac, peer->ip_addr);
917 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
918 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
920 wfd_destroy_session(manager);
922 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
923 wfd_peer_clear_all(manager);
925 if (group->flags & WFD_GROUP_FLAG_AUTONOMOUS) {
926 wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
928 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
929 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
932 __WDS_LOG_FUNC_EXIT__;
936 void wfd_event_group_destroyed(wfd_oem_event_s *event)
938 __WDS_LOG_FUNC_ENTER__;
940 wfd_manager_s *manager = wfd_get_manager();
941 char peer_mac_address[MACSTR_LEN+1] = {0, };
942 unsigned char *peer_addr = wfd_session_get_peer_addr(manager->session);
944 if (peer_addr != NULL)
945 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
947 g_snprintf(peer_mac_address, MACSTR_LEN, "%s", "");
949 if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
950 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
952 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
953 WFD_EVENT_DISCONNECTION_RSP,
956 } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING && manager->session) {
957 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
959 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
960 WFD_EVENT_CONNECTION_RSP,
962 #if defined(TIZEN_FEATURE_ASP)
963 wfd_session_s *session = manager->session;
964 if (!ISZEROMACADDR(session->session_mac))
965 wfd_asp_connect_status(session->session_mac,
967 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
970 } else if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
971 if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
972 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
974 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
975 WFD_EVENT_DISCONNECTION_RSP,
978 wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
982 WDS_LOGD("Unexpected event(GROUP_DESTROYED). Ignore it");
983 __WDS_LOG_FUNC_EXIT__;
987 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
988 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
989 wfd_destroy_group(manager);
990 wfd_destroy_session(manager);
991 manager->local->dev_role = WFD_DEV_ROLE_NONE;
993 __WDS_LOG_FUNC_EXIT__;
997 void wfd_event_invitation_req(wfd_oem_event_s *event)
999 __WDS_LOG_FUNC_ENTER__;
1001 wfd_manager_s *manager = wfd_get_manager();
1002 wfd_device_s *peer = NULL;
1003 wfd_session_s *session = NULL;
1004 wfd_oem_invite_data_s *edata = NULL;
1006 char peer_mac_address[MACSTR_LEN+1] = {0, };
1008 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
1010 WDS_LOGD("Invitation from unknown peer. Add new peer");
1011 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
1013 WDS_LOGE("Failed to add peer for invitation");
1014 __WDS_LOG_FUNC_EXIT__;
1018 peer->dev_role = WFD_DEV_ROLE_GO;
1020 edata = (wfd_oem_invite_data_s*) event->edata;
1021 memcpy(peer->intf_addr, edata->bssid, MACADDR_LEN);
1022 wfd_update_peer_time(manager, event->dev_addr);
1024 session = wfd_create_session(manager, event->dev_addr,
1025 manager->req_wps_mode, SESSION_DIRECTION_INCOMING);
1027 WDS_LOGE("Failed to create session");
1028 __WDS_LOG_FUNC_EXIT__;
1031 session->type = SESSION_TYPE_INVITE;
1032 wfd_session_timer(session, 1);
1034 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
1036 res = wfd_session_start(session);
1038 WDS_LOGE("Failed to start session");
1039 __WDS_LOG_FUNC_EXIT__;
1043 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1044 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1046 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1047 WFD_EVENT_CONNECTION_REQ,
1050 __WDS_LOG_FUNC_EXIT__;
1054 void wfd_event_invitation_res(wfd_oem_event_s *event)
1056 __WDS_LOG_FUNC_ENTER__;
1058 __WDS_LOG_FUNC_EXIT__;
1062 void wfd_event_sta_connected(wfd_oem_event_s *event)
1064 __WDS_LOG_FUNC_ENTER__;
1066 wfd_manager_s *manager = wfd_get_manager();
1067 wfd_session_s *session = (wfd_session_s*) manager->session;
1068 wfd_group_s *group = (wfd_group_s*) manager->group;
1069 wfd_device_s *peer = NULL;
1070 char peer_mac_address[MACSTR_LEN+1] = {0, };
1072 /* FIXME: Move this code to plugin */
1073 if (!memcmp(event->intf_addr, manager->local->intf_addr, MACADDR_LEN)) {
1074 WDS_LOGD("Ignore this event");
1075 __WDS_LOG_FUNC_EXIT__;
1079 if (ISZEROMACADDR(event->dev_addr)) {
1080 WDS_LOGD("Legacy Peer Connected [Peer: " MACSTR "]", MAC2STR(event->intf_addr));
1082 peer = wfd_peer_find_by_addr(manager, event->intf_addr);
1084 WDS_LOGI("Add legacy peer");
1085 peer = wfd_add_peer(manager, event->intf_addr, "LEGACY-PEER");
1087 WDS_LOGE("Failed to add Legacy peer.");
1088 __WDS_LOG_FUNC_EXIT__;
1093 if (wfd_group_add_member(group, peer->dev_addr) == -1) {
1094 WDS_LOGE("Failed to add Legacy peer.");
1095 __WDS_LOG_FUNC_EXIT__;
1099 memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
1100 peer->state = WFD_PEER_STATE_CONNECTED;
1101 peer->is_p2p = FALSE;
1103 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1104 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1106 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1107 WFD_EVENT_CONNECTION_RSP,
1110 wfd_util_dhcps_wait_ip_leased(peer);
1111 __WDS_LOG_FUNC_EXIT__;
1115 session = (wfd_session_s*) manager->session;
1117 WDS_LOGD("Unexpected event. Session is NULL [peer: " MACSECSTR "]",
1118 MAC2SECSTR(event->dev_addr));
1120 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1121 wfd_destroy_group(manager);
1123 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1124 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1125 __WDS_LOG_FUNC_EXIT__;
1129 peer = wfd_session_get_peer(session);
1131 WDS_LOGE("Peer not found");
1132 __WDS_LOG_FUNC_EXIT__;
1136 group = (wfd_group_s*) manager->group;
1138 group = wfd_create_pending_group(manager, event->intf_addr);
1140 WDS_LOGE("Failed to create pending group");
1141 __WDS_LOG_FUNC_EXIT__;
1144 manager->group = group;
1146 wfd_group_add_member(group, peer->dev_addr);
1148 session->state = SESSION_STATE_COMPLETED;
1149 #ifndef CTRL_IFACE_DBUS
1150 memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
1151 #endif /* CTRL_IFACE_DBUS */
1152 peer->state = WFD_PEER_STATE_CONNECTED;
1154 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1155 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1157 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1158 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1160 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1161 WFD_EVENT_CONNECTION_RSP,
1164 #ifdef CTRL_IFACE_DBUS
1165 wfd_update_peer(manager, peer);
1166 #endif /* CTRL_IFACE_DBUS */
1167 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
1168 if (event->ip_addr_peer[3]) {
1169 peer->ip_type = WFD_IP_TYPE_OVER_EAPOL;
1170 memcpy(peer->client_ip_addr, event->ip_addr_peer, IPADDR_LEN);
1171 WDS_LOGE("Peer's client IP [" IPSTR "]", IP2STR((char*) &peer->client_ip_addr));
1172 memcpy(peer->go_ip_addr, manager->local->ip_addr, IPADDR_LEN);
1173 WDS_LOGE("Peer's GO IP [" IPSTR "]", IP2STR((char*) &peer->go_ip_addr));
1175 if (peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
1176 char peer_mac_address[MACSTR_LEN+1] = {0,};
1177 char assigned_ip_address[IPSTR_LEN+1] = {0,};
1179 memcpy(peer->ip_addr, peer->client_ip_addr, IPADDR_LEN);
1181 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1182 g_snprintf(assigned_ip_address, IPSTR_LEN, IPSTR, IP2STR(peer->ip_addr));
1183 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1185 g_variant_new("(ss)", peer_mac_address,
1186 assigned_ip_address));
1187 #if defined(TIZEN_FEATURE_ASP)
1188 if (!ISZEROMACADDR(session->session_mac)) {
1189 wfd_asp_connect_status(session->session_mac,
1190 session->session_id,
1191 ASP_CONNECT_STATUS_GROUP_FORMATION_COMPLETED,
1194 wfd_asp_session_peer_ip(session->session_mac, session->session_id,
1195 session->service_mac, peer->ip_addr);
1199 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
1200 wfd_util_dhcps_wait_ip_leased(peer);
1201 wfd_destroy_session(manager);
1203 __WDS_LOG_FUNC_EXIT__;
1207 void wfd_event_sta_disconnected(wfd_oem_event_s *event)
1209 __WDS_LOG_FUNC_ENTER__;
1211 wfd_manager_s *manager = wfd_get_manager();
1212 wfd_group_s *group = NULL;
1213 wfd_device_s *peer = NULL;
1214 unsigned char peer_addr[MACADDR_LEN] = {0, };
1215 char peer_mac_address[MACSTR_LEN+1] = {0, };
1217 group = (wfd_group_s*) manager->group;
1219 WDS_LOGE("Group not found");
1220 __WDS_LOG_FUNC_EXIT__;
1224 if (ISZEROMACADDR(event->dev_addr)) {
1225 WDS_LOGD("Legacy Peer Disconnected [Peer: " MACSTR "]", MAC2STR(event->intf_addr));
1226 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->intf_addr));
1227 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1229 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1230 WFD_EVENT_DISCONNECTION_IND,
1233 wfd_group_remove_member(group, event->intf_addr);
1235 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1236 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1237 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1239 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1240 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1242 __WDS_LOG_FUNC_EXIT__;
1246 #ifdef CTRL_IFACE_DBUS
1247 peer = wfd_group_find_member_by_addr(group, event->dev_addr);
1248 #else /* CTRL_IFACE_DBUS */
1249 peer = wfd_group_find_member_by_addr(group, event->intf_addr);
1250 #endif /* DBUS_IFACE */
1252 WDS_LOGE("Failed to find connected peer");
1253 peer = wfd_session_get_peer(manager->session);
1255 WDS_LOGE("Failed to find connecting peer");
1256 __WDS_LOG_FUNC_EXIT__;
1260 #ifdef CTRL_IFACE_DBUS
1262 * If no peer connected and
1263 * disconnected event is not for connecting peer
1264 * then event should be ignored.
1265 * This situation can arrise when TV is GO and
1266 * some connected peer sent disassociation.
1268 if (memcmp(peer_addr, event->dev_addr, MACADDR_LEN)) {
1269 WDS_LOGE("Unexpected event, Ignore it...");
1270 __WDS_LOG_FUNC_EXIT__;
1273 #endif /* CTRL_DBUS_IFACE */
1275 memcpy(peer_addr, peer->dev_addr, MACADDR_LEN);
1278 * If state is not DISCONNECTING, connection is finished by peer.
1279 * Required the check also, when Device is Group Owner and state is DISCOVERING.
1281 if (manager->state >= WIFI_DIRECT_STATE_CONNECTED ||
1282 (manager->state == WIFI_DIRECT_STATE_DISCOVERING &&
1283 manager->local->dev_role == WFD_DEV_ROLE_GO)) {
1284 wfd_group_remove_member(group, peer_addr);
1285 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1286 if (group->member_count) {
1287 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1289 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1290 WFD_EVENT_DISASSOCIATION_IND,
1293 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1295 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1296 WFD_EVENT_DISCONNECTION_IND,
1300 } else if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
1301 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1302 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1304 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1305 WFD_EVENT_DISCONNECTION_RSP,
1308 } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING &&
1309 /* Some devices(GO) send disconnection message before connection completed.
1310 * This message should be ignored when device is not GO */
1311 manager->local->dev_role == WFD_DEV_ROLE_GO) {
1312 if (WFD_PEER_STATE_CONNECTED == peer->state) {
1313 WDS_LOGD("Peer is already Connected !!!");
1314 wfd_group_remove_member(group, peer_addr);
1315 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1316 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1318 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1319 WFD_EVENT_DISASSOCIATION_IND,
1322 } else if (WFD_PEER_STATE_CONNECTING == peer->state) {
1323 WDS_LOGD("Peer is Connecting...");
1324 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1325 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1327 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
1328 WFD_EVENT_CONNECTION_RSP,
1330 #if defined(TIZEN_FEATURE_ASP)
1331 wfd_session_s *session = manager->session;
1332 if (session && !ISZEROMACADDR(session->session_mac))
1333 wfd_asp_connect_status(session->session_mac,
1334 session->session_id,
1335 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
1339 WDS_LOGE("Unexpected Peer State. Ignore it");
1340 __WDS_LOG_FUNC_EXIT__;
1344 WDS_LOGE("Unexpected event. Ignore it");
1345 __WDS_LOG_FUNC_EXIT__;
1349 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1350 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1351 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1353 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1354 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1357 /* If there is no member, GO should be destroyed */
1358 if (!group->member_count) {
1359 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1360 wfd_destroy_group(manager);
1361 wfd_peer_clear_all(manager);
1364 wfd_destroy_session(manager);
1366 __WDS_LOG_FUNC_EXIT__;
1370 void wfd_event_terminating(wfd_oem_event_s *event)
1372 __WDS_LOG_FUNC_ENTER__;
1374 __WDS_LOG_FUNC_EXIT__;
1378 void wfd_event_group_formation_failure(wfd_oem_event_s *event)
1380 __WDS_LOG_FUNC_ENTER__;
1382 wfd_manager_s *manager = wfd_get_manager();
1383 wfd_session_s *session = (wfd_session_s*) manager->session;
1385 WDS_LOGE("Unexpected event. Session not exist");
1386 __WDS_LOG_FUNC_EXIT__;
1390 unsigned char *peer_addr = wfd_session_get_peer_addr(session);
1392 WDS_LOGE("Session do not has peer");
1393 __WDS_LOG_FUNC_EXIT__;
1397 char peer_mac_address[MACSTR_LEN+1] = {0, };
1398 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1399 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1401 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
1402 WFD_EVENT_CONNECTION_RSP,
1405 #if defined(TIZEN_FEATURE_ASP)
1406 if (!ISZEROMACADDR(session->session_mac))
1407 wfd_asp_connect_status(session->session_mac,
1408 session->session_id,
1409 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
1413 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1414 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1415 wfd_destroy_session(manager);
1416 manager->local->dev_role = WFD_DEV_ROLE_NONE;
1418 wfd_oem_refresh(manager->oem_ops);
1420 __WDS_LOG_FUNC_EXIT__;
1425 * This event is generated by supplicant when persitent invite is auto accepted
1426 * so that wfd-manager can get indication that a peer will be connected in near future.
1427 * session is started for that peer, so that it is not ignored when connected.
1429 void wfd_event_invitation_accepted(wfd_oem_event_s *event)
1432 __WDS_LOG_FUNC_ENTER__;
1434 wfd_manager_s *manager = wfd_get_manager();
1435 wfd_session_s *session = (wfd_session_s*) manager->session;
1436 wfd_device_s *peer = NULL;
1437 char peer_mac_address[MACSTR_LEN+1] = {0, };
1439 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
1441 WDS_LOGI("Invitation from unknown peer. Add new peer");
1442 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
1444 WDS_LOGE("Failed to add peer for invitation");
1445 __WDS_LOG_FUNC_EXIT__;
1449 /**By default, peer device information is complete but there's some exception
1450 * if DEV-FOUND event was not preceding before connection start event.
1452 wfd_update_peer(manager, peer);
1453 peer->dev_role = WFD_DEV_ROLE_GO;
1456 session = wfd_create_session(manager, event->dev_addr,
1457 event->wps_mode, SESSION_DIRECTION_INCOMING);
1459 WDS_LOGE("Failed to create session with peer [" MACSTR "]",
1460 MAC2STR(event->dev_addr));
1461 __WDS_LOG_FUNC_EXIT__;
1466 session->state = SESSION_STATE_WPS;
1467 wfd_session_timer(session, 1);
1469 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1470 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1472 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1473 WFD_EVENT_CONNECTION_IN_PROGRESS,
1476 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
1477 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
1479 __WDS_LOG_FUNC_EXIT__;
1482 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1483 void wfd_event_serv_disc_resp(wfd_oem_event_s *event)
1485 __WDS_LOG_FUNC_ENTER__;
1487 wfd_manager_s *manager = wfd_get_manager();
1489 char response_data[256] = {0, };
1490 char peer_mac_address[MACSTR_LEN+1] = {0, };
1492 wfd_update_peer_time(manager, event->dev_addr);
1494 if (event->edata_type == WFD_OEM_EDATA_TYPE_NEW_SERVICE) {
1495 wfd_oem_new_service_s *service = NULL;;
1497 GList *services = (GList*) event->edata;
1500 WDS_LOGD("%d service data found", event->dev_role);
1502 temp = g_list_first(services);
1503 while (temp && count < event->dev_role) {
1504 service = (wfd_oem_new_service_s*) temp->data;
1505 service_type = service->protocol;
1506 if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
1507 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1508 g_snprintf(response_data, 256, "%s|%s", service->data.bonjour.query, service->data.bonjour.rdata);
1509 WDS_LOGD("Found service: [%d: %s] - [" MACSECSTR "]", service->protocol,
1510 service->data.bonjour.query, MAC2SECSTR(event->dev_addr));
1512 WDS_LOGD("Found service is not supported");
1516 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
1518 g_variant_new("(iss)", service_type,
1522 temp = g_list_next(temp);
1526 } else if (event->edata_type == WFD_OEM_EDATA_TYPE_SERVICE) {
1527 wfd_oem_service_data_s *edata = (wfd_oem_service_data_s*) event->edata;
1532 service_type = edata->type;
1533 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1534 switch (edata->type) {
1535 WDS_LOGE("Unknown type [type ID: %d]", edata->type);
1539 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
1541 g_variant_new("(iss)", service_type,
1546 __WDS_LOG_FUNC_EXIT__;
1550 void wfd_event_serv_disc_started(wfd_oem_event_s *event)
1552 __WDS_LOG_FUNC_ENTER__;
1554 __WDS_LOG_FUNC_EXIT__;
1557 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1560 #if defined(TIZEN_FEATURE_ASP)
1561 void wfd_event_asp_serv_resp(wfd_oem_event_s *event)
1563 __WDS_LOG_FUNC_ENTER__;
1565 wfd_oem_asp_service_s *service = NULL;
1566 GVariantBuilder *builder = NULL;
1567 GVariant *params = NULL;
1569 service = (wfd_oem_asp_service_s *)event->edata;
1570 if (service == NULL) {
1571 WDS_LOGE("P2P service found event has NULL information");
1572 __WDS_LOG_FUNC_EXIT__;
1576 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1577 g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("u", service->search_id));
1578 g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", event->dev_addr));
1579 g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
1580 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
1581 if (service->service_type)
1582 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type));
1583 if (service->service_info)
1584 g_variant_builder_add(builder, "{sv}", "service_info", g_variant_new("s", service->service_info));
1585 g_variant_builder_add(builder, "{sv}", "status", g_variant_new("y", service->status));
1586 params = g_variant_new("(a{sv})", builder);
1587 g_variant_builder_unref(builder);
1589 wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
1593 __WDS_LOG_FUNC_EXIT__;
1597 int __wfd_handle_asp_prov(wfd_manager_s *manager, wfd_oem_event_s *event)
1599 __WDS_LOG_FUNC_ENTER__;
1601 wfd_session_s *session = NULL;
1602 wfd_oem_asp_prov_s *prov_params = NULL;
1605 prov_params = (wfd_oem_asp_prov_s *)event->edata;
1606 if (prov_params == NULL) {
1607 WDS_LOGE("Invalid parameter");
1608 __WDS_LOG_FUNC_EXIT__;
1612 res = wfd_session_process_event(manager, event);
1613 session = (wfd_session_s *)manager->session;
1614 if (res < 0 || session == NULL) {
1615 WDS_LOGE("Failed to process event of session");
1616 __WDS_LOG_FUNC_EXIT__;
1619 session->session_id = prov_params->session_id;
1620 memcpy(session->session_mac, prov_params->session_mac, MACADDR_LEN);
1621 memcpy(session->service_mac, prov_params->service_mac, MACADDR_LEN);
1623 __WDS_LOG_FUNC_EXIT__;
1627 int __wfd_handle_asp_prov_done(wfd_session_s *session, wfd_oem_event_s *event)
1629 __WDS_LOG_FUNC_ENTER__;
1631 wfd_oem_asp_prov_s *prov_params = NULL;
1632 prov_params = (wfd_oem_asp_prov_s *)event->edata;
1635 if (prov_params->persist &&
1636 (prov_params->network_role || prov_params->network_config)) {
1637 WDS_LOGE("Persistent group is used but "
1638 "conncap/dev_passwd_id are present");
1639 __WDS_LOG_FUNC_EXIT__;
1643 if (!prov_params->persist &&
1644 (!prov_params->network_role && !prov_params->network_config)) {
1645 WDS_LOGE("Persistent group not used but "
1646 "conncap/dev_passwd_id are missing");
1647 __WDS_LOG_FUNC_EXIT__;
1651 if (session->wps_mode == WFD_OEM_WPS_MODE_P2PS)
1652 g_strlcpy(session->wps_pin, OEM_DEFAULT_P2PS_PIN, OEM_PINSTR_LEN + 1);
1654 if (prov_params->persist) {
1655 res = wfd_session_asp_persistent_connect(session, prov_params->persistent_group_id);
1656 } else if (prov_params->network_role == WFD_OEM_ASP_SESSION_ROLE_NEW) {
1657 res = wfd_session_asp_connect(session, WFD_OEM_ASP_SESSION_ROLE_NEW);
1658 } else if (prov_params->network_role == WFD_OEM_ASP_SESSION_ROLE_CLIENT) {
1659 res = wfd_session_asp_connect(session, WFD_OEM_ASP_SESSION_ROLE_CLIENT);
1660 } else if (prov_params->network_role == WFD_OEM_ASP_SESSION_ROLE_GO) {
1661 res = wfd_session_asp_connect(session, WFD_OEM_ASP_SESSION_ROLE_GO);
1662 WDS_LOGD("don't need to take action.");
1665 WDS_LOGE("Unhandled event");
1666 __WDS_LOG_FUNC_EXIT__;
1670 __WDS_LOG_FUNC_EXIT__;
1673 void wfd_event_asp_prov_start(wfd_oem_event_s *event)
1675 __WDS_LOG_FUNC_ENTER__;
1677 wfd_manager_s *manager = wfd_get_manager();
1678 wfd_session_s *session = NULL;
1679 wfd_oem_asp_prov_s *prov_params = NULL;
1682 if (event == NULL || event->edata == NULL) {
1683 WDS_LOGE("Invalid parameter");
1684 __WDS_LOG_FUNC_EXIT__;
1688 prov_params = (wfd_oem_asp_prov_s *)event->edata;
1689 res = __wfd_handle_asp_prov(manager, event);
1690 session = (wfd_session_s *)manager->session;
1691 if (res < 0 || session == NULL) {
1692 WDS_LOGE("Failed to process event of session");
1693 __WDS_LOG_FUNC_EXIT__;
1697 WDS_LOGD("created session [%u] with peer [" MACSTR "]", session->session_id,
1698 MAC2STR(session->session_mac));
1700 /* Incomming Session, auto_accept = TRUE emit request Received */
1701 /* generate SessionConfigRequest if event->wps_mode is not P2PS and return*/
1703 wfd_session_timer(session, 1);
1704 wfd_asp_session_request(prov_params);
1705 wfd_asp_connect_status(prov_params->session_mac,
1706 prov_params->session_id,
1707 ASP_CONNECT_STATUS_REQUEST_RECEIVED,
1710 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
1712 __WDS_LOG_FUNC_EXIT__;
1716 void wfd_event_asp_prov_done(wfd_oem_event_s *event)
1718 __WDS_LOG_FUNC_ENTER__;
1720 wfd_manager_s *manager = wfd_get_manager();
1721 wfd_session_s *session = NULL;
1722 wfd_oem_asp_prov_s *prov_params;
1725 if (event == NULL || event->edata == NULL) {
1726 WDS_LOGE("Invalid parameter");
1727 __WDS_LOG_FUNC_EXIT__;
1731 prov_params = (wfd_oem_asp_prov_s *)event->edata;
1732 /* Incomming Session, auto_accept = TRUE emit request Received */
1733 /* generate SessionConfigRequest if event->wps_mode is not P2PS and return*/
1734 if (manager->session == NULL) {
1735 wfd_asp_session_request(prov_params);
1736 wfd_asp_connect_status(prov_params->session_mac,
1737 prov_params->session_id,
1738 ASP_CONNECT_STATUS_REQUEST_RECEIVED,
1742 res = __wfd_handle_asp_prov(manager, event);
1743 session = (wfd_session_s *)manager->session;
1744 if (res < 0 || session == NULL) {
1745 WDS_LOGE("Failed to process event of session");
1746 wfd_destroy_session(manager);
1747 wfd_asp_connect_status(prov_params->session_mac,
1748 prov_params->session_id,
1749 ASP_CONNECT_STATUS_REQUEST_FAILED,
1751 wfd_oem_refresh(manager->oem_ops);
1752 __WDS_LOG_FUNC_EXIT__;
1756 if (prov_params->status != WFD_OEM_SC_SUCCESS &&
1757 prov_params->status != WFD_OEM_SC_SUCCESS_ACCEPTED_BY_USER) {
1758 WDS_LOGD("ASP-PROV failed. remove session.");
1759 wfd_destroy_session(manager);
1760 wfd_oem_refresh(manager->oem_ops);
1761 wfd_asp_connect_status(prov_params->session_mac,
1762 prov_params->session_id,
1763 ASP_CONNECT_STATUS_REQUEST_FAILED,
1765 __WDS_LOG_FUNC_EXIT__;
1769 wfd_asp_connect_status(prov_params->session_mac,
1770 prov_params->session_id,
1771 ASP_CONNECT_STATUS_REQUEST_ACCEPTED,
1774 wfd_asp_connect_status(prov_params->session_mac,
1775 prov_params->session_id,
1776 ASP_CONNECT_STATUS_GROUP_FORMATION_STARTED,
1778 res = __wfd_handle_asp_prov_done(session, event);
1780 WDS_LOGE("Connect failed. remove session.");
1781 wfd_destroy_session(manager);
1782 wfd_oem_refresh(manager->oem_ops);
1784 wfd_asp_connect_status(prov_params->session_mac,
1785 prov_params->session_id,
1786 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
1788 __WDS_LOG_FUNC_EXIT__;
1792 WDS_LOGD("Provision done succeeded.");
1793 __WDS_LOG_FUNC_EXIT__;
1796 #endif /* TIZEN_FEATURE_ASP */
1798 void wfd_event_init(wfd_oem_event_cbs_s *event_cbs)
1800 __WDS_LOG_FUNC_ENTER__;
1803 __WDS_LOG_FUNC_EXIT__;
1807 event_cbs->deactivated_cb = wfd_event_deactivated;
1808 event_cbs->peer_found_cb = wfd_event_peer_found;
1809 event_cbs->peer_disappeared_cb = wfd_event_peer_disappeared;
1810 event_cbs->discovery_finished_cb = wfd_event_discovery_finished;
1812 event_cbs->prov_disc_req_cb = wfd_event_prov_disc_req;
1813 event_cbs->prov_disc_resp_cb = wfd_event_prov_disc_resp;
1814 event_cbs->prov_disc_fail_cb = wfd_event_prov_disc_fail;
1816 event_cbs->go_neg_req_cb = wfd_event_go_neg_req;
1817 event_cbs->go_neg_fail_cb = wfd_event_go_neg_fail;
1818 event_cbs->go_neg_done_cb = wfd_event_go_neg_done;
1820 event_cbs->wps_fail_cb = wfd_event_wps_fail;
1821 event_cbs->wps_done_cb = wfd_event_wps_done;
1822 event_cbs->key_neg_fail_cb = wfd_event_key_neg_fail;
1823 event_cbs->key_neg_done_cb = wfd_event_key_neg_done;
1825 event_cbs->conn_fail_cb = wfd_event_conn_fail;
1826 event_cbs->conn_done_cb = wfd_event_conn_done;
1828 event_cbs->group_created_cb = wfd_event_group_created;
1829 event_cbs->group_destroyed_cb = wfd_event_group_destroyed;
1831 event_cbs->invitation_req_cb = wfd_event_invitation_req;
1832 event_cbs->invitation_resp_cb = wfd_event_invitation_res;
1833 event_cbs->sta_connected_cb = wfd_event_sta_connected;
1834 event_cbs->sta_disconnected_cb = wfd_event_sta_disconnected;
1836 event_cbs->terminating_cb = wfd_event_terminating;
1838 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1839 event_cbs->serv_disc_resp_cb = wfd_event_serv_disc_resp;
1840 event_cbs->serv_disc_started_cb = wfd_event_serv_disc_started;
1841 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1843 event_cbs->group_formation_failure_cb = wfd_event_group_formation_failure;
1844 event_cbs->invitation_accepted_cb = wfd_event_invitation_accepted;
1846 #if defined(TIZEN_FEATURE_ASP)
1847 event_cbs->asp_serv_resp_cb = wfd_event_asp_serv_resp;
1848 event_cbs->asp_prov_start_cb = wfd_event_asp_prov_start;
1849 event_cbs->asp_prov_done_cb = wfd_event_asp_prov_done;
1850 #endif /* TIZEN_FEATURE_ASP */
1852 event_cbs->extra_data = NULL;
1854 __WDS_LOG_FUNC_EXIT__;