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 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
92 memcpy(&(peer->display), &(data->display), sizeof(wfd_display_s));
93 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
95 #if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
96 wfd_util_get_current_time(&peer->time);
99 gettimeofday(&tval, NULL);
100 peer->time = tval.tv_sec;
102 WDS_LOGI("Update time [%s - %ld]", peer->dev_name, peer->time);
104 __WDS_LOG_FUNC_EXIT__;
108 gboolean _wfd_connection_retry(gpointer *data)
110 wfd_session_s *session = (wfd_session_s*) data;
112 WDS_LOGE("Session is NULL");
113 __WDS_LOG_FUNC_EXIT__;
114 return G_SOURCE_REMOVE;
117 switch (session->state) {
118 case SESSION_STATE_STARTED:
119 WDS_LOGD("PD again");
120 wfd_session_start(session);
122 case SESSION_STATE_GO_NEG:
123 WDS_LOGD("Negotiation again");
124 wfd_session_connect(session);
126 case SESSION_STATE_WPS:
127 WDS_LOGD("WPS again");
128 wfd_session_wps(session);
131 WDS_LOGE("Invalid session state [%d]", session->state);
134 __WDS_LOG_FUNC_EXIT__;
135 return G_SOURCE_REMOVE;
138 void wfd_event_deactivated(wfd_oem_event_s *event)
140 __WDS_LOG_FUNC_ENTER__;
142 wfd_manager_s *manager = wfd_get_manager();
144 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
146 g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE));
148 wfd_destroy_group(manager);
149 wfd_destroy_session(manager);
150 wfd_peer_clear_all(manager);
151 wfd_local_reset_data(manager);
153 wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATED);
154 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATED);
155 manager->req_wps_mode = WFD_WPS_MODE_PBC;
157 #ifdef TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT
158 wfd_util_stop_wifi_direct_popup();
159 #endif /* TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT */
160 __WDS_LOG_FUNC_EXIT__;
164 void wfd_event_peer_found(wfd_oem_event_s *event)
166 __WDS_LOG_FUNC_ENTER__;
168 wfd_manager_s *manager = wfd_get_manager();
169 wfd_oem_dev_data_s *edata = NULL;
170 char peer_mac_address[MACSTR_LEN+1] = {0, };
173 edata = (wfd_oem_dev_data_s*) event->edata;
174 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
175 WDS_LOGE("Invalid event data");
176 __WDS_LOG_FUNC_EXIT__;
180 res = _wfd_event_update_peer(manager, edata);
182 WDS_LOGE("Failed to update peer data");
183 __WDS_LOG_FUNC_EXIT__;
187 if (manager->state > WIFI_DIRECT_STATE_ACTIVATING &&
188 manager->state != WIFI_DIRECT_STATE_CONNECTING &&
189 manager->state != WIFI_DIRECT_STATE_DISCONNECTING) {
190 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(edata->p2p_dev_addr));
191 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
193 g_variant_new("(s)", peer_mac_address));
196 #if defined(TIZEN_FEATURE_ASP)
199 GVariantBuilder *builder = NULL;
200 GVariant *params = NULL;
201 wfd_oem_advertise_service_s *service;
203 for (list = (GList *)event->asp_services; list != NULL; list = list->next) {
204 service = (wfd_oem_advertise_service_s *)list->data;
206 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
207 g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("t", service->search_id));
208 g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", peer_mac_address));
209 g_variant_builder_add(builder, "{sv}", "device_name", g_variant_new("s", edata->name));
210 g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
211 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
212 if (service->service_type)
213 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type));
214 params = g_variant_new("(a{sv})", builder);
215 g_variant_builder_unref(builder);
217 wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
222 for (list = (GList *)event->asp2_services; list != NULL; list = list->next) {
223 service = (wfd_oem_advertise_service_s *)list->data;
225 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
226 g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("t", service->search_id));
227 g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", peer_mac_address));
228 g_variant_builder_add(builder, "{sv}", "device_name", g_variant_new("s", edata->name));
229 g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
230 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
231 if (service->service_type)
232 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type));
233 if (service->instance_name)
234 g_variant_builder_add(builder, "{sv}", "instance_name", g_variant_new("s", service->instance_name));
235 params = g_variant_new("(a{sv})", builder);
236 g_variant_builder_unref(builder);
238 wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
243 __WDS_LOG_FUNC_EXIT__;
247 void wfd_event_peer_disappeared(wfd_oem_event_s *event)
249 __WDS_LOG_FUNC_ENTER__;
251 wfd_manager_s *manager = wfd_get_manager();
252 wfd_session_s *session = NULL;
253 wfd_device_s *peer = NULL;
254 char peer_mac_address[MACSTR_LEN+1] = {0, };
256 session = manager->session;
257 if (session != NULL && session->peer != NULL) {
258 peer = session->peer;
259 WDS_LOGD("session peer [" MACSTR "] lost peer [" MACSTR "]", MAC2STR(peer->dev_addr),
260 MAC2STR(event->dev_addr));
261 if (memcmp(peer->dev_addr, event->dev_addr, MACADDR_LEN) == 0) {
262 WDS_LOGD("peer already in connection");
267 wfd_remove_peer(manager, event->dev_addr);
269 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
270 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
272 g_variant_new("(s)", peer_mac_address));
274 __WDS_LOG_FUNC_EXIT__;
278 void wfd_event_discovery_finished(wfd_oem_event_s *event)
280 __WDS_LOG_FUNC_ENTER__;
282 wfd_manager_s *manager = wfd_get_manager();
284 if (manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
285 manager->state != WIFI_DIRECT_STATE_ACTIVATED) {
286 WDS_LOGE("Notify finding stopped when discovering or activated. [%d]", manager->state);
287 __WDS_LOG_FUNC_EXIT__;
291 if (manager->scan_mode == WFD_SCAN_MODE_PASSIVE) {
292 WDS_LOGE("During passive scan, Discover Finished event will not notified");
293 __WDS_LOG_FUNC_EXIT__;
297 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
298 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
299 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
301 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
302 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
304 manager->scan_mode = WFD_SCAN_MODE_NONE;
306 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
310 __WDS_LOG_FUNC_EXIT__;
314 void wfd_event_prov_disc_req(wfd_oem_event_s *event)
316 __WDS_LOG_FUNC_ENTER__;
318 wfd_manager_s *manager = wfd_get_manager();
319 wfd_device_s *peer = NULL;
320 wfd_device_s *member = NULL;
322 wfd_group_s *group = (wfd_group_s*) manager->group;
324 if (group && group->role == WFD_DEV_ROLE_GC) {
325 WDS_LOGD("Device has GC role - ignore this provision request");
326 __WDS_LOG_FUNC_EXIT__;
330 member = wfd_group_find_member_by_addr(group, event->dev_addr);
332 /* PD request can be arrived from peer device
333 * when connection is timeout to close connection */
334 WDS_LOGE("Unexpected Event - Member already exist");
335 __WDS_LOG_FUNC_EXIT__;
339 wfd_oem_dev_data_s *edata = NULL;
341 edata = (wfd_oem_dev_data_s*) event->edata;
342 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
343 WDS_LOGE("Invalid event data");
344 __WDS_LOG_FUNC_EXIT__;
348 res = _wfd_event_update_peer(manager, edata);
349 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
351 if (WFD_DEV_ROLE_GO != manager->local->dev_role) {
352 WDS_LOGI("TV is not GO, updated peer data only.");
354 manager->local->wps_mode = event->wps_mode;
355 if (event->wps_mode == WFD_WPS_MODE_PBC ||
356 event->wps_mode == WFD_WPS_MODE_KEYPAD) {
357 __WDS_LOG_FUNC_EXIT__;
363 peer->state = WFD_PEER_STATE_CONNECTING;
365 res = wfd_session_process_event(manager, event);
367 WDS_LOGE("Failed to process event of session");
369 __WDS_LOG_FUNC_EXIT__;
373 void wfd_event_prov_disc_resp(wfd_oem_event_s *event)
375 __WDS_LOG_FUNC_ENTER__;
377 wfd_manager_s *manager = wfd_get_manager();
378 wfd_device_s *peer = NULL;
381 wfd_oem_dev_data_s *edata = NULL;
383 edata = (wfd_oem_dev_data_s*) event->edata;
384 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
385 WDS_LOGE("Invalid event data");
386 __WDS_LOG_FUNC_EXIT__;
390 res = _wfd_event_update_peer(manager, edata);
391 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
393 peer->state = WFD_PEER_STATE_CONNECTING;
395 res = wfd_session_process_event(manager, event);
397 WDS_LOGE("Failed to process event of session");
399 __WDS_LOG_FUNC_EXIT__;
403 void wfd_event_prov_disc_fail(wfd_oem_event_s *event)
405 __WDS_LOG_FUNC_ENTER__;
407 wfd_manager_s *manager = wfd_get_manager();
408 wfd_session_s *session = NULL;
409 unsigned char *peer_addr = NULL;
410 char peer_mac_address[MACSTR_LEN+1] = {0, };
411 #if defined(TIZEN_FEATURE_ASP)
412 wfd_oem_asp_prov_s *prov_params = NULL;
413 prov_params = (wfd_oem_asp_prov_s *)event->edata;
416 session = (wfd_session_s*) manager->session;
418 WDS_LOGE("Unexpected event. Session not exist");
419 __WDS_LOG_FUNC_EXIT__;
423 peer_addr = wfd_session_get_peer_addr(session);
425 WDS_LOGE("Session do not have peer");
426 __WDS_LOG_FUNC_EXIT__;
429 #if defined(TIZEN_FEATURE_ASP)
430 if (!ISZEROMACADDR(session->session_mac)) {
431 /* This connection is for ASP session */
432 if (prov_params->status == WFD_OEM_SC_FAIL_INVALID_PARAMS) {
433 wfd_oem_scan_param_s param;
435 WDS_LOGD("ASP prov disc deferred. wait response.");
436 wfd_asp_connect_status(session->session_mac,
438 ASP_CONNECT_STATUS_REQUEST_DEFERRED,
440 /* start listen to wait for provision discovery request from peer */
441 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
442 param.scan_mode = WFD_OEM_SCAN_MODE_PASSIVE;
443 wfd_oem_start_scan(manager->oem_ops, ¶m);
444 __WDS_LOG_FUNC_EXIT__;
449 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
450 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
452 g_variant_new("(iis)",
453 WIFI_DIRECT_ERROR_CONNECTION_FAILED,
454 WFD_EVENT_CONNECTION_RSP,
456 #if defined(TIZEN_FEATURE_ASP)
457 WDS_LOGD("ASP prov disc failed. remove session.");
458 wfd_asp_connect_status(session->session_mac,
460 ASP_CONNECT_STATUS_REQUEST_FAILED,
464 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
465 wfd_group_s *group = (wfd_group_s*) manager->group;
466 if (group && !group->member_count &&
467 wfd_util_is_remove_group_allowed()) {
468 wfd_destroy_group(manager);
470 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
471 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
473 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
474 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
477 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
478 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
481 wfd_destroy_session(manager);
483 wfd_oem_refresh(manager->oem_ops);
485 /* After connection failed, scan again */
486 wfd_oem_scan_param_s param;
487 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
488 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
490 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
491 wfd_oem_start_scan(manager->oem_ops, ¶m);
492 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
494 __WDS_LOG_FUNC_EXIT__;
498 void wfd_event_go_neg_req(wfd_oem_event_s *event)
500 __WDS_LOG_FUNC_ENTER__;
502 wfd_manager_s *manager = wfd_get_manager();
503 wfd_group_s *group = (wfd_group_s*) manager->group;
504 if (group && group->role == WFD_DEV_ROLE_GC) {
505 WDS_LOGD("Device has GC role - ignore this go neg request");
506 __WDS_LOG_FUNC_EXIT__;
510 wfd_oem_dev_data_s *edata = NULL;
513 edata = (wfd_oem_dev_data_s*) event->edata;
514 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
515 WDS_LOGE("Invalid event data");
516 __WDS_LOG_FUNC_EXIT__;
520 res = _wfd_event_update_peer(manager, edata);
522 WDS_LOGE("Failed to update peer data");
523 __WDS_LOG_FUNC_EXIT__;
527 wfd_session_process_event(manager, event);
528 __WDS_LOG_FUNC_EXIT__;
532 void wfd_event_go_neg_fail(wfd_oem_event_s *event)
534 __WDS_LOG_FUNC_ENTER__;
536 wfd_manager_s *manager = wfd_get_manager();
537 wfd_session_s *session = NULL;
538 wfd_oem_conn_data_s *edata = NULL;
539 unsigned char *peer_addr = NULL;
540 char peer_mac_address[MACSTR_LEN] = {0, };
542 session = (wfd_session_s*) manager->session;
544 WDS_LOGE("Unexpected event. Session not exist");
545 __WDS_LOG_FUNC_EXIT__;
549 peer_addr = wfd_session_get_peer_addr(session);
551 WDS_LOGE("Session do not have peer");
552 __WDS_LOG_FUNC_EXIT__;
556 edata = (wfd_oem_conn_data_s*) event->edata;
558 WDS_LOGE("Invalid p2p connection data");
559 __WDS_LOG_FUNC_EXIT__;
563 if (edata->status < 0 && session->connecting_120) {
564 if (session->retry_gsrc) {
565 g_source_remove(session->retry_gsrc);
566 session->retry_gsrc = 0;
568 session->retry_gsrc = g_idle_add((GSourceFunc) _wfd_connection_retry, session);
569 WDS_LOGD("Connection will be retried");
570 __WDS_LOG_FUNC_EXIT__;
574 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
575 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
577 g_variant_new("(iis)",
578 WIFI_DIRECT_ERROR_CONNECTION_FAILED,
579 WFD_EVENT_CONNECTION_RSP,
582 #if defined(TIZEN_FEATURE_ASP)
583 if (!ISZEROMACADDR(session->session_mac))
584 wfd_asp_connect_status(session->session_mac,
586 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
590 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
591 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
593 wfd_destroy_group(manager);
594 wfd_destroy_session(manager);
595 manager->local->dev_role = WFD_DEV_ROLE_NONE;
596 __WDS_LOG_FUNC_EXIT__;
600 void wfd_event_go_neg_done(wfd_oem_event_s *event)
602 __WDS_LOG_FUNC_ENTER__;
604 wfd_manager_s *manager = wfd_get_manager();
605 wfd_session_s *session = NULL;
606 wfd_oem_conn_data_s *edata = NULL;
607 wfd_device_s *peer = NULL;
609 edata = (wfd_oem_conn_data_s*) event->edata;
611 WDS_LOGE("Invalid event data");
612 __WDS_LOG_FUNC_EXIT__;
616 session = (wfd_session_s*) manager->session;
617 if (session && session->peer) {
618 peer = session->peer;
619 memcpy(peer->intf_addr, edata->peer_intf_addr, MACADDR_LEN);
622 wfd_session_process_event(manager, event);
623 __WDS_LOG_FUNC_EXIT__;
627 void wfd_event_wps_fail(wfd_oem_event_s *event)
629 __WDS_LOG_FUNC_ENTER__;
631 wfd_manager_s *manager = wfd_get_manager();
632 wfd_session_s *session = NULL;
633 unsigned char *peer_addr = NULL;
635 session = (wfd_session_s*) manager->session;
637 WDS_LOGE("Unexpected event. Session not exist");
638 __WDS_LOG_FUNC_EXIT__;
642 peer_addr = wfd_session_get_peer_addr(session);
644 WDS_LOGE("Session do not have peer");
645 __WDS_LOG_FUNC_EXIT__;
649 char peer_mac_address[MACSTR_LEN+1] = {0, };
650 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
651 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
653 g_variant_new("(iis)",
654 WIFI_DIRECT_ERROR_CONNECTION_FAILED,
655 WFD_EVENT_CONNECTION_RSP,
657 #if defined(TIZEN_FEATURE_ASP)
658 if (!ISZEROMACADDR(session->session_mac))
659 wfd_asp_connect_status(session->session_mac,
661 ASP_CONNECT_STATUS_GROUP_FORMATION_STARTED,
664 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
665 wfd_group_s *group = (wfd_group_s*) manager->group;
666 if (group && !group->member_count &&
667 wfd_util_is_remove_group_allowed()) {
668 wfd_destroy_group(manager);
670 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
671 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
673 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
674 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
677 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
678 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
681 wfd_destroy_session(manager);
683 wfd_oem_refresh(manager->oem_ops);
685 /* After connection failed, scan again */
686 wfd_oem_scan_param_s param;
687 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
688 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
690 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
691 wfd_oem_start_scan(manager->oem_ops, ¶m);
692 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
694 __WDS_LOG_FUNC_EXIT__;
698 void wfd_event_wps_done(wfd_oem_event_s *event)
700 __WDS_LOG_FUNC_ENTER__;
702 wfd_manager_s *manager = wfd_get_manager();
703 wfd_session_process_event(manager, event);
705 __WDS_LOG_FUNC_EXIT__;
709 void wfd_event_key_neg_fail(wfd_oem_event_s *event)
711 __WDS_LOG_FUNC_ENTER__;
713 wfd_manager_s *manager = wfd_get_manager();
714 wfd_session_s *session = NULL;
715 unsigned char *peer_addr = NULL;
716 char peer_mac_address[MACSTR_LEN+1] = {0, };
718 session = (wfd_session_s*) manager->session;
720 WDS_LOGE("Unexpected event. Session not exist");
721 __WDS_LOG_FUNC_EXIT__;
725 peer_addr = wfd_session_get_peer_addr(session);
727 WDS_LOGE("Session do not has peer");
728 __WDS_LOG_FUNC_EXIT__;
732 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
733 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
735 g_variant_new("(iis)",
736 WIFI_DIRECT_ERROR_CONNECTION_FAILED,
737 WFD_EVENT_CONNECTION_RSP,
739 #if defined(TIZEN_FEATURE_ASP)
740 if (!ISZEROMACADDR(session->session_mac))
741 wfd_asp_connect_status(session->session_mac,
743 ASP_CONNECT_STATUS_GROUP_FORMATION_STARTED,
746 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
747 wfd_group_s *group = (wfd_group_s*) manager->group;
748 if (group && !group->member_count &&
749 wfd_util_is_remove_group_allowed()) {
750 wfd_destroy_group(manager);
752 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
753 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
755 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
756 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
759 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
760 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
763 wfd_destroy_session(manager);
765 wfd_oem_refresh(manager->oem_ops);
767 /* After connection failed, scan again */
768 wfd_oem_scan_param_s param;
769 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
770 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
772 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
773 wfd_oem_start_scan(manager->oem_ops, ¶m);
774 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
776 __WDS_LOG_FUNC_EXIT__;
780 void wfd_event_key_neg_done(wfd_oem_event_s *event)
782 __WDS_LOG_FUNC_ENTER__;
784 __WDS_LOG_FUNC_EXIT__;
788 void wfd_event_conn_fail(wfd_oem_event_s *event)
790 __WDS_LOG_FUNC_ENTER__;
792 __WDS_LOG_FUNC_EXIT__;
796 void wfd_event_conn_done(wfd_oem_event_s *event)
798 __WDS_LOG_FUNC_ENTER__;
800 __WDS_LOG_FUNC_EXIT__;
804 void wfd_event_group_created(wfd_oem_event_s *event)
806 __WDS_LOG_FUNC_ENTER__;
808 wfd_manager_s *manager = wfd_get_manager();
809 wfd_group_s *group = (wfd_group_s*) manager->group;
810 wfd_session_s *session = (wfd_session_s*) manager->session;
813 group = wfd_create_pending_group(manager, event->intf_addr);
815 WDS_LOGE("Failed to create pending group");
816 __WDS_LOG_FUNC_EXIT__;
820 manager->group = group;
823 wfd_group_complete(manager, event);
825 if (group->role == WFD_DEV_ROLE_GC && session) {
826 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
827 wfd_device_s *peer = session->peer;
829 WDS_LOGE("Unexpected event. Peer doesn't exist");
833 wfd_update_peer(manager, peer);
835 if (peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
836 char peer_mac_address[MACSTR_LEN+1] = {0, };
838 wfd_util_ip_over_eap_assign(peer, event->ifname);
840 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
841 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
843 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
844 WFD_EVENT_CONNECTION_RSP,
846 #if defined(TIZEN_FEATURE_ASP)
847 if (!ISZEROMACADDR(session->session_mac)) {
848 wfd_asp_connect_status(session->session_mac,
850 ASP_CONNECT_STATUS_GROUP_FORMATION_COMPLETED,
852 wfd_asp_session_peer_ip(session->session_mac, session->session_id,
853 session->service_mac, peer->ip_addr);
856 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
857 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
859 wfd_destroy_session(manager);
861 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
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 #if defined(TIZEN_FEATURE_ASP)
902 wfd_session_s *session = manager->session;
903 if (!ISZEROMACADDR(session->session_mac))
904 wfd_asp_connect_status(session->session_mac,
906 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
909 } else if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
910 if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
911 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
913 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
914 WFD_EVENT_DISCONNECTION_RSP,
917 wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
921 WDS_LOGD("Unexpected event(GROUP_DESTROYED). Ignore it");
922 __WDS_LOG_FUNC_EXIT__;
926 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
927 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
928 wfd_destroy_group(manager);
929 wfd_destroy_session(manager);
930 manager->local->dev_role = WFD_DEV_ROLE_NONE;
932 __WDS_LOG_FUNC_EXIT__;
936 void wfd_event_invitation_req(wfd_oem_event_s *event)
938 __WDS_LOG_FUNC_ENTER__;
940 wfd_manager_s *manager = wfd_get_manager();
941 wfd_device_s *peer = NULL;
942 wfd_session_s *session = NULL;
943 wfd_oem_invite_data_s *edata = NULL;
945 char peer_mac_address[MACSTR_LEN+1] = {0, };
947 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
949 WDS_LOGD("Invitation from unknown peer. Add new peer");
950 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
952 WDS_LOGE("Failed to add peer for invitation");
953 __WDS_LOG_FUNC_EXIT__;
957 peer->dev_role = WFD_DEV_ROLE_GO;
959 edata = (wfd_oem_invite_data_s*) event->edata;
960 memcpy(peer->intf_addr, edata->bssid, MACADDR_LEN);
961 wfd_update_peer_time(manager, event->dev_addr);
963 if (!ISZEROMACADDR(edata->go_dev_addr))
964 session = wfd_create_session(manager, edata->go_dev_addr,
965 manager->req_wps_mode,
966 SESSION_DIRECTION_INCOMING);
968 session = wfd_create_session(manager, event->dev_addr,
969 manager->req_wps_mode,
970 SESSION_DIRECTION_INCOMING);
972 WDS_LOGE("Failed to create session");
973 __WDS_LOG_FUNC_EXIT__;
976 session->type = SESSION_TYPE_INVITE;
977 wfd_session_timer(session, 1);
979 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
980 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
982 res = wfd_session_start(session);
984 WDS_LOGE("Failed to start session");
985 __WDS_LOG_FUNC_EXIT__;
989 if (!ISZEROMACADDR(edata->go_dev_addr))
990 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR,
991 MAC2STR(edata->go_dev_addr));
993 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR,
994 MAC2STR(event->dev_addr));
996 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
998 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
999 WFD_EVENT_CONNECTION_REQ,
1002 __WDS_LOG_FUNC_EXIT__;
1006 void wfd_event_invitation_res(wfd_oem_event_s *event)
1008 __WDS_LOG_FUNC_ENTER__;
1010 __WDS_LOG_FUNC_EXIT__;
1014 void wfd_event_sta_connected(wfd_oem_event_s *event)
1016 __WDS_LOG_FUNC_ENTER__;
1018 wfd_manager_s *manager = wfd_get_manager();
1019 wfd_session_s *session = (wfd_session_s*) manager->session;
1020 wfd_group_s *group = (wfd_group_s*) manager->group;
1021 wfd_device_s *peer = NULL;
1022 char peer_mac_address[MACSTR_LEN+1] = {0, };
1024 /* FIXME: Move this code to plugin */
1025 if (!memcmp(event->intf_addr, manager->local->intf_addr, MACADDR_LEN)) {
1026 WDS_LOGD("Ignore this event");
1027 __WDS_LOG_FUNC_EXIT__;
1031 if (ISZEROMACADDR(event->dev_addr)) {
1032 WDS_LOGD("Legacy Peer Connected [Peer: " MACSTR "]", MAC2STR(event->intf_addr));
1034 peer = wfd_peer_find_by_addr(manager, event->intf_addr);
1036 WDS_LOGI("Add legacy peer");
1037 peer = wfd_add_peer(manager, event->intf_addr, "LEGACY-PEER");
1039 WDS_LOGE("Failed to add Legacy peer.");
1040 __WDS_LOG_FUNC_EXIT__;
1045 if (wfd_group_add_member(group, peer->dev_addr) == -1) {
1046 WDS_LOGE("Failed to add Legacy peer.");
1047 __WDS_LOG_FUNC_EXIT__;
1051 memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
1052 peer->state = WFD_PEER_STATE_CONNECTED;
1053 peer->is_p2p = FALSE;
1055 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1056 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1058 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1059 WFD_EVENT_CONNECTION_RSP,
1062 wfd_util_dhcps_wait_ip_leased(peer);
1063 __WDS_LOG_FUNC_EXIT__;
1067 session = (wfd_session_s*) manager->session;
1068 if (!session && group) {
1069 if (group->flags & WFD_GROUP_FLAG_PERSISTENT) {
1070 session = wfd_create_session(manager, event->dev_addr,
1072 SESSION_DIRECTION_INCOMING);
1074 WDS_LOGE("Failed to create session with peer [" MACSTR "]",
1075 MAC2STR(event->dev_addr));
1076 __WDS_LOG_FUNC_EXIT__;
1080 WDS_LOGD("Unexpected event. Session is NULL [peer: " MACSECSTR "]",
1081 MAC2SECSTR(event->dev_addr));
1083 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1084 wfd_destroy_group(manager);
1087 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1088 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1089 __WDS_LOG_FUNC_EXIT__;
1094 peer = wfd_session_get_peer(session);
1096 WDS_LOGE("Peer not found");
1097 __WDS_LOG_FUNC_EXIT__;
1101 group = (wfd_group_s*) manager->group;
1103 group = wfd_create_pending_group(manager, event->intf_addr);
1105 WDS_LOGE("Failed to create pending group");
1106 __WDS_LOG_FUNC_EXIT__;
1109 manager->group = group;
1111 wfd_group_add_member(group, peer->dev_addr);
1113 session->state = SESSION_STATE_COMPLETED;
1114 peer->state = WFD_PEER_STATE_CONNECTED;
1116 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1117 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1119 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1120 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1122 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1123 WFD_EVENT_CONNECTION_RSP,
1126 wfd_update_peer(manager, peer);
1127 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
1128 if (event->ip_addr_peer[3]) {
1129 peer->ip_type = WFD_IP_TYPE_OVER_EAPOL;
1130 memcpy(peer->client_ip_addr, event->ip_addr_peer, IPADDR_LEN);
1131 WDS_LOGE("Peer's client IP [" IPSTR "]", IP2STR((char*) &peer->client_ip_addr));
1132 memcpy(peer->go_ip_addr, manager->local->ip_addr, IPADDR_LEN);
1133 WDS_LOGE("Peer's GO IP [" IPSTR "]", IP2STR((char*) &peer->go_ip_addr));
1135 if (peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
1136 char peer_mac_address[MACSTR_LEN+1] = {0,};
1137 char assigned_ip_address[IPSTR_LEN+1] = {0,};
1139 memcpy(peer->ip_addr, peer->client_ip_addr, IPADDR_LEN);
1141 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1142 g_snprintf(assigned_ip_address, IPSTR_LEN, IPSTR, IP2STR(peer->ip_addr));
1143 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1145 g_variant_new("(ss)", peer_mac_address,
1146 assigned_ip_address));
1147 #if defined(TIZEN_FEATURE_ASP)
1148 if (!ISZEROMACADDR(session->session_mac)) {
1149 wfd_asp_connect_status(session->session_mac,
1150 session->session_id,
1151 ASP_CONNECT_STATUS_GROUP_FORMATION_COMPLETED,
1154 wfd_asp_session_peer_ip(session->session_mac, session->session_id,
1155 session->service_mac, peer->ip_addr);
1159 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
1160 wfd_util_dhcps_wait_ip_leased(peer);
1161 wfd_destroy_session(manager);
1163 __WDS_LOG_FUNC_EXIT__;
1167 void wfd_event_sta_disconnected(wfd_oem_event_s *event)
1169 __WDS_LOG_FUNC_ENTER__;
1171 wfd_manager_s *manager = wfd_get_manager();
1172 wfd_group_s *group = NULL;
1173 wfd_device_s *peer = NULL;
1174 unsigned char peer_addr[MACADDR_LEN] = {0, };
1175 char peer_mac_address[MACSTR_LEN+1] = {0, };
1177 group = (wfd_group_s*) manager->group;
1179 WDS_LOGE("Group not found");
1180 __WDS_LOG_FUNC_EXIT__;
1184 if (ISZEROMACADDR(event->dev_addr)) {
1185 WDS_LOGD("Legacy Peer Disconnected [Peer: " MACSTR "]", MAC2STR(event->intf_addr));
1186 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->intf_addr));
1187 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1189 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1190 WFD_EVENT_DISCONNECTION_IND,
1193 wfd_group_remove_member(group, event->intf_addr);
1195 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1196 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1197 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1199 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1200 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1202 __WDS_LOG_FUNC_EXIT__;
1206 peer = wfd_group_find_member_by_addr(group, event->dev_addr);
1208 WDS_LOGE("Failed to find connected peer");
1209 peer = wfd_session_get_peer(manager->session);
1211 WDS_LOGE("Failed to find connecting peer");
1212 __WDS_LOG_FUNC_EXIT__;
1217 * If no peer connected and
1218 * disconnected event is not for connecting peer
1219 * then event should be ignored.
1220 * This situation can arrise when TV is GO and
1221 * some connected peer sent disassociation.
1223 if (memcmp(peer_addr, event->dev_addr, MACADDR_LEN)) {
1224 WDS_LOGE("Unexpected event, Ignore it...");
1225 __WDS_LOG_FUNC_EXIT__;
1229 memcpy(peer_addr, peer->dev_addr, MACADDR_LEN);
1232 * If state is not DISCONNECTING, connection is finished by peer.
1233 * Required the check also, when Device is Group Owner and state is DISCOVERING.
1235 if (manager->state >= WIFI_DIRECT_STATE_CONNECTED ||
1236 (manager->state == WIFI_DIRECT_STATE_DISCOVERING &&
1237 manager->local->dev_role == WFD_DEV_ROLE_GO)) {
1238 wfd_group_remove_member(group, peer_addr);
1239 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1240 if (group->member_count) {
1241 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1243 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1244 WFD_EVENT_DISASSOCIATION_IND,
1247 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1249 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1250 WFD_EVENT_DISCONNECTION_IND,
1254 } else if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
1255 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1256 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1258 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1259 WFD_EVENT_DISCONNECTION_RSP,
1262 } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING &&
1263 /* Some devices(GO) send disconnection message before connection completed.
1264 * This message should be ignored when device is not GO */
1265 manager->local->dev_role == WFD_DEV_ROLE_GO) {
1266 if (WFD_PEER_STATE_CONNECTED == peer->state) {
1267 WDS_LOGD("Peer is already Connected !!!");
1268 wfd_group_remove_member(group, peer_addr);
1269 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1270 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1272 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1273 WFD_EVENT_DISASSOCIATION_IND,
1276 } else if (WFD_PEER_STATE_CONNECTING == peer->state) {
1277 WDS_LOGD("Peer is Connecting...");
1278 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1279 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1281 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
1282 WFD_EVENT_CONNECTION_RSP,
1284 #if defined(TIZEN_FEATURE_ASP)
1285 wfd_session_s *session = manager->session;
1286 if (session && !ISZEROMACADDR(session->session_mac))
1287 wfd_asp_connect_status(session->session_mac,
1288 session->session_id,
1289 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
1293 WDS_LOGE("Unexpected Peer State. Ignore it");
1294 __WDS_LOG_FUNC_EXIT__;
1298 WDS_LOGE("Unexpected event. Ignore it");
1299 __WDS_LOG_FUNC_EXIT__;
1303 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1304 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1305 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1307 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1308 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1311 /* If there is no member, GO should be destroyed */
1312 if (!group->member_count) {
1313 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1314 wfd_destroy_group(manager);
1315 wfd_peer_clear_all(manager);
1318 wfd_destroy_session(manager);
1320 __WDS_LOG_FUNC_EXIT__;
1324 void wfd_event_terminating(wfd_oem_event_s *event)
1326 __WDS_LOG_FUNC_ENTER__;
1328 __WDS_LOG_FUNC_EXIT__;
1332 void wfd_event_group_formation_failure(wfd_oem_event_s *event)
1334 __WDS_LOG_FUNC_ENTER__;
1336 wfd_manager_s *manager = wfd_get_manager();
1337 wfd_session_s *session = (wfd_session_s*) manager->session;
1339 WDS_LOGE("Unexpected event. Session not exist");
1340 __WDS_LOG_FUNC_EXIT__;
1344 unsigned char *peer_addr = wfd_session_get_peer_addr(session);
1346 WDS_LOGE("Session do not has peer");
1347 __WDS_LOG_FUNC_EXIT__;
1351 char peer_mac_address[MACSTR_LEN+1] = {0, };
1352 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1353 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1355 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
1356 WFD_EVENT_CONNECTION_RSP,
1359 #if defined(TIZEN_FEATURE_ASP)
1360 if (!ISZEROMACADDR(session->session_mac))
1361 wfd_asp_connect_status(session->session_mac,
1362 session->session_id,
1363 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
1367 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1368 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1369 wfd_destroy_session(manager);
1370 manager->local->dev_role = WFD_DEV_ROLE_NONE;
1372 wfd_oem_refresh(manager->oem_ops);
1374 __WDS_LOG_FUNC_EXIT__;
1379 * This event is generated by supplicant when persitent invite is auto accepted
1380 * so that wfd-manager can get indication that a peer will be connected in near future.
1381 * session is started for that peer, so that it is not ignored when connected.
1383 void wfd_event_invitation_accepted(wfd_oem_event_s *event)
1386 __WDS_LOG_FUNC_ENTER__;
1388 wfd_manager_s *manager = wfd_get_manager();
1389 wfd_session_s *session = (wfd_session_s*) manager->session;
1390 wfd_device_s *peer = NULL;
1391 char peer_mac_address[MACSTR_LEN+1] = {0, };
1393 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
1395 WDS_LOGI("Invitation from unknown peer. Add new peer");
1396 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
1398 WDS_LOGE("Failed to add peer for invitation");
1399 __WDS_LOG_FUNC_EXIT__;
1403 /**By default, peer device information is complete but there's some exception
1404 * if DEV-FOUND event was not preceding before connection start event.
1406 wfd_update_peer(manager, peer);
1407 peer->dev_role = WFD_DEV_ROLE_GO;
1410 session = wfd_create_session(manager, event->dev_addr,
1411 event->wps_mode, SESSION_DIRECTION_INCOMING);
1413 WDS_LOGE("Failed to create session with peer [" MACSTR "]",
1414 MAC2STR(event->dev_addr));
1415 __WDS_LOG_FUNC_EXIT__;
1420 session->state = SESSION_STATE_WPS;
1421 wfd_session_timer(session, 1);
1423 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1424 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1426 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1427 WFD_EVENT_CONNECTION_IN_PROGRESS,
1430 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
1431 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
1433 __WDS_LOG_FUNC_EXIT__;
1436 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1437 void wfd_event_serv_disc_resp(wfd_oem_event_s *event)
1439 __WDS_LOG_FUNC_ENTER__;
1441 wfd_manager_s *manager = wfd_get_manager();
1443 char response_data[256] = {0, };
1444 char peer_mac_address[MACSTR_LEN+1] = {0, };
1446 wfd_update_peer_time(manager, event->dev_addr);
1448 if (event->edata_type == WFD_OEM_EDATA_TYPE_NEW_SERVICE) {
1449 wfd_oem_new_service_s *service = NULL;;
1451 GList *services = (GList*) event->edata;
1454 WDS_LOGD("%d service data found", event->dev_role);
1456 temp = g_list_first(services);
1457 while (temp && count < event->dev_role) {
1458 service = (wfd_oem_new_service_s*) temp->data;
1459 service_type = service->protocol;
1460 if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
1461 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1462 g_snprintf(response_data, 256, "%s|%s", service->data.bonjour.query, service->data.bonjour.rdata);
1463 WDS_LOGD("Found service: [%d: %s] - [" MACSECSTR "]", service->protocol,
1464 service->data.bonjour.query, MAC2SECSTR(event->dev_addr));
1466 WDS_LOGD("Found service is not supported");
1470 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
1472 g_variant_new("(iss)", service_type,
1476 temp = g_list_next(temp);
1480 } else if (event->edata_type == WFD_OEM_EDATA_TYPE_SERVICE) {
1481 wfd_oem_service_data_s *edata = (wfd_oem_service_data_s*) event->edata;
1486 service_type = edata->type;
1487 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1488 switch (edata->type) {
1489 WDS_LOGE("Unknown type [type ID: %d]", edata->type);
1493 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
1495 g_variant_new("(iss)", service_type,
1500 __WDS_LOG_FUNC_EXIT__;
1504 void wfd_event_serv_disc_started(wfd_oem_event_s *event)
1506 __WDS_LOG_FUNC_ENTER__;
1508 __WDS_LOG_FUNC_EXIT__;
1511 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1514 #if defined(TIZEN_FEATURE_ASP)
1515 void wfd_event_asp_serv_resp(wfd_oem_event_s *event)
1517 __WDS_LOG_FUNC_ENTER__;
1519 wfd_oem_asp_service_s *service = NULL;
1520 GVariantBuilder *builder = NULL;
1521 GVariant *params = NULL;
1523 service = (wfd_oem_asp_service_s *)event->edata;
1524 if (service == NULL) {
1525 WDS_LOGE("P2P service found event has NULL information");
1526 __WDS_LOG_FUNC_EXIT__;
1530 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1531 g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("u", service->search_id));
1532 g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", event->dev_addr));
1533 g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
1534 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
1535 if (service->service_type)
1536 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type));
1537 if (service->service_info)
1538 g_variant_builder_add(builder, "{sv}", "service_info", g_variant_new("s", service->service_info));
1539 g_variant_builder_add(builder, "{sv}", "status", g_variant_new("y", service->status));
1540 params = g_variant_new("(a{sv})", builder);
1541 g_variant_builder_unref(builder);
1543 wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
1547 __WDS_LOG_FUNC_EXIT__;
1551 int __wfd_handle_asp_prov(wfd_manager_s *manager, wfd_oem_event_s *event)
1553 __WDS_LOG_FUNC_ENTER__;
1555 wfd_session_s *session = NULL;
1556 wfd_oem_asp_prov_s *prov_params = NULL;
1559 prov_params = (wfd_oem_asp_prov_s *)event->edata;
1560 if (prov_params == NULL) {
1561 WDS_LOGE("Invalid parameter");
1562 __WDS_LOG_FUNC_EXIT__;
1566 res = wfd_session_process_event(manager, event);
1567 session = (wfd_session_s *)manager->session;
1568 if (res < 0 || session == NULL) {
1569 WDS_LOGE("Failed to process event of session");
1570 __WDS_LOG_FUNC_EXIT__;
1573 session->session_id = prov_params->session_id;
1574 memcpy(session->session_mac, prov_params->session_mac, MACADDR_LEN);
1575 memcpy(session->service_mac, prov_params->service_mac, MACADDR_LEN);
1577 __WDS_LOG_FUNC_EXIT__;
1581 int __wfd_handle_asp_prov_done(wfd_session_s *session, wfd_oem_event_s *event)
1583 __WDS_LOG_FUNC_ENTER__;
1585 wfd_oem_asp_prov_s *prov_params = NULL;
1586 prov_params = (wfd_oem_asp_prov_s *)event->edata;
1589 if (prov_params->persist &&
1590 (prov_params->network_role || prov_params->network_config)) {
1591 WDS_LOGE("Persistent group is used but "
1592 "conncap/dev_passwd_id are present");
1593 __WDS_LOG_FUNC_EXIT__;
1597 if (!prov_params->persist &&
1598 (!prov_params->network_role && !prov_params->network_config)) {
1599 WDS_LOGE("Persistent group not used but "
1600 "conncap/dev_passwd_id are missing");
1601 __WDS_LOG_FUNC_EXIT__;
1605 if (session->wps_mode == WFD_OEM_WPS_MODE_P2PS)
1606 g_strlcpy(session->wps_pin, OEM_DEFAULT_P2PS_PIN, OEM_PINSTR_LEN + 1);
1608 if (prov_params->persist) {
1609 res = wfd_session_asp_persistent_connect(session, prov_params->persistent_group_id);
1610 } else if (prov_params->network_role == WFD_OEM_ASP_SESSION_ROLE_NEW) {
1611 res = wfd_session_asp_connect(session, WFD_OEM_ASP_SESSION_ROLE_NEW);
1612 } else if (prov_params->network_role == WFD_OEM_ASP_SESSION_ROLE_CLIENT) {
1613 res = wfd_session_asp_connect(session, WFD_OEM_ASP_SESSION_ROLE_CLIENT);
1614 } else if (prov_params->network_role == WFD_OEM_ASP_SESSION_ROLE_GO) {
1615 res = wfd_session_asp_connect(session, WFD_OEM_ASP_SESSION_ROLE_GO);
1616 WDS_LOGD("don't need to take action.");
1619 WDS_LOGE("Unhandled event");
1620 __WDS_LOG_FUNC_EXIT__;
1624 __WDS_LOG_FUNC_EXIT__;
1627 void wfd_event_asp_prov_start(wfd_oem_event_s *event)
1629 __WDS_LOG_FUNC_ENTER__;
1631 wfd_manager_s *manager = wfd_get_manager();
1632 wfd_session_s *session = NULL;
1633 wfd_oem_asp_prov_s *prov_params = NULL;
1636 if (event == NULL || event->edata == NULL) {
1637 WDS_LOGE("Invalid parameter");
1638 __WDS_LOG_FUNC_EXIT__;
1642 prov_params = (wfd_oem_asp_prov_s *)event->edata;
1643 res = __wfd_handle_asp_prov(manager, event);
1644 session = (wfd_session_s *)manager->session;
1645 if (res < 0 || session == NULL) {
1646 WDS_LOGE("Failed to process event of session");
1647 __WDS_LOG_FUNC_EXIT__;
1651 WDS_LOGD("created session [%u] with peer [" MACSTR "]", session->session_id,
1652 MAC2STR(session->session_mac));
1654 /* Incomming Session, auto_accept = TRUE emit request Received */
1655 /* generate SessionConfigRequest if event->wps_mode is not P2PS and return*/
1657 wfd_session_timer(session, 1);
1658 wfd_asp_session_request(prov_params);
1659 wfd_asp_connect_status(prov_params->session_mac,
1660 prov_params->session_id,
1661 ASP_CONNECT_STATUS_REQUEST_RECEIVED,
1664 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
1666 __WDS_LOG_FUNC_EXIT__;
1670 void wfd_event_asp_prov_done(wfd_oem_event_s *event)
1672 __WDS_LOG_FUNC_ENTER__;
1674 wfd_manager_s *manager = wfd_get_manager();
1675 wfd_session_s *session = NULL;
1676 wfd_oem_asp_prov_s *prov_params;
1679 if (event == NULL || event->edata == NULL) {
1680 WDS_LOGE("Invalid parameter");
1681 __WDS_LOG_FUNC_EXIT__;
1685 prov_params = (wfd_oem_asp_prov_s *)event->edata;
1686 /* Incomming Session, auto_accept = TRUE emit request Received */
1687 /* generate SessionConfigRequest if event->wps_mode is not P2PS and return*/
1688 if (manager->session == NULL) {
1689 wfd_asp_session_request(prov_params);
1690 wfd_asp_connect_status(prov_params->session_mac,
1691 prov_params->session_id,
1692 ASP_CONNECT_STATUS_REQUEST_RECEIVED,
1696 res = __wfd_handle_asp_prov(manager, event);
1697 session = (wfd_session_s *)manager->session;
1698 if (res < 0 || session == NULL) {
1699 WDS_LOGE("Failed to process event of session");
1700 wfd_destroy_session(manager);
1701 wfd_asp_connect_status(prov_params->session_mac,
1702 prov_params->session_id,
1703 ASP_CONNECT_STATUS_REQUEST_FAILED,
1705 wfd_oem_refresh(manager->oem_ops);
1706 __WDS_LOG_FUNC_EXIT__;
1710 if (prov_params->status != WFD_OEM_SC_SUCCESS &&
1711 prov_params->status != WFD_OEM_SC_SUCCESS_ACCEPTED_BY_USER) {
1712 WDS_LOGD("ASP-PROV failed. remove session.");
1713 wfd_destroy_session(manager);
1714 wfd_oem_refresh(manager->oem_ops);
1715 wfd_asp_connect_status(prov_params->session_mac,
1716 prov_params->session_id,
1717 ASP_CONNECT_STATUS_REQUEST_FAILED,
1719 __WDS_LOG_FUNC_EXIT__;
1723 wfd_asp_connect_status(prov_params->session_mac,
1724 prov_params->session_id,
1725 ASP_CONNECT_STATUS_REQUEST_ACCEPTED,
1728 wfd_asp_connect_status(prov_params->session_mac,
1729 prov_params->session_id,
1730 ASP_CONNECT_STATUS_GROUP_FORMATION_STARTED,
1732 res = __wfd_handle_asp_prov_done(session, event);
1734 WDS_LOGE("Connect failed. remove session.");
1735 wfd_destroy_session(manager);
1736 wfd_oem_refresh(manager->oem_ops);
1738 wfd_asp_connect_status(prov_params->session_mac,
1739 prov_params->session_id,
1740 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
1742 __WDS_LOG_FUNC_EXIT__;
1746 WDS_LOGD("Provision done succeeded.");
1747 __WDS_LOG_FUNC_EXIT__;
1750 #endif /* TIZEN_FEATURE_ASP */
1752 void wfd_event_init(wfd_oem_event_cbs_s *event_cbs)
1754 __WDS_LOG_FUNC_ENTER__;
1757 __WDS_LOG_FUNC_EXIT__;
1761 event_cbs->deactivated_cb = wfd_event_deactivated;
1762 event_cbs->peer_found_cb = wfd_event_peer_found;
1763 event_cbs->peer_disappeared_cb = wfd_event_peer_disappeared;
1764 event_cbs->discovery_finished_cb = wfd_event_discovery_finished;
1766 event_cbs->prov_disc_req_cb = wfd_event_prov_disc_req;
1767 event_cbs->prov_disc_resp_cb = wfd_event_prov_disc_resp;
1768 event_cbs->prov_disc_fail_cb = wfd_event_prov_disc_fail;
1770 event_cbs->go_neg_req_cb = wfd_event_go_neg_req;
1771 event_cbs->go_neg_fail_cb = wfd_event_go_neg_fail;
1772 event_cbs->go_neg_done_cb = wfd_event_go_neg_done;
1774 event_cbs->wps_fail_cb = wfd_event_wps_fail;
1775 event_cbs->wps_done_cb = wfd_event_wps_done;
1776 event_cbs->key_neg_fail_cb = wfd_event_key_neg_fail;
1777 event_cbs->key_neg_done_cb = wfd_event_key_neg_done;
1779 event_cbs->conn_fail_cb = wfd_event_conn_fail;
1780 event_cbs->conn_done_cb = wfd_event_conn_done;
1782 event_cbs->group_created_cb = wfd_event_group_created;
1783 event_cbs->group_destroyed_cb = wfd_event_group_destroyed;
1785 event_cbs->invitation_req_cb = wfd_event_invitation_req;
1786 event_cbs->invitation_resp_cb = wfd_event_invitation_res;
1787 event_cbs->sta_connected_cb = wfd_event_sta_connected;
1788 event_cbs->sta_disconnected_cb = wfd_event_sta_disconnected;
1790 event_cbs->terminating_cb = wfd_event_terminating;
1792 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1793 event_cbs->serv_disc_resp_cb = wfd_event_serv_disc_resp;
1794 event_cbs->serv_disc_started_cb = wfd_event_serv_disc_started;
1795 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1797 event_cbs->group_formation_failure_cb = wfd_event_group_formation_failure;
1798 event_cbs->invitation_accepted_cb = wfd_event_invitation_accepted;
1800 #if defined(TIZEN_FEATURE_ASP)
1801 event_cbs->asp_serv_resp_cb = wfd_event_asp_serv_resp;
1802 event_cbs->asp_prov_start_cb = wfd_event_asp_prov_start;
1803 event_cbs->asp_prov_done_cb = wfd_event_asp_prov_done;
1804 #endif /* TIZEN_FEATURE_ASP */
1806 event_cbs->extra_data = NULL;
1808 __WDS_LOG_FUNC_EXIT__;