2 * Network Configuration Module
4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
21 * This file implements wifi direct event functions.
23 * @file wifi-direct-event.c
24 * @author Gibyoung Kim (lastkgb.kim@samsung.com)
37 #include <wifi-direct.h>
39 #include "wifi-direct-ipc.h"
40 #include "wifi-direct-manager.h"
41 #include "wifi-direct-oem.h"
42 #include "wifi-direct-peer.h"
43 #include "wifi-direct-group.h"
44 #include "wifi-direct-session.h"
45 #include "wifi-direct-event.h"
46 #include "wifi-direct-state.h"
47 #include "wifi-direct-util.h"
48 #include "wifi-direct-error.h"
49 #include "wifi-direct-log.h"
50 #include "wifi-direct-dbus.h"
53 static int _wfd_event_update_peer(wfd_manager_s *manager, wfd_oem_dev_data_s *data)
55 __WDS_LOG_FUNC_ENTER__;
57 wfd_device_s *peer = NULL;
59 if (!manager || !data) {
60 WDS_LOGE("Invalid parameter");
61 __WDS_LOG_FUNC_EXIT__;
65 peer = wfd_peer_find_by_dev_addr(manager, data->p2p_dev_addr);
67 peer = wfd_add_peer(manager, data->p2p_dev_addr, data->name);
69 WDS_LOGE("Failed to add peer");
70 __WDS_LOG_FUNC_EXIT__;
74 if (strcmp(peer->dev_name, data->name)) {
75 g_strlcpy(peer->dev_name, data->name, DEV_NAME_LEN + 1);
76 WDS_LOGD("Device name is changed [" MACSECSTR ": %s]",
77 MAC2SECSTR(peer->dev_addr), peer->dev_name);
80 #ifndef CTRL_IFACE_DBUS
81 memcpy(peer->intf_addr, data->p2p_intf_addr, MACADDR_LEN);
82 #endif /* CTRL_IFACE_DBUS */
83 peer->pri_dev_type = data->pri_dev_type;
84 peer->sec_dev_type = data->sec_dev_type;
85 peer->config_methods = data->config_methods;
86 peer->dev_flags = data->dev_flags;
87 peer->group_flags = data->group_flags;
88 peer->dev_role = data->dev_role;
89 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
90 memcpy(&(peer->display), &(data->display), sizeof(wfd_display_s));
91 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
93 #if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
94 wfd_util_get_current_time(&peer->time);
97 gettimeofday(&tval, NULL);
98 peer->time = tval.tv_sec;
100 WDS_LOGI("Update time [%s - %ld]", peer->dev_name, peer->time);
102 __WDS_LOG_FUNC_EXIT__;
106 gboolean _wfd_connection_retry(gpointer *data)
108 wfd_session_s *session = (wfd_session_s*) data;
110 WDS_LOGE("Session is NULL");
111 __WDS_LOG_FUNC_EXIT__;
112 return G_SOURCE_REMOVE;
115 switch (session->state) {
116 case SESSION_STATE_STARTED:
117 WDS_LOGD("PD again");
118 wfd_session_start(session);
120 case SESSION_STATE_GO_NEG:
121 WDS_LOGD("Negotiation again");
122 wfd_session_connect(session);
124 case SESSION_STATE_WPS:
125 WDS_LOGD("WPS again");
126 wfd_session_wps(session);
129 WDS_LOGE("Invalid session state [%d]", session->state);
132 __WDS_LOG_FUNC_EXIT__;
133 return G_SOURCE_REMOVE;
136 static void __wfd_process_deactivated(wfd_manager_s *manager, wfd_oem_event_s *event)
138 __WDS_LOG_FUNC_ENTER__;
140 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
142 g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE));
144 wfd_destroy_group(manager, GROUP_IFNAME);
145 wfd_destroy_session(manager);
146 wfd_peer_clear_all(manager);
147 wfd_local_reset_data(manager);
149 wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATED);
150 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATED);
151 manager->req_wps_mode = WFD_WPS_MODE_PBC;
153 #ifdef TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT
154 wfd_util_stop_wifi_direct_popup();
155 #endif /* TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT */
156 __WDS_LOG_FUNC_EXIT__;
160 static void __wfd_process_peer_found(wfd_manager_s *manager, wfd_oem_event_s *event)
162 __WDS_LOG_FUNC_ENTER__;
164 wfd_oem_dev_data_s *edata = NULL;
167 edata = (wfd_oem_dev_data_s*) event->edata;
168 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
169 WDS_LOGE("Invalid event data");
170 __WDS_LOG_FUNC_EXIT__;
174 res = _wfd_event_update_peer(manager, edata);
176 WDS_LOGE("Failed to update peer data");
177 __WDS_LOG_FUNC_EXIT__;
181 if (manager->state > WIFI_DIRECT_STATE_ACTIVATING &&
182 manager->state != WIFI_DIRECT_STATE_CONNECTING &&
183 manager->state != WIFI_DIRECT_STATE_DISCONNECTING) {
184 char peer_mac_address[MACSTR_LEN+1] = {0, };
185 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(edata->p2p_dev_addr));
186 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
188 g_variant_new("(s)", peer_mac_address));
191 __WDS_LOG_FUNC_EXIT__;
195 static void __wfd_process_peer_disappeared(wfd_manager_s *manager, wfd_oem_event_s *event)
197 __WDS_LOG_FUNC_ENTER__;
199 wfd_session_s *session = NULL;
200 wfd_device_s *peer = NULL;
201 char peer_mac_address[MACSTR_LEN+1] = {0, };
203 session = manager->session;
204 if(session != NULL && session->peer != NULL) {
205 peer = session->peer;
206 WDS_LOGD("session peer [" MACSTR "] lost peer [" MACSTR "]", MAC2STR(peer->dev_addr),
207 MAC2STR(event->dev_addr));
208 if(memcmp(peer->dev_addr, event->dev_addr, MACADDR_LEN) == 0) {
209 WDS_LOGD("peer already in connection");
214 wfd_remove_peer(manager, event->dev_addr);
216 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
217 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
219 g_variant_new("(s)", peer_mac_address));
221 __WDS_LOG_FUNC_EXIT__;
225 static void __wfd_process_discovery_finished(wfd_manager_s *manager, wfd_oem_event_s *event)
227 __WDS_LOG_FUNC_ENTER__;
229 if (manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
230 manager->state != WIFI_DIRECT_STATE_ACTIVATED) {
231 WDS_LOGE("Notify finding stopped when discovering or activated. [%d]", manager->state);
232 __WDS_LOG_FUNC_EXIT__;
236 if (manager->scan_mode == WFD_SCAN_MODE_PASSIVE) {
237 WDS_LOGE("During passive scan, Discover Finished event will not notified");
238 __WDS_LOG_FUNC_EXIT__;
242 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
243 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
244 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
246 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
247 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
249 manager->scan_mode = WFD_SCAN_MODE_NONE;
251 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
255 __WDS_LOG_FUNC_EXIT__;
259 static void __wfd_process_prov_disc_req(wfd_manager_s *manager, wfd_oem_event_s *event)
261 __WDS_LOG_FUNC_ENTER__;
263 wfd_device_s *peer = NULL;
265 wfd_group_s *group = (wfd_group_s*) manager->group;
267 if (group && group->role == WFD_DEV_ROLE_GC &&
268 event->event_id == WFD_OEM_EVENT_PROV_DISC_REQ) {
269 WDS_LOGD("Device has GC role - ignore this provision request");
270 __WDS_LOG_FUNC_EXIT__;
274 #ifdef CTRL_IFACE_DBUS
275 wfd_oem_dev_data_s *edata = NULL;
277 edata = (wfd_oem_dev_data_s*) event->edata;
278 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
279 WDS_LOGE("Invalid event data");
280 __WDS_LOG_FUNC_EXIT__;
284 res = _wfd_event_update_peer(manager, edata);
285 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
287 peer->state = WFD_PEER_STATE_CONNECTING;
288 #else /* CTRL_IFACE_DBUS */
289 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
291 WDS_LOGD("Prov_disc from unknown peer. Add new peer");
292 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
294 WDS_LOGE("Failed to add peer for invitation");
295 __WDS_LOG_FUNC_EXIT__;
298 peer->state = WFD_PEER_STATE_CONNECTING;
299 wfd_update_peer(manager, peer);
301 wfd_update_peer_time(manager, event->dev_addr);
302 #endif /* CTRL_IFACE_DBUS */
304 res = wfd_session_process_event(manager, event);
306 WDS_LOGE("Failed to process event of session");
308 __WDS_LOG_FUNC_EXIT__;
312 static void __wfd_process_prov_disc_resp(wfd_manager_s *manager, wfd_oem_event_s *event)
314 __WDS_LOG_FUNC_ENTER__;
316 wfd_device_s *peer = NULL;
319 #ifdef CTRL_IFACE_DBUS
320 wfd_oem_dev_data_s *edata = NULL;
322 edata = (wfd_oem_dev_data_s*) event->edata;
323 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
324 WDS_LOGE("Invalid event data");
325 __WDS_LOG_FUNC_EXIT__;
329 res = _wfd_event_update_peer(manager, edata);
330 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
332 peer->state = WFD_PEER_STATE_CONNECTING;
333 #else /* CTRL_IFACE_DBUS */
334 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
336 WDS_LOGD("Prov_disc from unknown peer. Add new peer");
337 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
339 WDS_LOGE("Failed to add peer for invitation");
340 __WDS_LOG_FUNC_EXIT__;
343 peer->state = WFD_PEER_STATE_CONNECTING;
344 wfd_update_peer(manager, peer);
346 wfd_update_peer_time(manager, event->dev_addr);
347 #endif /* CTRL_IFACE_DBUS */
349 res = wfd_session_process_event(manager, event);
351 WDS_LOGE("Failed to process event of session");
353 __WDS_LOG_FUNC_EXIT__;
357 static void __wfd_process_prov_disc_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
359 __WDS_LOG_FUNC_ENTER__;
361 wfd_session_s *session = NULL;
362 unsigned char *peer_addr = NULL;
363 char peer_mac_address[MACSTR_LEN+1] = {0, };
365 session = (wfd_session_s*) manager->session;
367 WDS_LOGE("Unexpected event. Session not exist");
368 __WDS_LOG_FUNC_EXIT__;
372 peer_addr = wfd_session_get_peer_addr(session);
374 WDS_LOGE("Session do not have peer");
375 __WDS_LOG_FUNC_EXIT__;
379 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
380 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
382 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
383 WFD_EVENT_CONNECTION_RSP,
386 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
387 wfd_group_s *group = (wfd_group_s*) manager->group;
388 if (group && !group->member_count && (wfd_group_is_autonomous(group) == FALSE)) {
389 wfd_destroy_group(manager, GROUP_IFNAME);
391 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
392 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
394 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
395 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
398 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
399 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
402 wfd_destroy_session(manager);
404 wfd_oem_refresh(manager->oem_ops);
406 /* After connection failed, scan again */
407 wfd_oem_scan_param_s param;
408 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
409 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
411 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
412 wfd_oem_start_scan(manager->oem_ops, ¶m);
413 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
415 __WDS_LOG_FUNC_EXIT__;
419 static void __wfd_process_go_neg_req(wfd_manager_s *manager, wfd_oem_event_s *event)
421 __WDS_LOG_FUNC_ENTER__;
423 wfd_session_s *session = NULL;
424 wfd_group_s *group = (wfd_group_s*) manager->group;
425 if (group && group->role == WFD_DEV_ROLE_GC) {
426 WDS_LOGD("Device has GC role - ignore this go neg request");
427 __WDS_LOG_FUNC_EXIT__;
431 #ifdef CTRL_IFACE_DBUS
432 wfd_oem_dev_data_s *edata = NULL;
435 edata = (wfd_oem_dev_data_s*) event->edata;
436 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
437 WDS_LOGE("Invalid event data");
438 __WDS_LOG_FUNC_EXIT__;
442 res = _wfd_event_update_peer(manager, edata);
444 WDS_LOGE("Failed to update peer data");
445 __WDS_LOG_FUNC_EXIT__;
448 #else /* CTRL_IFACE_DBUS */
449 wfd_oem_conn_data_s *edata = NULL;
450 wfd_device_s *peer = NULL;
452 edata = (wfd_oem_conn_data_s*) event->edata;
453 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_CONN) {
454 WDS_LOGE("Invalid connection event data");
455 __WDS_LOG_FUNC_EXIT__;
459 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
461 WDS_LOGD("Invitation from unknown peer. Add new peer");
462 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
464 WDS_LOGE("Failed to add peer for invitation");
465 __WDS_LOG_FUNC_EXIT__;
470 if (edata->wps_mode == 0)
472 #endif /* CTRL_IFACE_DBUS */
474 session = (wfd_session_s*) manager->session;
476 session = wfd_create_session(manager, event->dev_addr,
477 #ifdef CTRL_IFACE_DBUS
478 event->wps_mode, SESSION_DIRECTION_INCOMING);
479 #else /* CTRL_IFACE_DBUS */
480 edata->wps_mode, SESSION_DIRECTION_INCOMING);
481 #endif /* CTRL_IFACE_DBUS */
483 WDS_LOGE("Failed to create session");
484 __WDS_LOG_FUNC_EXIT__;
487 session->type = SESSION_TYPE_NORMAL;
488 session->state = SESSION_STATE_GO_NEG;
489 wfd_session_timer(session, 1);
490 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
492 char peer_mac_address[MACSTR_LEN+1] = {0, };
493 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
494 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
496 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
497 WFD_EVENT_CONNECTION_REQ,
500 wfd_session_process_event(manager, event);
502 __WDS_LOG_FUNC_EXIT__;
506 static void __wfd_process_go_neg_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
508 __WDS_LOG_FUNC_ENTER__;
510 wfd_session_s *session = NULL;
511 wfd_oem_conn_data_s *edata = NULL;
512 unsigned char *peer_addr = NULL;
513 char peer_mac_address[MACSTR_LEN] = {0, };
515 session = (wfd_session_s*) manager->session;
517 WDS_LOGE("Unexpected event. Session not exist");
518 __WDS_LOG_FUNC_EXIT__;
522 peer_addr = wfd_session_get_peer_addr(session);
524 WDS_LOGE("Session do not have peer");
525 __WDS_LOG_FUNC_EXIT__;
529 edata = (wfd_oem_conn_data_s*) event->edata;
531 WDS_LOGE("Invalid p2p connection data");
532 __WDS_LOG_FUNC_EXIT__;
536 if (edata->status < 0 && session->connecting_120) {
537 if (session->retry_gsrc) {
538 g_source_remove(session->retry_gsrc);
539 session->retry_gsrc = 0;
541 session->retry_gsrc = g_idle_add((GSourceFunc) _wfd_connection_retry, session);
542 WDS_LOGD("Connection will be retried");
543 __WDS_LOG_FUNC_EXIT__;
547 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
548 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
550 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
551 WFD_EVENT_CONNECTION_RSP,
554 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
555 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
557 wfd_destroy_group(manager, GROUP_IFNAME);
558 wfd_destroy_session(manager);
559 manager->local->dev_role = WFD_DEV_ROLE_NONE;
560 __WDS_LOG_FUNC_EXIT__;
564 static void __wfd_process_go_neg_done(wfd_manager_s *manager, wfd_oem_event_s *event)
566 __WDS_LOG_FUNC_ENTER__;
568 #ifdef CTRL_IFACE_DBUS
569 wfd_session_s *session = NULL;
570 wfd_oem_conn_data_s *edata = NULL;
571 wfd_device_s *peer = NULL;
573 edata = (wfd_oem_conn_data_s*) event->edata;
575 WDS_LOGE("Invalid event data");
576 __WDS_LOG_FUNC_EXIT__;
580 session = (wfd_session_s*) manager->session;
581 if(session && session->peer) {
582 peer = session->peer;
583 memcpy(peer->intf_addr, edata->peer_intf_addr, MACADDR_LEN);
586 wfd_session_process_event(manager, event);
587 #endif /* CTRL_IFACE_DBUS */
588 __WDS_LOG_FUNC_EXIT__;
592 static void __wfd_process_wps_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
594 __WDS_LOG_FUNC_ENTER__;
596 wfd_session_s *session = NULL;
597 unsigned char *peer_addr = NULL;
599 session = (wfd_session_s*) manager->session;
601 WDS_LOGE("Unexpected event. Session not exist");
602 __WDS_LOG_FUNC_EXIT__;
606 peer_addr = wfd_session_get_peer_addr(session);
608 WDS_LOGE("Session do not have peer");
609 __WDS_LOG_FUNC_EXIT__;
613 char peer_mac_address[MACSTR_LEN+1] = {0, };
614 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
615 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
617 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
618 WFD_EVENT_CONNECTION_RSP,
621 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
622 wfd_group_s *group = (wfd_group_s*) manager->group;
623 if (group && !group->member_count && (wfd_group_is_autonomous(group) == FALSE)) {
624 wfd_destroy_group(manager, GROUP_IFNAME);
626 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
627 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
629 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
630 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
633 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
634 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
637 wfd_destroy_session(manager);
639 wfd_oem_refresh(manager->oem_ops);
641 /* After connection failed, scan again */
642 wfd_oem_scan_param_s param;
643 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
644 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
646 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
647 wfd_oem_start_scan(manager->oem_ops, ¶m);
648 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
650 __WDS_LOG_FUNC_EXIT__;
654 static void __wfd_process_wps_done(wfd_manager_s *manager, wfd_oem_event_s *event)
656 __WDS_LOG_FUNC_ENTER__;
658 wfd_session_process_event(manager, event);
660 __WDS_LOG_FUNC_EXIT__;
664 static void __wfd_process_key_neg_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
666 __WDS_LOG_FUNC_ENTER__;
668 wfd_session_s *session = NULL;
669 unsigned char *peer_addr = NULL;
670 char peer_mac_address[MACSTR_LEN+1] = {0, };
672 session = (wfd_session_s*) manager->session;
674 WDS_LOGE("Unexpected event. Session not exist");
675 __WDS_LOG_FUNC_EXIT__;
679 peer_addr = wfd_session_get_peer_addr(session);
681 WDS_LOGE("Session do not has peer");
682 __WDS_LOG_FUNC_EXIT__;
686 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
687 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
689 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
690 WFD_EVENT_CONNECTION_RSP,
693 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
694 wfd_group_s *group = (wfd_group_s*) manager->group;
695 if (group && !group->member_count && (wfd_group_is_autonomous(group) == FALSE)) {
696 wfd_destroy_group(manager, GROUP_IFNAME);
698 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
699 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
701 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
702 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
705 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
706 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
709 wfd_destroy_session(manager);
711 wfd_oem_refresh(manager->oem_ops);
713 /* After connection failed, scan again */
714 wfd_oem_scan_param_s param;
715 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
716 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
718 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
719 wfd_oem_start_scan(manager->oem_ops, ¶m);
720 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
722 __WDS_LOG_FUNC_EXIT__;
726 static void __wfd_process_key_neg_done(wfd_manager_s *manager, wfd_oem_event_s *event)
728 __WDS_LOG_FUNC_ENTER__;
730 __WDS_LOG_FUNC_EXIT__;
734 static void __wfd_process_conn_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
736 __WDS_LOG_FUNC_ENTER__;
738 __WDS_LOG_FUNC_EXIT__;
742 static void __wfd_process_conn_done(wfd_manager_s *manager, wfd_oem_event_s *event)
744 __WDS_LOG_FUNC_ENTER__;
746 __WDS_LOG_FUNC_EXIT__;
750 static void __wfd_process_group_created(wfd_manager_s *manager, wfd_oem_event_s *event)
752 __WDS_LOG_FUNC_ENTER__;
754 wfd_group_s *group = NULL;
755 wfd_session_s *session = NULL;
757 group = (wfd_group_s*) manager->group;
758 session = (wfd_session_s*)manager->session;
759 #ifdef CTRL_IFACE_DBUS
760 if(event->dev_role == WFD_DEV_ROLE_GC && !group) {
762 group = wfd_create_pending_group(manager, event->intf_addr);
764 WDS_LOGE("Failed to create pending group");
765 __WDS_LOG_FUNC_EXIT__;
768 manager->group = group;
770 #endif /* CTRL_IFACE_DBUS */
773 WDS_LOGE("Unexpected Event. Group should be removed(Client)");
774 wfd_oem_destroy_group(manager->oem_ops, event->ifname);
775 __WDS_LOG_FUNC_EXIT__;
779 group = wfd_create_group(manager, event);
781 WDS_LOGE("Failed to create group");
782 __WDS_LOG_FUNC_EXIT__;
786 if (!session && !(group->flags & WFD_GROUP_FLAG_AUTONOMOUS)) {
787 WDS_LOGE("Unexpected Event. Group should be removed(Owner)");
788 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
789 __WDS_LOG_FUNC_EXIT__;
793 if (group->pending) {
794 wfd_group_complete(manager, event);
796 WDS_LOGE("Unexpected event. Group already exist");
797 __WDS_LOG_FUNC_EXIT__;
802 if (group->role == WFD_DEV_ROLE_GC && session) {
803 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
804 wfd_device_s *peer = session->peer;
806 WDS_LOGE("Unexpected event. Peer doesn't exist");
810 wfd_update_peer(manager, peer);
812 if(peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
813 char peer_mac_address[MACSTR_LEN+1] = {0, };
815 wfd_util_ip_over_eap_assign(peer, event->ifname);
817 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
818 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
820 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
821 WFD_EVENT_CONNECTION_RSP,
824 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
825 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
827 wfd_destroy_session(manager);
829 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
830 wfd_peer_clear_all(manager);
832 if (group->flags & WFD_GROUP_FLAG_AUTONOMOUS) {
833 wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
835 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
836 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
839 __WDS_LOG_FUNC_EXIT__;
843 static void __wfd_process_group_destroyed(wfd_manager_s *manager, wfd_oem_event_s *event)
845 __WDS_LOG_FUNC_ENTER__;
847 char peer_mac_address[MACSTR_LEN+1] = {0, };
848 unsigned char *peer_addr = wfd_session_get_peer_addr(manager->session);
850 if (peer_addr != NULL)
851 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
853 g_snprintf(peer_mac_address, MACSTR_LEN, "%s", "");
855 if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
856 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
858 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
859 WFD_EVENT_DISCONNECTION_RSP,
862 } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING && manager->session){
863 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
865 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
866 WFD_EVENT_CONNECTION_RSP,
869 } else if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
870 if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
871 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
873 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
874 WFD_EVENT_DISCONNECTION_RSP,
877 wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
881 WDS_LOGD("Unexpected event(GROUP_DESTROYED). Ignore it");
882 __WDS_LOG_FUNC_EXIT__;
886 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
887 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
888 wfd_destroy_group(manager, event->ifname);
889 wfd_destroy_session(manager);
890 manager->local->dev_role = WFD_DEV_ROLE_NONE;
892 __WDS_LOG_FUNC_EXIT__;
896 static void __wfd_process_invitation_req(wfd_manager_s *manager, wfd_oem_event_s *event)
898 __WDS_LOG_FUNC_ENTER__;
900 wfd_device_s *peer = NULL;
901 wfd_session_s *session = NULL;
902 wfd_oem_invite_data_s *edata = NULL;
904 char peer_mac_address[MACSTR_LEN+1] = {0, };
906 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
908 WDS_LOGD("Invitation from unknown peer. Add new peer");
909 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
911 WDS_LOGE("Failed to add peer for invitation");
912 __WDS_LOG_FUNC_EXIT__;
916 peer->dev_role = WFD_DEV_ROLE_GO;
918 edata = (wfd_oem_invite_data_s*) event->edata;
919 memcpy(peer->intf_addr, edata->bssid, MACADDR_LEN);
920 wfd_update_peer_time(manager, event->dev_addr);
922 session = wfd_create_session(manager, event->dev_addr,
923 manager->req_wps_mode, SESSION_DIRECTION_INCOMING);
925 WDS_LOGE("Failed to create session");
926 __WDS_LOG_FUNC_EXIT__;
929 session->type = SESSION_TYPE_INVITE;
930 wfd_session_timer(session, 1);
932 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
934 res = wfd_session_start(session);
936 WDS_LOGE("Failed to start session");
937 __WDS_LOG_FUNC_EXIT__;
941 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
942 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
944 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
945 WFD_EVENT_CONNECTION_REQ,
948 __WDS_LOG_FUNC_EXIT__;
952 static void __wfd_process_invitation_res(wfd_manager_s *manager, wfd_oem_event_s *event)
954 __WDS_LOG_FUNC_ENTER__;
956 __WDS_LOG_FUNC_EXIT__;
960 static void __wfd_process_sta_connected(wfd_manager_s *manager, wfd_oem_event_s *event)
962 __WDS_LOG_FUNC_ENTER__;
964 wfd_session_s *session = NULL;
965 wfd_device_s *peer = NULL;
966 wfd_group_s *group = NULL;
967 char peer_mac_address[MACSTR_LEN+1] = {0, };
969 // FIXME: Move this code to plugin
970 if (!memcmp(event->intf_addr, manager->local->intf_addr, MACADDR_LEN)) {
971 WDS_LOGD("Ignore this event");
972 __WDS_LOG_FUNC_EXIT__;
976 session = (wfd_session_s*) manager->session;
978 WDS_LOGD("Unexpected event. Session is NULL [peer: " MACSECSTR "]",
979 MAC2SECSTR(event->dev_addr));
980 wfd_oem_destroy_group(manager->oem_ops, GROUP_IFNAME);
981 wfd_destroy_group(manager, GROUP_IFNAME);
982 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
983 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
984 __WDS_LOG_FUNC_EXIT__;
988 peer = wfd_session_get_peer(session);
990 WDS_LOGE("Peer not found");
991 __WDS_LOG_FUNC_EXIT__;
995 group = (wfd_group_s*) manager->group;
997 group = wfd_create_pending_group(manager, event->intf_addr);
999 WDS_LOGE("Failed to create pending group");
1000 __WDS_LOG_FUNC_EXIT__;
1003 manager->group = group;
1005 wfd_group_add_member(group, peer->dev_addr);
1007 session->state = SESSION_STATE_COMPLETED;
1008 #ifndef CTRL_IFACE_DBUS
1009 memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
1010 #endif /* CTRL_IFACE_DBUS */
1011 peer->state = WFD_PEER_STATE_CONNECTED;
1013 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1014 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1016 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1017 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1019 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1020 WFD_EVENT_CONNECTION_RSP,
1023 #ifdef CTRL_IFACE_DBUS
1024 wfd_update_peer(manager, peer);
1025 #endif /* CTRL_IFACE_DBUS */
1026 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
1027 if (event->ip_addr_peer[3]) {
1028 peer->ip_type = WFD_IP_TYPE_OVER_EAPOL;
1029 memcpy(peer->client_ip_addr, event->ip_addr_peer, IPADDR_LEN);
1030 WDS_LOGE("Peer's client IP [" IPSTR "]", IP2STR((char*) &peer->client_ip_addr));
1031 memcpy(peer->go_ip_addr, manager->local->ip_addr, IPADDR_LEN);
1032 WDS_LOGE("Peer's GO IP [" IPSTR "]", IP2STR((char*) &peer->go_ip_addr));
1034 if(peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
1035 char peer_mac_address[MACSTR_LEN+1] = {0,};
1036 char assigned_ip_address[IPSTR_LEN+1] = {0,};
1038 memcpy(peer->ip_addr, peer->client_ip_addr, IPADDR_LEN);
1040 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1041 g_snprintf(assigned_ip_address, IPSTR_LEN, IPSTR, IP2STR(peer->ip_addr));
1042 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1044 g_variant_new("(ss)", peer_mac_address,
1045 assigned_ip_address));
1047 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
1048 wfd_util_dhcps_wait_ip_leased(peer);
1049 wfd_destroy_session(manager);
1051 __WDS_LOG_FUNC_EXIT__;
1055 static void __wfd_process_sta_disconnected(wfd_manager_s *manager, wfd_oem_event_s *event)
1057 __WDS_LOG_FUNC_ENTER__;
1059 wfd_group_s *group = NULL;
1060 wfd_device_s *peer = NULL;
1061 unsigned char peer_addr[MACADDR_LEN] = {0, };
1062 char peer_mac_address[MACSTR_LEN+1] = {0, };
1064 group = (wfd_group_s*) manager->group;
1066 WDS_LOGE("Group not found");
1067 __WDS_LOG_FUNC_EXIT__;
1071 #ifdef CTRL_IFACE_DBUS
1072 peer = wfd_group_find_member_by_addr(group, event->dev_addr);
1073 #else /* CTRL_IFACE_DBUS */
1074 peer = wfd_group_find_member_by_addr(group, event->intf_addr);
1075 #endif /* DBUS_IFACE */
1077 WDS_LOGE("Failed to find connected peer");
1078 peer = wfd_session_get_peer(manager->session);
1080 WDS_LOGE("Failed to find connecting peer");
1081 __WDS_LOG_FUNC_EXIT__;
1085 #ifdef CTRL_IFACE_DBUS
1087 * If no peer connected and
1088 * disconnected event is not for connecting peer
1089 * then event should be ignored.
1090 * This situation can arrise when TV is GO and
1091 * some connected peer sent disassociation.
1093 if (memcmp(peer_addr, event->dev_addr, MACADDR_LEN)) {
1094 WDS_LOGE("Unexpected event, Ignore it...");
1095 __WDS_LOG_FUNC_EXIT__;
1098 #endif /* CTRL_DBUS_IFACE */
1100 memcpy(peer_addr, peer->dev_addr, MACADDR_LEN);
1102 /* If state is not DISCONNECTING, connection is finished by peer.
1103 * Required the check also, when Device is Group Owner and state is DISCOVERING.
1105 if (manager->state >= WIFI_DIRECT_STATE_CONNECTED ||
1106 (manager->state == WIFI_DIRECT_STATE_DISCOVERING &&
1107 manager->local->dev_role == WFD_DEV_ROLE_GO)) {
1108 wfd_group_remove_member(group, peer_addr);
1109 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1110 if (group->member_count) {
1111 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1113 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1114 WFD_EVENT_DISASSOCIATION_IND,
1117 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1119 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1120 WFD_EVENT_DISCONNECTION_IND,
1124 } else if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
1125 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1126 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1128 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1129 WFD_EVENT_DISCONNECTION_RSP,
1132 } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING &&
1133 /* Some devices(GO) send disconnection message before connection completed.
1134 * This message should be ignored when device is not GO */
1135 manager->local->dev_role == WFD_DEV_ROLE_GO) {
1136 if (WFD_PEER_STATE_CONNECTED == peer->state) {
1137 WDS_LOGD("Peer is already Connected !!!");
1138 wfd_group_remove_member(group, peer_addr);
1139 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1140 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1142 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1143 WFD_EVENT_DISASSOCIATION_IND,
1146 } else if (WFD_PEER_STATE_CONNECTING == peer->state) {
1147 WDS_LOGD("Peer is Connecting...");
1148 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1149 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1151 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
1152 WFD_EVENT_CONNECTION_RSP,
1155 WDS_LOGE("Unexpected Peer State. Ignore it");
1156 __WDS_LOG_FUNC_EXIT__;
1160 WDS_LOGE("Unexpected event. Ignore it");
1161 __WDS_LOG_FUNC_EXIT__;
1165 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1166 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1167 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1169 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1170 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1173 /* If there is no member, GO should be destroyed */
1174 if (!group->member_count) {
1175 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1176 wfd_destroy_group(manager, group->ifname);
1177 wfd_peer_clear_all(manager);
1180 wfd_destroy_session(manager);
1182 __WDS_LOG_FUNC_EXIT__;
1186 static void __wfd_process_terminating(wfd_manager_s *manager, wfd_oem_event_s *event)
1188 __WDS_LOG_FUNC_ENTER__;
1190 __WDS_LOG_FUNC_EXIT__;
1194 static void __wfd_process_group_formation_failure(wfd_manager_s *manager, wfd_oem_event_s *event)
1196 __WDS_LOG_FUNC_ENTER__;
1198 wfd_session_s *session = (wfd_session_s*) manager->session;
1200 WDS_LOGE("Unexpected event. Session not exist");
1201 __WDS_LOG_FUNC_EXIT__;
1205 unsigned char *peer_addr = wfd_session_get_peer_addr(session);
1207 WDS_LOGE("Session do not has peer");
1208 __WDS_LOG_FUNC_EXIT__;
1212 char peer_mac_address[MACSTR_LEN+1] = {0, };
1213 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1214 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1216 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
1217 WFD_EVENT_CONNECTION_RSP,
1220 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1221 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1222 wfd_destroy_session(manager);
1223 manager->local->dev_role = WFD_DEV_ROLE_NONE;
1225 wfd_oem_refresh(manager->oem_ops);
1227 __WDS_LOG_FUNC_EXIT__;
1232 * This event is generated by supplicant when persitent invite is auto accepted
1233 * so that wfd-manager can get indication that a peer will be connected in near future.
1234 * session is started for that peer, so that it is not ignored when connected.
1236 static void __wfd_process_invitation_accepted(wfd_manager_s *manager, wfd_oem_event_s *event)
1239 __WDS_LOG_FUNC_ENTER__;
1241 wfd_session_s *session = (wfd_session_s*) manager->session;
1242 wfd_device_s *peer = NULL;
1243 char peer_mac_address[MACSTR_LEN+1] = {0, };
1245 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
1247 WDS_LOGI("Invitation from unknown peer. Add new peer");
1248 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
1250 WDS_LOGE("Failed to add peer for invitation");
1251 __WDS_LOG_FUNC_EXIT__;
1255 /**By default, peer device information is complete but there's some exception
1256 * if DEV-FOUND event was not preceding before connection start event.
1258 wfd_update_peer(manager, peer);
1259 peer->dev_role = WFD_DEV_ROLE_GO;
1262 session = wfd_create_session(manager, event->dev_addr,
1263 event->wps_mode, SESSION_DIRECTION_INCOMING);
1265 WDS_LOGE("Failed to create session with peer [" MACSTR "]",
1266 MAC2STR(event->dev_addr));
1267 __WDS_LOG_FUNC_EXIT__;
1272 session->state = SESSION_STATE_WPS;
1273 wfd_session_timer(session, 1);
1275 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1276 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1278 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1279 WFD_EVENT_CONNECTION_IN_PROGRESS,
1282 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
1283 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
1285 __WDS_LOG_FUNC_EXIT__;
1288 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1289 static void __wfd_process_serv_disc_resp(wfd_manager_s *manager, wfd_oem_event_s *event)
1291 __WDS_LOG_FUNC_ENTER__;
1293 char response_data[256] = {0, };
1294 char peer_mac_address[MACSTR_LEN+1] = {0, };
1296 wfd_update_peer_time(manager, event->dev_addr);
1298 if (event->edata_type == WFD_OEM_EDATA_TYPE_NEW_SERVICE) {
1299 wfd_oem_new_service_s *service = NULL;;
1301 GList *services = (GList*) event->edata;
1304 WDS_LOGD("%d service data found", event->dev_role);
1306 temp = g_list_first(services);
1307 while(temp && count < event->dev_role) {
1308 service = (wfd_oem_new_service_s*) temp->data;
1309 service_type = service->protocol;
1310 if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
1311 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1312 g_snprintf(response_data, 256, "%s|%s", service->data.bonjour.query, service->data.bonjour.rdata);
1313 WDS_LOGD("Found service: [%d: %s] - [" MACSECSTR "]", service->protocol,
1314 service->data.bonjour.query, MAC2SECSTR(event->dev_addr));
1316 WDS_LOGD("Found service is not supported");
1320 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
1322 g_variant_new("(iss)", service_type,
1326 temp = g_list_next(temp);
1330 } else if (event->edata_type == WFD_OEM_EDATA_TYPE_SERVICE) {
1331 wfd_oem_service_data_s *edata = (wfd_oem_service_data_s*) event->edata;
1336 service_type = edata->type;
1337 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1338 switch(edata->type) {
1339 WDS_LOGE("Unknown type [type ID: %d]", edata->type);
1343 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
1345 g_variant_new("(iss)", service_type,
1350 __WDS_LOG_FUNC_EXIT__;
1354 static void __wfd_process_serv_disc_started(wfd_manager_s *manager, wfd_oem_event_s *event)
1356 __WDS_LOG_FUNC_ENTER__;
1358 __WDS_LOG_FUNC_EXIT__;
1361 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1364 #if defined(TIZEN_FEATURE_ASP)
1365 static void __wfd_process_asp_serv_resp(wfd_manager_s *manager, wfd_oem_event_s *event)
1367 __WDS_LOG_FUNC_ENTER__;
1369 wfd_oem_asp_service_s *service = NULL;
1370 GVariantBuilder *builder = NULL;
1371 GVariant *params = NULL;
1373 service = (wfd_oem_asp_service_s *)event->edata;
1374 if(service == NULL) {
1375 WDS_LOGE("P2P service found event has NULL information");
1376 __WDS_LOG_FUNC_EXIT__;
1380 builder = g_variant_builder_new(G_VARIANT_TYPE ("a{sv}"));
1381 g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("u", service->search_id));
1382 g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", event->dev_addr));
1383 g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
1384 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
1385 if(service->service_type)
1386 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_name));
1387 if(service->service_info)
1388 g_variant_builder_add(builder, "{sv}", "service_info", g_variant_new("s", service->service_info));
1389 g_variant_builder_add(builder, "{sv}", "status", g_variant_new("y", service->status));
1390 params = g_variant_new("(a{sv})", builder);
1391 g_variant_builder_unref(builder);
1393 wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
1397 __WDS_LOG_FUNC_EXIT__;
1400 #endif /* TIZEN_FEATURE_ASP */
1404 void (*function) (wfd_manager_s *manager, wfd_oem_event_s *event);
1405 } wfd_oem_event_map[] = {
1411 WFD_OEM_EVENT_DEACTIVATED,
1412 __wfd_process_deactivated
1415 WFD_OEM_EVENT_PEER_FOUND,
1416 __wfd_process_peer_found
1419 WFD_OEM_EVENT_PEER_DISAPPEARED,
1420 __wfd_process_peer_disappeared
1423 WFD_OEM_EVENT_DISCOVERY_FINISHED,
1424 __wfd_process_discovery_finished
1427 WFD_OEM_EVENT_PROV_DISC_REQ,
1428 __wfd_process_prov_disc_req
1431 WFD_OEM_EVENT_PROV_DISC_RESP,
1432 __wfd_process_prov_disc_resp
1435 WFD_OEM_EVENT_PROV_DISC_FAIL,
1436 __wfd_process_prov_disc_fail
1439 WFD_OEM_EVENT_GO_NEG_REQ,
1440 __wfd_process_go_neg_req
1443 WFD_OEM_EVENT_GO_NEG_FAIL,
1444 __wfd_process_go_neg_fail
1447 WFD_OEM_EVENT_GO_NEG_DONE,
1448 __wfd_process_go_neg_done
1451 WFD_OEM_EVENT_WPS_FAIL,
1452 __wfd_process_wps_fail
1455 WFD_OEM_EVENT_WPS_DONE,
1456 __wfd_process_wps_done
1459 WFD_OEM_EVENT_KEY_NEG_FAIL,
1460 __wfd_process_key_neg_fail
1463 WFD_OEM_EVENT_KEY_NEG_DONE,
1464 __wfd_process_key_neg_done
1467 WFD_OEM_EVENT_CONN_FAIL,
1468 __wfd_process_conn_fail
1471 WFD_OEM_EVENT_CONN_DONE,
1472 __wfd_process_conn_done
1475 WFD_OEM_EVENT_GROUP_CREATED,
1476 __wfd_process_group_created
1479 WFD_OEM_EVENT_GROUP_DESTROYED,
1480 __wfd_process_group_destroyed
1483 WFD_OEM_EVENT_INVITATION_REQ,
1484 __wfd_process_invitation_req
1487 WFD_OEM_EVENT_INVITATION_RES,
1488 __wfd_process_invitation_res
1491 WFD_OEM_EVENT_STA_CONNECTED,
1492 __wfd_process_sta_connected
1495 WFD_OEM_EVENT_STA_DISCONNECTED,
1496 __wfd_process_sta_disconnected
1499 WFD_OEM_EVENT_TERMINATING,
1500 __wfd_process_terminating
1503 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1505 WFD_OEM_EVENT_SERV_DISC_RESP,
1506 __wfd_process_serv_disc_resp
1509 WFD_OEM_EVENT_SERV_DISC_STARTED,
1510 __wfd_process_serv_disc_started
1512 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1514 WFD_OEM_EVENT_GROUP_FORMATION_FAILURE,
1515 __wfd_process_group_formation_failure
1518 WFD_OEM_EVENT_INVITATION_ACCEPTED,
1519 __wfd_process_invitation_accepted
1521 #if defined(TIZEN_FEATURE_ASP)
1523 WFD_OEM_EVENT_ASP_SERV_RESP,
1524 __wfd_process_asp_serv_resp,
1526 #endif /* TIZEN_FEATURE_ASP */
1533 int wfd_process_event(void *user_data, void *data)
1535 __WDS_LOG_FUNC_ENTER__;
1536 wfd_manager_s *manager = NULL;
1537 wfd_oem_event_s *event = NULL;
1539 manager = (wfd_manager_s*) user_data;
1540 event = (wfd_oem_event_s*) data;
1541 if (!manager || !event) {
1542 WDS_LOGE("Invalid parameter");
1543 __WDS_LOG_FUNC_EXIT__;
1547 WDS_LOGD("Event[%d] from " MACSECSTR, event->event_id,
1548 MAC2SECSTR(event->dev_addr));
1550 if(event->event_id > WFD_OEM_EVENT_NONE &&
1551 event->event_id < WFD_OEM_EVENT_MAX)
1552 wfd_oem_event_map[event->event_id].function(manager, event);
1554 WDS_LOGE("Invalid event ID");
1556 __WDS_LOG_FUNC_EXIT__;