#include "network-dpm.h"
#include "network-monitor.h"
#include "netsupplicant.h"
+#include "clatd-handler.h"
#if defined TIZEN_DEBUG_ENABLE
#include "network-dump.h"
#endif
#if defined TIZEN_DEBUG_ENABLE
static Tcpdump *tcpdump_object = NULL;
#endif
+static Battery *battery_object = NULL;
struct netconfig_default_connection {
char *profile;
return is_connected;
}
-static char *__netconfig_get_default_profile(void)
-{
- GVariant *message = NULL;
- GVariantIter *iter;
- GVariantIter *next;
- gchar *default_profile = NULL;
- gchar *object_path;
-
- message = netconfig_invoke_dbus_method(CONNMAN_SERVICE,
- CONNMAN_MANAGER_PATH, CONNMAN_MANAGER_INTERFACE,
- "GetServices", NULL);
- if (message == NULL) {
- ERR("Failed to get profiles");
- return NULL;
- }
-
- g_variant_get(message, "(a(oa{sv}))", &iter);
- while (g_variant_iter_loop(iter, "(oa{sv})", &object_path, &next)) {
- if (object_path == NULL)
- continue;
-
- if (netconfig_is_cellular_profile(object_path) && !netconfig_is_cellular_internet_profile(object_path))
- continue;
-
- if (__netconfig_is_connected(next) == TRUE) {
- default_profile = g_strdup(object_path);
- g_free(object_path);
- g_variant_iter_free(next);
- break;
- }
- }
- g_variant_iter_free(iter);
- g_variant_unref(message);
-
- return default_profile;
-}
-
static int __netconfig_telephony_get_modem_object_path(GSList **modem_path_list)
{
GVariant *result;
return ret;
}
-static void __netconfig_get_default_connection_info(const char *profile)
+static int __netconfig_reset_ipv4_socket(const char *interface_name)
+{
+ int ret;
+ int fd;
+ struct ifreq ifr;
+ struct sockaddr_in sai;
+ const char *ipaddr = netconfig_get_default_ipaddress();
+ DBG("ipaddr-[%s]", ipaddr);
+
+ if (!ipaddr)
+ return -1;
+
+ fd = socket(AF_INET, SOCK_DGRAM, 0);
+ if (fd < 0)
+ return -1;
+
+ memset(&sai, 0, sizeof(struct sockaddr_in));
+ sai.sin_family = AF_INET;
+ sai.sin_port = 0;
+ if (!inet_aton(ipaddr, &sai.sin_addr)) {
+ DBG("fail to inet_aton()");
+ close(fd);
+ return -1;
+ }
+
+ memset(&ifr, 0, sizeof(struct ifreq));
+ memcpy(&ifr.ifr_addr, &sai, sizeof(sai));
+ g_strlcpy((char *)ifr.ifr_name, interface_name, IFNAMSIZ);
+
+#ifndef SIOCKILLADDR
+#define SIOCKILLADDR 0x8939
+#endif
+
+ ret = ioctl(fd, SIOCKILLADDR, &ifr);
+ if (ret < 0) {
+ DBG("fail to ioctl[SIOCKILLADDR]");
+ close(fd);
+ return -1;
+ }
+
+ close(fd);
+ return 0;
+}
+
+static void __netconfig_clear_default_connection_info(void)
+{
+ static char *old_profile = NULL;
+
+ if (netconfig_default_connection_info.profile != NULL) {
+
+ if (netconfig_is_wifi_profile(netconfig_default_connection_info.profile))
+ __netconfig_reset_ipv4_socket(netconfig_default_connection_info.ifname);
+
+ g_free(old_profile);
+ old_profile = strdup(netconfig_default_connection_info.profile);
+
+ g_free(netconfig_default_connection_info.profile);
+ netconfig_default_connection_info.profile = NULL;
+
+ g_free(netconfig_default_connection_info.ifname);
+ netconfig_default_connection_info.ifname = NULL;
+
+ g_free(netconfig_default_connection_info.ipaddress);
+ netconfig_default_connection_info.ipaddress = NULL;
+
+ g_free(netconfig_default_connection_info.ipaddress6);
+ netconfig_default_connection_info.ipaddress6 = NULL;
+
+ g_free(netconfig_default_connection_info.proxy);
+ netconfig_default_connection_info.proxy = NULL;
+
+ g_free(netconfig_default_connection_info.mac_address);
+ netconfig_default_connection_info.mac_address = NULL;
+
+ netconfig_default_connection_info.freq = 0;
+ netconfig_default_connection_info.is_metered = FALSE;
+
+ g_free(netconfig_default_connection_info.essid);
+ netconfig_default_connection_info.essid = NULL;
+ }
+}
+
+static gboolean __netconfig_get_default_connection_info(void)
{
GVariant *message = NULL, *variant = NULL, *variant2 = NULL;
- GVariantIter *iter = NULL, *iter1 = NULL, *service = NULL;
- GVariant *next = NULL;
+ GVariantIter *iter = NULL, *iter1 = NULL;
+ GVariant *var = NULL;
gchar *obj_path;
gchar *key = NULL;
gchar *key1 = NULL;
gchar *key2 = NULL;
- gboolean found_profile = 0;
message = netconfig_invoke_dbus_method(CONNMAN_SERVICE,
CONNMAN_MANAGER_PATH, CONNMAN_MANAGER_INTERFACE,
- "GetServices", NULL);
+ "GetDefaultService", NULL);
if (message == NULL) {
ERR("Failed to get services informations");
- goto done;
+ return FALSE;
}
- g_variant_get(message, "(a(oa{sv}))", &service);
- if (service == NULL) {
- ERR("Failed to get services iter");
- goto done;
+ if (!g_variant_is_of_type(message, G_VARIANT_TYPE("(oa{sv})"))) {
+ DBG("There is no default service");
+ __netconfig_clear_default_connection_info();
+ g_variant_unref(message);
+ return TRUE;
}
- while (g_variant_iter_loop(service, "(oa{sv})", &obj_path, &iter)) {
- if (g_strcmp0(obj_path, profile) == 0) {
- g_free(obj_path);
- found_profile = 1;
- break;
- }
- }
+ g_variant_get(message, "(oa{sv})", &obj_path, &iter);
- if (iter == NULL || found_profile == 0) {
- ERR("Profile %s doesn't exist", profile);
- goto done;
+ if (g_strcmp0(obj_path, netconfig_default_connection_info.profile) == 0) {
+ g_variant_unref(message);
+ g_variant_iter_free(iter);
+ return FALSE;
}
- while (g_variant_iter_loop(iter, "{sv}", &key, &next)) {
+ __netconfig_clear_default_connection_info();
+
+ netconfig_default_connection_info.profile = g_strdup(obj_path);
+
+ while (g_variant_iter_loop(iter, "{sv}", &key, &var)) {
const gchar *value = NULL;
guint16 freq = 0;
if (g_strcmp0(key, "Name") == 0 &&
- netconfig_is_wifi_profile(profile) == TRUE) {
- if (g_variant_is_of_type(next, G_VARIANT_TYPE_STRING)) {
- value = g_variant_get_string(next, NULL);
+ netconfig_is_wifi_profile(obj_path) == TRUE) {
+ if (g_variant_is_of_type(var, G_VARIANT_TYPE_STRING)) {
+ value = g_variant_get_string(var, NULL);
netconfig_default_connection_info.essid = g_strdup(value);
}
} else if (g_strcmp0(key, "Ethernet") == 0) {
- g_variant_get(next, "a{sv}", &iter1);
+ g_variant_get(var, "a{sv}", &iter1);
if (iter1 == NULL)
continue;
while (g_variant_iter_loop(iter1, "{sv}", &key1, &variant)) {
}
g_variant_iter_free(iter1);
} else if (g_strcmp0(key, "IPv4") == 0) {
- g_variant_get(next, "a{sv}", &iter1);
+ g_variant_get(var, "a{sv}", &iter1);
if (iter1 == NULL)
continue;
while (g_variant_iter_loop(iter1, "{sv}", &key1, &variant)) {
}
g_variant_iter_free(iter1);
} else if (g_strcmp0(key, "IPv6") == 0) {
- g_variant_get(next, "a{sv}", &iter1);
+ g_variant_get(var, "a{sv}", &iter1);
if (iter1 == NULL)
continue;
while (g_variant_iter_loop(iter1, "{sv}", &key1, &variant)) {
g_variant_iter_free(iter1);
} else if (g_strcmp0(key, "Proxy") == 0) {
- g_variant_get(next, "a{sv}", &iter1);
+ g_variant_get(var, "a{sv}", &iter1);
if (iter1 == NULL)
continue;
while (g_variant_iter_loop(iter1, "{sv}", &key2, &variant2)) {
}
g_variant_iter_free(iter1);
} else if (g_strcmp0(key, "Frequency") == 0) {
- if (g_variant_is_of_type(next, G_VARIANT_TYPE_UINT16)) {
- freq = g_variant_get_uint16(next);
+ if (g_variant_is_of_type(var, G_VARIANT_TYPE_UINT16)) {
+ freq = g_variant_get_uint16(var);
netconfig_default_connection_info.freq = freq;
}
}
}
- if (netconfig_is_cellular_profile(profile) == TRUE) {
+ if (netconfig_is_cellular_profile(obj_path) == TRUE) {
net_profile_name_t pdp_name;
int ret;
- ret = __netconfig_telephony_search_pdp_profile(profile, &pdp_name);
+ ret = __netconfig_telephony_search_pdp_profile(obj_path, &pdp_name);
if (ret >= 0 && strlen(pdp_name.profile_name) > 0)
if (__netconfig_telephony_get_metered_info(&pdp_name))
netconfig_default_connection_info.is_metered = TRUE;
}
-done:
- if (message)
- g_variant_unref(message);
-
- if (iter)
- g_variant_iter_free(iter);
-
- if (service)
- g_variant_iter_free(service);
+ g_variant_unref(message);
+ g_variant_iter_free(iter);
- return;
+ return TRUE;
}
static char *__netconfig_get_preferred_ipv6_address(char *profile)
builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
if (ip_addr != NULL) {
- netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, ip_addr);
+ netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, ip_addr, TRUE);
g_variant_builder_add(builder, "{sv}", "IPv4Address",
g_variant_new_string(ip_addr));
} else {
- netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, "");
+ netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, "", TRUE);
g_variant_builder_add(builder, "{sv}", "IPv4Address",
g_variant_new_string(""));
}
if (ip_addr6 != NULL) {
- netconfig_set_vconf_str(VCONFKEY_NETWORK_IP6, ip_addr6);
+ netconfig_set_vconf_str(VCONFKEY_NETWORK_IP6, ip_addr6, TRUE);
g_variant_builder_add(builder, "{sv}", "IPv6Address",
g_variant_new_string(ip_addr6));
} else {
- netconfig_set_vconf_str(VCONFKEY_NETWORK_IP6, "");
+ netconfig_set_vconf_str(VCONFKEY_NETWORK_IP6, "", TRUE);
g_variant_builder_add(builder, "{sv}", "IPv6Address",
g_variant_new_string(""));
}
params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
+ g_variant_builder_unref(builder);
netconfig_dbus_emit_signal(NULL, NETCONFIG_NETWORK_PATH,
NETCONFIG_NETWORK_INTERFACE, "NetworkConfigChanged",
if (profile == NULL && old_network_status != VCONFKEY_NETWORK_OFF) {
builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
- netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS, VCONFKEY_NETWORK_OFF);
+ netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS, VCONFKEY_NETWORK_OFF, TRUE);
g_variant_builder_add(builder, "{sv}", "NetworkStatus",
g_variant_new_int32(VCONFKEY_NETWORK_OFF));
- netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, "");
+ netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, "", TRUE);
g_variant_builder_add(builder, "{sv}", "IPv4Address",
g_variant_new_string(""));
- netconfig_set_vconf_str(VCONFKEY_NETWORK_IP6, "");
+ netconfig_set_vconf_str(VCONFKEY_NETWORK_IP6, "", TRUE);
g_variant_builder_add(builder, "{sv}", "IPv6Address",
g_variant_new_string(""));
- netconfig_set_vconf_str(VCONFKEY_NETWORK_PROXY, "");
+ netconfig_set_vconf_str(VCONFKEY_NETWORK_PROXY, "", TRUE);
g_variant_builder_add(builder, "{sv}", "ProxyAddress",
g_variant_new_string(""));
params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
- netconfig_set_vconf_int(VCONFKEY_NETWORK_CONFIGURATION_CHANGE_IND, 0);
+ netconfig_set_vconf_int(VCONFKEY_NETWORK_CONFIGURATION_CHANGE_IND, 0, TRUE);
netconfig_dbus_emit_signal(NULL, NETCONFIG_NETWORK_PATH,
NETCONFIG_NETWORK_INTERFACE, "NetworkConfigChanged",
params);
- netconfig_set_vconf_int("memory/private/wifi/frequency", 0);
+ netconfig_set_vconf_int("memory/private/wifi/frequency", 0, TRUE);
+
+ g_variant_builder_unref(builder);
DBG("Successfully clear IP and PROXY up");
+ /* Try to disable CLATD if it was enabled */
+ DBG("Disable clatd");
+ netconfig_clatd_disable();
} else if (profile != NULL) {
char *old_ip = vconf_get_str(VCONFKEY_NETWORK_IP);
char *old_ip6 = vconf_get_str(VCONFKEY_NETWORK_IP6);
builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
if (netconfig_is_wifi_profile(profile) == TRUE) {
- netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS,
- VCONFKEY_NETWORK_WIFI);
+ netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS, VCONFKEY_NETWORK_WIFI, TRUE);
g_variant_builder_add(builder, "{sv}", "NetworkStatus",
g_variant_new_int32(VCONFKEY_NETWORK_WIFI));
- netconfig_set_vconf_int("memory/private/wifi/frequency", freq);
+ netconfig_set_vconf_int("memory/private/wifi/frequency", freq, TRUE);
netconfig_set_system_event(SYS_EVT_NETWORK_STATUS,
EKEY_NETWORK_STATUS, EVAL_NETWORK_WIFI);
return;
}
- netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS,
- VCONFKEY_NETWORK_CELLULAR);
+ netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS, VCONFKEY_NETWORK_CELLULAR, TRUE);
g_variant_builder_add(builder, "{sv}", "NetworkStatus",
g_variant_new_int32(VCONFKEY_NETWORK_CELLULAR));
netconfig_set_system_event(SYS_EVT_NETWORK_STATUS,
EKEY_NETWORK_STATUS, EVAL_NETWORK_CELLULAR);
+ /* Enable clatd if IPv6 is set and no IPv4 address */
+ if (!ip_addr && ip_addr6) {
+ DBG("Enable clatd");
+ netconfig_clatd_enable();
+ }
} else if (netconfig_is_ethernet_profile(profile) == TRUE) {
- netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS,
- VCONFKEY_NETWORK_ETHERNET);
+ netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS, VCONFKEY_NETWORK_ETHERNET, TRUE);
g_variant_builder_add(builder, "{sv}", "NetworkStatus",
g_variant_new_int32(VCONFKEY_NETWORK_ETHERNET));
netconfig_set_system_event(SYS_EVT_NETWORK_STATUS,
EKEY_NETWORK_STATUS, EVAL_NETWORK_ETHERNET);
} else if (netconfig_is_bluetooth_profile(profile) == TRUE) {
- netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS,
- VCONFKEY_NETWORK_BLUETOOTH);
+ netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS, VCONFKEY_NETWORK_BLUETOOTH, TRUE);
g_variant_builder_add(builder, "{sv}", "NetworkStatus",
g_variant_new_int32(VCONFKEY_NETWORK_BLUETOOTH));
netconfig_set_system_event(SYS_EVT_NETWORK_STATUS,
EKEY_NETWORK_STATUS, EVAL_NETWORK_BT);
} else{
- netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS,
- VCONFKEY_NETWORK_OFF);
+ netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS, VCONFKEY_NETWORK_OFF, TRUE);
g_variant_builder_add(builder, "{sv}", "NetworkStatus",
g_variant_new_int32(VCONFKEY_NETWORK_OFF));
netconfig_set_system_event(SYS_EVT_NETWORK_STATUS,
if (g_strcmp0(old_ip, ip_addr) != 0 || old_ip == NULL) {
if (ip_addr != NULL) {
- netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, ip_addr);
+ netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, ip_addr, TRUE);
g_variant_builder_add(builder, "{sv}", "IPv4Address",
g_variant_new_string(ip_addr));
} else if (old_ip != NULL && strlen(old_ip) > 0) {
- netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, "");
+ netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, "", TRUE);
g_variant_builder_add(builder, "{sv}", "IPv4Address",
g_variant_new_string(""));
}
if (g_strcmp0(old_ip6, ip_addr6) != 0 || old_ip6 == NULL) {
if (ip_addr6 != NULL) {
- netconfig_set_vconf_str(VCONFKEY_NETWORK_IP6, ip_addr6);
+ netconfig_set_vconf_str(VCONFKEY_NETWORK_IP6, ip_addr6, TRUE);
g_variant_builder_add(builder, "{sv}", "IPv6Address",
g_variant_new_string(ip_addr6));
} else if (old_ip6 != NULL && strlen(old_ip6) > 0) {
- netconfig_set_vconf_str(VCONFKEY_NETWORK_IP6, "");
+ netconfig_set_vconf_str(VCONFKEY_NETWORK_IP6, "", TRUE);
g_variant_builder_add(builder, "{sv}", "IPv6Address",
g_variant_new_string(""));
}
if (g_strcmp0(old_proxy, proxy_addr) != 0) {
if (proxy_addr == NULL) {
- netconfig_set_vconf_str(VCONFKEY_NETWORK_PROXY, "");
+ netconfig_set_vconf_str(VCONFKEY_NETWORK_PROXY, "", TRUE);
g_variant_builder_add(builder, "{sv}", "ProxyAddress",
g_variant_new_string(""));
} else {
- netconfig_set_vconf_str(VCONFKEY_NETWORK_PROXY, proxy_addr);
+ netconfig_set_vconf_str(VCONFKEY_NETWORK_PROXY, proxy_addr, TRUE);
g_variant_builder_add(builder, "{sv}", "ProxyAddress",
g_variant_new_string(proxy_addr));
}
params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
- netconfig_set_vconf_int(VCONFKEY_NETWORK_CONFIGURATION_CHANGE_IND, 1);
+ netconfig_set_vconf_int(VCONFKEY_NETWORK_CONFIGURATION_CHANGE_IND, 1, TRUE);
netconfig_dbus_emit_signal(NULL, NETCONFIG_NETWORK_PATH,
NETCONFIG_NETWORK_INTERFACE, "NetworkConfigChanged",
params);
+ g_variant_builder_unref(builder);
+
DBG("Successfully update default network configuration");
}
return ret;
}
-static void __netconfig_update_if_service_connected(void)
-{
- GVariant *message = NULL, *var;
- GVariantIter *iter, *next;
- gchar *path;
- gchar *key;
-
- message = netconfig_invoke_dbus_method(CONNMAN_SERVICE,
- CONNMAN_MANAGER_PATH, CONNMAN_MANAGER_INTERFACE,
- "GetServices", NULL);
-
- if (message == NULL) {
- ERR("Failed to get services");
- return;
- }
-
- g_variant_get(message, "(a(oa{sv}))", &iter);
- while (g_variant_iter_loop(iter, "(oa{sv})", &path, &next)) {
- if (path == NULL)
- continue;
-
- if (g_str_has_prefix(path,
- CONNMAN_WIFI_SERVICE_PROFILE_PREFIX) == TRUE) {
- if (g_strrstr(path + strlen(CONNMAN_WIFI_SERVICE_PROFILE_PREFIX),
- "hidden") != NULL) {
- /* skip hidden profiles */
- continue;
- }
- /* Process this */
- } else if (g_str_has_prefix(path,
- CONNMAN_CELLULAR_SERVICE_PROFILE_PREFIX) == TRUE) {
- /* Process this */
- } else {
- continue;
- }
-
- while (g_variant_iter_loop(next, "{sv}", &key, &var)) {
- if (g_strcmp0(key, "State") == 0) {
- const gchar *sdata = NULL;
- sdata = g_variant_get_string(var, NULL);
- DBG("%s [%s: %s]", path, key, sdata);
-
- if (g_strcmp0(sdata, "online") == 0 || g_strcmp0(sdata, "ready") == 0) {
-
- /* Found a connected WiFi / 3G service.
- * Lets update the default profile info.
- */
- netconfig_update_default_profile((const gchar*)path);
- g_free(key);
- g_free(path);
- g_variant_unref(var);
- g_variant_iter_free(next);
- goto done;
- }
- }
- }
- }
-done:
- g_variant_iter_free(iter);
- g_variant_unref(message);
-
- return;
-}
-
static void __netconfig_network_notify_result(const char *sig_name, const char *key)
{
GVariantBuilder *builder;
return;
}
+static char *__netconfig_get_mac_address(const char *profile)
+{
+ char mac_str[MAC_ADDRESS_MAX_LEN] = { 0, };
+ const char *orgin = NULL;
+ int org_index, dst_index;
+ int i;
+
+ org_index = strlen(CONNMAN_WIFI_SERVICE_PROFILE_PREFIX);
+ dst_index = 0;
+
+ for (i = 0; i < 6; i++) {
+ orgin = &profile[org_index];
+
+ memcpy(&mac_str[dst_index], orgin, 2);
+ if (i < 5)
+ mac_str[dst_index + 2] = ':';
+ else
+ mac_str[dst_index + 2] = '\0';
+
+ org_index += 2;
+ dst_index += 3;
+ }
+
+ return g_strdup(mac_str);
+}
+
const char *netconfig_get_default_profile(void)
{
return netconfig_default_connection_info.profile;
return netconfig_default_connection_info.ipaddress;
}
+
const char *netconfig_get_default_ipaddress6(void)
{
return netconfig_default_connection_info.ipaddress6;
return netconfig_default_connection_info.is_metered;
}
-static int __netconfig_reset_ipv4_socket(void)
+void netconfig_set_default_ipaddress(const char *ipaddr)
{
- int ret;
- int fd;
- struct ifreq ifr;
- struct sockaddr_in sai;
- const char *ipaddr = netconfig_get_default_ipaddress();
- DBG("ipaddr-[%s]", ipaddr);
-
- if (!ipaddr)
- return -1;
-
- fd = socket(AF_INET, SOCK_DGRAM, 0);
- if (fd < 0)
- return -1;
-
- memset(&sai, 0, sizeof(struct sockaddr_in));
- sai.sin_family = AF_INET;
- sai.sin_port = 0;
- if (!inet_aton(ipaddr, &sai.sin_addr)) {
- DBG("fail to inet_aton()");
- close(fd);
- return -1;
- }
-
- memset(&ifr, 0, sizeof(struct ifreq));
- memcpy(&ifr.ifr_addr, &sai, sizeof(sai));
- g_strlcpy((char *)ifr.ifr_name, WIFI_IFNAME, IFNAMSIZ);
-
-#ifndef SIOCKILLADDR
-#define SIOCKILLADDR 0x8939
-#endif
-
- ret = ioctl(fd, SIOCKILLADDR, &ifr);
- if (ret < 0) {
- DBG("fail to ioctl[SIOCKILLADDR]");
- close(fd);
- return -1;
- }
-
- close(fd);
- return 0;
+ netconfig_default_connection_info.ipaddress = g_strdup(ipaddr);
}
-void netconfig_update_default_profile(const char *profile)
+void netconfig_set_default_ipaddress6(const char *ipaddr)
{
- static char *old_profile = NULL;
-
- /* It's automatically updated by signal-handler
- * DO NOT update manually
- *
- * It is going to update default connection information
- */
-
- if (netconfig_default_connection_info.profile != NULL) {
-
- if (netconfig_is_wifi_profile(netconfig_default_connection_info.profile))
- __netconfig_reset_ipv4_socket();
-
- g_free(old_profile);
- old_profile = strdup(netconfig_default_connection_info.profile);
-
- g_free(netconfig_default_connection_info.profile);
- netconfig_default_connection_info.profile = NULL;
-
- g_free(netconfig_default_connection_info.ifname);
- netconfig_default_connection_info.ifname = NULL;
-
- g_free(netconfig_default_connection_info.ipaddress);
- netconfig_default_connection_info.ipaddress = NULL;
-
- g_free(netconfig_default_connection_info.ipaddress6);
- netconfig_default_connection_info.ipaddress6 = NULL;
-
- g_free(netconfig_default_connection_info.proxy);
- netconfig_default_connection_info.proxy = NULL;
-
- g_free(netconfig_default_connection_info.mac_address);
- netconfig_default_connection_info.mac_address = NULL;
-
- netconfig_default_connection_info.freq = 0;
- netconfig_default_connection_info.is_metered = FALSE;
-
- if (wifi_state_get_service_state() != NETCONFIG_WIFI_CONNECTED) {
- g_free(netconfig_default_connection_info.essid);
- netconfig_default_connection_info.essid = NULL;
- }
- }
-
- /* default profile is NULL and new connected profile is NULL */
- if (!profile) {
- char *tmp_profile = __netconfig_get_default_profile();
-
- if (tmp_profile && netconfig_is_cellular_profile(tmp_profile) &&
- !netconfig_is_cellular_internet_profile(tmp_profile)) {
- DBG("not a default cellular profile");
- g_free(tmp_profile);
- tmp_profile = NULL;
- }
+ netconfig_default_connection_info.ipaddress6 = g_strdup(ipaddr);
+}
- if (!tmp_profile) {
- __netconfig_update_default_connection_info();
- return;
- }
+void netconfig_set_default_proxy(const char *proxy)
+{
+ netconfig_default_connection_info.proxy = g_strdup(proxy);
+}
- netconfig_default_connection_info.profile = g_strdup(tmp_profile);
- __netconfig_get_default_connection_info(tmp_profile);
+void netconfig_update_default_profile(void)
+{
+ if (__netconfig_get_default_connection_info())
__netconfig_update_default_connection_info();
- g_free(tmp_profile);
- return;
- }
-
- netconfig_default_connection_info.profile = g_strdup(profile);
- __netconfig_get_default_connection_info(profile);
- __netconfig_update_default_connection_info();
}
void netconfig_update_default(void)
{
if (__netconfig_is_tech_state_connected() == TRUE)
- __netconfig_update_if_service_connected();
+ netconfig_update_default_profile();
else
__netconfig_adjust_tcp_buffer_size();
}
-char *netconfig_get_ifname(const char *profile)
+const char *netconfig_get_ifname(const char *profile)
{
- GVariant *message = NULL, *variant;
- GVariantIter *iter, *next, *service;
- gchar *obj_path;
- gchar *key;
- gchar *key1;
- const gchar *value = NULL;
- gchar *ifname = NULL;
- gboolean found_profile = 0;
-
- if (profile == NULL)
- return NULL;
-
- message = netconfig_invoke_dbus_method(CONNMAN_SERVICE,
- CONNMAN_MANAGER_PATH, CONNMAN_MANAGER_INTERFACE,
- "GetServices", NULL);
- if (message == NULL) {
- ERR("Failed to get services informations");
- return NULL;
- }
-
- g_variant_get(message, "(a(oa{sv}))", &service);
- while (g_variant_iter_loop(service, "(oa{sv})", &obj_path, &iter)) {
- if (g_strcmp0(obj_path, profile) == 0) {
- g_free(obj_path);
- found_profile = 1;
- break;
- }
- }
-
- if (found_profile == 0) {
- ERR("Profile %s doesn't exist", profile);
- g_variant_iter_free(service);
- g_variant_unref(message);
- return NULL;
- }
-
- while (g_variant_iter_loop(iter, "{sv}", &key, &next)) {
- if (g_strcmp0(key, "Ethernet") == 0) {
- while (g_variant_iter_loop(next, "{sv}", &key1, &variant)) {
- if (g_strcmp0(key1, "Interface") == 0) {
- value = g_variant_get_string(variant, NULL);
- if (!ifname)
- ifname = g_strdup(value);
- g_free(key1);
- g_variant_unref(variant);
- break;
- }
- }
- }
- }
-
- g_variant_unref(message);
+ const char *ifname = NULL;
+ char *mac_addr = NULL;
- g_variant_iter_free(service);
- g_variant_iter_free(iter);
+ mac_addr = __netconfig_get_mac_address(profile);
+ ifname = wifi_state_get_interface_name(mac_addr);
+ g_free(mac_addr);
return ifname;
}
gchar *const args[] = { "/sbin/route", "add", "-net", ip_addr, gw_str,
"netmask", netmask, "dev", interface, NULL };
gchar *const envs[] = { NULL };
+ const gchar* buf = NULL;
+ gchar* ch = NULL;
+ int prefix_len = 0;
+ int pos = 0;
DBG("ip_addr(%s), netmask(%s), interface(%s), gateway(%s)", ip_addr, netmask, interface, gateway);
return TRUE;
}
- if (netconfig_add_route_ipv6(interface, gateway) < 0) {
+ buf = ip_addr;
+ ch = strchr(buf, '/');
+ pos = ch - buf + 1;
+ if (ch) {
+ prefix_len = atoi(ch + 1);
+ ip_addr[pos-1] = '\0';
+ } else {
+ prefix_len = 128;
+ }
+
+ if (netconfig_add_route_ipv6(ip_addr, interface, gateway, prefix_len) < 0) {
DBG("Failed to add a new route");
netconfig_error_permission_denied(context);
return TRUE;
return TRUE;
}
+gboolean handle_get_battery_dn_list(Battery *object,
+ GDBusMethodInvocation *context)
+{
+ GVariantBuilder *builder = NULL;
+ GVariant *ret_params = NULL;
+ gchar *params_str = NULL;
+
+ builder = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
+
+ netconfig_battery_get_dn_list(builder);
+
+ ret_params = g_variant_builder_end(builder);
+ if (ret_params) {
+ params_str = g_variant_print(ret_params, TRUE);
+ DBG("DN list [%s]", params_str);
+ }
+
+ battery_complete_get_battery_dn_list(object, context, ret_params);
+ g_variant_builder_unref(builder);
+ return TRUE;
+}
+
+gboolean handle_get_battery_wifi_list(Battery *object,
+ GDBusMethodInvocation *context)
+{
+ GVariantBuilder *builder = NULL;
+ GVariant *ret_params = NULL;
+ gchar *params_str = NULL;
+
+ builder = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
+
+ netconfig_battery_get_wifi_list(builder);
+
+ ret_params = g_variant_builder_end(builder);
+ if (ret_params) {
+ params_str = g_variant_print(ret_params, TRUE);
+ DBG("Wi-Fi list [%s]", params_str);
+ }
+
+ battery_complete_get_battery_wifi_list(object, context, ret_params);
+ g_variant_builder_unref(builder);
+ return TRUE;
+}
+
void state_object_create_and_init(void)
{
DBG("Creating network state object");
#if defined TIZEN_DEBUG_ENABLE
GDBusInterfaceSkeleton *interface_tcpdump = NULL;
#endif
+ GDBusInterfaceSkeleton *interface_battery = NULL;
GDBusConnection *connection = NULL;
GDBusObjectManagerServer *server = netdbus_get_state_manager();
if (server == NULL)
ERR("Export with path failed");
}
#endif
+
+ battery_object = battery_skeleton_new();
+
+ interface_battery = G_DBUS_INTERFACE_SKELETON(battery_object);
+ g_signal_connect(battery_object, "handle-get-battery-dn-list",
+ G_CALLBACK(handle_get_battery_dn_list), NULL);
+ g_signal_connect(battery_object, "handle-get-battery-wifi-list",
+ G_CALLBACK(handle_get_battery_wifi_list), NULL);
+
+ if (!g_dbus_interface_skeleton_export(interface_battery, connection,
+ NETCONFIG_NETWORK_STATE_PATH, NULL)) {
+ ERR("Export with path failed");
+ }
}
void state_object_deinit(void)
g_object_unref(tcpdump_object);
#endif
}
+
+static gboolean __netconfig_check_ipv6_address(const char *address)
+{
+ unsigned char buf[sizeof(struct in6_addr)];
+ int err;
+
+ if (!address)
+ return FALSE;
+
+ err = inet_pton(AF_INET6, address, buf);
+ if (err > 0)
+ return TRUE;
+
+ return FALSE;
+}
+
+char *netconfig_get_connected_cellular_internet_ipv6only_profile(struct clatd_ctrl_hint *hint)
+{
+ GVariant *message = NULL;
+ GVariantIter *iter = NULL;
+ GVariantIter *next = NULL;
+ gchar *cellular_internet_profile = NULL;
+ gchar *object_path = NULL;
+
+ message = netconfig_invoke_dbus_method(CONNMAN_SERVICE,
+ CONNMAN_MANAGER_PATH, CONNMAN_MANAGER_INTERFACE,
+ "GetServices", NULL);
+ if (message == NULL) {
+ ERR("Failed to get profiles");
+ return NULL;
+ }
+
+ g_variant_get(message, "(a(oa{sv}))", &iter);
+ while (g_variant_iter_loop(iter, "(oa{sv})", &object_path, &next)) {
+ if (object_path == NULL)
+ continue;
+
+ if (netconfig_is_cellular_profile(object_path) == FALSE)
+ continue;
+
+ if (netconfig_is_cellular_internet_profile(object_path) == FALSE)
+ continue;
+
+ if (__netconfig_is_connected(next) == TRUE) {
+ DBG("found connected profiles");
+ gchar *key = NULL;
+ gboolean has_v4 = FALSE, has_v6 = FALSE;
+
+ GVariant *variant = NULL;
+ while (g_variant_iter_loop(next, "{sv}", &key, &variant)) {
+ if (g_strcmp0(key, "IPv4") == 0) {
+ GVariantIter *ipv4_iter = NULL;
+ GVariant *ipv4_variant = NULL;
+ gchar *ipv4_key = NULL;
+ const gchar *ipv4_value = NULL;
+ g_variant_get(variant, "a{sv}", &ipv4_iter);
+ while (g_variant_iter_loop(ipv4_iter, "{sv}",
+ &ipv4_key, &ipv4_variant)) {
+ if (g_strcmp0(ipv4_key, "Address") == 0) {
+ ipv4_value = g_variant_get_string(ipv4_variant, NULL);
+ DBG("ipv4: %s", ipv4_value);
+ has_v4 = TRUE;
+ }
+ }
+ g_variant_iter_free (ipv4_iter);
+ } else if (g_strcmp0(key, "IPv6") == 0) {
+ GVariantIter *ipv6_iter = NULL;
+ GVariant *ipv6_variant = NULL;
+ gchar *ipv6_key = NULL;
+ const gchar *ipv6_value = NULL;
+ g_variant_get(variant, "a{sv}", &ipv6_iter);
+ while (g_variant_iter_loop(ipv6_iter, "{sv}",
+ &ipv6_key, &ipv6_variant)) {
+ if (g_strcmp0(ipv6_key, "Address") == 0) {
+ ipv6_value = g_variant_get_string(ipv6_variant, NULL);
+ DBG("ipv6: %s", ipv6_value);
+ has_v6 = TRUE;
+ }
+ }
+ g_variant_iter_free (ipv6_iter);
+ } else if (hint && g_strcmp0(key, "Nameservers") == 0) {
+ int idx = 0;
+ GVariantIter *ns_iter = NULL;
+ gchar *nameserver = NULL;
+ g_variant_get(variant, "as", &ns_iter);
+ while(g_variant_iter_loop(ns_iter, "s", &nameserver)) {
+ INFO("nameserver[%d]: %s", idx, nameserver);
+ if (idx >= MAX_DNS) {
+ INFO("index exceeded %d -- skip", idx);
+ continue;
+ }
+ if (__netconfig_check_ipv6_address(nameserver) == TRUE) {
+ hint->nameserver[idx] = g_strdup(nameserver);
+ idx++;
+ } else {
+ INFO("malformed address %s -- skip", nameserver);
+ }
+ }
+ }
+ }
+
+ if (!has_v4 && has_v6) {
+ DBG("found 'ipv6-only/connected/internet cellular profile'");
+ cellular_internet_profile = g_strdup(object_path);
+ g_free(object_path);
+ g_variant_iter_free(next);
+ break;
+ }
+ }
+ }
+ g_variant_iter_free(iter);
+ g_variant_unref(message);
+
+ return cellular_internet_profile;
+}