2 * Network Configuration Module
4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
21 * This file implements wifi direct utility functions.
23 * @file wifi-direct-util.c
24 * @author Gibyoung Kim (lastkgb.kim@samsung.com)
31 #include <sys/types.h>
33 #include <sys/socket.h>
34 #include <sys/ioctl.h>
35 #include <netinet/in.h>
36 #include <arpa/inet.h>
43 #include <sys/utsname.h>
48 #include <tzplatform_config.h>
49 #include <system_info.h>
50 #include <systemd/sd-login.h>
52 #include <wifi-direct.h>
54 #include "wifi-direct-ipc.h"
55 #include "wifi-direct-manager.h"
56 #include "wifi-direct-state.h"
57 #include "wifi-direct-util.h"
58 #include "wifi-direct-oem.h"
59 #include "wifi-direct-group.h"
60 #include "wifi-direct-session.h"
61 #include "wifi-direct-error.h"
62 #include "wifi-direct-log.h"
63 #include "wifi-direct-dbus.h"
64 #include "wifi-direct-asp.h"
66 #include <linux/unistd.h>
67 #include <asm/types.h>
68 #include <linux/netlink.h>
69 #include <linux/rtnetlink.h>
71 #include <netlink/netlink.h>
72 #include <netlink/socket.h>
73 #include <netlink/route/neighbour.h>
75 #define ASP_FEATURE "http://tizen.org/feature/network.asp"
76 #define WIFI_DIRECT_DISPLAY_FEATURE "http://tizen.org/feature/network.wifi.direct.display"
77 #define WIFI_DIRECT_SERVICE_DISCOVERY_FEATURE "http://tizen.org/feature/network.wifi.direct.service_discovery"
78 #define TETHERING_WIFI_FEATURE "http://tizen.org/feature/network.tethering.wifi"
79 #define TETHERING_WIFI_DIRECT_FEATURE "http://tizen.org/feature/network.tethering.wifi.direct"
81 #define TIZEN_P2P_GO_IPADDR "192.168.49.1"
82 #define MAX_SIZE_ERROR_BUFFER 256
83 #define MAX_FILE_PATH_LEN 256
84 #define DEFAULT_MAC_FILE_PATH "/sys/class/net/p2p0/address"
86 #define COUNTRY_CODE_FILE tzplatform_mkpath(TZ_SYS_RO_ETC, "wifi-direct/ccode.conf")
87 #define WFD_MANGER_CONF_FILE tzplatform_mkpath(TZ_SYS_RO_ETC, "wifi-direct/wifi-direct-manager.conf")
88 #define WFD_CONF_GROUP_NAME "wfd-manager"
90 enum wfd_util_conf_key {
92 WFD_CONF_CONNECTION_AGENT,
93 WFD_CONF_IP_OVER_EAPOL,
95 WFD_CONF_P2P_IFACE_NAME,
96 WFD_CONF_GROUP_IFACE_NAME,
97 WFD_CONF_DEFAULT_DEVICE_NAME,
98 WFD_CONF_PRIMARY_DEVICE_TYPE,
99 WFD_CONF_SECONDARY_DEVICE_TYPE,
101 WFD_CONF_PERSISTENT_RE,
102 WFD_CONF_LISTEN_REG_CLASS,
103 WFD_CONF_LISTEN_CHANNEL,
104 WFD_CONF_OPER_REG_CLASS,
105 WFD_CONF_OPER_CHANNEL,
106 WFD_CONF_CONFIG_METHOD,
107 WFD_CONF_NO_GROUP_IFACE,
108 WFD_CONF_GROUP_OPER_FREQ,
109 WFD_CONF_CONNECTION_TIMEOUT,
121 static GKeyFile *__load_key_file()
123 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
124 GKeyFile *key_file = NULL;
125 GError *error = NULL;
127 key_file = g_key_file_new();
128 if (!g_key_file_load_from_file(key_file, WFD_MANGER_CONF_FILE, G_KEY_FILE_NONE, &error)) {
129 WDS_LOGE("Unable to load %s: %s", WFD_MANGER_CONF_FILE, error->message);
130 g_clear_error(&error);
131 g_key_file_free(key_file);
135 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
140 static void __load_wfd_config(GKeyFile **key_file, struct key_value *conf_key_val)
142 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
144 GError *error = NULL;
147 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
151 result = __load_key_file();
153 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
157 for (i = 0; i < WFD_CONF_MAX; i++) {
159 if ((!g_strcmp0(conf_key_val[i].key, "primary_device_type")) ||
160 (!g_strcmp0(conf_key_val[i].key, "secondary_device_type")) ||
161 (!g_strcmp0(conf_key_val[i].key, "go_intent")) ||
162 (!g_strcmp0(conf_key_val[i].key, "listen_reg_class")) ||
163 (!g_strcmp0(conf_key_val[i].key, "listen_channel")) ||
164 (!g_strcmp0(conf_key_val[i].key, "operating_reg_class")) ||
165 (!g_strcmp0(conf_key_val[i].key, "operating_channel")) ||
166 (!g_strcmp0(conf_key_val[i].key, "group_operating_freq")) ||
167 (!g_strcmp0(conf_key_val[i].key, "connection_timeout"))) {
169 conf_key_val[i].int_value = g_key_file_get_integer(result,
170 WFD_CONF_GROUP_NAME, conf_key_val[i].key, &error);
172 WDS_LOGE("Unable to load %s : %s", conf_key_val[i].key, error->message);
173 g_clear_error(&error);
176 WDS_LOGD("key [%s] value [%d]\n",
177 conf_key_val[i].key, conf_key_val[i].int_value);
183 if (!g_strcmp0(conf_key_val[i].key, "persistent_reconnect") ||
184 !g_strcmp0(conf_key_val[i].key, "no_group_iface")) {
186 conf_key_val[i].bool_value = g_key_file_get_boolean(result,
187 WFD_CONF_GROUP_NAME, conf_key_val[i].key, &error);
189 WDS_LOGE("Unable to load %s : %s", conf_key_val[i].key, error->message);
190 g_clear_error(&error);
193 WDS_LOGD("key [%s] value [%d]\n",
194 conf_key_val[i].key, conf_key_val[i].bool_value);
200 conf_key_val[i].value = g_key_file_get_string(result,
201 WFD_CONF_GROUP_NAME, conf_key_val[i].key, &error);
202 if (!conf_key_val[i].value) {
203 WDS_LOGE("Unable to load %s : %s", conf_key_val[i].key, error->message);
204 g_clear_error(&error);
207 WDS_LOGD("key [%s] value [%s]\n",
208 conf_key_val[i].key, conf_key_val[i].value);
210 if (conf_key_val[i].value && strlen(conf_key_val[i].value) == 0) {
211 g_free(conf_key_val[i].value);
212 conf_key_val[i].value = NULL;
217 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
221 static void __unload_wfd_config(GKeyFile *key_file, struct key_value *conf_key_val)
223 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
225 if (!key_file || !conf_key_val) {
226 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
230 for (i = 0; i < WFD_CONF_MAX; i++) {
231 g_free(conf_key_val[i].value);
235 g_key_file_unref(key_file);
236 __WDS_LOG_FUNC_EXIT__;
241 void *wfd_util_plugin_init(wfd_manager_s *manager)
243 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
245 struct utsname kernel_info;
247 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
250 WDS_LOGE("Invalid parameter");
251 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
255 res = uname(&kernel_info);
257 WDS_LOGE("Failed to detect target type");
258 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
261 WDS_LOGD("Node name [%s], HW ID [%s]", kernel_info.nodename, kernel_info.machine);
265 #if defined(TIZEN_ARCH_64)
266 handle = dlopen(SUPPL_PLUGIN_64BIT_PATH, RTLD_NOW);
268 handle = dlopen(SUPPL_PLUGIN_PATH, RTLD_NOW);
271 WDS_LOGE("Failed to open shared object. [%s]", dlerror());
272 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
277 int (*plugin_load)(wfd_oem_ops_s **ops) = NULL;
278 plugin_load = (int (*)(wfd_oem_ops_s **ops)) dlsym(handle, "wfd_plugin_load");
280 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
281 WDS_LOGE("Failed to load symbol. Error = [%s]", error_buf);
283 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
287 wfd_oem_ops_s *temp_ops;
288 (*plugin_load)(&temp_ops);
289 manager->oem_ops = temp_ops;
291 res = wfd_oem_init(temp_ops);
293 WDS_LOGE("Failed to initialize OEM");
295 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
299 /* Configure the plugin here,
300 * using config file parameters */
301 res = wfd_oem_configure(manager->oem_ops, manager->wfd_oem_conf);
303 WDS_LOGE("Failed to configure OEM");
305 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
309 WDS_LOGD("Succeeded to initialize OEM");
311 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
315 int wfd_util_plugin_deinit(wfd_manager_s *manager)
317 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
319 if (!manager || !manager->plugin_handle) {
320 WDS_LOGE("Invalid parameter");
321 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
325 dlclose(manager->plugin_handle);
326 manager->plugin_handle = NULL;
328 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
332 #if defined TIZEN_ENABLE_PRD
333 void *wfd_util_prd_plugin_init(wfd_manager_s *manager)
335 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
337 struct utsname kernel_info;
341 WDS_LOGE("Invalid parameter");
342 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
346 res = uname(&kernel_info);
348 WDS_LOGE("Failed to detect target type");
349 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
352 WDS_LOGD("Node name [%s], HW ID [%s]", kernel_info.nodename, kernel_info.machine);
356 #if defined(TIZEN_ARCH_64)
357 handle = dlopen(SUPPL_PRD_PLUGIN_64BIT_PATH, RTLD_NOW);
359 handle = dlopen(SUPPL_PRD_PLUGIN_PATH, RTLD_NOW);
362 WDS_LOGE("Failed to open shared object. [%s]", dlerror());
363 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
368 int (*plugin_load)(wfd_oem_ops_s **ops) = NULL;
369 plugin_load = (int (*)(wfd_oem_ops_s **ops)) dlsym(handle, "wfd_prd_plugin_load");
371 WDS_LOGE("Failed to load symbol. Error = [%s]", strerror(errno));
373 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
377 (*plugin_load)((wfd_oem_ops_s **)&manager->oem_ops);
379 res = wfd_oem_prd_init((wfd_oem_ops_s *)manager->oem_ops);
381 WDS_LOGE("Failed to initialize PRD OEM");
383 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
386 WDS_LOGD("Succeeded to initialize PRD OEM");
388 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
392 int wfd_util_prd_plugin_deinit(wfd_manager_s *manager)
394 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
396 if (!manager || !manager->prd_plugin_handle) {
397 WDS_LOGE("Invalid parameter");
398 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
402 dlclose(manager->prd_plugin_handle);
403 manager->prd_plugin_handle = NULL;
405 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
408 #endif /* TIZEN_ENABLE_PRD */
411 void wfd_util_load_wfd_conf(wfd_manager_s * manager)
413 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
415 GKeyFile *key_file = NULL;
416 wfd_oem_config_s *oem_conf = NULL;
417 struct key_value wfd_conf[] = {
418 {WFD_CONF_ON_DEMAND, "on_demand", NULL, 0, FALSE},
419 {WFD_CONF_CONNECTION_AGENT, "connection_agent", NULL, 0, FALSE},
420 {WFD_CONF_IP_OVER_EAPOL, "ip_over_eapol", NULL, 0, FALSE},
421 {WFD_CONF_IFACE_NAME, "interface", NULL, 0, FALSE},
422 {WFD_CONF_P2P_IFACE_NAME, "p2p_interface", NULL, 0, FALSE},
423 {WFD_CONF_GROUP_IFACE_NAME, "group_interface", NULL, 0, FALSE},
424 {WFD_CONF_DEFAULT_DEVICE_NAME, "device_name", NULL, 0, FALSE},
425 {WFD_CONF_PRIMARY_DEVICE_TYPE, "primary_device_type", NULL, 0, FALSE},
426 {WFD_CONF_SECONDARY_DEVICE_TYPE, "secondary_device_type", NULL, 0, FALSE},
427 {WFD_CONF_GO_INTENT, "go_intent", NULL, 0, FALSE},
428 {WFD_CONF_PERSISTENT_RE, "persistent_reconnect", NULL, 0, FALSE},
429 {WFD_CONF_LISTEN_REG_CLASS, "listen_reg_class", NULL, 0, FALSE},
430 {WFD_CONF_LISTEN_CHANNEL, "listen_channel", NULL, 0, FALSE},
431 {WFD_CONF_OPER_REG_CLASS, "operating_reg_class", NULL, 0, FALSE},
432 {WFD_CONF_OPER_CHANNEL, "operating_channel", NULL, 0, FALSE},
433 {WFD_CONF_CONFIG_METHOD, "config_methods", NULL, 0, FALSE},
434 {WFD_CONF_NO_GROUP_IFACE, "no_group_iface", NULL, 0, FALSE},
435 {WFD_CONF_GROUP_OPER_FREQ, "group_operating_freq", NULL, 0, FALSE},
436 {WFD_CONF_CONNECTION_TIMEOUT, "connection_timeout", NULL, 0, FALSE},
437 {WFD_CONF_MAX, NULL, NULL, 0, FALSE},
441 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
445 oem_conf = (wfd_oem_config_s*) manager->wfd_oem_conf;
447 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
451 __load_wfd_config(&key_file, wfd_conf);
453 if (wfd_conf[WFD_CONF_ON_DEMAND].value &&
454 g_strcmp0(wfd_conf[WFD_CONF_ON_DEMAND].value, "yes") == 0)
455 manager->is_on_demand = true;
457 manager->is_on_demand = false;
459 if (wfd_conf[WFD_CONF_CONNECTION_AGENT].value &&
460 g_strcmp0(wfd_conf[WFD_CONF_CONNECTION_AGENT].value, "yes") == 0)
461 manager->is_connection_agent = true;
463 manager->is_connection_agent = false;
465 if (wfd_conf[WFD_CONF_IP_OVER_EAPOL].value &&
466 g_strcmp0(wfd_conf[WFD_CONF_IP_OVER_EAPOL].value, "yes") == 0)
467 manager->is_ip_over_eapol = true;
469 manager->is_ip_over_eapol = false;
471 if (wfd_conf[WFD_CONF_IFACE_NAME].value &&
472 strlen(wfd_conf[WFD_CONF_IFACE_NAME].value) > 0)
473 g_strlcpy(oem_conf->ifname, wfd_conf[WFD_CONF_IFACE_NAME].value,
476 g_strlcpy(oem_conf->ifname, DEFAULT_IFNAME, IFACE_NAME_LEN+1);
478 if (wfd_conf[WFD_CONF_P2P_IFACE_NAME].value &&
479 strlen(wfd_conf[WFD_CONF_P2P_IFACE_NAME].value) > 0)
480 g_strlcpy(oem_conf->p2p_ifname, wfd_conf[WFD_CONF_P2P_IFACE_NAME].value,
483 g_strlcpy(oem_conf->p2p_ifname, DEFAULT_IFNAME, IFACE_NAME_LEN+1);
486 if (wfd_conf[WFD_CONF_GROUP_IFACE_NAME].value &&
487 strlen(wfd_conf[WFD_CONF_GROUP_IFACE_NAME].value) > 0)
488 g_strlcpy(oem_conf->group_ifname,
489 wfd_conf[WFD_CONF_GROUP_IFACE_NAME].value, IFACE_NAME_LEN+1);
491 g_strlcpy(oem_conf->group_ifname, GROUP_IFNAME, IFACE_NAME_LEN+1);
493 if (wfd_conf[WFD_CONF_DEFAULT_DEVICE_NAME].value &&
494 strlen(wfd_conf[WFD_CONF_DEFAULT_DEVICE_NAME].value) > 0)
495 g_strlcpy(oem_conf->device_name,
496 wfd_conf[WFD_CONF_DEFAULT_DEVICE_NAME].value, DEV_NAME_LEN+1);
498 g_strlcpy(oem_conf->device_name, DEFAULT_DEVICE_NAME, DEV_NAME_LEN+1);
500 if (wfd_conf[WFD_CONF_PRIMARY_DEVICE_TYPE].int_value > 0)
501 oem_conf->pri_dev_type = wfd_conf[WFD_CONF_PRIMARY_DEVICE_TYPE].int_value;
503 oem_conf->pri_dev_type = DEFAULT_PRIMARY_DEVICE_TYPE;
505 if (wfd_conf[WFD_CONF_SECONDARY_DEVICE_TYPE].int_value > 0)
506 oem_conf->sec_dev_type = wfd_conf[WFD_CONF_SECONDARY_DEVICE_TYPE].int_value;
508 oem_conf->sec_dev_type = DEFAULT_SECONDARY_DEVICE_TYPE;
510 if (wfd_conf[WFD_CONF_GO_INTENT].int_value > 0)
511 oem_conf->go_intent = wfd_conf[WFD_CONF_GO_INTENT].int_value;
513 oem_conf->go_intent = DEFAULT_GO_INTENT;
515 if (wfd_conf[WFD_CONF_PERSISTENT_RE].bool_value == TRUE)
516 oem_conf->persistent_reconnect = TRUE;
518 oem_conf->persistent_reconnect = FALSE;
520 if (wfd_conf[WFD_CONF_LISTEN_REG_CLASS].int_value > 0)
521 oem_conf->listen_reg_class = wfd_conf[WFD_CONF_LISTEN_REG_CLASS].int_value;
523 oem_conf->listen_reg_class = DEFAULT_LISTEN_REG_CLASS;
525 if (wfd_conf[WFD_CONF_LISTEN_CHANNEL].int_value > 0)
526 oem_conf->listen_channel = wfd_conf[WFD_CONF_LISTEN_CHANNEL].int_value;
528 oem_conf->listen_channel = DEFAULT_LISTEN_CHANNEL;
530 if (wfd_conf[WFD_CONF_OPER_REG_CLASS].int_value > 0)
531 oem_conf->operating_reg_class = wfd_conf[WFD_CONF_OPER_REG_CLASS].int_value;
533 oem_conf->operating_reg_class = DEFAULT_OPER_REG_CLASS;
535 if (wfd_conf[WFD_CONF_OPER_CHANNEL].int_value > 0)
536 oem_conf->operating_channel = wfd_conf[WFD_CONF_OPER_CHANNEL].int_value;
538 oem_conf->operating_channel = DEFAULT_OPER_CHANNEL;
540 if (wfd_conf[WFD_CONF_CONFIG_METHOD].value)
541 g_strlcpy(oem_conf->config_methods,
542 wfd_conf[WFD_CONF_CONFIG_METHOD].value, OEM_CONFIG_METHOD_LEN+1);
544 g_strlcpy(oem_conf->config_methods,
545 DEFAULT_CONFIG_METHOD, OEM_CONFIG_METHOD_LEN+1);
547 if (wfd_conf[WFD_CONF_NO_GROUP_IFACE].bool_value == TRUE)
548 oem_conf->no_group_iface = TRUE;
550 oem_conf->no_group_iface = FALSE;
552 if (wfd_conf[WFD_CONF_GROUP_OPER_FREQ].int_value > 0)
553 oem_conf->group_operating_freq = wfd_conf[WFD_CONF_GROUP_OPER_FREQ].int_value;
555 oem_conf->group_operating_freq = 0;
557 if (wfd_conf[WFD_CONF_CONNECTION_TIMEOUT].int_value > 0)
558 manager->connection_timeout = wfd_conf[WFD_CONF_CONNECTION_TIMEOUT].int_value;
560 manager->connection_timeout = DEFAULT_CONNECTION_TIMEOUT;
562 __unload_wfd_config(key_file, wfd_conf);
564 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
568 static int _txt_to_mac(char *txt, unsigned char *mac)
573 mac[i++] = (char) strtoul(txt, &txt, 16);
574 if (i == MACADDR_LEN || !*txt++)
578 if (i != MACADDR_LEN)
581 WDS_LOGD("Converted MAC address [" MACSECSTR "]",
586 static int _txt_to_ip(char *txt, unsigned char *ip)
591 ip[i++] = (char) strtoul(txt, &txt, 10);
592 if (i == IPADDR_LEN || !*txt++)
599 WDS_LOGD("Converted IP address [" IPSECSTR "]", IP2SECSTR(ip));
603 #if !(__GNUC__ <= 4 && __GNUC_MINOR__ < 8)
604 int wfd_util_get_current_time(unsigned long *cur_time)
606 struct timespec time;
608 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
611 res = clock_gettime(CLOCK_REALTIME, &time);
613 WDS_LOGD("Succeeded to get current real time");
614 *cur_time = time.tv_sec;
617 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
618 WDS_LOGE("Failed to get current real time(%s)", error_buf);
621 res = clock_gettime(CLOCK_MONOTONIC, &time);
623 WDS_LOGD("Succeeded to get current system time");
624 *cur_time = time.tv_sec;
627 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
628 WDS_LOGE("Failed to get current system time(%s)", error_buf);
634 static int __wfd_util_find_login_user(uid_t *uid)
640 ret = sd_get_uids(&uids);
644 for (i = 0; i < ret ; i++) {
645 if (sd_uid_get_state(uids[i], &state) < 0) {
649 if (!strncmp(state, "online", 6)) {
662 gboolean wfd_util_execute_file(const char *file_path,
663 char *const args[], char *const envs[])
668 register unsigned int index = 0;
669 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
671 while (args[index] != NULL) {
672 WDS_LOGD("[%s]", args[index]);
676 if (!(pid = fork())) {
677 WDS_LOGD("pid(%d), ppid(%d)", getpid(), getppid());
678 WDS_LOGD("Inside child, exec (%s) command", file_path);
681 if (execve(file_path, args, envs) == -1) {
682 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
683 WDS_LOGE("Fail to execute command (%s)", error_buf);
686 } else if (pid > 0) {
687 if (waitpid(pid, &rv, 0) == -1)
688 WDS_LOGD("wait pid (%u) rv (%d)", pid, rv);
690 WDS_LOGD("exited, rv=%d", WEXITSTATUS(rv));
691 else if (WIFSIGNALED(rv))
692 WDS_LOGD("killed by signal %d", WTERMSIG(rv));
693 else if (WIFSTOPPED(rv))
694 WDS_LOGD("stopped by signal %d", WSTOPSIG(rv));
695 else if (WIFCONTINUED(rv))
696 WDS_LOGD("continued");
700 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
701 WDS_LOGE("failed to fork (%s)", error_buf);
705 int wfd_util_channel_to_freq(int channel)
707 if (channel < 1 || channel > 161 ||
708 (channel > 48 && channel < 149) ||
709 (channel > 14 && channel < 36)) {
710 WDS_LOGE("Unsupported channel[%d]", channel);
715 return 5000 + 5*channel;
716 else if (channel == 14)
719 return 2407 + 5*channel;
722 int wfd_util_freq_to_channel(int freq)
724 if (freq < 2412 || freq > 5825 ||
725 (freq > 2484 && freq < 5180)) {
726 WDS_LOGE("Unsupported frequency[%d]", freq);
731 return 36 + (freq - 5180)/5;
732 else if (freq <= 2472)
733 return 1 + (freq - 2412)/5;
734 else if (freq == 2484)
741 int wfd_util_get_phone_name(char *phone_name)
743 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
746 name = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR);
748 WDS_LOGE("Failed to get vconf value for %s", VCONFKEY_SETAPPL_DEVICE_NAME_STR);
751 g_strlcpy(phone_name, name, DEV_NAME_LEN + 1);
752 WDS_LOGD("[%s: %s]", VCONFKEY_SETAPPL_DEVICE_NAME_STR, phone_name);
754 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
758 void _wfd_util_dev_name_changed_cb(keynode_t *key, void *data)
760 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
761 char dev_name[DEV_NAME_LEN+1] = {0, };
764 res = wfd_util_get_phone_name(dev_name);
766 WDS_LOGE("Failed to get phone name(vconf)");
769 WDS_LOGD("Device name changed as [%s]", dev_name);
771 res = wfd_local_set_dev_name(dev_name);
773 WDS_LOGE("Failed to set device name");
774 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
778 void wfd_util_set_dev_name_notification()
780 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
783 res = vconf_notify_key_changed(VCONFKEY_SETAPPL_DEVICE_NAME_STR, _wfd_util_dev_name_changed_cb, NULL);
785 WDS_LOGE("Failed to set vconf notification callback(SETAPPL_DEVICE_NAME_STR)");
789 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
793 void wfd_util_unset_dev_name_notification()
795 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
798 res = vconf_ignore_key_changed(VCONFKEY_SETAPPL_DEVICE_NAME_STR, _wfd_util_dev_name_changed_cb);
800 WDS_LOGE("Failed to set vconf notification callback(SETAPPL_DEVICE_NAME_STR)");
804 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
808 int wfd_util_check_wifi_state()
810 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
814 /* vconf key and value (vconf-keys.h)
815 #define VCONFKEY_WIFI_STATE "memory/wifi/state"
817 VCONFKEY_WIFI_OFF = 0x00,
818 VCONFKEY_WIFI_UNCONNECTED,
819 VCONFKEY_WIFI_CONNECTED,
820 VCONFKEY_WIFI_TRANSFER,
821 VCONFKEY_WIFI_STATE_MAX
824 res = vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
826 WDS_LOGE("Failed to get vconf value [%s]", VCONFKEY_WIFI_STATE);
827 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
830 WDS_LOGD("[%s: %d]", VCONFKEY_WIFI_STATE, wifi_state);
832 if (wifi_state > VCONFKEY_WIFI_OFF) {
833 WDS_LOGD("Wi-Fi is on");
834 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
837 WDS_LOGD("OK. Wi-Fi is off\n");
839 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
843 int wfd_util_check_mobile_ap_state()
845 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
846 int mobile_ap_state = 0;
849 res = vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &mobile_ap_state);
851 WDS_LOGE("Failed to get vconf value[%s]", VCONFKEY_MOBILE_HOTSPOT_MODE);
852 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
855 WDS_LOGD("[%s: %d]", VCONFKEY_MOBILE_HOTSPOT_MODE, mobile_ap_state);
857 if ((mobile_ap_state & VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI)
858 || (mobile_ap_state & VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI_AP)) {
859 WDS_LOGD("Mobile AP is on");
860 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
863 WDS_LOGD("OK. Mobile AP is off\n");
865 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
871 static void __check_feature_supported(const char *key,
872 bool *feature_supported)
874 if (system_info_get_platform_bool(key, feature_supported) < 0) {
875 WDS_LOGE("system-info failed to get feature supported flag");
876 *feature_supported = false;
881 static bool __is_wifi_direct_display_feature_supported()
883 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
886 __check_feature_supported(WIFI_DIRECT_DISPLAY_FEATURE, &supported);
888 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
892 static bool __is_wifi_direct_service_discovery_feature_supported()
894 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
897 __check_feature_supported(WIFI_DIRECT_SERVICE_DISCOVERY_FEATURE, &supported);
899 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
903 static bool __is_asp_feature_supported()
905 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
908 __check_feature_supported(ASP_FEATURE, &supported);
910 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
914 static bool __is_tethering_wifi_feature_supported()
916 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
919 __check_feature_supported(TETHERING_WIFI_FEATURE, &supported);
921 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
925 static bool __is_tethering_wifi_direct_feature_supported()
927 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
930 __check_feature_supported(TETHERING_WIFI_DIRECT_FEATURE, &supported);
932 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
936 void wfd_util_check_features(wfd_manager_s * manager)
938 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
941 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
945 manager->is_on_demand_supported = TRUE;
947 if (__is_wifi_direct_display_feature_supported())
948 manager->is_wifi_display_supported = TRUE;
950 manager->is_wifi_display_supported = FALSE;
952 if (__is_wifi_direct_service_discovery_feature_supported())
953 manager->is_service_discovery_supported = TRUE;
955 manager->is_service_discovery_supported = FALSE;
957 if (__is_asp_feature_supported())
958 manager->is_asp_supported = TRUE;
960 manager->is_asp_supported = FALSE;
962 if (__is_tethering_wifi_feature_supported())
963 manager->is_tethering_wifi_supported = TRUE;
965 manager->is_tethering_wifi_supported = FALSE;
967 if (__is_tethering_wifi_direct_feature_supported())
968 manager->is_tethering_wifi_direct_supported = TRUE;
970 manager->is_tethering_wifi_direct_supported = FALSE;
972 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
977 int wfd_util_check_p2p_hotspot_state()
979 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
980 int hotspot_state = 0;
983 wfd_manager_s * manager = wfd_get_manager();
987 if (!manager->is_tethering_wifi_direct_supported)
990 res = vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &hotspot_state);
992 WDS_LOGE("Failed to get vconf value[%s]", VCONFKEY_MOBILE_HOTSPOT_MODE);
993 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
997 if (hotspot_state & VCONFKEY_MOBILE_HOTSPOT_MODE_P2P) {
998 WDS_LOGD("P2P Hotspot is on");
999 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1003 WDS_LOGD("P2P Hotspot is off");
1004 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1008 int wfd_util_wifi_direct_activatable()
1010 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1012 #if defined TIZEN_TETHERING_ENABLE
1015 res_mobap = wfd_util_check_mobile_ap_state();
1016 if (res_mobap < 0) {
1017 WDS_LOGE("Failed to check Mobile AP state");
1018 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1019 return WIFI_DIRECT_ERROR_OPERATION_FAILED;
1020 } else if (res_mobap > 0) {
1021 WDS_LOGE("Mobile AP is On");
1022 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1023 return WIFI_DIRECT_ERROR_MOBILE_AP_USED;
1025 WDS_LOGE("Mobile AP is Off");
1026 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1027 return WIFI_DIRECT_ERROR_NONE;
1031 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1032 return WIFI_DIRECT_ERROR_NONE;
1036 int wfd_util_get_wifi_direct_state()
1038 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1042 res = vconf_get_int(VCONFKEY_WIFI_DIRECT_STATE, &state);
1044 WDS_LOGE("Failed to get vconf value [%s]\n", VCONFKEY_WIFI_DIRECT_STATE);
1045 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1049 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1054 int wfd_util_set_wifi_direct_state(int state)
1056 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1057 static int last_state = WIFI_DIRECT_STATE_DEACTIVATED;
1058 int vconf_state = VCONFKEY_WIFI_DIRECT_DEACTIVATED;
1061 if (state < WIFI_DIRECT_STATE_DEACTIVATED ||
1062 state > WIFI_DIRECT_STATE_GROUP_OWNER) {
1063 WDS_LOGE("Invalid parameter");
1064 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1068 if (last_state == state) {
1069 WDS_LOGD("No change in state, not updating vconf [%s]",
1070 VCONFKEY_WIFI_DIRECT_STATE);
1071 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1075 if (state == WIFI_DIRECT_STATE_ACTIVATED)
1076 vconf_state = VCONFKEY_WIFI_DIRECT_ACTIVATED;
1077 else if (state == WIFI_DIRECT_STATE_DEACTIVATED)
1078 vconf_state = VCONFKEY_WIFI_DIRECT_DEACTIVATED;
1079 else if (state == WIFI_DIRECT_STATE_CONNECTED)
1080 vconf_state = VCONFKEY_WIFI_DIRECT_CONNECTED;
1081 else if (state == WIFI_DIRECT_STATE_GROUP_OWNER)
1082 vconf_state = VCONFKEY_WIFI_DIRECT_GROUP_OWNER;
1083 else if (state == WIFI_DIRECT_STATE_DISCOVERING)
1084 vconf_state = VCONFKEY_WIFI_DIRECT_DISCOVERING;
1085 else if (state == WIFI_DIRECT_STATE_DEACTIVATING)
1086 vconf_state = VCONFKEY_WIFI_DIRECT_DEACTIVATING;
1087 else if (state == WIFI_DIRECT_STATE_ACTIVATING)
1088 vconf_state = VCONFKEY_WIFI_DIRECT_ACTIVATING;
1089 else if (state == WIFI_DIRECT_STATE_CONNECTING)
1090 vconf_state = VCONFKEY_WIFI_DIRECT_CONNECTING;
1091 else if (state == WIFI_DIRECT_STATE_DISCONNECTING)
1092 vconf_state = VCONFKEY_WIFI_DIRECT_DISCONNECTING;
1094 WDS_LOGE("This state cannot be set as wifi_direct vconf state[%d]", state);
1098 WDS_LOGD("Vconf key set [%s: %d]", VCONFKEY_WIFI_DIRECT_STATE, vconf_state);
1100 res = vconf_set_int(VCONFKEY_WIFI_DIRECT_STATE, vconf_state);
1102 WDS_LOGE("Failed to set vconf [%s]", VCONFKEY_WIFI_DIRECT_STATE);
1103 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1109 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1113 int wfd_util_get_local_dev_mac(unsigned char *dev_mac)
1115 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1116 char file_path[MAX_FILE_PATH_LEN] = {0, };
1118 char local_mac[MACSTR_LEN] = {0, };
1121 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
1122 wfd_manager_s *manager = wfd_get_manager();
1127 wfd_oem_config_s *config = manager->wfd_oem_conf;
1129 g_snprintf(file_path, sizeof(file_path),
1130 "/sys/class/net/%s/address", config->ifname);
1132 g_strlcpy(file_path, DEFAULT_MAC_FILE_PATH, sizeof(file_path));
1135 fd = fopen(file_path, "r");
1137 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1138 WDS_LOGE("Failed to open MAC info file [%s] (%s)", file_path , error_buf);
1139 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1144 ptr = fgets(local_mac, MACSTR_LEN, fd);
1146 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1147 WDS_LOGE("Failed to read file or no data read(%s)", error_buf);
1149 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1152 WDS_SECLOGD("Local MAC address [%s]", ptr);
1154 res = _txt_to_mac(local_mac, dev_mac);
1156 WDS_LOGE("Failed to convert text to MAC address");
1158 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1162 WDS_LOGD("Local Device MAC address [" MACSECSTR "]", MAC2SECSTR(dev_mac));
1165 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1169 int wfd_util_start_wifi_direct_popup()
1174 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1175 #if !defined(BUILD_GTESTS)
1176 ret = __wfd_util_find_login_user(&uid);
1178 WDS_LOGE("__wfd_util_find_login_user Failed !");
1179 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1183 if (AUL_R_OK != aul_launch_app_async_for_uid(
1184 "org.tizen.wifi-direct-popup", NULL, uid)) {
1185 WDS_LOGE("aul_launch_for_uid Failed !");
1186 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1190 WDS_LOGD("Succeeded to launch wifi-direct-popup");
1191 #endif /* BUILD_GTESTS */
1192 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1196 int wfd_util_stop_wifi_direct_popup()
1201 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1202 #if !defined(BUILD_GTESTS)
1203 ret = __wfd_util_find_login_user(&uid);
1205 WDS_LOGE("__wfd_util_find_login_user Failed !");
1206 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1210 int pid = aul_app_get_pid_for_uid("org.tizen.wifi-direct-popup", uid);
1212 if (aul_terminate_pid_async_for_uid(pid, uid) != AUL_R_OK) {
1213 WDS_LOGD("Failed to destroy wifi-direct-popup pid[%d]", pid);
1214 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1217 WDS_LOGD("Succeeded to destroy wifi-direct-popup");
1220 WDS_LOGD("Wifi-direct-popup not running");
1222 #endif /* BUILD_GTESTS */
1223 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1227 int _connect_remote_device(char *ip_str)
1232 struct sockaddr_in remo_addr;
1233 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
1236 sock = socket(PF_INET, SOCK_STREAM, 0);
1238 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1239 WDS_LOGE("Failed to create socket to remote device(%s)", error_buf);
1243 flags = fcntl(sock, F_GETFL, 0);
1244 res = fcntl(sock, F_SETFL, flags | O_NONBLOCK);
1246 WDS_LOGE("File descriptor create failed");
1248 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1252 memset(&remo_addr, 0x0, sizeof(remo_addr));
1253 remo_addr.sin_family = AF_INET;
1254 remo_addr.sin_addr.s_addr = inet_addr(ip_str);
1255 remo_addr.sin_port = htons(9999);
1258 res = connect(sock, (struct sockaddr*) &remo_addr, sizeof(remo_addr));
1260 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1261 WDS_LOGE("Failed to connect to server socket [%s]", error_buf);
1263 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1267 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1268 WDS_SECLOGD("Status of connection to remote device[%s] - (%s)", ip_str, error_buf);
1276 static void _dhcps_ip_leased_cb(keynode_t *key, void* data)
1278 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1279 wfd_device_s *peer = (wfd_device_s*) data;
1281 char buf[MAX_DHCP_DUMP_SIZE];
1282 char ip_str[IPSTR_LEN] = {0, };
1283 char intf_str[MACSTR_LEN];
1284 unsigned char intf_addr[MACADDR_LEN];
1285 char peer_mac_address[MACSTR_LEN+1] = {0,};
1286 char assigned_ip_address[IPSTR_LEN+1] = {0,};
1288 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
1291 WDS_LOGD("Invalid parameter");
1294 WDS_LOGD("DHCP server: IP leased");
1297 fp = fopen(DHCP_DUMP_FILE, "r");
1299 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1300 WDS_LOGE("Could not read the file(%s). [%s]", DHCP_DUMP_FILE, error_buf);
1304 while (fgets(buf, MAX_DHCP_DUMP_SIZE, fp) != NULL) {
1305 WDS_LOGD("Read line [%s]", buf);
1306 n = sscanf(buf, "%17s %15s", intf_str, ip_str);
1307 WDS_LOGD("ip=[%s], mac=[%s]", ip_str, intf_str);
1311 _txt_to_mac(intf_str, intf_addr);
1312 if (!memcmp(peer->intf_addr, intf_addr, MACADDR_LEN)) {
1313 WDS_LOGD("Peer intf mac found");
1314 _txt_to_ip(ip_str, peer->ip_addr);
1315 _connect_remote_device(ip_str);
1316 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1317 g_snprintf(assigned_ip_address, IPSTR_LEN, IPSTR, IP2STR(peer->ip_addr));
1318 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1320 g_variant_new("(ss)", peer_mac_address,
1321 assigned_ip_address));
1324 WDS_LOGD("Different interface address peer[" MACSECSTR "] vs dhcp[" MACSECSTR "]",
1325 MAC2SECSTR(peer->intf_addr), MAC2SECSTR(intf_addr));
1330 vconf_ignore_key_changed(VCONFKEY_WIFI_DIRECT_DHCP_IP_LEASE, _dhcps_ip_leased_cb);
1331 vconf_set_int(VCONFKEY_WIFI_DIRECT_DHCP_IP_LEASE, 0);
1333 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1337 static gboolean _polling_ip(gpointer user_data)
1339 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1340 wfd_manager_s *manager = wfd_get_manager();
1341 wfd_device_s *local = (wfd_device_s*) manager->local;
1342 wfd_device_s *peer = (wfd_device_s*) user_data;
1343 char *ifname = NULL;
1344 char ip_str[IPSTR_LEN] = {0, };
1345 static int count = 0;
1349 WDS_LOGE("peer data is not exists");
1353 res = wfd_manager_get_goup_ifname(&ifname);
1354 if (res < 0 || !ifname) {
1355 WDS_LOGE("Failed to get group interface name");
1360 WDS_LOGE("Failed to get IP");
1362 wfd_oem_destroy_group(manager->oem_ops, ifname);
1363 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1366 res = wfd_util_local_get_ip(ifname, local->ip_addr, 0);
1368 WDS_LOGE("Failed to get local IP for interface %s(count=%d)", ifname, count++);
1369 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1372 WDS_LOGD("Succeeded to get local(client) IP [" IPSECSTR "] for iface[%s]",
1373 IP2SECSTR(local->ip_addr), ifname);
1375 res = wfd_util_dhcpc_get_server_ip(peer->ip_addr);
1377 WDS_LOGE("Failed to get peer(server) IP(count=%d)", count++);
1378 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1381 WDS_LOGD("Succeeded to get server IP [" IPSECSTR "]", IP2SECSTR(peer->ip_addr));
1384 g_snprintf(ip_str, IPSTR_LEN, IPSTR, IP2STR(peer->ip_addr));
1385 _connect_remote_device(ip_str);
1387 char peer_mac_address[MACSTR_LEN+1] = {0, };
1389 g_snprintf(peer_mac_address, MACSTR_LEN, MACSTR, MAC2STR(peer->dev_addr));
1390 wfd_manager_dbus_emit_signal(WFD_MANAGER_MANAGE_INTERFACE,
1392 g_variant_new("(iis)", WIFI_DIRECT_ERROR_NONE,
1393 WFD_EVENT_CONNECTION_RSP,
1396 wfd_session_s *session = manager->session;
1397 if (wfd_asp_is_asp_session(session)) {
1398 wfd_asp_connect_status(session->session_mac,
1399 session->session_id,
1400 ASP_CONNECT_STATUS_GROUP_FORMATION_COMPLETED,
1404 wfd_state_set(manager, WIFI_DIRECT_STATE_CONNECTED);
1405 wfd_util_set_wifi_direct_state(WIFI_DIRECT_STATE_CONNECTED);
1406 wfd_destroy_session(manager);
1408 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1413 int wfd_util_dhcps_start(char *ifname)
1415 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1416 gboolean rv = FALSE;
1417 char *const iface = ifname;
1418 const char *path = "/usr/bin/wifi-direct-dhcp.sh";
1419 char *const args[] = { "/usr/bin/wifi-direct-dhcp.sh", "server", iface, NULL };
1420 char *const envs[] = { NULL };
1421 wfd_manager_s *manager = wfd_get_manager();
1423 vconf_set_int(VCONFKEY_WIFI_DIRECT_DHCP_IP_LEASE, 0);
1425 rv = wfd_util_execute_file(path, args, envs);
1428 WDS_LOGE("Failed to start wifi-direct-dhcp.sh server");
1433 * As we are GO so IP should be updated
1434 * before sending Group Created Event
1436 vconf_set_str(VCONFKEY_WIFI_DIRECT_P2P_IFNAME, GROUP_IFNAME);
1437 vconf_set_str(VCONFKEY_WIFI_DIRECT_P2P_LOCAL_IP, "192.168.49.1");
1438 vconf_set_str(VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK, "255.255.255.0");
1439 vconf_set_str(VCONFKEY_WIFI_DIRECT_P2P_GATEWAY, "192.168.49.1");
1441 WDS_LOGD("Successfully started wifi-direct-dhcp.sh server");
1443 _txt_to_ip(TIZEN_P2P_GO_IPADDR, manager->local->ip_addr);
1445 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1449 int wfd_util_dhcps_wait_ip_leased(wfd_device_s *peer)
1451 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1454 WDS_LOGE("Invalid parameter");
1458 vconf_ignore_key_changed(VCONFKEY_WIFI_DIRECT_DHCP_IP_LEASE, _dhcps_ip_leased_cb);
1459 vconf_set_int(VCONFKEY_WIFI_DIRECT_DHCP_IP_LEASE, 0);
1460 vconf_notify_key_changed(VCONFKEY_WIFI_DIRECT_DHCP_IP_LEASE, _dhcps_ip_leased_cb, peer);
1462 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1466 int wfd_util_dhcps_stop(char *ifname)
1468 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1469 gboolean rv = FALSE;
1470 char *const iface = ifname;
1471 const char *path = "/usr/bin/wifi-direct-dhcp.sh";
1472 char *const args[] = { "/usr/bin/wifi-direct-dhcp.sh", "stop", iface, NULL };
1473 char *const envs[] = { NULL };
1475 vconf_ignore_key_changed(VCONFKEY_WIFI_DIRECT_DHCP_IP_LEASE, _dhcps_ip_leased_cb);
1476 vconf_set_int(VCONFKEY_WIFI_DIRECT_DHCP_IP_LEASE, 0);
1478 rv = wfd_util_execute_file(path, args, envs);
1481 WDS_LOGE("Failed to stop wifi-direct-dhcp.sh");
1484 WDS_LOGD("Successfully stopped wifi-direct-dhcp.sh");
1486 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1490 int wfd_util_dhcpc_start(char *ifname, wfd_device_s *peer)
1492 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1493 gboolean rv = FALSE;
1494 char *const iface = ifname;
1495 const char *path = "/usr/bin/wifi-direct-dhcp.sh";
1496 char *const args[] = { "/usr/bin/wifi-direct-dhcp.sh", "client", iface, NULL };
1497 char *const envs[] = { NULL };
1500 WDS_LOGE("Invalid parameter");
1504 rv = wfd_util_execute_file(path, args, envs);
1506 WDS_LOGE("Failed to start wifi-direct-dhcp.sh client");
1509 WDS_LOGD("Successfully started wifi-direct-dhcp.sh client");
1511 g_timeout_add(250, (GSourceFunc) _polling_ip, peer);
1513 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1517 int wfd_util_dhcpc_stop(char *ifname)
1519 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1520 gboolean rv = FALSE;
1521 char *const iface = ifname;
1522 const char *path = "/usr/bin/wifi-direct-dhcp.sh";
1523 char *const args[] = { "/usr/bin/wifi-direct-dhcp.sh", "stop", iface, NULL };
1524 char *const envs[] = { NULL };
1526 rv = wfd_util_execute_file(path, args, envs);
1529 WDS_LOGE("Failed to stop wifi-direct-dhcp.sh");
1532 WDS_LOGD("Successfully stopped wifi-direct-dhcp.sh");
1534 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1538 int wfd_util_local_get_ip(char *ifname, unsigned char *ip_addr, int is_IPv6)
1540 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1542 struct sockaddr_in *sin = NULL;
1543 char *ip_str = NULL;
1546 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
1548 if (!ifname || !ip_addr) {
1549 WDS_LOGE("Invalid parameter");
1550 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1555 sock = socket(AF_INET, SOCK_DGRAM, 0);
1556 if (sock < SOCK_FD_MIN) {
1557 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1558 WDS_LOGE("Failed to create socket. [%s]", error_buf);
1561 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1565 ifr.ifr_addr.sa_family = AF_INET;
1566 memset(ifr.ifr_name, 0x00, IFNAMSIZ);
1567 g_strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
1570 res = ioctl(sock, SIOCGIFADDR, &ifr);
1572 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1573 WDS_LOGE("Failed to get IP from socket. [%s]", error_buf);
1575 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1580 sin = (struct sockaddr_in*) &ifr.ifr_broadaddr;
1581 ip_str = inet_ntoa(sin->sin_addr);
1582 _txt_to_ip(ip_str, ip_addr);
1583 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1588 int wfd_util_dhcpc_get_server_ip(unsigned char* ip_addr)
1590 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1591 char* get_str = NULL;
1595 WDS_LOGE("Invalid parameter");
1596 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1600 while (count < 10) {
1601 get_str = vconf_get_str(VCONFKEY_WIFI_DIRECT_DHCPC_SERVER_IP);
1603 WDS_LOGE("Failed to get vconf value[%s]", VCONFKEY_WIFI_DIRECT_DHCPC_SERVER_IP);
1604 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1608 if (strcmp(get_str, ZEROIP) == 0) {
1609 WDS_LOGE("Failed to get vconf value[%s]", VCONFKEY_WIFI_DIRECT_DHCPC_SERVER_IP);
1611 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1615 WDS_LOGD("VCONFKEY_WIFI_DIRECT_DHCPC_SERVER_IP(%s) : %s\n", VCONFKEY_WIFI_DIRECT_DHCPC_SERVER_IP, get_str);
1616 _txt_to_ip(get_str, ip_addr);
1623 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1628 static int _wfd_util_set_vconf_for_static_ip(const char *ifname, char *static_ip)
1630 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1632 if (!ifname || !static_ip)
1635 vconf_set_str(VCONFKEY_WIFI_DIRECT_P2P_IFNAME, ifname);
1636 vconf_set_str(VCONFKEY_WIFI_DIRECT_P2P_LOCAL_IP, static_ip);
1637 vconf_set_str(VCONFKEY_WIFI_DIRECT_P2P_SUBNET_MASK, "255.255.255.0");
1638 vconf_set_str(VCONFKEY_WIFI_DIRECT_P2P_GATEWAY, "192.168.49.1");
1640 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1646 static int _wfd_util_static_ip_set(const char *ifname, unsigned char *static_ip)
1648 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1650 unsigned char ip_addr[IPADDR_LEN];
1651 char ip_str[IPSTR_LEN] = {0, };
1655 struct sockaddr_nl dst_addr;
1659 struct ifaddrmsg ifa;
1664 struct msghdr nl_msg;
1666 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
1668 if (!ifname || !static_ip) {
1669 WDS_LOGE("Invalid parameter");
1670 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1674 /* Get index of interface */
1675 if_index = if_nametoindex(ifname);
1677 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1678 WDS_LOGE("Failed to get interface index. [%s]", error_buf);
1679 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1683 WDS_LOGD("Creating a Netlink Socket");
1684 nl_sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
1686 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1687 WDS_LOGE("Failed to create socket. [%s]", error_buf);
1688 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1692 memset(&dst_addr, 0, sizeof(dst_addr));
1693 dst_addr.nl_family = AF_NETLINK;
1694 dst_addr.nl_pid = 0;
1696 memset(&req, 0, sizeof(req));
1697 req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg));
1698 req.nh.nlmsg_type = RTM_NEWADDR;
1699 req.nh.nlmsg_flags = NLM_F_CREATE | NLM_F_EXCL | NLM_F_REQUEST;
1701 req.ifa.ifa_family = AF_INET;
1702 req.ifa.ifa_prefixlen = 24;
1703 req.ifa.ifa_flags = IFA_F_PERMANENT;
1704 req.ifa.ifa_scope = 0;
1705 req.ifa.ifa_index = if_index;
1707 rta = (struct rtattr *)(req.attrbuf);
1708 rta->rta_type = IFA_LOCAL;
1709 rta->rta_len = RTA_LENGTH(IPADDR_LEN);
1710 memcpy(RTA_DATA(rta), static_ip, IPADDR_LEN);
1711 req.nh.nlmsg_len = NLMSG_ALIGN(req.nh.nlmsg_len) + rta->rta_len;
1713 rta = (struct rtattr *)(req.attrbuf + rta->rta_len);
1714 rta->rta_type = IFA_BROADCAST;
1715 rta->rta_len = RTA_LENGTH(IPADDR_LEN);
1716 memcpy(ip_addr, static_ip, IPADDR_LEN);
1718 memcpy(RTA_DATA(rta), ip_addr, IPADDR_LEN);
1719 req.nh.nlmsg_len += rta->rta_len;
1721 memset(&iov, 0, sizeof(iov));
1722 iov.iov_base = &req;
1723 iov.iov_len = req.nh.nlmsg_len;
1725 memset(&nl_msg, 0, sizeof(nl_msg));
1726 nl_msg.msg_name = (void *)&dst_addr;
1727 nl_msg.msg_namelen = sizeof(dst_addr);
1728 nl_msg.msg_iov = &iov;
1729 nl_msg.msg_iovlen = 1;
1731 res = sendmsg(nl_sock, &nl_msg, 0);
1733 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1734 WDS_LOGE("Failed to sendmsg. [%s]", error_buf);
1736 WDS_LOGD("Succed to sendmsg. [%d]", res);
1740 WDS_LOGE("Succeeded to set local(client) IP [" IPSTR "] for iface[%s]",
1741 IP2STR(static_ip), ifname);
1743 snprintf(ip_str, IPSTR_LEN, IPSTR, IP2STR(static_ip));
1744 _wfd_util_set_vconf_for_static_ip(ifname, ip_str);
1746 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1750 int wfd_util_ip_over_eap_assign(wfd_device_s *peer, const char *ifname)
1752 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1753 wfd_manager_s *manager = wfd_get_manager();
1754 wfd_device_s *local = (wfd_device_s*) manager->local;
1756 char ip_str[IPSTR_LEN] = {0, };
1759 WDS_LOGE("Invalid paramater");
1763 _wfd_util_static_ip_set(ifname, peer->client_ip_addr);
1764 memcpy(peer->ip_addr, peer->go_ip_addr, IPADDR_LEN);
1765 memcpy(local->ip_addr, peer->client_ip_addr, IPADDR_LEN);
1767 g_snprintf(ip_str, IPSTR_LEN, IPSTR, IP2STR(peer->ip_addr));
1768 _connect_remote_device(ip_str);
1770 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1775 int wfd_util_ip_unset(const char *ifname)
1777 __WDS_LOG_FUNC_ENTER__;//LCOV_EXCL_LINE
1779 unsigned char ip_addr[IPADDR_LEN];
1780 char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
1784 struct sockaddr_nl dst_addr;
1788 struct ifaddrmsg ifa;
1793 struct msghdr nl_msg;
1796 WDS_LOGE("Invalid parameter");
1797 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1801 res = wfd_util_local_get_ip((char *)ifname, ip_addr, 0);
1803 WDS_LOGE("Failed to get local IP for interface %s", ifname);
1804 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1807 WDS_LOGE("Succeeded to get local(client) IP [" IPSTR "] for iface[%s]",
1808 IP2STR(ip_addr), ifname);
1810 if_index = if_nametoindex(ifname);
1812 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1813 WDS_LOGE("Failed to get interface index. [%s]", error_buf);
1814 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1818 WDS_LOGD("Creating a Netlink Socket");
1819 nl_sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
1821 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1822 WDS_LOGE("Failed to create socket. [%s]", error_buf);
1823 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1827 WDS_LOGD("Set dst socket address to kernel");
1828 memset(&dst_addr, 0, sizeof(dst_addr));
1829 dst_addr.nl_family = AF_NETLINK;
1830 dst_addr.nl_pid = 0;
1832 memset(&req, 0, sizeof(req));
1833 req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg));
1834 req.nh.nlmsg_type = RTM_DELADDR;
1835 req.nh.nlmsg_flags = NLM_F_REQUEST;
1837 req.ifa.ifa_family = AF_INET;
1838 req.ifa.ifa_prefixlen = 32;
1839 req.ifa.ifa_flags = IFA_F_PERMANENT;
1840 req.ifa.ifa_scope = 0;
1841 req.ifa.ifa_index = if_index;
1843 rta = (struct rtattr *)(req.attrbuf);
1844 rta->rta_type = IFA_LOCAL;
1845 rta->rta_len = RTA_LENGTH(IPADDR_LEN);
1846 memcpy(RTA_DATA(rta), ip_addr, IPADDR_LEN);
1847 req.nh.nlmsg_len = NLMSG_ALIGN(req.nh.nlmsg_len) + rta->rta_len;
1849 memset(&iov, 0, sizeof(iov));
1850 iov.iov_base = &req;
1851 iov.iov_len = req.nh.nlmsg_len;
1853 memset(&nl_msg, 0, sizeof(nl_msg));
1854 nl_msg.msg_name = (void *)&dst_addr;
1855 nl_msg.msg_namelen = sizeof(dst_addr);
1856 nl_msg.msg_iov = &iov;
1857 nl_msg.msg_iovlen = 1;
1859 res = sendmsg(nl_sock, &nl_msg, 0);
1861 strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
1862 WDS_LOGE("Failed to sendmsg. [%s]", error_buf);
1864 WDS_LOGD("Succeed to sendmsg. [%d]", res);
1869 __WDS_LOG_FUNC_EXIT__;//LCOV_EXCL_LINE
1874 gboolean wfd_util_is_remove_group_allowed(void)
1876 wfd_manager_s *manager = wfd_get_manager();
1878 if (!manager->auto_group_remove_enable)