2 * Network Configuration Module
4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
21 * This file implements wifi direct event functions.
23 * @file wifi-direct-event.c
24 * @author Gibyoung Kim (lastkgb.kim@samsung.com)
37 #include <wifi-direct.h>
39 #include "wifi-direct-ipc.h"
40 #include "wifi-direct-manager.h"
41 #include "wifi-direct-oem.h"
42 #include "wifi-direct-peer.h"
43 #include "wifi-direct-group.h"
44 #include "wifi-direct-session.h"
45 #include "wifi-direct-event.h"
46 #include "wifi-direct-state.h"
47 #include "wifi-direct-util.h"
48 #include "wifi-direct-error.h"
49 #include "wifi-direct-log.h"
50 #include "wifi-direct-dbus.h"
51 #if defined(TIZEN_FEATURE_ASP)
52 #include "wifi-direct-asp.h"
53 #endif /* TIZEN_FEATURE_ASP */
55 static int _wfd_event_update_peer(wfd_manager_s *manager, wfd_oem_dev_data_s *data)
57 __WDS_LOG_FUNC_ENTER__;
59 wfd_device_s *peer = NULL;
61 if (!manager || !data) {
62 WDS_LOGE("Invalid parameter");
63 __WDS_LOG_FUNC_EXIT__;
67 peer = wfd_peer_find_by_dev_addr(manager, data->p2p_dev_addr);
69 peer = wfd_add_peer(manager, data->p2p_dev_addr, data->name);
71 WDS_LOGE("Failed to add peer");
72 __WDS_LOG_FUNC_EXIT__;
76 if (strcmp(peer->dev_name, data->name)) {
77 g_strlcpy(peer->dev_name, data->name, DEV_NAME_LEN + 1);
78 WDS_LOGD("Device name is changed [" MACSECSTR ": %s]",
79 MAC2SECSTR(peer->dev_addr), peer->dev_name);
82 peer->pri_dev_type = data->pri_dev_type;
83 peer->sec_dev_type = data->sec_dev_type;
84 peer->config_methods = data->config_methods;
85 peer->dev_flags = data->dev_flags;
86 peer->group_flags = data->group_flags;
87 peer->dev_role = data->dev_role;
88 peer->rssi = data->rssi;
89 WDS_LOGD("Peer RSSI value is %d", peer->rssi);
91 if (manager->is_wifi_display_supported)
92 memcpy(&(peer->display), &(data->display), sizeof(wfd_display_s));
94 #if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
95 wfd_util_get_current_time(&peer->time);
98 gettimeofday(&tval, NULL);
99 peer->time = tval.tv_sec;
101 WDS_LOGI("Update time [%s - %ld]", peer->dev_name, peer->time);
103 __WDS_LOG_FUNC_EXIT__;
107 gboolean _wfd_connection_retry(gpointer *data)
109 wfd_session_s *session = (wfd_session_s*) data;
111 WDS_LOGE("Session is NULL");
112 __WDS_LOG_FUNC_EXIT__;
113 return G_SOURCE_REMOVE;
116 switch (session->state) {
117 case SESSION_STATE_STARTED:
118 WDS_LOGD("PD again");
119 wfd_session_start(session);
121 case SESSION_STATE_GO_NEG:
122 WDS_LOGD("Negotiation again");
123 wfd_session_connect(session);
125 case SESSION_STATE_WPS:
126 WDS_LOGD("WPS again");
127 wfd_session_wps(session);
130 WDS_LOGE("Invalid session state [%d]", session->state);
133 __WDS_LOG_FUNC_EXIT__;
134 return G_SOURCE_REMOVE;
137 void wfd_event_deactivated(wfd_oem_event_s *event)
139 __WDS_LOG_FUNC_ENTER__;
141 wfd_manager_s *manager = wfd_get_manager();
143 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
145 g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE));
147 wfd_destroy_group(manager);
148 wfd_destroy_session(manager);
149 wfd_peer_clear_all(manager);
150 wfd_local_reset_data(manager);
152 wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATED);
153 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATED);
154 manager->req_wps_mode = WFD_WPS_MODE_PBC;
156 #ifdef TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT
157 wfd_util_stop_wifi_direct_popup();
158 #endif /* TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT */
159 __WDS_LOG_FUNC_EXIT__;
163 void wfd_event_peer_found(wfd_oem_event_s *event)
165 __WDS_LOG_FUNC_ENTER__;
167 wfd_manager_s *manager = wfd_get_manager();
168 wfd_oem_dev_data_s *edata = NULL;
169 char peer_mac_address[MACSTR_LEN+1] = {0, };
172 edata = (wfd_oem_dev_data_s*) event->edata;
173 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
174 WDS_LOGE("Invalid event data");
175 __WDS_LOG_FUNC_EXIT__;
179 res = _wfd_event_update_peer(manager, edata);
181 WDS_LOGE("Failed to update peer data");
182 __WDS_LOG_FUNC_EXIT__;
186 if (manager->state > WIFI_DIRECT_STATE_ACTIVATING &&
187 manager->state != WIFI_DIRECT_STATE_CONNECTING &&
188 manager->state != WIFI_DIRECT_STATE_DISCONNECTING) {
189 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(edata->p2p_dev_addr));
190 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
192 g_variant_new("(s)", peer_mac_address));
195 #if defined(TIZEN_FEATURE_ASP)
198 GVariantBuilder *builder = NULL;
199 GVariant *params = NULL;
200 wfd_oem_advertise_service_s *service;
202 for (list = (GList *)event->asp_services; list != NULL; list = list->next) {
203 service = (wfd_oem_advertise_service_s *)list->data;
205 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
206 g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("t", service->search_id));
207 g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", peer_mac_address));
208 g_variant_builder_add(builder, "{sv}", "device_name", g_variant_new("s", edata->name));
209 g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
210 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
211 if (service->service_type)
212 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type));
213 params = g_variant_new("(a{sv})", builder);
214 g_variant_builder_unref(builder);
216 wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
221 for (list = (GList *)event->asp2_services; list != NULL; list = list->next) {
222 service = (wfd_oem_advertise_service_s *)list->data;
224 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
225 g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("t", service->search_id));
226 g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", peer_mac_address));
227 g_variant_builder_add(builder, "{sv}", "device_name", g_variant_new("s", edata->name));
228 g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
229 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
230 if (service->service_type)
231 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type));
232 if (service->instance_name)
233 g_variant_builder_add(builder, "{sv}", "instance_name", g_variant_new("s", service->instance_name));
234 params = g_variant_new("(a{sv})", builder);
235 g_variant_builder_unref(builder);
237 wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
242 __WDS_LOG_FUNC_EXIT__;
246 void wfd_event_peer_disappeared(wfd_oem_event_s *event)
248 __WDS_LOG_FUNC_ENTER__;
250 wfd_manager_s *manager = wfd_get_manager();
251 wfd_session_s *session = NULL;
252 wfd_device_s *peer = NULL;
253 char peer_mac_address[MACSTR_LEN+1] = {0, };
255 session = manager->session;
256 if (session != NULL && session->peer != NULL) {
257 peer = session->peer;
258 WDS_LOGD("session peer [" MACSTR "] lost peer [" MACSTR "]", MAC2STR(peer->dev_addr),
259 MAC2STR(event->dev_addr));
260 if (memcmp(peer->dev_addr, event->dev_addr, MACADDR_LEN) == 0) {
261 WDS_LOGD("peer already in connection");
266 wfd_remove_peer(manager, event->dev_addr);
268 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
269 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
271 g_variant_new("(s)", peer_mac_address));
273 __WDS_LOG_FUNC_EXIT__;
277 void wfd_event_discovery_finished(wfd_oem_event_s *event)
279 __WDS_LOG_FUNC_ENTER__;
281 wfd_manager_s *manager = wfd_get_manager();
283 if (manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
284 manager->state != WIFI_DIRECT_STATE_ACTIVATED) {
285 WDS_LOGE("Notify finding stopped when discovering or activated. [%d]", manager->state);
286 __WDS_LOG_FUNC_EXIT__;
290 if (manager->scan_mode == WFD_SCAN_MODE_PASSIVE) {
291 WDS_LOGE("During passive scan, Discover Finished event will not notified");
292 __WDS_LOG_FUNC_EXIT__;
296 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
297 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
298 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
300 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
301 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
303 manager->scan_mode = WFD_SCAN_MODE_NONE;
305 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
309 __WDS_LOG_FUNC_EXIT__;
313 void wfd_event_prov_disc_req(wfd_oem_event_s *event)
315 __WDS_LOG_FUNC_ENTER__;
317 wfd_manager_s *manager = wfd_get_manager();
318 wfd_device_s *peer = NULL;
319 wfd_device_s *member = NULL;
321 wfd_group_s *group = (wfd_group_s*) manager->group;
323 if (group && group->role == WFD_DEV_ROLE_GC) {
324 WDS_LOGD("Device has GC role - ignore this provision request");
325 __WDS_LOG_FUNC_EXIT__;
329 member = wfd_group_find_member_by_addr(group, event->dev_addr);
331 /* PD request can be arrived from peer device
332 * when connection is timeout to close connection */
333 WDS_LOGE("Unexpected Event - Member already exist");
334 __WDS_LOG_FUNC_EXIT__;
338 wfd_oem_dev_data_s *edata = NULL;
340 edata = (wfd_oem_dev_data_s*) event->edata;
341 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
342 WDS_LOGE("Invalid event data");
343 __WDS_LOG_FUNC_EXIT__;
347 res = _wfd_event_update_peer(manager, edata);
348 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
350 if (WFD_DEV_ROLE_GO != manager->local->dev_role) {
351 WDS_LOGI("TV is not GO, updated peer data only.");
353 manager->local->wps_mode = event->wps_mode;
354 if (event->wps_mode == WFD_WPS_MODE_PBC ||
355 event->wps_mode == WFD_WPS_MODE_KEYPAD) {
356 __WDS_LOG_FUNC_EXIT__;
362 peer->state = WFD_PEER_STATE_CONNECTING;
364 res = wfd_session_process_event(manager, event);
366 WDS_LOGE("Failed to process event of session");
368 __WDS_LOG_FUNC_EXIT__;
372 void wfd_event_prov_disc_resp(wfd_oem_event_s *event)
374 __WDS_LOG_FUNC_ENTER__;
376 wfd_manager_s *manager = wfd_get_manager();
377 wfd_device_s *peer = NULL;
380 wfd_oem_dev_data_s *edata = NULL;
382 edata = (wfd_oem_dev_data_s*) event->edata;
383 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
384 WDS_LOGE("Invalid event data");
385 __WDS_LOG_FUNC_EXIT__;
389 res = _wfd_event_update_peer(manager, edata);
390 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
392 peer->state = WFD_PEER_STATE_CONNECTING;
394 res = wfd_session_process_event(manager, event);
396 WDS_LOGE("Failed to process event of session");
398 __WDS_LOG_FUNC_EXIT__;
402 void wfd_event_prov_disc_fail(wfd_oem_event_s *event)
404 __WDS_LOG_FUNC_ENTER__;
406 wfd_manager_s *manager = wfd_get_manager();
407 wfd_session_s *session = NULL;
408 unsigned char *peer_addr = NULL;
409 char peer_mac_address[MACSTR_LEN+1] = {0, };
410 #if defined(TIZEN_FEATURE_ASP)
411 wfd_oem_asp_prov_s *prov_params = NULL;
412 prov_params = (wfd_oem_asp_prov_s *)event->edata;
415 session = (wfd_session_s*) manager->session;
417 WDS_LOGE("Unexpected event. Session not exist");
418 __WDS_LOG_FUNC_EXIT__;
422 peer_addr = wfd_session_get_peer_addr(session);
424 WDS_LOGE("Session do not have peer");
425 __WDS_LOG_FUNC_EXIT__;
428 #if defined(TIZEN_FEATURE_ASP)
429 if (!ISZEROMACADDR(session->session_mac)) {
430 /* This connection is for ASP session */
431 if (prov_params->status == WFD_OEM_SC_FAIL_INVALID_PARAMS) {
432 wfd_oem_scan_param_s param;
434 WDS_LOGD("ASP prov disc deferred. wait response.");
435 wfd_asp_connect_status(session->session_mac,
437 ASP_CONNECT_STATUS_REQUEST_DEFERRED,
439 /* start listen to wait for provision discovery request from peer */
440 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
441 param.scan_mode = WFD_OEM_SCAN_MODE_PASSIVE;
442 wfd_oem_start_scan(manager->oem_ops, ¶m);
443 __WDS_LOG_FUNC_EXIT__;
448 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
449 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
451 g_variant_new("(iis)",
452 WIFI_DIRECT_ERROR_CONNECTION_FAILED,
453 WFD_EVENT_CONNECTION_RSP,
455 #if defined(TIZEN_FEATURE_ASP)
456 WDS_LOGD("ASP prov disc failed. remove session.");
457 wfd_asp_connect_status(session->session_mac,
459 ASP_CONNECT_STATUS_REQUEST_FAILED,
463 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
464 wfd_group_s *group = (wfd_group_s*) manager->group;
465 if (group && !group->member_count &&
466 wfd_util_is_remove_group_allowed()) {
467 wfd_destroy_group(manager);
469 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
470 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
472 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
473 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
476 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
477 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
480 wfd_destroy_session(manager);
482 wfd_oem_refresh(manager->oem_ops);
484 /* After connection failed, scan again */
485 wfd_oem_scan_param_s param;
486 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
487 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
489 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
490 wfd_oem_start_scan(manager->oem_ops, ¶m);
491 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
493 __WDS_LOG_FUNC_EXIT__;
497 void wfd_event_go_neg_req(wfd_oem_event_s *event)
499 __WDS_LOG_FUNC_ENTER__;
501 wfd_manager_s *manager = wfd_get_manager();
502 wfd_group_s *group = (wfd_group_s*) manager->group;
503 if (group && group->role == WFD_DEV_ROLE_GC) {
504 WDS_LOGD("Device has GC role - ignore this go neg request");
505 __WDS_LOG_FUNC_EXIT__;
509 wfd_oem_dev_data_s *edata = NULL;
512 edata = (wfd_oem_dev_data_s*) event->edata;
513 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
514 WDS_LOGE("Invalid event data");
515 __WDS_LOG_FUNC_EXIT__;
519 res = _wfd_event_update_peer(manager, edata);
521 WDS_LOGE("Failed to update peer data");
522 __WDS_LOG_FUNC_EXIT__;
526 wfd_session_process_event(manager, event);
527 __WDS_LOG_FUNC_EXIT__;
531 void wfd_event_go_neg_fail(wfd_oem_event_s *event)
533 __WDS_LOG_FUNC_ENTER__;
535 wfd_manager_s *manager = wfd_get_manager();
536 wfd_session_s *session = NULL;
537 wfd_oem_conn_data_s *edata = NULL;
538 unsigned char *peer_addr = NULL;
539 char peer_mac_address[MACSTR_LEN] = {0, };
541 session = (wfd_session_s*) manager->session;
543 WDS_LOGE("Unexpected event. Session not exist");
544 __WDS_LOG_FUNC_EXIT__;
548 peer_addr = wfd_session_get_peer_addr(session);
550 WDS_LOGE("Session do not have peer");
551 __WDS_LOG_FUNC_EXIT__;
555 edata = (wfd_oem_conn_data_s*) event->edata;
557 WDS_LOGE("Invalid p2p connection data");
558 __WDS_LOG_FUNC_EXIT__;
562 if (edata->status < 0 && session->connecting_120) {
563 if (session->retry_gsrc) {
564 g_source_remove(session->retry_gsrc);
565 session->retry_gsrc = 0;
567 session->retry_gsrc = g_idle_add((GSourceFunc) _wfd_connection_retry, session);
568 WDS_LOGD("Connection will be retried");
569 __WDS_LOG_FUNC_EXIT__;
573 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
574 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
576 g_variant_new("(iis)",
577 WIFI_DIRECT_ERROR_CONNECTION_FAILED,
578 WFD_EVENT_CONNECTION_RSP,
581 #if defined(TIZEN_FEATURE_ASP)
582 if (!ISZEROMACADDR(session->session_mac))
583 wfd_asp_connect_status(session->session_mac,
585 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
589 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
590 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
592 wfd_destroy_group(manager);
593 wfd_destroy_session(manager);
594 manager->local->dev_role = WFD_DEV_ROLE_NONE;
595 __WDS_LOG_FUNC_EXIT__;
599 void wfd_event_go_neg_done(wfd_oem_event_s *event)
601 __WDS_LOG_FUNC_ENTER__;
603 wfd_manager_s *manager = wfd_get_manager();
604 wfd_session_s *session = NULL;
605 wfd_oem_conn_data_s *edata = NULL;
606 wfd_device_s *peer = NULL;
608 edata = (wfd_oem_conn_data_s*) event->edata;
610 WDS_LOGE("Invalid event data");
611 __WDS_LOG_FUNC_EXIT__;
615 session = (wfd_session_s*) manager->session;
616 if (session && session->peer) {
617 peer = session->peer;
618 memcpy(peer->intf_addr, edata->peer_intf_addr, MACADDR_LEN);
621 wfd_session_process_event(manager, event);
622 __WDS_LOG_FUNC_EXIT__;
626 void wfd_event_wps_fail(wfd_oem_event_s *event)
628 __WDS_LOG_FUNC_ENTER__;
630 wfd_manager_s *manager = wfd_get_manager();
631 wfd_session_s *session = NULL;
632 unsigned char *peer_addr = NULL;
634 session = (wfd_session_s*) manager->session;
636 WDS_LOGE("Unexpected event. Session not exist");
637 __WDS_LOG_FUNC_EXIT__;
641 peer_addr = wfd_session_get_peer_addr(session);
643 WDS_LOGE("Session do not have peer");
644 __WDS_LOG_FUNC_EXIT__;
648 char peer_mac_address[MACSTR_LEN+1] = {0, };
649 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
650 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
652 g_variant_new("(iis)",
653 WIFI_DIRECT_ERROR_CONNECTION_FAILED,
654 WFD_EVENT_CONNECTION_RSP,
656 #if defined(TIZEN_FEATURE_ASP)
657 if (!ISZEROMACADDR(session->session_mac))
658 wfd_asp_connect_status(session->session_mac,
660 ASP_CONNECT_STATUS_GROUP_FORMATION_STARTED,
663 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
664 wfd_group_s *group = (wfd_group_s*) manager->group;
665 if (group && !group->member_count &&
666 wfd_util_is_remove_group_allowed()) {
667 wfd_destroy_group(manager);
669 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
670 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
672 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
673 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
676 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
677 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
680 wfd_destroy_session(manager);
682 wfd_oem_refresh(manager->oem_ops);
684 /* After connection failed, scan again */
685 wfd_oem_scan_param_s param;
686 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
687 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
689 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
690 wfd_oem_start_scan(manager->oem_ops, ¶m);
691 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
693 __WDS_LOG_FUNC_EXIT__;
697 void wfd_event_wps_done(wfd_oem_event_s *event)
699 __WDS_LOG_FUNC_ENTER__;
701 wfd_manager_s *manager = wfd_get_manager();
702 wfd_session_process_event(manager, event);
704 __WDS_LOG_FUNC_EXIT__;
708 void wfd_event_key_neg_fail(wfd_oem_event_s *event)
710 __WDS_LOG_FUNC_ENTER__;
712 wfd_manager_s *manager = wfd_get_manager();
713 wfd_session_s *session = NULL;
714 unsigned char *peer_addr = NULL;
715 char peer_mac_address[MACSTR_LEN+1] = {0, };
717 session = (wfd_session_s*) manager->session;
719 WDS_LOGE("Unexpected event. Session not exist");
720 __WDS_LOG_FUNC_EXIT__;
724 peer_addr = wfd_session_get_peer_addr(session);
726 WDS_LOGE("Session do not has peer");
727 __WDS_LOG_FUNC_EXIT__;
731 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
732 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
734 g_variant_new("(iis)",
735 WIFI_DIRECT_ERROR_CONNECTION_FAILED,
736 WFD_EVENT_CONNECTION_RSP,
738 #if defined(TIZEN_FEATURE_ASP)
739 if (!ISZEROMACADDR(session->session_mac))
740 wfd_asp_connect_status(session->session_mac,
742 ASP_CONNECT_STATUS_GROUP_FORMATION_STARTED,
745 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
746 wfd_group_s *group = (wfd_group_s*) manager->group;
747 if (group && !group->member_count &&
748 wfd_util_is_remove_group_allowed()) {
749 wfd_destroy_group(manager);
751 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
752 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
754 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
755 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
758 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
759 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
762 wfd_destroy_session(manager);
764 wfd_oem_refresh(manager->oem_ops);
766 /* After connection failed, scan again */
767 wfd_oem_scan_param_s param;
768 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
769 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
771 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
772 wfd_oem_start_scan(manager->oem_ops, ¶m);
773 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
775 __WDS_LOG_FUNC_EXIT__;
779 void wfd_event_key_neg_done(wfd_oem_event_s *event)
781 __WDS_LOG_FUNC_ENTER__;
783 __WDS_LOG_FUNC_EXIT__;
787 void wfd_event_conn_fail(wfd_oem_event_s *event)
789 __WDS_LOG_FUNC_ENTER__;
791 __WDS_LOG_FUNC_EXIT__;
795 void wfd_event_conn_done(wfd_oem_event_s *event)
797 __WDS_LOG_FUNC_ENTER__;
799 __WDS_LOG_FUNC_EXIT__;
803 void wfd_event_group_created(wfd_oem_event_s *event)
805 __WDS_LOG_FUNC_ENTER__;
807 wfd_manager_s *manager = wfd_get_manager();
808 wfd_group_s *group = (wfd_group_s*) manager->group;
809 wfd_session_s *session = (wfd_session_s*) manager->session;
812 group = wfd_create_pending_group(manager, event->intf_addr);
814 WDS_LOGE("Failed to create pending group");
815 __WDS_LOG_FUNC_EXIT__;
819 manager->group = group;
822 wfd_group_complete(manager, event);
824 if (group->role == WFD_DEV_ROLE_GC && session) {
825 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
826 wfd_device_s *peer = session->peer;
828 WDS_LOGE("Unexpected event. Peer doesn't exist");
832 wfd_update_peer(manager, peer);
834 if (peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
835 char peer_mac_address[MACSTR_LEN+1] = {0, };
837 wfd_util_ip_over_eap_assign(peer, event->ifname);
839 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
840 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
842 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
843 WFD_EVENT_CONNECTION_RSP,
845 #if defined(TIZEN_FEATURE_ASP)
846 if (!ISZEROMACADDR(session->session_mac)) {
847 wfd_asp_connect_status(session->session_mac,
849 ASP_CONNECT_STATUS_GROUP_FORMATION_COMPLETED,
851 wfd_asp_session_peer_ip(session->session_mac, session->session_id,
852 session->service_mac, peer->ip_addr);
855 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
856 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
858 wfd_destroy_session(manager);
860 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
861 wfd_peer_clear_all(manager);
863 if (group->flags & WFD_GROUP_FLAG_AUTONOMOUS) {
864 wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
866 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
867 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
870 __WDS_LOG_FUNC_EXIT__;
874 void wfd_event_group_destroyed(wfd_oem_event_s *event)
876 __WDS_LOG_FUNC_ENTER__;
878 wfd_manager_s *manager = wfd_get_manager();
879 char peer_mac_address[MACSTR_LEN+1] = {0, };
880 unsigned char *peer_addr = wfd_session_get_peer_addr(manager->session);
882 if (peer_addr != NULL)
883 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
885 g_snprintf(peer_mac_address, MACSTR_LEN, "%s", "");
887 if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
888 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
890 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
891 WFD_EVENT_DISCONNECTION_RSP,
894 } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING && manager->session) {
895 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
897 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
898 WFD_EVENT_CONNECTION_RSP,
900 #if defined(TIZEN_FEATURE_ASP)
901 wfd_session_s *session = manager->session;
902 if (!ISZEROMACADDR(session->session_mac))
903 wfd_asp_connect_status(session->session_mac,
905 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
908 } else if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
909 if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
910 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
912 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
913 WFD_EVENT_DISCONNECTION_RSP,
916 wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
920 WDS_LOGD("Unexpected event(GROUP_DESTROYED). Ignore it");
921 __WDS_LOG_FUNC_EXIT__;
925 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
926 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
927 wfd_destroy_group(manager);
928 wfd_destroy_session(manager);
929 manager->local->dev_role = WFD_DEV_ROLE_NONE;
931 __WDS_LOG_FUNC_EXIT__;
935 void wfd_event_invitation_req(wfd_oem_event_s *event)
937 __WDS_LOG_FUNC_ENTER__;
939 wfd_manager_s *manager = wfd_get_manager();
940 wfd_device_s *peer = NULL;
941 wfd_session_s *session = NULL;
942 wfd_oem_invite_data_s *edata = NULL;
944 char peer_mac_address[MACSTR_LEN+1] = {0, };
946 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
948 WDS_LOGD("Invitation from unknown peer. Add new peer");
949 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
951 WDS_LOGE("Failed to add peer for invitation");
952 __WDS_LOG_FUNC_EXIT__;
956 peer->dev_role = WFD_DEV_ROLE_GO;
958 edata = (wfd_oem_invite_data_s*) event->edata;
959 memcpy(peer->intf_addr, edata->bssid, MACADDR_LEN);
960 wfd_update_peer_time(manager, event->dev_addr);
962 if (!ISZEROMACADDR(edata->go_dev_addr))
963 session = wfd_create_session(manager, edata->go_dev_addr,
964 manager->req_wps_mode,
965 SESSION_DIRECTION_INCOMING);
967 session = wfd_create_session(manager, event->dev_addr,
968 manager->req_wps_mode,
969 SESSION_DIRECTION_INCOMING);
971 WDS_LOGE("Failed to create session");
972 __WDS_LOG_FUNC_EXIT__;
975 session->type = SESSION_TYPE_INVITE;
976 wfd_session_timer(session, 1);
978 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
979 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
981 res = wfd_session_start(session);
983 WDS_LOGE("Failed to start session");
984 __WDS_LOG_FUNC_EXIT__;
988 if (!ISZEROMACADDR(edata->go_dev_addr))
989 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR,
990 MAC2STR(edata->go_dev_addr));
992 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR,
993 MAC2STR(event->dev_addr));
995 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
997 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
998 WFD_EVENT_CONNECTION_REQ,
1001 __WDS_LOG_FUNC_EXIT__;
1005 void wfd_event_invitation_res(wfd_oem_event_s *event)
1007 __WDS_LOG_FUNC_ENTER__;
1009 __WDS_LOG_FUNC_EXIT__;
1013 void wfd_event_sta_connected(wfd_oem_event_s *event)
1015 __WDS_LOG_FUNC_ENTER__;
1017 wfd_manager_s *manager = wfd_get_manager();
1018 wfd_session_s *session = (wfd_session_s*) manager->session;
1019 wfd_group_s *group = (wfd_group_s*) manager->group;
1020 wfd_device_s *peer = NULL;
1021 char peer_mac_address[MACSTR_LEN+1] = {0, };
1023 /* FIXME: Move this code to plugin */
1024 if (!memcmp(event->intf_addr, manager->local->intf_addr, MACADDR_LEN)) {
1025 WDS_LOGD("Ignore this event");
1026 __WDS_LOG_FUNC_EXIT__;
1030 if (ISZEROMACADDR(event->dev_addr)) {
1031 WDS_LOGD("Legacy Peer Connected [Peer: " MACSTR "]", MAC2STR(event->intf_addr));
1033 peer = wfd_peer_find_by_addr(manager, event->intf_addr);
1035 WDS_LOGI("Add legacy peer");
1036 peer = wfd_add_peer(manager, event->intf_addr, "LEGACY-PEER");
1038 WDS_LOGE("Failed to add Legacy peer.");
1039 __WDS_LOG_FUNC_EXIT__;
1044 if (wfd_group_add_member(group, peer->dev_addr) == -1) {
1045 WDS_LOGE("Failed to add Legacy peer.");
1046 __WDS_LOG_FUNC_EXIT__;
1050 memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
1051 peer->state = WFD_PEER_STATE_CONNECTED;
1052 peer->is_p2p = FALSE;
1054 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1055 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1057 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1058 WFD_EVENT_CONNECTION_RSP,
1061 wfd_util_dhcps_wait_ip_leased(peer);
1062 __WDS_LOG_FUNC_EXIT__;
1066 session = (wfd_session_s*) manager->session;
1067 if (!session && group) {
1068 if (group->flags & WFD_GROUP_FLAG_PERSISTENT) {
1069 session = wfd_create_session(manager, event->dev_addr,
1071 SESSION_DIRECTION_INCOMING);
1073 WDS_LOGE("Failed to create session with peer [" MACSTR "]",
1074 MAC2STR(event->dev_addr));
1075 __WDS_LOG_FUNC_EXIT__;
1079 WDS_LOGD("Unexpected event. Session is NULL [peer: " MACSECSTR "]",
1080 MAC2SECSTR(event->dev_addr));
1082 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1083 wfd_destroy_group(manager);
1086 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1087 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1088 __WDS_LOG_FUNC_EXIT__;
1093 peer = wfd_session_get_peer(session);
1095 WDS_LOGE("Peer not found");
1096 __WDS_LOG_FUNC_EXIT__;
1100 group = (wfd_group_s*) manager->group;
1102 group = wfd_create_pending_group(manager, event->intf_addr);
1104 WDS_LOGE("Failed to create pending group");
1105 __WDS_LOG_FUNC_EXIT__;
1108 manager->group = group;
1110 wfd_group_add_member(group, peer->dev_addr);
1112 session->state = SESSION_STATE_COMPLETED;
1113 peer->state = WFD_PEER_STATE_CONNECTED;
1115 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1116 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1118 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1119 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1121 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1122 WFD_EVENT_CONNECTION_RSP,
1125 wfd_update_peer(manager, peer);
1126 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
1127 if (event->ip_addr_peer[3]) {
1128 peer->ip_type = WFD_IP_TYPE_OVER_EAPOL;
1129 memcpy(peer->client_ip_addr, event->ip_addr_peer, IPADDR_LEN);
1130 WDS_LOGE("Peer's client IP [" IPSTR "]", IP2STR((char*) &peer->client_ip_addr));
1131 memcpy(peer->go_ip_addr, manager->local->ip_addr, IPADDR_LEN);
1132 WDS_LOGE("Peer's GO IP [" IPSTR "]", IP2STR((char*) &peer->go_ip_addr));
1134 if (peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
1135 char peer_mac_address[MACSTR_LEN+1] = {0,};
1136 char assigned_ip_address[IPSTR_LEN+1] = {0,};
1138 memcpy(peer->ip_addr, peer->client_ip_addr, IPADDR_LEN);
1140 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1141 g_snprintf(assigned_ip_address, IPSTR_LEN, IPSTR, IP2STR(peer->ip_addr));
1142 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1144 g_variant_new("(ss)", peer_mac_address,
1145 assigned_ip_address));
1146 #if defined(TIZEN_FEATURE_ASP)
1147 if (!ISZEROMACADDR(session->session_mac)) {
1148 wfd_asp_connect_status(session->session_mac,
1149 session->session_id,
1150 ASP_CONNECT_STATUS_GROUP_FORMATION_COMPLETED,
1153 wfd_asp_session_peer_ip(session->session_mac, session->session_id,
1154 session->service_mac, peer->ip_addr);
1158 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
1159 wfd_util_dhcps_wait_ip_leased(peer);
1160 wfd_destroy_session(manager);
1162 __WDS_LOG_FUNC_EXIT__;
1166 void wfd_event_sta_disconnected(wfd_oem_event_s *event)
1168 __WDS_LOG_FUNC_ENTER__;
1170 wfd_manager_s *manager = wfd_get_manager();
1171 wfd_group_s *group = NULL;
1172 wfd_device_s *peer = NULL;
1173 unsigned char peer_addr[MACADDR_LEN] = {0, };
1174 char peer_mac_address[MACSTR_LEN+1] = {0, };
1176 group = (wfd_group_s*) manager->group;
1178 WDS_LOGE("Group not found");
1179 __WDS_LOG_FUNC_EXIT__;
1183 if (ISZEROMACADDR(event->dev_addr)) {
1184 WDS_LOGD("Legacy Peer Disconnected [Peer: " MACSTR "]", MAC2STR(event->intf_addr));
1185 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->intf_addr));
1186 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1188 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1189 WFD_EVENT_DISCONNECTION_IND,
1192 wfd_group_remove_member(group, event->intf_addr);
1194 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1195 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1196 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1198 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1199 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1201 __WDS_LOG_FUNC_EXIT__;
1205 peer = wfd_group_find_member_by_addr(group, event->dev_addr);
1207 WDS_LOGE("Failed to find connected peer");
1208 peer = wfd_session_get_peer(manager->session);
1210 WDS_LOGE("Failed to find connecting peer");
1211 __WDS_LOG_FUNC_EXIT__;
1216 * If no peer connected and
1217 * disconnected event is not for connecting peer
1218 * then event should be ignored.
1219 * This situation can arrise when TV is GO and
1220 * some connected peer sent disassociation.
1222 if (memcmp(peer_addr, event->dev_addr, MACADDR_LEN)) {
1223 WDS_LOGE("Unexpected event, Ignore it...");
1224 __WDS_LOG_FUNC_EXIT__;
1228 memcpy(peer_addr, peer->dev_addr, MACADDR_LEN);
1231 * If state is not DISCONNECTING, connection is finished by peer.
1232 * Required the check also, when Device is Group Owner and state is DISCOVERING.
1234 if (manager->state >= WIFI_DIRECT_STATE_CONNECTED ||
1235 (manager->state == WIFI_DIRECT_STATE_DISCOVERING &&
1236 manager->local->dev_role == WFD_DEV_ROLE_GO)) {
1237 wfd_group_remove_member(group, peer_addr);
1238 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1239 if (group->member_count) {
1240 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1242 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1243 WFD_EVENT_DISASSOCIATION_IND,
1246 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1248 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1249 WFD_EVENT_DISCONNECTION_IND,
1253 } else if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
1254 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1255 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1257 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1258 WFD_EVENT_DISCONNECTION_RSP,
1261 } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING &&
1262 /* Some devices(GO) send disconnection message before connection completed.
1263 * This message should be ignored when device is not GO */
1264 manager->local->dev_role == WFD_DEV_ROLE_GO) {
1265 if (WFD_PEER_STATE_CONNECTED == peer->state) {
1266 WDS_LOGD("Peer is already Connected !!!");
1267 wfd_group_remove_member(group, peer_addr);
1268 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1269 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1271 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1272 WFD_EVENT_DISASSOCIATION_IND,
1275 } else if (WFD_PEER_STATE_CONNECTING == peer->state) {
1276 WDS_LOGD("Peer is Connecting...");
1277 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1278 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1280 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
1281 WFD_EVENT_CONNECTION_RSP,
1283 #if defined(TIZEN_FEATURE_ASP)
1284 wfd_session_s *session = manager->session;
1285 if (session && !ISZEROMACADDR(session->session_mac))
1286 wfd_asp_connect_status(session->session_mac,
1287 session->session_id,
1288 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
1292 WDS_LOGE("Unexpected Peer State. Ignore it");
1293 __WDS_LOG_FUNC_EXIT__;
1297 WDS_LOGE("Unexpected event. Ignore it");
1298 __WDS_LOG_FUNC_EXIT__;
1302 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1303 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1304 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1306 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1307 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1310 /* If there is no member, GO should be destroyed */
1311 if (!group->member_count) {
1312 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1313 wfd_destroy_group(manager);
1314 wfd_peer_clear_all(manager);
1317 wfd_destroy_session(manager);
1319 __WDS_LOG_FUNC_EXIT__;
1323 void wfd_event_terminating(wfd_oem_event_s *event)
1325 __WDS_LOG_FUNC_ENTER__;
1327 __WDS_LOG_FUNC_EXIT__;
1331 void wfd_event_group_formation_failure(wfd_oem_event_s *event)
1333 __WDS_LOG_FUNC_ENTER__;
1335 wfd_manager_s *manager = wfd_get_manager();
1336 wfd_session_s *session = (wfd_session_s*) manager->session;
1338 WDS_LOGE("Unexpected event. Session not exist");
1339 __WDS_LOG_FUNC_EXIT__;
1343 unsigned char *peer_addr = wfd_session_get_peer_addr(session);
1345 WDS_LOGE("Session do not has peer");
1346 __WDS_LOG_FUNC_EXIT__;
1350 char peer_mac_address[MACSTR_LEN+1] = {0, };
1351 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1352 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1354 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
1355 WFD_EVENT_CONNECTION_RSP,
1358 #if defined(TIZEN_FEATURE_ASP)
1359 if (!ISZEROMACADDR(session->session_mac))
1360 wfd_asp_connect_status(session->session_mac,
1361 session->session_id,
1362 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
1366 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1367 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1368 wfd_destroy_session(manager);
1369 manager->local->dev_role = WFD_DEV_ROLE_NONE;
1371 wfd_oem_refresh(manager->oem_ops);
1373 __WDS_LOG_FUNC_EXIT__;
1378 * This event is generated by supplicant when persitent invite is auto accepted
1379 * so that wfd-manager can get indication that a peer will be connected in near future.
1380 * session is started for that peer, so that it is not ignored when connected.
1382 void wfd_event_invitation_accepted(wfd_oem_event_s *event)
1385 __WDS_LOG_FUNC_ENTER__;
1387 wfd_manager_s *manager = wfd_get_manager();
1388 wfd_session_s *session = (wfd_session_s*) manager->session;
1389 wfd_device_s *peer = NULL;
1390 char peer_mac_address[MACSTR_LEN+1] = {0, };
1392 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
1394 WDS_LOGI("Invitation from unknown peer. Add new peer");
1395 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
1397 WDS_LOGE("Failed to add peer for invitation");
1398 __WDS_LOG_FUNC_EXIT__;
1402 /**By default, peer device information is complete but there's some exception
1403 * if DEV-FOUND event was not preceding before connection start event.
1405 wfd_update_peer(manager, peer);
1406 peer->dev_role = WFD_DEV_ROLE_GO;
1409 session = wfd_create_session(manager, event->dev_addr,
1410 event->wps_mode, SESSION_DIRECTION_INCOMING);
1412 WDS_LOGE("Failed to create session with peer [" MACSTR "]",
1413 MAC2STR(event->dev_addr));
1414 __WDS_LOG_FUNC_EXIT__;
1419 session->state = SESSION_STATE_WPS;
1420 wfd_session_timer(session, 1);
1422 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1423 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1425 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1426 WFD_EVENT_CONNECTION_IN_PROGRESS,
1429 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
1430 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
1432 __WDS_LOG_FUNC_EXIT__;
1435 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1436 void wfd_event_serv_disc_resp(wfd_oem_event_s *event)
1438 __WDS_LOG_FUNC_ENTER__;
1440 wfd_manager_s *manager = wfd_get_manager();
1442 char response_data[256] = {0, };
1443 char peer_mac_address[MACSTR_LEN+1] = {0, };
1445 wfd_update_peer_time(manager, event->dev_addr);
1447 if (event->edata_type == WFD_OEM_EDATA_TYPE_NEW_SERVICE) {
1448 wfd_oem_new_service_s *service = NULL;;
1450 GList *services = (GList*) event->edata;
1453 WDS_LOGD("%d service data found", event->dev_role);
1455 temp = g_list_first(services);
1456 while (temp && count < event->dev_role) {
1457 service = (wfd_oem_new_service_s*) temp->data;
1458 service_type = service->protocol;
1459 if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
1460 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1461 g_snprintf(response_data, 256, "%s|%s", service->data.bonjour.query, service->data.bonjour.rdata);
1462 WDS_LOGD("Found service: [%d: %s] - [" MACSECSTR "]", service->protocol,
1463 service->data.bonjour.query, MAC2SECSTR(event->dev_addr));
1465 WDS_LOGD("Found service is not supported");
1469 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
1471 g_variant_new("(iss)", service_type,
1475 temp = g_list_next(temp);
1479 } else if (event->edata_type == WFD_OEM_EDATA_TYPE_SERVICE) {
1480 wfd_oem_service_data_s *edata = (wfd_oem_service_data_s*) event->edata;
1485 service_type = edata->type;
1486 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1487 switch (edata->type) {
1488 WDS_LOGE("Unknown type [type ID: %d]", edata->type);
1492 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
1494 g_variant_new("(iss)", service_type,
1499 __WDS_LOG_FUNC_EXIT__;
1503 void wfd_event_serv_disc_started(wfd_oem_event_s *event)
1505 __WDS_LOG_FUNC_ENTER__;
1507 __WDS_LOG_FUNC_EXIT__;
1510 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1513 #if defined(TIZEN_FEATURE_ASP)
1514 void wfd_event_asp_serv_resp(wfd_oem_event_s *event)
1516 __WDS_LOG_FUNC_ENTER__;
1518 wfd_oem_asp_service_s *service = NULL;
1519 GVariantBuilder *builder = NULL;
1520 GVariant *params = NULL;
1522 service = (wfd_oem_asp_service_s *)event->edata;
1523 if (service == NULL) {
1524 WDS_LOGE("P2P service found event has NULL information");
1525 __WDS_LOG_FUNC_EXIT__;
1529 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1530 g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("u", service->search_id));
1531 g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", event->dev_addr));
1532 g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
1533 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
1534 if (service->service_type)
1535 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type));
1536 if (service->service_info)
1537 g_variant_builder_add(builder, "{sv}", "service_info", g_variant_new("s", service->service_info));
1538 g_variant_builder_add(builder, "{sv}", "status", g_variant_new("y", service->status));
1539 params = g_variant_new("(a{sv})", builder);
1540 g_variant_builder_unref(builder);
1542 wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
1546 __WDS_LOG_FUNC_EXIT__;
1550 int __wfd_handle_asp_prov(wfd_manager_s *manager, wfd_oem_event_s *event)
1552 __WDS_LOG_FUNC_ENTER__;
1554 wfd_session_s *session = NULL;
1555 wfd_oem_asp_prov_s *prov_params = NULL;
1558 prov_params = (wfd_oem_asp_prov_s *)event->edata;
1559 if (prov_params == NULL) {
1560 WDS_LOGE("Invalid parameter");
1561 __WDS_LOG_FUNC_EXIT__;
1565 res = wfd_session_process_event(manager, event);
1566 session = (wfd_session_s *)manager->session;
1567 if (res < 0 || session == NULL) {
1568 WDS_LOGE("Failed to process event of session");
1569 __WDS_LOG_FUNC_EXIT__;
1572 session->session_id = prov_params->session_id;
1573 memcpy(session->session_mac, prov_params->session_mac, MACADDR_LEN);
1574 memcpy(session->service_mac, prov_params->service_mac, MACADDR_LEN);
1576 __WDS_LOG_FUNC_EXIT__;
1580 int __wfd_handle_asp_prov_done(wfd_session_s *session, wfd_oem_event_s *event)
1582 __WDS_LOG_FUNC_ENTER__;
1584 wfd_oem_asp_prov_s *prov_params = NULL;
1585 prov_params = (wfd_oem_asp_prov_s *)event->edata;
1588 if (prov_params->persist &&
1589 (prov_params->network_role || prov_params->network_config)) {
1590 WDS_LOGE("Persistent group is used but "
1591 "conncap/dev_passwd_id are present");
1592 __WDS_LOG_FUNC_EXIT__;
1596 if (!prov_params->persist &&
1597 (!prov_params->network_role && !prov_params->network_config)) {
1598 WDS_LOGE("Persistent group not used but "
1599 "conncap/dev_passwd_id are missing");
1600 __WDS_LOG_FUNC_EXIT__;
1604 if (session->wps_mode == WFD_OEM_WPS_MODE_P2PS)
1605 g_strlcpy(session->wps_pin, OEM_DEFAULT_P2PS_PIN, OEM_PINSTR_LEN + 1);
1607 if (prov_params->persist) {
1608 res = wfd_session_asp_persistent_connect(session, prov_params->persistent_group_id);
1609 } else if (prov_params->network_role == WFD_OEM_ASP_SESSION_ROLE_NEW) {
1610 res = wfd_session_asp_connect(session, WFD_OEM_ASP_SESSION_ROLE_NEW);
1611 } else if (prov_params->network_role == WFD_OEM_ASP_SESSION_ROLE_CLIENT) {
1612 res = wfd_session_asp_connect(session, WFD_OEM_ASP_SESSION_ROLE_CLIENT);
1613 } else if (prov_params->network_role == WFD_OEM_ASP_SESSION_ROLE_GO) {
1614 res = wfd_session_asp_connect(session, WFD_OEM_ASP_SESSION_ROLE_GO);
1615 WDS_LOGD("don't need to take action.");
1618 WDS_LOGE("Unhandled event");
1619 __WDS_LOG_FUNC_EXIT__;
1623 __WDS_LOG_FUNC_EXIT__;
1626 void wfd_event_asp_prov_start(wfd_oem_event_s *event)
1628 __WDS_LOG_FUNC_ENTER__;
1630 wfd_manager_s *manager = wfd_get_manager();
1631 wfd_session_s *session = NULL;
1632 wfd_oem_asp_prov_s *prov_params = NULL;
1635 if (event == NULL || event->edata == NULL) {
1636 WDS_LOGE("Invalid parameter");
1637 __WDS_LOG_FUNC_EXIT__;
1641 prov_params = (wfd_oem_asp_prov_s *)event->edata;
1642 res = __wfd_handle_asp_prov(manager, event);
1643 session = (wfd_session_s *)manager->session;
1644 if (res < 0 || session == NULL) {
1645 WDS_LOGE("Failed to process event of session");
1646 __WDS_LOG_FUNC_EXIT__;
1650 WDS_LOGD("created session [%u] with peer [" MACSTR "]", session->session_id,
1651 MAC2STR(session->session_mac));
1653 /* Incomming Session, auto_accept = TRUE emit request Received */
1654 /* generate SessionConfigRequest if event->wps_mode is not P2PS and return*/
1656 wfd_session_timer(session, 1);
1657 wfd_asp_session_request(prov_params);
1658 wfd_asp_connect_status(prov_params->session_mac,
1659 prov_params->session_id,
1660 ASP_CONNECT_STATUS_REQUEST_RECEIVED,
1663 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
1665 __WDS_LOG_FUNC_EXIT__;
1669 void wfd_event_asp_prov_done(wfd_oem_event_s *event)
1671 __WDS_LOG_FUNC_ENTER__;
1673 wfd_manager_s *manager = wfd_get_manager();
1674 wfd_session_s *session = NULL;
1675 wfd_oem_asp_prov_s *prov_params;
1678 if (event == NULL || event->edata == NULL) {
1679 WDS_LOGE("Invalid parameter");
1680 __WDS_LOG_FUNC_EXIT__;
1684 prov_params = (wfd_oem_asp_prov_s *)event->edata;
1685 /* Incomming Session, auto_accept = TRUE emit request Received */
1686 /* generate SessionConfigRequest if event->wps_mode is not P2PS and return*/
1687 if (manager->session == NULL) {
1688 wfd_asp_session_request(prov_params);
1689 wfd_asp_connect_status(prov_params->session_mac,
1690 prov_params->session_id,
1691 ASP_CONNECT_STATUS_REQUEST_RECEIVED,
1695 res = __wfd_handle_asp_prov(manager, event);
1696 session = (wfd_session_s *)manager->session;
1697 if (res < 0 || session == NULL) {
1698 WDS_LOGE("Failed to process event of session");
1699 wfd_destroy_session(manager);
1700 wfd_asp_connect_status(prov_params->session_mac,
1701 prov_params->session_id,
1702 ASP_CONNECT_STATUS_REQUEST_FAILED,
1704 wfd_oem_refresh(manager->oem_ops);
1705 __WDS_LOG_FUNC_EXIT__;
1709 if (prov_params->status != WFD_OEM_SC_SUCCESS &&
1710 prov_params->status != WFD_OEM_SC_SUCCESS_ACCEPTED_BY_USER) {
1711 WDS_LOGD("ASP-PROV failed. remove session.");
1712 wfd_destroy_session(manager);
1713 wfd_oem_refresh(manager->oem_ops);
1714 wfd_asp_connect_status(prov_params->session_mac,
1715 prov_params->session_id,
1716 ASP_CONNECT_STATUS_REQUEST_FAILED,
1718 __WDS_LOG_FUNC_EXIT__;
1722 wfd_asp_connect_status(prov_params->session_mac,
1723 prov_params->session_id,
1724 ASP_CONNECT_STATUS_REQUEST_ACCEPTED,
1727 wfd_asp_connect_status(prov_params->session_mac,
1728 prov_params->session_id,
1729 ASP_CONNECT_STATUS_GROUP_FORMATION_STARTED,
1731 res = __wfd_handle_asp_prov_done(session, event);
1733 WDS_LOGE("Connect failed. remove session.");
1734 wfd_destroy_session(manager);
1735 wfd_oem_refresh(manager->oem_ops);
1737 wfd_asp_connect_status(prov_params->session_mac,
1738 prov_params->session_id,
1739 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
1741 __WDS_LOG_FUNC_EXIT__;
1745 WDS_LOGD("Provision done succeeded.");
1746 __WDS_LOG_FUNC_EXIT__;
1749 #endif /* TIZEN_FEATURE_ASP */
1751 void wfd_event_init(wfd_oem_event_cbs_s *event_cbs)
1753 __WDS_LOG_FUNC_ENTER__;
1756 __WDS_LOG_FUNC_EXIT__;
1760 event_cbs->deactivated_cb = wfd_event_deactivated;
1761 event_cbs->peer_found_cb = wfd_event_peer_found;
1762 event_cbs->peer_disappeared_cb = wfd_event_peer_disappeared;
1763 event_cbs->discovery_finished_cb = wfd_event_discovery_finished;
1765 event_cbs->prov_disc_req_cb = wfd_event_prov_disc_req;
1766 event_cbs->prov_disc_resp_cb = wfd_event_prov_disc_resp;
1767 event_cbs->prov_disc_fail_cb = wfd_event_prov_disc_fail;
1769 event_cbs->go_neg_req_cb = wfd_event_go_neg_req;
1770 event_cbs->go_neg_fail_cb = wfd_event_go_neg_fail;
1771 event_cbs->go_neg_done_cb = wfd_event_go_neg_done;
1773 event_cbs->wps_fail_cb = wfd_event_wps_fail;
1774 event_cbs->wps_done_cb = wfd_event_wps_done;
1775 event_cbs->key_neg_fail_cb = wfd_event_key_neg_fail;
1776 event_cbs->key_neg_done_cb = wfd_event_key_neg_done;
1778 event_cbs->conn_fail_cb = wfd_event_conn_fail;
1779 event_cbs->conn_done_cb = wfd_event_conn_done;
1781 event_cbs->group_created_cb = wfd_event_group_created;
1782 event_cbs->group_destroyed_cb = wfd_event_group_destroyed;
1784 event_cbs->invitation_req_cb = wfd_event_invitation_req;
1785 event_cbs->invitation_resp_cb = wfd_event_invitation_res;
1786 event_cbs->sta_connected_cb = wfd_event_sta_connected;
1787 event_cbs->sta_disconnected_cb = wfd_event_sta_disconnected;
1789 event_cbs->terminating_cb = wfd_event_terminating;
1791 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1792 event_cbs->serv_disc_resp_cb = wfd_event_serv_disc_resp;
1793 event_cbs->serv_disc_started_cb = wfd_event_serv_disc_started;
1794 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1796 event_cbs->group_formation_failure_cb = wfd_event_group_formation_failure;
1797 event_cbs->invitation_accepted_cb = wfd_event_invitation_accepted;
1799 #if defined(TIZEN_FEATURE_ASP)
1800 event_cbs->asp_serv_resp_cb = wfd_event_asp_serv_resp;
1801 event_cbs->asp_prov_start_cb = wfd_event_asp_prov_start;
1802 event_cbs->asp_prov_done_cb = wfd_event_asp_prov_done;
1803 #endif /* TIZEN_FEATURE_ASP */
1805 event_cbs->extra_data = NULL;
1807 __WDS_LOG_FUNC_EXIT__;