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"
53 static int _wfd_event_update_peer(wfd_manager_s *manager, wfd_oem_dev_data_s *data)
55 __WDS_LOG_FUNC_ENTER__;
57 wfd_device_s *peer = NULL;
59 if (!manager || !data) {
60 WDS_LOGE("Invalid parameter");
61 __WDS_LOG_FUNC_EXIT__;
65 peer = wfd_peer_find_by_dev_addr(manager, data->p2p_dev_addr);
67 peer = wfd_add_peer(manager, data->p2p_dev_addr, data->name);
69 WDS_LOGE("Failed to add peer");
70 __WDS_LOG_FUNC_EXIT__;
74 if (strcmp(peer->dev_name, data->name)) {
75 g_strlcpy(peer->dev_name, data->name, DEV_NAME_LEN + 1);
76 WDS_LOGD("Device name is changed [" MACSECSTR ": %s]",
77 MAC2SECSTR(peer->dev_addr), peer->dev_name);
80 #ifndef CTRL_IFACE_DBUS
81 memcpy(peer->intf_addr, data->p2p_intf_addr, MACADDR_LEN);
82 #endif /* CTRL_IFACE_DBUS */
83 peer->pri_dev_type = data->pri_dev_type;
84 peer->sec_dev_type = data->sec_dev_type;
85 peer->config_methods = data->config_methods;
86 peer->dev_flags = data->dev_flags;
87 peer->group_flags = data->group_flags;
88 peer->dev_role = data->dev_role;
89 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
90 memcpy(&(peer->display), &(data->display), sizeof(wfd_display_s));
91 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
93 #if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
94 wfd_util_get_current_time(&peer->time);
97 gettimeofday(&tval, NULL);
98 peer->time = tval.tv_sec;
100 WDS_LOGI("Update time [%s - %ld]", peer->dev_name, peer->time);
102 __WDS_LOG_FUNC_EXIT__;
106 gboolean _wfd_connection_retry(gpointer *data)
108 wfd_session_s *session = (wfd_session_s*) data;
110 WDS_LOGE("Session is NULL");
111 __WDS_LOG_FUNC_EXIT__;
112 return G_SOURCE_REMOVE;
115 switch (session->state) {
116 case SESSION_STATE_STARTED:
117 WDS_LOGD("PD again");
118 wfd_session_start(session);
120 case SESSION_STATE_GO_NEG:
121 WDS_LOGD("Negotiation again");
122 wfd_session_connect(session);
124 case SESSION_STATE_WPS:
125 WDS_LOGD("WPS again");
126 wfd_session_wps(session);
129 WDS_LOGE("Invalid session state [%d]", session->state);
132 __WDS_LOG_FUNC_EXIT__;
133 return G_SOURCE_REMOVE;
136 static void __wfd_process_deactivated(wfd_manager_s *manager, wfd_oem_event_s *event)
138 __WDS_LOG_FUNC_ENTER__;
140 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
142 g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE));
144 wfd_destroy_group(manager, GROUP_IFNAME);
145 wfd_destroy_session(manager);
146 wfd_peer_clear_all(manager);
147 wfd_local_reset_data(manager);
149 wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATED);
150 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATED);
151 manager->req_wps_mode = WFD_WPS_MODE_PBC;
153 #ifdef TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT
154 wfd_util_stop_wifi_direct_popup();
155 #endif /* TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT */
156 __WDS_LOG_FUNC_EXIT__;
160 static void __wfd_process_peer_found(wfd_manager_s *manager, wfd_oem_event_s *event)
162 __WDS_LOG_FUNC_ENTER__;
164 wfd_oem_dev_data_s *edata = NULL;
165 char peer_mac_address[MACSTR_LEN+1] = {0, };
168 edata = (wfd_oem_dev_data_s*) event->edata;
169 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
170 WDS_LOGE("Invalid event data");
171 __WDS_LOG_FUNC_EXIT__;
175 res = _wfd_event_update_peer(manager, edata);
177 WDS_LOGE("Failed to update peer data");
178 __WDS_LOG_FUNC_EXIT__;
182 if (manager->state > WIFI_DIRECT_STATE_ACTIVATING &&
183 manager->state != WIFI_DIRECT_STATE_CONNECTING &&
184 manager->state != WIFI_DIRECT_STATE_DISCONNECTING) {
185 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(edata->p2p_dev_addr));
186 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
188 g_variant_new("(s)", peer_mac_address));
191 #if defined(TIZEN_FEATURE_ASP)
194 GVariantBuilder *builder = NULL;
195 GVariant *params = NULL;
196 wfd_oem_advertise_service_s *service;
198 for (list = (GList *)event->asp_services; list != NULL; list = list->next) {
199 service = (wfd_oem_advertise_service_s *)list->data;
201 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
202 g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("t", service->search_id));
203 g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", peer_mac_address));
204 g_variant_builder_add(builder, "{sv}", "device_name", g_variant_new("s", edata->name));
205 g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
206 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
207 if (service->service_type)
208 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type));
209 params = g_variant_new("(a{sv})", builder);
210 g_variant_builder_unref(builder);
212 wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
217 __WDS_LOG_FUNC_EXIT__;
221 static void __wfd_process_peer_disappeared(wfd_manager_s *manager, wfd_oem_event_s *event)
223 __WDS_LOG_FUNC_ENTER__;
225 wfd_session_s *session = NULL;
226 wfd_device_s *peer = NULL;
227 char peer_mac_address[MACSTR_LEN+1] = {0, };
229 session = manager->session;
230 if (session != NULL && session->peer != NULL) {
231 peer = session->peer;
232 WDS_LOGD("session peer [" MACSTR "] lost peer [" MACSTR "]", MAC2STR(peer->dev_addr),
233 MAC2STR(event->dev_addr));
234 if (memcmp(peer->dev_addr, event->dev_addr, MACADDR_LEN) == 0) {
235 WDS_LOGD("peer already in connection");
240 wfd_remove_peer(manager, event->dev_addr);
242 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
243 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
245 g_variant_new("(s)", peer_mac_address));
247 __WDS_LOG_FUNC_EXIT__;
251 static void __wfd_process_discovery_finished(wfd_manager_s *manager, wfd_oem_event_s *event)
253 __WDS_LOG_FUNC_ENTER__;
255 if (manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
256 manager->state != WIFI_DIRECT_STATE_ACTIVATED) {
257 WDS_LOGE("Notify finding stopped when discovering or activated. [%d]", manager->state);
258 __WDS_LOG_FUNC_EXIT__;
262 if (manager->scan_mode == WFD_SCAN_MODE_PASSIVE) {
263 WDS_LOGE("During passive scan, Discover Finished event will not notified");
264 __WDS_LOG_FUNC_EXIT__;
268 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
269 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
270 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
272 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
273 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
275 manager->scan_mode = WFD_SCAN_MODE_NONE;
277 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
281 __WDS_LOG_FUNC_EXIT__;
285 static void __wfd_process_prov_disc_req(wfd_manager_s *manager, wfd_oem_event_s *event)
287 __WDS_LOG_FUNC_ENTER__;
289 wfd_device_s *peer = NULL;
291 wfd_group_s *group = (wfd_group_s*) manager->group;
293 if (group && group->role == WFD_DEV_ROLE_GC) {
294 WDS_LOGD("Device has GC role - ignore this provision request");
295 __WDS_LOG_FUNC_EXIT__;
299 #ifdef CTRL_IFACE_DBUS
300 wfd_oem_dev_data_s *edata = NULL;
302 edata = (wfd_oem_dev_data_s*) event->edata;
303 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
304 WDS_LOGE("Invalid event data");
305 __WDS_LOG_FUNC_EXIT__;
309 res = _wfd_event_update_peer(manager, edata);
310 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
311 #else /* CTRL_IFACE_DBUS */
312 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
314 WDS_LOGD("Prov_disc from unknown peer. Add new peer");
315 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
317 WDS_LOGE("Failed to add peer for invitation");
318 __WDS_LOG_FUNC_EXIT__;
321 wfd_update_peer(manager, peer);
323 wfd_update_peer_time(manager, event->dev_addr);
324 #endif /* CTRL_IFACE_DBUS */
326 if (WFD_DEV_ROLE_GO != manager->local->dev_role) {
327 WDS_LOGI("TV is not GO, updated peer data only.");
329 manager->local->wps_mode = event->wps_mode;
330 if (event->wps_mode == WFD_WPS_MODE_PBC ||
331 event->wps_mode == WFD_WPS_MODE_KEYPAD) {
332 __WDS_LOG_FUNC_EXIT__;
338 if (WFD_PEER_STATE_DISCOVERED < peer->state) {
339 WDS_LOGD("Peer already connected/connecting, ignore this provision request");
340 __WDS_LOG_FUNC_EXIT__;
344 peer->state = WFD_PEER_STATE_CONNECTING;
347 res = wfd_session_process_event(manager, event);
349 WDS_LOGE("Failed to process event of session");
351 __WDS_LOG_FUNC_EXIT__;
355 static void __wfd_process_prov_disc_resp(wfd_manager_s *manager, wfd_oem_event_s *event)
357 __WDS_LOG_FUNC_ENTER__;
359 wfd_device_s *peer = NULL;
362 #ifdef CTRL_IFACE_DBUS
363 wfd_oem_dev_data_s *edata = NULL;
365 edata = (wfd_oem_dev_data_s*) event->edata;
366 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
367 WDS_LOGE("Invalid event data");
368 __WDS_LOG_FUNC_EXIT__;
372 res = _wfd_event_update_peer(manager, edata);
373 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
375 peer->state = WFD_PEER_STATE_CONNECTING;
376 #else /* CTRL_IFACE_DBUS */
377 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
379 WDS_LOGD("Prov_disc from unknown peer. Add new peer");
380 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
382 WDS_LOGE("Failed to add peer for invitation");
383 __WDS_LOG_FUNC_EXIT__;
386 peer->state = WFD_PEER_STATE_CONNECTING;
387 wfd_update_peer(manager, peer);
389 wfd_update_peer_time(manager, event->dev_addr);
390 #endif /* CTRL_IFACE_DBUS */
392 res = wfd_session_process_event(manager, event);
394 WDS_LOGE("Failed to process event of session");
396 __WDS_LOG_FUNC_EXIT__;
400 static void __wfd_process_prov_disc_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
402 __WDS_LOG_FUNC_ENTER__;
404 wfd_session_s *session = NULL;
405 unsigned char *peer_addr = NULL;
406 char peer_mac_address[MACSTR_LEN+1] = {0, };
408 session = (wfd_session_s*) manager->session;
410 WDS_LOGE("Unexpected event. Session not exist");
411 __WDS_LOG_FUNC_EXIT__;
415 peer_addr = wfd_session_get_peer_addr(session);
417 WDS_LOGE("Session do not have peer");
418 __WDS_LOG_FUNC_EXIT__;
422 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
423 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
425 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
426 WFD_EVENT_CONNECTION_RSP,
429 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
430 wfd_group_s *group = (wfd_group_s*) manager->group;
431 if (group && !group->member_count && (wfd_group_is_autonomous(group) == FALSE)) {
432 wfd_destroy_group(manager, GROUP_IFNAME);
434 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
435 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
437 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
438 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
441 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
442 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
445 wfd_destroy_session(manager);
447 wfd_oem_refresh(manager->oem_ops);
449 /* After connection failed, scan again */
450 wfd_oem_scan_param_s param;
451 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
452 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
454 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
455 wfd_oem_start_scan(manager->oem_ops, ¶m);
456 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
458 __WDS_LOG_FUNC_EXIT__;
462 static void __wfd_process_go_neg_req(wfd_manager_s *manager, wfd_oem_event_s *event)
464 __WDS_LOG_FUNC_ENTER__;
466 wfd_group_s *group = (wfd_group_s*) manager->group;
467 if (group && group->role == WFD_DEV_ROLE_GC) {
468 WDS_LOGD("Device has GC role - ignore this go neg request");
469 __WDS_LOG_FUNC_EXIT__;
473 #ifdef CTRL_IFACE_DBUS
474 wfd_oem_dev_data_s *edata = NULL;
477 edata = (wfd_oem_dev_data_s*) event->edata;
478 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
479 WDS_LOGE("Invalid event data");
480 __WDS_LOG_FUNC_EXIT__;
484 res = _wfd_event_update_peer(manager, edata);
486 WDS_LOGE("Failed to update peer data");
487 __WDS_LOG_FUNC_EXIT__;
490 #else /* CTRL_IFACE_DBUS */
491 wfd_oem_conn_data_s *edata = NULL;
492 wfd_device_s *peer = NULL;
494 edata = (wfd_oem_conn_data_s*) event->edata;
495 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_CONN) {
496 WDS_LOGE("Invalid connection event data");
497 __WDS_LOG_FUNC_EXIT__;
501 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
503 WDS_LOGD("Invitation from unknown peer. Add new peer");
504 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
506 WDS_LOGE("Failed to add peer for invitation");
507 __WDS_LOG_FUNC_EXIT__;
512 if (edata->wps_mode == 0)
515 event->wps_mode = edata->wps_mode;
516 #endif /* CTRL_IFACE_DBUS */
518 wfd_session_process_event(manager, event);
519 __WDS_LOG_FUNC_EXIT__;
523 static void __wfd_process_go_neg_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
525 __WDS_LOG_FUNC_ENTER__;
527 wfd_session_s *session = NULL;
528 wfd_oem_conn_data_s *edata = NULL;
529 unsigned char *peer_addr = NULL;
530 char peer_mac_address[MACSTR_LEN] = {0, };
532 session = (wfd_session_s*) manager->session;
534 WDS_LOGE("Unexpected event. Session not exist");
535 __WDS_LOG_FUNC_EXIT__;
539 peer_addr = wfd_session_get_peer_addr(session);
541 WDS_LOGE("Session do not have peer");
542 __WDS_LOG_FUNC_EXIT__;
546 edata = (wfd_oem_conn_data_s*) event->edata;
548 WDS_LOGE("Invalid p2p connection data");
549 __WDS_LOG_FUNC_EXIT__;
553 if (edata->status < 0 && session->connecting_120) {
554 if (session->retry_gsrc) {
555 g_source_remove(session->retry_gsrc);
556 session->retry_gsrc = 0;
558 session->retry_gsrc = g_idle_add((GSourceFunc) _wfd_connection_retry, session);
559 WDS_LOGD("Connection will be retried");
560 __WDS_LOG_FUNC_EXIT__;
564 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
565 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
567 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
568 WFD_EVENT_CONNECTION_RSP,
571 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
572 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
574 wfd_destroy_group(manager, GROUP_IFNAME);
575 wfd_destroy_session(manager);
576 manager->local->dev_role = WFD_DEV_ROLE_NONE;
577 __WDS_LOG_FUNC_EXIT__;
581 static void __wfd_process_go_neg_done(wfd_manager_s *manager, wfd_oem_event_s *event)
583 __WDS_LOG_FUNC_ENTER__;
585 #ifdef CTRL_IFACE_DBUS
586 wfd_session_s *session = NULL;
587 wfd_oem_conn_data_s *edata = NULL;
588 wfd_device_s *peer = NULL;
590 edata = (wfd_oem_conn_data_s*) event->edata;
592 WDS_LOGE("Invalid event data");
593 __WDS_LOG_FUNC_EXIT__;
597 session = (wfd_session_s*) manager->session;
598 if (session && session->peer) {
599 peer = session->peer;
600 memcpy(peer->intf_addr, edata->peer_intf_addr, MACADDR_LEN);
603 wfd_session_process_event(manager, event);
604 #endif /* CTRL_IFACE_DBUS */
605 __WDS_LOG_FUNC_EXIT__;
609 static void __wfd_process_wps_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
611 __WDS_LOG_FUNC_ENTER__;
613 wfd_session_s *session = NULL;
614 unsigned char *peer_addr = NULL;
616 session = (wfd_session_s*) manager->session;
618 WDS_LOGE("Unexpected event. Session not exist");
619 __WDS_LOG_FUNC_EXIT__;
623 peer_addr = wfd_session_get_peer_addr(session);
625 WDS_LOGE("Session do not have peer");
626 __WDS_LOG_FUNC_EXIT__;
630 char peer_mac_address[MACSTR_LEN+1] = {0, };
631 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
632 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
634 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
635 WFD_EVENT_CONNECTION_RSP,
638 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
639 wfd_group_s *group = (wfd_group_s*) manager->group;
640 if (group && !group->member_count && (wfd_group_is_autonomous(group) == FALSE)) {
641 wfd_destroy_group(manager, GROUP_IFNAME);
643 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
644 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
646 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
647 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
650 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
651 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
654 wfd_destroy_session(manager);
656 wfd_oem_refresh(manager->oem_ops);
658 /* After connection failed, scan again */
659 wfd_oem_scan_param_s param;
660 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
661 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
663 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
664 wfd_oem_start_scan(manager->oem_ops, ¶m);
665 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
667 __WDS_LOG_FUNC_EXIT__;
671 static void __wfd_process_wps_done(wfd_manager_s *manager, wfd_oem_event_s *event)
673 __WDS_LOG_FUNC_ENTER__;
675 wfd_session_process_event(manager, event);
677 __WDS_LOG_FUNC_EXIT__;
681 static void __wfd_process_key_neg_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
683 __WDS_LOG_FUNC_ENTER__;
685 wfd_session_s *session = NULL;
686 unsigned char *peer_addr = NULL;
687 char peer_mac_address[MACSTR_LEN+1] = {0, };
689 session = (wfd_session_s*) manager->session;
691 WDS_LOGE("Unexpected event. Session not exist");
692 __WDS_LOG_FUNC_EXIT__;
696 peer_addr = wfd_session_get_peer_addr(session);
698 WDS_LOGE("Session do not has peer");
699 __WDS_LOG_FUNC_EXIT__;
703 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
704 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
706 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
707 WFD_EVENT_CONNECTION_RSP,
710 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
711 wfd_group_s *group = (wfd_group_s*) manager->group;
712 if (group && !group->member_count && (wfd_group_is_autonomous(group) == FALSE)) {
713 wfd_destroy_group(manager, GROUP_IFNAME);
715 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
716 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
718 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
719 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
722 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
723 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
726 wfd_destroy_session(manager);
728 wfd_oem_refresh(manager->oem_ops);
730 /* After connection failed, scan again */
731 wfd_oem_scan_param_s param;
732 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
733 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
735 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
736 wfd_oem_start_scan(manager->oem_ops, ¶m);
737 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
739 __WDS_LOG_FUNC_EXIT__;
743 static void __wfd_process_key_neg_done(wfd_manager_s *manager, wfd_oem_event_s *event)
745 __WDS_LOG_FUNC_ENTER__;
747 __WDS_LOG_FUNC_EXIT__;
751 static void __wfd_process_conn_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
753 __WDS_LOG_FUNC_ENTER__;
755 __WDS_LOG_FUNC_EXIT__;
759 static void __wfd_process_conn_done(wfd_manager_s *manager, wfd_oem_event_s *event)
761 __WDS_LOG_FUNC_ENTER__;
763 __WDS_LOG_FUNC_EXIT__;
767 static void __wfd_process_group_created(wfd_manager_s *manager, wfd_oem_event_s *event)
769 __WDS_LOG_FUNC_ENTER__;
771 wfd_group_s *group = (wfd_group_s*) manager->group;
772 wfd_session_s *session = (wfd_session_s*) manager->session;
775 group = wfd_create_pending_group(manager, event->intf_addr);
777 WDS_LOGE("Failed to create pending group");
778 __WDS_LOG_FUNC_EXIT__;
782 manager->group = group;
785 wfd_group_complete(manager, event);
787 if (group->role == WFD_DEV_ROLE_GC && session) {
788 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
789 wfd_device_s *peer = session->peer;
791 WDS_LOGE("Unexpected event. Peer doesn't exist");
795 wfd_update_peer(manager, peer);
797 if (peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
798 char peer_mac_address[MACSTR_LEN+1] = {0, };
800 wfd_util_ip_over_eap_assign(peer, event->ifname);
802 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
803 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
805 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
806 WFD_EVENT_CONNECTION_RSP,
809 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
810 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
812 wfd_destroy_session(manager);
814 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
815 wfd_peer_clear_all(manager);
817 if (group->flags & WFD_GROUP_FLAG_AUTONOMOUS) {
818 wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
820 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
821 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
824 __WDS_LOG_FUNC_EXIT__;
828 static void __wfd_process_group_destroyed(wfd_manager_s *manager, wfd_oem_event_s *event)
830 __WDS_LOG_FUNC_ENTER__;
832 char peer_mac_address[MACSTR_LEN+1] = {0, };
833 unsigned char *peer_addr = wfd_session_get_peer_addr(manager->session);
835 if (peer_addr != NULL)
836 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
838 g_snprintf(peer_mac_address, MACSTR_LEN, "%s", "");
840 if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
841 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
843 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
844 WFD_EVENT_DISCONNECTION_RSP,
847 } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING && manager->session) {
848 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
850 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
851 WFD_EVENT_CONNECTION_RSP,
854 } else if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
855 if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
856 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
858 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
859 WFD_EVENT_DISCONNECTION_RSP,
862 wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
866 WDS_LOGD("Unexpected event(GROUP_DESTROYED). Ignore it");
867 __WDS_LOG_FUNC_EXIT__;
871 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
872 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
873 wfd_destroy_group(manager, event->ifname);
874 wfd_destroy_session(manager);
875 manager->local->dev_role = WFD_DEV_ROLE_NONE;
877 __WDS_LOG_FUNC_EXIT__;
881 static void __wfd_process_invitation_req(wfd_manager_s *manager, wfd_oem_event_s *event)
883 __WDS_LOG_FUNC_ENTER__;
885 wfd_device_s *peer = NULL;
886 wfd_session_s *session = NULL;
887 wfd_oem_invite_data_s *edata = NULL;
889 char peer_mac_address[MACSTR_LEN+1] = {0, };
891 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
893 WDS_LOGD("Invitation from unknown peer. Add new peer");
894 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
896 WDS_LOGE("Failed to add peer for invitation");
897 __WDS_LOG_FUNC_EXIT__;
901 peer->dev_role = WFD_DEV_ROLE_GO;
903 edata = (wfd_oem_invite_data_s*) event->edata;
904 memcpy(peer->intf_addr, edata->bssid, MACADDR_LEN);
905 wfd_update_peer_time(manager, event->dev_addr);
907 session = wfd_create_session(manager, event->dev_addr,
908 manager->req_wps_mode, SESSION_DIRECTION_INCOMING);
910 WDS_LOGE("Failed to create session");
911 __WDS_LOG_FUNC_EXIT__;
914 session->type = SESSION_TYPE_INVITE;
915 wfd_session_timer(session, 1);
917 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
919 res = wfd_session_start(session);
921 WDS_LOGE("Failed to start session");
922 __WDS_LOG_FUNC_EXIT__;
926 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
927 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
929 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
930 WFD_EVENT_CONNECTION_REQ,
933 __WDS_LOG_FUNC_EXIT__;
937 static void __wfd_process_invitation_res(wfd_manager_s *manager, wfd_oem_event_s *event)
939 __WDS_LOG_FUNC_ENTER__;
941 __WDS_LOG_FUNC_EXIT__;
945 static void __wfd_process_sta_connected(wfd_manager_s *manager, wfd_oem_event_s *event)
947 __WDS_LOG_FUNC_ENTER__;
949 wfd_session_s *session = (wfd_session_s*) manager->session;
950 wfd_group_s *group = (wfd_group_s*) manager->group;
951 wfd_device_s *peer = NULL;
952 char peer_mac_address[MACSTR_LEN+1] = {0, };
954 /* FIXME: Move this code to plugin */
955 if (!memcmp(event->intf_addr, manager->local->intf_addr, MACADDR_LEN)) {
956 WDS_LOGD("Ignore this event");
957 __WDS_LOG_FUNC_EXIT__;
961 if (ISZEROMACADDR(event->dev_addr)) {
962 WDS_LOGD("Legacy Peer Connected [Peer: " MACSTR "]", MAC2STR(event->intf_addr));
964 peer = wfd_peer_find_by_dev_addr(manager, event->intf_addr);
966 WDS_LOGI("Add legacy peer");
967 peer = wfd_add_peer(manager, event->intf_addr, "LEGACY-PEER");
969 WDS_LOGE("Failed to add Legacy peer.");
970 __WDS_LOG_FUNC_EXIT__;
975 memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
976 peer->state = WFD_PEER_STATE_CONNECTED;
977 peer->is_legacy = TRUE;
978 wfd_group_add_member(group, peer->dev_addr);
980 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
981 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
983 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
984 WFD_EVENT_CONNECTION_RSP,
987 wfd_util_dhcps_wait_ip_leased(peer);
988 __WDS_LOG_FUNC_EXIT__;
992 session = (wfd_session_s*) manager->session;
994 WDS_LOGD("Unexpected event. Session is NULL [peer: " MACSECSTR "]",
995 MAC2SECSTR(event->dev_addr));
996 wfd_oem_destroy_group(manager->oem_ops, GROUP_IFNAME);
997 wfd_destroy_group(manager, GROUP_IFNAME);
998 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
999 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1000 __WDS_LOG_FUNC_EXIT__;
1004 peer = wfd_session_get_peer(session);
1006 WDS_LOGE("Peer not found");
1007 __WDS_LOG_FUNC_EXIT__;
1011 group = (wfd_group_s*) manager->group;
1013 group = wfd_create_pending_group(manager, event->intf_addr);
1015 WDS_LOGE("Failed to create pending group");
1016 __WDS_LOG_FUNC_EXIT__;
1019 manager->group = group;
1021 wfd_group_add_member(group, peer->dev_addr);
1023 session->state = SESSION_STATE_COMPLETED;
1024 #ifndef CTRL_IFACE_DBUS
1025 memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
1026 #endif /* CTRL_IFACE_DBUS */
1027 peer->state = WFD_PEER_STATE_CONNECTED;
1029 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1030 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1032 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1033 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1035 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1036 WFD_EVENT_CONNECTION_RSP,
1039 #ifdef CTRL_IFACE_DBUS
1040 wfd_update_peer(manager, peer);
1041 #endif /* CTRL_IFACE_DBUS */
1042 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
1043 if (event->ip_addr_peer[3]) {
1044 peer->ip_type = WFD_IP_TYPE_OVER_EAPOL;
1045 memcpy(peer->client_ip_addr, event->ip_addr_peer, IPADDR_LEN);
1046 WDS_LOGE("Peer's client IP [" IPSTR "]", IP2STR((char*) &peer->client_ip_addr));
1047 memcpy(peer->go_ip_addr, manager->local->ip_addr, IPADDR_LEN);
1048 WDS_LOGE("Peer's GO IP [" IPSTR "]", IP2STR((char*) &peer->go_ip_addr));
1050 if (peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
1051 char peer_mac_address[MACSTR_LEN+1] = {0,};
1052 char assigned_ip_address[IPSTR_LEN+1] = {0,};
1054 memcpy(peer->ip_addr, peer->client_ip_addr, IPADDR_LEN);
1056 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1057 g_snprintf(assigned_ip_address, IPSTR_LEN, IPSTR, IP2STR(peer->ip_addr));
1058 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1060 g_variant_new("(ss)", peer_mac_address,
1061 assigned_ip_address));
1063 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
1064 wfd_util_dhcps_wait_ip_leased(peer);
1065 wfd_destroy_session(manager);
1067 __WDS_LOG_FUNC_EXIT__;
1071 static void __wfd_process_sta_disconnected(wfd_manager_s *manager, wfd_oem_event_s *event)
1073 __WDS_LOG_FUNC_ENTER__;
1075 wfd_group_s *group = NULL;
1076 wfd_device_s *peer = NULL;
1077 unsigned char peer_addr[MACADDR_LEN] = {0, };
1078 char peer_mac_address[MACSTR_LEN+1] = {0, };
1080 group = (wfd_group_s*) manager->group;
1082 WDS_LOGE("Group not found");
1083 __WDS_LOG_FUNC_EXIT__;
1087 if (ISZEROMACADDR(event->dev_addr)) {
1088 WDS_LOGD("Legacy Peer Disconnected [Peer: " MACSTR "]", MAC2STR(event->intf_addr));
1089 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->intf_addr));
1090 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1092 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1093 WFD_EVENT_DISCONNECTION_IND,
1096 wfd_group_remove_member(group, event->intf_addr);
1098 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1099 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1100 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1102 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1103 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1105 __WDS_LOG_FUNC_EXIT__;
1109 #ifdef CTRL_IFACE_DBUS
1110 peer = wfd_group_find_member_by_addr(group, event->dev_addr);
1111 #else /* CTRL_IFACE_DBUS */
1112 peer = wfd_group_find_member_by_addr(group, event->intf_addr);
1113 #endif /* DBUS_IFACE */
1115 WDS_LOGE("Failed to find connected peer");
1116 peer = wfd_session_get_peer(manager->session);
1118 WDS_LOGE("Failed to find connecting peer");
1119 __WDS_LOG_FUNC_EXIT__;
1123 #ifdef CTRL_IFACE_DBUS
1125 * If no peer connected and
1126 * disconnected event is not for connecting peer
1127 * then event should be ignored.
1128 * This situation can arrise when TV is GO and
1129 * some connected peer sent disassociation.
1131 if (memcmp(peer_addr, event->dev_addr, MACADDR_LEN)) {
1132 WDS_LOGE("Unexpected event, Ignore it...");
1133 __WDS_LOG_FUNC_EXIT__;
1136 #endif /* CTRL_DBUS_IFACE */
1138 memcpy(peer_addr, peer->dev_addr, MACADDR_LEN);
1141 * If state is not DISCONNECTING, connection is finished by peer.
1142 * Required the check also, when Device is Group Owner and state is DISCOVERING.
1144 if (manager->state >= WIFI_DIRECT_STATE_CONNECTED ||
1145 (manager->state == WIFI_DIRECT_STATE_DISCOVERING &&
1146 manager->local->dev_role == WFD_DEV_ROLE_GO)) {
1147 wfd_group_remove_member(group, peer_addr);
1148 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1149 if (group->member_count) {
1150 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1152 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1153 WFD_EVENT_DISASSOCIATION_IND,
1156 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1158 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1159 WFD_EVENT_DISCONNECTION_IND,
1163 } else if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
1164 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1165 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1167 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1168 WFD_EVENT_DISCONNECTION_RSP,
1171 } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING &&
1172 /* Some devices(GO) send disconnection message before connection completed.
1173 * This message should be ignored when device is not GO */
1174 manager->local->dev_role == WFD_DEV_ROLE_GO) {
1175 if (WFD_PEER_STATE_CONNECTED == peer->state) {
1176 WDS_LOGD("Peer is already Connected !!!");
1177 wfd_group_remove_member(group, peer_addr);
1178 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1179 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1181 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1182 WFD_EVENT_DISASSOCIATION_IND,
1185 } else if (WFD_PEER_STATE_CONNECTING == peer->state) {
1186 WDS_LOGD("Peer is Connecting...");
1187 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1188 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1190 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
1191 WFD_EVENT_CONNECTION_RSP,
1194 WDS_LOGE("Unexpected Peer State. Ignore it");
1195 __WDS_LOG_FUNC_EXIT__;
1199 WDS_LOGE("Unexpected event. Ignore it");
1200 __WDS_LOG_FUNC_EXIT__;
1204 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1205 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1206 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1208 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1209 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1212 /* If there is no member, GO should be destroyed */
1213 if (!group->member_count) {
1214 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1215 wfd_destroy_group(manager, group->ifname);
1216 wfd_peer_clear_all(manager);
1219 wfd_destroy_session(manager);
1221 __WDS_LOG_FUNC_EXIT__;
1225 static void __wfd_process_terminating(wfd_manager_s *manager, wfd_oem_event_s *event)
1227 __WDS_LOG_FUNC_ENTER__;
1229 __WDS_LOG_FUNC_EXIT__;
1233 static void __wfd_process_group_formation_failure(wfd_manager_s *manager, wfd_oem_event_s *event)
1235 __WDS_LOG_FUNC_ENTER__;
1237 wfd_session_s *session = (wfd_session_s*) manager->session;
1239 WDS_LOGE("Unexpected event. Session not exist");
1240 __WDS_LOG_FUNC_EXIT__;
1244 unsigned char *peer_addr = wfd_session_get_peer_addr(session);
1246 WDS_LOGE("Session do not has peer");
1247 __WDS_LOG_FUNC_EXIT__;
1251 char peer_mac_address[MACSTR_LEN+1] = {0, };
1252 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1253 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1255 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
1256 WFD_EVENT_CONNECTION_RSP,
1259 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1260 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1261 wfd_destroy_session(manager);
1262 manager->local->dev_role = WFD_DEV_ROLE_NONE;
1264 wfd_oem_refresh(manager->oem_ops);
1266 __WDS_LOG_FUNC_EXIT__;
1271 * This event is generated by supplicant when persitent invite is auto accepted
1272 * so that wfd-manager can get indication that a peer will be connected in near future.
1273 * session is started for that peer, so that it is not ignored when connected.
1275 static void __wfd_process_invitation_accepted(wfd_manager_s *manager, wfd_oem_event_s *event)
1278 __WDS_LOG_FUNC_ENTER__;
1280 wfd_session_s *session = (wfd_session_s*) manager->session;
1281 wfd_device_s *peer = NULL;
1282 char peer_mac_address[MACSTR_LEN+1] = {0, };
1284 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
1286 WDS_LOGI("Invitation from unknown peer. Add new peer");
1287 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
1289 WDS_LOGE("Failed to add peer for invitation");
1290 __WDS_LOG_FUNC_EXIT__;
1294 /**By default, peer device information is complete but there's some exception
1295 * if DEV-FOUND event was not preceding before connection start event.
1297 wfd_update_peer(manager, peer);
1298 peer->dev_role = WFD_DEV_ROLE_GO;
1301 session = wfd_create_session(manager, event->dev_addr,
1302 event->wps_mode, SESSION_DIRECTION_INCOMING);
1304 WDS_LOGE("Failed to create session with peer [" MACSTR "]",
1305 MAC2STR(event->dev_addr));
1306 __WDS_LOG_FUNC_EXIT__;
1311 session->state = SESSION_STATE_WPS;
1312 wfd_session_timer(session, 1);
1314 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1315 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1317 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1318 WFD_EVENT_CONNECTION_IN_PROGRESS,
1321 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
1322 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
1324 __WDS_LOG_FUNC_EXIT__;
1327 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1328 static void __wfd_process_serv_disc_resp(wfd_manager_s *manager, wfd_oem_event_s *event)
1330 __WDS_LOG_FUNC_ENTER__;
1332 char response_data[256] = {0, };
1333 char peer_mac_address[MACSTR_LEN+1] = {0, };
1335 wfd_update_peer_time(manager, event->dev_addr);
1337 if (event->edata_type == WFD_OEM_EDATA_TYPE_NEW_SERVICE) {
1338 wfd_oem_new_service_s *service = NULL;;
1340 GList *services = (GList*) event->edata;
1343 WDS_LOGD("%d service data found", event->dev_role);
1345 temp = g_list_first(services);
1346 while (temp && count < event->dev_role) {
1347 service = (wfd_oem_new_service_s*) temp->data;
1348 service_type = service->protocol;
1349 if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
1350 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1351 g_snprintf(response_data, 256, "%s|%s", service->data.bonjour.query, service->data.bonjour.rdata);
1352 WDS_LOGD("Found service: [%d: %s] - [" MACSECSTR "]", service->protocol,
1353 service->data.bonjour.query, MAC2SECSTR(event->dev_addr));
1355 WDS_LOGD("Found service is not supported");
1359 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
1361 g_variant_new("(iss)", service_type,
1365 temp = g_list_next(temp);
1369 } else if (event->edata_type == WFD_OEM_EDATA_TYPE_SERVICE) {
1370 wfd_oem_service_data_s *edata = (wfd_oem_service_data_s*) event->edata;
1375 service_type = edata->type;
1376 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1377 switch (edata->type) {
1378 WDS_LOGE("Unknown type [type ID: %d]", edata->type);
1382 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
1384 g_variant_new("(iss)", service_type,
1389 __WDS_LOG_FUNC_EXIT__;
1393 static void __wfd_process_serv_disc_started(wfd_manager_s *manager, wfd_oem_event_s *event)
1395 __WDS_LOG_FUNC_ENTER__;
1397 __WDS_LOG_FUNC_EXIT__;
1400 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1403 #if defined(TIZEN_FEATURE_ASP)
1404 static void __wfd_process_asp_serv_resp(wfd_manager_s *manager, wfd_oem_event_s *event)
1406 __WDS_LOG_FUNC_ENTER__;
1408 wfd_oem_asp_service_s *service = NULL;
1409 GVariantBuilder *builder = NULL;
1410 GVariant *params = NULL;
1412 service = (wfd_oem_asp_service_s *)event->edata;
1413 if (service == NULL) {
1414 WDS_LOGE("P2P service found event has NULL information");
1415 __WDS_LOG_FUNC_EXIT__;
1419 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1420 g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("u", service->search_id));
1421 g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", event->dev_addr));
1422 g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
1423 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
1424 if (service->service_type)
1425 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type));
1426 if (service->service_info)
1427 g_variant_builder_add(builder, "{sv}", "service_info", g_variant_new("s", service->service_info));
1428 g_variant_builder_add(builder, "{sv}", "status", g_variant_new("y", service->status));
1429 params = g_variant_new("(a{sv})", builder);
1430 g_variant_builder_unref(builder);
1432 wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
1436 __WDS_LOG_FUNC_EXIT__;
1439 #endif /* TIZEN_FEATURE_ASP */
1443 void (*function) (wfd_manager_s *manager, wfd_oem_event_s *event);
1444 } wfd_oem_event_map[] = {
1450 WFD_OEM_EVENT_DEACTIVATED,
1451 __wfd_process_deactivated
1454 WFD_OEM_EVENT_PEER_FOUND,
1455 __wfd_process_peer_found
1458 WFD_OEM_EVENT_PEER_DISAPPEARED,
1459 __wfd_process_peer_disappeared
1462 WFD_OEM_EVENT_DISCOVERY_FINISHED,
1463 __wfd_process_discovery_finished
1466 WFD_OEM_EVENT_PROV_DISC_REQ,
1467 __wfd_process_prov_disc_req
1470 WFD_OEM_EVENT_PROV_DISC_RESP,
1471 __wfd_process_prov_disc_resp
1474 WFD_OEM_EVENT_PROV_DISC_FAIL,
1475 __wfd_process_prov_disc_fail
1478 WFD_OEM_EVENT_GO_NEG_REQ,
1479 __wfd_process_go_neg_req
1482 WFD_OEM_EVENT_GO_NEG_FAIL,
1483 __wfd_process_go_neg_fail
1486 WFD_OEM_EVENT_GO_NEG_DONE,
1487 __wfd_process_go_neg_done
1490 WFD_OEM_EVENT_WPS_FAIL,
1491 __wfd_process_wps_fail
1494 WFD_OEM_EVENT_WPS_DONE,
1495 __wfd_process_wps_done
1498 WFD_OEM_EVENT_KEY_NEG_FAIL,
1499 __wfd_process_key_neg_fail
1502 WFD_OEM_EVENT_KEY_NEG_DONE,
1503 __wfd_process_key_neg_done
1506 WFD_OEM_EVENT_CONN_FAIL,
1507 __wfd_process_conn_fail
1510 WFD_OEM_EVENT_CONN_DONE,
1511 __wfd_process_conn_done
1514 WFD_OEM_EVENT_GROUP_CREATED,
1515 __wfd_process_group_created
1518 WFD_OEM_EVENT_GROUP_DESTROYED,
1519 __wfd_process_group_destroyed
1522 WFD_OEM_EVENT_INVITATION_REQ,
1523 __wfd_process_invitation_req
1526 WFD_OEM_EVENT_INVITATION_RES,
1527 __wfd_process_invitation_res
1530 WFD_OEM_EVENT_STA_CONNECTED,
1531 __wfd_process_sta_connected
1534 WFD_OEM_EVENT_STA_DISCONNECTED,
1535 __wfd_process_sta_disconnected
1538 WFD_OEM_EVENT_TERMINATING,
1539 __wfd_process_terminating
1542 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1544 WFD_OEM_EVENT_SERV_DISC_RESP,
1545 __wfd_process_serv_disc_resp
1548 WFD_OEM_EVENT_SERV_DISC_STARTED,
1549 __wfd_process_serv_disc_started
1551 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1553 WFD_OEM_EVENT_GROUP_FORMATION_FAILURE,
1554 __wfd_process_group_formation_failure
1557 WFD_OEM_EVENT_INVITATION_ACCEPTED,
1558 __wfd_process_invitation_accepted
1560 #if defined(TIZEN_FEATURE_ASP)
1562 WFD_OEM_EVENT_ASP_SERV_RESP,
1563 __wfd_process_asp_serv_resp,
1565 #endif /* TIZEN_FEATURE_ASP */
1572 int wfd_process_event(void *user_data, void *data)
1574 __WDS_LOG_FUNC_ENTER__;
1575 wfd_manager_s *manager = NULL;
1576 wfd_oem_event_s *event = NULL;
1578 manager = (wfd_manager_s*) user_data;
1579 event = (wfd_oem_event_s*) data;
1580 if (!manager || !event) {
1581 WDS_LOGE("Invalid parameter");
1582 __WDS_LOG_FUNC_EXIT__;
1586 WDS_LOGD("Event[%d] from " MACSECSTR, event->event_id,
1587 MAC2SECSTR(event->dev_addr));
1589 if (event->event_id > WFD_OEM_EVENT_NONE &&
1590 event->event_id < WFD_OEM_EVENT_MAX)
1591 wfd_oem_event_map[event->event_id].function(manager, event);
1593 WDS_LOGE("Invalid event ID");
1595 __WDS_LOG_FUNC_EXIT__;