#include <stdio.h>
#include <stdlib.h>
-#include <dlfcn.h>
-#include <sys/utsname.h>
#include <time.h>
#include <errno.h>
+#include <string.h>
#include <glib.h>
#include <glib-object.h>
+
#include <wifi-direct.h>
#include "wifi-direct-ipc.h"
#include "wifi-direct-group.h"
#include "wifi-direct-peer.h"
#include "wifi-direct-state.h"
-#include "wifi-direct-client.h"
#include "wifi-direct-event.h"
#include "wifi-direct-util.h"
+#include "wifi-direct-log.h"
+#include "wifi-direct-error.h"
+#include "wifi-direct-iface.h"
+#include "wifi-direct-dbus.h"
+
+#if defined TIZEN_ENABLE_PRD
+#include "wifi-direct-prd.h"
+#endif /* TIZEN_ENABLE_PRD */
-wfd_manager_s *g_manager;
+wfd_manager_s *g_manager = NULL;
wfd_manager_s *wfd_get_manager()
{
return g_manager;
}
-
+//LCOV_EXCL_START
+/* Stop wfd-manager services, If no client
+ exists and state is deactivated. */
static gboolean _wfd_exit_timeout_cb(void *user_data)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
wfd_manager_s *manager = (wfd_manager_s*) user_data;
if (!manager) {
- WDS_LOGE("Invalid parameter");
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
return TRUE;
}
}
if (manager->state == WIFI_DIRECT_STATE_DEACTIVATED) {
- WDS_LOGD("Terminate Wi-Fi Direct Manager");
- g_main_quit(manager->main_loop);
+ WDS_LOGD("Terminate Wi-Fi Direct Manager");//LCOV_EXCL_LINE
+ g_main_loop_quit(manager->main_loop);
+ manager->exit_timer = 0;
+ WDS_LOGD("Stop exit timer. State [%d]", manager->state);
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return FALSE;
}
- manager->exit_timer = 0;
- WDS_LOGD( "Stop exit timer. State [%d]", manager->state);
- __WDS_LOG_FUNC_EXIT__;
- return FALSE;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return TRUE;
+}
+
+void wfd_manager_free_active_client_list(void)
+{
+ GSList *list;
+ wfd_manager_s *manager = wfd_get_manager();
+
+ if (!manager || !manager->client_list)
+ return;
+
+ for (list = manager->client_list; list; list = list->next)
+ g_free(list->data);
+
+ g_slist_free(manager->client_list);
+}
+
+void wfd_manager_add_active_client(const char *client_id)
+{
+ GSList *list = NULL;
+ gboolean if_exists = FALSE;
+ gchar *str = NULL;
+ wfd_manager_s *manager = wfd_get_manager();
+ if (!manager || !client_id)
+ return;
+
+ for (list = manager->client_list; list; list = list->next) {
+ str = list->data;
+ if (str && !g_strcmp0(client_id, str)) {
+ if_exists = TRUE;
+ break;
+ }
+ }
+
+ // If not exists in list, add the sender
+ if (if_exists == FALSE) {
+ manager->client_list = g_slist_prepend(manager->client_list,
+ g_strdup(client_id));
+ manager->client_count++;
+ WDS_LOGD("Added DBus sender id[%s] count[%d]", client_id,
+ manager->client_count);
+ }
}
+void wfd_manager_remove_active_client(const gchar *name,
+ const char *old_owner,
+ const char *new_owner)
+{
+ GSList *list = NULL;
+ gchar *str = NULL;
+ wfd_manager_s *manager = wfd_get_manager();
+
+ if (!manager)
+ return;
+
+ if (!g_strcmp0(new_owner, "")) {
+ if (manager->client_count > 0) {
+ for (list = manager->client_list; list; list = list->next) {
+ str = list->data;
+ if (str && !g_strcmp0(old_owner, str)) {
+ manager->client_list =
+ g_slist_remove(manager->client_list, str);
+ g_free(str);
+ manager->client_count--;
+ WDS_LOGD("Removed name[%s] old[%s] new[%s] count[%d]",
+ name, old_owner, new_owner, manager->client_count);
+ break;
+ }
+ }
+ }
+ }
+}
+//LCOV_EXCL_STOP
static int _wfd_local_init_device(wfd_manager_s *manager)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
wfd_device_s *local = NULL;
int res = 0;
+ char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
+ wfd_oem_config_s *config;
if (!manager) {
- WDS_LOGE("Invalid parameter");
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
return -1;
}
+ config = manager->wfd_oem_conf;
+
errno = 0;
local = (wfd_device_s*) g_try_malloc0(sizeof(wfd_device_s));
if (!local) {
- WDS_LOGE("Failed to allocate memory for local device [%s]", strerror(errno));
+ strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
+ WDS_LOGE("Failed to allocate memory for local device [%s]", error_buf);
return -1;
}
res = wfd_util_get_phone_name(local->dev_name);
if (res < 0) {
- WDS_LOGE("Failed to get phone name of local device. Use default device name");
- g_strlcpy(local->dev_name, DEFAULT_DEVICE_NAME, DEV_NAME_LEN + 1);
+ WDS_LOGE("Failed to get phone name of local device. Use default device name");//LCOV_EXCL_LINE
+ if (config)
+ g_strlcpy(local->dev_name, config->device_name, DEV_NAME_LEN + 1);
+ else
+ g_strlcpy(local->dev_name, DEFAULT_DEVICE_NAME, DEV_NAME_LEN + 1);
}
WDS_LOGD("Local Device name [%s]", local->dev_name);
wfd_util_set_dev_name_notification();
- res = wfd_util_get_local_dev_mac(local->dev_addr);
- if (res < 0) {
- WDS_LOGE("Failed to get local device MAC address");
- }
-
- memcpy(local->intf_addr, local->dev_addr, MACADDR_LEN);
- local->intf_addr[4] ^= 0x80;
- WDS_LOGD("Local Interface MAC address [" MACSECSTR "]",
- MAC2SECSTR(local->intf_addr));
-
local->config_methods = WFD_WPS_MODE_PBC | WFD_WPS_MODE_DISPLAY | WFD_WPS_MODE_KEYPAD;
local->wps_mode = WFD_WPS_MODE_PBC;
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
local->services = NULL;
local->service_count = 0;
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
- // TODO: initialize other local device datas
+ /* TODO: initialize other local device datas */
manager->local = local;
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return 0;
}
static int _wfd_local_deinit_device(wfd_manager_s *manager)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
if (!manager) {
- WDS_LOGE("Invalid parameter");
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
return -1;
}
wfd_util_unset_dev_name_notification();
- // TODO: free member of local device
+ /* TODO: free member of local device */
g_free(manager->local);
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return 0;
}
int wfd_local_reset_data(wfd_manager_s *manager)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
wfd_device_s *local = NULL;
if (!manager) {
- WDS_LOGE("Invalid parameter");
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
return -1;
}
local->dev_role = WFD_DEV_ROLE_NONE;
local->wps_mode = WFD_WPS_MODE_PBC;
memset(local->go_dev_addr, 0x0, MACADDR_LEN);
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
- memset(&(local->display), 0x0, sizeof(wfd_display_s));
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+ if (manager->is_wifi_display_supported)
+ memset(&(local->display), 0x0, sizeof(wfd_display_s));
memset(local->ip_addr, 0x0, IPADDR_LEN);
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return 0;
}
int wfd_local_get_dev_name(char *dev_name)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
wfd_device_s *local = g_manager->local;
if (!dev_name) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return -1;
}
g_strlcpy(dev_name, local->dev_name, DEV_NAME_LEN + 1);
WDS_LOGD("Local device name [%s]", dev_name);
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return 0;
}
int wfd_local_set_dev_name(char *dev_name)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
wfd_device_s *local = g_manager->local;
if (!dev_name) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return -1;
}
if (g_manager->state >= WIFI_DIRECT_STATE_ACTIVATED) {
wfd_oem_set_dev_name(g_manager->oem_ops, dev_name);
- WDS_LOGD("Device name changed.");
+ WDS_LOGD("Device name changed.");//LCOV_EXCL_LINE
} else {
- WDS_LOGE("Device name can't changed: state is %d",g_manager->state);
+ WDS_LOGE("Device name can't changed: state is %d", g_manager->state);
}
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return 0;
}
int wfd_local_get_dev_mac(char *dev_mac)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
wfd_device_s *local = g_manager->local;
if (!dev_mac) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return -1;
}
g_snprintf(dev_mac, MACSTR_LEN, MACSTR, MAC2STR(local->dev_addr));
WDS_SECLOGD("Local device MAC address [%s]", dev_mac);
- __WDS_LOG_FUNC_EXIT__;
- return 0;
-}
-
-#if 0
-int wfd_local_get_intf_mac(unsigned char *intf_mac)
-{
- __WDS_LOG_FUNC_ENTER__;
- wfd_device_s *local = g_manager->local;
-
- if (!intf_mac) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- }
-
- g_snprintf(intf_mac, MACSTR_LEN, MACSTR, MAC2STR(local->intf_addr));
- WDS_SECLOGD("Local interface MAC address [%s]", intf_mac);
-
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return 0;
}
-#endif
int wfd_local_get_ip_addr(char *ip_str)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
wfd_device_s *local = g_manager->local;
if (!ip_str) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return -1;
}
snprintf(ip_str, IPSTR_LEN, IPSTR, IP2STR(local->ip_addr));
WDS_SECLOGD("Local IP address [" IPSECSTR "]", IP2SECSTR(local->ip_addr));
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return 0;
}
int wfd_local_get_supported_wps_mode(int *config_methods)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
wfd_device_s *local = g_manager->local;
if (!config_methods) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return -1;
}
*config_methods = local->config_methods;
WDS_LOGD("Local config method [0x%x]", *config_methods);
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return 0;
}
int wfd_local_get_wps_mode(int *wps_mode)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
wfd_device_s *local = g_manager->local;
if (!wps_mode) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return -1;
}
*wps_mode = local->wps_mode;
WDS_LOGD("Local wps mode [0x%x]", *wps_mode);
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return 0;
}
#if 0
int wfd_local_set_wps_mode(int wps_mode)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
wfd_device_s *local = g_manager->local;
if (!wps_mode) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return -1;
}
local->wps_mode = wps_mode;
WDS_LOGD("Local wps mode [0x%x]", wps_mode);
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return 0;
}
#endif
int wfd_manager_get_go_intent(int *go_intent)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
if (!go_intent) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return -1;
}
*go_intent = g_manager->go_intent;
WDS_LOGD("Local GO intent [%d]", *go_intent);
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return 0;
}
int wfd_manager_set_go_intent(int go_intent)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
if (go_intent < 0 || go_intent > 15) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return -1;
}
if (g_manager->state >= WIFI_DIRECT_STATE_ACTIVATED)
wfd_oem_set_go_intent(g_manager->oem_ops, go_intent);
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return 0;
+}
+
+int wfd_manager_get_go_intent_per_type(int type, int *go_intent)
+{
+ __WDS_LOG_FUNC_ENTER__;
+ if (!go_intent) {
+ WDS_LOGE("Invalid parameter");
+ __WDS_LOG_FUNC_EXIT__;
+ return -1;
+ }
+
+ if (type < 0 || type >= WFD_MAX_TYPE) {
+ WDS_LOGE("Invalid parameter");
+ __WDS_LOG_FUNC_EXIT__;
+ return -1;
+ }
+
+ *go_intent = g_manager->go_intent_per_type[type];
+ WDS_LOGD("Get Go_Intent[%d] : [%d]", type, *go_intent);
+
__WDS_LOG_FUNC_EXIT__;
return 0;
}
-int wfd_manager_get_max_station(int *max_station)
+int wfd_manager_set_go_intent_per_type(int type, int go_intent)
{
__WDS_LOG_FUNC_ENTER__;
- if (!max_station) {
+ if (go_intent < 0 || go_intent > 15) {
WDS_LOGE("Invalid parameter");
__WDS_LOG_FUNC_EXIT__;
return -1;
}
+ if (type < 0 || type >= WFD_MAX_TYPE) {
+ WDS_LOGE("Invalid parameter");
+ __WDS_LOG_FUNC_EXIT__;
+ return -1;
+ }
+
+ g_manager->go_intent_per_type[type] = go_intent;
+ WDS_LOGD("Set Go_Intent[%d] : [%d]", type, g_manager->go_intent_per_type[type]);
+
+ __WDS_LOG_FUNC_EXIT__;
+ return 0;
+}
+
+int wfd_manager_get_max_station(int *max_station)
+{
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+
+ if (!max_station) {
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return -1;
+ }
+
*max_station = g_manager->max_station;
WDS_LOGD("Local max station[%d]", *max_station);
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return 0;
}
int wfd_manager_set_max_station(int max_station)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
if (max_station < 1) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return -1;
}
g_manager->max_station = max_station;
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return 0;
}
int wfd_manager_get_autoconnection(int *autoconnection)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
if (!autoconnection) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return -1;
}
*autoconnection = g_manager->autoconnection;
- WDS_LOGD("Local autoconnection [%s]", *autoconnection ? "TRUE":"FALSE");
+ WDS_LOGD("Local autoconnection [%s]", *autoconnection ? "TRUE" : "FALSE");//LCOV_EXCL_LINE
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return 0;
}
int wfd_manager_set_autoconnection(int autoconnection)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
if (autoconnection < 0) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return -1;
}
g_manager->autoconnection = autoconnection;
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return 0;
}
int wfd_manager_get_req_wps_mode(int *req_wps_mode)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
if (!req_wps_mode) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return -1;
}
*req_wps_mode = g_manager->req_wps_mode;
WDS_LOGD("Requested wps mode [0x%x]", *req_wps_mode);
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return 0;
}
int wfd_manager_set_req_wps_mode(int req_wps_mode)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
wfd_device_s *local = g_manager->local;
if (req_wps_mode != WIFI_DIRECT_WPS_TYPE_PBC &&
req_wps_mode != WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY &&
req_wps_mode != WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return -1;
}
else
local->wps_mode = req_wps_mode;
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return 0;
}
int wfd_manager_local_config_set(wfd_manager_s *manager)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
wfd_device_s *local = NULL;
+ int ip_over_eapol = 0;
int res = 0;
if (!manager) {
- WDS_LOGE("Invalid parameter");
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
}
WDS_LOGD("Device name set as %s", local->dev_name);
res = wfd_oem_set_dev_name(manager->oem_ops, local->dev_name);
if (res < 0) {
- WDS_LOGE("Failed to set device name");
+ WDS_LOGE("Failed to set device name");//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
}
+ local->pri_dev_type = DEFAULT_PRIMARY_DEVICE_TYPE;
+ local->sec_dev_type = DEFAULT_SECONDARY_DEVICE_TYPE;
res = wfd_oem_set_dev_type(manager->oem_ops, local->pri_dev_type, local->sec_dev_type);
if (res < 0) {
- WDS_LOGE("Failed to set device type");
+ WDS_LOGE("Failed to set device type");//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
}
res = wfd_oem_set_go_intent(manager->oem_ops, manager->go_intent);
if (res < 0) {
- WDS_LOGE("Failed to set go intent");
+ WDS_LOGE("Failed to set go intent");//LCOV_EXCL_LINE
+ return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ }
+
+ if (manager->is_ip_over_eapol)
+ ip_over_eapol = 1;
+ else
+ ip_over_eapol = 0;
+ res = wfd_oem_set_eapol_ip_config(manager->oem_ops, ip_over_eapol);
+ if (res < 0) {
+ WDS_LOGE("Failed to set eapol ip config");//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
}
int wfd_manager_activate(wfd_manager_s *manager)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
int prev_state = 0;
int res = 0;
if (!manager) {
- WDS_LOGE("Invalid parameter");
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
}
if (manager->state > WIFI_DIRECT_STATE_ACTIVATING) {
- WDS_LOGE("Already activated");
+ WDS_LOGE("Already activated");//LCOV_EXCL_LINE
return 1;
}
+ if (manager->state == WIFI_DIRECT_STATE_ACTIVATING) {
+ WDS_LOGE("In progress");//LCOV_EXCL_LINE
+ return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ }
+
+ res = wfd_util_wifi_direct_activatable();
+ if (res < 0)
+ return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+
wfd_state_get(manager, &prev_state);
wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATING);
-#if defined(TIZEN_WLAN_CONCURRENT_ENABLE) && defined(TIZEN_MOBILE)
+ wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATING);
res = wfd_util_check_wifi_state();
if (res < 0) {
- WDS_LOGE("Failed to get wifi state");
+ WDS_LOGE("Failed to get wifi state");//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
} else if (res == 0) {
-#endif /* TIZEN_WLAN_CONCURRENT_ENABLE && TIZEN_MOBILE */
- res = wfd_oem_activate(manager->oem_ops, 0);
- if (res < 0) {
- WDS_LOGE("Failed to activate");
- wfd_state_set(manager, prev_state);
- return WIFI_DIRECT_ERROR_OPERATION_FAILED;
- }
-#if defined(TIZEN_WLAN_CONCURRENT_ENABLE) && defined(TIZEN_MOBILE)
+ res = wfd_oem_activate(manager->oem_ops, 0);
+ if (res < 0) {
+ WDS_LOGE("Failed to activate");//LCOV_EXCL_LINE
+ wfd_state_set(manager, prev_state);
+ wfd_util_set_wifi_direct_state(prev_state);
+ return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ }
} else {
res = wfd_oem_activate(manager->oem_ops, res);
if (res < 0) {
- WDS_LOGE("Failed to activate");
+ WDS_LOGE("Failed to activate");//LCOV_EXCL_LINE
wfd_state_set(manager, prev_state);
+ wfd_util_set_wifi_direct_state(prev_state);
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
}
}
-#endif /* TIZEN_WLAN_CONCURRENT_ENABLE && TIZEN_MOBILE */
- WDS_LOGE("Succeeded to activate");
+ WDS_LOGE("Succeeded to activate");//LCOV_EXCL_LINE
wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
wfd_manager_local_config_set(manager);
- wfd_util_set_country();
-
- wfd_util_start_wifi_direct_popup();
+ if (manager->is_connection_agent)
+ wfd_util_start_wifi_direct_popup();
res = wfd_util_get_local_dev_mac(manager->local->dev_addr);
- if (res < 0) {
- WDS_LOGE("Failed to get local device MAC address");
- }
-
- memcpy(manager->local->intf_addr, manager->local->dev_addr, MACADDR_LEN);
- manager->local->intf_addr[4] ^= 0x80;
- WDS_LOGD("Local Interface MAC address [" MACSECSTR "]",
- MAC2SECSTR(manager->local->intf_addr));
+ if (res < 0)
+ WDS_LOGE("Failed to get local device MAC address");//LCOV_EXCL_LINE
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_NONE;
}
int wfd_manager_deactivate(wfd_manager_s *manager)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
int prev_state = 0;
int res = 0;
+ wfd_group_s *group = NULL;
if (!manager) {
- WDS_LOGE("Invalid parameter");
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
}
- if (manager->state < WIFI_DIRECT_STATE_ACTIVATING) {
- WDS_LOGE("Already deactivated");
- return WIFI_DIRECT_ERROR_NOT_PERMITTED;
- }
-
wfd_state_get(manager, &prev_state);
wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATING);
+ wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATING);
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
- res = wfd_oem_miracast_init(manager->oem_ops, false);
- if (res < 0)
- WDS_LOGE("Failed to initialize miracast");
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+ if (manager->is_wifi_display_supported) {
+ res = wfd_oem_miracast_init(manager->oem_ops, false);
+ if (res < 0)
+ WDS_LOGE("Failed to initialize miracast");//LCOV_EXCL_LINE
+ }
- res = wfd_oem_destroy_group(manager->oem_ops, GROUP_IFNAME);
- if (res < 0)
- WDS_LOGE("Failed to destroy group before deactivation");
+ group = (wfd_group_s*) manager->group;
+ if (group && group->pending == FALSE) {
+ res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
+ if (res < 0)
+ WDS_LOGE("Failed to destroy group before deactivation");//LCOV_EXCL_LINE
+ }
-#if defined(TIZEN_WLAN_CONCURRENT_ENABLE) && defined(TIZEN_MOBILE)
res = wfd_util_check_wifi_state();
if (res < 0) {
- WDS_LOGE("Failed to get wifi state");
+ WDS_LOGE("Failed to get wifi state");//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
} else if (res == 0) {
-#endif /* TIZEN_WLAN_CONCURRENT_ENABLE && TIZEN_MOBILE */
res = wfd_oem_deactivate(manager->oem_ops, 0);
if (res < 0) {
- WDS_LOGE("Failed to deactivate");
+ WDS_LOGE("Failed to deactivate");//LCOV_EXCL_LINE
wfd_state_set(manager, prev_state);
+ wfd_util_set_wifi_direct_state(prev_state);
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
}
-#if defined(TIZEN_WLAN_CONCURRENT_ENABLE) && defined(TIZEN_MOBILE)
} else {
- // FIXME: We should do something to stop p2p feature of Driver
+ /* FIXME: We should do something to stop p2p feature of Driver */
res = wfd_oem_deactivate(manager->oem_ops, res);
if (res < 0) {
- WDS_LOGE("Failed to deactivate");
+ WDS_LOGE("Failed to deactivate");//LCOV_EXCL_LINE
wfd_state_set(manager, prev_state);
+ wfd_util_set_wifi_direct_state(prev_state);
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
}
- WDS_LOGE("Do not need to deactivate Wi-Fi");
+ WDS_LOGE("Do not need to deactivate Wi-Fi");//LCOV_EXCL_LINE
}
-#endif /* TIZEN_WLAN_CONCURRENT_ENABLE && TIZEN_MOBILE */
- WDS_LOGE("Succeeded to deactivate");
+
+ WDS_LOGE("Succeeded to deactivate");//LCOV_EXCL_LINE
wfd_state_set(manager, WIFI_DIRECT_STATE_DEACTIVATED);
wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATED);
manager->req_wps_mode = WFD_WPS_MODE_PBC;
- wfd_destroy_group(manager, GROUP_IFNAME);
wfd_destroy_session(manager);
+ wfd_destroy_group(manager);
wfd_peer_clear_all(manager);
wfd_local_reset_data(manager);
- __WDS_LOG_FUNC_EXIT__;
+ if (manager->is_connection_agent)
+ wfd_util_stop_wifi_direct_popup();
+
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_NONE;
}
int wfd_manager_connect(wfd_manager_s *manager, unsigned char *peer_addr)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
wfd_session_s *session = NULL;
int res = 0;
if (!manager || !peer_addr) {
- WDS_LOGE("Invalid parameter");
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
}
+ if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
+ manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
+ manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ }
+
+ wfd_group_s *group = (wfd_group_s*) manager->group;
+ if (group && group->member_count >= manager->max_station) {
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return WIFI_DIRECT_ERROR_TOO_MANY_CLIENT;
+ }
+
session = (wfd_session_s*) manager->session;
if (session && session->type != SESSION_TYPE_INVITE) {
- WDS_LOGE("Session already exist and it's not an invitation session");
+ WDS_LOGE("Session already exist and it's not an invitation session");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_NOT_PERMITTED;
}
session = wfd_create_session(manager, peer_addr,
manager->req_wps_mode, SESSION_DIRECTION_OUTGOING);
if (!session) {
- WDS_LOGE("Failed to create new session");
+ WDS_LOGE("Failed to create new session");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
}
}
res = wfd_session_start(session);
}
if (res < 0) {
- WDS_LOGE("Failed to start session");
+ WDS_LOGE("Failed to start session");//LCOV_EXCL_LINE
wfd_destroy_session(manager);
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
}
wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
+ wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return WIFI_DIRECT_ERROR_NONE;
+}
+
+int wfd_manager_asp_connect_session(wfd_manager_s *manager, void *params)
+{
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+ wfd_session_s *session = NULL;
+ wfd_oem_asp_prov_s *prov_params = NULL;
+ int req_wps_mode = WFD_WPS_MODE_P2PS;
+ int res = 0;
+
+ prov_params = (wfd_oem_asp_prov_s *)params;
+ if (!manager || !prov_params) {
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ }
+
+ session = (wfd_session_s*) manager->session;
+ if (session) {
+ WDS_LOGE("Session already exists");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ }
+
+ if (prov_params->network_config == WFD_OEM_ASP_WPS_TYPE_PIN_DISPLAY)
+ req_wps_mode = WFD_WPS_MODE_DISPLAY;
+ else if (prov_params->network_config == WFD_OEM_ASP_WPS_TYPE_PIN_KEYPAD)
+ req_wps_mode = WFD_WPS_MODE_KEYPAD;
+ else
+ req_wps_mode = WFD_WPS_MODE_P2PS;
+
+ session = wfd_create_session(manager, prov_params->service_mac,
+ req_wps_mode, SESSION_DIRECTION_OUTGOING);
+ if (!session) {
+ WDS_LOGE("Failed to create new session");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ }
+
+ res = wfd_session_asp_session_start(session, prov_params);
+ if (res < 0) {
+ WDS_LOGE("Failed to start session");//LCOV_EXCL_LINE
+ wfd_destroy_session(manager);
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ }
+
+ wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
+ wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
+
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return WIFI_DIRECT_ERROR_NONE;
+}
+
+int wfd_manager_asp_confirm_session(wfd_manager_s *manager, void *params, int confirmed)
+{
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+ wfd_session_s *session = NULL;
+ wfd_oem_asp_prov_s *prov_params = NULL;
+ int res = 0;
+
+ prov_params = (wfd_oem_asp_prov_s *)params;
+ if (!manager || !prov_params) {
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ }
+
+ session = (wfd_session_s*) manager->session;
+ if (!session) {
+ WDS_LOGE("Session not exists");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ }
+
+
+ WDS_LOGD("confirm session [%u] with peer [" MACSTR "]", prov_params->session_id,
+ MAC2STR(prov_params->session_mac));
+
+ WDS_LOGD("created session [%u] with peer [" MACSTR "]", session->session_id,
+ MAC2STR(session->session_mac));
+
+ if (session->session_id != prov_params->session_id ||
+ memcmp(&(session->session_mac), prov_params->session_mac, MACADDR_LEN) != 0) {
+ WDS_LOGE("Session MAC or ID not matched");//LCOV_EXCL_LINE
+ return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ }
+
+ if (confirmed)
+ prov_params->status = 12;
+ else
+ prov_params->status = 11;
+ prov_params->deferring = 1;
+
+ res = wfd_oem_asp_prov_disc_req(manager->oem_ops, prov_params);
+ if (res < 0) {
+ WDS_LOGE("Failed to start session");//LCOV_EXCL_LINE
+ wfd_destroy_session(manager);
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ }
+ wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
+ wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
+
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_NONE;
}
int wfd_manager_accept_connection(wfd_manager_s *manager, unsigned char *peer_addr)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
wfd_session_s *session = NULL;
wfd_device_s *peer = NULL;
int res = 0;
if (!manager || !peer_addr) {
- WDS_LOGE("Invalid parameter");
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
}
session = (wfd_session_s*) manager->session;
if (!session) {
- WDS_LOGE("Session not found");
+ WDS_LOGE("Session not found");//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_NOT_PERMITTED;
}
peer = wfd_peer_find_by_dev_addr(manager, peer_addr);
if (!peer) {
- WDS_LOGE("Peer is NULL");
+ WDS_LOGE("Peer is NULL");//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
}
- // TODO: check peer_addr with session's peer_addr
+ if (memcmp(session->peer->dev_addr, peer_addr, MACADDR_LEN) != 0) {
+ WDS_LOGE("Peer and ongoing session peer are different");//LCOV_EXCL_LINE
+ return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ }
if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
- WDS_LOGD("My device is GO and peer want to join my group, so WPS will be started");
+ WDS_LOGD("My device is GO and peer want to join my group, so WPS will be started");//LCOV_EXCL_LINE
res = wfd_session_wps(session);
} else if (peer->dev_role == WFD_DEV_ROLE_GO) {
- WDS_LOGD("Peer device is GO, so Prov_Disc or Join will be started");
+ WDS_LOGD("Peer device is GO, so Prov_Disc or Join will be started");//LCOV_EXCL_LINE
if (session->type == SESSION_TYPE_INVITE) {
if (session->state == SESSION_STATE_CREATED) {
- WDS_LOGD("Invitation session. PD will be started");
+ WDS_LOGD("Invitation session. PD will be started");//LCOV_EXCL_LINE
res = wfd_session_start(session);
} else {
- WDS_LOGD("Invitation session. Join will be started");
+ WDS_LOGD("Invitation session. Join will be started");//LCOV_EXCL_LINE
res = wfd_session_join(session);
}
} else {
+ /**
+ * TODO: Add autoconnection peer matching logic.
+ */
if (manager->autoconnection && (manager->auto_pin[0] != 0))
g_strlcpy(session->wps_pin, manager->auto_pin, PINSTR_LEN + 1);
- WDS_LOGD("Peer device is GO, so WPS will be started");
+ WDS_LOGD("Peer device is GO, so WPS will be started");//LCOV_EXCL_LINE
res = wfd_session_connect(session);
}
} else {
+ /**
+ * TODO: Add autoconnection peer matching logic.
+ */
/* We should wait GO_NEGO_REQ from peer(MO) in autoconnection mode. */
/* Otherwise, GO Nego is sometimes failed. */
if (manager->autoconnection == FALSE) {
- WDS_LOGD("My device is Device, so Negotiation will be started");
+ WDS_LOGD("My device is Device, so Negotiation will be started");//LCOV_EXCL_LINE
res = wfd_session_connect(session);
}
}
if (res < 0) {
- WDS_LOGE("Failed to start session");
+ WDS_LOGE("Failed to start session");//LCOV_EXCL_LINE
if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
}
wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
+ wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTING);
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_NONE;
}
int wfd_manager_cancel_connection(wfd_manager_s *manager, unsigned char *peer_addr)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
wfd_group_s *group = NULL;
+ int member_cnt = 0;
int res = 0;
if (!manager || !peer_addr) {
- WDS_LOGE("Invalid parameter");
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
}
+ if (!manager->session && manager->state != WIFI_DIRECT_STATE_CONNECTING) {
+ WDS_LOGE("It's not CONNECTING state");//LCOV_EXCL_LINE
+ return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ }
+
res = wfd_session_cancel(manager->session, peer_addr);
if (res < 0) {
- WDS_LOGE("Failed to cancel session");
+ WDS_LOGE("Failed to cancel session");//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
}
- if (manager->local->dev_role != WFD_DEV_ROLE_GO)
- wfd_oem_destroy_group(manager->oem_ops, GROUP_IFNAME);
-
group = (wfd_group_s*) manager->group;
- if (group) {
- wfd_group_remove_member(group, peer_addr);
- if ((wfd_group_is_autonomous(manager->group) != TRUE) && !group->member_count) {
- wfd_oem_destroy_group(manager->oem_ops, group->ifname);
- wfd_destroy_group(manager, group->ifname);
- } else {
- wfd_oem_disconnect(manager->oem_ops, peer_addr);
- }
- }
+ if (group)
+ member_cnt = wfd_group_remove_member(group, peer_addr);
+ else
+ manager->local->dev_role = WFD_DEV_ROLE_NONE;
if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
- wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
+ if (member_cnt)
+ wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
} else {
wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
}
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_NONE;
}
int wfd_manager_reject_connection(wfd_manager_s *manager, unsigned char *peer_addr)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
wfd_session_s *session = NULL;
int res = 0;
if (!manager || !peer_addr) {
- WDS_LOGE("Invalid parameter");
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
}
session = (wfd_session_s*) manager->session;
if (!session) {
- WDS_LOGE("Session not found");
+ WDS_LOGE("Session not found");//LCOV_EXCL_LINE
+ return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ }
+
+ if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
+ WDS_LOGE("It's not permitted with this state [%d]", manager->state);
+ return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ }
+
+ if (session->direction != SESSION_DIRECTION_INCOMING) {
+ WDS_LOGE("Only incomming session can be rejected");//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_NOT_PERMITTED;
}
res = wfd_session_reject(session, peer_addr);
if (res < 0) {
- WDS_LOGE("Failed to reject connection");
- // TODO: check whether set state and break
+ WDS_LOGE("Failed to reject connection");//LCOV_EXCL_LINE
+ /* TODO: check whether set state and break */
}
wfd_destroy_session(manager);
wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
}
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_NONE;
}
int wfd_manager_disconnect(wfd_manager_s *manager, unsigned char *peer_addr)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
wfd_group_s *group = NULL;
wfd_device_s *peer = NULL;
int res = 0;
if (!manager) {
- WDS_LOGE("Invalid parameter");
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
}
if (!peer_addr) {
- WDS_LOGE("Invalid parameter");
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
}
group = (wfd_group_s*) manager->group;
if (!group) {
- WDS_LOGE("Group not found");
+ WDS_LOGE("Group not found");//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_NOT_PERMITTED;
}
peer = wfd_group_find_member_by_addr(group, peer_addr);
if (!peer) {
- WDS_LOGE("Connected peer not found");
+ WDS_LOGE("Connected peer not found");//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
}
wfd_state_set(manager, WIFI_DIRECT_STATE_DISCONNECTING);
+ wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DISCONNECTING);
if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
-#ifdef CTRL_IFACE_DBUS
- /* dbus using device address to identify the peer */
- res = wfd_oem_disconnect(manager->oem_ops, peer->dev_addr);
-#else /* CTRL_IFACE_DBUS */
- res = wfd_oem_disconnect(manager->oem_ops, peer->intf_addr);
-#endif /* CTRL_IFACE_DBUS */
+ if (peer->is_p2p)
+ res = wfd_oem_disconnect(manager->oem_ops, peer->dev_addr, 0);
+ else
+ res = wfd_oem_disconnect(manager->oem_ops, peer->intf_addr, 1);
} else {
res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
}
+
if (res < 0) {
- WDS_LOGE("Failed to disconnect peer");
+ WDS_LOGE("Failed to disconnect peer");//LCOV_EXCL_LINE
res = WIFI_DIRECT_ERROR_OPERATION_FAILED;
goto failed;
}
- WDS_LOGE("Succeeded to disconnect peer");
+ WDS_LOGE("Succeeded to disconnect peer");//LCOV_EXCL_LINE
wfd_group_remove_member(group, peer_addr);
- if (!group->member_count) {
- wfd_oem_destroy_group(manager->oem_ops, group->ifname);
- wfd_destroy_group(manager, group->ifname);
- }
if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
}
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_NONE;
failed:
wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
}
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return res;
}
int wfd_manager_disconnect_all(wfd_manager_s *manager)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
wfd_group_s *group = NULL;
int res = 0;
if (!manager) {
- WDS_LOGE("Invalid parameter");
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
}
group = (wfd_group_s*) manager->group;
if (!group) {
- WDS_LOGE("Group not found");
+ WDS_LOGE("Group not found");//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_NOT_PERMITTED;
}
wfd_state_set(manager, WIFI_DIRECT_STATE_DISCONNECTING);
+ wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DISCONNECTING);
res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
if (res < 0) {
- WDS_LOGE("Failed to destroy group");
+ WDS_LOGE("Failed to destroy group");//LCOV_EXCL_LINE
res = WIFI_DIRECT_ERROR_OPERATION_FAILED;
goto failed;
}
- WDS_LOGE("Succeeded to disconnect all peer");
+ WDS_LOGE("Succeeded to disconnect all peer");//LCOV_EXCL_LINE
- wfd_destroy_group(manager, group->ifname);
+ wfd_destroy_group(manager);
wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return WIFI_DIRECT_ERROR_NONE;
failed:
wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
}
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return res;
}
int wfd_manager_get_peer_info(wfd_manager_s *manager, unsigned char *addr, wfd_discovery_entry_s **peer)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
wfd_device_s *peer_dev = NULL;
wfd_discovery_entry_s *peer_info;
wfd_oem_device_s *oem_dev = NULL;
int res = 0;
+ char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
if (!manager || !addr) {
- WDS_LOGE("Invalid parameter");
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
return -1;
}
time = tval.tv_sec;
#endif
WDS_LOGI("Current time [%ld]", time);
-
+//LCOV_EXCL_START
+ //wfd_manager_get_peer_info takes responsibility of the oem_dev' memory ownership.
res = wfd_oem_get_peer_info(manager->oem_ops, addr, &oem_dev);
if (res < 0 || !oem_dev) {
- WDS_LOGE("Failed to get peer information");
+ WDS_LOGE("Failed to get peer information");//LCOV_EXCL_LINE
return -1;
}
peer_dev = wfd_peer_find_by_addr(manager, addr);
- if(!peer_dev) {
+ if (!peer_dev) {
peer_dev = (wfd_device_s*) g_try_malloc0(sizeof(wfd_device_s));
if (!peer_dev) {
- WDS_LOGE("Failed to allocate memory for peer device. [%s]", strerror(errno));
- free(oem_dev);
+ strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
+ WDS_LOGE("Failed to allocate memory for peer device. [%s]", error_buf);
+ if (oem_dev->vsie)
+ g_free(oem_dev->vsie);
+ g_free(oem_dev);
return -1;
}
memcpy(peer_dev->dev_addr, addr, MACADDR_LEN);
WDS_LOGD("peer_count[%d]", manager->peer_count);
} else {
if (oem_dev->age > 30 && peer_dev->state == WFD_PEER_STATE_DISCOVERED) {
- WDS_LOGE("Too old age to update peer");
- free(oem_dev);
+ WDS_LOGE("Too old age to update peer");//LCOV_EXCL_LINE
+ if (oem_dev->vsie)
+ g_free(oem_dev->vsie);
+ g_free(oem_dev);
return -1;
}
}
peer_dev->group_flags = oem_dev->group_flags;
peer_dev->wps_mode = oem_dev->wps_mode;
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
- memcpy(&(peer_dev->display), &(oem_dev->display), sizeof(wfd_display_s));
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+ if (manager->is_wifi_display_supported)
+ memcpy(&(peer_dev->display), &(oem_dev->display), sizeof(wfd_display_s));
peer_dev->time = time;
peer_dev->channel = oem_dev->channel;
- free(oem_dev);
+ if (oem_dev->vsie) {
+ if (peer_dev->vsie)
+ g_free(peer_dev->vsie);
+ peer_dev->vsie = g_strdup(oem_dev->vsie);
+ g_free(oem_dev->vsie);
+ }
+
+ g_free(oem_dev);
peer_info = (wfd_discovery_entry_s*) g_try_malloc0(sizeof(wfd_discovery_entry_s));
if (!(peer_info)) {
- WDS_LOGE("Failed to allocate memory for peer data. [%s]", strerror(errno));
+ strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
+ WDS_LOGE("Failed to allocate memory for peer data. [%s]", error_buf);
return -1;
}
memcpy(peer_info->mac_address, peer_dev->dev_addr, MACADDR_LEN);
memcpy(peer_info->intf_address, peer_dev->intf_addr, MACADDR_LEN);
peer_info->channel = peer_dev->channel;
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
peer_info->services = 0;
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
peer_info->is_group_owner = peer_dev->dev_role == WFD_DEV_ROLE_GO;
peer_info->is_persistent_go = peer_dev->group_flags & WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
peer_info->is_connected = peer_dev->dev_role == WFD_DEV_ROLE_GC;
peer_info->category = peer_dev->pri_dev_type;
peer_info->subcategory = peer_dev->sec_dev_type;
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
- if (peer_dev->display.availability && peer_dev->display.port)
- peer_info->is_wfd_device = 1;
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+ if (manager->is_wifi_display_supported)
+ if (peer_dev->display.availability && peer_dev->display.port)
+ peer_info->is_wfd_device = 1;
- *peer = peer_info;
+ if (peer_dev->vsie)
+ peer_info->vsie = g_strdup(peer_dev->vsie);
- __WDS_LOG_FUNC_EXIT__;
+ *peer = peer_info;
+//LCOV_EXCL_STOP
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return res;
}
int wfd_manager_get_peers(wfd_manager_s *manager, wfd_discovery_entry_s **peers_data)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
GList *temp = NULL;
wfd_device_s *peer = NULL;
wfd_discovery_entry_s *peers = NULL;
int peer_count = 0;
int count = 0;
int res = 0;
+ char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
if (!manager || !peers_data) {
- WDS_LOGE("Invalid parameter");
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
return -1;
}
WDS_LOGI("Current time [%ld]", time);
peer_count = manager->peer_count;
- WDS_LOGI("peer count [%ld]", peer_count);
+ WDS_LOGI("peer count [%d]", peer_count);
if (peer_count < 0)
return -1;
else if (peer_count == 0)
errno = 0;
peers = (wfd_discovery_entry_s*) g_try_malloc0_n(peer_count, sizeof(wfd_discovery_entry_s));
if (!peers) {
- WDS_LOGE("Failed to allocate memory for peer data. [%s]", strerror(errno));
+ strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
+ WDS_LOGE("Failed to allocate memory for peer data. [%s]", error_buf);
return -1;
}
temp = g_list_next(temp);
manager->peers = g_list_remove(manager->peers, peer);
manager->peer_count--;
- g_free(peer);
+ wfd_peer_destroy(peer);
peer = NULL;
continue;
}
memcpy(peers[count].mac_address, peer->dev_addr, MACADDR_LEN);
memcpy(peers[count].intf_address, peer->intf_addr, MACADDR_LEN);
peers[count].channel = peer->channel;
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
peers[count].services = 0;
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
peers[count].is_group_owner = peer->dev_role == WFD_DEV_ROLE_GO;
peers[count].is_persistent_go = peer->group_flags & WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
peers[count].is_connected = peer->dev_role == WFD_DEV_ROLE_GC;
peers[count].category = peer->pri_dev_type;
peers[count].subcategory = peer->sec_dev_type;
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
- if (peer->display.availability && peer->display.port)
- peers[count].is_wfd_device = 1;
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+
+ if (manager->is_wifi_display_supported)
+ if (peer->display.availability && peer->display.port)
+ peers[count].is_wfd_device = 1;
count++;
WDS_LOGD("%dth peer [%s]", count, peer->dev_name);
next:
*peers_data = peers;
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return count;
}
int wfd_manager_get_connected_peers(wfd_manager_s *manager, wfd_connected_peer_info_s **peers_data)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
wfd_connected_peer_info_s *peers = NULL;
wfd_group_s *group = NULL;
wfd_device_s *peer = NULL;
GList *temp = NULL;
int peer_count = 0;
int count = 0;
+ char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
if (!manager || !peers_data) {
- WDS_LOGE("Invalid parameter");
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
return -1;
}
group = manager->group;
if (!group) {
- WDS_LOGE("Group not exist");
+ WDS_LOGE("Group not exist");//LCOV_EXCL_LINE
return -1;
}
peer_count = group->member_count;
if (peer_count == 0) {
- WDS_LOGD("Member not exist");
+ WDS_LOGD("Member not exist");//LCOV_EXCL_LINE
return 0;
}
errno = 0;
peers = (wfd_connected_peer_info_s*) g_try_malloc0_n(peer_count, sizeof(wfd_connected_peer_info_s));
if (!peers) {
- WDS_LOGE("Failed to allocate memory for connected peer data. [%s]", strerror(errno));
+ strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
+ WDS_LOGE("Failed to allocate memory for connected peer data. [%s]", error_buf);
return -1;
}
peers[count].category = peer->pri_dev_type;
peers[count].subcategory = peer->sec_dev_type;
peers[count].channel = peer->channel;
- peers[count].is_p2p = 1;
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
+ peers[count].is_p2p = peer->is_p2p;
peers[count].services = 0;
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
-
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
- if (peer->display.availability && peer->display.port)
- peers[count].is_wfd_device = 1;
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+ if (manager->is_wifi_display_supported)
+ if (peer->display.availability && peer->display.port)
+ peers[count].is_wfd_device = 1;
WDS_LOGD("%dth member converted[%s]", count, peers[count].device_name);
count++;
*peers_data = peers;
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return count;
}
+wfd_device_s *wfd_manager_get_connected_peer_by_addr(wfd_manager_s *manager, unsigned char *peer_addr)
+{
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+ wfd_device_s *peer = NULL;
+
+ if (peer_addr == NULL) {
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return peer;
+ }
+
+ if (manager->group)
+ peer = wfd_group_find_member_by_addr(manager->group, peer_addr);
+
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return peer;
+}
+
#if 0
wfd_device_s *wfd_manager_find_connected_peer(wfd_manager_s *manager, unsigned char *peer_addr)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
wfd_device_s *peer = NULL;
if (!manager || !peer_addr) {
- WDS_LOGE("Invalid parameter");
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
return NULL;
}
peer = wfd_group_find_member_by_addr(manager->group, peer_addr);
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return peer;
}
#endif
int wfd_manager_get_goup_ifname(char **ifname)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
wfd_group_s *group = g_manager->group;
if (!ifname) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return -1;
}
if (!group) {
- WDS_LOGE("Group not exist");
+ WDS_LOGE("Group not exist");//LCOV_EXCL_LINE
return -1;
}
*ifname = group->ifname;
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return 0;
}
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
int wfd_manager_set_display_device(int type, int port, int hdcp)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
wfd_device_s * device = g_manager->local;
wfd_oem_display_s display;
int res = 0;
if (!device) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return -1;
}
res = wfd_oem_set_display(g_manager->oem_ops, (wfd_oem_display_s*)&display);
if (res < 0) {
- WDS_LOGE("Failed to set wifi display");
+ WDS_LOGE("Failed to set wifi display");//LCOV_EXCL_LINE
return -1;
}
device->display.port = port;
device->display.hdcp_support = hdcp;
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return res;
}
int wfd_manager_set_session_availability(int availability)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
wfd_device_s * device = g_manager->local;
wfd_oem_display_s display;
int res = 0;
if (!device) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return -1;
}
res = wfd_oem_set_display(g_manager->oem_ops, (wfd_oem_display_s*)&display);
if (res < 0) {
- WDS_LOGE("Failed to set wifi display session availability");
+ WDS_LOGE("Failed to set wifi display session availability");//LCOV_EXCL_LINE
return -1;
}
device->display.availability = availability;
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return res;
}
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
-
-wfd_device_s *wfd_manager_get_peer_by_addr(wfd_manager_s *manager, unsigned char *peer_addr)
+int wfd_manager_get_display_device(int *type, int *port, int *hdcp)
{
- __WDS_LOG_FUNC_ENTER__;
- wfd_device_s *peer = NULL;
- if(manager->group) {
- peer = wfd_group_find_member_by_addr(manager->group, peer_addr);
- }
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+ wfd_device_s *device = g_manager->local;
+ int res = 0;
- if(peer) {
- return peer;
+ if (!device || !type || !port || !hdcp) {
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return -1;
}
- peer = wfd_peer_find_by_addr(manager, peer_addr);
+ *type = device->display.type;
+ *port = device->display.port;
+ *hdcp = device->display.hdcp_support;
- __WDS_LOG_FUNC_EXIT__;
- return peer;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return res;
}
-static wfd_manager_s *wfd_manager_init()
+int wfd_manager_get_session_availability(int *availability)
{
- __WDS_LOG_FUNC_ENTER__;
- wfd_manager_s *manager = NULL;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+ wfd_device_s *device = g_manager->local;
int res = 0;
- manager = (wfd_manager_s*) g_try_malloc0(sizeof(wfd_manager_s));
- if (!manager) {
- WDS_LOGE("Failed to allocate memory for wfd_manager structure");
- return NULL;
+ if (!device || !availability) {
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return -1;
}
- manager->go_intent = 7;
- manager->req_wps_mode = WFD_WPS_MODE_PBC;
- manager->max_station = 8;
- res = _wfd_local_init_device(manager);
+ *availability = device->display.availability;
+
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return res;
+}
+
+int wfd_manager_start_discovery(wfd_manager_s *manager, int mode, int timeout,
+ const char* type, int channel, int frequency)
+{
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+ int res = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ wfd_oem_scan_param_s param;
+ memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
+
+ WDS_LOGI("Mode [%d], Timeout [%d], type [%s], channel [%d], frequency [%d]",
+ mode, timeout, type, channel, frequency);
+
+ if (manager->local->dev_role == WFD_DEV_ROLE_GO)
+ param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
+
+ switch (channel) {
+ case WFD_DISCOVERY_FULL_SCAN:
+ param.scan_type = WFD_OEM_SCAN_TYPE_FULL;
+ break;
+ case WFD_DISCOVERY_SOCIAL_CHANNEL:
+ param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
+ break;
+ case WFD_DISCOVERY_CHANNEL1:
+ param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL1;
+ param.freq = 2412;
+ break;
+ case WFD_DISCOVERY_CHANNEL6:
+ param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL6;
+ param.freq = 2437;
+ break;
+ case WFD_DISCOVERY_CHANNEL11:
+ param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL11;
+ param.freq = 2462;
+ break;
+ default:
+ param.scan_type = WFD_OEM_SCAN_TYPE_SPECIFIC;
+ if (frequency > 0)
+ param.freq = frequency;
+ else
+ param.freq = wfd_util_channel_to_freq(channel);
+ }
+
+ if (mode)
+ param.scan_mode = WFD_OEM_SCAN_MODE_PASSIVE;
+ else
+ param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
+
+ param.scan_time = timeout;
+
+ res = wfd_oem_start_scan(manager->oem_ops, ¶m);
if (res < 0) {
- WDS_LOGE("Failed to initialize local device");
- g_free(manager);
- return NULL; // really stop manager?
+ WDS_LOGE("Failed to start scan");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return WIFI_DIRECT_ERROR_OPERATION_FAILED;
}
- WDS_LOGD("Succeeded to initialize local device");
- manager->exit_timer = g_timeout_add(120000,
- (GSourceFunc) _wfd_exit_timeout_cb, manager);
- WDS_LOGD("Exit timer started");
+ if (mode)
+ manager->scan_mode = WFD_SCAN_MODE_PASSIVE;
+ else
+ manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
+
+ if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
+ wfd_state_set(manager, WIFI_DIRECT_STATE_DISCOVERING);
+ wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DISCOVERING);
+ }
- __WDS_LOG_FUNC_EXIT__;
- return manager;
+ WDS_LOGD("Succeeded to start scan");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return WIFI_DIRECT_ERROR_NONE;
}
-int wfd_manager_deinit(wfd_manager_s *manager)
+int wfd_manager_cancel_discovery(wfd_manager_s *manager)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+ int res = 0;
- if (!manager) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
- return -1;
+ res = wfd_oem_stop_scan(manager->oem_ops);
+ if (res < 0) {
+ WDS_LOGE("Failed to stop scan");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return WIFI_DIRECT_ERROR_OPERATION_FAILED;
}
- if (manager->exit_timer > 0)
- g_source_remove(manager->exit_timer);
- manager->exit_timer = 0;
+ if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
+ wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
+ wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
+ } else if (manager->local->dev_role == WFD_DEV_ROLE_GC) {
+ wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
+ wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
+ } else {
+ wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+ wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+ }
- _wfd_local_deinit_device(manager);
+ WDS_LOGD("Succeeded to stop scan");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return WIFI_DIRECT_ERROR_NONE;
+}
- g_free(manager);
+wfd_device_s *wfd_manager_get_peer_by_addr(wfd_manager_s *manager, unsigned char *peer_addr)
+{
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+ wfd_device_s *peer = NULL;
+ if (manager->group)
+ peer = wfd_group_find_member_by_addr(manager->group, peer_addr);
- __WDS_LOG_FUNC_EXIT__;
- return 0;
+ if (peer)
+ return peer;
+
+ peer = wfd_peer_find_by_addr(manager, peer_addr);
+
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return peer;
}
-static void *wfd_plugin_init(wfd_manager_s *manager)
+static wfd_manager_s *wfd_manager_init()
{
- __WDS_LOG_FUNC_ENTER__;
- void *handle;
- struct utsname kernel_info;
- int res;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
+ wfd_manager_s *manager = NULL;
+ int res = 0;
+ manager = (wfd_manager_s*) g_try_malloc0(sizeof(wfd_manager_s));
if (!manager) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
+ WDS_LOGE("Failed to allocate memory for wfd_manager structure");//LCOV_EXCL_LINE
return NULL;
}
- res = uname(&kernel_info);
- if (res) {
- WDS_LOGE("Failed to detect target type");
- __WDS_LOG_FUNC_EXIT__;
+ manager->wfd_oem_conf = (wfd_oem_config_s*) g_try_malloc0(sizeof(wfd_oem_config_s));
+ if (!manager->wfd_oem_conf) {
+ g_free(manager);
+ WDS_LOGE("Failed to allocate memory for wfd_oem_conf structure");//LCOV_EXCL_LINE
return NULL;
}
- WDS_LOGD("Node name [%s], HW ID [%s]", kernel_info.nodename, kernel_info.machine);
-
- errno = 0;
-#if defined(TIZEN_ARCH_64)
- handle = dlopen(SUPPL_PLUGIN_64BIT_PATH, RTLD_NOW);
-#else
- handle = dlopen(SUPPL_PLUGIN_PATH, RTLD_NOW);
-#endif
- if (!handle) {
- WDS_LOGE("Failed to open shared object. [%s]", dlerror());
- __WDS_LOG_FUNC_EXIT__;
- return NULL;
- }
+ manager->go_intent = 7;
+ manager->req_wps_mode = WFD_WPS_MODE_PBC;
+ manager->max_station = 8;
+ manager->session_timer = 120;
+ manager->auto_group_remove_enable = TRUE;
- errno = 0;
- int (*plugin_load)(wfd_oem_ops_s **ops) = NULL;
- plugin_load = (int (*)(wfd_oem_ops_s **ops)) dlsym(handle, "wfd_plugin_load");
- if (!plugin_load) {
- WDS_LOGE( "Failed to load symbol. Error = [%s]", strerror(errno));
- dlclose(handle);
- __WDS_LOG_FUNC_EXIT__;
- return NULL;
- }
+ manager->go_intent_per_type[WFD_DISPLAY_TYPE_SOURCE] = WFD_GO_INTENT_DISPLY_SOURCE;
+ manager->go_intent_per_type[WFD_DISPLAY_TYPE_PRISINK] = WFD_GO_INTENT_MAX;
+ manager->go_intent_per_type[WFD_DISPLAY_TYPE_SECSINK] = WFD_GO_INTENT_MAX;
+ manager->go_intent_per_type[WFD_DISPLAY_TYPE_DUAL] = WFD_GO_INTENT_MAX;
+ manager->go_intent_per_type[WFD_DISPLAY_TYPE_NONE] = WFD_GO_INTENT_MAX;
- wfd_oem_ops_s *temp_ops;
- (*plugin_load)(&temp_ops);
- manager->oem_ops = temp_ops;
+ wfd_util_check_features(manager);
+ wfd_util_load_wfd_conf(manager);
- res = wfd_oem_init(temp_ops, (wfd_oem_event_cb) wfd_process_event, manager);
+ res = _wfd_local_init_device(manager);
if (res < 0) {
- WDS_LOGE("Failed to initialize OEM");
- dlclose(handle);
- __WDS_LOG_FUNC_EXIT__;
- return NULL;
+ WDS_LOGE("Failed to initialize local device");//LCOV_EXCL_LINE
+ g_free(manager->wfd_oem_conf);
+ g_free(manager);
+ return NULL; /* really stop manager? */
}
- WDS_LOGD("Succeeded to initialize OEM");
+ WDS_LOGD("Succeeded to initialize local device");//LCOV_EXCL_LINE
- __WDS_LOG_FUNC_EXIT__;
- return handle;
+ manager->client_count = 0;
+ manager->client_list = NULL;
+ if (manager->is_on_demand) {
+ manager->exit_timer = g_timeout_add(120000,
+ (GSourceFunc) _wfd_exit_timeout_cb, manager);
+ WDS_LOGD("Exit timer started");//LCOV_EXCL_LINE
+ }
+
+
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return manager;
}
-static int wfd_plugin_deinit(wfd_manager_s *manager)
+int wfd_manager_deinit(wfd_manager_s *manager)
{
- __WDS_LOG_FUNC_ENTER__;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
- if (!manager || !manager->plugin_handle) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
+ if (!manager) {
+ WDS_LOGE("Invalid parameter");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return -1;
}
- dlclose(manager->plugin_handle);
- manager->plugin_handle = NULL;
+ if (manager->is_on_demand && manager->exit_timer > 0) {
+ g_source_remove(manager->exit_timer);
+ manager->exit_timer = 0;
+ }
- __WDS_LOG_FUNC_EXIT__;
+ _wfd_local_deinit_device(manager);
+
+ g_free(manager->wfd_oem_conf);
+ g_free(manager);
+
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return 0;
}
-int main(int argc, char *argv[])
+int wfd_manager_load()
{
- __WDS_LOG_FUNC_ENTER__;
- GMainLoop *main_loop = NULL;
int res = 0;
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
-#if !GLIB_CHECK_VERSION(2,32,0)
- if (!g_thread_supported())
- g_thread_init(NULL);
-#endif
-
-#if !GLIB_CHECK_VERSION(2,36,0)
- g_type_init();
-#endif
-
- // TODO: Parsing argument
+ /* TODO: Parsing argument */
/* Wi-Fi direct connection for S-Beam can be optimized using argument */
+ /**
+ * wfd-manager initialization
+ */
g_manager = wfd_manager_init();
if (!g_manager) {
- WDS_LOGE("Failed to initialize wifi-direct manager");
- __WDS_LOG_FUNC_EXIT__;
+ WDS_LOGE("Failed to initialize wifi-direct manager");//LCOV_EXCL_LINE
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return -1;
}
- WDS_LOGD("Succeeded to initialize manager");
+ WDS_LOGD("Succeeded to initialize manager");//LCOV_EXCL_LINE
- g_manager->plugin_handle = wfd_plugin_init(g_manager);
- if (!g_manager->plugin_handle) {
- WDS_LOGE("Failed to initialize plugin");
- wfd_manager_deinit(g_manager);
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- }
- WDS_LOGD("Succeeded to load plugin");
+ res = wfd_util_get_local_dev_mac(g_manager->local->dev_addr);
+ if (res < 0)
+ WDS_LOGE("Failed to get local device MAC address");//LCOV_EXCL_LINE
- res = wfd_client_handler_init(g_manager);
- if (res < 0) {
- WDS_LOGE("Failed to initialize client handler");
- wfd_plugin_deinit(g_manager);
+ if (wfd_manager_iface_init() != 0) {
+ WDS_LOGE("Failed to initialize iface");//LCOV_EXCL_LINE
wfd_manager_deinit(g_manager);
- __WDS_LOG_FUNC_EXIT__;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
return -1;
}
- WDS_LOGD("Succeeded to initialize client handler");
+ WDS_LOGD("Succeeded to load iface");//LCOV_EXCL_LINE
- main_loop = g_main_loop_new(NULL, FALSE);
- if (main_loop == NULL) {
- WDS_LOGE("Failed to create GMainLoop structure");
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- }
- g_manager->main_loop = main_loop;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return 0;
+}
- g_main_loop_run(main_loop);
+void wfd_manager_unload()
+{
+ __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
- wfd_client_handler_deinit(g_manager);
- wfd_plugin_deinit(g_manager);
+ wfd_manager_iface_deinit();
wfd_manager_deinit(g_manager);
+ g_manager = NULL;
- __WDS_LOG_FUNC_EXIT__;
- return 0;
+ __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
+ return;
}