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 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
251 memset(&(local->display), 0x0, sizeof(wfd_display_s));
252 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
253 memset(local->ip_addr, 0x0, IPADDR_LEN);
255 __WDS_LOG_FUNC_EXIT__;
259 int wfd_local_get_dev_name(char *dev_name)
261 __WDS_LOG_FUNC_ENTER__;
262 wfd_device_s *local = g_manager->local;
265 WDS_LOGE("Invalid parameter");
266 __WDS_LOG_FUNC_EXIT__;
270 g_strlcpy(dev_name, local->dev_name, DEV_NAME_LEN + 1);
271 WDS_LOGD("Local device name [%s]", dev_name);
273 __WDS_LOG_FUNC_EXIT__;
277 int wfd_local_set_dev_name(char *dev_name)
279 __WDS_LOG_FUNC_ENTER__;
280 wfd_device_s *local = g_manager->local;
283 WDS_LOGE("Invalid parameter");
284 __WDS_LOG_FUNC_EXIT__;
288 g_strlcpy(local->dev_name, dev_name, DEV_NAME_LEN + 1);
290 if (g_manager->state >= WIFI_DIRECT_STATE_ACTIVATED) {
291 wfd_oem_set_dev_name(g_manager->oem_ops, dev_name);
292 WDS_LOGD("Device name changed.");
294 WDS_LOGE("Device name can't changed: state is %d", g_manager->state);
297 __WDS_LOG_FUNC_EXIT__;
301 int wfd_local_get_dev_mac(char *dev_mac)
303 __WDS_LOG_FUNC_ENTER__;
304 wfd_device_s *local = g_manager->local;
307 WDS_LOGE("Invalid parameter");
308 __WDS_LOG_FUNC_EXIT__;
312 g_snprintf(dev_mac, MACSTR_LEN, MACSTR, MAC2STR(local->dev_addr));
313 WDS_SECLOGD("Local device MAC address [%s]", dev_mac);
315 __WDS_LOG_FUNC_EXIT__;
320 int wfd_local_get_intf_mac(unsigned char *intf_mac)
322 __WDS_LOG_FUNC_ENTER__;
323 wfd_device_s *local = g_manager->local;
326 WDS_LOGE("Invalid parameter");
327 __WDS_LOG_FUNC_EXIT__;
331 g_snprintf(intf_mac, MACSTR_LEN, MACSTR, MAC2STR(local->intf_addr));
332 WDS_SECLOGD("Local interface MAC address [%s]", intf_mac);
334 __WDS_LOG_FUNC_EXIT__;
339 int wfd_local_get_ip_addr(char *ip_str)
341 __WDS_LOG_FUNC_ENTER__;
342 wfd_device_s *local = g_manager->local;
345 WDS_LOGE("Invalid parameter");
346 __WDS_LOG_FUNC_EXIT__;
350 snprintf(ip_str, IPSTR_LEN, IPSTR, IP2STR(local->ip_addr));
351 WDS_SECLOGD("Local IP address [" IPSECSTR "]", IP2SECSTR(local->ip_addr));
353 __WDS_LOG_FUNC_EXIT__;
357 int wfd_local_get_supported_wps_mode(int *config_methods)
359 __WDS_LOG_FUNC_ENTER__;
360 wfd_device_s *local = g_manager->local;
362 if (!config_methods) {
363 WDS_LOGE("Invalid parameter");
364 __WDS_LOG_FUNC_EXIT__;
368 *config_methods = local->config_methods;
369 WDS_LOGD("Local config method [0x%x]", *config_methods);
371 __WDS_LOG_FUNC_EXIT__;
375 int wfd_local_get_wps_mode(int *wps_mode)
377 __WDS_LOG_FUNC_ENTER__;
378 wfd_device_s *local = g_manager->local;
381 WDS_LOGE("Invalid parameter");
382 __WDS_LOG_FUNC_EXIT__;
386 *wps_mode = local->wps_mode;
387 WDS_LOGD("Local wps mode [0x%x]", *wps_mode);
389 __WDS_LOG_FUNC_EXIT__;
394 int wfd_local_set_wps_mode(int wps_mode)
396 __WDS_LOG_FUNC_ENTER__;
397 wfd_device_s *local = g_manager->local;
400 WDS_LOGE("Invalid parameter");
401 __WDS_LOG_FUNC_EXIT__;
405 local->wps_mode = wps_mode;
406 WDS_LOGD("Local wps mode [0x%x]", wps_mode);
408 __WDS_LOG_FUNC_EXIT__;
413 int wfd_manager_get_go_intent(int *go_intent)
415 __WDS_LOG_FUNC_ENTER__;
417 WDS_LOGE("Invalid parameter");
418 __WDS_LOG_FUNC_EXIT__;
422 *go_intent = g_manager->go_intent;
423 WDS_LOGD("Local GO intent [%d]", *go_intent);
425 __WDS_LOG_FUNC_EXIT__;
429 int wfd_manager_set_go_intent(int go_intent)
431 __WDS_LOG_FUNC_ENTER__;
433 if (go_intent < 0 || go_intent > 15) {
434 WDS_LOGE("Invalid parameter");
435 __WDS_LOG_FUNC_EXIT__;
439 g_manager->go_intent = go_intent;
440 if (g_manager->state >= WIFI_DIRECT_STATE_ACTIVATED)
441 wfd_oem_set_go_intent(g_manager->oem_ops, go_intent);
443 __WDS_LOG_FUNC_EXIT__;
447 int wfd_manager_get_max_station(int *max_station)
449 __WDS_LOG_FUNC_ENTER__;
452 WDS_LOGE("Invalid parameter");
453 __WDS_LOG_FUNC_EXIT__;
457 *max_station = g_manager->max_station;
458 WDS_LOGD("Local max station[%d]", *max_station);
460 __WDS_LOG_FUNC_EXIT__;
464 int wfd_manager_set_max_station(int max_station)
466 __WDS_LOG_FUNC_ENTER__;
468 if (max_station < 1) {
469 WDS_LOGE("Invalid parameter");
470 __WDS_LOG_FUNC_EXIT__;
474 g_manager->max_station = max_station;
476 __WDS_LOG_FUNC_EXIT__;
480 int wfd_manager_get_autoconnection(int *autoconnection)
482 __WDS_LOG_FUNC_ENTER__;
483 if (!autoconnection) {
484 WDS_LOGE("Invalid parameter");
485 __WDS_LOG_FUNC_EXIT__;
489 *autoconnection = g_manager->autoconnection;
490 WDS_LOGD("Local autoconnection [%s]", *autoconnection ? "TRUE" : "FALSE");
492 __WDS_LOG_FUNC_EXIT__;
496 int wfd_manager_set_autoconnection(int autoconnection)
498 __WDS_LOG_FUNC_ENTER__;
499 if (autoconnection < 0) {
500 WDS_LOGE("Invalid parameter");
501 __WDS_LOG_FUNC_EXIT__;
505 g_manager->autoconnection = autoconnection;
507 __WDS_LOG_FUNC_EXIT__;
511 int wfd_manager_get_req_wps_mode(int *req_wps_mode)
513 __WDS_LOG_FUNC_ENTER__;
516 WDS_LOGE("Invalid parameter");
517 __WDS_LOG_FUNC_EXIT__;
521 *req_wps_mode = g_manager->req_wps_mode;
522 WDS_LOGD("Requested wps mode [0x%x]", *req_wps_mode);
524 __WDS_LOG_FUNC_EXIT__;
528 int wfd_manager_set_req_wps_mode(int req_wps_mode)
530 __WDS_LOG_FUNC_ENTER__;
531 wfd_device_s *local = g_manager->local;
533 if (req_wps_mode != WIFI_DIRECT_WPS_TYPE_PBC &&
534 req_wps_mode != WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY &&
535 req_wps_mode != WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD) {
536 WDS_LOGE("Invalid parameter");
537 __WDS_LOG_FUNC_EXIT__;
541 g_manager->req_wps_mode = req_wps_mode;
542 WDS_LOGD("Requested wps mode [0x%x]", req_wps_mode);
543 if (req_wps_mode == WFD_WPS_MODE_DISPLAY)
544 local->wps_mode = WFD_WPS_MODE_KEYPAD;
545 else if (req_wps_mode == WFD_WPS_MODE_KEYPAD)
546 local->wps_mode = WFD_WPS_MODE_DISPLAY;
548 local->wps_mode = req_wps_mode;
550 __WDS_LOG_FUNC_EXIT__;
554 int wfd_manager_local_config_set(wfd_manager_s *manager)
556 __WDS_LOG_FUNC_ENTER__;
557 wfd_device_s *local = NULL;
561 WDS_LOGE("Invalid parameter");
562 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
565 local = manager->local;
567 local->wps_mode = WFD_WPS_MODE_PBC;
568 WDS_LOGD("Device name set as %s", local->dev_name);
569 res = wfd_oem_set_dev_name(manager->oem_ops, local->dev_name);
571 WDS_LOGE("Failed to set device name");
572 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
575 local->pri_dev_type = DEFAULT_PRIMARY_DEVICE_TYPE;
576 local->sec_dev_type = DEFAULT_SECONDARY_DEVICE_TYPE;
577 res = wfd_oem_set_dev_type(manager->oem_ops, local->pri_dev_type, local->sec_dev_type);
579 WDS_LOGE("Failed to set device type");
580 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
583 res = wfd_oem_set_go_intent(manager->oem_ops, manager->go_intent);
585 WDS_LOGE("Failed to set go intent");
586 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
589 return WIFI_DIRECT_ERROR_NONE;
592 int wfd_manager_activate(wfd_manager_s *manager)
594 __WDS_LOG_FUNC_ENTER__;
599 WDS_LOGE("Invalid parameter");
600 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
603 if (manager->state > WIFI_DIRECT_STATE_ACTIVATING) {
604 WDS_LOGE("Already activated");
608 if (manager->state == WIFI_DIRECT_STATE_ACTIVATING) {
609 WDS_LOGE("In progress");
610 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
613 res = wfd_util_wifi_direct_activatable();
615 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
617 wfd_state_get(manager, &prev_state);
618 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATING);
619 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATING);
620 #if defined(TIZEN_WLAN_CONCURRENT_ENABLE)
621 res = wfd_util_check_wifi_state();
623 WDS_LOGE("Failed to get wifi state");
624 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
625 } else if (res == 0) {
626 #endif /* TIZEN_WLAN_CONCURRENT_ENABLE */
627 res = wfd_oem_activate(manager->oem_ops, 0);
629 WDS_LOGE("Failed to activate");
630 wfd_state_set(manager, prev_state);
631 wfd_util_set_wifi_direct_state(prev_state);
632 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
634 #if defined(TIZEN_WLAN_CONCURRENT_ENABLE)
636 res = wfd_oem_activate(manager->oem_ops, res);
638 WDS_LOGE("Failed to activate");
639 wfd_state_set(manager, prev_state);
640 wfd_util_set_wifi_direct_state(prev_state);
641 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
644 #endif /* TIZEN_WLAN_CONCURRENT_ENABLE */
645 WDS_LOGE("Succeeded to activate");
647 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
648 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
650 wfd_manager_local_config_set(manager);
651 wfd_util_set_country();
652 #ifdef TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT
653 wfd_util_start_wifi_direct_popup();
654 #endif /* TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT */
656 res = wfd_util_get_local_dev_mac(manager->local->dev_addr);
658 WDS_LOGE("Failed to get local device MAC address");
660 memcpy(manager->local->intf_addr, manager->local->dev_addr, MACADDR_LEN);
661 manager->local->intf_addr[4] ^= 0x80;
662 WDS_LOGD("Local Interface MAC address [" MACSECSTR "]",
663 MAC2SECSTR(manager->local->intf_addr));
665 __WDS_LOG_FUNC_EXIT__;
666 return WIFI_DIRECT_ERROR_NONE;
669 int wfd_manager_deactivate(wfd_manager_s *manager)
671 __WDS_LOG_FUNC_ENTER__;
674 wfd_group_s *group = NULL;
677 WDS_LOGE("Invalid parameter");
678 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
681 wfd_state_get(manager, &prev_state);
682 wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATING);
683 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATING);
685 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
686 res = wfd_oem_miracast_init(manager->oem_ops, false);
688 WDS_LOGE("Failed to initialize miracast");
689 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
691 group = (wfd_group_s*) manager->group;
692 if (group && group->pending == FALSE) {
693 res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
695 WDS_LOGE("Failed to destroy group before deactivation");
698 #if defined(TIZEN_WLAN_CONCURRENT_ENABLE) && defined(TIZEN_PROFILE_MOBILE)
699 res = wfd_util_check_wifi_state();
701 WDS_LOGE("Failed to get wifi state");
702 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
703 } else if (res == 0) {
704 #endif /* TIZEN_WLAN_CONCURRENT_ENABLE && TIZEN_PROFILE_MOBILE */
705 res = wfd_oem_deactivate(manager->oem_ops, 0);
707 WDS_LOGE("Failed to deactivate");
708 wfd_state_set(manager, prev_state);
709 wfd_util_set_wifi_direct_state(prev_state);
710 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
712 #if defined(TIZEN_WLAN_CONCURRENT_ENABLE) && defined(TIZEN_PROFILE_MOBILE)
714 /* FIXME: We should do something to stop p2p feature of Driver */
715 res = wfd_oem_deactivate(manager->oem_ops, res);
717 WDS_LOGE("Failed to deactivate");
718 wfd_state_set(manager, prev_state);
719 wfd_util_set_wifi_direct_state(prev_state);
720 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
722 WDS_LOGE("Do not need to deactivate Wi-Fi");
724 #endif /* TIZEN_WLAN_CONCURRENT_ENABLE && TIZEN_PROFILE_MOBILE */
725 WDS_LOGE("Succeeded to deactivate");
727 wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATED);
728 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATED);
730 manager->req_wps_mode = WFD_WPS_MODE_PBC;
732 wfd_destroy_group(manager);
733 wfd_destroy_session(manager);
734 wfd_peer_clear_all(manager);
735 wfd_local_reset_data(manager);
737 #ifdef TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT
738 wfd_util_stop_wifi_direct_popup();
739 #endif /* TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT */
740 __WDS_LOG_FUNC_EXIT__;
741 return WIFI_DIRECT_ERROR_NONE;
744 int wfd_manager_connect(wfd_manager_s *manager, unsigned char *peer_addr)
746 __WDS_LOG_FUNC_ENTER__;
747 wfd_session_s *session = NULL;
750 if (!manager || !peer_addr) {
751 WDS_LOGE("Invalid parameter");
752 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
755 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
756 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
757 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
758 __WDS_LOG_FUNC_EXIT__;
759 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
762 wfd_group_s *group = (wfd_group_s*) manager->group;
763 if (group && group->member_count >= manager->max_station) {
764 __WDS_LOG_FUNC_EXIT__;
765 return WIFI_DIRECT_ERROR_TOO_MANY_CLIENT;
768 session = (wfd_session_s*) manager->session;
769 if (session && session->type != SESSION_TYPE_INVITE) {
770 WDS_LOGE("Session already exist and it's not an invitation session");
771 __WDS_LOG_FUNC_EXIT__;
772 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
776 session = wfd_create_session(manager, peer_addr,
777 manager->req_wps_mode, SESSION_DIRECTION_OUTGOING);
779 WDS_LOGE("Failed to create new session");
780 __WDS_LOG_FUNC_EXIT__;
781 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
785 if (manager->local->dev_role == WFD_DEV_ROLE_GO &&
786 session->type != SESSION_TYPE_INVITE) {
787 session->type = SESSION_TYPE_INVITE;
788 res = wfd_session_invite(session);
790 res = wfd_session_start(session);
793 WDS_LOGE("Failed to start session");
794 wfd_destroy_session(manager);
795 __WDS_LOG_FUNC_EXIT__;
796 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
798 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
799 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
801 __WDS_LOG_FUNC_EXIT__;
802 return WIFI_DIRECT_ERROR_NONE;
805 #if defined(TIZEN_FEATURE_ASP)
806 int wfd_manager_asp_connect_session(wfd_manager_s *manager, void *params)
808 __WDS_LOG_FUNC_ENTER__;
809 wfd_session_s *session = NULL;
810 wfd_oem_asp_prov_s *prov_params = NULL;
811 int req_wps_mode = WFD_WPS_MODE_P2PS;
814 prov_params = (wfd_oem_asp_prov_s *)params;
815 if (!manager || !prov_params) {
816 WDS_LOGE("Invalid parameter");
817 __WDS_LOG_FUNC_EXIT__;
818 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
821 session = (wfd_session_s*) manager->session;
823 WDS_LOGE("Session already exists");
824 __WDS_LOG_FUNC_EXIT__;
825 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
828 if (prov_params->network_config == WFD_OEM_ASP_WPS_TYPE_PIN_DISPLAY)
829 req_wps_mode = WFD_WPS_MODE_DISPLAY;
830 else if (prov_params->network_config == WFD_OEM_ASP_WPS_TYPE_PIN_KEYPAD)
831 req_wps_mode = WFD_WPS_MODE_KEYPAD;
833 req_wps_mode = WFD_WPS_MODE_P2PS;
835 session = wfd_create_session(manager, prov_params->service_mac,
836 req_wps_mode, SESSION_DIRECTION_OUTGOING);
838 WDS_LOGE("Failed to create new session");
839 __WDS_LOG_FUNC_EXIT__;
840 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
843 res = wfd_session_asp_session_start(session, prov_params);
845 WDS_LOGE("Failed to start session");
846 wfd_destroy_session(manager);
847 __WDS_LOG_FUNC_EXIT__;
848 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
851 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
852 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
854 __WDS_LOG_FUNC_EXIT__;
855 return WIFI_DIRECT_ERROR_NONE;
858 int wfd_manager_asp_confirm_session(wfd_manager_s *manager, void *params, int confirmed)
860 __WDS_LOG_FUNC_ENTER__;
861 wfd_session_s *session = NULL;
862 wfd_oem_asp_prov_s *prov_params = NULL;
865 prov_params = (wfd_oem_asp_prov_s *)params;
866 if (!manager || !prov_params) {
867 WDS_LOGE("Invalid parameter");
868 __WDS_LOG_FUNC_EXIT__;
869 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
872 session = (wfd_session_s*) manager->session;
874 WDS_LOGE("Session not exists");
875 __WDS_LOG_FUNC_EXIT__;
876 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
880 WDS_LOGD("confirm session [%u] with peer [" MACSTR "]", prov_params->session_id,
881 MAC2STR(prov_params->session_mac));
883 WDS_LOGD("created session [%u] with peer [" MACSTR "]", session->session_id,
884 MAC2STR(session->session_mac));
886 if (session->session_id != prov_params->session_id ||
887 memcmp(&(session->session_mac), prov_params->session_mac, MACADDR_LEN) != 0) {
888 WDS_LOGE("Session MAC or ID not matched");
889 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
893 prov_params->status = 12;
895 prov_params->status = 11;
896 prov_params->deferring = 1;
898 res = wfd_oem_asp_prov_disc_req(manager->oem_ops, prov_params);
900 WDS_LOGE("Failed to start session");
901 wfd_destroy_session(manager);
902 __WDS_LOG_FUNC_EXIT__;
903 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
905 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
906 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
908 __WDS_LOG_FUNC_EXIT__;
909 return WIFI_DIRECT_ERROR_NONE;
913 int wfd_manager_accept_connection(wfd_manager_s *manager, unsigned char *peer_addr)
915 __WDS_LOG_FUNC_ENTER__;
916 wfd_session_s *session = NULL;
917 wfd_device_s *peer = NULL;
920 if (!manager || !peer_addr) {
921 WDS_LOGE("Invalid parameter");
922 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
925 session = (wfd_session_s*) manager->session;
927 WDS_LOGE("Session not found");
928 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
931 peer = wfd_peer_find_by_dev_addr(manager, peer_addr);
933 WDS_LOGE("Peer is NULL");
934 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
937 if (memcmp(session->peer->dev_addr, peer_addr, MACADDR_LEN) != 0) {
938 WDS_LOGE("Peer and ongoing session peer are different");
939 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
942 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
943 WDS_LOGD("My device is GO and peer want to join my group, so WPS will be started");
944 res = wfd_session_wps(session);
945 } else if (peer->dev_role == WFD_DEV_ROLE_GO) {
946 WDS_LOGD("Peer device is GO, so Prov_Disc or Join will be started");
947 if (session->type == SESSION_TYPE_INVITE) {
948 if (session->state == SESSION_STATE_CREATED) {
949 WDS_LOGD("Invitation session. PD will be started");
950 res = wfd_session_start(session);
952 WDS_LOGD("Invitation session. Join will be started");
953 res = wfd_session_join(session);
956 if (manager->autoconnection && (manager->auto_pin[0] != 0))
957 g_strlcpy(session->wps_pin, manager->auto_pin, PINSTR_LEN + 1);
959 WDS_LOGD("Peer device is GO, so WPS will be started");
960 res = wfd_session_connect(session);
963 /* We should wait GO_NEGO_REQ from peer(MO) in autoconnection mode. */
964 /* Otherwise, GO Nego is sometimes failed. */
965 if (manager->autoconnection == FALSE) {
966 WDS_LOGD("My device is Device, so Negotiation will be started");
967 res = wfd_session_connect(session);
971 WDS_LOGE("Failed to start session");
972 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
973 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
974 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
976 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
977 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
979 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
981 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
982 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
984 __WDS_LOG_FUNC_EXIT__;
985 return WIFI_DIRECT_ERROR_NONE;
989 int wfd_manager_cancel_connection(wfd_manager_s *manager, unsigned char *peer_addr)
991 __WDS_LOG_FUNC_ENTER__;
992 wfd_group_s *group = NULL;
995 if (!manager || !peer_addr) {
996 WDS_LOGE("Invalid parameter");
997 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1000 if (!manager->session && manager->state != WIFI_DIRECT_STATE_CONNECTING) {
1001 WDS_LOGE("It's not CONNECTING state");
1002 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
1005 res = wfd_session_cancel(manager->session, peer_addr);
1007 WDS_LOGE("Failed to cancel session");
1008 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1011 group = (wfd_group_s*) manager->group;
1013 wfd_group_remove_member(group, peer_addr);
1015 manager->local->dev_role = WFD_DEV_ROLE_NONE;
1017 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1018 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1019 if (group->member_count)
1020 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1022 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1023 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1026 __WDS_LOG_FUNC_EXIT__;
1027 return WIFI_DIRECT_ERROR_NONE;
1031 int wfd_manager_reject_connection(wfd_manager_s *manager, unsigned char *peer_addr)
1033 __WDS_LOG_FUNC_ENTER__;
1034 wfd_session_s *session = NULL;
1037 if (!manager || !peer_addr) {
1038 WDS_LOGE("Invalid parameter");
1039 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1042 session = (wfd_session_s*) manager->session;
1044 WDS_LOGE("Session not found");
1045 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
1048 if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
1049 WDS_LOGE("It's not permitted with this state [%d]", manager->state);
1050 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
1053 if (session->direction != SESSION_DIRECTION_INCOMING) {
1054 WDS_LOGE("Only incomming session can be rejected");
1055 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
1058 res = wfd_session_reject(session, peer_addr);
1060 WDS_LOGE("Failed to reject connection");
1061 /* TODO: check whether set state and break */
1063 wfd_destroy_session(manager);
1065 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1066 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1067 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1069 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1070 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1073 __WDS_LOG_FUNC_EXIT__;
1074 return WIFI_DIRECT_ERROR_NONE;
1078 int wfd_manager_disconnect(wfd_manager_s *manager, unsigned char *peer_addr)
1080 __WDS_LOG_FUNC_ENTER__;
1081 wfd_group_s *group = NULL;
1082 wfd_device_s *peer = NULL;
1086 WDS_LOGE("Invalid parameter");
1087 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1091 WDS_LOGE("Invalid parameter");
1092 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1095 group = (wfd_group_s*) manager->group;
1097 WDS_LOGE("Group not found");
1098 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
1101 peer = wfd_group_find_member_by_addr(group, peer_addr);
1103 WDS_LOGE("Connected peer not found");
1104 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1107 wfd_state_set(manager, WIFI_DIRECT_STATE_DISCONNECTING);
1108 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DISCONNECTING);
1110 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1112 res = wfd_oem_disconnect(manager->oem_ops, peer->dev_addr, 0);
1114 res = wfd_oem_disconnect(manager->oem_ops, peer->intf_addr, 1);
1116 res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1120 WDS_LOGE("Failed to disconnect peer");
1121 res = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1124 WDS_LOGE("Succeeded to disconnect peer");
1126 wfd_group_remove_member(group, peer_addr);
1127 if (!group->member_count) {
1128 wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1129 wfd_destroy_group(manager);
1132 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1133 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1134 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1136 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1137 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1140 __WDS_LOG_FUNC_EXIT__;
1141 return WIFI_DIRECT_ERROR_NONE;
1144 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1145 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1146 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1148 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
1149 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
1152 __WDS_LOG_FUNC_EXIT__;
1156 int wfd_manager_disconnect_all(wfd_manager_s *manager)
1158 __WDS_LOG_FUNC_ENTER__;
1159 wfd_group_s *group = NULL;
1163 WDS_LOGE("Invalid parameter");
1164 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1167 group = (wfd_group_s*) manager->group;
1169 WDS_LOGE("Group not found");
1170 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
1173 wfd_state_set(manager, WIFI_DIRECT_STATE_DISCONNECTING);
1174 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DISCONNECTING);
1176 res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1178 WDS_LOGE("Failed to destroy group");
1179 res = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1182 WDS_LOGE("Succeeded to disconnect all peer");
1184 wfd_destroy_group(manager);
1186 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1187 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1189 __WDS_LOG_FUNC_EXIT__;
1190 return WIFI_DIRECT_ERROR_NONE;
1193 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1194 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1195 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1197 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
1198 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
1201 __WDS_LOG_FUNC_EXIT__;
1205 int wfd_manager_get_peer_info(wfd_manager_s *manager, unsigned char *addr, wfd_discovery_entry_s **peer)
1207 __WDS_LOG_FUNC_ENTER__;
1208 wfd_device_s *peer_dev = NULL;
1209 wfd_discovery_entry_s *peer_info;
1210 wfd_oem_device_s *oem_dev = NULL;
1212 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
1214 if (!manager || !addr) {
1215 WDS_LOGE("Invalid parameter");
1219 unsigned long time = 0;
1220 #if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
1221 wfd_util_get_current_time(&time);
1223 struct timeval tval;
1224 gettimeofday(&tval, NULL);
1227 WDS_LOGI("Current time [%ld]", time);
1229 res = wfd_oem_get_peer_info(manager->oem_ops, addr, &oem_dev);
1230 if (res < 0 || !oem_dev) {
1231 WDS_LOGE("Failed to get peer information");
1235 peer_dev = wfd_peer_find_by_addr(manager, addr);
1237 peer_dev = (wfd_device_s*) g_try_malloc0(sizeof(wfd_device_s));
1239 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1240 WDS_LOGE("Failed to allocate memory for peer device. [%s]", error_buf);
1244 memcpy(peer_dev->dev_addr, addr, MACADDR_LEN);
1245 manager->peers = g_list_prepend(manager->peers, peer_dev);
1246 manager->peer_count++;
1247 peer_dev->time = time;
1248 WDS_LOGD("peer_count[%d]", manager->peer_count);
1250 if (oem_dev->age > 30 && peer_dev->state == WFD_PEER_STATE_DISCOVERED) {
1251 WDS_LOGE("Too old age to update peer");
1257 g_strlcpy(peer_dev->dev_name, oem_dev->dev_name, DEV_NAME_LEN + 1);
1258 memcpy(peer_dev->intf_addr, oem_dev->intf_addr, MACADDR_LEN);
1259 memcpy(peer_dev->go_dev_addr, oem_dev->go_dev_addr, MACADDR_LEN);
1260 peer_dev->dev_role = oem_dev->dev_role;
1261 peer_dev->config_methods = oem_dev->config_methods;
1262 peer_dev->pri_dev_type = oem_dev->pri_dev_type;
1263 peer_dev->sec_dev_type = oem_dev->sec_dev_type;
1264 peer_dev->dev_flags = oem_dev->dev_flags;
1265 peer_dev->group_flags = oem_dev->group_flags;
1266 peer_dev->wps_mode = oem_dev->wps_mode;
1268 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
1269 memcpy(&(peer_dev->display), &(oem_dev->display), sizeof(wfd_display_s));
1270 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
1272 peer_dev->time = time;
1273 peer_dev->channel = oem_dev->channel;
1277 peer_info = (wfd_discovery_entry_s*) g_try_malloc0(sizeof(wfd_discovery_entry_s));
1279 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1280 WDS_LOGE("Failed to allocate memory for peer data. [%s]", error_buf);
1284 g_strlcpy(peer_info->device_name, peer_dev->dev_name, DEV_NAME_LEN + 1);
1285 memcpy(peer_info->mac_address, peer_dev->dev_addr, MACADDR_LEN);
1286 memcpy(peer_info->intf_address, peer_dev->intf_addr, MACADDR_LEN);
1287 peer_info->channel = peer_dev->channel;
1288 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1289 peer_info->services = 0;
1290 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1291 peer_info->is_group_owner = peer_dev->dev_role == WFD_DEV_ROLE_GO;
1292 peer_info->is_persistent_go = peer_dev->group_flags & WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
1293 peer_info->is_connected = peer_dev->dev_role == WFD_DEV_ROLE_GC;
1294 peer_info->wps_device_pwd_id = 0;
1295 peer_info->wps_cfg_methods = peer_dev->config_methods;
1296 peer_info->category = peer_dev->pri_dev_type;
1297 peer_info->subcategory = peer_dev->sec_dev_type;
1299 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
1300 if (peer_dev->display.availability && peer_dev->display.port)
1301 peer_info->is_wfd_device = 1;
1302 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
1306 __WDS_LOG_FUNC_EXIT__;
1311 int wfd_manager_get_peers(wfd_manager_s *manager, wfd_discovery_entry_s **peers_data)
1313 __WDS_LOG_FUNC_ENTER__;
1315 wfd_device_s *peer = NULL;
1316 wfd_discovery_entry_s *peers = NULL;
1320 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
1322 if (!manager || !peers_data) {
1323 WDS_LOGE("Invalid parameter");
1327 unsigned long time = 0;
1328 #if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
1329 wfd_util_get_current_time(&time);
1331 struct timeval tval;
1332 gettimeofday(&tval, NULL);
1335 WDS_LOGI("Current time [%ld]", time);
1337 peer_count = manager->peer_count;
1338 WDS_LOGI("peer count [%ld]", peer_count);
1341 else if (peer_count == 0)
1345 peers = (wfd_discovery_entry_s*) g_try_malloc0_n(peer_count, sizeof(wfd_discovery_entry_s));
1347 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1348 WDS_LOGE("Failed to allocate memory for peer data. [%s]", error_buf);
1352 temp = g_list_first(manager->peers);
1353 while (temp && count < peer_count) {
1357 if (peer->time + 8 < time) {
1358 WDS_LOGD("Device data is too old to report to application [%s]", peer->dev_name);
1359 res = wfd_update_peer(manager, peer);
1361 WDS_LOGE("This device is disappeared [%s]", peer->dev_name);
1362 temp = g_list_next(temp);
1363 manager->peers = g_list_remove(manager->peers, peer);
1364 manager->peer_count--;
1371 g_strlcpy(peers[count].device_name, peer->dev_name, DEV_NAME_LEN + 1);
1372 memcpy(peers[count].mac_address, peer->dev_addr, MACADDR_LEN);
1373 memcpy(peers[count].intf_address, peer->intf_addr, MACADDR_LEN);
1374 peers[count].channel = peer->channel;
1375 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1376 peers[count].services = 0;
1377 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1378 peers[count].is_group_owner = peer->dev_role == WFD_DEV_ROLE_GO;
1379 peers[count].is_persistent_go = peer->group_flags & WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
1380 peers[count].is_connected = peer->dev_role == WFD_DEV_ROLE_GC;
1381 peers[count].wps_device_pwd_id = 0;
1382 peers[count].wps_cfg_methods = peer->config_methods;
1383 peers[count].category = peer->pri_dev_type;
1384 peers[count].subcategory = peer->sec_dev_type;
1386 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
1387 if (peer->display.availability && peer->display.port)
1388 peers[count].is_wfd_device = 1;
1389 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
1391 WDS_LOGD("%dth peer [%s]", count, peer->dev_name);
1393 temp = g_list_next(temp);
1396 WDS_LOGD("%d peers converted", count);
1397 WDS_LOGD("Final peer count is %d", manager->peer_count);
1399 *peers_data = peers;
1401 __WDS_LOG_FUNC_EXIT__;
1405 int wfd_manager_get_connected_peers(wfd_manager_s *manager, wfd_connected_peer_info_s **peers_data)
1407 __WDS_LOG_FUNC_ENTER__;
1408 wfd_connected_peer_info_s *peers = NULL;
1409 wfd_group_s *group = NULL;
1410 wfd_device_s *peer = NULL;
1414 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
1416 if (!manager || !peers_data) {
1417 WDS_LOGE("Invalid parameter");
1421 group = manager->group;
1423 WDS_LOGE("Group not exist");
1427 peer_count = group->member_count;
1428 if (peer_count == 0) {
1429 WDS_LOGD("Member not exist");
1434 peers = (wfd_connected_peer_info_s*) g_try_malloc0_n(peer_count, sizeof(wfd_connected_peer_info_s));
1436 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1437 WDS_LOGE("Failed to allocate memory for connected peer data. [%s]", error_buf);
1441 temp = g_list_first(group->members);
1442 while (temp && count < group->member_count) {
1445 g_strlcpy(peers[count].device_name, peer->dev_name, DEV_NAME_LEN + 1);
1446 memcpy(peers[count].mac_address, peer->dev_addr, MACADDR_LEN);
1447 memcpy(peers[count].intf_address, peer->intf_addr, MACADDR_LEN);
1448 memcpy(peers[count].ip_address, peer->ip_addr, IPADDR_LEN);
1449 peers[count].category = peer->pri_dev_type;
1450 peers[count].subcategory = peer->sec_dev_type;
1451 peers[count].channel = peer->channel;
1452 peers[count].is_p2p = peer->is_p2p;
1453 #ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
1454 peers[count].services = 0;
1455 #endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
1457 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
1458 if (peer->display.availability && peer->display.port)
1459 peers[count].is_wfd_device = 1;
1461 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
1463 WDS_LOGD("%dth member converted[%s]", count, peers[count].device_name);
1466 temp = g_list_next(temp);
1469 WDS_LOGD("%d members converted", count);
1471 *peers_data = peers;
1473 __WDS_LOG_FUNC_EXIT__;
1477 #ifdef TIZEN_FEATURE_ASP
1478 wfd_device_s *wfd_manager_get_connected_peer_by_addr(wfd_manager_s *manager, unsigned char *peer_addr)
1480 __WDS_LOG_FUNC_ENTER__;
1481 wfd_device_s *peer = NULL;
1483 if (peer_addr == NULL) {
1484 WDS_LOGE("Invalid parameter");
1485 __WDS_LOG_FUNC_EXIT__;
1490 peer = wfd_group_find_member_by_addr(manager->group, peer_addr);
1492 __WDS_LOG_FUNC_EXIT__;
1495 #endif /* TIZEN_FEATURE_ASP */
1498 wfd_device_s *wfd_manager_find_connected_peer(wfd_manager_s *manager, unsigned char *peer_addr)
1500 __WDS_LOG_FUNC_ENTER__;
1501 wfd_device_s *peer = NULL;
1503 if (!manager || !peer_addr) {
1504 WDS_LOGE("Invalid parameter");
1508 peer = wfd_group_find_member_by_addr(manager->group, peer_addr);
1510 __WDS_LOG_FUNC_EXIT__;
1515 int wfd_manager_get_goup_ifname(char **ifname)
1517 __WDS_LOG_FUNC_ENTER__;
1518 wfd_group_s *group = g_manager->group;
1521 WDS_LOGE("Invalid parameter");
1522 __WDS_LOG_FUNC_EXIT__;
1527 WDS_LOGE("Group not exist");
1531 *ifname = group->ifname;
1533 __WDS_LOG_FUNC_EXIT__;
1537 #ifdef TIZEN_FEATURE_WIFI_DISPLAY
1538 int wfd_manager_set_display_device(int type, int port, int hdcp)
1540 __WDS_LOG_FUNC_ENTER__;
1541 wfd_device_s * device = g_manager->local;
1542 wfd_oem_display_s display;
1546 WDS_LOGE("Invalid parameter");
1547 __WDS_LOG_FUNC_EXIT__;
1551 memset(&display, 0x0, sizeof(wfd_oem_display_s));
1553 display.type = type;
1554 display.port = port;
1555 display.hdcp_support = hdcp;
1557 display.availability = device->display.availability;
1558 display.max_tput = device->display.max_tput;
1560 res = wfd_oem_set_display(g_manager->oem_ops, (wfd_oem_display_s*)&display);
1562 WDS_LOGE("Failed to set wifi display");
1566 device->display.type = type;
1567 device->display.port = port;
1568 device->display.hdcp_support = hdcp;
1570 __WDS_LOG_FUNC_EXIT__;
1574 int wfd_manager_set_session_availability(int availability)
1576 __WDS_LOG_FUNC_ENTER__;
1577 wfd_device_s * device = g_manager->local;
1578 wfd_oem_display_s display;
1582 WDS_LOGE("Invalid parameter");
1583 __WDS_LOG_FUNC_EXIT__;
1587 memset(&display, 0x0, sizeof(wfd_oem_display_s));
1589 display.availability = availability;
1591 display.type = device->display.type;
1592 display.hdcp_support = device->display.hdcp_support;
1593 display.port = device->display.port;
1594 display.max_tput = device->display.max_tput;
1596 res = wfd_oem_set_display(g_manager->oem_ops, (wfd_oem_display_s*)&display);
1598 WDS_LOGE("Failed to set wifi display session availability");
1602 device->display.availability = availability;
1604 __WDS_LOG_FUNC_EXIT__;
1608 #endif /* TIZEN_FEATURE_WIFI_DISPLAY */
1610 int wfd_manager_start_discovery(wfd_manager_s *manager, int mode, int timeout,
1611 const char* type, int channel)
1613 __WDS_LOG_FUNC_ENTER__;
1614 int res = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1615 wfd_oem_scan_param_s param;
1616 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
1618 WDS_LOGI("Mode: [%d], Timeout: [%d], type: [%s], channel: [%d]", mode, timeout, type, channel);
1620 if (manager->local->dev_role == WFD_DEV_ROLE_GO)
1621 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
1623 if (channel == WFD_DISCOVERY_FULL_SCAN) {
1624 param.scan_type = WFD_OEM_SCAN_TYPE_FULL;
1625 } else if (channel == WFD_DISCOVERY_SOCIAL_CHANNEL) {
1626 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
1627 } else if (channel == WFD_DISCOVERY_CHANNEL1) {
1628 param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL1;
1630 } else if (channel == WFD_DISCOVERY_CHANNEL6) {
1631 param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL6;
1633 } else if (channel == WFD_DISCOVERY_CHANNEL11) {
1634 param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL11;
1637 param.scan_type = WFD_OEM_SCAN_TYPE_SPECIFIC;
1638 param.freq = wfd_util_channel_to_freq(channel);
1642 param.scan_mode = WFD_OEM_SCAN_MODE_PASSIVE;
1644 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
1646 param.scan_time = timeout;
1648 res = wfd_oem_start_scan(manager->oem_ops, ¶m);
1650 WDS_LOGE("Failed to start scan");
1651 __WDS_LOG_FUNC_EXIT__;
1652 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1656 manager->scan_mode = WFD_SCAN_MODE_PASSIVE;
1658 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
1660 if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
1661 wfd_state_set(manager, WIFI_DIRECT_STATE_DISCOVERING);
1662 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DISCOVERING);
1665 WDS_LOGD("Succeeded to start scan");
1666 __WDS_LOG_FUNC_EXIT__;
1667 return WIFI_DIRECT_ERROR_NONE;
1670 int wfd_manager_cancel_discovery(wfd_manager_s *manager)
1672 __WDS_LOG_FUNC_ENTER__;
1675 res = wfd_oem_stop_scan(manager->oem_ops);
1677 WDS_LOGE("Failed to stop scan");
1678 __WDS_LOG_FUNC_EXIT__;
1679 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1682 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1683 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1684 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1686 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1687 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1690 WDS_LOGD("Succeeded to stop scan");
1691 __WDS_LOG_FUNC_EXIT__;
1692 return WIFI_DIRECT_ERROR_NONE;
1695 wfd_device_s *wfd_manager_get_peer_by_addr(wfd_manager_s *manager, unsigned char *peer_addr)
1697 __WDS_LOG_FUNC_ENTER__;
1698 wfd_device_s *peer = NULL;
1700 peer = wfd_group_find_member_by_addr(manager->group, peer_addr);
1705 peer = wfd_peer_find_by_addr(manager, peer_addr);
1707 __WDS_LOG_FUNC_EXIT__;
1711 static wfd_manager_s *wfd_manager_init()
1713 __WDS_LOG_FUNC_ENTER__;
1714 wfd_manager_s *manager = NULL;
1717 manager = (wfd_manager_s*) g_try_malloc0(sizeof(wfd_manager_s));
1719 WDS_LOGE("Failed to allocate memory for wfd_manager structure");
1723 manager->go_intent = 7;
1724 manager->req_wps_mode = WFD_WPS_MODE_PBC;
1725 manager->max_station = 8;
1726 manager->session_timer = 120;
1727 manager->auto_group_remove_enable = TRUE;
1728 res = _wfd_local_init_device(manager);
1730 WDS_LOGE("Failed to initialize local device");
1732 return NULL; /* really stop manager? */
1734 WDS_LOGD("Succeeded to initialize local device");
1736 #ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
1737 manager->client_count = 0;
1738 manager->client_list = NULL;
1739 manager->exit_timer = g_timeout_add(120000,
1740 (GSourceFunc) _wfd_exit_timeout_cb, manager);
1741 WDS_LOGD("Exit timer started");
1742 #endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
1744 __WDS_LOG_FUNC_EXIT__;
1748 int wfd_manager_deinit(wfd_manager_s *manager)
1750 __WDS_LOG_FUNC_ENTER__;
1753 WDS_LOGE("Invalid parameter");
1754 __WDS_LOG_FUNC_EXIT__;
1758 #ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
1759 if (manager->exit_timer > 0)
1760 g_source_remove(manager->exit_timer);
1761 manager->exit_timer = 0;
1762 #endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
1764 _wfd_local_deinit_device(manager);
1768 __WDS_LOG_FUNC_EXIT__;
1772 static void *wfd_plugin_init(wfd_manager_s *manager)
1774 __WDS_LOG_FUNC_ENTER__;
1776 struct utsname kernel_info;
1778 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
1781 WDS_LOGE("Invalid parameter");
1782 __WDS_LOG_FUNC_EXIT__;
1786 res = uname(&kernel_info);
1788 WDS_LOGE("Failed to detect target type");
1789 __WDS_LOG_FUNC_EXIT__;
1792 WDS_LOGD("Node name [%s], HW ID [%s]", kernel_info.nodename, kernel_info.machine);
1796 #if defined(TIZEN_ARCH_64)
1797 handle = dlopen(SUPPL_PLUGIN_64BIT_PATH, RTLD_NOW);
1799 handle = dlopen(SUPPL_PLUGIN_PATH, RTLD_NOW);
1802 WDS_LOGE("Failed to open shared object. [%s]", dlerror());
1803 __WDS_LOG_FUNC_EXIT__;
1808 int (*plugin_load)(wfd_oem_ops_s **ops) = NULL;
1809 plugin_load = (int (*)(wfd_oem_ops_s **ops)) dlsym(handle, "wfd_plugin_load");
1811 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1812 WDS_LOGE("Failed to load symbol. Error = [%s]", error_buf);
1814 __WDS_LOG_FUNC_EXIT__;
1818 wfd_oem_ops_s *temp_ops;
1819 (*plugin_load)(&temp_ops);
1820 manager->oem_ops = temp_ops;
1822 res = wfd_oem_init(temp_ops);
1824 WDS_LOGE("Failed to initialize OEM");
1826 __WDS_LOG_FUNC_EXIT__;
1829 WDS_LOGD("Succeeded to initialize OEM");
1831 __WDS_LOG_FUNC_EXIT__;
1835 static int wfd_plugin_deinit(wfd_manager_s *manager)
1837 __WDS_LOG_FUNC_ENTER__;
1839 if (!manager || !manager->plugin_handle) {
1840 WDS_LOGE("Invalid parameter");
1841 __WDS_LOG_FUNC_EXIT__;
1845 dlclose(manager->plugin_handle);
1846 manager->plugin_handle = NULL;
1848 __WDS_LOG_FUNC_EXIT__;
1852 #if defined TIZEN_ENABLE_PRD
1853 static void *wfd_prd_plugin_init(wfd_manager_s *manager)
1855 __WDS_LOG_FUNC_ENTER__;
1857 struct utsname kernel_info;
1861 WDS_LOGE("Invalid parameter");
1862 __WDS_LOG_FUNC_EXIT__;
1866 res = uname(&kernel_info);
1868 WDS_LOGE("Failed to detect target type");
1869 __WDS_LOG_FUNC_EXIT__;
1872 WDS_LOGD("Node name [%s], HW ID [%s]", kernel_info.nodename, kernel_info.machine);
1876 #if defined(TIZEN_ARCH_64)
1877 handle = dlopen(SUPPL_PRD_PLUGIN_64BIT_PATH, RTLD_NOW);
1879 handle = dlopen(SUPPL_PRD_PLUGIN_PATH, RTLD_NOW);
1882 WDS_LOGE("Failed to open shared object. [%s]", dlerror());
1883 __WDS_LOG_FUNC_EXIT__;
1888 int (*plugin_load)(wfd_oem_ops_s **ops) = NULL;
1889 plugin_load = (int (*)(wfd_oem_ops_s **ops)) dlsym(handle, "wfd_prd_plugin_load");
1891 WDS_LOGE("Failed to load symbol. Error = [%s]", strerror(errno));
1893 __WDS_LOG_FUNC_EXIT__;
1897 (*plugin_load)((wfd_oem_ops_s **)&manager->oem_ops);
1899 res = wfd_oem_prd_init((wfd_oem_ops_s *)manager->oem_ops);
1901 WDS_LOGE("Failed to initialize PRD OEM");
1903 __WDS_LOG_FUNC_EXIT__;
1906 WDS_LOGD("Succeeded to initialize PRD OEM");
1908 __WDS_LOG_FUNC_EXIT__;
1912 static int wfd_prd_plugin_deinit(wfd_manager_s *manager)
1914 __WDS_LOG_FUNC_ENTER__;
1916 if (!manager || !manager->prd_plugin_handle) {
1917 WDS_LOGE("Invalid parameter");
1918 __WDS_LOG_FUNC_EXIT__;
1922 dlclose(manager->prd_plugin_handle);
1923 manager->prd_plugin_handle = NULL;
1925 __WDS_LOG_FUNC_EXIT__;
1928 #endif /* TIZEN_ENABLE_PRD */
1930 int main(int argc, char *argv[])
1932 __WDS_LOG_FUNC_ENTER__;
1933 GMainLoop *main_loop = NULL;
1935 #if !GLIB_CHECK_VERSION(2, 32, 0)
1936 if (!g_thread_supported())
1937 g_thread_init(NULL);
1940 #if !GLIB_CHECK_VERSION(2, 36, 0)
1944 /* TODO: Parsing argument */
1945 /* Wi-Fi direct connection for S-Beam can be optimized using argument */
1948 * wfd-manager initialization
1950 g_manager = wfd_manager_init();
1952 WDS_LOGE("Failed to initialize wifi-direct manager");
1953 __WDS_LOG_FUNC_EXIT__;
1956 WDS_LOGD("Succeeded to initialize manager");
1959 * wfd_manager_plugin initialization
1961 g_manager->plugin_handle = wfd_plugin_init(g_manager);
1962 if (!g_manager->plugin_handle) {
1963 WDS_LOGE("Failed to initialize plugin");
1964 wfd_manager_deinit(g_manager);
1965 __WDS_LOG_FUNC_EXIT__;
1968 WDS_LOGD("Succeeded to load plugin");
1970 #if defined TIZEN_ENABLE_PRD
1972 * wfd_manager_prd_plugin initialization
1974 g_manager->prd_plugin_handle = wfd_prd_plugin_init(g_manager);
1975 if (!g_manager->prd_plugin_handle)
1976 WDS_LOGW("Failed to initialize prd plugin");
1978 WDS_LOGD("Succeeded to load plugin");
1979 #endif /* TIZEN_ENABLE_PRD */
1981 if (!wfd_manager_dbus_init()) {
1982 WDS_LOGE("Failed to DBus");
1983 wfd_plugin_deinit(g_manager);
1984 wfd_manager_deinit(g_manager);
1985 __WDS_LOG_FUNC_EXIT__;
1989 main_loop = g_main_loop_new(NULL, FALSE);
1990 if (main_loop == NULL) {
1991 WDS_LOGE("Failed to create GMainLoop structure");
1992 __WDS_LOG_FUNC_EXIT__;
1995 g_manager->main_loop = main_loop;
1996 g_main_loop_run(main_loop);
1998 #ifdef TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND
1999 wfd_manager_dbus_unregister_nameowner_signal();
2000 #endif/* TIZEN_FEATURE_WIFI_DIRECT_ON_DEMAND */
2002 wfd_manager_dbus_unregister();
2003 wfd_manager_dbus_deinit();
2005 #if defined TIZEN_ENABLE_PRD
2006 wfd_prd_plugin_deinit(g_manager);
2007 #endif /* TIZEN_ENABLE_PRD */
2009 wfd_plugin_deinit(g_manager);
2010 wfd_manager_deinit(g_manager);
2012 __WDS_LOG_FUNC_EXIT__;