2 * Network Configuration Module
4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
21 * This file implements wifi direct event functions.
23 * @file wifi-direct-event.c
24 * @author Gibyoung Kim (lastkgb.kim@samsung.com)
37 #include <wifi-direct.h>
39 #include "wifi-direct-ipc.h"
40 #include "wifi-direct-manager.h"
41 #include "wifi-direct-oem.h"
42 #include "wifi-direct-peer.h"
43 #include "wifi-direct-group.h"
44 #include "wifi-direct-session.h"
45 #include "wifi-direct-event.h"
46 #include "wifi-direct-state.h"
47 #include "wifi-direct-util.h"
48 #include "wifi-direct-error.h"
49 #include "wifi-direct-log.h"
50 #include "wifi-direct-dbus.h"
51 #if defined(TIZEN_FEATURE_ASP)
52 #include "wifi-direct-asp.h"
53 #endif /* TIZEN_FEATURE_ASP */
55 static int _wfd_event_update_peer(wfd_manager_s *manager, wfd_oem_dev_data_s *data)
57 __WDS_LOG_FUNC_ENTER__;
59 wfd_device_s *peer = NULL;
61 if (!manager || !data) {
62 WDS_LOGE("Invalid parameter");
63 __WDS_LOG_FUNC_EXIT__;
67 peer = wfd_peer_find_by_dev_addr(manager, data->p2p_dev_addr);
69 peer = wfd_add_peer(manager, data->p2p_dev_addr, data->name);
71 WDS_LOGE("Failed to add peer");
72 __WDS_LOG_FUNC_EXIT__;
76 if (strcmp(peer->dev_name, data->name)) {
77 g_strlcpy(peer->dev_name, data->name, DEV_NAME_LEN + 1);
78 WDS_LOGD("Device name is changed [" MACSECSTR ": %s]",
79 MAC2SECSTR(peer->dev_addr), peer->dev_name);
82 #ifndef CTRL_IFACE_DBUS
83 memcpy(peer->intf_addr, data->p2p_intf_addr, MACADDR_LEN);
84 #endif /* CTRL_IFACE_DBUS */
85 peer->pri_dev_type = data->pri_dev_type;
86 peer->sec_dev_type = data->sec_dev_type;
87 peer->config_methods = data->config_methods;
88 peer->dev_flags = data->dev_flags;
89 peer->group_flags = data->group_flags;
90 peer->dev_role = data->dev_role;
91 peer->rssi = data->rssi;
92 WDS_LOGD("Peer RSSI value is %d", peer->rssi);
94 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
95 memcpy(&(peer->display), &(data->display), sizeof(wfd_display_s));
96 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
98 #if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
99 wfd_util_get_current_time(&peer->time);
102 gettimeofday(&tval, NULL);
103 peer->time = tval.tv_sec;
105 WDS_LOGI("Update time [%s - %ld]", peer->dev_name, peer->time);
107 __WDS_LOG_FUNC_EXIT__;
111 gboolean _wfd_connection_retry(gpointer *data)
113 wfd_session_s *session = (wfd_session_s*) data;
115 WDS_LOGE("Session is NULL");
116 __WDS_LOG_FUNC_EXIT__;
117 return G_SOURCE_REMOVE;
120 switch (session->state) {
121 case SESSION_STATE_STARTED:
122 WDS_LOGD("PD again");
123 wfd_session_start(session);
125 case SESSION_STATE_GO_NEG:
126 WDS_LOGD("Negotiation again");
127 wfd_session_connect(session);
129 case SESSION_STATE_WPS:
130 WDS_LOGD("WPS again");
131 wfd_session_wps(session);
134 WDS_LOGE("Invalid session state [%d]", session->state);
137 __WDS_LOG_FUNC_EXIT__;
138 return G_SOURCE_REMOVE;
141 void wfd_event_deactivated(wfd_oem_event_s *event)
143 __WDS_LOG_FUNC_ENTER__;
145 wfd_manager_s *manager = wfd_get_manager();
147 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
149 g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE));
151 wfd_destroy_group(manager);
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 void wfd_event_peer_found(wfd_oem_event_s *event)
169 __WDS_LOG_FUNC_ENTER__;
171 wfd_manager_s *manager = wfd_get_manager();
172 wfd_oem_dev_data_s *edata = NULL;
173 char peer_mac_address[MACSTR_LEN+1] = {0, };
176 edata = (wfd_oem_dev_data_s*) event->edata;
177 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
178 WDS_LOGE("Invalid event data");
179 __WDS_LOG_FUNC_EXIT__;
183 res = _wfd_event_update_peer(manager, edata);
185 WDS_LOGE("Failed to update peer data");
186 __WDS_LOG_FUNC_EXIT__;
190 if (manager->state > WIFI_DIRECT_STATE_ACTIVATING &&
191 manager->state != WIFI_DIRECT_STATE_CONNECTING &&
192 manager->state != WIFI_DIRECT_STATE_DISCONNECTING) {
193 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(edata->p2p_dev_addr));
194 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
196 g_variant_new("(s)", peer_mac_address));
199 #if defined(TIZEN_FEATURE_ASP)
202 GVariantBuilder *builder = NULL;
203 GVariant *params = NULL;
204 wfd_oem_advertise_service_s *service;
206 for (list = (GList *)event->asp_services; list != NULL; list = list->next) {
207 service = (wfd_oem_advertise_service_s *)list->data;
209 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
210 g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("t", service->search_id));
211 g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", peer_mac_address));
212 g_variant_builder_add(builder, "{sv}", "device_name", g_variant_new("s", edata->name));
213 g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
214 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
215 if (service->service_type)
216 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type));
217 params = g_variant_new("(a{sv})", builder);
218 g_variant_builder_unref(builder);
220 wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
225 for (list = (GList *)event->asp2_services; list != NULL; list = list->next) {
226 service = (wfd_oem_advertise_service_s *)list->data;
228 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
229 g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("t", service->search_id));
230 g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", peer_mac_address));
231 g_variant_builder_add(builder, "{sv}", "device_name", g_variant_new("s", edata->name));
232 g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
233 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
234 if (service->service_type)
235 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type));
236 if (service->instance_name)
237 g_variant_builder_add(builder, "{sv}", "instance_name", g_variant_new("s", service->instance_name));
238 params = g_variant_new("(a{sv})", builder);
239 g_variant_builder_unref(builder);
241 wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
246 __WDS_LOG_FUNC_EXIT__;
250 void wfd_event_peer_disappeared(wfd_oem_event_s *event)
252 __WDS_LOG_FUNC_ENTER__;
254 wfd_manager_s *manager = wfd_get_manager();
255 wfd_session_s *session = NULL;
256 wfd_device_s *peer = NULL;
257 char peer_mac_address[MACSTR_LEN+1] = {0, };
259 session = manager->session;
260 if (session != NULL && session->peer != NULL) {
261 peer = session->peer;
262 WDS_LOGD("session peer [" MACSTR "] lost peer [" MACSTR "]", MAC2STR(peer->dev_addr),
263 MAC2STR(event->dev_addr));
264 if (memcmp(peer->dev_addr, event->dev_addr, MACADDR_LEN) == 0) {
265 WDS_LOGD("peer already in connection");
270 wfd_remove_peer(manager, event->dev_addr);
272 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
273 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
275 g_variant_new("(s)", peer_mac_address));
277 __WDS_LOG_FUNC_EXIT__;
281 void wfd_event_discovery_finished(wfd_oem_event_s *event)
283 __WDS_LOG_FUNC_ENTER__;
285 wfd_manager_s *manager = wfd_get_manager();
287 if (manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
288 manager->state != WIFI_DIRECT_STATE_ACTIVATED) {
289 WDS_LOGE("Notify finding stopped when discovering or activated. [%d]", manager->state);
290 __WDS_LOG_FUNC_EXIT__;
294 if (manager->scan_mode == WFD_SCAN_MODE_PASSIVE) {
295 WDS_LOGE("During passive scan, Discover Finished event will not notified");
296 __WDS_LOG_FUNC_EXIT__;
300 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
301 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
302 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
304 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
305 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
307 manager->scan_mode = WFD_SCAN_MODE_NONE;
309 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
313 __WDS_LOG_FUNC_EXIT__;
317 void wfd_event_prov_disc_req(wfd_oem_event_s *event)
319 __WDS_LOG_FUNC_ENTER__;
321 wfd_manager_s *manager = wfd_get_manager();
322 wfd_device_s *peer = NULL;
323 wfd_device_s *member = NULL;
325 wfd_group_s *group = (wfd_group_s*) manager->group;
327 if (group && group->role == WFD_DEV_ROLE_GC) {
328 WDS_LOGD("Device has GC role - ignore this provision request");
329 __WDS_LOG_FUNC_EXIT__;
333 member = wfd_group_find_member_by_addr(group, event->dev_addr);
335 /* PD request can be arrived from peer device
336 * when connection is timeout to close connection*/
337 WDS_LOGE("Unexpected Event - Member already exist");
338 __WDS_LOG_FUNC_EXIT__;
342 #ifdef CTRL_IFACE_DBUS
343 wfd_oem_dev_data_s *edata = NULL;
345 edata = (wfd_oem_dev_data_s*) event->edata;
346 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
347 WDS_LOGE("Invalid event data");
348 __WDS_LOG_FUNC_EXIT__;
352 res = _wfd_event_update_peer(manager, edata);
353 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
354 #else /* CTRL_IFACE_DBUS */
355 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
357 WDS_LOGD("Prov_disc from unknown peer. Add new peer");
358 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
360 WDS_LOGE("Failed to add peer for invitation");
361 __WDS_LOG_FUNC_EXIT__;
364 wfd_update_peer(manager, peer);
366 wfd_update_peer_time(manager, event->dev_addr);
367 #endif /* CTRL_IFACE_DBUS */
369 if (WFD_DEV_ROLE_GO != manager->local->dev_role) {
370 WDS_LOGI("TV is not GO, updated peer data only.");
372 manager->local->wps_mode = event->wps_mode;
373 if (event->wps_mode == WFD_WPS_MODE_PBC ||
374 event->wps_mode == WFD_WPS_MODE_KEYPAD) {
375 __WDS_LOG_FUNC_EXIT__;
381 peer->state = WFD_PEER_STATE_CONNECTING;
383 res = wfd_session_process_event(manager, event);
385 WDS_LOGE("Failed to process event of session");
387 __WDS_LOG_FUNC_EXIT__;
391 void wfd_event_prov_disc_resp(wfd_oem_event_s *event)
393 __WDS_LOG_FUNC_ENTER__;
395 wfd_manager_s *manager = wfd_get_manager();
396 wfd_device_s *peer = NULL;
399 #ifdef CTRL_IFACE_DBUS
400 wfd_oem_dev_data_s *edata = NULL;
402 edata = (wfd_oem_dev_data_s*) event->edata;
403 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
404 WDS_LOGE("Invalid event data");
405 __WDS_LOG_FUNC_EXIT__;
409 res = _wfd_event_update_peer(manager, edata);
410 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
412 peer->state = WFD_PEER_STATE_CONNECTING;
413 #else /* CTRL_IFACE_DBUS */
414 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
416 WDS_LOGD("Prov_disc from unknown peer. Add new peer");
417 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
419 WDS_LOGE("Failed to add peer for invitation");
420 __WDS_LOG_FUNC_EXIT__;
423 peer->state = WFD_PEER_STATE_CONNECTING;
424 wfd_update_peer(manager, peer);
426 wfd_update_peer_time(manager, event->dev_addr);
427 #endif /* CTRL_IFACE_DBUS */
429 res = wfd_session_process_event(manager, event);
431 WDS_LOGE("Failed to process event of session");
433 __WDS_LOG_FUNC_EXIT__;
437 void wfd_event_prov_disc_fail(wfd_oem_event_s *event)
439 __WDS_LOG_FUNC_ENTER__;
441 wfd_manager_s *manager = wfd_get_manager();
442 wfd_session_s *session = NULL;
443 unsigned char *peer_addr = NULL;
444 char peer_mac_address[MACSTR_LEN+1] = {0, };
445 #if defined(TIZEN_FEATURE_ASP)
446 wfd_oem_asp_prov_s *prov_params = NULL;
447 prov_params = (wfd_oem_asp_prov_s *)event->edata;
450 session = (wfd_session_s*) manager->session;
452 WDS_LOGE("Unexpected event. Session not exist");
453 __WDS_LOG_FUNC_EXIT__;
457 peer_addr = wfd_session_get_peer_addr(session);
459 WDS_LOGE("Session do not have peer");
460 __WDS_LOG_FUNC_EXIT__;
463 #if defined(TIZEN_FEATURE_ASP)
464 if (!ISZEROMACADDR(session->session_mac)) {
465 /* This connection is for ASP session */
466 if (prov_params->status == WFD_OEM_SC_FAIL_INVALID_PARAMS) {
467 wfd_oem_scan_param_s param;
469 WDS_LOGD("ASP prov disc deferred. wait response.");
470 wfd_asp_connect_status(session->session_mac,
472 ASP_CONNECT_STATUS_REQUEST_DEFERRED,
474 /* start listen to wait for provision discovery request from peer */
475 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
476 param.scan_mode = WFD_OEM_SCAN_MODE_PASSIVE;
477 wfd_oem_start_scan(manager->oem_ops, ¶m);
478 __WDS_LOG_FUNC_EXIT__;
483 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
484 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
486 g_variant_new("(iis)",
487 WIFI_DIRECT_ERROR_CONNECTION_FAILED,
488 WFD_EVENT_CONNECTION_RSP,
490 #if defined(TIZEN_FEATURE_ASP)
491 WDS_LOGD("ASP prov disc failed. remove session.");
492 wfd_asp_connect_status(session->session_mac,
494 ASP_CONNECT_STATUS_REQUEST_FAILED,
498 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
499 wfd_group_s *group = (wfd_group_s*) manager->group;
500 if (group && !group->member_count &&
501 wfd_util_is_remove_group_allowed()) {
502 wfd_destroy_group(manager);
504 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
505 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
507 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
508 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
511 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
512 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
515 wfd_destroy_session(manager);
517 wfd_oem_refresh(manager->oem_ops);
519 /* After connection failed, scan again */
520 wfd_oem_scan_param_s param;
521 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
522 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
524 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
525 wfd_oem_start_scan(manager->oem_ops, ¶m);
526 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
528 __WDS_LOG_FUNC_EXIT__;
532 void wfd_event_go_neg_req(wfd_oem_event_s *event)
534 __WDS_LOG_FUNC_ENTER__;
536 wfd_manager_s *manager = wfd_get_manager();
537 wfd_group_s *group = (wfd_group_s*) manager->group;
538 if (group && group->role == WFD_DEV_ROLE_GC) {
539 WDS_LOGD("Device has GC role - ignore this go neg request");
540 __WDS_LOG_FUNC_EXIT__;
544 #ifdef CTRL_IFACE_DBUS
545 wfd_oem_dev_data_s *edata = NULL;
548 edata = (wfd_oem_dev_data_s*) event->edata;
549 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
550 WDS_LOGE("Invalid event data");
551 __WDS_LOG_FUNC_EXIT__;
555 res = _wfd_event_update_peer(manager, edata);
557 WDS_LOGE("Failed to update peer data");
558 __WDS_LOG_FUNC_EXIT__;
561 #else /* CTRL_IFACE_DBUS */
562 wfd_oem_conn_data_s *edata = NULL;
563 wfd_device_s *peer = NULL;
565 edata = (wfd_oem_conn_data_s*) event->edata;
566 if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_CONN) {
567 WDS_LOGE("Invalid connection event data");
568 __WDS_LOG_FUNC_EXIT__;
572 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
574 WDS_LOGD("Invitation from unknown peer. Add new peer");
575 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
577 WDS_LOGE("Failed to add peer for invitation");
578 __WDS_LOG_FUNC_EXIT__;
583 if (edata->wps_mode == 0)
586 event->wps_mode = edata->wps_mode;
587 #endif /* CTRL_IFACE_DBUS */
589 wfd_session_process_event(manager, event);
590 __WDS_LOG_FUNC_EXIT__;
594 void wfd_event_go_neg_fail(wfd_oem_event_s *event)
596 __WDS_LOG_FUNC_ENTER__;
598 wfd_manager_s *manager = wfd_get_manager();
599 wfd_session_s *session = NULL;
600 wfd_oem_conn_data_s *edata = NULL;
601 unsigned char *peer_addr = NULL;
602 char peer_mac_address[MACSTR_LEN] = {0, };
604 session = (wfd_session_s*) manager->session;
606 WDS_LOGE("Unexpected event. Session not exist");
607 __WDS_LOG_FUNC_EXIT__;
611 peer_addr = wfd_session_get_peer_addr(session);
613 WDS_LOGE("Session do not have peer");
614 __WDS_LOG_FUNC_EXIT__;
618 edata = (wfd_oem_conn_data_s*) event->edata;
620 WDS_LOGE("Invalid p2p connection data");
621 __WDS_LOG_FUNC_EXIT__;
625 if (edata->status < 0 && session->connecting_120) {
626 if (session->retry_gsrc) {
627 g_source_remove(session->retry_gsrc);
628 session->retry_gsrc = 0;
630 session->retry_gsrc = g_idle_add((GSourceFunc) _wfd_connection_retry, session);
631 WDS_LOGD("Connection will be retried");
632 __WDS_LOG_FUNC_EXIT__;
636 snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
637 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
639 g_variant_new("(iis)",
640 WIFI_DIRECT_ERROR_CONNECTION_FAILED,
641 WFD_EVENT_CONNECTION_RSP,
644 #if defined(TIZEN_FEATURE_ASP)
645 if (!ISZEROMACADDR(session->session_mac))
646 wfd_asp_connect_status(session->session_mac,
648 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
652 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
653 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
655 wfd_destroy_group(manager);
656 wfd_destroy_session(manager);
657 manager->local->dev_role = WFD_DEV_ROLE_NONE;
658 __WDS_LOG_FUNC_EXIT__;
662 void wfd_event_go_neg_done(wfd_oem_event_s *event)
664 __WDS_LOG_FUNC_ENTER__;
666 #ifdef CTRL_IFACE_DBUS
667 wfd_manager_s *manager = wfd_get_manager();
668 wfd_session_s *session = NULL;
669 wfd_oem_conn_data_s *edata = NULL;
670 wfd_device_s *peer = NULL;
672 edata = (wfd_oem_conn_data_s*) event->edata;
674 WDS_LOGE("Invalid event data");
675 __WDS_LOG_FUNC_EXIT__;
679 session = (wfd_session_s*) manager->session;
680 if (session && session->peer) {
681 peer = session->peer;
682 memcpy(peer->intf_addr, edata->peer_intf_addr, MACADDR_LEN);
685 wfd_session_process_event(manager, event);
686 #endif /* CTRL_IFACE_DBUS */
687 __WDS_LOG_FUNC_EXIT__;
691 void wfd_event_wps_fail(wfd_oem_event_s *event)
693 __WDS_LOG_FUNC_ENTER__;
695 wfd_manager_s *manager = wfd_get_manager();
696 wfd_session_s *session = NULL;
697 unsigned char *peer_addr = NULL;
699 session = (wfd_session_s*) manager->session;
701 WDS_LOGE("Unexpected event. Session not exist");
702 __WDS_LOG_FUNC_EXIT__;
706 peer_addr = wfd_session_get_peer_addr(session);
708 WDS_LOGE("Session do not have peer");
709 __WDS_LOG_FUNC_EXIT__;
713 char peer_mac_address[MACSTR_LEN+1] = {0, };
714 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
715 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
717 g_variant_new("(iis)",
718 WIFI_DIRECT_ERROR_CONNECTION_FAILED,
719 WFD_EVENT_CONNECTION_RSP,
721 #if defined(TIZEN_FEATURE_ASP)
722 if (!ISZEROMACADDR(session->session_mac))
723 wfd_asp_connect_status(session->session_mac,
725 ASP_CONNECT_STATUS_GROUP_FORMATION_STARTED,
728 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
729 wfd_group_s *group = (wfd_group_s*) manager->group;
730 if (group && !group->member_count &&
731 wfd_util_is_remove_group_allowed()) {
732 wfd_destroy_group(manager);
734 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
735 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
737 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
738 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
741 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
742 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
745 wfd_destroy_session(manager);
747 wfd_oem_refresh(manager->oem_ops);
749 /* After connection failed, scan again */
750 wfd_oem_scan_param_s param;
751 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
752 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
754 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
755 wfd_oem_start_scan(manager->oem_ops, ¶m);
756 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
758 __WDS_LOG_FUNC_EXIT__;
762 void wfd_event_wps_done(wfd_oem_event_s *event)
764 __WDS_LOG_FUNC_ENTER__;
766 wfd_manager_s *manager = wfd_get_manager();
767 wfd_session_process_event(manager, event);
769 __WDS_LOG_FUNC_EXIT__;
773 void wfd_event_key_neg_fail(wfd_oem_event_s *event)
775 __WDS_LOG_FUNC_ENTER__;
777 wfd_manager_s *manager = wfd_get_manager();
778 wfd_session_s *session = NULL;
779 unsigned char *peer_addr = NULL;
780 char peer_mac_address[MACSTR_LEN+1] = {0, };
782 session = (wfd_session_s*) manager->session;
784 WDS_LOGE("Unexpected event. Session not exist");
785 __WDS_LOG_FUNC_EXIT__;
789 peer_addr = wfd_session_get_peer_addr(session);
791 WDS_LOGE("Session do not has peer");
792 __WDS_LOG_FUNC_EXIT__;
796 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
797 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
799 g_variant_new("(iis)",
800 WIFI_DIRECT_ERROR_CONNECTION_FAILED,
801 WFD_EVENT_CONNECTION_RSP,
803 #if defined(TIZEN_FEATURE_ASP)
804 if (!ISZEROMACADDR(session->session_mac))
805 wfd_asp_connect_status(session->session_mac,
807 ASP_CONNECT_STATUS_GROUP_FORMATION_STARTED,
810 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
811 wfd_group_s *group = (wfd_group_s*) manager->group;
812 if (group && !group->member_count &&
813 wfd_util_is_remove_group_allowed()) {
814 wfd_destroy_group(manager);
816 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
817 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
819 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
820 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
823 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
824 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
827 wfd_destroy_session(manager);
829 wfd_oem_refresh(manager->oem_ops);
831 /* After connection failed, scan again */
832 wfd_oem_scan_param_s param;
833 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
834 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
836 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
837 wfd_oem_start_scan(manager->oem_ops, ¶m);
838 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
840 __WDS_LOG_FUNC_EXIT__;
844 void wfd_event_key_neg_done(wfd_oem_event_s *event)
846 __WDS_LOG_FUNC_ENTER__;
848 __WDS_LOG_FUNC_EXIT__;
852 void wfd_event_conn_fail(wfd_oem_event_s *event)
854 __WDS_LOG_FUNC_ENTER__;
856 __WDS_LOG_FUNC_EXIT__;
860 void wfd_event_conn_done(wfd_oem_event_s *event)
862 __WDS_LOG_FUNC_ENTER__;
864 __WDS_LOG_FUNC_EXIT__;
868 void wfd_event_group_created(wfd_oem_event_s *event)
870 __WDS_LOG_FUNC_ENTER__;
872 wfd_manager_s *manager = wfd_get_manager();
873 wfd_group_s *group = (wfd_group_s*) manager->group;
874 wfd_session_s *session = (wfd_session_s*) manager->session;
877 group = wfd_create_pending_group(manager, event->intf_addr);
879 WDS_LOGE("Failed to create pending group");
880 __WDS_LOG_FUNC_EXIT__;
884 manager->group = group;
887 wfd_group_complete(manager, event);
889 if (group->role == WFD_DEV_ROLE_GC && session) {
890 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
891 wfd_device_s *peer = session->peer;
893 WDS_LOGE("Unexpected event. Peer doesn't exist");
897 wfd_update_peer(manager, peer);
899 if (peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
900 char peer_mac_address[MACSTR_LEN+1] = {0, };
902 wfd_util_ip_over_eap_assign(peer, event->ifname);
904 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
905 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
907 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
908 WFD_EVENT_CONNECTION_RSP,
910 #if defined(TIZEN_FEATURE_ASP)
911 if (!ISZEROMACADDR(session->session_mac)) {
912 wfd_asp_connect_status(session->session_mac,
914 ASP_CONNECT_STATUS_GROUP_FORMATION_COMPLETED,
916 wfd_asp_session_peer_ip(session->session_mac, session->session_id,
917 session->service_mac, peer->ip_addr);
920 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
921 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
923 wfd_destroy_session(manager);
925 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
926 wfd_peer_clear_all(manager);
928 if (group->flags & WFD_GROUP_FLAG_AUTONOMOUS) {
929 wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
931 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
932 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
935 __WDS_LOG_FUNC_EXIT__;
939 void wfd_event_group_destroyed(wfd_oem_event_s *event)
941 __WDS_LOG_FUNC_ENTER__;
943 wfd_manager_s *manager = wfd_get_manager();
944 char peer_mac_address[MACSTR_LEN+1] = {0, };
945 unsigned char *peer_addr = wfd_session_get_peer_addr(manager->session);
947 if (peer_addr != NULL)
948 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
950 g_snprintf(peer_mac_address, MACSTR_LEN, "%s", "");
952 if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
953 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
955 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
956 WFD_EVENT_DISCONNECTION_RSP,
959 } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING && manager->session) {
960 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
962 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
963 WFD_EVENT_CONNECTION_RSP,
965 #if defined(TIZEN_FEATURE_ASP)
966 wfd_session_s *session = manager->session;
967 if (!ISZEROMACADDR(session->session_mac))
968 wfd_asp_connect_status(session->session_mac,
970 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
973 } else if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
974 if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
975 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
977 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
978 WFD_EVENT_DISCONNECTION_RSP,
981 wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
985 WDS_LOGD("Unexpected event(GROUP_DESTROYED). Ignore it");
986 __WDS_LOG_FUNC_EXIT__;
990 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
991 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
992 wfd_destroy_group(manager);
993 wfd_destroy_session(manager);
994 manager->local->dev_role = WFD_DEV_ROLE_NONE;
996 __WDS_LOG_FUNC_EXIT__;
1000 void wfd_event_invitation_req(wfd_oem_event_s *event)
1002 __WDS_LOG_FUNC_ENTER__;
1004 wfd_manager_s *manager = wfd_get_manager();
1005 wfd_device_s *peer = NULL;
1006 wfd_session_s *session = NULL;
1007 wfd_oem_invite_data_s *edata = NULL;
1009 char peer_mac_address[MACSTR_LEN+1] = {0, };
1011 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
1013 WDS_LOGD("Invitation from unknown peer. Add new peer");
1014 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
1016 WDS_LOGE("Failed to add peer for invitation");
1017 __WDS_LOG_FUNC_EXIT__;
1021 peer->dev_role = WFD_DEV_ROLE_GO;
1023 edata = (wfd_oem_invite_data_s*) event->edata;
1024 memcpy(peer->intf_addr, edata->bssid, MACADDR_LEN);
1025 wfd_update_peer_time(manager, event->dev_addr);
1027 if (edata->go_dev_addr)
1028 session = wfd_create_session(manager, edata->go_dev_addr,
1029 manager->req_wps_mode,
1030 SESSION_DIRECTION_INCOMING);
1032 session = wfd_create_session(manager, event->dev_addr,
1033 manager->req_wps_mode,
1034 SESSION_DIRECTION_INCOMING);
1036 WDS_LOGE("Failed to create session");
1037 __WDS_LOG_FUNC_EXIT__;
1040 session->type = SESSION_TYPE_INVITE;
1041 wfd_session_timer(session, 1);
1043 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
1044 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
1046 res = wfd_session_start(session);
1048 WDS_LOGE("Failed to start session");
1049 __WDS_LOG_FUNC_EXIT__;
1053 if (edata->go_dev_addr)
1054 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR,
1055 MAC2STR(edata->go_dev_addr));
1057 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR,
1058 MAC2STR(event->dev_addr));
1060 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1062 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1063 WFD_EVENT_CONNECTION_REQ,
1066 __WDS_LOG_FUNC_EXIT__;
1070 void wfd_event_invitation_res(wfd_oem_event_s *event)
1072 __WDS_LOG_FUNC_ENTER__;
1074 __WDS_LOG_FUNC_EXIT__;
1078 void wfd_event_sta_connected(wfd_oem_event_s *event)
1080 __WDS_LOG_FUNC_ENTER__;
1082 wfd_manager_s *manager = wfd_get_manager();
1083 wfd_session_s *session = (wfd_session_s*) manager->session;
1084 wfd_group_s *group = (wfd_group_s*) manager->group;
1085 wfd_device_s *peer = NULL;
1086 char peer_mac_address[MACSTR_LEN+1] = {0, };
1088 /* FIXME: Move this code to plugin */
1089 if (!memcmp(event->intf_addr, manager->local->intf_addr, MACADDR_LEN)) {
1090 WDS_LOGD("Ignore this event");
1091 __WDS_LOG_FUNC_EXIT__;
1095 if (ISZEROMACADDR(event->dev_addr)) {
1096 WDS_LOGD("Legacy Peer Connected [Peer: " MACSTR "]", MAC2STR(event->intf_addr));
1098 peer = wfd_peer_find_by_addr(manager, event->intf_addr);
1100 WDS_LOGI("Add legacy peer");
1101 peer = wfd_add_peer(manager, event->intf_addr, "LEGACY-PEER");
1103 WDS_LOGE("Failed to add Legacy peer.");
1104 __WDS_LOG_FUNC_EXIT__;
1109 if (wfd_group_add_member(group, peer->dev_addr) == -1) {
1110 WDS_LOGE("Failed to add Legacy peer.");
1111 __WDS_LOG_FUNC_EXIT__;
1115 memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
1116 peer->state = WFD_PEER_STATE_CONNECTED;
1117 peer->is_p2p = FALSE;
1119 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1120 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1122 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1123 WFD_EVENT_CONNECTION_RSP,
1126 wfd_util_dhcps_wait_ip_leased(peer);
1127 __WDS_LOG_FUNC_EXIT__;
1131 session = (wfd_session_s*) manager->session;
1133 WDS_LOGD("Unexpected event. Session is NULL [peer: " MACSECSTR "]",
1134 MAC2SECSTR(event->dev_addr));
1136 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1137 wfd_destroy_group(manager);
1139 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1140 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1141 __WDS_LOG_FUNC_EXIT__;
1145 peer = wfd_session_get_peer(session);
1147 WDS_LOGE("Peer not found");
1148 __WDS_LOG_FUNC_EXIT__;
1152 group = (wfd_group_s*) manager->group;
1154 group = wfd_create_pending_group(manager, event->intf_addr);
1156 WDS_LOGE("Failed to create pending group");
1157 __WDS_LOG_FUNC_EXIT__;
1160 manager->group = group;
1162 wfd_group_add_member(group, peer->dev_addr);
1164 session->state = SESSION_STATE_COMPLETED;
1165 #ifndef CTRL_IFACE_DBUS
1166 memcpy(peer->intf_addr, event->intf_addr, MACADDR_LEN);
1167 #endif /* CTRL_IFACE_DBUS */
1168 peer->state = WFD_PEER_STATE_CONNECTED;
1170 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1171 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1173 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1174 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1176 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1177 WFD_EVENT_CONNECTION_RSP,
1180 #ifdef CTRL_IFACE_DBUS
1181 wfd_update_peer(manager, peer);
1182 #endif /* CTRL_IFACE_DBUS */
1183 #ifdef TIZEN_FEATURE_IP_OVER_EAPOL
1184 if (event->ip_addr_peer[3]) {
1185 peer->ip_type = WFD_IP_TYPE_OVER_EAPOL;
1186 memcpy(peer->client_ip_addr, event->ip_addr_peer, IPADDR_LEN);
1187 WDS_LOGE("Peer's client IP [" IPSTR "]", IP2STR((char*) &peer->client_ip_addr));
1188 memcpy(peer->go_ip_addr, manager->local->ip_addr, IPADDR_LEN);
1189 WDS_LOGE("Peer's GO IP [" IPSTR "]", IP2STR((char*) &peer->go_ip_addr));
1191 if (peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
1192 char peer_mac_address[MACSTR_LEN+1] = {0,};
1193 char assigned_ip_address[IPSTR_LEN+1] = {0,};
1195 memcpy(peer->ip_addr, peer->client_ip_addr, IPADDR_LEN);
1197 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1198 g_snprintf(assigned_ip_address, IPSTR_LEN, IPSTR, IP2STR(peer->ip_addr));
1199 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1201 g_variant_new("(ss)", peer_mac_address,
1202 assigned_ip_address));
1203 #if defined(TIZEN_FEATURE_ASP)
1204 if (!ISZEROMACADDR(session->session_mac)) {
1205 wfd_asp_connect_status(session->session_mac,
1206 session->session_id,
1207 ASP_CONNECT_STATUS_GROUP_FORMATION_COMPLETED,
1210 wfd_asp_session_peer_ip(session->session_mac, session->session_id,
1211 session->service_mac, peer->ip_addr);
1215 #endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
1216 wfd_util_dhcps_wait_ip_leased(peer);
1217 wfd_destroy_session(manager);
1219 __WDS_LOG_FUNC_EXIT__;
1223 void wfd_event_sta_disconnected(wfd_oem_event_s *event)
1225 __WDS_LOG_FUNC_ENTER__;
1227 wfd_manager_s *manager = wfd_get_manager();
1228 wfd_group_s *group = NULL;
1229 wfd_device_s *peer = NULL;
1230 unsigned char peer_addr[MACADDR_LEN] = {0, };
1231 char peer_mac_address[MACSTR_LEN+1] = {0, };
1233 group = (wfd_group_s*) manager->group;
1235 WDS_LOGE("Group not found");
1236 __WDS_LOG_FUNC_EXIT__;
1240 if (ISZEROMACADDR(event->dev_addr)) {
1241 WDS_LOGD("Legacy Peer Disconnected [Peer: " MACSTR "]", MAC2STR(event->intf_addr));
1242 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->intf_addr));
1243 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1245 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1246 WFD_EVENT_DISCONNECTION_IND,
1249 wfd_group_remove_member(group, event->intf_addr);
1251 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1252 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1253 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1255 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1256 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1258 __WDS_LOG_FUNC_EXIT__;
1262 #ifdef CTRL_IFACE_DBUS
1263 peer = wfd_group_find_member_by_addr(group, event->dev_addr);
1264 #else /* CTRL_IFACE_DBUS */
1265 peer = wfd_group_find_member_by_addr(group, event->intf_addr);
1266 #endif /* DBUS_IFACE */
1268 WDS_LOGE("Failed to find connected peer");
1269 peer = wfd_session_get_peer(manager->session);
1271 WDS_LOGE("Failed to find connecting peer");
1272 __WDS_LOG_FUNC_EXIT__;
1276 #ifdef CTRL_IFACE_DBUS
1278 * If no peer connected and
1279 * disconnected event is not for connecting peer
1280 * then event should be ignored.
1281 * This situation can arrise when TV is GO and
1282 * some connected peer sent disassociation.
1284 if (memcmp(peer_addr, event->dev_addr, MACADDR_LEN)) {
1285 WDS_LOGE("Unexpected event, Ignore it...");
1286 __WDS_LOG_FUNC_EXIT__;
1289 #endif /* CTRL_DBUS_IFACE */
1291 memcpy(peer_addr, peer->dev_addr, MACADDR_LEN);
1294 * If state is not DISCONNECTING, connection is finished by peer.
1295 * Required the check also, when Device is Group Owner and state is DISCOVERING.
1297 if (manager->state >= WIFI_DIRECT_STATE_CONNECTED ||
1298 (manager->state == WIFI_DIRECT_STATE_DISCOVERING &&
1299 manager->local->dev_role == WFD_DEV_ROLE_GO)) {
1300 wfd_group_remove_member(group, peer_addr);
1301 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1302 if (group->member_count) {
1303 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1305 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1306 WFD_EVENT_DISASSOCIATION_IND,
1309 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1311 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1312 WFD_EVENT_DISCONNECTION_IND,
1316 } else if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
1317 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1318 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1320 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1321 WFD_EVENT_DISCONNECTION_RSP,
1324 } else if (manager->state == WIFI_DIRECT_STATE_CONNECTING &&
1325 /* Some devices(GO) send disconnection message before connection completed.
1326 * This message should be ignored when device is not GO */
1327 manager->local->dev_role == WFD_DEV_ROLE_GO) {
1328 if (WFD_PEER_STATE_CONNECTED == peer->state) {
1329 WDS_LOGD("Peer is already Connected !!!");
1330 wfd_group_remove_member(group, peer_addr);
1331 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1332 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1334 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1335 WFD_EVENT_DISASSOCIATION_IND,
1338 } else if (WFD_PEER_STATE_CONNECTING == peer->state) {
1339 WDS_LOGD("Peer is Connecting...");
1340 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1341 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1343 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
1344 WFD_EVENT_CONNECTION_RSP,
1346 #if defined(TIZEN_FEATURE_ASP)
1347 wfd_session_s *session = manager->session;
1348 if (session && !ISZEROMACADDR(session->session_mac))
1349 wfd_asp_connect_status(session->session_mac,
1350 session->session_id,
1351 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
1355 WDS_LOGE("Unexpected Peer State. Ignore it");
1356 __WDS_LOG_FUNC_EXIT__;
1360 WDS_LOGE("Unexpected event. Ignore it");
1361 __WDS_LOG_FUNC_EXIT__;
1365 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1366 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1367 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1369 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1370 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1373 /* If there is no member, GO should be destroyed */
1374 if (!group->member_count) {
1375 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1376 wfd_destroy_group(manager);
1377 wfd_peer_clear_all(manager);
1380 wfd_destroy_session(manager);
1382 __WDS_LOG_FUNC_EXIT__;
1386 void wfd_event_terminating(wfd_oem_event_s *event)
1388 __WDS_LOG_FUNC_ENTER__;
1390 __WDS_LOG_FUNC_EXIT__;
1394 void wfd_event_group_formation_failure(wfd_oem_event_s *event)
1396 __WDS_LOG_FUNC_ENTER__;
1398 wfd_manager_s *manager = wfd_get_manager();
1399 wfd_session_s *session = (wfd_session_s*) manager->session;
1401 WDS_LOGE("Unexpected event. Session not exist");
1402 __WDS_LOG_FUNC_EXIT__;
1406 unsigned char *peer_addr = wfd_session_get_peer_addr(session);
1408 WDS_LOGE("Session do not has peer");
1409 __WDS_LOG_FUNC_EXIT__;
1413 char peer_mac_address[MACSTR_LEN+1] = {0, };
1414 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
1415 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1417 g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
1418 WFD_EVENT_CONNECTION_RSP,
1421 #if defined(TIZEN_FEATURE_ASP)
1422 if (!ISZEROMACADDR(session->session_mac))
1423 wfd_asp_connect_status(session->session_mac,
1424 session->session_id,
1425 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
1429 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1430 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1431 wfd_destroy_session(manager);
1432 manager->local->dev_role = WFD_DEV_ROLE_NONE;
1434 wfd_oem_refresh(manager->oem_ops);
1436 __WDS_LOG_FUNC_EXIT__;
1441 * This event is generated by supplicant when persitent invite is auto accepted
1442 * so that wfd-manager can get indication that a peer will be connected in near future.
1443 * session is started for that peer, so that it is not ignored when connected.
1445 void wfd_event_invitation_accepted(wfd_oem_event_s *event)
1448 __WDS_LOG_FUNC_ENTER__;
1450 wfd_manager_s *manager = wfd_get_manager();
1451 wfd_session_s *session = (wfd_session_s*) manager->session;
1452 wfd_device_s *peer = NULL;
1453 char peer_mac_address[MACSTR_LEN+1] = {0, };
1455 peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
1457 WDS_LOGI("Invitation from unknown peer. Add new peer");
1458 peer = wfd_add_peer(manager, event->dev_addr, "DIRECT-");
1460 WDS_LOGE("Failed to add peer for invitation");
1461 __WDS_LOG_FUNC_EXIT__;
1465 /**By default, peer device information is complete but there's some exception
1466 * if DEV-FOUND event was not preceding before connection start event.
1468 wfd_update_peer(manager, peer);
1469 peer->dev_role = WFD_DEV_ROLE_GO;
1472 session = wfd_create_session(manager, event->dev_addr,
1473 event->wps_mode, SESSION_DIRECTION_INCOMING);
1475 WDS_LOGE("Failed to create session with peer [" MACSTR "]",
1476 MAC2STR(event->dev_addr));
1477 __WDS_LOG_FUNC_EXIT__;
1482 session->state = SESSION_STATE_WPS;
1483 wfd_session_timer(session, 1);
1485 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1486 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1488 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1489 WFD_EVENT_CONNECTION_IN_PROGRESS,
1492 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
1493 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
1495 __WDS_LOG_FUNC_EXIT__;
1498 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1499 void wfd_event_serv_disc_resp(wfd_oem_event_s *event)
1501 __WDS_LOG_FUNC_ENTER__;
1503 wfd_manager_s *manager = wfd_get_manager();
1505 char response_data[256] = {0, };
1506 char peer_mac_address[MACSTR_LEN+1] = {0, };
1508 wfd_update_peer_time(manager, event->dev_addr);
1510 if (event->edata_type == WFD_OEM_EDATA_TYPE_NEW_SERVICE) {
1511 wfd_oem_new_service_s *service = NULL;;
1513 GList *services = (GList*) event->edata;
1516 WDS_LOGD("%d service data found", event->dev_role);
1518 temp = g_list_first(services);
1519 while (temp && count < event->dev_role) {
1520 service = (wfd_oem_new_service_s*) temp->data;
1521 service_type = service->protocol;
1522 if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
1523 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1524 g_snprintf(response_data, 256, "%s|%s", service->data.bonjour.query, service->data.bonjour.rdata);
1525 WDS_LOGD("Found service: [%d: %s] - [" MACSECSTR "]", service->protocol,
1526 service->data.bonjour.query, MAC2SECSTR(event->dev_addr));
1528 WDS_LOGD("Found service is not supported");
1532 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
1534 g_variant_new("(iss)", service_type,
1538 temp = g_list_next(temp);
1542 } else if (event->edata_type == WFD_OEM_EDATA_TYPE_SERVICE) {
1543 wfd_oem_service_data_s *edata = (wfd_oem_service_data_s*) event->edata;
1548 service_type = edata->type;
1549 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
1550 switch (edata->type) {
1551 WDS_LOGE("Unknown type [type ID: %d]", edata->type);
1555 wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
1557 g_variant_new("(iss)", service_type,
1562 __WDS_LOG_FUNC_EXIT__;
1566 void wfd_event_serv_disc_started(wfd_oem_event_s *event)
1568 __WDS_LOG_FUNC_ENTER__;
1570 __WDS_LOG_FUNC_EXIT__;
1573 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1576 #if defined(TIZEN_FEATURE_ASP)
1577 void wfd_event_asp_serv_resp(wfd_oem_event_s *event)
1579 __WDS_LOG_FUNC_ENTER__;
1581 wfd_oem_asp_service_s *service = NULL;
1582 GVariantBuilder *builder = NULL;
1583 GVariant *params = NULL;
1585 service = (wfd_oem_asp_service_s *)event->edata;
1586 if (service == NULL) {
1587 WDS_LOGE("P2P service found event has NULL information");
1588 __WDS_LOG_FUNC_EXIT__;
1592 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
1593 g_variant_builder_add(builder, "{sv}", "search_id", g_variant_new("u", service->search_id));
1594 g_variant_builder_add(builder, "{sv}", "service_mac", g_variant_new("s", event->dev_addr));
1595 g_variant_builder_add(builder, "{sv}", "advertisement_id", g_variant_new("u", service->adv_id));
1596 g_variant_builder_add(builder, "{sv}", "config_method", g_variant_new("u", service->config_method));
1597 if (service->service_type)
1598 g_variant_builder_add(builder, "{sv}", "service_type", g_variant_new("s", service->service_type));
1599 if (service->service_info)
1600 g_variant_builder_add(builder, "{sv}", "service_info", g_variant_new("s", service->service_info));
1601 g_variant_builder_add(builder, "{sv}", "status", g_variant_new("y", service->status));
1602 params = g_variant_new("(a{sv})", builder);
1603 g_variant_builder_unref(builder);
1605 wfd_manager_dbus_emit_signal(WFD_MANAGER_ASP_INTERFACE,
1609 __WDS_LOG_FUNC_EXIT__;
1613 int __wfd_handle_asp_prov(wfd_manager_s *manager, wfd_oem_event_s *event)
1615 __WDS_LOG_FUNC_ENTER__;
1617 wfd_session_s *session = NULL;
1618 wfd_oem_asp_prov_s *prov_params = NULL;
1621 prov_params = (wfd_oem_asp_prov_s *)event->edata;
1622 if (prov_params == NULL) {
1623 WDS_LOGE("Invalid parameter");
1624 __WDS_LOG_FUNC_EXIT__;
1628 res = wfd_session_process_event(manager, event);
1629 session = (wfd_session_s *)manager->session;
1630 if (res < 0 || session == NULL) {
1631 WDS_LOGE("Failed to process event of session");
1632 __WDS_LOG_FUNC_EXIT__;
1635 session->session_id = prov_params->session_id;
1636 memcpy(session->session_mac, prov_params->session_mac, MACADDR_LEN);
1637 memcpy(session->service_mac, prov_params->service_mac, MACADDR_LEN);
1639 __WDS_LOG_FUNC_EXIT__;
1643 int __wfd_handle_asp_prov_done(wfd_session_s *session, wfd_oem_event_s *event)
1645 __WDS_LOG_FUNC_ENTER__;
1647 wfd_oem_asp_prov_s *prov_params = NULL;
1648 prov_params = (wfd_oem_asp_prov_s *)event->edata;
1651 if (prov_params->persist &&
1652 (prov_params->network_role || prov_params->network_config)) {
1653 WDS_LOGE("Persistent group is used but "
1654 "conncap/dev_passwd_id are present");
1655 __WDS_LOG_FUNC_EXIT__;
1659 if (!prov_params->persist &&
1660 (!prov_params->network_role && !prov_params->network_config)) {
1661 WDS_LOGE("Persistent group not used but "
1662 "conncap/dev_passwd_id are missing");
1663 __WDS_LOG_FUNC_EXIT__;
1667 if (session->wps_mode == WFD_OEM_WPS_MODE_P2PS)
1668 g_strlcpy(session->wps_pin, OEM_DEFAULT_P2PS_PIN, OEM_PINSTR_LEN + 1);
1670 if (prov_params->persist) {
1671 res = wfd_session_asp_persistent_connect(session, prov_params->persistent_group_id);
1672 } else if (prov_params->network_role == WFD_OEM_ASP_SESSION_ROLE_NEW) {
1673 res = wfd_session_asp_connect(session, WFD_OEM_ASP_SESSION_ROLE_NEW);
1674 } else if (prov_params->network_role == WFD_OEM_ASP_SESSION_ROLE_CLIENT) {
1675 res = wfd_session_asp_connect(session, WFD_OEM_ASP_SESSION_ROLE_CLIENT);
1676 } else if (prov_params->network_role == WFD_OEM_ASP_SESSION_ROLE_GO) {
1677 res = wfd_session_asp_connect(session, WFD_OEM_ASP_SESSION_ROLE_GO);
1678 WDS_LOGD("don't need to take action.");
1681 WDS_LOGE("Unhandled event");
1682 __WDS_LOG_FUNC_EXIT__;
1686 __WDS_LOG_FUNC_EXIT__;
1689 void wfd_event_asp_prov_start(wfd_oem_event_s *event)
1691 __WDS_LOG_FUNC_ENTER__;
1693 wfd_manager_s *manager = wfd_get_manager();
1694 wfd_session_s *session = NULL;
1695 wfd_oem_asp_prov_s *prov_params = NULL;
1698 if (event == NULL || event->edata == NULL) {
1699 WDS_LOGE("Invalid parameter");
1700 __WDS_LOG_FUNC_EXIT__;
1704 prov_params = (wfd_oem_asp_prov_s *)event->edata;
1705 res = __wfd_handle_asp_prov(manager, event);
1706 session = (wfd_session_s *)manager->session;
1707 if (res < 0 || session == NULL) {
1708 WDS_LOGE("Failed to process event of session");
1709 __WDS_LOG_FUNC_EXIT__;
1713 WDS_LOGD("created session [%u] with peer [" MACSTR "]", session->session_id,
1714 MAC2STR(session->session_mac));
1716 /* Incomming Session, auto_accept = TRUE emit request Received */
1717 /* generate SessionConfigRequest if event->wps_mode is not P2PS and return*/
1719 wfd_session_timer(session, 1);
1720 wfd_asp_session_request(prov_params);
1721 wfd_asp_connect_status(prov_params->session_mac,
1722 prov_params->session_id,
1723 ASP_CONNECT_STATUS_REQUEST_RECEIVED,
1726 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
1728 __WDS_LOG_FUNC_EXIT__;
1732 void wfd_event_asp_prov_done(wfd_oem_event_s *event)
1734 __WDS_LOG_FUNC_ENTER__;
1736 wfd_manager_s *manager = wfd_get_manager();
1737 wfd_session_s *session = NULL;
1738 wfd_oem_asp_prov_s *prov_params;
1741 if (event == NULL || event->edata == NULL) {
1742 WDS_LOGE("Invalid parameter");
1743 __WDS_LOG_FUNC_EXIT__;
1747 prov_params = (wfd_oem_asp_prov_s *)event->edata;
1748 /* Incomming Session, auto_accept = TRUE emit request Received */
1749 /* generate SessionConfigRequest if event->wps_mode is not P2PS and return*/
1750 if (manager->session == NULL) {
1751 wfd_asp_session_request(prov_params);
1752 wfd_asp_connect_status(prov_params->session_mac,
1753 prov_params->session_id,
1754 ASP_CONNECT_STATUS_REQUEST_RECEIVED,
1758 res = __wfd_handle_asp_prov(manager, event);
1759 session = (wfd_session_s *)manager->session;
1760 if (res < 0 || session == NULL) {
1761 WDS_LOGE("Failed to process event of session");
1762 wfd_destroy_session(manager);
1763 wfd_asp_connect_status(prov_params->session_mac,
1764 prov_params->session_id,
1765 ASP_CONNECT_STATUS_REQUEST_FAILED,
1767 wfd_oem_refresh(manager->oem_ops);
1768 __WDS_LOG_FUNC_EXIT__;
1772 if (prov_params->status != WFD_OEM_SC_SUCCESS &&
1773 prov_params->status != WFD_OEM_SC_SUCCESS_ACCEPTED_BY_USER) {
1774 WDS_LOGD("ASP-PROV failed. remove session.");
1775 wfd_destroy_session(manager);
1776 wfd_oem_refresh(manager->oem_ops);
1777 wfd_asp_connect_status(prov_params->session_mac,
1778 prov_params->session_id,
1779 ASP_CONNECT_STATUS_REQUEST_FAILED,
1781 __WDS_LOG_FUNC_EXIT__;
1785 wfd_asp_connect_status(prov_params->session_mac,
1786 prov_params->session_id,
1787 ASP_CONNECT_STATUS_REQUEST_ACCEPTED,
1790 wfd_asp_connect_status(prov_params->session_mac,
1791 prov_params->session_id,
1792 ASP_CONNECT_STATUS_GROUP_FORMATION_STARTED,
1794 res = __wfd_handle_asp_prov_done(session, event);
1796 WDS_LOGE("Connect failed. remove session.");
1797 wfd_destroy_session(manager);
1798 wfd_oem_refresh(manager->oem_ops);
1800 wfd_asp_connect_status(prov_params->session_mac,
1801 prov_params->session_id,
1802 ASP_CONNECT_STATUS_GROUP_FORMATION_FAILED,
1804 __WDS_LOG_FUNC_EXIT__;
1808 WDS_LOGD("Provision done succeeded.");
1809 __WDS_LOG_FUNC_EXIT__;
1812 #endif /* TIZEN_FEATURE_ASP */
1814 void wfd_event_init(wfd_oem_event_cbs_s *event_cbs)
1816 __WDS_LOG_FUNC_ENTER__;
1819 __WDS_LOG_FUNC_EXIT__;
1823 event_cbs->deactivated_cb = wfd_event_deactivated;
1824 event_cbs->peer_found_cb = wfd_event_peer_found;
1825 event_cbs->peer_disappeared_cb = wfd_event_peer_disappeared;
1826 event_cbs->discovery_finished_cb = wfd_event_discovery_finished;
1828 event_cbs->prov_disc_req_cb = wfd_event_prov_disc_req;
1829 event_cbs->prov_disc_resp_cb = wfd_event_prov_disc_resp;
1830 event_cbs->prov_disc_fail_cb = wfd_event_prov_disc_fail;
1832 event_cbs->go_neg_req_cb = wfd_event_go_neg_req;
1833 event_cbs->go_neg_fail_cb = wfd_event_go_neg_fail;
1834 event_cbs->go_neg_done_cb = wfd_event_go_neg_done;
1836 event_cbs->wps_fail_cb = wfd_event_wps_fail;
1837 event_cbs->wps_done_cb = wfd_event_wps_done;
1838 event_cbs->key_neg_fail_cb = wfd_event_key_neg_fail;
1839 event_cbs->key_neg_done_cb = wfd_event_key_neg_done;
1841 event_cbs->conn_fail_cb = wfd_event_conn_fail;
1842 event_cbs->conn_done_cb = wfd_event_conn_done;
1844 event_cbs->group_created_cb = wfd_event_group_created;
1845 event_cbs->group_destroyed_cb = wfd_event_group_destroyed;
1847 event_cbs->invitation_req_cb = wfd_event_invitation_req;
1848 event_cbs->invitation_resp_cb = wfd_event_invitation_res;
1849 event_cbs->sta_connected_cb = wfd_event_sta_connected;
1850 event_cbs->sta_disconnected_cb = wfd_event_sta_disconnected;
1852 event_cbs->terminating_cb = wfd_event_terminating;
1854 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1855 event_cbs->serv_disc_resp_cb = wfd_event_serv_disc_resp;
1856 event_cbs->serv_disc_started_cb = wfd_event_serv_disc_started;
1857 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1859 event_cbs->group_formation_failure_cb = wfd_event_group_formation_failure;
1860 event_cbs->invitation_accepted_cb = wfd_event_invitation_accepted;
1862 #if defined(TIZEN_FEATURE_ASP)
1863 event_cbs->asp_serv_resp_cb = wfd_event_asp_serv_resp;
1864 event_cbs->asp_prov_start_cb = wfd_event_asp_prov_start;
1865 event_cbs->asp_prov_done_cb = wfd_event_asp_prov_done;
1866 #endif /* TIZEN_FEATURE_ASP */
1868 event_cbs->extra_data = NULL;
1870 __WDS_LOG_FUNC_EXIT__;