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 #if defined TIZEN_ENABLE_PRD
55 #include "wifi-direct-prd.h"
56 #endif /* TIZEN_ENABLE_PRD */
58 wfd_manager_s *g_manager;
60 wfd_manager_s *wfd_get_manager()
65 #ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
66 /* Stop wfd-manager services, If no client
67 exists and state is deactivated. */
68 static gboolean _wfd_exit_timeout_cb(void *user_data)
70 __WDS_LOG_FUNC_ENTER__;
71 wfd_manager_s *manager = (wfd_manager_s*) user_data;
74 WDS_LOGE("Invalid parameter");
78 if (manager->client_count > 0) {
79 WDS_LOGD("Client count [%d]", manager->client_count);
83 if (manager->state == WIFI_DIRECT_STATE_DEACTIVATED) {
84 WDS_LOGD("Terminate Wi-Fi Direct Manager");
85 g_main_quit(manager->main_loop);
86 manager->exit_timer = 0;
87 WDS_LOGD("Stop exit timer. State [%d]", manager->state);
88 __WDS_LOG_FUNC_EXIT__;
92 __WDS_LOG_FUNC_EXIT__;
96 void wfd_manager_free_active_client_list(void)
99 wfd_manager_s *manager = wfd_get_manager();
101 if (!manager || !manager->client_list)
104 for (list = manager->client_list; list; list = list->next)
107 g_slist_free(manager->client_list);
110 void wfd_manager_add_active_client(const char *client_id)
113 gboolean if_exists = FALSE;
115 wfd_manager_s *manager = wfd_get_manager();
116 if (!manager || !client_id)
119 for (list = manager->client_list; list; list = list->next) {
121 if (str && !g_strcmp0(client_id, str)) {
127 // If not exists in list, add the sender
128 if (if_exists == FALSE) {
129 manager->client_list = g_slist_prepend(manager->client_list,
130 g_strdup(client_id));
131 manager->client_count++;
132 WDS_LOGD("Added DBus sender id[%s] count[%d]", client_id,
133 manager->client_count);
137 void wfd_manager_remove_active_client(const gchar *name,
138 const char *old_owner,
139 const char *new_owner)
143 wfd_manager_s *manager = wfd_get_manager();
148 if (!g_strcmp0(new_owner, "")) {
149 if (manager->client_count > 0) {
150 for (list = manager->client_list; list; list = list->next) {
152 if (str && !g_strcmp0(old_owner, str)) {
153 manager->client_list =
154 g_slist_remove(manager->client_list, str);
156 manager->client_count--;
157 WDS_LOGD("Removed name[%s] old[%s] new[%s] count[%d]",
158 name, old_owner, new_owner, manager->client_count);
165 #endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
167 static int _wfd_local_init_device(wfd_manager_s *manager)
169 __WDS_LOG_FUNC_ENTER__;
170 wfd_device_s *local = NULL;
172 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
175 WDS_LOGE("Invalid parameter");
180 local = (wfd_device_s*) g_try_malloc0(sizeof(wfd_device_s));
182 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
183 WDS_LOGE("Failed to allocate memory for local device [%s]", error_buf);
187 res = wfd_util_get_phone_name(local->dev_name);
189 WDS_LOGE("Failed to get phone name of local device. Use default device name");
190 g_strlcpy(local->dev_name, DEFAULT_DEVICE_NAME, DEV_NAME_LEN + 1);
192 WDS_LOGD("Local Device name [%s]", local->dev_name);
193 wfd_util_set_dev_name_notification();
195 res = wfd_util_get_local_dev_mac(local->dev_addr);
197 WDS_LOGE("Failed to get local device MAC address");
199 memcpy(local->intf_addr, local->dev_addr, MACADDR_LEN);
200 local->intf_addr[4] ^= 0x80;
201 WDS_LOGD("Local Interface MAC address [" MACSECSTR "]",
202 MAC2SECSTR(local->intf_addr));
204 local->config_methods = WFD_WPS_MODE_PBC | WFD_WPS_MODE_DISPLAY | WFD_WPS_MODE_KEYPAD;
205 local->wps_mode = WFD_WPS_MODE_PBC;
206 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
207 local->services = NULL;
208 local->service_count = 0;
209 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
210 /* TODO: initialize other local device datas */
211 manager->local = local;
213 __WDS_LOG_FUNC_EXIT__;
217 static int _wfd_local_deinit_device(wfd_manager_s *manager)
219 __WDS_LOG_FUNC_ENTER__;
222 WDS_LOGE("Invalid parameter");
226 wfd_util_unset_dev_name_notification();
228 /* TODO: free member of local device */
229 g_free(manager->local);
231 __WDS_LOG_FUNC_EXIT__;
235 int wfd_local_reset_data(wfd_manager_s *manager)
237 __WDS_LOG_FUNC_ENTER__;
238 wfd_device_s *local = NULL;
241 WDS_LOGE("Invalid parameter");
245 local = manager->local;
246 /* init local device data */
247 local->dev_role = WFD_DEV_ROLE_NONE;
248 local->wps_mode = WFD_WPS_MODE_PBC;
249 memset(local->go_dev_addr, 0x0, MACADDR_LEN);
250 if (manager->is_wifi_display_supported)
251 memset(&(local->display), 0x0, sizeof(wfd_display_s));
252 memset(local->ip_addr, 0x0, IPADDR_LEN);
254 __WDS_LOG_FUNC_EXIT__;
258 int wfd_local_get_dev_name(char *dev_name)
260 __WDS_LOG_FUNC_ENTER__;
261 wfd_device_s *local = g_manager->local;
264 WDS_LOGE("Invalid parameter");
265 __WDS_LOG_FUNC_EXIT__;
269 g_strlcpy(dev_name, local->dev_name, DEV_NAME_LEN + 1);
270 WDS_LOGD("Local device name [%s]", dev_name);
272 __WDS_LOG_FUNC_EXIT__;
276 int wfd_local_set_dev_name(char *dev_name)
278 __WDS_LOG_FUNC_ENTER__;
279 wfd_device_s *local = g_manager->local;
282 WDS_LOGE("Invalid parameter");
283 __WDS_LOG_FUNC_EXIT__;
287 g_strlcpy(local->dev_name, dev_name, DEV_NAME_LEN + 1);
289 if (g_manager->state >= WIFI_DIRECT_STATE_ACTIVATED) {
290 wfd_oem_set_dev_name(g_manager->oem_ops, dev_name);
291 WDS_LOGD("Device name changed.");
293 WDS_LOGE("Device name can't changed: state is %d", g_manager->state);
296 __WDS_LOG_FUNC_EXIT__;
300 int wfd_local_get_dev_mac(char *dev_mac)
302 __WDS_LOG_FUNC_ENTER__;
303 wfd_device_s *local = g_manager->local;
306 WDS_LOGE("Invalid parameter");
307 __WDS_LOG_FUNC_EXIT__;
311 g_snprintf(dev_mac, MACSTR_LEN, MACSTR, MAC2STR(local->dev_addr));
312 WDS_SECLOGD("Local device MAC address [%s]", dev_mac);
314 __WDS_LOG_FUNC_EXIT__;
319 int wfd_local_get_intf_mac(unsigned char *intf_mac)
321 __WDS_LOG_FUNC_ENTER__;
322 wfd_device_s *local = g_manager->local;
325 WDS_LOGE("Invalid parameter");
326 __WDS_LOG_FUNC_EXIT__;
330 g_snprintf(intf_mac, MACSTR_LEN, MACSTR, MAC2STR(local->intf_addr));
331 WDS_SECLOGD("Local interface MAC address [%s]", intf_mac);
333 __WDS_LOG_FUNC_EXIT__;
338 int wfd_local_get_ip_addr(char *ip_str)
340 __WDS_LOG_FUNC_ENTER__;
341 wfd_device_s *local = g_manager->local;
344 WDS_LOGE("Invalid parameter");
345 __WDS_LOG_FUNC_EXIT__;
349 snprintf(ip_str, IPSTR_LEN, IPSTR, IP2STR(local->ip_addr));
350 WDS_SECLOGD("Local IP address [" IPSECSTR "]", IP2SECSTR(local->ip_addr));
352 __WDS_LOG_FUNC_EXIT__;
356 int wfd_local_get_supported_wps_mode(int *config_methods)
358 __WDS_LOG_FUNC_ENTER__;
359 wfd_device_s *local = g_manager->local;
361 if (!config_methods) {
362 WDS_LOGE("Invalid parameter");
363 __WDS_LOG_FUNC_EXIT__;
367 *config_methods = local->config_methods;
368 WDS_LOGD("Local config method [0x%x]", *config_methods);
370 __WDS_LOG_FUNC_EXIT__;
374 int wfd_local_get_wps_mode(int *wps_mode)
376 __WDS_LOG_FUNC_ENTER__;
377 wfd_device_s *local = g_manager->local;
380 WDS_LOGE("Invalid parameter");
381 __WDS_LOG_FUNC_EXIT__;
385 *wps_mode = local->wps_mode;
386 WDS_LOGD("Local wps mode [0x%x]", *wps_mode);
388 __WDS_LOG_FUNC_EXIT__;
393 int wfd_local_set_wps_mode(int wps_mode)
395 __WDS_LOG_FUNC_ENTER__;
396 wfd_device_s *local = g_manager->local;
399 WDS_LOGE("Invalid parameter");
400 __WDS_LOG_FUNC_EXIT__;
404 local->wps_mode = wps_mode;
405 WDS_LOGD("Local wps mode [0x%x]", wps_mode);
407 __WDS_LOG_FUNC_EXIT__;
412 int wfd_manager_get_go_intent(int *go_intent)
414 __WDS_LOG_FUNC_ENTER__;
416 WDS_LOGE("Invalid parameter");
417 __WDS_LOG_FUNC_EXIT__;
421 *go_intent = g_manager->go_intent;
422 WDS_LOGD("Local GO intent [%d]", *go_intent);
424 __WDS_LOG_FUNC_EXIT__;
428 int wfd_manager_set_go_intent(int go_intent)
430 __WDS_LOG_FUNC_ENTER__;
432 if (go_intent < 0 || go_intent > 15) {
433 WDS_LOGE("Invalid parameter");
434 __WDS_LOG_FUNC_EXIT__;
438 g_manager->go_intent = go_intent;
439 if (g_manager->state >= WIFI_DIRECT_STATE_ACTIVATED)
440 wfd_oem_set_go_intent(g_manager->oem_ops, go_intent);
442 __WDS_LOG_FUNC_EXIT__;
446 int wfd_manager_get_max_station(int *max_station)
448 __WDS_LOG_FUNC_ENTER__;
451 WDS_LOGE("Invalid parameter");
452 __WDS_LOG_FUNC_EXIT__;
456 *max_station = g_manager->max_station;
457 WDS_LOGD("Local max station[%d]", *max_station);
459 __WDS_LOG_FUNC_EXIT__;
463 int wfd_manager_set_max_station(int max_station)
465 __WDS_LOG_FUNC_ENTER__;
467 if (max_station < 1) {
468 WDS_LOGE("Invalid parameter");
469 __WDS_LOG_FUNC_EXIT__;
473 g_manager->max_station = max_station;
475 __WDS_LOG_FUNC_EXIT__;
479 int wfd_manager_get_autoconnection(int *autoconnection)
481 __WDS_LOG_FUNC_ENTER__;
482 if (!autoconnection) {
483 WDS_LOGE("Invalid parameter");
484 __WDS_LOG_FUNC_EXIT__;
488 *autoconnection = g_manager->autoconnection;
489 WDS_LOGD("Local autoconnection [%s]", *autoconnection ? "TRUE" : "FALSE");
491 __WDS_LOG_FUNC_EXIT__;
495 int wfd_manager_set_autoconnection(int autoconnection)
497 __WDS_LOG_FUNC_ENTER__;
498 if (autoconnection < 0) {
499 WDS_LOGE("Invalid parameter");
500 __WDS_LOG_FUNC_EXIT__;
504 g_manager->autoconnection = autoconnection;
506 __WDS_LOG_FUNC_EXIT__;
510 int wfd_manager_get_req_wps_mode(int *req_wps_mode)
512 __WDS_LOG_FUNC_ENTER__;
515 WDS_LOGE("Invalid parameter");
516 __WDS_LOG_FUNC_EXIT__;
520 *req_wps_mode = g_manager->req_wps_mode;
521 WDS_LOGD("Requested wps mode [0x%x]", *req_wps_mode);
523 __WDS_LOG_FUNC_EXIT__;
527 int wfd_manager_set_req_wps_mode(int req_wps_mode)
529 __WDS_LOG_FUNC_ENTER__;
530 wfd_device_s *local = g_manager->local;
532 if (req_wps_mode != WIFI_DIRECT_WPS_TYPE_PBC &&
533 req_wps_mode != WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY &&
534 req_wps_mode != WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD) {
535 WDS_LOGE("Invalid parameter");
536 __WDS_LOG_FUNC_EXIT__;
540 g_manager->req_wps_mode = req_wps_mode;
541 WDS_LOGD("Requested wps mode [0x%x]", req_wps_mode);
542 if (req_wps_mode == WFD_WPS_MODE_DISPLAY)
543 local->wps_mode = WFD_WPS_MODE_KEYPAD;
544 else if (req_wps_mode == WFD_WPS_MODE_KEYPAD)
545 local->wps_mode = WFD_WPS_MODE_DISPLAY;
547 local->wps_mode = req_wps_mode;
549 __WDS_LOG_FUNC_EXIT__;
553 int wfd_manager_local_config_set(wfd_manager_s *manager)
555 __WDS_LOG_FUNC_ENTER__;
556 wfd_device_s *local = NULL;
560 WDS_LOGE("Invalid parameter");
561 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
564 local = manager->local;
566 local->wps_mode = WFD_WPS_MODE_PBC;
567 WDS_LOGD("Device name set as %s", local->dev_name);
568 res = wfd_oem_set_dev_name(manager->oem_ops, local->dev_name);
570 WDS_LOGE("Failed to set device name");
571 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
574 local->pri_dev_type = DEFAULT_PRIMARY_DEVICE_TYPE;
575 local->sec_dev_type = DEFAULT_SECONDARY_DEVICE_TYPE;
576 res = wfd_oem_set_dev_type(manager->oem_ops, local->pri_dev_type, local->sec_dev_type);
578 WDS_LOGE("Failed to set device type");
579 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
582 res = wfd_oem_set_go_intent(manager->oem_ops, manager->go_intent);
584 WDS_LOGE("Failed to set go intent");
585 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
588 return WIFI_DIRECT_ERROR_NONE;
591 int wfd_manager_activate(wfd_manager_s *manager)
593 __WDS_LOG_FUNC_ENTER__;
598 WDS_LOGE("Invalid parameter");
599 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
602 if (manager->state > WIFI_DIRECT_STATE_ACTIVATING) {
603 WDS_LOGE("Already activated");
607 if (manager->state == WIFI_DIRECT_STATE_ACTIVATING) {
608 WDS_LOGE("In progress");
609 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
612 res = wfd_util_wifi_direct_activatable();
614 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
616 wfd_state_get(manager, &prev_state);
617 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATING);
618 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATING);
619 res = wfd_util_check_wifi_state();
621 WDS_LOGE("Failed to get wifi state");
622 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
623 } else if (res == 0) {
624 res = wfd_oem_activate(manager->oem_ops, 0);
626 WDS_LOGE("Failed to activate");
627 wfd_state_set(manager, prev_state);
628 wfd_util_set_wifi_direct_state(prev_state);
629 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
632 res = wfd_oem_activate(manager->oem_ops, res);
634 WDS_LOGE("Failed to activate");
635 wfd_state_set(manager, prev_state);
636 wfd_util_set_wifi_direct_state(prev_state);
637 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
640 WDS_LOGE("Succeeded to activate");
642 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
643 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
645 wfd_manager_local_config_set(manager);
646 wfd_util_set_country();
647 #ifdef TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT
648 wfd_util_start_wifi_direct_popup();
649 #endif /* TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT */
651 res = wfd_util_get_local_dev_mac(manager->local->dev_addr);
653 WDS_LOGE("Failed to get local device MAC address");
655 memcpy(manager->local->intf_addr, manager->local->dev_addr, MACADDR_LEN);
656 manager->local->intf_addr[4] ^= 0x80;
657 WDS_LOGD("Local Interface MAC address [" MACSECSTR "]",
658 MAC2SECSTR(manager->local->intf_addr));
660 __WDS_LOG_FUNC_EXIT__;
661 return WIFI_DIRECT_ERROR_NONE;
664 int wfd_manager_deactivate(wfd_manager_s *manager)
666 __WDS_LOG_FUNC_ENTER__;
669 wfd_group_s *group = NULL;
672 WDS_LOGE("Invalid parameter");
673 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
676 wfd_state_get(manager, &prev_state);
677 wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATING);
678 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATING);
680 if (manager->is_wifi_display_supported) {
681 res = wfd_oem_miracast_init(manager->oem_ops, false);
683 WDS_LOGE("Failed to initialize miracast");
686 group = (wfd_group_s*) manager->group;
687 if (group && group->pending == FALSE) {
688 res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
690 WDS_LOGE("Failed to destroy group before deactivation");
693 #if defined(TIZEN_PROFILE_MOBILE)
694 res = wfd_util_check_wifi_state();
696 WDS_LOGE("Failed to get wifi state");
697 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
698 } else if (res == 0) {
699 #endif /* TIZEN_PROFILE_MOBILE */
700 res = wfd_oem_deactivate(manager->oem_ops, 0);
702 WDS_LOGE("Failed to deactivate");
703 wfd_state_set(manager, prev_state);
704 wfd_util_set_wifi_direct_state(prev_state);
705 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
707 #if defined(TIZEN_PROFILE_MOBILE)
709 /* FIXME: We should do something to stop p2p feature of Driver */
710 res = wfd_oem_deactivate(manager->oem_ops, res);
712 WDS_LOGE("Failed to deactivate");
713 wfd_state_set(manager, prev_state);
714 wfd_util_set_wifi_direct_state(prev_state);
715 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
717 WDS_LOGE("Do not need to deactivate Wi-Fi");
719 #endif /* TIZEN_PROFILE_MOBILE */
720 WDS_LOGE("Succeeded to deactivate");
722 wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATED);
723 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATED);
725 manager->req_wps_mode = WFD_WPS_MODE_PBC;
727 wfd_destroy_group(manager);
728 wfd_destroy_session(manager);
729 wfd_peer_clear_all(manager);
730 wfd_local_reset_data(manager);
732 #ifdef TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT
733 wfd_util_stop_wifi_direct_popup();
734 #endif /* TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT */
735 __WDS_LOG_FUNC_EXIT__;
736 return WIFI_DIRECT_ERROR_NONE;
739 int wfd_manager_connect(wfd_manager_s *manager, unsigned char *peer_addr)
741 __WDS_LOG_FUNC_ENTER__;
742 wfd_session_s *session = NULL;
745 if (!manager || !peer_addr) {
746 WDS_LOGE("Invalid parameter");
747 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
750 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
751 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
752 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
753 __WDS_LOG_FUNC_EXIT__;
754 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
757 wfd_group_s *group = (wfd_group_s*) manager->group;
758 if (group && group->member_count >= manager->max_station) {
759 __WDS_LOG_FUNC_EXIT__;
760 return WIFI_DIRECT_ERROR_TOO_MANY_CLIENT;
763 session = (wfd_session_s*) manager->session;
764 if (session && session->type != SESSION_TYPE_INVITE) {
765 WDS_LOGE("Session already exist and it's not an invitation session");
766 __WDS_LOG_FUNC_EXIT__;
767 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
771 session = wfd_create_session(manager, peer_addr,
772 manager->req_wps_mode, SESSION_DIRECTION_OUTGOING);
774 WDS_LOGE("Failed to create new session");
775 __WDS_LOG_FUNC_EXIT__;
776 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
780 if (manager->local->dev_role == WFD_DEV_ROLE_GO &&
781 session->type != SESSION_TYPE_INVITE) {
782 session->type = SESSION_TYPE_INVITE;
783 res = wfd_session_invite(session);
785 res = wfd_session_start(session);
788 WDS_LOGE("Failed to start session");
789 wfd_destroy_session(manager);
790 __WDS_LOG_FUNC_EXIT__;
791 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
793 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
794 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
796 __WDS_LOG_FUNC_EXIT__;
797 return WIFI_DIRECT_ERROR_NONE;
800 #if defined(TIZEN_FEATURE_ASP)
801 int wfd_manager_asp_connect_session(wfd_manager_s *manager, void *params)
803 __WDS_LOG_FUNC_ENTER__;
804 wfd_session_s *session = NULL;
805 wfd_oem_asp_prov_s *prov_params = NULL;
806 int req_wps_mode = WFD_WPS_MODE_P2PS;
809 prov_params = (wfd_oem_asp_prov_s *)params;
810 if (!manager || !prov_params) {
811 WDS_LOGE("Invalid parameter");
812 __WDS_LOG_FUNC_EXIT__;
813 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
816 session = (wfd_session_s*) manager->session;
818 WDS_LOGE("Session already exists");
819 __WDS_LOG_FUNC_EXIT__;
820 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
823 if (prov_params->network_config == WFD_OEM_ASP_WPS_TYPE_PIN_DISPLAY)
824 req_wps_mode = WFD_WPS_MODE_DISPLAY;
825 else if (prov_params->network_config == WFD_OEM_ASP_WPS_TYPE_PIN_KEYPAD)
826 req_wps_mode = WFD_WPS_MODE_KEYPAD;
828 req_wps_mode = WFD_WPS_MODE_P2PS;
830 session = wfd_create_session(manager, prov_params->service_mac,
831 req_wps_mode, SESSION_DIRECTION_OUTGOING);
833 WDS_LOGE("Failed to create new session");
834 __WDS_LOG_FUNC_EXIT__;
835 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
838 res = wfd_session_asp_session_start(session, prov_params);
840 WDS_LOGE("Failed to start session");
841 wfd_destroy_session(manager);
842 __WDS_LOG_FUNC_EXIT__;
843 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
846 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
847 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
849 __WDS_LOG_FUNC_EXIT__;
850 return WIFI_DIRECT_ERROR_NONE;
853 int wfd_manager_asp_confirm_session(wfd_manager_s *manager, void *params, int confirmed)
855 __WDS_LOG_FUNC_ENTER__;
856 wfd_session_s *session = NULL;
857 wfd_oem_asp_prov_s *prov_params = NULL;
860 prov_params = (wfd_oem_asp_prov_s *)params;
861 if (!manager || !prov_params) {
862 WDS_LOGE("Invalid parameter");
863 __WDS_LOG_FUNC_EXIT__;
864 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
867 session = (wfd_session_s*) manager->session;
869 WDS_LOGE("Session not exists");
870 __WDS_LOG_FUNC_EXIT__;
871 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
875 WDS_LOGD("confirm session [%u] with peer [" MACSTR "]", prov_params->session_id,
876 MAC2STR(prov_params->session_mac));
878 WDS_LOGD("created session [%u] with peer [" MACSTR "]", session->session_id,
879 MAC2STR(session->session_mac));
881 if (session->session_id != prov_params->session_id ||
882 memcmp(&(session->session_mac), prov_params->session_mac, MACADDR_LEN) != 0) {
883 WDS_LOGE("Session MAC or ID not matched");
884 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
888 prov_params->status = 12;
890 prov_params->status = 11;
891 prov_params->deferring = 1;
893 res = wfd_oem_asp_prov_disc_req(manager->oem_ops, prov_params);
895 WDS_LOGE("Failed to start session");
896 wfd_destroy_session(manager);
897 __WDS_LOG_FUNC_EXIT__;
898 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
900 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
901 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
903 __WDS_LOG_FUNC_EXIT__;
904 return WIFI_DIRECT_ERROR_NONE;
908 int wfd_manager_accept_connection(wfd_manager_s *manager, unsigned char *peer_addr)
910 __WDS_LOG_FUNC_ENTER__;
911 wfd_session_s *session = NULL;
912 wfd_device_s *peer = NULL;
915 if (!manager || !peer_addr) {
916 WDS_LOGE("Invalid parameter");
917 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
920 session = (wfd_session_s*) manager->session;
922 WDS_LOGE("Session not found");
923 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
926 peer = wfd_peer_find_by_dev_addr(manager, peer_addr);
928 WDS_LOGE("Peer is NULL");
929 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
932 if (memcmp(session->peer->dev_addr, peer_addr, MACADDR_LEN) != 0) {
933 WDS_LOGE("Peer and ongoing session peer are different");
934 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
937 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
938 WDS_LOGD("My device is GO and peer want to join my group, so WPS will be started");
939 res = wfd_session_wps(session);
940 } else if (peer->dev_role == WFD_DEV_ROLE_GO) {
941 WDS_LOGD("Peer device is GO, so Prov_Disc or Join will be started");
942 if (session->type == SESSION_TYPE_INVITE) {
943 if (session->state == SESSION_STATE_CREATED) {
944 WDS_LOGD("Invitation session. PD will be started");
945 res = wfd_session_start(session);
947 WDS_LOGD("Invitation session. Join will be started");
948 res = wfd_session_join(session);
951 if (manager->autoconnection && (manager->auto_pin[0] != 0))
952 g_strlcpy(session->wps_pin, manager->auto_pin, PINSTR_LEN + 1);
954 WDS_LOGD("Peer device is GO, so WPS will be started");
955 res = wfd_session_connect(session);
958 /* We should wait GO_NEGO_REQ from peer(MO) in autoconnection mode. */
959 /* Otherwise, GO Nego is sometimes failed. */
960 if (manager->autoconnection == FALSE) {
961 WDS_LOGD("My device is Device, so Negotiation will be started");
962 res = wfd_session_connect(session);
966 WDS_LOGE("Failed to start session");
967 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
968 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
969 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
971 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
972 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
974 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
976 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
977 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
979 __WDS_LOG_FUNC_EXIT__;
980 return WIFI_DIRECT_ERROR_NONE;
984 int wfd_manager_cancel_connection(wfd_manager_s *manager, unsigned char *peer_addr)
986 __WDS_LOG_FUNC_ENTER__;
987 wfd_group_s *group = NULL;
990 if (!manager || !peer_addr) {
991 WDS_LOGE("Invalid parameter");
992 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
995 if (!manager->session && manager->state != WIFI_DIRECT_STATE_CONNECTING) {
996 WDS_LOGE("It's not CONNECTING state");
997 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
1000 res = wfd_session_cancel(manager->session, peer_addr);
1002 WDS_LOGE("Failed to cancel session");
1003 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1006 group = (wfd_group_s*) manager->group;
1008 wfd_group_remove_member(group, peer_addr);
1010 manager->local->dev_role = WFD_DEV_ROLE_NONE;
1012 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1013 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1014 if (group->member_count)
1015 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1017 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1018 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1021 __WDS_LOG_FUNC_EXIT__;
1022 return WIFI_DIRECT_ERROR_NONE;
1026 int wfd_manager_reject_connection(wfd_manager_s *manager, unsigned char *peer_addr)
1028 __WDS_LOG_FUNC_ENTER__;
1029 wfd_session_s *session = NULL;
1032 if (!manager || !peer_addr) {
1033 WDS_LOGE("Invalid parameter");
1034 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1037 session = (wfd_session_s*) manager->session;
1039 WDS_LOGE("Session not found");
1040 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
1043 if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
1044 WDS_LOGE("It's not permitted with this state [%d]", manager->state);
1045 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
1048 if (session->direction != SESSION_DIRECTION_INCOMING) {
1049 WDS_LOGE("Only incomming session can be rejected");
1050 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
1053 res = wfd_session_reject(session, peer_addr);
1055 WDS_LOGE("Failed to reject connection");
1056 /* TODO: check whether set state and break */
1058 wfd_destroy_session(manager);
1060 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1061 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1062 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1064 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1065 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1068 __WDS_LOG_FUNC_EXIT__;
1069 return WIFI_DIRECT_ERROR_NONE;
1073 int wfd_manager_disconnect(wfd_manager_s *manager, unsigned char *peer_addr)
1075 __WDS_LOG_FUNC_ENTER__;
1076 wfd_group_s *group = NULL;
1077 wfd_device_s *peer = NULL;
1081 WDS_LOGE("Invalid parameter");
1082 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1086 WDS_LOGE("Invalid parameter");
1087 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1090 group = (wfd_group_s*) manager->group;
1092 WDS_LOGE("Group not found");
1093 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
1096 peer = wfd_group_find_member_by_addr(group, peer_addr);
1098 WDS_LOGE("Connected peer not found");
1099 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1102 wfd_state_set(manager, WIFI_DIRECT_STATE_DISCONNECTING);
1103 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DISCONNECTING);
1105 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1107 res = wfd_oem_disconnect(manager->oem_ops, peer->dev_addr, 0);
1109 res = wfd_oem_disconnect(manager->oem_ops, peer->intf_addr, 1);
1111 res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1115 WDS_LOGE("Failed to disconnect peer");
1116 res = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1119 WDS_LOGE("Succeeded to disconnect peer");
1121 wfd_group_remove_member(group, peer_addr);
1122 if (!group->member_count) {
1123 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1124 wfd_destroy_group(manager);
1127 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1128 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1129 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1131 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1132 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1135 __WDS_LOG_FUNC_EXIT__;
1136 return WIFI_DIRECT_ERROR_NONE;
1139 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1140 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1141 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1143 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
1144 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
1147 __WDS_LOG_FUNC_EXIT__;
1151 int wfd_manager_disconnect_all(wfd_manager_s *manager)
1153 __WDS_LOG_FUNC_ENTER__;
1154 wfd_group_s *group = NULL;
1158 WDS_LOGE("Invalid parameter");
1159 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1162 group = (wfd_group_s*) manager->group;
1164 WDS_LOGE("Group not found");
1165 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
1168 wfd_state_set(manager, WIFI_DIRECT_STATE_DISCONNECTING);
1169 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DISCONNECTING);
1171 res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1173 WDS_LOGE("Failed to destroy group");
1174 res = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1177 WDS_LOGE("Succeeded to disconnect all peer");
1179 wfd_destroy_group(manager);
1181 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1182 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1184 __WDS_LOG_FUNC_EXIT__;
1185 return WIFI_DIRECT_ERROR_NONE;
1188 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1189 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1190 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1192 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
1193 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
1196 __WDS_LOG_FUNC_EXIT__;
1200 int wfd_manager_get_peer_info(wfd_manager_s *manager, unsigned char *addr, wfd_discovery_entry_s **peer)
1202 __WDS_LOG_FUNC_ENTER__;
1203 wfd_device_s *peer_dev = NULL;
1204 wfd_discovery_entry_s *peer_info;
1205 wfd_oem_device_s *oem_dev = NULL;
1207 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
1209 if (!manager || !addr) {
1210 WDS_LOGE("Invalid parameter");
1214 unsigned long time = 0;
1215 #if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
1216 wfd_util_get_current_time(&time);
1218 struct timeval tval;
1219 gettimeofday(&tval, NULL);
1222 WDS_LOGI("Current time [%ld]", time);
1224 res = wfd_oem_get_peer_info(manager->oem_ops, addr, &oem_dev);
1225 if (res < 0 || !oem_dev) {
1226 WDS_LOGE("Failed to get peer information");
1230 peer_dev = wfd_peer_find_by_addr(manager, addr);
1232 peer_dev = (wfd_device_s*) g_try_malloc0(sizeof(wfd_device_s));
1234 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1235 WDS_LOGE("Failed to allocate memory for peer device. [%s]", error_buf);
1239 memcpy(peer_dev->dev_addr, addr, MACADDR_LEN);
1240 manager->peers = g_list_prepend(manager->peers, peer_dev);
1241 manager->peer_count++;
1242 peer_dev->time = time;
1243 WDS_LOGD("peer_count[%d]", manager->peer_count);
1245 if (oem_dev->age > 30 && peer_dev->state == WFD_PEER_STATE_DISCOVERED) {
1246 WDS_LOGE("Too old age to update peer");
1252 g_strlcpy(peer_dev->dev_name, oem_dev->dev_name, DEV_NAME_LEN + 1);
1253 memcpy(peer_dev->intf_addr, oem_dev->intf_addr, MACADDR_LEN);
1254 memcpy(peer_dev->go_dev_addr, oem_dev->go_dev_addr, MACADDR_LEN);
1255 peer_dev->dev_role = oem_dev->dev_role;
1256 peer_dev->config_methods = oem_dev->config_methods;
1257 peer_dev->pri_dev_type = oem_dev->pri_dev_type;
1258 peer_dev->sec_dev_type = oem_dev->sec_dev_type;
1259 peer_dev->dev_flags = oem_dev->dev_flags;
1260 peer_dev->group_flags = oem_dev->group_flags;
1261 peer_dev->wps_mode = oem_dev->wps_mode;
1263 if (manager->is_wifi_display_supported)
1264 memcpy(&(peer_dev->display), &(oem_dev->display), sizeof(wfd_display_s));
1266 peer_dev->time = time;
1267 peer_dev->channel = oem_dev->channel;
1271 peer_info = (wfd_discovery_entry_s*) g_try_malloc0(sizeof(wfd_discovery_entry_s));
1273 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1274 WDS_LOGE("Failed to allocate memory for peer data. [%s]", error_buf);
1278 g_strlcpy(peer_info->device_name, peer_dev->dev_name, DEV_NAME_LEN + 1);
1279 memcpy(peer_info->mac_address, peer_dev->dev_addr, MACADDR_LEN);
1280 memcpy(peer_info->intf_address, peer_dev->intf_addr, MACADDR_LEN);
1281 peer_info->channel = peer_dev->channel;
1282 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1283 peer_info->services = 0;
1284 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1285 peer_info->is_group_owner = peer_dev->dev_role == WFD_DEV_ROLE_GO;
1286 peer_info->is_persistent_go = peer_dev->group_flags & WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
1287 peer_info->is_connected = peer_dev->dev_role == WFD_DEV_ROLE_GC;
1288 peer_info->wps_device_pwd_id = 0;
1289 peer_info->wps_cfg_methods = peer_dev->config_methods;
1290 peer_info->category = peer_dev->pri_dev_type;
1291 peer_info->subcategory = peer_dev->sec_dev_type;
1293 if (manager->is_wifi_display_supported)
1294 if (peer_dev->display.availability && peer_dev->display.port)
1295 peer_info->is_wfd_device = 1;
1299 __WDS_LOG_FUNC_EXIT__;
1304 int wfd_manager_get_peers(wfd_manager_s *manager, wfd_discovery_entry_s **peers_data)
1306 __WDS_LOG_FUNC_ENTER__;
1308 wfd_device_s *peer = NULL;
1309 wfd_discovery_entry_s *peers = NULL;
1313 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
1315 if (!manager || !peers_data) {
1316 WDS_LOGE("Invalid parameter");
1320 unsigned long time = 0;
1321 #if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
1322 wfd_util_get_current_time(&time);
1324 struct timeval tval;
1325 gettimeofday(&tval, NULL);
1328 WDS_LOGI("Current time [%ld]", time);
1330 peer_count = manager->peer_count;
1331 WDS_LOGI("peer count [%ld]", peer_count);
1334 else if (peer_count == 0)
1338 peers = (wfd_discovery_entry_s*) g_try_malloc0_n(peer_count, sizeof(wfd_discovery_entry_s));
1340 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1341 WDS_LOGE("Failed to allocate memory for peer data. [%s]", error_buf);
1345 temp = g_list_first(manager->peers);
1346 while (temp && count < peer_count) {
1350 if (peer->time + 8 < time) {
1351 WDS_LOGD("Device data is too old to report to application [%s]", peer->dev_name);
1352 res = wfd_update_peer(manager, peer);
1354 WDS_LOGE("This device is disappeared [%s]", peer->dev_name);
1355 temp = g_list_next(temp);
1356 manager->peers = g_list_remove(manager->peers, peer);
1357 manager->peer_count--;
1364 g_strlcpy(peers[count].device_name, peer->dev_name, DEV_NAME_LEN + 1);
1365 memcpy(peers[count].mac_address, peer->dev_addr, MACADDR_LEN);
1366 memcpy(peers[count].intf_address, peer->intf_addr, MACADDR_LEN);
1367 peers[count].channel = peer->channel;
1368 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1369 peers[count].services = 0;
1370 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1371 peers[count].is_group_owner = peer->dev_role == WFD_DEV_ROLE_GO;
1372 peers[count].is_persistent_go = peer->group_flags & WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
1373 peers[count].is_connected = peer->dev_role == WFD_DEV_ROLE_GC;
1374 peers[count].wps_device_pwd_id = 0;
1375 peers[count].wps_cfg_methods = peer->config_methods;
1376 peers[count].category = peer->pri_dev_type;
1377 peers[count].subcategory = peer->sec_dev_type;
1380 if (manager->is_wifi_display_supported)
1381 if (peer->display.availability && peer->display.port)
1382 peers[count].is_wfd_device = 1;
1384 WDS_LOGD("%dth peer [%s]", count, peer->dev_name);
1386 temp = g_list_next(temp);
1389 WDS_LOGD("%d peers converted", count);
1390 WDS_LOGD("Final peer count is %d", manager->peer_count);
1392 *peers_data = peers;
1394 __WDS_LOG_FUNC_EXIT__;
1398 int wfd_manager_get_connected_peers(wfd_manager_s *manager, wfd_connected_peer_info_s **peers_data)
1400 __WDS_LOG_FUNC_ENTER__;
1401 wfd_connected_peer_info_s *peers = NULL;
1402 wfd_group_s *group = NULL;
1403 wfd_device_s *peer = NULL;
1407 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
1409 if (!manager || !peers_data) {
1410 WDS_LOGE("Invalid parameter");
1414 group = manager->group;
1416 WDS_LOGE("Group not exist");
1420 peer_count = group->member_count;
1421 if (peer_count == 0) {
1422 WDS_LOGD("Member not exist");
1427 peers = (wfd_connected_peer_info_s*) g_try_malloc0_n(peer_count, sizeof(wfd_connected_peer_info_s));
1429 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1430 WDS_LOGE("Failed to allocate memory for connected peer data. [%s]", error_buf);
1434 temp = g_list_first(group->members);
1435 while (temp && count < group->member_count) {
1438 g_strlcpy(peers[count].device_name, peer->dev_name, DEV_NAME_LEN + 1);
1439 memcpy(peers[count].mac_address, peer->dev_addr, MACADDR_LEN);
1440 memcpy(peers[count].intf_address, peer->intf_addr, MACADDR_LEN);
1441 memcpy(peers[count].ip_address, peer->ip_addr, IPADDR_LEN);
1442 peers[count].category = peer->pri_dev_type;
1443 peers[count].subcategory = peer->sec_dev_type;
1444 peers[count].channel = peer->channel;
1445 peers[count].is_p2p = peer->is_p2p;
1446 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1447 peers[count].services = 0;
1448 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1450 if (manager->is_wifi_display_supported)
1451 if (peer->display.availability && peer->display.port)
1452 peers[count].is_wfd_device = 1;
1454 WDS_LOGD("%dth member converted[%s]", count, peers[count].device_name);
1457 temp = g_list_next(temp);
1460 WDS_LOGD("%d members converted", count);
1462 *peers_data = peers;
1464 __WDS_LOG_FUNC_EXIT__;
1468 #ifdef TIZEN_FEATURE_ASP
1469 wfd_device_s *wfd_manager_get_connected_peer_by_addr(wfd_manager_s *manager, unsigned char *peer_addr)
1471 __WDS_LOG_FUNC_ENTER__;
1472 wfd_device_s *peer = NULL;
1474 if (peer_addr == NULL) {
1475 WDS_LOGE("Invalid parameter");
1476 __WDS_LOG_FUNC_EXIT__;
1481 peer = wfd_group_find_member_by_addr(manager->group, peer_addr);
1483 __WDS_LOG_FUNC_EXIT__;
1486 #endif /* TIZEN_FEATURE_ASP */
1489 wfd_device_s *wfd_manager_find_connected_peer(wfd_manager_s *manager, unsigned char *peer_addr)
1491 __WDS_LOG_FUNC_ENTER__;
1492 wfd_device_s *peer = NULL;
1494 if (!manager || !peer_addr) {
1495 WDS_LOGE("Invalid parameter");
1499 peer = wfd_group_find_member_by_addr(manager->group, peer_addr);
1501 __WDS_LOG_FUNC_EXIT__;
1506 int wfd_manager_get_goup_ifname(char **ifname)
1508 __WDS_LOG_FUNC_ENTER__;
1509 wfd_group_s *group = g_manager->group;
1512 WDS_LOGE("Invalid parameter");
1513 __WDS_LOG_FUNC_EXIT__;
1518 WDS_LOGE("Group not exist");
1522 *ifname = group->ifname;
1524 __WDS_LOG_FUNC_EXIT__;
1528 int wfd_manager_set_display_device(int type, int port, int hdcp)
1530 __WDS_LOG_FUNC_ENTER__;
1531 wfd_device_s * device = g_manager->local;
1532 wfd_oem_display_s display;
1536 WDS_LOGE("Invalid parameter");
1537 __WDS_LOG_FUNC_EXIT__;
1541 memset(&display, 0x0, sizeof(wfd_oem_display_s));
1543 display.type = type;
1544 display.port = port;
1545 display.hdcp_support = hdcp;
1547 display.availability = device->display.availability;
1548 display.max_tput = device->display.max_tput;
1550 res = wfd_oem_set_display(g_manager->oem_ops, (wfd_oem_display_s*)&display);
1552 WDS_LOGE("Failed to set wifi display");
1556 device->display.type = type;
1557 device->display.port = port;
1558 device->display.hdcp_support = hdcp;
1560 __WDS_LOG_FUNC_EXIT__;
1564 int wfd_manager_set_session_availability(int availability)
1566 __WDS_LOG_FUNC_ENTER__;
1567 wfd_device_s * device = g_manager->local;
1568 wfd_oem_display_s display;
1572 WDS_LOGE("Invalid parameter");
1573 __WDS_LOG_FUNC_EXIT__;
1577 memset(&display, 0x0, sizeof(wfd_oem_display_s));
1579 display.availability = availability;
1581 display.type = device->display.type;
1582 display.hdcp_support = device->display.hdcp_support;
1583 display.port = device->display.port;
1584 display.max_tput = device->display.max_tput;
1586 res = wfd_oem_set_display(g_manager->oem_ops, (wfd_oem_display_s*)&display);
1588 WDS_LOGE("Failed to set wifi display session availability");
1592 device->display.availability = availability;
1594 __WDS_LOG_FUNC_EXIT__;
1598 int wfd_manager_start_discovery(wfd_manager_s *manager, int mode, int timeout,
1599 const char* type, int channel, int frequency)
1601 __WDS_LOG_FUNC_ENTER__;
1602 int res = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1603 wfd_oem_scan_param_s param;
1604 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
1606 WDS_LOGI("Mode [%d], Timeout [%d], type [%s], channel [%d], frequency [%d]",
1607 mode, timeout, type, channel, frequency);
1609 if (manager->local->dev_role == WFD_DEV_ROLE_GO)
1610 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
1613 case WFD_DISCOVERY_FULL_SCAN:
1614 param.scan_type = WFD_OEM_SCAN_TYPE_FULL;
1616 case WFD_DISCOVERY_SOCIAL_CHANNEL:
1617 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
1619 case WFD_DISCOVERY_CHANNEL1:
1620 param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL1;
1623 case WFD_DISCOVERY_CHANNEL6:
1624 param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL6;
1627 case WFD_DISCOVERY_CHANNEL11:
1628 param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL11;
1632 param.scan_type = WFD_OEM_SCAN_TYPE_SPECIFIC;
1634 param.freq = frequency;
1636 param.freq = wfd_util_channel_to_freq(channel);
1640 param.scan_mode = WFD_OEM_SCAN_MODE_PASSIVE;
1642 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
1644 param.scan_time = timeout;
1646 res = wfd_oem_start_scan(manager->oem_ops, ¶m);
1648 WDS_LOGE("Failed to start scan");
1649 __WDS_LOG_FUNC_EXIT__;
1650 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1654 manager->scan_mode = WFD_SCAN_MODE_PASSIVE;
1656 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
1658 if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
1659 wfd_state_set(manager, WIFI_DIRECT_STATE_DISCOVERING);
1660 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DISCOVERING);
1663 WDS_LOGD("Succeeded to start scan");
1664 __WDS_LOG_FUNC_EXIT__;
1665 return WIFI_DIRECT_ERROR_NONE;
1668 int wfd_manager_cancel_discovery(wfd_manager_s *manager)
1670 __WDS_LOG_FUNC_ENTER__;
1673 res = wfd_oem_stop_scan(manager->oem_ops);
1675 WDS_LOGE("Failed to stop scan");
1676 __WDS_LOG_FUNC_EXIT__;
1677 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1680 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1681 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1682 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1684 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1685 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1688 WDS_LOGD("Succeeded to stop scan");
1689 __WDS_LOG_FUNC_EXIT__;
1690 return WIFI_DIRECT_ERROR_NONE;
1693 wfd_device_s *wfd_manager_get_peer_by_addr(wfd_manager_s *manager, unsigned char *peer_addr)
1695 __WDS_LOG_FUNC_ENTER__;
1696 wfd_device_s *peer = NULL;
1698 peer = wfd_group_find_member_by_addr(manager->group, peer_addr);
1703 peer = wfd_peer_find_by_addr(manager, peer_addr);
1705 __WDS_LOG_FUNC_EXIT__;
1709 static wfd_manager_s *wfd_manager_init()
1711 __WDS_LOG_FUNC_ENTER__;
1712 wfd_manager_s *manager = NULL;
1715 manager = (wfd_manager_s*) g_try_malloc0(sizeof(wfd_manager_s));
1717 WDS_LOGE("Failed to allocate memory for wfd_manager structure");
1721 manager->go_intent = 7;
1722 manager->req_wps_mode = WFD_WPS_MODE_PBC;
1723 manager->max_station = 8;
1724 manager->session_timer = 120;
1725 manager->auto_group_remove_enable = TRUE;
1726 wfd_util_check_features();
1727 res = _wfd_local_init_device(manager);
1729 WDS_LOGE("Failed to initialize local device");
1731 return NULL; /* really stop manager? */
1733 WDS_LOGD("Succeeded to initialize local device");
1735 #ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
1736 manager->client_count = 0;
1737 manager->client_list = NULL;
1738 manager->exit_timer = g_timeout_add(120000,
1739 (GSourceFunc) _wfd_exit_timeout_cb, manager);
1740 WDS_LOGD("Exit timer started");
1741 #endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
1743 __WDS_LOG_FUNC_EXIT__;
1747 int wfd_manager_deinit(wfd_manager_s *manager)
1749 __WDS_LOG_FUNC_ENTER__;
1752 WDS_LOGE("Invalid parameter");
1753 __WDS_LOG_FUNC_EXIT__;
1757 #ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
1758 if (manager->exit_timer > 0)
1759 g_source_remove(manager->exit_timer);
1760 manager->exit_timer = 0;
1761 #endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
1763 _wfd_local_deinit_device(manager);
1767 __WDS_LOG_FUNC_EXIT__;
1771 static void *wfd_plugin_init(wfd_manager_s *manager)
1773 __WDS_LOG_FUNC_ENTER__;
1775 struct utsname kernel_info;
1777 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
1780 WDS_LOGE("Invalid parameter");
1781 __WDS_LOG_FUNC_EXIT__;
1785 res = uname(&kernel_info);
1787 WDS_LOGE("Failed to detect target type");
1788 __WDS_LOG_FUNC_EXIT__;
1791 WDS_LOGD("Node name [%s], HW ID [%s]", kernel_info.nodename, kernel_info.machine);
1795 #if defined(TIZEN_ARCH_64)
1796 handle = dlopen(SUPPL_PLUGIN_64BIT_PATH, RTLD_NOW);
1798 handle = dlopen(SUPPL_PLUGIN_PATH, RTLD_NOW);
1801 WDS_LOGE("Failed to open shared object. [%s]", dlerror());
1802 __WDS_LOG_FUNC_EXIT__;
1807 int (*plugin_load)(wfd_oem_ops_s **ops) = NULL;
1808 plugin_load = (int (*)(wfd_oem_ops_s **ops)) dlsym(handle, "wfd_plugin_load");
1810 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1811 WDS_LOGE("Failed to load symbol. Error = [%s]", error_buf);
1813 __WDS_LOG_FUNC_EXIT__;
1817 wfd_oem_ops_s *temp_ops;
1818 (*plugin_load)(&temp_ops);
1819 manager->oem_ops = temp_ops;
1821 res = wfd_oem_init(temp_ops);
1823 WDS_LOGE("Failed to initialize OEM");
1825 __WDS_LOG_FUNC_EXIT__;
1828 WDS_LOGD("Succeeded to initialize OEM");
1830 __WDS_LOG_FUNC_EXIT__;
1834 static int wfd_plugin_deinit(wfd_manager_s *manager)
1836 __WDS_LOG_FUNC_ENTER__;
1838 if (!manager || !manager->plugin_handle) {
1839 WDS_LOGE("Invalid parameter");
1840 __WDS_LOG_FUNC_EXIT__;
1844 dlclose(manager->plugin_handle);
1845 manager->plugin_handle = NULL;
1847 __WDS_LOG_FUNC_EXIT__;
1851 #if defined TIZEN_ENABLE_PRD
1852 static void *wfd_prd_plugin_init(wfd_manager_s *manager)
1854 __WDS_LOG_FUNC_ENTER__;
1856 struct utsname kernel_info;
1860 WDS_LOGE("Invalid parameter");
1861 __WDS_LOG_FUNC_EXIT__;
1865 res = uname(&kernel_info);
1867 WDS_LOGE("Failed to detect target type");
1868 __WDS_LOG_FUNC_EXIT__;
1871 WDS_LOGD("Node name [%s], HW ID [%s]", kernel_info.nodename, kernel_info.machine);
1875 #if defined(TIZEN_ARCH_64)
1876 handle = dlopen(SUPPL_PRD_PLUGIN_64BIT_PATH, RTLD_NOW);
1878 handle = dlopen(SUPPL_PRD_PLUGIN_PATH, RTLD_NOW);
1881 WDS_LOGE("Failed to open shared object. [%s]", dlerror());
1882 __WDS_LOG_FUNC_EXIT__;
1887 int (*plugin_load)(wfd_oem_ops_s **ops) = NULL;
1888 plugin_load = (int (*)(wfd_oem_ops_s **ops)) dlsym(handle, "wfd_prd_plugin_load");
1890 WDS_LOGE("Failed to load symbol. Error = [%s]", strerror(errno));
1892 __WDS_LOG_FUNC_EXIT__;
1896 (*plugin_load)((wfd_oem_ops_s **)&manager->oem_ops);
1898 res = wfd_oem_prd_init((wfd_oem_ops_s *)manager->oem_ops);
1900 WDS_LOGE("Failed to initialize PRD OEM");
1902 __WDS_LOG_FUNC_EXIT__;
1905 WDS_LOGD("Succeeded to initialize PRD OEM");
1907 __WDS_LOG_FUNC_EXIT__;
1911 static int wfd_prd_plugin_deinit(wfd_manager_s *manager)
1913 __WDS_LOG_FUNC_ENTER__;
1915 if (!manager || !manager->prd_plugin_handle) {
1916 WDS_LOGE("Invalid parameter");
1917 __WDS_LOG_FUNC_EXIT__;
1921 dlclose(manager->prd_plugin_handle);
1922 manager->prd_plugin_handle = NULL;
1924 __WDS_LOG_FUNC_EXIT__;
1927 #endif /* TIZEN_ENABLE_PRD */
1929 int main(int argc, char *argv[])
1931 __WDS_LOG_FUNC_ENTER__;
1932 GMainLoop *main_loop = NULL;
1934 #if !GLIB_CHECK_VERSION(2, 32, 0)
1935 if (!g_thread_supported())
1936 g_thread_init(NULL);
1939 #if !GLIB_CHECK_VERSION(2, 36, 0)
1943 /* TODO: Parsing argument */
1944 /* Wi-Fi direct connection for S-Beam can be optimized using argument */
1947 * wfd-manager initialization
1949 g_manager = wfd_manager_init();
1951 WDS_LOGE("Failed to initialize wifi-direct manager");
1952 __WDS_LOG_FUNC_EXIT__;
1955 WDS_LOGD("Succeeded to initialize manager");
1958 * wfd_manager_plugin initialization
1960 g_manager->plugin_handle = wfd_plugin_init(g_manager);
1961 if (!g_manager->plugin_handle) {
1962 WDS_LOGE("Failed to initialize plugin");
1963 wfd_manager_deinit(g_manager);
1964 __WDS_LOG_FUNC_EXIT__;
1967 WDS_LOGD("Succeeded to load plugin");
1969 #if defined TIZEN_ENABLE_PRD
1971 * wfd_manager_prd_plugin initialization
1973 g_manager->prd_plugin_handle = wfd_prd_plugin_init(g_manager);
1974 if (!g_manager->prd_plugin_handle)
1975 WDS_LOGW("Failed to initialize prd plugin");
1977 WDS_LOGD("Succeeded to load plugin");
1978 #endif /* TIZEN_ENABLE_PRD */
1980 if (!wfd_manager_dbus_init()) {
1981 WDS_LOGE("Failed to DBus");
1982 wfd_plugin_deinit(g_manager);
1983 wfd_manager_deinit(g_manager);
1984 __WDS_LOG_FUNC_EXIT__;
1988 main_loop = g_main_loop_new(NULL, FALSE);
1989 if (main_loop == NULL) {
1990 WDS_LOGE("Failed to create GMainLoop structure");
1991 __WDS_LOG_FUNC_EXIT__;
1994 g_manager->main_loop = main_loop;
1995 g_main_loop_run(main_loop);
1997 #ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
1998 wfd_manager_dbus_unregister_nameowner_signal();
1999 #endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
2001 wfd_manager_dbus_unregister();
2002 wfd_manager_dbus_deinit();
2004 #if defined TIZEN_ENABLE_PRD
2005 wfd_prd_plugin_deinit(g_manager);
2006 #endif /* TIZEN_ENABLE_PRD */
2008 wfd_plugin_deinit(g_manager);
2009 wfd_manager_deinit(g_manager);
2011 __WDS_LOG_FUNC_EXIT__;