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 defined (CTRL_IFACE_DBUS)
946 if(manager->local->dev_role != WFD_DEV_ROLE_GO)
947 noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
950 noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP;
951 noti.error = WIFI_DIRECT_ERROR_NONE;
953 WDS_LOGD("Unexpected event(GROUP_DESTROYED). Ignore it");
954 __WDS_LOG_FUNC_EXIT__;
957 wfd_client_send_event(manager, ¬i);
959 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
960 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
961 wfd_destroy_group(manager, event->ifname);
962 wfd_destroy_session(manager);
963 manager->local->dev_role = WFD_DEV_ROLE_NONE;
965 __WDS_LOG_FUNC_EXIT__;
969 static void __wfd_process_invitation_req(wfd_manager_s *manager, wfd_oem_event_s *event)
971 __WDS_LOG_FUNC_ENTER__;
973 wfd_device_s *peer = NULL;
974 wfd_session_s *session = NULL;
975 wfd_oem_invite_data_s *edata = NULL;
976 wifi_direct_client_noti_s noti;
979 if (event == NULL || manager == NULL) {
980 WDS_LOGE("Invalid parameter");
981 __WDS_LOG_FUNC_EXIT__;
985 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
987 WDS_LOGD("Invitation from unknown peer. Add new peer");
988 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
990 WDS_LOGE("Failed to add peer for invitation");
991 __WDS_LOG_FUNC_EXIT__;
995 peer->dev_role = WFD_DEV_ROLE_GO;
997 edata = (wfd_oem_invite_data_s*) event->edata;
998 memcpy(peer->intf_addr, edata->bssid, MACADDR_LEN);
999 wfd_update_peer_time(manager, event->dev_addr);
1001 session = wfd_create_session(manager, event->dev_addr,
1002 manager->req_wps_mode, SESSION_DIRECTION_INCOMING);
1004 WDS_LOGE("Failed to create session");
1005 __WDS_LOG_FUNC_EXIT__;
1008 session->type = SESSION_TYPE_INVITE;
1009 wfd_session_timer(session, 1);
1011 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
1013 res = wfd_session_start(session);
1015 WDS_LOGE("Failed to start session");
1016 __WDS_LOG_FUNC_EXIT__;
1020 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
1021 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ;
1022 noti.error = WIFI_DIRECT_ERROR_NONE;
1023 snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
1024 wfd_client_send_event(manager, ¬i);
1026 __WDS_LOG_FUNC_EXIT__;
1030 static void __wfd_process_invitation_res(wfd_manager_s *manager, wfd_oem_event_s *event)
1032 __WDS_LOG_FUNC_ENTER__;
1034 __WDS_LOG_FUNC_EXIT__;
1038 static void __wfd_process_sta_connected(wfd_manager_s *manager, wfd_oem_event_s *event)
1040 __WDS_LOG_FUNC_ENTER__;
1042 wfd_session_s *session = NULL;
1043 wfd_device_s *peer = NULL;
1044 wfd_group_s *group = NULL;
1045 wifi_direct_client_noti_s noti;
1047 if (event == NULL || manager == NULL) {
1048 WDS_LOGE("Invalid parameter");
1049 __WDS_LOG_FUNC_EXIT__;
1053 // FIXME: Move this code to plugin
1054 if (!memcmp(event->intf_addr, manager->local->intf_addr, MACADDR_LEN)) {
1055 WDS_LOGD("Ignore this event");
1056 __WDS_LOG_FUNC_EXIT__;
1060 session = (wfd_session_s*) manager->session;
1062 WDS_LOGD("Unexpected event. Session is NULL [peer: " MACSECSTR "]",
1063 MAC2SECSTR(event->dev_addr));
1064 wfd_oem_destroy_group(manager->oem_ops, GROUP_IFNAME);
1065 wfd_destroy_group(manager, GROUP_IFNAME);
1066 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1067 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1068 __WDS_LOG_FUNC_EXIT__;
1072 peer = wfd_session_get_peer(session);
1074 WDS_LOGE("Peer not found");
1075 __WDS_LOG_FUNC_EXIT__;
1079 group = (wfd_group_s*) manager->group;
1081 group = wfd_create_pending_group(manager, event->intf_addr);
1083 WDS_LOGE("Failed to create pending group");
1084 __WDS_LOG_FUNC_EXIT__;
1087 manager->group = group;
1089 wfd_group_add_member(group, peer->dev_addr);
1091 session->state = SESSION_STATE_COMPLETED;
1092 #ifndef CTRL_IFACE_DBUS
1093 memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
1094 #endif /* CTRL_IFACE_DBUS */
1095 peer->state = WFD_PEER_STATE_CONNECTED;
1097 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1098 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1100 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
1101 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
1102 noti.error = WIFI_DIRECT_ERROR_NONE;
1103 snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1104 wfd_client_send_event(manager, ¬i);
1105 #ifdef CTRL_IFACE_DBUS
1106 wfd_update_peer(manager, peer);
1107 #endif /* CTRL_IFACE_DBUS */
1108 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
1109 if (event->ip_addr_peer[3]) {
1110 peer->ip_type = WFD_IP_TYPE_OVER_EAPOL;
1111 memcpy(peer->client_ip_addr, event->ip_addr_peer, IPADDR_LEN);
1112 WDS_LOGE("Peer's client IP [" IPSTR "]", IP2STR((char*) &peer->client_ip_addr));
1113 memcpy(peer->go_ip_addr, manager->local->ip_addr, IPADDR_LEN);
1114 WDS_LOGE("Peer's GO IP [" IPSTR "]", IP2STR((char*) &peer->go_ip_addr));
1116 if(peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
1117 memcpy(peer->ip_addr, peer->client_ip_addr, IPADDR_LEN);
1119 wifi_direct_client_noti_s noti;
1120 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
1121 noti.event = WIFI_DIRECT_CLI_EVENT_IP_LEASED_IND;
1122 noti.error = WIFI_DIRECT_ERROR_NONE;
1123 snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1124 snprintf(noti.param2, IPSTR_LEN, IPSTR, IP2STR(peer->ip_addr));
1125 wfd_client_send_event(manager, ¬i);
1127 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
1128 wfd_util_dhcps_wait_ip_leased(peer);
1129 wfd_destroy_session(manager);
1131 __WDS_LOG_FUNC_EXIT__;
1135 static void __wfd_process_sta_disconnected(wfd_manager_s *manager, wfd_oem_event_s *event)
1137 __WDS_LOG_FUNC_ENTER__;
1139 wfd_group_s *group = NULL;
1140 wfd_device_s *peer = NULL;
1141 wifi_direct_client_noti_s noti;
1142 unsigned char peer_addr[MACADDR_LEN] = {0, };
1144 if (event == NULL || manager == NULL) {
1145 WDS_LOGE("Invalid parameter");
1146 __WDS_LOG_FUNC_EXIT__;
1150 group = (wfd_group_s*) manager->group;
1152 WDS_LOGE("Group not found");
1153 __WDS_LOG_FUNC_EXIT__;
1157 #ifdef CTRL_IFACE_DBUS
1158 peer = wfd_group_find_member_by_addr(group, event->dev_addr);
1159 #else /* CTRL_IFACE_DBUS */
1160 peer = wfd_group_find_member_by_addr(group, event->intf_addr);
1161 #endif /* DBUS_IFACE */
1163 WDS_LOGE("Failed to find connected peer");
1164 peer = wfd_session_get_peer(manager->session);
1166 WDS_LOGE("Failed to find connecting peer");
1167 __WDS_LOG_FUNC_EXIT__;
1171 #ifdef CTRL_IFACE_DBUS
1173 * If no peer connected and
1174 * disconnected event is not for connecting peer
1175 * then event should be ignored.
1176 * This situation can arrise when TV is GO and
1177 * some connected peer sent disassociation.
1179 if (memcmp(peer_addr, event->dev_addr, MACADDR_LEN)) {
1180 WDS_LOGE("Unexpected event, Ignore it...");
1181 __WDS_LOG_FUNC_EXIT__;
1184 #endif /* CTRL_DBUS_IFACE */
1186 memcpy(peer_addr, peer->dev_addr, MACADDR_LEN);
1187 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
1189 /* If state is not DISCONNECTING, connection is finished by peer */
1190 if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
1191 wfd_group_remove_member(group, peer_addr);
1192 if (group->member_count)
1193 noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;
1195 noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND;
1196 noti.error = WIFI_DIRECT_ERROR_NONE;
1197 g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1198 /* If there is no member, GO should be destroyed */
1200 /* If GO is Auto GO, then it should not be removed when no member left */
1201 if (!group->member_count && (wfd_group_is_autonomous(group) == FALSE)) {
1202 #else /* TIZEN_TV */
1203 if (!group->member_count) {
1204 #endif /* TIZEN_TV */
1205 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1206 wfd_destroy_group(manager, group->ifname);
1207 wfd_peer_clear_all(manager);
1209 } else if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
1210 noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
1211 noti.error = WIFI_DIRECT_ERROR_NONE;
1212 g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1213 } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING &&
1214 /* Some devices(GO) send disconnection message before connection completed.
1215 * This message should be ignored when device is not GO */
1216 manager->local->dev_role == WFD_DEV_ROLE_GO) {
1217 if (WFD_PEER_STATE_CONNECTED == peer->state) {
1218 WDS_LOGD("Peer is already Connected !!!");
1219 noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;
1220 noti.error = WIFI_DIRECT_ERROR_NONE;
1221 } else if (WFD_PEER_STATE_CONNECTING == peer->state) {
1222 WDS_LOGD("Peer is Connecting...");
1223 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
1224 noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
1226 WDS_LOGE("Unexpected Peer State. Ignore it");
1227 __WDS_LOG_FUNC_EXIT__;
1230 g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1232 WDS_LOGE("Unexpected event. Ignore it");
1233 __WDS_LOG_FUNC_EXIT__;
1236 wfd_client_send_event(manager, ¬i);
1238 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1239 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1240 wfd_destroy_session(manager);
1242 __WDS_LOG_FUNC_EXIT__;
1246 static void __wfd_process_connected(wfd_manager_s *manager, wfd_oem_event_s *event)
1248 __WDS_LOG_FUNC_ENTER__;
1250 wfd_session_s *session = NULL;
1251 wfd_device_s *peer = NULL;
1252 wfd_group_s *group = NULL;
1254 if (event == NULL || manager == NULL) {
1255 WDS_LOGE("Invalid parameter");
1256 __WDS_LOG_FUNC_EXIT__;
1260 // FIXME: Move this code to plugin
1261 if (!memcmp(event->intf_addr, manager->local->intf_addr, MACADDR_LEN)) {
1262 WDS_LOGD("Ignore this event");
1263 __WDS_LOG_FUNC_EXIT__;
1267 session = (wfd_session_s*) manager->session;
1269 WDS_LOGD("Unexpected event. Session is NULL [peer: " MACSECSTR "]",
1270 MAC2SECSTR(event->dev_addr));
1271 wfd_oem_destroy_group(manager->oem_ops, GROUP_IFNAME);
1272 wfd_destroy_group(manager, GROUP_IFNAME);
1273 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1274 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1275 __WDS_LOG_FUNC_EXIT__;
1279 peer = wfd_session_get_peer(session);
1281 WDS_LOGE("Peer not found");
1282 __WDS_LOG_FUNC_EXIT__;
1286 group = (wfd_group_s*) manager->group;
1288 group = wfd_create_pending_group(manager, event->intf_addr);
1290 WDS_LOGE("Failed to create pending group");
1291 __WDS_LOG_FUNC_EXIT__;
1294 manager->group = group;
1296 wfd_group_add_member(group, peer->dev_addr);
1298 session->state = SESSION_STATE_COMPLETED;
1299 #ifndef CTRL_IFACE_DBUS
1300 memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
1301 #endif /* CTRL_IFACE_DBUS */
1302 peer->state = WFD_PEER_STATE_CONNECTED;
1304 __WDS_LOG_FUNC_EXIT__;
1308 static void __wfd_process_disconnected(wfd_manager_s *manager, wfd_oem_event_s *event)
1310 __WDS_LOG_FUNC_ENTER__;
1312 wfd_group_s *group = NULL;
1313 wfd_device_s *peer = NULL;
1314 wifi_direct_client_noti_s noti;
1315 unsigned char peer_addr[MACADDR_LEN] = {0, };
1317 if (event == NULL || manager == NULL) {
1318 WDS_LOGE("Invalid parameter");
1319 __WDS_LOG_FUNC_EXIT__;
1323 group = (wfd_group_s*) manager->group;
1325 WDS_LOGE("Group not found");
1326 __WDS_LOG_FUNC_EXIT__;
1330 #ifdef CTRL_IFACE_DBUS
1331 peer = wfd_group_find_member_by_addr(group, event->dev_addr);
1332 #else /* CTRL_IFACE_DBUS */
1333 peer = wfd_group_find_member_by_addr(group, event->intf_addr);
1334 #endif /* DBUS_IFACE */
1336 WDS_LOGE("Failed to find connected peer");
1337 peer = wfd_session_get_peer(manager->session);
1339 WDS_LOGE("Failed to find connecting peer");
1340 __WDS_LOG_FUNC_EXIT__;
1344 memcpy(peer_addr, peer->dev_addr, MACADDR_LEN);
1345 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
1347 /* If state is not DISCONNECTING, connection is finished by peer */
1348 if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
1349 wfd_group_remove_member(group, peer_addr);
1350 if (group->member_count)
1351 noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;
1353 noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND;
1354 noti.error = WIFI_DIRECT_ERROR_NONE;
1355 g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1356 /* If there is no member, GO should be destroyed */
1358 /* If GO is Auto GO, then it should not be removed when no member left */
1359 if (!group->member_count && (wfd_group_is_autonomous(group) == FALSE)) {
1360 #else /* TIZEN_TV */
1361 if (!group->member_count) {
1362 #endif /* TIZEN_TV */
1363 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1364 wfd_destroy_group(manager, group->ifname);
1366 } else if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
1367 noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
1368 noti.error = WIFI_DIRECT_ERROR_NONE;
1369 g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1370 } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING &&
1371 /* Some devices(GO) send disconnection message before connection completed.
1372 * This message should be ignored when device is not GO */
1373 manager->local->dev_role == WFD_DEV_ROLE_GO) {
1374 if (WFD_PEER_STATE_CONNECTED == peer->state) {
1375 WDS_LOGD("Peer is already Connected !!!");
1376 noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;
1377 noti.error = WIFI_DIRECT_ERROR_NONE;
1378 } else if (WFD_PEER_STATE_CONNECTING == peer->state) {
1379 WDS_LOGD("Peer is Connecting...");
1380 noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
1381 noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
1383 WDS_LOGE("Unexpected Peer State. Ignore it");
1386 g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1388 WDS_LOGE("Unexpected event. Ignore it");
1389 __WDS_LOG_FUNC_EXIT__;
1392 wfd_client_send_event(manager, ¬i);
1394 wfd_destroy_group(manager, GROUP_IFNAME);
1395 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1396 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1397 wfd_destroy_session(manager);
1399 __WDS_LOG_FUNC_EXIT__;
1403 static void __wfd_process_terminating(wfd_manager_s *manager, wfd_oem_event_s *event)
1405 __WDS_LOG_FUNC_ENTER__;
1407 __WDS_LOG_FUNC_EXIT__;
1411 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1412 static void __wfd_process_serv_disc_resp(wfd_manager_s *manager, wfd_oem_event_s *event)
1414 __WDS_LOG_FUNC_ENTER__;
1416 wifi_direct_client_noti_s noti;
1418 if (event == NULL || manager == NULL) {
1419 WDS_LOGE("Invalid parameter");
1420 __WDS_LOG_FUNC_EXIT__;
1424 wfd_update_peer_time(manager, event->dev_addr);
1426 if (event->edata_type == WFD_OEM_EDATA_TYPE_NEW_SERVICE) {
1427 wfd_oem_new_service_s *service = NULL;;
1429 GList *services = (GList*) event->edata;
1432 WDS_LOGD("%d service data found", event->dev_role);
1434 temp = g_list_first(services);
1435 while(temp && count < event->dev_role) {
1436 service = (wfd_oem_new_service_s*) temp->data;
1437 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
1438 noti.event = WIFI_DIRECT_CLI_EVENT_SERVICE_DISCOVERY_FOUND;
1439 noti.type = service->protocol;
1440 if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
1441 g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1442 g_snprintf(noti.param2, 256, "%s|%s", service->data.bonjour.query, service->data.bonjour.rdata);
1443 WDS_LOGD("Found service: [%d: %s] - [" MACSECSTR "]", service->protocol,
1444 service->data.bonjour.query, MAC2SECSTR(event->dev_addr));
1446 WDS_LOGD("Found service is not supported");
1449 wfd_client_send_event(manager, ¬i);
1451 temp = g_list_next(temp);
1455 } else if (event->edata_type == WFD_OEM_EDATA_TYPE_SERVICE) {
1456 wfd_oem_service_data_s *edata = (wfd_oem_service_data_s*) event->edata;
1458 memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
1459 noti.event = WIFI_DIRECT_CLI_EVENT_SERVICE_DISCOVERY_FOUND;
1463 noti.type = edata->type;
1464 g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1465 switch(edata->type) {
1466 WDS_LOGE("Unknown type [type ID: %d]", edata->type);
1469 wfd_client_send_event(manager, ¬i);
1472 __WDS_LOG_FUNC_EXIT__;
1476 static void __wfd_process_serv_disc_started(wfd_manager_s *manager, wfd_oem_event_s *event)
1478 __WDS_LOG_FUNC_ENTER__;
1480 __WDS_LOG_FUNC_EXIT__;
1483 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1487 void (*function) (wfd_manager_s *manager, wfd_oem_event_s *event);
1488 } wfd_oem_event_map[] = {
1490 WFD_OEM_EVENT_DEACTIVATED,
1491 __wfd_process_deactivated
1494 WFD_OEM_EVENT_PEER_FOUND,
1495 __wfd_process_peer_found
1498 WFD_OEM_EVENT_PEER_DISAPPEARED,
1499 __wfd_process_peer_disappeared
1502 WFD_OEM_EVENT_DISCOVERY_FINISHED,
1503 __wfd_process_discovery_finished
1506 WFD_OEM_EVENT_PROV_DISC_REQ,
1507 __wfd_process_prov_disc_req
1510 WFD_OEM_EVENT_PROV_DISC_RESP,
1511 __wfd_process_prov_disc_resp
1514 WFD_OEM_EVENT_PROV_DISC_FAIL,
1515 __wfd_process_prov_disc_fail
1518 WFD_OEM_EVENT_GO_NEG_REQ,
1519 __wfd_process_go_neg_req
1522 WFD_OEM_EVENT_GO_NEG_FAIL,
1523 __wfd_process_go_neg_fail
1526 WFD_OEM_EVENT_GO_NEG_DONE,
1527 __wfd_process_go_neg_done
1530 WFD_OEM_EVENT_WPS_FAIL,
1531 __wfd_process_wps_fail
1534 WFD_OEM_EVENT_WPS_DONE,
1535 __wfd_process_wps_done
1538 WFD_OEM_EVENT_KEY_NEG_FAIL,
1539 __wfd_process_key_neg_fail
1542 WFD_OEM_EVENT_KEY_NEG_DONE,
1543 __wfd_process_key_neg_done
1546 WFD_OEM_EVENT_CONN_FAIL,
1547 __wfd_process_conn_fail
1550 WFD_OEM_EVENT_CONN_DONE,
1551 __wfd_process_conn_done
1554 WFD_OEM_EVENT_GROUP_CREATED,
1555 __wfd_process_group_created
1558 WFD_OEM_EVENT_GROUP_DESTROYED,
1559 __wfd_process_group_destroyed
1562 WFD_OEM_EVENT_INVITATION_REQ,
1563 __wfd_process_invitation_req
1566 WFD_OEM_EVENT_INVITATION_RES,
1567 __wfd_process_invitation_res
1570 WFD_OEM_EVENT_STA_CONNECTED,
1571 __wfd_process_sta_connected
1574 WFD_OEM_EVENT_STA_DISCONNECTED,
1575 __wfd_process_sta_disconnected
1578 WFD_OEM_EVENT_CONNECTED,
1579 __wfd_process_connected
1582 WFD_OEM_EVENT_DISCONNECTED,
1583 __wfd_process_disconnected
1586 WFD_OEM_EVENT_TERMINATING,
1587 __wfd_process_terminating
1589 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1591 WFD_OEM_EVENT_SERV_DISC_RESP,
1592 __wfd_process_serv_disc_resp
1595 WFD_OEM_EVENT_SERV_DISC_STARTED,
1596 __wfd_process_serv_disc_started
1598 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1605 int wfd_process_event(void *user_data, void *data)
1607 __WDS_LOG_FUNC_ENTER__;
1608 wfd_manager_s *manager = NULL;
1609 wfd_oem_event_s *event = NULL;
1612 if (!user_data || !data) {
1613 WDS_LOGE("Invalid parameter");
1614 __WDS_LOG_FUNC_EXIT__;
1618 manager = (wfd_manager_s*) user_data;
1619 event = (wfd_oem_event_s*) data;
1620 WDS_LOGD("Event[%d] from " MACSECSTR, event->event_id,
1621 MAC2SECSTR(event->dev_addr));
1622 for(i = 0; wfd_oem_event_map[i].function != NULL; i++) {
1623 if(event->event_id == wfd_oem_event_map[i].event_id)
1624 wfd_oem_event_map[i].function(manager, event);
1627 __WDS_LOG_FUNC_EXIT__;