X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fnetwork-state.c;h=bbd34a46f61427edc3dd872dd6422df0345d3c1e;hb=c006cad83a4b80edaf66cd862d895ca004c730a1;hp=3f083f6919547123da89f0a85ebb8cb924cb263e;hpb=df5292e3bdb81c7a51330ca792952dfacfe7c42c;p=platform%2Fcore%2Fconnectivity%2Fnet-config.git diff --git a/src/network-state.c b/src/network-state.c index 3f083f6..bbd34a4 100755 --- a/src/network-state.c +++ b/src/network-state.c @@ -26,11 +26,6 @@ #include #include #include -#include -#include -#include -#include -#include #include "log.h" #include "util.h" @@ -43,8 +38,9 @@ #include "network-dpm.h" #include "network-monitor.h" #include "netsupplicant.h" -#include "wifi-tel-intf.h" -#include "clatd-handler.h" +#if defined TIZEN_DEBUG_ENABLE +#include "network-dump.h" +#endif #include "generated-code.h" /* Define TCP buffer sizes for various networks */ @@ -83,16 +79,32 @@ #define ROUTE_EXEC_PATH "/sbin/route" +#define TELEPHONY_SERVICE "com.tcore.ps" +#define TELEPHONY_MASTER_INTERFACE TELEPHONY_SERVICE ".master" +#define TELEPHONY_MODEM_INTERFACE TELEPHONY_SERVICE ".modem" +#define TELEPHONY_PROFILE_INTERFACE TELEPHONY_SERVICE ".context" +#define TELEPHONY_MASTER_PATH "/" +#define NET_PROFILE_NAME_LEN_MAX 512 + +typedef struct { + char profile_name[NET_PROFILE_NAME_LEN_MAX]; +} net_profile_name_t; + static Network *netconfigstate = NULL; +#if defined TIZEN_DEBUG_ENABLE +static Tcpdump *tcpdump_object = NULL; +#endif struct netconfig_default_connection { char *profile; char *ifname; + char *mac_address; char *ipaddress; char *ipaddress6; char *proxy; char *essid; unsigned int freq; + gboolean is_metered; }; static struct netconfig_default_connection @@ -162,6 +174,192 @@ static char *__netconfig_get_default_profile(void) return default_profile; } +static int __netconfig_telephony_get_modem_object_path(GSList **modem_path_list) +{ + GVariant *result; + GVariantIter *iter_modem = NULL; + GVariantIter *modem_properties = NULL; + const char *modem_path; + + result = netconfig_invoke_dbus_method(TELEPHONY_SERVICE, TELEPHONY_MASTER_PATH, + TELEPHONY_MASTER_INTERFACE, "GetModems", NULL); + if (result == NULL) { + ERR("Failed to get modem path list"); + return -1; + } + + g_variant_get(result, "(a{sa{ss}})", &iter_modem); + while (g_variant_iter_loop(iter_modem, "{sa{ss}}", &modem_path, &modem_properties)) { + *modem_path_list = g_slist_append(*modem_path_list, g_strdup(modem_path)); + DBG("modem object path: %s", modem_path); + } + + g_variant_iter_free(iter_modem); + g_variant_unref(result); + + return 0; +} + +static int __netconfig_telephony_get_profile_list(net_profile_name_t **profile_list, + int *profile_count) +{ + int ret = 0; + int count = 0, i = 0; + const char *str = NULL; + GVariant *result; + GVariantIter *iter = NULL; + GSList *profiles = NULL, *list = NULL; + net_profile_name_t *plist = NULL; + + GSList *modem_path_list = NULL; + const char *path = NULL; + + ret = __netconfig_telephony_get_modem_object_path(&modem_path_list); + if (ret < 0) { + ERR("Failed to get modems path list"); + + g_slist_free_full(modem_path_list, g_free); + return ret; + } + + for (list = modem_path_list; list != NULL; list = list->next) { + path = (const char *)list->data; + + DBG("path: %s", path); + result = netconfig_invoke_dbus_method(TELEPHONY_SERVICE, path, + TELEPHONY_MODEM_INTERFACE, "GetProfileList", NULL); + if (result == NULL) { + DBG("Failed to get profiles: %s", path); + continue; + } + + g_variant_get(result, "(as)", &iter); + while (g_variant_iter_loop(iter, "s", &str)) + profiles = g_slist_append(profiles, g_strdup(str)); + + g_variant_iter_free(iter); + g_variant_unref(result); + } + + g_slist_free_full(modem_path_list, g_free); + + count = g_slist_length(profiles); + if (count > 0) { + plist = (net_profile_name_t*)malloc(sizeof(net_profile_name_t) * count); + } else { + *profile_count = 0; + goto out; + } + + if (plist == NULL) { + ERR("Failed to allocate memory"); + *profile_count = 0; + ret = -1; + goto out; + } + + for (list = profiles, i = 0; list != NULL; list = list->next, i++) + g_strlcpy(plist[i].profile_name, + (const char *)list->data, NET_PROFILE_NAME_LEN_MAX); + + *profile_list = plist; + *profile_count = count; + +out: + g_slist_free_full(profiles, g_free); + + return ret; +} + +static int __netconfig_telephony_search_pdp_profile(const char* profile_name, net_profile_name_t* pdp_name) +{ + int ret; + net_profile_name_t* profile_list = NULL; + char* prof_name = NULL; + char* tel_prof_name = NULL; + char* found_ptr = NULL; + int profile_count = 0; + int i; + + /* Get pdp profile list from telephony service */ + ret = __netconfig_telephony_get_profile_list(&profile_list, &profile_count); + if (ret < 0) { + ERR("Failed to get profile list from telephony service"); + g_free(profile_list); + return ret; + } + + if (profile_list == NULL || profile_count <= 0) { + ERR("There is no PDP profiles"); + g_free(profile_list); + return -1; + } + + /* Find matching profile */ + prof_name = strrchr(profile_name, '/') + 1; + for (i = 0; i < profile_count; i++) { + tel_prof_name = strrchr(profile_list[i].profile_name, '/') + 1; + found_ptr = strstr(prof_name, tel_prof_name); + + if (found_ptr != NULL && g_strcmp0(found_ptr, tel_prof_name) == 0) { + g_strlcpy(pdp_name->profile_name, + profile_list[i].profile_name, NET_PROFILE_NAME_LEN_MAX); + + DBG("PDP profile name found in cellular profile: %s", pdp_name->profile_name); + break; + } + } + + if (i >= profile_count) { + ERR("There is no matching PDP profiles"); + g_free(profile_list); + return -1; + } + + g_free(profile_list); + + return ret; +} + +static gboolean __netconfig_telephony_get_metered_info(net_profile_name_t* pdp_name) +{ + GVariant *result; + GVariantIter *iter; + const gchar *key = NULL; + const gchar *value = NULL; + gboolean ret = FALSE; + + if (pdp_name == NULL) { + ERR("Invalid parameter!"); + return ret; + } + + result = netconfig_invoke_dbus_method(TELEPHONY_SERVICE, pdp_name->profile_name, + TELEPHONY_PROFILE_INTERFACE, "GetProfile", NULL); + if (result == NULL) { + ERR("_net_invoke_dbus_method failed"); + return ret; + } + + g_variant_get(result, "(a{ss})", &iter); + while (g_variant_iter_next(iter, "{ss}", &key, &value)) { + if (g_strcmp0(key, "is_metered") == 0) { + if (value == NULL) + continue; + + if (g_strcmp0(value, "TRUE") == 0) + ret = TRUE; + } + } + + g_variant_iter_free(iter); + g_variant_unref(result); + + DBG("is_metered = %s", ret ? "TRUE" : "FALSE"); + + return ret; +} + static void __netconfig_get_default_connection_info(const char *profile) { GVariant *message = NULL, *variant = NULL, *variant2 = NULL; @@ -218,6 +416,9 @@ static void __netconfig_get_default_connection_info(const char *profile) if (g_strcmp0(key1, "Interface") == 0) { value = g_variant_get_string(variant, NULL); netconfig_default_connection_info.ifname = g_strdup(value); + } else if (g_strcmp0(key1, "Address") == 0) { + value = g_variant_get_string(variant, NULL); + netconfig_default_connection_info.mac_address = g_strdup(value); } } g_variant_iter_free(iter1); @@ -290,6 +491,16 @@ static void __netconfig_get_default_connection_info(const char *profile) } } + if (netconfig_is_cellular_profile(profile) == TRUE) { + net_profile_name_t pdp_name; + int ret; + + ret = __netconfig_telephony_search_pdp_profile(profile, &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); @@ -303,6 +514,72 @@ done: return; } +static char *__netconfig_get_preferred_ipv6_address(char *profile) +{ + GVariant *message = NULL, *variant = NULL, *next = NULL; + GVariantIter *iter = NULL, *sub_iter = NULL, *service = NULL; + gchar *obj_path; + gchar *key = NULL; + gchar *sub_key = NULL; + gchar *preferred_address6 = NULL; + gboolean found_profile = 0; + + message = netconfig_invoke_dbus_method(CONNMAN_SERVICE, + CONNMAN_MANAGER_PATH, CONNMAN_MANAGER_INTERFACE, + "GetServices", NULL); + if (message == NULL) { + ERR("Failed to get service informations"); + goto done; + } + + g_variant_get(message, "(a(oa{sv}))", &service); + if (service == NULL) { + ERR("Failed to get services iter"); + goto done; + } + + 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 (iter == NULL || found_profile == 0) { + ERR("Profile %s doesn't exist", profile); + goto done; + } + + while (g_variant_iter_loop(iter, "{sv}", &key, &next)) { + const gchar *value = NULL; + if (g_strcmp0(key, "IPv6") == 0) { + g_variant_get(next, "a{sv}", &sub_iter); + if (sub_iter == NULL) + continue; + while (g_variant_iter_loop(sub_iter, "{sv}", &sub_key, &variant)) { + if (g_strcmp0(sub_key, "Address") == 0) { + value = g_variant_get_string(variant, NULL); + preferred_address6 = g_strdup(value); + } + } + g_variant_iter_free(sub_iter); + } + } + +done: + if (message) + g_variant_unref(message); + + if (iter) + g_variant_iter_free(iter); + + if (service) + g_variant_iter_free(service); + + return preferred_address6; +} + static void __netconfig_adjust_tcp_buffer_size(void) { int fdr = 0, fdw = 0; @@ -326,19 +603,9 @@ static void __netconfig_adjust_tcp_buffer_size(void) rmax_size = NET_TCP_BUFFERSIZE_WIFI_RMEM_MAX; wmax_size = NET_TCP_BUFFERSIZE_WIFI_WMEM_MAX; } else if (netconfig_is_cellular_profile(profile) == TRUE) { - TapiHandle *tapi_handle = NULL; int telephony_svctype = 0, telephony_pstype = 0; - tapi_handle = (TapiHandle *)netconfig_tel_init(); - if (NULL != tapi_handle) { - tel_get_property_int(tapi_handle, - TAPI_PROP_NETWORK_SERVICE_TYPE, - &telephony_svctype); - tel_get_property_int(tapi_handle, TAPI_PROP_NETWORK_PS_TYPE, - &telephony_pstype); - netconfig_tel_deinit(); - } - + netconfig_get_telephony_network_type(&telephony_svctype, &telephony_pstype); DBG("Default cellular %d, %d", telephony_svctype, telephony_pstype); switch (telephony_pstype) { @@ -449,94 +716,187 @@ static void __netconfig_update_default_connection_info(void) const char *ip_addr6 = netconfig_get_default_ipaddress6(); const char *proxy_addr = netconfig_get_default_proxy(); unsigned int freq = netconfig_get_default_frequency(); + GVariantBuilder *builder; + GVariant *params; + + if (emulator_is_emulated() == TRUE) { + builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); + + if (ip_addr != NULL) { + netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, ip_addr); + g_variant_builder_add(builder, "{sv}", "IPv4Address", + g_variant_new_string(ip_addr)); + } else { + netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, ""); + g_variant_builder_add(builder, "{sv}", "IPv4Address", + g_variant_new_string("")); + } + + if (ip_addr6 != NULL) { + netconfig_set_vconf_str(VCONFKEY_NETWORK_IP6, ip_addr6); + g_variant_builder_add(builder, "{sv}", "IPv6Address", + g_variant_new_string(ip_addr6)); + } else { + netconfig_set_vconf_str(VCONFKEY_NETWORK_IP6, ""); + g_variant_builder_add(builder, "{sv}", "IPv6Address", + g_variant_new_string("")); + } + + params = g_variant_new("(@a{sv})", g_variant_builder_end(builder)); + + netconfig_dbus_emit_signal(NULL, NETCONFIG_NETWORK_PATH, + NETCONFIG_NETWORK_INTERFACE, "NetworkConfigChanged", + params); - if (emulator_is_emulated() == TRUE) return; + } if (profile == NULL) DBG("Reset network state configuration"); else - DBG("%s: ip(%s) proxy(%s)", profile, ip_addr, proxy_addr); + DBG("profile[%s] ipv4(%s) ipv6(%s) proxy(%s)", profile, ip_addr, + ip_addr6, proxy_addr); netconfig_vconf_get_int(VCONFKEY_NETWORK_STATUS, &old_network_status); 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); + g_variant_builder_add(builder, "{sv}", "NetworkStatus", + g_variant_new_int32(VCONFKEY_NETWORK_OFF)); netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, ""); + g_variant_builder_add(builder, "{sv}", "IPv4Address", + g_variant_new_string("")); + + netconfig_set_vconf_str(VCONFKEY_NETWORK_IP6, ""); + g_variant_builder_add(builder, "{sv}", "IPv6Address", + g_variant_new_string("")); + netconfig_set_vconf_str(VCONFKEY_NETWORK_PROXY, ""); + 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_dbus_emit_signal(NULL, NETCONFIG_NETWORK_PATH, + NETCONFIG_NETWORK_INTERFACE, "NetworkConfigChanged", + params); netconfig_set_vconf_int("memory/private/wifi/frequency", 0); DBG("Successfully clear IP and PROXY up"); - /* Disable clatd if it is in running state */ - 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); char *old_proxy = vconf_get_str(VCONFKEY_NETWORK_PROXY); + 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); + 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_system_event(SYS_EVENT_NETWORK_STATUS, - EVT_KEY_NETWORK_STATUS, EVT_VAL_NETWORK_WIFI); + netconfig_set_system_event(SYS_EVT_NETWORK_STATUS, + EKEY_NETWORK_STATUS, EVAL_NETWORK_WIFI); } else if (netconfig_is_cellular_profile(profile)) { if (!netconfig_is_cellular_internet_profile(profile)) { DBG("connection is not a internet profile - stop to update the cellular state"); + if (old_ip) + free(old_ip); + if (old_ip6) + free(old_ip6); + if (old_proxy) + free(old_proxy); return; } - netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS, VCONFKEY_NETWORK_CELLULAR); - - netconfig_set_system_event(SYS_EVENT_NETWORK_STATUS, - EVT_KEY_NETWORK_STATUS, EVT_VAL_NETWORK_CELLULAR); + netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS, + VCONFKEY_NETWORK_CELLULAR); + g_variant_builder_add(builder, "{sv}", "NetworkStatus", + g_variant_new_int32(VCONFKEY_NETWORK_CELLULAR)); - /* Enable clatd if IPv6 is set and no IPv4 address */ - if (!ip_addr && ip_addr6) - netconfig_clatd_enable(); + netconfig_set_system_event(SYS_EVT_NETWORK_STATUS, + EKEY_NETWORK_STATUS, EVAL_NETWORK_CELLULAR); } else if (netconfig_is_ethernet_profile(profile) == TRUE) { - netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS, VCONFKEY_NETWORK_ETHERNET); - netconfig_set_system_event(SYS_EVENT_NETWORK_STATUS, - EVT_KEY_NETWORK_STATUS, EVT_VAL_NETWORK_ETHERNET); + netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS, + VCONFKEY_NETWORK_ETHERNET); + 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_system_event(SYS_EVENT_NETWORK_STATUS, - EVT_KEY_NETWORK_STATUS, EVT_VAL_NETWORK_BT); + netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS, + VCONFKEY_NETWORK_BLUETOOTH); + 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_system_event(SYS_EVENT_NETWORK_STATUS, - EVT_KEY_NETWORK_STATUS, EVT_VAL_NETWORK_DISCONNECTED); + netconfig_set_vconf_int(VCONFKEY_NETWORK_STATUS, + VCONFKEY_NETWORK_OFF); + g_variant_builder_add(builder, "{sv}", "NetworkStatus", + g_variant_new_int32(VCONFKEY_NETWORK_OFF)); + netconfig_set_system_event(SYS_EVT_NETWORK_STATUS, + EKEY_NETWORK_STATUS, EVAL_NETWORK_DISCONNECTED); } if (g_strcmp0(old_ip, ip_addr) != 0 || old_ip == NULL) { - if (ip_addr != NULL) + if (ip_addr != NULL) { netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, ip_addr); - else if (ip_addr6 != NULL) - netconfig_set_vconf_str(VCONFKEY_NETWORK_IP, ip_addr6); - else + 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, ""); + g_variant_builder_add(builder, "{sv}", "IPv4Address", + g_variant_new_string("")); + } } - g_free(old_ip); + if (old_ip) + free(old_ip); + + if (g_strcmp0(old_ip6, ip_addr6) != 0 || old_ip6 == NULL) { + if (ip_addr6 != NULL) { + netconfig_set_vconf_str(VCONFKEY_NETWORK_IP6, ip_addr6); + 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, ""); + g_variant_builder_add(builder, "{sv}", "IPv6Address", + g_variant_new_string("")); + } + } + if (old_ip6) + free(old_ip6); if (g_strcmp0(old_proxy, proxy_addr) != 0) { - if (proxy_addr == NULL) + if (proxy_addr == NULL) { netconfig_set_vconf_str(VCONFKEY_NETWORK_PROXY, ""); - else + g_variant_builder_add(builder, "{sv}", "ProxyAddress", + g_variant_new_string("")); + } else { netconfig_set_vconf_str(VCONFKEY_NETWORK_PROXY, proxy_addr); + g_variant_builder_add(builder, "{sv}", "ProxyAddress", + g_variant_new_string(proxy_addr)); + } } - g_free(old_proxy); + if (old_proxy) + free(old_proxy); + + params = g_variant_new("(@a{sv})", g_variant_builder_end(builder)); netconfig_set_vconf_int(VCONFKEY_NETWORK_CONFIGURATION_CHANGE_IND, 1); + netconfig_dbus_emit_signal(NULL, NETCONFIG_NETWORK_PATH, + NETCONFIG_NETWORK_INTERFACE, "NetworkConfigChanged", + params); DBG("Successfully update default network configuration"); - - /* Disable clatd if it is in running state */ - if (netconfig_is_cellular_profile(profile) != TRUE) - netconfig_clatd_disable(); } __netconfig_adjust_tcp_buffer_size(); @@ -704,6 +1064,11 @@ unsigned int netconfig_get_default_frequency(void) return netconfig_default_connection_info.freq; } +const char *netconfig_get_default_mac_address(void) +{ + return netconfig_default_connection_info.mac_address; +} + const char *netconfig_wifi_get_connected_essid(const char *default_profile) { if (default_profile == NULL) @@ -718,6 +1083,11 @@ const char *netconfig_wifi_get_connected_essid(const char *default_profile) return netconfig_default_connection_info.essid; } +gboolean netconfig_get_default_is_metered(void) +{ + return netconfig_default_connection_info.is_metered; +} + static int __netconfig_reset_ipv4_socket(void) { int ret; @@ -795,7 +1165,11 @@ void netconfig_update_default_profile(const char *profile) 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); @@ -805,24 +1179,30 @@ void netconfig_update_default_profile(const char *profile) /* default profile is NULL and new connected profile is NULL */ if (!profile) { - profile = __netconfig_get_default_profile(); + char *tmp_profile = __netconfig_get_default_profile(); - if (profile && netconfig_is_cellular_profile(profile) && - !netconfig_is_cellular_internet_profile(profile)) { + if (tmp_profile && netconfig_is_cellular_profile(tmp_profile) && + !netconfig_is_cellular_internet_profile(tmp_profile)) { DBG("not a default cellular profile"); - profile = NULL; + g_free(tmp_profile); + tmp_profile = NULL; } - if (!profile) { + if (!tmp_profile) { __netconfig_update_default_connection_info(); return; } + + netconfig_default_connection_info.profile = g_strdup(tmp_profile); + __netconfig_get_default_connection_info(tmp_profile); + __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) @@ -877,6 +1257,9 @@ char *netconfig_get_ifname(const char *profile) if (g_strcmp0(key1, "Interface") == 0) { value = g_variant_get_string(variant, NULL); ifname = g_strdup(value); + g_free(key1); + g_variant_unref(variant); + break; } } } @@ -904,7 +1287,10 @@ static gboolean handle_add_route( gchar *interface, gchar *gateway, gint address_family) { const gchar *path = ROUTE_EXEC_PATH; - gchar *const args[] = { "/sbin/route", "add", "-net", ip_addr, + gchar gw_str[64] = {0,}; + if (gateway != NULL && strlen(gateway) > 1) + g_snprintf(gw_str, 64, "gw %s", gateway); + gchar *const args[] = { "/sbin/route", "add", "-net", ip_addr, gw_str, "netmask", netmask, "dev", interface, NULL }; gchar *const envs[] = { NULL }; const gchar* buf = NULL; @@ -919,13 +1305,13 @@ static gboolean handle_add_route( if (ip_addr == NULL || netmask == NULL || interface == NULL) { ERR("Invalid parameter"); netconfig_error_invalid_parameter(context); - return FALSE; + return TRUE; } if (netconfig_execute_file(path, args, envs) < 0) { DBG("Failed to add a new route"); netconfig_error_permission_denied(context); - return FALSE; + return TRUE; } break; @@ -933,7 +1319,7 @@ static gboolean handle_add_route( if (ip_addr == NULL || interface == NULL || gateway == NULL) { ERR("Invalid parameter"); netconfig_error_invalid_parameter(context); - return FALSE; + return TRUE; } buf = ip_addr; @@ -949,13 +1335,13 @@ static gboolean handle_add_route( 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 FALSE; + return TRUE; } break; default: DBG("Unknown Address Family"); netconfig_error_invalid_parameter(context); - return FALSE; + return TRUE; } DBG("Successfully added a new route"); @@ -971,7 +1357,10 @@ static gboolean handle_remove_route( gchar *interface, gchar *gateway, gint address_family) { const char *path = ROUTE_EXEC_PATH; - gchar *const args[] = { "/sbin/route", "del", "-net", ip_addr, + gchar gw_str[64] = {0,}; + if (gateway != NULL && strlen(gateway) > 1) + g_snprintf(gw_str, 64, "gw %s", gateway); + gchar *const args[] = { "/sbin/route", "del", "-net", ip_addr, gw_str, "netmask", netmask, "dev", interface, NULL }; char *const envs[] = { NULL }; const char* buf = NULL; @@ -986,19 +1375,19 @@ static gboolean handle_remove_route( if (ip_addr == NULL || netmask == NULL || interface == NULL) { DBG("Invalid parameter!"); netconfig_error_invalid_parameter(context); - return FALSE; + return TRUE; } if (netconfig_execute_file(path, args, envs) < 0) { DBG("Failed to remove the route"); netconfig_error_permission_denied(context); - return FALSE; + return TRUE; } break; case AF_INET6: if (ip_addr == NULL || interface == NULL || gateway == NULL) { DBG("Invalid parameter!"); netconfig_error_invalid_parameter(context); - return FALSE; + return TRUE; } buf = ip_addr; @@ -1014,13 +1403,13 @@ static gboolean handle_remove_route( if (netconfig_del_route_ipv6(ip_addr, interface, gateway, prefix_len) < 0) { DBG("Failed to remove the route"); netconfig_error_permission_denied(context); - return FALSE; + return TRUE; } break; default: DBG("Unknown Address Family"); netconfig_error_invalid_parameter(context); - return FALSE; + return TRUE; } DBG("Successfully removed the route"); @@ -1060,7 +1449,7 @@ gboolean handle_ethernet_cable_state(Network *object, if (ret != 0) { DBG("Failed to get ethernet cable state"); netconfig_error_fail_ethernet_cable_state(context); - return FALSE; + return TRUE; } DBG("Successfully get ethernet cable state[%d]", state); @@ -1068,10 +1457,42 @@ gboolean handle_ethernet_cable_state(Network *object, return TRUE; } +gboolean handle_get_metered_info(Network *object, + GDBusMethodInvocation *context) +{ + gboolean state = 0; + + state = netconfig_get_default_is_metered(); + + DBG("Default metered state [%s]", state ? "TRUE" : "FALSE"); + network_complete_get_metered_info(object, context, state); + return TRUE; +} + +gboolean handle_preferred_ipv6_address(Network *object, + GDBusMethodInvocation *context, gchar *profile) +{ + char *address = NULL; + + address = __netconfig_get_preferred_ipv6_address(profile); + if (address == NULL) { + DBG("Failed to get preferred IPv6 address"); + netconfig_error_fail_preferred_ipv6_address(context); + return TRUE; + } + + DBG("Successfully get preferred IPv6 address[%s]", address); + network_complete_preferred_ipv6_address(object, context, address); + return TRUE; +} + void state_object_create_and_init(void) { DBG("Creating network state object"); GDBusInterfaceSkeleton *interface_network = NULL; +#if defined TIZEN_DEBUG_ENABLE + GDBusInterfaceSkeleton *interface_tcpdump = NULL; +#endif GDBusConnection *connection = NULL; GDBusObjectManagerServer *server = netdbus_get_state_manager(); if (server == NULL) @@ -1094,14 +1515,12 @@ void state_object_create_and_init(void) G_CALLBACK(handle_check_internet_privilege), NULL); g_signal_connect(netconfigstate, "handle-ethernet-cable-state", G_CALLBACK(handle_ethernet_cable_state), NULL); + g_signal_connect(netconfigstate, "handle-preferred-ipv6-address", + G_CALLBACK(handle_preferred_ipv6_address), NULL); g_signal_connect(netconfigstate, "handle-remove-route", G_CALLBACK(handle_remove_route), NULL); g_signal_connect(netconfigstate, "handle-launch-mdns", G_CALLBACK(handle_launch_mdns), NULL); - g_signal_connect(netconfigstate, "handle-ref-mdns", - G_CALLBACK(handle_ref_mdns), NULL); - g_signal_connect(netconfigstate, "handle-unref-mdns", - G_CALLBACK(handle_unref_mdns), NULL); g_signal_connect(netconfigstate, "handle-device-policy-set-wifi", G_CALLBACK(handle_device_policy_set_wifi), NULL); g_signal_connect(netconfigstate, "handle-device-policy-get-wifi", @@ -1110,14 +1529,37 @@ void state_object_create_and_init(void) G_CALLBACK(handle_device_policy_set_wifi_profile), NULL); g_signal_connect(netconfigstate, "handle-device-policy-get-wifi-profile", G_CALLBACK(handle_device_policy_get_wifi_profile), NULL); + g_signal_connect(netconfigstate, "handle-get-metered-info", + G_CALLBACK(handle_get_metered_info), NULL); if (!g_dbus_interface_skeleton_export(interface_network, connection, NETCONFIG_NETWORK_STATE_PATH, NULL)) { ERR("Export with path failed"); } + +#if defined TIZEN_DEBUG_ENABLE + /*Interface netconfig.tcpdump*/ + tcpdump_object = tcpdump_skeleton_new(); + + interface_tcpdump = G_DBUS_INTERFACE_SKELETON(tcpdump_object); + g_signal_connect(tcpdump_object, "handle-start-tcpdump", + G_CALLBACK(handle_start_tcpdump), NULL); + g_signal_connect(tcpdump_object, "handle-stop-tcpdump", + G_CALLBACK(handle_stop_tcpdump), NULL); + g_signal_connect(tcpdump_object, "handle-get-tcpdump-state", + G_CALLBACK(handle_get_tcpdump_state), NULL); + + if (!g_dbus_interface_skeleton_export(interface_tcpdump, connection, + NETCONFIG_NETWORK_STATE_PATH, NULL)) { + ERR("Export with path failed"); + } +#endif } void state_object_deinit(void) { g_object_unref(netconfigstate); +#if defined TIZEN_DEBUG_ENABLE + g_object_unref(tcpdump_object); +#endif }