SET(SRCS
${CMAKE_SOURCE_DIR}/src/wifi-direct-manager.c
${CMAKE_SOURCE_DIR}/src/wifi-direct-state.c
- ${CMAKE_SOURCE_DIR}/src/wifi-direct-client.c
${CMAKE_SOURCE_DIR}/src/wifi-direct-peer.c
${CMAKE_SOURCE_DIR}/src/wifi-direct-group.c
${CMAKE_SOURCE_DIR}/src/wifi-direct-session.c
${CMAKE_SOURCE_DIR}/src/wifi-direct-event.c
${CMAKE_SOURCE_DIR}/src/wifi-direct-util.c
+ ${CMAKE_SOURCE_DIR}/src/wifi-direct-dbus.c
+ ${CMAKE_SOURCE_DIR}/src/wifi-direct-error.c
+ ${CMAKE_SOURCE_DIR}/src/wifi-direct-iface.c
${CMAKE_SOURCE_DIR}/oem/wifi-direct-oem.c
)
INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/common/p2p_supp.sh DESTINATION sbin)
INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/common/ccode.conf DESTINATION etc/wifi-direct)
INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/common/persistent-peer DESTINATION /opt/etc)
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/common/wfd-manager.conf DESTINATION /etc/dbus-1/system.d)
IF(TIZEN_TV)
IF(TIZEN_WIFI_MODULE_BUNDLE)
INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/bundle/p2p_supp.conf DESTINATION etc/wifi-direct)
--- /dev/null
+<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+ <policy user="root">
+ <allow own="net.wifidirect"/>
+ <allow send_destination="net.wifidirect"/>
+ </policy>
+ <policy context="default">
+ <check send_destination="net.wifidirect" send_interface="net.wifidirect" privilege="http://tizen.org/feature/network.wifi.direct" />
+ <check send_destination="net.wifidirect" send_interface="net.wifidirect.group" privilege="http://tizen.org/feature/network.wifi.direct" />
+ <check send_destination="net.wifidirect" send_interface="net.wifidirect.config" privilege="http://tizen.org/feature/network.wifi.direct" />
+ <check send_destination="net.wifidirect" send_interface="net.wifidirect.service" privilege="http://tizen.org/feature/network.wifi.direct.service_discovery" />
+ <check send_destination="net.wifidirect" send_interface="net.wifidirect.display" privilege="http://tizen.org/feature/network.wifi.direct.display" />
+ </policy>
+</busconfig>
+++ /dev/null
-/*
- * Network Configuration Module
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-/**
- * This file declares wifi direct client functions and structures.
- *
- * @file wifi-direct-client.h
- * @author Gibyoung Kim (lastkgb.kim@samsung.com)
- * @version 0.7
- */
-
-#ifndef __WIFI_DIRECT_CLIENT_H__
-#define __WIFI_DIRECT_CLIENT_H__
-
-#define WFD_SERVER_SOCK_PATH "/tmp/wfd_client_socket"
-#define WFD_SERVER_SOCK_MODE (S_IRWXU | S_IRWXG | S_IRWXO)
-#define WFD_MAX_CLIENT 16
-#define WFD_CLIENT_PENDING_SOCKET -999
-
-#define SOCK_FD_MIN 3
-#define WFD_POLL_TIMEOUT 2000
-
-#define WFD_PRIVILEGE "http://tizen.org/privilege/wifidirect"
-
-typedef struct {
- int ssock;
- int asock;
- int client_id;
- int gsource_id;
-} wfd_client_s;
-
-int wfd_client_handler_deinit(wfd_manager_s *manager);
-int wfd_client_handler_init(wfd_manager_s *manager);
-int wfd_client_send_event(wfd_manager_s *manager, wifi_direct_client_noti_s *noti);
-
-#endif /* __WIFI_DIRECT_CLIENT_H__ */
--- /dev/null
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file declares wifi direct dbus utility functions.
+ *
+ * @file wifi-direct-dbus.h
+ * @author Nishant Chaprana (n.chaprana@samsung.com)
+ * @version 0.1
+ */
+
+#ifndef __WIFI_DIRECT_DBUS_H__
+#define __WIFI_DIRECT_DBUS_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <gio/gio.h>
+
+#define WFD_MANAGER_SERVICE "net.wifidirect"
+#define WFD_MANAGER_PATH "/net/wifidirect"
+#define WFD_MANAGER_MANAGE_INTERFACE WFD_MANAGER_SERVICE
+#define WFD_MANAGER_GROUP_INTERFACE WFD_MANAGER_SERVICE ".group"
+#define WFD_MANAGER_CONFIG_INTERFACE WFD_MANAGER_SERVICE ".config"
+#define WFD_MANAGER_SERVICE_INTERFACE WFD_MANAGER_SERVICE ".service"
+#define WFD_MANAGER_DISPLAY_INTERFACE WFD_MANAGER_SERVICE ".display"
+
+#define WFD_MANAGER_DBUS_REPLY_TIMEOUT 10 * 1000
+#define WFD_MANAGER_DBUS_REPLY_TIMEOUT_SYNC 10 * 1000
+#define DBUS_OBJECT_PATH_MAX 150
+
+#define DBUS_DEBUG_VARIANT(parameters) \
+ do {\
+ gchar *parameters_debug_str = NULL;\
+ if (parameters)\
+ parameters_debug_str = g_variant_print(parameters, TRUE);\
+ WDS_LOGD("signal params [%s]", parameters_debug_str ? parameters_debug_str : "NULL");\
+ g_free(parameters_debug_str);\
+ } while (0)
+
+gboolean wfd_manager_dbus_init(void);
+
+void wfd_manager_dbus_deinit(void);
+
+guint wfd_manager_dbus_iface_register(const gchar* iface_name,
+ const gchar* iface_path,
+ const gchar *xml_data,
+ const GDBusInterfaceVTable *interface_vtable);
+
+gboolean wfd_manager_dbus_iface_unregister(guint reg_id);
+
+gboolean wfd_manager_dbus_emit_signal(const gchar *interface_name,
+ const gchar *signal_name,
+ GVariant *parameters);
+
+GVariant* wfd_manager_dbus_pack_ay(const unsigned char *src, int size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __NETCONFIG_NETDBUS_H__ */
--- /dev/null
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file declares wifi direct manager dbus error functions.
+ *
+ * @file wifi-direct-error.h
+ * @author Nishant Chaprana (n.chaprana@samsung.com)
+ * @version 0.1
+ */
+
+#ifndef __WIFI_DIRECT_ERROR_H__
+#define __WIFI_DIRECT_ERROR_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <tizen.h>
+#include <wifi-direct.h>
+
+#define WFD_MANAGER_ERROR_INTERFACE WFD_MANAGER_SERVICE ".Error"
+
+void wfd_error_set_gerror(wifi_direct_error_e error_code, GError **error);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __WIFI_DIRECT_ERROR_H__ */
--- /dev/null
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file declares wifi direct dbus interface management functions.
+ *
+ * @file wifi-direct-iface.h
+ * @author Nishant Chaprana (n.chaprana@samsung.com)
+ * @version 0.1
+ */
+
+#ifndef __WIFI_DIRECT_IFACE_H__
+#define __WIFI_DIRECT_IFACE_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+gboolean wfd_manager_dbus_register(void);
+void wfd_manager_dbus_unregister(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __WIFI_DIRECT_IFACE_H__ */
#ifndef __WIFI_DIRECT_IPC_H__
#define __WIFI_DIRECT_IPC_H__
+#include "wifi-direct-error.h"
+
#define true 1
#define false 0
#define VCONFKEY_SUBNET_MASK "memory/private/wifi_direct_manager/p2p_subnet_mask"
#define VCONFKEY_GATEWAY "memory/private/wifi_direct_manager/p2p_gateway"
-typedef enum
-{
- WIFI_DIRECT_CMD_INVALID,
- WIFI_DIRECT_CMD_REGISTER,
- WIFI_DIRECT_CMD_INIT_ASYNC_SOCKET,
- WIFI_DIRECT_CMD_DEREGISTER,
- WIFI_DIRECT_CMD_GET_LINK_STATUS,
- WIFI_DIRECT_CMD_ACTIVATE,
- WIFI_DIRECT_CMD_DEACTIVATE,
- WIFI_DIRECT_CMD_START_DISCOVERY,
- WIFI_DIRECT_CMD_START_DISCOVERY_SPECIFIC_CHANNEL,
- WIFI_DIRECT_CMD_CANCEL_DISCOVERY,
- WIFI_DIRECT_CMD_IS_LISTENING_ONLY, // 10
- WIFI_DIRECT_CMD_GET_DISCOVERY_RESULT,
-
- WIFI_DIRECT_CMD_CONNECT,
- WIFI_DIRECT_CMD_SEND_CONNECT_REQ,
- WIFI_DIRECT_CMD_CANCEL_CONNECT, // deprecated
- WIFI_DIRECT_CMD_CANCEL_CONNECTION,
- WIFI_DIRECT_CMD_REJECT_CONNECTION,
- WIFI_DIRECT_CMD_DISCONNECT,
- WIFI_DIRECT_CMD_DISCONNECT_ALL,
- WIFI_DIRECT_CMD_GET_CONNECTED_PEERS_INFO,
-
- WIFI_DIRECT_CMD_CREATE_GROUP, // 20
- WIFI_DIRECT_CMD_DESTROY_GROUP,
- WIFI_DIRECT_CMD_IS_GROUPOWNER,
- WIFI_DIRECT_CMD_IS_AUTONOMOUS_GROUP,
-
- WIFI_DIRECT_CMD_GET_SSID,
- WIFI_DIRECT_CMD_SET_SSID,
- WIFI_DIRECT_CMD_GET_IP_ADDR,
- WIFI_DIRECT_CMD_GET_MAC_ADDR,
- WIFI_DIRECT_CMD_GET_CONFIG,
- WIFI_DIRECT_CMD_SET_CONFIG,
-
- WIFI_DIRECT_CMD_ACTIVATE_PUSHBUTTON, // 30
- WIFI_DIRECT_CMD_SET_WPS_PIN,
- WIFI_DIRECT_CMD_GET_WPS_PIN,
- WIFI_DIRECT_CMD_GENERATE_WPS_PIN,
- WIFI_DIRECT_CMD_SET_WPA,
- WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE,
- WIFI_DIRECT_CMD_GET_LOCAL_WPS_MODE,
- WIFI_DIRECT_CMD_GET_REQ_WPS_MODE,
- WIFI_DIRECT_CMD_SET_REQ_WPS_MODE,
-
- WIFI_DIRECT_CMD_SET_GO_INTENT,
- WIFI_DIRECT_CMD_GET_GO_INTENT, // 40
- WIFI_DIRECT_CMD_SET_MAX_CLIENT,
- WIFI_DIRECT_CMD_GET_MAX_CLIENT,
- WIFI_DIRECT_CMD_SET_AUTOCONNECTION_MODE,
- WIFI_DIRECT_CMD_IS_AUTOCONNECTION_MODE,
- WIFI_DIRECT_CMD_IS_DISCOVERABLE,
-
- WIFI_DIRECT_CMD_GET_OPERATING_CHANNEL,
- WIFI_DIRECT_CMD_ACTIVATE_PERSISTENT_GROUP,
- WIFI_DIRECT_CMD_DEACTIVATE_PERSISTENT_GROUP,
- WIFI_DIRECT_CMD_IS_PERSISTENT_GROUP_ACTIVATED,
- WIFI_DIRECT_CMD_GET_PERSISTENT_GROUP_INFO, // 50
- WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP,
- WIFI_DIRECT_CMD_GET_DEVICE_NAME,
- WIFI_DIRECT_CMD_SET_DEVICE_NAME,
-
- WIFI_DIRECT_CMD_SET_OEM_LOGLEVEL,
- WIFI_DIRECT_CMD_GET_PEER_INFO,
- WIFI_DIRECT_CMD_SET_PASSPHRASE,
- WIFI_DIRECT_CMD_GET_PASSPHRASE,
- WIFI_DIRECT_CMD_SET_AUTOCONNECTION_PEER,
-
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
- WIFI_DIRECT_CMD_REGISTER_LOCAL_SERVICE,
- WIFI_DIRECT_CMD_DEREGISTER_LOCAL_SERVICE,
- WIFI_DIRECT_CMD_START_SERVICE_DISCOVERY,
- WIFI_DIRECT_CMD_CANCEL_SERVICE_DISCOVERY, //60
-
- WIFI_DIRECT_CMD_REGISTER_SERVICE,
- WIFI_DIRECT_CMD_DEREGISTER_SERVICE,
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
-
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
- WIFI_DIRECT_CMD_INIT_MIRACAST,
- WIFI_DIRECT_CMD_INIT_DISPLAY,
- WIFI_DIRECT_CMD_DEINIT_DISPLAY,
- WIFI_DIRECT_CMD_SET_DISPLAY,
- WIFI_DIRECT_CMD_SET_DISPLAY_AVAILABILITY,
- WIFI_DIRECT_CMD_GET_PEER_DISPLAY_TYPE,
- WIFI_DIRECT_CMD_GET_PEER_DISPLAY_AVAILABILITY,
- WIFI_DIRECT_CMD_GET_PEER_DISPLAY_HDCP,
- WIFI_DIRECT_CMD_GET_PEER_DISPLAY_PORT,
- WIFI_DIRECT_CMD_GET_PEER_DISPLAY_THROUGHPUT,
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
-
-
-
- WIFI_DIRECT_CMD_MAX
-} wifi_direct_cmd_e;
-
/**
- * Wi-Fi Direct client event for IPC
+ * Wi-Fi Direct connection state
*/
-typedef enum
-{
- WIFI_DIRECT_CLI_EVENT_INVALID = -1, /**< */
-
- WIFI_DIRECT_CLI_EVENT_ACTIVATION, /**< */
- WIFI_DIRECT_CLI_EVENT_DEACTIVATION, /**< */
-
- WIFI_DIRECT_CLI_EVENT_DISCOVER_START, /**< 80211 scan*/
- WIFI_DIRECT_CLI_EVENT_DISCOVER_START_LISTEN_ONLY, /**< listen only mode*/
- WIFI_DIRECT_CLI_EVENT_DISCOVER_START_SEARCH_LISTEN, /**< search, listen*/
- WIFI_DIRECT_CLI_EVENT_DISCOVER_END, /**< */
- WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS, /**< */
- WIFI_DIRECT_CLI_EVENT_DISCOVER_LOST_PEERS, /**< */
+typedef enum {
+ WFD_EVENT_CONNECTION_REQ, /**< Connection is requested */
+ WFD_EVENT_CONNECTION_WPS_REQ, /**< WPS is requested */
+ WFD_EVENT_CONNECTION_IN_PROGRESS, /**< Connection in progress */
+ WFD_EVENT_CONNECTION_RSP, /**< Connected */
+ WFD_EVENT_DISASSOCIATION_IND, /**< Disconnected by remote Group Client */
+ WFD_EVENT_DISCONNECTION_RSP, /**< Disconnected by local device */
+ WFD_EVENT_DISCONNECTION_IND, /**< Disconnected by remote Group Owner */
+ WFD_EVENT_GROUP_CREATED, /**< Group is created */
+ WFD_EVENT_GROUP_DESTROYED, /**< Group is destroyed */
+} wfd_connection_event_e;
- WIFI_DIRECT_CLI_EVENT_CONNECTION_START, /**< */
- WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ, /**< */
- WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP, /**< */
- WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ, /**< */
+/**
+ * @brief Enumeration for Wi-Fi Direct secondary device type.
+ * @since_tizen 2.3
+ */
+typedef enum {
+ WFD_SECONDARY_DEVICE_TYPE_COMPUTER_PC = 1, /**< PC */
+ WFD_SECONDARY_DEVICE_TYPE_COMPUTER_SERVER = 2, /**< Server */
+ WFD_SECONDARY_DEVICE_TYPE_COMPUTER_MEDIA_CENTER = 3, /**< Media Center */
+ WFD_SECONDARY_DEVICE_TYPE_COMPUTER_UMPC = 4, /**< UMPC */
+ WFD_SECONDARY_DEVICE_TYPE_COMPUTER_NOTEBOOK = 5, /**< Notebook */
+ WFD_SECONDARY_DEVICE_TYPE_COMPUTER_DESKTOP = 6, /**< Desktop */
+ WFD_SECONDARY_DEVICE_TYPE_COMPUTER_MID = 7, /**< MID */
+ WFD_SECONDARY_DEVICE_TYPE_COMPUTER_NETBOOK = 8, /**< Netbook */
+ WFD_SECONDARY_DEVICE_TYPE_INPUT_KEYBOARD = 1, /**< Keyboard */
+ WFD_SECONDARY_DEVICE_TYPE_INPUT_MOUSE = 2, /**< Mouse */
+ WFD_SECONDARY_DEVICE_TYPE_INPUT_JOYSTICK = 3, /**< Joystick */
+ WFD_SECONDARY_DEVICE_TYPE_INPUT_TRACKBALL = 4, /**< Trackball */
+ WFD_SECONDARY_DEVICE_TYPE_INPUT_CONTROLLER = 5, /**< Controller */
+ WFD_SECONDARY_DEVICE_TYPE_INPUT_REMOTE = 6, /**< Remote */
+ WFD_SECONDARY_DEVICE_TYPE_INPUT_TOUCHSCREEN = 7, /**< Touchscreen */
+ WFD_SECONDARY_DEVICE_TYPE_INPUT_BIOMETRIC_READER = 8, /**< Biometric reader */
+ WFD_SECONDARY_DEVICE_TYPE_INPUT_BARCODE_READER = 9, /**< Barcode reader */
+ WFD_SECONDARY_DEVICE_TYPE_PRINTER_PRINTER = 1, /**< Printer */
+ WFD_SECONDARY_DEVICE_TYPE_PRINTER_SCANNER = 2, /**< Scanner */
+ WFD_SECONDARY_DEVICE_TYPE_PRINTER_FAX = 3, /**< Fax */
+ WFD_SECONDARY_DEVICE_TYPE_PRINTER_COPIER = 4, /**< Copier */
+ WFD_SECONDARY_DEVICE_TYPE_PRINTER_ALL_IN_ONE = 5, /**< All-in-one */
+ WFD_SECONDARY_DEVICE_TYPE_CAMERA_DIGITAL_STILL = 1, /**< Digital still camera */
+ WFD_SECONDARY_DEVICE_TYPE_CAMERA_VIDEO = 2, /**< Video camera */
+ WFD_SECONDARY_DEVICE_TYPE_CAMERA_WEBCAM = 3, /**< Webcam */
+ WFD_SECONDARY_DEVICE_TYPE_CAMERA_SECURITY = 4, /**< Security camera */
+ WFD_SECONDARY_DEVICE_TYPE_STORAGE_NAS = 1, /**< NAS */
+ WFD_SECONDARY_DEVICE_TYPE_NETWORK_INFRA_AP = 1, /**< AP */
+ WFD_SECONDARY_DEVICE_TYPE_NETWORK_INFRA_ROUTER = 2, /**< Router */
+ WFD_SECONDARY_DEVICE_TYPE_NETWORK_INFRA_SWITCH = 3, /**< Switch */
+ WFD_SECONDARY_DEVICE_TYPE_NETWORK_INFRA_GATEWAY = 4, /**< Gateway */
+ WFD_SECONDARY_DEVICE_TYPE_DISPLAY_TV = 1, /**< TV */
+ WFD_SECONDARY_DEVICE_TYPE_DISPLAY_PIC_FRAME = 2, /**< Picture frame */
+ WFD_SECONDARY_DEVICE_TYPE_DISPLAY_PROJECTOR = 3, /**< Projector */
+ WFD_SECONDARY_DEVICE_TYPE_DISPLAY_MONITOR = 4, /**< Monitor */
+ WFD_SECONDARY_DEVICE_TYPE_MULTIMEDIA_DAR = 1, /**< DAR */
+ WFD_SECONDARY_DEVICE_TYPE_MULTIMEDIA_PVR = 2, /**< PVR */
+ WFD_SECONDARY_DEVICE_TYPE_MULTIMEDIA_MCX = 3, /**< MCX */
+ WFD_SECONDARY_DEVICE_TYPE_MULTIMEDIA_STB = 4, /**< Set-top box */
+ WFD_SECONDARY_DEVICE_TYPE_MULTIMEDIA_MS_MA_ME = 5, /**< Media Server / Media Adapter / Media Extender */
+ WFD_SECONDARY_DEVICE_TYPE_MULTIMEDIA_PVP = 6, /**< Portable video player */
+ WFD_SECONDARY_DEVICE_TYPE_GAME_XBOX = 1, /**< Xbox */
+ WFD_SECONDARY_DEVICE_TYPE_GAME_XBOX_360 = 2, /**< Xbox 360 */
+ WFD_SECONDARY_DEVICE_TYPE_GAME_PS = 3, /**< Playstation */
+ WFD_SECONDARY_DEVICE_TYPE_GAME_CONSOLE = 4, /**< Console */
+ WFD_SECONDARY_DEVICE_TYPE_GAME_PORTABLE = 5, /**< Portable */
+ WFD_SECONDARY_DEVICE_TYPE_TELEPHONE_WINDOWS_MOBILE = 1, /**< Windows Mobile */
+ WFD_SECONDARY_DEVICE_TYPE_TELEPHONE_PHONE_SINGLE = 2, /**< Phone - single mode */
+ WFD_SECONDARY_DEVICE_TYPE_TELEPHONE_PHONE_DUAL = 3, /**< Phone - dual mode */
+ WFD_SECONDARY_DEVICE_TYPE_TELEPHONE_SMARTPHONE_SINGLE = 4, /**< Smart Phone - single mode */
+ WFD_SECONDARY_DEVICE_TYPE_TELEPHONE_SMARTPHONE_DUAL = 5, /**< Smart Phone - dual mode */
+ WFD_SECONDARY_DEVICE_TYPE_AUDIO_TUNER = 1, /**< Tuner */
+ WFD_SECONDARY_DEVICE_TYPE_AUDIO_SPEAKER = 2, /**< Speaker */
+ WFD_SECONDARY_DEVICE_TYPE_AUDIO_PMP = 3, /**< Portable Music Player */
+ WFD_SECONDARY_DEVICE_TYPE_AUDIO_HEADSET = 4, /**< Headset */
+ WFD_SECONDARY_DEVICE_TYPE_AUDIO_HEADPHONE = 5, /**< Headphone */
+ WFD_SECONDARY_DEVICE_TYPE_AUDIO_MIC = 6, /**< Microphone */
+} wfd_secondary_device_type_e;
- WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP, /**< */
- WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND, /**< */
- WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND, /**< */
+/**
+ * @brief Enumeration for Wi-Fi Direct primary device type.
+ * @since_tizen 2.3
+ */
+typedef enum {
+ WFD_PRIMARY_DEVICE_TYPE_COMPUTER = 1, /**< Computer */
+ WFD_PRIMARY_DEVICE_TYPE_INPUT_DEVICE = 2, /**< Input device */
+ WFD_PRIMARY_DEVICE_TYPE_PRINTER = 3, /**< Printer */
+ WFD_PRIMARY_DEVICE_TYPE_CAMERA = 4, /**< Camera */
+ WFD_PRIMARY_DEVICE_TYPE_STORAGE = 5, /**< Storage */
+ WFD_PRIMARY_DEVICE_TYPE_NETWORK_INFRA = 6, /**< Network Infrastructure */
+ WFD_PRIMARY_DEVICE_TYPE_DISPLAY = 7, /**< Display */
+ WFD_PRIMARY_DEVICE_TYPE_MULTIMEDIA_DEVICE = 8, /**< Multimedia device */
+ WFD_PRIMARY_DEVICE_TYPE_GAME_DEVICE = 9, /**< Game device */
+ WFD_PRIMARY_DEVICE_TYPE_TELEPHONE = 10, /**< Telephone */
+ WFD_PRIMARY_DEVICE_TYPE_AUDIO = 11, /**< Audio */
+ WFD_PRIMARY_DEVICE_TYPE_OTHER = 255 /**< Others */
+} wfd_primary_device_type_e;
- WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP, /**< */
- WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP, /**< */
+/**
+ * @brief Enumeration for Wi-Fi WPS type.
+ * @since_tizen 2.3
+ */
+typedef enum {
+ WFD_WPS_TYPE_NONE = 0x00, /**< No WPS type */
+ WFD_WPS_TYPE_PBC = 0x01, /**< Push Button Configuration */
+ WFD_WPS_TYPE_PIN_DISPLAY = 0x02, /**< Display PIN code */
+ WFD_WPS_TYPE_PIN_KEYPAD = 0x04, /**< Provide the keypad to input the PIN */
+} wfd_wps_type_e;
- WIFI_DIRECT_CLI_EVENT_IP_LEASED_IND, /**< */
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
- WIFI_DIRECT_CLI_EVENT_SERVICE_DISCOVERY_STARTED,
- WIFI_DIRECT_CLI_EVENT_SERVICE_DISCOVERY_FOUND,
- WIFI_DIRECT_CLI_EVENT_SERVICE_DISCOVERY_FINISHED,
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
+/**
+ * @brief Enumeration for Wi-Fi Direct Discovery Channel.
+ * @since_tizen 2.3
+ */
+typedef enum {
+ WFD_DISCOVERY_FULL_SCAN = 0, /**< Scan full channel*/
+ WFD_DISCOVERY_SOCIAL_CHANNEL = 1611, /**< Scan social channel*/
+ WFD_DISCOVERY_CHANNEL1 = 1, /**< Scan channel 1*/
+ WFD_DISCOVERY_CHANNEL6 = 6, /**< Scan channel 6*/
+ WFD_DISCOVERY_CHANNEL11 = 11, /**< Scan channel 11*/
+} wfd_discovery_channel_e;
- WIFI_DIRECT_CLI_EVENT_MAX,
-} wfd_client_event_e;
/**
* Wi-Fi Direct configuration data structure for IPC
{
char device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN + 1];
int channel;
- wifi_direct_wps_type_e wps_config;
+ wfd_wps_type_e wps_config;
int max_clients;
- bool hide_SSID;
+ gboolean hide_SSID;
int group_owner_intent;
- bool want_persistent_group;
- bool listen_only;
- bool auto_connection;
- wifi_direct_primary_device_type_e primary_dev_type;
- wifi_direct_secondary_device_type_e secondary_dev_type;
+ gboolean want_persistent_group;
+ gboolean listen_only;
+ gboolean auto_connection;
+ wfd_primary_device_type_e primary_dev_type;
+ wfd_secondary_device_type_e secondary_dev_type;
} wfd_config_data_s;
unsigned char mac_address[6];
unsigned char intf_address[6];
int channel;
- bool is_connected;
- bool is_group_owner;
- bool is_persistent_go;
+ gboolean is_connected;
+ gboolean is_group_owner;
+ gboolean is_persistent_go;
unsigned int category;
unsigned int subcategory;
-
unsigned int services;
-
unsigned int wps_device_pwd_id;
unsigned int wps_cfg_methods;
-
- bool is_wfd_device;
-
+ gboolean is_wfd_device;
} wfd_discovery_entry_s;
unsigned char mac_address[6];
unsigned char intf_address[6];
int channel;
- bool is_p2p;
+ gboolean is_p2p;
unsigned short category;
unsigned short subcategory;
-
unsigned int services;
-
- bool is_wfd_device;
-
+ gboolean is_wfd_device;
} wfd_connected_peer_info_s;
+
typedef struct
{
int network_id;
unsigned char go_mac_address[6];
} wfd_persistent_group_info_s;
-typedef struct
-{
- int int1;
- int int2;
- int int3;
- unsigned char mac_addr[6];
-} wifi_direct_client_request_data_s;
-
-
-typedef struct
-{
- wifi_direct_cmd_e cmd;
- int client_id;
- unsigned int cmd_data_len;
- wifi_direct_client_request_data_s data;
-} wifi_direct_client_request_s;
-
-typedef struct
-{
- wifi_direct_cmd_e cmd;
- wifi_direct_error_e result;
- int client_id;
- int param1;
- char param2[64];
- char param3[32];
- int data_length;
-} wifi_direct_client_response_s;
-
-typedef struct
-{
- wfd_client_event_e event;
- wifi_direct_error_e error;
- int type;
- char param1[64];
- char param2[256];
-} wifi_direct_client_noti_s;
-
-
#endif /* __WIFI_DIRECT_IPC_H__ */
--- /dev/null
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file declares macros for logging.
+ *
+ * @file wifi-direct-log.h
+ * @author Nishant Chaprana (n.chaprana@samsung.com)
+ * @version 0.1
+ */
+
+#ifndef __WIFI_DIRECT_LOG_H__
+#define __WIFI_DIRECT_LOG_H__
+
+#ifdef USE_DLOG
+#include <dlog.h>
+
+#undef LOG_TAG
+#define LOG_TAG "WIFI_DIRECT_MANAGER"
+
+#define WDS_LOGV(format, args...) LOGV(format, ##args)
+#define WDS_LOGD(format, args...) LOGD(format, ##args)
+#define WDS_LOGI(format, args...) LOGI(format, ##args)
+#define WDS_LOGW(format, args...) LOGW(format, ##args)
+#define WDS_LOGE(format, args...) LOGE(format, ##args)
+#define WDS_LOGF(format, args...) LOGF(format, ##args)
+
+#define __WDS_LOG_FUNC_ENTER__ LOGD("Enter")
+#define __WDS_LOG_FUNC_EXIT__ LOGD("Quit")
+
+#define WDS_SECLOGI(format, args...) SECURE_LOG(LOG_INFO, LOG_TAG, format, ##args)
+#define WDS_SECLOGD(format, args...) SECURE_LOG(LOG_DEBUG, LOG_TAG, format, ##args)
+
+#else /* USE_DLOG */
+
+#define WDS_LOGV(format, args...)
+#define WDS_LOGD(format, args...)
+#define WDS_LOGI(format, args...)
+#define WDS_LOGW(format, args...)
+#define WDS_LOGE(format, args...)
+#define WDS_LOGF(format, args...)
+
+#define __WDS_LOG_FUNC_ENTER__
+#define __WDS_LOG_FUNC_EXIT__
+
+#define WDS_SECLOGI(format, args...)
+#define WDS_SECLOGD(format, args...)
+
+#endif /* USE_DLOG */
+#endif /* __WIFI_DIRECT_LOG_H__ */
#define PASSPHRASE_LEN_MAX 63
#define PASSPHRASE_LEN_MIN 8
-#if 0
-typedef enum {
- WFD_STATE_DEACTIVATED,
- WFD_STATE_ACTIVATED,
- WFD_STATE_IDLE, // passive scaning
- WFD_STATE_SCANNING, // active scanning
- WFD_STATE_CONNECTING,
- WFD_STATE_CONNECTED,
-} wfd_state_e;
-#endif
-
typedef enum {
WFD_WPS_MODE_NONE,
WFD_WPS_MODE_PBC = 0x1,
} wfd_ip_type_e;
#ifdef TIZEN_FEATURE_WIFI_DISPLAY
-
typedef enum {
WFD_DISPLAY_TYPE_SOURCE,
WFD_DISPLAY_TYPE_PRISINK,
typedef struct {
GMainLoop *main_loop;
- int serv_sock;
- unsigned int client_handle; // for accept clients
- GList *clients;
- unsigned int client_count;
-
wifi_direct_state_e state;
- unsigned int exit_timer;
wfd_device_s *local;
int go_intent;
int wfd_manager_set_display_device(int type, int port, int hdcp);
int wfd_manager_set_session_availability(int availability);
#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+int wfd_manager_start_discovery(wfd_manager_s *manager, int mode, int timeout, const char* type, int channel);
+int wfd_manager_cancel_discovery(wfd_manager_s *manager);
#endif /* __WIFI_DIRECT_MANAGER_H__ */
#ifndef __WIFI_DIRECT_STATE_H__
#define __WIFI_DIRECT_STATE_H__
-
int wfd_state_set(wfd_manager_s *manager, int state);
int wfd_state_get(wfd_manager_s *manager, int *state);
#define SOCK_FD_MIN 3
-#ifdef USE_DLOG
-#include <dlog.h>
-
-#undef LOG_TAG
-#define LOG_TAG "WIFI_DIRECT_MANAGER"
-
-#define WDS_LOGV(format, args...) LOGV(format, ##args)
-#define WDS_LOGD(format, args...) LOGD(format, ##args)
-#define WDS_LOGI(format, args...) LOGI(format, ##args)
-#define WDS_LOGW(format, args...) LOGW(format, ##args)
-#define WDS_LOGE(format, args...) LOGE(format, ##args)
-#define WDS_LOGF(format, args...) LOGF(format, ##args)
-
-#define __WDS_LOG_FUNC_ENTER__ LOGD("Enter")
-#define __WDS_LOG_FUNC_EXIT__ LOGD("Quit")
-
-#define WDS_SECLOGI(format, args...) SECURE_LOG(LOG_INFO, LOG_TAG, format, ##args)
-#define WDS_SECLOGD(format, args...) SECURE_LOG(LOG_DEBUG, LOG_TAG, format, ##args)
-
-#else /* USE_DLOG */
-
-#define WDS_LOGV(format, args...)
-#define WDS_LOGD(format, args...)
-#define WDS_LOGI(format, args...)
-#define WDS_LOGW(format, args...)
-#define WDS_LOGE(format, args...)
-#define WDS_LOGF(format, args...)
-
-#define __WDS_LOG_FUNC_ENTER__
-#define __WDS_LOG_FUNC_EXIT__
-
-#define WDS_SECLOGI(format, args...)
-#define WDS_SECLOGD(format, args...)
-
-#endif /* USE_DLOG */
-
#if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
int wfd_util_get_current_time(unsigned long *cur_time);
#endif
Name: wifi-direct-manager
Summary: Wi-Fi Direct manger
-Version: 1.2.139
+Version: 1.2.140
Release: 1
Group: Network & Connectivity/Wireless
License: Apache-2.0
Requires: toybox-symlinks-dhcp
%description
-Wi-Fi Direct manager
+Manager for handling wifi-direct functionalities
%package -n wifi-direct-plugin-wpasupplicant
Summary: Wifi direct plugin for wpa supplicant
Requires: %{name} = %{version}-%{release}
%description -n wifi-direct-plugin-wpasupplicant
-Wifi direct plugin for wpa supplicant
+Wi-Fi direct manager plugin to abstract wpa_supplicant
%prep
%setup -q
+chmod 644 %{SOURCE0}
%build
-
export CFLAGS="$CFLAGS -DTIZEN_DEBUG_ENABLE"
export CXXFLAGS="$CXXFLAGS -DTIZEN_DEBUG_ENABLE"
export FFLAGS="$FFLAGS -DTIZEN_DEBUG_ENABLE"
rm -rf %{buildroot}
%make_install
-#%__strip %{buildroot}%{_libdir}/wifi-direct-plugin-wpasupplicant.so
-#%__strip %{buildroot}%{_bindir}/wfd-manager
#License
mkdir -p %{buildroot}%{_datadir}/license
/opt/etc/p2p_supp.conf
/usr/etc/wifi-direct/ccode.conf
/opt/etc/persistent-peer
+%config %{_sysconfdir}/dbus-1/system.d/*.conf
%{_bindir}/dhcpd-notify.sh
%{_bindir}/wifi-direct-server.sh
%{_bindir}/wifi-direct-dhcp.sh
%attr(755,-,-) %{_bindir}/wifi-direct-server.sh
%attr(755,-,-) %{_bindir}/wifi-direct-dhcp.sh
%attr(755,-,-) /usr/etc/wifi-direct/udhcp_script.non-autoip
+%attr(644,-,-) %{_sysconfdir}/dbus-1/system.d/*.conf
%attr(755,-,-) %{_sbindir}/p2p_supp.sh
%attr(644,-,-) %{_datadir}/license/%{name}
+++ /dev/null
-/*
- * Network Configuration Module
- *
- * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-/**
- * This file implements wifi direct client functions.
- *
- * @file wifi-direct-client.c
- * @author Gibyoung Kim (lastkgb.kim@samsung.com)
- * @version 0.7
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-#include <sys/un.h>
-#include <poll.h>
-#include <unistd.h>
-#include <errno.h>
-
-#include <glib.h>
-#include <vconf.h>
-
-#include <wifi-direct.h>
-#include <cynara-client.h>
-#include <cynara-creds-socket.h>
-#include <cynara-session.h>
-
-
-#include "wifi-direct-ipc.h"
-#include "wifi-direct-manager.h"
-#include "wifi-direct-oem.h"
-#include "wifi-direct-session.h"
-#include "wifi-direct-group.h"
-#include "wifi-direct-client.h"
-#include "wifi-direct-util.h"
-#include "wifi-direct-state.h"
-#include "wifi-direct-peer.h"
-
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
-#include "wifi-direct-service.h"
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
-
-static cynara *wfd_cynara_handle = NULL;
-
-static int _wfd_deregister_client(void *data, int client_id);
-static gboolean wfd_client_process_request(GIOChannel *source,
- GIOCondition condition,
- gpointer user_data);
-
-static int _wfd_check_client_privilege(int client_sock, int cmd);
-
-char *wfd_server_print_cmd(wifi_direct_cmd_e cmd)
-{
- switch (cmd)
- {
- case WIFI_DIRECT_CMD_REGISTER:
- return "WIFI_DIRECT_CMD_REGISTER";
- case WIFI_DIRECT_CMD_INIT_ASYNC_SOCKET:
- return "WIFI_DIRECT_CMD_INIT_ASYNC_SOCKET";
- case WIFI_DIRECT_CMD_DEREGISTER:
- return "WIFI_DIRECT_CMD_DEREGISTER";
- case WIFI_DIRECT_CMD_ACTIVATE:
- return "WIFI_DIRECT_CMD_ACTIVATE";
- case WIFI_DIRECT_CMD_DEACTIVATE:
- return "WIFI_DIRECT_CMD_DEACTIVATE";
- case WIFI_DIRECT_CMD_START_DISCOVERY:
- return "WIFI_DIRECT_CMD_START_DISCOVERY";
- case WIFI_DIRECT_CMD_START_DISCOVERY_SPECIFIC_CHANNEL:
- return "WIFI_DIRECT_CMD_START_DISCOVERY_SPECIFIC_CHANNEL";
- case WIFI_DIRECT_CMD_CANCEL_DISCOVERY:
- return "WIFI_DIRECT_CMD_CANCEL_DISCOVERY";
- case WIFI_DIRECT_CMD_GET_DISCOVERY_RESULT:
- return "WIFI_DIRECT_CMD_GET_DISCOVERY_RESULT";
- case WIFI_DIRECT_CMD_GET_LINK_STATUS:
- return "WIFI_DIRECT_CMD_GET_LINK_STATUS";
- case WIFI_DIRECT_CMD_CONNECT:
- return "WIFI_DIRECT_CMD_CONNECT";
- case WIFI_DIRECT_CMD_CANCEL_CONNECTION:
- return "WIFI_DIRECT_CMD_CANCEL_CONNECTION";
- case WIFI_DIRECT_CMD_REJECT_CONNECTION:
- return "WIFI_DIRECT_CMD_REJECT_CONNECTION";
-
- case WIFI_DIRECT_CMD_DISCONNECT_ALL:
- return "WIFI_DIRECT_CMD_DISCONNECT_ALL";
- case WIFI_DIRECT_CMD_CREATE_GROUP:
- return "WIFI_DIRECT_CMD_CREATE_GROUP";
- case WIFI_DIRECT_CMD_IS_GROUPOWNER:
- return "WIFI_DIRECT_CMD_IS_GROUPOWNER";
- case WIFI_DIRECT_CMD_GET_SSID:
- return "WIFI_DIRECT_CMD_GET_SSID";
- case WIFI_DIRECT_CMD_SET_SSID:
- return "WIFI_DIRECT_CMD_SET_SSID";
- case WIFI_DIRECT_CMD_GET_IP_ADDR:
- return "WIFI_DIRECT_CMD_GET_IP_ADDR";
- case WIFI_DIRECT_CMD_GET_CONFIG:
- return "WIFI_DIRECT_CMD_GET_CONFIG";
- case WIFI_DIRECT_CMD_SET_CONFIG:
- return "WIFI_DIRECT_CMD_SET_CONFIG";
- case WIFI_DIRECT_CMD_SEND_CONNECT_REQ:
- return "WIFI_DIRECT_CMD_SEND_CONNECT_REQ";
-
- case WIFI_DIRECT_CMD_ACTIVATE_PUSHBUTTON:
- return "WIFI_DIRECT_CMD_ACTIVATE_PUSHBUTTON";
- case WIFI_DIRECT_CMD_SET_WPS_PIN:
- return "WIFI_DIRECT_CMD_SET_WPS_PIN";
- case WIFI_DIRECT_CMD_GET_WPS_PIN:
- return "WIFI_DIRECT_CMD_GET_WPS_PIN";
- case WIFI_DIRECT_CMD_GENERATE_WPS_PIN:
- return "WIFI_DIRECT_CMD_GENERATE_WPS_PIN";
- case WIFI_DIRECT_CMD_SET_WPA:
- return "WIFI_DIRECT_CMD_SET_WPA";
- case WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE:
- return "WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE";
- case WIFI_DIRECT_CMD_GET_LOCAL_WPS_MODE:
- return "WIFI_DIRECT_CMD_GET_LOCAL_WPS_MODE";
- case WIFI_DIRECT_CMD_GET_REQ_WPS_MODE:
- return "WIFI_DIRECT_CMD_GET_REQ_WPS_MODE";
- case WIFI_DIRECT_CMD_SET_REQ_WPS_MODE:
- return "WIFI_DIRECT_CMD_SET_REQ_WPS_MODE";
- case WIFI_DIRECT_CMD_GET_CONNECTED_PEERS_INFO:
- return "WIFI_DIRECT_CMD_GET_CONNECTED_PEERS_INFO";
- case WIFI_DIRECT_CMD_DESTROY_GROUP:
- return "WIFI_DIRECT_CMD_DESTROY_GROUP";
-
- case WIFI_DIRECT_CMD_DISCONNECT:
- return "WIFI_DIRECT_CMD_DISCONNECT";
- case WIFI_DIRECT_CMD_SET_GO_INTENT:
- return "WIFI_DIRECT_CMD_SET_GO_INTENT";
- case WIFI_DIRECT_CMD_GET_GO_INTENT:
- return "WIFI_DIRECT_CMD_GET_GO_INTENT";
- case WIFI_DIRECT_CMD_GET_MAC_ADDR:
- return "WIFI_DIRECT_CMD_GET_MAC_ADDR";
- case WIFI_DIRECT_CMD_IS_AUTONOMOUS_GROUP:
- return "WIFI_DIRECT_CMD_IS_AUTONOMOUS_GROUP";
- case WIFI_DIRECT_CMD_SET_MAX_CLIENT:
- return "WIFI_DIRECT_CMD_SET_MAX_CLIENT";
- case WIFI_DIRECT_CMD_GET_MAX_CLIENT:
- return "WIFI_DIRECT_CMD_GET_MAX_CLIENT";
- case WIFI_DIRECT_CMD_SET_AUTOCONNECTION_MODE:
- return "WIFI_DIRECT_CMD_SET_AUTOCONNECTION_MODE";
-
- case WIFI_DIRECT_CMD_IS_AUTOCONNECTION_MODE:
- return "WIFI_DIRECT_CMD_IS_AUTOCONNECTION_MODE";
- case WIFI_DIRECT_CMD_IS_DISCOVERABLE:
- return "WIFI_DIRECT_CMD_IS_DISCOVERABLE";
- case WIFI_DIRECT_CMD_IS_LISTENING_ONLY:
- return "WIFI_DIRECT_CMD_IS_LISTENING_ONLY";
- case WIFI_DIRECT_CMD_GET_OPERATING_CHANNEL:
- return "WIFI_DIRECT_CMD_GET_OPERATING_CHANNEL";
- case WIFI_DIRECT_CMD_ACTIVATE_PERSISTENT_GROUP:
- return "WIFI_DIRECT_CMD_ACTIVATE_PERSISTENT_GROUP";
- case WIFI_DIRECT_CMD_DEACTIVATE_PERSISTENT_GROUP:
- return "WIFI_DIRECT_CMD_DEACTIVATE_PERSISTENT_GROUP";
- case WIFI_DIRECT_CMD_IS_PERSISTENT_GROUP_ACTIVATED:
- return "WIFI_DIRECT_CMD_IS_PERSISTENT_GROUP_ACTIVATED";
- case WIFI_DIRECT_CMD_GET_PERSISTENT_GROUP_INFO:
- return "WIFI_DIRECT_CMD_GET_PERSISTENT_GROUP_INFO";
- case WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP:
- return "WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP";
- case WIFI_DIRECT_CMD_GET_DEVICE_NAME:
- return "WIFI_DIRECT_CMD_GET_DEVICE_NAME";
-
- case WIFI_DIRECT_CMD_SET_DEVICE_NAME:
- return "WIFI_DIRECT_CMD_SET_DEVICE_NAME";
- case WIFI_DIRECT_CMD_SET_OEM_LOGLEVEL:
- return "WIFI_DIRECT_CMD_SET_OEM_LOGLEVEL";
- case WIFI_DIRECT_CMD_GET_PEER_INFO:
- return "WIFI_DIRECT_CMD_GET_PEER_INFO";
-
- case WIFI_DIRECT_CMD_SET_PASSPHRASE:
- return "WIFI_DIRECT_CMD_SET_PASSPHRASE";
- case WIFI_DIRECT_CMD_GET_PASSPHRASE:
- return "WIFI_DIRECT_CMD_GET_PASSPHRASE";
- case WIFI_DIRECT_CMD_SET_AUTOCONNECTION_PEER:
- return "WIFI_DIRECT_CMD_SET_AUTOCONNECTION_PEER";
-
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
- case WIFI_DIRECT_CMD_REGISTER_LOCAL_SERVICE:
- return "WIFI_DIRECT_CMD_REGISTER_LOCAL_SERVICE";
- case WIFI_DIRECT_CMD_DEREGISTER_LOCAL_SERVICE:
- return "WIFI_DIRECT_CMD_DEREGISTER_LOCAL_SERVICE";
- case WIFI_DIRECT_CMD_START_SERVICE_DISCOVERY:
- return "WIFI_DIRECT_CMD_START_SERVICE_DISCOVERY";
- case WIFI_DIRECT_CMD_CANCEL_SERVICE_DISCOVERY:
- return "WIFI_DIRECT_CMD_CANCEL_SERVICE_DISCOVERY";
- case WIFI_DIRECT_CMD_REGISTER_SERVICE:
- return "WIFI_DIRECT_CMD_REGISTER_SERVICE";
- case WIFI_DIRECT_CMD_DEREGISTER_SERVICE:
- return "WIFI_DIRECT_CMD_DEREGISTER_SERVICE";
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
-
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
- case WIFI_DIRECT_CMD_INIT_MIRACAST:
- return "WIFI_DIRECT_CMD_INIT_MIRACAST";
- case WIFI_DIRECT_CMD_INIT_DISPLAY:
- return "WIFI_DIRECT_CMD_INIT_DISPLAY";
- case WIFI_DIRECT_CMD_DEINIT_DISPLAY:
- return "WIFI_DIRECT_CMD_DEINIT_DISPLAY";
- case WIFI_DIRECT_CMD_SET_DISPLAY:
- return "WIFI_DIRECT_CMD_SET_DISPLAY";
- case WIFI_DIRECT_CMD_SET_DISPLAY_AVAILABILITY:
- return "WIFI_DIRECT_CMD_SET_DISPLAY_AVAILABILITY";
- case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_TYPE:
- return "WIFI_DIRECT_CMD_GET_PEER_DISPLAY_TYPE";
- case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_AVAILABILITY:
- return "WIFI_DIRECT_CMD_GET_PEER_DISPLAY_AVAILABILITY";
- case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_HDCP:
- return "WIFI_DIRECT_CMD_GET_PEER_DISPLAY_HDCP";
- case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_PORT:
- return "WIFI_DIRECT_CMD_GET_PEER_DISPLAY_PORT";
- case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_THROUGHPUT:
- return "WIFI_DIRECT_CMD_GET_PEER_DISPLAY_THROUGHPUT";
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
-
- default:
- return "WIFI_DIRECT_CMD_INVALID";
-
- }
-}
-
-static wfd_client_s *_wfd_client_find_by_id(GList *clients, int client_id)
-{
- __WDS_LOG_FUNC_ENTER__;
- wfd_client_s *client = NULL;
- GList *temp = NULL;
-
- if (!clients || client_id < 0) {
- WDS_LOGE("Invalid parameter(client_id:%d)", client_id);
- __WDS_LOG_FUNC_EXIT__;
- return NULL;
- }
-
- temp = g_list_first(clients);
- while (temp) {
- client = (wfd_client_s*) temp->data;
- if (client->client_id == client_id) {
- WDS_LOGD("Client found. [%d]", client_id);
- break;
- }
- temp = g_list_next(temp);
- client = NULL;
- }
-
- __WDS_LOG_FUNC_EXIT__;
- return client;
-}
-
-static int _wfd_client_check_socket(int sock)
-{
- __WDS_LOG_FUNC_ENTER__;
- struct pollfd p_fd;
- int res = 0;
-
- p_fd.fd = sock;
- p_fd.events = POLLIN | POLLOUT | POLLERR | POLLHUP | POLLNVAL;
- res = poll((struct pollfd *) &p_fd, 1, 1);
-
- if (res < 0) {
- WDS_LOGE("Polling error from socket[%d]. [%s]", sock, strerror(errno));
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- } else if (res == 0) {
- WDS_LOGD( "poll timeout. socket is busy\n");
- __WDS_LOG_FUNC_EXIT__;
- return 1;
- } else {
-
- if (p_fd.revents & POLLERR) {
- WDS_LOGE("Error! POLLERR from socket[%d]", sock);
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- } else if (p_fd.revents & POLLHUP) {
- WDS_LOGE("Error! POLLHUP from socket[%d]", sock);
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- } else if (p_fd.revents & POLLNVAL) {
- WDS_LOGE("Error! POLLNVAL from socket[%d]", sock);
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- } else if (p_fd.revents & POLLIN) {
- WDS_LOGD("POLLIN from socket [%d]", sock);
- __WDS_LOG_FUNC_EXIT__;
- return 0;
- } else if (p_fd.revents & POLLOUT) {
- WDS_LOGD("POLLOUT from socket [%d]", sock);
- __WDS_LOG_FUNC_EXIT__;
- return 0;
- }
- }
-
- WDS_LOGD("Unknown poll event [%d]", p_fd.revents);
- __WDS_LOG_FUNC_EXIT__;
- return -1;
-}
-
-static int _wfd_send_to_client(int sock, char *data, int data_len)
-{
- __WDS_LOG_FUNC_ENTER__;
- int wbytes = 0;
- int left_len = data_len;
- char *ptr = data;
- int res = 0;
-
- if (sock < SOCK_FD_MIN || !data || data_len < 0) {
- WDS_LOGE("Invalid parameter");
- return -1;
- }
-
- res = _wfd_client_check_socket(sock);
- if (res < 0) {
- WDS_LOGE("Socket error");
- return -1;
- } else if (res > 0) {
- WDS_LOGE("Socket is busy");
- return -2;
- }
-
- errno = 0;
- while (left_len) {
- wbytes = write(sock, ptr, left_len);
- if (wbytes <= 0) {
- WDS_LOGE("Failed to write data into socket[%d]. [error=%s]", sock, strerror(errno));
- break;
- }else if (wbytes < left_len) {
- WDS_LOGD("%d bytes left. Continue sending...", left_len - wbytes);
- left_len -= wbytes;
- ptr += wbytes;
- } else if (wbytes == left_len) {
- WDS_LOGD("Succeeded to write data[%d bytes] into socket [%d]", wbytes, sock);
- left_len = 0;
- } else {
- WDS_LOGE("Unknown error occurred. [%s]", strerror(errno));
- break;
- }
- }
-
- __WDS_LOG_FUNC_EXIT__;
- if (left_len)
- return -1;
- else
- return 0;
-}
-
-static int _wfd_read_from_client(int sock, char *data, int data_len)
-{
- __WDS_LOG_FUNC_ENTER__;
- int rbytes = 0;
- int total_rbytes = 0;
- int res = 0;
-
- if(sock < SOCK_FD_MIN || !data || data_len <= 0) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- }
-
- res = _wfd_client_check_socket(sock);
- if (res < 0) {
- WDS_LOGE("Socket error");
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- } else if (res > 0) {
- WDS_LOGE("Socket is busy");
- __WDS_LOG_FUNC_EXIT__;
- return -2;
- }
-
- while(data_len) {
- errno = 0;
- rbytes = read(sock, data, data_len);
- if (rbytes <= 0) {
- WDS_LOGE("Failed to read data from socket[%d]", sock);
- return -1;
- }
- total_rbytes += rbytes;
- data += rbytes;
- data_len -= rbytes;
- }
-
- __WDS_LOG_FUNC_EXIT__;
- return total_rbytes;
-}
-
-int wfd_client_send_event(wfd_manager_s *manager, wifi_direct_client_noti_s *noti)
-{
- __WDS_LOG_FUNC_ENTER__;
- int cnt = 0;
- int res = 0;
- wfd_client_s *client = NULL;
- GList *temp = NULL;
-
- if (!manager || !noti) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- }
-
- temp = g_list_first(manager->clients);
- while (temp) {
- client = temp->data;
- res = _wfd_send_to_client(client->asock, (char*) noti, sizeof(wifi_direct_client_noti_s));
- if (res < 0) {
- WDS_LOGE("Failed to send Notification[%d] to client [%d]", noti->event, client->client_id);
- temp = g_list_next(temp);
- _wfd_deregister_client(manager, client->client_id);
- } else {
- WDS_LOGD("Succeeded to send Notification [%d:%d] to client [%d]", noti->event,
- noti->error, client->client_id);
- temp = g_list_next(temp);
- cnt++;
- }
- client = NULL;
- }
- WDS_LOGD("Notification[%d:%d] sent to %d clients, Not Sent [%d]",
- noti->event, noti->error, cnt, manager->client_count - cnt);
-
-
- __WDS_LOG_FUNC_EXIT__;
- return 0;
-}
-
-static int _wfd_register_client(void *data, int sock)
-{
- __WDS_LOG_FUNC_ENTER__;
- int rbytes = 0;
- wifi_direct_client_request_s req;
- wifi_direct_client_response_s rsp;
- wfd_manager_s *manager = (wfd_manager_s*) data;
- wfd_client_s *client = NULL;
- int res = 0;
-
- if (sock < SOCK_FD_MIN) {
- WDS_LOGE("Invalid argument");
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- }
-
- errno = 0;
- rbytes = read(sock, (char*) &req, sizeof(wifi_direct_client_request_s));
- if (rbytes <= 0) {
- WDS_LOGE("Failed to read socket data from client. [%s]", strerror(errno));
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- }
-
- if (req.cmd == WIFI_DIRECT_CMD_REGISTER) {
- // TODO: check validity of command
- client = _wfd_client_find_by_id(manager->clients, req.client_id);
- if (client) {
- WDS_LOGE("Client already exist. client_id [%d]", sock);
- res = WIFI_DIRECT_ERROR_NOT_PERMITTED; // WIFI_DIRECT_ERROR_ALREADY_EXIST
- goto send_response;
- }
-
- if (_wfd_check_client_privilege(sock, req.cmd) != WIFI_DIRECT_ERROR_NONE) {
- rsp.result = WIFI_DIRECT_ERROR_AUTH_FAILED;
- goto done;
- }
-
- client = (wfd_client_s*) g_try_malloc0(sizeof(wfd_client_s));
- if (!client) {
- WDS_LOGE("Failed to allocate memory");
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- }
- client->client_id = sock;
- client->ssock = sock;
- client->asock = WFD_CLIENT_PENDING_SOCKET;
-
- GIOChannel *gio = NULL;
- gio = g_io_channel_unix_new(sock);
- client->gsource_id = g_io_add_watch(gio, G_IO_IN | G_IO_ERR | G_IO_HUP,
- (GIOFunc) wfd_client_process_request, NULL);
- g_io_channel_unref(gio);
-
- manager->clients = g_list_prepend(manager->clients, (gpointer) client);
- manager->client_count++;
- WDS_LOGD("Client [%d] is added. %d client alive", client->client_id, manager->client_count);
-
- res = WIFI_DIRECT_ERROR_NONE;
- WDS_LOGD("New client[%d] added. Total count [%d]", client->client_id, manager->client_count);
- } else if (req.cmd == WIFI_DIRECT_CMD_INIT_ASYNC_SOCKET) {
- client = _wfd_client_find_by_id(manager->clients, req.client_id);
- if (!client) {
- WDS_LOGE("Client not found. client_id[%d]", req.client_id);
- res = WIFI_DIRECT_ERROR_NOT_PERMITTED; // WIFI_DIRECT_ERROR_UNKNOWN_CLIENT
- goto done;
- }
-
- if (_wfd_check_client_privilege(sock, req.cmd) != WIFI_DIRECT_ERROR_NONE) {
- res = WIFI_DIRECT_ERROR_AUTH_FAILED;
- goto done;
- }
-
- client->asock = sock;
- WDS_LOGD("Async socket[%d] for New client[%d] added.", sock, client->client_id);
- goto done;
- } else {
- WDS_LOGE("Unknown command from client. [%d]", req.cmd);
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- }
-
-send_response:
- rsp.cmd = req.cmd;
- rsp.client_id = client->client_id;
- rsp.result = res;
- res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(wifi_direct_client_response_s));
- if (res < 0) {
- WDS_LOGE("Failed to send response to client");
- _wfd_deregister_client(manager, req.client_id);
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- }
-done:
- __WDS_LOG_FUNC_EXIT__;
- return 0;
-}
-
-static int _wfd_deregister_client(void *data, int client_id)
-{
- __WDS_LOG_FUNC_ENTER__;
- wfd_client_s *client = NULL;
- wfd_manager_s *manager = (wfd_manager_s*) data;
-
- client = _wfd_client_find_by_id(manager->clients, client_id);
- if (!client) {
- WDS_LOGE("Failed to find client[%d]", client_id);
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- }
-
- if (client->asock == WFD_CLIENT_PENDING_SOCKET) {
- WDS_LOGE("This client[%d] is initializing(pending)...", client->client_id);
- __WDS_LOG_FUNC_EXIT__;
- return 1;
- }
-
- manager->clients = g_list_remove(manager->clients, client);
- manager->client_count--;
- WDS_LOGD("Client [%d] is removed. %d client left", client->client_id, manager->client_count);
-
- if (client->asock >= SOCK_FD_MIN)
- close(client->asock);
- client->asock = -1;
- if (client->ssock >= SOCK_FD_MIN)
- close(client->ssock);
- client->ssock = -1;
- g_source_remove(client->gsource_id);
- client->gsource_id = 0;
-
- g_free(client);
-
- __WDS_LOG_FUNC_EXIT__;
- return 0;
-}
-
-static int _wfd_create_server_socket(wfd_manager_s *manager)
-{
- __WDS_LOG_FUNC_ENTER__;
- int sock;
- struct sockaddr_un saddr;
- int sock_opt = 1;
- int res = 0;
-
- if (!manager) {
- WDS_LOGE("Invalid parameter(NULL)");
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- }
-
- /* Server socket initialization */
- unlink(WFD_SERVER_SOCK_PATH);
-
- errno = 0;
- sock = socket(AF_UNIX, SOCK_STREAM, 0);
- if (sock < SOCK_FD_MIN) {
- WDS_LOGE("Failed to create server socket. [%s]", strerror(errno));
- if (sock >= 0)
- close(sock);
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- }
-
- errno = 0;
- res = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &sock_opt, sizeof(sock_opt));
- if (res == -1) {
- WDS_LOGE("Failed to set socket option. [%s]", strerror(errno));
- close(sock);
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- }
-
- memset(&saddr, 0x00, sizeof(saddr));
- saddr.sun_family = AF_UNIX;
- snprintf(saddr.sun_path, sizeof(saddr.sun_path), WFD_SERVER_SOCK_PATH);
-
- errno = 0;
- res = bind(sock, (struct sockaddr*) &saddr, sizeof(saddr));
- if (res == -1) {
- WDS_LOGE("Failed to bind server socket. [%s]", strerror(errno));
- close(sock);
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- }
-
- errno = 0;
- res = chmod(WFD_SERVER_SOCK_PATH, WFD_SERVER_SOCK_MODE);
- if (res == -1) {
- WDS_LOGE("Failed to change mode of server socket file. [%s]", strerror(errno));
- close(sock);
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- }
-
- errno = 0;
- res = listen(sock, WFD_MAX_CLIENT);
- if (res == -1) {
- WDS_LOGE("Failed to listen server socket. [%s]", strerror(errno));
- close(sock);
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- }
-
- manager->serv_sock = sock;
- WDS_LOGD("Succeeded to create server socket. [%d]", sock);
-
- __WDS_LOG_FUNC_EXIT__;
- return 0;
-}
-
-static gboolean _wfd_accept_client(GIOChannel *source,
- GIOCondition condition,
- gpointer user_data)
-{
- __WDS_LOG_FUNC_ENTER__;
- wfd_manager_s *manager = wfd_get_manager();
- int cli_sock = -1;
- socklen_t cli_len = 0;
- int res = 0;
-
- if (!manager || manager->serv_sock < 0) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
- return FALSE;
- }
-
- errno = 0;
- cli_sock = accept(manager->serv_sock, NULL, &cli_len);
- if (cli_sock == -1) {
- WDS_LOGE("Failed to accept client. [%s]", strerror(errno));
- __WDS_LOG_FUNC_EXIT__;
- return FALSE;
- }
-
- res = _wfd_register_client(manager, cli_sock);
- if (res < 0) {
- WDS_LOGE("Failed to register client.");
- close(cli_sock);
- __WDS_LOG_FUNC_EXIT__;
- return TRUE;
- }
-
- __WDS_LOG_FUNC_EXIT__;
- return TRUE;
-}
-
-int wfd_client_handler_init(wfd_manager_s *manager)
-{
- __WDS_LOG_FUNC_ENTER__;
- GList *clients = manager->clients;
- int res = 0;
-
- if (clients) {
- g_list_free(clients);
- clients = NULL;
- }
-
- res = cynara_initialize(&wfd_cynara_handle, NULL);
- if (res == CYNARA_API_SUCCESS) {
- WDS_LOGD("cynara handle is successfully initialized.");
- } else {
- WDS_LOGE("Failed to initialize cynara handle");
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- }
-
- res = _wfd_create_server_socket(manager);
- if (res < 0) {
- WDS_LOGE("Failed to create server socket");
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- }
-
- GIOChannel *gio = g_io_channel_unix_new(manager->serv_sock);
- manager->client_handle = g_io_add_watch(gio, G_IO_IN,
- (GIOFunc) _wfd_accept_client, NULL);
- g_io_channel_unref(gio);
-
- __WDS_LOG_FUNC_EXIT__;
- return 0;
-}
-
-int wfd_client_handler_deinit(wfd_manager_s *manager)
-{
- __WDS_LOG_FUNC_ENTER__;
- GList *temp = NULL;
- wfd_client_s *client = NULL;
-
- if (manager->serv_sock >= SOCK_FD_MIN)
- close(manager->serv_sock);
- manager->serv_sock = -1;
- g_source_remove(manager->client_handle);
- manager->client_handle = 0;
-
- temp = g_list_first(manager->clients);
- while(temp) {
- client = temp->data;
- if(client != NULL) {
- if (client->ssock >= SOCK_FD_MIN)
- close(client->ssock);
- client->ssock = -1;
- if (client->asock >= SOCK_FD_MIN)
- close(client->asock);
- client->asock = -1;
- g_source_remove(client->gsource_id);
- client->gsource_id = 0;
- g_free(client);
- }
- temp = g_list_next(temp);
- }
-
- if (manager->clients) {
- g_list_free(manager->clients);
- manager->clients = NULL;
- }
-
- manager->client_count = 0;
- manager->clients = NULL;
-
- cynara_finish(wfd_cynara_handle);
- wfd_cynara_handle = NULL;
-
- __WDS_LOG_FUNC_EXIT__;
- return 0;
-}
-
-static int __wfd_cynara_check(int client_sock, const char *privilege)
-{
- __WDS_LOG_FUNC_ENTER__;
-
- char *client_session = NULL;
- char *clientSmack = NULL;
- char *uid = NULL;
- int ret = CYNARA_API_SUCCESS;
- pid_t pid;
-
- ret = cynara_creds_socket_get_pid(client_sock, &pid);
- if (ret == CYNARA_API_SUCCESS) {
- WDS_LOGD("PID is [%d].", pid);
- } else {
- WDS_LOGE("Failed to get pid");
- __WDS_LOG_FUNC_EXIT__;
- return ret;
- }
-
- ret = cynara_creds_socket_get_client(client_sock, CLIENT_METHOD_SMACK, &clientSmack);
- if (ret == CYNARA_API_SUCCESS) {
- WDS_LOGD("cynara cred is [%s].", clientSmack);
- } else {
- WDS_LOGE("Failed to initialize cynara cred");
- __WDS_LOG_FUNC_EXIT__;
- return ret;
- }
-
- ret = cynara_creds_socket_get_user(client_sock, USER_METHOD_UID, &uid);
- if (ret == CYNARA_API_SUCCESS) {
- WDS_LOGD("cynara UID is [%s].", uid);
- } else {
- WDS_LOGE("Failed to initialize cynara UID");
- free(clientSmack);
- __WDS_LOG_FUNC_EXIT__;
- return ret;
- }
-
- client_session = cynara_session_from_pid(pid);
- if(client_session != NULL) {
- WDS_LOGD("cynara session is [%s].", client_session);
- ret = cynara_check(wfd_cynara_handle, clientSmack, client_session, uid, privilege);
- } else {
- ret = cynara_check(wfd_cynara_handle, clientSmack, "", uid, privilege);
- }
-
- g_free(uid);
- g_free(clientSmack);
- g_free(client_session);
- __WDS_LOG_FUNC_EXIT__;
- return ret;
-}
-
-static int _wfd_check_client_privilege(int client_sock, int cmd)
-{
- __WDS_LOG_FUNC_ENTER__;
- int ret = 0;
-
- switch (cmd) {
- case WIFI_DIRECT_CMD_ACTIVATE:
- case WIFI_DIRECT_CMD_DEACTIVATE:
- case WIFI_DIRECT_CMD_CONNECT:
- case WIFI_DIRECT_CMD_CANCEL_CONNECT:
- case WIFI_DIRECT_CMD_CANCEL_CONNECTION:
- case WIFI_DIRECT_CMD_SEND_CONNECT_REQ:
- case WIFI_DIRECT_CMD_REJECT_CONNECTION:
- case WIFI_DIRECT_CMD_DISCONNECT:
- case WIFI_DIRECT_CMD_DISCONNECT_ALL:
- case WIFI_DIRECT_CMD_ACTIVATE_PUSHBUTTON:
- case WIFI_DIRECT_CMD_CREATE_GROUP:
- case WIFI_DIRECT_CMD_DESTROY_GROUP:
- case WIFI_DIRECT_CMD_ACTIVATE_PERSISTENT_GROUP:
- case WIFI_DIRECT_CMD_DEACTIVATE_PERSISTENT_GROUP:
- case WIFI_DIRECT_CMD_IS_PERSISTENT_GROUP_ACTIVATED:
- case WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP:
- case WIFI_DIRECT_CMD_SET_GO_INTENT:
- case WIFI_DIRECT_CMD_GENERATE_WPS_PIN:
- case WIFI_DIRECT_CMD_SET_WPS_PIN:
- case WIFI_DIRECT_CMD_SET_DEVICE_NAME:
- case WIFI_DIRECT_CMD_SET_SSID:
- case WIFI_DIRECT_CMD_SET_MAX_CLIENT:
- case WIFI_DIRECT_CMD_SET_PASSPHRASE:
- case WIFI_DIRECT_CMD_SET_AUTOCONNECTION_PEER:
-
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
- case WIFI_DIRECT_CMD_INIT_MIRACAST:
-
- case WIFI_DIRECT_CMD_INIT_DISPLAY:
- case WIFI_DIRECT_CMD_DEINIT_DISPLAY:
- case WIFI_DIRECT_CMD_SET_DISPLAY:
- case WIFI_DIRECT_CMD_SET_DISPLAY_AVAILABILITY:
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
-
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
- case WIFI_DIRECT_CMD_REGISTER_LOCAL_SERVICE:
- case WIFI_DIRECT_CMD_DEREGISTER_LOCAL_SERVICE:
- case WIFI_DIRECT_CMD_REGISTER_SERVICE:
- case WIFI_DIRECT_CMD_DEREGISTER_SERVICE:
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
-
- case WIFI_DIRECT_CMD_START_DISCOVERY:
- case WIFI_DIRECT_CMD_START_DISCOVERY_SPECIFIC_CHANNEL:
- case WIFI_DIRECT_CMD_CANCEL_DISCOVERY:
-
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
- case WIFI_DIRECT_CMD_START_SERVICE_DISCOVERY:
- case WIFI_DIRECT_CMD_CANCEL_SERVICE_DISCOVERY:
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
-
- case WIFI_DIRECT_CMD_REGISTER:
- case WIFI_DIRECT_CMD_DEREGISTER:
- case WIFI_DIRECT_CMD_INIT_ASYNC_SOCKET:
- case WIFI_DIRECT_CMD_GET_LINK_STATUS:
- case WIFI_DIRECT_CMD_GET_DEVICE_NAME:
- case WIFI_DIRECT_CMD_GET_SSID:
- case WIFI_DIRECT_CMD_GET_OPERATING_CHANNEL:
- case WIFI_DIRECT_CMD_GET_GO_INTENT:
- case WIFI_DIRECT_CMD_GET_MAX_CLIENT:
- case WIFI_DIRECT_CMD_GET_IP_ADDR:
- case WIFI_DIRECT_CMD_GET_MAC_ADDR:
- case WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE:
- case WIFI_DIRECT_CMD_GET_REQ_WPS_MODE:
- case WIFI_DIRECT_CMD_GET_LOCAL_WPS_MODE:
- case WIFI_DIRECT_CMD_GET_WPS_PIN:
- case WIFI_DIRECT_CMD_GET_DISCOVERY_RESULT:
- case WIFI_DIRECT_CMD_GET_CONNECTED_PEERS_INFO:
- case WIFI_DIRECT_CMD_GET_PERSISTENT_GROUP_INFO:
- case WIFI_DIRECT_CMD_IS_DISCOVERABLE:
- case WIFI_DIRECT_CMD_IS_LISTENING_ONLY:
- case WIFI_DIRECT_CMD_IS_GROUPOWNER:
- case WIFI_DIRECT_CMD_IS_AUTONOMOUS_GROUP:
- case WIFI_DIRECT_CMD_IS_AUTOCONNECTION_MODE:
- case WIFI_DIRECT_CMD_GET_PEER_INFO:
- case WIFI_DIRECT_CMD_GET_PASSPHRASE:
-
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
- case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_TYPE:
- case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_AVAILABILITY:
- case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_HDCP:
- case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_PORT:
- case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_THROUGHPUT:
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
-
- case WIFI_DIRECT_CMD_SET_REQ_WPS_MODE:
- case WIFI_DIRECT_CMD_SET_AUTOCONNECTION_MODE:
- ret = __wfd_cynara_check(client_sock, WFD_PRIVILEGE);
- break;
- default:
- WDS_LOGE("Unknown command[%d]", cmd);
- __WDS_LOG_FUNC_EXIT__;
- return WIFI_DIRECT_ERROR_AUTH_FAILED;
- }
-
- if(ret == CYNARA_API_ACCESS_ALLOWED) {
- WDS_LOGD("Cynara: API Access Validation Success");
- __WDS_LOG_FUNC_EXIT__;
- return WIFI_DIRECT_ERROR_NONE;
- } else if(ret == CYNARA_API_ACCESS_DENIED) {
- WDS_LOGE("Access denied to client id [%d]", client_sock);
- __WDS_LOG_FUNC_EXIT__;
- return WIFI_DIRECT_ERROR_PERMISSION_DENIED;
- } else {
- WDS_LOGE("Cynara, exception[%d]", ret);
- __WDS_LOG_FUNC_EXIT__;
- return WIFI_DIRECT_ERROR_AUTH_FAILED;
- }
-}
-
-static gboolean wfd_client_process_request(GIOChannel *source,
- GIOCondition condition,
- gpointer user_data)
-{
- __WDS_LOG_FUNC_ENTER__;
- int sock = g_io_channel_unix_get_fd(source);
- wifi_direct_client_request_s req;
- wifi_direct_client_response_s rsp;
- wifi_direct_client_noti_s noti;
- char *extra_rsp = NULL;
- wfd_manager_s *manager = wfd_get_manager();
- int res = 0;
-
- if (sock < SOCK_FD_MIN) {
- WDS_LOGE("Invalid argument");
- __WDS_LOG_FUNC_EXIT__;
- return FALSE;
- }
-
- memset(&req, 0x0, sizeof(wifi_direct_client_request_s));
- memset(&rsp, 0x0, sizeof(wifi_direct_client_response_s));
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
-
- res = _wfd_read_from_client(sock, (char*) &req, sizeof(req));
- if (res < 0) {
- WDS_LOGE("Client socket Hanged up");
- _wfd_deregister_client(manager, req.client_id);
- __WDS_LOG_FUNC_EXIT__;
- return FALSE;
- } else if (res == 0) {
- WDS_LOGE("Client socket busy");
- __WDS_LOG_FUNC_EXIT__;
- return TRUE;
- }
- WDS_LOGI("Client request [%d:%s], %d bytes read from socket[%d]", req.cmd, wfd_server_print_cmd(req.cmd), res, sock);
-
- rsp.cmd = req.cmd;
- rsp.client_id = req.client_id;
- rsp.result = WIFI_DIRECT_ERROR_NONE;
- noti.event = WIFI_DIRECT_CLI_EVENT_INVALID;
-
- if (_wfd_check_client_privilege(sock, req.cmd) != WIFI_DIRECT_ERROR_NONE) {
- rsp.result = WIFI_DIRECT_ERROR_AUTH_FAILED;
- goto send_response;
- }
-
- switch (req.cmd) {
- case WIFI_DIRECT_CMD_DEREGISTER: // manager
- _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
-
- res = _wfd_deregister_client(manager, req.client_id);
- if (res < 0) {
- WDS_LOGE("Failed to deregister client[%d]", sock);
- }
-
- goto done;
- break;
- case WIFI_DIRECT_CMD_ACTIVATE: // manager (event)
- if (manager->state > WIFI_DIRECT_STATE_DEACTIVATED) {
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
- rsp.result = wfd_util_wifi_direct_activatable();
- if (rsp.result < 0)
- break;
-
- res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
- if (res < 0) {
- WDS_LOGE("Failed to send response to client");
- _wfd_deregister_client(manager, req.client_id);
- __WDS_LOG_FUNC_EXIT__;
- return FALSE;
- }
-
- noti.event = WIFI_DIRECT_CLI_EVENT_ACTIVATION;
- noti.error = wfd_manager_activate(manager);
- goto send_notification;
- break;
- case WIFI_DIRECT_CMD_DEACTIVATE: // manager (event)
- if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
- if (res < 0) {
- WDS_LOGE("Failed to send response to client");
- _wfd_deregister_client(manager, req.client_id);
- __WDS_LOG_FUNC_EXIT__;
- return FALSE;
- }
- noti.event = WIFI_DIRECT_CLI_EVENT_DEACTIVATION;
- noti.error = wfd_manager_deactivate(manager);
- goto send_notification;
- break;
- case WIFI_DIRECT_CMD_GET_LINK_STATUS:
- rsp.param1 = manager->state;
- break;
- case WIFI_DIRECT_CMD_START_DISCOVERY:
- {
- if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
- manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
- manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
- WDS_LOGE("Wi-Fi Direct is not available status for scanning.");
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- if (req.data.int1 && (manager->local->dev_role == WFD_DEV_ROLE_GO)) {
- WDS_LOGW("Wi-Fi Direct device is already visible, do not start listen");
- rsp.result = WIFI_DIRECT_ERROR_NONE;
- break;
- }
-
- wfd_oem_scan_param_s param;
- memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
- if (req.data.int1) // listen_only
- param.scan_mode = WFD_OEM_SCAN_MODE_PASSIVE;
- else
- param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
- param.scan_time = req.data.int2; // timeout
- if (manager->local->dev_role == WFD_DEV_ROLE_GO)
- param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
-
- res = wfd_oem_start_scan(manager->oem_ops, ¶m);
- if (res < 0) {
- WDS_LOGE("Failed to start scan");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- break;
- }
- WDS_LOGD("Succeeded to start scan");
- 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);
- }
-
- if (req.data.int1) {
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START_LISTEN_ONLY;
- manager->scan_mode = WFD_SCAN_MODE_PASSIVE;
- } else {
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START;
- manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
- }
- noti.error = WIFI_DIRECT_ERROR_NONE;
- }
- break;
- case WIFI_DIRECT_CMD_START_DISCOVERY_SPECIFIC_CHANNEL:
- {
- if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
- manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
- manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
- WDS_LOGE("Wi-Fi Direct is not available status for scanning.");
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- wfd_oem_scan_param_s param;
- memset(¶m, 0x0, sizeof(wfd_oem_scan_param_s));
- param.scan_mode = WFD_OEM_SCAN_MODE_ACTIVE;
- param.scan_time = req.data.int1; // timeout
- int channel = req.data.int2; // channel
-
- if (channel == WIFI_DIRECT_DISCOVERY_FULL_SCAN) {
- param.scan_type = WFD_OEM_SCAN_TYPE_FULL;
- } else if (channel == WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL) {
- param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
- } else if (channel == WIFI_DIRECT_DISCOVERY_CHANNEL1) {
- param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL1;
- param.freq = 2412;
- } else if (channel == WIFI_DIRECT_DISCOVERY_CHANNEL6) {
- param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL6;
- param.freq = 2437;
- } else if (channel == WIFI_DIRECT_DISCOVERY_CHANNEL11) {
- param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL11;
- param.freq = 2462;
- } else {
- param.scan_type = WFD_OEM_SCAN_TYPE_SPECIFIC;
- param.freq = wfd_util_channel_to_freq(channel);
- }
-
- WDS_LOGD("timeout[%d], frequency[%d] ", param.scan_time, param.freq);
- res = wfd_oem_start_scan(manager->oem_ops, ¶m);
- if (res < 0) {
- WDS_LOGE("Failed to start specific scan");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- break;
- }
- WDS_LOGD("Succeeded to start specific scan");
- 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);
- }
-
- if (channel == WIFI_DIRECT_DISCOVERY_FULL_SCAN)
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START;
- else
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_START_SEARCH_LISTEN;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- manager->scan_mode = WFD_SCAN_MODE_ACTIVE;
- }
- break;
- case WIFI_DIRECT_CMD_CANCEL_DISCOVERY:
- if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
- manager->state != WIFI_DIRECT_STATE_DISCOVERING) {
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- res = wfd_oem_stop_scan(manager->oem_ops);
- if (res < 0) {
- WDS_LOGE("Failed to stop scan");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- break;
- }
-
- manager->scan_mode = WFD_SCAN_MODE_NONE;
- WDS_LOGE("Succeeded to stop scan");
-
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;
- noti.error = WIFI_DIRECT_ERROR_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);
- } else {
- wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
- wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
- }
-
- break;
- case WIFI_DIRECT_CMD_IS_LISTENING_ONLY:
- rsp.param1 = manager->scan_mode == WFD_SCAN_MODE_PASSIVE;
- break;
- case WIFI_DIRECT_CMD_GET_DISCOVERY_RESULT:
- {
- wfd_discovery_entry_s *peers = NULL;
- int peer_cnt = 0;
- peer_cnt = wfd_manager_get_peers(manager, &peers);
- WDS_LOGD("Peer count [%d], Peer list [%x]", peer_cnt, peers);
- if (peer_cnt < 0) {
- WDS_LOGE("Failed to get scan result");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- break;
- }
- rsp.param1 = peer_cnt;
- rsp.result = WIFI_DIRECT_ERROR_NONE;
-
- rsp.data_length = peer_cnt * sizeof(wfd_discovery_entry_s);
- extra_rsp = (char*) peers;
- WDS_LOGD("extra_rsp length [%d], extra_rsp [%x]", rsp.data_length, extra_rsp);
- }
- break;
- case WIFI_DIRECT_CMD_CONNECT: //session (event)
- {
- if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
- manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
- manager->state != WIFI_DIRECT_STATE_GROUP_OWNER) {
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- goto send_response;
- }
-
- wfd_group_s *group = (wfd_group_s*) manager->group;
- if (group && group->member_count >= manager->max_station) {
- rsp.result = WIFI_DIRECT_ERROR_TOO_MANY_CLIENT;
- goto send_response;
- }
-
- res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
- if (res < 0) {
- WDS_LOGE("Failed to send response to client");
- _wfd_deregister_client(manager, req.client_id);
- __WDS_LOG_FUNC_EXIT__;
- return FALSE;
- }
-
- res = wfd_manager_connect(manager, req.data.mac_addr);
- if (res < 0) {
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- } else {
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_START;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- }
- g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(req.data.mac_addr));
- goto send_notification;
- }
- break;
- case WIFI_DIRECT_CMD_SEND_CONNECT_REQ:
- {
- if (manager->state != WIFI_DIRECT_STATE_CONNECTING) {
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- goto send_response;
- }
-
- wfd_group_s *group = (wfd_group_s*) manager->group;
- if (group && group->member_count >= manager->max_station) {
- rsp.result = WIFI_DIRECT_ERROR_TOO_MANY_CLIENT;
- goto send_response;
- }
-
- res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
- if (res < 0) {
- WDS_LOGE("Failed to send response to client");
- _wfd_deregister_client(manager, req.client_id);
- __WDS_LOG_FUNC_EXIT__;
- return FALSE;
- }
-
- res = wfd_manager_accept_connection(manager, req.data.mac_addr);
- if (res < 0) {
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- } else {
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_START;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- }
- g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(req.data.mac_addr));
- goto send_notification;
- }
- break;
- case WIFI_DIRECT_CMD_CANCEL_CONNECT: // deprecated
- {
- wfd_session_s *session = (wfd_session_s*) manager->session;
- res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
- if (res < 0) {
- WDS_LOGE("Failed to send response to client");
- _wfd_deregister_client(manager, req.client_id);
- __WDS_LOG_FUNC_EXIT__;
- return FALSE;
- }
-
- res = wfd_oem_cancel_connection(manager->oem_ops, NULL);
- if (res < 0)
- WDS_LOGE("Failed to cancel connection");
-
- res = wfd_oem_destroy_group(manager->oem_ops, GROUP_IFNAME);
- if (res < 0)
- WDS_LOGE("Failed to destroy group");
-
- wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
- wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
-
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- if (session)
- g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(session->peer->dev_addr));
- goto send_notification;
- }
- break;
- case WIFI_DIRECT_CMD_CANCEL_CONNECTION:
- {
- if (!manager->session && manager->state != WIFI_DIRECT_STATE_CONNECTING) {
- WDS_LOGE("It's not CONNECTING state");
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
- if (res < 0) {
- WDS_LOGE("Failed to send response to client");
- _wfd_deregister_client(manager, req.client_id);
- __WDS_LOG_FUNC_EXIT__;
- return FALSE;
- }
-
- res = wfd_manager_cancel_connection(manager, req.data.mac_addr);
- if (res < 0)
- WDS_LOGE("Failed to cancel connection");
-
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_CONNECTION_CANCELED;
- g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(req.data.mac_addr));
- goto send_notification;
- }
- break;
- case WIFI_DIRECT_CMD_REJECT_CONNECTION:
- {
- wfd_session_s *session = (wfd_session_s*) manager->session;
-
- if (!session || manager->state != WIFI_DIRECT_STATE_CONNECTING) {
- WDS_LOGE("It's not permitted with this state [%d]", manager->state);
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- if (session->direction != SESSION_DIRECTION_INCOMING) {
- WDS_LOGE("Only incomming session can be rejected");
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
- if (res < 0) {
- WDS_LOGE("Failed to send response to client");
- _wfd_deregister_client(manager, req.client_id);
- __WDS_LOG_FUNC_EXIT__;
- return FALSE;
- }
-
- res = wfd_manager_reject_connection(manager, req.data.mac_addr);
- if (res < 0) {
- WDS_LOGE("Failed to reject connection");
- // TODO: check whether to set state and break
- }
-
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_CONNECTION_CANCELED;
- g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(req.data.mac_addr));
- goto send_notification;
- }
- break;
- case WIFI_DIRECT_CMD_DISCONNECT: // group, session
- {
- if (!manager->group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
- if (WIFI_DIRECT_STATE_DISCOVERING == manager->state) {
- res = wfd_oem_stop_scan(manager->oem_ops);
- if (res < 0) {
- WDS_LOGE("Failed to stop scan");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- break;
- }
- WDS_LOGI("Succeeded to stop scan");
- if (WFD_DEV_ROLE_GO == manager->local->dev_role) {
- wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
- 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);
- }
- } else {
- WDS_LOGE("It's not permitted with this state [%d]", manager->state);
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
- }
-
- res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
- if (res < 0) {
- WDS_LOGE("Failed to send response to client");
- _wfd_deregister_client(manager, req.client_id);
- __WDS_LOG_FUNC_EXIT__;
- return FALSE;
- }
-
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
- noti.error = wfd_manager_disconnect(manager, req.data.mac_addr);
- g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(req.data.mac_addr));
- goto send_notification;
- }
- break;
- case WIFI_DIRECT_CMD_DISCONNECT_ALL:
- {
- if (!manager->group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
- if (WIFI_DIRECT_STATE_DISCOVERING == manager->state) {
- res = wfd_oem_stop_scan(manager->oem_ops);
- if (res < 0) {
- WDS_LOGE("Failed to stop scan");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- break;
- }
- WDS_LOGI("Succeeded to stop scan");
- if (WFD_DEV_ROLE_GO == manager->local->dev_role) {
- wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
- 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);
- }
- } else {
- WDS_LOGE("It's not permitted with this state [%d]", manager->state);
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
- }
-
- res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
- if (res < 0) {
- WDS_LOGE("Failed to send response to client");
- _wfd_deregister_client(manager, req.client_id);
- __WDS_LOG_FUNC_EXIT__;
- return FALSE;
- }
-
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
- noti.error = wfd_manager_disconnect_all(manager);
- goto send_notification;
- }
- break;
- case WIFI_DIRECT_CMD_GET_CONNECTED_PEERS_INFO:
- {
- // even though status is not CONNECTED, this command can be excuted only when group exist
- if (!manager->group && manager->state < WIFI_DIRECT_STATE_CONNECTED) {
- WDS_LOGD("It's not connected state [%d]", manager->state);
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- wfd_connected_peer_info_s *peers = NULL;
- int peer_cnt = 0;
- peer_cnt = wfd_manager_get_connected_peers(manager, &peers);
- WDS_LOGD("Peer count [%d], Peer list [%x]", peer_cnt, peers);
- if (peer_cnt < 0) {
- WDS_LOGE("Failed to get scan result");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- break;
- }
- rsp.param1 = peer_cnt;
- rsp.result = WIFI_DIRECT_ERROR_NONE;
-
- rsp.data_length = peer_cnt * sizeof(wfd_connected_peer_info_s);
- extra_rsp = (char*) peers;
- WDS_LOGD("extra_rsp length [%d], extra_rsp [%x]", rsp.data_length, extra_rsp);
- }
- break;
- case WIFI_DIRECT_CMD_CREATE_GROUP: // group
- {
- wfd_group_s *group = manager->group;
- wfd_oem_group_param_s param;
- if (group || manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
- WDS_LOGE("Group already exist or not a proper state");
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-#ifdef TIZEN_WLAN_BOARD_SPRD
- group = wfd_create_pending_group(manager, manager->local->dev_addr);
-#else
- group = wfd_create_pending_group(manager, manager->local->intf_addr);
-#endif
- if (!group) {
- WDS_LOGE("Failed to create pending group");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- break;
- }
- group->flags |= WFD_GROUP_FLAG_AUTONOMOUS;
- manager->group = group;
- WDS_LOGD("Succeeded to create pending group");
-
- memset(¶m, 0x0, sizeof(param));
-
- param.persistent = (manager->local->group_flags &
- WFD_GROUP_FLAG_PERSISTENT);
- memcpy(&(param.passphrase), manager->local->passphrase,
- sizeof(param.passphrase));
-#ifndef TIZEN_WLAN_BOARD_SPRD
- param.freq = WFD_FREQ_2G;
-#endif
- res = wfd_oem_create_group(manager->oem_ops, ¶m);
- if (res < 0) {
- WDS_LOGE("Failed to create group");
- wfd_destroy_group(manager, GROUP_IFNAME);
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- }
-
- memset(manager->local->passphrase, 0x0, PASSPHRASE_LEN_MAX + 1);
- }
- break;
- case WIFI_DIRECT_CMD_DESTROY_GROUP:
- {
- wfd_group_s *group = manager->group;
- if (!group && manager->state < WIFI_DIRECT_STATE_CONNECTED) {
- WDS_LOGE("Group not exist");
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- res = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
- if (res < 0) {
- WDS_LOGE("Failed to destroy group");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- break;
- }
-
- res = wfd_destroy_group(manager, group->ifname);
- if (res < 0)
- WDS_LOGE("Failed to destroy group");
-
- wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
- wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
-
- noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- }
- break;
- case WIFI_DIRECT_CMD_IS_GROUPOWNER:
- {
- wfd_device_s *local = manager->local;
- rsp.param1 = local->dev_role == WFD_DEV_ROLE_GO;
- WDS_LOGI("Is group owner : [%s]", rsp.param1 ? "Yes" : "No");
- }
- break;
- case WIFI_DIRECT_CMD_IS_AUTONOMOUS_GROUP:
- {
- if ((rsp.param1 = wfd_group_is_autonomous(manager->group)) < 0) {
- rsp.param1 = FALSE;
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- WDS_LOGI("Is autonomous group : [%s]", rsp.param1 ? "Yes" : "No");
- }
- break;
- case WIFI_DIRECT_CMD_GET_OPERATING_CHANNEL:
- {
- wfd_group_s *group = manager->group;
- if (!group) {
- WDS_LOGE("Group not exist");
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
- rsp.param1 = wfd_util_freq_to_channel(group->freq);
- // TODO: check channel value
- }
- break;
- case WIFI_DIRECT_CMD_GET_PERSISTENT_GROUP_INFO: // group
- {
- if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
- WDS_LOGE("Wi-Fi Direct is not activated.");
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- int persistent_group_count = 0;
- wfd_persistent_group_info_s *plist;
-
- res = wfd_oem_get_persistent_groups(manager->oem_ops, (wfd_oem_persistent_group_s**) &plist, &persistent_group_count);
- if (res < 0) {
- WDS_LOGE("Error!! wfd_oem_get_persistent_group_info() failed..");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- break;
- }
-
- rsp.param1 = persistent_group_count;
- rsp.result = WIFI_DIRECT_ERROR_NONE;
- rsp.data_length = persistent_group_count * sizeof(wfd_persistent_group_info_s);
- extra_rsp = (char*) plist;
- WDS_LOGD("extra_rsp length [%d], extra_rsp [%x]", rsp.data_length, extra_rsp);
- }
- break;
- case WIFI_DIRECT_CMD_ACTIVATE_PERSISTENT_GROUP:
- {
- manager->local->group_flags |= WFD_GROUP_FLAG_PERSISTENT;
- }
- break;
- case WIFI_DIRECT_CMD_DEACTIVATE_PERSISTENT_GROUP:
- {
- manager->local->group_flags &= ~(WFD_GROUP_FLAG_PERSISTENT);
- }
- break;
- case WIFI_DIRECT_CMD_IS_PERSISTENT_GROUP_ACTIVATED:
- {
- rsp.param1 = ((manager->local->group_flags & WFD_GROUP_FLAG_PERSISTENT) == WFD_GROUP_FLAG_PERSISTENT);
- WDS_LOGI("Is persistent group : [%s]", rsp.param1 ? "Yes" : "No");
- }
- break;
- case WIFI_DIRECT_CMD_REMOVE_PERSISTENT_GROUP: // group
- {
- wfd_persistent_group_info_s persistent_group;
-
- if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
- WDS_LOGE("Wi-Fi Direct is not activated.");
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- _wfd_read_from_client(sock, (char*) &persistent_group, sizeof(wfd_persistent_group_info_s));
- break;
- }
-
- res = _wfd_read_from_client(sock, (char*) &persistent_group, sizeof(wfd_persistent_group_info_s));
- if (res == -2) {
- WDS_LOGE("Client socket Hanged up");
- _wfd_deregister_client(manager, sock);
- return FALSE;
- } else if (res == -1) {
- WDS_LOGE("Failed to read socket [%d]", sock);
- return TRUE;
- }
- WDS_LOGD("Remove persistent group [%s]", persistent_group.ssid);
- WDS_LOGD("Remove persistent group [" MACSTR "]", MAC2STR(persistent_group.go_mac_address));
-
- res = wfd_oem_remove_persistent_group(manager->oem_ops,
- persistent_group.ssid, persistent_group.go_mac_address);
- if (res < 0) {
- WDS_LOGE("Failed to remove persistent group");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- }
- }
- break;
- case WIFI_DIRECT_CMD_GET_SSID:
- case WIFI_DIRECT_CMD_GET_DEVICE_NAME: // manager (sync)
- res = wfd_local_get_dev_name(rsp.param2);
- if (res < 0) {
- WDS_LOGE("Failed to get device name");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- }
- break;
- case WIFI_DIRECT_CMD_SET_SSID:
- case WIFI_DIRECT_CMD_SET_DEVICE_NAME: // manager (sync)
- {
- char dev_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN] = {0, };
- res = _wfd_read_from_client(sock, dev_name, WIFI_DIRECT_MAX_DEVICE_NAME_LEN);
- if (res < 0) {
- WDS_LOGE("Failed to set device name");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- break;
- }
-
- res = wfd_local_set_dev_name(dev_name);
- if (res < 0) {
- WDS_LOGE("Failed to set device name");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- }
- }
- break;
- case WIFI_DIRECT_CMD_GET_MAC_ADDR: // manager (sync)
-
- res = wfd_local_get_dev_mac(rsp.param2);
- if (res < 0) {
- WDS_LOGE("Failed to get device mac");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- break;
- }
- break;
- case WIFI_DIRECT_CMD_GET_IP_ADDR: // group
- if (manager->state < WIFI_DIRECT_STATE_CONNECTED) {
- WDS_LOGE("Device is not connected yet");
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- res = wfd_local_get_ip_addr(rsp.param2);
- if (res < 0) {
- WDS_LOGE("Failed to get local IP address");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- }
- break;
- case WIFI_DIRECT_CMD_GET_GO_INTENT: // manager (sync)
- res = wfd_manager_get_go_intent(&rsp.param1);
- if (res < 0) {
- WDS_LOGE("Failed to get GO intent");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- }
- break;
- case WIFI_DIRECT_CMD_SET_GO_INTENT: // manager (sync)
- res = wfd_manager_set_go_intent(req.data.int1);
- if (res < 0) {
- WDS_LOGE("Failed to set GO intent");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- }
- break;
- case WIFI_DIRECT_CMD_GET_MAX_CLIENT:
- res = wfd_manager_get_max_station(&rsp.param1);
- if (res < 0) {
- WDS_LOGE("Failed to get max station");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- }
- break;
- case WIFI_DIRECT_CMD_SET_MAX_CLIENT:
- res = wfd_manager_set_max_station(req.data.int1);
- if (res < 0) {
- WDS_LOGE("Failed to set max station");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- }
- break;
- case WIFI_DIRECT_CMD_IS_AUTOCONNECTION_MODE:
- res = wfd_manager_get_autoconnection(&rsp.param1);
- if (res < 0) {
- WDS_LOGE("Failed to get autoconnection");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- }
- break;
- case WIFI_DIRECT_CMD_SET_AUTOCONNECTION_MODE: // manager (sync)
- res = wfd_manager_set_autoconnection(req.data.int1);
- if (res < 0) {
- WDS_LOGE("Failed to set autoconnection");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- }
- break;
- case WIFI_DIRECT_CMD_IS_DISCOVERABLE:
- {
- wfd_device_s *local = manager->local;
-
- if (manager->state == WIFI_DIRECT_STATE_DISCOVERING ||
- local->dev_role == WFD_DEV_ROLE_GO)
- rsp.param1 = TRUE;
- else
- rsp.param1 = FALSE;
-
- WDS_LOGI("Is discoverable : [%s]", rsp.param1 ? "Yes" : "No");
- }
- break;
- case WIFI_DIRECT_CMD_GET_SUPPORTED_WPS_MODE: // manager (sync)
- res = wfd_local_get_supported_wps_mode(&rsp.param1);
- if (res < 0) {
- WDS_LOGE("Failed to get supported wps mode");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- }
- break;
- case WIFI_DIRECT_CMD_GET_LOCAL_WPS_MODE:
- res = wfd_local_get_wps_mode(&rsp.param1);
- if (res < 0) {
- WDS_LOGE("Failed to get wps mode");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- }
- break;
- case WIFI_DIRECT_CMD_GET_REQ_WPS_MODE:
- res = wfd_manager_get_req_wps_mode(&rsp.param1);
- if (res < 0) {
- WDS_LOGE("Failed to get request wps mode");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- }
- break;
- case WIFI_DIRECT_CMD_SET_REQ_WPS_MODE:
- res = wfd_manager_set_req_wps_mode(req.data.int1);
- if (res < 0) {
- WDS_LOGE("Failed to set request wps mode");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- }
- break;
- case WIFI_DIRECT_CMD_ACTIVATE_PUSHBUTTON:
- if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
- WDS_LOGE("Wi-Fi Direct is not Group Owner.");
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- res = wfd_oem_wps_start(manager->oem_ops, NULL, WFD_WPS_MODE_PBC, NULL);
- if (res < 0) {
- WDS_LOGE("Failed to start wps");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- }
- break;
- case WIFI_DIRECT_CMD_GET_WPS_PIN: // session
- {
- wfd_session_s *session = (wfd_session_s*) manager->session;
- if (!session || manager->auto_pin[0] != 0) {
- WDS_LOGE("Session not exist");
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- if (session->wps_pin[0] == '\0') {
- WDS_LOGE("WPS PIN is not set");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- break;
- }
- g_snprintf(rsp.param2, sizeof(rsp.param2), "%s", session->wps_pin);
- }
- break;
- case WIFI_DIRECT_CMD_SET_WPS_PIN: // session
- {
- char *pin = NULL;
- wfd_session_s *session = (wfd_session_s*) manager->session;
- if (!session) {
- WDS_LOGE("Session not exist");
- pin = manager->auto_pin;
- } else {
- pin = session->wps_pin;
- }
- res = _wfd_read_from_client(sock, pin, PINSTR_LEN);
- if (res == -2) {
- WDS_LOGE("Client socket Hanged up");
- _wfd_deregister_client(manager, sock);
- return FALSE;
- } else if (res == -1) {
- WDS_LOGE("Failed to read socket [%d]", sock);
- return TRUE;
- }
- pin[PINSTR_LEN] = '\0';
- WDS_LOGD("PIN string [%s]", pin);
- }
- break;
- case WIFI_DIRECT_CMD_GENERATE_WPS_PIN: // manager
- // TODO: implement in plugin
- break;
-
-
- case WIFI_DIRECT_CMD_GET_PEER_INFO:
- {
- wfd_discovery_entry_s *peer = NULL;
- int res = 0;
- res = wfd_manager_get_peer_info(manager,req.data.mac_addr, &peer);
- if (res < 0 || !peer) {
- WDS_LOGE("Failed to get peer info");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- if(peer)
- free(peer);
- break;
- }
- rsp.result = WIFI_DIRECT_ERROR_NONE;
-
- rsp.data_length = sizeof(wfd_discovery_entry_s);
- extra_rsp = (char*) peer;
- WDS_LOGD("extra_rsp length [%d], extra_rsp [%x]", rsp.data_length, extra_rsp);
- }
- break;
- case WIFI_DIRECT_CMD_SET_PASSPHRASE:
- {
- char passphrase[PASSPHRASE_LEN_MAX + 1] = {0,};
- int passphrase_len = 0;
- wfd_group_s *group = manager->group;
-
- if (group) {
- WDS_LOGE("Group already exists");
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- _wfd_read_from_client(sock, passphrase, PASSPHRASE_LEN_MAX + 1);
- break;
- }
-
- res = _wfd_read_from_client(sock, passphrase, PASSPHRASE_LEN_MAX + 1);
- if (res == -2) {
- WDS_LOGE("Client socket Hanged up");
- _wfd_deregister_client(manager, sock);
- return FALSE;
- } else if (res == -1) {
- WDS_LOGE("Failed to read socket [%d]", sock);
- return TRUE;
- }
- passphrase[PASSPHRASE_LEN_MAX] = '\0';
- passphrase_len = strlen(passphrase);
-
- if (passphrase_len < PASSPHRASE_LEN_MIN || passphrase_len > PASSPHRASE_LEN_MAX) {
- WDS_LOGE("Passphrase length incorrect [%s]:[%d]", passphrase, passphrase_len);
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- g_strlcpy(manager->local->passphrase, passphrase, PASSPHRASE_LEN_MAX + 1);
- WDS_LOGI("Passphrase string [%s]", manager->local->passphrase);
- }
- break;
- case WIFI_DIRECT_CMD_GET_PASSPHRASE:
- {
- wfd_group_s *group = manager->group;
- if (!group) {
- WDS_LOGE("Group not exist");
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
- if (group->role == WFD_DEV_ROLE_GC) {
- WDS_LOGE("Device is not GO");
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
- g_strlcpy(rsp.param2, group->passphrase, PASSPHRASE_LEN_MAX + 1);
- WDS_LOGI("group->pass : [%s]", group->passphrase);
- }
- break;
-#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
- case WIFI_DIRECT_CMD_REGISTER_SERVICE:
- {
- int service_type = req.data.int1;
- char *info_str = NULL;
-
- info_str = (char*) g_try_malloc0(req.cmd_data_len);
- if (!info_str) {
- WDS_LOGE("Failed to allocate memory for info string");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- break;
- }
-
- res = _wfd_read_from_client(sock, info_str, req.cmd_data_len);
- if (res < 0) {
- WDS_LOGE("Failed to read from socket");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- g_free(info_str);
- break;
- }
- info_str[req.cmd_data_len] = '\0';
- WDS_LOGD("Register service [%d: %s]", service_type, info_str);
-
- if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
- WDS_LOGE("Wi-Fi Direct is not activated.");
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- g_free(info_str);
- break;
- }
-
- res = wfd_service_add(service_type, info_str, &rsp.param1);
- if (res < 0) {
- WDS_LOGE("Failed to add service");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- }
-
- g_free(info_str);
- }
- break;
-
- case WIFI_DIRECT_CMD_DEREGISTER_SERVICE:
- {
- int service_id = req.data.int1;
-
- if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
- WDS_LOGE("Wi-Fi Direct is not activated.");
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- res = wfd_service_del(service_id);
- if (res < 0) {
- WDS_LOGE("Failed to delete service");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- }
- }
- break;
-
- case WIFI_DIRECT_CMD_START_SERVICE_DISCOVERY:
- {
- if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
- WDS_LOGE("Wi-Fi Direct is not activated.");
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- int service_type = req.data.int1;
- WDS_LOGD("Service type [%d]", service_type);
-
- res = wfd_oem_start_service_discovery(manager->oem_ops, req.data.mac_addr, service_type);
- if (res < 0) {
- WDS_LOGE("Failed to start service discovery");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- }
-
- noti.event = WIFI_DIRECT_CLI_EVENT_SERVICE_DISCOVERY_STARTED;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- }
- break;
-
- case WIFI_DIRECT_CMD_CANCEL_SERVICE_DISCOVERY:
- {
- int service_type;
-
- if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
- WDS_LOGE("Wi-Fi Direct is not activated.");
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- service_type = req.data.int1;
- WDS_LOGD("Service type [%d]", service_type);
-
- res = wfd_oem_cancel_service_discovery(manager->oem_ops, req.data.mac_addr, service_type);
- if (res < 0) {
- WDS_LOGE("Failed to cancel service discovery");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- }
- }
- break;
-#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
-
-#ifdef TIZEN_FEATURE_WIFI_DISPLAY
- case WIFI_DIRECT_CMD_INIT_MIRACAST:
- {
- if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
- WDS_LOGE("Wi-Fi Direct is not activated.");
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- int miracast_enable = req.data.int1;
- WDS_LOGD("Miracast enable [%d]", miracast_enable);
-/* TODO*/
-#if 0
- res = wfd_oem_miracast_init(manager->oem_ops, miracast_enable);
- if (res < 0) {
- WDS_LOGE("Failed to initialize miracast");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-
- } else {
-
- if(miracast_enable) {
- manager->local->display.type = WIFI_DISPLAY_DEFAULT_TYPE;
- manager->local->display.port = WIFI_DISPLAY_DEFAULT_PORT;
- manager->local->display.availability = WIFI_DISPLAY_DEFAULT_AVAIL;
- manager->local->display.hdcp_support = WIFI_DISPLAY_DEFAULT_HDCP;
- manager->local->display.max_tput = WIFI_DISPLAY_DEFAULT_TPUT;
- } else {
- memset(&(manager->local->display), 0x0, sizeof(wfd_display_type_e));
- }
- int screen_mirroring_status;
- if (vconf_get_int(VCONFKEY_SCREEN_MIRRORING_STATE, &screen_mirroring_status) < 0)
- WDS_LOGE("Failed to get vconf VCONFKEY_SCREEN_MIRRORING_STATE\n");
- WDS_LOGD("screen_mirroring_status: %d\n", screen_mirroring_status);
-
- if (miracast_enable == TRUE) {
-
- /* set go intent 14 so that can be Group Owner. value 15 can cause connection fail when nego with peer has 15 go intent value. */
- res = wfd_manager_set_go_intent(14);
- if (res < 0)
- WDS_LOGE("Failed to set GO intent");
-
- /* set vconf of Screen Mirroring state. This is necessary to avoid 5 min. auto-deactivation in case of applications using Screen Mirroring. */
- if(screen_mirroring_status < VCONFKEY_SCREEN_MIRRORING_ACTIVATED)
- {
- if (vconf_set_int(VCONFKEY_SCREEN_MIRRORING_STATE, VCONFKEY_SCREEN_MIRRORING_ACTIVATED) < 0)
- WDS_LOGE("Failed to get vconf VCONFKEY_SCREEN_MIRRORING_STATE\n");
- }
-
- } else {
-
- /* set go intent to default value */
- res = wfd_manager_set_go_intent(7);
- if (res < 0)
- WDS_LOGE("Failed to set GO intent");
-
- /* set vconf of Screen Mirroring state. This is necessary in case of applications using Screen Mirroring. */
- if(screen_mirroring_status < VCONFKEY_SCREEN_MIRRORING_CONNECTED)
- {
- if (vconf_set_int(VCONFKEY_SCREEN_MIRRORING_STATE, VCONFKEY_SCREEN_MIRRORING_DEACTIVATED) < 0)
- WDS_LOGE("Failed to get vconf VCONFKEY_SCREEN_MIRRORING_STATE\n");
- }
- }
-
- }
- #endif
- }
- break;
- case WIFI_DIRECT_CMD_INIT_DISPLAY:
- {
- if(manager->state < WIFI_DIRECT_STATE_ACTIVATED || manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- wfd_device_s * device = manager->local;
-
- res = wfd_oem_miracast_init(manager->oem_ops, true);
- if (res < 0) {
- WDS_LOGE("Failed to initialize display");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- } else {
- device->display.type = WIFI_DISPLAY_DEFAULT_TYPE;
- device->display.port = WIFI_DISPLAY_DEFAULT_PORT;
- device->display.availability = WIFI_DISPLAY_DEFAULT_AVAIL;
- device->display.hdcp_support = WIFI_DISPLAY_DEFAULT_HDCP;
- device->display.max_tput = WIFI_DISPLAY_DEFAULT_TPUT;
- }
- }
- break;
- case WIFI_DIRECT_CMD_DEINIT_DISPLAY:
- {
- if(manager->state < WIFI_DIRECT_STATE_ACTIVATED || manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- wfd_device_s * device = manager->local;
-
- res = wfd_oem_miracast_init(manager->oem_ops, false);
- if (res < 0) {
- WDS_LOGE("Failed to deinitialize display");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
-
- }
- memset(&(device->display), 0x0, sizeof(wfd_display_type_e));
- }
- break;
- case WIFI_DIRECT_CMD_SET_DISPLAY:
- {
- if(manager->state < WIFI_DIRECT_STATE_ACTIVATED || manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- int type = req.data.int1; // type
- int port = req.data.int2; // port
- int hdcp = req.data.int3; // hdcp
-
- res = wfd_manager_set_display_device(type, port, hdcp);
- if (res < 0) {
- WDS_LOGE("Failed to set display device settings");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- }
- }
- break;
- case WIFI_DIRECT_CMD_SET_DISPLAY_AVAILABILITY:
- {
- if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
- res = wfd_manager_set_session_availability(req.data.int1);
- if (res < 0) {
- WDS_LOGE("Failed to set session availability");
- rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
- break;
- }
- }
- break;
- case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_TYPE:
- {
- if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- wfd_device_s *peer = NULL;
-
- peer = wfd_manager_get_peer_by_addr(manager, req.data.mac_addr);
- if(peer) {
- rsp.param1 = peer->display.type;
- } else {
- WDS_LOGE("Failed to get peer");
- rsp.result = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
- break;
- }
- }
- break;
- case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_AVAILABILITY:
- {
- if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- wfd_device_s *peer = NULL;
-
- peer = wfd_manager_get_peer_by_addr(manager, req.data.mac_addr);
- if(peer) {
- rsp.param1 = peer->display.availability;
- } else {
- WDS_LOGE("Failed to get peer");
- rsp.result = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
- break;
- }
- }
- break;
- case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_HDCP:
- {
- if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- wfd_device_s *peer = NULL;
-
- peer = wfd_manager_get_peer_by_addr(manager, req.data.mac_addr);
- if(peer) {
- rsp.param1 = peer->display.hdcp_support;
- } else {
- WDS_LOGE("Failed to get peer");
- rsp.result = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
- break;
- }
- }
- break;
- case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_PORT:
- {
- if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- wfd_device_s *peer = NULL;
-
- peer = wfd_manager_get_peer_by_addr(manager, req.data.mac_addr);
- if(peer) {
- rsp.param1 = peer->display.port;
- } else {
- WDS_LOGE("Failed to get peer");
- rsp.result = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
- break;
- }
- }
- break;
- case WIFI_DIRECT_CMD_GET_PEER_DISPLAY_THROUGHPUT:
- {
- if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
- wfd_device_s *peer = NULL;
-
- peer = wfd_manager_get_peer_by_addr(manager, req.data.mac_addr);
- if(peer) {
- rsp.param1 = peer->display.max_tput;
- } else {
- WDS_LOGE("Failed to get peer");
- rsp.result = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
- break;
- }
- }
- break;
-#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
- default:
- WDS_LOGE("Unknown command[%d]", req.cmd);
- rsp.result = WIFI_DIRECT_ERROR_NOT_PERMITTED;
- break;
- }
-
-send_response:
- res = _wfd_send_to_client(sock, (char*) &rsp, sizeof(rsp));
- if (res < 0) {
- WDS_LOGE("Failed to send response to client");
- g_free(extra_rsp);
- _wfd_deregister_client(manager, req.client_id);
- __WDS_LOG_FUNC_EXIT__;
- return FALSE;
- }
-
- if (rsp.data_length > 0) {
- res = _wfd_send_to_client(sock, (char*) extra_rsp, rsp.data_length);
- if (res < 0) {
- WDS_LOGE("Failed to send extra response data to client");
- g_free(extra_rsp);
- _wfd_deregister_client(manager, req.client_id);
- __WDS_LOG_FUNC_EXIT__;
- return FALSE;
- }
- g_free(extra_rsp);
- extra_rsp = NULL;
- }
-
-send_notification:
- if (noti.event > WIFI_DIRECT_CLI_EVENT_INVALID && noti.event < WIFI_DIRECT_CLI_EVENT_MAX) {
- res = wfd_client_send_event(manager, ¬i);
- if (res < 0) {
- WDS_LOGE("Failed to send Notification to client");
- g_free(extra_rsp);
- __WDS_LOG_FUNC_EXIT__;
- return FALSE;
- }
- WDS_LOGD("Succeeded to send Notification[%d] to client", noti.event);
- }
-
-done:
- g_free(extra_rsp);
- __WDS_LOG_FUNC_EXIT__;
- return TRUE;
-}
-
--- /dev/null
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file implements wifi direct dbus utility functions.
+ *
+ * @file wifi-direct-dbus.c
+ * @author Nishant Chaprana (n.chaprana@samsung.com)
+ * @version 0.1
+ */
+
+#include "wifi-direct-dbus.h"
+#include "wifi-direct-log.h"
+
+static GDBusConnection *connection = NULL;
+static guint g_owner_id = 0; //Name Owner ID
+
+static GDBusConnection *__dbus_get_gdbus_conn(void)
+{
+ return connection;
+}
+
+static void __on_name_acquired(GDBusConnection *connection,
+ const gchar *name,
+ gpointer user_data)
+{
+ WDS_LOGD("on_name_acquired: %s", name);
+}
+
+static void __on_name_lost(GDBusConnection *connection,
+ const gchar *name,
+ gpointer user_data)
+{
+ WDS_LOGD("on_name_lost: %s", name);
+}
+
+guint wfd_manager_dbus_iface_register(const gchar* iface_name,
+ const gchar* iface_path,
+ const gchar *xml_data,
+ const GDBusInterfaceVTable *interface_vtable)
+{
+ GDBusNodeInfo *node_info = NULL;
+ GDBusInterfaceInfo *interface_info = NULL;
+ GError *Error = NULL;
+ guint reg_id = 0;
+ GDBusConnection *connection = NULL;
+
+ connection = __dbus_get_gdbus_conn();
+ if (connection == NULL) {
+ WDS_LOGE("Dbus connection not yet initiated");
+ return 0;
+ }
+
+ if (!iface_name || !iface_path || !xml_data || !interface_vtable) {
+ WDS_LOGE("Invalid Parameters");
+ return 0;
+ }
+
+ node_info = g_dbus_node_info_new_for_xml(xml_data, &Error);
+ if (node_info == NULL) {
+ WDS_LOGE("Failed to get node info, Error: %s", Error->message);
+ g_clear_error(&Error);
+ return 0;
+ }
+
+ /* Register interface */
+ interface_info = g_dbus_node_info_lookup_interface(node_info, iface_name);
+ if (interface_info == NULL) {
+ WDS_LOGE("Failed to get interface info");
+ g_dbus_node_info_unref(node_info);
+ return 0;
+ }
+
+ reg_id = g_dbus_connection_register_object(connection, iface_path,
+ interface_info, interface_vtable,
+ NULL, NULL, &Error);
+ if (reg_id == 0) {
+ WDS_LOGE("Failed to register: %s", Error->message);
+ g_clear_error(&Error);
+ g_dbus_node_info_unref(node_info);
+ return 0;
+ }
+
+ WDS_LOGD("Interface Registration ID [%d], Interface Name [%s]", reg_id, iface_name);
+
+ g_dbus_node_info_unref(node_info);
+ return reg_id;
+}
+
+gboolean wfd_manager_dbus_iface_unregister(guint reg_id)
+{
+ GDBusConnection *connection = NULL;
+
+ connection = __dbus_get_gdbus_conn();
+ if (connection == NULL) {
+ WDS_LOGE("Dbus connection not yet initiated");
+ return FALSE;
+ }
+
+ if(reg_id > 0) {
+ if(g_dbus_connection_unregister_object (connection, reg_id) == FALSE)
+ WDS_LOGE("netconfig network migration unregister object");
+ }
+
+ return TRUE;
+}
+
+gboolean wfd_manager_dbus_init(void)
+{
+ GError *Error = NULL;
+
+ if (connection != NULL) {
+ WDS_LOGE("Conenciton already present");
+ return TRUE;
+ }
+
+ connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &Error);
+ if(connection == NULL) {
+ WDS_LOGE("Failed to get connection, Error[%s]", Error->message);
+ g_error_free(Error);
+ return FALSE;
+ }
+
+ g_owner_id = g_bus_own_name_on_connection(connection,
+ WFD_MANAGER_SERVICE,
+ G_BUS_NAME_OWNER_FLAGS_NONE,
+ __on_name_acquired,
+ __on_name_lost,
+ NULL,
+ NULL);
+ if (g_owner_id == 0) {
+ WDS_LOGE("Failed to get bus name");
+ return FALSE;
+ }
+ WDS_LOGD("DBus Owner id is [%d]", g_owner_id);
+
+ connection = connection;
+ return TRUE;
+}
+
+void wfd_manager_dbus_deinit(void)
+{
+ if (connection == NULL || g_owner_id == 0)
+ return;
+
+ g_object_unref(connection);
+ g_bus_unown_name(g_owner_id);
+}
+
+gboolean wfd_manager_dbus_emit_signal(const gchar *interface_name,
+ const gchar *signal_name,
+ GVariant *parameters)
+{
+ gboolean rv = FALSE;
+ GError *error = NULL;
+ GDBusConnection *connection;
+
+ connection = __dbus_get_gdbus_conn();
+ if (connection == NULL) {
+ WDS_LOGE("GDBusconnection is NULL");
+ return 0;
+ }
+
+ DBUS_DEBUG_VARIANT(parameters);
+
+ rv = g_dbus_connection_emit_signal(connection,
+ NULL,
+ WFD_MANAGER_PATH,
+ interface_name,
+ signal_name,
+ parameters,
+ &error);
+ if (rv != TRUE) {
+ WDS_LOGE("Failed to get node info, Error: %s", error->message);
+ g_error_free(error);
+ } else {
+ WDS_LOGD("[%s] signal sent on [%s] interface", signal_name, interface_name);
+ }
+
+ return rv;
+}
+
+GVariant* wfd_manager_dbus_pack_ay(const unsigned char *src, int size)
+{
+ GVariantBuilder *builder = NULL;
+ GVariant *iter = NULL;
+ int i = 0;
+
+ if (!src) {
+ WDS_LOGE("Invalid parameter");
+ return NULL;
+ }
+
+ builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
+
+ for(i = 0; i < size; i++)
+ g_variant_builder_add(builder, "y", src[i]);
+
+ iter = g_variant_new("ay", builder);
+
+ g_variant_builder_unref (builder);
+ return iter;
+}
--- /dev/null
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file implements wifi direct manager dbus error functions.
+ *
+ * @file wifi-direct-error.c
+ * @author Nishant Chaprana (n.chaprana@samsung.com)
+ * @version 0.1
+ */
+
+#include <glib.h>
+#include "wifi-direct-error.h"
+#include "wifi-direct-dbus.h"
+#include "wifi-direct-log.h"
+
+#define WFD_MANAGER_QUARK (g_quark_from_string ("wifi-direct-manager"))
+
+static void wfd_error_invalid_parameter(GError **error)
+{
+ g_set_error(error,
+ WFD_MANAGER_QUARK,
+ WIFI_DIRECT_ERROR_INVALID_PARAMETER,
+ WFD_MANAGER_ERROR_INTERFACE ".InvalidParameter");
+}
+
+static void wfd_error_not_permitted(GError **error)
+{
+ g_set_error(error,
+ WFD_MANAGER_QUARK,
+ WIFI_DIRECT_ERROR_NOT_PERMITTED,
+ WFD_MANAGER_ERROR_INTERFACE ".NotPermitted");
+}
+
+static void wfd_error_operation_failed(GError **error)
+{
+ g_set_error(error,
+ WFD_MANAGER_QUARK,
+ WIFI_DIRECT_ERROR_OPERATION_FAILED,
+ WFD_MANAGER_ERROR_INTERFACE ".OperationFailed");
+}
+
+void wfd_error_set_gerror(wifi_direct_error_e error_code, GError **error) {
+ switch(error_code) {
+ case WIFI_DIRECT_ERROR_INVALID_PARAMETER:
+ wfd_error_invalid_parameter(error);
+ break;
+ case WIFI_DIRECT_ERROR_NOT_PERMITTED:
+ wfd_error_not_permitted(error);
+ break;
+ case WIFI_DIRECT_ERROR_OPERATION_FAILED:
+ wfd_error_operation_failed(error);
+ break;
+ default:
+ WDS_LOGD("Error Not handled [%d]", error_code);
+ }
+}
#include "wifi-direct-group.h"
#include "wifi-direct-session.h"
#include "wifi-direct-event.h"
-#include "wifi-direct-client.h"
#include "wifi-direct-state.h"
#include "wifi-direct-util.h"
+#include "wifi-direct-error.h"
+#include "wifi-direct-log.h"
+#include "wifi-direct-dbus.h"
static int _wfd_event_update_peer(wfd_manager_s *manager, wfd_oem_dev_data_s *data)
{
__WDS_LOG_FUNC_ENTER__;
- wifi_direct_client_noti_s noti;
-
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
-
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_DEACTIVATION;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- wfd_client_send_event(manager, ¬i);
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Deactivation",
+ g_variant_new("(i)", WIFI_DIRECT_ERROR_NONE));
wfd_destroy_group(manager, GROUP_IFNAME);
wfd_destroy_session(manager);
__WDS_LOG_FUNC_ENTER__;
wfd_oem_dev_data_s *edata = NULL;
- wifi_direct_client_noti_s noti;
int res = 0;
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
-
edata = (wfd_oem_dev_data_s*) event->edata;
if (!edata || event->edata_type != WFD_OEM_EDATA_TYPE_DEVICE) {
WDS_LOGE("Invalid event data");
if (manager->state > WIFI_DIRECT_STATE_ACTIVATING &&
manager->state != WIFI_DIRECT_STATE_CONNECTING &&
manager->state != WIFI_DIRECT_STATE_DISCONNECTING) {
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(edata->p2p_dev_addr));
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_FOUND_PEERS;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- wfd_client_send_event(manager, ¬i);
+ char peer_mac_address[MACSTR_LEN+1] = {0, };
+ snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(edata->p2p_dev_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "PeerFound",
+ g_variant_new("(s)", peer_mac_address));
}
__WDS_LOG_FUNC_EXIT__;
{
__WDS_LOG_FUNC_ENTER__;
- wifi_direct_client_noti_s noti;
wfd_session_s *session = NULL;
wfd_device_s *peer = NULL;
-
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ char peer_mac_address[MACSTR_LEN+1] = {0, };
session = manager->session;
if(session != NULL && session->peer != NULL) {
wfd_remove_peer(manager, event->dev_addr);
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_LOST_PEERS;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- wfd_client_send_event(manager, ¬i);
+ snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "PeerLost",
+ g_variant_new("(s)", peer_mac_address));
__WDS_LOG_FUNC_EXIT__;
return;
{
__WDS_LOG_FUNC_ENTER__;
- wifi_direct_client_noti_s noti;
-
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
-
if (manager->state != WIFI_DIRECT_STATE_DISCOVERING &&
manager->state != WIFI_DIRECT_STATE_ACTIVATED) {
WDS_LOGE("Notify finding stopped when discovering or activated. [%d]", manager->state);
}
manager->scan_mode = WFD_SCAN_MODE_NONE;
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCOVER_END;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- wfd_client_send_event(manager, ¬i);
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "DiscoveryFinished",
+ NULL);
__WDS_LOG_FUNC_EXIT__;
return;
wfd_device_s *peer = NULL;
int res = 0;
-
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
-
wfd_group_s *group = (wfd_group_s*) manager->group;
+
if (group && group->role == WFD_DEV_ROLE_GC &&
event->event_id == WFD_OEM_EVENT_PROV_DISC_REQ) {
WDS_LOGD("Device has GC role - ignore this provision request");
wfd_device_s *peer = NULL;
int res = 0;
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
-
#ifdef CTRL_IFACE_DBUS
wfd_oem_dev_data_s *edata = NULL;
__WDS_LOG_FUNC_ENTER__;
wfd_session_s *session = NULL;
- wifi_direct_client_noti_s noti;
unsigned char *peer_addr = NULL;
-
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ char peer_mac_address[MACSTR_LEN+1] = {0, };
session = (wfd_session_s*) manager->session;
if (!session) {
return;
}
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
- snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
- wfd_client_send_event(manager, ¬i);
+ snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Connection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
+ WFD_EVENT_CONNECTION_RSP,
+ peer_mac_address));
if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
wfd_group_s *group = (wfd_group_s*) manager->group;
__WDS_LOG_FUNC_ENTER__;
wfd_session_s *session = NULL;
- wifi_direct_client_noti_s noti;
-
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
-
wfd_group_s *group = (wfd_group_s*) manager->group;
if (group && group->role == WFD_DEV_ROLE_GC) {
WDS_LOGD("Device has GC role - ignore this go neg request");
wfd_session_timer(session, 1);
wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- g_snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
- wfd_client_send_event(manager, ¬i);
+ char peer_mac_address[MACSTR_LEN+1] = {0, };
+ g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Connection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+ WFD_EVENT_CONNECTION_REQ,
+ peer_mac_address));
} else {
wfd_session_process_event(manager, event);
}
wfd_session_s *session = NULL;
wfd_oem_conn_data_s *edata = NULL;
- wifi_direct_client_noti_s noti;
unsigned char *peer_addr = NULL;
-
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ char peer_mac_address[MACSTR_LEN] = {0, };
session = (wfd_session_s*) manager->session;
if (!session) {
return;
}
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
- snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
- wfd_client_send_event(manager, ¬i);
+ snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Connection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
+ WFD_EVENT_CONNECTION_RSP,
+ peer_mac_address));
wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
wfd_oem_conn_data_s *edata = NULL;
wfd_device_s *peer = NULL;
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
-
edata = (wfd_oem_conn_data_s*) event->edata;
if (edata == NULL) {
WDS_LOGE("Invalid event data");
__WDS_LOG_FUNC_ENTER__;
wfd_session_s *session = NULL;
- wifi_direct_client_noti_s noti;
unsigned char *peer_addr = NULL;
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
-
session = (wfd_session_s*) manager->session;
if (!session) {
WDS_LOGE("Unexpected event. Session not exist");
return;
}
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
- snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
- wfd_client_send_event(manager, ¬i);
+ char peer_mac_address[MACSTR_LEN+1] = {0, };
+ g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Connection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
+ WFD_EVENT_CONNECTION_RSP,
+ peer_mac_address));
if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
wfd_group_s *group = (wfd_group_s*) manager->group;
return;
}
- static void __wfd_process_wps_done(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
+static void __wfd_process_wps_done(wfd_manager_s *manager, wfd_oem_event_s *event)
+{
__WDS_LOG_FUNC_ENTER__;
wfd_session_process_event(manager, event);
__WDS_LOG_FUNC_EXIT__;
return;
- }
+}
static void __wfd_process_key_neg_fail(wfd_manager_s *manager, wfd_oem_event_s *event)
{
__WDS_LOG_FUNC_ENTER__;
wfd_session_s *session = NULL;
- wifi_direct_client_noti_s noti;
unsigned char *peer_addr = NULL;
-
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ char peer_mac_address[MACSTR_LEN+1] = {0, };
session = (wfd_session_s*) manager->session;
if (!session) {
return;
}
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
- snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
- wfd_client_send_event(manager, ¬i);
+ g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Connection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
+ WFD_EVENT_CONNECTION_RSP,
+ peer_mac_address));
if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
wfd_group_s *group = (wfd_group_s*) manager->group;
wfd_group_s *group = NULL;
wfd_session_s *session = NULL;
- wifi_direct_client_noti_s noti;
-
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
group = (wfd_group_s*) manager->group;
session = (wfd_session_s*)manager->session;
}
}
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
if (group->role == WFD_DEV_ROLE_GC && session) {
#ifdef TIZEN_FEATURE_IP_OVER_EAPOL
wfd_device_s *peer = session->peer;
wfd_update_peer(manager, peer);
if(peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
+ char peer_mac_address[MACSTR_LEN+1] = {0, };
wfd_util_ip_over_eap_assign(peer, event->ifname);
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
- wfd_client_send_event(manager, ¬i);
+ g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Connection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+ WFD_EVENT_CONNECTION_RSP,
+ peer_mac_address));
wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
wfd_peer_clear_all(manager);
} else {
if (group->flags & WFD_GROUP_FLAG_AUTONOMOUS) {
- noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_CREATE_RSP;
- wfd_client_send_event(manager, ¬i);
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
+ "Created", NULL);
wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
}
{
__WDS_LOG_FUNC_ENTER__;
- wifi_direct_client_noti_s noti;
+ char peer_mac_address[MACSTR_LEN+1] = {0, };
+ unsigned char *peer_addr = wfd_session_get_peer_addr(manager->session);
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ if (peer_addr != NULL)
+ g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+ else
+ g_snprintf(peer_mac_address, MACSTR_LEN, "%s", "");
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_NONE;
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Disconnection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+ WFD_EVENT_DISCONNECTION_RSP,
+ peer_mac_address));
+
} else if (manager->state == WIFI_DIRECT_STATE_CONNECTING && manager->session){
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
- unsigned char *peer_addr = wfd_session_get_peer_addr(manager->session);
- if(peer_addr != NULL)
- g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Connection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
+ WFD_EVENT_CONNECTION_RSP,
+ peer_mac_address));
+
} else if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
- if(manager->local->dev_role != WFD_DEV_ROLE_GO)
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
- else
- noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP;
- noti.error = WIFI_DIRECT_ERROR_NONE;
+ if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Disconnection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+ WFD_EVENT_DISCONNECTION_RSP,
+ peer_mac_address));
+ } else {
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
+ "Destroyed", NULL);
+ }
} else {
WDS_LOGD("Unexpected event(GROUP_DESTROYED). Ignore it");
__WDS_LOG_FUNC_EXIT__;
return;
}
- wfd_client_send_event(manager, ¬i);
wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
wfd_device_s *peer = NULL;
wfd_session_s *session = NULL;
wfd_oem_invite_data_s *edata = NULL;
- wifi_direct_client_noti_s noti;
int res = 0;
-
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ char peer_mac_address[MACSTR_LEN+1] = {0, };
peer = wfd_peer_find_by_dev_addr(manager, event->dev_addr);
if (!peer) {
return;
}
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
- wfd_client_send_event(manager, ¬i);
+ g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Connection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+ WFD_EVENT_CONNECTION_REQ,
+ peer_mac_address));
__WDS_LOG_FUNC_EXIT__;
return;
wfd_session_s *session = NULL;
wfd_device_s *peer = NULL;
wfd_group_s *group = NULL;
- wifi_direct_client_noti_s noti;
-
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ char peer_mac_address[MACSTR_LEN+1] = {0, };
// FIXME: Move this code to plugin
if (!memcmp(event->intf_addr, manager->local->intf_addr, MACADDR_LEN)) {
wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_GROUP_OWNER);
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
- wfd_client_send_event(manager, ¬i);
+ g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Connection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+ WFD_EVENT_CONNECTION_RSP,
+ peer_mac_address));
+
#ifdef CTRL_IFACE_DBUS
wfd_update_peer(manager, peer);
#endif /* CTRL_IFACE_DBUS */
WDS_LOGE("Peer's GO IP [" IPSTR "]", IP2STR((char*) &peer->go_ip_addr));
}
if(peer->ip_type == WFD_IP_TYPE_OVER_EAPOL) {
+ char peer_mac_address[MACSTR_LEN+1] = {0,};
+ char assigned_ip_address[IPSTR_LEN+1] = {0,};
+
memcpy(peer->ip_addr, peer->client_ip_addr, IPADDR_LEN);
- wifi_direct_client_noti_s noti;
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_IP_LEASED_IND;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
- snprintf(noti.param2, IPSTR_LEN, IPSTR, IP2STR(peer->ip_addr));
- wfd_client_send_event(manager, ¬i);
+ g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
+ g_snprintf(assigned_ip_address, IPSTR_LEN, IPSTR, IP2STR(peer->ip_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "PeerIPAssigned",
+ g_variant_new("(ss)", peer_mac_address,
+ assigned_ip_address));
} else
#endif /* TIZEN_FEATURE_IP_OVER_EAPOL */
wfd_util_dhcps_wait_ip_leased(peer);
wfd_group_s *group = NULL;
wfd_device_s *peer = NULL;
- wifi_direct_client_noti_s noti;
unsigned char peer_addr[MACADDR_LEN] = {0, };
-
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ char peer_mac_address[MACSTR_LEN+1] = {0, };
group = (wfd_group_s*) manager->group;
if (!group) {
#endif /* CTRL_DBUS_IFACE */
}
memcpy(peer_addr, peer->dev_addr, MACADDR_LEN);
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
/* If state is not DISCONNECTING, connection is finished by peer */
if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
wfd_group_remove_member(group, peer_addr);
- if (group->member_count)
- noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;
- else
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_IND;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+ g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+ if (group->member_count) {
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Disconnection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+ WFD_EVENT_DISASSOCIATION_IND,
+ peer_mac_address));
+ } else {
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Disconnection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+ WFD_EVENT_DISCONNECTION_IND,
+ peer_mac_address));
+ }
+
} else if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
- noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+ g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Disconnection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+ WFD_EVENT_DISCONNECTION_RSP,
+ peer_mac_address));
+
} else if (manager->state == WIFI_DIRECT_STATE_CONNECTING &&
/* Some devices(GO) send disconnection message before connection completed.
* This message should be ignored when device is not GO */
if (WFD_PEER_STATE_CONNECTED == peer->state) {
WDS_LOGD("Peer is already Connected !!!");
wfd_group_remove_member(group, peer_addr);
- noti.event = WIFI_DIRECT_CLI_EVENT_DISASSOCIATION_IND;
- noti.error = WIFI_DIRECT_ERROR_NONE;
+ g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Disconnection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+ WFD_EVENT_DISASSOCIATION_IND,
+ peer_mac_address));
+
} else if (WFD_PEER_STATE_CONNECTING == peer->state) {
WDS_LOGD("Peer is Connecting...");
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
+ g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Connection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
+ WFD_EVENT_CONNECTION_RSP,
+ peer_mac_address));
} else {
WDS_LOGE("Unexpected Peer State. Ignore it");
__WDS_LOG_FUNC_EXIT__;
return;
}
- g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
} else {
WDS_LOGE("Unexpected event. Ignore it");
__WDS_LOG_FUNC_EXIT__;
return;
}
- wfd_client_send_event(manager, ¬i);
if (manager->local->dev_role == WFD_DEV_ROLE_GO) {
wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
return;
}
- static void __wfd_process_terminating(wfd_manager_s *manager, wfd_oem_event_s *event)
- {
+static void __wfd_process_terminating(wfd_manager_s *manager, wfd_oem_event_s *event)
+{
__WDS_LOG_FUNC_ENTER__;
__WDS_LOG_FUNC_EXIT__;
return;
- }
+}
static void __wfd_process_group_formation_failure(wfd_manager_s *manager, wfd_oem_event_s *event)
{
return;
}
- wifi_direct_client_noti_s noti;
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
- snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
- wfd_client_send_event(manager, ¬i);
+ char peer_mac_address[MACSTR_LEN+1] = {0, };
+ g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Connection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
+ WFD_EVENT_CONNECTION_RSP,
+ peer_mac_address));
+
wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
wfd_destroy_session(manager);
static void __wfd_process_serv_disc_resp(wfd_manager_s *manager, wfd_oem_event_s *event)
{
__WDS_LOG_FUNC_ENTER__;
-
- wifi_direct_client_noti_s noti;
-
- if (event == NULL || manager == NULL) {
- WDS_LOGE("Invalid parameter");
- __WDS_LOG_FUNC_EXIT__;
- return;
- }
+ int service_type;
+ char response_data[256] = {0, };
+ char peer_mac_address[MACSTR_LEN+1] = {0, };
wfd_update_peer_time(manager, event->dev_addr);
temp = g_list_first(services);
while(temp && count < event->dev_role) {
service = (wfd_oem_new_service_s*) temp->data;
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_SERVICE_DISCOVERY_FOUND;
- noti.type = service->protocol;
+ service_type = service->protocol;
if (service->protocol == WFD_OEM_SERVICE_TYPE_BONJOUR) {
- g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
- g_snprintf(noti.param2, 256, "%s|%s", service->data.bonjour.query, service->data.bonjour.rdata);
+ g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
+ g_snprintf(response_data, 256, "%s|%s", service->data.bonjour.query, service->data.bonjour.rdata);
WDS_LOGD("Found service: [%d: %s] - [" MACSECSTR "]", service->protocol,
service->data.bonjour.query, MAC2SECSTR(event->dev_addr));
} else {
WDS_LOGD("Found service is not supported");
goto next;
}
- wfd_client_send_event(manager, ¬i);
+
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
+ "DiscoveryFound",
+ g_variant_new("(iss)", service_type,
+ response_data,
+ peer_mac_address));
next:
temp = g_list_next(temp);
service = NULL;
} else if (event->edata_type == WFD_OEM_EDATA_TYPE_SERVICE) {
wfd_oem_service_data_s *edata = (wfd_oem_service_data_s*) event->edata;
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_SERVICE_DISCOVERY_FOUND;
if(!edata) {
- noti.type = -1;
+ service_type = -1;
} else {
- noti.type = edata->type;
- g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
+ service_type = edata->type;
+ g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
switch(edata->type) {
WDS_LOGE("Unknown type [type ID: %d]", edata->type);
}
}
- wfd_client_send_event(manager, ¬i);
+
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
+ "DiscoveryFound",
+ g_variant_new("(iss)", service_type,
+ response_data,
+ peer_mac_address));
}
__WDS_LOG_FUNC_EXIT__;
#include "wifi-direct-group.h"
#include "wifi-direct-util.h"
#include "wifi-direct-session.h"
-#include "wifi-direct-client.h"
+#include "wifi-direct-log.h"
+
// Check the group instance which has same interface name, before using this function
wfd_group_s *wfd_create_group(void *data, wfd_oem_event_s *group_info)
--- /dev/null
+/*
+ * Network Configuration Module
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * This file implements wifi direct manager interface functions.
+ *
+ * @file wifi-direct-iface.c
+ * @author Nishant Chaprana (n.chaprana@samsung.com)
+ * @version 0.1
+ */
+
+#include <stdlib.h>
+
+#include <wifi-direct.h>
+
+#include "wifi-direct-dbus.h"
+#include "wifi-direct-iface.h"
+#include "wifi-direct-ipc.h"
+#include "wifi-direct-error.h"
+#include "wifi-direct-log.h"
+#include "wifi-direct-manager.h"
+#include "wifi-direct-oem.h"
+#include "wifi-direct-session.h"
+#include "wifi-direct-util.h"
+#include "wifi-direct-group.h"
+#include "wifi-direct-state.h"
+#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
+#include "wifi-direct-service.h"
+#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
+
+static int macaddr_atoe(const char *p, unsigned char mac[])
+{
+ int i = 0;
+
+ for (;;) {
+ mac[i++] = (char) strtoul(p, (char **) &p, 16);
+ if (!*p++ || i == 6)
+ break;
+ }
+
+ return (i == 6);
+}
+
+// introspection xml to register interfaces
+const gchar wfd_manager_introspection_xml[] = {
+ "<node name='/net/wifidirect'>"
+ "<interface name='net.wifidirect'>"
+ "<method name='Activate'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='Deactivate'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='StartDiscovery'>"
+ "<arg type='a{sv}' name='parameters' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='StopDiscovery'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='GetDiscoveredPeers'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "<arg type='aa{sv}' name='peer_details_list' direction='out'/>"
+ "</method>"
+ "<method name='Connect'>"
+ "<arg type='s' name='mac_address' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='Disconnect'>"
+ "<arg type='s' name='mac_address' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='CancelConnection'>"
+ "<arg type='s' name='mac_address' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='AcceptConnection'>"
+ "<arg type='s' name='mac_address' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='RejectConnection'>"
+ "<arg type='s' name='mac_address' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='DisconnectAll'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='GetConnectedPeers'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "<arg type='aa{sv}' name='peer_details_list' direction='out'/>"
+ "</method>"
+ "<method name='IsDiscoverable'>"
+ "<arg type='b' name='result' direction='out'/>"
+ "</method>"
+ "<method name='IsListeningOnly'>"
+ "<arg type='b' name='result' direction='out'/>"
+ "</method>"
+ "<method name='GetPeerInfo'>"
+ "<arg type='s' name='mac_address' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "<arg type='a{sv}' name='peer_details' direction='out'/>"
+ "</method>"
+ "<method name='GetState'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "<arg type='i' name='state' direction='out'/>"
+ "</method>"
+ "<signal name='Activation'>"
+ "<arg type='i' name='error_code'/>"
+ "</signal>"
+ "<signal name='Deactivation'>"
+ "<arg type='i' name='error_code'/>"
+ "</signal>"
+ "<signal name='Connection'>"
+ "<arg type='i' name='error_code'/>"
+ "<arg type='i' name='connection_state'/>"
+ "<arg type='s' name='peer_mac_address'/>"
+ "</signal>"
+ "<signal name='Disconnection'>"
+ "<arg type='i' name='error_code'/>"
+ "<arg type='i' name='connection_state'/>"
+ "<arg type='s' name='peer_mac_address'/>"
+ "</signal>"
+ "<signal name='ListenStarted'>"
+ "</signal>"
+ "<signal name='DiscoveryStarted'>"
+ "</signal>"
+ "<signal name='DiscoveryFinished'>"
+ "</signal>"
+ "<signal name='PeerFound'>"
+ "<arg type='s' name='peer_mac_address'/>"
+ "</signal>"
+ "<signal name='PeerLost'>"
+ "<arg type='s' name='peer_mac_address'/>"
+ "</signal>"
+ "<signal name='PeerIPAssigned'>"
+ "<arg type='s' name='peer_mac_address'/>"
+ "<arg type='s' name='assigned_ip_address'/>"
+ "</signal>"
+ "</interface>"
+ "<interface name='net.wifidirect.group'>"
+ "<method name='CreateGroup'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='DestroyGroup'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='IsGroupOwner'>"
+ "<arg type='b' name='result' direction='out'/>"
+ "</method>"
+ "<method name='IsAutoGroup'>"
+ "<arg type='b' name='result' direction='out'/>"
+ "</method>"
+ "<method name='ActivatePushButton'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='GetPersistentGroups'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "<arg type='aa{sv}' name='result' direction='out'/>"
+ "</method>"
+ "<method name='RemovePersistentGroup'>"
+ "<arg type='s' name='mac_address' direction='in'/>"
+ "<arg type='s' name='ssid' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='SetPassphrase'>"
+ "<arg type='s' name='passphrase' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='GetPassphrase'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "<arg type='s' name='passphrase' direction='out'/>"
+ "</method>"
+ "<method name='SetPersistentGroupEnabled'>"
+ "<arg type='b' name='enable' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='IsPersistentGroupEnabled'>"
+ "<arg type='b' name='result' direction='out'/>"
+ "</method>"
+ "<signal name='Created'>"
+ "</signal>"
+ "<signal name='Destroyed'>"
+ "</signal>"
+ "</interface>"
+ "<interface name='net.wifidirect.config'>"
+ "<method name='GetDeviceName'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "<arg type='s' name='device_name' direction='out'/>"
+ "</method>"
+ "<method name='SetDeviceName'>"
+ "<arg type='s' name='device_name' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='SetWpsPin'>"
+ "<arg type='s' name='wps_pin' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='GetWpsPin'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "<arg type='s' name='wps_pin' direction='out'/>"
+ "</method>"
+ "<method name='GenerateWpsPin'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "<arg type='s' name='wps_pin' direction='out'/>"
+ "</method>"
+ "<method name='GetSupportedWpsMode'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "<arg type='i' name='config_methods' direction='out'/>"
+ "</method>"
+ "<method name='GetReqWpsMode'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "<arg type='i' name='req_wps_mode' direction='out'/>"
+ "</method>"
+ "<method name='SetReqWpsMode'>"
+ "<arg type='i' name='req_wps_mode' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='GetLocalWpsMode'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "<arg type='i' name='local_wps_mode' direction='out'/>"
+ "</method>"
+ "<method name='GetIPAddress'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "<arg type='s' name='local_ip_address' direction='out'/>"
+ "</method>"
+ "<method name='GetMacAddress'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "<arg type='s' name='local_mac_address' direction='out'/>"
+ "</method>"
+ "<method name='GetGoIntent'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "<arg type='i' name='go_intent' direction='out'/>"
+ "</method>"
+ "<method name='SetGoIntent'>"
+ "<arg type='i' name='go_intent' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='GetMaxClient'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "<arg type='i' name='max_client' direction='out'/>"
+ "</method>"
+ "<method name='SetMaxClient'>"
+ "<arg type='i' name='max_client' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='SetAutoConnectionMode'>"
+ "<arg type='b' name='auto_connection_mode' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='IsAutoConnectionMode'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "<arg type='b' name='result' direction='out'/>"
+ "</method>"
+ "<method name='GetOperatingChannel'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "<arg type='i' name='operating_channel' direction='out'/>"
+ "</method>"
+ "<method name='SetAutoConnectionPeer'>"
+ "<arg type='s' name='peer_mac_address' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "</interface>"
+#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
+ "<interface name='net.wifidirect.service'>"
+ "<method name='StartDiscovery'>"
+ "<arg type='i' name='service_type' direction='in'/>"
+ "<arg type='s' name='mac_addr' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='StopDiscovery'>"
+ "<arg type='i' name='service_type' direction='in'/>"
+ "<arg type='s' name='mac_addr' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='Register'>"
+ "<arg type='i' name='service_type' direction='in'/>"
+ "<arg type='s' name='info_string' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "<arg type='i' name='service_id' direction='out'/>"
+ "</method>"
+ "<method name='Deregister'>"
+ "<arg type='i' name='service_id' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<signal name='DiscoveryStarted'>"
+ "</signal>"
+ "<signal name='DiscoveryFound'>"
+ "<arg type='i' name='service_type'/>"
+ "<arg type='s' name='response_data'/>"
+ "<arg type='s' name='peer_mac_address'/>"
+ "</signal>"
+ "<signal name='DiscoveryFinished'>"
+ "</signal>"
+ "</interface>"
+#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
+#ifdef TIZEN_FEATURE_WIFI_DISPLAY
+ "<interface name='net.wifidirect.display'>"
+ "<method name='Init'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='Deinit'>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='SetConfig'>"
+ "<arg type='i' name='type' direction='in'/>"
+ "<arg type='i' name='port' direction='in'/>"
+ "<arg type='i' name='hdcp' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='SetAvailiability'>"
+ "<arg type='i' name='availability' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "</method>"
+ "<method name='GetPeerType'>"
+ "<arg type='s' name='peer_mac_addr' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "<arg type='i' name='result' direction='out'/>"
+ "</method>"
+ "<method name='GetPeerAvailability'>"
+ "<arg type='s' name='peer_mac_addr' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "<arg type='i' name='result' direction='out'/>"
+ "</method>"
+ "<method name='GetPeerHdcp'>"
+ "<arg type='s' name='peer_mac_addr' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "<arg type='i' name='result' direction='out'/>"
+ "</method>"
+ "<method name='GetPeerPort'>"
+ "<arg type='s' name='peer_mac_addr' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "<arg type='i' name='result' direction='out'/>"
+ "</method>"
+ "<method name='GetPeerThroughput'>"
+ "<arg type='s' name='peer_mac_addr' direction='in'/>"
+ "<arg type='i' name='error_code' direction='out'/>"
+ "<arg type='i' name='result' direction='out'/>"
+ "</method>"
+ "</interface>"
+#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+ "</node>"
+};
+
+static int __wfd_manager_manage_iface_handler(const gchar *method_name,
+ GVariant *parameters,
+ GVariant **return_parameters)
+{
+ int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ wfd_manager_s *manager = wfd_get_manager();
+
+ if (!g_strcmp0(method_name, "Activate")) {
+ ret = wfd_manager_activate(manager);
+ if (ret == WIFI_DIRECT_ERROR_NONE)
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Activation",
+ g_variant_new("(i)", ret));
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "Deactivate")) {
+ ret = wfd_manager_deactivate(manager);
+ if (ret == WIFI_DIRECT_ERROR_NONE)
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Deactivation",
+ g_variant_new("(i)", ret));
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "StartDiscovery")) {
+ gboolean mode = FALSE;
+ gint32 timeout = 0;
+ guint32 channel = 0;
+ const gchar *type = NULL;
+ GVariantIter *iter = NULL;
+ gchar *key = NULL;
+ GVariant *var = NULL;
+
+ g_variant_get(parameters, "(a{sv})", &iter);
+ while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
+ if (!g_strcmp0(key, "Mode"))
+ g_variant_get(var, "b", &mode);
+ else if (!g_strcmp0(key, "Timeout"))
+ g_variant_get(var, "i", &timeout);
+ else if (!g_strcmp0(key, "Type"))
+ g_variant_get(var, "&s", &type);
+ else if (!g_strcmp0(key, "Channel"))
+ g_variant_get(var, "i", &channel);
+ else
+ ;/* Do Nothing */
+ }
+ g_variant_iter_free(iter);
+
+ ret = wfd_manager_start_discovery(manager, mode, timeout, type, channel);
+ if (ret == WIFI_DIRECT_ERROR_NONE) {
+ if (mode == WFD_OEM_SCAN_MODE_PASSIVE) {
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "ListenStarted",
+ NULL);
+ } else {
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "DiscoveryStarted",
+ NULL);
+ }
+ }
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "StopDiscovery")) {
+ int mode = manager->scan_mode;
+ ret = wfd_manager_cancel_discovery(manager);
+ if (ret == WIFI_DIRECT_ERROR_NONE && mode == WFD_SCAN_MODE_PASSIVE)
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "DiscoveryFinished",
+ NULL);
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "GetDiscoveredPeers")) {
+ wfd_discovery_entry_s *peers = NULL;
+ GVariantBuilder *builder_peers = NULL;
+ int peer_cnt = 0;
+ int i = 0;
+
+ builder_peers = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
+
+ peer_cnt = wfd_manager_get_peers(manager, &peers);
+ WDS_LOGD("Peer count [%d], Peer list [%p]", peer_cnt, peers);
+ if (peer_cnt < 0) {
+ WDS_LOGE("Failed to get scan result");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
+ g_variant_builder_unref(builder_peers);
+ goto done;
+ }
+
+ if (peer_cnt > 255)
+ peer_cnt = 255;
+
+ for (i = 0; i < peer_cnt; i++) {
+ GVariantBuilder builder_peer;
+ g_variant_builder_init(&builder_peer, G_VARIANT_TYPE("a{sv}"));
+
+ g_variant_builder_add(&builder_peer, "{sv}",
+ "DeviceName",
+ g_variant_new_string(peers[i].device_name));
+ g_variant_builder_add(&builder_peer, "{sv}",
+ "DeviceAddress",
+ wfd_manager_dbus_pack_ay(peers[i].mac_address, MACADDR_LEN));
+ g_variant_builder_add(&builder_peer, "{sv}",
+ "InterfaceAddress",
+ wfd_manager_dbus_pack_ay(peers[i].intf_address, MACADDR_LEN));
+ g_variant_builder_add(&builder_peer, "{sv}",
+ "Channel",
+ g_variant_new_uint16(peers[i].channel));
+#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
+ g_variant_builder_add(&builder_peer, "{sv}",
+ "Services",
+ g_variant_new_uint16(peers[i].services));
+#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
+ g_variant_builder_add(&builder_peer, "{sv}",
+ "IsGroupOwner",
+ g_variant_new_boolean(peers[i].is_group_owner));
+ g_variant_builder_add(&builder_peer, "{sv}",
+ "IsPersistentGO",
+ g_variant_new_boolean(peers[i].is_persistent_go));
+ g_variant_builder_add(&builder_peer, "{sv}",
+ "IsConnected",
+ g_variant_new_boolean(peers[i].is_connected));
+ g_variant_builder_add(&builder_peer, "{sv}",
+ "WpsDevicePwdID",
+ g_variant_new_uint16(peers[i].wps_device_pwd_id));
+ g_variant_builder_add(&builder_peer, "{sv}",
+ "WpsCfgMethods",
+ g_variant_new_uint16(peers[i].wps_cfg_methods));
+ g_variant_builder_add(&builder_peer, "{sv}",
+ "Category",
+ g_variant_new_uint16(peers[i].category));
+ g_variant_builder_add(&builder_peer, "{sv}",
+ "SubCategory",
+ g_variant_new_uint16(peers[i].subcategory));
+#ifdef TIZEN_FEATURE_WIFI_DISPLAY
+ g_variant_builder_add(&builder_peer, "{sv}",
+ "IsWfdDevice",
+ g_variant_new_boolean(peers[i].is_wfd_device));
+#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+
+ WDS_LOGD("%dth peer [%s]", i, peers[i].device_name);
+ g_variant_builder_add_value(builder_peers, g_variant_builder_end(&builder_peer));
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
+ g_variant_builder_unref(builder_peers);
+
+ } else if (!g_strcmp0(method_name, "Connect")) {
+ const char *peer_mac_address = NULL;
+ unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+ g_variant_get(parameters, "(&s)", &peer_mac_address);
+ macaddr_atoe(peer_mac_address, mac_addr);
+
+ ret = wfd_manager_connect(manager, mac_addr);
+ if (ret == WIFI_DIRECT_ERROR_NONE)
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Connection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+ WFD_EVENT_CONNECTION_IN_PROGRESS,
+ peer_mac_address));
+
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "Disconnect")) {
+ const char *peer_mac_address = NULL;
+ unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+ g_variant_get(parameters, "(&s)", &peer_mac_address);
+ macaddr_atoe(peer_mac_address, mac_addr);
+
+ ret = wfd_manager_disconnect(manager, mac_addr);
+ if (ret == WIFI_DIRECT_ERROR_NONE)
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Disconnection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+ WFD_EVENT_DISCONNECTION_RSP,
+ peer_mac_address));
+
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "CancelConnection")) {
+ const char *peer_mac_address = NULL;
+ unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+ g_variant_get(parameters, "(&s)", &peer_mac_address);
+ macaddr_atoe(peer_mac_address, mac_addr);
+
+ ret = wfd_manager_cancel_connection(manager, mac_addr);
+ if (ret == WIFI_DIRECT_ERROR_NONE)
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Connection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_CANCELED,
+ WFD_EVENT_CONNECTION_RSP,
+ peer_mac_address));
+
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "AcceptConnection")) {
+ const char *peer_mac_address = NULL;
+ unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+ g_variant_get(parameters, "(&s)", &peer_mac_address);
+ macaddr_atoe(peer_mac_address, mac_addr);
+
+ ret = wfd_manager_accept_connection(manager, mac_addr);
+ if (ret == WIFI_DIRECT_ERROR_NONE) {
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Connection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+ WFD_EVENT_CONNECTION_IN_PROGRESS,
+ peer_mac_address));
+ } else {
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Connection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_OPERATION_FAILED,
+ WFD_EVENT_CONNECTION_RSP,
+ peer_mac_address));
+ }
+
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "RejectConnection")) {
+ const char *peer_mac_address = NULL;
+ unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+ g_variant_get(parameters, "(&s)", &peer_mac_address);
+ macaddr_atoe(peer_mac_address, mac_addr);
+
+ ret = wfd_manager_reject_connection(manager, mac_addr);
+ if (ret == WIFI_DIRECT_ERROR_NONE)
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Connection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_CANCELED,
+ WFD_EVENT_CONNECTION_RSP,
+ peer_mac_address));
+
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "DisconnectAll")) {
+ ret = wfd_manager_disconnect_all(manager);
+ if (ret == WIFI_DIRECT_ERROR_NONE)
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Disconnection",
+ g_variant_new("(iis)", ret,
+ WFD_EVENT_DISCONNECTION_RSP,
+ ""));
+
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "GetConnectedPeers")) {
+ wfd_connected_peer_info_s *peers = NULL;
+ GVariantBuilder *builder_peers = NULL;
+ int peer_cnt = 0;
+ int i = 0;
+
+ builder_peers = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
+
+ // even though status is not CONNECTED, this command can be excuted only when group exist
+ if (!manager->group && manager->state < WIFI_DIRECT_STATE_CONNECTED) {
+ WDS_LOGD("It's not connected state [%d]", manager->state);
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
+ g_variant_builder_unref(builder_peers);
+ goto done;
+ }
+
+ peer_cnt = wfd_manager_get_connected_peers(manager, &peers);
+ WDS_LOGD("Peer count [%d], Peer list [%x]", peer_cnt, peers);
+ if (peer_cnt < 0) {
+ WDS_LOGE("Failed to get scan result");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
+ g_variant_builder_unref(builder_peers);
+ goto done;
+ }
+
+ for (i = 0; i < peer_cnt; i++) {
+ GVariantBuilder builder_peer;
+ g_variant_builder_init(&builder_peer, G_VARIANT_TYPE("a{sv}"));
+
+ g_variant_builder_add(&builder_peer, "{sv}",
+ "DeviceName",
+ g_variant_new_string(peers[i].device_name));
+ g_variant_builder_add(&builder_peer, "{sv}",
+ "DeviceAddress",
+ wfd_manager_dbus_pack_ay(peers[i].mac_address, MACADDR_LEN));
+ g_variant_builder_add(&builder_peer, "{sv}",
+ "InterfaceAddress",
+ wfd_manager_dbus_pack_ay(peers[i].intf_address, MACADDR_LEN));
+ g_variant_builder_add(&builder_peer, "{sv}",
+ "IPAddress",
+ wfd_manager_dbus_pack_ay(peers[i].ip_address, IPADDR_LEN));
+ g_variant_builder_add(&builder_peer, "{sv}",
+ "Channel",
+ g_variant_new_uint16(peers[i].channel));
+#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
+ g_variant_builder_add(&builder_peer, "{sv}",
+ "Services",
+ g_variant_new_uint16(peers[i].services));
+#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
+ g_variant_builder_add(&builder_peer, "{sv}",
+ "Category",
+ g_variant_new_uint16(peers[i].category));
+ g_variant_builder_add(&builder_peer, "{sv}",
+ "SubCategory",
+ g_variant_new_uint16(peers[i].subcategory));
+ g_variant_builder_add(&builder_peer, "{sv}",
+ "IsP2P",
+ g_variant_new_boolean(peers[i].is_p2p));
+#ifdef TIZEN_FEATURE_WIFI_DISPLAY
+ g_variant_builder_add(&builder_peer, "{sv}",
+ "IsWfdDevice",
+ g_variant_new_boolean(peers[i].is_wfd_device));
+#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+
+ WDS_LOGD("%dth peer [%s]", i, peers[i].device_name);
+ g_variant_builder_add_value(builder_peers, g_variant_builder_end(&builder_peer));
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(iaa{sv})", ret, builder_peers);
+ g_variant_builder_unref(builder_peers);
+
+ } else if (!g_strcmp0(method_name, "IsDiscoverable")) {
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(b)",
+ (manager->state == WIFI_DIRECT_STATE_DISCOVERING ||
+ wfd_group_is_autonomous(manager->group) == TRUE));
+
+ } else if (!g_strcmp0(method_name, "IsListeningOnly")) {
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(b)", (manager->scan_mode == WFD_SCAN_MODE_PASSIVE));
+
+ } else if (!g_strcmp0(method_name, "GetPeerInfo")) {
+ wfd_discovery_entry_s *peer = NULL;
+ GVariantBuilder *builder_peer = NULL;
+ const char *peer_mac_address = NULL;
+ unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+ g_variant_get(parameters, "(&s)", &peer_mac_address);
+ macaddr_atoe(peer_mac_address, mac_addr);
+
+ builder_peer = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+
+ ret = wfd_manager_get_peer_info(manager, mac_addr, &peer);
+ if (ret < 0 || !peer) {
+ WDS_LOGE("Failed to get peer info");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(ia{sv})", ret, builder_peer);
+ g_free(peer);
+ goto done;
+ }
+
+ g_variant_builder_add(builder_peer, "{sv}",
+ "DeviceName",
+ g_variant_new_string(peer->device_name));
+ g_variant_builder_add(builder_peer, "{sv}",
+ "DeviceAddress",
+ wfd_manager_dbus_pack_ay(peer->mac_address, MACADDR_LEN));
+ g_variant_builder_add(builder_peer, "{sv}",
+ "InterfaceAddress",
+ wfd_manager_dbus_pack_ay(peer->intf_address, MACADDR_LEN));
+ g_variant_builder_add(builder_peer, "{sv}",
+ "Channel",
+ g_variant_new_uint16(peer->channel));
+#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
+ g_variant_builder_add(builder_peer, "{sv}",
+ "Services",
+ g_variant_new_uint16(peer->services));
+#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
+ g_variant_builder_add(builder_peer, "{sv}",
+ "IsGroupOwner",
+ g_variant_new_boolean(peer->is_group_owner));
+ g_variant_builder_add(builder_peer, "{sv}",
+ "IsPersistentGO",
+ g_variant_new_boolean(peer->is_persistent_go));
+ g_variant_builder_add(builder_peer, "{sv}",
+ "IsConnected",
+ g_variant_new_boolean(peer->is_connected));
+ g_variant_builder_add(builder_peer, "{sv}",
+ "WpsDevicePwdID",
+ g_variant_new_uint16(peer->wps_device_pwd_id));
+ g_variant_builder_add(builder_peer, "{sv}",
+ "WpsCfgMethods",
+ g_variant_new_uint16(peer->wps_cfg_methods));
+ g_variant_builder_add(builder_peer, "{sv}",
+ "Category",
+ g_variant_new_uint16(peer->category));
+ g_variant_builder_add(builder_peer, "{sv}",
+ "SubCategory",
+ g_variant_new_uint16(peer->subcategory));
+#ifdef TIZEN_FEATURE_WIFI_DISPLAY
+ g_variant_builder_add(builder_peer, "{sv}",
+ "IsWfdDevice",
+ g_variant_new_boolean(peer->is_wfd_device));
+#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(ia{sv})", ret, builder_peer);
+ g_variant_builder_unref(builder_peer);
+ g_free(peer);
+
+ } else if (!g_strcmp0(method_name, "GetState")) {
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(ii)", ret, manager->state);
+
+ } else {
+ WDS_LOGD("method not handled");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ }
+
+done:
+ return ret;
+}
+
+static int __wfd_manager_group_iface_handler(const gchar *method_name,
+ GVariant *parameters,
+ GVariant **return_parameters)
+{
+ int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ wfd_manager_s *manager = wfd_get_manager();
+ WDS_LOGD("%s", method_name);
+
+ if (!g_strcmp0(method_name, "CreateGroup")) {
+ wfd_group_s *group = manager->group;
+ wfd_oem_group_param_s param;
+
+ if (group || manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+ WDS_LOGE("Group already exist or not a proper state");
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+#ifdef TIZEN_WLAN_BOARD_SPRD
+ group = wfd_create_pending_group(manager, manager->local->dev_addr);
+#else
+ group = wfd_create_pending_group(manager, manager->local->intf_addr);
+#endif
+ if (!group) {
+ WDS_LOGE("Failed to create pending group");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+ group->flags |= WFD_GROUP_FLAG_AUTONOMOUS;
+ manager->group = group;
+
+ memset(¶m, 0x0, sizeof(param));
+
+ param.persistent = (manager->local->group_flags &
+ WFD_GROUP_FLAG_PERSISTENT);
+ memcpy(&(param.passphrase), manager->local->passphrase,
+ sizeof(param.passphrase));
+
+#ifndef TIZEN_WLAN_BOARD_SPRD
+ param.freq = WFD_FREQ_2G;
+#endif
+
+ ret = wfd_oem_create_group(manager->oem_ops, ¶m);
+ if (ret < 0) {
+ WDS_LOGE("Failed to create group");
+ wfd_destroy_group(manager, GROUP_IFNAME);
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(i)", ret);
+ }
+
+ WDS_LOGD("Succeeded to create pending group");
+ memset(manager->local->passphrase, 0x0, PASSPHRASE_LEN_MAX + 1);
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "DestroyGroup")) {
+ wfd_group_s *group = manager->group;
+ if (!group && manager->state < WIFI_DIRECT_STATE_CONNECTED) {
+ WDS_LOGE("Group not exist");
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ ret = wfd_oem_destroy_group(manager->oem_ops, group->ifname);
+ if (ret < 0) {
+ WDS_LOGE("Failed to destroy group");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ ret = wfd_destroy_group(manager, group->ifname);
+ if (ret < 0)
+ WDS_LOGE("Failed to destroy group");
+
+ wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+ wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_GROUP_INTERFACE,
+ "Destroyed", NULL);
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "IsGroupOwner")) {
+ gboolean result;
+ wfd_device_s *local = manager->local;
+ result = local->dev_role == WFD_DEV_ROLE_GO;
+ WDS_LOGI("Is group owner : [%s]", result ? "Yes" : "No");
+ *return_parameters = g_variant_new("(b)", result);
+ ret = WIFI_DIRECT_ERROR_NONE;
+
+ } else if (!g_strcmp0(method_name, "IsAutoGroup")) {
+ int result;
+ if ((result = wfd_group_is_autonomous(manager->group)) < 0) {
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ goto done;
+ }
+ WDS_LOGI("Is autonomous group : [%s]", result ? "Yes" : "No");
+ *return_parameters = g_variant_new("(b)", result);
+ ret = WIFI_DIRECT_ERROR_NONE;
+
+ } else if (!g_strcmp0(method_name, "ActivatePushButton")) {
+ if (manager->local->dev_role != WFD_DEV_ROLE_GO) {
+ WDS_LOGE("Wi-Fi Direct is not Group Owner.");
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ ret = wfd_oem_wps_start(manager->oem_ops, NULL,
+ WFD_WPS_MODE_PBC, NULL);
+ if (ret < 0) {
+ WDS_LOGE("Failed to start wps");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "GetPersistentGroups")) {
+ int persistent_group_count = 0;
+ wfd_persistent_group_info_s *plist;
+ GVariantBuilder *builder_groups = NULL;
+ int i = 0;
+
+ builder_groups = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
+
+ if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+ WDS_LOGE("Wi-Fi Direct is not activated.");
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(iaa{sv})", ret, builder_groups);
+ g_variant_builder_unref(builder_groups);
+ goto done;
+ }
+
+ ret = wfd_oem_get_persistent_groups(manager->oem_ops,
+ (wfd_oem_persistent_group_s**) &plist, &persistent_group_count);
+ if (ret < 0) {
+ WDS_LOGE("Error!! wfd_oem_get_persistent_group_info() failed..");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(iaa{sv})", ret, builder_groups);
+ g_variant_builder_unref(builder_groups);
+ goto done;
+ }
+
+ for (i = 0; i < persistent_group_count; i++) {
+ GVariantBuilder builder_group;
+ g_variant_builder_init(&builder_group, G_VARIANT_TYPE("a{sv}"));
+
+ g_variant_builder_add(&builder_group, "{sv}",
+ "NetworkID",
+ g_variant_new_uint32(plist[i].network_id));
+ g_variant_builder_add(&builder_group, "{sv}",
+ "SSID",
+ g_variant_new_string(plist[i].ssid));
+ g_variant_builder_add(&builder_group, "{sv}",
+ "GOMacAddress",
+ wfd_manager_dbus_pack_ay(plist[i].go_mac_address, MACADDR_LEN));
+
+ WDS_LOGD("%dth peer [%s]", i, plist[i].ssid);
+ g_variant_builder_add_value(builder_groups, g_variant_builder_end(&builder_group));
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(iaa{sv})", ret, builder_groups);
+ g_variant_builder_unref(builder_groups);
+
+ } else if (!g_strcmp0(method_name, "RemovePersistentGroup")) {
+ gchar *ssid;
+ gchar *mac_address;
+ unsigned char go_mac_address[6];
+ if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+ WDS_LOGE("Wi-Fi Direct is not activated.");
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ g_variant_get(parameters, "(&s&s)", &mac_address, &ssid);
+ macaddr_atoe(mac_address, go_mac_address);
+ WDS_LOGD("Remove persistent group [%s][" MACSTR "]", ssid, MAC2STR(go_mac_address));
+
+ ret = wfd_oem_remove_persistent_group(manager->oem_ops, ssid,
+ go_mac_address);
+ if (ret < 0) {
+ WDS_LOGE("Failed to remove persistent group");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "SetPassphrase")) {
+ gchar *passphrase;
+ int passphrase_len = 0;
+ wfd_group_s *group = manager->group;
+
+ if (group) {
+ WDS_LOGE("Group already exists");
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ g_variant_get(parameters, "(&s)", &passphrase);
+ passphrase_len = strlen(passphrase);
+
+ if (passphrase_len < PASSPHRASE_LEN_MIN ||
+ passphrase_len > PASSPHRASE_LEN_MAX) {
+ WDS_LOGE("Passphrase length incorrect [%s]:[%d]",
+ passphrase, passphrase_len);
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ g_strlcpy(manager->local->passphrase, passphrase, PASSPHRASE_LEN_MAX + 1);
+ WDS_LOGI("Passphrase string [%s]", manager->local->passphrase);
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "GetPassphrase")) {
+ wfd_group_s *group = manager->group;
+ if (!group) {
+ WDS_LOGE("Group not exist");
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(is)", ret, "");
+ goto done;
+ }
+
+ if (group->role == WFD_DEV_ROLE_GC) {
+ WDS_LOGE("Device is not GO");
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(is)", ret, "");
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(is)", ret, group->passphrase);
+ WDS_LOGI("group->pass : [%s]", group->passphrase);
+
+ } else if (!g_strcmp0(method_name, "SetPersistentGroupEnabled")) {
+ gboolean enabled;
+
+ g_variant_get(parameters, "(b)", &enabled);
+ WDS_LOGI("Activate Persistent Group : [%s]",
+ enabled ? "True" : "False");
+ if (enabled)
+ manager->local->group_flags |= WFD_GROUP_FLAG_PERSISTENT;
+ else
+ manager->local->group_flags &= ~(WFD_GROUP_FLAG_PERSISTENT);
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "IsPersistentGroupEnabled")) {
+ gboolean result;
+ result = ((manager->local->group_flags &
+ WFD_GROUP_FLAG_PERSISTENT)
+ == WFD_GROUP_FLAG_PERSISTENT);
+ WDS_LOGI("Is persistent group : [%s]", result ? "Yes" : "No");
+ *return_parameters = g_variant_new("(b)", result);
+ ret = WIFI_DIRECT_ERROR_NONE;
+
+ } else {
+ WDS_LOGD("method not handled");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ }
+
+done:
+ return ret;
+}
+
+static int __wfd_manager_config_iface_handler(const gchar *method_name,
+ GVariant *parameters,
+ GVariant **return_parameters)
+{
+ int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ wfd_manager_s *manager = wfd_get_manager();
+ WDS_LOGD("%s", method_name);
+
+ if (!g_strcmp0(method_name, "GetDeviceName")) {
+ char device_name[WIFI_DIRECT_MAX_DEVICE_NAME_LEN+1] = {0, };
+
+ ret = wfd_local_get_dev_name(device_name);
+ if (ret < 0) {
+ WDS_LOGE("Failed to get device name");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(is)", ret, "");
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(is)", ret, device_name);
+
+ } else if (!g_strcmp0(method_name, "SetDeviceName")) {
+ const char *device_name = NULL;
+ g_variant_get(parameters, "(&s)", &device_name);
+
+ ret = wfd_local_set_dev_name((char *)device_name);
+ if (ret < 0) {
+ WDS_LOGE("Failed to set device name");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "GetWpsPin")) {
+ wfd_session_s *session = (wfd_session_s*) manager->session;
+ if (!session || manager->auto_pin[0] != 0) {
+ WDS_LOGE("Session not exist");
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(is)", ret, "");
+ goto done;
+ }
+
+ if (session->wps_pin[0] == '\0') {
+ WDS_LOGE("WPS PIN is not set");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(is)", ret, "");
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(is)", ret, session->wps_pin);
+
+ } else if (!g_strcmp0(method_name, "SetWpsPin")) {
+ const char *pin = NULL;
+ wfd_session_s *session = (wfd_session_s*) manager->session;
+
+ g_variant_get(parameters, "(&s)", &pin);
+
+ if (!session) {
+ WDS_LOGE("Session not exist");
+ g_strlcpy(manager->auto_pin, pin, strlen(pin) + 1);
+ } else {
+ g_strlcpy(session->wps_pin, pin, strlen(pin) + 1);
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "GetSupportedWpsMode")) {
+ int config_methods = 0;
+
+ ret = wfd_local_get_supported_wps_mode(&config_methods);
+ if (ret < 0) {
+ WDS_LOGE("Failed to get supported wps mode");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(ii)", ret, config_methods);
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(ii)", ret, config_methods);
+
+ } else if (!g_strcmp0(method_name, "GetReqWpsMode")) {
+ int wps_mode = 0;
+
+ ret = wfd_manager_get_req_wps_mode(&wps_mode);
+ if (ret < 0) {
+ WDS_LOGE("Failed to get request wps mode");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(ii)", ret, wps_mode);
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(ii)", ret, wps_mode);
+
+ } else if (!g_strcmp0(method_name, "SetReqWpsMode")) {
+ int type = 0;
+
+ g_variant_get(parameters, "(i)", &type);
+ ret = wfd_manager_set_req_wps_mode(type);
+ if(ret < 0) {
+ WDS_LOGE("Failed to set request wps mode");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "GetLocalWpsMode")) {
+ int wps_mode = 0;
+
+ ret = wfd_local_get_wps_mode(&wps_mode);
+ if (ret < 0) {
+ WDS_LOGE("Failed to get request wps mode");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(ii)", ret, 0);
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(ii)", ret, wps_mode);
+
+ } else if (!g_strcmp0(method_name, "GetIPAddress")) {
+ unsigned char ip_addr[IPADDR_LEN] = {0,};
+ char ip_addr_str[IPSTR_LEN+1] = {0, };
+
+ if (manager->state < WIFI_DIRECT_STATE_CONNECTED) {
+ WDS_LOGE("Device is not connected yet");
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ g_snprintf(ip_addr_str, IPSTR_LEN, IPSTR, IP2STR(ip_addr));
+ *return_parameters = g_variant_new("(is)", ret, ip_addr_str);
+ goto done;
+ }
+
+ ret = wfd_local_get_ip_addr((char *)ip_addr);
+ if (ret < 0) {
+ WDS_LOGE("Failed to get local IP address");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ g_snprintf(ip_addr_str, IPSTR_LEN, IPSTR, IP2STR(ip_addr));
+ *return_parameters = g_variant_new("(is)", ret, ip_addr_str);
+ goto done;
+ }
+
+ g_snprintf(ip_addr_str, IPSTR_LEN, IPSTR, IP2STR(ip_addr));
+ *return_parameters = g_variant_new("(is)", ret, ip_addr_str);
+ WDS_LOGI("IP addr : [%s]", ip_addr_str);
+
+ } else if (!g_strcmp0(method_name, "GetMacAddress")) {
+ char device_mac[MACSTR_LEN+1] = {0, };
+
+ ret = wfd_local_get_dev_mac(device_mac);
+ if (ret < 0) {
+ WDS_LOGE("Failed to get device mac");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(is)", "");
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(is)", ret, device_mac);
+
+ } else if (!g_strcmp0(method_name, "GetGoIntent")) {
+ int go_intent = 0;
+
+ ret = wfd_manager_get_go_intent(&go_intent);
+ if (ret < 0) {
+ WDS_LOGE("Failed to get GO intent");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(ii)", ret, 0);
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(ii)", ret, go_intent);
+
+ } else if (!g_strcmp0(method_name, "SetGoIntent")) {
+ int go_intent = 0;
+
+ g_variant_get(parameters, "(i)", &go_intent);
+ ret = wfd_manager_set_go_intent(go_intent);
+ if(ret < 0) {
+ WDS_LOGE("Failed to set GO intent");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "GetMaxClient")) {
+ int max_client = 0;
+
+ ret = wfd_manager_get_max_station(&max_client);
+ if (ret < 0) {
+ WDS_LOGE("Failed to get max station");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(ii)", ret, 0);
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(ii)", ret, max_client);
+
+ } else if (!g_strcmp0(method_name, "SetMaxClient")) {
+ int max_client = 0;
+ g_variant_get(parameters, "(i)", &max_client);
+
+ ret = wfd_manager_set_max_station(max_client);
+ if(ret < 0) {
+ WDS_LOGE("Failed to set max station");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "SetAutoConnectionMode")) {
+ gboolean mode = FALSE;
+
+ g_variant_get(parameters, "(b)", &mode);
+ ret = wfd_manager_set_autoconnection(mode);
+ if(ret < 0) {
+ WDS_LOGE("Failed to set autoconnection");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "IsAutoConnectionMode")) {
+ int mode = 0;
+
+ ret = wfd_manager_get_autoconnection(&mode);
+ if (ret < 0) {
+ WDS_LOGE("Failed to get autoconnection");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(ib)", ret, FALSE);
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(ib)", ret, mode);
+
+ } else if (!g_strcmp0(method_name, "GetOperatingChannel")) {
+ int channel = 0;
+
+ wfd_group_s *group = manager->group;
+ if (!group) {
+ WDS_LOGE("Group not exist");
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(ii)", ret, 0);
+ goto done;
+ }
+
+ channel = wfd_util_freq_to_channel(group->freq);
+ if (channel < 0) {
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(ii)", ret, 0);
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(ii)", ret, channel);
+
+ } else if (!g_strcmp0(method_name, "SetAutoConnectionPeer")) {
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else {
+ WDS_LOGD("method not handled");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ }
+
+done:
+ return ret;
+}
+
+#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
+static int __wfd_manager_service_iface_handler(const gchar *method_name,
+ GVariant *parameters,
+ GVariant **return_parameters)
+{
+ int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ wfd_manager_s *manager = wfd_get_manager();
+ WDS_LOGD("%s", method_name);
+
+ if (!g_strcmp0(method_name, "StartDiscovery")) {
+ const char *mac_address = NULL;
+ int service_type;
+ unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+ if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+ WDS_LOGE("Wi-Fi Direct is not activated.");
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ g_variant_get(parameters, "(i&s)", &service_type, &mac_address);
+ WDS_LOGD("Service type [%d]", service_type);
+ macaddr_atoe(mac_address, mac_addr);
+
+ ret = wfd_oem_start_service_discovery(manager->oem_ops,
+ mac_addr, service_type);
+ if (ret < 0) {
+ WDS_LOGE("Failed to start service discovery");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(i)", ret);
+
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_SERVICE_INTERFACE,
+ "DiscoveryStarted", NULL);
+
+ } else if (!g_strcmp0(method_name, "StopDiscovery")) {
+ const char *mac_address = NULL;
+ int service_type;
+ unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+ if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+ WDS_LOGE("Wi-Fi Direct is not activated.");
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ g_variant_get(parameters, "(i&s)", &service_type, &mac_address);
+ WDS_LOGD("Service type [%d]", service_type);
+ macaddr_atoe(mac_address, mac_addr);
+
+ ret = wfd_oem_cancel_service_discovery(manager->oem_ops,
+ mac_addr, service_type);
+ if (ret < 0) {
+ WDS_LOGE("Failed to cancel service discovery");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "Register")) {
+ int service_type;
+ int service_id = 0;
+ const char *info_str = NULL;
+
+ if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+ WDS_LOGE("Wi-Fi Direct is not activated.");
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(ii)", ret, service_id);
+ goto done;
+ }
+
+ g_variant_get(parameters, "(i&s)", &service_type, &info_str);
+ WDS_LOGD("Register service [%d: %s]", service_type, info_str);
+
+ ret = wfd_service_add(service_type, (char *)info_str, &service_id);
+ if (ret < 0) {
+ WDS_LOGE("Failed to add service");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(ii)", ret, service_id);
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(ii)", ret, service_id);
+
+ } else if (!g_strcmp0(method_name, "Deregister")) {
+ int service_id = 0;
+
+ if (manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+ WDS_LOGE("Wi-Fi Direct is not activated.");
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ g_variant_get(parameters, "(i)", &service_id);
+ WDS_LOGD("Service id [%d]", service_id);
+
+ ret = wfd_service_del(service_id);
+ if (ret < 0) {
+ WDS_LOGE("Failed to delete service");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else {
+ WDS_LOGD("method not handled");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ }
+
+done:
+ return ret;
+}
+#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
+
+#ifdef TIZEN_FEATURE_WIFI_DISPLAY
+static int __wfd_manager_display_iface_handler(const gchar *method_name,
+ GVariant *parameters,
+ GVariant **return_parameters)
+{
+ int ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ wfd_manager_s *manager = wfd_get_manager();
+ WDS_LOGD("%s", method_name);
+
+ if (!g_strcmp0(method_name, "Init")) {
+ if(manager->state < WIFI_DIRECT_STATE_ACTIVATED ||
+ manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ wfd_device_s * device = manager->local;
+
+ ret = wfd_oem_miracast_init(manager->oem_ops, TRUE);
+ if (ret < 0) {
+ WDS_LOGE("Failed to initialize display");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ device->display.type = WIFI_DISPLAY_DEFAULT_TYPE;
+ device->display.port = WIFI_DISPLAY_DEFAULT_PORT;
+ device->display.availability = WIFI_DISPLAY_DEFAULT_AVAIL;
+ device->display.hdcp_support = WIFI_DISPLAY_DEFAULT_HDCP;
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "Deinit")) {
+ if(manager->state < WIFI_DIRECT_STATE_ACTIVATED ||
+ manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ wfd_device_s * device = manager->local;
+
+ ret = wfd_oem_miracast_init(manager->oem_ops, FALSE);
+ if (ret < 0) {
+ WDS_LOGE("Failed to deinitialize display");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ memset(&(device->display), 0x0, sizeof(wfd_display_type_e));
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "SetConfig")) {
+ int type, port, hdcp;
+ g_variant_get(parameters, "(iii)", &type, &port, &hdcp);
+
+ if(manager->state < WIFI_DIRECT_STATE_ACTIVATED ||
+ manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ WDS_LOGD("type %d port %d hdcp %d", type, port, hdcp);
+
+ ret = wfd_manager_set_display_device(type, port, hdcp);
+ if(ret < 0) {
+ WDS_LOGE("Failed to set display device settings");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "SetAvailiability")) {
+ int availability;
+ g_variant_get(parameters, "(i)", &availability);
+
+ if(manager->state < WIFI_DIRECT_STATE_ACTIVATED ||
+ manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ ret = wfd_manager_set_session_availability(availability);
+ if (ret < 0) {
+ WDS_LOGE("Failed to set session availability");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ *return_parameters = g_variant_new("(i)", ret);
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(i)", ret);
+
+ } else if (!g_strcmp0(method_name, "GetPeerType")) {
+ wfd_device_s *peer = NULL;
+ const char *mac_address = NULL;
+ unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+ g_variant_get(parameters, "(&s)", &mac_address);
+ macaddr_atoe(mac_address, mac_addr);
+
+ if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(ii)", ret, 0);
+ goto done;
+ }
+
+ peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
+ if(!peer) {
+ WDS_LOGE("Failed to get peer");
+ ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
+ *return_parameters = g_variant_new("(ii)", ret, 0);
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(ii)", ret, peer->display.type);
+
+ } else if (!g_strcmp0(method_name, "GetPeerAvailability")) {
+ wfd_device_s *peer = NULL;
+ const char *mac_address = NULL;
+ unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+ g_variant_get(parameters, "(&s)", &mac_address);
+ macaddr_atoe(mac_address, mac_addr);
+
+ if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(ii)", ret, 0);
+ goto done;
+ }
+
+ peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
+ if(peer) {
+ WDS_LOGE("Failed to get peer");
+ ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
+ *return_parameters = g_variant_new("(ii)", ret, 0);
+ goto done;
+ }
+
+ *return_parameters = g_variant_new("(ii)", ret, peer->display.availability);
+ ret = WIFI_DIRECT_ERROR_NONE;
+
+ } else if (!g_strcmp0(method_name, "GetPeerHdcp")) {
+ wfd_device_s *peer = NULL;
+ const char *mac_address = NULL;
+ unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+ g_variant_get(parameters, "(&s)", &mac_address);
+ macaddr_atoe(mac_address, mac_addr);
+
+ if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(ii)", ret, 0);
+ goto done;
+ }
+
+ peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
+ if(peer) {
+ WDS_LOGE("Failed to get peer");
+ ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
+ *return_parameters = g_variant_new("(ii)", ret, 0);
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(ii)", ret, peer->display.hdcp_support);
+
+ } else if (!g_strcmp0(method_name, "GetPeerPort")) {
+ wfd_device_s *peer = NULL;
+ const char *mac_address = NULL;
+ unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+ g_variant_get(parameters, "(&s)", &mac_address);
+ macaddr_atoe(mac_address, mac_addr);
+
+ if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(ii)", ret, 0);
+ goto done;
+ }
+
+ peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
+ if(peer) {
+ WDS_LOGE("Failed to get peer");
+ ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
+ *return_parameters = g_variant_new("(ii)", ret, 0);
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(ii)", ret, peer->display.port);
+
+ } else if (!g_strcmp0(method_name, "GetPeerThroughput")) {
+ wfd_device_s *peer = NULL;
+ const char *mac_address = NULL;
+ unsigned char mac_addr[MACADDR_LEN] = {0, };
+
+ g_variant_get(parameters, "(&s)", &mac_address);
+ macaddr_atoe(mac_address, mac_addr);
+
+ if(manager->state < WIFI_DIRECT_STATE_ACTIVATED) {
+ ret = WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ *return_parameters = g_variant_new("(ii)", ret, 0);
+ goto done;
+ }
+
+ peer = wfd_manager_get_peer_by_addr(manager, mac_addr);
+ if(peer) {
+ WDS_LOGE("Failed to get peer");
+ ret = WIFI_DIRECT_ERROR_INVALID_PARAMETER;
+ *return_parameters = g_variant_new("(ii)", ret, 0);
+ goto done;
+ }
+
+ ret = WIFI_DIRECT_ERROR_NONE;
+ *return_parameters = g_variant_new("(ii)", ret, peer->display.max_tput);
+
+ } else {
+ WDS_LOGD("method not handled");
+ ret = WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ }
+
+done:
+ return ret;
+}
+#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+
+static struct {
+ guint reg_id;
+ const gchar *iface_name;
+ int (*function) (const gchar *method_name,
+ GVariant *parameters,
+ GVariant **return_parameters);
+} wfd_manager_iface_map[] = {
+ {
+ 0,
+ WFD_MANAGER_MANAGE_INTERFACE,
+ __wfd_manager_manage_iface_handler
+ },
+ {
+ 0,
+ WFD_MANAGER_GROUP_INTERFACE,
+ __wfd_manager_group_iface_handler
+ },
+ {
+ 0,
+ WFD_MANAGER_CONFIG_INTERFACE,
+ __wfd_manager_config_iface_handler
+ },
+#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
+ {
+ 0,
+ WFD_MANAGER_SERVICE_INTERFACE,
+ __wfd_manager_service_iface_handler
+ },
+#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
+#ifdef TIZEN_FEATURE_WIFI_DISPLAY
+ {
+ 0,
+ WFD_MANAGER_DISPLAY_INTERFACE,
+ __wfd_manager_display_iface_handler
+ },
+#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+ {
+ 0,
+ NULL,
+ NULL
+ }
+};
+
+// GDBus method handler
+static void wfd_manager_method_call_handler (GDBusConnection *connection,
+ const gchar *sender,
+ const gchar *object_path,
+ const gchar *interface_name,
+ const gchar *method_name,
+ GVariant *parameters,
+ GDBusMethodInvocation *invocation,
+ gpointer user_data)
+{
+ int count = 0;
+ GVariant *return_parameters = NULL;
+
+ /* Method Call */
+ WDS_LOGD("interface : [%s], method : [%s]", interface_name, method_name);
+ WDS_LOGD("param [%s]", parameters ? g_variant_print(parameters, TRUE) : "NULL");
+
+ while (wfd_manager_iface_map[count].iface_name != NULL) {
+ if (!g_strcmp0(interface_name, wfd_manager_iface_map[count].iface_name)) {
+
+ wfd_manager_iface_map[count].function(method_name,
+ parameters,
+ &return_parameters);
+ break;
+ }
+ count++;
+ }
+
+ g_dbus_method_invocation_return_value(invocation, return_parameters);
+}
+
+static const GDBusInterfaceVTable wfd_manager_interface_vtable =
+ {wfd_manager_method_call_handler, NULL, NULL};
+
+void wfd_manager_dbus_unregister(void)
+{
+ int count = 0;
+
+ while (wfd_manager_iface_map[count].iface_name != NULL) {
+ wfd_manager_dbus_iface_unregister(wfd_manager_iface_map[count].reg_id);
+ count++;
+ }
+
+ wfd_manager_dbus_deinit();
+}
+
+gboolean wfd_manager_dbus_register(void)
+{
+ int count = 0;
+
+ if (wfd_manager_dbus_init() == 0)
+ return FALSE;
+
+ while (wfd_manager_iface_map[count].iface_name != NULL) {
+ wfd_manager_iface_map[count].reg_id =
+ wfd_manager_dbus_iface_register(wfd_manager_iface_map[count].iface_name,
+ WFD_MANAGER_PATH,
+ wfd_manager_introspection_xml,
+ &wfd_manager_interface_vtable);
+
+ WDS_LOGD("Registered Interface [%d, %s]",
+ wfd_manager_iface_map[count].reg_id,
+ wfd_manager_iface_map[count].iface_name);
+
+ count++;
+ }
+
+ return TRUE;
+}
#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"
+
wfd_manager_s *g_manager;
return g_manager;
}
-static gboolean _wfd_exit_timeout_cb(void *user_data)
-{
- __WDS_LOG_FUNC_ENTER__;
- wfd_manager_s *manager = (wfd_manager_s*) user_data;
-
- if (!manager) {
- WDS_LOGE("Invalid parameter");
- return TRUE;
- }
-
- if (manager->client_count > 0) {
- WDS_LOGD("Client count [%d]", manager->client_count);
- return TRUE;
- }
-
- if (manager->state == WIFI_DIRECT_STATE_DEACTIVATED) {
- WDS_LOGD("Terminate Wi-Fi Direct Manager");
- g_main_quit(manager->main_loop);
- }
- manager->exit_timer = 0;
- WDS_LOGD( "Stop exit timer. State [%d]", manager->state);
-
- __WDS_LOG_FUNC_EXIT__;
- return FALSE;
-}
-
static int _wfd_local_init_device(wfd_manager_s *manager)
{
__WDS_LOG_FUNC_ENTER__;
return 1;
}
+ if (manager->state == WIFI_DIRECT_STATE_ACTIVATING) {
+ WDS_LOGE("In progress");
+ 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)
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__;
+ 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__;
+ 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_LOG_FUNC_EXIT__;
return WIFI_DIRECT_ERROR_NOT_PERMITTED;
}
manager->req_wps_mode, SESSION_DIRECTION_OUTGOING);
if (!session) {
WDS_LOGE("Failed to create new session");
+ __WDS_LOG_FUNC_EXIT__;
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
}
}
if (res < 0) {
WDS_LOGE("Failed to start session");
wfd_destroy_session(manager);
+ __WDS_LOG_FUNC_EXIT__;
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
}
wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTING);
return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
}
+ if (!manager->session && manager->state != WIFI_DIRECT_STATE_CONNECTING) {
+ WDS_LOGE("It's not CONNECTING state");
+ return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ }
+
res = wfd_session_cancel(manager->session, peer_addr);
if (res < 0) {
WDS_LOGE("Failed to cancel session");
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");
+ return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ }
+
res = wfd_session_reject(session, peer_addr);
if (res < 0) {
WDS_LOGE("Failed to reject connection");
return WIFI_DIRECT_ERROR_INVALID_PARAMETER;
}
+ if (!manager->group || manager->state < WIFI_DIRECT_STATE_CONNECTED) {
+ if (WIFI_DIRECT_STATE_DISCOVERING == manager->state) {
+ res = wfd_oem_stop_scan(manager->oem_ops);
+ if (res < 0) {
+ WDS_LOGE("Failed to stop scan");
+ return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ }
+ WDS_LOGI("Succeeded to stop scan");
+
+ if (WFD_DEV_ROLE_GO == manager->local->dev_role) {
+ wfd_state_set(manager, WIFI_DIRECT_STATE_GROUP_OWNER);
+ 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);
+ }
+ } else {
+ WDS_LOGE("It's not permitted with this state [%d]", manager->state);
+ return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ }
+ }
+
group = (wfd_group_s*) manager->group;
if (!group) {
WDS_LOGE("Group not found");
#endif /* TIZEN_FEATURE_WIFI_DISPLAY */
+int wfd_manager_start_discovery(wfd_manager_s *manager, int mode, int timeout,
+ const char* type, int channel)
+{
+ __WDS_LOG_FUNC_ENTER__;
+ 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]", mode, timeout, type, channel);
+
+ if (manager->local->dev_role == WFD_DEV_ROLE_GO)
+ param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
+
+ if (channel == WFD_DISCOVERY_FULL_SCAN) {
+ param.scan_type = WFD_OEM_SCAN_TYPE_FULL;
+ } else if (channel == WFD_DISCOVERY_SOCIAL_CHANNEL) {
+ param.scan_type = WFD_OEM_SCAN_TYPE_SOCIAL;
+ } else if (channel == WFD_DISCOVERY_CHANNEL1) {
+ param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL1;
+ param.freq = 2412;
+ } else if (channel == WFD_DISCOVERY_CHANNEL6) {
+ param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL6;
+ param.freq = 2437;
+ } else if (channel == WFD_DISCOVERY_CHANNEL11) {
+ param.scan_type = WFD_OEM_SCAN_TYPE_CHANNEL11;
+ param.freq = 2462;
+ } else {
+ param.scan_type = WFD_OEM_SCAN_TYPE_SPECIFIC;
+ 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 start scan");
+ __WDS_LOG_FUNC_EXIT__;
+ return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ }
+
+ 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_LOGD("Succeeded to start scan");
+ __WDS_LOG_FUNC_EXIT__;
+ return WIFI_DIRECT_ERROR_NONE;
+}
+
+int wfd_manager_cancel_discovery(wfd_manager_s *manager)
+{
+ __WDS_LOG_FUNC_ENTER__;
+ int res = 0;
+
+ if (manager->state != WIFI_DIRECT_STATE_ACTIVATED &&
+ manager->state != WIFI_DIRECT_STATE_DISCOVERING) {
+ __WDS_LOG_FUNC_EXIT__;
+ return WIFI_DIRECT_ERROR_NOT_PERMITTED;
+ }
+
+ res = wfd_oem_stop_scan(manager->oem_ops);
+ if (res < 0) {
+ WDS_LOGE("Failed to stop scan");
+ __WDS_LOG_FUNC_EXIT__;
+ return WIFI_DIRECT_ERROR_OPERATION_FAILED;
+ }
+
+ 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 {
+ wfd_state_set(manager, WIFI_DIRECT_STATE_ACTIVATED);
+ wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_ACTIVATED);
+ }
+
+ WDS_LOGD("Succeeded to stop scan");
+ __WDS_LOG_FUNC_EXIT__;
+ return WIFI_DIRECT_ERROR_NONE;
+}
+
wfd_device_s *wfd_manager_get_peer_by_addr(wfd_manager_s *manager, unsigned char *peer_addr)
{
__WDS_LOG_FUNC_ENTER__;
}
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");
-
__WDS_LOG_FUNC_EXIT__;
return manager;
}
return -1;
}
- if (manager->exit_timer > 0)
- g_source_remove(manager->exit_timer);
- manager->exit_timer = 0;
-
_wfd_local_deinit_device(manager);
g_free(manager);
{
__WDS_LOG_FUNC_ENTER__;
GMainLoop *main_loop = NULL;
- int res = 0;
#if !GLIB_CHECK_VERSION(2,32,0)
if (!g_thread_supported())
// 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_LOGD("Succeeded to initialize manager");
+ /**
+ * wfd_manager_plugin initialization
+ */
g_manager->plugin_handle = wfd_plugin_init(g_manager);
if (!g_manager->plugin_handle) {
WDS_LOGE("Failed to initialize plugin");
}
WDS_LOGD("Succeeded to load plugin");
- res = wfd_client_handler_init(g_manager);
- if (res < 0) {
- WDS_LOGE("Failed to initialize client handler");
- wfd_plugin_deinit(g_manager);
- wfd_manager_deinit(g_manager);
- __WDS_LOG_FUNC_EXIT__;
- return -1;
- }
- WDS_LOGD("Succeeded to initialize client handler");
+ wfd_manager_dbus_register();
main_loop = g_main_loop_new(NULL, FALSE);
if (main_loop == NULL) {
return -1;
}
g_manager->main_loop = main_loop;
-
g_main_loop_run(main_loop);
- wfd_client_handler_deinit(g_manager);
+ wfd_manager_dbus_unregister();
+
wfd_plugin_deinit(g_manager);
wfd_manager_deinit(g_manager);
#include "wifi-direct-util.h"
#include "wifi-direct-peer.h"
#include "wifi-direct-session.h"
+#include "wifi-direct-log.h"
wfd_device_s *wfd_add_peer(void *data, unsigned char *dev_addr, char *dev_name)
#include "wifi-direct-oem.h"
#include "wifi-direct-service.h"
#include "wifi-direct-util.h"
+#include "wifi-direct-log.h"
int wfd_service_add(int type, char *info_str, int *service_id)
#include "wifi-direct-oem.h"
#include "wifi-direct-util.h"
#include "wifi-direct-session.h"
-#include "wifi-direct-client.h"
#include "wifi-direct-state.h"
+#include "wifi-direct-error.h"
+#include "wifi-direct-log.h"
+#include "wifi-direct-dbus.h"
static gboolean _session_timeout_cb(gpointer *user_data)
__WDS_LOG_FUNC_ENTER__;
wfd_manager_s *manager = wfd_get_manager();
wfd_session_s *session = (wfd_session_s*) manager->session;
- wifi_direct_client_noti_s noti;
unsigned char *peer_addr = NULL;
+ char peer_mac_address[MACSTR_LEN+1] = {0, };
if (!session) {
WDS_LOGE("Invalid parameter");
WDS_LOGD("Session timer expired");
peer_addr = wfd_session_get_peer_addr(session);
-
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_CONNECTION_TIME_OUT;
if(peer_addr != NULL)
- g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
- wfd_client_send_event(manager, ¬i);
+ g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+ else
+ g_snprintf(peer_mac_address, MACSTR_LEN, "%s", "");
+
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Connection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_TIME_OUT,
+ WFD_EVENT_CONNECTION_RSP,
+ peer_mac_address));
wfd_session_cancel(session, peer_addr);
static void _wfd_notify_session_failed(wfd_manager_s *manager, unsigned char *peer_addr)
{
__WDS_LOG_FUNC_ENTER__;
- wifi_direct_client_noti_s noti;
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_CONNECTION_FAILED;
- snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+ char peer_mac_address[MACSTR_LEN+1] = {0, };
+
+ snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Connection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_CONNECTION_FAILED,
+ WFD_EVENT_CONNECTION_RSP,
+ peer_mac_address));
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);
}
- wfd_client_send_event(manager, ¬i);
__WDS_LOG_FUNC_EXIT__;
}
if (session->type == SESSION_TYPE_INVITE) {
WDS_LOGD("Start WPS corresponding to OEM event [%d]", event->event_id);
if (session->wps_mode != WFD_WPS_MODE_PBC) {
- wifi_direct_client_noti_s noti;
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ;
- g_snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
- wfd_client_send_event(manager, ¬i);
+ char peer_mac_address[MACSTR_LEN+1] = {0, };
+
+ g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Connection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+ WFD_EVENT_CONNECTION_WPS_REQ,
+ peer_mac_address));
if (session->wps_mode == WFD_WPS_MODE_KEYPAD) {
/* We have to wait until user type PIN using Keypad */
break;
if (res < 0)
_wfd_notify_session_failed(manager, event->dev_addr);
} else {
- wifi_direct_client_noti_s noti;
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
- wfd_client_send_event(manager, ¬i);
+ char peer_mac_address[MACSTR_LEN+1] = {0, };
+
+ g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Connection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+ WFD_EVENT_CONNECTION_REQ,
+ peer_mac_address));
}
}
break;
WDS_LOGD("Local WPS mode is %d", session->wps_mode);
if (session->wps_mode != WFD_WPS_MODE_PBC) {
- wifi_direct_client_noti_s noti;
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_WPS_REQ;
- g_snprintf(noti.param1, sizeof(noti.param1), MACSTR, MAC2STR(event->dev_addr));
- wfd_client_send_event(manager, ¬i);
+ char peer_mac_address[MACSTR_LEN+1] = {0, };
+
+ g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Connection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+ WFD_EVENT_CONNECTION_WPS_REQ,
+ peer_mac_address));
if (session->wps_mode == WFD_WPS_MODE_KEYPAD) {
/* We have to wait until user type PIN using Keypad */
break;
#include "wifi-direct-manager.h"
#include "wifi-direct-state.h"
#include "wifi-direct-util.h"
+#include "wifi-direct-log.h"
+
static char *_wfd_state_string(int state)
{
#include "wifi-direct-ipc.h"
#include "wifi-direct-manager.h"
#include "wifi-direct-state.h"
-#include "wifi-direct-client.h"
#include "wifi-direct-util.h"
#include "wifi-direct-oem.h"
#include "wifi-direct-group.h"
#include "wifi-direct-session.h"
+#include "wifi-direct-error.h"
+#include "wifi-direct-log.h"
+#include "wifi-direct-dbus.h"
#ifdef TIZEN_FEATURE_IP_OVER_EAPOL
#include <linux/unistd.h>
res_wifi = wfd_util_check_wifi_state();
if (res_wifi < 0) {
WDS_LOGE("Failed to check Wi-Fi state");
+ __WDS_LOG_FUNC_EXIT__;
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
} else if (res_wifi > 0) {
WDS_LOGE("Wi-Fi is On");
+ __WDS_LOG_FUNC_EXIT__;
return WIFI_DIRECT_ERROR_WIFI_USED;
} else {
WDS_LOGE("Wi-Fi is Off");
+ __WDS_LOG_FUNC_EXIT__;
return WIFI_DIRECT_ERROR_NONE;
}
#endif
res_mobap = wfd_util_check_mobile_ap_state();
if (res_mobap < 0) {
WDS_LOGE("Failed to check Mobile AP state");
+ __WDS_LOG_FUNC_EXIT__;
return WIFI_DIRECT_ERROR_OPERATION_FAILED;
} else if (res_mobap > 0) {
WDS_LOGE("Mobile AP is On");
+ __WDS_LOG_FUNC_EXIT__;
return WIFI_DIRECT_ERROR_MOBILE_AP_USED;
} else {
WDS_LOGE("Mobile AP is Off");
+ __WDS_LOG_FUNC_EXIT__;
return WIFI_DIRECT_ERROR_NONE;
}
#endif
+ __WDS_LOG_FUNC_EXIT__;
return WIFI_DIRECT_ERROR_NONE;
}
static void _dhcps_ip_leased_cb(keynode_t *key, void* data)
{
__WDS_LOG_FUNC_ENTER__;
- wfd_manager_s *manager = wfd_get_manager();
wfd_device_s *peer = (wfd_device_s*) data;
- wifi_direct_client_noti_s noti;
FILE *fp = NULL;
char buf[MAX_DHCP_DUMP_SIZE];
char ip_str[IPSTR_LEN] = {0, };
char intf_str[MACSTR_LEN];
unsigned char intf_addr[MACADDR_LEN];
+ char peer_mac_address[MACSTR_LEN+1] = {0,};
+ char assigned_ip_address[IPSTR_LEN+1] = {0,};
int n = 0;
if (!peer) {
return;
}
WDS_LOGD("DHCP server: IP leased");
- memset(¬i, 0, sizeof(wifi_direct_client_noti_s));
errno = 0;
fp = fopen(DHCP_DUMP_FILE, "r");
WDS_LOGD("Peer intf mac found");
_txt_to_ip(ip_str, peer->ip_addr);
_connect_remote_device(ip_str);
- noti.event = WIFI_DIRECT_CLI_EVENT_IP_LEASED_IND;
- snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
- snprintf(noti.param2, IPSTR_LEN, IPSTR, IP2STR(peer->ip_addr));
- wfd_client_send_event(manager, ¬i);
+ g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
+ g_snprintf(assigned_ip_address, IPSTR_LEN, IPSTR, IP2STR(peer->ip_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "PeerIPAssigned",
+ g_variant_new("(ss)", peer_mac_address,
+ assigned_ip_address));
break;
} else {
WDS_LOGD("Different interface address peer[" MACSECSTR "] vs dhcp[" MACSECSTR "]",
wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
wfd_destroy_session(manager);
- wifi_direct_client_noti_s noti;
- memset(¬i, 0x0, sizeof(wifi_direct_client_noti_s));
- noti.event = WIFI_DIRECT_CLI_EVENT_CONNECTION_RSP;
- noti.error = WIFI_DIRECT_ERROR_NONE;
- snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
- wfd_client_send_event(manager, ¬i);
+ char peer_mac_address[MACSTR_LEN+1] = {0, };
+
+ g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
+ wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
+ "Connection",
+ g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
+ WFD_EVENT_CONNECTION_RSP,
+ peer_mac_address));
__WDS_LOG_FUNC_EXIT__;
return FALSE;
__WDS_LOG_FUNC_ENTER__;
int res = 0;
unsigned char ip_addr[IPADDR_LEN];
- char error_buf[MAX_SIZE_ERROR_BUFFER] = {};
+ char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
int if_index;
int nl_sock = -1;