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");
59 __WDS_LOG_FUNC_EXIT__;
63 peer = wfd_peer_find_by_dev_addr(manager, data->p2p_dev_addr);
65 peer = wfd_add_peer(manager, data->p2p_dev_addr, data->name);
67 WDS_LOGE("Failed to add peer");
68 __WDS_LOG_FUNC_EXIT__;
72 if (strcmp(peer->dev_name, data->name)) {
73 g_strlcpy(peer->dev_name, data->name, DEV_NAME_LEN + 1);
74 WDS_LOGD("Device name is changed [" MACSECSTR ": %s]",
75 MAC2SECSTR(peer->dev_addr), peer->dev_name);
78 #ifndef CTRL_IFACE_DBUS
79 memcpy(peer->intf_addr, data->p2p_intf_addr, MACADDR_LEN);
80 #endif /* CTRL_IFACE_DBUS */
81 peer->pri_dev_type = data->pri_dev_type;
82 peer->sec_dev_type = data->sec_dev_type;
83 peer->config_methods = data->config_methods;
84 peer->dev_flags = data->dev_flags;
85 peer->group_flags = data->group_flags;
86 peer->dev_role = data->dev_role;
87 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
88 memcpy(&(peer->display), &(data->display), sizeof(wfd_display_s));
89 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
91 #if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
92 wfd_util_get_current_time(&peer->time);
95 gettimeofday(&tval, NULL);
96 peer->time = tval.tv_sec;
98 WDS_LOGI("Update time [%s - %ld]", peer->dev_name, peer->time);
100 __WDS_LOG_FUNC_EXIT__;
104 gboolean _wfd_connection_retry(gpointer *data)
106 wfd_session_s *session = (wfd_session_s*) data;
108 WDS_LOGE("Session is NULL");
109 __WDS_LOG_FUNC_EXIT__;
110 return G_SOURCE_REMOVE;
113 switch (session->state) {
114 case SESSION_STATE_STARTED:
115 WDS_LOGD("PD again");
116 wfd_session_start(session);
118 case SESSION_STATE_GO_NEG:
119 WDS_LOGD("Negotiation again");
120 wfd_session_connect(session);
122 case SESSION_STATE_WPS:
123 WDS_LOGD("WPS again");
124 wfd_session_wps(session);
127 WDS_LOGE("Invalid session state [%d]", session->state);
130 __WDS_LOG_FUNC_EXIT__;
131 return G_SOURCE_REMOVE;
134 static void __wfd_process_deactivated(wfd_manager_s *manager, wfd_oem_event_s *event)
136 __WDS_LOG_FUNC_ENTER__;
138 wifi_direct_client_noti_s noti;
140 if (event == NULL || manager == NULL) {
141 WDS_LOGE("Invalid parameter");
142 __WDS_LOG_FUNC_EXIT__;
146 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
147 noti.event = WIFI_DIRECT_CLI_EVENT_DEACTIVATION;
148 noti.error = WIFI_DIRECT_ERROR_NONE;
149 wfd_client_send_event(manager, ¬i);
151 wfd_destroy_group(manager, GROUP_IFNAME);
152 wfd_destroy_session(manager);
153 wfd_peer_clear_all(manager);
154 wfd_local_reset_data(manager);
156 wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATED);
157 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATED);
158 manager->req_wps_mode = WFD_WPS_MODE_PBC;
160 #ifdef TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT
161 wfd_util_stop_wifi_direct_popup();
162 #endif /* TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT */
163 __WDS_LOG_FUNC_EXIT__;
167 static void __wfd_process_peer_found(wfd_manager_s *manager, wfd_oem_event_s *event)
169 __WDS_LOG_FUNC_ENTER__;
171 wfd_oem_dev_data_s *edata = NULL;
172 wifi_direct_client_noti_s noti;
175 if (event == NULL || manager == NULL) {
176 WDS_LOGE("Invalid parameter");
177 __WDS_LOG_FUNC_EXIT__;
181 edata = (wfd_oem_dev_data_s*) event->edata;
182 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
183 WDS_LOGE("Invalid event data");
184 __WDS_LOG_FUNC_EXIT__;
188 res = _wfd_event_update_peer(manager, edata);
190 WDS_LOGE("Failed to update peer data");
191 __WDS_LOG_FUNC_EXIT__;
195 if (manager->state > WIFI_DIRECT_STATE_ACTIVATING &&
196 manager->state != WIFI_DIRECT_STATE_CONNECTING &&
197 manager->state != WIFI_DIRECT_STATE_DISCONNECTING) {
198 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
199 snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(edata->p2p_dev_addr));
200 noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS;
201 noti.error = WIFI_DIRECT_ERROR_NONE;
202 wfd_client_send_event(manager, ¬i);
205 __WDS_LOG_FUNC_EXIT__;
209 static void __wfd_process_peer_disappeared(wfd_manager_s *manager, wfd_oem_event_s *event)
211 __WDS_LOG_FUNC_ENTER__;
213 wifi_direct_client_noti_s noti;
214 wfd_session_s *session = NULL;
215 wfd_device_s *peer = NULL;
217 if (event == NULL || manager == NULL) {
218 WDS_LOGE("Invalid parameter");
219 __WDS_LOG_FUNC_EXIT__;
223 session = manager->session;
224 if(session != NULL && session->peer != NULL) {
225 peer = session->peer;
226 WDS_LOGD("session peer [" MACSTR "] lost peer [" MACSTR "]", MAC2STR(peer->dev_addr),
227 MAC2STR(event->dev_addr));
228 if(memcmp(peer->dev_addr, event->dev_addr, MACADDR_LEN) == 0) {
229 WDS_LOGD("peer already in connection");
234 wfd_remove_peer(manager, event->dev_addr);
236 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
237 snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
238 noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_LOST_PEERS;
239 noti.error = WIFI_DIRECT_ERROR_NONE;
240 wfd_client_send_event(manager, ¬i);
242 __WDS_LOG_FUNC_EXIT__;
246 static void __wfd_process_discovery_finished(wfd_manager_s *manager, wfd_oem_event_s *event)
248 __WDS_LOG_FUNC_ENTER__;
250 wifi_direct_client_noti_s noti;
252 if (event == NULL || manager == NULL) {
253 WDS_LOGE("Invalid parameter");
254 __WDS_LOG_FUNC_EXIT__;
258 if (manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
259 manager->state != WIFI_DIRECT_STATE_ACTIVATED) {
260 WDS_LOGE("Notify finding stopped when discovering or activated. [%d]", manager->state);
261 __WDS_LOG_FUNC_EXIT__;
265 if (manager->scan_mode == WFD_SCAN_MODE_PASSIVE) {
266 WDS_LOGE("During passive scan, Discover Finished event will not notified");
267 __WDS_LOG_FUNC_EXIT__;
271 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
272 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
273 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
275 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
276 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
278 manager->scan_mode = WFD_SCAN_MODE_NONE;
280 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
281 noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;
282 noti.error = WIFI_DIRECT_ERROR_NONE;
283 wfd_client_send_event(manager, ¬i);
285 __WDS_LOG_FUNC_EXIT__;
289 static void __wfd_process_prov_disc_req(wfd_manager_s *manager, wfd_oem_event_s *event)
291 __WDS_LOG_FUNC_ENTER__;
293 wfd_device_s *peer = NULL;
296 if (event == NULL || manager == NULL) {
297 WDS_LOGE("Invalid parameter");
298 __WDS_LOG_FUNC_EXIT__;
302 wfd_group_s *group = (wfd_group_s*) manager->group;
303 if (group && group->role == WFD_DEV_ROLE_GC &&
304 event->event_id == WFD_OEM_EVENT_PROV_DISC_REQ) {
305 WDS_LOGD("Device has GC role - ignore this provision request");
306 __WDS_LOG_FUNC_EXIT__;
310 #ifdef CTRL_IFACE_DBUS
311 wfd_oem_dev_data_s *edata = NULL;
313 edata = (wfd_oem_dev_data_s*) event->edata;
314 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
315 WDS_LOGE("Invalid event data");
316 __WDS_LOG_FUNC_EXIT__;
320 res = _wfd_event_update_peer(manager, edata);
321 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
323 peer->state = WFD_PEER_STATE_CONNECTING;
324 #else /* CTRL_IFACE_DBUS */
325 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
327 WDS_LOGD("Prov_disc from unknown peer. Add new peer");
328 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
330 WDS_LOGE("Failed to add peer for invitation");
331 __WDS_LOG_FUNC_EXIT__;
334 peer->state = WFD_PEER_STATE_CONNECTING;
335 wfd_update_peer(manager, peer);
337 wfd_update_peer_time(manager, event->dev_addr);
338 #endif /* CTRL_IFACE_DBUS */
340 res = wfd_session_process_event(manager, event);
342 WDS_LOGE("Failed to process event of session");
344 __WDS_LOG_FUNC_EXIT__;
348 static void __wfd_process_prov_disc_resp(wfd_manager_s *manager, wfd_oem_event_s *event)
350 __WDS_LOG_FUNC_ENTER__;
352 wfd_device_s *peer = NULL;
355 if (event == NULL || manager == NULL) {
356 WDS_LOGE("Invalid parameter");
357 __WDS_LOG_FUNC_EXIT__;
361 #ifdef CTRL_IFACE_DBUS
362 wfd_oem_dev_data_s *edata = NULL;
364 edata = (wfd_oem_dev_data_s*) event->edata;
365 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
366 WDS_LOGE("Invalid event data");
367 __WDS_LOG_FUNC_EXIT__;
371 res = _wfd_event_update_peer(manager, edata);
372 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
374 peer->state = WFD_PEER_STATE_CONNECTING;
375 #else /* CTRL_IFACE_DBUS */
376 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
378 WDS_LOGD("Prov_disc from unknown peer. Add new peer");
379 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
381 WDS_LOGE("Failed to add peer for invitation");
382 __WDS_LOG_FUNC_EXIT__;
385 peer->state = WFD_PEER_STATE_CONNECTING;
386 wfd_update_peer(manager, peer);
388 wfd_update_peer_time(manager, event->dev_addr);
389 #endif /* CTRL_IFACE_DBUS */
391 res = wfd_session_process_event(manager, event);
393 WDS_LOGE("Failed to process event of session");
395 __WDS_LOG_FUNC_EXIT__;
399 static void __wfd_process_prov_disc_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
401 __WDS_LOG_FUNC_ENTER__;
403 wfd_session_s *session = NULL;
404 wifi_direct_client_noti_s noti;
405 unsigned char *peer_addr = NULL;
407 if (event == NULL || manager == NULL) {
408 WDS_LOGE("Invalid parameter");
409 __WDS_LOG_FUNC_EXIT__;
413 session = (wfd_session_s*) manager->session;
415 WDS_LOGE("Unexpected event. Session not exist");
416 __WDS_LOG_FUNC_EXIT__;
420 peer_addr = wfd_session_get_peer_addr(session);
422 WDS_LOGE("Session do not have peer");
423 __WDS_LOG_FUNC_EXIT__;
427 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
428 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
429 noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
430 snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
431 wfd_client_send_event(manager, ¬i);
433 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
434 wfd_group_s *group = (wfd_group_s*) manager->group;
435 if (group && !group->member_count && (wfd_group_is_autonomous(group) == FALSE)) {
436 wfd_destroy_group(manager, GROUP_IFNAME);
438 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
439 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
441 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
442 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
445 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
446 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
449 wfd_destroy_session(manager);
451 wfd_oem_refresh(manager->oem_ops);
453 /* After connection failed, scan again */
454 wfd_oem_scan_param_s param;
455 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
456 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
458 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
459 wfd_oem_start_scan(manager->oem_ops, ¶m);
460 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
462 __WDS_LOG_FUNC_EXIT__;
466 static void __wfd_process_go_neg_req(wfd_manager_s *manager, wfd_oem_event_s *event)
468 __WDS_LOG_FUNC_ENTER__;
470 wfd_session_s *session = NULL;
471 wifi_direct_client_noti_s noti;
473 if (event == NULL || manager == NULL) {
474 WDS_LOGE("Invalid parameter");
475 __WDS_LOG_FUNC_EXIT__;
479 wfd_group_s *group = (wfd_group_s*) manager->group;
480 if (group && group->role == WFD_DEV_ROLE_GC) {
481 WDS_LOGD("Device has GC role - ignore this go neg request");
482 __WDS_LOG_FUNC_EXIT__;
486 #ifdef CTRL_IFACE_DBUS
487 wfd_oem_dev_data_s *edata = NULL;
490 edata = (wfd_oem_dev_data_s*) event->edata;
491 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
492 WDS_LOGE("Invalid event data");
493 __WDS_LOG_FUNC_EXIT__;
497 res = _wfd_event_update_peer(manager, edata);
499 WDS_LOGE("Failed to update peer data");
500 __WDS_LOG_FUNC_EXIT__;
503 #else /* CTRL_IFACE_DBUS */
504 wfd_oem_conn_data_s *edata = NULL;
505 wfd_device_s *peer = NULL;
507 edata = (wfd_oem_conn_data_s*) event->edata;
508 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_CONN) {
509 WDS_LOGE("Invalid connection event data");
510 __WDS_LOG_FUNC_EXIT__;
514 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
516 WDS_LOGD("Invitation from unknown peer. Add new peer");
517 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
519 WDS_LOGE("Failed to add peer for invitation");
520 __WDS_LOG_FUNC_EXIT__;
525 if (edata->wps_mode == 0)
527 #endif /* CTRL_IFACE_DBUS */
529 session = (wfd_session_s*) manager->session;
531 session = wfd_create_session(manager, event->dev_addr,
532 #ifdef CTRL_IFACE_DBUS
533 event->wps_mode, SESSION_DIRECTION_INCOMING);
534 #else /* CTRL_IFACE_DBUS */
535 edata->wps_mode, SESSION_DIRECTION_INCOMING);
536 #endif /* CTRL_IFACE_DBUS */
538 WDS_LOGE("Failed to create session");
539 __WDS_LOG_FUNC_EXIT__;
542 session->type = SESSION_TYPE_NORMAL;
543 session->state = SESSION_STATE_GO_NEG;
544 wfd_session_timer(session, 1);
545 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
547 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
548 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ;
549 noti.error = WIFI_DIRECT_ERROR_NONE;
550 g_snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
551 wfd_client_send_event(manager, ¬i);
553 wfd_session_process_event(manager, event);
555 __WDS_LOG_FUNC_EXIT__;
559 static void __wfd_process_go_neg_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
561 __WDS_LOG_FUNC_ENTER__;
563 wfd_session_s *session = NULL;
564 wfd_oem_conn_data_s *edata = NULL;
565 wifi_direct_client_noti_s noti;
566 unsigned char *peer_addr = NULL;
568 if (event == NULL || manager == NULL) {
569 WDS_LOGE("Invalid parameter");
570 __WDS_LOG_FUNC_EXIT__;
574 session = (wfd_session_s*) manager->session;
576 WDS_LOGE("Unexpected event. Session not exist");
577 __WDS_LOG_FUNC_EXIT__;
581 peer_addr = wfd_session_get_peer_addr(session);
583 WDS_LOGE("Session do not have peer");
584 __WDS_LOG_FUNC_EXIT__;
588 edata = (wfd_oem_conn_data_s*) event->edata;
590 WDS_LOGE("Invalid p2p connection data");
591 __WDS_LOG_FUNC_EXIT__;
595 if (edata->status < 0 && session->connecting_120) {
596 if (session->retry_gsrc) {
597 g_source_remove(session->retry_gsrc);
598 session->retry_gsrc = 0;
600 session->retry_gsrc = g_idle_add((GSourceFunc) _wfd_connection_retry, session);
601 WDS_LOGD("Connection will be retried");
602 __WDS_LOG_FUNC_EXIT__;
606 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
607 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
608 noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
609 snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
610 wfd_client_send_event(manager, ¬i);
612 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
613 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
615 wfd_destroy_group(manager, GROUP_IFNAME);
616 wfd_destroy_session(manager);
617 manager->local->dev_role = WFD_DEV_ROLE_NONE;
618 __WDS_LOG_FUNC_EXIT__;
622 static void __wfd_process_go_neg_done(wfd_manager_s *manager, wfd_oem_event_s *event)
624 __WDS_LOG_FUNC_ENTER__;
626 #ifdef CTRL_IFACE_DBUS
627 wfd_session_s *session = NULL;
628 wfd_oem_conn_data_s *edata = NULL;
629 wfd_device_s *peer = NULL;
631 if (event == NULL || manager == NULL) {
632 WDS_LOGE("Invalid parameter");
633 __WDS_LOG_FUNC_EXIT__;
637 edata = (wfd_oem_conn_data_s*) event->edata;
639 WDS_LOGE("Invalid event data");
640 __WDS_LOG_FUNC_EXIT__;
644 session = (wfd_session_s*) manager->session;
645 if(session && session->peer) {
646 peer = session->peer;
647 memcpy(peer->intf_addr, edata->peer_intf_addr, MACADDR_LEN);
649 manager->local->dev_role = event->dev_role;
650 wfd_session_process_event(manager, event);
651 #endif /* CTRL_IFACE_DBUS */
652 __WDS_LOG_FUNC_EXIT__;
656 static void __wfd_process_wps_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
658 __WDS_LOG_FUNC_ENTER__;
660 wfd_session_s *session = NULL;
661 wifi_direct_client_noti_s noti;
662 unsigned char *peer_addr = NULL;
664 if (event == NULL || manager == NULL) {
665 WDS_LOGE("Invalid parameter");
666 __WDS_LOG_FUNC_EXIT__;
670 session = (wfd_session_s*) manager->session;
672 WDS_LOGE("Unexpected event. Session not exist");
673 __WDS_LOG_FUNC_EXIT__;
677 peer_addr = wfd_session_get_peer_addr(session);
679 WDS_LOGE("Session do not have peer");
680 __WDS_LOG_FUNC_EXIT__;
684 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
685 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
686 noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
687 snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
688 wfd_client_send_event(manager, ¬i);
690 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
691 wfd_group_s *group = (wfd_group_s*) manager->group;
692 if (group && !group->member_count && (wfd_group_is_autonomous(group) == FALSE)) {
693 wfd_destroy_group(manager, GROUP_IFNAME);
695 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
696 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
698 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
699 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
702 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
703 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
706 wfd_destroy_session(manager);
708 wfd_oem_refresh(manager->oem_ops);
710 /* After connection failed, scan again */
711 wfd_oem_scan_param_s param;
712 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
713 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
715 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
716 wfd_oem_start_scan(manager->oem_ops, ¶m);
717 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
719 __WDS_LOG_FUNC_EXIT__;
723 static void __wfd_process_wps_done(wfd_manager_s *manager, wfd_oem_event_s *event)
725 __WDS_LOG_FUNC_ENTER__;
727 wfd_session_process_event(manager, event);
729 __WDS_LOG_FUNC_EXIT__;
733 static void __wfd_process_key_neg_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
735 __WDS_LOG_FUNC_ENTER__;
737 wfd_session_s *session = NULL;
738 wifi_direct_client_noti_s noti;
739 unsigned char *peer_addr = NULL;
741 if (event == NULL || manager == NULL) {
742 WDS_LOGE("Invalid parameter");
743 __WDS_LOG_FUNC_EXIT__;
747 session = (wfd_session_s*) manager->session;
749 WDS_LOGE("Unexpected event. Session not exist");
750 __WDS_LOG_FUNC_EXIT__;
754 peer_addr = wfd_session_get_peer_addr(session);
756 WDS_LOGE("Session do not has peer");
757 __WDS_LOG_FUNC_EXIT__;
761 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
762 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
763 noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
764 snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
765 wfd_client_send_event(manager, ¬i);
767 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
768 wfd_group_s *group = (wfd_group_s*) manager->group;
769 if (group && !group->member_count && (wfd_group_is_autonomous(group) == FALSE)) {
770 wfd_destroy_group(manager, GROUP_IFNAME);
772 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
773 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
775 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
776 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
779 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
780 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
783 wfd_destroy_session(manager);
785 wfd_oem_refresh(manager->oem_ops);
787 /* After connection failed, scan again */
788 wfd_oem_scan_param_s param;
789 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
790 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
792 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
793 wfd_oem_start_scan(manager->oem_ops, ¶m);
794 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
796 __WDS_LOG_FUNC_EXIT__;
800 static void __wfd_process_key_neg_done(wfd_manager_s *manager, wfd_oem_event_s *event)
802 __WDS_LOG_FUNC_ENTER__;
804 __WDS_LOG_FUNC_EXIT__;
808 static void __wfd_process_conn_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
810 __WDS_LOG_FUNC_ENTER__;
812 __WDS_LOG_FUNC_EXIT__;
816 static void __wfd_process_conn_done(wfd_manager_s *manager, wfd_oem_event_s *event)
818 __WDS_LOG_FUNC_ENTER__;
820 __WDS_LOG_FUNC_EXIT__;
824 static void __wfd_process_group_created(wfd_manager_s *manager, wfd_oem_event_s *event)
826 __WDS_LOG_FUNC_ENTER__;
828 wfd_group_s *group = NULL;
829 wfd_session_s *session = NULL;
830 wifi_direct_client_noti_s noti;
832 if (event == NULL || manager == NULL) {
833 WDS_LOGE("Invalid parameter");
834 __WDS_LOG_FUNC_EXIT__;
838 group = (wfd_group_s*) manager->group;
839 session = (wfd_session_s*)manager->session;
840 #ifdef CTRL_IFACE_DBUS
841 if(event->dev_role == WFD_DEV_ROLE_GC && !group) {
843 group = wfd_create_pending_group(manager, event->intf_addr);
845 WDS_LOGE("Failed to create pending group");
846 __WDS_LOG_FUNC_EXIT__;
849 manager->group = group;
851 #endif /* CTRL_IFACE_DBUS */
854 WDS_LOGE("Unexpected Event. Group should be removed(Client)");
855 wfd_oem_destroy_group(manager->oem_ops, event->ifname);
856 __WDS_LOG_FUNC_EXIT__;
860 group = wfd_create_group(manager, event);
862 WDS_LOGE("Failed to create group");
863 __WDS_LOG_FUNC_EXIT__;
867 if (!session && !(group->flags & WFD_GROUP_FLAG_AUTONOMOUS)) {
868 WDS_LOGE("Unexpected Event. Group should be removed(Owner)");
869 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
870 __WDS_LOG_FUNC_EXIT__;
874 if (group->pending) {
875 wfd_group_complete(manager, event);
877 WDS_LOGE("Unexpected event. Group already exist");
878 __WDS_LOG_FUNC_EXIT__;
883 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
884 if (group->role == WFD_DEV_ROLE_GC && session) {
885 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
886 wfd_device_s *peer = session->peer;
888 WDS_LOGE("Unexpected event. Peer doesn't exist");
892 wfd_update_peer(manager, peer);
894 if(peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
896 wfd_util_ip_over_eap_assign(peer, event->ifname);
898 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
899 noti.error = WIFI_DIRECT_ERROR_NONE;
900 snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
901 wfd_client_send_event(manager, ¬i);
903 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
904 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
906 wfd_destroy_session(manager);
908 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
909 wfd_peer_clear_all(manager);
911 if (group->flags & WFD_GROUP_FLAG_AUTONOMOUS) {
912 noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP;
913 wfd_client_send_event(manager, ¬i);
914 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
915 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
918 __WDS_LOG_FUNC_EXIT__;
922 static void __wfd_process_group_destroyed(wfd_manager_s *manager, wfd_oem_event_s *event)
924 __WDS_LOG_FUNC_ENTER__;
926 wifi_direct_client_noti_s noti;
928 if (event == NULL || manager == NULL) {
929 WDS_LOGE("Invalid parameter");
930 __WDS_LOG_FUNC_EXIT__;
934 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
935 if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
936 noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
937 noti.error = WIFI_DIRECT_ERROR_NONE;
938 } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING && manager->session){
939 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
940 noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
941 unsigned char *peer_addr = wfd_session_get_peer_addr(manager->session);
942 if(peer_addr != NULL)
943 g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
944 } else if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
945 if(manager->local->dev_role != WFD_DEV_ROLE_GO)
946 noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
948 noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP;
949 noti.error = WIFI_DIRECT_ERROR_NONE;
951 WDS_LOGD("Unexpected event(GROUP_DESTROYED). Ignore it");
952 __WDS_LOG_FUNC_EXIT__;
955 wfd_client_send_event(manager, ¬i);
957 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
958 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
959 wfd_destroy_group(manager, event->ifname);
960 wfd_destroy_session(manager);
961 manager->local->dev_role = WFD_DEV_ROLE_NONE;
963 __WDS_LOG_FUNC_EXIT__;
967 static void __wfd_process_invitation_req(wfd_manager_s *manager, wfd_oem_event_s *event)
969 __WDS_LOG_FUNC_ENTER__;
971 wfd_device_s *peer = NULL;
972 wfd_session_s *session = NULL;
973 wfd_oem_invite_data_s *edata = NULL;
974 wifi_direct_client_noti_s noti;
977 if (event == NULL || manager == NULL) {
978 WDS_LOGE("Invalid parameter");
979 __WDS_LOG_FUNC_EXIT__;
983 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
985 WDS_LOGD("Invitation from unknown peer. Add new peer");
986 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
988 WDS_LOGE("Failed to add peer for invitation");
989 __WDS_LOG_FUNC_EXIT__;
993 peer->dev_role = WFD_DEV_ROLE_GO;
995 edata = (wfd_oem_invite_data_s*) event->edata;
996 memcpy(peer->intf_addr, edata->bssid, MACADDR_LEN);
997 wfd_update_peer_time(manager, event->dev_addr);
999 session = wfd_create_session(manager, event->dev_addr,
1000 manager->req_wps_mode, SESSION_DIRECTION_INCOMING);
1002 WDS_LOGE("Failed to create session");
1003 __WDS_LOG_FUNC_EXIT__;
1006 session->type = SESSION_TYPE_INVITE;
1007 wfd_session_timer(session, 1);
1009 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
1011 res = wfd_session_start(session);
1013 WDS_LOGE("Failed to start session");
1014 __WDS_LOG_FUNC_EXIT__;
1018 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
1019 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ;
1020 noti.error = WIFI_DIRECT_ERROR_NONE;
1021 snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
1022 wfd_client_send_event(manager, ¬i);
1024 __WDS_LOG_FUNC_EXIT__;
1028 static void __wfd_process_invitation_res(wfd_manager_s *manager, wfd_oem_event_s *event)
1030 __WDS_LOG_FUNC_ENTER__;
1032 __WDS_LOG_FUNC_EXIT__;
1036 static void __wfd_process_sta_connected(wfd_manager_s *manager, wfd_oem_event_s *event)
1038 __WDS_LOG_FUNC_ENTER__;
1040 wfd_session_s *session = NULL;
1041 wfd_device_s *peer = NULL;
1042 wfd_group_s *group = NULL;
1043 wifi_direct_client_noti_s noti;
1045 if (event == NULL || manager == NULL) {
1046 WDS_LOGE("Invalid parameter");
1047 __WDS_LOG_FUNC_EXIT__;
1051 // FIXME: Move this code to plugin
1052 if (!memcmp(event->intf_addr, manager->local->intf_addr, MACADDR_LEN)) {
1053 WDS_LOGD("Ignore this event");
1054 __WDS_LOG_FUNC_EXIT__;
1058 session = (wfd_session_s*) manager->session;
1060 WDS_LOGD("Unexpected event. Session is NULL [peer: " MACSECSTR "]",
1061 MAC2SECSTR(event->dev_addr));
1062 wfd_oem_destroy_group(manager->oem_ops, GROUP_IFNAME);
1063 wfd_destroy_group(manager, GROUP_IFNAME);
1064 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1065 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1066 __WDS_LOG_FUNC_EXIT__;
1070 peer = wfd_session_get_peer(session);
1072 WDS_LOGE("Peer not found");
1073 __WDS_LOG_FUNC_EXIT__;
1077 group = (wfd_group_s*) manager->group;
1079 group = wfd_create_pending_group(manager, event->intf_addr);
1081 WDS_LOGE("Failed to create pending group");
1082 __WDS_LOG_FUNC_EXIT__;
1085 manager->group = group;
1087 wfd_group_add_member(group, peer->dev_addr);
1089 session->state = SESSION_STATE_COMPLETED;
1090 #ifndef CTRL_IFACE_DBUS
1091 memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
1092 #endif /* CTRL_IFACE_DBUS */
1093 peer->state = WFD_PEER_STATE_CONNECTED;
1095 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1096 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1098 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
1099 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
1100 noti.error = WIFI_DIRECT_ERROR_NONE;
1101 snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1102 wfd_client_send_event(manager, ¬i);
1103 #ifdef CTRL_IFACE_DBUS
1104 wfd_update_peer(manager, peer);
1105 #endif /* CTRL_IFACE_DBUS */
1106 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
1107 if (event->ip_addr_peer[3]) {
1108 peer->ip_type = WFD_IP_TYPE_OVER_EAPOL;
1109 memcpy(peer->client_ip_addr, event->ip_addr_peer, IPADDR_LEN);
1110 WDS_LOGE("Peer's client IP [" IPSTR "]", IP2STR((char*) &peer->client_ip_addr));
1111 memcpy(peer->go_ip_addr, manager->local->ip_addr, IPADDR_LEN);
1112 WDS_LOGE("Peer's GO IP [" IPSTR "]", IP2STR((char*) &peer->go_ip_addr));
1114 if(peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
1115 memcpy(peer->ip_addr, peer->client_ip_addr, IPADDR_LEN);
1117 wifi_direct_client_noti_s noti;
1118 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
1119 noti.event = WIFI_DIRECT_CLI_EVENT_IP_LEASED_IND;
1120 noti.error = WIFI_DIRECT_ERROR_NONE;
1121 snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1122 snprintf(noti.param2, IPSTR_LEN, IPSTR, IP2STR(peer->ip_addr));
1123 wfd_client_send_event(manager, ¬i);
1125 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
1126 wfd_util_dhcps_wait_ip_leased(peer);
1127 wfd_destroy_session(manager);
1129 __WDS_LOG_FUNC_EXIT__;
1133 static void __wfd_process_sta_disconnected(wfd_manager_s *manager, wfd_oem_event_s *event)
1135 __WDS_LOG_FUNC_ENTER__;
1137 wfd_group_s *group = NULL;
1138 wfd_device_s *peer = NULL;
1139 wifi_direct_client_noti_s noti;
1140 unsigned char peer_addr[MACADDR_LEN] = {0, };
1142 if (event == NULL || manager == NULL) {
1143 WDS_LOGE("Invalid parameter");
1144 __WDS_LOG_FUNC_EXIT__;
1148 group = (wfd_group_s*) manager->group;
1150 WDS_LOGE("Group not found");
1151 __WDS_LOG_FUNC_EXIT__;
1155 #ifdef CTRL_IFACE_DBUS
1156 peer = wfd_group_find_member_by_addr(group, event->dev_addr);
1157 #else /* CTRL_IFACE_DBUS */
1158 peer = wfd_group_find_member_by_addr(group, event->intf_addr);
1159 #endif /* DBUS_IFACE */
1161 WDS_LOGE("Failed to find connected peer");
1162 peer = wfd_session_get_peer(manager->session);
1164 WDS_LOGE("Failed to find connecting peer");
1165 __WDS_LOG_FUNC_EXIT__;
1169 #ifdef CTRL_IFACE_DBUS
1171 * If no peer connected and
1172 * disconnected event is not for connecting peer
1173 * then event should be ignored.
1174 * This situation can arrise when TV is GO and
1175 * some connected peer sent disassociation.
1177 if (memcmp(peer_addr, event->dev_addr, MACADDR_LEN)) {
1178 WDS_LOGE("Unexpected event, Ignore it...");
1179 __WDS_LOG_FUNC_EXIT__;
1182 #endif /* CTRL_DBUS_IFACE */
1184 memcpy(peer_addr, peer->dev_addr, MACADDR_LEN);
1185 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
1187 /* If state is not DISCONNECTING, connection is finished by peer */
1188 if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
1189 wfd_group_remove_member(group, peer_addr);
1190 if (group->member_count)
1191 noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;
1193 noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND;
1194 noti.error = WIFI_DIRECT_ERROR_NONE;
1195 g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1196 /* If there is no member, GO should be destroyed */
1198 /* If GO is Auto GO, then it should not be removed when no member left */
1199 if (!group->member_count && (wfd_group_is_autonomous(group) == FALSE)) {
1200 #else /* TIZEN_TV */
1201 if (!group->member_count) {
1202 #endif /* TIZEN_TV */
1203 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1204 wfd_destroy_group(manager, group->ifname);
1205 wfd_peer_clear_all(manager);
1207 } else if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
1208 noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
1209 noti.error = WIFI_DIRECT_ERROR_NONE;
1210 g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1211 } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING &&
1212 /* Some devices(GO) send disconnection message before connection completed.
1213 * This message should be ignored when device is not GO */
1214 manager->local->dev_role == WFD_DEV_ROLE_GO) {
1215 if (WFD_PEER_STATE_CONNECTED == peer->state) {
1216 WDS_LOGD("Peer is already Connected !!!");
1217 noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;
1218 noti.error = WIFI_DIRECT_ERROR_NONE;
1219 } else if (WFD_PEER_STATE_CONNECTING == peer->state) {
1220 WDS_LOGD("Peer is Connecting...");
1221 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
1222 noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
1224 WDS_LOGE("Unexpected Peer State. Ignore it");
1225 __WDS_LOG_FUNC_EXIT__;
1228 g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1230 WDS_LOGE("Unexpected event. Ignore it");
1231 __WDS_LOG_FUNC_EXIT__;
1234 wfd_client_send_event(manager, ¬i);
1236 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1237 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1238 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1240 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1241 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1244 wfd_destroy_session(manager);
1246 __WDS_LOG_FUNC_EXIT__;
1250 static void __wfd_process_terminating(wfd_manager_s *manager, wfd_oem_event_s *event)
1252 __WDS_LOG_FUNC_ENTER__;
1254 __WDS_LOG_FUNC_EXIT__;
1258 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1259 static void __wfd_process_serv_disc_resp(wfd_manager_s *manager, wfd_oem_event_s *event)
1261 __WDS_LOG_FUNC_ENTER__;
1263 wifi_direct_client_noti_s noti;
1265 if (event == NULL || manager == NULL) {
1266 WDS_LOGE("Invalid parameter");
1267 __WDS_LOG_FUNC_EXIT__;
1271 wfd_update_peer_time(manager, event->dev_addr);
1273 if (event->edata_type == WFD_OEM_EDATA_TYPE_NEW_SERVICE) {
1274 wfd_oem_new_service_s *service = NULL;;
1276 GList *services = (GList*) event->edata;
1279 WDS_LOGD("%d service data found", event->dev_role);
1281 temp = g_list_first(services);
1282 while(temp && count < event->dev_role) {
1283 service = (wfd_oem_new_service_s*) temp->data;
1284 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
1285 noti.event = WIFI_DIRECT_CLI_EVENT_SERVICE_DISCOVERY_FOUND;
1286 noti.type = service->protocol;
1287 if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
1288 g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1289 g_snprintf(noti.param2, 256, "%s|%s", service->data.bonjour.query, service->data.bonjour.rdata);
1290 WDS_LOGD("Found service: [%d: %s] - [" MACSECSTR "]", service->protocol,
1291 service->data.bonjour.query, MAC2SECSTR(event->dev_addr));
1293 WDS_LOGD("Found service is not supported");
1296 wfd_client_send_event(manager, ¬i);
1298 temp = g_list_next(temp);
1302 } else if (event->edata_type == WFD_OEM_EDATA_TYPE_SERVICE) {
1303 wfd_oem_service_data_s *edata = (wfd_oem_service_data_s*) event->edata;
1305 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
1306 noti.event = WIFI_DIRECT_CLI_EVENT_SERVICE_DISCOVERY_FOUND;
1310 noti.type = edata->type;
1311 g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1312 switch(edata->type) {
1313 WDS_LOGE("Unknown type [type ID: %d]", edata->type);
1316 wfd_client_send_event(manager, ¬i);
1319 __WDS_LOG_FUNC_EXIT__;
1323 static void __wfd_process_serv_disc_started(wfd_manager_s *manager, wfd_oem_event_s *event)
1325 __WDS_LOG_FUNC_ENTER__;
1327 __WDS_LOG_FUNC_EXIT__;
1330 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1334 void (*function) (wfd_manager_s *manager, wfd_oem_event_s *event);
1335 } wfd_oem_event_map[] = {
1341 WFD_OEM_EVENT_DEACTIVATED,
1342 __wfd_process_deactivated
1345 WFD_OEM_EVENT_PEER_FOUND,
1346 __wfd_process_peer_found
1349 WFD_OEM_EVENT_PEER_DISAPPEARED,
1350 __wfd_process_peer_disappeared
1353 WFD_OEM_EVENT_DISCOVERY_FINISHED,
1354 __wfd_process_discovery_finished
1357 WFD_OEM_EVENT_PROV_DISC_REQ,
1358 __wfd_process_prov_disc_req
1361 WFD_OEM_EVENT_PROV_DISC_RESP,
1362 __wfd_process_prov_disc_resp
1365 WFD_OEM_EVENT_PROV_DISC_FAIL,
1366 __wfd_process_prov_disc_fail
1369 WFD_OEM_EVENT_GO_NEG_REQ,
1370 __wfd_process_go_neg_req
1373 WFD_OEM_EVENT_GO_NEG_FAIL,
1374 __wfd_process_go_neg_fail
1377 WFD_OEM_EVENT_GO_NEG_DONE,
1378 __wfd_process_go_neg_done
1381 WFD_OEM_EVENT_WPS_FAIL,
1382 __wfd_process_wps_fail
1385 WFD_OEM_EVENT_WPS_DONE,
1386 __wfd_process_wps_done
1389 WFD_OEM_EVENT_KEY_NEG_FAIL,
1390 __wfd_process_key_neg_fail
1393 WFD_OEM_EVENT_KEY_NEG_DONE,
1394 __wfd_process_key_neg_done
1397 WFD_OEM_EVENT_CONN_FAIL,
1398 __wfd_process_conn_fail
1401 WFD_OEM_EVENT_CONN_DONE,
1402 __wfd_process_conn_done
1405 WFD_OEM_EVENT_GROUP_CREATED,
1406 __wfd_process_group_created
1409 WFD_OEM_EVENT_GROUP_DESTROYED,
1410 __wfd_process_group_destroyed
1413 WFD_OEM_EVENT_INVITATION_REQ,
1414 __wfd_process_invitation_req
1417 WFD_OEM_EVENT_INVITATION_RES,
1418 __wfd_process_invitation_res
1421 WFD_OEM_EVENT_STA_CONNECTED,
1422 __wfd_process_sta_connected
1425 WFD_OEM_EVENT_STA_DISCONNECTED,
1426 __wfd_process_sta_disconnected
1429 WFD_OEM_EVENT_TERMINATING,
1430 __wfd_process_terminating
1432 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1434 WFD_OEM_EVENT_SERV_DISC_RESP,
1435 __wfd_process_serv_disc_resp
1438 WFD_OEM_EVENT_SERV_DISC_STARTED,
1439 __wfd_process_serv_disc_started
1441 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1448 int wfd_process_event(void *user_data, void *data)
1450 __WDS_LOG_FUNC_ENTER__;
1451 wfd_manager_s *manager = NULL;
1452 wfd_oem_event_s *event = NULL;
1454 manager = (wfd_manager_s*) user_data;
1455 event = (wfd_oem_event_s*) data;
1456 if (!manager || !event) {
1457 WDS_LOGE("Invalid parameter");
1458 __WDS_LOG_FUNC_EXIT__;
1462 WDS_LOGD("Event[%d] from " MACSECSTR, event->event_id,
1463 MAC2SECSTR(event->dev_addr));
1465 if(event->event_id > WFD_OEM_EVENT_NONE &&
1466 event->event_id < WFD_OEM_EVENT_MAX)
1467 wfd_oem_event_map[event->event_id].function(manager, event);
1469 WDS_LOGE("Invalid event ID");
1471 __WDS_LOG_FUNC_EXIT__;