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 manager functions.
23 * @file wifi-direct-manager.c
24 * @author Gibyoung Kim (lastkgb.kim@samsung.com)
31 #include <sys/utsname.h>
36 #include <glib-object.h>
38 #include <wifi-direct.h>
40 #include "wifi-direct-ipc.h"
41 #include "wifi-direct-manager.h"
42 #include "wifi-direct-oem.h"
43 #include "wifi-direct-session.h"
44 #include "wifi-direct-group.h"
45 #include "wifi-direct-peer.h"
46 #include "wifi-direct-state.h"
47 #include "wifi-direct-event.h"
48 #include "wifi-direct-util.h"
49 #include "wifi-direct-log.h"
50 #include "wifi-direct-error.h"
51 #include "wifi-direct-iface.h"
52 #include "wifi-direct-dbus.h"
54 wfd_manager_s *g_manager;
56 wfd_manager_s *wfd_get_manager()
61 static int _wfd_local_init_device(wfd_manager_s *manager)
63 __WDS_LOG_FUNC_ENTER__;
64 wfd_device_s *local = NULL;
68 WDS_LOGE("Invalid parameter");
73 local = (wfd_device_s*) g_try_malloc0(sizeof(wfd_device_s));
75 WDS_LOGE("Failed to allocate memory for local device [%s]", strerror(errno));
79 res = wfd_util_get_phone_name(local->dev_name);
81 WDS_LOGE("Failed to get phone name of local device. Use default device name");
82 g_strlcpy(local->dev_name, DEFAULT_DEVICE_NAME, DEV_NAME_LEN + 1);
84 WDS_LOGD("Local Device name [%s]", local->dev_name);
85 wfd_util_set_dev_name_notification();
87 res = wfd_util_get_local_dev_mac(local->dev_addr);
89 WDS_LOGE("Failed to get local device MAC address");
91 memcpy(local->intf_addr, local->dev_addr, MACADDR_LEN);
92 local->intf_addr[4] ^= 0x80;
93 WDS_LOGD("Local Interface MAC address [" MACSECSTR "]",
94 MAC2SECSTR(local->intf_addr));
96 local->config_methods = WFD_WPS_MODE_PBC | WFD_WPS_MODE_DISPLAY | WFD_WPS_MODE_KEYPAD;
97 local->wps_mode = WFD_WPS_MODE_PBC;
98 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
99 local->services = NULL;
100 local->service_count = 0;
101 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
102 /* TODO: initialize other local device datas */
103 manager->local = local;
105 __WDS_LOG_FUNC_EXIT__;
109 static int _wfd_local_deinit_device(wfd_manager_s *manager)
111 __WDS_LOG_FUNC_ENTER__;
114 WDS_LOGE("Invalid parameter");
118 wfd_util_unset_dev_name_notification();
120 /* TODO: free member of local device */
121 g_free(manager->local);
123 __WDS_LOG_FUNC_EXIT__;
127 int wfd_local_reset_data(wfd_manager_s *manager)
129 __WDS_LOG_FUNC_ENTER__;
130 wfd_device_s *local = NULL;
133 WDS_LOGE("Invalid parameter");
137 local = manager->local;
138 /* init local device data */
139 local->dev_role = WFD_DEV_ROLE_NONE;
140 local->wps_mode = WFD_WPS_MODE_PBC;
141 memset(local->go_dev_addr, 0x0, MACADDR_LEN);
142 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
143 memset(&(local->display), 0x0, sizeof(wfd_display_s));
144 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
145 memset(local->ip_addr, 0x0, IPADDR_LEN);
147 __WDS_LOG_FUNC_EXIT__;
151 int wfd_local_get_dev_name(char *dev_name)
153 __WDS_LOG_FUNC_ENTER__;
154 wfd_device_s *local = g_manager->local;
157 WDS_LOGE("Invalid parameter");
158 __WDS_LOG_FUNC_EXIT__;
162 g_strlcpy(dev_name, local->dev_name, DEV_NAME_LEN + 1);
163 WDS_LOGD("Local device name [%s]", dev_name);
165 __WDS_LOG_FUNC_EXIT__;
169 int wfd_local_set_dev_name(char *dev_name)
171 __WDS_LOG_FUNC_ENTER__;
172 wfd_device_s *local = g_manager->local;
175 WDS_LOGE("Invalid parameter");
176 __WDS_LOG_FUNC_EXIT__;
180 g_strlcpy(local->dev_name, dev_name, DEV_NAME_LEN + 1);
182 if (g_manager->state >= WIFI_DIRECT_STATE_ACTIVATED) {
183 wfd_oem_set_dev_name(g_manager->oem_ops, dev_name);
184 WDS_LOGD("Device name changed.");
186 WDS_LOGE("Device name can't changed: state is %d", g_manager->state);
189 __WDS_LOG_FUNC_EXIT__;
193 int wfd_local_get_dev_mac(char *dev_mac)
195 __WDS_LOG_FUNC_ENTER__;
196 wfd_device_s *local = g_manager->local;
199 WDS_LOGE("Invalid parameter");
200 __WDS_LOG_FUNC_EXIT__;
204 g_snprintf(dev_mac, MACSTR_LEN, MACSTR, MAC2STR(local->dev_addr));
205 WDS_SECLOGD("Local device MAC address [%s]", dev_mac);
207 __WDS_LOG_FUNC_EXIT__;
212 int wfd_local_get_intf_mac(unsigned char *intf_mac)
214 __WDS_LOG_FUNC_ENTER__;
215 wfd_device_s *local = g_manager->local;
218 WDS_LOGE("Invalid parameter");
219 __WDS_LOG_FUNC_EXIT__;
223 g_snprintf(intf_mac, MACSTR_LEN, MACSTR, MAC2STR(local->intf_addr));
224 WDS_SECLOGD("Local interface MAC address [%s]", intf_mac);
226 __WDS_LOG_FUNC_EXIT__;
231 int wfd_local_get_ip_addr(char *ip_str)
233 __WDS_LOG_FUNC_ENTER__;
234 wfd_device_s *local = g_manager->local;
237 WDS_LOGE("Invalid parameter");
238 __WDS_LOG_FUNC_EXIT__;
242 snprintf(ip_str, IPSTR_LEN, IPSTR, IP2STR(local->ip_addr));
243 WDS_SECLOGD("Local IP address [" IPSECSTR "]", IP2SECSTR(local->ip_addr));
245 __WDS_LOG_FUNC_EXIT__;
249 int wfd_local_get_supported_wps_mode(int *config_methods)
251 __WDS_LOG_FUNC_ENTER__;
252 wfd_device_s *local = g_manager->local;
254 if (!config_methods) {
255 WDS_LOGE("Invalid parameter");
256 __WDS_LOG_FUNC_EXIT__;
260 *config_methods = local->config_methods;
261 WDS_LOGD("Local config method [0x%x]", *config_methods);
263 __WDS_LOG_FUNC_EXIT__;
267 int wfd_local_get_wps_mode(int *wps_mode)
269 __WDS_LOG_FUNC_ENTER__;
270 wfd_device_s *local = g_manager->local;
273 WDS_LOGE("Invalid parameter");
274 __WDS_LOG_FUNC_EXIT__;
278 *wps_mode = local->wps_mode;
279 WDS_LOGD("Local wps mode [0x%x]", *wps_mode);
281 __WDS_LOG_FUNC_EXIT__;
286 int wfd_local_set_wps_mode(int wps_mode)
288 __WDS_LOG_FUNC_ENTER__;
289 wfd_device_s *local = g_manager->local;
292 WDS_LOGE("Invalid parameter");
293 __WDS_LOG_FUNC_EXIT__;
297 local->wps_mode = wps_mode;
298 WDS_LOGD("Local wps mode [0x%x]", wps_mode);
300 __WDS_LOG_FUNC_EXIT__;
305 int wfd_manager_get_go_intent(int *go_intent)
307 __WDS_LOG_FUNC_ENTER__;
309 WDS_LOGE("Invalid parameter");
310 __WDS_LOG_FUNC_EXIT__;
314 *go_intent = g_manager->go_intent;
315 WDS_LOGD("Local GO intent [%d]", *go_intent);
317 __WDS_LOG_FUNC_EXIT__;
321 int wfd_manager_set_go_intent(int go_intent)
323 __WDS_LOG_FUNC_ENTER__;
325 if (go_intent < 0 || go_intent > 15) {
326 WDS_LOGE("Invalid parameter");
327 __WDS_LOG_FUNC_EXIT__;
331 g_manager->go_intent = go_intent;
332 if (g_manager->state >= WIFI_DIRECT_STATE_ACTIVATED)
333 wfd_oem_set_go_intent(g_manager->oem_ops, go_intent);
335 __WDS_LOG_FUNC_EXIT__;
339 int wfd_manager_get_max_station(int *max_station)
341 __WDS_LOG_FUNC_ENTER__;
344 WDS_LOGE("Invalid parameter");
345 __WDS_LOG_FUNC_EXIT__;
349 *max_station = g_manager->max_station;
350 WDS_LOGD("Local max station[%d]", *max_station);
352 __WDS_LOG_FUNC_EXIT__;
356 int wfd_manager_set_max_station(int max_station)
358 __WDS_LOG_FUNC_ENTER__;
360 if (max_station < 1) {
361 WDS_LOGE("Invalid parameter");
362 __WDS_LOG_FUNC_EXIT__;
366 g_manager->max_station = max_station;
368 __WDS_LOG_FUNC_EXIT__;
372 int wfd_manager_get_autoconnection(int *autoconnection)
374 __WDS_LOG_FUNC_ENTER__;
375 if (!autoconnection) {
376 WDS_LOGE("Invalid parameter");
377 __WDS_LOG_FUNC_EXIT__;
381 *autoconnection = g_manager->autoconnection;
382 WDS_LOGD("Local autoconnection [%s]", *autoconnection ? "TRUE" : "FALSE");
384 __WDS_LOG_FUNC_EXIT__;
388 int wfd_manager_set_autoconnection(int autoconnection)
390 __WDS_LOG_FUNC_ENTER__;
391 if (autoconnection < 0) {
392 WDS_LOGE("Invalid parameter");
393 __WDS_LOG_FUNC_EXIT__;
397 g_manager->autoconnection = autoconnection;
399 __WDS_LOG_FUNC_EXIT__;
403 int wfd_manager_get_req_wps_mode(int *req_wps_mode)
405 __WDS_LOG_FUNC_ENTER__;
408 WDS_LOGE("Invalid parameter");
409 __WDS_LOG_FUNC_EXIT__;
413 *req_wps_mode = g_manager->req_wps_mode;
414 WDS_LOGD("Requested wps mode [0x%x]", *req_wps_mode);
416 __WDS_LOG_FUNC_EXIT__;
420 int wfd_manager_set_req_wps_mode(int req_wps_mode)
422 __WDS_LOG_FUNC_ENTER__;
423 wfd_device_s *local = g_manager->local;
425 if (req_wps_mode != WIFI_DIRECT_WPS_TYPE_PBC &&
426 req_wps_mode != WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY &&
427 req_wps_mode != WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD) {
428 WDS_LOGE("Invalid parameter");
429 __WDS_LOG_FUNC_EXIT__;
433 g_manager->req_wps_mode = req_wps_mode;
434 WDS_LOGD("Requested wps mode [0x%x]", req_wps_mode);
435 if (req_wps_mode == WFD_WPS_MODE_DISPLAY)
436 local->wps_mode = WFD_WPS_MODE_KEYPAD;
437 else if (req_wps_mode == WFD_WPS_MODE_KEYPAD)
438 local->wps_mode = WFD_WPS_MODE_DISPLAY;
440 local->wps_mode = req_wps_mode;
442 __WDS_LOG_FUNC_EXIT__;
446 int wfd_manager_local_config_set(wfd_manager_s *manager)
448 __WDS_LOG_FUNC_ENTER__;
449 wfd_device_s *local = NULL;
453 WDS_LOGE("Invalid parameter");
454 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
457 local = manager->local;
459 local->wps_mode = WFD_WPS_MODE_PBC;
460 WDS_LOGD("Device name set as %s", local->dev_name);
461 res = wfd_oem_set_dev_name(manager->oem_ops, local->dev_name);
463 WDS_LOGE("Failed to set device name");
464 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
467 local->pri_dev_type = DEFAULT_PRIMARY_DEVICE_TYPE;
468 local->sec_dev_type = DEFAULT_SECONDARY_DEVICE_TYPE;
469 res = wfd_oem_set_dev_type(manager->oem_ops, local->pri_dev_type, local->sec_dev_type);
471 WDS_LOGE("Failed to set device type");
472 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
475 res = wfd_oem_set_go_intent(manager->oem_ops, manager->go_intent);
477 WDS_LOGE("Failed to set go intent");
478 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
481 return WIFI_DIRECT_ERROR_NONE;
484 int wfd_manager_activate(wfd_manager_s *manager)
486 __WDS_LOG_FUNC_ENTER__;
491 WDS_LOGE("Invalid parameter");
492 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
495 if (manager->state > WIFI_DIRECT_STATE_ACTIVATING) {
496 WDS_LOGE("Already activated");
500 if (manager->state == WIFI_DIRECT_STATE_ACTIVATING) {
501 WDS_LOGE("In progress");
502 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
505 res = wfd_util_wifi_direct_activatable();
507 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
509 wfd_state_get(manager, &prev_state);
510 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATING);
511 #if defined(TIZEN_WLAN_CONCURRENT_ENABLE)
512 res = wfd_util_check_wifi_state();
514 WDS_LOGE("Failed to get wifi state");
515 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
516 } else if (res == 0) {
517 #endif /* TIZEN_WLAN_CONCURRENT_ENABLE */
518 res = wfd_oem_activate(manager->oem_ops, 0);
520 WDS_LOGE("Failed to activate");
521 wfd_state_set(manager, prev_state);
522 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
524 #if defined(TIZEN_WLAN_CONCURRENT_ENABLE)
526 res = wfd_oem_activate(manager->oem_ops, res);
528 WDS_LOGE("Failed to activate");
529 wfd_state_set(manager, prev_state);
530 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
533 #endif /* TIZEN_WLAN_CONCURRENT_ENABLE */
534 WDS_LOGE("Succeeded to activate");
536 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
537 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
539 wfd_manager_local_config_set(manager);
540 wfd_util_set_country();
541 #ifdef TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT
542 wfd_util_start_wifi_direct_popup();
543 #endif /* TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT */
545 res = wfd_util_get_local_dev_mac(manager->local->dev_addr);
547 WDS_LOGE("Failed to get local device MAC address");
549 memcpy(manager->local->intf_addr, manager->local->dev_addr, MACADDR_LEN);
550 manager->local->intf_addr[4] ^= 0x80;
551 WDS_LOGD("Local Interface MAC address [" MACSECSTR "]",
552 MAC2SECSTR(manager->local->intf_addr));
554 __WDS_LOG_FUNC_EXIT__;
555 return WIFI_DIRECT_ERROR_NONE;
558 int wfd_manager_deactivate(wfd_manager_s *manager)
560 __WDS_LOG_FUNC_ENTER__;
563 wfd_group_s *group = NULL;
566 WDS_LOGE("Invalid parameter");
567 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
570 wfd_state_get(manager, &prev_state);
571 wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATING);
573 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
574 res = wfd_oem_miracast_init(manager->oem_ops, false);
576 WDS_LOGE("Failed to initialize miracast");
577 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
579 group = (wfd_group_s*) manager->group;
580 if (group && group->pending == FALSE) {
581 res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
583 WDS_LOGE("Failed to destroy group before deactivation");
586 #if defined(TIZEN_WLAN_CONCURRENT_ENABLE) && defined(TIZEN_PROFILE_MOBILE)
587 res = wfd_util_check_wifi_state();
589 WDS_LOGE("Failed to get wifi state");
590 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
591 } else if (res == 0) {
592 #endif /* TIZEN_WLAN_CONCURRENT_ENABLE && TIZEN_PROFILE_MOBILE */
593 res = wfd_oem_deactivate(manager->oem_ops, 0);
595 WDS_LOGE("Failed to deactivate");
596 wfd_state_set(manager, prev_state);
597 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
599 #if defined(TIZEN_WLAN_CONCURRENT_ENABLE) && defined(TIZEN_PROFILE_MOBILE)
601 /* FIXME: We should do something to stop p2p feature of Driver */
602 res = wfd_oem_deactivate(manager->oem_ops, res);
604 WDS_LOGE("Failed to deactivate");
605 wfd_state_set(manager, prev_state);
606 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
608 WDS_LOGE("Do not need to deactivate Wi-Fi");
610 #endif /* TIZEN_WLAN_CONCURRENT_ENABLE && TIZEN_PROFILE_MOBILE */
611 WDS_LOGE("Succeeded to deactivate");
613 wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATED);
614 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATED);
616 manager->req_wps_mode = WFD_WPS_MODE_PBC;
618 wfd_destroy_group(manager);
619 wfd_destroy_session(manager);
620 wfd_peer_clear_all(manager);
621 wfd_local_reset_data(manager);
623 #ifdef TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT
624 wfd_util_stop_wifi_direct_popup();
625 #endif /* TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT */
626 __WDS_LOG_FUNC_EXIT__;
627 return WIFI_DIRECT_ERROR_NONE;
630 int wfd_manager_connect(wfd_manager_s *manager, unsigned char *peer_addr)
632 __WDS_LOG_FUNC_ENTER__;
633 wfd_session_s *session = NULL;
636 if (!manager || !peer_addr) {
637 WDS_LOGE("Invalid parameter");
638 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
641 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
642 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
643 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
644 __WDS_LOG_FUNC_EXIT__;
645 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
648 wfd_group_s *group = (wfd_group_s*) manager->group;
649 if (group && group->member_count >= manager->max_station) {
650 __WDS_LOG_FUNC_EXIT__;
651 return WIFI_DIRECT_ERROR_TOO_MANY_CLIENT;
654 session = (wfd_session_s*) manager->session;
655 if (session && session->type != SESSION_TYPE_INVITE) {
656 WDS_LOGE("Session already exist and it's not an invitation session");
657 __WDS_LOG_FUNC_EXIT__;
658 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
662 session = wfd_create_session(manager, peer_addr,
663 manager->req_wps_mode, SESSION_DIRECTION_OUTGOING);
665 WDS_LOGE("Failed to create new session");
666 __WDS_LOG_FUNC_EXIT__;
667 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
671 if (manager->local->dev_role == WFD_DEV_ROLE_GO &&
672 session->type != SESSION_TYPE_INVITE) {
673 session->type = SESSION_TYPE_INVITE;
674 res = wfd_session_invite(session);
676 res = wfd_session_start(session);
679 WDS_LOGE("Failed to start session");
680 wfd_destroy_session(manager);
681 __WDS_LOG_FUNC_EXIT__;
682 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
684 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
686 __WDS_LOG_FUNC_EXIT__;
687 return WIFI_DIRECT_ERROR_NONE;
690 int wfd_manager_accept_connection(wfd_manager_s *manager, unsigned char *peer_addr)
692 __WDS_LOG_FUNC_ENTER__;
693 wfd_session_s *session = NULL;
694 wfd_device_s *peer = NULL;
697 if (!manager || !peer_addr) {
698 WDS_LOGE("Invalid parameter");
699 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
702 session = (wfd_session_s*) manager->session;
704 WDS_LOGE("Session not found");
705 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
708 peer = wfd_peer_find_by_dev_addr(manager, peer_addr);
710 WDS_LOGE("Peer is NULL");
711 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
714 if (memcmp(session->peer->dev_addr, peer_addr, MACADDR_LEN) != 0) {
715 WDS_LOGE("Peer and ongoing session peer are different");
716 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
719 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
720 WDS_LOGD("My device is GO and peer want to join my group, so WPS will be started");
721 res = wfd_session_wps(session);
722 } else if (peer->dev_role == WFD_DEV_ROLE_GO) {
723 WDS_LOGD("Peer device is GO, so Prov_Disc or Join will be started");
724 if (session->type == SESSION_TYPE_INVITE) {
725 if (session->state == SESSION_STATE_CREATED) {
726 WDS_LOGD("Invitation session. PD will be started");
727 res = wfd_session_start(session);
729 WDS_LOGD("Invitation session. Join will be started");
730 res = wfd_session_join(session);
733 if (manager->autoconnection && (manager->auto_pin[0] != 0))
734 g_strlcpy(session->wps_pin, manager->auto_pin, PINSTR_LEN + 1);
736 WDS_LOGD("Peer device is GO, so WPS will be started");
737 res = wfd_session_connect(session);
740 /* We should wait GO_NEGO_REQ from peer(MO) in autoconnection mode. */
741 /* Otherwise, GO Nego is sometimes failed. */
742 if (manager->autoconnection == FALSE) {
743 WDS_LOGD("My device is Device, so Negotiation will be started");
744 res = wfd_session_connect(session);
748 WDS_LOGE("Failed to start session");
749 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
750 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
751 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
753 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
754 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
756 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
758 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
760 __WDS_LOG_FUNC_EXIT__;
761 return WIFI_DIRECT_ERROR_NONE;
765 int wfd_manager_cancel_connection(wfd_manager_s *manager, unsigned char *peer_addr)
767 __WDS_LOG_FUNC_ENTER__;
768 wfd_group_s *group = NULL;
771 if (!manager || !peer_addr) {
772 WDS_LOGE("Invalid parameter");
773 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
776 if (!manager->session && manager->state != WIFI_DIRECT_STATE_CONNECTING) {
777 WDS_LOGE("It's not CONNECTING state");
778 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
781 res = wfd_session_cancel(manager->session, peer_addr);
783 WDS_LOGE("Failed to cancel session");
784 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
787 group = (wfd_group_s*) manager->group;
789 wfd_group_remove_member(group, peer_addr);
791 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
792 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
793 if (group && group->member_count)
794 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
796 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
797 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
800 __WDS_LOG_FUNC_EXIT__;
801 return WIFI_DIRECT_ERROR_NONE;
805 int wfd_manager_reject_connection(wfd_manager_s *manager, unsigned char *peer_addr)
807 __WDS_LOG_FUNC_ENTER__;
808 wfd_session_s *session = NULL;
811 if (!manager || !peer_addr) {
812 WDS_LOGE("Invalid parameter");
813 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
816 session = (wfd_session_s*) manager->session;
818 WDS_LOGE("Session not found");
819 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
822 if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
823 WDS_LOGE("It's not permitted with this state [%d]", manager->state);
824 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
827 if (session->direction != SESSION_DIRECTION_INCOMING) {
828 WDS_LOGE("Only incomming session can be rejected");
829 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
832 res = wfd_session_reject(session, peer_addr);
834 WDS_LOGE("Failed to reject connection");
835 /* TODO: check whether set state and break */
837 wfd_destroy_session(manager);
839 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
840 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
841 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
843 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
844 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
847 __WDS_LOG_FUNC_EXIT__;
848 return WIFI_DIRECT_ERROR_NONE;
852 int wfd_manager_disconnect(wfd_manager_s *manager, unsigned char *peer_addr)
854 __WDS_LOG_FUNC_ENTER__;
855 wfd_group_s *group = NULL;
856 wfd_device_s *peer = NULL;
860 WDS_LOGE("Invalid parameter");
861 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
865 WDS_LOGE("Invalid parameter");
866 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
869 group = (wfd_group_s*) manager->group;
871 WDS_LOGE("Group not found");
872 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
875 peer = wfd_group_find_member_by_addr(group, peer_addr);
877 WDS_LOGE("Connected peer not found");
878 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
881 wfd_state_set(manager, WIFI_DIRECT_STATE_DISCONNECTING);
883 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
885 res = wfd_oem_disconnect(manager->oem_ops, peer->dev_addr, 0);
887 res = wfd_oem_disconnect(manager->oem_ops, peer->intf_addr, 1);
889 res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
893 WDS_LOGE("Failed to disconnect peer");
894 res = WIFI_DIRECT_ERROR_OPERATION_FAILED;
897 WDS_LOGE("Succeeded to disconnect peer");
899 wfd_group_remove_member(group, peer_addr);
900 if (!group->member_count) {
901 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
902 wfd_destroy_group(manager);
905 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
906 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
907 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
909 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
910 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
913 __WDS_LOG_FUNC_EXIT__;
914 return WIFI_DIRECT_ERROR_NONE;
917 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
918 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
919 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
921 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
922 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
925 __WDS_LOG_FUNC_EXIT__;
929 int wfd_manager_disconnect_all(wfd_manager_s *manager)
931 __WDS_LOG_FUNC_ENTER__;
932 wfd_group_s *group = NULL;
936 WDS_LOGE("Invalid parameter");
937 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
940 group = (wfd_group_s*) manager->group;
942 WDS_LOGE("Group not found");
943 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
946 wfd_state_set(manager, WIFI_DIRECT_STATE_DISCONNECTING);
948 res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
950 WDS_LOGE("Failed to destroy group");
951 res = WIFI_DIRECT_ERROR_OPERATION_FAILED;
954 WDS_LOGE("Succeeded to disconnect all peer");
956 wfd_destroy_group(manager);
958 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
959 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
961 __WDS_LOG_FUNC_EXIT__;
962 return WIFI_DIRECT_ERROR_NONE;
965 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
966 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
967 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
969 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
970 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
973 __WDS_LOG_FUNC_EXIT__;
977 int wfd_manager_get_peer_info(wfd_manager_s *manager, unsigned char *addr, wfd_discovery_entry_s **peer)
979 __WDS_LOG_FUNC_ENTER__;
980 wfd_device_s *peer_dev = NULL;
981 wfd_discovery_entry_s *peer_info;
982 wfd_oem_device_s *oem_dev = NULL;
985 if (!manager || !addr) {
986 WDS_LOGE("Invalid parameter");
990 unsigned long time = 0;
991 #if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
992 wfd_util_get_current_time(&time);
995 gettimeofday(&tval, NULL);
998 WDS_LOGI("Current time [%ld]", time);
1000 res = wfd_oem_get_peer_info(manager->oem_ops, addr, &oem_dev);
1001 if (res < 0 || !oem_dev) {
1002 WDS_LOGE("Failed to get peer information");
1006 peer_dev = wfd_peer_find_by_addr(manager, addr);
1008 peer_dev = (wfd_device_s*) g_try_malloc0(sizeof(wfd_device_s));
1010 WDS_LOGE("Failed to allocate memory for peer device. [%s]", strerror(errno));
1014 memcpy(peer_dev->dev_addr, addr, MACADDR_LEN);
1015 manager->peers = g_list_prepend(manager->peers, peer_dev);
1016 manager->peer_count++;
1017 peer_dev->time = time;
1018 WDS_LOGD("peer_count[%d]", manager->peer_count);
1020 if (oem_dev->age > 30 && peer_dev->state == WFD_PEER_STATE_DISCOVERED) {
1021 WDS_LOGE("Too old age to update peer");
1027 g_strlcpy(peer_dev->dev_name, oem_dev->dev_name, DEV_NAME_LEN + 1);
1028 memcpy(peer_dev->intf_addr, oem_dev->intf_addr, MACADDR_LEN);
1029 memcpy(peer_dev->go_dev_addr, oem_dev->go_dev_addr, MACADDR_LEN);
1030 peer_dev->dev_role = oem_dev->dev_role;
1031 peer_dev->config_methods = oem_dev->config_methods;
1032 peer_dev->pri_dev_type = oem_dev->pri_dev_type;
1033 peer_dev->sec_dev_type = oem_dev->sec_dev_type;
1034 peer_dev->dev_flags = oem_dev->dev_flags;
1035 peer_dev->group_flags = oem_dev->group_flags;
1036 peer_dev->wps_mode = oem_dev->wps_mode;
1038 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
1039 memcpy(&(peer_dev->display), &(oem_dev->display), sizeof(wfd_display_s));
1040 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
1042 peer_dev->time = time;
1043 peer_dev->channel = oem_dev->channel;
1047 peer_info = (wfd_discovery_entry_s*) g_try_malloc0(sizeof(wfd_discovery_entry_s));
1049 WDS_LOGE("Failed to allocate memory for peer data. [%s]", strerror(errno));
1053 g_strlcpy(peer_info->device_name, peer_dev->dev_name, DEV_NAME_LEN + 1);
1054 memcpy(peer_info->mac_address, peer_dev->dev_addr, MACADDR_LEN);
1055 memcpy(peer_info->intf_address, peer_dev->intf_addr, MACADDR_LEN);
1056 peer_info->channel = peer_dev->channel;
1057 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1058 peer_info->services = 0;
1059 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1060 peer_info->is_group_owner = peer_dev->dev_role == WFD_DEV_ROLE_GO;
1061 peer_info->is_persistent_go = peer_dev->group_flags & WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
1062 peer_info->is_connected = peer_dev->dev_role == WFD_DEV_ROLE_GC;
1063 peer_info->wps_device_pwd_id = 0;
1064 peer_info->wps_cfg_methods = peer_dev->config_methods;
1065 peer_info->category = peer_dev->pri_dev_type;
1066 peer_info->subcategory = peer_dev->sec_dev_type;
1068 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
1069 if (peer_dev->display.availability && peer_dev->display.port)
1070 peer_info->is_wfd_device = 1;
1071 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
1075 __WDS_LOG_FUNC_EXIT__;
1080 int wfd_manager_get_peers(wfd_manager_s *manager, wfd_discovery_entry_s **peers_data)
1082 __WDS_LOG_FUNC_ENTER__;
1084 wfd_device_s *peer = NULL;
1085 wfd_discovery_entry_s *peers = NULL;
1090 if (!manager || !peers_data) {
1091 WDS_LOGE("Invalid parameter");
1095 unsigned long time = 0;
1096 #if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
1097 wfd_util_get_current_time(&time);
1099 struct timeval tval;
1100 gettimeofday(&tval, NULL);
1103 WDS_LOGI("Current time [%ld]", time);
1105 peer_count = manager->peer_count;
1106 WDS_LOGI("peer count [%ld]", peer_count);
1109 else if (peer_count == 0)
1113 peers = (wfd_discovery_entry_s*) g_try_malloc0_n(peer_count, sizeof(wfd_discovery_entry_s));
1115 WDS_LOGE("Failed to allocate memory for peer data. [%s]", strerror(errno));
1119 temp = g_list_first(manager->peers);
1120 while (temp && count < peer_count) {
1124 if (peer->time + 8 < time) {
1125 WDS_LOGD("Device data is too old to report to application [%s]", peer->dev_name);
1126 res = wfd_update_peer(manager, peer);
1128 WDS_LOGE("This device is disappeared [%s]", peer->dev_name);
1129 temp = g_list_next(temp);
1130 manager->peers = g_list_remove(manager->peers, peer);
1131 manager->peer_count--;
1138 g_strlcpy(peers[count].device_name, peer->dev_name, DEV_NAME_LEN + 1);
1139 memcpy(peers[count].mac_address, peer->dev_addr, MACADDR_LEN);
1140 memcpy(peers[count].intf_address, peer->intf_addr, MACADDR_LEN);
1141 peers[count].channel = peer->channel;
1142 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1143 peers[count].services = 0;
1144 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1145 peers[count].is_group_owner = peer->dev_role == WFD_DEV_ROLE_GO;
1146 peers[count].is_persistent_go = peer->group_flags & WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
1147 peers[count].is_connected = peer->dev_role == WFD_DEV_ROLE_GC;
1148 peers[count].wps_device_pwd_id = 0;
1149 peers[count].wps_cfg_methods = peer->config_methods;
1150 peers[count].category = peer->pri_dev_type;
1151 peers[count].subcategory = peer->sec_dev_type;
1153 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
1154 if (peer->display.availability && peer->display.port)
1155 peers[count].is_wfd_device = 1;
1156 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
1158 WDS_LOGD("%dth peer [%s]", count, peer->dev_name);
1160 temp = g_list_next(temp);
1163 WDS_LOGD("%d peers converted", count);
1164 WDS_LOGD("Final peer count is %d", manager->peer_count);
1166 *peers_data = peers;
1168 __WDS_LOG_FUNC_EXIT__;
1172 int wfd_manager_get_connected_peers(wfd_manager_s *manager, wfd_connected_peer_info_s **peers_data)
1174 __WDS_LOG_FUNC_ENTER__;
1175 wfd_connected_peer_info_s *peers = NULL;
1176 wfd_group_s *group = NULL;
1177 wfd_device_s *peer = NULL;
1182 if (!manager || !peers_data) {
1183 WDS_LOGE("Invalid parameter");
1187 group = manager->group;
1189 WDS_LOGE("Group not exist");
1193 peer_count = group->member_count;
1194 if (peer_count == 0) {
1195 WDS_LOGD("Member not exist");
1200 peers = (wfd_connected_peer_info_s*) g_try_malloc0_n(peer_count, sizeof(wfd_connected_peer_info_s));
1202 WDS_LOGE("Failed to allocate memory for connected peer data. [%s]", strerror(errno));
1206 temp = g_list_first(group->members);
1207 while (temp && count < group->member_count) {
1210 g_strlcpy(peers[count].device_name, peer->dev_name, DEV_NAME_LEN + 1);
1211 memcpy(peers[count].mac_address, peer->dev_addr, MACADDR_LEN);
1212 memcpy(peers[count].intf_address, peer->intf_addr, MACADDR_LEN);
1213 memcpy(peers[count].ip_address, peer->ip_addr, IPADDR_LEN);
1214 peers[count].category = peer->pri_dev_type;
1215 peers[count].subcategory = peer->sec_dev_type;
1216 peers[count].channel = peer->channel;
1217 peers[count].is_p2p = peer->is_p2p;
1218 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1219 peers[count].services = 0;
1220 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1222 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
1223 if (peer->display.availability && peer->display.port)
1224 peers[count].is_wfd_device = 1;
1226 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
1228 WDS_LOGD("%dth member converted[%s]", count, peers[count].device_name);
1231 temp = g_list_next(temp);
1234 WDS_LOGD("%d members converted", count);
1236 *peers_data = peers;
1238 __WDS_LOG_FUNC_EXIT__;
1243 wfd_device_s *wfd_manager_find_connected_peer(wfd_manager_s *manager, unsigned char *peer_addr)
1245 __WDS_LOG_FUNC_ENTER__;
1246 wfd_device_s *peer = NULL;
1248 if (!manager || !peer_addr) {
1249 WDS_LOGE("Invalid parameter");
1253 peer = wfd_group_find_member_by_addr(manager->group, peer_addr);
1255 __WDS_LOG_FUNC_EXIT__;
1260 int wfd_manager_get_goup_ifname(char **ifname)
1262 __WDS_LOG_FUNC_ENTER__;
1263 wfd_group_s *group = g_manager->group;
1266 WDS_LOGE("Invalid parameter");
1267 __WDS_LOG_FUNC_EXIT__;
1272 WDS_LOGE("Group not exist");
1276 *ifname = group->ifname;
1278 __WDS_LOG_FUNC_EXIT__;
1282 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
1283 int wfd_manager_set_display_device(int type, int port, int hdcp)
1285 __WDS_LOG_FUNC_ENTER__;
1286 wfd_device_s * device = g_manager->local;
1287 wfd_oem_display_s display;
1291 WDS_LOGE("Invalid parameter");
1292 __WDS_LOG_FUNC_EXIT__;
1296 memset(&display, 0x0, sizeof(wfd_oem_display_s));
1298 display.type = type;
1299 display.port = port;
1300 display.hdcp_support = hdcp;
1302 display.availability = device->display.availability;
1303 display.max_tput = device->display.max_tput;
1305 res = wfd_oem_set_display(g_manager->oem_ops, (wfd_oem_display_s*)&display);
1307 WDS_LOGE("Failed to set wifi display");
1311 device->display.type = type;
1312 device->display.port = port;
1313 device->display.hdcp_support = hdcp;
1315 __WDS_LOG_FUNC_EXIT__;
1319 int wfd_manager_set_session_availability(int availability)
1321 __WDS_LOG_FUNC_ENTER__;
1322 wfd_device_s * device = g_manager->local;
1323 wfd_oem_display_s display;
1327 WDS_LOGE("Invalid parameter");
1328 __WDS_LOG_FUNC_EXIT__;
1332 memset(&display, 0x0, sizeof(wfd_oem_display_s));
1334 display.availability = availability;
1336 display.type = device->display.type;
1337 display.hdcp_support = device->display.hdcp_support;
1338 display.port = device->display.port;
1339 display.max_tput = device->display.max_tput;
1341 res = wfd_oem_set_display(g_manager->oem_ops, (wfd_oem_display_s*)&display);
1343 WDS_LOGE("Failed to set wifi display session availability");
1347 device->display.availability = availability;
1349 __WDS_LOG_FUNC_EXIT__;
1353 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
1355 int wfd_manager_start_discovery(wfd_manager_s *manager, int mode, int timeout,
1356 const char* type, int channel)
1358 __WDS_LOG_FUNC_ENTER__;
1359 int res = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1360 wfd_oem_scan_param_s param;
1361 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
1363 WDS_LOGI("Mode: [%d], Timeout: [%d], type: [%s]", mode, timeout, type, channel);
1365 if (manager->local->dev_role == WFD_DEV_ROLE_GO)
1366 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
1368 if (channel == WFD_DISCOVERY_FULL_SCAN) {
1369 param.scan_type = WFD_OEM_SCAN_TYPE_FULL;
1370 } else if (channel == WFD_DISCOVERY_SOCIAL_CHANNEL) {
1371 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
1372 } else if (channel == WFD_DISCOVERY_CHANNEL1) {
1373 param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL1;
1375 } else if (channel == WFD_DISCOVERY_CHANNEL6) {
1376 param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL6;
1378 } else if (channel == WFD_DISCOVERY_CHANNEL11) {
1379 param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL11;
1382 param.scan_type = WFD_OEM_SCAN_TYPE_SPECIFIC;
1383 param.freq = wfd_util_channel_to_freq(channel);
1387 param.scan_mode = WFD_OEM_SCAN_MODE_PASSIVE;
1389 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
1391 param.scan_time = timeout;
1393 res = wfd_oem_start_scan(manager->oem_ops, ¶m);
1395 WDS_LOGE("Failed to start scan");
1396 __WDS_LOG_FUNC_EXIT__;
1397 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1401 manager->scan_mode = WFD_SCAN_MODE_PASSIVE;
1403 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
1405 if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
1406 wfd_state_set(manager, WIFI_DIRECT_STATE_DISCOVERING);
1407 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DISCOVERING);
1410 WDS_LOGD("Succeeded to start scan");
1411 __WDS_LOG_FUNC_EXIT__;
1412 return WIFI_DIRECT_ERROR_NONE;
1415 int wfd_manager_cancel_discovery(wfd_manager_s *manager)
1417 __WDS_LOG_FUNC_ENTER__;
1420 res = wfd_oem_stop_scan(manager->oem_ops);
1422 WDS_LOGE("Failed to stop scan");
1423 __WDS_LOG_FUNC_EXIT__;
1424 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1427 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1428 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1429 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1431 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1432 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1435 WDS_LOGD("Succeeded to stop scan");
1436 __WDS_LOG_FUNC_EXIT__;
1437 return WIFI_DIRECT_ERROR_NONE;
1440 wfd_device_s *wfd_manager_get_peer_by_addr(wfd_manager_s *manager, unsigned char *peer_addr)
1442 __WDS_LOG_FUNC_ENTER__;
1443 wfd_device_s *peer = NULL;
1445 peer = wfd_group_find_member_by_addr(manager->group, peer_addr);
1450 peer = wfd_peer_find_by_addr(manager, peer_addr);
1452 __WDS_LOG_FUNC_EXIT__;
1456 static wfd_manager_s *wfd_manager_init()
1458 __WDS_LOG_FUNC_ENTER__;
1459 wfd_manager_s *manager = NULL;
1462 manager = (wfd_manager_s*) g_try_malloc0(sizeof(wfd_manager_s));
1464 WDS_LOGE("Failed to allocate memory for wfd_manager structure");
1468 manager->go_intent = 7;
1469 manager->req_wps_mode = WFD_WPS_MODE_PBC;
1470 manager->max_station = 8;
1471 manager->session_timer = 120;
1472 manager->auto_group_remove_enable = TRUE;
1473 res = _wfd_local_init_device(manager);
1475 WDS_LOGE("Failed to initialize local device");
1477 return NULL; /* really stop manager? */
1479 WDS_LOGD("Succeeded to initialize local device");
1481 __WDS_LOG_FUNC_EXIT__;
1485 int wfd_manager_deinit(wfd_manager_s *manager)
1487 __WDS_LOG_FUNC_ENTER__;
1490 WDS_LOGE("Invalid parameter");
1491 __WDS_LOG_FUNC_EXIT__;
1495 _wfd_local_deinit_device(manager);
1499 __WDS_LOG_FUNC_EXIT__;
1503 static void *wfd_plugin_init(wfd_manager_s *manager)
1505 __WDS_LOG_FUNC_ENTER__;
1507 struct utsname kernel_info;
1511 WDS_LOGE("Invalid parameter");
1512 __WDS_LOG_FUNC_EXIT__;
1516 res = uname(&kernel_info);
1518 WDS_LOGE("Failed to detect target type");
1519 __WDS_LOG_FUNC_EXIT__;
1522 WDS_LOGD("Node name [%s], HW ID [%s]", kernel_info.nodename, kernel_info.machine);
1526 #if defined(TIZEN_ARCH_64)
1527 handle = dlopen(SUPPL_PLUGIN_64BIT_PATH, RTLD_NOW);
1529 handle = dlopen(SUPPL_PLUGIN_PATH, RTLD_NOW);
1532 WDS_LOGE("Failed to open shared object. [%s]", dlerror());
1533 __WDS_LOG_FUNC_EXIT__;
1538 int (*plugin_load)(wfd_oem_ops_s **ops) = NULL;
1539 plugin_load = (int (*)(wfd_oem_ops_s **ops)) dlsym(handle, "wfd_plugin_load");
1541 WDS_LOGE("Failed to load symbol. Error = [%s]", strerror(errno));
1543 __WDS_LOG_FUNC_EXIT__;
1547 wfd_oem_ops_s *temp_ops;
1548 (*plugin_load)(&temp_ops);
1549 manager->oem_ops = temp_ops;
1551 res = wfd_oem_init(temp_ops, (wfd_oem_event_cb) wfd_process_event, manager);
1553 WDS_LOGE("Failed to initialize OEM");
1555 __WDS_LOG_FUNC_EXIT__;
1558 WDS_LOGD("Succeeded to initialize OEM");
1560 __WDS_LOG_FUNC_EXIT__;
1564 static int wfd_plugin_deinit(wfd_manager_s *manager)
1566 __WDS_LOG_FUNC_ENTER__;
1568 if (!manager || !manager->plugin_handle) {
1569 WDS_LOGE("Invalid parameter");
1570 __WDS_LOG_FUNC_EXIT__;
1574 dlclose(manager->plugin_handle);
1575 manager->plugin_handle = NULL;
1577 __WDS_LOG_FUNC_EXIT__;
1581 int main(int argc, char *argv[])
1583 __WDS_LOG_FUNC_ENTER__;
1584 GMainLoop *main_loop = NULL;
1586 #if !GLIB_CHECK_VERSION(2, 32, 0)
1587 if (!g_thread_supported())
1588 g_thread_init(NULL);
1591 #if !GLIB_CHECK_VERSION(2, 36, 0)
1595 /* TODO: Parsing argument */
1596 /* Wi-Fi direct connection for S-Beam can be optimized using argument */
1599 * wfd-manager initialization
1601 g_manager = wfd_manager_init();
1603 WDS_LOGE("Failed to initialize wifi-direct manager");
1604 __WDS_LOG_FUNC_EXIT__;
1607 WDS_LOGD("Succeeded to initialize manager");
1610 * wfd_manager_plugin initialization
1612 g_manager->plugin_handle = wfd_plugin_init(g_manager);
1613 if (!g_manager->plugin_handle) {
1614 WDS_LOGE("Failed to initialize plugin");
1615 wfd_manager_deinit(g_manager);
1616 __WDS_LOG_FUNC_EXIT__;
1619 WDS_LOGD("Succeeded to load plugin");
1621 if (!wfd_manager_dbus_init()) {
1622 WDS_LOGE("Failed to DBus");
1623 wfd_plugin_deinit(g_manager);
1624 wfd_manager_deinit(g_manager);
1625 __WDS_LOG_FUNC_EXIT__;
1629 main_loop = g_main_loop_new(NULL, FALSE);
1630 if (main_loop == NULL) {
1631 WDS_LOGE("Failed to create GMainLoop structure");
1632 __WDS_LOG_FUNC_EXIT__;
1635 g_manager->main_loop = main_loop;
1636 g_main_loop_run(main_loop);
1638 wfd_manager_dbus_unregister();
1639 wfd_manager_dbus_deinit();
1641 wfd_plugin_deinit(g_manager);
1642 wfd_manager_deinit(g_manager);
1644 __WDS_LOG_FUNC_EXIT__;