X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fconnection.c;h=2b740719db1824eae8e877eb1189867610d1c66b;hb=50aaf9d4c908ff9357cc24b887ec4a962c03bb9d;hp=ce5421c3e408c3d44f5896a5b0796db10c5e3697;hpb=980cf9a8a89c80b610d012e3afb2b83ed899fd29;p=platform%2Fcore%2Fapi%2Fconnection.git diff --git a/src/connection.c b/src/connection.c index ce5421c..2b74071 100755 --- a/src/connection.c +++ b/src/connection.c @@ -16,13 +16,17 @@ #include #include +#include #include #include +#include #include "net_connection_private.h" static __thread GSList *conn_handle_list = NULL; +static int tv_profile = -1; // Unknown +//LCOV_EXCL_START static int __connection_convert_net_state(int status) { switch (status) { @@ -34,6 +38,8 @@ static int __connection_convert_net_state(int status) return CONNECTION_TYPE_ETHERNET; case VCONFKEY_NETWORK_BLUETOOTH: return CONNECTION_TYPE_BT; + case VCONFKEY_NETWORK_DEFAULT_PROXY: + return CONNECTION_TYPE_NET_PROXY; default: return CONNECTION_TYPE_DISCONNECTED; } @@ -168,7 +174,7 @@ static int __connection_set_type_changed_callback(connection_h connection, if (--refcount == 0) { if (vconf_ignore_key_changed(VCONFKEY_NETWORK_STATUS, __connection_cb_type_change_cb) < 0) { - CONNECTION_LOG(CONNECTION_ERROR, + CONNECTION_LOG(CONNECTION_ERROR, //LCOV_EXCL_LINE "Error to de-register vconf callback(%d)", refcount); } else { CONNECTION_LOG(CONNECTION_INFO, @@ -199,6 +205,7 @@ static void *__connection_get_ip_changed_userdata( static gboolean __connection_cb_ip_changed_cb_idle(gpointer user_data) { char *ip_addr; + char *ip6_addr; void *data; connection_address_changed_cb callback; connection_handle_s *local_handle = (connection_handle_s *)user_data; @@ -207,12 +214,23 @@ static gboolean __connection_cb_ip_changed_cb_idle(gpointer user_data) return FALSE; ip_addr = vconf_get_str(VCONFKEY_NETWORK_IP); + if (ip_addr == NULL) + CONNECTION_LOG(CONNECTION_ERROR, //LCOV_EXCL_LINE + "vconf_get_str(VCONFKEY_NETWORK_IP) is Failed"); + + ip6_addr = vconf_get_str(VCONFKEY_NETWORK_IP6); + if (ip6_addr == NULL) + CONNECTION_LOG(CONNECTION_ERROR, //LCOV_EXCL_LINE + "vconf_get_str(VCONFKEY_NETWORK_IP6) is Failed"); callback = __connection_get_ip_changed_callback(local_handle); data = __connection_get_ip_changed_userdata(local_handle); - /* TODO: IPv6 should be supported */ + if (callback) - callback(ip_addr, NULL, data); + callback(ip_addr, ip6_addr, data); + + free(ip_addr); + free(ip6_addr); return FALSE; } @@ -243,9 +261,12 @@ static int __connection_set_ip_changed_callback(connection_h connection, local_handle = (connection_handle_s *)connection; if (callback) { - if (refcount == 0) + if (refcount == 0) { vconf_notify_key_changed(VCONFKEY_NETWORK_IP, __connection_cb_ip_change_cb, NULL); + vconf_notify_key_changed(VCONFKEY_NETWORK_IP6, + __connection_cb_ip_change_cb, NULL); + } refcount++; CONNECTION_LOG(CONNECTION_INFO, "Successfully registered(%d)", refcount); @@ -255,7 +276,15 @@ static int __connection_set_ip_changed_callback(connection_h connection, if (--refcount == 0) { if (vconf_ignore_key_changed(VCONFKEY_NETWORK_IP, __connection_cb_ip_change_cb) < 0) { - CONNECTION_LOG(CONNECTION_ERROR, + CONNECTION_LOG(CONNECTION_ERROR, //LCOV_EXCL_LINE + "Error to de-register vconf callback(%d)", refcount); + } else { + CONNECTION_LOG(CONNECTION_INFO, + "Successfully de-registered(%d)", refcount); + } + if (vconf_ignore_key_changed(VCONFKEY_NETWORK_IP6, + __connection_cb_ip_change_cb) < 0) { + CONNECTION_LOG(CONNECTION_ERROR, //LCOV_EXCL_LINE "Error to de-register vconf callback(%d)", refcount); } else { CONNECTION_LOG(CONNECTION_INFO, @@ -294,6 +323,9 @@ static gboolean __connection_cb_proxy_changed_cb_idle(gpointer user_data) return FALSE; proxy = vconf_get_str(VCONFKEY_NETWORK_PROXY); + if (proxy == NULL) + CONNECTION_LOG(CONNECTION_ERROR, //LCOV_EXCL_LINE + "vconf_get_str(VCONFKEY_NETWORK_PROXY) is Failed"); callback = __connection_get_proxy_changed_callback(local_handle); data = __connection_get_proxy_changed_userdata(local_handle); @@ -301,6 +333,8 @@ static gboolean __connection_cb_proxy_changed_cb_idle(gpointer user_data) if (callback) callback(proxy, NULL, data); + free(proxy); + return FALSE; } @@ -342,7 +376,7 @@ static int __connection_set_proxy_changed_callback(connection_h connection, if (--refcount == 0) { if (vconf_ignore_key_changed(VCONFKEY_NETWORK_PROXY, __connection_cb_proxy_change_cb) < 0) { - CONNECTION_LOG(CONNECTION_ERROR, + CONNECTION_LOG(CONNECTION_ERROR, //LCOV_EXCL_LINE "Error to de-register vconf callback(%d)", refcount); } else { CONNECTION_LOG(CONNECTION_INFO, @@ -359,7 +393,7 @@ static int __connection_set_proxy_changed_callback(connection_h connection, } static int __connection_set_ethernet_cable_state_changed_cb(connection_h connection, - connection_ethernet_cable_state_chaged_cb callback, void *user_data) + connection_ethernet_cable_state_changed_cb callback, void *user_data) { connection_handle_s *local_handle = (connection_handle_s *)connection; @@ -369,7 +403,8 @@ static int __connection_set_ethernet_cable_state_changed_cb(connection_h connect __connection_cb_ethernet_cable_state_changed_cb); } else { - if (__connection_get_ethernet_cable_state_changed_callback_count() == 1) + if (__connection_get_ethernet_cable_state_changed_callback_count() == 1 && + local_handle->ethernet_cable_state_changed_callback) _connection_libnet_set_ethernet_cable_state_changed_cb(NULL); } @@ -377,6 +412,7 @@ static int __connection_set_ethernet_cable_state_changed_cb(connection_h connect local_handle->ethernet_cable_state_changed_user_data = user_data; return CONNECTION_ERROR_NONE; } +//LCOV_EXCL_STOP static int __connection_get_handle_count(void) { @@ -395,19 +431,18 @@ EXPORT_API int connection_create(connection_h *connection) int rv = _connection_libnet_init(); if (rv == NET_ERR_ACCESS_DENIED) { - CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); - return CONNECTION_ERROR_PERMISSION_DENIED; - } - else if (rv != NET_ERR_NONE) { - CONNECTION_LOG(CONNECTION_ERROR, "Failed to create connection[%d]", rv); - return CONNECTION_ERROR_OPERATION_FAILED; + CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE + return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE + } else if (rv != NET_ERR_NONE) { + CONNECTION_LOG(CONNECTION_ERROR, "Failed to create connection[%d]", rv); //LCOV_EXCL_LINE + return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE } *connection = g_try_malloc0(sizeof(connection_handle_s)); if (*connection != NULL) CONNECTION_LOG(CONNECTION_INFO, "New handle created[%p]", *connection); else - return CONNECTION_ERROR_OUT_OF_MEMORY; + return CONNECTION_ERROR_OUT_OF_MEMORY; //LCOV_EXCL_LINE conn_handle_list = g_slist_prepend(conn_handle_list, *connection); @@ -457,8 +492,8 @@ EXPORT_API int connection_get_type(connection_h connection, connection_type_e* t rv = vconf_get_int(VCONFKEY_NETWORK_STATUS, &status); if (rv != VCONF_OK) { - CONNECTION_LOG(CONNECTION_ERROR, "vconf_get_int Failed = %d", status); - return CONNECTION_ERROR_OPERATION_FAILED; + CONNECTION_LOG(CONNECTION_ERROR, "vconf_get_int Failed = %d", status); //LCOV_EXCL_LINE + return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE } CONNECTION_LOG(CONNECTION_INFO, "Connected Network = %d", status); @@ -480,17 +515,19 @@ EXPORT_API int connection_get_ip_address(connection_h connection, switch (address_family) { case CONNECTION_ADDRESS_FAMILY_IPV4: - case CONNECTION_ADDRESS_FAMILY_IPV6: *ip_address = vconf_get_str(VCONFKEY_NETWORK_IP); break; + case CONNECTION_ADDRESS_FAMILY_IPV6: + *ip_address = vconf_get_str(VCONFKEY_NETWORK_IP6); + break; default: CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); return CONNECTION_ERROR_INVALID_PARAMETER; } if (*ip_address == NULL) { - CONNECTION_LOG(CONNECTION_ERROR, "vconf_get_str Failed"); - return CONNECTION_ERROR_OPERATION_FAILED; + CONNECTION_LOG(CONNECTION_ERROR, "vconf_get_str Failed"); //LCOV_EXCL_LINE + return CONNECTION_ERROR_OPERATION_FAILED;//LCOV_EXCL_LINE } return CONNECTION_ERROR_NONE; @@ -517,8 +554,8 @@ EXPORT_API int connection_get_proxy(connection_h connection, } if (*proxy == NULL) { - CONNECTION_LOG(CONNECTION_ERROR, "vconf_get_str Failed"); - return CONNECTION_ERROR_OPERATION_FAILED; + CONNECTION_LOG(CONNECTION_ERROR, "vconf_get_str Failed"); //LCOV_EXCL_LINE + return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE } return CONNECTION_ERROR_NONE; @@ -531,10 +568,10 @@ EXPORT_API int connection_get_mac_address(connection_h connection, connection_ty CHECK_FEATURE_SUPPORTED(WIFI_FEATURE, ETHERNET_FEATURE); - if(type == CONNECTION_TYPE_WIFI) + if (type == CONNECTION_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(WIFI_FEATURE); - else if(type == CONNECTION_TYPE_ETHERNET) - CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE); + else if (type == CONNECTION_TYPE_ETHERNET) //LCOV_EXCL_LINE + CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE); //LCOV_EXCL_LINE if (mac_addr == NULL || !(__connection_check_handle_validity(connection))) { CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); @@ -543,29 +580,48 @@ EXPORT_API int connection_get_mac_address(connection_h connection, connection_ty switch (type) { case CONNECTION_TYPE_WIFI: - fp = fopen(WIFI_MAC_INFO_FILE, "r"); - if (fp == NULL) { - CONNECTION_LOG(CONNECTION_ERROR, "Failed to open file %s", WIFI_MAC_INFO_FILE); - return CONNECTION_ERROR_OUT_OF_MEMORY; + if (__builtin_expect(tv_profile == -1, 0)) { + char *profileName; + system_info_get_platform_string("http://tizen.org/feature/profile", &profileName); + if (*profileName == 't' || *profileName == 'T') + tv_profile = 1; + else + tv_profile = 0; + free(profileName); } + if (tv_profile == 1) { + fp = fopen(WIFI_MAC_INFO_FILE, "r"); + if (fp == NULL) { + CONNECTION_LOG(CONNECTION_ERROR, "Failed to open file %s", WIFI_MAC_INFO_FILE); //LCOV_EXCL_LINE + return CONNECTION_ERROR_OUT_OF_MEMORY; //LCOV_EXCL_LINE + } - if (fgets(buf, sizeof(buf), fp) == NULL) { - CONNECTION_LOG(CONNECTION_ERROR, "Failed to get MAC info from %s", WIFI_MAC_INFO_FILE); - fclose(fp); - return CONNECTION_ERROR_OPERATION_FAILED; - } + if (fgets(buf, sizeof(buf), fp) == NULL) { + CONNECTION_LOG(CONNECTION_ERROR, "Failed to get MAC info from %s", WIFI_MAC_INFO_FILE); //LCOV_EXCL_LINE + fclose(fp); //LCOV_EXCL_LINE + return CONNECTION_ERROR_OPERATION_FAILED; + } - CONNECTION_LOG(CONNECTION_INFO, "%s : %s", WIFI_MAC_INFO_FILE, buf); + CONNECTION_LOG(CONNECTION_INFO, "%s : %s", WIFI_MAC_INFO_FILE, buf); - *mac_addr = (char *)malloc(CONNECTION_MAC_INFO_LENGTH + 1); - if (*mac_addr == NULL) { - CONNECTION_LOG(CONNECTION_ERROR, "malloc() failed"); + *mac_addr = (char *)malloc(CONNECTION_MAC_INFO_LENGTH + 1); + if (*mac_addr == NULL) { + CONNECTION_LOG(CONNECTION_ERROR, "malloc() failed"); //LCOV_EXCL_LINE + fclose(fp); //LCOV_EXCL_LINE + return CONNECTION_ERROR_OUT_OF_MEMORY; //LCOV_EXCL_LINE + } + g_strlcpy(*mac_addr, buf, CONNECTION_MAC_INFO_LENGTH + 1); fclose(fp); - return CONNECTION_ERROR_OUT_OF_MEMORY; + } else { + *mac_addr = vconf_get_str(VCONFKEY_WIFI_BSSID_ADDRESS); + + if (*mac_addr == NULL) { + CONNECTION_LOG(CONNECTION_ERROR, "Failed to get vconf from %s", VCONFKEY_WIFI_BSSID_ADDRESS); //LCOV_EXCL_LINE + return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE + } } - g_strlcpy(*mac_addr, buf, CONNECTION_MAC_INFO_LENGTH + 1); - fclose(fp); break; + //LCOV_EXCL_START case CONNECTION_TYPE_ETHERNET: fp = fopen(ETHERNET_MAC_INFO_FILE, "r"); if (fp == NULL) { @@ -588,20 +644,21 @@ EXPORT_API int connection_get_mac_address(connection_h connection, connection_ty return CONNECTION_ERROR_OUT_OF_MEMORY; } - g_strlcpy(*mac_addr, buf,CONNECTION_MAC_INFO_LENGTH + 1); + g_strlcpy(*mac_addr, buf, CONNECTION_MAC_INFO_LENGTH + 1); fclose(fp); break; + //LCOV_EXCL_STOP default: - CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); - return CONNECTION_ERROR_INVALID_PARAMETER; + CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); //LCOV_EXCL_LINE + return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE } /* Checking Invalid MAC Address */ - if((strcmp(*mac_addr, "00:00:00:00:00:00") == 0) || + if ((strcmp(*mac_addr, "00:00:00:00:00:00") == 0) || (strcmp(*mac_addr, "ff:ff:ff:ff:ff:ff") == 0)) { - CONNECTION_LOG(CONNECTION_ERROR, "MAC Address(%s) is invalid", *mac_addr); - return CONNECTION_ERROR_INVALID_OPERATION; + CONNECTION_LOG(CONNECTION_ERROR, "MAC Address(%s) is invalid", *mac_addr); //LCOV_EXCL_LINE + return CONNECTION_ERROR_INVALID_OPERATION; //LCOV_EXCL_LINE } CONNECTION_LOG(CONNECTION_INFO, "MAC Address %s", *mac_addr); @@ -609,6 +666,27 @@ EXPORT_API int connection_get_mac_address(connection_h connection, connection_ty return CONNECTION_ERROR_NONE; } + +EXPORT_API int connection_is_metered_network(connection_h connection, bool* is_metered) +{ + CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE); + + if (is_metered == NULL || !(__connection_check_handle_validity(connection))) { + CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); + return CONNECTION_ERROR_INVALID_PARAMETER; + } + + int rv = _connection_libnet_get_metered_state(is_metered); + if (rv != CONNECTION_ERROR_NONE) { + CONNECTION_LOG(CONNECTION_ERROR, "Fail to get metered state[%d]", rv); //LCOV_EXCL_LINE + return rv; //LCOV_EXCL_LINE + } + + CONNECTION_LOG(CONNECTION_INFO, "metered state: %s", is_metered ? "true" : "false"); + return CONNECTION_ERROR_NONE; +} + + EXPORT_API int connection_get_cellular_state(connection_h connection, connection_cellular_state_e* state) { int rv = 0; @@ -627,8 +705,8 @@ EXPORT_API int connection_get_cellular_state(connection_h connection, connection rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_STATE, &status); if (rv != VCONF_OK) { - CONNECTION_LOG(CONNECTION_ERROR, "Failed to get cellular state"); - return CONNECTION_ERROR_OPERATION_FAILED; + CONNECTION_LOG(CONNECTION_ERROR, "Failed to get cellular state"); //LCOV_EXCL_LINE + return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE } CONNECTION_LOG(CONNECTION_INFO, "Cellular: %d", status); @@ -660,8 +738,8 @@ EXPORT_API int connection_get_cellular_state(connection_h connection, connection } #endif if (rv != VCONF_OK) { - CONNECTION_LOG(CONNECTION_ERROR, "Failed to get cellular state"); - return CONNECTION_ERROR_OPERATION_FAILED; + CONNECTION_LOG(CONNECTION_ERROR, "Failed to get cellular state"); //LCOV_EXCL_LINE + return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE } } @@ -686,8 +764,8 @@ EXPORT_API int connection_get_wifi_state(connection_h connection, connection_wif int rv = _connection_libnet_get_wifi_state(state); if (rv != CONNECTION_ERROR_NONE) { - CONNECTION_LOG(CONNECTION_ERROR, "Fail to get Wi-Fi state[%d]", rv); - return rv; + CONNECTION_LOG(CONNECTION_ERROR, "Fail to get Wi-Fi state[%d]", rv); //LCOV_EXCL_LINE + return rv; //LCOV_EXCL_LINE } CONNECTION_LOG(CONNECTION_INFO, "Wi-Fi state: %d", *state); @@ -695,7 +773,8 @@ EXPORT_API int connection_get_wifi_state(connection_h connection, connection_wif return CONNECTION_ERROR_NONE; } -EXPORT_API int connection_get_ethernet_state(connection_h connection, connection_ethernet_state_e* state) +//LCOV_EXCL_START +EXPORT_API int connection_get_ethernet_state(connection_h connection, connection_ethernet_state_e *state) { CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE); @@ -722,6 +801,7 @@ EXPORT_API int connection_get_ethernet_cable_state(connection_h connection, conn EXPORT_API int connection_set_ethernet_cable_state_chaged_cb(connection_h connection, connection_ethernet_cable_state_chaged_cb callback, void *user_data) { + DEPRECATED_LOG(__FUNCTION__, "connection_set_ethernet_cable_state_changed_cb"); CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE); if (callback == NULL || !(__connection_check_handle_validity(connection))) { @@ -729,15 +809,19 @@ EXPORT_API int connection_set_ethernet_cable_state_chaged_cb(connection_h connec return CONNECTION_ERROR_INVALID_PARAMETER; } + DEPRECATED_LOG("connection_ethernet_cable_state_chaged_cb", + "connection_ethernet_cable_state_changed_cb"); + return __connection_set_ethernet_cable_state_changed_cb(connection, - callback, user_data); + (connection_ethernet_cable_state_changed_cb)callback, user_data); } EXPORT_API int connection_unset_ethernet_cable_state_chaged_cb(connection_h connection) { + DEPRECATED_LOG(__FUNCTION__, "connection_unset_ethernet_cable_state_changed_cb"); CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE); - if ( !(__connection_check_handle_validity(connection)) ) { + if (!(__connection_check_handle_validity(connection))) { CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); return CONNECTION_ERROR_INVALID_PARAMETER; } @@ -746,7 +830,35 @@ EXPORT_API int connection_unset_ethernet_cable_state_chaged_cb(connection_h conn NULL, NULL); } -EXPORT_API int connection_get_bt_state(connection_h connection, connection_bt_state_e* state) +EXPORT_API int connection_set_ethernet_cable_state_changed_cb(connection_h connection, + connection_ethernet_cable_state_changed_cb callback, void *user_data) +{ + CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE); + + if (callback == NULL || !(__connection_check_handle_validity(connection))) { + CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); + return CONNECTION_ERROR_INVALID_PARAMETER; + } + + return __connection_set_ethernet_cable_state_changed_cb(connection, + callback, user_data); +} + +EXPORT_API int connection_unset_ethernet_cable_state_changed_cb(connection_h connection) +{ + CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE); + + if (!(__connection_check_handle_validity(connection))) { + CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); + return CONNECTION_ERROR_INVALID_PARAMETER; + } + + return __connection_set_ethernet_cable_state_changed_cb(connection, + NULL, NULL); +} +//LCOV_EXCL_STOP + +EXPORT_API int connection_get_bt_state(connection_h connection, connection_bt_state_e *state) { CHECK_FEATURE_SUPPORTED(TETHERING_BLUETOOTH_FEATURE); @@ -847,24 +959,24 @@ EXPORT_API int connection_add_profile(connection_h connection, connection_profil } if (profile_info->profile_type != NET_DEVICE_CELLULAR) { - CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); - return CONNECTION_ERROR_INVALID_PARAMETER; + CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); //LCOV_EXCL_LINE + return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE } if (profile_info->ProfileInfo.Pdp.PSModemPath[0] != '/' || strlen(profile_info->ProfileInfo.Pdp.PSModemPath) < 2) { - CONNECTION_LOG(CONNECTION_ERROR, "Modem object path is NULL"); - return CONNECTION_ERROR_INVALID_PARAMETER; + CONNECTION_LOG(CONNECTION_ERROR, "Modem object path is NULL"); //LCOV_EXCL_LINE + return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE } rv = net_add_profile(profile_info->ProfileInfo.Pdp.ServiceType, (net_profile_info_t*)profile); if (rv == NET_ERR_ACCESS_DENIED) { - CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); - return CONNECTION_ERROR_PERMISSION_DENIED; + CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE + return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE } else if (rv != NET_ERR_NONE) { - CONNECTION_LOG(CONNECTION_ERROR, "Failed to add profile[%d]", rv); - return CONNECTION_ERROR_OPERATION_FAILED; + CONNECTION_LOG(CONNECTION_ERROR, "Failed to add profile[%d]", rv); //LCOV_EXCL_LINE + return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE } return CONNECTION_ERROR_NONE; @@ -885,17 +997,17 @@ EXPORT_API int connection_remove_profile(connection_h connection, connection_pro if (profile_info->profile_type != NET_DEVICE_CELLULAR && profile_info->profile_type != NET_DEVICE_WIFI) { - CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); - return CONNECTION_ERROR_INVALID_PARAMETER; + CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); //LCOV_EXCL_LINE + return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE } rv = net_delete_profile(profile_info->ProfileName); if (rv == NET_ERR_ACCESS_DENIED) { - CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); - return CONNECTION_ERROR_PERMISSION_DENIED; + CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE + return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE } else if (rv != NET_ERR_NONE) { - CONNECTION_LOG(CONNECTION_ERROR, "Failed to delete profile[%d]", rv); - return CONNECTION_ERROR_OPERATION_FAILED; + CONNECTION_LOG(CONNECTION_ERROR, "Failed to delete profile[%d]", rv); //LCOV_EXCL_LINE + return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE } return CONNECTION_ERROR_NONE; @@ -916,11 +1028,11 @@ EXPORT_API int connection_update_profile(connection_h connection, connection_pro rv = net_modify_profile(profile_info->ProfileName, (net_profile_info_t*)profile); if (rv == NET_ERR_ACCESS_DENIED) { - CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); - return CONNECTION_ERROR_PERMISSION_DENIED; + CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE + return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE } else if (rv != NET_ERR_NONE) { - CONNECTION_LOG(CONNECTION_ERROR, "Failed to modify profile[%d]", rv); - return CONNECTION_ERROR_OPERATION_FAILED; + CONNECTION_LOG(CONNECTION_ERROR, "Failed to modify profile[%d]", rv); //LCOV_EXCL_LINE + return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE } return CONNECTION_ERROR_NONE; @@ -1056,9 +1168,9 @@ EXPORT_API int connection_reset_profile(connection_h connection, return CONNECTION_ERROR_INVALID_PARAMETER; } - if(id < 0 || id > 1) { - CONNECTION_LOG(CONNECTION_ERROR, "Wrong Parameter Passed"); - return CONNECTION_ERROR_INVALID_PARAMETER; + if (id < 0 || id > 1) { + CONNECTION_LOG(CONNECTION_ERROR, "Wrong Parameter Passed"); //LCOV_EXCL_LINE + return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE } return _connection_libnet_reset_profile(type, id, callback, user_data); @@ -1116,6 +1228,54 @@ EXPORT_API int connection_remove_route_ipv6(connection_h connection, const char return _connection_libnet_remove_route_ipv6(interface_name, host_address, gateway); } +EXPORT_API int connection_add_route_entry(connection_h connection, + connection_address_family_e address_family, const char *interface_name, + const char *host_address, const char *gateway) +{ + CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, ETHERNET_FEATURE); + + if (!(__connection_check_handle_validity(connection)) || + (address_family != CONNECTION_ADDRESS_FAMILY_IPV4 && + address_family != CONNECTION_ADDRESS_FAMILY_IPV6) || + interface_name == NULL || host_address == NULL) { + CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); + return CONNECTION_ERROR_INVALID_PARAMETER; + } + + if (address_family == CONNECTION_ADDRESS_FAMILY_IPV4) + return _connection_libnet_add_route_entry(CONNECTION_ADDRESS_FAMILY_IPV4, + interface_name, host_address, gateway); + else + return _connection_libnet_add_route_entry(CONNECTION_ADDRESS_FAMILY_IPV6, + interface_name, host_address, gateway); + + return CONNECTION_ERROR_NONE; +} + +EXPORT_API int connection_remove_route_entry(connection_h connection, + connection_address_family_e address_family, const char *interface_name, + const char *host_address, const char *gateway) +{ + CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, ETHERNET_FEATURE); + + if (!(__connection_check_handle_validity(connection)) || + (address_family != CONNECTION_ADDRESS_FAMILY_IPV4 && + address_family != CONNECTION_ADDRESS_FAMILY_IPV6) || + interface_name == NULL || host_address == NULL) { + CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); + return CONNECTION_ERROR_INVALID_PARAMETER; + } + + if (address_family == CONNECTION_ADDRESS_FAMILY_IPV4) + return _connection_libnet_remove_route_entry(CONNECTION_ADDRESS_FAMILY_IPV4, + interface_name, host_address, gateway); + else + return _connection_libnet_remove_route_entry(CONNECTION_ADDRESS_FAMILY_IPV6, + interface_name, host_address, gateway); + + return CONNECTION_ERROR_NONE; +} + static int __get_cellular_statistic(connection_statistics_type_e statistics_type, long long *llsize) { int rv = VCONF_OK, rv1 = VCONF_OK; @@ -1125,7 +1285,7 @@ static int __get_cellular_statistic(connection_statistics_type_e statistics_type #endif if (llsize == NULL) { - CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); + CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); //LCOV_EXCL_LINE return CONNECTION_ERROR_INVALID_PARAMETER; } @@ -1194,12 +1354,12 @@ static int __get_cellular_statistic(connection_statistics_type_e statistics_type #endif if (rv != VCONF_OK || rv1 != VCONF_OK) { - CONNECTION_LOG(CONNECTION_ERROR, "Failed to get cellular statistics"); - return CONNECTION_ERROR_OPERATION_FAILED; + CONNECTION_LOG(CONNECTION_ERROR, "Failed to get cellular statistics"); //LCOV_EXCL_LINE + return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE } - *llsize = (long long)(last_size * 1000 + size * 1000); - CONNECTION_LOG(CONNECTION_INFO,"%lld bytes", *llsize); + *llsize = (long long)(last_size * 1000) + (long long)(size * 1000); + CONNECTION_LOG(CONNECTION_INFO, "%lld bytes", *llsize); return CONNECTION_ERROR_NONE; } @@ -1211,7 +1371,7 @@ static int __get_statistic(connection_type_e connection_type, unsigned long long ull_size; if (llsize == NULL) { - CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); + CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); //LCOV_EXCL_LINE return CONNECTION_ERROR_INVALID_PARAMETER; } @@ -1219,7 +1379,7 @@ static int __get_statistic(connection_type_e connection_type, if (rv == CONNECTION_ERROR_PERMISSION_DENIED) return rv; else if (rv != CONNECTION_ERROR_NONE) { - CONNECTION_LOG(CONNECTION_ERROR, "Failed to get statistics"); + CONNECTION_LOG(CONNECTION_ERROR, "Failed to get statistics"); //LCOV_EXCL_LINE return CONNECTION_ERROR_OPERATION_FAILED; } @@ -1247,12 +1407,12 @@ static int __get_statistic(connection_type_e connection_type, if (rv == CONNECTION_ERROR_PERMISSION_DENIED) return rv; else if (rv != CONNECTION_ERROR_NONE) { - CONNECTION_LOG(CONNECTION_ERROR, "Failed to get Wi-Fi statistics"); - *llsize = 0; - return CONNECTION_ERROR_OPERATION_FAILED; + CONNECTION_LOG(CONNECTION_ERROR, "Failed to get Wi-Fi statistics"); //LCOV_EXCL_LINE + *llsize = 0; //LCOV_EXCL_LINE + return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE } - CONNECTION_LOG(CONNECTION_INFO,"%lld bytes", ull_size); + CONNECTION_LOG(CONNECTION_INFO, "%lld bytes", ull_size); *llsize = (long long)ull_size; } else return CONNECTION_ERROR_INVALID_PARAMETER; @@ -1295,7 +1455,7 @@ static int __reset_statistic(connection_type_e connection_type, if (rv != CONNECTION_ERROR_NONE) return rv; - CONNECTION_LOG(CONNECTION_INFO,"connection_reset_statistics success"); + CONNECTION_LOG(CONNECTION_INFO, "connection_reset_statistics success"); return CONNECTION_ERROR_NONE; } @@ -1306,9 +1466,9 @@ EXPORT_API int connection_get_statistics(connection_h connection, { CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE); - if(connection_type == CONNECTION_TYPE_CELLULAR ) + if (connection_type == CONNECTION_TYPE_CELLULAR) CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE); - else if(connection_type == CONNECTION_TYPE_WIFI) + else if (connection_type == CONNECTION_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(WIFI_FEATURE); if (!(__connection_check_handle_validity(connection)) || size == NULL) { @@ -1325,9 +1485,9 @@ EXPORT_API int connection_reset_statistics(connection_h connection, { CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE); - if(connection_type == CONNECTION_TYPE_CELLULAR ) + if (connection_type == CONNECTION_TYPE_CELLULAR) CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE); - else if(connection_type == CONNECTION_TYPE_WIFI) + else if (connection_type == CONNECTION_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(WIFI_FEATURE); if (!__connection_check_handle_validity(connection)) { @@ -1338,3 +1498,60 @@ EXPORT_API int connection_reset_statistics(connection_h connection, return __reset_statistic(connection_type, statistics_type); } +EXPORT_API int connection_foreach_ipv6_address(connection_h connection, + connection_type_e connection_type, connection_ipv6_address_cb callback, + void *user_data) +{ + CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, + TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE); + + GSList *ipv6_address_list = NULL; + + if (!(__connection_check_handle_validity(connection))) { + CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); + return CONNECTION_ERROR_INVALID_PARAMETER; + } + + int rv = CONNECTION_ERROR_NONE; + + switch (connection_type) { + case CONNECTION_TYPE_WIFI: + rv = net_foreach_ipv6_address(NET_DEVICE_WIFI, + &ipv6_address_list); + break; + case CONNECTION_TYPE_CELLULAR: + rv = net_foreach_ipv6_address(NET_DEVICE_CELLULAR, + &ipv6_address_list); + break; + case CONNECTION_TYPE_ETHERNET: + rv = net_foreach_ipv6_address(NET_DEVICE_ETHERNET, + &ipv6_address_list); + break; + case CONNECTION_TYPE_BT: + rv = net_foreach_ipv6_address(NET_DEVICE_BLUETOOTH, + &ipv6_address_list); + break; + default: + CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); + return CONNECTION_ERROR_INVALID_PARAMETER; + } + + if (rv != NET_ERR_NONE) { + CONNECTION_LOG(CONNECTION_ERROR, "net_get_multiple_id_address" + " Failed = %d\n", rv); + return CONNECTION_ERROR_OPERATION_FAILED; + } + + GSList *list; + for (list = ipv6_address_list; list; list = list->next) { + rv = callback((char *)list->data, user_data); + if (rv == false) + break; + } + + g_slist_free_full(ipv6_address_list, g_free); + ipv6_address_list = NULL; + + return CONNECTION_ERROR_NONE; +} +