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 */
56 static int _wfd_event_update_peer(wfd_manager_s *manager, wfd_oem_dev_data_s *data)
58 __WDS_LOG_FUNC_ENTER__;
60 wfd_device_s *peer = NULL;
62 if (!manager || !data) {
63 WDS_LOGE("Invalid parameter");
64 __WDS_LOG_FUNC_EXIT__;
68 peer = wfd_peer_find_by_dev_addr(manager, data->p2p_dev_addr);
70 peer = wfd_add_peer(manager, data->p2p_dev_addr, data->name);
72 WDS_LOGE("Failed to add peer");
73 __WDS_LOG_FUNC_EXIT__;
77 if (strcmp(peer->dev_name, data->name)) {
78 g_strlcpy(peer->dev_name, data->name, DEV_NAME_LEN + 1);
79 WDS_LOGD("Device name is changed [" MACSECSTR ": %s]",
80 MAC2SECSTR(peer->dev_addr), peer->dev_name);
83 #ifndef CTRL_IFACE_DBUS
84 memcpy(peer->intf_addr, data->p2p_intf_addr, MACADDR_LEN);
85 #endif /* CTRL_IFACE_DBUS */
86 peer->pri_dev_type = data->pri_dev_type;
87 peer->sec_dev_type = data->sec_dev_type;
88 peer->config_methods = data->config_methods;
89 peer->dev_flags = data->dev_flags;
90 peer->group_flags = data->group_flags;
91 peer->dev_role = data->dev_role;
92 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
93 memcpy(&(peer->display), &(data->display), sizeof(wfd_display_s));
94 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
96 #if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
97 wfd_util_get_current_time(&peer->time);
100 gettimeofday(&tval, NULL);
101 peer->time = tval.tv_sec;
103 WDS_LOGI("Update time [%s - %ld]", peer->dev_name, peer->time);
105 __WDS_LOG_FUNC_EXIT__;
109 gboolean _wfd_connection_retry(gpointer *data)
111 wfd_session_s *session = (wfd_session_s*) data;
113 WDS_LOGE("Session is NULL");
114 __WDS_LOG_FUNC_EXIT__;
115 return G_SOURCE_REMOVE;
118 switch (session->state) {
119 case SESSION_STATE_STARTED:
120 WDS_LOGD("PD again");
121 wfd_session_start(session);
123 case SESSION_STATE_GO_NEG:
124 WDS_LOGD("Negotiation again");
125 wfd_session_connect(session);
127 case SESSION_STATE_WPS:
128 WDS_LOGD("WPS again");
129 wfd_session_wps(session);
132 WDS_LOGE("Invalid session state [%d]", session->state);
135 __WDS_LOG_FUNC_EXIT__;
136 return G_SOURCE_REMOVE;
139 void wfd_event_deactivated(wfd_oem_event_s *event)
141 __WDS_LOG_FUNC_ENTER__;
143 wfd_manager_s *manager = wfd_get_manager();
145 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
147 g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE));
149 wfd_destroy_group(manager);
150 wfd_destroy_session(manager);
151 wfd_peer_clear_all(manager);
152 wfd_local_reset_data(manager);
154 wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATED);
155 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATED);
156 manager->req_wps_mode = WFD_WPS_MODE_PBC;
158 #ifdef TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT
159 wfd_util_stop_wifi_direct_popup();
160 #endif /* TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT */
161 __WDS_LOG_FUNC_EXIT__;
165 void wfd_event_peer_found(wfd_oem_event_s *event)
167 __WDS_LOG_FUNC_ENTER__;
169 wfd_manager_s *manager = wfd_get_manager();
170 wfd_oem_dev_data_s *edata = NULL;
171 char peer_mac_address[MACSTR_LEN+1] = {0, };
174 edata = (wfd_oem_dev_data_s*) event->edata;
175 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
176 WDS_LOGE("Invalid event data");
177 __WDS_LOG_FUNC_EXIT__;
181 res = _wfd_event_update_peer(manager, edata);
183 WDS_LOGE("Failed to update peer data");
184 __WDS_LOG_FUNC_EXIT__;
188 if (manager->state > WIFI_DIRECT_STATE_ACTIVATING &&
189 manager->state != WIFI_DIRECT_STATE_CONNECTING &&
190 manager->state != WIFI_DIRECT_STATE_DISCONNECTING) {
191 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(edata->p2p_dev_addr));
192 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
194 g_variant_new("(s)", peer_mac_address));
197 #if defined(TIZEN_FEATURE_ASP)
200 GVariantBuilder *builder = NULL;
201 GVariant *params = NULL;
202 wfd_oem_advertise_service_s *service;
204 for (list = (GList *)event->asp_services; list != NULL; list = list->next) {
205 service = (wfd_oem_advertise_service_s *)list->data;
207 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
208 g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("t", service->search_id));
209 g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", peer_mac_address));
210 g_variant_builder_add(builder, "{sv}", "device_name", g_variant_new("s", edata->name));
211 g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
212 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
213 if (service->service_type)
214 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type));
215 params = g_variant_new("(a{sv})", builder);
216 g_variant_builder_unref(builder);
218 wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
223 __WDS_LOG_FUNC_EXIT__;
227 void wfd_event_peer_disappeared(wfd_oem_event_s *event)
229 __WDS_LOG_FUNC_ENTER__;
231 wfd_manager_s *manager = wfd_get_manager();
232 wfd_session_s *session = NULL;
233 wfd_device_s *peer = NULL;
234 char peer_mac_address[MACSTR_LEN+1] = {0, };
236 session = manager->session;
237 if (session != NULL && session->peer != NULL) {
238 peer = session->peer;
239 WDS_LOGD("session peer [" MACSTR "] lost peer [" MACSTR "]", MAC2STR(peer->dev_addr),
240 MAC2STR(event->dev_addr));
241 if (memcmp(peer->dev_addr, event->dev_addr, MACADDR_LEN) == 0) {
242 WDS_LOGD("peer already in connection");
247 wfd_remove_peer(manager, event->dev_addr);
249 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
250 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
252 g_variant_new("(s)", peer_mac_address));
254 __WDS_LOG_FUNC_EXIT__;
258 void wfd_event_discovery_finished(wfd_oem_event_s *event)
260 __WDS_LOG_FUNC_ENTER__;
262 wfd_manager_s *manager = wfd_get_manager();
264 if (manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
265 manager->state != WIFI_DIRECT_STATE_ACTIVATED) {
266 WDS_LOGE("Notify finding stopped when discovering or activated. [%d]", manager->state);
267 __WDS_LOG_FUNC_EXIT__;
271 if (manager->scan_mode == WFD_SCAN_MODE_PASSIVE) {
272 WDS_LOGE("During passive scan, Discover Finished event will not notified");
273 __WDS_LOG_FUNC_EXIT__;
277 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
278 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
279 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
281 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
282 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
284 manager->scan_mode = WFD_SCAN_MODE_NONE;
286 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
290 __WDS_LOG_FUNC_EXIT__;
294 void wfd_event_prov_disc_req(wfd_oem_event_s *event)
296 __WDS_LOG_FUNC_ENTER__;
298 wfd_manager_s *manager = wfd_get_manager();
299 wfd_device_s *peer = NULL;
301 wfd_group_s *group = (wfd_group_s*) manager->group;
303 if (group && group->role == WFD_DEV_ROLE_GC) {
304 WDS_LOGD("Device has GC role - ignore this provision request");
305 __WDS_LOG_FUNC_EXIT__;
309 #ifdef CTRL_IFACE_DBUS
310 wfd_oem_dev_data_s *edata = NULL;
312 edata = (wfd_oem_dev_data_s*) event->edata;
313 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
314 WDS_LOGE("Invalid event data");
315 __WDS_LOG_FUNC_EXIT__;
319 res = _wfd_event_update_peer(manager, edata);
320 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
321 #else /* CTRL_IFACE_DBUS */
322 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
324 WDS_LOGD("Prov_disc from unknown peer. Add new peer");
325 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
327 WDS_LOGE("Failed to add peer for invitation");
328 __WDS_LOG_FUNC_EXIT__;
331 wfd_update_peer(manager, peer);
333 wfd_update_peer_time(manager, event->dev_addr);
334 #endif /* CTRL_IFACE_DBUS */
336 if (WFD_DEV_ROLE_GO != manager->local->dev_role) {
337 WDS_LOGI("TV is not GO, updated peer data only.");
339 manager->local->wps_mode = event->wps_mode;
340 if (event->wps_mode == WFD_WPS_MODE_PBC ||
341 event->wps_mode == WFD_WPS_MODE_KEYPAD) {
342 __WDS_LOG_FUNC_EXIT__;
348 if (WFD_PEER_STATE_DISCOVERED < peer->state) {
349 WDS_LOGD("Peer already connected/connecting, ignore this provision request");
350 __WDS_LOG_FUNC_EXIT__;
354 peer->state = WFD_PEER_STATE_CONNECTING;
357 res = wfd_session_process_event(manager, event);
359 WDS_LOGE("Failed to process event of session");
361 __WDS_LOG_FUNC_EXIT__;
365 void wfd_event_prov_disc_resp(wfd_oem_event_s *event)
367 __WDS_LOG_FUNC_ENTER__;
369 wfd_manager_s *manager = wfd_get_manager();
370 wfd_device_s *peer = NULL;
373 #ifdef CTRL_IFACE_DBUS
374 wfd_oem_dev_data_s *edata = NULL;
376 edata = (wfd_oem_dev_data_s*) event->edata;
377 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
378 WDS_LOGE("Invalid event data");
379 __WDS_LOG_FUNC_EXIT__;
383 res = _wfd_event_update_peer(manager, edata);
384 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
386 peer->state = WFD_PEER_STATE_CONNECTING;
387 #else /* CTRL_IFACE_DBUS */
388 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
390 WDS_LOGD("Prov_disc from unknown peer. Add new peer");
391 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
393 WDS_LOGE("Failed to add peer for invitation");
394 __WDS_LOG_FUNC_EXIT__;
397 peer->state = WFD_PEER_STATE_CONNECTING;
398 wfd_update_peer(manager, peer);
400 wfd_update_peer_time(manager, event->dev_addr);
401 #endif /* CTRL_IFACE_DBUS */
403 res = wfd_session_process_event(manager, event);
405 WDS_LOGE("Failed to process event of session");
407 __WDS_LOG_FUNC_EXIT__;
411 void wfd_event_prov_disc_fail(wfd_oem_event_s *event)
413 __WDS_LOG_FUNC_ENTER__;
415 wfd_manager_s *manager = wfd_get_manager();
416 wfd_session_s *session = NULL;
417 unsigned char *peer_addr = NULL;
418 char peer_mac_address[MACSTR_LEN+1] = {0, };
419 #if defined(TIZEN_FEATURE_ASP)
420 wfd_oem_asp_prov_s *prov_params = NULL;
421 prov_params = (wfd_oem_asp_prov_s *)event->edata;
424 session = (wfd_session_s*) manager->session;
426 WDS_LOGE("Unexpected event. Session not exist");
427 __WDS_LOG_FUNC_EXIT__;
431 peer_addr = wfd_session_get_peer_addr(session);
433 WDS_LOGE("Session do not have peer");
434 __WDS_LOG_FUNC_EXIT__;
437 #if defined(TIZEN_FEATURE_ASP)
438 if (!ISZEROMACADDR(session->session_mac)) {
439 /* This connection is for ASP session */
440 if (prov_params->status == WFD_OEM_SC_FAIL_INVALID_PARAMS) {
441 wfd_oem_scan_param_s param;
443 WDS_LOGD("ASP prov disc deferred. wait response.");
444 wfd_asp_connect_status(session->session_mac,
446 ASP_CONNECT_STATUS_REQUEST_DEFERRED,
448 /* start listen to wait for provision discovery request from peer */
449 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
450 param.scan_mode = WFD_OEM_SCAN_MODE_PASSIVE;
451 wfd_oem_start_scan(manager->oem_ops, ¶m);
452 __WDS_LOG_FUNC_EXIT__;
457 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
458 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
460 g_variant_new("(iis)",
461 WIFI_DIRECT_ERROR_CONNECTION_FAILED,
462 WFD_EVENT_CONNECTION_RSP,
464 #if defined(TIZEN_FEATURE_ASP)
465 WDS_LOGD("ASP prov disc failed. remove session.");
466 wfd_asp_connect_status(session->session_mac,
468 ASP_CONNECT_STATUS_REQUEST_FAILED,
472 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
473 wfd_group_s *group = (wfd_group_s*) manager->group;
474 if (group && !group->member_count &&
475 wfd_util_is_remove_group_allowed()) {
476 wfd_destroy_group(manager);
478 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
479 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
481 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
482 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
485 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
486 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
489 wfd_destroy_session(manager);
491 wfd_oem_refresh(manager->oem_ops);
493 /* After connection failed, scan again */
494 wfd_oem_scan_param_s param;
495 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
496 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
498 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
499 wfd_oem_start_scan(manager->oem_ops, ¶m);
500 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
502 __WDS_LOG_FUNC_EXIT__;
506 void wfd_event_go_neg_req(wfd_oem_event_s *event)
508 __WDS_LOG_FUNC_ENTER__;
510 wfd_manager_s *manager = wfd_get_manager();
511 wfd_group_s *group = (wfd_group_s*) manager->group;
512 if (group && group->role == WFD_DEV_ROLE_GC) {
513 WDS_LOGD("Device has GC role - ignore this go neg request");
514 __WDS_LOG_FUNC_EXIT__;
518 #ifdef CTRL_IFACE_DBUS
519 wfd_oem_dev_data_s *edata = NULL;
522 edata = (wfd_oem_dev_data_s*) event->edata;
523 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
524 WDS_LOGE("Invalid event data");
525 __WDS_LOG_FUNC_EXIT__;
529 res = _wfd_event_update_peer(manager, edata);
531 WDS_LOGE("Failed to update peer data");
532 __WDS_LOG_FUNC_EXIT__;
535 #else /* CTRL_IFACE_DBUS */
536 wfd_oem_conn_data_s *edata = NULL;
537 wfd_device_s *peer = NULL;
539 edata = (wfd_oem_conn_data_s*) event->edata;
540 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_CONN) {
541 WDS_LOGE("Invalid connection event data");
542 __WDS_LOG_FUNC_EXIT__;
546 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
548 WDS_LOGD("Invitation from unknown peer. Add new peer");
549 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
551 WDS_LOGE("Failed to add peer for invitation");
552 __WDS_LOG_FUNC_EXIT__;
557 if (edata->wps_mode == 0)
560 event->wps_mode = edata->wps_mode;
561 #endif /* CTRL_IFACE_DBUS */
563 wfd_session_process_event(manager, event);
564 __WDS_LOG_FUNC_EXIT__;
568 void wfd_event_go_neg_fail(wfd_oem_event_s *event)
570 __WDS_LOG_FUNC_ENTER__;
572 wfd_manager_s *manager = wfd_get_manager();
573 wfd_session_s *session = NULL;
574 wfd_oem_conn_data_s *edata = NULL;
575 unsigned char *peer_addr = NULL;
576 char peer_mac_address[MACSTR_LEN] = {0, };
578 session = (wfd_session_s*) manager->session;
580 WDS_LOGE("Unexpected event. Session not exist");
581 __WDS_LOG_FUNC_EXIT__;
585 peer_addr = wfd_session_get_peer_addr(session);
587 WDS_LOGE("Session do not have peer");
588 __WDS_LOG_FUNC_EXIT__;
592 edata = (wfd_oem_conn_data_s*) event->edata;
594 WDS_LOGE("Invalid p2p connection data");
595 __WDS_LOG_FUNC_EXIT__;
599 if (edata->status < 0 && session->connecting_120) {
600 if (session->retry_gsrc) {
601 g_source_remove(session->retry_gsrc);
602 session->retry_gsrc = 0;
604 session->retry_gsrc = g_idle_add((GSourceFunc) _wfd_connection_retry, session);
605 WDS_LOGD("Connection will be retried");
606 __WDS_LOG_FUNC_EXIT__;
610 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
611 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
613 g_variant_new("(iis)",
614 WIFI_DIRECT_ERROR_CONNECTION_FAILED,
615 WFD_EVENT_CONNECTION_RSP,
618 #if defined(TIZEN_FEATURE_ASP)
619 if (!ISZEROMACADDR(session->session_mac))
620 wfd_asp_connect_status(session->session_mac,
622 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
626 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
627 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
629 wfd_destroy_group(manager);
630 wfd_destroy_session(manager);
631 manager->local->dev_role = WFD_DEV_ROLE_NONE;
632 __WDS_LOG_FUNC_EXIT__;
636 void wfd_event_go_neg_done(wfd_oem_event_s *event)
638 __WDS_LOG_FUNC_ENTER__;
640 #ifdef CTRL_IFACE_DBUS
641 wfd_manager_s *manager = wfd_get_manager();
642 wfd_session_s *session = NULL;
643 wfd_oem_conn_data_s *edata = NULL;
644 wfd_device_s *peer = NULL;
646 edata = (wfd_oem_conn_data_s*) event->edata;
648 WDS_LOGE("Invalid event data");
649 __WDS_LOG_FUNC_EXIT__;
653 session = (wfd_session_s*) manager->session;
654 if (session && session->peer) {
655 peer = session->peer;
656 memcpy(peer->intf_addr, edata->peer_intf_addr, MACADDR_LEN);
659 wfd_session_process_event(manager, event);
660 #endif /* CTRL_IFACE_DBUS */
661 __WDS_LOG_FUNC_EXIT__;
665 void wfd_event_wps_fail(wfd_oem_event_s *event)
667 __WDS_LOG_FUNC_ENTER__;
669 wfd_manager_s *manager = wfd_get_manager();
670 wfd_session_s *session = NULL;
671 unsigned char *peer_addr = NULL;
673 session = (wfd_session_s*) manager->session;
675 WDS_LOGE("Unexpected event. Session not exist");
676 __WDS_LOG_FUNC_EXIT__;
680 peer_addr = wfd_session_get_peer_addr(session);
682 WDS_LOGE("Session do not have peer");
683 __WDS_LOG_FUNC_EXIT__;
687 char peer_mac_address[MACSTR_LEN+1] = {0, };
688 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
689 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
691 g_variant_new("(iis)",
692 WIFI_DIRECT_ERROR_CONNECTION_FAILED,
693 WFD_EVENT_CONNECTION_RSP,
695 #if defined(TIZEN_FEATURE_ASP)
696 if (!ISZEROMACADDR(session->session_mac))
697 wfd_asp_connect_status(session->session_mac,
699 ASP_CONNECT_STATUS_GROUP_FORMATION_STARTED,
702 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
703 wfd_group_s *group = (wfd_group_s*) manager->group;
704 if (group && !group->member_count &&
705 wfd_util_is_remove_group_allowed()) {
706 wfd_destroy_group(manager);
708 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
709 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
711 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
712 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
715 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
716 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
719 wfd_destroy_session(manager);
721 wfd_oem_refresh(manager->oem_ops);
723 /* After connection failed, scan again */
724 wfd_oem_scan_param_s param;
725 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
726 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
728 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
729 wfd_oem_start_scan(manager->oem_ops, ¶m);
730 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
732 __WDS_LOG_FUNC_EXIT__;
736 void wfd_event_wps_done(wfd_oem_event_s *event)
738 __WDS_LOG_FUNC_ENTER__;
740 wfd_manager_s *manager = wfd_get_manager();
741 wfd_session_process_event(manager, event);
743 __WDS_LOG_FUNC_EXIT__;
747 void wfd_event_key_neg_fail(wfd_oem_event_s *event)
749 __WDS_LOG_FUNC_ENTER__;
751 wfd_manager_s *manager = wfd_get_manager();
752 wfd_session_s *session = NULL;
753 unsigned char *peer_addr = NULL;
754 char peer_mac_address[MACSTR_LEN+1] = {0, };
756 session = (wfd_session_s*) manager->session;
758 WDS_LOGE("Unexpected event. Session not exist");
759 __WDS_LOG_FUNC_EXIT__;
763 peer_addr = wfd_session_get_peer_addr(session);
765 WDS_LOGE("Session do not has peer");
766 __WDS_LOG_FUNC_EXIT__;
770 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
771 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
773 g_variant_new("(iis)",
774 WIFI_DIRECT_ERROR_CONNECTION_FAILED,
775 WFD_EVENT_CONNECTION_RSP,
777 #if defined(TIZEN_FEATURE_ASP)
778 if (!ISZEROMACADDR(session->session_mac))
779 wfd_asp_connect_status(session->session_mac,
781 ASP_CONNECT_STATUS_GROUP_FORMATION_STARTED,
784 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
785 wfd_group_s *group = (wfd_group_s*) manager->group;
786 if (group && !group->member_count &&
787 wfd_util_is_remove_group_allowed()) {
788 wfd_destroy_group(manager);
790 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
791 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
793 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
794 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
797 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
798 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
801 wfd_destroy_session(manager);
803 wfd_oem_refresh(manager->oem_ops);
805 /* After connection failed, scan again */
806 wfd_oem_scan_param_s param;
807 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
808 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
810 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
811 wfd_oem_start_scan(manager->oem_ops, ¶m);
812 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
814 __WDS_LOG_FUNC_EXIT__;
818 void wfd_event_key_neg_done(wfd_oem_event_s *event)
820 __WDS_LOG_FUNC_ENTER__;
822 __WDS_LOG_FUNC_EXIT__;
826 void wfd_event_conn_fail(wfd_oem_event_s *event)
828 __WDS_LOG_FUNC_ENTER__;
830 __WDS_LOG_FUNC_EXIT__;
834 void wfd_event_conn_done(wfd_oem_event_s *event)
836 __WDS_LOG_FUNC_ENTER__;
838 __WDS_LOG_FUNC_EXIT__;
842 void wfd_event_group_created(wfd_oem_event_s *event)
844 __WDS_LOG_FUNC_ENTER__;
846 wfd_manager_s *manager = wfd_get_manager();
847 wfd_group_s *group = (wfd_group_s*) manager->group;
848 wfd_session_s *session = (wfd_session_s*) manager->session;
851 group = wfd_create_pending_group(manager, event->intf_addr);
853 WDS_LOGE("Failed to create pending group");
854 __WDS_LOG_FUNC_EXIT__;
858 manager->group = group;
861 wfd_group_complete(manager, event);
863 if (group->role == WFD_DEV_ROLE_GC && session) {
864 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
865 wfd_device_s *peer = session->peer;
867 WDS_LOGE("Unexpected event. Peer doesn't exist");
871 wfd_update_peer(manager, peer);
873 if (peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
874 char peer_mac_address[MACSTR_LEN+1] = {0, };
876 wfd_util_ip_over_eap_assign(peer, event->ifname);
878 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
879 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
881 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
882 WFD_EVENT_CONNECTION_RSP,
884 #if defined(TIZEN_FEATURE_ASP)
885 if (!ISZEROMACADDR(session->session_mac))
886 wfd_asp_connect_status(session->session_mac,
888 ASP_CONNECT_STATUS_GROUP_FORMATION_COMPLETED,
891 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
892 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
894 wfd_destroy_session(manager);
896 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
897 wfd_peer_clear_all(manager);
899 if (group->flags & WFD_GROUP_FLAG_AUTONOMOUS) {
900 wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
902 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
903 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
906 __WDS_LOG_FUNC_EXIT__;
910 void wfd_event_group_destroyed(wfd_oem_event_s *event)
912 __WDS_LOG_FUNC_ENTER__;
914 wfd_manager_s *manager = wfd_get_manager();
915 char peer_mac_address[MACSTR_LEN+1] = {0, };
916 unsigned char *peer_addr = wfd_session_get_peer_addr(manager->session);
918 if (peer_addr != NULL)
919 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
921 g_snprintf(peer_mac_address, MACSTR_LEN, "%s", "");
923 if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
924 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
926 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
927 WFD_EVENT_DISCONNECTION_RSP,
930 } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING && manager->session) {
931 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
933 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
934 WFD_EVENT_CONNECTION_RSP,
936 #if defined(TIZEN_FEATURE_ASP)
937 wfd_session_s *session = manager->session;
938 if (!ISZEROMACADDR(session->session_mac))
939 wfd_asp_connect_status(session->session_mac,
941 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
944 } else if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
945 if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
946 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
948 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
949 WFD_EVENT_DISCONNECTION_RSP,
952 wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
956 WDS_LOGD("Unexpected event(GROUP_DESTROYED). Ignore it");
957 __WDS_LOG_FUNC_EXIT__;
961 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
962 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
963 wfd_destroy_group(manager);
964 wfd_destroy_session(manager);
965 manager->local->dev_role = WFD_DEV_ROLE_NONE;
967 __WDS_LOG_FUNC_EXIT__;
971 void wfd_event_invitation_req(wfd_oem_event_s *event)
973 __WDS_LOG_FUNC_ENTER__;
975 wfd_manager_s *manager = wfd_get_manager();
976 wfd_device_s *peer = NULL;
977 wfd_session_s *session = NULL;
978 wfd_oem_invite_data_s *edata = NULL;
980 char peer_mac_address[MACSTR_LEN+1] = {0, };
982 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
984 WDS_LOGD("Invitation from unknown peer. Add new peer");
985 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
987 WDS_LOGE("Failed to add peer for invitation");
988 __WDS_LOG_FUNC_EXIT__;
992 peer->dev_role = WFD_DEV_ROLE_GO;
994 edata = (wfd_oem_invite_data_s*) event->edata;
995 memcpy(peer->intf_addr, edata->bssid, MACADDR_LEN);
996 wfd_update_peer_time(manager, event->dev_addr);
998 session = wfd_create_session(manager, event->dev_addr,
999 manager->req_wps_mode, SESSION_DIRECTION_INCOMING);
1001 WDS_LOGE("Failed to create session");
1002 __WDS_LOG_FUNC_EXIT__;
1005 session->type = SESSION_TYPE_INVITE;
1006 wfd_session_timer(session, 1);
1008 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
1010 res = wfd_session_start(session);
1012 WDS_LOGE("Failed to start session");
1013 __WDS_LOG_FUNC_EXIT__;
1017 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1018 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1020 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1021 WFD_EVENT_CONNECTION_REQ,
1024 __WDS_LOG_FUNC_EXIT__;
1028 void wfd_event_invitation_res(wfd_oem_event_s *event)
1030 __WDS_LOG_FUNC_ENTER__;
1032 __WDS_LOG_FUNC_EXIT__;
1036 void wfd_event_sta_connected(wfd_oem_event_s *event)
1038 __WDS_LOG_FUNC_ENTER__;
1040 wfd_manager_s *manager = wfd_get_manager();
1041 wfd_session_s *session = (wfd_session_s*) manager->session;
1042 wfd_group_s *group = (wfd_group_s*) manager->group;
1043 wfd_device_s *peer = NULL;
1044 char peer_mac_address[MACSTR_LEN+1] = {0, };
1046 /* FIXME: Move this code to plugin */
1047 if (!memcmp(event->intf_addr, manager->local->intf_addr, MACADDR_LEN)) {
1048 WDS_LOGD("Ignore this event");
1049 __WDS_LOG_FUNC_EXIT__;
1053 if (ISZEROMACADDR(event->dev_addr)) {
1054 WDS_LOGD("Legacy Peer Connected [Peer: " MACSTR "]", MAC2STR(event->intf_addr));
1056 peer = wfd_peer_find_by_addr(manager, event->intf_addr);
1058 WDS_LOGI("Add legacy peer");
1059 peer = wfd_add_peer(manager, event->intf_addr, "LEGACY-PEER");
1061 WDS_LOGE("Failed to add Legacy peer.");
1062 __WDS_LOG_FUNC_EXIT__;
1067 if (wfd_group_add_member(group, peer->dev_addr) == -1) {
1068 WDS_LOGE("Failed to add Legacy peer.");
1069 __WDS_LOG_FUNC_EXIT__;
1073 memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
1074 peer->state = WFD_PEER_STATE_CONNECTED;
1075 peer->is_p2p = FALSE;
1077 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1078 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1080 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1081 WFD_EVENT_CONNECTION_RSP,
1084 wfd_util_dhcps_wait_ip_leased(peer);
1085 __WDS_LOG_FUNC_EXIT__;
1089 session = (wfd_session_s*) manager->session;
1091 WDS_LOGD("Unexpected event. Session is NULL [peer: " MACSECSTR "]",
1092 MAC2SECSTR(event->dev_addr));
1094 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1095 wfd_destroy_group(manager);
1097 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1098 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1099 __WDS_LOG_FUNC_EXIT__;
1103 peer = wfd_session_get_peer(session);
1105 WDS_LOGE("Peer not found");
1106 __WDS_LOG_FUNC_EXIT__;
1110 group = (wfd_group_s*) manager->group;
1112 group = wfd_create_pending_group(manager, event->intf_addr);
1114 WDS_LOGE("Failed to create pending group");
1115 __WDS_LOG_FUNC_EXIT__;
1118 manager->group = group;
1120 wfd_group_add_member(group, peer->dev_addr);
1122 session->state = SESSION_STATE_COMPLETED;
1123 #ifndef CTRL_IFACE_DBUS
1124 memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
1125 #endif /* CTRL_IFACE_DBUS */
1126 peer->state = WFD_PEER_STATE_CONNECTED;
1128 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1129 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1131 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1132 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1134 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1135 WFD_EVENT_CONNECTION_RSP,
1138 #ifdef CTRL_IFACE_DBUS
1139 wfd_update_peer(manager, peer);
1140 #endif /* CTRL_IFACE_DBUS */
1141 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
1142 if (event->ip_addr_peer[3]) {
1143 peer->ip_type = WFD_IP_TYPE_OVER_EAPOL;
1144 memcpy(peer->client_ip_addr, event->ip_addr_peer, IPADDR_LEN);
1145 WDS_LOGE("Peer's client IP [" IPSTR "]", IP2STR((char*) &peer->client_ip_addr));
1146 memcpy(peer->go_ip_addr, manager->local->ip_addr, IPADDR_LEN);
1147 WDS_LOGE("Peer's GO IP [" IPSTR "]", IP2STR((char*) &peer->go_ip_addr));
1149 if (peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
1150 char peer_mac_address[MACSTR_LEN+1] = {0,};
1151 char assigned_ip_address[IPSTR_LEN+1] = {0,};
1153 memcpy(peer->ip_addr, peer->client_ip_addr, IPADDR_LEN);
1155 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1156 g_snprintf(assigned_ip_address, IPSTR_LEN, IPSTR, IP2STR(peer->ip_addr));
1157 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1159 g_variant_new("(ss)", peer_mac_address,
1160 assigned_ip_address));
1161 #if defined(TIZEN_FEATURE_ASP)
1162 if (!ISZEROMACADDR(session->session_mac))
1163 wfd_asp_connect_status(session->session_mac,
1164 session->session_id,
1165 ASP_CONNECT_STATUS_GROUP_FORMATION_COMPLETED,
1169 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
1170 wfd_util_dhcps_wait_ip_leased(peer);
1171 wfd_destroy_session(manager);
1173 __WDS_LOG_FUNC_EXIT__;
1177 void wfd_event_sta_disconnected(wfd_oem_event_s *event)
1179 __WDS_LOG_FUNC_ENTER__;
1181 wfd_manager_s *manager = wfd_get_manager();
1182 wfd_group_s *group = NULL;
1183 wfd_device_s *peer = NULL;
1184 unsigned char peer_addr[MACADDR_LEN] = {0, };
1185 char peer_mac_address[MACSTR_LEN+1] = {0, };
1187 group = (wfd_group_s*) manager->group;
1189 WDS_LOGE("Group not found");
1190 __WDS_LOG_FUNC_EXIT__;
1194 if (ISZEROMACADDR(event->dev_addr)) {
1195 WDS_LOGD("Legacy Peer Disconnected [Peer: " MACSTR "]", MAC2STR(event->intf_addr));
1196 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->intf_addr));
1197 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1199 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1200 WFD_EVENT_DISCONNECTION_IND,
1203 wfd_group_remove_member(group, event->intf_addr);
1205 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1206 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1207 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1209 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1210 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1212 __WDS_LOG_FUNC_EXIT__;
1216 #ifdef CTRL_IFACE_DBUS
1217 peer = wfd_group_find_member_by_addr(group, event->dev_addr);
1218 #else /* CTRL_IFACE_DBUS */
1219 peer = wfd_group_find_member_by_addr(group, event->intf_addr);
1220 #endif /* DBUS_IFACE */
1222 WDS_LOGE("Failed to find connected peer");
1223 peer = wfd_session_get_peer(manager->session);
1225 WDS_LOGE("Failed to find connecting peer");
1226 __WDS_LOG_FUNC_EXIT__;
1230 #ifdef CTRL_IFACE_DBUS
1232 * If no peer connected and
1233 * disconnected event is not for connecting peer
1234 * then event should be ignored.
1235 * This situation can arrise when TV is GO and
1236 * some connected peer sent disassociation.
1238 if (memcmp(peer_addr, event->dev_addr, MACADDR_LEN)) {
1239 WDS_LOGE("Unexpected event, Ignore it...");
1240 __WDS_LOG_FUNC_EXIT__;
1243 #endif /* CTRL_DBUS_IFACE */
1245 memcpy(peer_addr, peer->dev_addr, MACADDR_LEN);
1248 * If state is not DISCONNECTING, connection is finished by peer.
1249 * Required the check also, when Device is Group Owner and state is DISCOVERING.
1251 if (manager->state >= WIFI_DIRECT_STATE_CONNECTED ||
1252 (manager->state == WIFI_DIRECT_STATE_DISCOVERING &&
1253 manager->local->dev_role == WFD_DEV_ROLE_GO)) {
1254 wfd_group_remove_member(group, peer_addr);
1255 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1256 if (group->member_count) {
1257 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1259 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1260 WFD_EVENT_DISASSOCIATION_IND,
1263 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1265 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1266 WFD_EVENT_DISCONNECTION_IND,
1270 } else if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
1271 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1272 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1274 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1275 WFD_EVENT_DISCONNECTION_RSP,
1278 } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING &&
1279 /* Some devices(GO) send disconnection message before connection completed.
1280 * This message should be ignored when device is not GO */
1281 manager->local->dev_role == WFD_DEV_ROLE_GO) {
1282 if (WFD_PEER_STATE_CONNECTED == peer->state) {
1283 WDS_LOGD("Peer is already Connected !!!");
1284 wfd_group_remove_member(group, peer_addr);
1285 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1286 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1288 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1289 WFD_EVENT_DISASSOCIATION_IND,
1292 } else if (WFD_PEER_STATE_CONNECTING == peer->state) {
1293 WDS_LOGD("Peer is Connecting...");
1294 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1295 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1297 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
1298 WFD_EVENT_CONNECTION_RSP,
1300 #if defined(TIZEN_FEATURE_ASP)
1301 wfd_session_s *session = manager->session;
1302 if (session && !ISZEROMACADDR(session->session_mac))
1303 wfd_asp_connect_status(session->session_mac,
1304 session->session_id,
1305 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
1309 WDS_LOGE("Unexpected Peer State. Ignore it");
1310 __WDS_LOG_FUNC_EXIT__;
1314 WDS_LOGE("Unexpected event. Ignore it");
1315 __WDS_LOG_FUNC_EXIT__;
1319 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1320 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1321 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1323 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1324 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1327 /* If there is no member, GO should be destroyed */
1328 if (!group->member_count) {
1329 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1330 wfd_destroy_group(manager);
1331 wfd_peer_clear_all(manager);
1334 wfd_destroy_session(manager);
1336 __WDS_LOG_FUNC_EXIT__;
1340 void wfd_event_terminating(wfd_oem_event_s *event)
1342 __WDS_LOG_FUNC_ENTER__;
1344 __WDS_LOG_FUNC_EXIT__;
1348 void wfd_event_group_formation_failure(wfd_oem_event_s *event)
1350 __WDS_LOG_FUNC_ENTER__;
1352 wfd_manager_s *manager = wfd_get_manager();
1353 wfd_session_s *session = (wfd_session_s*) manager->session;
1355 WDS_LOGE("Unexpected event. Session not exist");
1356 __WDS_LOG_FUNC_EXIT__;
1360 unsigned char *peer_addr = wfd_session_get_peer_addr(session);
1362 WDS_LOGE("Session do not has peer");
1363 __WDS_LOG_FUNC_EXIT__;
1367 char peer_mac_address[MACSTR_LEN+1] = {0, };
1368 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1369 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1371 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
1372 WFD_EVENT_CONNECTION_RSP,
1375 #if defined(TIZEN_FEATURE_ASP)
1376 if (!ISZEROMACADDR(session->session_mac))
1377 wfd_asp_connect_status(session->session_mac,
1378 session->session_id,
1379 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
1383 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1384 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1385 wfd_destroy_session(manager);
1386 manager->local->dev_role = WFD_DEV_ROLE_NONE;
1388 wfd_oem_refresh(manager->oem_ops);
1390 __WDS_LOG_FUNC_EXIT__;
1395 * This event is generated by supplicant when persitent invite is auto accepted
1396 * so that wfd-manager can get indication that a peer will be connected in near future.
1397 * session is started for that peer, so that it is not ignored when connected.
1399 void wfd_event_invitation_accepted(wfd_oem_event_s *event)
1402 __WDS_LOG_FUNC_ENTER__;
1404 wfd_manager_s *manager = wfd_get_manager();
1405 wfd_session_s *session = (wfd_session_s*) manager->session;
1406 wfd_device_s *peer = NULL;
1407 char peer_mac_address[MACSTR_LEN+1] = {0, };
1409 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
1411 WDS_LOGI("Invitation from unknown peer. Add new peer");
1412 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
1414 WDS_LOGE("Failed to add peer for invitation");
1415 __WDS_LOG_FUNC_EXIT__;
1419 /**By default, peer device information is complete but there's some exception
1420 * if DEV-FOUND event was not preceding before connection start event.
1422 wfd_update_peer(manager, peer);
1423 peer->dev_role = WFD_DEV_ROLE_GO;
1426 session = wfd_create_session(manager, event->dev_addr,
1427 event->wps_mode, SESSION_DIRECTION_INCOMING);
1429 WDS_LOGE("Failed to create session with peer [" MACSTR "]",
1430 MAC2STR(event->dev_addr));
1431 __WDS_LOG_FUNC_EXIT__;
1436 session->state = SESSION_STATE_WPS;
1437 wfd_session_timer(session, 1);
1439 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1440 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1442 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1443 WFD_EVENT_CONNECTION_IN_PROGRESS,
1446 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
1447 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
1449 __WDS_LOG_FUNC_EXIT__;
1452 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1453 void wfd_event_serv_disc_resp(wfd_oem_event_s *event)
1455 __WDS_LOG_FUNC_ENTER__;
1457 wfd_manager_s *manager = wfd_get_manager();
1459 char response_data[256] = {0, };
1460 char peer_mac_address[MACSTR_LEN+1] = {0, };
1462 wfd_update_peer_time(manager, event->dev_addr);
1464 if (event->edata_type == WFD_OEM_EDATA_TYPE_NEW_SERVICE) {
1465 wfd_oem_new_service_s *service = NULL;;
1467 GList *services = (GList*) event->edata;
1470 WDS_LOGD("%d service data found", event->dev_role);
1472 temp = g_list_first(services);
1473 while (temp && count < event->dev_role) {
1474 service = (wfd_oem_new_service_s*) temp->data;
1475 service_type = service->protocol;
1476 if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
1477 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1478 g_snprintf(response_data, 256, "%s|%s", service->data.bonjour.query, service->data.bonjour.rdata);
1479 WDS_LOGD("Found service: [%d: %s] - [" MACSECSTR "]", service->protocol,
1480 service->data.bonjour.query, MAC2SECSTR(event->dev_addr));
1482 WDS_LOGD("Found service is not supported");
1486 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
1488 g_variant_new("(iss)", service_type,
1492 temp = g_list_next(temp);
1496 } else if (event->edata_type == WFD_OEM_EDATA_TYPE_SERVICE) {
1497 wfd_oem_service_data_s *edata = (wfd_oem_service_data_s*) event->edata;
1502 service_type = edata->type;
1503 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1504 switch (edata->type) {
1505 WDS_LOGE("Unknown type [type ID: %d]", edata->type);
1509 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
1511 g_variant_new("(iss)", service_type,
1516 __WDS_LOG_FUNC_EXIT__;
1520 void wfd_event_serv_disc_started(wfd_oem_event_s *event)
1522 __WDS_LOG_FUNC_ENTER__;
1524 __WDS_LOG_FUNC_EXIT__;
1527 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1530 #if defined(TIZEN_FEATURE_ASP)
1531 void wfd_event_asp_serv_resp(wfd_oem_event_s *event)
1533 __WDS_LOG_FUNC_ENTER__;
1535 wfd_oem_asp_service_s *service = NULL;
1536 GVariantBuilder *builder = NULL;
1537 GVariant *params = NULL;
1539 service = (wfd_oem_asp_service_s *)event->edata;
1540 if (service == NULL) {
1541 WDS_LOGE("P2P service found event has NULL information");
1542 __WDS_LOG_FUNC_EXIT__;
1546 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1547 g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("u", service->search_id));
1548 g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", event->dev_addr));
1549 g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
1550 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
1551 if (service->service_type)
1552 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type));
1553 if (service->service_info)
1554 g_variant_builder_add(builder, "{sv}", "service_info", g_variant_new("s", service->service_info));
1555 g_variant_builder_add(builder, "{sv}", "status", g_variant_new("y", service->status));
1556 params = g_variant_new("(a{sv})", builder);
1557 g_variant_builder_unref(builder);
1559 wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
1563 __WDS_LOG_FUNC_EXIT__;
1567 int __wfd_handle_asp_prov(wfd_manager_s *manager, wfd_oem_event_s *event)
1569 __WDS_LOG_FUNC_ENTER__;
1571 wfd_session_s *session = NULL;
1572 wfd_oem_asp_prov_s *prov_params = NULL;
1575 prov_params = (wfd_oem_asp_prov_s *)event->edata;
1576 if (prov_params == NULL) {
1577 WDS_LOGE("Invalid parameter");
1578 __WDS_LOG_FUNC_EXIT__;
1582 res = wfd_session_process_event(manager, event);
1583 session = (wfd_session_s *)manager->session;
1584 if (res < 0 || session == NULL) {
1585 WDS_LOGE("Failed to process event of session");
1586 __WDS_LOG_FUNC_EXIT__;
1589 session->session_id = prov_params->session_id;
1590 memcpy(session->session_mac, prov_params->session_mac, MACADDR_LEN);
1591 memcpy(session->service_mac, prov_params->service_mac, MACADDR_LEN);
1593 __WDS_LOG_FUNC_EXIT__;
1597 int __wfd_handle_asp_prov_done(wfd_session_s *session, wfd_oem_event_s *event)
1599 __WDS_LOG_FUNC_ENTER__;
1601 wfd_oem_asp_prov_s *prov_params = NULL;
1602 prov_params = (wfd_oem_asp_prov_s *)event->edata;
1605 if (prov_params->persist &&
1606 (prov_params->network_role || prov_params->network_config)) {
1607 WDS_LOGE("Persistent group is used but "
1608 "conncap/dev_passwd_id are present");
1609 __WDS_LOG_FUNC_EXIT__;
1613 if (!prov_params->persist &&
1614 (!prov_params->network_role && !prov_params->network_config)) {
1615 WDS_LOGE("Persistent group not used but "
1616 "conncap/dev_passwd_id are missing");
1617 __WDS_LOG_FUNC_EXIT__;
1621 if (session->wps_mode == WFD_OEM_WPS_MODE_P2PS)
1622 g_strlcpy(session->wps_pin, OEM_DEFAULT_P2PS_PIN, OEM_PINSTR_LEN + 1);
1624 if (prov_params->persist) {
1625 res = wfd_session_asp_persistent_connect(session, prov_params->persistent_group_id);
1626 } else if (prov_params->network_role == WFD_OEM_ASP_SESSION_ROLE_NEW) {
1627 res = wfd_session_asp_connect(session, WFD_OEM_ASP_SESSION_ROLE_NEW);
1628 } else if (prov_params->network_role == WFD_OEM_ASP_SESSION_ROLE_CLIENT) {
1629 res = wfd_session_asp_connect(session, WFD_OEM_ASP_SESSION_ROLE_CLIENT);
1630 } else if (prov_params->network_role == WFD_OEM_ASP_SESSION_ROLE_GO) {
1631 WDS_LOGD("don't need to take action.");
1634 WDS_LOGE("Unhandled event");
1635 __WDS_LOG_FUNC_EXIT__;
1639 __WDS_LOG_FUNC_EXIT__;
1642 void wfd_event_asp_prov_start(wfd_oem_event_s *event)
1644 __WDS_LOG_FUNC_ENTER__;
1646 wfd_manager_s *manager = wfd_get_manager();
1647 wfd_session_s *session = NULL;
1648 wfd_oem_asp_prov_s *prov_params = NULL;
1651 if (event == NULL || event->edata == NULL) {
1652 WDS_LOGE("Invalid parameter");
1653 __WDS_LOG_FUNC_EXIT__;
1657 prov_params = (wfd_oem_asp_prov_s *)event->edata;
1658 res = __wfd_handle_asp_prov(manager, event);
1659 session = (wfd_session_s *)manager->session;
1660 if (res < 0 || session == NULL) {
1661 WDS_LOGE("Failed to process event of session");
1662 __WDS_LOG_FUNC_EXIT__;
1666 WDS_LOGD("created session [%u] with peer [" MACSTR "]", session->session_id,
1667 MAC2STR(session->session_mac));
1669 /* Incomming Session, auto_accept = TRUE emit request Received */
1670 /* generate SessionConfigRequest if event->wps_mode is not P2PS and return*/
1672 wfd_session_timer(session, 1);
1673 wfd_asp_session_request(prov_params);
1674 wfd_asp_connect_status(prov_params->session_mac,
1675 prov_params->session_id,
1676 ASP_CONNECT_STATUS_REQUEST_RECEIVED,
1679 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
1681 __WDS_LOG_FUNC_EXIT__;
1685 void wfd_event_asp_prov_done(wfd_oem_event_s *event)
1687 __WDS_LOG_FUNC_ENTER__;
1689 wfd_manager_s *manager = wfd_get_manager();
1690 wfd_session_s *session = NULL;
1691 wfd_oem_asp_prov_s *prov_params;
1694 if (event == NULL || event->edata == NULL) {
1695 WDS_LOGE("Invalid parameter");
1696 __WDS_LOG_FUNC_EXIT__;
1700 prov_params = (wfd_oem_asp_prov_s *)event->edata;
1701 /* Incomming Session, auto_accept = TRUE emit request Received */
1702 /* generate SessionConfigRequest if event->wps_mode is not P2PS and return*/
1703 if (manager->session == NULL) {
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,
1711 res = __wfd_handle_asp_prov(manager, event);
1712 session = (wfd_session_s *)manager->session;
1713 if (res < 0 || session == NULL) {
1714 WDS_LOGE("Failed to process event of session");
1715 wfd_destroy_session(manager);
1716 wfd_asp_connect_status(prov_params->session_mac,
1717 prov_params->session_id,
1718 ASP_CONNECT_STATUS_REQUEST_FAILED,
1720 wfd_oem_refresh(manager->oem_ops);
1721 __WDS_LOG_FUNC_EXIT__;
1725 if (prov_params->status != WFD_OEM_SC_SUCCESS &&
1726 prov_params->status != WFD_OEM_SC_SUCCESS_ACCEPTED_BY_USER) {
1727 WDS_LOGD("ASP-PROV failed. remove session.");
1728 wfd_destroy_session(manager);
1729 wfd_oem_refresh(manager->oem_ops);
1730 wfd_asp_connect_status(prov_params->session_mac,
1731 prov_params->session_id,
1732 ASP_CONNECT_STATUS_REQUEST_FAILED,
1734 __WDS_LOG_FUNC_EXIT__;
1738 wfd_asp_connect_status(prov_params->session_mac,
1739 prov_params->session_id,
1740 ASP_CONNECT_STATUS_REQUEST_ACCEPTED,
1743 wfd_asp_connect_status(prov_params->session_mac,
1744 prov_params->session_id,
1745 ASP_CONNECT_STATUS_GROUP_FORMATION_STARTED,
1747 res = __wfd_handle_asp_prov_done(session, event);
1749 WDS_LOGE("Connect failed. remove session.");
1750 wfd_destroy_session(manager);
1751 wfd_oem_refresh(manager->oem_ops);
1753 wfd_asp_connect_status(prov_params->session_mac,
1754 prov_params->session_id,
1755 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
1757 __WDS_LOG_FUNC_EXIT__;
1761 WDS_LOGD("Provision done succeeded.");
1762 __WDS_LOG_FUNC_EXIT__;
1765 #endif /* TIZEN_FEATURE_ASP */
1767 void wfd_event_init(wfd_oem_event_cbs_s *event_cbs)
1769 __WDS_LOG_FUNC_ENTER__;
1772 __WDS_LOG_FUNC_EXIT__;
1776 event_cbs->deactivated_cb = wfd_event_deactivated;
1777 event_cbs->peer_found_cb = wfd_event_peer_found;
1778 event_cbs->peer_disappeared_cb = wfd_event_peer_disappeared;
1779 event_cbs->discovery_finished_cb = wfd_event_discovery_finished;
1781 event_cbs->prov_disc_req_cb = wfd_event_prov_disc_req;
1782 event_cbs->prov_disc_resp_cb = wfd_event_prov_disc_resp;
1783 event_cbs->prov_disc_fail_cb = wfd_event_prov_disc_fail;
1785 event_cbs->go_neg_req_cb = wfd_event_go_neg_req;
1786 event_cbs->go_neg_fail_cb = wfd_event_go_neg_fail;
1787 event_cbs->go_neg_done_cb = wfd_event_go_neg_done;
1789 event_cbs->wps_fail_cb = wfd_event_wps_fail;
1790 event_cbs->wps_done_cb = wfd_event_wps_done;
1791 event_cbs->key_neg_fail_cb = wfd_event_key_neg_fail;
1792 event_cbs->key_neg_done_cb = wfd_event_key_neg_done;
1794 event_cbs->conn_fail_cb = wfd_event_conn_fail;
1795 event_cbs->conn_done_cb = wfd_event_conn_done;
1797 event_cbs->group_created_cb = wfd_event_group_created;
1798 event_cbs->group_destroyed_cb = wfd_event_group_destroyed;
1800 event_cbs->invitation_req_cb = wfd_event_invitation_req;
1801 event_cbs->invitation_resp_cb = wfd_event_invitation_res;
1802 event_cbs->sta_connected_cb = wfd_event_sta_connected;
1803 event_cbs->sta_disconnected_cb = wfd_event_sta_disconnected;
1805 event_cbs->terminating_cb = wfd_event_terminating;
1807 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1808 event_cbs->serv_disc_resp_cb = wfd_event_serv_disc_resp;
1809 event_cbs->serv_disc_started_cb = wfd_event_serv_disc_started;
1810 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1812 event_cbs->group_formation_failure_cb = wfd_event_group_formation_failure;
1813 event_cbs->invitation_accepted_cb = wfd_event_invitation_accepted;
1815 #if defined(TIZEN_FEATURE_ASP)
1816 event_cbs->asp_serv_resp_cb = wfd_event_asp_serv_resp;
1817 event_cbs->asp_prov_start_cb = wfd_event_asp_prov_start;
1818 event_cbs->asp_prov_done_cb = wfd_event_asp_prov_done;
1819 #endif /* TIZEN_FEATURE_ASP */
1821 event_cbs->extra_data = NULL;
1823 __WDS_LOG_FUNC_EXIT__;