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 #include "wifi-direct-asp.h"
53 static int _wfd_event_update_peer(wfd_manager_s *manager, wfd_oem_dev_data_s *data)
55 __WDS_LOG_FUNC_ENTER__;
57 wfd_device_s *peer = NULL;
59 if (!manager || !data) {
60 WDS_LOGE("Invalid parameter");
61 __WDS_LOG_FUNC_EXIT__;
65 peer = wfd_peer_find_by_dev_addr(manager, data->p2p_dev_addr);
67 peer = wfd_add_peer(manager, data->p2p_dev_addr, data->name);
69 WDS_LOGE("Failed to add peer");
70 __WDS_LOG_FUNC_EXIT__;
74 if (strcmp(peer->dev_name, data->name)) {
75 g_strlcpy(peer->dev_name, data->name, DEV_NAME_LEN + 1);
76 WDS_LOGD("Device name is changed [" MACSECSTR ": %s]",
77 MAC2SECSTR(peer->dev_addr), peer->dev_name);
80 peer->pri_dev_type = data->pri_dev_type;
81 peer->sec_dev_type = data->sec_dev_type;
82 peer->config_methods = data->config_methods;
83 peer->dev_flags = data->dev_flags;
84 peer->group_flags = data->group_flags;
85 peer->dev_role = data->dev_role;
86 peer->rssi = data->rssi;
87 WDS_LOGD("Peer RSSI value is %d", peer->rssi);
89 if (manager->is_wifi_display_supported)
90 memcpy(&(peer->display), &(data->display), sizeof(wfd_display_s));
92 #if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
93 wfd_util_get_current_time(&peer->time);
96 gettimeofday(&tval, NULL);
97 peer->time = tval.tv_sec;
99 WDS_LOGI("Update time [%s - %ld]", peer->dev_name, peer->time);
101 __WDS_LOG_FUNC_EXIT__;
105 gboolean _wfd_connection_retry(gpointer *data)
107 wfd_session_s *session = (wfd_session_s*) data;
109 WDS_LOGE("Session is NULL");
110 __WDS_LOG_FUNC_EXIT__;
111 return G_SOURCE_REMOVE;
114 switch (session->state) {
115 case SESSION_STATE_STARTED:
116 WDS_LOGD("PD again");
117 wfd_session_start(session);
119 case SESSION_STATE_GO_NEG:
120 WDS_LOGD("Negotiation again");
121 wfd_session_connect(session);
123 case SESSION_STATE_WPS:
124 WDS_LOGD("WPS again");
125 wfd_session_wps(session);
128 WDS_LOGE("Invalid session state [%d]", session->state);
131 __WDS_LOG_FUNC_EXIT__;
132 return G_SOURCE_REMOVE;
135 void wfd_event_deactivated(wfd_oem_event_s *event)
137 __WDS_LOG_FUNC_ENTER__;
139 wfd_manager_s *manager = wfd_get_manager();
141 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
143 g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE));
145 wfd_destroy_session(manager);
146 wfd_destroy_group(manager);
147 wfd_peer_clear_all(manager);
148 wfd_local_reset_data(manager);
150 wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATED);
151 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATED);
152 manager->req_wps_mode = WFD_WPS_MODE_PBC;
154 if (manager->is_connection_agent)
155 wfd_util_stop_wifi_direct_popup();
157 __WDS_LOG_FUNC_EXIT__;
161 void wfd_event_peer_found(wfd_oem_event_s *event)
163 __WDS_LOG_FUNC_ENTER__;
165 wfd_manager_s *manager = wfd_get_manager();
166 wfd_oem_dev_data_s *edata = NULL;
167 char peer_mac_address[MACSTR_LEN+1] = {0, };
170 edata = (wfd_oem_dev_data_s*) event->edata;
171 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
172 WDS_LOGE("Invalid event data");
173 __WDS_LOG_FUNC_EXIT__;
177 res = _wfd_event_update_peer(manager, edata);
179 WDS_LOGE("Failed to update peer data");
180 __WDS_LOG_FUNC_EXIT__;
184 if (manager->state > WIFI_DIRECT_STATE_ACTIVATING &&
185 manager->state != WIFI_DIRECT_STATE_CONNECTING &&
186 manager->state != WIFI_DIRECT_STATE_DISCONNECTING) {
187 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(edata->p2p_dev_addr));
188 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
190 g_variant_new("(s)", peer_mac_address));
193 if (manager->is_asp_supported) {
195 GVariantBuilder *builder = NULL;
196 GVariant *params = NULL;
197 wfd_oem_advertise_service_s *service;
199 for (list = (GList *)event->asp_services; list != NULL; list = list->next) {
200 service = (wfd_oem_advertise_service_s *)list->data;
202 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
203 g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("t", service->search_id));
204 g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", peer_mac_address));
205 g_variant_builder_add(builder, "{sv}", "device_name", g_variant_new("s", edata->name));
206 g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
207 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
208 if (service->service_type)
209 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type));
210 params = g_variant_new("(a{sv})", builder);
211 g_variant_builder_unref(builder);
213 wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
218 for (list = (GList *)event->asp2_services; list != NULL; list = list->next) {
219 service = (wfd_oem_advertise_service_s *)list->data;
221 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
222 g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("t", service->search_id));
223 g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", peer_mac_address));
224 g_variant_builder_add(builder, "{sv}", "device_name", g_variant_new("s", edata->name));
225 g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
226 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
227 if (service->service_type)
228 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type));
229 if (service->instance_name)
230 g_variant_builder_add(builder, "{sv}", "instance_name", g_variant_new("s", service->instance_name));
231 params = g_variant_new("(a{sv})", builder);
232 g_variant_builder_unref(builder);
234 wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
239 __WDS_LOG_FUNC_EXIT__;
243 void wfd_event_peer_disappeared(wfd_oem_event_s *event)
245 __WDS_LOG_FUNC_ENTER__;
247 wfd_manager_s *manager = wfd_get_manager();
248 wfd_session_s *session = NULL;
249 wfd_device_s *peer = NULL;
250 char peer_mac_address[MACSTR_LEN+1] = {0, };
252 session = manager->session;
253 if (session != NULL && session->peer != NULL) {
254 peer = session->peer;
255 WDS_LOGD("session peer [" MACSTR "] lost peer [" MACSTR "]", MAC2STR(peer->dev_addr),
256 MAC2STR(event->dev_addr));
257 if (memcmp(peer->dev_addr, event->dev_addr, MACADDR_LEN) == 0) {
258 WDS_LOGD("peer already in connection");
263 wfd_remove_peer(manager, event->dev_addr);
265 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
266 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
268 g_variant_new("(s)", peer_mac_address));
270 __WDS_LOG_FUNC_EXIT__;
274 void wfd_event_discovery_finished(wfd_oem_event_s *event)
276 __WDS_LOG_FUNC_ENTER__;
278 wfd_manager_s *manager = wfd_get_manager();
280 if (manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
281 manager->state != WIFI_DIRECT_STATE_ACTIVATED) {
282 WDS_LOGE("Notify finding stopped when discovering or activated. [%d]", manager->state);
283 __WDS_LOG_FUNC_EXIT__;
287 if (manager->scan_mode == WFD_SCAN_MODE_PASSIVE) {
288 WDS_LOGE("During passive scan, Discover Finished event will not notified");
289 __WDS_LOG_FUNC_EXIT__;
293 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
294 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
295 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
297 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
298 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
300 manager->scan_mode = WFD_SCAN_MODE_NONE;
302 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
306 __WDS_LOG_FUNC_EXIT__;
310 void wfd_event_prov_disc_req(wfd_oem_event_s *event)
312 __WDS_LOG_FUNC_ENTER__;
314 wfd_manager_s *manager = wfd_get_manager();
315 wfd_device_s *peer = NULL;
316 wfd_device_s *member = NULL;
318 wfd_group_s *group = (wfd_group_s*) manager->group;
320 if (group && group->role == WFD_DEV_ROLE_GC) {
321 WDS_LOGD("Device has GC role - ignore this provision request");
322 __WDS_LOG_FUNC_EXIT__;
326 member = wfd_group_find_member_by_addr(group, event->dev_addr);
328 /* PD request can be arrived from peer device
329 * when connection is timeout to close connection */
330 WDS_LOGE("Unexpected Event - Member already exist");
331 __WDS_LOG_FUNC_EXIT__;
335 wfd_oem_dev_data_s *edata = NULL;
337 edata = (wfd_oem_dev_data_s*) event->edata;
338 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
339 WDS_LOGE("Invalid event data");
340 __WDS_LOG_FUNC_EXIT__;
344 res = _wfd_event_update_peer(manager, edata);
345 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
347 if (WFD_DEV_ROLE_GO != manager->local->dev_role) {
348 WDS_LOGI("TV is not GO, updated peer data only.");
350 manager->local->wps_mode = event->wps_mode;
351 if (event->wps_mode == WFD_WPS_MODE_PBC ||
352 event->wps_mode == WFD_WPS_MODE_KEYPAD) {
353 __WDS_LOG_FUNC_EXIT__;
359 peer->state = WFD_PEER_STATE_CONNECTING;
361 res = wfd_session_process_event(manager, event);
363 WDS_LOGE("Failed to process event of session");
365 __WDS_LOG_FUNC_EXIT__;
369 void wfd_event_prov_disc_resp(wfd_oem_event_s *event)
371 __WDS_LOG_FUNC_ENTER__;
373 wfd_manager_s *manager = wfd_get_manager();
374 wfd_device_s *peer = NULL;
377 wfd_oem_dev_data_s *edata = NULL;
379 edata = (wfd_oem_dev_data_s*) event->edata;
380 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
381 WDS_LOGE("Invalid event data");
382 __WDS_LOG_FUNC_EXIT__;
386 res = _wfd_event_update_peer(manager, edata);
387 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
389 peer->state = WFD_PEER_STATE_CONNECTING;
391 res = wfd_session_process_event(manager, event);
393 WDS_LOGE("Failed to process event of session");
395 __WDS_LOG_FUNC_EXIT__;
399 static bool __asp_prov_disc_deferred(wfd_session_s *session, void *event_data)
401 wfd_oem_asp_prov_s *prov_params = (wfd_oem_asp_prov_s *)event_data;
402 bool is_deferred = false;
404 if (prov_params && !ISZEROMACADDR(session->session_mac)) {
405 /* This connection is for ASP session */
406 if (prov_params->status == WFD_OEM_SC_FAIL_INVALID_PARAMS) {
407 WDS_LOGD("ASP prov disc deferred. wait response.");
408 wfd_asp_connect_status(session->session_mac,
410 ASP_CONNECT_STATUS_REQUEST_DEFERRED,
415 __WDS_LOG_FUNC_EXIT__;
419 void wfd_event_prov_disc_fail(wfd_oem_event_s *event)
421 __WDS_LOG_FUNC_ENTER__;
423 wfd_manager_s *manager = wfd_get_manager();
424 wfd_session_s *session = NULL;
425 unsigned char *peer_addr = NULL;
426 char peer_mac_address[MACSTR_LEN+1] = {0, };
428 session = (wfd_session_s*) manager->session;
430 WDS_LOGE("Unexpected event. Session not exist");
431 __WDS_LOG_FUNC_EXIT__;
435 peer_addr = wfd_session_get_peer_addr(session);
437 WDS_LOGE("Session do not have peer");
438 __WDS_LOG_FUNC_EXIT__;
442 if (manager->is_asp_supported) {
443 if (__asp_prov_disc_deferred(session, event->edata)) {
444 /* start listen to wait for provision discovery request from peer */
445 wfd_oem_scan_param_s param;
446 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
447 param.scan_mode = WFD_OEM_SCAN_MODE_PASSIVE;
448 wfd_oem_start_scan(manager->oem_ops, ¶m);
449 __WDS_LOG_FUNC_EXIT__;
454 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
455 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
457 g_variant_new("(iis)",
458 WIFI_DIRECT_ERROR_CONNECTION_FAILED,
459 WFD_EVENT_CONNECTION_RSP,
461 if (wfd_asp_is_asp_session(session)) {
462 WDS_LOGD("ASP prov disc failed. remove session.");
463 wfd_asp_connect_status(session->session_mac,
465 ASP_CONNECT_STATUS_REQUEST_FAILED,
469 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
470 wfd_group_s *group = (wfd_group_s*) manager->group;
471 if (group && !group->member_count &&
472 wfd_util_is_remove_group_allowed()) {
473 wfd_destroy_group(manager);
475 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
476 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
478 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
479 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
482 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
483 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
486 wfd_destroy_session(manager);
488 wfd_oem_refresh(manager->oem_ops);
490 /* After connection failed, scan again */
491 wfd_oem_scan_param_s param;
492 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
493 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
495 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
496 wfd_oem_start_scan(manager->oem_ops, ¶m);
497 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
499 __WDS_LOG_FUNC_EXIT__;
503 void wfd_event_go_neg_req(wfd_oem_event_s *event)
505 __WDS_LOG_FUNC_ENTER__;
507 wfd_manager_s *manager = wfd_get_manager();
508 wfd_group_s *group = (wfd_group_s*) manager->group;
509 if (group && group->role == WFD_DEV_ROLE_GC) {
510 WDS_LOGD("Device has GC role - ignore this go neg request");
511 __WDS_LOG_FUNC_EXIT__;
515 wfd_oem_dev_data_s *edata = NULL;
518 edata = (wfd_oem_dev_data_s*) event->edata;
519 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
520 WDS_LOGE("Invalid event data");
521 __WDS_LOG_FUNC_EXIT__;
525 res = _wfd_event_update_peer(manager, edata);
527 WDS_LOGE("Failed to update peer data");
528 __WDS_LOG_FUNC_EXIT__;
532 wfd_session_process_event(manager, event);
533 __WDS_LOG_FUNC_EXIT__;
537 void wfd_event_go_neg_fail(wfd_oem_event_s *event)
539 __WDS_LOG_FUNC_ENTER__;
541 wfd_manager_s *manager = wfd_get_manager();
542 wfd_session_s *session = NULL;
543 wfd_oem_conn_data_s *edata = NULL;
544 unsigned char *peer_addr = NULL;
545 char peer_mac_address[MACSTR_LEN] = {0, };
547 session = (wfd_session_s*) manager->session;
549 WDS_LOGE("Unexpected event. Session not exist");
550 __WDS_LOG_FUNC_EXIT__;
554 peer_addr = wfd_session_get_peer_addr(session);
556 WDS_LOGE("Session do not have peer");
557 __WDS_LOG_FUNC_EXIT__;
561 edata = (wfd_oem_conn_data_s*) event->edata;
563 WDS_LOGE("Invalid p2p connection data");
564 __WDS_LOG_FUNC_EXIT__;
568 if (edata->status < 0 && session->connecting_120) {
569 if (session->retry_gsrc) {
570 g_source_remove(session->retry_gsrc);
571 session->retry_gsrc = 0;
573 session->retry_gsrc = g_idle_add((GSourceFunc) _wfd_connection_retry, session);
574 WDS_LOGD("Connection will be retried");
575 __WDS_LOG_FUNC_EXIT__;
579 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
580 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
582 g_variant_new("(iis)",
583 WIFI_DIRECT_ERROR_CONNECTION_FAILED,
584 WFD_EVENT_CONNECTION_RSP,
587 if (wfd_asp_is_asp_session(session)) {
588 wfd_asp_connect_status(session->session_mac,
590 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
594 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
595 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
597 wfd_destroy_session(manager);
598 wfd_destroy_group(manager);
599 manager->local->dev_role = WFD_DEV_ROLE_NONE;
600 __WDS_LOG_FUNC_EXIT__;
604 void wfd_event_go_neg_done(wfd_oem_event_s *event)
606 __WDS_LOG_FUNC_ENTER__;
608 wfd_manager_s *manager = wfd_get_manager();
609 wfd_session_s *session = NULL;
610 wfd_oem_conn_data_s *edata = NULL;
611 wfd_device_s *peer = NULL;
613 edata = (wfd_oem_conn_data_s*) event->edata;
615 WDS_LOGE("Invalid event data");
616 __WDS_LOG_FUNC_EXIT__;
620 session = (wfd_session_s*) manager->session;
621 if (session && session->peer) {
622 peer = session->peer;
623 memcpy(peer->intf_addr, edata->peer_intf_addr, MACADDR_LEN);
626 wfd_session_process_event(manager, event);
627 __WDS_LOG_FUNC_EXIT__;
631 void wfd_event_wps_fail(wfd_oem_event_s *event)
633 __WDS_LOG_FUNC_ENTER__;
635 wfd_manager_s *manager = wfd_get_manager();
636 wfd_session_s *session = NULL;
637 unsigned char *peer_addr = NULL;
639 session = (wfd_session_s*) manager->session;
641 WDS_LOGE("Unexpected event. Session not exist");
642 __WDS_LOG_FUNC_EXIT__;
646 peer_addr = wfd_session_get_peer_addr(session);
648 WDS_LOGE("Session do not have peer");
649 __WDS_LOG_FUNC_EXIT__;
653 char peer_mac_address[MACSTR_LEN+1] = {0, };
654 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
655 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
657 g_variant_new("(iis)",
658 WIFI_DIRECT_ERROR_CONNECTION_FAILED,
659 WFD_EVENT_CONNECTION_RSP,
661 if (wfd_asp_is_asp_session(session)) {
662 wfd_asp_connect_status(session->session_mac,
664 ASP_CONNECT_STATUS_GROUP_FORMATION_STARTED,
668 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
669 wfd_group_s *group = (wfd_group_s*) manager->group;
670 if (group && !group->member_count &&
671 wfd_util_is_remove_group_allowed()) {
672 wfd_destroy_group(manager);
674 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
675 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
677 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
678 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
681 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
682 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
685 wfd_destroy_session(manager);
687 wfd_oem_refresh(manager->oem_ops);
689 /* After connection failed, scan again */
690 wfd_oem_scan_param_s param;
691 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
692 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
694 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
695 wfd_oem_start_scan(manager->oem_ops, ¶m);
696 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
698 __WDS_LOG_FUNC_EXIT__;
702 void wfd_event_wps_done(wfd_oem_event_s *event)
704 __WDS_LOG_FUNC_ENTER__;
706 wfd_manager_s *manager = wfd_get_manager();
707 wfd_session_process_event(manager, event);
709 __WDS_LOG_FUNC_EXIT__;
713 void wfd_event_key_neg_fail(wfd_oem_event_s *event)
715 __WDS_LOG_FUNC_ENTER__;
717 wfd_manager_s *manager = wfd_get_manager();
718 wfd_session_s *session = NULL;
719 unsigned char *peer_addr = NULL;
720 char peer_mac_address[MACSTR_LEN+1] = {0, };
722 session = (wfd_session_s*) manager->session;
724 WDS_LOGE("Unexpected event. Session not exist");
725 __WDS_LOG_FUNC_EXIT__;
729 peer_addr = wfd_session_get_peer_addr(session);
731 WDS_LOGE("Session do not has peer");
732 __WDS_LOG_FUNC_EXIT__;
736 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
737 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
739 g_variant_new("(iis)",
740 WIFI_DIRECT_ERROR_CONNECTION_FAILED,
741 WFD_EVENT_CONNECTION_RSP,
743 if (wfd_asp_is_asp_session(session)) {
744 wfd_asp_connect_status(session->session_mac,
746 ASP_CONNECT_STATUS_GROUP_FORMATION_STARTED,
750 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
751 wfd_group_s *group = (wfd_group_s*) manager->group;
752 if (group && !group->member_count &&
753 wfd_util_is_remove_group_allowed()) {
754 wfd_destroy_group(manager);
756 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
757 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
759 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
760 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
763 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
764 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
767 wfd_destroy_session(manager);
769 wfd_oem_refresh(manager->oem_ops);
771 /* After connection failed, scan again */
772 wfd_oem_scan_param_s param;
773 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
774 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
776 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
777 wfd_oem_start_scan(manager->oem_ops, ¶m);
778 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
780 __WDS_LOG_FUNC_EXIT__;
784 void wfd_event_key_neg_done(wfd_oem_event_s *event)
786 __WDS_LOG_FUNC_ENTER__;
788 __WDS_LOG_FUNC_EXIT__;
792 void wfd_event_conn_fail(wfd_oem_event_s *event)
794 __WDS_LOG_FUNC_ENTER__;
796 __WDS_LOG_FUNC_EXIT__;
800 void wfd_event_conn_done(wfd_oem_event_s *event)
802 __WDS_LOG_FUNC_ENTER__;
804 __WDS_LOG_FUNC_EXIT__;
808 void wfd_event_group_created(wfd_oem_event_s *event)
810 __WDS_LOG_FUNC_ENTER__;
812 wfd_manager_s *manager = wfd_get_manager();
813 wfd_group_s *group = (wfd_group_s*) manager->group;
814 wfd_session_s *session = (wfd_session_s*) manager->session;
817 group = wfd_create_pending_group(manager, event->intf_addr);
819 WDS_LOGE("Failed to create pending group");
820 __WDS_LOG_FUNC_EXIT__;
824 manager->group = group;
827 wfd_group_complete(manager, event);
829 if (group->role == WFD_DEV_ROLE_GC && session) {
830 wfd_device_s *peer = session->peer;
832 WDS_LOGE("Unexpected event. Peer doesn't exist");
836 wfd_update_peer(manager, peer);
838 if (peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
839 char peer_mac_address[MACSTR_LEN+1] = {0, };
841 wfd_util_ip_over_eap_assign(peer, event->ifname);
843 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
844 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
846 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
847 WFD_EVENT_CONNECTION_RSP,
849 if (wfd_asp_is_asp_session(session)) {
850 wfd_asp_connect_status(session->session_mac,
852 ASP_CONNECT_STATUS_GROUP_FORMATION_COMPLETED,
854 wfd_asp_session_peer_ip(session->session_mac, session->session_id,
855 session->service_mac, peer->ip_addr);
857 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
858 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
860 wfd_destroy_session(manager);
862 wfd_peer_clear_all(manager);
864 if (group->flags & WFD_GROUP_FLAG_AUTONOMOUS) {
865 wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
867 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
868 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
871 __WDS_LOG_FUNC_EXIT__;
875 void wfd_event_group_destroyed(wfd_oem_event_s *event)
877 __WDS_LOG_FUNC_ENTER__;
879 wfd_manager_s *manager = wfd_get_manager();
880 char peer_mac_address[MACSTR_LEN+1] = {0, };
881 unsigned char *peer_addr = wfd_session_get_peer_addr(manager->session);
883 if (peer_addr != NULL)
884 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
886 g_snprintf(peer_mac_address, MACSTR_LEN, "%s", "");
888 if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
889 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
891 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
892 WFD_EVENT_DISCONNECTION_RSP,
895 } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING && manager->session) {
896 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
898 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
899 WFD_EVENT_CONNECTION_RSP,
901 wfd_session_s *session = manager->session;
902 if (wfd_asp_is_asp_session(session)) {
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_session(manager);
928 wfd_destroy_group(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 if (event->ip_addr_peer[3]) {
1127 peer->ip_type = WFD_IP_TYPE_OVER_EAPOL;
1128 memcpy(peer->client_ip_addr, event->ip_addr_peer, IPADDR_LEN);
1129 WDS_LOGE("Peer's client IP [" IPSTR "]", IP2STR((char*) &peer->client_ip_addr));
1130 memcpy(peer->go_ip_addr, manager->local->ip_addr, IPADDR_LEN);
1131 WDS_LOGE("Peer's GO IP [" IPSTR "]", IP2STR((char*) &peer->go_ip_addr));
1133 if (peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
1134 char peer_mac_address[MACSTR_LEN+1] = {0,};
1135 char assigned_ip_address[IPSTR_LEN+1] = {0,};
1137 memcpy(peer->ip_addr, peer->client_ip_addr, IPADDR_LEN);
1139 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1140 g_snprintf(assigned_ip_address, IPSTR_LEN, IPSTR, IP2STR(peer->ip_addr));
1141 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1143 g_variant_new("(ss)", peer_mac_address,
1144 assigned_ip_address));
1145 if (wfd_asp_is_asp_session(session)) {
1146 wfd_asp_connect_status(session->session_mac,
1147 session->session_id,
1148 ASP_CONNECT_STATUS_GROUP_FORMATION_COMPLETED,
1151 wfd_asp_session_peer_ip(session->session_mac, session->session_id,
1152 session->service_mac, peer->ip_addr);
1155 wfd_util_dhcps_wait_ip_leased(peer);
1157 wfd_destroy_session(manager);
1159 __WDS_LOG_FUNC_EXIT__;
1163 void wfd_event_sta_disconnected(wfd_oem_event_s *event)
1165 __WDS_LOG_FUNC_ENTER__;
1167 wfd_manager_s *manager = wfd_get_manager();
1168 wfd_group_s *group = NULL;
1169 wfd_device_s *peer = NULL;
1170 unsigned char peer_addr[MACADDR_LEN] = {0, };
1171 char peer_mac_address[MACSTR_LEN+1] = {0, };
1173 group = (wfd_group_s*) manager->group;
1175 WDS_LOGE("Group not found");
1176 __WDS_LOG_FUNC_EXIT__;
1180 if (ISZEROMACADDR(event->dev_addr)) {
1181 WDS_LOGD("Legacy Peer Disconnected [Peer: " MACSTR "]", MAC2STR(event->intf_addr));
1182 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->intf_addr));
1183 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1185 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1186 WFD_EVENT_DISCONNECTION_IND,
1189 wfd_group_remove_member(group, event->intf_addr);
1191 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1192 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1193 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1195 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1196 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1198 __WDS_LOG_FUNC_EXIT__;
1202 peer = wfd_group_find_member_by_addr(group, event->dev_addr);
1204 WDS_LOGE("Failed to find connected peer");
1205 peer = wfd_session_get_peer(manager->session);
1207 WDS_LOGE("Failed to find connecting peer");
1208 __WDS_LOG_FUNC_EXIT__;
1213 * If no peer connected and
1214 * disconnected event is not for connecting peer
1215 * then event should be ignored.
1216 * This situation can arrise when TV is GO and
1217 * some connected peer sent disassociation.
1219 if (memcmp(peer->dev_addr, event->dev_addr, MACADDR_LEN)) {
1220 WDS_LOGE("Unexpected event, Ignore it...");
1221 __WDS_LOG_FUNC_EXIT__;
1225 memcpy(peer_addr, peer->dev_addr, MACADDR_LEN);
1228 * If state is not DISCONNECTING, connection is finished by peer.
1229 * Required the check also, when Device is Group Owner and state is DISCOVERING.
1231 if (manager->state >= WIFI_DIRECT_STATE_CONNECTED ||
1232 (manager->state == WIFI_DIRECT_STATE_DISCOVERING &&
1233 manager->local->dev_role == WFD_DEV_ROLE_GO)) {
1234 wfd_group_remove_member(group, peer_addr);
1235 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1236 if (group->member_count) {
1237 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1239 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1240 WFD_EVENT_DISASSOCIATION_IND,
1243 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1245 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1246 WFD_EVENT_DISCONNECTION_IND,
1250 } else if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
1251 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1252 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1254 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1255 WFD_EVENT_DISCONNECTION_RSP,
1258 } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING &&
1259 /* Some devices(GO) send disconnection message before connection completed.
1260 * This message should be ignored when device is not GO */
1261 manager->local->dev_role == WFD_DEV_ROLE_GO) {
1262 if (WFD_PEER_STATE_CONNECTED == peer->state) {
1263 WDS_LOGD("Peer is already Connected !!!");
1264 wfd_group_remove_member(group, peer_addr);
1265 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1266 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1268 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1269 WFD_EVENT_DISASSOCIATION_IND,
1272 } else if (WFD_PEER_STATE_CONNECTING == peer->state) {
1273 WDS_LOGD("Peer is Connecting...");
1274 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1275 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1277 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
1278 WFD_EVENT_CONNECTION_RSP,
1280 wfd_session_s *session = manager->session;
1281 if (wfd_asp_is_asp_session(session)) {
1282 wfd_asp_connect_status(session->session_mac,
1283 session->session_id,
1284 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
1288 WDS_LOGE("Unexpected Peer State. Ignore it");
1289 __WDS_LOG_FUNC_EXIT__;
1293 WDS_LOGE("Unexpected event. Ignore it");
1294 __WDS_LOG_FUNC_EXIT__;
1298 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1299 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1300 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1302 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1303 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1306 /* If there is no member, GO should be destroyed */
1307 if (!group->member_count) {
1308 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1309 wfd_destroy_group(manager);
1310 wfd_peer_clear_all(manager);
1313 wfd_destroy_session(manager);
1315 __WDS_LOG_FUNC_EXIT__;
1319 void wfd_event_terminating(wfd_oem_event_s *event)
1321 __WDS_LOG_FUNC_ENTER__;
1323 __WDS_LOG_FUNC_EXIT__;
1327 void wfd_event_group_formation_failure(wfd_oem_event_s *event)
1329 __WDS_LOG_FUNC_ENTER__;
1331 wfd_manager_s *manager = wfd_get_manager();
1332 wfd_session_s *session = (wfd_session_s*) manager->session;
1334 WDS_LOGE("Unexpected event. Session not exist");
1335 __WDS_LOG_FUNC_EXIT__;
1339 unsigned char *peer_addr = wfd_session_get_peer_addr(session);
1341 WDS_LOGE("Session do not has peer");
1342 __WDS_LOG_FUNC_EXIT__;
1346 char peer_mac_address[MACSTR_LEN+1] = {0, };
1347 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1348 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1350 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
1351 WFD_EVENT_CONNECTION_RSP,
1354 if (wfd_asp_is_asp_session(session)) {
1355 wfd_asp_connect_status(session->session_mac,
1356 session->session_id,
1357 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
1361 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1362 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1363 wfd_destroy_session(manager);
1364 manager->local->dev_role = WFD_DEV_ROLE_NONE;
1366 wfd_oem_refresh(manager->oem_ops);
1368 __WDS_LOG_FUNC_EXIT__;
1373 * This event is generated by supplicant when persitent invite is auto accepted
1374 * so that wfd-manager can get indication that a peer will be connected in near future.
1375 * session is started for that peer, so that it is not ignored when connected.
1377 void wfd_event_invitation_accepted(wfd_oem_event_s *event)
1380 __WDS_LOG_FUNC_ENTER__;
1382 wfd_manager_s *manager = wfd_get_manager();
1383 wfd_session_s *session = (wfd_session_s*) manager->session;
1384 wfd_device_s *peer = NULL;
1385 char peer_mac_address[MACSTR_LEN+1] = {0, };
1387 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
1389 WDS_LOGI("Invitation from unknown peer. Add new peer");
1390 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
1392 WDS_LOGE("Failed to add peer for invitation");
1393 __WDS_LOG_FUNC_EXIT__;
1397 /**By default, peer device information is complete but there's some exception
1398 * if DEV-FOUND event was not preceding before connection start event.
1400 wfd_update_peer(manager, peer);
1401 peer->dev_role = WFD_DEV_ROLE_GO;
1404 session = wfd_create_session(manager, event->dev_addr,
1405 event->wps_mode, SESSION_DIRECTION_INCOMING);
1407 WDS_LOGE("Failed to create session with peer [" MACSTR "]",
1408 MAC2STR(event->dev_addr));
1409 __WDS_LOG_FUNC_EXIT__;
1414 session->state = SESSION_STATE_WPS;
1415 wfd_session_timer(session, 1);
1417 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1418 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1420 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1421 WFD_EVENT_CONNECTION_IN_PROGRESS,
1424 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
1425 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
1427 __WDS_LOG_FUNC_EXIT__;
1430 void wfd_event_serv_disc_resp(wfd_oem_event_s *event)
1432 __WDS_LOG_FUNC_ENTER__;
1434 wfd_manager_s *manager = wfd_get_manager();
1436 char response_data[256] = {0, };
1437 char peer_mac_address[MACSTR_LEN+1] = {0, };
1439 if (!manager->is_service_discovery_supported) {
1440 WDS_LOGD("service discovery not supported");
1444 wfd_update_peer_time(manager, event->dev_addr);
1446 if (event->edata_type == WFD_OEM_EDATA_TYPE_NEW_SERVICE) {
1447 wfd_oem_new_service_s *service = NULL;;
1449 GList *services = (GList*) event->edata;
1452 WDS_LOGD("%d service data found", event->dev_role);
1454 temp = g_list_first(services);
1455 while (temp && count < event->dev_role) {
1456 service = (wfd_oem_new_service_s*) temp->data;
1457 service_type = service->protocol;
1458 if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
1459 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1460 g_snprintf(response_data, 256, "%s|%s", service->data.bonjour.query, service->data.bonjour.rdata);
1461 WDS_LOGD("Found service: [%d: %s] - [" MACSECSTR "]", service->protocol,
1462 service->data.bonjour.query, MAC2SECSTR(event->dev_addr));
1464 WDS_LOGD("Found service is not supported");
1468 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
1470 g_variant_new("(iss)", service_type,
1474 temp = g_list_next(temp);
1478 } else if (event->edata_type == WFD_OEM_EDATA_TYPE_SERVICE) {
1479 wfd_oem_service_data_s *edata = (wfd_oem_service_data_s*) event->edata;
1484 service_type = edata->type;
1485 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1486 switch (edata->type) {
1487 WDS_LOGE("Unknown type [type ID: %d]", edata->type);
1491 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
1493 g_variant_new("(iss)", service_type,
1498 __WDS_LOG_FUNC_EXIT__;
1502 void wfd_event_serv_disc_started(wfd_oem_event_s *event)
1504 __WDS_LOG_FUNC_ENTER__;
1506 __WDS_LOG_FUNC_EXIT__;
1511 void wfd_event_asp_serv_resp(wfd_oem_event_s *event)
1513 __WDS_LOG_FUNC_ENTER__;
1515 wfd_manager_s *manager = wfd_get_manager();
1516 wfd_oem_asp_service_s *service = NULL;
1517 GVariantBuilder *builder = NULL;
1518 GVariant *params = NULL;
1520 if (manager && !manager->is_asp_supported) {
1521 WDS_LOGD("ASP is not supported.");
1522 __WDS_LOG_FUNC_EXIT__;
1526 service = (wfd_oem_asp_service_s *)event->edata;
1527 if (service == NULL) {
1528 WDS_LOGE("P2P service found event has NULL information");
1529 __WDS_LOG_FUNC_EXIT__;
1533 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1534 g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("u", service->search_id));
1535 g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", event->dev_addr));
1536 g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
1537 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
1538 if (service->service_type)
1539 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type));
1540 if (service->service_info)
1541 g_variant_builder_add(builder, "{sv}", "service_info", g_variant_new("s", service->service_info));
1542 g_variant_builder_add(builder, "{sv}", "status", g_variant_new("y", service->status));
1543 params = g_variant_new("(a{sv})", builder);
1544 g_variant_builder_unref(builder);
1546 wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
1550 __WDS_LOG_FUNC_EXIT__;
1554 int __wfd_handle_asp_prov(wfd_manager_s *manager, wfd_oem_event_s *event)
1556 __WDS_LOG_FUNC_ENTER__;
1558 wfd_session_s *session = NULL;
1559 wfd_oem_asp_prov_s *prov_params = NULL;
1562 prov_params = (wfd_oem_asp_prov_s *)event->edata;
1563 if (prov_params == NULL) {
1564 WDS_LOGE("Invalid parameter");
1565 __WDS_LOG_FUNC_EXIT__;
1569 res = wfd_session_process_event(manager, event);
1570 session = (wfd_session_s *)manager->session;
1571 if (res < 0 || session == NULL) {
1572 WDS_LOGE("Failed to process event of session");
1573 __WDS_LOG_FUNC_EXIT__;
1576 session->session_id = prov_params->session_id;
1577 memcpy(session->session_mac, prov_params->session_mac, MACADDR_LEN);
1578 memcpy(session->service_mac, prov_params->service_mac, MACADDR_LEN);
1580 __WDS_LOG_FUNC_EXIT__;
1584 int __wfd_handle_asp_prov_done(wfd_session_s *session, wfd_oem_event_s *event)
1586 __WDS_LOG_FUNC_ENTER__;
1588 wfd_oem_asp_prov_s *prov_params = NULL;
1589 prov_params = (wfd_oem_asp_prov_s *)event->edata;
1592 if (prov_params->persist &&
1593 (prov_params->network_role || prov_params->network_config)) {
1594 WDS_LOGE("Persistent group is used but "
1595 "conncap/dev_passwd_id are present");
1596 __WDS_LOG_FUNC_EXIT__;
1600 if (!prov_params->persist &&
1601 (!prov_params->network_role && !prov_params->network_config)) {
1602 WDS_LOGE("Persistent group not used but "
1603 "conncap/dev_passwd_id are missing");
1604 __WDS_LOG_FUNC_EXIT__;
1608 if (session->wps_mode == WFD_OEM_WPS_MODE_P2PS)
1609 g_strlcpy(session->wps_pin, OEM_DEFAULT_P2PS_PIN, OEM_PINSTR_LEN + 1);
1611 if (prov_params->persist) {
1612 res = wfd_session_asp_persistent_connect(session, prov_params->persistent_group_id);
1613 } else if (prov_params->network_role == WFD_OEM_ASP_SESSION_ROLE_NEW) {
1614 res = wfd_session_asp_connect(session, WFD_OEM_ASP_SESSION_ROLE_NEW);
1615 } else if (prov_params->network_role == WFD_OEM_ASP_SESSION_ROLE_CLIENT) {
1616 res = wfd_session_asp_connect(session, WFD_OEM_ASP_SESSION_ROLE_CLIENT);
1617 } else if (prov_params->network_role == WFD_OEM_ASP_SESSION_ROLE_GO) {
1618 res = wfd_session_asp_connect(session, WFD_OEM_ASP_SESSION_ROLE_GO);
1619 WDS_LOGD("don't need to take action.");
1622 WDS_LOGE("Unhandled event");
1623 __WDS_LOG_FUNC_EXIT__;
1627 __WDS_LOG_FUNC_EXIT__;
1631 void wfd_event_asp_prov_start(wfd_oem_event_s *event)
1633 __WDS_LOG_FUNC_ENTER__;
1635 wfd_manager_s *manager = wfd_get_manager();
1636 wfd_session_s *session = NULL;
1637 wfd_oem_asp_prov_s *prov_params = NULL;
1640 if (manager == NULL || event == NULL || event->edata == NULL) {
1641 WDS_LOGE("Invalid parameter");
1642 __WDS_LOG_FUNC_EXIT__;
1646 if (!manager->is_asp_supported) {
1647 WDS_LOGD("ASP is not supported.");
1648 __WDS_LOG_FUNC_EXIT__;
1652 prov_params = (wfd_oem_asp_prov_s *)event->edata;
1653 res = __wfd_handle_asp_prov(manager, event);
1654 session = (wfd_session_s *)manager->session;
1655 if (res < 0 || session == NULL) {
1656 WDS_LOGE("Failed to process event of session");
1657 __WDS_LOG_FUNC_EXIT__;
1661 WDS_LOGD("created session [%u] with peer [" MACSTR "]", session->session_id,
1662 MAC2STR(session->session_mac));
1664 /* Incomming Session, auto_accept = TRUE emit request Received */
1665 /* generate SessionConfigRequest if event->wps_mode is not P2PS and return*/
1667 wfd_session_timer(session, 1);
1668 wfd_asp_session_request(prov_params);
1669 wfd_asp_connect_status(prov_params->session_mac,
1670 prov_params->session_id,
1671 ASP_CONNECT_STATUS_REQUEST_RECEIVED,
1674 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
1676 __WDS_LOG_FUNC_EXIT__;
1680 void wfd_event_asp_prov_done(wfd_oem_event_s *event)
1682 __WDS_LOG_FUNC_ENTER__;
1684 wfd_manager_s *manager = wfd_get_manager();
1685 wfd_session_s *session = NULL;
1686 wfd_oem_asp_prov_s *prov_params;
1689 if (manager == NULL || event == NULL || event->edata == NULL) {
1690 WDS_LOGE("Invalid parameter");
1691 __WDS_LOG_FUNC_EXIT__;
1695 if (!manager->is_asp_supported) {
1696 WDS_LOGD("ASP is not supported.");
1697 __WDS_LOG_FUNC_EXIT__;
1701 prov_params = (wfd_oem_asp_prov_s *)event->edata;
1702 /* Incomming Session, auto_accept = TRUE emit request Received */
1703 /* generate SessionConfigRequest if event->wps_mode is not P2PS and return*/
1704 if (manager->session == NULL) {
1705 wfd_asp_session_request(prov_params);
1706 wfd_asp_connect_status(prov_params->session_mac,
1707 prov_params->session_id,
1708 ASP_CONNECT_STATUS_REQUEST_RECEIVED,
1712 res = __wfd_handle_asp_prov(manager, event);
1713 session = (wfd_session_s *)manager->session;
1714 if (res < 0 || session == NULL) {
1715 WDS_LOGE("Failed to process event of session");
1716 wfd_destroy_session(manager);
1717 wfd_asp_connect_status(prov_params->session_mac,
1718 prov_params->session_id,
1719 ASP_CONNECT_STATUS_REQUEST_FAILED,
1721 wfd_oem_refresh(manager->oem_ops);
1722 __WDS_LOG_FUNC_EXIT__;
1726 if (prov_params->status != WFD_OEM_SC_SUCCESS &&
1727 prov_params->status != WFD_OEM_SC_SUCCESS_ACCEPTED_BY_USER) {
1728 WDS_LOGD("ASP-PROV failed. remove session.");
1729 wfd_destroy_session(manager);
1730 wfd_oem_refresh(manager->oem_ops);
1731 wfd_asp_connect_status(prov_params->session_mac,
1732 prov_params->session_id,
1733 ASP_CONNECT_STATUS_REQUEST_FAILED,
1735 __WDS_LOG_FUNC_EXIT__;
1739 wfd_asp_connect_status(prov_params->session_mac,
1740 prov_params->session_id,
1741 ASP_CONNECT_STATUS_REQUEST_ACCEPTED,
1744 wfd_asp_connect_status(prov_params->session_mac,
1745 prov_params->session_id,
1746 ASP_CONNECT_STATUS_GROUP_FORMATION_STARTED,
1748 res = __wfd_handle_asp_prov_done(session, event);
1750 WDS_LOGE("Connect failed. remove session.");
1751 wfd_destroy_session(manager);
1752 wfd_oem_refresh(manager->oem_ops);
1754 wfd_asp_connect_status(prov_params->session_mac,
1755 prov_params->session_id,
1756 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
1758 __WDS_LOG_FUNC_EXIT__;
1762 WDS_LOGD("Provision done succeeded.");
1763 __WDS_LOG_FUNC_EXIT__;
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 event_cbs->serv_disc_resp_cb = wfd_event_serv_disc_resp;
1808 event_cbs->serv_disc_started_cb = wfd_event_serv_disc_started;
1810 event_cbs->group_formation_failure_cb = wfd_event_group_formation_failure;
1811 event_cbs->invitation_accepted_cb = wfd_event_invitation_accepted;
1813 event_cbs->asp_serv_resp_cb = wfd_event_asp_serv_resp;
1814 event_cbs->asp_prov_start_cb = wfd_event_asp_prov_start;
1815 event_cbs->asp_prov_done_cb = wfd_event_asp_prov_done;
1817 event_cbs->extra_data = NULL;
1819 __WDS_LOG_FUNC_EXIT__;