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-client.h"
47 #include "wifi-direct-state.h"
48 #include "wifi-direct-util.h"
51 static int _wfd_event_update_peer(wfd_manager_s *manager, wfd_oem_dev_data_s *data)
53 __WDS_LOG_FUNC_ENTER__;
55 wfd_device_s *peer = NULL;
57 if (!manager || !data) {
58 WDS_LOGE("Invalid parameter");
62 peer = wfd_peer_find_by_dev_addr(manager, data->p2p_dev_addr);
64 peer = wfd_add_peer(manager, data->p2p_dev_addr, data->name);
66 WDS_LOGE("Failed to add peer");
70 if (strcmp(peer->dev_name, data->name)) {
71 g_strlcpy(peer->dev_name, data->name, DEV_NAME_LEN + 1);
72 WDS_LOGD("Device name is changed [" MACSECSTR ": %s]",
73 MAC2SECSTR(peer->dev_addr), peer->dev_name);
76 #ifndef CTRL_IFACE_DBUS
77 memcpy(peer->intf_addr, data->p2p_intf_addr, MACADDR_LEN);
78 #endif /* CTRL_IFACE_DBUS */
79 peer->pri_dev_type = data->pri_dev_type;
80 peer->sec_dev_type = data->sec_dev_type;
81 peer->config_methods = data->config_methods;
82 peer->dev_flags = data->dev_flags;
83 peer->group_flags = data->group_flags;
84 peer->dev_role = data->dev_role;
85 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
86 memcpy(&(peer->display), &(data->display), sizeof(wfd_display_s));
87 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
89 #if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
90 wfd_util_get_current_time(&peer->time);
93 gettimeofday(&tval, NULL);
94 peer->time = tval.tv_sec;
96 WDS_LOGI("Update time [%s - %ld]", peer->dev_name, peer->time);
98 __WDS_LOG_FUNC_EXIT__;
102 gboolean _wfd_connection_retry(gpointer *data)
104 wfd_session_s *session = (wfd_session_s*) data;
106 WDS_LOGE("Session is NULL");
107 return G_SOURCE_REMOVE;
110 switch (session->state) {
111 case SESSION_STATE_STARTED:
112 WDS_LOGD("PD again");
113 wfd_session_start(session);
115 case SESSION_STATE_GO_NEG:
116 WDS_LOGD("Negotiation again");
117 wfd_session_connect(session);
119 case SESSION_STATE_WPS:
120 WDS_LOGD("WPS again");
121 wfd_session_wps(session);
124 WDS_LOGE("Invalid session state [%d]", session->state);
128 return G_SOURCE_REMOVE;
131 static void __wfd_process_deactivated(wfd_manager_s *manager, wfd_oem_event_s *event)
133 __WDS_LOG_FUNC_ENTER__;
135 wifi_direct_client_noti_s noti;
137 if (event == NULL || manager == NULL) {
138 WDS_LOGE("Invalid parameter");
142 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
143 noti.event = WIFI_DIRECT_CLI_EVENT_DEACTIVATION;
144 noti.error = WIFI_DIRECT_ERROR_NONE;
145 wfd_client_send_event(manager, ¬i);
147 wfd_destroy_group(manager, GROUP_IFNAME);
148 wfd_destroy_session(manager);
149 wfd_peer_clear_all(manager);
150 wfd_local_reset_data(manager);
152 wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATED);
153 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATED);
154 manager->req_wps_mode = WFD_WPS_MODE_PBC;
156 __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;
165 wifi_direct_client_noti_s noti;
168 if (event == NULL || manager == NULL) {
169 WDS_LOGE("Invalid parameter");
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");
179 res = _wfd_event_update_peer(manager, edata);
181 WDS_LOGE("Failed to update peer data");
185 if (manager->state > WIFI_DIRECT_STATE_ACTIVATING &&
186 manager->state != WIFI_DIRECT_STATE_CONNECTING &&
187 manager->state != WIFI_DIRECT_STATE_DISCONNECTING) {
188 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
189 snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(edata->p2p_dev_addr));
190 noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS;
191 noti.error = WIFI_DIRECT_ERROR_NONE;
192 wfd_client_send_event(manager, ¬i);
195 __WDS_LOG_FUNC_EXIT__;
199 static void __wfd_process_peer_disappeared(wfd_manager_s *manager, wfd_oem_event_s *event)
201 __WDS_LOG_FUNC_ENTER__;
203 wifi_direct_client_noti_s noti;
205 if (event == NULL || manager == NULL) {
206 WDS_LOGE("Invalid parameter");
210 wfd_remove_peer(manager, event->dev_addr);
212 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
213 snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
214 noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_LOST_PEERS;
215 noti.error = WIFI_DIRECT_ERROR_NONE;
216 wfd_client_send_event(manager, ¬i);
218 __WDS_LOG_FUNC_EXIT__;
222 static void __wfd_process_discovery_finished(wfd_manager_s *manager, wfd_oem_event_s *event)
224 __WDS_LOG_FUNC_ENTER__;
226 wifi_direct_client_noti_s noti;
228 if (event == NULL || manager == NULL) {
229 WDS_LOGE("Invalid parameter");
233 if (manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
234 manager->state != WIFI_DIRECT_STATE_ACTIVATED) {
235 WDS_LOGE("Notify finding stopped when discovering or activated. [%d]", manager->state);
239 if (manager->scan_mode == WFD_SCAN_MODE_PASSIVE) {
240 WDS_LOGE("During passive scan, Discover Finished event will not notified");
244 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
245 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
246 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
248 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
249 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
251 manager->scan_mode = WFD_SCAN_MODE_NONE;
253 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
254 noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;
255 noti.error = WIFI_DIRECT_ERROR_NONE;
256 wfd_client_send_event(manager, ¬i);
258 __WDS_LOG_FUNC_EXIT__;
262 static void __wfd_process_prov_disc_req(wfd_manager_s *manager, wfd_oem_event_s *event)
264 __WDS_LOG_FUNC_ENTER__;
266 wfd_device_s *peer = NULL;
269 if (event == NULL || manager == NULL) {
270 WDS_LOGE("Invalid parameter");
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");
283 res = _wfd_event_update_peer(manager, edata);
284 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
286 peer->state = WFD_PEER_STATE_CONNECTING;
287 #else /* CTRL_IFACE_DBUS */
288 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
290 WDS_LOGD("Prov_disc from unknown peer. Add new peer");
291 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
293 WDS_LOGE("Failed to add peer for invitation");
296 peer->state = WFD_PEER_STATE_CONNECTING;
297 wfd_update_peer(manager, peer);
299 wfd_update_peer_time(manager, event->dev_addr);
300 #endif /* CTRL_IFACE_DBUS */
302 res = wfd_session_process_event(manager, event);
304 WDS_LOGE("Failed to process event of session");
306 __WDS_LOG_FUNC_EXIT__;
310 static void __wfd_process_prov_disc_resp(wfd_manager_s *manager, wfd_oem_event_s *event)
312 __WDS_LOG_FUNC_ENTER__;
314 wfd_device_s *peer = NULL;
317 if (event == NULL || manager == NULL) {
318 WDS_LOGE("Invalid parameter");
322 #ifdef CTRL_IFACE_DBUS
323 wfd_oem_dev_data_s *edata = NULL;
325 edata = (wfd_oem_dev_data_s*) event->edata;
326 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
327 WDS_LOGE("Invalid event data");
331 res = _wfd_event_update_peer(manager, edata);
332 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
334 peer->state = WFD_PEER_STATE_CONNECTING;
335 #else /* CTRL_IFACE_DBUS */
336 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
338 WDS_LOGD("Prov_disc from unknown peer. Add new peer");
339 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
341 WDS_LOGE("Failed to add peer for invitation");
344 peer->state = WFD_PEER_STATE_CONNECTING;
345 wfd_update_peer(manager, peer);
347 wfd_update_peer_time(manager, event->dev_addr);
348 #endif /* CTRL_IFACE_DBUS */
350 res = wfd_session_process_event(manager, event);
352 WDS_LOGE("Failed to process event of session");
354 __WDS_LOG_FUNC_EXIT__;
358 static void __wfd_process_prov_disc_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
360 __WDS_LOG_FUNC_ENTER__;
362 wfd_session_s *session = NULL;
363 wifi_direct_client_noti_s noti;
364 unsigned char *peer_addr = NULL;
366 if (event == NULL || manager == NULL) {
367 WDS_LOGE("Invalid parameter");
371 session = (wfd_session_s*) manager->session;
373 WDS_LOGE("Unexpected event. Session not exist");
377 peer_addr = wfd_session_get_peer_addr(session);
379 WDS_LOGE("Session do not have peer");
383 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
384 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
385 noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
386 snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
387 wfd_client_send_event(manager, ¬i);
389 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
390 wfd_group_s *group = (wfd_group_s*) manager->group;
391 if (group && !group->member_count && (wfd_group_is_autonomous(group) == FALSE)) {
392 wfd_destroy_group(manager, GROUP_IFNAME);
394 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
395 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
397 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
398 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
401 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
402 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
405 wfd_destroy_session(manager);
407 wfd_oem_refresh(manager->oem_ops);
409 /* After connection failed, scan again */
410 wfd_oem_scan_param_s param;
411 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
412 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
414 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
415 wfd_oem_start_scan(manager->oem_ops, ¶m);
416 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
418 __WDS_LOG_FUNC_EXIT__;
422 static void __wfd_process_go_neg_req(wfd_manager_s *manager, wfd_oem_event_s *event)
424 __WDS_LOG_FUNC_ENTER__;
426 wfd_session_s *session = NULL;
427 wifi_direct_client_noti_s noti;
429 if (event == NULL || manager == NULL) {
430 WDS_LOGE("Invalid parameter");
434 #ifdef CTRL_IFACE_DBUS
435 wfd_oem_dev_data_s *edata = NULL;
437 edata = (wfd_oem_dev_data_s*) event->edata;
438 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
439 WDS_LOGE("Invalid event data");
443 if (_wfd_event_update_peer(manager, edata) < 0) {
444 WDS_LOGE("Failed to update peer data");
447 #else /* CTRL_IFACE_DBUS */
448 wfd_oem_conn_data_s *edata = NULL;
449 wfd_device_s *peer = NULL;
451 edata = (wfd_oem_conn_data_s*) event->edata;
452 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_CONN) {
453 WDS_LOGE("Invalid connection event data");
457 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
459 WDS_LOGD("Invitation from unknown peer. Add new peer");
460 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
462 WDS_LOGE("Failed to add peer for invitation");
467 if (edata->wps_mode == 0)
469 #endif /* CTRL_IFACE_DBUS */
471 session = (wfd_session_s*) manager->session;
473 session = wfd_create_session(manager, event->dev_addr,
474 #ifdef CTRL_IFACE_DBUS
475 event->wps_mode, SESSION_DIRECTION_INCOMING);
476 #else /* CTRL_IFACE_DBUS */
477 edata->wps_mode, SESSION_DIRECTION_INCOMING);
478 #endif /* CTRL_IFACE_DBUS */
480 WDS_LOGE("Failed to create session");
483 session->type = SESSION_TYPE_NORMAL;
484 session->state = SESSION_STATE_GO_NEG;
485 wfd_session_timer(session, 1);
486 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
488 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
489 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ;
490 noti.error = WIFI_DIRECT_ERROR_NONE;
491 g_snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
492 wfd_client_send_event(manager, ¬i);
494 wfd_session_process_event(manager, event);
496 __WDS_LOG_FUNC_EXIT__;
500 static void __wfd_process_go_neg_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
502 __WDS_LOG_FUNC_ENTER__;
504 wfd_session_s *session = NULL;
505 wfd_oem_conn_data_s *edata = NULL;
506 wifi_direct_client_noti_s noti;
507 unsigned char *peer_addr = NULL;
509 if (event == NULL || manager == NULL) {
510 WDS_LOGE("Invalid parameter");
514 session = (wfd_session_s*) manager->session;
516 WDS_LOGE("Unexpected event. Session not exist");
520 peer_addr = wfd_session_get_peer_addr(session);
522 WDS_LOGE("Session do not have peer");
526 edata = (wfd_oem_conn_data_s*) event->edata;
527 if (edata && edata->status < 0 && session->connecting_120) {
528 if (session->retry_gsrc) {
529 g_source_remove(session->retry_gsrc);
530 session->retry_gsrc = 0;
532 session->retry_gsrc = g_idle_add((GSourceFunc) _wfd_connection_retry, session);
533 WDS_LOGD("Connection will be retried");
537 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
538 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
539 noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
540 snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
541 wfd_client_send_event(manager, ¬i);
543 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
544 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
546 wfd_destroy_group(manager, GROUP_IFNAME);
547 wfd_destroy_session(manager);
548 manager->local->dev_role = WFD_DEV_ROLE_NONE;
550 __WDS_LOG_FUNC_EXIT__;
554 static void __wfd_process_go_neg_done(wfd_manager_s *manager, wfd_oem_event_s *event)
556 __WDS_LOG_FUNC_ENTER__;
558 #ifdef CTRL_IFACE_DBUS
559 wfd_session_s *session = NULL;
560 wfd_oem_conn_data_s *edata = NULL;
561 wfd_device_s *peer = NULL;
563 if (event == NULL || manager == NULL) {
564 WDS_LOGE("Invalid parameter");
568 edata = (wfd_oem_conn_data_s*) event->edata;
570 WDS_LOGE("Invalid event data");
574 session = (wfd_session_s*) manager->session;
575 if(session && session->peer) {
576 peer = session->peer;
577 memcpy(peer->intf_addr, edata->peer_intf_addr, MACADDR_LEN);
579 manager->local->dev_role = event->dev_role;
580 wfd_session_process_event(manager, event);
581 #endif /* CTRL_IFACE_DBUS */
582 __WDS_LOG_FUNC_EXIT__;
586 static void __wfd_process_wps_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
588 __WDS_LOG_FUNC_ENTER__;
590 wfd_session_s *session = NULL;
591 wifi_direct_client_noti_s noti;
592 unsigned char *peer_addr = NULL;
594 if (event == NULL || manager == NULL) {
595 WDS_LOGE("Invalid parameter");
599 session = (wfd_session_s*) manager->session;
601 WDS_LOGE("Unexpected event. Session not exist");
605 peer_addr = wfd_session_get_peer_addr(session);
607 WDS_LOGE("Session do not have peer");
611 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
612 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
613 noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
614 snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
615 wfd_client_send_event(manager, ¬i);
617 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
618 wfd_group_s *group = (wfd_group_s*) manager->group;
619 if (group && !group->member_count && (wfd_group_is_autonomous(group) == FALSE)) {
620 wfd_destroy_group(manager, GROUP_IFNAME);
622 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
623 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
625 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
626 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
629 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
630 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
633 wfd_destroy_session(manager);
635 wfd_oem_refresh(manager->oem_ops);
637 /* After connection failed, scan again */
638 wfd_oem_scan_param_s param;
639 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
640 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
642 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
643 wfd_oem_start_scan(manager->oem_ops, ¶m);
644 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
646 __WDS_LOG_FUNC_EXIT__;
650 static void __wfd_process_wps_done(wfd_manager_s *manager, wfd_oem_event_s *event)
652 __WDS_LOG_FUNC_ENTER__;
654 wfd_session_process_event(manager, event);
656 __WDS_LOG_FUNC_EXIT__;
660 static void __wfd_process_key_neg_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
662 __WDS_LOG_FUNC_ENTER__;
664 wfd_session_s *session = NULL;
665 wifi_direct_client_noti_s noti;
666 unsigned char *peer_addr = NULL;
668 if (event == NULL || manager == NULL) {
669 WDS_LOGE("Invalid parameter");
673 session = (wfd_session_s*) manager->session;
675 WDS_LOGE("Unexpected event. Session not exist");
679 peer_addr = wfd_session_get_peer_addr(session);
681 WDS_LOGE("Session do not has peer");
685 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
686 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
687 noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
688 snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
689 wfd_client_send_event(manager, ¬i);
691 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
692 wfd_group_s *group = (wfd_group_s*) manager->group;
693 if (group && !group->member_count && (wfd_group_is_autonomous(group) == FALSE)) {
694 wfd_destroy_group(manager, GROUP_IFNAME);
696 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
697 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
699 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
700 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
703 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
704 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
707 wfd_destroy_session(manager);
709 wfd_oem_refresh(manager->oem_ops);
711 /* After connection failed, scan again */
712 wfd_oem_scan_param_s param;
713 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
714 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
716 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
717 wfd_oem_start_scan(manager->oem_ops, ¶m);
718 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
720 __WDS_LOG_FUNC_EXIT__;
724 static void __wfd_process_key_neg_done(wfd_manager_s *manager, wfd_oem_event_s *event)
726 __WDS_LOG_FUNC_ENTER__;
728 __WDS_LOG_FUNC_EXIT__;
732 static void __wfd_process_conn_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
734 __WDS_LOG_FUNC_ENTER__;
736 __WDS_LOG_FUNC_EXIT__;
740 static void __wfd_process_conn_done(wfd_manager_s *manager, wfd_oem_event_s *event)
742 __WDS_LOG_FUNC_ENTER__;
744 __WDS_LOG_FUNC_EXIT__;
748 static void __wfd_process_group_created(wfd_manager_s *manager, wfd_oem_event_s *event)
750 __WDS_LOG_FUNC_ENTER__;
752 wfd_group_s *group = NULL;
753 wfd_session_s *session = NULL;
754 wifi_direct_client_noti_s noti;
756 if (event == NULL || manager == NULL) {
757 WDS_LOGE("Invalid parameter");
761 group = (wfd_group_s*) manager->group;
762 session = (wfd_session_s*)manager->session;
763 #ifdef CTRL_IFACE_DBUS
764 if(event->dev_role == WFD_DEV_ROLE_GC && !group) {
766 group = wfd_create_pending_group(manager, event->intf_addr);
768 WDS_LOGE("Failed to create pending group");
771 manager->group = group;
773 #endif /* CTRL_IFACE_DBUS */
776 WDS_LOGE("Unexpected Event. Group should be removed(Client)");
777 wfd_oem_destroy_group(manager->oem_ops, event->ifname);
781 group = wfd_create_group(manager, event);
783 WDS_LOGE("Failed to create group");
787 if (!session && !(group->flags & WFD_GROUP_FLAG_AUTONOMOUS)) {
788 WDS_LOGE("Unexpected Event. Group should be removed(Owner)");
789 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
793 if (group->pending) {
794 wfd_group_complete(manager, event);
796 WDS_LOGE("Unexpected event. Group already exist");
801 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
802 if (group->role == WFD_DEV_ROLE_GC && session) {
803 #ifdef CTRL_IFACE_DBUS
804 if(session->peer && session->peer->ip_type == WFD_IP_TYPE_OVER_EAPOL)
805 wfd_util_ip_over_eap_assign(session->peer, event->ifname);
806 #else /* CTRL_IFACE_DBUS */
807 wfd_destroy_session(manager);
808 #endif /* CTRL_IFACE_DBUS */
809 wfd_peer_clear_all(manager);
811 if (group->flags & WFD_GROUP_FLAG_AUTONOMOUS) {
812 noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP;
813 wfd_client_send_event(manager, ¬i);
814 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
815 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
819 __WDS_LOG_FUNC_EXIT__;
823 static void __wfd_process_group_destroyed(wfd_manager_s *manager, wfd_oem_event_s *event)
825 __WDS_LOG_FUNC_ENTER__;
827 wifi_direct_client_noti_s noti;
829 if (event == NULL || manager == NULL) {
830 WDS_LOGE("Invalid parameter");
834 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
835 if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
836 noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
837 noti.error = WIFI_DIRECT_ERROR_NONE;
838 } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING && manager->session){
839 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
840 noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
841 unsigned char *peer_addr = wfd_session_get_peer_addr(manager->session);
842 if(peer_addr != NULL)
843 g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
844 } else if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
845 noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP;
846 noti.error = WIFI_DIRECT_ERROR_NONE;
848 WDS_LOGD("Unexpected event(GROUP_DESTROYED). Ignore it");
851 wfd_client_send_event(manager, ¬i);
853 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
854 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
855 wfd_destroy_group(manager, event->ifname);
856 wfd_destroy_session(manager);
857 manager->local->dev_role = WFD_DEV_ROLE_NONE;
859 __WDS_LOG_FUNC_EXIT__;
863 static void __wfd_process_invitation_req(wfd_manager_s *manager, wfd_oem_event_s *event)
865 __WDS_LOG_FUNC_ENTER__;
867 wfd_device_s *peer = NULL;
868 wfd_session_s *session = NULL;
869 wfd_oem_invite_data_s *edata = NULL;
870 wifi_direct_client_noti_s noti;
873 if (event == NULL || manager == NULL) {
874 WDS_LOGE("Invalid parameter");
878 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
880 WDS_LOGD("Invitation from unknown peer. Add new peer");
881 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
883 WDS_LOGE("Failed to add peer for invitation");
887 peer->dev_role = WFD_DEV_ROLE_GO;
889 edata = (wfd_oem_invite_data_s*) event->edata;
890 memcpy(peer->intf_addr, edata->bssid, MACADDR_LEN);
891 wfd_update_peer_time(manager, event->dev_addr);
893 session = wfd_create_session(manager, event->dev_addr,
894 manager->req_wps_mode, SESSION_DIRECTION_INCOMING);
896 WDS_LOGE("Failed to create session");
899 session->type = SESSION_TYPE_INVITE;
900 wfd_session_timer(session, 1);
902 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
904 res = wfd_session_start(session);
906 WDS_LOGE("Failed to start session");
910 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
911 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ;
912 noti.error = WIFI_DIRECT_ERROR_NONE;
913 snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
914 wfd_client_send_event(manager, ¬i);
916 __WDS_LOG_FUNC_EXIT__;
920 static void __wfd_process_invitation_res(wfd_manager_s *manager, wfd_oem_event_s *event)
922 __WDS_LOG_FUNC_ENTER__;
924 __WDS_LOG_FUNC_EXIT__;
928 static void __wfd_process_sta_connected(wfd_manager_s *manager, wfd_oem_event_s *event)
930 __WDS_LOG_FUNC_ENTER__;
932 wfd_session_s *session = NULL;
933 wfd_device_s *peer = NULL;
934 wfd_group_s *group = NULL;
935 wifi_direct_client_noti_s noti;
937 if (event == NULL || manager == NULL) {
938 WDS_LOGE("Invalid parameter");
942 // FIXME: Move this code to plugin
943 if (!memcmp(event->intf_addr, manager->local->intf_addr, MACADDR_LEN)) {
944 WDS_LOGD("Ignore this event");
948 session = (wfd_session_s*) manager->session;
950 WDS_LOGD("Unexpected event. Session is NULL [peer: " MACSECSTR "]",
951 MAC2SECSTR(event->dev_addr));
952 wfd_oem_destroy_group(manager->oem_ops, GROUP_IFNAME);
953 wfd_destroy_group(manager, GROUP_IFNAME);
954 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
955 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
959 peer = wfd_session_get_peer(session);
961 WDS_LOGE("Peer not found");
965 group = (wfd_group_s*) manager->group;
967 group = wfd_create_pending_group(manager, event->intf_addr);
969 WDS_LOGE("Failed to create pending group");
972 manager->group = group;
974 wfd_group_add_member(group, peer->dev_addr);
976 session->state = SESSION_STATE_COMPLETED;
977 #ifndef CTRL_IFACE_DBUS
978 memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
979 #endif /* CTRL_IFACE_DBUS */
980 peer->state = WFD_PEER_STATE_CONNECTED;
982 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
983 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
985 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
986 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
987 noti.error = WIFI_DIRECT_ERROR_NONE;
988 snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
989 wfd_client_send_event(manager, ¬i);
990 #ifdef CTRL_IFACE_DBUS
991 wfd_update_peer(manager, peer);
992 if (event->ip_addr_peer[3]) {
993 peer->ip_type = WFD_IP_TYPE_OVER_EAPOL;
994 memcpy(peer->client_ip_addr, event->ip_addr_peer, IPADDR_LEN);
995 WDS_LOGE("Peer's client IP [" IPSTR "]", IP2STR((char*) &peer->client_ip_addr));
996 memcpy(peer->go_ip_addr, manager->local->ip_addr, IPADDR_LEN);
997 WDS_LOGE("Peer's GO IP [" IPSTR "]", IP2STR((char*) &peer->go_ip_addr));
999 if(peer->ip_type == WFD_IP_TYPE_OVER_EAPOL)
1000 wfd_util_ip_over_eap_lease(peer);
1002 #endif /* CTRL_IFACE_DBUS */
1003 wfd_util_dhcps_wait_ip_leased(peer);
1004 wfd_destroy_session(manager);
1006 __WDS_LOG_FUNC_EXIT__;
1010 static void __wfd_process_sta_disconnected(wfd_manager_s *manager, wfd_oem_event_s *event)
1012 __WDS_LOG_FUNC_ENTER__;
1014 wfd_group_s *group = NULL;
1015 wfd_device_s *peer = NULL;
1016 wifi_direct_client_noti_s noti;
1017 unsigned char peer_addr[MACADDR_LEN] = {0, };
1019 if (event == NULL || manager == NULL) {
1020 WDS_LOGE("Invalid parameter");
1024 group = (wfd_group_s*) manager->group;
1026 WDS_LOGE("Group not found");
1030 #ifdef CTRL_IFACE_DBUS
1031 peer = wfd_group_find_member_by_addr(group, event->dev_addr);
1032 #else /* CTRL_IFACE_DBUS */
1033 peer = wfd_group_find_member_by_addr(group, event->intf_addr);
1034 #endif /* DBUS_IFACE */
1036 WDS_LOGE("Failed to find connected peer");
1037 peer = wfd_session_get_peer(manager->session);
1039 WDS_LOGE("Failed to find connecting peer");
1043 memcpy(peer_addr, peer->dev_addr, MACADDR_LEN);
1044 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
1046 /* If state is not DISCONNECTING, connection is finished by peer */
1047 if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
1048 wfd_group_remove_member(group, peer_addr);
1049 if (group->member_count)
1050 noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;
1052 noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND;
1053 noti.error = WIFI_DIRECT_ERROR_NONE;
1054 g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1055 /* If there is no member, GO should be destroyed */
1057 /* If GO is Auto GO, then it should not be removed when no member left */
1058 if (!group->member_count && (wfd_group_is_autonomous(group) == FALSE)) {
1059 #else /* TIZEN_TV */
1060 if (!group->member_count) {
1061 #endif /* TIZEN_TV */
1062 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1063 wfd_destroy_group(manager, group->ifname);
1065 } else if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
1066 noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
1067 noti.error = WIFI_DIRECT_ERROR_NONE;
1068 g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1069 } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING &&
1070 /* Some devices(GO) send disconnection message before connection completed.
1071 * This message should be ignored when device is not GO */
1072 manager->local->dev_role == WFD_DEV_ROLE_GO) {
1073 if (WFD_PEER_STATE_CONNECTED == peer->state) {
1074 WDS_LOGD("Peer is already Connected !!!");
1075 noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;
1076 noti.error = WIFI_DIRECT_ERROR_NONE;
1077 } else if (WFD_PEER_STATE_CONNECTING == peer->state) {
1078 WDS_LOGD("Peer is Connecting...");
1079 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
1080 noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
1082 WDS_LOGE("Unexpected Peer State. Ignore it");
1085 g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1087 WDS_LOGE("Unexpected event. Ignore it");
1090 wfd_client_send_event(manager, ¬i);
1092 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1093 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1094 wfd_destroy_session(manager);
1096 __WDS_LOG_FUNC_EXIT__;
1100 static void __wfd_process_connected(wfd_manager_s *manager, wfd_oem_event_s *event)
1102 __WDS_LOG_FUNC_ENTER__;
1104 wfd_session_s *session = NULL;
1105 wfd_device_s *peer = NULL;
1106 wfd_group_s *group = NULL;
1108 if (event == NULL || manager == NULL) {
1109 WDS_LOGE("Invalid parameter");
1113 // FIXME: Move this code to plugin
1114 if (!memcmp(event->intf_addr, manager->local->intf_addr, MACADDR_LEN)) {
1115 WDS_LOGD("Ignore this event");
1119 session = (wfd_session_s*) manager->session;
1121 WDS_LOGD("Unexpected event. Session is NULL [peer: " MACSECSTR "]",
1122 MAC2SECSTR(event->dev_addr));
1123 wfd_oem_destroy_group(manager->oem_ops, GROUP_IFNAME);
1124 wfd_destroy_group(manager, GROUP_IFNAME);
1125 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1126 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1130 peer = wfd_session_get_peer(session);
1132 WDS_LOGE("Peer not found");
1136 group = (wfd_group_s*) manager->group;
1138 group = wfd_create_pending_group(manager, event->intf_addr);
1140 WDS_LOGE("Failed to create pending group");
1143 manager->group = group;
1145 wfd_group_add_member(group, peer->dev_addr);
1147 session->state = SESSION_STATE_COMPLETED;
1148 #ifndef CTRL_IFACE_DBUS
1149 memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
1150 #endif /* CTRL_IFACE_DBUS */
1151 peer->state = WFD_PEER_STATE_CONNECTED;
1153 __WDS_LOG_FUNC_EXIT__;
1157 static void __wfd_process_disconnected(wfd_manager_s *manager, wfd_oem_event_s *event)
1159 __WDS_LOG_FUNC_ENTER__;
1161 wfd_group_s *group = NULL;
1162 wfd_device_s *peer = NULL;
1163 wifi_direct_client_noti_s noti;
1164 unsigned char peer_addr[MACADDR_LEN] = {0, };
1166 if (event == NULL || manager == NULL) {
1167 WDS_LOGE("Invalid parameter");
1171 group = (wfd_group_s*) manager->group;
1173 WDS_LOGE("Group not found");
1177 #ifdef CTRL_IFACE_DBUS
1178 peer = wfd_group_find_member_by_addr(group, event->dev_addr);
1179 #else /* CTRL_IFACE_DBUS */
1180 peer = wfd_group_find_member_by_addr(group, event->intf_addr);
1181 #endif /* DBUS_IFACE */
1183 WDS_LOGE("Failed to find connected peer");
1184 peer = wfd_session_get_peer(manager->session);
1186 WDS_LOGE("Failed to find connecting peer");
1190 memcpy(peer_addr, peer->dev_addr, MACADDR_LEN);
1191 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
1193 /* If state is not DISCONNECTING, connection is finished by peer */
1194 if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
1195 wfd_group_remove_member(group, peer_addr);
1196 if (group->member_count)
1197 noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;
1199 noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND;
1200 noti.error = WIFI_DIRECT_ERROR_NONE;
1201 g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1202 /* If there is no member, GO should be destroyed */
1204 /* If GO is Auto GO, then it should not be removed when no member left */
1205 if (!group->member_count && (wfd_group_is_autonomous(group) == FALSE)) {
1206 #else /* TIZEN_TV */
1207 if (!group->member_count) {
1208 #endif /* TIZEN_TV */
1209 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1210 wfd_destroy_group(manager, group->ifname);
1212 } else if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
1213 noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
1214 noti.error = WIFI_DIRECT_ERROR_NONE;
1215 g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1216 } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING &&
1217 /* Some devices(GO) send disconnection message before connection completed.
1218 * This message should be ignored when device is not GO */
1219 manager->local->dev_role == WFD_DEV_ROLE_GO) {
1220 if (WFD_PEER_STATE_CONNECTED == peer->state) {
1221 WDS_LOGD("Peer is already Connected !!!");
1222 noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;
1223 noti.error = WIFI_DIRECT_ERROR_NONE;
1224 } else if (WFD_PEER_STATE_CONNECTING == peer->state) {
1225 WDS_LOGD("Peer is Connecting...");
1226 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
1227 noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
1229 WDS_LOGE("Unexpected Peer State. Ignore it");
1232 g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1234 WDS_LOGE("Unexpected event. Ignore it");
1237 wfd_client_send_event(manager, ¬i);
1239 wfd_destroy_group(manager, GROUP_IFNAME);
1240 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1241 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1242 wfd_destroy_session(manager);
1244 __WDS_LOG_FUNC_EXIT__;
1248 static void __wfd_process_terminating(wfd_manager_s *manager, wfd_oem_event_s *event)
1250 __WDS_LOG_FUNC_ENTER__;
1252 __WDS_LOG_FUNC_EXIT__;
1255 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1256 static void __wfd_process_serv_disc_resp(wfd_manager_s *manager, wfd_oem_event_s *event)
1258 __WDS_LOG_FUNC_ENTER__;
1260 wifi_direct_client_noti_s noti;
1262 if (event == NULL || manager == NULL) {
1263 WDS_LOGE("Invalid parameter");
1267 wfd_update_peer_time(manager, event->dev_addr);
1269 if (event->edata_type == WFD_OEM_EDATA_TYPE_NEW_SERVICE) {
1270 wfd_oem_new_service_s *service = NULL;;
1272 GList *services = (GList*) event->edata;
1275 WDS_LOGD("%d service data found", event->dev_role);
1277 temp = g_list_first(services);
1278 while(temp && count < event->dev_role) {
1279 service = (wfd_oem_new_service_s*) temp->data;
1280 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
1281 noti.event = WIFI_DIRECT_CLI_EVENT_SERVICE_DISCOVERY_FOUND;
1282 noti.type = service->protocol;
1283 if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
1284 g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1285 g_snprintf(noti.param2, 256, "%s|%s", service->data.bonjour.query, service->data.bonjour.rdata);
1286 WDS_LOGD("Found service: [%d: %s] - [" MACSECSTR "]", service->protocol,
1287 service->data.bonjour.query, MAC2SECSTR(event->dev_addr));
1288 } else if (service->protocol == WFD_OEM_SERVICE_TYPE_BT_ADDR) {
1289 g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1290 g_snprintf(noti.param2, MACSTR_LEN, "%s", service->data.vendor.data2);
1291 WDS_LOGD("Found service: [%d: %s] - [" MACSECSTR "]", service->protocol,
1292 service->data.vendor.data2, MAC2SECSTR(event->dev_addr));
1294 WDS_LOGD("Found service is not supported");
1297 wfd_client_send_event(manager, ¬i);
1299 temp = g_list_next(temp);
1303 } else if (event->edata_type == WFD_OEM_EDATA_TYPE_SERVICE) {
1304 wfd_oem_service_data_s *edata = (wfd_oem_service_data_s*) event->edata;
1306 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
1307 noti.event = WIFI_DIRECT_CLI_EVENT_SERVICE_DISCOVERY_FOUND;
1311 noti.type = edata->type;
1312 g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1313 switch(edata->type) {
1314 case WFD_OEM_SERVICE_TYPE_BT_ADDR:
1315 g_snprintf(noti.param2, MACSTR_LEN, MACSTR, MAC2STR(edata->data));
1317 case WFD_OEM_SERVICE_TYPE_CONTACT_INFO:
1318 g_snprintf(noti.param2, MACSTR_LEN, "%s", edata->value);
1321 WDS_LOGE("Unknown type [type ID: %d]", edata->type);
1324 wfd_client_send_event(manager, ¬i);
1327 __WDS_LOG_FUNC_EXIT__;
1331 static void __wfd_process_serv_disc_started(wfd_manager_s *manager, wfd_oem_event_s *event)
1333 __WDS_LOG_FUNC_ENTER__;
1335 __WDS_LOG_FUNC_EXIT__;
1338 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1342 void (*function) (wfd_manager_s *manager, wfd_oem_event_s *event);
1343 } wfd_oem_event_map[] = {
1345 WFD_OEM_EVENT_DEACTIVATED,
1346 __wfd_process_deactivated
1349 WFD_OEM_EVENT_PEER_FOUND,
1350 __wfd_process_peer_found
1353 WFD_OEM_EVENT_PEER_DISAPPEARED,
1354 __wfd_process_peer_disappeared
1357 WFD_OEM_EVENT_DISCOVERY_FINISHED,
1358 __wfd_process_discovery_finished
1361 WFD_OEM_EVENT_PROV_DISC_REQ,
1362 __wfd_process_prov_disc_req
1365 WFD_OEM_EVENT_PROV_DISC_RESP,
1366 __wfd_process_prov_disc_resp
1369 WFD_OEM_EVENT_PROV_DISC_FAIL,
1370 __wfd_process_prov_disc_fail
1373 WFD_OEM_EVENT_GO_NEG_REQ,
1374 __wfd_process_go_neg_req
1377 WFD_OEM_EVENT_GO_NEG_FAIL,
1378 __wfd_process_go_neg_fail
1381 WFD_OEM_EVENT_GO_NEG_DONE,
1382 __wfd_process_go_neg_done
1385 WFD_OEM_EVENT_WPS_FAIL,
1386 __wfd_process_wps_fail
1389 WFD_OEM_EVENT_WPS_DONE,
1390 __wfd_process_wps_done
1393 WFD_OEM_EVENT_KEY_NEG_FAIL,
1394 __wfd_process_key_neg_fail
1397 WFD_OEM_EVENT_KEY_NEG_DONE,
1398 __wfd_process_key_neg_done
1401 WFD_OEM_EVENT_CONN_FAIL,
1402 __wfd_process_conn_fail
1405 WFD_OEM_EVENT_CONN_DONE,
1406 __wfd_process_conn_done
1409 WFD_OEM_EVENT_GROUP_CREATED,
1410 __wfd_process_group_created
1413 WFD_OEM_EVENT_GROUP_DESTROYED,
1414 __wfd_process_group_destroyed
1417 WFD_OEM_EVENT_INVITATION_REQ,
1418 __wfd_process_invitation_req
1421 WFD_OEM_EVENT_INVITATION_RES,
1422 __wfd_process_invitation_res
1425 WFD_OEM_EVENT_STA_CONNECTED,
1426 __wfd_process_sta_connected
1429 WFD_OEM_EVENT_STA_DISCONNECTED,
1430 __wfd_process_sta_disconnected
1433 WFD_OEM_EVENT_CONNECTED,
1434 __wfd_process_connected
1437 WFD_OEM_EVENT_DISCONNECTED,
1438 __wfd_process_disconnected
1441 WFD_OEM_EVENT_TERMINATING,
1442 __wfd_process_terminating
1444 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1446 WFD_OEM_EVENT_SERV_DISC_RESP,
1447 __wfd_process_serv_disc_resp
1450 WFD_OEM_EVENT_SERV_DISC_STARTED,
1451 __wfd_process_serv_disc_started
1453 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1460 int wfd_process_event(void *user_data, void *data)
1462 __WDS_LOG_FUNC_ENTER__;
1463 wfd_manager_s *manager = NULL;
1464 wfd_oem_event_s *event = NULL;
1467 if (!user_data || !data) {
1468 WDS_LOGE("Invalid parameter");
1472 manager = (wfd_manager_s*) user_data;
1473 event = (wfd_oem_event_s*) data;
1474 WDS_LOGD("Event[%d] from " MACSECSTR, event->event_id,
1475 MAC2SECSTR(event->dev_addr));
1476 for(i = 0; wfd_oem_event_map[i].function != NULL; i++) {
1477 if(event->event_id == wfd_oem_event_map[i].event_id)
1478 wfd_oem_event_map[i].function(manager, event);
1481 __WDS_LOG_FUNC_EXIT__;