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)
35 #include <glib-object.h>
37 #include <wifi-direct.h>
39 #include "wifi-direct-ipc.h"
40 #include "wifi-direct-manager.h"
41 #include "wifi-direct-oem.h"
42 #include "wifi-direct-session.h"
43 #include "wifi-direct-group.h"
44 #include "wifi-direct-peer.h"
45 #include "wifi-direct-state.h"
46 #include "wifi-direct-event.h"
47 #include "wifi-direct-util.h"
48 #include "wifi-direct-log.h"
49 #include "wifi-direct-error.h"
50 #include "wifi-direct-iface.h"
51 #include "wifi-direct-dbus.h"
53 #if defined TIZEN_ENABLE_PRD
54 #include "wifi-direct-prd.h"
55 #endif /* TIZEN_ENABLE_PRD */
57 wfd_manager_s *g_manager = NULL;
59 wfd_manager_s *wfd_get_manager()
64 /* Stop wfd-manager services, If no client
65 exists and state is deactivated. */
66 static gboolean _wfd_exit_timeout_cb(void *user_data)
68 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
69 wfd_manager_s *manager = (wfd_manager_s*) user_data;
72 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
76 if (manager->client_count > 0) {
77 WDS_LOGD("Client count [%d]", manager->client_count);
81 if (manager->state == WIFI_DIRECT_STATE_DEACTIVATED) {
82 WDS_LOGD("Terminate Wi-Fi Direct Manager");//LCOV_EXCL_LINE
83 g_main_loop_quit(manager->main_loop);
84 manager->exit_timer = 0;
85 WDS_LOGD("Stop exit timer. State [%d]", manager->state);
86 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
90 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
94 void wfd_manager_free_active_client_list(void)
97 wfd_manager_s *manager = wfd_get_manager();
99 if (!manager || !manager->client_list)
102 for (list = manager->client_list; list; list = list->next)
105 g_slist_free(manager->client_list);
108 void wfd_manager_add_active_client(const char *client_id)
111 gboolean if_exists = FALSE;
113 wfd_manager_s *manager = wfd_get_manager();
114 if (!manager || !client_id)
117 for (list = manager->client_list; list; list = list->next) {
119 if (str && !g_strcmp0(client_id, str)) {
125 // If not exists in list, add the sender
126 if (if_exists == FALSE) {
127 manager->client_list = g_slist_prepend(manager->client_list,
128 g_strdup(client_id));
129 manager->client_count++;
130 WDS_LOGD("Added DBus sender id[%s] count[%d]", client_id,
131 manager->client_count);
135 void wfd_manager_remove_active_client(const gchar *name,
136 const char *old_owner,
137 const char *new_owner)
141 wfd_manager_s *manager = wfd_get_manager();
146 if (!g_strcmp0(new_owner, "")) {
147 if (manager->client_count > 0) {
148 for (list = manager->client_list; list; list = list->next) {
150 if (str && !g_strcmp0(old_owner, str)) {
151 manager->client_list =
152 g_slist_remove(manager->client_list, str);
154 manager->client_count--;
155 WDS_LOGD("Removed name[%s] old[%s] new[%s] count[%d]",
156 name, old_owner, new_owner, manager->client_count);
164 static int _wfd_local_init_device(wfd_manager_s *manager)
166 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
167 wfd_device_s *local = NULL;
169 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
170 wfd_oem_config_s *config;
173 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
177 config = manager->wfd_oem_conf;
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");//LCOV_EXCL_LINE
191 g_strlcpy(local->dev_name, config->device_name, DEV_NAME_LEN + 1);
193 g_strlcpy(local->dev_name, DEFAULT_DEVICE_NAME, DEV_NAME_LEN + 1);
195 WDS_LOGD("Local Device name [%s]", local->dev_name);
196 wfd_util_set_dev_name_notification();
198 local->config_methods = WFD_WPS_MODE_PBC | WFD_WPS_MODE_DISPLAY | WFD_WPS_MODE_KEYPAD;
199 local->wps_mode = WFD_WPS_MODE_PBC;
200 local->services = NULL;
201 local->service_count = 0;
202 /* TODO: initialize other local device datas */
203 manager->local = local;
205 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
209 static int _wfd_local_deinit_device(wfd_manager_s *manager)
211 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
214 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
218 wfd_util_unset_dev_name_notification();
220 /* TODO: free member of local device */
221 g_free(manager->local);
223 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
227 int wfd_local_reset_data(wfd_manager_s *manager)
229 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
230 wfd_device_s *local = NULL;
233 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
237 local = manager->local;
238 /* init local device data */
239 local->dev_role = WFD_DEV_ROLE_NONE;
240 local->wps_mode = WFD_WPS_MODE_PBC;
241 memset(local->go_dev_addr, 0x0, MACADDR_LEN);
242 if (manager->is_wifi_display_supported)
243 memset(&(local->display), 0x0, sizeof(wfd_display_s));
244 memset(local->ip_addr, 0x0, IPADDR_LEN);
246 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
250 int wfd_local_get_dev_name(char *dev_name)
252 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
253 wfd_device_s *local = g_manager->local;
256 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
257 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
261 g_strlcpy(dev_name, local->dev_name, DEV_NAME_LEN + 1);
262 WDS_LOGD("Local device name [%s]", dev_name);
264 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
268 int wfd_local_set_dev_name(char *dev_name)
270 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
271 wfd_device_s *local = g_manager->local;
274 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
275 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
279 g_strlcpy(local->dev_name, dev_name, DEV_NAME_LEN + 1);
281 if (g_manager->state >= WIFI_DIRECT_STATE_ACTIVATED) {
282 wfd_oem_set_dev_name(g_manager->oem_ops, dev_name);
283 WDS_LOGD("Device name changed.");//LCOV_EXCL_LINE
285 WDS_LOGE("Device name can't changed: state is %d", g_manager->state);
288 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
292 int wfd_local_get_dev_mac(char *dev_mac)
294 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
295 wfd_device_s *local = g_manager->local;
298 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
299 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
303 g_snprintf(dev_mac, MACSTR_LEN, MACSTR, MAC2STR(local->dev_addr));
304 WDS_SECLOGD("Local device MAC address [%s]", dev_mac);
306 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
310 int wfd_local_get_ip_addr(char *ip_str)
312 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
313 wfd_device_s *local = g_manager->local;
316 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
317 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
321 snprintf(ip_str, IPSTR_LEN, IPSTR, IP2STR(local->ip_addr));
322 WDS_SECLOGD("Local IP address [" IPSECSTR "]", IP2SECSTR(local->ip_addr));
324 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
328 int wfd_local_get_supported_wps_mode(int *config_methods)
330 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
331 wfd_device_s *local = g_manager->local;
333 if (!config_methods) {
334 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
335 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
339 *config_methods = local->config_methods;
340 WDS_LOGD("Local config method [0x%x]", *config_methods);
342 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
346 int wfd_local_get_wps_mode(int *wps_mode)
348 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
349 wfd_device_s *local = g_manager->local;
352 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
353 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
357 *wps_mode = local->wps_mode;
358 WDS_LOGD("Local wps mode [0x%x]", *wps_mode);
360 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
365 int wfd_local_set_wps_mode(int wps_mode)
367 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
368 wfd_device_s *local = g_manager->local;
371 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
372 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
376 local->wps_mode = wps_mode;
377 WDS_LOGD("Local wps mode [0x%x]", wps_mode);
379 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
384 int wfd_manager_get_go_intent(int *go_intent)
386 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
388 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
389 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
393 *go_intent = g_manager->go_intent;
394 WDS_LOGD("Local GO intent [%d]", *go_intent);
396 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
400 int wfd_manager_set_go_intent(int go_intent)
402 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
404 if (go_intent < 0 || go_intent > 15) {
405 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
406 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
410 g_manager->go_intent = go_intent;
411 if (g_manager->state >= WIFI_DIRECT_STATE_ACTIVATED)
412 wfd_oem_set_go_intent(g_manager->oem_ops, go_intent);
414 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
418 int wfd_manager_get_go_intent_per_type(int type, int *go_intent)
420 __WDS_LOG_FUNC_ENTER__;
422 WDS_LOGE("Invalid parameter");
423 __WDS_LOG_FUNC_EXIT__;
427 if (type < 0 || type >= WFD_MAX_TYPE) {
428 WDS_LOGE("Invalid parameter");
429 __WDS_LOG_FUNC_EXIT__;
433 *go_intent = g_manager->go_intent_per_type[type];
434 WDS_LOGD("Get Go_Intent[%d] : [%d]", type, *go_intent);
436 __WDS_LOG_FUNC_EXIT__;
440 int wfd_manager_set_go_intent_per_type(int type, int go_intent)
442 __WDS_LOG_FUNC_ENTER__;
444 if (go_intent < 0 || go_intent > 15) {
445 WDS_LOGE("Invalid parameter");
446 __WDS_LOG_FUNC_EXIT__;
450 if (type < 0 || type >= WFD_MAX_TYPE) {
451 WDS_LOGE("Invalid parameter");
452 __WDS_LOG_FUNC_EXIT__;
456 g_manager->go_intent_per_type[type] = go_intent;
457 WDS_LOGD("Set Go_Intent[%d] : [%d]", type, g_manager->go_intent_per_type[type]);
459 __WDS_LOG_FUNC_EXIT__;
463 int wfd_manager_get_max_station(int *max_station)
465 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
468 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
469 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
473 *max_station = g_manager->max_station;
474 WDS_LOGD("Local max station[%d]", *max_station);
476 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
480 int wfd_manager_set_max_station(int max_station)
482 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
484 if (max_station < 1) {
485 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
486 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
490 g_manager->max_station = max_station;
492 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
496 int wfd_manager_get_autoconnection(int *autoconnection)
498 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
499 if (!autoconnection) {
500 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
501 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
505 *autoconnection = g_manager->autoconnection;
506 WDS_LOGD("Local autoconnection [%s]", *autoconnection ? "TRUE" : "FALSE");//LCOV_EXCL_LINE
508 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
512 int wfd_manager_set_autoconnection(int autoconnection)
514 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
515 if (autoconnection < 0) {
516 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
517 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
521 g_manager->autoconnection = autoconnection;
523 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
527 int wfd_manager_get_req_wps_mode(int *req_wps_mode)
529 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
532 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
533 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
537 *req_wps_mode = g_manager->req_wps_mode;
538 WDS_LOGD("Requested wps mode [0x%x]", *req_wps_mode);
540 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
544 int wfd_manager_set_req_wps_mode(int req_wps_mode)
546 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
547 wfd_device_s *local = g_manager->local;
549 if (req_wps_mode != WIFI_DIRECT_WPS_TYPE_PBC &&
550 req_wps_mode != WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY &&
551 req_wps_mode != WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD) {
552 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
553 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
557 g_manager->req_wps_mode = req_wps_mode;
558 WDS_LOGD("Requested wps mode [0x%x]", req_wps_mode);
559 if (req_wps_mode == WFD_WPS_MODE_DISPLAY)
560 local->wps_mode = WFD_WPS_MODE_KEYPAD;
561 else if (req_wps_mode == WFD_WPS_MODE_KEYPAD)
562 local->wps_mode = WFD_WPS_MODE_DISPLAY;
564 local->wps_mode = req_wps_mode;
566 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
570 int wfd_manager_local_config_set(wfd_manager_s *manager)
572 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
573 wfd_device_s *local = NULL;
574 int ip_over_eapol = 0;
578 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
579 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
582 local = manager->local;
584 local->wps_mode = WFD_WPS_MODE_PBC;
585 WDS_LOGD("Device name set as %s", local->dev_name);
586 res = wfd_oem_set_dev_name(manager->oem_ops, local->dev_name);
588 WDS_LOGE("Failed to set device name");//LCOV_EXCL_LINE
589 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
592 local->pri_dev_type = DEFAULT_PRIMARY_DEVICE_TYPE;
593 local->sec_dev_type = DEFAULT_SECONDARY_DEVICE_TYPE;
594 res = wfd_oem_set_dev_type(manager->oem_ops, local->pri_dev_type, local->sec_dev_type);
596 WDS_LOGE("Failed to set device type");//LCOV_EXCL_LINE
597 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
600 res = wfd_oem_set_go_intent(manager->oem_ops, manager->go_intent);
602 WDS_LOGE("Failed to set go intent");//LCOV_EXCL_LINE
603 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
606 if (manager->is_ip_over_eapol)
610 res = wfd_oem_set_eapol_ip_config(manager->oem_ops, ip_over_eapol);
612 WDS_LOGE("Failed to set eapol ip config");//LCOV_EXCL_LINE
613 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
616 return WIFI_DIRECT_ERROR_NONE;
619 int wfd_manager_activate(wfd_manager_s *manager)
621 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
626 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
627 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
630 if (manager->state > WIFI_DIRECT_STATE_ACTIVATING) {
631 WDS_LOGE("Already activated");//LCOV_EXCL_LINE
635 if (manager->state == WIFI_DIRECT_STATE_ACTIVATING) {
636 WDS_LOGE("In progress");//LCOV_EXCL_LINE
637 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
640 res = wfd_util_wifi_direct_activatable();
642 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
644 wfd_state_get(manager, &prev_state);
645 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATING);
646 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATING);
647 res = wfd_util_check_wifi_state();
649 WDS_LOGE("Failed to get wifi state");//LCOV_EXCL_LINE
650 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
651 } else if (res == 0) {
652 res = wfd_oem_activate(manager->oem_ops, 0);
654 WDS_LOGE("Failed to activate");//LCOV_EXCL_LINE
655 wfd_state_set(manager, prev_state);
656 wfd_util_set_wifi_direct_state(prev_state);
657 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
660 res = wfd_oem_activate(manager->oem_ops, res);
662 WDS_LOGE("Failed to activate");//LCOV_EXCL_LINE
663 wfd_state_set(manager, prev_state);
664 wfd_util_set_wifi_direct_state(prev_state);
665 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
668 WDS_LOGE("Succeeded to activate");//LCOV_EXCL_LINE
670 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
671 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
673 wfd_manager_local_config_set(manager);
674 if (manager->is_connection_agent)
675 wfd_util_start_wifi_direct_popup();
677 res = wfd_util_get_local_dev_mac(manager->local->dev_addr);
679 WDS_LOGE("Failed to get local device MAC address");//LCOV_EXCL_LINE
681 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
682 return WIFI_DIRECT_ERROR_NONE;
685 int wfd_manager_deactivate(wfd_manager_s *manager)
687 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
690 wfd_group_s *group = NULL;
693 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
694 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
697 wfd_state_get(manager, &prev_state);
698 wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATING);
699 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATING);
701 if (manager->is_wifi_display_supported) {
702 res = wfd_oem_miracast_init(manager->oem_ops, false);
704 WDS_LOGE("Failed to initialize miracast");//LCOV_EXCL_LINE
707 group = (wfd_group_s*) manager->group;
708 if (group && group->pending == FALSE) {
709 res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
711 WDS_LOGE("Failed to destroy group before deactivation");//LCOV_EXCL_LINE
714 res = wfd_util_check_wifi_state();
716 WDS_LOGE("Failed to get wifi state");//LCOV_EXCL_LINE
717 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
718 } else if (res == 0) {
719 res = wfd_oem_deactivate(manager->oem_ops, 0);
721 WDS_LOGE("Failed to deactivate");//LCOV_EXCL_LINE
722 wfd_state_set(manager, prev_state);
723 wfd_util_set_wifi_direct_state(prev_state);
724 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
727 /* FIXME: We should do something to stop p2p feature of Driver */
728 res = wfd_oem_deactivate(manager->oem_ops, res);
730 WDS_LOGE("Failed to deactivate");//LCOV_EXCL_LINE
731 wfd_state_set(manager, prev_state);
732 wfd_util_set_wifi_direct_state(prev_state);
733 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
735 WDS_LOGE("Do not need to deactivate Wi-Fi");//LCOV_EXCL_LINE
738 WDS_LOGE("Succeeded to deactivate");//LCOV_EXCL_LINE
740 wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATED);
741 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATED);
743 manager->req_wps_mode = WFD_WPS_MODE_PBC;
745 wfd_destroy_session(manager);
746 wfd_destroy_group(manager);
747 wfd_peer_clear_all(manager);
748 wfd_local_reset_data(manager);
750 if (manager->is_connection_agent)
751 wfd_util_stop_wifi_direct_popup();
753 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
754 return WIFI_DIRECT_ERROR_NONE;
757 int wfd_manager_connect(wfd_manager_s *manager, unsigned char *peer_addr)
759 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
760 wfd_session_s *session = NULL;
763 if (!manager || !peer_addr) {
764 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
765 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
768 if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
769 manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
770 manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
771 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
772 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
775 wfd_group_s *group = (wfd_group_s*) manager->group;
776 if (group && group->member_count >= manager->max_station) {
777 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
778 return WIFI_DIRECT_ERROR_TOO_MANY_CLIENT;
781 session = (wfd_session_s*) manager->session;
782 if (session && session->type != SESSION_TYPE_INVITE) {
783 WDS_LOGE("Session already exist and it's not an invitation session");//LCOV_EXCL_LINE
784 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
785 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
789 session = wfd_create_session(manager, peer_addr,
790 manager->req_wps_mode, SESSION_DIRECTION_OUTGOING);
792 WDS_LOGE("Failed to create new session");//LCOV_EXCL_LINE
793 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
794 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
798 if (manager->local->dev_role == WFD_DEV_ROLE_GO &&
799 session->type != SESSION_TYPE_INVITE) {
800 session->type = SESSION_TYPE_INVITE;
801 res = wfd_session_invite(session);
803 res = wfd_session_start(session);
806 WDS_LOGE("Failed to start session");//LCOV_EXCL_LINE
807 wfd_destroy_session(manager);
808 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
809 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
811 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
812 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
814 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
815 return WIFI_DIRECT_ERROR_NONE;
818 int wfd_manager_asp_connect_session(wfd_manager_s *manager, void *params)
820 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
821 wfd_session_s *session = NULL;
822 wfd_oem_asp_prov_s *prov_params = NULL;
823 int req_wps_mode = WFD_WPS_MODE_P2PS;
826 prov_params = (wfd_oem_asp_prov_s *)params;
827 if (!manager || !prov_params) {
828 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
829 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
830 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
833 session = (wfd_session_s*) manager->session;
835 WDS_LOGE("Session already exists");//LCOV_EXCL_LINE
836 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
837 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
840 if (prov_params->network_config == WFD_OEM_ASP_WPS_TYPE_PIN_DISPLAY)
841 req_wps_mode = WFD_WPS_MODE_DISPLAY;
842 else if (prov_params->network_config == WFD_OEM_ASP_WPS_TYPE_PIN_KEYPAD)
843 req_wps_mode = WFD_WPS_MODE_KEYPAD;
845 req_wps_mode = WFD_WPS_MODE_P2PS;
847 session = wfd_create_session(manager, prov_params->service_mac,
848 req_wps_mode, SESSION_DIRECTION_OUTGOING);
850 WDS_LOGE("Failed to create new session");//LCOV_EXCL_LINE
851 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
852 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
855 res = wfd_session_asp_session_start(session, prov_params);
857 WDS_LOGE("Failed to start session");//LCOV_EXCL_LINE
858 wfd_destroy_session(manager);
859 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
860 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
863 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
864 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
866 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
867 return WIFI_DIRECT_ERROR_NONE;
870 int wfd_manager_asp_confirm_session(wfd_manager_s *manager, void *params, int confirmed)
872 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
873 wfd_session_s *session = NULL;
874 wfd_oem_asp_prov_s *prov_params = NULL;
877 prov_params = (wfd_oem_asp_prov_s *)params;
878 if (!manager || !prov_params) {
879 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
880 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
881 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
884 session = (wfd_session_s*) manager->session;
886 WDS_LOGE("Session not exists");//LCOV_EXCL_LINE
887 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
888 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
892 WDS_LOGD("confirm session [%u] with peer [" MACSTR "]", prov_params->session_id,
893 MAC2STR(prov_params->session_mac));
895 WDS_LOGD("created session [%u] with peer [" MACSTR "]", session->session_id,
896 MAC2STR(session->session_mac));
898 if (session->session_id != prov_params->session_id ||
899 memcmp(&(session->session_mac), prov_params->session_mac, MACADDR_LEN) != 0) {
900 WDS_LOGE("Session MAC or ID not matched");//LCOV_EXCL_LINE
901 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
905 prov_params->status = 12;
907 prov_params->status = 11;
908 prov_params->deferring = 1;
910 res = wfd_oem_asp_prov_disc_req(manager->oem_ops, prov_params);
912 WDS_LOGE("Failed to start session");//LCOV_EXCL_LINE
913 wfd_destroy_session(manager);
914 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
915 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
917 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
918 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
920 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
921 return WIFI_DIRECT_ERROR_NONE;
924 int wfd_manager_accept_connection(wfd_manager_s *manager, unsigned char *peer_addr)
926 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
927 wfd_session_s *session = NULL;
928 wfd_device_s *peer = NULL;
931 if (!manager || !peer_addr) {
932 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
933 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
936 session = (wfd_session_s*) manager->session;
938 WDS_LOGE("Session not found");//LCOV_EXCL_LINE
939 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
942 peer = wfd_peer_find_by_dev_addr(manager, peer_addr);
944 WDS_LOGE("Peer is NULL");//LCOV_EXCL_LINE
945 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
948 if (memcmp(session->peer->dev_addr, peer_addr, MACADDR_LEN) != 0) {
949 WDS_LOGE("Peer and ongoing session peer are different");//LCOV_EXCL_LINE
950 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
953 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
954 WDS_LOGD("My device is GO and peer want to join my group, so WPS will be started");//LCOV_EXCL_LINE
955 res = wfd_session_wps(session);
956 } else if (peer->dev_role == WFD_DEV_ROLE_GO) {
957 WDS_LOGD("Peer device is GO, so Prov_Disc or Join will be started");//LCOV_EXCL_LINE
958 if (session->type == SESSION_TYPE_INVITE) {
959 if (session->state == SESSION_STATE_CREATED) {
960 WDS_LOGD("Invitation session. PD will be started");//LCOV_EXCL_LINE
961 res = wfd_session_start(session);
963 WDS_LOGD("Invitation session. Join will be started");//LCOV_EXCL_LINE
964 res = wfd_session_join(session);
968 * TODO: Add autoconnection peer matching logic.
970 if (manager->autoconnection && (manager->auto_pin[0] != 0))
971 g_strlcpy(session->wps_pin, manager->auto_pin, PINSTR_LEN + 1);
973 WDS_LOGD("Peer device is GO, so WPS will be started");//LCOV_EXCL_LINE
974 res = wfd_session_connect(session);
978 * TODO: Add autoconnection peer matching logic.
980 /* We should wait GO_NEGO_REQ from peer(MO) in autoconnection mode. */
981 /* Otherwise, GO Nego is sometimes failed. */
982 if (manager->autoconnection == FALSE) {
983 WDS_LOGD("My device is Device, so Negotiation will be started");//LCOV_EXCL_LINE
984 res = wfd_session_connect(session);
988 WDS_LOGE("Failed to start session");//LCOV_EXCL_LINE
989 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
990 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
991 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
993 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
994 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
996 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
998 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
999 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
1001 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1002 return WIFI_DIRECT_ERROR_NONE;
1006 int wfd_manager_cancel_connection(wfd_manager_s *manager, unsigned char *peer_addr)
1008 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1009 wfd_group_s *group = NULL;
1013 if (!manager || !peer_addr) {
1014 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
1015 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1018 if (!manager->session && manager->state != WIFI_DIRECT_STATE_CONNECTING) {
1019 WDS_LOGE("It's not CONNECTING state");//LCOV_EXCL_LINE
1020 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
1023 res = wfd_session_cancel(manager->session, peer_addr);
1025 WDS_LOGE("Failed to cancel session");//LCOV_EXCL_LINE
1026 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1029 group = (wfd_group_s*) manager->group;
1031 member_cnt = wfd_group_remove_member(group, peer_addr);
1033 manager->local->dev_role = WFD_DEV_ROLE_NONE;
1035 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1036 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1038 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1040 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1041 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1044 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1045 return WIFI_DIRECT_ERROR_NONE;
1049 int wfd_manager_reject_connection(wfd_manager_s *manager, unsigned char *peer_addr)
1051 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1052 wfd_session_s *session = NULL;
1055 if (!manager || !peer_addr) {
1056 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
1057 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1060 session = (wfd_session_s*) manager->session;
1062 WDS_LOGE("Session not found");//LCOV_EXCL_LINE
1063 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
1066 if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
1067 WDS_LOGE("It's not permitted with this state [%d]", manager->state);
1068 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
1071 if (session->direction != SESSION_DIRECTION_INCOMING) {
1072 WDS_LOGE("Only incomming session can be rejected");//LCOV_EXCL_LINE
1073 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
1076 res = wfd_session_reject(session, peer_addr);
1078 WDS_LOGE("Failed to reject connection");//LCOV_EXCL_LINE
1079 /* TODO: check whether set state and break */
1081 wfd_destroy_session(manager);
1083 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1084 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1085 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1087 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1088 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1091 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1092 return WIFI_DIRECT_ERROR_NONE;
1096 int wfd_manager_disconnect(wfd_manager_s *manager, unsigned char *peer_addr)
1098 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1099 wfd_group_s *group = NULL;
1100 wfd_device_s *peer = NULL;
1104 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
1105 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1109 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
1110 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1113 group = (wfd_group_s*) manager->group;
1115 WDS_LOGE("Group not found");//LCOV_EXCL_LINE
1116 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
1119 peer = wfd_group_find_member_by_addr(group, peer_addr);
1121 WDS_LOGE("Connected peer not found");//LCOV_EXCL_LINE
1122 return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
1125 wfd_state_set(manager, WIFI_DIRECT_STATE_DISCONNECTING);
1126 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DISCONNECTING);
1128 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1130 res = wfd_oem_disconnect(manager->oem_ops, peer->dev_addr, 0);
1132 res = wfd_oem_disconnect(manager->oem_ops, peer->intf_addr, 1);
1134 res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1138 WDS_LOGE("Failed to disconnect peer");//LCOV_EXCL_LINE
1139 res = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1142 WDS_LOGE("Succeeded to disconnect peer");//LCOV_EXCL_LINE
1144 wfd_group_remove_member(group, peer_addr);
1146 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1147 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1148 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1150 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1151 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1154 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1155 return WIFI_DIRECT_ERROR_NONE;
1158 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1159 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1160 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1162 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
1163 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
1166 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1170 int wfd_manager_disconnect_all(wfd_manager_s *manager)
1172 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1173 wfd_group_s *group = NULL;
1177 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
1178 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1181 group = (wfd_group_s*) manager->group;
1183 WDS_LOGE("Group not found");//LCOV_EXCL_LINE
1184 return WIFI_DIRECT_ERROR_NOT_PERMITTED;
1187 wfd_state_set(manager, WIFI_DIRECT_STATE_DISCONNECTING);
1188 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DISCONNECTING);
1190 res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
1192 WDS_LOGE("Failed to destroy group");//LCOV_EXCL_LINE
1193 res = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1196 WDS_LOGE("Succeeded to disconnect all peer");//LCOV_EXCL_LINE
1198 wfd_destroy_group(manager);
1200 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1201 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1203 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1204 return WIFI_DIRECT_ERROR_NONE;
1207 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1208 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1209 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1211 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
1212 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
1215 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1219 int wfd_manager_get_peer_info(wfd_manager_s *manager, unsigned char *addr, wfd_discovery_entry_s **peer)
1221 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1222 wfd_device_s *peer_dev = NULL;
1223 wfd_discovery_entry_s *peer_info;
1224 wfd_oem_device_s *oem_dev = NULL;
1226 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
1228 if (!manager || !addr) {
1229 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
1233 unsigned long time = 0;
1234 #if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
1235 wfd_util_get_current_time(&time);
1237 struct timeval tval;
1238 gettimeofday(&tval, NULL);
1241 WDS_LOGI("Current time [%ld]", time);
1243 //wfd_manager_get_peer_info takes responsibility of the oem_dev' memory ownership.
1244 res = wfd_oem_get_peer_info(manager->oem_ops, addr, &oem_dev);
1245 if (res < 0 || !oem_dev) {
1246 WDS_LOGE("Failed to get peer information");//LCOV_EXCL_LINE
1250 peer_dev = wfd_peer_find_by_addr(manager, addr);
1252 peer_dev = (wfd_device_s*) g_try_malloc0(sizeof(wfd_device_s));
1254 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1255 WDS_LOGE("Failed to allocate memory for peer device. [%s]", error_buf);
1257 g_free(oem_dev->vsie);
1261 memcpy(peer_dev->dev_addr, addr, MACADDR_LEN);
1262 manager->peers = g_list_prepend(manager->peers, peer_dev);
1263 manager->peer_count++;
1264 peer_dev->time = time;
1265 WDS_LOGD("peer_count[%d]", manager->peer_count);
1267 if (oem_dev->age > 30 && peer_dev->state == WFD_PEER_STATE_DISCOVERED) {
1268 WDS_LOGE("Too old age to update peer");//LCOV_EXCL_LINE
1270 g_free(oem_dev->vsie);
1276 g_strlcpy(peer_dev->dev_name, oem_dev->dev_name, DEV_NAME_LEN + 1);
1277 memcpy(peer_dev->intf_addr, oem_dev->intf_addr, MACADDR_LEN);
1278 memcpy(peer_dev->go_dev_addr, oem_dev->go_dev_addr, MACADDR_LEN);
1279 peer_dev->dev_role = oem_dev->dev_role;
1280 peer_dev->config_methods = oem_dev->config_methods;
1281 peer_dev->pri_dev_type = oem_dev->pri_dev_type;
1282 peer_dev->sec_dev_type = oem_dev->sec_dev_type;
1283 peer_dev->dev_flags = oem_dev->dev_flags;
1284 peer_dev->group_flags = oem_dev->group_flags;
1285 peer_dev->wps_mode = oem_dev->wps_mode;
1287 if (manager->is_wifi_display_supported)
1288 memcpy(&(peer_dev->display), &(oem_dev->display), sizeof(wfd_display_s));
1290 peer_dev->time = time;
1291 peer_dev->channel = oem_dev->channel;
1293 if (oem_dev->vsie) {
1295 g_free(peer_dev->vsie);
1296 peer_dev->vsie = g_strdup(oem_dev->vsie);
1297 g_free(oem_dev->vsie);
1302 peer_info = (wfd_discovery_entry_s*) g_try_malloc0(sizeof(wfd_discovery_entry_s));
1304 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1305 WDS_LOGE("Failed to allocate memory for peer data. [%s]", error_buf);
1309 g_strlcpy(peer_info->device_name, peer_dev->dev_name, DEV_NAME_LEN + 1);
1310 memcpy(peer_info->mac_address, peer_dev->dev_addr, MACADDR_LEN);
1311 memcpy(peer_info->intf_address, peer_dev->intf_addr, MACADDR_LEN);
1312 peer_info->channel = peer_dev->channel;
1313 peer_info->services = 0;
1314 peer_info->is_group_owner = peer_dev->dev_role == WFD_DEV_ROLE_GO;
1315 peer_info->is_persistent_go = peer_dev->group_flags & WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
1316 peer_info->is_connected = peer_dev->dev_role == WFD_DEV_ROLE_GC;
1317 peer_info->wps_device_pwd_id = 0;
1318 peer_info->wps_cfg_methods = peer_dev->config_methods;
1319 peer_info->category = peer_dev->pri_dev_type;
1320 peer_info->subcategory = peer_dev->sec_dev_type;
1322 if (manager->is_wifi_display_supported)
1323 if (peer_dev->display.availability && peer_dev->display.port)
1324 peer_info->is_wfd_device = 1;
1327 peer_info->vsie = g_strdup(peer_dev->vsie);
1331 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1336 int wfd_manager_get_peers(wfd_manager_s *manager, wfd_discovery_entry_s **peers_data)
1338 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1340 wfd_device_s *peer = NULL;
1341 wfd_discovery_entry_s *peers = NULL;
1345 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
1347 if (!manager || !peers_data) {
1348 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
1352 unsigned long time = 0;
1353 #if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
1354 wfd_util_get_current_time(&time);
1356 struct timeval tval;
1357 gettimeofday(&tval, NULL);
1360 WDS_LOGI("Current time [%ld]", time);
1362 peer_count = manager->peer_count;
1363 WDS_LOGI("peer count [%d]", peer_count);
1366 else if (peer_count == 0)
1370 peers = (wfd_discovery_entry_s*) g_try_malloc0_n(peer_count, sizeof(wfd_discovery_entry_s));
1372 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1373 WDS_LOGE("Failed to allocate memory for peer data. [%s]", error_buf);
1377 temp = g_list_first(manager->peers);
1378 while (temp && count < peer_count) {
1382 if (peer->time + 8 < time) {
1383 WDS_LOGD("Device data is too old to report to application [%s]", peer->dev_name);
1384 res = wfd_update_peer(manager, peer);
1386 WDS_LOGE("This device is disappeared [%s]", peer->dev_name);
1387 temp = g_list_next(temp);
1388 manager->peers = g_list_remove(manager->peers, peer);
1389 manager->peer_count--;
1390 wfd_peer_destroy(peer);
1396 g_strlcpy(peers[count].device_name, peer->dev_name, DEV_NAME_LEN + 1);
1397 memcpy(peers[count].mac_address, peer->dev_addr, MACADDR_LEN);
1398 memcpy(peers[count].intf_address, peer->intf_addr, MACADDR_LEN);
1399 peers[count].channel = peer->channel;
1400 peers[count].services = 0;
1401 peers[count].is_group_owner = peer->dev_role == WFD_DEV_ROLE_GO;
1402 peers[count].is_persistent_go = peer->group_flags & WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
1403 peers[count].is_connected = peer->dev_role == WFD_DEV_ROLE_GC;
1404 peers[count].wps_device_pwd_id = 0;
1405 peers[count].wps_cfg_methods = peer->config_methods;
1406 peers[count].category = peer->pri_dev_type;
1407 peers[count].subcategory = peer->sec_dev_type;
1410 if (manager->is_wifi_display_supported)
1411 if (peer->display.availability && peer->display.port)
1412 peers[count].is_wfd_device = 1;
1414 WDS_LOGD("%dth peer [%s]", count, peer->dev_name);
1416 temp = g_list_next(temp);
1419 WDS_LOGD("%d peers converted", count);
1420 WDS_LOGD("Final peer count is %d", manager->peer_count);
1422 *peers_data = peers;
1424 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1428 int wfd_manager_get_connected_peers(wfd_manager_s *manager, wfd_connected_peer_info_s **peers_data)
1430 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1431 wfd_connected_peer_info_s *peers = NULL;
1432 wfd_group_s *group = NULL;
1433 wfd_device_s *peer = NULL;
1437 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
1439 if (!manager || !peers_data) {
1440 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
1444 group = manager->group;
1446 WDS_LOGE("Group not exist");//LCOV_EXCL_LINE
1450 peer_count = group->member_count;
1451 if (peer_count == 0) {
1452 WDS_LOGD("Member not exist");//LCOV_EXCL_LINE
1457 peers = (wfd_connected_peer_info_s*) g_try_malloc0_n(peer_count, sizeof(wfd_connected_peer_info_s));
1459 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1460 WDS_LOGE("Failed to allocate memory for connected peer data. [%s]", error_buf);
1464 temp = g_list_first(group->members);
1465 while (temp && count < group->member_count) {
1468 g_strlcpy(peers[count].device_name, peer->dev_name, DEV_NAME_LEN + 1);
1469 memcpy(peers[count].mac_address, peer->dev_addr, MACADDR_LEN);
1470 memcpy(peers[count].intf_address, peer->intf_addr, MACADDR_LEN);
1471 memcpy(peers[count].ip_address, peer->ip_addr, IPADDR_LEN);
1472 peers[count].category = peer->pri_dev_type;
1473 peers[count].subcategory = peer->sec_dev_type;
1474 peers[count].channel = peer->channel;
1475 peers[count].is_p2p = peer->is_p2p;
1476 peers[count].services = 0;
1478 if (manager->is_wifi_display_supported)
1479 if (peer->display.availability && peer->display.port)
1480 peers[count].is_wfd_device = 1;
1482 WDS_LOGD("%dth member converted[%s]", count, peers[count].device_name);
1485 temp = g_list_next(temp);
1488 WDS_LOGD("%d members converted", count);
1490 *peers_data = peers;
1492 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1496 wfd_device_s *wfd_manager_get_connected_peer_by_addr(wfd_manager_s *manager, unsigned char *peer_addr)
1498 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1499 wfd_device_s *peer = NULL;
1501 if (peer_addr == NULL) {
1502 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
1503 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1508 peer = wfd_group_find_member_by_addr(manager->group, peer_addr);
1510 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1515 wfd_device_s *wfd_manager_find_connected_peer(wfd_manager_s *manager, unsigned char *peer_addr)
1517 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1518 wfd_device_s *peer = NULL;
1520 if (!manager || !peer_addr) {
1521 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
1525 peer = wfd_group_find_member_by_addr(manager->group, peer_addr);
1527 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1532 int wfd_manager_get_goup_ifname(char **ifname)
1534 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1535 wfd_group_s *group = g_manager->group;
1538 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
1539 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1544 WDS_LOGE("Group not exist");//LCOV_EXCL_LINE
1548 *ifname = group->ifname;
1550 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1554 int wfd_manager_set_display_device(int type, int port, int hdcp)
1556 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1557 wfd_device_s * device = g_manager->local;
1558 wfd_oem_display_s display;
1562 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
1563 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1567 memset(&display, 0x0, sizeof(wfd_oem_display_s));
1569 display.type = type;
1570 display.port = port;
1571 display.hdcp_support = hdcp;
1573 display.availability = device->display.availability;
1574 display.max_tput = device->display.max_tput;
1576 res = wfd_oem_set_display(g_manager->oem_ops, (wfd_oem_display_s*)&display);
1578 WDS_LOGE("Failed to set wifi display");//LCOV_EXCL_LINE
1582 device->display.type = type;
1583 device->display.port = port;
1584 device->display.hdcp_support = hdcp;
1586 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1590 int wfd_manager_set_session_availability(int availability)
1592 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1593 wfd_device_s * device = g_manager->local;
1594 wfd_oem_display_s display;
1598 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
1599 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1603 memset(&display, 0x0, sizeof(wfd_oem_display_s));
1605 display.availability = availability;
1607 display.type = device->display.type;
1608 display.hdcp_support = device->display.hdcp_support;
1609 display.port = device->display.port;
1610 display.max_tput = device->display.max_tput;
1612 res = wfd_oem_set_display(g_manager->oem_ops, (wfd_oem_display_s*)&display);
1614 WDS_LOGE("Failed to set wifi display session availability");//LCOV_EXCL_LINE
1618 device->display.availability = availability;
1620 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1624 int wfd_manager_get_display_device(int *type, int *port, int *hdcp)
1626 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1627 wfd_device_s *device = g_manager->local;
1630 if (!device || !type || !port || !hdcp) {
1631 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
1632 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1636 *type = device->display.type;
1637 *port = device->display.port;
1638 *hdcp = device->display.hdcp_support;
1640 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1644 int wfd_manager_get_session_availability(int *availability)
1646 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1647 wfd_device_s *device = g_manager->local;
1650 if (!device || !availability) {
1651 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
1652 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1656 *availability = device->display.availability;
1658 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1662 int wfd_manager_start_discovery(wfd_manager_s *manager, int mode, int timeout,
1663 const char* type, int channel, int frequency)
1665 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1666 int res = WIFI_DIRECT_ERROR_OPERATION_FAILED;
1667 wfd_oem_scan_param_s param;
1668 memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
1670 WDS_LOGI("Mode [%d], Timeout [%d], type [%s], channel [%d], frequency [%d]",
1671 mode, timeout, type, channel, frequency);
1673 if (manager->local->dev_role == WFD_DEV_ROLE_GO)
1674 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
1677 case WFD_DISCOVERY_FULL_SCAN:
1678 param.scan_type = WFD_OEM_SCAN_TYPE_FULL;
1680 case WFD_DISCOVERY_SOCIAL_CHANNEL:
1681 param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
1683 case WFD_DISCOVERY_CHANNEL1:
1684 param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL1;
1687 case WFD_DISCOVERY_CHANNEL6:
1688 param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL6;
1691 case WFD_DISCOVERY_CHANNEL11:
1692 param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL11;
1696 param.scan_type = WFD_OEM_SCAN_TYPE_SPECIFIC;
1698 param.freq = frequency;
1700 param.freq = wfd_util_channel_to_freq(channel);
1704 param.scan_mode = WFD_OEM_SCAN_MODE_PASSIVE;
1706 param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
1708 param.scan_time = timeout;
1710 res = wfd_oem_start_scan(manager->oem_ops, ¶m);
1712 WDS_LOGE("Failed to start scan");//LCOV_EXCL_LINE
1713 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1714 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1718 manager->scan_mode = WFD_SCAN_MODE_PASSIVE;
1720 manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
1722 if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
1723 wfd_state_set(manager, WIFI_DIRECT_STATE_DISCOVERING);
1724 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DISCOVERING);
1727 WDS_LOGD("Succeeded to start scan");//LCOV_EXCL_LINE
1728 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1729 return WIFI_DIRECT_ERROR_NONE;
1732 int wfd_manager_cancel_discovery(wfd_manager_s *manager)
1734 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1737 res = wfd_oem_stop_scan(manager->oem_ops);
1739 WDS_LOGE("Failed to stop scan");//LCOV_EXCL_LINE
1740 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1741 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1744 if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
1745 wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
1746 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
1747 } else if (manager->local->dev_role == WFD_DEV_ROLE_GC) {
1748 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
1749 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
1751 wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
1752 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
1755 WDS_LOGD("Succeeded to stop scan");//LCOV_EXCL_LINE
1756 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1757 return WIFI_DIRECT_ERROR_NONE;
1760 wfd_device_s *wfd_manager_get_peer_by_addr(wfd_manager_s *manager, unsigned char *peer_addr)
1762 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1763 wfd_device_s *peer = NULL;
1765 peer = wfd_group_find_member_by_addr(manager->group, peer_addr);
1770 peer = wfd_peer_find_by_addr(manager, peer_addr);
1772 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1776 static wfd_manager_s *wfd_manager_init()
1778 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1779 wfd_manager_s *manager = NULL;
1782 manager = (wfd_manager_s*) g_try_malloc0(sizeof(wfd_manager_s));
1784 WDS_LOGE("Failed to allocate memory for wfd_manager structure");//LCOV_EXCL_LINE
1788 manager->wfd_oem_conf = (wfd_oem_config_s*) g_try_malloc0(sizeof(wfd_oem_config_s));
1789 if (!manager->wfd_oem_conf) {
1791 WDS_LOGE("Failed to allocate memory for wfd_oem_conf structure");//LCOV_EXCL_LINE
1795 manager->go_intent = 7;
1796 manager->req_wps_mode = WFD_WPS_MODE_PBC;
1797 manager->max_station = 8;
1798 manager->session_timer = 120;
1799 manager->auto_group_remove_enable = TRUE;
1801 manager->go_intent_per_type[WFD_DISPLAY_TYPE_SOURCE] = WFD_GO_INTENT_DISPLY_SOURCE;
1802 manager->go_intent_per_type[WFD_DISPLAY_TYPE_PRISINK] = WFD_GO_INTENT_MAX;
1803 manager->go_intent_per_type[WFD_DISPLAY_TYPE_SECSINK] = WFD_GO_INTENT_MAX;
1804 manager->go_intent_per_type[WFD_DISPLAY_TYPE_DUAL] = WFD_GO_INTENT_MAX;
1805 manager->go_intent_per_type[WFD_DISPLAY_TYPE_NONE] = WFD_GO_INTENT_MAX;
1807 wfd_util_check_features(manager);
1808 wfd_util_load_wfd_conf(manager);
1810 res = _wfd_local_init_device(manager);
1812 WDS_LOGE("Failed to initialize local device");//LCOV_EXCL_LINE
1813 g_free(manager->wfd_oem_conf);
1815 return NULL; /* really stop manager? */
1817 WDS_LOGD("Succeeded to initialize local device");//LCOV_EXCL_LINE
1819 manager->client_count = 0;
1820 manager->client_list = NULL;
1821 if (manager->is_on_demand) {
1822 manager->exit_timer = g_timeout_add(120000,
1823 (GSourceFunc) _wfd_exit_timeout_cb, manager);
1824 WDS_LOGD("Exit timer started");//LCOV_EXCL_LINE
1828 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1832 int wfd_manager_deinit(wfd_manager_s *manager)
1834 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1837 WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
1838 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1842 if (manager->is_on_demand && manager->exit_timer > 0) {
1843 g_source_remove(manager->exit_timer);
1844 manager->exit_timer = 0;
1847 _wfd_local_deinit_device(manager);
1849 g_free(manager->wfd_oem_conf);
1852 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1856 int wfd_manager_load()
1859 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1861 /* TODO: Parsing argument */
1862 /* Wi-Fi direct connection for S-Beam can be optimized using argument */
1865 * wfd-manager initialization
1867 g_manager = wfd_manager_init();
1869 WDS_LOGE("Failed to initialize wifi-direct manager");//LCOV_EXCL_LINE
1870 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1873 WDS_LOGD("Succeeded to initialize manager");//LCOV_EXCL_LINE
1875 res = wfd_util_get_local_dev_mac(g_manager->local->dev_addr);
1877 WDS_LOGE("Failed to get local device MAC address");//LCOV_EXCL_LINE
1879 if (wfd_manager_iface_init() != 0) {
1880 WDS_LOGE("Failed to initialize iface");//LCOV_EXCL_LINE
1881 wfd_manager_deinit(g_manager);
1882 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1885 WDS_LOGD("Succeeded to load iface");//LCOV_EXCL_LINE
1887 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1891 void wfd_manager_unload()
1893 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1895 wfd_manager_iface_deinit();
1896 wfd_manager_deinit(g_manager);
1899 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE