SET(INCLUDEDIR "\${prefix}/include")
INCLUDE(FindPkgConfig)
-pkg_check_modules(pkgs REQUIRED capi-network-wifi-direct glib-2.0 gio-2.0 gobject-2.0 dlog libnl-2.0 capi-appfw-application vconf cynara-client cynara-creds-socket cynara-session ${MDM_REQUIRED_PKGS})
+pkg_check_modules(pkgs REQUIRED capi-network-wifi-direct glib-2.0 gio-2.0 gobject-2.0 dlog libnl-2.0 capi-appfw-application vconf cynara-client cynara-creds-socket cynara-session aul${MDM_REQUIRED_PKGS})
FOREACH(flag ${pkgs_CFLAGS})
SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
ENDFOREACH(flag)
ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"")
ADD_DEFINITIONS("-DUSE_DLOG")
+IF(TIZEN_WLAN_BOARD_SPRD)
+ ADD_DEFINITIONS(-DTIZEN_WLAN_BOARD_SPRD)
+ENDIF(TIZEN_WLAN_BOARD_SPRD)
IF(TIZEN_TETHERING_ENABLE)
ADD_DEFINITIONS(-DTIZEN_TETHERING_ENABLE)
ENDIF(TIZEN_TETHERING_ENABLE)
-
+IF(TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT)
+ ADD_DEFINITIONS(-DTIZEN_FEATURE_DEFAULT_CONNECTION_AGENT)
+ENDIF(TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT)
IF(TIZEN_FEATURE_SERVICE_DISCOVERY)
ADD_DEFINITIONS(-DTIZEN_FEATURE_SERVICE_DISCOVERY)
ENDIF(TIZEN_FEATURE_SERVICE_DISCOVERY)
INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/bundle/dhcpd-notify.sh DESTINATION bin)
INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/bundle/wifi-direct-dhcp.sh DESTINATION bin)
ELSE(TIZEN_WIFI_MODULE_BUNDLE)
+ INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/common/dhcpd-notify.sh DESTINATION bin)
+IF(TIZEN_WLAN_BOARD_SPRD)
+ INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/TM1/p2p_supp.conf DESTINATION etc/wifi-direct)
+ INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/TM1/p2p_supp.conf DESTINATION /opt/etc)
+ INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/TM1/dhcpd.p2p.conf DESTINATION etc/wifi-direct)
+ INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/TM1/wifi-direct-dhcp.sh DESTINATION bin)
+ELSE(TIZEN_WLAN_BOARD_SPRD)
INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/common/p2p_supp.conf DESTINATION etc/wifi-direct)
INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/common/p2p_supp.conf DESTINATION /opt/etc)
INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/common/dhcpd.p2p.conf DESTINATION etc/wifi-direct)
- INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/common/dhcpd-notify.sh DESTINATION bin)
INSTALL(FILES ${CMAKE_SOURCE_DIR}/files/common/wifi-direct-dhcp.sh DESTINATION bin)
+ENDIF(TIZEN_WLAN_BOARD_SPRD)
ENDIF(TIZEN_WIFI_MODULE_BUNDLE)
IF("${ARCH}" MATCHES "^arm.*|.*86.*")
--- /dev/null
+start 192.168.49.20 #default: 192.168.0.20
+end 192.168.49.40 #default: 192.168.0.254
+interface p2p0 #default: wlan0
+max_leases 20 #default: 254
+notify_file /usr/bin/dhcpd-notify.sh
+
+option subnet 255.255.255.0
+option router 192.168.49.1
+option lease 864000 #10 days of seconds
+option broadcast 192.168.49.255
--- /dev/null
+##### p2p_supplicant configuration file template #####
+update_config=1
+eapol_version=1
+ap_scan=1
--- /dev/null
+#!/bin/sh
+INTERFACE_NAME="p2p0"
+INTERFACE_PREFIX="p2p"
+TARGET="TM1"
+DEFAULT_IP="192.168.49.1"
+DEFAULT_NET="192.168.49.1/24"
+DEFAULT_BRD="192.168.49.255"
+
+interface=`/sbin/ifconfig|/bin/grep ^${INTERFACE_NAME}|/usr/bin/cut -d" " -f1`
+#interface=`/sbin/ifconfig|/bin/grep ^${INTERFACE_NAME}|/usr/bin/cut -d":" -f1`
+#interface=`/usr/sbin/ip link|/bin/grep ^${INTERFACE_NAME}|/usr/bin/cut -d":" -f2`
+echo "Target is ${TARGET} and interface ${INTERFACE_PREFIX}: ${interface}."
+
+start_dhcp_server()
+{
+ if [ "X${interface}" == "X" ]; then
+ echo "interface(${INTERFACE_PREFIX}) is not up"
+ return 0
+ fi
+
+ /usr/sbin/ip addr add ${DEFAULT_NET} brd ${DEFAULT_BRD} dev ${interface}
+ /usr/sbin/dhcpd /usr/etc/wifi-direct/dhcpd.${INTERFACE_PREFIX}.conf -f &
+
+ route=`/bin/cat /usr/etc/wifi-direct/dhcpd.${INTERFACE_PREFIX}.conf | /bin/grep router | /bin/awk '{print $3}'`
+ if [ -z $route ]; then
+ route="192.168.49.1"
+ fi
+ subnet=`/bin/cat /usr/etc/wifi-direct/dhcpd.${INTERFACE_PREFIX}.conf | /bin/grep subnet | /bin/awk '{print $3}'`
+
+ if [ -z $subnet ]; then
+ subnet="255.255.255.0"
+ fi
+
+ /usr/bin/vconftool set -t string memory/private/wifi_direct_manager/p2p_ifname ${interface} -f
+ /usr/bin/vconftool set -t string memory/private/wifi_direct_manager/p2p_subnet_mask ${subnet} -f
+ /usr/bin/vconftool set -t string memory/private/wifi_direct_manager/p2p_gateway ${route} -f
+ /usr/bin/vconftool set -t string memory/private/wifi_direct_manager/p2p_local_ip ${DEFAULT_IP} -f
+}
+
+start_dhcp_client()
+{
+ if [ "X${interface}" == "X" ]; then
+ echo "interface(${INTERFACE_PREFIX}) is not up"
+ return 0
+ fi
+ /usr/bin/dhcp -i $interface -s /usr/etc/wifi-direct/udhcp_script.non-autoip &
+}
+
+
+stop_dhcp()
+{
+ /usr/bin/vconftool set -t string memory/private/wifi_direct_manager/p2p_ifname "" -f
+ /usr/bin/vconftool set -t string memory/private/wifi_direct_manager/p2p_subnet_mask "" -f
+ /usr/bin/vconftool set -t string memory/private/wifi_direct_manager/p2p_gateway "" -f
+ /usr/bin/vconftool set -t string memory/private/wifi_direct_manager/p2p_local_ip "" -f
+ /usr/bin/vconftool set -t string memory/private/wifi_direct_manager/dhcpc_server_ip "0.0.0.0" -f
+
+ /usr/bin/pkill -x dhcp
+ /usr/bin/pkill -x dhcpd
+ /sbin/ifconfig ${interface} 0.0.0.0
+}
+
+is_running()
+{
+ program=$1
+ run=`/bin/ps -eo comm|/bin/grep ${program}`
+ if [ "X${run}" == "X" ]; then
+ echo "${program} is not running"
+ else
+ echo "${program} is already running"
+ fi
+}
+
+status_dhcp()
+{
+ is_running /usr/bin/dhcp
+ is_running /usr/sbin/dhcpd
+}
+
+
+case $1 in
+"server")
+stop_dhcp
+start_dhcp_server
+;;
+"client")
+stop_dhcp
+start_dhcp_client
+;;
+"stop")
+stop_dhcp
+;;
+"status")
+status_dhcp
+;;
+*)
+/bin/echo wifi-direct-dhcp.sh [server] [client] [stop] [status]
+exit 1
+;;
+esac
+
stop()
{
- /usr/bin/killall wpa_supplicant
+ /usr/bin/pkill -x wpa_supplicant
}
case $1 in
#define DEFAULT_DEVICE_NAME "Tizen_Device"
#if defined TIZEN_MOBILE
+#if defined TIZEN_WLAN_BOARD_SPRD
+#define DEFAULT_IFNAME "p2p0"
+#define GROUP_IFNAME "p2p0"
+#else /* TIZEN_WLAN_BOARD_SPRD */
#define DEFAULT_IFNAME "wlan0"
#define GROUP_IFNAME "p2p-wlan0-0"
+#endif /* TIZEN_WLAN_BOARD_SPRD */
#endif
#if defined TIZEN_WIFI_MODULE_BUNDLE
} wfd_service_s;
-int wfd_service_add(GList **services, int type, char *data, int *service_id);
-int wfd_service_del(GList *services, int service_id);
+int wfd_service_add(int type, char *data, int *service_id);
+int wfd_service_del(int service_id);
#if 0
int wfd_service_disc_req(unsigned char *addr, int type, char *data);
int wfd_service_disc_cancel(int handle);
#endif
int wfd_util_set_wifi_direct_state(int state);
int wfd_util_get_local_dev_mac(unsigned char *dev_mac);
+
+#ifdef TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT
int wfd_util_start_wifi_direct_popup();
+int wfd_util_stop_wifi_direct_popup();
+#endif /* TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT */
+
int wfd_util_dhcps_start();
int wfd_util_dhcps_wait_ip_leased(wfd_device_s *peer);
int wfd_util_dhcps_stop();
int wfd_util_get_local_ip(unsigned char* ip_addr);
#ifdef CTRL_IFACE_DBUS
-#ifdef TIZEN_VENDOR_ATH
+#ifdef TIZEN_WLAN_BOARD_SPRD
int wfd_util_static_ip_unset(const char *ifname);
-#endif /* TIZEN_VENDOR_ATH */
+#endif /* TIZEN_WLAN_BOARD_SPRD */
/*TODO: ODROID Image does not have support libnl-2.0*/
int wfd_util_ip_over_eap_assign(wfd_device_s *peer, const char *ifname);
int wfd_util_ip_over_eap_lease(wfd_device_s *peer);
WFD_OEM_SERVICE_TYPE_UPNP,
WFD_OEM_SERVICE_TYPE_WS_DISCOVERY,
WFD_OEM_SERVICE_TYPE_WIFI_DISPLAY,
- WFD_OEM_SERVICE_TYPE_BT_ADDR,
- WFD_OEM_SERVICE_TYPE_CONTACT_INFO,
WFD_OEM_SERVICE_TYPE_VENDOR = 0xff,
} wfd_oem_service_type_e;
Name: wifi-direct-manager
Summary: Wi-Fi Direct manger
-Version: 1.2.102
+Version: 1.2.103
Release: 1
Group: Network & Connectivity/Wireless
License: Apache-2.0
BuildRequires: pkgconfig(vconf)
BuildRequires: pkgconfig(libnl-2.0)
BuildRequires: pkgconfig(dbus-1)
+BuildRequires: pkgconfig(aul)
BuildRequires: pkgconfig(cynara-client)
BuildRequires: pkgconfig(cynara-creds-socket)
BuildRequires: pkgconfig(cynara-session)
-DTIZEN_FEATURE_WIFI_DISPLAY=0 \
%else
%if "%{profile}" == "mobile"
+%if "%{?tizen_target_name}" == "Z300H"
+ -DTIZEN_WLAN_BOARD_SPRD=1 \
+%endif
-DTIZEN_FEATURE_SERVICE_DISCOVERY=1 \
-DTIZEN_WLAN_CONCURRENT_ENABLE=1 \
-DTIZEN_FEATURE_WIFI_DISPLAY=1 \
+ -DTIZEN_FEATURE_DEFAULT_CONNECTION_AGENT=0 \
-DCTRL_IFACE_DBUS=1 \
-DTIZEN_MOBILE=1 \
%else
if (key) {
if (strcmp(key, "Properties") == 0) {
- WDP_LOGE("Properties");
+ WDP_LOGD("Properties");
GVariantIter *iter_raw = NULL;
g_variant_get(value, "a{sv}", &iter_raw);
dbus_property_foreach(iter_raw, function, user_data);
} else if (function) {
- WDP_LOGE("function");
+ WDP_LOGD("function");
function(key, value, user_data);
}
WDP_LOGE("do nothing");
}
g_variant_unref(reply);
} else{
- WDP_LOGE("No properties");
+ WDP_LOGD("No properties");
}
if(function)
function(NULL, NULL, user_data);
#if defined TIZEN_MOBILE
#define COMMON_IFACE_NAME "wlan0"
+#if defined TIZEN_WLAN_BOARD_SPRD
+#define P2P_IFACE_NAME "p2p0"
+#define GROUP_IFACE_NAME "p2p0"
+#define GROUP_IFACE_PREFIX "p2p"
+#else /* TIZEN_WLAN_BOARD_SPRD */
#define GROUP_IFACE_NAME "p2p-wlan0-0"
#define GROUP_IFACE_PREFIX "p2p-wlan0-"
+#endif /* TIZEN_WLAN_BOARD_SPRD */
#define PRIMARY_DEVICE_TYPE "\x00\x0a\x00\x50\xf2\x04\x00\x05"
#define DEFAULT_DEVICE_NAME "Tizen"
#define DEFAULT_GO_INTENT 7
#define DEFAULT_LISTEN_CHANNEL 1
#define DEFAULT_OPER_REG_CLASS 81
#define DEFAULT_OPER_CHANNEL 1
-#define DEFAULT_CONFIG_METHOD "push_button"
+#define DEFAULT_CONFIG_METHOD "display push_button keypad"
#define DEFAULT_NO_GROUP_IFACE 0
#endif
#define WS_MAX_SERVICE_LEN 1024
#define SERVICE_QUERY_LEN 4
-#define SERVICE_TYPE_BT_ADDR "0000f00b"
#define SERVICE_TYPE_ALL "0000f00c"
-#define SERVICE_TYPE_CONTACT_INFO "0000f00d"
#define SERV_BROADCAST_ADDRESS "00:00:00:00:00:00"
#define WS_QTYPE_PTR 0x0c
return num;
}
-static int __ws_hex_to_txt(char *src, int length, char *dest)
-{
- // TODO: check it is good to change dest parameter as double pointer.
- // It could be better to allocate memory for dest parameter here.
- char *temp = NULL;
- char *ptr = NULL;
- int len = 0;
- int i = 0;
-
- if (!src || length < 0 || !dest) {
- WDP_LOGE("Invalid parameter");
- return -1;
- }
-
- // TODO: flush destination memory
-
- ptr = src;
- temp = dest;
-
- if (!length)
- len = strlen(src);
- else
- len = length;
-
- for (i=0; i<len/2 && *ptr!=0; i++) {
- temp[i] = (char) __ws_hex_to_num(ptr, 2);
- if (temp[i] < 0) {
- WDP_LOGE("Failed to convert hexa string to num");
- return -1;
- }
- ptr += 2;
- }
-
- return 0;
-}
-
static int __ws_segment_to_service(char *segment, wfd_oem_new_service_s **service)
{
wfd_oem_new_service_s *serv_tmp = NULL;
WDP_LOGD("Query: %s", serv_tmp->data.bonjour.query);
WDP_LOGD("RData: %s", serv_tmp->data.bonjour.rdata);
- } else if (serv_tmp->protocol == WFD_OEM_SERVICE_TYPE_VENDOR) {
- WDP_LOGD("===== Vendor specific service =====");
- if (!strncmp(ptr, "0000f00b", 8)) {
- WDP_LOGD("\tSAMSUNG_BT_ADDR");
- ptr += 16;
- serv_tmp->protocol = WFD_OEM_SERVICE_TYPE_BT_ADDR;
- serv_tmp->data.vendor.data1 = (char*) calloc(1, 9);
- g_strlcpy(serv_tmp->data.vendor.data1, "0000f00b", 9);
- serv_tmp->data.vendor.data2 = (char*) calloc(1, 18);
- __ws_hex_to_txt(ptr, 0, serv_tmp->data.vendor.data2);
- }
- WDP_LOGD("Info1: %s", serv_tmp->data.vendor.data1);
- WDP_LOGD("Info2: %s", serv_tmp->data.vendor.data2);
} else {
- WDP_LOGE("Not supported yet. Only bonjour and samsung vendor service supproted [%d]",
+ WDP_LOGE("Not supported yet. Only bonjour service supproted [%d]",
serv_tmp->protocol);
g_free(serv_tmp);
return -1;
static void __ws_path_to_addr(char *peer_path,
unsigned char *dev_addr, GVariant *parameter)
{
+ __WDP_LOG_FUNC_ENTER__;
+
static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
const char *path = NULL;
char *loc = NULL;
WDP_LOGD("Retrive Added path [%s]", peer_path);
loc = strrchr(peer_path,'/');
- __ws_mac_compact_to_normal(loc + 1, peer_dev);
+ if(loc != NULL)
+ __ws_mac_compact_to_normal(loc + 1, peer_dev);
__ws_txt_to_mac(peer_dev, dev_addr);
WDP_LOGD("peer mac [" MACSTR "]", MAC2STR(dev_addr));
+ __WDP_LOG_FUNC_EXIT__;
return;
}
DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
#endif /* TIZEN_DEBUG_DBUS_VALUE */
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return;
}
if (!g_strcmp0(signal,"InterfaceAdded")) {
static void __ws_get_peer_property(const char *key, GVariant *value, void *user_data)
{
+ __WDP_LOG_FUNC_ENTER__;
+
wfd_oem_device_s *peer = (wfd_oem_device_s *)user_data;
if(!peer) {
__WDP_LOG_FUNC_EXIT__;
} else {
WDP_LOGE("Unknown value");
}
+ __WDP_LOG_FUNC_EXIT__;
return;
}
static void __ws_peer_property(const char *key, GVariant *value, void *user_data)
{
+ __WDP_LOG_FUNC_ENTER__;
if(!user_data) {
+ __WDP_LOG_FUNC_EXIT__;
return;
}
} else {
WDP_LOGE("Unknown value");
}
+ __WDP_LOG_FUNC_EXIT__;
return;
}
WDP_LOGD("Ifname [%s]", event->ifname);
}
+ __WDP_LOG_FUNC_EXIT__;
return;
}
void __ws_group_property(const char *key, GVariant *value, void *user_data)
{
+ __WDP_LOG_FUNC_ENTER__;
wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
if(!event || !event->edata)
return;
} else {
WDP_LOGE("Unknown value");
}
+ __WDP_LOG_FUNC_EXIT__;
return;
}
void __ws_extract_invitation_details(const char *key, GVariant *value, void *user_data)
{
+ __WDP_LOG_FUNC_ENTER__;
wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
if(!event || !event->edata)
return;
} else {
WDP_LOGE("Unknown value");
}
+ __WDP_LOG_FUNC_EXIT__;
return;
}
void __ws_extract_group_details(const char *key, GVariant *value, void *user_data)
{
+ __WDP_LOG_FUNC_ENTER__;
wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
if(!event || !event->edata)
return;
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return;
}
wfd_oem_group_data_s *group = (wfd_oem_group_data_s *)event->edata;
_group_signal_cb,
NULL, NULL);
}
+ __WDP_LOG_FUNC_EXIT__;
return;
}
void __ws_extract_gonegfailaure_details(const char *key, GVariant *value, void *user_data)
{
+ __WDP_LOG_FUNC_ENTER__;
wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
if(!event || !event->edata)
return;
WDP_LOGD("Retrive status [%d]", status);
conn->status = status;
}
+ __WDP_LOG_FUNC_EXIT__;
return;
}
void __ws_extract_gonegsuccess_details(const char *key, GVariant *value, void *user_data)
{
+ __WDP_LOG_FUNC_ENTER__;
wfd_oem_event_s *event = (wfd_oem_event_s *)user_data;
if(!event || !event->edata)
return;
unsigned char ssid[WS_SSID_LEN +1] = {0,};
__ws_unpack_ay(ssid, value, WS_SSID_LEN);
- memcpy(edata->ssid, ssid, WS_SSID_LEN+1);
- WDP_LOGD("ssid [%s]", edata->ssid);
+ memcpy(edata->ssid, ssid, WS_SSID_LEN+1);
+ WDP_LOGD("ssid [%s]", edata->ssid);
} else if (g_strcmp0(key, "peer_device_addr") == 0) {
} else if (g_strcmp0(key, "peer_config_timeout") == 0) {
}
+ __WDP_LOG_FUNC_EXIT__;
return;
}
CHECK_KEY_VALUE(key, value);
#endif /* TIZEN_DEBUG_DBUS_VALUE */
if (g_strcmp0(key, "peer_object") == 0) {
- static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
- __ws_path_to_addr(peer_path, event->dev_addr, value);
+ static unsigned char peer_dev[WS_MACSTR_LEN] = {'\0',};
+ const char *path = NULL;
+ char *loc = NULL;
+
+ g_variant_get(value, "o", &path);
+ if(path == NULL)
+ return;
+
+ WDP_LOGD("Retrive Added path [%s]", path);
+ loc = strrchr(path,'/');
+ if(loc != NULL)
+ __ws_mac_compact_to_normal(loc + 1, peer_dev);
+ __ws_txt_to_mac(peer_dev, event->dev_addr);
} else if (g_strcmp0(key, "update_indicator")) {
}
#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
+static int _ws_flush()
+{
+ __WDP_LOG_FUNC_ENTER__;
+ GDBusConnection *g_dbus = NULL;
+ dbus_method_param_s params;
+ int res = 0;
+
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return -1;
+ }
+
+ g_dbus = g_pd->g_dbus;
+ if (!g_dbus) {
+ WDP_LOGE("DBus connection is NULL");
+ return -1;
+ }
+ memset(¶ms, 0x0, sizeof(dbus_method_param_s));
+
+ dbus_set_method_param(¶ms, "Flush", g_pd->iface_path, g_dbus);
+ params.params = NULL;
+
+ res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
+ if (res < 0)
+ WDP_LOGE("Failed to send command to wpa_supplicant");
+ else
+ WDP_LOGD("Succeeded to flush");
+
+ __WDP_LOG_FUNC_EXIT__;
+ return 0;
+}
+
+static int _ws_cancel()
+{
+ __WDP_LOG_FUNC_ENTER__;
+ GDBusConnection *g_dbus = NULL;
+ dbus_method_param_s params;
+ int res = 0;
+
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return -1;
+ }
+
+
+ g_dbus = g_pd->g_dbus;
+ if (!g_dbus) {
+ WDP_LOGE("DBus connection is NULL");
+ return -1;
+ }
+ memset(¶ms, 0x0, sizeof(dbus_method_param_s));
+
+ dbus_set_method_param(¶ms, "Cancel", g_pd->iface_path , g_dbus);
+ params.params = NULL;
+
+ res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
+ if (res < 0)
+ WDP_LOGE("Failed to send command to wpa_supplicant");
+ else
+ WDP_LOGD("Succeeded to cancel");
+
+ __WDP_LOG_FUNC_EXIT__;
+ return 0;
+}
+
static void _ws_process_device_found(GDBusConnection *connection,
const gchar *object_path, GVariant *parameters)
{
wfd_oem_dev_data_s *edata = NULL;
static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return;
}
edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
wfd_oem_event_s event;
static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return;
}
memset(&event, 0x0, sizeof(wfd_oem_event_s));
__WDP_LOG_FUNC_ENTER__;
wfd_oem_event_s event;
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return;
}
memset(&event, 0x0, sizeof(wfd_oem_event_s));
const char *pin = NULL;
char *loc = NULL;
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return;
}
edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
const char *pin = NULL;
char *loc = NULL;
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return;
}
edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
wfd_oem_dev_data_s *edata = NULL;
static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return;
}
edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
wfd_oem_dev_data_s *edata = NULL;
static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return;
}
edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
wfd_oem_dev_data_s *edata = NULL;
static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return;
}
edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
wfd_oem_dev_data_s *edata = NULL;
static char peer_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return;
}
edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
int prov_status = 0;
char *loc = NULL;
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return;
}
memset(&event, 0x0, sizeof(wfd_oem_event_s));
wfd_oem_event_s event;
wfd_oem_conn_data_s *edata = NULL;
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return;
}
edata = (wfd_oem_conn_data_s*)calloc(1, sizeof(wfd_oem_conn_data_s));
int dev_pwd_id = 0;
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return;
}
edata = (wfd_oem_dev_data_s *) g_try_malloc0(sizeof(wfd_oem_dev_data_s));
wfd_oem_event_s event;
wfd_oem_invite_data_s *edata = NULL;
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return;
}
edata = (wfd_oem_invite_data_s *) g_try_malloc0(sizeof(wfd_oem_invite_data_s));
__WDP_LOG_FUNC_ENTER__;
wfd_oem_event_s event;
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return;
}
memset(&event, 0x0, sizeof(wfd_oem_event_s));
g_dbus_connection_signal_unsubscribe(g_pd->g_dbus, g_pd->group_sub_id);
memset(g_pd->group_iface_path, 0x0, DBUS_OBJECT_PATH_MAX);
+ _ws_flush();
g_pd->callback(g_pd->user_data, &event);
GVariantIter *iter = NULL;
wfd_oem_event_s event;
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return;
}
memset(&event, 0x0, sizeof(wfd_oem_event_s));
wfd_oem_event_s event;
const char *name = NULL;
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return;
}
memset(&event, 0x0, sizeof(wfd_oem_event_s));
__WDP_LOG_FUNC_ENTER__;
wfd_oem_event_s event;
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return;
}
memset(&event, 0x0, sizeof(wfd_oem_event_s));
DEBUG_SIGNAL(sender, object_path, interface, signal, parameters);
#endif /* TIZEN_DEBUG_DBUS_VALUE */
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return;
}
if(!g_strcmp0(signal,"PeerJoined")){
static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
const char *path = NULL;
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return;
}
pd_data = (ws_dbus_plugin_data_s *)g_pd;
int res = 0;
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return -1;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return -1;
}
g_dbus = g_pd->g_dbus;
dbus_method_param_s params;
int res = 0;
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return -1;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return -1;
}
g_dbus = g_pd->g_dbus;
return res;
}
-#if 0
+#if defined (TIZEN_MOBILE) && (TIZEN_WLAN_BOARD_SPRD)
static void __ws_remove_interface(GVariant *value, void *user_data)
{
__WDP_LOG_FUNC_ENTER__;
static char interface_path[DBUS_OBJECT_PATH_MAX] = {'\0',};
int res = 0;
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return;
}
g_dbus = g_pd->g_dbus;
__WDP_LOG_FUNC_EXIT__;
return;
}
-#endif
+#endif /* (TIZEN_MOBILE) && (TIZEN_WLAN_BOARD_SPRD) */
static int _ws_init_dbus_connection(void)
{
GError *error = NULL;
int res = 0;
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return -1;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return -1;
}
conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
G_DBUS_SIGNAL_FLAGS_NONE,
_supplicant_signal_cb,
NULL, NULL);
+#if defined (TIZEN_MOBILE) && (TIZEN_WLAN_BOARD_SPRD)
+ if(_ws_get_interface(COMMON_IFACE_NAME, NULL, NULL) < 0)
+ _ws_create_interface(COMMON_IFACE_NAME, NULL, NULL);
+ if(_ws_get_interface(P2P_IFACE_NAME, __register_p2pdevice_signal, NULL) < 0)
+ res = _ws_create_interface(P2P_IFACE_NAME, __register_p2pdevice_signal, NULL);
+#else /* (TIZEN_MOBILE) && (TIZEN_WLAN_BOARD_SPRD) */
if(_ws_get_interface(COMMON_IFACE_NAME, __register_p2pdevice_signal, NULL) < 0)
res = _ws_create_interface(COMMON_IFACE_NAME, __register_p2pdevice_signal, NULL);
+#endif /* (TIZEN_MOBILE) && (TIZEN_WLAN_BOARD_SPRD) */
if (res < 0)
WDP_LOGE("Failed to subscribe interface signal");
{
GDBusConnection *g_dbus = NULL;
- if(!g_pd) {
- WDP_LOGE("ws_plugin_data_s is not created yet");
- return -1;
+ if(!g_pd) {
+ WDP_LOGE("ws_plugin_data_s is not created yet");
+ return -1;
}
g_dbus = g_pd->g_dbus;
return 0;
}
#endif
+
int ws_init(wfd_oem_event_cb callback, void *user_data)
{
__WDP_LOG_FUNC_ENTER__;
WDP_LOGE("failed to fork (%s)", strerror(errno));
return FALSE;
}
+
#if 0
static int __ws_p2p_firmware_start(void)
{
static int __ws_p2p_supplicant_start(void)
{
- gboolean rv;
+ gboolean rv = FALSE;
const char *path = "/usr/sbin/p2p_supp.sh";
char *const args[] = { "/usr/sbin/p2p_supp.sh", "start_dbus", NULL };
char *const envs[] = { NULL };
static int __ws_p2p_supplicant_stop(void)
{
- gboolean rv;
+ gboolean rv = FALSE;
const char *path = "/usr/sbin/p2p_supp.sh";
char *const args[] = { "/usr/sbin/p2p_supp.sh", "stop", NULL };
char *const envs[] = { NULL };
int i = 0;
int res = 0;
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return -1;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return -1;
}
for(i = 0; i < WS_DEVTYPE_LEN; i++)
if (res < 0)
WDP_LOGE("Failed to send command to wpa_supplicant");
else
- WDP_LOGE("Succeeded to initialize p2pdevice");
+ WDP_LOGD("Succeeded to initialize p2pdevice");
__WDP_LOG_FUNC_EXIT__;
return res;
}
dbus_method_param_s params;
int res = 0;
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return -1;
- }
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return -1;
+ }
g_dbus = g_pd->g_dbus;
if (!g_dbus) {
int res = 0;
int retry_count = 0;
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return -1;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return -1;
}
res = __ws_p2p_supplicant_start();
__WDP_LOG_FUNC_ENTER__;
int res = 0;
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return -1;
+ if(!g_pd) {
+ WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
+ return -1;
}
if (!g_pd->activated) {
ws_stop_scan();
g_pd->concurrent = concurrent;
+#if defined (TIZEN_MOBILE) && (TIZEN_WLAN_BOARD_SPRD)
+ _ws_get_interface(P2P_IFACE_NAME, __ws_remove_interface, NULL);
+ if(concurrent == 0)
+ _ws_get_interface(COMMON_IFACE_NAME, __ws_remove_interface, NULL);
+#endif /* (TIZEN_MOBILE) && (TIZEN_WLAN_BOARD_SPRD) */
+
_ws_deinit_dbus_connection();
if(concurrent == 0) {
return 0;
}
-static int _ws_flush()
-{
- __WDP_LOG_FUNC_ENTER__;
- GDBusConnection *g_dbus = NULL;
- dbus_method_param_s params;
- int res = 0;
-
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return -1;
- }
-
- g_dbus = g_pd->g_dbus;
- if (!g_dbus) {
- WDP_LOGE("DBus connection is NULL");
- return -1;
- }
- memset(¶ms, 0x0, sizeof(dbus_method_param_s));
-
- dbus_set_method_param(¶ms, "Flush", g_pd->iface_path, g_dbus);
- params.params = NULL;
-
- res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
- if (res < 0)
- WDP_LOGE("Failed to send command to wpa_supplicant");
- else
- WDP_LOGD("Succeeded to flush");
-
- __WDP_LOG_FUNC_EXIT__;
- return 0;
-}
-
-static int _ws_cancel()
-{
- __WDP_LOG_FUNC_ENTER__;
- GDBusConnection *g_dbus = NULL;
- dbus_method_param_s params;
- int res = 0;
-
- if(!g_pd) {
- WDP_LOGE("ws_dbus_plugin_data_s is not created yet");
- return -1;
- }
-
- g_dbus = g_pd->g_dbus;
- if (!g_dbus) {
- WDP_LOGE("DBus connection is NULL");
- return -1;
- }
- memset(¶ms, 0x0, sizeof(dbus_method_param_s));
-
- dbus_set_method_param(¶ms, "Cancel", g_pd->iface_path , g_dbus);
- params.params = NULL;
-
- res = dbus_method_call(¶ms, SUPPLICANT_P2PDEVICE, NULL, NULL);
- if (res < 0)
- WDP_LOGE("Failed to send command to wpa_supplicant");
- else
- WDP_LOGD("Succeeded to cancel");
-
- __WDP_LOG_FUNC_EXIT__;
- return 0;
-}
-
#if 0
static gboolean _retry_start_scan(gpointer data)
{
case WFD_OEM_SERVICE_TYPE_UPNP:
strncpy(s_type, SERV_DISC_REQ_UPNP, OEM_SERVICE_TYPE_LEN);
break;
- case WFD_OEM_SERVICE_TYPE_BT_ADDR:
- strncpy(s_type, SERVICE_TYPE_BT_ADDR, OEM_SERVICE_TYPE_LEN);
- break;
- case WFD_OEM_SERVICE_TYPE_CONTACT_INFO:
- strncpy(s_type, SERVICE_TYPE_CONTACT_INFO, OEM_SERVICE_TYPE_LEN);
- break;
default:
__WDP_LOG_FUNC_EXIT__;
WDP_LOGE("Invalid Service type");
#define WS_SCAN_RETRY_COUNT 10
#ifdef TIZEN_FEATURE_SERVICE_DISCOVERY
-#define BT_ADDR_PATH "/csa/bluetooth/.bd_addr"
#define SERV_DISC_REQ_ALL "02000001"
#define SERV_DISC_REQ_BONJOUR "02000101"
#define SERV_DISC_REQ_UPNP "02000201"
-#define SAMSUNG_VENDOR_OUI "0000f0"
-#define SAMSUNG_SERVICE_BT "0b"
-#define SAMSUNG_SERVICE_CONTACT "0d"
#define SAMSUNG_SERVICE_ALL "0c"
-#define SERVICE_TYPE_BT_ADDR "0000f00b"
-#define SERVICE_TYPE_ALL "0000f00c"
-#define SERVICE_TYPE_CONTACT_INFO "0000f00d"
#define SERVICE_TYPE_LEN 8
#define SERV_BROADCAST_ADDRESS "00:00:00:00:00:00"
#endif /* TIZEN_FEATURE_SERVICE_DISCOVERY */
info_cnt++;
}
}
+ if (info_cnt == 0) {
+ WDP_LOGD("Device info ids have no valid information");
+ return -1;
+ }
for (i = 0; i < info_cnt; i++) {
switch (infos[i].index){
edata->group_flags = WFD_OEM_GROUP_FLAG_PERSISTENT_GROUP;
break;
case WS_DEV_INFO_P2P_GO_ADDR:
- edata->dev_role = WFD_OEM_DEV_ROLE_GC;
res = _ws_txt_to_mac(infos[i].string, edata->p2p_go_addr);
if (res < 0)
memset(edata->p2p_go_addr, 0x00, OEM_MACADDR_LEN);
+ if (memcmp(edata->p2p_go_addr, null_mac, OEM_MACADDR_LEN))
+ edata->dev_role = WFD_OEM_DEV_ROLE_GC;
break;
#ifdef TIZEN_FEATURE_WIFI_DISPLAY
case WS_DEV_INFO_WFD_DEV_INFO:
WDP_LOGD("RData: %s", serv_tmp->data.bonjour.rdata);
} else if (serv_tmp->protocol == WFD_OEM_SERVICE_TYPE_VENDOR) {
WDP_LOGD("===== Vendor specific service =====");
- if (!strncmp(ptr, "0000f00b", 8)) {
- WDP_LOGD("\tSAMSUNG_BT_ADDR");
- ptr += 16;
- serv_tmp->protocol = WFD_OEM_SERVICE_TYPE_BT_ADDR;
- serv_tmp->data.vendor.data1 = (char*) g_try_malloc0(9);
- if (!serv_tmp->data.vendor.data1) {
- WDP_LOGE("Failed to allocate memory for data.vendor.data1");
- g_free(serv_tmp);
- return -1;
- }
- g_strlcpy(serv_tmp->data.vendor.data1, "0000f00b", 9);
- serv_tmp->data.vendor.data2 = (char*) g_try_malloc0(18);
- if (!serv_tmp->data.vendor.data2) {
- WDP_LOGE("Failed to allocate memory for data.vendor.data2");
- g_free(serv_tmp->data.vendor.data1);
- g_free(serv_tmp);
- return -1;
- }
- _ws_hex_to_txt(ptr, 0, serv_tmp->data.vendor.data2);
- }
- WDP_LOGD("Info1: %s", serv_tmp->data.vendor.data1);
- WDP_LOGD("Info2: %s", serv_tmp->data.vendor.data2);
} else {
- WDP_LOGE("Not supported yet. Only bonjour and samsung vendor service supproted [%d]",
+ WDP_LOGE("Not supported yet. Only bonjour service supproted [%d]",
serv_tmp->protocol);
g_free(serv_tmp);
return -1;
{
/* Interface address of connected peer will come up */
char *temp_mac = NULL;
+ char *intf = NULL;
+ res = _extract_value_str(info_str, "ifname", &intf);
+ if (res < 0) {
+ WDP_LOGE("Failed to extract interface name");
+ break;
+ }
+ if (intf) {
+ strcpy(data->ifname, intf);
+ free(intf);
+ }
+ WDP_LOGD("Connected event from interface: %s", data->ifname);
res = _extract_value_str(info_str, "to", &temp_mac);
if (res < 0) {
WDP_LOGE("Failed to extract interface address");
break;
}
- _ws_txt_to_mac(temp_mac, data->intf_addr);
- if (temp_mac)
+ if (temp_mac) {
+ _ws_txt_to_mac(temp_mac, data->intf_addr);
g_free(temp_mac);
+ }
data->edata_type = WFD_OEM_EDATA_TYPE_NONE;
}
break;
char mac_addr[OEM_MACSTR_LEN] ={0, };
char *up_indic = NULL;
int len = 0;
+ int ret = 0;
_ws_txt_to_mac(info_str, data->dev_addr);
info_str += OEM_MACSTR_LEN;
g_snprintf(mac_addr, OEM_MACSTR_LEN, MACSTR, MAC2STR(data->dev_addr));
- _extract_word(info_str, &up_indic);
+ ret = _extract_word(info_str, &up_indic);
+ if (ret < 0) {
+ WDP_LOGE("_extract_word is failed");
+ }
if (up_indic) {
WDP_LOGD("Update indicator: %s", up_indic);
info_str += strlen(up_indic) + 1;
// goto done;
}
g_pd->group = NULL;
+ _ws_flush();
}
break;
case WS_EVENT_INVITATION_RECEIVED:
g_snprintf(cmd, sizeof(cmd), WS_CMD_SERV_DISC_REQ " %s %s", mac_str, SERV_DISC_REQ_UPNP);
g_strlcpy(service->service_type, SERV_DISC_REQ_UPNP, OEM_SERVICE_TYPE_LEN + 1);
break;
- case WFD_OEM_SERVICE_TYPE_BT_ADDR:
- strncat(query, SERVICE_TYPE_BT_ADDR, OEM_SERVICE_TYPE_LEN);
- g_snprintf(cmd, sizeof(cmd), WS_CMD_SERV_DISC_REQ " %s %s", mac_str, query);
- g_strlcpy(service->service_type, SERVICE_TYPE_BT_ADDR, OEM_SERVICE_TYPE_LEN + 1);
- break;
- case WFD_OEM_SERVICE_TYPE_CONTACT_INFO:
- strncat(query, SERVICE_TYPE_CONTACT_INFO, OEM_SERVICE_TYPE_LEN);
- g_snprintf(cmd, sizeof(cmd), WS_CMD_SERV_DISC_REQ " %s %s", mac_str, query);
- g_strlcpy(service->service_type, SERVICE_TYPE_CONTACT_INFO, OEM_SERVICE_TYPE_LEN + 1);
- break;
default:
WDP_LOGE("Invalid Service type");
__WDP_LOG_FUNC_EXIT__;
case WFD_OEM_SERVICE_TYPE_UPNP:
g_strlcpy(s_type, SERV_DISC_REQ_UPNP, OEM_SERVICE_TYPE_LEN + 1);
break;
- case WFD_OEM_SERVICE_TYPE_BT_ADDR:
- g_strlcpy(s_type, SERVICE_TYPE_BT_ADDR, OEM_SERVICE_TYPE_LEN + 1);
- break;
- case WFD_OEM_SERVICE_TYPE_CONTACT_INFO:
- g_strlcpy(s_type, SERVICE_TYPE_CONTACT_INFO, OEM_SERVICE_TYPE_LEN + 1);
- break;
default:
__WDP_LOG_FUNC_EXIT__;
WDP_LOGE("Invalid Service type");
return 0;
}
-int _convert_bonjour_to_hex(char *query, char *rdata, char **hex)
+int _convert_bonjour_query_to_hex(char *query, char **hex)
{
char hex_key[256] = {0, };;
- char hex_value[256] = {0, };;
char *token = NULL;
char *temp = NULL;
int len = 0;
int i = 0;
char temp_str[256] = {0, };
char *result_str = NULL;
+ char *str_query = NULL;
if (!query || !hex) {
WDP_LOGE("Invalid parameter");
return -1;
}
- token = strtok_r(query, ".", &temp);
+ str_query = strdup(query);
+ if (!str_query) {
+ WDP_LOGE("Memory allocation failed");
+ return -1;
+ }
+
+ token = strtok_r(str_query, ".", &temp);
while (token) {
- if (!strcmp(token, "local")) {
+ if (!strcmp(token, "local") || !strcmp(token, "_tcp") || !strcmp(token, "_udp")) {
WDP_LOGD("Query conversion done");
break;
}
token = strtok_r(NULL, ".", &temp);
}
- if (token && strstr(token, "local")) {
+ if (token && strstr(token, "_tcp")) {
+ token = strtok_r(NULL, ".", &temp);
+ if (token && strstr(token, "local")) {
+ strncat(hex_key, "c00c", 4);
+ strncat(hex_key, "000c", 4);
+ strncat(hex_key, "01", 2);
+ goto next;
+ }
+ } else if (token && strstr(token, "_udp")) {
+ token = strtok_r(NULL, ".", &temp);
+ if (token && strstr(token, "local")) {
+ strncat(hex_key, "c01c", 4);
+ strncat(hex_key, "000c", 4);
+ strncat(hex_key, "01", 2);
+ goto next;
+ }
+ } else if (token && strstr(token, "local")) {
strncat(hex_key, "c011", 4);
strncat(hex_key, "000c", 4);
strncat(hex_key, "01", 2);
- } else {
- strncat(hex_key, "c011", 4);
- strncat(hex_key, "0010", 4);
- strncat(hex_key, "01", 2);
+ goto next;
+ }
+
+ strncat(hex_key, "c00c", 4);
+ strncat(hex_key, "0010", 4);
+ strncat(hex_key, "01", 2);
+
+next:
+ g_free(str_query);
+
+ tot_len = strlen(hex_key);
+ result_str = (char*) calloc(1, tot_len+1);
+ if (!result_str) {
+ WDP_LOGE("Failed to allocate memory for result string");
+ return -1;
+ }
+ sprintf(result_str, "%s", hex_key);
+
+ *hex = result_str;
+
+ return 0;
+}
+
+
+int _convert_bonjour_to_hex(char *query, char *rdata,
+ wfd_oem_bonjour_rdata_type_e rdata_type, char **hex)
+{
+ char *hex_key = NULL;
+ char hex_value[256] = {0, };
+ char *token = NULL;
+ char *temp = NULL;
+ int len = 0;
+ int tot_len = 0;
+ int i = 0;
+ char temp_str[256] = {0, };
+ char *result_str = NULL;
+ char *str_rdata = NULL;
+
+ if (!query || !hex) {
+ WDP_LOGE("Invalid parameter");
+ return -1;
+ }
+
+ if (_convert_bonjour_query_to_hex(query, &hex_key) < 0 || !hex_key) {
+ WDP_LOGE("_convert_bonjour_query_to_hex failed");
+ return -1;
}
if (!rdata || !strlen(rdata)) {
WDP_LOGD("RDATA is NULL");
strncat(hex_value, "00", 2);
} else {
- token = strtok_r(rdata, ".", &temp);
+ str_rdata = strdup(rdata);
+ if (!str_rdata) {
+ WDP_LOGE("Memory allocation failed");
+ g_free(hex_key);
+ return -1;
+ }
+ token = strtok_r(str_rdata, ".", &temp);
while (token) {
WDP_LOGD("Token: %s", token);
len = strlen(token);
token = strtok_r(NULL, ".", &temp);
}
+ g_free(str_rdata);
}
- strncat(hex_value, "c027", 4);
+ if (rdata_type == WFD_OEM_BONJOUR_RDATA_PTR)
+ strncat(hex_value, "c027", 4);
tot_len = strlen(hex_key) + strlen(hex_value);
result_str = (char*) g_try_malloc0(tot_len+2);
if (!result_str) {
WDP_LOGE("Failed to allocate memory for result string");
+ g_free(hex_key);
return -1;
}
g_snprintf(result_str, tot_len+2, "%s %s", hex_key, hex_value);
*hex = result_str;
+ g_free(hex_key);
+
return 0;
}
res = _convert_bonjour_to_hex(service->data.bonjour.query,
service->data.bonjour.rdata,
+ service->data.bonjour.rdata_type,
&hex);
+
if (res < 0) {
WDP_LOGE("Failed to convert Key string as hex string");
return -1;
WDP_LOGD("Service type: WFD_OEM_SERVICE_TYPE_BONJOUR, Data: %s", service);
char *hex_key = NULL;
- res = _convert_bonjour_to_hex(service->data.bonjour.query, NULL, &hex_key);
+ res = _convert_bonjour_query_to_hex(service->data.bonjour.query, &hex_key);
if (res != 0) {
WDP_LOGE("Failed to convert Key string as hex string");
return -1;
}
if (strstr(reply, "FAIL")) {
- WDP_LOGE("Failed to add service");
+ WDP_LOGE("Failed to delete service");
__WDP_LOG_FUNC_EXIT__;
return -1;
}
- WDP_LOGD("Succeeded to add service");
+ WDP_LOGD("Succeeded to del service");
__WDP_LOG_FUNC_EXIT__;
return 0;
rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
break;
}
- WDS_LOGE("Succeeded to start scan");
- wfd_state_set(manager, WIFI_DIRECT_STATE_DISCOVERING);
- wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DISCOVERING);
+ 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);
+ }
noti = (wifi_direct_client_noti_s*) g_try_malloc0(sizeof(wifi_direct_client_noti_s));
if (req.data.int1) {
rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
break;
}
- WDS_LOGE("Succeeded to start specific scan");
- wfd_state_set(manager, WIFI_DIRECT_STATE_DISCOVERING);
- wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DISCOVERING);
+ 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);
+ }
noti = (wifi_direct_client_noti_s*) g_try_malloc0(sizeof(wifi_direct_client_noti_s));
if (channel == WIFI_DIRECT_DISCOVERY_FULL_SCAN)
break;
}
- res = wfd_service_add(&(manager->local->services), service_type, info_str, &rsp.param1);
+ 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;
break;
}
- res = wfd_service_del(manager->local->services, service_id);
+ res = wfd_service_del(service_id);
if (res < 0) {
WDS_LOGE("Failed to delete service");
rsp.result = WIFI_DIRECT_ERROR_OPERATION_FAILED;
wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_DEACTIVATED);
manager->req_wps_mode = WFD_WPS_MODE_PBC;
+#ifdef TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT
+ wfd_util_stop_wifi_direct_popup();
+#endif /* TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT */
__WDS_LOG_FUNC_EXIT__;
return;
}
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");
+ return;
+ }
+
#ifdef CTRL_IFACE_DBUS
wfd_oem_dev_data_s *edata = NULL;
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");
+ return;
+ }
+
#ifdef CTRL_IFACE_DBUS
wfd_oem_dev_data_s *edata = NULL;
}
edata = (wfd_oem_conn_data_s*) event->edata;
- if (edata && edata->status < 0 && session->connecting_120) {
+ if (!edata) {
+ WDS_LOGE("Invalid p2p connection data");
+ return;
+ }
+
+ if (edata->status < 0 && session->connecting_120) {
if (session->retry_gsrc) {
g_source_remove(session->retry_gsrc);
session->retry_gsrc = 0;
if(peer_addr != NULL)
g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(peer_addr));
} else if (manager->state >= WIFI_DIRECT_STATE_CONNECTED) {
+#if defined (CTRL_IFACE_DBUS)
+ if(manager->local->dev_role != WFD_DEV_ROLE_GO)
+ noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
+ else
+#endif
noti.event = WIFI_DIRECT_CLI_EVENT_GROUP_DESTROY_RSP;
noti.error = WIFI_DIRECT_ERROR_NONE;
} else {
#endif /* TIZEN_TV */
wfd_oem_destroy_group(manager->oem_ops, group->ifname);
wfd_destroy_group(manager, group->ifname);
+ wfd_peer_clear_all(manager);
}
} else if (manager->state == WIFI_DIRECT_STATE_DISCONNECTING) {
noti.event = WIFI_DIRECT_CLI_EVENT_DISCONNECTION_RSP;
g_snprintf(noti.param2, 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 if (service->protocol == WFD_OEM_SERVICE_TYPE_BT_ADDR) {
- g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
- g_snprintf(noti.param2, MACSTR_LEN, "%s", service->data.vendor.data2);
- WDS_LOGD("Found service: [%d: %s] - [" MACSECSTR "]", service->protocol,
- service->data.vendor.data2, MAC2SECSTR(event->dev_addr));
} else {
WDS_LOGD("Found service is not supported");
goto next;
noti.type = edata->type;
g_snprintf(noti.param1, MACSTR_LEN, MACSTR, MAC2STR(event->dev_addr));
switch(edata->type) {
- case WFD_OEM_SERVICE_TYPE_BT_ADDR:
- g_snprintf(noti.param2, MACSTR_LEN, MACSTR, MAC2STR(edata->data));
- return;
- case WFD_OEM_SERVICE_TYPE_CONTACT_INFO:
- g_snprintf(noti.param2, MACSTR_LEN, "%s", edata->value);
- return;
- default:
- WDS_LOGE("Unknown type [type ID: %d]", edata->type);
+ WDS_LOGE("Unknown type [type ID: %d]", edata->type);
}
}
wfd_client_send_event(manager, ¬i);
wfd_manager_local_config_set(manager);
wfd_util_set_country();
-
+#ifdef TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT
wfd_util_start_wifi_direct_popup();
+#endif /* TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT */
res = wfd_util_get_local_dev_mac(manager->local->dev_addr);
if (res < 0) {
wfd_peer_clear_all(manager);
wfd_local_reset_data(manager);
+#ifdef TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT
+ wfd_util_stop_wifi_direct_popup();
+#endif /* TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT */
__WDS_LOG_FUNC_EXIT__;
return 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);
+ if (group && group->member_count > 0)
+ 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);
#include "wifi-direct-util.h"
-int wfd_service_add(GList **services, int type, char *info_str, int *service_id)
+int wfd_service_add(int type, char *info_str, int *service_id)
{
__WDS_LOG_FUNC_ENTER__;
wfd_manager_s *manager = wfd_get_manager();
}
service->type = type;
- service->id = (intptr_t) &service;
+ service->id = (intptr_t) service;
info1 = g_strndup(info_str, strlen(info_str));
if(info1 == NULL) {
break;
case WIFI_DIRECT_SERVICE_TYPE_WS_DISCOVERY:
case WIFI_DIRECT_SERVICE_TYPE_WIFI_DISPLAY:
- case WIFI_DIRECT_SERVICE_TYPE_BT_ADDR:
WDS_LOGE("Not supported yet");
g_free(info1);
g_free(service);
// free(oem_service);
service->str_ptr = info1;
- *services = g_list_prepend(*services, service);
+ manager->local->services = g_list_prepend(manager->local->services, service);
*service_id = service->id;
__WDS_LOG_FUNC_EXIT__;
return 0;
}
-int wfd_service_del(GList *services, int service_id)
+int wfd_service_del(int service_id)
{
__WDS_LOG_FUNC_ENTER__;
wfd_manager_s *manager = wfd_get_manager();
wfd_service_s *service = NULL;
int res = 0;
- if (!services) {
- WDS_LOGE("Invalid parameter");
+ if (!manager->local->services) {
+ WDS_LOGE("No services to delete");
return -1;
}
- temp = g_list_first(services);
+ temp = g_list_first(manager->local->services);
while (temp) {
service = (wfd_service_s*) temp->data;
if (service->id == service_id) {
return -1;
}
- services = g_list_remove(services, service);
+ manager->local->services = g_list_remove(manager->local->services, service);
g_free(service->str_ptr);
g_free(service);
#include <glib.h>
#include <vconf.h>
+#if defined(TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT)
#include <app_control.h>
+#include <aul.h>
+#endif
#include <wifi-direct.h>
#include "wifi-direct-ipc.h"
return 0;
}
+#ifdef TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT
int wfd_util_start_wifi_direct_popup()
{
__WDS_LOG_FUNC_ENTER__;
- app_control_h control = NULL;
- if (APP_CONTROL_ERROR_NONE != app_control_create(&control)) {
- WDS_LOGE("App control create Failed !");
+ app_control_h popup_control = NULL;
+ if (APP_CONTROL_ERROR_NONE != app_control_create(&popup_control)
+ || NULL == popup_control) {
+ WDS_LOGE("App control operation Failed !");
return -1;
}
- if (APP_CONTROL_ERROR_NONE != app_control_set_operation(control,
+ if (APP_CONTROL_ERROR_NONE != app_control_set_operation(popup_control,
APP_CONTROL_OPERATION_DEFAULT)) {
- WDS_LOGE("App control set operation Failed !");
- app_control_destroy(control);
+ WDS_LOGE("App control operation Failed !");
+ app_control_destroy(popup_control);
return -1;
}
- if (APP_CONTROL_ERROR_NONE != app_control_set_app_id(control,
+ if (APP_CONTROL_ERROR_NONE != app_control_set_app_id(popup_control,
"org.tizen.wifi-direct-popup")) {
- WDS_LOGE("App control set app id Failed !");
- app_control_destroy(control);
+ WDS_LOGE("App control operation Failed !");
+ app_control_destroy(popup_control);
return -1;
}
if (APP_CONTROL_ERROR_NONE !=
- app_control_send_launch_request(control, NULL, NULL)) {
- WDS_LOGE("App control send launch request Failed !");
+ app_control_send_launch_request(popup_control, NULL, NULL)) {
+ WDS_LOGE("App control operation Failed !");
+ app_control_destroy(popup_control);
return -1;
}
- app_control_destroy(control);
+ app_control_destroy(popup_control);
+
WDS_LOGD("Succeeded to launch wifi-direct-popup");
__WDS_LOG_FUNC_EXIT__;
return 0;
}
+int wfd_util_stop_wifi_direct_popup()
+{
+ __WDS_LOG_FUNC_ENTER__;
+
+ int pid = aul_app_get_pid("org.tizen.wifi-direct-popup");
+ if (pid > 0) {
+ if (aul_terminate_pid(pid) != AUL_R_OK) {
+ WDS_LOGD("Failed to destroy wifi-direct-popup pid[%d]", pid);
+ return -1;
+ } else {
+ WDS_LOGD("Succeeded to destroy wifi-direct-popup");
+ }
+ } else {
+ WDS_LOGD("Wifi-direct-popup not running");
+ }
+
+ __WDS_LOG_FUNC_EXIT__;
+ return 0;
+}
+#endif /* TIZEN_FEATURE_DEFAULT_CONNECTION_AGENT */
+
int _connect_remote_device(char *ip_str)
{
int sock;
int flags;
+ int res = 0;
struct sockaddr_in remo_addr;
errno = 0;
}
flags = fcntl(sock, F_GETFL, 0);
- fcntl(sock, F_SETFL, flags | O_NONBLOCK);
+ res = fcntl(sock, F_SETFL, flags | O_NONBLOCK);
+ if (res < 0) {
+ WDS_LOGE("File descriptor create failed");
+ close(sock);
+ __WDS_LOG_FUNC_EXIT__;
+ return -1;
+ }
memset(&remo_addr, 0x0, sizeof(remo_addr));
remo_addr.sin_family = AF_INET;
remo_addr.sin_port = htons(9999);
errno = 0;
- connect(sock, (struct sockaddr*) &remo_addr, sizeof(remo_addr));
+ res = connect(sock, (struct sockaddr*) &remo_addr, sizeof(remo_addr));
+ if (res < 0) {
+ WDS_LOGE("Failed to connect to server socket [%s]", strerror(errno));
+ close(sock);
+ __WDS_LOG_FUNC_EXIT__;
+ return -1;
+ }
+
WDS_SECLOGD("Status of connection to remote device[%s] - (%s)", ip_str, strerror(errno));
close(sock);